pax_global_header00006660000000000000000000000064136672271240014524gustar00rootroot0000000000000052 comment=d186d169f12bd8c5f34677aab713a9542bace52c hydrogen-1.0.0-rc1/000077500000000000000000000000001366722712400140245ustar00rootroot00000000000000hydrogen-1.0.0-rc1/.clang-format000066400000000000000000000011351366722712400163770ustar00rootroot00000000000000#This file is currently just used as a prototype and is not final! Language: Cpp #General UseTab: Always TabWidth: 4 IndentWidth: 4 SortIncludes: false #just for the moment.. ColumnLimit: 120 #Everything else.. AlignAfterOpenBracket: Align AllowShortIfStatementsOnASingleLine: false AllowShortFunctionsOnASingleLine: InlineOnly BreakBeforeBraces: Linux BinPackArguments: true BinPackParameters: true SpacesInParentheses: false #this is new for H2 SpaceAfterCStyleCast: true KeepEmptyLinesAtTheStartOfBlocks: false PointerAlignment: Left hydrogen-1.0.0-rc1/.clang-tidy000066400000000000000000000002251366722712400160570ustar00rootroot00000000000000Checks: '-*, modernize-use-nullptr,modernize-use-default, google-readability-braces-around-statements,clang-diagnostic-*,clang-analyzer-*' hydrogen-1.0.0-rc1/.editorconfig000066400000000000000000000001721366722712400165010ustar00rootroot00000000000000# See: https://EditorConfig.org # top-most EditorConfig file root = true [*.{cpp,h}] indent_style = tab indent_size = 4 hydrogen-1.0.0-rc1/.github/000077500000000000000000000000001366722712400153645ustar00rootroot00000000000000hydrogen-1.0.0-rc1/.github/issue_template.md000066400000000000000000000010551366722712400207320ustar00rootroot00000000000000Hydrogen version * : Operating system + version : Audio driver + version : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < describe your issue or feature request here ** > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * H2 version : see 'Info - About', or in case you build Hydrogen from source use 'git rev-parse HEAD' ** if you are reporting a bug, please describe how the bug can be reproduced hydrogen-1.0.0-rc1/.gitignore000066400000000000000000000002651366722712400160170ustar00rootroot00000000000000*.kdev4 *~ *.o *.cbp *.layout ui_*.h moc_*.cc moc_*.cpp_parameters /.tags /build /cmake_opts /hydrogen /libs/hydrogen/include/hydrogen/config.h hydrogen.* *.cmake *.so *.make *.swp hydrogen-1.0.0-rc1/.gitmodules000066400000000000000000000001431366722712400161770ustar00rootroot00000000000000[submodule "data/doc"] path = data/doc url = https://github.com/hydrogen-music/documentation.git hydrogen-1.0.0-rc1/.lvimrc000066400000000000000000000000361366722712400153200ustar00rootroot00000000000000set softtabstop=4 noexpandtab hydrogen-1.0.0-rc1/.travis.yml000066400000000000000000000053001366722712400161330ustar00rootroot00000000000000language: cpp env: global: - MAKEFLAGS="-j 2" jobs: include: - stage: Build name: "Ubuntu 18.04 Bionic" os: linux dist: bionic - name: "macOS" os: osx env: - MACOSX_DEPLOYMENT_TARGET="10.12" - name: "macOS (legacy)" os: osx env: - MACOSX_DEPLOYMENT_TARGET="10.10" - HOMEBREW_NO_AUTO_UPDATE=1 - PKG_SUFFIX="-legacy" osx_image: xcode9 if: tag IS present - stage: Sanitizers name: Undefined Behavior Sanitizer os: linux dist: bionic env: CMAKE_OPTIONS=-DUSE_SANITIZER=Undefined addons: apt: packages: - clang - qt5-default - qttools5-dev - qttools5-dev-tools - libqt5xmlpatterns5-dev - libarchive-dev - libsndfile1-dev - libasound2-dev - libjack-jackd2-dev - liblo-dev - libpulse-dev - libportmidi-dev - portaudio19-dev - libcppunit-dev - liblrdf-dev - liblash-compat-dev - librubberband-dev artifacts: paths: - build/CMakeFiles/CMakeOutput.log - "/tmp/hydrogen" before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sw_vers; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get update -qq; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install ladspa-sdk -y; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo ln -s /usr/local /opt/local; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$HOMEBREW_NO_AUTO_UPDATE" -ne "1" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt5; export CMAKE_PREFIX_PATH="$(brew --prefix qt5)"; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libarchive; export PKG_CONFIG_PATH="$(brew --prefix libarchive)/lib/pkgconfig"; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libsndfile jack pulseaudio cppunit; fi # Make sure we have right Qt version on Mac legacy build - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$HOMEBREW_NO_AUTO_UPDATE" -eq "1" ]]; then test $(PKG_CONFIG_PATH=$(brew --prefix qt5)/lib/pkgconfig pkg-config --modversion Qt5Core) == 5.9.1; fi script: - mkdir build && cd build && cmake -DWANT_LASH=1 -DWANT_LRDF=1 -DWANT_RUBBERBAND=1 ${CMAKE_OPTIONS} .. && make - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH="$(brew --prefix qt5)/bin:$PATH" ../macos/build_dmg.sh -v src/gui/hydrogen.app Hydrogen${PKG_SUFFIX}.dmg; fi - TMPDIR=/tmp src/tests/tests deploy: skip_cleanup: true provider: releases api_key: secure: gug61Rin7UE9XSIYMdT/667AxR/9GtaXNPsu8HtHPUNQMcPCyeVgJXnLDY0edHRrvD20aPh/xD8H2Xt4DUoRgRDbMNj9y9IpEd4lnXvLHsI4VL4NBTXjLw+tKG4hcKdYg5hN5M+kIqWlP6bq3lRV4c3RP/F70wbBY85piOmflE8= file: Hydrogen*.dmg file_glob: true on: condition: $TRAVIS_OS_NAME == "osx" tags: true repo: hydrogen-music/hydrogen hydrogen-1.0.0-rc1/AUTHORS000066400000000000000000000000731366722712400150740ustar00rootroot00000000000000Thanks to: See complete list at Hydrogen's "About" Dialog hydrogen-1.0.0-rc1/CMakeLists.txt000066400000000000000000000432771366722712400166010ustar00rootroot00000000000000# # CMAKE SETUP # CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) # The CMake Policy mechanism is designed to help keep existing projects building as new versions of CMake introduce changes in behavior. # http://www.cmake.org/cmake/help/cmake2.6docs.html#command:cmake_policy IF(COMMAND CMAKE_POLICY) # CMAKE_POLICY(SET CMP0005 NEW) CMAKE_POLICY(SET CMP0003 NEW) # add_library CMAKE_POLICY(SET CMP0006 NEW) # bundle destination property ENDIF() # # PROJECT INFO # PROJECT(hydrogen) SET(VERSION_MAJOR "1") SET(VERSION_MINOR "0") SET(VERSION_PATCH "0") SET(VERSION_SUFFIX "rc1") SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") IF(VERSION_SUFFIX) SET(DISPLAY_VERSION "${VERSION}-${VERSION_SUFFIX}") ELSE() EXECUTE_PROCESS(COMMAND git log --pretty=format:'%h' -n 1 OUTPUT_VARIABLE GIT_REVISION ) SET(DISPLAY_VERSION "${VERSION}-${GIT_REVISION}") ENDIF(VERSION_SUFFIX) include(GNUInstallDirs) SET(LIBSNDFILE_VERSION_PREV "1.0.17") # # CONFIG OPTIONS # SET(WANT_LIBTAR TRUE) OPTION(WANT_DEBUG "Build with debug information" ON) IF(APPLE) OPTION(WANT_SHARED "Build the core library shared." OFF) OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF) ELSE() OPTION(WANT_SHARED "Build the core library shared." ON) OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" ON) ENDIF() OPTION(WANT_LIBARCHIVE "Enable use of libarchive instead of libtar" ON) OPTION(WANT_LADSPA "Enable use of LADSPA plugins" ON) IF(APPLE) OPTION(WANT_OSC "Enable OSC support" OFF) OPTION(WANT_JACKSESSION "Enable use of Jack-Session-Handler" OFF) ELSE() OPTION(WANT_JACKSESSION "Enable use of Jack-Session-Handler" ON) OPTION(WANT_OSC "Enable OSC support" ON) ENDIF() IF("${CMAKE_SYSTEM_NAME}" MATCHES "NetBSD") OPTION(WANT_OSS "Include OSS (Open Sound System) support" ON) ELSE() OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF) ENDIF() IF(MINGW) OPTION(WANT_PORTAUDIO "Include PortAudio support" ON) OPTION(WANT_PORTMIDI "Include PortMidi support" ON) ELSE() OPTION(WANT_PORTAUDIO "Include PortAudio support" OFF) OPTION(WANT_PORTMIDI "Include PortMidi support" OFF) ENDIF() OPTION(WANT_JACK "Include JACK (Jack Audio Connection Kit) support" ON) OPTION(WANT_PULSEAUDIO "Include PulseAudio support" ON) OPTION(WANT_LASH "Include LASH (Linux Audio Session Handler) support" OFF) OPTION(WANT_LRDF "Include LRDF (Lightweight Resource Description Framework with special support for LADSPA plugins) support" OFF) OPTION(WANT_RUBBERBAND "Include RubberBand (Audio Time Stretcher Library) support" OFF) IF(APPLE) OPTION(WANT_COREAUDIO "Include CoreAudio support" ON) OPTION(WANT_COREMIDI "Include CoreMidi support" ON) OPTION(WANT_BUNDLE "Build a MAC OSX bundle application" ON) ENDIF() OPTION(WANT_CPPUNIT "Include CppUnit test suite" ON) include(Sanitizers) IF(WANT_DEBUG) SET(CMAKE_BUILD_TYPE Debug) SET(H2CORE_HAVE_DEBUG TRUE) ELSE() SET(CMAKE_BUILD_TYPE Release) SET(H2CORE_HAVE_DEBUG FALSE) ENDIF() OPTION(WANT_CLANG_TIDY "Use clang-tidy to check the sourcecode" OFF) IF(WANT_CLANG_TIDY) find_program(CLANG_TIDY_CMD NAMES clang-tidy) IF(CLANG_TIDY_CMD) #use config from .clang-tidy SET(CMAKE_CXX_CLANG_TIDY clang-tidy) ENDIF() ENDIF() IF(WANT_BUNDLE) SET(H2CORE_HAVE_BUNDLE TRUE) ELSE() SET(H2CORE_HAVE_BUNDLE FALSE) ENDIF() IF(WANT_SHARED) SET(H2CORE_LIBRARY_TYPE SHARED) ELSE() SET(H2CORE_LIBRARY_TYPE STATIC) ENDIF() IF(WANT_DEBUG) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") ENDIF() IF (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-implement-inlines") ENDIF() SET(CMAKE_CXX_FLAGS_RELEASE "") SET(CMAKE_CXX_FLAGS_DEBUG "-g ")#-Winline") IF(APPLE) #Compile for 32bit and 64bit intel macs SET (CMAKE_OSX_ARCHITECTURES "x86_64;") ENDIF() # # MANDATORY PKGS AND DEFAULT OPTIONS # INCLUDE(StatusSupportOptions) MANDATORY_PKG(Threads) MANDATORY_PKG(LIBSNDFILE) # http://doc.qt.io/qt-5/cmake-manual.html FIND_PACKAGE(Qt5Widgets REQUIRED) FIND_PACKAGE(Qt5Test REQUIRED) FIND_PACKAGE(Qt5Xml REQUIRED) FIND_PACKAGE(Qt5XmlPatterns REQUIRED) FIND_PACKAGE(Qt5LinguistTools REQUIRED) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) IF(APPLE) INCLUDE_DIRECTORIES("/opt/local/include") LINK_DIRECTORIES("/opt/local/lib") #Without setting this, installation would go into /usr/local, which does not exist per default SET(CMAKE_INSTALL_PREFIX "/usr" ) ELSE(APPLE) SET(OSS_LIB_PATHS "${CMAKE_INSTALL_FULL_LIBDIR}/oss/lib" "/usr/local/lib${LIB_SUFFIX}/oss/lib" ) ENDIF(APPLE) #Installation paths # TODO remove data from path SET(H2_SYS_PATH "${CMAKE_INSTALL_FULL_DATAROOTDIR}/hydrogen") # TODO remove data from path, could be .config/hydrogen SET(H2_USR_PATH ".hydrogen") SET(MAX_INSTRUMENTS 1000 CACHE STRING "Maximum number of instruments") SET(MAX_COMPONENTS 32 CACHE STRING "Maximum number of components") SET(MAX_NOTES 192 CACHE STRING "Maximum number of notes") SET(MAX_FX 4 CACHE STRING "Maximum number of effects") SET(MAX_BUFFER_SIZE 8192 CACHE STRING "Maximum size of buffer") # # HEADER LIBRARY FUNCTIONS # INCLUDE(CompileHelper) INCLUDE(FindHelper) INCLUDE(FindLadspa) INCLUDE(CheckIncludeFiles) INCLUDE(CheckLibraryExists) INCLUDE(FindZLIB) INCLUDE(FindThreads) COMPILE_HELPER(SSCANF ${CMAKE_SOURCE_DIR}/cmake/sscanf sscanf ) COMPILE_HELPER(RTCLOCK ${CMAKE_SOURCE_DIR}/cmake/rtclock rtclock ) CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILES(libtar.h HAVE_LIBTAR_H) CHECK_LIBRARY_EXISTS(tar tar_open "" HAVE_LIBTAR_OPEN) CHECK_LIBRARY_EXISTS(tar tar_close "" HAVE_LIBTAR_CLOSE) CHECK_LIBRARY_EXISTS(tar tar_extract_all "" HAVE_LIBTAR_EXTRACT_ALL) IF(HAVE_LIBTAR_H AND HAVE_LIBTAR_OPEN AND HAVE_LIBTAR_CLOSE AND HAVE_LIBTAR_EXTRACT_ALL) SET(LIBTAR_OK TRUE) ELSE() SET(LIBTAR_OK FALSE) ENDIF() FIND_HELPER(LIBTAR tar tar.h tar) IF( NOT LIBTAR_FOUND OR NOT LIBTAR_OK OR NOT ZLIB_FOUND ) SET(WANT_LIBTAR FALSE) MANDATORY_PKG(LIBARCHIVE) ENDIF() FIND_HELPER(LIBARCHIVE libarchive archive.h archive) IF( WANT_LIBARCHIVE AND LIBARCHIVE_FOUND) SET(WANT_LIBTAR FALSE) ENDIF() FIND_HELPER(LIBSNDFILE sndfile sndfile.h sndfile) FIND_HELPER(ALSA alsa alsa/asoundlib.h asound ) FIND_LADSPA(LADSPA ladspa.h noise) FIND_HELPER(OSC liblo lo/lo.h lo) IF("${CMAKE_SYSTEM_NAME}" MATCHES "NetBSD") FIND_HELPER(OSS oss sys/soundcard.h ossaudio ) ELSE() FIND_HELPER(OSS oss sys/soundcard.h OSSlib ) ENDIF() FIND_HELPER(JACK jack jack/jack.h jack) CHECK_LIBRARY_EXISTS(jack jack_port_rename "" HAVE_JACK_PORT_RENAME) FIND_HELPER(JACKSESSION jack jack/session.h jack) IF(APPLE) FIND_LIBRARY(AUDIOUNIT_LIBRARY AudioUnit) FIND_LIBRARY(CORESERVICES_LIBRARY CoreServices) FIND_HELPER(COREAUDIO CoreAudio-2.0 coreaudio.h coreaudio) FIND_HELPER(COREMIDI CoreMidi coremidi.h coremidi) ENDIF() FIND_HELPER(PORTAUDIO portaudio-2.0 portaudio.h portaudio) FIND_HELPER(PORTMIDI portmidi portmidi.h portmidi) FIND_HELPER(PULSEAUDIO libpulse pulse/pulseaudio.h pulse) FIND_HELPER(LASH lash-1.0 lash/lash.h lash) FIND_HELPER(LRDF lrdf lrdf.h lrdf) FIND_HELPER(RUBBERBAND rubberband rubberband/RubberBandStretcher.h rubberband) FIND_HELPER(CPPUNIT cppunit cppunit/TestCase.h cppunit) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. #set(CMAKE_AUTOMOC ON) find_package(Doxygen) if(DOXYGEN_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(doc_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/docs) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile DEPENDS doc_dir WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs COMMENT "Generating API documentation with Doxygen" VERBATIM) endif(DOXYGEN_FOUND) # # COMPUTE H2CORE_HAVE_xxx xxx_STATUS_REPORT # SET(STATUS_LIST LIBSNDFILE LIBTAR LIBARCHIVE LADSPA ALSA OSS JACK JACKSESSION OSC COREAUDIO COREMIDI PORTAUDIO PORTMIDI PULSEAUDIO LASH LRDF RUBBERBAND CPPUNIT ) FOREACH( _pkg ${STATUS_LIST}) COMPUTE_PKGS_FLAGS(${_pkg}) ENDFOREACH() # LIBSNDFILE CHECKS STRING( COMPARE GREATER "${LIBSNDFILE_VERSION}" "${LIBSNDFILE_VERSION_PREV}" LIBSNDFILE_VERSION_OK) IF(LIBSNDFILE_VERSION_OK) SET(LIBSNDFILE_MSG "libsndfile supports FLAC and OGG sound file formats") ELSE() SET(LIBSNDFILE_MSG "libsndfile version must be greater than ${LIBSNDFILE_VERSION_PREV} to support FLAC and OGG sound file formats") ENDIF() # RUBBERBAND information SET(LIBRUBBERBAND_MSG "The use of librubberband2 is marked as experimental. * Because the current implementation produce wrong timing! * So long this bug isn't solved, please disable this option. * If rubberband-cli is installed, the hydrogen rubberband-function * will work properly as expected.") # # CONFIG PROCESS SUMMARY # SET(reset "${_escape}[0m") SET(red "${_escape}[1;31m") SET(purple "${_escape}[1;35m") SET(cyan "${_escape}[1;36m") COLOR_MESSAGE("${cyan}Installation Summary${reset} -------------------- * Install Directory : ${CMAKE_INSTALL_PREFIX} * User path : ${H2_USR_PATH} * System path : ${H2_SYS_PATH} * core library build as : ${H2CORE_LIBRARY_TYPE} * debug capabilities : ${H2CORE_HAVE_DEBUG} * macosx bundle : ${H2CORE_HAVE_BUNDLE} * fat build : ${WANT_FAT_BUILD}\n" ) COLOR_MESSAGE("${cyan}Main librarires${reset}") COLOR_MESSAGE("* ${purple}libQt${reset} : ${Qt5Widgets_VERSION}") COLOR_MESSAGE("* ${purple}libsndfile${reset} : ${LIBSNDFILE_STATUS} * ${LIBSNDFILE_MSG} * ${purple}libtar${reset} : ${LIBTAR_STATUS} * ${purple}libarchive${reset} : ${LIBARCHIVE_STATUS} * ${purple}ladspa${reset} : ${LADSPA_STATUS}\n" ) COLOR_MESSAGE("${cyan}Supported audio interfaces${reset} -------------------------- * ${purple}ALSA${reset} : ${ALSA_STATUS} * ${purple}OSS${reset} : ${OSS_STATUS} * ${purple}JACK${reset} : ${JACK_STATUS} * ${purple}JACKSESSION${reset} : ${JACKSESSION_STATUS} * ${purple}OSC${reset} : ${OSC_STATUS} * ${purple}CoreAudio${reset} : ${COREAUDIO_STATUS} * ${purple}CoreMidi${reset} : ${COREMIDI_STATUS} * ${purple}PortAudio${reset} : ${PORTAUDIO_STATUS} * ${purple}PortMidi${reset} : ${PORTMIDI_STATUS} * ${purple}PulseAudio${reset} : ${PULSEAUDIO_STATUS}\n" ) COLOR_MESSAGE("${cyan}Useful extensions${reset} ----------------------------------------- * ${purple}LASH${reset} : ${LASH_STATUS} * ${purple}LRDF${reset} : ${LRDF_STATUS} * ${purple}RUBBERBAND${reset} : ${RUBBERBAND_STATUS} * ${LIBRUBBERBAND_MSG}\n" ) IF(WANT_DEBUG) COLOR_MESSAGE("${cyan}Miscellaneous capabilities${reset} ----------------------------------------- * realtime clock : ${HAVE_RTCLOCK} * working sscanf : ${HAVE_SSCANF} * unit tests : ${CPPUNIT_STATUS}\n" ) ENDIF() COLOR_MESSAGE("----------------------------------------------------------------- ${red}IMPORTANT:${reset} after installing missing packages, remove ${CMAKE_BINARY_DIR}/CMakeCache.txt before running cmake again! -----------------------------------------------------------------\n" ) find_path( HYDROGEN_INSTALLED NAMES hydrogen/config.h ) IF( HYDROGEN_INSTALLED ) COLOR_MESSAGE("----------------------------------------------------------------- ${red}IMPORTANT${reset}: previously installed hydrogen headers found in ${HYDROGEN_INSTALLED} you should uninstall these files before building hydrogen unless you know what you are doing. -----------------------------------------------------------------\n" ) ENDIF() IF( NOT CMAKE_INSTALL_PREFIX MATCHES "/usr/?$") COLOR_MESSAGE("----------------------------------------------------------------- ${red}IMPORTANT${reset}: CMAKE_INSTALL_PREFIX is set to '${CMAKE_INSTALL_PREFIX}', depending of your system settings, you might end up with an installation that does not work out of the box. If so, see INSTALL.md : Running Hydrogen -----------------------------------------------------------------\n" ) ENDIF() # # SET BUILD INFORMATION # ADD_SUBDIRECTORY(src/core) IF(H2CORE_HAVE_CPPUNIT) ADD_SUBDIRECTORY(src/tests) ENDIF() ADD_SUBDIRECTORY(data/i18n) ADD_SUBDIRECTORY(src/cli) ADD_SUBDIRECTORY(src/player) ADD_SUBDIRECTORY(src/gui) IF(EXISTS ${CMAKE_SOURCE_DIR}/data/doc/CMakeLists.txt) ADD_SUBDIRECTORY(data/doc) ENDIF() IF (MINGW) INSTALL(DIRECTORY data DESTINATION . PATTERN ".git" EXCLUDE PATTERN "i18n" EXCLUDE PATTERN doc EXCLUDE) ELSE() INSTALL(DIRECTORY data DESTINATION ${H2_SYS_PATH} PATTERN ".git" EXCLUDE PATTERN "i18n" EXCLUDE PATTERN doc EXCLUDE) ENDIF() IF(NOT MINGW AND NOT APPLE) INSTALL(FILES ${CMAKE_SOURCE_DIR}/linux/org.hydrogenmusic.Hydrogen.appdata.xml DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/appdata") INSTALL(FILES ${CMAKE_SOURCE_DIR}/linux/org.hydrogenmusic.Hydrogen.desktop DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") INSTALL(FILES ${CMAKE_SOURCE_DIR}/data/img/gray/h2-icon.svg DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/scalable/apps" RENAME "org.hydrogenmusic.Hydrogen.svg") INSTALL(FILES ${CMAKE_SOURCE_DIR}/linux/hydrogen.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") ENDIF() # # CPack # INCLUDE(InstallRequiredSystemLibraries) SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hydrogen : an advanced drum machine for GNU/Linux") SET(CPACK_PACKAGE_VENDOR "Hydrogen Developers") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.txt") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") SET(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") SET(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") SET(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") IF(VERSION_SUFFIX) SET(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}-${VERSION_SUFFIX}") ENDIF(VERSION_SUFFIX) SET(CPACK_PACKAGE_INSTALL_DIRECTORY "Hydrogen") IF(MINGW) #Set the other files that will be used in CPack SET(WIN64 "OFF" CACHE BOOL "Windows 64 Bit") SET(CPACK_STRIP_FILES "${WINDOWS_DIR}/src/cli/h2cli.exe" "${WINDOWS_DIR}/src/gui/hydrogen.exe" "${WINDOWS_DIR}/src/player/h2player.exe") #Program Files for Hydrogen SET(WINDOWS_DIR "windows") INSTALL(FILES "${WINDOWS_DIR}/src/cli/h2cli.exe" "${WINDOWS_DIR}/src/core/libhydrogen-core-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.dll" "${WINDOWS_DIR}/src/gui/hydrogen.exe" "${WINDOWS_DIR}/src/player/h2player.exe" DESTINATION ./) #Install files from the extralibs dir INSTALL(DIRECTORY ${WINDOWS_DIR}/extralibs/ DESTINATION ./) IF(WANT_FAT_BUILD) INSTALL(DIRECTORY windows/jack_installer DESTINATION ./) INSTALL(DIRECTORY windows/plugins DESTINATION ./) ENDIF() SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/data\\\\img\\\\h2-icon.bmp") #Begin NSIS Customizations # 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(WIN64) SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") SET(CPACK_NSIS_PACKAGE_NAME "Hydrogen - ${DISPLAY_VERSION} 64Bit") SET(CPACK_PACKAGE_FILE_NAME "Hydrogen-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-win64") #SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}${CPACK_PACKAGE_VERSION} 64Bit") ELSE() SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") SET(CPACK_NSIS_PACKAGE_NAME "Hydrogen - ${DISPLAY_VERSION}") SET(CPACK_PACKAGE_FILE_NAME "Hydrogen-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-win32") #SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME}${CPACK_PACKAGE_VERSION}") ENDIF() #Need the 2 following lines for the icon to work SET(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/data\\\\img\\\\h2-icon.ico") SET(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/data\\\\img\\\\h2-icon.ico") SET(CPACK_NSIS_INSTALLED_ICON_NAME "hydrogen.exe") SET(CPACK_NSIS_DISPLAY_NAME "Hydrogen (Advanced drum machine for GNU/Linux)") SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.hydrogen-music.org/") SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.hydrogen-music.org/") SET(CPACK_NSIS_CONTACT "hydrogen-devel@lists.sourceforge.net") SET(CPACK_PACKAGE_EXECUTABLES "hydrogen.exe;Hydrogen drum machine") SET(CPACK_NSIS_MENU_LINKS "hydrogen.exe;Hydrogen drum machine") SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY ON) SET(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) #end NSIS customizations ELSE(MINGW) #apple stuff was moved to src/gui/CMakeLists.txt ENDIF() SET(CPACK_SOURCE_PACKAGE_FILE_NAME "hydrogen") SET(CPACK_SOURCE_IGNORE_FILES ".*~;\\\\.git;\\\\.svn;${CMAKE_BINARY_DIR}") #!The following 5 lines are copied from cmake's QtTest example # To Create a package, one can run "cpack -G DragNDrop CPackConfig.cmake" on Mac OS X # where CPackConfig.cmake is created by including CPack # And then there's ways to customize this as well set(CPACK_BINARY_DRAGNDROP ON) INCLUDE(CPack) # # CUSTOM TARGETS # ADD_CUSTOM_TARGET(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in" "${CMAKE_BINARY_DIR}/uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/uninstall.cmake") hydrogen-1.0.0-rc1/COPYING000066400000000000000000000431311366722712400150610ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. hydrogen-1.0.0-rc1/ChangeLog000066400000000000000000000135221366722712400156010ustar00rootroot000000000000002020-xx-xx the hydrogen team * Release 1.0 * QT 5 support * New default drumkit: GMRockKit * Probability note property * Velocity automation * OSC support * Midi feedback * Menu redesign * Fullscreen mode 2016-11-01 the hydrogen team * Release 0.9.7 * The color of the SongEditors squares is now configurable * Added support for midi cymbal choking * Added support for midi hihat pressure control * Added hihat pressure groups * Added basic non session manager support * Added instrument components * Basic lilypond export * New windows cross compilation script * Support for soundlibrary images * Configurable sample selection algorithm * Support for soundlibraries with images * Donation dialog * New midi action: * SELECT_PREV_PATTERN_RELATIVE 2014-08-03 the hydrogen team * Release 0.9.6 * new build system (cmake) * add undo for song/pattern editor * jack-session support * jack-midi support * several bug fixes * tabbed interface * several small changes to the GUI * improve ExportSong add use of TimeLineBPM, RubberbandBatch processor and different types of resample interpolation 2011-03-15 the hydrogen team * Release 0.9.5 * load playlists at startup * midi-learn works now with shift-click on some gui elements * multi-track export * LADI support * maximum number of bars is now configurable * added czech translation * fixed serveral export song failures * added ogg, flac, aiff export support * added some new commandline parameter for no_gui version * added rubberband-cli support * several improvements on sample editor * added NO_GUI_SUPPORT to build a version of hydrogen without a gui * added support for app bundles on OSX * non destructive sample editor * piano roll editor * instrument midi out * destructive midi recording * support for midi "note off" messages * virtual patterns * time line to change song tempo and add tags * director * and at least several small changes * Xml handling is now done by QtXml instead of TinyXML * improved support for non-ascii filenames / strings * remove direct dependencies to libflac 2009-09-12 the hydrogen team * Release 0.9.4 * QT4 port * Autosave * Jack port follows instrument names * Mute groups for instruments * New drumkit manager (with downloadable drumkits) * Save and load patterns * Jack transport master * Beatcounter * Playlist editor * MMC * Lead / lag (pattern editor) * Audiofilebrowser * midiAutosense * change post masterfader fx_return to pre masterfader fx_return * several new translations * new manual * switched buildsystem from autotools to scons * tons of bugfixes * soundlibrary browser 2008-02-05 Alessandro Cominu * Release 0.9.3.1 * Patch from Lubomir Kundrak - Compilation with gcc-4.3 * Compilation fix for new libFLAC++ * Added LASH support (Jaakko Sipari) 2005-07-23 Alessandro Cominu * Release 0.9.2 * New graphics * Bug fix in export song (using JACK driver) * Bug fix in export song (wrong samplerate) * Follow playhead in song editor * Automatic audio driver selection * New PortAudio and PortMidi drivers * Mac Os X port * Pattern size increased up to 4 bars * Random pitch variations * New instrument editor * Low pass filter * Insert/delete a range of patterns in song editor 2004-11-28 Alessandro Cominu * Release 0.9.1 * New ALSA driver * New french tutorial and manual page (thanks to Pierre 'AlSim' Chapuis) * Various bug fixes 2004-09-08 Alessandro Cominu * Release 0.9.0 * Multi layer support for instruments (up to 16 samples). * Multiple patterns playing at once. * Added FLAC files support for songs and drumkits. * Added pitch and gain properties per instrument. * Improved song and pattern editor (selections, copy/move, etc..). * Added a new selectable user interface (single panel). * Better jack-transport support. * Ability to set the note length in pattern editor * Export song to standard midi file 2004-03-15 Alessandro Cominu * Release 0.8.2 * Audio file preview in load instrument dialog * Jack transport improvements * 4 Ladspa FX send per instrument * Show recent used songs * QT Style selection option in Preferences Dialog * New keybindings * Bug fix in load/save song * LRDF support (optional) * Several GUI improvements * Better Midi-in support * virtual keyboard (using qwertyuiop...) * Ability to record midi-in or virtual keyboard notes in a pattern 2003-12-18 Alessandro Cominu * Release 0.8.1 * Midi and CPU activity widgets * Jack transport slave mode * Multiple jack outputs * Resizable song editor * Seek in song clicking in the song editor * New mixer * 32 instruments * Custom pattern size * Per instrument output (jack driver) * MMC/MTC support (experimental) * i18n support 2003-05-25 Alessandro Cominu * Release 0.8.0 * Delay FX * Bug fix in Alsa Midi Driver * Assignable Jack ports in preferences file * Assignable midi-in channel (1..16, ALL) * Drumkit support (load, save, import, export) * Acoustic drumkit included * various GUI improvements 2003-03-24 Alessandro Cominu * Release 0.7.6 * Bug fix in note velocity editor * Improved pattern editor * Humanize function * Swing function * New child frame interface * Stereo peak visualization in mixer * New song editor 2003-02-23 Alessandro Cominu * Release 0.7.5 * thread safe audio engine * Song loop button * Velocity bar in pattern editor * Instrument pan in mixer * Better graphical user interface * Demo songs hydrogen-1.0.0-rc1/DEVELOPERS000066400000000000000000000107551366722712400154270ustar00rootroot00000000000000DEVELOPER INFO ============== CODING CONVENTIONS ------------------ We are aware of the fact that not the whole codebase uses the same conventions at the moment. But we would like to establish the following rules, based on best practices. The numbering has no deeper meaning, its just for referencing the items. 1. Use the tabs for indentation. Set the tabwidth of your editor to 4. 2. Allow extra space within parentheses, like this: while( !done ) { foo(); } 3. Please don't refactor our code because you just don't like its style or you think that things could be just a little bit better if reformat the code to fit your style. 4. Use curly braces for all if statements, even one liners. We don't need to minimize the lines of code. Good: if( a ){ doB(); } Error prone: if( a ) doB(); if( a ) doB(); 5. Method names follow the camel case naming scheme, starting with a lowercase letter. Example: void doB( int * myArgument ); 6. Use speaking and self-explaining names for your variables (exception: loop-variables). We don't need to use short likes i,n,aux etc... 7. Prepend pointer types with a "p" (for example: pMySample), floats with an "f", integer types with an "n" and members of a class with an "m_" (for example: m_pEngine) 8. Use "auto" or range-based for loops to make iterations on container classes more readable 9. The singleton pattern is quite over-used in Hydrogen. If you're adding new classes / servers, please take a moment to consider if it really has to be a singleton. 10. Maximum line length is 120 chars 11. Hydrogen is a cross platform application, which needs to be build on a great range of architectures and operating systems. Use only C++11 features and do not use any platform specific compiler extensions without the need to do so. COMMITTING YOUR CODE ------------------- The easiest way to participate in the development of hydrogen is to create a fork at github and create a pull request from your changes. Please take the following things into account: 1. If you want to send us a bug fix, please include only the commits which are part of the bug fix. Do *not* mix in new features or refactor code. 2. You can reference the github issue number in your pull request if you want to fix a bug which is already known in our bugtracker MAKING A RELEASE ---------------- Transitioning the code to remove some of the development hooks in order to make a release has several, easy-to-forget steps. They are: 1. Set the version a. Configure the correct version in CMakeLists.txt b. Update linux/debian/changelog c. Check if nothing has changed and update version and date in linux/hydrogen.1 2. Remove the 'developer warning': in data/hydrogen.default.conf change hydrogen_preferences/showDevelWarning to "false". 3. Commit your changes. 4. Make a tarball of the release (gzipped). Use gzip instead of bzip2 for the folks on Windows. Tarballs should be named: +--- Release version | | +--- Extra release version info __|__ _|_ hydrogen-0.9.4-rc2.tar.gz Example: 'tar -pczf hydrogen-0.9.5.tar.gz hydrogen-0.9.5' 5. If this is an RC release, the following steps are optional. 6. In a clean directory, test build the tarball in as many ways as you can. Call your friends. Have a party. Be sure to build packages on as many systems as possible. Be sure to install and uninstall them, too. 7. Go ahead and build binary packages. Follow the naming convention for the platform that you're building for. Linux: hydrogen_0.9.4rc2_distro_arch.pkg distro: the GNU/Linux distro (e.g. 'lenny' for Debian) arch: the processor it's built for (e.g. i686) pkg: the package management system (deb, rpm) OS X: hydrogen_0.9.4rc2_arch.dmg (arch is optional if the binary will work on both.) Windows: hydrogen_0.9.4rc2.exe 8. If the release passes these "internal" tests, tag the release. Remember, after tagging the release you may not commit changes to the tag. git tag -a 0.9.4 -m "Tagging 0.9.4" 9. If this is a major release (e.g. 0.9.4), then make a branch for maintenance patches for your release. If this is a maintenance release (e.g. 0.9.4.1) then skip this step. git branch 0.9.4 git push origin 0.9.4 10. Make announcements. hydrogen-1.0.0-rc1/Doxyfile.in000066400000000000000000001736301366722712400161510ustar00rootroot00000000000000# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "@PROJECT_NAME@" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "@VERSION@" # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = "@DOXYFILE_OUTPUT_DIR@" # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = YES # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = "@CMAKE_SOURCE_DIR@/src/gui/" \ "@CMAKE_SOURCE_DIR@/src/core/" # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.PY \ *.h.in # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = *moc_* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = "@DOXYFILE_HTML_DIR@" # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = @DOXYFILE_LATEX@ # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = "@DOXYFILE_LATEX_DIR@" # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = "@LATEX_COMPILER@" # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = "@MAKEINDEX_COMPILER@" # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = @DOXYFILE_PDFLATEX@ # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = _DOXYGEN_ # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = H2_OBJECT # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = @DOXYFILE_DOT@ # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = "@DOXYGEN_DOT_PATH@" # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 200 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 1000 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES hydrogen-1.0.0-rc1/INSTALL.md000066400000000000000000000262651366722712400154670ustar00rootroot00000000000000------------------------------------------------------------------------------ H Y D R O G E N Drum machine ------------------------------------------------------------------------------ BUILDING AND INSTALLING HYDROGEN ================================ Content: 1. [System Requirements](#system-requirements) 2. [Download](#download) 3. [Binary Packages](#binary-packages) 4. [Prerequisites to Build from Source](#prerequisites-to-build-from-source) 5. [Build and Install from Source](#build-and-install-from-source) 6. [Creating a Binary Package](#creating-a-binary-package) 7. [Generate the Documentation](#generate-the-documentation) ## System Requirements Hydrogen is supported on the following operating systems: * Linux/Unix/BSD * Mac OS X Hydrogen is *not* supported on Windows because there are currently no Windows developers on the project... and so the Windows components have fallen into disrepair. Hydrogen is known to work well on fairly old systems like this (as of 2009): - Pentium III 500 MHz - 198 MB RAM - Consumer-Grade (cheap) audio card - Keyboard and Mouse - 1x1 USB MIDI Interface (optional) ## Download Hydrogen can be downloaded as a binary package, source distribution, or you can check out the current development version. These can be accessed on the Hydrogen home page: > [http://www.hydrogen-music.org/](http://www.hydrogen-music.org/) The source code for the current development version can be checked out via git: ``` bash $ git clone git://github.com/hydrogen-music/hydrogen.git ``` ## Binary Packages In **Debian (GNU/Linux)** and **Ubuntu (GNU/Linux)** Hydrogen can be installed with `apt` ``` bash $ sudo apt-get install hydrogen ``` However, if you wish to have a more current version of Hydrogen, the Hydrogen dev's typically maintain a .deb package for Debian stable, testing, and some Ubuntu distributions. Note that `apt` takes care of any library dependencies that you have. For **other GNU/Linux** : Please check your package management system for the package called _hydrogen_. For **Mac OS X** the [Hydrogen home page](http://hydrogen-music.org/) has a binary package available. Extract the ZIP archive and it will create a hydrogen.app folder. To get the latest version with the latest features and enable [Jack](http://jackaudio.org/) support, install with **Mac Ports**. - [Installing on Mac OS X with MacPorts](https://github.com/hydrogen-music/hydrogen/wiki/Building-Hydrogen-from-source-(MAC-OSX)#method-1-building-everything-with-macports ) ## Prerequisites to Build from Source In order to build Hydrogen from source, you will need the following libraries and development header files installed on your system: #### Required - Qt 5 Library - Qt 5 SDK (moc, uic, etc.) - GNU g++ compiler (>=4.0, 3.x might work) - cmake (>=2.6) - libsndfile >=1.0.18 - zlib and libtar *OR* libarchive - OS X: Xcode - At least one of the following audio and midi driver #### Audio and Midi Drivers - JACK Audio Connection Kit (>=0.103.0) - ALSA (Advanced Linux Sound Architecture) - OSS - PortAudio (v18, not v19) - PortMIDI - CoreAudio (OS X) - CoreMidi (OS X) #### Optional Support - OSC (Open Sound Control) - LASH (Linux Audio Session Handler) - NSM (Non Session Manager) - JACK Session need Jack Audio Connection Kit(>=0.120.0/1.9.7) - liblrdf for LADSPA plugins - librubberband2 (Rubberband support is experimental) Currently it is recommended that you disable this config option to ensure backwards compatibility with songs created under 0.9.5 which use rubberband. Install the `rubberband-cli` package beside `librubberband2`. Rubberband works properly even if this option is disabled. If available, Hydrogen locates the installed `rubberband-cli` binary. #### Packages Required on Debian-based Systems In order to build Hydrogen on Debian-based Systems, you can use the following command to install all basic and some optional requirements. ``` bash $ sudo apt-get install qtbase5-dev qtbase5-dev-tools \ qttools5-dev qttools5-dev-tools libqt5xmlpatterns5-dev \ libarchive-dev libsndfile1-dev libasound2-dev liblo-dev \ libpulse-dev libcppunit-dev liblrdf-dev \ liblash-compat-dev librubberband-dev ``` In addition, either the `libjack-jackd2-dev` or `libjack-dev` package must be present to enable the support of the **JACK** audio driver. [Which one to pick](https://github.com/jackaudio/jackaudio.github.com/wiki/Q_difference_jack1_jack2) depends on whether JACK2 or JACK1 is installed on your system. If none is present, either package will work. #### Packages Required on OS X To compile Hydrogen on OS X, be sure the install the following commands using [MacPorts](https://www.macports.org/) first. ``` bash sudo port install cmake libsndfile jack cppunit libarchive qwt-qt5 \ qt5-qtxmlpatterns liblo liblrdf rubberband ``` In case you already installed some of these packages using `brew` you might have to remove them first for `cmake` to find the proper version. ## Build and Install from Source This instructions are thought for building Hydrogen on **Linux**. On a single, 500MHz processor Hydrogen takes about 1.5 hours to build. We're providing a set of `qmake` project files for Windows and Mac OS X builds. Please read the relevant wiki pages for more information: - [Building Hydrogen from source on Linux](https://github.com/hydrogen-music/hydrogen/wiki/Building-Hydrogen-from-source-(LINUX)) - [Building Hydrogen from source on Mac OS X](https://github.com/hydrogen-music/hydrogen/wiki/Building-Hydrogen-from-source-(MAC-OSX)) - [Packaging Hydrogen for Windows](https://github.com/hydrogen-music/hydrogen/wiki/Packaging-for-Windows) ### Building and Installing Hydrogen After you have installed all the prerequisites, building and installing will look like this: ``` bash $ git clone git://github.com/hydrogen-music/hydrogen.git $ cd hydrogen $ mkdir build && cd build $ cmake .. $ make && sudo make install ``` ### Running Hydrogen After installation, Hydrogen's binaries can be found in CMAKE_INSTALL_PREFIX/bin. If this path is not in your PATH environment variable, consider adding it to it If Hydrogen doesn't start, it might be because it's shared library is not found. You can verify this with the above command : ```ldd CMAKE_INSTALL_PREFIX/bin/hydrogen | grep 'not found'``` To fix this, you can use LD_PRELOAD or LD_LIBRARY_PATH environment variables, or configure ldconfig (man ldconfig). Another option is to set -DCMAKE_INSTALL_PREFIX=/usr, recompile and reinstall Hydrogen. But be aware that you will certainly overwrite Hydrogen files that you might have installed with your distribution's package manager. see [issue#677](https://github.com/hydrogen-music/hydrogen/issues/677) ### cmake Helpers Alternatively you could use the cmake helper [./build.sh](https://github.com/hydrogen-music/hydrogen/blob/master/build.sh). This is the recommended way in case you are actively developing new features or bug fixes for Hydrogen (all characters in squared brackets are optional and do not have to be included into the command). | Command | Functionality | | --- | --- | | `r[m]` | Remove all build, temporary, and cached files. | | `c[lean]` | Remove all cached files. | | `m[ake]` | Launch the build process. | | `mm` | Launch the build process using `ccache`. | | `d[oc]` | Build the documentation of Hydrogen. | | `g[raph]` | Draw the dependency graphs of the Hydrogen code using `graphviz`. | | `h[elp]` | Show all supported build options. | | `[e]x[ec]` | Execute the Hydrogen binary. | | `t[est]` | Execute the test functions. | | `p[kg]` | Build a source package. | | `z` | Build Hydrogen using `ccache` and execute the resulting binary. | Using `ccache` to build Hydrogen, `./build.sh mm`, will result in a compilation, which takes a little longer than the one with the usual `make` command. But in all further runs not the entire code base but just the parts you touched will be recompiled. This can speed up development by a margin. ### Additional Build Features and Uninstall All the following `cmake` commands should be executed in a build directory : If you wish to configure features like **LADSPA plugins**, or **debugging symbols**, get more information like this: ``` bash $ cmake -L .. ``` For possible **make targets**: ``` bash $ make help ``` To change the directory Hydrogen will be installed in, you have to provide the `-DCMAKE_INSTALL_PREFIX` option during the configuration of your custom build (the default path is */usr/local/*). ``` bash $ cmake -DCMAKE_INSTALL_PREFIX=/opt/hydrogen .. $ make && sudo make install ``` **Uninstalling** Hydrogen is done like this: ``` bash $ sudo cmake uninstall ``` Note that `cmake` is a build system and not a package manager. While we make every effort to ensure that Hydrogen uninstalls cleanly, it is not guaranteed. `cmake` macros should detect the correct Qt settings and location of your libraries, but sometimes it needs a little help. If Hydrogen fails to build, some environment variables could help it. ``` bash $ QTDIR=/opt/lib/qt4 OSS_PATH="/usr/lib/oss/lib" OSS_INCLUDE="/usr/lib/oss/include" cmake .. ``` ## Creating a Binary Package If you are a package maintainer and wish for your packaging scripts to be included in the Hydrogen source tree, we would be happy to work with you. Please contact the developer mailing list (see the [Hydrogen home page](http://hydrogen-music.org/)). The instructions below are for the package systems that have been contributed so far. ### Creating a **.deb** Package In order to create a .deb package for **Debian-based systems** (like Debian, Devuan, Ubuntu, or Mint), you first need the `debhelper` package: ``` bash $ sudo apt-get install debhelper ``` To build the Hydrogen package, run the following commands. ``` bash $ git clone git://github.com/hydrogen-music/hydrogen.git $ cd hydrogen $ cd linux $ fakeroot dpkg-buildpackage ``` This will place the .deb package and description files in the parent directory. If you wish to change the version number for the archive, edit *linux/debian/changelog* to set the version. To install the newly created deb package, run the following (substitute the deb package name with the version your build created): ``` bash $ cd .. $ sudo dpkg -i hydrogen_0.9.6_amd64.deb ``` ## Generate the Documentation Apart from the [official manuals and tutorial](http://hydrogen-music.org/doc/), Hydrogen does also feature an extended documentation of its code base. To generate it using `Doxygen`, run the following command ``` bash $ ./build.sh d ``` It will produce two folder *build/docs/html/* and *build/docs/latex* containing the documentation as either HTML or LaTeX. The HTML version is recommended since it provides a more friendly way to navigate through the set of created files. You can view them using your favorite browser, e.g. ``` bash $ firefox build/docs/html/index.html ``` hydrogen-1.0.0-rc1/README.md000066400000000000000000000062041366722712400153050ustar00rootroot00000000000000# Hydrogen drum machine [![Travis Build Status](https://travis-ci.org/hydrogen-music/hydrogen.svg?branch=master)](https://travis-ci.org/hydrogen-music/hydrogen) [![Coverity Scan Build](https://scan.coverity.com/projects/2965/badge.svg?flat=1)](https://scan.coverity.com/projects/2965) [![Packaging status](https://repology.org/badge/tiny-repos/hydrogen.svg)](https://repology.org/project/hydrogen/versions) Hydrogen is an advanced drum machine for GNU/Linux, Mac and Windows. It's main goal is to bring professional yet simple and intuitive pattern-based drum programming. **Official Website:** http://www.hydrogen-music.org ### Features #### General * Very user-friendly, modular, fast and intuitive graphical interface based on QT 5. * Sample-based stereo audio engine, with import of sound samples in wav, au and aiff formats * Support of samples in compressed FLAC file. * Separate commandline interface (h2cli) #### Sequencer and mixer * Pattern-based sequencer, with unlimited number of patterns and ability to chain patterns into a song. * Up to 192 ticks per pattern with individual level per event and variable pattern length. * Unlimited instrument tracks with volume, mute, solo, pan capabilities. * Multi layer support for instruments (up to 16 samples for each instrument). * Sample Editor, with basic cut and loop functions. * Time-stretch and pitch functions via rubberband cli. * Playlist with scripting support * Advanced tap-tempo * Director Window with a visual metronome and song position tags * Timeline with variable tempo * Import/Export single patterns * Midi-Learn functionality for many gui elements * Multiple patterns playing at once. * Ability to import/export song files. * Unique human velocity, human time, pitch and swing functions. #### Other features * JACK, ALSA, PulseAudio, PortAudio, CoreAudio and OSS audio drivers. * ALSA MIDI, JACK MIDI, CoreMidi and PortMidi input with assignable midi-in channel (1..16, ALL). * Import/export of drumkits. * Export song to wav, aiff, flac or file. * Export song to midi file. * Export song to LilyPond format. ### Screenshots
Expand to view Hydrogen screenshots #### Hydrogen Main Window ![main-window][screenshot1] #### Hydrogen File Browser ![audio-filebrowser][screenshot2] #### Hydrogen Sample Editor ![sample-editor][screenshot3] #### Hydrogen Sound Library ![soundlibrary][screenshot4] [screenshot1]: http://hydrogen-music.org/images/screenshots/main-window.png [screenshot2]: http://hydrogen-music.org/images/screenshots/audio-filebrowser.png [screenshot3]: http://hydrogen-music.org/images/screenshots/sample-editor.png [screenshot4]: http://hydrogen-music.org/images/screenshots/soundlibrary.png
### Installation More details in the [INSTALL.md](INSTALL.md) file. ### Packaging Status
Expand to see the status of Hydrogen in the package ecosystem [![Packaging status](https://repology.org/badge/vertical-allrepos/hydrogen.svg?header=Hydrogen)](https://repology.org/project/hydrogen/versions)
### License GPLv2 (more details in the [COPYING](./COPYING) file.) Happy drumming! :smiley: hydrogen-1.0.0-rc1/README.txt000066400000000000000000000036051366722712400155260ustar00rootroot00000000000000------------------------------------------------------------------------------ H Y D R O G E N Drum machine ------------------------------------------------------------------------------ Hydrogen is an advanced drum machine for GNU/Linux, Mac and Windows. It's main goal is to bring professional yet simple and intuitive pattern-based drum programming. Features: General * Very user-friendly, modular, fast and intuitive graphical interface based on QT 5. * Sample-based stereo audio engine, with import of sound samples in .wav, .au and .aiff formats. * Support of samples in compressed FLAC file. Sequencer and mixer * Pattern-based sequencer, with unlimited number of patterns and ability to chain patterns into a song. * Up to 192 ticks per pattern with individual level per event and variable pattern length. * Unlimited instrument tracks with volume, mute, solo, pan capabilities. * Multi layer support for instruments (up to 16 samples for each instrument). * Sample Editor, with basic cut and loop functions. * Time-stretch and pitch functions via rubberband cli. * Playlist with scripting support * Advanced tab-tempo * Director Window with a visual metronome and song position tags * Timeline with variable tempo * Import/Export single patterns * Midi-Learn functionality for many gui elements * Multiple patterns playing at once. * Ability to import/export song files. * Unique human velocity, human time, pitch and swing functions. Other * JACK, ALSA, PulseAudio, PortAudio CoreAudio and OSS audio drivers. * ALSA MIDI, JACK MIDI, CoreMidi and PortMidi input with assignable midi-in channel (1..16, ALL). * Import/export of drumkits. * Export song to wav, aiff, flac or file. * Export song to midi file. * Export song to LilyPond format. Installation: See the INSTALL.txt file. HomePage http://www.hydrogen-music.org Happy drumming! :^) hydrogen-1.0.0-rc1/build.sh000077500000000000000000000077751366722712400155020ustar00rootroot00000000000000#! /bin/bash QTDIR=${QTDIR:-/usr/lib/qt} VERBOSE=${VERBOSE:-0} CMAKE_OPTIONS=" -DCMAKE_COLOR_MAKEFILE=1 \ -DWANT_DEBUG=1 \ -DWANT_JACK=1 \ -DWANT_ALSA=1 \ -DWANT_LIBARCHIVE=1 \ -DWANT_RUBBERBAND=1 \ -DWANT_OSS=1 \ -DWANT_PORTAUDIO=1 \ -DWANT_PORTMIDI=1 \ -DWANT_LASH=0 \ -DWANT_LRDF=1 \ -DWANT_COREAUDIO=1 \ -DWANT_COREMIDI=1 " MAKE_OPTS="-j 3" H2FLAGS="-V0xf" BUILD_DIR=./build PLATFORM_STR=`uname` [ -f cmake_opts ] && source cmake_opts function cmake_init() { echo -e " * cmake init\n" if [ ! -d $BUILD_DIR ]; then mkdir $BUILD_DIR || exit 1 fi cd $BUILD_DIR || exit 1 if [ ! -e CMakeCache.txt ]; then cmake ${CMAKE_OPTIONS} .. || exit 1 fi cd .. || exit 1 } function cmake_clean() { echo -e " * clean cmake files\n" && rm $BUILD_DIR/CMakeCache.txt 2>/dev/null } function cmake_rm() { echo -e " * rm cmake files\n" && rm -fr $BUILD_DIR 2>/dev/null } function cmake_make() { cmake_init echo -e " * cmake make\n" && cd $BUILD_DIR || exit 1 if [ $VERBOSE -eq 1 ]; then VERBOSE=1 make translations $MAKE_OPTS || exit 1 VERBOSE=1 make $MAKE_OPTS || exit 1 else make translations $MAKE_OPTS || exit 1 make $MAKE_OPTS || exit 1 fi if [[ "$PLATFORM_STR" == 'Linux' ]]; then cp src/gui/hydrogen .. elif [[ "$PLATFORM_STR" == *BSD ]]; then cp src/gui/hydrogen .. elif [[ "$PLATFORM_STR" == 'Darwin' ]]; then cp -rf src/gui/hydrogen.app .. fi cd .. } function cmake_graph() { cmake_init echo -e " * cmake graphviz\n" && cd $BUILD_DIR && cmake --graphviz=cmake.dot .. && dot -Tpng -o cmake_dep.png cmake.dot && cd .. || exit 1 } function cmake_doc() { cmake_init echo -e " * cmake doc\n" && cd $BUILD_DIR && make doc && cd .. || exit 1 } function cmake_help() { cmake_init echo -e " * cmake help\n" && cd $BUILD_DIR && cmake .. -L && cd .. || exit 1 } function cmake_exec() { cmake_init echo -e " * execute hydrogen\n" && ./hydrogen $H2FLAGS || exit 1 } function cmake_tests() { cmake_init echo -e " * execute tests\n" && $BUILD_DIR/src/tests/tests || exit 1 } function cmake_pkg() { cmake_init echo -e " * execute hydrogen\n" && cd $BUILD_DIR && make package_source && cd .. || exit 1 } function zoop() { cmake_make LD_PRELOAD=$(find $BUILD_DIR -name 'libhydrogen-core*' | head -n 1) ./hydrogen $H2FLAGS } if [ $# -eq 0 ]; then echo "usage $0 [cmds list]" echo "cmds may be" echo " r[m] => all built, temp and cache files" echo " c[lean] => remove cache files" echo " m[ake] => launch the build process" echo " mm => launch the build process using ccache" echo " mt => launch the build process with enabled clang tidy checks" echo " d[oc] => build html documentation" echo " g[raph] => draw a dependencies graph" echo " h[elp] => show the build options" echo " x|exec => execute hydrogen" echo " t[ests] => execute tests" echo " p[kg] => build source package" echo " z => build using ccache and run from tree" echo "ex: $0 r m pkg x" exit 1 fi for arg in $@; do case $arg in c|clean) cmd="cmake_clean";; r|rm) cmd="cmake_rm";; m|make) cmd="cmake_make";; mm) CMAKE_OPTIONS="$CMAKE_OPTIONS -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" cmd="cmake_make";; mt) CMAKE_OPTIONS="$CMAKE_OPTIONS -DWANT_CLANG_TIDY=1" cmd="cmake_make";; g|graph) cmd="cmake_graph";; d|doc) cmd="cmake_doc";; h|help) cmd="cmake_help";; x|exec) cmd="cmake_exec";; t|test) cmd="cmake_tests";; p|pkg) cmd="cmake_pkg";; z) CMAKE_OPTIONS="$CMAKE_OPTIONS -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" cmd="zoop";; *) echo "unknown command ${arg}" && exit 1 esac $cmd done hydrogen-1.0.0-rc1/cmake/000077500000000000000000000000001366722712400151045ustar00rootroot00000000000000hydrogen-1.0.0-rc1/cmake/CompileHelper.cmake000066400000000000000000000014711366722712400206410ustar00rootroot00000000000000# # - Try to compile and run a given source file, success if returns 0 # # Once done this will define # # HAVE_${suffix} # # Copyright (c) 2009, Jérémy Zurcher, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(COMPILE_HELPER suffix prj_dir prj_name ) try_compile( ${suffix}_COMPILES ${CMAKE_BINARY_DIR}/try/${prj_name} ${prj_dir} ${prj_name} ) SET(HAVE_${suffix} FALSE) if( ${suffix}_COMPILES ) execute_process( COMMAND ${CMAKE_BINARY_DIR}/try/${prj_name}/${prj_name} RESULT_VARIABLE ${suffix}_RUNS) if( ${suffix}_COMPILES ) SET(HAVE_${suffix} TRUE) endif() endif() MESSAGE(STATUS "Checking ${suffix} usability - ${HAVE_${suffix}}" ) endmacro() hydrogen-1.0.0-rc1/cmake/FindHelper.cmake000066400000000000000000000037171366722712400201360ustar00rootroot00000000000000# # - Try to find a library using pkg-config if available, # than portable macros FIND_PATH and FIND_LIBRARY # # The following variables will be set : # # ${prefix}_FOUND - set to 1 or TRUE if found # ${prefix}_INCLUDE_DIRS - to be used in INCLUDE_DIRECTORIES(...) # ${prefix}_LIBRARIES - to be used in TARGET_LINK_LIBRARIES(...) # # Copyright (c) 2009-2017, Jérémy Zurcher, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(FIND_HELPER prefix pkg_name header lib) if(${prefix}_INCLUDE_DIRS AND ${prefix}_LIBRARIES) # use cached variables set(${prefix}_FIND_QUIETLY TRUE) set(${prefix}_FOUND TRUE) else() # use pkg-config if available to set find_path and find_library hints if(NOT WIN32) FIND_PACKAGE(PkgConfig) endif() if(PKG_CONFIG_FOUND) pkg_check_modules(PC_${prefix} ${pkg_name}) else() MESSAGE(STATUS "Checking for module '${pkg_name}'") endif() # find_path find_path(${prefix}_INCLUDE_DIRS NAMES ${header} HINTS ${PC_${prefix}_INCLUDEDIR} ${PC_${prefix}_INCLUDE_DIRS} ENV ${prefix}_INCLUDE ) # find_library find_library(${prefix}_LIBRARIES NAMES ${lib} HINTS ${PC_${prefix}_LIBDIR} ${PC_${prefix}_LIBRARY_DIRS} ENV ${prefix}_PATH ) include(FindPackageHandleStandardArgs) if ("${${prefix}_INCLUDE_DIRS}" STREQUAL "") set(${prefix}_INCLUDE_DIRS "/usr/include") endif () FIND_PACKAGE_HANDLE_STANDARD_ARGS(${prefix} DEFAULT_MSG ${prefix}_LIBRARIES ${prefix}_INCLUDE_DIRS) if(NOT "${PC_${prefix}_INCLUDE_DIRS}" STREQUAL "") set(${prefix}_INCLUDE_DIRS "${${prefix}_INCLUDE_DIRS};${PC_${prefix}_INCLUDE_DIRS}") endif() endif() endmacro() hydrogen-1.0.0-rc1/cmake/FindLadspa.cmake000066400000000000000000000033201366722712400201110ustar00rootroot00000000000000# # - Try to find a ladspa header and plugins # # Copyright (c) 2009, Jérémy Zurcher, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(FIND_LADSPA prefix header lib) if(${prefix}_INCLUDE_DIR AND ${prefix}_LIBRARIES) set(${prefix}_FIND_QUIETLY TRUE) else() MESSAGE(STATUS "Checking for module 'LADSPA'") set(CMAKE_PREFIX_PATH ${${prefix}_PATH} ) find_path(${prefix}_INCLUDE_DIR NAMES ${header} PATHS ${${prefix}_INCLUDE_DIRS} ${${prefix}_INCLUDEDIR} ) find_program( LISTPLUGINS NAMES listplugins ) if( LISTPLUGINS ) execute_process( OUTPUT_FILE "${CMAKE_BINARY_DIR}/ladspa_listplugins" COMMAND ${LISTPLUGINS} ) file( STRINGS "${CMAKE_BINARY_DIR}/ladspa_listplugins" LADSPA_PLUGINS REGEX "ladspa/.*\\.so:" ) list( LENGTH LADSPA_PLUGINS PLUGINS_N ) if( PLUGINS_N GREATER 0 ) STRING(REGEX REPLACE ":" "" LADSPA_PLUGINS "${LADSPA_PLUGINS}") SET(${prefix}_LIBRARIES "${PLUGINS_N} plugins found" ) MESSAGE(STATUS " ${PLUGINS_N} plugins found.") endif( ) endif() endif() include(FindPackageHandleStandardArgs) if( ${prefix}_LIBRARIES ) FIND_PACKAGE_HANDLE_STANDARD_ARGS(${prefix} DEFAULT_MSG ${prefix}_LIBRARIES ${prefix}_INCLUDE_DIR) mark_as_advanced(${prefix}_INCLUDE_DIR ${prefix}_LIBRARIES) else() FIND_PACKAGE_HANDLE_STANDARD_ARGS(${prefix} DEFAULT_MSG ${prefix}_INCLUDE_DIR) mark_as_advanced(${prefix}_INCLUDE_DIR) endif() endmacro() hydrogen-1.0.0-rc1/cmake/Sanitizers.cmake000066400000000000000000000065001366722712400202420ustar00rootroot00000000000000# # Copyright (C) 2018 by George Cave - gcave@stablecoder.ca # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. set(USE_SANITIZER "" CACHE STRING "Compile with a sanitizer. Options are: Address, Memory, MemoryWithOrigins, Undefined, Thread, Leak, 'Address;Undefined'" ) function(append value) foreach(variable ${ARGN}) set(${variable} "${${variable}} ${value}" PARENT_SCOPE) endforeach(variable) endfunction() if(USE_SANITIZER) append("-fno-omit-frame-pointer" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) if(UNIX) if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") append("-O1" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() if(USE_SANITIZER MATCHES "([Aa]ddress);([Uu]ndefined)" OR USE_SANITIZER MATCHES "([Uu]ndefined);([Aa]ddress)") message(STATUS "Building with Address, Undefined sanitizers") append("-fsanitize=address,undefined" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) elseif(USE_SANITIZER MATCHES "([Aa]ddress)") # Optional: -fno-optimize-sibling-calls -fsanitize-address-use-after-scope message(STATUS "Building with Address sanitizer") append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) elseif(USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") # Optional: -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 append("-fsanitize=memory" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") message(STATUS "Building with MemoryWithOrigins sanitizer") append("-fsanitize-memory-track-origins" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() message(STATUS "Building with Memory sanitizer") endif() elseif(USE_SANITIZER MATCHES "([Uu]ndefined)") message(STATUS "Building with Undefined sanitizer") append("-fsanitize=undefined" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) if(EXISTS "${BLACKLIST_FILE}") append("-fsanitize-blacklist=${BLACKLIST_FILE}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() elseif(USE_SANITIZER MATCHES "([Tt]hread)") message(STATUS "Building with Thread sanitizer") append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) elseif(USE_SANITIZER MATCHES "([Ll]eak)") message(STATUS "Building with Leak sanitizer") append("-fsanitize=leak" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() message( FATAL_ERROR "Unsupported value of USE_SANITIZER: ${USE_SANITIZER}") endif() elseif(MSVC) if(USE_SANITIZER MATCHES "([Aa]ddress)") message(STATUS "Building with Address sanitizer") append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() message( FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}" ) endif() else() message(FATAL_ERROR "USE_SANITIZER is not supported on this platform.") endif() endif() hydrogen-1.0.0-rc1/cmake/StatusSupportOptions.cmake000066400000000000000000000032741366722712400223500ustar00rootroot00000000000000# # Copyright (c) 2009, Jérémy Zurcher, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro(MANDATORY_PKG pkg_name) set(WANT_${pkg_name} TRUE) set(${pkg_name}_FIND_REQUIRED TRUE) endmacro() string( ASCII 27 _escape) function(COLOR_MESSAGE TEXT) if(CMAKE_COLOR_MAKEFILE) MESSAGE(${TEXT}) else() string(REGEX REPLACE "${_escape}.[0123456789;]*m" "" __TEXT ${TEXT}) MESSAGE(${__TEXT}) endif() endfunction() macro(COMPUTE_PKGS_FLAGS prefix) if(NOT ${prefix}_FOUND) SET(${prefix}_LIBRARIES "" ) SET(${prefix}_INCLUDE_DIRS "" ) endif() if(${prefix}_NOT_NEEDED) if(${prefix}_FOUND) SET(${prefix}_STATUS "${_escape}[0;33m| available\${_escape}[0m but not needed ${${prefix}_VERSION} ( ${${prefix}_LIBRARIES} )") else() SET(${prefix}_STATUS "${_escape}[1;33m| not found\${_escape}[0m but not needed" ) endif() elseif(${prefix}_FOUND) if(NOT WANT_${prefix}) SET(${prefix}_STATUS "${_escape}[0;32m? available${_escape}[0m but not desired ${${prefix}_VERSION} ( ${${prefix}_LIBRARIES} )") else() SET(${prefix}_STATUS "${_escape}[1;32m+ used${_escape}[0m ${${prefix}_VERSION} ( ${${prefix}_LIBRARIES} )") SET(H2CORE_HAVE_${prefix} TRUE) endif() else() if(NOT WANT_${prefix}) SET(${prefix}_STATUS "${_escape}[0;31m- not found${_escape}[0m and not desired" ) else() SET(${prefix}_STATUS "${_escape}[1;31m-- not found${_escape}[0m but desired ..." ) endif() endif() endmacro() hydrogen-1.0.0-rc1/cmake/doxygen.cmake000066400000000000000000000056371366722712400175760ustar00rootroot00000000000000# - Run Doxygen # # Adds a doxygen target that runs doxygen to generate the html # and optionally the LaTeX API documentation. # The doxygen target is added to the doc target as dependency. # i.e.: the API documentation is built with: # make doc # # USAGE: GLOBAL INSTALL # # Install it with: # cmake ./ && sudo make install # Add the following to the CMakeLists.txt of your project: # include(UseDoxygen OPTIONAL) # Optionally copy Doxyfile.in in the directory of CMakeLists.txt and edit it. # # USAGE: INCLUDE IN PROJECT # # set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) # include(UseDoxygen) # Add the Doxyfile.in and UseDoxygen.cmake files to the projects source directory. # # # Variables you may define are: # DOXYFILE_OUTPUT_DIR - Path where the Doxygen output is stored. Defaults to "doc". # # DOXYFILE_LATEX_DIR - Directory where the Doxygen LaTeX output is stored. Defaults to "latex". # # DOXYFILE_HTML_DIR - Directory where the Doxygen html output is stored. Defaults to "html". # # # Copyright (c) 2009, 2010 Tobias Rautenkranz # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # macro(usedoxygen_set_default name value) if(NOT DEFINED "${name}") set("${name}" "${value}") endif() endmacro() find_package(Doxygen) if(DOXYGEN_FOUND) find_file(DOXYFILE_IN "Doxyfile.in" PATHS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_ROOT}/Modules/" NO_DEFAULT_PATH) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DOXYFILE_IN DEFAULT_MSG "DOXYFILE_IN") endif() if(DOXYGEN_FOUND AND DOXYFILE_IN_FOUND) add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) usedoxygen_set_default(DOXYFILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc") usedoxygen_set_default(DOXYFILE_HTML_DIR "html") set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_HTML_DIR}") set(DOXYFILE_LATEX "NO") set(DOXYFILE_PDFLATEX "NO") set(DOXYFILE_DOT "NO") if(ENABLE_LATEX) find_package(LATEX) if(LATEX_COMPILER AND MAKEINDEX_COMPILER) set(DOXYFILE_LATEX "YES") usedoxygen_set_default(DOXYFILE_LATEX_DIR "latex") set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}") if(PDFLATEX_COMPILER) set(DOXYFILE_PDFLATEX "YES") endif() if(DOXYGEN_DOT_EXECUTABLE) set(DOXYFILE_DOT "YES") endif() add_custom_command(TARGET doxygen POST_BUILD COMMAND ${CMAKE_MAKE_PROGRAM} WORKING_DIRECTORY "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}") endif() endif() configure_file(${DOXYFILE_IN} Doxyfile ESCAPE_QUOTES IMMEDIATE @ONLY) get_target_property(DOC_TARGET doc TYPE) if(NOT DOC_TARGET) add_custom_target(doc) endif() add_dependencies(doc doxygen) endif() hydrogen-1.0.0-rc1/cmake/rtclock/000077500000000000000000000000001366722712400165455ustar00rootroot00000000000000hydrogen-1.0.0-rc1/cmake/rtclock/CMakeLists.txt000066400000000000000000000003051366722712400213030ustar00rootroot00000000000000 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT($CMAKE_PROJECT_NAME) add_definitions() include_directories() link_directories() add_executable(rtclock rtclock.c) target_link_libraries(rtclock "rt" ) hydrogen-1.0.0-rc1/cmake/rtclock/rtclock.c000066400000000000000000000007701366722712400203560ustar00rootroot00000000000000#include #include #include int main( int argc, char** argv, char** env ) { uint64_t dt; struct timespec t0,t1; clock_gettime(CLOCK_MONOTONIC, &t0); sleep(1); clock_gettime(CLOCK_MONOTONIC, &t1); dt = ((t1.tv_sec * 1000000000) + t1.tv_nsec) - ((t0.tv_sec * 1000000000) + t0.tv_nsec); //fprintf(stdout,"delta is : %4d [ms] => %7d [us] => %10d [ns]\n",(int)(dt/1000000), (int)(dt/1000), (int)dt); return ( (int)(dt/1000000)>950 ) ? 0 : 1; } hydrogen-1.0.0-rc1/cmake/sscanf/000077500000000000000000000000001366722712400163615ustar00rootroot00000000000000hydrogen-1.0.0-rc1/cmake/sscanf/CMakeLists.txt000066400000000000000000000002761366722712400211260ustar00rootroot00000000000000 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT($CMAKE_PROJECT_NAME) add_definitions() include_directories() link_directories() add_executable(sscanf sscanf.c) target_link_libraries(sscanf ) hydrogen-1.0.0-rc1/cmake/sscanf/sscanf.c000066400000000000000000000005621366722712400200050ustar00rootroot00000000000000#include int main( int argc, char** argv, char** env ) { int v; int r = sscanf("0x00A","%x",&v); if(v!=10 || r!=1){ return 1; } r = sscanf("0xc9","%x",&v); if(v!=201 || r!=1){ return 2; } r = sscanf("0xF0","%x",&v); if(v!=240 || r!=1){ return 3; } r = sscanf("0xFF","%x",&v); if(v!=255 || r!=1){ return 4; } return 0; } hydrogen-1.0.0-rc1/cmake/uninstall.cmake.in000066400000000000000000000017261366722712400205320ustar00rootroot00000000000000 IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling $ENV{DESTDIR}${file}") IF(EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove "$ENV{DESTDIR}${file}"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF(NOT "${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing "$ENV{DESTDIR}${file}"") ENDIF(NOT "${rm_retval}" STREQUAL 0) ELSE(EXISTS "$ENV{DESTDIR}${file}") MESSAGE(STATUS "File "$ENV{DESTDIR}${file}" does not exist.") ENDIF(EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH(file) hydrogen-1.0.0-rc1/data/000077500000000000000000000000001366722712400147355ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/DefaultSong.h2song000066400000000000000000001704211366722712400202770ustar00rootroot00000000000000 1.0.0 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true false 0 pattern 0 0 0 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 HatSemiOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 HatSemiOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.380435 1 0 HatSemiOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.583333 1 0 HatSemiOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.57971 0.789855 1 0 HatSemiOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 Bell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.217391 1 0 Bell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.402174 1 0 Bell-Med.wav false forward 0 0 0 0 0 1 4 1 0.405797 0.605072 1 0 Bell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.782609 1 0 Bell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 Pattern 1 not_categorized 192 Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/click.wav000066400000000000000000000126201366722712400165420ustar00rootroot00000000000000RIFFWAVEfmt DXvpsc  <!Ovplp data|FFR`?\V ~ezk97 iF Iiy$e^Zڜ4ٲu 6l Wc:.88;4&Sdw[se z *!'Kְ m +*k |3 v%<@P;YTpB%Jl5_% 6ϳΜ*?Fj>*D==8S%e9gW 9tGDiӽ߼NIR )JZXNF)0 %E$`#leJ!"Au9TxET.i'E`Gh[N? .Pf=kZY7bo"ߧ:~|!!jvЩ&%]4vYk{hQ.>:ZqkgJM"ܟ8ܬ+O"ڼ̞<+G:em_@Qmڙ_$kJeFnJ`=Cۇ H+<- tѭ9&-/V`k_iR-ph?66Z~n;mfUv+\Lڙf۠"/T( "ԝޔձ75nBbjmwaC>q:)"IgrgEM+-/ ͌@/)Sj2kV1Sp 4YZpSVHl- ,z#5ATyXJ=,=ɭې #r!].>())DQQL8cY-5F RMW9_$!MGMx`C 2?FhJe?(Q s5GgKp@(iڹHǓ8  ߡoոƄ$ 8C@v1 r$S9?DA1seu־hZոRxפòp1('9=5# 3O(Z*9'>+6"cո'I . (ǰ[> 0,z625n)sX,65)Fˁo!O|ҾIܦ, Gs,0B+ 1n-{,0[+ ԡ :ޜԼ# w)4) )@/! )( S5w _Y$sޯجOi $J!b /U !$!025TYcE  ?&1 f i!09dUF+!6"C.NZ7 kR\ލC[ tA K`$#v 0|JwE%S K ` }I8U -COg .l<sX \ px;ig=o P8": H5n@n k4d OQ29L T=X>  =+ 7P]Rq`bf |fOZ Xf_  z/9 = Q@ 9lE1_f:N7q- N*b jpz eMa  nf-  llpY!9_WrC  T & L$  !X3:$) C F~yRY ! vB$[f@fC& :  W~r}2$0 V , !* C.@V +Zxk$  Wzhk h5qNA F<  Q\V JzKM \" ,t/u n^|1^)h 17_q_eUO\wIalQSvHj8\!H#?+ZE>dN"ZUG+oCg/baS.:D#t~f^_5T*l2m&hDx5SFC@pR{TdL=fLv +DR{=>WV1NKyy%u7HeR?FrDYn[>WTF  o)N c:PZF >Y@Zym~L&#bn.[aRW M,m?r7uwZ9&Jn{0PHm$ a 2T>=3ZC||KA   q&?_ M:m,G8i/cZA|<AsbU*VgJbW7@-_k=B)? q*- ?2Q+Rvg-J%;-a5u|N* mm x zm7VFeX"~9"[ =;/zD7TLV9sA5RE^VZmJPx1NFgHNxau7,iu.iZo=H3eZm3sP AvN oq&?;oq Hxa1Pxa*~ .9*~"VuzgC.XszgA ..3XicL(7XgcJ" * ;RXL1;PVJ/   9EC3 "7CA1 "/5.  .1,  ""     hydrogen-1.0.0-rc1/data/demo_songs/000077500000000000000000000000001366722712400170725ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/demo_songs/GM_kit_Diddley.h2song000066400000000000000000003557611366722712400230450ustar00rootroot00000000000000 1.0.0-'1a477ffe' 120 0.5 0.5 Diddley Emiliano Grilli Demo - Diddley Unknown license true true false 0 song 0.31 0.21 0.23 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 47 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 48 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 50 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 52 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 53 -1 0 127 0 1 floor-tom 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.71 0.5 0.5 0 1 C0 -1 5 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.32 0.5 0.5 0 1 C0 -1 5 false 24 0 0.26 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 0 false 48 0 0.53 0.5 0.5 0 1 C0 -1 5 false 48 0 0.8 0.5 0.5 0 1 C0 -1 7 false 60 0 0.22 0.5 0.5 0 1 C0 -1 7 false 72 0 0.3 0.5 0.5 0 1 C0 -1 5 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 84 0 0.5 0.5 0.5 0 1 C0 -1 7 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.83 0.5 0.5 0 1 C0 -1 5 false 108 0 0.2 0.5 0.5 0 1 C0 -1 7 false 120 0 0.52 0.5 0.5 0 1 C0 -1 5 false 120 0 0.3 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.63 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.54 0.5 0.5 0 1 C0 -1 8 false floor-tom-fill 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.74 0.5 0.5 0 1 C0 -1 5 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.8 0.5 0.5 0 1 C0 -1 5 false 24 0 0.26 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 0 false 48 0 0.76 0.5 0.5 0 1 C0 -1 5 false 48 0 0.8 0.5 0.5 0 1 C0 -1 7 false 60 0 0.22 0.5 0.5 0 1 C0 -1 7 false 72 0 0.3 0.5 0.5 0 1 C0 -1 5 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 84 0 0.5 0.5 0.5 0 1 C0 -1 7 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.6 0.5 0.5 0 1 C0 -1 5 false 108 0 0.2 0.5 0.5 0 1 C0 -1 7 false 120 0 0.52 0.5 0.5 0 1 C0 -1 5 false 120 0 0.3 0.5 0.5 0 1 C0 -1 8 false 132 0 0.8 0.5 0.5 0 1 C0 -1 5 false 144 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 153 0 0.8 0.5 0.5 0 1 C0 -1 7 false 159 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.54 0.5 0.5 0 1 C0 -1 8 false 180 0 0.8 0.5 0.5 0 1 C0 -1 0 false diddley 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 5 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.16 0.5 0.5 0 1 C0 -1 5 false 24 0 0.26 0.5 0.5 0 1 C0 -1 8 false 36 0 0.28 0.5 0.5 0 1 C0 -1 5 false 48 0 0.8 0.5 0.5 0 1 C0 -1 0 false 48 0 0.8 0.5 0.5 0 1 C0 -1 5 false 48 0 0.8 0.5 0.5 0 1 C0 -1 7 false 72 0 0.8 0.5 0.5 0 1 C0 -1 5 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.48 0.5 0.5 0 1 C0 -1 5 false 108 0 0.8 0.5 0.5 0 1 C0 -1 9 false 120 0 0.76 0.5 0.5 0 1 C0 -1 7 false 120 0 0.3 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 4 false 168 0 0.54 0.5 0.5 0 1 C0 -1 8 false norm 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 10 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 36 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 60 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.18 0.5 0.5 0 1 C0 -1 4 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 84 0 0.62 0.5 0.5 0 1 C0 -1 4 false 84 0 0.8 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.24 0.5 0.5 0 1 C0 -1 4 false 108 0 0.8 0.5 0.5 0 1 C0 -1 8 false 108 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 132 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 156 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.54 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.8 0.5 0.5 0 1 C0 -1 10 false norm-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 10 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 36 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 60 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.18 0.5 0.5 0 1 C0 -1 4 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 84 0 0.62 0.5 0.5 0 1 C0 -1 4 false 84 0 0.8 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.24 0.5 0.5 0 1 C0 -1 4 false 108 0 0.8 0.5 0.5 0 1 C0 -1 8 false 108 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 132 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 156 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.54 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.8 0.5 0.5 0 1 C0 -1 10 false norm-fill 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 10 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 36 0 0.8 0.5 0.5 0 1 C0 -1 4 false 36 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 60 0 0.8 0.5 0.5 0 1 C0 -1 0 false 60 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.46 0.5 0.5 0 1 C0 -1 8 false 84 0 0.8 0.5 0.5 0 1 C0 -1 4 false 84 0 0.8 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 10 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 15 false 108 0 0.8 0.5 0.5 0 1 C0 -1 4 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 132 0 0.8 0.5 0.5 0 1 C0 -1 4 false 138 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.8 0.5 0.5 0 1 C0 -1 5 false break 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.74 0.5 0.5 0 1 C0 -1 5 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.5 0.5 0.5 0 1 C0 -1 4 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.8 0.5 0.5 0 1 C0 -1 7 false 108 0 0.8 0.5 0.5 0 1 C0 -1 11 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 132 0 0.8 0.5 0.5 0 1 C0 -1 0 false 132 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 156 0 0.8 0.5 0.5 0 1 C0 -1 0 false 156 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.5 0.5 0.5 0 1 C0 -1 4 false 168 0 0.8 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 174 0 0.8 0.5 0.5 0 1 C0 -1 7 false 180 0 0.8 0.5 0.5 0 1 C0 -1 5 false floor-tom floor-tom floor-tom floor-tom-fill diddley diddley diddley break norm-1 norm norm norm-fill norm-1 norm norm norm-fill diddley diddley diddley floor-tom-fill diddley diddley diddley floor-tom-fill floor-tom floor-tom floor-tom floor-tom-fill no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/GM_kit_Jazzy.h2song000066400000000000000000002310741366722712400225640ustar00rootroot00000000000000 1.0.0-'1a477ffe' 100 0.5 0.5 Jazzy Emiliano Grilli Jazzy... Unknown license true true false 0 song 0.23 0.23 0.44 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 24 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.98 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.42 0.5 0.5 0 1 C0 -1 12 false 48 0 0.54 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 2 false 72 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.68 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.5 0.5 0.5 0 1 C0 -1 12 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 132 0 0.8 0.5 0.5 0 1 C0 -1 2 false 132 0 0.54 0.5 0.5 0 1 C0 -1 12 false 144 0 0.8 0.5 0.5 0 1 C0 -1 12 false 156 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 8 false 168 0 0.58 0.5 0.5 0 1 C0 -1 12 false 180 0 0.8 0.5 0.5 0 1 C0 -1 12 false 2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 24 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.38 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 2 false 36 0 0.8 0.5 0.5 0 1 C0 -1 12 false 48 0 0.32 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.88 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.8 0.5 0.5 0 1 C0 -1 2 false 108 0 0.4 0.5 0.5 0 1 C0 -1 12 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 5 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 120 0 0.88 0.5 0.5 0 1 C0 -1 15 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 8 false 174 0 0.14 0.5 0.5 0 1 C0 -1 2 false 180 0 0.8 0.5 0.5 0 1 C0 -1 2 false 3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.98 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.42 0.5 0.5 0 1 C0 -1 12 false 48 0 0.54 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 2 false 72 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.68 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.5 0.5 0.5 0 1 C0 -1 12 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 132 0 0.8 0.5 0.5 0 1 C0 -1 2 false 132 0 0.54 0.5 0.5 0 1 C0 -1 12 false 144 0 0.8 0.5 0.5 0 1 C0 -1 12 false 156 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 8 false 168 0 0.58 0.5 0.5 0 1 C0 -1 12 false 180 0 0.8 0.5 0.5 0 1 C0 -1 12 false 1 1 1 2 3 1 1 2 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/GM_kit_demo1.h2song000066400000000000000000004056421366722712400224660ustar00rootroot00000000000000 1.0.0-'1a477ffe' 115 0.5 0.5 GM kit demo #1 Artemio <artemio@artemio.net> Demo patterns for GM kit Unknown license false true false 0 song 0.14 0.26 0 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 main 1-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.36 0.5 0.5 0 1 C0 -1 6 false 24 0 0.16 0.5 0.5 0 1 C0 -1 6 false 36 0 0.42 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 60 0 0.44 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 84 0 0.4 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 108 0 0.42 0.5 0.5 0 1 C0 -1 6 false 120 0 0.34 0.5 0.5 0 1 C0 -1 6 false 132 0 0.8 0.5 0.5 0 1 C0 -1 1 false 156 0 0.32 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.24 0.5 0.5 0 1 C0 -1 6 false 180 0 0.56 0.5 0.5 0 1 C0 -1 6 false main 1-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.36 0.5 0.5 0 1 C0 -1 6 false 24 0 0.16 0.5 0.5 0 1 C0 -1 6 false 36 0 0.42 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 60 0 0.44 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 84 0 0.4 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 108 0 0.42 0.5 0.5 0 1 C0 -1 6 false 132 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.7 0.5 0.5 0 1 C0 -1 2 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.2 0.5 0.5 0 1 C0 -1 2 false main 2-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.24 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.38 0.5 0.5 0 1 C0 -1 12 false 36 0 0.4 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.36 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.3 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.08 0.5 0.5 0 1 C0 -1 6 false 120 0 0.4 0.5 0.5 0 1 C0 -1 12 false 132 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.6 0.5 0.5 0 1 C0 -1 6 false 168 0 0.24 0.5 0.5 0 1 C0 -1 6 false 168 0 0.68 0.5 0.5 0 1 C0 -1 12 false 180 0 0.56 0.5 0.5 0 1 C0 -1 6 false main 2-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.24 0.5 0.5 0 1 C0 -1 6 false 24 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.38 0.5 0.5 0 1 C0 -1 12 false 36 0 0.4 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.36 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.3 0.5 0.5 0 1 C0 -1 6 false 108 0 0.26 0.5 0.5 0 1 C0 -1 2 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.08 0.5 0.5 0 1 C0 -1 6 false 120 0 0.4 0.5 0.5 0 1 C0 -1 12 false 132 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.6 0.5 0.5 0 1 C0 -1 6 false 168 0 0.24 0.5 0.5 0 1 C0 -1 6 false 168 0 0.68 0.5 0.5 0 1 C0 -1 12 false 180 0 0.5 0.5 0.5 0 1 C0 -1 2 false 180 0 0.56 0.5 0.5 0 1 C0 -1 6 false main 2-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.24 0.5 0.5 0 1 C0 -1 6 false 24 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.38 0.5 0.5 0 1 C0 -1 12 false 36 0 0.4 0.5 0.5 0 1 C0 -1 6 false 45 0 0.8 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.36 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.3 0.5 0.5 0 1 C0 -1 6 false 108 0 0.26 0.5 0.5 0 1 C0 -1 2 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.08 0.5 0.5 0 1 C0 -1 6 false 120 0 0.4 0.5 0.5 0 1 C0 -1 12 false 132 0 0.36 0.5 0.5 0 1 C0 -1 6 false 141 0 0.8 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.6 0.5 0.5 0 1 C0 -1 6 false 168 0 0.18 0.5 0.5 0 1 C0 -1 2 false 168 0 0.24 0.5 0.5 0 1 C0 -1 6 false 168 0 0.68 0.5 0.5 0 1 C0 -1 12 false 180 0 0.5 0.5 0.5 0 1 C0 -1 2 false 180 0 0.56 0.5 0.5 0 1 C0 -1 6 false main 2-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.24 0.5 0.5 0 1 C0 -1 6 false 24 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.38 0.5 0.5 0 1 C0 -1 12 false 36 0 0.4 0.5 0.5 0 1 C0 -1 6 false 45 0 0.8 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.46 0.5 0.5 0 1 C0 -1 2 false 72 0 0.22 0.5 0.5 0 1 C0 -1 6 false 72 0 0.36 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.3 0.5 0.5 0 1 C0 -1 6 false 108 0 0.26 0.5 0.5 0 1 C0 -1 2 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.08 0.5 0.5 0 1 C0 -1 6 false 120 0 0.24 0.5 0.5 0 1 C0 -1 12 false 132 0 0.36 0.5 0.5 0 1 C0 -1 6 false 141 0 0.8 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.6 0.5 0.5 0 1 C0 -1 6 false 156 0 0.1 0.5 0.5 0 1 C0 -1 0 false 156 0 0.1 0.5 0.5 0 1 C0 -1 6 false 168 0 0.1 0.5 0.5 0 1 C0 -1 2 false 180 0 0.4 0.5 0.5 0 1 C0 -1 2 false main 3-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.14 0.5 0.5 0 1 C0 -1 8 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.66 0.5 0.5 0 1 C0 -1 13 false 0 0 0.52 0.5 0.5 0 1 C0 -1 14 false 24 0 0.34 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.24 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.42 0.5 0.5 0 1 C0 -1 0 false 72 0 0.26 0.5 0.5 0 1 C0 -1 8 false 72 0 0.18 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.32 0.5 0.5 0 1 C0 -1 8 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.46 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.28 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 168 0 0.26 0.5 0.5 0 1 C0 -1 8 false 168 0 0.2 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 0 false 180 0 0.34 0.5 0.5 0 1 C0 -1 14 false main 3-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.14 0.5 0.5 0 1 C0 -1 8 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.56 0.5 0.5 0 1 C0 -1 0 false 24 0 0.34 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.24 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 14 false 60 0 0.56 0.5 0.5 0 1 C0 -1 0 false 72 0 0.26 0.5 0.5 0 1 C0 -1 8 false 72 0 0.18 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.32 0.5 0.5 0 1 C0 -1 8 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 14 false 108 0 0.36 0.5 0.5 0 1 C0 -1 4 false 120 0 0.46 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.28 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 168 0 0.26 0.5 0.5 0 1 C0 -1 8 false 168 0 0.2 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 0 false 180 0 0.14 0.5 0.5 0 1 C0 -1 4 false 180 0 0.34 0.5 0.5 0 1 C0 -1 14 false 186 0 0.34 0.5 0.5 0 1 C0 -1 4 false main 3-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.14 0.5 0.5 0 1 C0 -1 8 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.22 0.5 0.5 0 1 C0 -1 4 false 24 0 0.34 0.5 0.5 0 1 C0 -1 8 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.42 0.5 0.5 0 1 C0 -1 0 false 72 0 0.26 0.5 0.5 0 1 C0 -1 8 false 72 0 0.18 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.32 0.5 0.5 0 1 C0 -1 8 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.46 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 168 0 0.26 0.5 0.5 0 1 C0 -1 8 false 168 0 0.2 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 0 false 180 0 0.34 0.5 0.5 0 1 C0 -1 14 false main 3-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.14 0.5 0.5 0 1 C0 -1 8 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.22 0.5 0.5 0 1 C0 -1 4 false 24 0 0.34 0.5 0.5 0 1 C0 -1 8 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.32 0.5 0.5 0 1 C0 -1 14 false 72 0 0.42 0.5 0.5 0 1 C0 -1 0 false 72 0 0.26 0.5 0.5 0 1 C0 -1 8 false 84 0 0.18 0.5 0.5 0 1 C0 -1 4 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.16 0.5 0.5 0 1 C0 -1 8 false 108 0 0.24 0.5 0.5 0 1 C0 -1 4 false 120 0 0.52 0.5 0.5 0 1 C0 -1 4 false 132 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.12 0.5 0.5 0 1 C0 -1 4 false 186 0 0.36 0.5 0.5 0 1 C0 -1 4 false end 192 0 0 0.8 0.5 0.5 0 1 C0 -1 15 false main 1-1 main 1-2 main 2-1 main 2-2 main 2-3 main 2-4 main 3-1 main 3-2 main 3-3 main 3-4 end no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/GM_kit_demo2.h2song000066400000000000000000005654741366722712400225010ustar00rootroot00000000000000 1.0.0-'1a477ffe' 110 0.78 0.5 GM kit demo #2 Artemio <artemio@artemio.net> Demo patterns for GM kit Unknown license false true false 0 song 0.19 0.12 0.13 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 intro 192 96 0 0.22 0.5 0.5 0 1 C0 -1 0 false 108 0 0.22 0.5 0.5 0 1 C0 -1 4 false 120 0 0.48 0.5 0.5 0 1 C0 -1 4 false 132 0 0.38 0.5 0.5 0 1 C0 -1 0 false 144 0 0.4 0.5 0.5 0 1 C0 -1 4 false 156 0 0.2 0.5 0.5 0 1 C0 -1 7 false 168 0 0.1 0.5 0.5 0 1 C0 -1 4 false 180 0 0.42 0.5 0.5 0 1 C0 -1 4 false main 1-0 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.26 0.5 0.5 0 1 C0 -1 13 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.3 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.22 0.5 0.5 0 1 C0 -1 4 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.06 0.5 0.5 0 1 C0 -1 4 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 174 0 0.16 0.5 0.5 0 1 C0 -1 4 false 180 0 0.42 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 2-0 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 14 false 132 0 0.34 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 2-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 14 false 132 0 0.34 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.18 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 2-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.24 0.5 0.5 0 1 C0 -1 4 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 14 false 132 0 0.34 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.18 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 2-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 14 false 132 0 0.34 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 156 0 0.22 0.5 0.5 0 1 C0 -1 4 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 7 false 180 0 0.48 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-0 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.54 0.5 0.5 0 1 C0 -1 15 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 132 0 0.32 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.4 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.24 0.5 0.5 0 1 C0 -1 4 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 132 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-5 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.3 0.5 0.5 0 1 C0 -1 0 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 132 0 0.32 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.4 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 3-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.34 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 24 0 0.62 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.38 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.6 0.5 0.5 0 1 C0 -1 6 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 84 0 0.26 0.5 0.5 0 1 C0 -1 6 false 96 0 0.34 0.5 0.5 0 1 C0 -1 4 false 96 0 0.32 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.3 0.5 0.5 0 1 C0 -1 4 false 108 0 0.26 0.5 0.5 0 1 C0 -1 6 false 120 0 0.56 0.5 0.5 0 1 C0 -1 0 false 120 0 0.46 0.5 0.5 0 1 C0 -1 6 false 132 0 0.32 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.36 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 156 0 0.32 0.5 0.5 0 1 C0 -1 4 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.48 0.5 0.5 0 1 C0 -1 6 false 180 0 0.4 0.5 0.5 0 1 C0 -1 4 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.42 0.5 0.5 0 1 C0 -1 15 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 96 0 0.34 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.36 0.5 0.5 0 1 C0 -1 4 false 120 0 0.28 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.54 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false main 4-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 96 0 0.34 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.36 0.5 0.5 0 1 C0 -1 4 false 120 0 0.28 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.54 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false 180 0 0.28 0.5 0.5 0 1 C0 -1 4 false main 4-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 12 0 0.26 0.5 0.5 0 1 C0 -1 4 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.3 0.5 0.5 0 1 C0 -1 0 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.36 0.5 0.5 0 1 C0 -1 4 false 120 0 0.28 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.54 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false 180 0 0.28 0.5 0.5 0 1 C0 -1 4 false main 4-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 84 0 0.62 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 4 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.36 0.5 0.5 0 1 C0 -1 4 false 120 0 0.8 0.5 0.5 0 1 C0 -1 5 false 132 0 0.54 0.5 0.5 0 1 C0 -1 0 false 132 0 0.1 0.5 0.5 0 1 C0 -1 4 false 138 0 0.14 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 156 0 0.8 0.5 0.5 0 1 C0 -1 4 false 168 0 0.8 0.5 0.5 0 1 C0 -1 0 false 168 0 0.8 0.5 0.5 0 1 C0 -1 9 false 180 0 0.28 0.5 0.5 0 1 C0 -1 4 false end 192 0 0 0.66 0.5 0.5 0 1 C0 -1 13 false intro main 1-0 main 1-2 main 1-1 main 1-3 main 2-0 main 2-1 main 2-2 main 2-3 main 3-0 main 3-3 main 3-1 main 3-5 main 4-1 main 4-2 main 4-3 main 4-4 end no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/GM_kit_demo3.h2song000066400000000000000000004540571366722712400224740ustar00rootroot00000000000000 1.0.0-'1a477ffe' 115 0.64 0.5 GM kit demo #3 Artemio <artemio@artemio.net> Demo patterns for GM kit Unknown license false true false 0 song 0.19 0.12 0.25 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 main 1-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 36 0 0.8 0.5 0.5 0 1 C0 -1 2 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 36 0 0.8 0.5 0.5 0 1 C0 -1 2 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 180 0 0.2 0.5 0.5 0 1 C0 -1 3 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 36 0 0.8 0.5 0.5 0 1 C0 -1 2 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.36 0.5 0.5 0 1 C0 -1 2 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 1-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 12 0 0.22 0.5 0.5 0 1 C0 -1 2 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 36 0 0.48 0.5 0.5 0 1 C0 -1 2 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.56 0.5 0.5 0 1 C0 -1 2 false 96 0 0.32 0.5 0.5 0 1 C0 -1 15 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.38 0.5 0.5 0 1 C0 -1 8 false 132 0 0.12 0.5 0.5 0 1 C0 -1 2 false 132 0 0.36 0.5 0.5 0 1 C0 -1 6 false 138 0 0.24 0.5 0.5 0 1 C0 -1 2 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.32 0.5 0.5 0 1 C0 -1 15 false 156 0 0.22 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.42 0.5 0.5 0 1 C0 -1 0 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 180 0 0.14 0.5 0.5 0 1 C0 -1 2 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 108 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.8 0.5 0.5 0 1 C0 -1 14 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 12 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 108 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.8 0.5 0.5 0 1 C0 -1 14 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 12 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.4 0.5 0.5 0 1 C0 -1 2 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 12 false 108 0 0.24 0.5 0.5 0 1 C0 -1 2 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 108 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 12 false 132 0 0.8 0.5 0.5 0 1 C0 -1 14 false 141 0 0.56 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 12 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 168 0 0.32 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 12 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 2 false 96 0 0.8 0.5 0.5 0 1 C0 -1 9 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 96 0 0.8 0.5 0.5 0 1 C0 -1 15 false 108 0 0.38 0.5 0.5 0 1 C0 -1 2 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 108 0 0.8 0.5 0.5 0 1 C0 -1 7 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 5 false 132 0 0.26 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 144 0 0.8 0.5 0.5 0 1 C0 -1 15 false 156 0 0.28 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.52 0.5 0.5 0 1 C0 -1 2 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-5 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 2 false 96 0 0.8 0.5 0.5 0 1 C0 -1 9 false 96 0 0.8 0.5 0.5 0 1 C0 -1 11 false 108 0 0.38 0.5 0.5 0 1 C0 -1 2 false 108 0 0.28 0.5 0.5 0 1 C0 -1 6 false 108 0 0.8 0.5 0.5 0 1 C0 -1 7 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 5 false 132 0 0.26 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.8 0.5 0.5 0 1 C0 -1 11 false 156 0 0.28 0.5 0.5 0 1 C0 -1 2 false 156 0 0.36 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.52 0.5 0.5 0 1 C0 -1 2 false 180 0 0.24 0.5 0.5 0 1 C0 -1 6 false main 4-6 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 11 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 0 0 0.8 0.5 0.5 0 1 C0 -1 14 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 12 0 0.8 0.5 0.5 0 1 C0 -1 14 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 12 false 36 0 0.8 0.5 0.5 0 1 C0 -1 0 false 36 0 0.8 0.5 0.5 0 1 C0 -1 14 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 11 false 48 0 0.8 0.5 0.5 0 1 C0 -1 12 false 60 0 0.38 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 12 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 84 0 0.12 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 2 false 96 0 0.8 0.5 0.5 0 1 C0 -1 9 false 108 0 0.38 0.5 0.5 0 1 C0 -1 2 false 108 0 0.8 0.5 0.5 0 1 C0 -1 7 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.8 0.5 0.5 0 1 C0 -1 5 false 132 0 0.26 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 156 0 0.28 0.5 0.5 0 1 C0 -1 2 false 156 0 0.8 0.5 0.5 0 1 C0 -1 7 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 180 0 0.52 0.5 0.5 0 1 C0 -1 2 false main 4-7 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 12 false 12 0 0.28 0.5 0.5 0 1 C0 -1 6 false 24 0 0.3 0.5 0.5 0 1 C0 -1 6 false 36 0 0.46 0.5 0.5 0 1 C0 -1 0 false 36 0 0.4 0.5 0.5 0 1 C0 -1 12 false 45 0 0.36 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 72 0 0.24 0.5 0.5 0 1 C0 -1 0 false 72 0 0.28 0.5 0.5 0 1 C0 -1 12 false main 1-1 main 1-2 main 1-3 main 1-4 main 4-1 main 4-2 main 4-3 main 4-4 main 4-5 main 4-6 main 4-7 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/TR808kit-demo.h2song000066400000000000000000001413741366722712400224450ustar00rootroot00000000000000 1.0.0-'1a477ffe' 125 0.71 0.5 TR-808 Emulation Kit demo ArtemioLabs Demo patterns for the TR-808 Emulation Kit. Unknown license true true false 0 song 0 0 0 0 Main 1 0 Kick Long TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 808_Kick_Long.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 1 Kick Short TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 808_Kick_Short.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 2 Snare 1 TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 808_Snare_1.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 3 Snare 2 TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 808_Snare_2.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Clap TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 808_Clap.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 5 Tom Low TR808EmulationKit 0.77 false 1 0.52 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 808_Tom_Low.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 6 Tom Mid TR808EmulationKit 0.79 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 808_Tom_Mid.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 7 Tom Hi TR808EmulationKit 0.79 false 0.48 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 808_Tom_Hi.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 8 Closed Hat TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 808_Hat_Closed.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 9 Pedal Hat TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 808_Hat_Pedal.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 10 Open Hat TR808EmulationKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 808_Hat_Open.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 11 Cymbal TR808EmulationKit 0.82 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 47 -1 0 127 0 1 808_Cymbal.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 12 Shaker TR808EmulationKit 0.84 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 48 -1 0 127 0 1 808_Shaker.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 13 Conga TR808EmulationKit 0.88 false 0.9 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 808_Conga.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 14 Clave TR808EmulationKit 0.84 false 0.96 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 50 -1 0 127 0 1 808_Clave.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 15 Cowbell TR808EmulationKit 0.85 false 0.96 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 808_Cowbell.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 Pattern 1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 1 false 0 0 0.8 0.5 0.5 0 1 C0 -1 9 false 24 0 0.62 0.5 0.5 0 1 C0 -1 1 false 24 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.2 0.5 0.5 0 1 C0 -1 12 false 24 0 0.14 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 9 false 63 0 0.16 0.5 0.5 0 1 C0 -1 14 false 72 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.17 0.5 0.5 0 1 C0 -1 12 false 84 0 0.8 0.5 0.5 0 1 C0 -1 1 false 87 0 0.09 0.5 0.5 0 1 C0 -1 12 false 96 0 0.8 0.5 0.5 0 1 C0 -1 9 false 96 0 0.18 0.5 0.5 0 1 C0 -1 14 false 111 0 0.8 0.5 0.5 0 1 C0 -1 1 false 120 0 0.8 0.5 0.5 0 1 C0 -1 1 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 120 0 0.2 0.5 0.5 0 1 C0 -1 12 false 135 0 0.8 0.5 0.5 0 1 C0 -1 1 false 135 0 0.14 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 9 false 144 0 0.12 0.5 0.5 0 1 C0 -1 15 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 168 0 0.12 0.5 0.5 0 1 C0 -1 12 false 183 0 0.12 0.5 0.5 0 1 C0 -1 12 false 183 0 0.27 0.5 0.5 0 1 C0 -1 15 false Pattern 2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 8 false 0 0 0.35 0.5 0.5 0 1 C0 -1 11 false 24 0 0.8 0.5 0.5 0 1 C0 -1 8 false 36 0 0.8 0.5 0.5 0 1 C0 -1 8 false 48 0 0.8 0.5 0.5 0 1 C0 -1 3 false 48 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.3 0.5 0.5 0 1 C0 -1 11 false 84 0 0.8 0.5 0.5 0 1 C0 -1 8 false 96 0 0.8 0.5 0.5 0 1 C0 -1 8 false 120 0 0.8 0.5 0.5 0 1 C0 -1 1 false 120 0 0.8 0.5 0.5 0 1 C0 -1 8 false 132 0 0.8 0.5 0.5 0 1 C0 -1 8 false 144 0 0.8 0.5 0.5 0 1 C0 -1 3 false 144 0 0.8 0.5 0.5 0 1 C0 -1 8 false 156 0 0.8 0.5 0.5 0 1 C0 -1 1 false 156 0 0.8 0.5 0.5 0 1 C0 -1 8 false 168 0 0.8 0.5 0.5 0 1 C0 -1 8 false 180 0 0.8 0.5 0.5 0 1 C0 -1 8 false Pattern 3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 1 false 0 0 0.8 0.5 0.5 0 1 C0 -1 8 false 24 0 0.8 0.5 0.5 0 1 C0 -1 9 false 24 0 0.28 0.5 0.5 0 1 C0 -1 13 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 8 false 72 0 0.44 0.5 0.5 0 1 C0 -1 1 false 72 0 0.8 0.5 0.5 0 1 C0 -1 9 false 87 0 0.35 0.5 0.5 0 1 C0 -1 8 false 87 0 0.22 0.5 0.5 0 1 C0 -1 13 false 96 0 0.8 0.5 0.5 0 1 C0 -1 1 false 96 0 0.8 0.5 0.5 0 1 C0 -1 8 false 120 0 0.8 0.5 0.5 0 1 C0 -1 9 false 120 0 0.2 0.5 0.5 0 1 C0 -1 13 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 7 false 144 0 0.8 0.5 0.5 0 1 C0 -1 8 false 159 0 0.8 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 1 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false 168 0 0.8 0.5 0.5 0 1 C0 -1 9 false 183 0 0.21 0.5 0.5 0 1 C0 -1 1 false 183 0 0.45 0.5 0.5 0 1 C0 -1 8 false Pattern 4 192 Pattern 5 192 Pattern 6 192 Pattern 7 192 Pattern 8 192 Pattern 9 192 Pattern 10 192 Pattern 1 Pattern 1 Pattern 1 Pattern 1 Pattern 2 Pattern 2 Pattern 2 Pattern 2 Pattern 3 Pattern 3 Pattern 3 Pattern 3 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/demo_songs/tutorial_georgyporgy.h2song000066400000000000000000007533331366722712400245320ustar00rootroot00000000000000 1.0.0-'1a477ffe' 98 0.5 0.5 Georgy porgy Toto Drummer: Jeff Porcaro Unknown license false true false 0 song 0.1 0.1 0.04 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 Intro_a 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.78 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false Intro_b 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.78 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 174 0 0.2 0.5 0.5 0 1 C0 -1 10 false 180 0 0.2 0.5 0.5 0 1 C0 -1 10 false 186 0 0.2 0.5 0.5 0 1 C0 -1 10 false A-B-C_1 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_2+5+6 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_3+4+7 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_8 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.1 0.5 0.5 0 1 C0 -1 2 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 138 0 0.24 0.5 0.5 0 1 C0 -1 2 false 144 0 0.78 0.5 0.5 0 1 C0 -1 2 false 156 0 0.18 0.5 0.5 0 1 C0 -1 7 false 168 0 0.18 0.5 0.5 0 1 C0 -1 7 false Bridge1_4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 2 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.8 0.5 0.5 0 1 C0 -1 2 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false Verse2_5 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_8a 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.1 0.5 0.5 0 1 C0 -1 2 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 138 0 0.24 0.5 0.5 0 1 C0 -1 2 false 144 0 0.78 0.5 0.5 0 1 C0 -1 2 false 156 0 0.18 0.5 0.5 0 1 C0 -1 7 false 168 0 0.18 0.5 0.5 0 1 C0 -1 7 false 180 0 0.8 0.5 0.5 0 1 C0 -1 9 false Riff_1a 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false Riff_1b 192 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 5 false 144 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 5 false Riff_1c 192 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 5 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.8 0.5 0.5 0 1 C0 -1 2 false 180 0 0.76 0.5 0.5 0 1 C0 -1 10 false 186 0 0.2 0.5 0.5 0 1 C0 -1 10 false A-B-C_4a 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 5 false A-B-C_1_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 174 0 0.2 0.5 0.5 0 1 C0 -1 10 false A-B-C_2_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 174 0 0.2 0.5 0.5 0 1 C0 -1 10 false A-B-C_3_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.78 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.78 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 126 0 0.22 0.5 0.5 0 1 C0 -1 10 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_4_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 150 0 0.2 0.5 0.5 0 1 C0 -1 10 false 168 0 0.8 0.5 0.5 0 1 C0 -1 2 false 180 0 0.8 0.5 0.5 0 1 C0 -1 2 false A-B-C_4a_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 9 false 168 0 0.8 0.5 0.5 0 1 C0 -1 7 false 180 0 0.8 0.5 0.5 0 1 C0 -1 5 false A-B-C_3a_hh 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 126 0 0.22 0.5 0.5 0 1 C0 -1 10 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_1_stick 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.5 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.5 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 1 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_2_stick 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.5 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.5 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 1 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_3_stick 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.5 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.5 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 1 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false A-B-C_4_stick 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.5 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.5 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 1 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 150 0 0.2 0.5 0.5 0 1 C0 -1 10 false A-B-C_4a_stick 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 1 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.5 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.5 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.8 0.5 0.5 0 1 C0 -1 2 false 168 0 0.8 0.5 0.5 0 1 C0 -1 2 false C3_4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 174 0 0.2 0.5 0.5 0 1 C0 -1 10 false C3_6+7&C4_3 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false C3a_1+2 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 156 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.5 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false 174 0 0.2 0.5 0.5 0 1 C0 -1 10 false 180 0 0.5 0.5 0.5 0 1 C0 -1 6 false C3a_4 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 12 0 0.5 0.5 0.5 0 1 C0 -1 6 false 24 0 0.5 0.5 0.5 0 1 C0 -1 6 false 36 0 0.5 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 60 0 0.5 0.5 0.5 0 1 C0 -1 6 false 72 0 0.5 0.5 0.5 0 1 C0 -1 6 false 84 0 0.8 0.5 0.5 0 1 C0 -1 0 false 84 0 0.5 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 108 0 0.5 0.5 0.5 0 1 C0 -1 6 false 120 0 0.5 0.5 0.5 0 1 C0 -1 6 false 132 0 0.5 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 2 false 180 0 0.8 0.5 0.5 0 1 C0 -1 2 false Riff_1d 192 0 0 0.8 0.5 0.5 0 1 C0 -1 2 false 12 0 0.8 0.5 0.5 0 1 C0 -1 2 false 24 0 0.8 0.5 0.5 0 1 C0 -1 2 false 36 0 0.8 0.5 0.5 0 1 C0 -1 2 false 60 0 0.8 0.5 0.5 0 1 C0 -1 2 false 84 0 0.8 0.5 0.5 0 1 C0 -1 2 false 108 0 0.8 0.5 0.5 0 1 C0 -1 2 false 132 0 0.8 0.5 0.5 0 1 C0 -1 2 false 156 0 0.8 0.5 0.5 0 1 C0 -1 2 false 180 0 0.8 0.5 0.5 0 1 C0 -1 2 false Riff_1e 192 24 0 0.8 0.5 0.5 0 1 C0 -1 0 false 24 0 0.8 0.5 0.5 0 1 C0 -1 5 false Intro_a Intro_a Intro_a Intro_b A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_3+4+7 A-B-C_2+5+6 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 Bridge1_4 A-B-C_2+5+6 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_3+4+7 Verse2_5 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_2+5+6 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8 A-B-C_2+5+6 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_8a Riff_1a Riff_1b Riff_1a Riff_1c A-B-C_1 A-B-C_2+5+6 A-B-C_3+4+7 A-B-C_4a A-B-C_1_hh A-B-C_2_hh A-B-C_3_hh A-B-C_4_hh A-B-C_1_hh A-B-C_2_hh A-B-C_3_hh A-B-C_4a_hh A-B-C_1_hh A-B-C_2_hh A-B-C_3_hh A-B-C_4_hh A-B-C_1_hh A-B-C_2_hh A-B-C_3_hh A-B-C_4_hh A-B-C_1_hh A-B-C_2_hh A-B-C_3a_hh A-B-C_4_hh A-B-C_1_stick A-B-C_2_stick A-B-C_3_stick A-B-C_4_stick A-B-C_1_stick A-B-C_2_stick A-B-C_3_stick A-B-C_4a_stick A-B-C_1 A-B-C_1 A-B-C_3+4+7 C3_4 C3a_1+2 C3_6+7&C4_3 C3_6+7&C4_3 C3a_4 A-B-C_1 A-B-C_1 C3_6+7&C4_3 C3_4 A-B-C_1 A-B-C_1 A-B-C_3+4+7 A-B-C_3+4+7 Riff_1a Riff_1b Riff_1d Riff_1e no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/data/doc/000077500000000000000000000000001366722712400155025ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/drumkits/000077500000000000000000000000001366722712400165775ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/000077500000000000000000000000001366722712400203715ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/24Ride-1.wav000066400000000000000000013526741366722712400223210ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataGh!|ePAqs78F jTGNMU"x S] '\ o66Hs T 5\'~-ZX E{\ZI] 8<G T I $ c\ q%r,< y/W}f\V%Jk:mhN;}% h q m )Mf@fAKiGi9:   :Th 1L+:I  Be*5M]BGNS<2<0KH.W.6 > =I4AqK% ]W  U,L4K[&@,3v"ljQ32Va] +MTa UD( \e) 8f ~0{  bJQjtS ~ S *6 RSsgxa|[[ ~>o( ,VR$< Fku, Zx=EPwM4w ByvUk`f@} -  5  X!> cc/5I p(^ >e J-w+  )&ZE)2#&<- /H!uvm7x}(Cm$v2 [-Lo\,F=l-JZL<m mh"_~\D(p" C3>Z>f8+FcmrT'6&TL!--:xHHl[C6 b0AqB~yC|UgBPBric{S9zO91=Jd- eO\X|jH*-LUrZK a}LINPh^.fEQH?*$*6Mu+a|fvYi=`gJroCT H2T$l%"2g)P& <$9< &BN? %#bCrV o!zn)p$f44E E2RH wJH~95#  q 8 WcH)U}q@qygL8+YlvAvb"S5b A gQr  zYO[C |ka<~ 7y'$/K~1 W*h|m:Wi81e]ou_3eiVKN\K04%<\cL}%[j4f MP|ho08M_X<UWq 9!]Z(%TH: |zL BGus <XUSdhBI|(wleb!@2z,u0-x>@=?'ERpta^>x8H,6[l < Z0.Wo|VM46&`L{,Gc 33s {0{7%u MJ]bp3XIG4(,bf4[B}HPQ,Ru;(\rb&jM-K|i.}aVl/)OYs,M ta-y3Y2S<;\ "!'-,c62UNh6I+da7z'YSp<.^n!7|AN>p[UPZk1]#?2`f-m}/-" ^\.+/ ] j !P>F}Wspqpig.)%#B3t$BE1WHq4?l# w3 wR8I2x5|4dCX-n:#q@Bf_=Ki#qb|r+{st*,nG2@DN-^ phv-z|/m0cOtgo^d  #y^/)k':rmJGf,xN0|Z +_(47I/pNIT@ZENi8G{1z_tRg"{z8Gwu!9NkJ3z `gS~M+_n0Y5 o7oj'nUvy2,BF<0oHM%{?=V=]Hz ECNH8t4U5: +o 7)@ ?um0xW22 T?oQM dNSQ&Rw0,;soD: y3XM!{Lq R:H WQepa4K#=:x&N3Xg|4jD {6r!-xV_k0ushyyDz(}TX46e:fR Spb03 L3Sf0*0. UOBW44E=wC[w0#z:~K-vTN/VB{6"Xoqnx>U2a#~=d b ^(]=af  _2AS! J70Cs%wC]e</4k-6IHp}-]amT"VA;bkPkUv.H'? &9) #5gaSq8hY@q-9=!PvPA G5)NFcb2wA= )sqXdzz'sI]QH(i,.'lHU0B  yYm]pM~jqYZhtlmD]eTqQ^KbDcb5t[S4l`bI;uF^Y VuL/1OrgH,L.J}8a0w`p >1P:%@-Mb Vi-D6_@37E+>`S$g0\&B6YA~]W $a64/M\>`Rb)_():h+y7>kX-gN0rs^PWXj<-"5+tPu3 _spg!iJhZMJgHo1 N 2FjN3hg%#}AV,3x_ hxNRT J^O^nTX;TeH.`+hz5{\v>}hc0_ jW&~b tLFtGP u];9:G(r/j>p=KrGAbOzM   :sskikh[8(!lzp.LL/9KM7XBLG X{K~hEJYAg[hX[^fy}9kSt=qk'[yIS3a/   lxKLnLr#j 0AT~D3mSw V(t=_@ #]-) 7Mba-}o-Zr;9[I+[9r{A>8D7@ZXBA;3y\i_Rwp )K*WJ"s 1jPBFnY7BzV19s0@l/W-.^\SL?GNi?e@4  .qz ]mCKgoAxI&L^M{,tiC-M}\#JLz e3vS#`00Wh9O>Ia)6> *f&MlJs@2E5R32a Ap0|_m I/1<59 L9}!ZqiQx`,%3Ngbwq2:hF bOc$W;!%?< vjh$}( lnH /]ipu> OAyZxH5y{K?bd89v*teD+zOU 6$;?d{l $R1[:n|V|PH2L v]1MJ5qa6v{RSiWd|XHu}6KXq$UaDz862anrI/&e\6k"gR$Gn!-qP?Kl#3~IkN@*@n=ok^3*E6sr8^!ErC s%dT? *0K%;Z?[$TOi<3%`c i?iH9W]pY*V*;A"p2+hLh@LYt<> -QKDx0T%?G3\{ L-\m[3WX?(|vmH@oC-,q(R S)iZ.DxNdIsay`JaH6l_)RXXN?F 0zm" /AX^XQ'>W2";[4^Ibm9olNx @ Q&+*$b%B$iY'~~ $V-*[ 7>hQiUm8 zcA$*Z=,W?HxR'K|9ri+D@Q\(> S+m^[57T~c.bqA >eV<HRRLZF`\[`n$Q-G>C?AWT  2@ *X,c)7O8'4xP? l-O$PA<O+:$2+3Q!=Cengmc hxU*K`McrZR m/Dka-6VXN4DVQ7XVcq8r Bon jdKWOAc|)B9Ky a5-356:s8lQ!qU "]@'"flkw;A44t3Xl~=`E=KfoDoG1Q V">AzS Ot>WdK4(kZg=\T#)Wx+^W:9Ue"\Hbw,juRL-F5@K HOtZD$wa)?2R4ja&8ZP"+H6[pn9U`$ oU-5$f Z+?  AAZBAnvX~)FF/YX l wI22S=hPjYqw3lie$3k{6Y D&lbD}L +)EOIUAK'!wQJHFXXAT!QgB<43UJxn*6EdPn[&^d``ajb~ &&]N:'e =R*2dl0~c 10@= %DNBel+SccHx2=!H"[?"O)(LNxf lSj0xAY)4n "x(\S #eqK J#<2T~@7?Q#1#Th'("; @<U pt_jZjtcS Nm$6#s~ABD8lL 7wP  }v6fsH=^T2gb  X(^IL FMk1S1p}}Ez:F-|r 0]IxBKZthijx(om~ HH|s,_]*9?  $$+sR4% p3E+Dv[+ +sEF_#Ir Jr5iQ#V{g^U ?XZ<f{ZYX7a92L;&U6Q2%**V)Ly0 MJVFkA{-]|K+FHF5ZnX2Ve71k9La]oC[sla:T1qE+d._s 6nTAis 7I15E_1koo^pa+xEUJFPSewKT+?gCj^z89 ri3y\e5ctV|=zGqOG2N"~*2D(:XUIs k6@_I.&HNn<?BK~vs:fJ{4,`-?27s?&/@d&*v#lOMSBd"L4AK/|^hu^tibHsnmS8qflPOQMo&^z*&)#*w?>beEvk>` 2|vfri?.om sc80AKZeD/N LT:94pA c>,hS{S HA] (aci%-1"!TG4?UD[.FtxJ{QWe:X hqXV vHbt'Kn|d`X<9A86 "B,[,.nC&X3wjG {/ %+8]U+R]b{,e~[~(AA{*O5b^%\&zZ2J ]v*"O^m0aq(;_r@jrq_tVa7! y2e 1iB%&;S#c%.Ja9J3,-gTDC~@I2)e7(dutj2C~i[}~#. w?*+X Ud)-%oPewF1Z0"F U7+oiM-%nh#Cnq a6pqr5]cZzS='^l`@<|m$Nh__# ap`x.<H2V1\^ 3=7LJk%VD:]6:>zi  H5m<_\3>QR|]1?Vfq:ez}`pca}$\Rj4Y2-yi mP=% l.o pdU D}(,%%3QmACxS:e~z5PD9*5nxVs `7&ZQLVUG  8pCg;5k.06$O]S(tJnP8zon(~6ZUQAlB3s09w)*?<w,-W A\ ~u]'NF@:x1)3&qA"jK +r'cs>m=<K_am>`js]osi`-3k C1lE_\Slg5(JTSOGY3OVZ  NsInJ0)]\jc;h'$xkK`8uVtDcXP(UY<F7wsi*}C}|'i$XJ 4D-:Iga;e  <@chGY\Z0 "Dj mP.BMlW 9d*xq MkWy%s=P$ O4$EY S@O< P6~V/U\,OA>~q!m}; n$;)pF0%Y2aLB+_5 mE?a),MYKL?81'8wC b7'&p@ZJNS127F,A;0 NWLj= _/@ ** q@hDB-}5D6i3  5lm"K?1GVMa38m"^6ZF0fQ@%?~8 6_rvN()o<Oe?D6 ?p*o)8+GEzs!n@UZ}1+*VyLS7)rs#rDh`M`?ta$Z\'#)k,+Z 7U kFQ;4(uX:@" gVrAAM*-7V7$50wr/$aq&`=$p \7&U/#C@5o/fhjc*-q%\j{s>y\@m`v^{|; JyD87/Xbb_=@*L=V(<;|4%3 !|hu*~gS_hJ3Q"&t}'{LNUP#GnygMs3~G@^lIe/rN2:;{T+iM[ 3,3^[g|F7 i&/hH\ (L6NA\k( H"jL6%#0z; Ro1k_-p]- F4Kgl!/f0Iy<: C'!\NI!S,:+Yv,+P#%hz"2]6gY x|:!fiNnBMA[+K\?)<~^KGtu3E:aG]tHH2o}/XhZ"^f^f@tRkzm8Mlv/8`H-=sbl_An|O]0,a}(& u +[Uy`m*&)p,!reQkadLgJ'IG*W  KxUM2(|BeQZ9FXnErM]6V_9J`+M:q(bZF75w3@gX+RN13@E&&5T]7iqMI w!FBcGjWZWwc6L!^xlp`k& Ns~".QWo#lE}+q-^p 0lzj,66FZ=5;>T:Nsimziv>OIc(;k> \Kqd@,-] aU1Me 5S\A'$[YZr wGU{4G{=~U`_&m aEk/*SlBD)fT} nKM-5(h d$+mz=~@8Hx`ZMDt.{,yXwU<{A%4 M9D_zl+_)%8S27&~Eifbl'v1gBsLLJ|5><Hz&rh\p1#FZ*1P '}f!e/Gm#lO[b<>;Ac :k !I2NVvtn$*]! ?r/? GS@NL1 c\)NTV* &+6DsQm8( h/``R&G)"U= =QCIi+cGkH- *631n?@a6b3K{S]n&P zCc1rS!j6H?rjp2Wt=}Eg ^LM}L@$%}/7(&t3!EZ<6.6 {'z]]_ Gz*IbktbQvjjdI'kMRCon<kY@i9  P(0#:wZ))wdCi?  )`(o>`rg8A)OG@q))G: S<(&IRS:oc/#?.Tp>{tnVgNjS`f}GmKvMJ6wv,/J(^2?m4W,YX?IK7o Q%xLEa%u8nA @M4 "[YZx !(PbKWS1JA`Ar9N=+%$z+d6/1 HSTt m/6Uw>2S `qN) ]IF%t;"9{HyV5)ESFUd7^]|`DF Vc x:Ai~(K9b8T%B)c:GhmQ=`&K1  N4)+ -p<Qj6p 3V#Ch 2&DW44~\mKpD}Jmtk>xd2JV4]7:eW,HwXk |C{ {xt >kel$W4B l^b"J1Xo&pU5 35R@+rq Prob<SAZ3T9/#KAR/m;s /IHD 7(+F/3+bh~a'%`OH}Fv?TB H$+ hV9Gg?d K]|s! Ob:R?uob`s; H1]h.iElB@':W{*+< R(|t,h'{  .O<  Jd,@h/`Y OK fF Ju}=}Bk`8l>t ^y?m)dOr6pD_"R^GwFnl[<?->Kxg*O:oZR 3@?3Qea:1yq^w=ebUfymlsFKQgE[&>; |k,v% u_{VZ6O^$"sWVCZg,\& MJj[p An9^u;P/xu~3-|k!`T9UOL>DYVM:;FH&9 'K:{r-bFKmj{ u{]')6PY>CAdHs@*s62 :q"6j}|eU24n %,l2;F%V&b~tXqUby 3ESdX LZl Duus?E}DV*-u&U)NCB;XniqUs9?V>e[m`yDly5OKdBi ,HoY >IY a"?\7L Dwj~'h/TR 6#m #]d^.}[amAPQk.0F w&xiJ0 R~Zt1%/3e$pa9_R3$-MHxZj C]bV20@<8 {Hr2I JK'04+GZ)[^AX&TB ( J,JZWC{9jH){Z*l2(Mam\]zXbv 6/R z5 w8T 05FUlo5Yh^T%= SgWE8(<YZtQE #;@HBW3p/q A z1 N(FFz T4 D0$H9qQ-P;sFy9<-j,` @}LN<HC ]cz{vp .RHO:o>~#b7%Hm'-sd=i34WHN^8I 4mu _ .nF8 D_TcP\#5xf&^p OT-9\ " %yWgobJ00QD?24HcsF58Bb4GeO=%BNrGfk6 H_t?G./UZ"V_\})0$vV2xdh%- u3lB8nr60pO^6f 'J>dzWf-=] d*Y /@"`:u`8&6BdFmJhPn)cgj0XDQ4z nYN6!\Q+c]A7q/ `w:> ]DK&MRnm$ a ^`_:GS}O~6-S.R=mUoJ\7?4x_1QRw5D({H*E,- tm&1/GAp!Y8G<M8FU];'z <EJ@}l/qe 4|S|\q{+|z`1WqE2e\Lq^~)'D#*z3< L{]^Xg!W1R'N7#0Y[\=C: 3hbPa%pUs^((+of,{q7zex@P7oSD}Kc{@14:>D/i'*`}_e>GI>gQ} Rq4LMN{#f drv WW`N|UWj/=Z*`>qvR'T48 !=d[zJ*a6(/osr4}R,h|ec=w~_^HQ!6bO$% |sUi$a8O^ FH{\[p ?9Kjh!c'W~+PfN+tBP5e/`6;mE:Dhj$o.v(cnp)!G  ueP)~XAnk& 6ShD6Nmc {~&jN<$p (m,=p:Ka` z*T|t*=^m>0flh7t ([iOzq4U.%/Bt^@?:Lsc~m$:Z tM}TB*JsAx&?X {m/ @ 4D-S9%TgLlsac~ufG#A\Sh\*fW66Pkt_BWfB0 <$.<ZMmr! t"2&b{d(L0AJE,_z.aIM39\Ek}mbEV"2U,.(O+~ 6V/j~!p3Db]nERG<$WmZNt~U@ `N ?A8#JMgg$U|q /o>#V})II;!N>0$jY9M5S8 h5=Kg/O7_A.` )2)84|T#+w >CT+2gO3-Z"G]\XoLN(mQhOuO'e21C]-Ya,y@x$u#n' `<CB[?c1Ql6?K}1fVP\dB3{"ALGPetNe6J!s==P68]{4Q/B[tuxHpS}R"A= w4*W4 ]J!?1#T"P47< E2y)tG"4MLd  RU\ K2mVLj> 5{+C3jdO?&"&$QS[PR; ?Y dC9( TN1 H~[BR* ybS~P{.)1Fd9ThuAqh4IHC;* ]_*3Rl*~213Au` |&^z8%V**;+&V+R^S\Zey$JsS6n_nSZy I-A>jZ?K+z9WTuU:,;z1+b . iVY4MO\/d#, u;{'!B~C@d!(~(\Or~1ZGB-EiyUvtsSP_L><{yi6BcqE&CA/*,bnD[@ `(ON/>!9 yz?G }l v^fJ7j .cp {4^&,Xl1Y|^ -t=d/dm+WD$pNKQID(Uwi!tsn~ y; 7d{5V_q92(N7Dtn63ha = (=-th@z#8l/Snk5RFS72*vaP"Pu/@B5#).FE}=?0P\ c`>+ %/H Dq Xo_+>D0tCeg z5qW%I)d Q<.Z 3}|w9Smi Tq;3mooS EAjkOapnII@$ Sn^r-Nx'eO_T^qB#'iA#d1^pSCv%ih]gkS<1&v?uAzE} ;3pK|B1-m6A693EU[R{CF:Dtnc=p .b *cm>^4d;TSk|B:`p\Tzv`:^yMsR*v5C-ft6mn@dK -f3=r)G l7&Q9L0(y!qg=r7Oxee1q= O(gDy $$>[86Yz?S6p^=zcTR*0!4|7hhm\cX})L~ULYlIb$>'uJv}1xNCSMGVfe_uE\E9R1v38*Uo%*x>.NN.=yB)Go/ 6Ec8l8[w M_<.&/AZ=a{NVVBXMt'fV{$Ix=& ?=MqrYvn*gd$DWk@Ni5,2aI MGR&5M 1O=\4]|&pIGcFc]nXqB*bmgO n jl}(}N` IV;E) {/IRrw@V8>#!.kw M HOkWqm* [ hy*fS|m]>+RxNTy[rC}^;-'m%0gO/+njpW0d!s.U(qu%I5b~n5og7NN5XAbCqC:qL> \+6h#lg]NySnTGff6m8\w* - @Wegh^@Mah;;V}q*X8NlK@"w$' /!S5-&);=tl53|z{[5:-LnY@W s@/"-jSQa$]D\=2( \5)4K%>d~I< agpT3APkfF@7l^/=G~$zN-8""Gqso,u/W)WWs@plg2HGTP/l7)$p4Tb &q=~S3*M(M.[Cn_+[OlDm rCZn])+-pN'[]NZmFl'=. Y|j?%q/LF;$lBL&IQvL{mRwp^Ie6ZD 30h7qacEea[&Xs+;6`w9uaD+n^B`'s=Jy)olZ&jFkhDgON^b@(oPIbNFep4R%w=,TCZB(-9I^rEl!ttr|j6n,H|w3|}F^mMOa.RTjk:n%78sz6w@]sG=k[yL.dMJ0v|ZQ\kBG!] ](tdU>{R gm  $)0TTe#vU5Q5|7o czF6wo0i,AyikQ4<W}B0[M4QF@^@AZHa=p3"li- ,YD(sc9* Isg0 3T(ez@)8Ab 2J4jChZ7 I)r.} g^b&Too&:s Z4P)?m!P2CG]8Y71SAX.z 6wIW -=J|L#MoRz[^x[3c9q8!:Segaw6 LXx!*7FLb =J^YuL~\v5s8{S]}-@ O*fxbru6 )vwgz*O}v$[gqx!ChIE[Yo `t iV bO78w=}+GcG5%oU_W:w*?ni\X>P^??i{$6@$>QwOF:OO~ai%N|J`qv("/14JVO''oGB[eyg]I*)*(zL>z(%Nkf yLm)Qjg91[ p,$hF0H\yt@PYb!{*~H%I oTPs?50yHxlq<"'l*4r; Qyo&T#Hs`tfuia21"R'^lN''qVF3F#%{|i5F%\5|a*P7{HW%jEO 27Np\5J$|XWH(h.zd'?dTLc $MSKq#T/9ZFLn`}(U3fi=66`npQBVJ #h/3}6 r9<$*e_/ Dmp;1T).F[RQI30Jv^e-2uO[qE,zi"^CLIFYNbACxGJ-H!l( <S,[pYB-z 6> PQqvyoAqc:{'7JNhhGUv R7pKy-#$~umQ0%k:/v]LVL&Y]@DbZ*"Pnf$F*Ns4m>)8*H$^L5Fw ,`D6@@\.u]ws+:Hw SELHNd#$#y xez8Ckd8Q@o{'}*[ Bvd8;6M)rtfH8HNgUEko%caTq5m>vDm`p{VLw6`{E ":-bns{4cNQ'/.<L6j>>l~X%?dyP$^}Y% 7,i 5W/-7wDz3r\j^D!8_b^Lr ?w#hwA@j e%Q*y+T^y8VArre;JR5QZ^Z(=b,iYH5 %}+:!R]zCB@vBP7I\ \\a76YTYD S;4 ,ipU-pgRf l'};m@Z*~@n- "l@hzBp?{k3| MdZvJLB|I6bBh!(0?i]Uql4X64SJ]&l0*J<giaTN2&!G%ljA;1hP) 8K- )x5>0g 751HyE]}&B`cG)}EGR<TYh9D{)]m||6cXW(< 8t)KLG^si(.gv Rg?3rhY(3?1l2Jbddqq%rkq^'2*`qJ"ZMrP GS~*(gPUB{mb^gxc0~Le+O.B'OSK1i|a&Z2]ALdzJEO,=n[ (>^ n>:28*W)L&hcq_Yp ! Vj@+PtJKGOX6 q"n=&@E;0,1`UZsGO;a5$+@y>~qQ:xV)/M~KBkZ`qC=+p_l.])h0gPAEW.|SJq=n Xg/bgVc"|4QTT Axa3%(fj97@MoYt!f| S{I% 3=9g^[|Hxzyoho@z$< R!`X;1$`R-qruhsqb *$V_U G/bh+~Y T#w7 9A*#vr1PGfSzf? XoIwF6ZT`O)N2C.y{jhl . [Rk#h`#id-6j{Dph6k|S3Cq>I KOUB\ 7z5 &VGR8YplGO*XgVG){LV~N%, Xn<NVBj$PnRfvlPZ [&G. ZC ?.[Gg4jrh?Yje7TY~/+UR>8OUe^&`'5i1nYc hS0HoaZ@,uN1 "okYmJJF=G9-x490U2Y\h'zznh1D#09d}].: C*R;nY0-xf&K%bH,,@y@G6~qz$C;'7= ~1q"_{7 @8q,C\WOA ljq ^;)j>&/XJxX; ).U1HG~w-qT82$Al#xVNP('ul_Y:|e=)H\=0he>VXwiffy)tK\Hk64:jQ~G>4 2B|/ZcKB YupG bOqL-UI?[~V.uVB]U|:c *Gl$StuY9\V4$Ip12&}bK{ 5@6+_C\_}P]VU`-eJgA0] y8I)5DWx,"w|BixRM*Z4fma 2|k+QCuQDc 8;2uv<&oe@{- 0R|h ziag;5a*^9M|s5KQD5vWN {maR'wUu+YI?-)Agr{*(_h+!{)n~e-6\~O''#0Tw =Vz3Ma0kZe!/k8o(2g]#h[f2Ez6i-#eMBHzX:m^}&bt*v[<t7w,QZ+\XzN "DM!"G}NHk ]Wlg]G<M22ZxeLHSDMdB4tUK<UR>8Y"tT2F 6^^c!U#0&V^i u;9E.&\!gU%GQjtn,Zp3ITjf]+j_K'!inC*%UsO 9![-j@7r~O.t& LeP.>YeiSOx ZU2!`lWwL!Ml`?039@W?eT #eup5{{!FID -UuW/BT{F"41KEC,Gx9"6Az^0RzX[BwCWv'GUgNpPB 8iJSQ+6RAbb)^7}R3@pd*sSV|VI\+1A56F3Bf(-3/7q15nAG' ^B/AX2>  !W0A3<&^9o;M ~[aw=,4 Ns:T_Klfx$\uXUqq25`;h\kxSln#8jtE_], 6&H3vOgJ+`S 7&8^p DJn7>% 2(Gl[WP#EIv *|)#q>S:Z7A[dH2t%s-tI\vtg:51St_HId~2qR,c9N5Ysox@_p5A1WN9zLkC^.BHsYK,}WEhc|nZ+~:$:nb]mk}WU XBz Ew^,ugg ryrkqJTGu#+M_rhX: SCH`oFqFg}Hm#cz_47\ E0pKL`Um2VB@"~r:8+H$Wjks~{\46YvC:%}MQo6$vKqU_s[0qC67y@R| Bj7N^mLRaos1"mag0(OJr@E|.i,fHM=px]_G EDm u<#(PxDy=-k2c'1rc,l3U"R,webUgo I}*wnJj%bP]U XqA~*E&< *l5*e+m#JD  -c3#TUaT<g_OGpB>Y=*pVxFfM*U5M?aO'*]9C=[O@'iQh0]'x-tkZ(1E7Mm 1iQL 8\(^6nXgp+KC McVV;h^&PZs& 5#<7 BbM4D`wwr_?2JD(R6h. 2|OFE``qI#1=;]k, DLh2n/hE  b pcP)Vmp|c=4^QAUF5 EU4 9@h /;+*)RC-7j&( 3`+~I}k8R%BBsjP5&V"i*AJ1#[H7~'"#^"kAO RKuKNu:;U? WYIY8Qy e[b 6p~^Wj;T&-nm(6XMZdbtbrSgG:s{}a9)V ):9^""ve>bHxB_:2`7uBf8Vb;fU=zq=hvrh!M@.6#'(=W,dlr;p:DtmkpHj)y\~=|(>8:L49;d s(@*'JO"[ .JEhy^v-'B*S ~#f$ RE<1Bgp~t\GIkg,+m.w[ [J{'S/<Hbe9j>rNj:~n| }^*Rjrouk}#(c''Lh|}@x|B#$>/U5L+9[M]3;w"!L`gAwkO[%2= 6^YiKUKmd,YjfpfYOCFG(uWP*fW28GrT !)kK#"B`QM],$E[: m0(cmK.*&} Y{c N8EE!% .Gk2,(;FM'}S c'8'Kz`W!;x!%a\ru*#yVSOr)0vy.O GU=tsbGBP{sX<&yI}_C1eQe]Z  xP;)1U*qOd l]PJ/:t!]'sZ;@S}x#<8wb#Ip-j2AQx=2GPHi@O APrnZ"9oB|"a~Z/YO`v] Jb9*~g5!YF :t@r ,C Xiq=TImleFM17({].zJ:0HhoXJn57s^+15mkndgN62k6}2#Zru;g^/cyx\,w'WFML+ {"_d+Il5|6:&!?ZuWIvD 'G8 {Kf X'(SJ i3n NB|&![^Nr?KxB^D0# `&DrV]=!=7e,rPxv{}} p|31osd!^aCj} ?MaaF#" hKu.+V%.  gUbU0f%@\W}syge $\kC STD8\WO9 "bcB|46& ljqLI'D9 &G6v Quq`Of. aNhu3\HEB.(.)j"TfcG4.cXu9,8]J[Cr\ G,puu F[{@<+E1n4rNHD&-WU/t>'tK3<k,i>Y[L8)$ 76I#-C.:y/ITdx?c8'w}=uv`$Fp 4OPCM'ru$.8J 2tYt ^1tGGo^  $wWM4ZigE)4Vj$v.5191-39:zm8n+S"(nU7,%2@b QUb,.X9 >dTn(R a%(DYL$2fnZ pG_,s@9"xh+wFaBl8|GOF[?He&_HY=30hxiYWE+*k8dPLFw>dl."Uq`4R3E1 Hnlr`~j-Pr1&yi4`)%gC%dR:Rf4-|!1]Ne5TPh3k!"~ D=C[{lL|0aj1+*$%Z(&x/g l'p&&#&+| =+C<]*:]C46g3h~;a2+&{& MuxSoRzC|,\.Er g,Fu>7b`VHPZl=/_U8<Mux 5` Uvt %   /7`~|[!h9PaG;QKkJBj]Xv$CT!iIK4B2yxt;D hz@OGHXVR>'v*<&8Ike^v$^t?^kH~%x_< 'I  (PaN%@3aO?)P_%:3&'{<tyk92jdE(/48JlLy\+>2q,;#znR``Z=TknhH uBb68A&q+^Nd'k_P (uC3.`}pfgp3_I 0_u({5gf_qfnJ(44N|9=pU-J"AB5/xM[H/"2O[omfMFBC$^\peN G\}KjNZ!:"X5<k\T3)9G23}=#dE~!p"NUr~U7Q[Y uS?CcGncS&;N~~:8hr, G`j^uS]Wtu`9xs3%|=)d"jWc0iG[zC !OWlclk6v'TeRh Rz}pDja&,(c-dVj]L@;ahlxO X!Cp WX6=mvZo|:.f; 7~0:>7FFH>- _cupH@8jV0AWs6|Vnk4qn>T.  ;e6Xq)n//-*Ofl;nSb\2,7"),wVNw?VUwAqCSjuwci]jO w8~f9L$"FYbB \W"LRD>F4#v5VLuz? \?gxWD//H{ /Q3<(9(\h$(~-/H/ BegA 8PI ;p=6|+iHJx{GU;P&Bk} npmj : $R2P""> 7?)~xCn UgFb["Q  8h}y~Hv& 7h||bF7W}?G:/\ndeuZnZIIwUt.otTX/~|R!)Vzxaosx4*X.g%Oa>b:)b{Q T[PR, "%R4-oo= /;|:8$_NP>N;S~MQoyI[!WoCwoS;7;AH1R=^t']=;CQ`jsT&#7_ ql=o 9[ AC++ m w={0g tNJ T@9LM M0kOK-{YMcH6;E!hg<&l'zwq@3I;=Ft9mDei* 2LZkoF| N$YrE#ah=fj/#)WXks2WStrMPjB]ku@[n^+ktVM3}L| \JkwI<dn24 hb\&JZ5h8~]Y,]|pM1w_e [f(G 5gtFA2[^B447N$G^T](Z/[Z%iK%) 5u4KQgFFWme1-q7rxoY88M3yO|W!^;dlsDt&>^|l&b_Rh/1tR84Ltq);p nUk6 2A/>yLtV fq9 ]hmWn?  reMA!Sy$:+&(.0v{pM'$*3Tow>3.3@_)61_KiD< [f 3nvcL8i_`33Eg 6KYP#tBfwu-BCsvpCx>kCoo$DN*'{!f3'k;Al@k kC3k;0k A|u<bD3,KeZG%MQ  432boO;fF4Dwh~U:?>=;MB?W^qWn=Tp%Me,8[t*_-(Tc];Orr28+u>V6>JgcfTP1! P`6x&TU@(m  K-`7 8!x 5@6?Q`rOEy^^)?s<FaMz6ID];7\m?%`gaZoe{x\K+- *Ln 'oEvGFRovt&|K7s~Am9GuX!ZD?{I>@wQ# yt/T{Gh<3]]w#W[!uuorGKz,hW|&FeXno4/Uy~L1rU}d,npUplA:3d|ZR4D{93 /n(F[+L:Rx'p#m) $R"Nt=}{ TKliUNg?u>f}3rb';!:'P4$5d"OZR6+ H R({k gC P=@UVXD:c "kAL6  07Rk!;SUI S<&gA/3Fav5\^5)Gshsg 2b9NbD:J3 #1(G NmOHF!LUB-HVYIHC>?Z72@6$`GvlVc >a$ow"?&_vTG9X:v $iLaYwuJV<\<v(ktb7whnk`H Fc?%"$T&9R9m|`URh{t:^}7-6L Z~ZH*Je]CV)AnmSU>U0iwW<%Xq|^IFQx -3@ xw`!\`-~x:ionp>Gtjo{;hBCSmS)*Dy\wI+!g$SK^}0zM&+$(/DE2&Q)<5J(< Pr;W_ EwxB6vnj&U,}`.%7;GFN6`J[_^JSm- (H_YdgRb]+cHLH?Ot!Dh 7,v)&dhQ$2Fz^7kd*o;][`5v KNW/H3Fea0!)] O1{R6 u%F>~BgjNwk*bs-~`VmXy\D>S.3_&D>.= 9c.EKd|;jR#2a>LAz,_1)2b-'S:blPe=v7nGKv SjajgOdl+(gwX2YX/2.t ,4My1l`?)7Y9\Ds[4>Qs4SAW}fo%}C$O^rv `V"r^>b>R9Yiwu>i)g '3h/y ^w|^-L963)SyDq~q=2m,=)%6~4*B%Xwb:%HrEX5$e"G^q '@NZkRs*BD.W0-F Goc:jT=c#zey}~ ;:r6y OBMi ~19E[Tbr5"'T~fBS2SqWT.X jB.6bUD?custcKA,!x-$?SMJLV`y`([JH\g`K*L9Tb_p  3:8#/0( xFuOC:$G"g+wvNFRz8JSZr  ws/6d0lJNhb2bY ?`d.p1e "7m]I=4`^4@B! snF[6F 65<T/;,t)= :]89X2<Z_|{2T$GpmufUb|GT6V,!GiPjApzJJ'd:7m|^6UJ.i8>^E?}V!S6B4<R(7QevJP`5002I~D+"NBlq:$#J,T>*q`x\;JP}n`\+nW-F|.+W'])f+7)!=QS i ^wxh[VSD;0hhGozm{z@KR6mF4`DzzY# Lk(/\^^c>K/TTJ\XEXac-^)(RqmI.|:w{~mZ1C/4IM:G0H HtK^6<4!+)ulC,-)Y& /O}#aO 9k:3QIM!&17^%fj5(u<8xp=_rea`kedhsHkb F\nw{R <bsI pIYOm dr`jjsqv{thC!e7 U.*0*0!4UH=+BbtiDJ.zq9_a6rT;4Ig]! p.&=^R22_~ @@Z^0 .x@rS1WhG "%I^iidZV>0/28}uw7;fH8 cFfL7VJ&L;UeeQ=;@R_nU#~ {GCXolx}.~9 yeL5P(1^"6FB)Hg%a-*&t yB>q!lH;6Zky.G0$@UceT6hS-`(P*JXZp~d?Q2 jYRrE]NvR?(iNTSm{)C D,-(nlqqb yW59cRj W}%CbzoI>RFG4F\> e'UhnK+sO%}Hq^^]z']eDXM92r<R`|:<Lz3lky3uZ'A[huw`= J3w!>s [ FZVFV%r8L_/(`&lbvoh_Z@n'1+ Dim2I VZ=4@83 a9 9BXP 9YVr:X8603%/(/oQTWbxy,=kYbLY`a&T(:83>n!!HXS6'/T`\ dPBA4BIEs25~vH[L8%)Dh \X69@J1I1Y`" y4s lEN -AQIA mLX+0\uRy2uSGT]QMPm{}`*2jX5 l`EzHsZgM[0;fvtkcawyO+E0kYWCOBe yMQC1!ZUyg2  uP 49>17H[x$IVjmg`(t/%j ENu}W! `R=/<\DpC +%z]arWTDX:m PsmppxJlnlXit S Qz.@f|iJSHn"?B.k?""QgRx0[fU*PhTfnCm2n@;>I?<6v( n;2`pdE7M~V=l b<@RP,ICoFu?7_!OTb)*A{Jzc!N2-3/&g!Kgdx>&9pdf|d6Xb!-$ K Jxh2MA3Bu 0F<wG%1[6^f[J-1SI Q,N_y1wsK&0R*3ldo2k A{W!rq` {Z4$*c:I2Ayu[=-nK7Nt+gEIyfXB ?|=n^~[uU:>wTlCQ W>:Y:Me} :tGC)MhoB)VY\V?P:>bN[oeH(D ?GZQ3)}+MH2ARk_7 f@0&\^OmuvS2,Namh:}$m97YW!t$gr'c 7WmycWKUsY;xbf'c3}s[6f" 3\ h+8)d=gox R1};t3oHZ0N;B"s+C} v\Ur5-={'UCgt3n 7FK;vM 8"b6yl}tP6\`:rB75@VcfZ[OH,|Ia]0y .Ah5}Y$v&<6 +'$`0!%(36Or%N|xlXL+% d)dA212HUml*P,61{ln X/>[M+p`O68>JRltWD[4iXHzk%i`_TJscjSe|fRrQ-;>$3`p^bo{v}6b`3VBEK]WI$V;"R~Gt{pK(]>}I*-lW3t_OTPEs*Z\>_#j|tw5y{]J_ALWsl~_2^B3N&HI.oP%v,$^hs9mZ{+\ n'rzEx/=^klR-h#'>A9$=pJ+JVC#8Y7aP;(xc8j=r#.9=S|2J6T2RBG^zi)w2OJ@T /W]aTTbfCr?;.Ii E+<CE@+ uJC6@Xa(r|I% 9k?nvVpA&,8@f~X-"K>ib];3i4Wo{Q}= 2^n]K% !Cdjb;7L_]SYgvW)A*"}Op%zxlU DgTtZU,M.?OkvMSvXF8839# Z;FrEn| SCh59PU( @H-sLSnhxtn]uP8+ElMZp]UCC0=N`Vh7-9\pxy  R&Gw}$7\ }^Fxcx-t]t0iQKmRv8L[mjY)Qb2_ |XLjs}.OCoQ3*_DLL ~.hH I9Kz BwM_Qb,* 1RgR@P6\P mTqDHV0[D{c6 ".)!HsBA_b<0~7VvZq3YB"`i!m8ZWU@01H{W% &{TYO~ZI3 q M"Z'4>c&PoZ)fli0._,8H6, ox2jm0"`4: :Y}P8LgImP|gFB*Ki7|`;)#NO%9XkxM8(0Tk7)QGh# i 9<  '<[T'Bba!RH\sYa)oIECPyU58ckrkupfYC2lA1^i,e vL.-2,%V* 4%]kV6%78/r;  >}(O sAr }L2"A[llUC,*(E\!), ?d9@pkBD7hgMwAi*n~:sh`|BF'ryS-T?[K&{nN:) qXYhzsaLD9WC@l2j)]}^i<0[z?hH*u6 #JVihL9)a"'2q0n}Jj]_W_RVBD:E;6w9I2hRi7VmQ'|'_. 2d5eg)5S_dTE3 QbjSG70t%f i3D 0XEpiB*#:7'_AmaemZBwU"m>|/~Q# p`\VP&g5+_D~Dc.)D\y9)`}%DvTag(G<>_tZHWzW:{cMP`ro>OK`YCmzu\A"zwwSoHrv.S-!~rv4Y1Xzc[r&EYbwsc= !@QYM>P k2f9T/!5i49.0,H)n%]{}q}POLk) W Dd\yZ -t m q}Cnti[7 U7 GV.+7xF<4g+}# *jBrRrLqZ_q2$U.0W [ w?&# %@YkofTB10?W{;g[%q4 !AIPLRNZl|#! '$(,+ Q!;NZnk[7_)oO, bMIl ToTTV.Qd9Tb[@3!KtjJ`$@W4!3_.Srf:$6Ws &k<5KaaaF v.j7zG 5DB()?pqQ%")DXg{Cfoxwn2k@'  ,?`qux{_A-5T$a /=;CUh~TNe'WLji+o_6NzvxhlnL;+'7O7)=jw0DXiK9SrkOeSBD\>%_. [9nRCWk*if9+b|~#SNN!M &.%$'*>F`tP o5"~sFy)6NnL./g/. <h}= @d ~XA-3:PxFMx>W~nC $8c7`feWY}"m   M"yd+ ( < 2PD,yJ%X{h6,AmjL73KT_VRJP4-V %1)#FFK?+6v 51/aq2q`!`R, \( -i'M&G`%nR_'nWt,I7y/'U{ @Tg`bSJ,Duh73{K*DA#XlR$ 3.lSzXI]odEf:_xwcQDQenxeF w^`y?%&*c`dcX 72u7Mb5m {)hvp=ysdoy[,o.e2fj/Ce2oS=&ccf+QDR`_~ ZY0uS<DZOq"BB+/9/#jgv1N[E _PMeXzp\WD$yoc:_pmpnpvwu?cJUpm%f*q$4l"9b{ze30mtT=Q4*$_TZS: #VJ*BM?"w{ 073`k}Z9;UU_pT6".Uof}G V"?6X^VFJeXB,Xt; Q>dvc6 2;(r4hJ"a}}C(/994@BLV^kmvlc=%G0cb>:\rI;4%L|l/'.Wq+=?>7KsFSpoV={3=/OHLQksYF1" aWxWVamDlty(78'Oly_*k h II+6(#|P0$!,*, lr@?-U ^`OMj )Dg^  !S42R4&,GZ^`?=&PQg^lBXj|e3xj#0IUr-%p8+5 #00/,>PX^A*"nM hWo|mpyDh<=cg(=<!`M;-+'5EUsah<B6.$~DJ |rien|&MevsX?c#GjuycN!xV0S s\8zX,y$;8862Mo|gV5&=H?*KsXN-_/LTjmas F~kD& 3/" 0@ZbKZC)  +Qr .l6)Dc`Bv|#,5AEI8Z+R :lQ}D "._&3#ujbpnxq|vxn[YZX$(aZAWi3=w,8MOVp *HE4%3=X`B<`ozqhze!h&zrO^8.2=m>\g^x]/<Tg^T3,"?d|] x/&\+_w;/@t$FwBz(j'EVZIA5+vTXo'WeeS*lO3AOllY>Mr[]{+*!<8ZBLv"'HRWh8m!,Iz2f7.1Ut'25W&ToqwdM ]IOi4{/ssNwEr>a$gX@lVFTh||s][j9{k&|\Z8yTPbN%( /qc>t![o-07oBr-y34\mT2O^ZXS8tjgah\XHKK[e^`my}+cP@38R)// >hyk_q\ qD{ 3;=1v#)Fb<l:OW"EXI(Qq%atN7+(  oR:FmJ44:E/$GA $Eiy  '1;:7 .KjxlO{5F DZY82FC33WQF%Zi8"b-6# i@UyRa5%)@i1#'L_T<uF(5b)]-:?SV\GcMh,f:gksgZQ7O 8Y\~mWMQF>(K}}|4q-.u$X|xhF4 1QIFmA,q=%!"$ {qy.:HPv`&fxW'w?!X{tB!6p5^RG &n-87 -O[dW:p[:2,AIUHIG`s*3=BLTW]Q< r&3M|-z6M]qhO7!3AF)|H& 8dLtKAX m> vP WOsj=d7,!/Z '3E<#{3/jJFNa8l Jod"n1!Iv.?U]oH -;8(h&ac1u2@ 0]:x9;&pyCe)o# +Y! 9\qoxKbl`rN=+Fv *$}P0OZ?z]]m7]c4R(&KZ]S^qGy e%of^bTI=HhwBY+!4$d?W^tuWODKSY\J1^^C/>XnvS&{ fQywnYj&p=|/{A/"9MQSK@42sR, ' # [7pU |Y;1_4= %Crt\QIZ 5gw3@I+Ggu8L[ho~y|hM%,K]y:aA.z=qgeVOOh  S7LVWUnXh-NaVF^'cH.(?)KW;yP1VVk/?H)JsG' &@PKB5)-*% (-BRpS+I(L%%/HWPJ<1) Io0TZY2t&dIWn5?drBQQA;>CG; SJ B:d~~eN,T ktrX4 ^2]>+7U=A#AC2Mv?xgz;iIqw{"b>m`!Y(V)z<  :|n7CQY> Vp'w|,u$Ce')VxN2fEUx]:z8z)&]\6Xr>Ur8zdICB^qe)S`vM6mB4`.,N*  F ,.&$mQ4CrRa*g!Ov]4J":69S\I7YpBIse9oQ^`&:}90 }P~P8* jU_q$P~Q F3 *1EJiE'Gi+})fg#s%`E91.," &4TuneIA wMnj8y`b/7:0)MmgfOUi'.r|R7 p-6:%$X^h:M/,`.p@ 6P$``67`i!YCMYe]EOFdi\8N]Oru~,W'i1y W <Pvq28Tn<'6O{>goEK*oabuXZ fH"#Fdyh=fG~S+pL!VN,kK"$h2$&Df {: #H_3Ql p%SNDKz8y^i)z[J6 f)$GZx8zfVZfm{W',_8PYnvm9A lA&  8^,;J`t~X j3/i .Jb 'NJD'?NH:/ ]"fTXMbo,(mX57QjdWXsvzlmk`WF&#.Z 4_7s*knOa7"Q W)y &0#12iZQ_q< D{bs`YMYrVNtn=_5yZAy|L/{c>~ /5F^[#]FvSL?7g,7d~ppdeXSQPXT9eUO]ms8ab&5Odn\ T s[Sl zR:5/AQedXF$ :SHz `i)ok &?_x!Pt7D%!8Y<uSq>g- 3rzI HkZ'?&=KK9H21"xo` cw{ 9m'?0?#<%W3b*"+7-2! ]T s(S)hDpiA3%'-Jih0mP<$P",Vd|__6w6%Tp-#w4Q@^dL(.e7qf"~h=Lup3oYZZ|.*___5Y}%)'|<o> U c4WwsV#T%[~qS- ?[gEn> bOE_x5n~N rQ?C=9(-Qg+vSMbkhO7!"Fg -O~[9 ~]SHZm2o 6FWZ^QGX6^v;lkQJD6.Lt;Cbv~s|"Sq 6Mc_S=yrX8vB,(%(),L}++W/ 8\s)H]tpVJB4h< (Y1iAje:jH4*%<TjhbK+-@TS?&P^BxrL>c|eU:&-5 P +] %+@CRbiT3rNB9L`x r%4( |=vVIQx}0\<#38<] |y +8A85  Ii0h-d[U"@]!"m!nF- $F b{ij]_\LG*F(n YI ,:'U`%xwt|hD1+J&t 4RSLB79.X}G 3Su.Agwti^Ewd`s F:~~iTL@*MwC)[AQh, '.8>=Oe{%VQ  X^`B2&xYGEhy= uY>14=n*ln.1lA H*%6`"9,|Q) +:\{"Sga=zM# @qM! "W,Y-d|syxwjdVDB<B>>>ScxSp"'CZn4rUM90,+?O\WN9 l2y#wuy*#\":=uWK8%v?"%Y v,e|peZbqtll^VD('h4F8}`\D)m)&Ks1`]ewb"*ETnntys~sfVMWig`Aw> *;h)iI=6+2?Sjd\?(0ox;ii4T*T( 0]pdF.qM-)MO4Sq2Xvb'NtSXjmS,/Nvzq{7AWD'vX- qrz"OwsP}ZSPeAYoyZ;a(,^ )N`szcS7! [/('"3=8XO<nS. N !->c5v0Z]C%bB8TtsRSPYIPX cL0-5?Zi!InwZ;)3Ck{f+~^PF12y%~/!T6G20'$EuS)mion|z}trZCqU|\J2@P*:sm_I;&`@z|OFNwbW+CSaswl\D94 Prb)%'>VrLRVG:0""4Gr^v?%e?~Q0\mn>_P%W( %N"gAv7_~FEo(V*\gVZxuCb(([zlL3#ZQ]I<L]w}{ >mc$U("/IYSSI?' naTH8" (KvnNv}L",Piu\\[otfEuJ&{3Y@*(AYrw{j[WNaq -5=*,V@x%8h RqjU/W<10EXz6/+ #!j)Gd<j s@ Gc*~mR3 Q4?e _K4_Q]H,wkK3&%'h#:KA1 gO;<7CKXRM/;LJ@>Py M8]}nQ;|skBsL?0,$q`TXbx8u:R{L 0LHE5$  v; F ~dHLMpSX% 5dm- *03*(Nwz9wS\[/fH, 6`;Qe<qV09s{bB66U|loG WN_;& -A<6{H zVE/>d>\[KlA5("0Rp/cO-NX\W?8& DS#|ohv~D dV?:>eKBMs7EVV`TL2N<cUnlQ:4417/ 4KNM,hY{Mb.p*8 y_NDTp `k: .v]*#@IF0v:yebefwl'EINBNO`t!F~R.gYA956Uv-Lh!j0J`fjZI( 1D^]T;w0sOszir#9MuV "&5f%;GHLLazt;{=wHQjJ +-&n?"~[<~/sT: (N[k{C kOPQA1a62c| %;Uh<P( 0Ec 8|Wvb)k J|'%2/i8yi_B]MfGq 'Hfz%[nuZ;haW[MB( BanL<,BV||^/l9 %9Jes&KzvK! "Qz sj_wBQnhbm.a%( ,Qd ,Cm.)6+mJ:*6;LX]idj]afk{Lb<fTwO9#"gS5"Z0?htfA(6u ):Vp'Y "-/!M{b@53AYcmbUB$ tR3;JhoRlgR2 ||}qQ?&;jn9T 2d*APdnz *HRL'v9 $_~e[ITZunVRYYjh];kG:@F_}/YrnL(M3-T<byvp[E?-<8D;* E!,"(Ssg6w=nbQJGFWp~~f?7Xr"Ic.U  u<V7 zR=!0>Wot|ym[\SeuK1HXnb> `9R }jtB`x%,28=Us3@;# 9pn2`9F4+r,&b=xmC/,GrvQ3 sD!&q)kJ:)3As_@o#qBgwqv{l\D5(.DTrf!w Y%F]2Ry`G<No"Q|qjVH5}qX9 GrD9Ip &00 (:Rn ;][A6Day|OV*}Cw0@E=?/DJ^lsb>$z| '8LUI;%uYDHUd~!EeuqkcD5&%<PTP6pWLBFOj;m  {>wX>'?Wv?bnwfK#gUcR0]r{xX=!+>KRH<vF1  *&+,Ji=fzse9+Pw 30+wCV%BQZTUW}U~_>;6>=KXf{dM7,;\xeNN_kqM Q;@f0WnU\`ns}{wk`LVYe^?~.JZY5lb[lyKo  1EGH<)V0mUUYm=[uzvv|`+1Rf ,QXVF2+o!hNOY{!3;6.xULLPkg%IMT@-zcE,e@',X{$[nA( hao&ZkB$!Ls]6vspcZLBDit2n~}g4zzsq\H'!! c0}F' =JlswlpN;a{}ujfdbZ>& 3$ pB"|;.Pd1q=]moeft}t[0,/"fNzGyB7^X#RoaM5#JkZ!O"  7g oxz-xXfL|N4RjtjG M3QZN!LU=--(+ 4Nr':Ocy4p C}qA {aM3jOIMIQRVY^SI4$!(;@LTht.["/77=3$y[4 eO4/-CKXK|(b Qz~U <kvR+#(Pzp;}vgC! 6g;{a:3WsxfU89]i1|D) 'Pgsuijox;\lwwweB!EgkDvek%?mr3 `6"Ju(?g>H<}ePPTRZlrW.uCk\C;## >#wAhJs~bO4dO3 No1udw1Zx-BV .JUmigZ[fp|sbadmQ h=,"TDhbU$i6-L!<E:! *=_zyfK7|aF8cE@BdXcSBO^{A)qZ+S<2PrDQ_B% IPh3wgSTMZT]Zj#q2]xKAY*KF?CXd^#V:SutNIZvH|# >j>YfyX  vL38CGIBB@86$ =sd 0LOEvSF7<;<(tf]jwzrebbZpPR{ZE.*",6kTPSkYJ hRPX[ 1p`E^Zc7Z5 s^TJHTgM O=<OVUE=5:KLM:o(}Q5tR&sm^O4! MQqCt)KSel|`KA57. CUK6,4oK}!4<{fW7#kJJcd,,m3Y'QY]wL2(45=9B9* $+CMqnk Fv!9S$]/x0{fI5 B]*Zm<LV ;S\lsusny#Kc1~*4. LW0b+zfJFOcO~{ddm-ABRdsl[MYjk6j> "5AYoH5B</"}_NOYmuW1eCl]\Xl}Cc"_iediolpchnr~jN1 r'^* Am]T"57(!&<U\aP?V8";\yTN?>)S( &K<cv}_@+)3KOM*Fay7JJ'Czb`am{$47/ X, @l<%CGG:,(V/-?p{@`"$wYCHOm\0n-JO>|_<1)6Smf9 7c }6pLEw" '133*$a gNPQdzX'9\rgU=&&5T|u\LWm [/`rL>:Dbq= zThL:fsyjZ<" 4QGwkDH{r^XLSWobE)6\|@nw]8v[T`f0LroL1 ,FUJ:ons4s!2<5l2 &TkzG  /Qj$KyvV2~gQRh&BYZaMD%1BORG7fE'+IkEotU6%Lz_A$vL+7D9' &S%W{L &.LdP;\~vvqL.T&#\ 2gD[tpp]R>$lK+'4@^t{[A%dxBGn 6q/QwmW<&Db7 8US@hP/P{[A")3JQfl~yF)Kb{!NnI)2Y>p\I5+&(0'0)/1Ldw *;90n6B*fFt|T t@~M5k ]|9lU[hSp;~Z<.>^o9j`3 !"6Tlz}w}u[4zWH1452ETp 1Ztyy]M3,'!-;SiY-?a 6<*F^i_`W\j|LxlROTuK s?8z@n 3EUXdddT/QQ C )F]m/rD !Tz4jb*LRJ4n)nZ+-@C`y%0;/!r[QGMPlPBtua<|LzYD0--1BXx0Yy}fkurdQ2& &147/+0/GQ`ggh_bYO.[/CfO)]jJ%tV;'i<'(lK@:Q{? As2YquthstweJj?+;:4# mM*vmcl}'Lu4bxa]Zo t\9-tm{*C`n}k>tvwx.JUn{S/;_{c]ZW]\_XLK@B31" I1=TrFbu{Z#[/ ;X7mm\SD<.mXC81-4Ah<_^0taE5&)-Ih /VxRcUGJSMM@8'"$+$!;W.Ly oJ(see]kp &<JOH4  %*z(b8%  -gPX  y= zaM66/?M~: v(zU;-% %@a1A~r4]( 9?</.>UZA6F5yI0^ wT4d=4>`$] ~R1xF .i'kAU /Et 4l ->>1tU%~S.(/Hd 29HD;iE+ !Jq9VgiS) Dw;XGKq(.;;&hR>JXkL hE{VHRuI ;tmE% )]/?2`2tVK6* D}\<gxY,tU;&$2GKE,~eR/ ymmoH7OQNU`Qm~kIzC sy "veO/ 07CB<4/00F`f!25:;?D@C:*ntnl[A" nI8.$%uu@w)W )-1#\3.Shjh_WK6%oN5# 3TzEydS3}x~ ,[WnC'ao5jcpCH}("&O]. *H|  tf[XQWdh}ys@w9KD4V$q\@2-+;DOLSSh}*8DO`ag\<jaYMH;2+"8]Vvt`E8)-31;;5wXPGGP`v$Hr_? *5Mcu^RXYr|wQT!K} Iz}B 'C`qwz,NQFu=!!+>>:"|x 1?JLRPWTQ>+ uoqqwssllhtx Ak1LknjK)hD"%?[kqz{~vq`P1`* -`!RkzfD-*5@F92! 6o-`bK(}Z&vc`py .N|XaC7-0)!XA\#;NG=!pBCkk;b3Ce.S}eN, ,;Y\herxmC!zn[9%DzwtksttdXKNa~:Z4CNCQ9!#Bf}iU<%u*~0iGp5\b= (]}b7XL|xA0xe4i[4d6wvz /b)<2Ah>lfltL!k1D\obR&i/pb]fp&464?Her~eDi=|{d@z m= {_SJEGH?9.4>e >mc?s\B! *\Dh$]R[3pkxxN0mQF:85*'$&&3<[qDYrM+\ }6T) -Kw0o6h;K]gYP1^M=JS_ls}{wfDsV* vG0)EsA|nt5QdZA$rG#BHULJ>=9AAWcdJCv 5Kfs&HYY_`ouE +?]ou[K?>20 kP97=D]ag_< D C|hO2$ '+=Tp 5>-n|wrjlt .HY\aVK9 \9 &S{7Wl|}lZ=2! >Uvg.I1I_pAe ,JKE&jExm| 7dyyoU:/+4@CMA<-'%*/ ]*>} :it=eP#D9c 9Nm9XmuY+wmomu5v2 mjadf_nz? 7p'\wLz_Y`l~ylZ1 ~Czz >dNn~W0 yPjC&3\%d.a}fedq}vH& 0f%CB9'H;9  %?k7fV %.2**k09`r}x|ysM2_A {mngsx,e5V {tlxwr_J/ fE&Hv)W"7D>:0*6CNL3\!s\STVi||mN6   FcQY`8V,shdx#+$ g=( ,33Jag %Ihwm]=Z |jbawc<"#1C\n{qiS?. *O&Y+,- z]XMA;-0-?AQQR[ew "q7uY3 ~F(8G]e0=l'D\WJ,k-Z'85;AOv:<A3* xI94HX~+Rx">SW`ZU?/}eY=) 0@FRel\nA<_$AQ`]WA7-%'2'%:X/ec=cU:4.9GMRB5&##&'5BVk {cXI;j/JWcc]L/tC .49." nO1Q+V,GRH( raG:% |u}1CCMPY\YSB)nL7 &Go+>R[\oz#Iglq]R8/e!]@67I\|}j\E3 7p.j4VrytX@xaMD3-X<  .=Rf}_= *Fhv%X"%2Ssa-McN=812' !7@G7/ %OXrC%';DH85PvsS>qC+&*fSJ=;024/-iG9/.ALj0m0Nf (Eaj}wcF+qYRB3iE# "7GYm\nO=$"=@KA:/($Q">a~vph[]Xi-o\8wy1B^rVuj\gv $<>MR^ei];Y3 2Ys2Qhx{i8k^Wf}0SozkO22LZhl}ulQ2{rkgZ`ks':Xc|xpcR?'  mOA11*& (7Tt\ Csn2m@>ZkhaM<* z1L}^2lH2">W2N[hptmfXE?76/-!%%5>EH<9*,$ *NjlB}Q$"R|(Qx#3<0 -c~])]B( PlH*2Jk I&00 "1G^o2Ki{vV= _6~}8a>hxH1Z:hr_7C hX@3 "1LgpypiXG:"+Hd}Au7Zjqj^TMG=&wfYE4rYH. FO w_O?731uij,#qfijjbJ: #5Xz 0@[s Nyymqq|.69* }pe[\c{ 'Oj#%!o> '5EA=6 e<)=L^_hbfZ_dr>!.0yU-.Ldtl@\$ 1] 4Sz l2qF.%%2Jey&7LJQLME@8&mD)3Fc@LSD*|yAetd\`|JyJ?Cf +::5sN, 3i5k {O/%+1,`9kN4/:@_t6WdxX&Riyyzf:hZJLLSZZcc_UG5 lE$|\. Eq-_K~yfVD2%+BLZZaXbZXA%K" -:?;:@NTixw_R:4%-,'qULEFOVit{sp_enz*Op|lUQPYnW/rVB1A,ADB( -TwY9(*/<:;,k;@m,Dhywx&#mI$H .S  $/:LV_`Y[UYWc`fgj|}sdP>$ tXC&%Qy3Ip<A<tia[dktM-S{orqp}Jv#',<Ph l\L7}plfmrrpdK0 )=\w7Xl#Kx}R+oW8bP7))&:Jeln]Cwrkx"\6z-39L]v]&Urts$#"5A<>+^N@HUz*_nqsnH\/ (BsQ`VNUQZUNH8% ybQ[vaPD%MIc)]o3sF$1Nhm?cA.|XT @`{}U-_ oaQOFJOKX\fqA[bcR;]9'W*Wv-.-FhL0!?Tvxunsv+.',-=Jbp':/sU8|u`Q>/# Lo{iaVUR^sG`>d>% 07Tp dTN\{BT\TK==@=IRcoyylP4 q^KNPc{'6Rl{p_D8%"xxqy~odX?3&)-DZ!Jlod`]tsSA& sG/ >\quabl6z|\D.+,.;@>0zDq]REKTk(Hj-WeEA@WiX(^D*',Q.HWi{x\PQ^k}~wqfoss|x~uxhaS>. bL$ ,6LMPEIKf=P]Y]Vcimpxik]VGA=9?CP]cePB<:@75'~HAY~ ;j~2Nl{{`5aG<Mar|cUC.$u^D) %M{ 8e #%%*$"|hb\[\OJB34,.%%&&  kO,@g!'+E]umblhC "  ~Z>--4 pP?3*0=QZj_`QV_} >tyh_QN>0} qu| 4TugP;.y|dMC?CBCE@FIRMYYj~3^oG#bQ<<9:778+' %9A>=7:)$>Tbvzzo[TTf~ .9JF/ $/273950{T0!    ;o66:( '9T`b*pQ8#Mw `<$ %.%wYQKLOWdhw~ " /F]z}yx~~|{pkfcnr|hG#vXF>-.,-, !;Ok6S} $54:/,eQ6'~Y$zS7 !>jIy-Hg} $./# $9C<" rP%Zcu ?awv{wrk^WLB7 Im8oU=5>DdB}#7Me+BdvL,K-Ks{vOwvzlaVckysqqcgcjo<Lp~yrwxtVC+o=t`VR\chpohgkx}xY9 'Kf~ <f6Nsd&i<zjmkdbWVPX]nxrik|Nv.K\k{|zgP-W$qcH:%As &($.8TovvurA !;H\hf`P/ .CVl~uX7 #-<GWW[TC<-/7=SpyS1  *9HTPNH;9:./%" /6A;+hYPSV_fdeboy.:HISO\[ggpkskkbb_ny  Z@ tqlpz{rrolf\TA:--.0>Ohw<f %2/({]CsdUWZOM9'  "%-Km)i<OL8%   kL)ucecoR::Lh4RcztS3 twkfaXbmzzynmnu.@QJC- 2]y(:=DA; jR>71 X{~/Ul@qGG+>JQWbo(9A?5 8i   kVI=# mU7-"%+4Nb &#(   !$.1DV\gf_PD%9^yma?(  /@YcqomgVP=0<ZbJ3,#,.,'oQ+"Q*t.VbbZIKZ}rEoK,P i+ 1G^qC^'q9x4OcX: |8nK-bQ@BCKOK6 mnqEl'S 7IdjmbM2 jA&zupz(G\j/Vbof]J4y[0 zB  4Qh (I~/8JV\hhdK2\4a:r~8a"3>]o*6ETD6<ywsxute[H=7&,-Vmy~jmiOkR5 19%$Haton^XG7jYB>:MTjqkkhgpr{i_LB8$#&9Ur&Psk\KIEGE71)2GNHA/zsfa[[`_kx0MU[L10Teoe^K7/" %*<Ym`?{ppXWYkumZKFK`.IJE1!HZnt{hJ:/-9<FJEJM@;$ wh`WG=:,28Jar4KJI1'9?OYtgL'sK&+;Yr">Tv?cu{nh`X@]}opxyqX< -=_IJgnmi[MGDHQ]`bYI5 }= yc^P@1.K^'EPi{".<HM_moLnW,fO<@;E64'Bl*Gs #%]3 uF#8e ;w udH7 ;CIC)[1 +4<87)%!"7NqFq );CE9$vO, *=KTC=( pWB&'a+F\hly %=;*~BvbM?($=b~%>PuoBm>Kw%B^eplqupN' "4Ro{eG(qO) 5P-jdRB:716ADTX`UI- p[5 {JA| /<MN<. .2*j&tO%]A*5Xj&7:IUy$<Q^f]S4_/Y6 )#" #Ow4[nK4$:LRcdhd_RG1# waYQSZRVKHAGLalvzrcYNOFGIId1Pw  rQ+ u^E5-5GfzjYTPUW_]PMMR[X`fw1Kj*,(W61PZdUJ7 wU+$:Lf{ )1O]{\<eSC?ETl;Wf{tbM6wqzhL+ #=Rhpqlb[ccr~Jp,OYZ?U8#!iF& :\ !" 7T|$"n9}AeVL`z#*@a)5:C?F=FFVVehu| tV2gK7*4Ll9j pU?)Y '23;7235EW~ 3`_)zP =ZxMwzxqtqeUB0 ]29Ps'Ne~~ta`[ho~W$zz(8PT]]`_equ):@F;:/(l\C!mK' '4389:Li/9Sh1UvoY3{jTA!|sYK/}{'(?Pm/Lw&PkpfcSL;*qW5~loqyusj^I6|lbk|P8Pmx{^9>\gI$|q|wleY`g}-Pz{naZMH;&$0Ob|iZKA=FEAB=ECD5fWFGDR_w$?BTYX]TPPFMPZZWE3xwpyz~xqaXRX]{G .>NNB7!sF{pxryquqjnt.\y`>f9 G{/;MUcnyPpOVfvy{tcH-kYE9%%HEyz`F! #>Tq}X4 l>+R2@S\joe[E)}kbLC5:Mc$7<N\it{gQ, {R?' 1BZpN|~eEoQD766EVcx @ewG!#<Xpnyrm]OC@DFOPM@(z9w= )?d4S`knehemw"0088=@Pc Is}]0t6xN.}plfo <\t &Hm%=LG@-'&Oi=~qho~2]y6XpQ.jN4(+;OtCu ]>|{rtnuvmg^SH@5+#$7Uy:Qdx~vojnpe\F)wzwi^PROYQSKJBJNQ[dx5CW`u~! n_F>/1-"vU4.c #9D^qlI)z`SF2-!$.7L\sAckL)  ~mg__WZLH<* "6\y$Bm{pYG0 ~}rqdd_lor\6-Fg (>b 5>FMLLGONH4s@w`B4#)-543135DSbjlj``XXOPB=233Mf>f ;`jH+J|W0 /H[vtiN>2 (,'/1?Td'XDddEpakprwqn`\HA/# l= }nv"\#(41BRf}~|vocNC648DQbmyyziU>{f_USNSU_knJid=y{~ 0@Sfonwom_P(yPu}lL2Y'Dq'PsseO?5,0-/" %?h/8>1/ vCE,IaqD^z|tjZVRSRE;$ 0_}{fN@/' k^C15j@gwgXB/&"%8=LJQLPE>++\g8w]YYdr4Ur{_E"<Mdm|x{qfbZWONC?3gJD;DDW]w"FbsojYH/! sb]_\m #@k"`M5) "8;:% |_?5+++9K]|9z*,/ rH#P0M|DvD?`K ? Hw 3HSbmwybI3'Ltv]:% hJ:& $$5B`|*K]zwR-qs4CIQPL<6, 2`c)|H(4??CECJM\_jinogkkt~"Q @\{{`G#u\8oN7 ;fj@# 3To%Gt1H[ciqlpk^P4`%uE# /7:<ou[4s]F3 /McmVB, ,Jb 2^4\i|tgJ.`)fP6-*'1(\D,,(=Pv $7:B<<;5:99, oWUXis(EQWQ;-(U,5=95$En^PWSSNJCFK[i~$4>AC=;,(uq}I"3@<+ }Y,rXE>CZ {$9Kf{!'mH$ +6?C44,+18J\qztpg_WH3#$" !CihH+}z z >b %*,--|wjaP.+0865 xjZN>. 2B[t5Y#6NU_UI.l;',3+' lG, /Qo!R>R\figWO7&wO '4KTguq[C'pF% ">Rm!OizcUA/ 6[(-!b8wjkov'2;+}try%ZRzxtufXB1..Lm*OnzY$_OB<33+/24D_{ /:K[et|~jS+ %B[y }M#hM' .I_ory5[w#&jQ2|H-*&#1M}?X]ZQ=5+* )Ln'<NML;']3qW>2"Mpp^?/ ,=Yw3Ul.Tk~{ymO6M}zqtosy   )LhtZ7cB1'$3Ik! %!1Md{{`L2w]KCCLXl+8EHSZ`wuTD2.*58EFR_g|m\D8 }d]SRNA7 4e,Pk$,31 g98GTTTH?,s@x<Fv"D_owcT:#pD'%*9DVquX5 Z. 5l)[sW4! uZKDMb5jvcS9$ %Er_D)>AD<?>N\yyfULHA<*&Squomzyn]9)4:5"#1-0(qZ?, ):+lPE=GLdq !,AFMUPWXcnpCfQ;4-2.8=BRcjuswz,@ISMD09To||pXC/(%#.511"zg[N:2%$(-Gb,G_lfnnnf[XRUVME3& /AJTI6r_XMJ>:,;Zg ,[kI9-'*031)  ,7;DJWhsu<xTGBIMTZPSMW\u !+' 7m#n\H1}gd[ZLG;,(*5Oi s{!:M`eklgmvzzcN/+IiwZH' #FSaZD6$ {R%3Ry#Fw.LSLA.zMwL )LxH|*Hgx_9~Dtoz+&#sfVA5+$"'>h,x Cm|ujYD8" ^7}hXGIFIDGIMY_u#,#z{-QdkElda_u,9?GHB>5-# 1ADLLJA@8/-*49?HGC1" &<FaonT8yotr}}ytnpn}.G\twraVC(7i ~Z1`B- +Nbju}x?brdE"&$7KMPB-'KojL0$2IVfkpicV>&mgcr|0N]kvppjmha]VPB)w| &-<KSdjtvsnm\L1y}"AJOC90   $3AKHC3" )D^$3/*x?ePRT^aN72O`ex-:@O]w  |\H,hK9.$-3GQfu21+%.;C:70" +8Vq}c= xur~ 2>=A3,"   !(41:3+" }y}%6DMYcyxwpwypgRD-"#*"  /@IX`_bepyzL+No"8@IB9$~]6oXJQZn|"#,3Je}{X:v^F>:GWk%?QbkbX>%<[gvyxvqommorwtxy{ysr[O6#/>:9+% /GM`alouqohSF2!    ~rs 1=Qg}nP;1PnmZB(xI(C`w,[`5~]8lF837Mf1]Oo$ !;JWXQF( X*|W62M]v.IitvmW<$ #1?BPZlpyvlhcSH3xfTRTby!(3;5631(! 9Z~c4wskliely8TntwbS/oZDCFQ_q .SpjBsbNHB@Rf+<FG7/'(35HNWM@, $StK!ub]\l{$]~sJ$vupwx 1=81bSELXw&7HOX_\\\^^X[[\WQH;,  $ANaed]E3 ~|qqed]RVZkt >Rkxzxg`USNQJD7 {jJ-KZ`dhbilx~~~xz}w{uo\O9jE.!7Kfz<[qu]L:-   #/11"#7JPQ=]5#2JTbgsz*<N[lji[C0 6Qx}gS<_7dTV\m~8d&>Nj|oe]du  0;67!xP0qR?+ 5K^| 3O]yzcS5}"%1NsgI8),28BIIK=<67@MYithbL9' {g[LDE@KUf} .RxreVPIH@;3! +G\r{ha[VXRJ?2%  "$.4261-o]OYh!,@LX\ho~xaO-2KakeXA,lXNEQd'\|obWRKRT_fccXM0[-  4Gk:QoqlYK,dR7!Jm5Qf~NxL,+>^v$8LQTB/ %;ZsnTNGAFCC9%qf[`hn~(P|lQ9, "%$(%6S]cZ<"(ASp|ndVNB+nI- !5Kb :Sj|fYL@:*(|i\Z[i{ttu 3Qr p=kT5 !8Tl+O{4CB2~seWE1zk``lx)Eh}gEmXH<-&&6Sv )?IisK#,FYnwmTC'@SktkdRI=8>F^o{whL5qgfiw@[l}{|j_M5 %+9@PT^^TLLAJUfvn]M90'!)&8H^uk? rP2!  =X2Gdr|jbaapz|f]OQRF=*^; &4AWm/Kf%.+~ncPC."r_E91'$!'-=Wm 5VpiZD/ pcUW^s -EWw }^E"*',omm  #:I\gmgbM70Qds[J7  2GbreM5(  )2>?HKDD>>?JP^_h^TD'  +8LPSTKQPYZbfba\VHA7=A[qs`F2  rlaSNDFGL^p  !$&,,27;C;<8,)"&)88;,~sjkhpt/<R^aechfmjlaY;%3;DB;)xvw.@Viz}na?#wj\SPIQTgz/6=0&*:CNVRXV_^iipy~iL6mQG>BOP``c]MFB:=COYet/,11-+%!'2IZh{wYC sW5&9?KNWZbk #7Wu#/=D<6$mW?urkif[YPG=@:FK]it|}{|$1FTmoV5}{~~"/-40:BYr|eP6("7EB<1""2B\qz{hW>0 $" -33.*L`uw|xlgbfit~l\I?31.&*Sq}\E*! 0AI\fv Y+)=GWdbii^SE6' 1Mbz|gVI:9<DMVWVVGC3#ocVYZhxChzwfQG63+.24?DLJML=2% ";Wo}}pojs~lK4"Ld%~fL>+ kZMA<69;=IO[^gdfgaa`eu6^   &!  eL/zn\UMFKQ\dx*>IWbiw }Z6 1GY_bbZO>1zzswz 7Thr}o[TFD;;70)zj^P;1 (/DUcu#EXlw{viTG8-$!0>;A;3$ z]M955=Qc&:CCD=:,$,/722-.+:@Ym~}nY?vnlfmv ymz )EZow~nQ=$yV<"&:Vu   !5>FGACGSc}h;eF(  $-==C@DAQ`|"?[ZYE7$!*27GQf}hS2& a8 ,Fk,5E^udWD2{[6!A`4\|fXE:-T7.FX`p| &)44;;FL]joS1 |uw~&,<:<3  " %$.9BUex~xlX2{{'<PU^]is}sK+vnjerwwqdaXYW[_W\VWSYW]_[]_brz'JsoX6-COY`]__gdid_TF<' xqlhs~,14- "(3+%xkigs}}|vlccio #/?Qat|o[VNQKOE;${gRD=%#;Narw -BVat~f?w[I;31&&(9Th#0:P_rQ2 Y2 $'4>LZu !=]t~h[H83$ v`RB7-15FUn5COKD1'  $'.*+"   uS2 -EWp,@Tbrx}Z?zia^[htnaM<"8MnBn pYPGC772%" v_N/8Qp %=Pj|oaI:/%-1BJ[_nuseR2|[H64.99?4+7[z#:Um~yt}q> yP<#/G_ty;XwtdRF9*"  oWC;5-2..*  3Vr"Mw 3LY[C,paS?3 s]SHA;>8@;9'Vq{}|wwssspsrsnofbW@* xdZOU]s  %7M`u]7yiow %"%',.55/&$ 9KVc`fddbejdha\O6"rokit~ $Bcs~r]RA9) zshgajo +148BMZbsztWC& zzomb`YZ[QNB<85APh{  "6Mh~ysngjhib]QLC3-xls}  %2BMPZ_deg\\RWWSRJA. tttz}  "/3>>MSaonmaR>.#(.7=B60 rbPKCDCHOLZ[djs~F^zynpkpru||gR3&&01*a:" '?^v&FVgkfWE(*@OadmlaXE5 +7=:2!  &58?<3-)" !!(#~zxeaZ]_cad^gj)JhlOB:-*"xaO:"7i(;GXgkt{xo\UF1% (+0$Z4 !/Lav@g~vlnnsuxzpkYG/{hZA1 5NtATcd^]X\Ya_dab_UMC+ w_A+ +AWj 4eqV@&~]A' &@c<R^mzvZC2(jVH;<=GCF:. %Mz(Hh| "8CHI8-{l^YE>,!c>3Tz4ak^O<7+&waXZ\nznZD4( $%23;?CK\ky #6I`ql[B6! '.-416/4-*& )1>B=<86:6@@E;0lR7)9d|!1JQ\TRFCEEO]\ebb]]aeo{{nO9v[E- )6Le ,=Q_lorqe^QJ=;6@GXevungYO@2 |\J3#  "->QYp$#,.<;G=?6%$&6?Tbow}zumfZF6#0;83(  .8DMPZ]_ZUG='zjM@("$,GXu"*3DQdhu{ttfZF)[97Lk8MewtUA#pbE7#  !6C_v5PcxvxmkWL5xpgaZMJ@>;49<6968<$eH!7Jbhrsmpu-A[ubC(r]@0)*47?JNbpV3 *0%%(!% zaI/vu+dCrkE!|lZWWhv/JnlX@#  #Bd|kO1maKH@FIS]\cflx1KeuvS(~wqww{rkps~=i  jM/tjZPA875>Qm$=[vkN( |uz|(&(/Df}lR=zqaWGFERd,Laisqqd_TB8* "/?KessW?~T1 7Nn %@VbqpdVX^ok\A1V15Jp%BRgp $ r`J8" {_>( &5Ri.@JXip{rhcimy~pcTE. ume`fgu  $:Pbvzj]H5 )<UjqQ)kK2!)6KXis|*Jq-1)zeG u[J8'  7Lj ".1267CO[smXA+y[E, &1FTfqv|{{zty|/BP`fqulF$x\L6,1I^} " ) " (FYy`<]9Fm"$,-57;B:7,*Gd_>z[:+ #=c DisU<$ 0:MYkzyiT4 X,#0AJSXW^gw"-9Oi6?ED4+wQ1 eH.  ,4HW_p|(<Pdv%:HV]TQB7( kD'-4EM_j~}]F' &49DEFC741;FQgszqT;,LfyS6|e]Y[l:crkUJ:! \23Tt /Hgv ,887/'`:waC-.Qp$CYwxvlnpnrx~~kJ*yjWPFMMZ_pw7Rvt`ZP_gtrdN<$ uV9.-.;H\t)@Rbpx}jN.\==b5Qhvxtokxx^F*pjiblp{)Y{fP9/%" #5LU_UL7hXO?=643''%/7L`*Kj   saPIBB@@<4-*547-'qR3 (Hp +BVcq{~paQ>0 %?Pcea^QE4 }%.;>D<7, jP9% /?[q &8KSblholvxumnjrysY8zh]RC4$ 2Iap !3Mes_A) xW7' 6V ->FQWam} 9c{a>mBrS06e'?YiX$w<*EZs +Dbsr`L=2'08Nb|lQB-!}aRC4/2-6>Qcu=NhrpkXNA/'(3461(| -AS[jq{}wsfi_a\\[\chswlUH1& q[H<03=Un6NcvxiZI>:6:>GIRRMJ@:5:?IXl~sU8gTE@>@Qb&5ASdjrrqicZRK?:31)-+8D_xxZM6)#:Vor{to]RE2) $<G^j}tcR>sVD6.)3?Nj3Vy),7-,n[F5&  &$&}l`RB@>HSb{*c+Sp~rhJ8a3sZ9"9CYmF|-NpyT6uaL:/*,-'|i^SQF>1   @f 3AWjzdW:,kK4  %4GZr "/9DNYahhgjhg\]W\Wei{nJ,}gWPGP]v(;Pclwyyp`S?3  %13>>72*$$28JS`agccWL5!y[C53:EWj~!.>L]ox~p[L3&0=MSWXPLDA;.' +Ljn]I8# #AUky}qkaRC1&2=<A:7.-)044;;==@?EBKIROPPILU]exq`K;( &8CR`bklpmssmma[UJKIMTOVRUMJ=7+{thg`d]gex&Km}zsaT<%tS) )5?JUi!EZuuhYLA.( &'<Ih}|P#Y,8g &=QWemrshaU>0 %CX{!.:43$h;{olqxweZICB@N\s)Uny^B% #:EWalokeXM@+#%:Wit{}}wpbYH9& .ANam||gR9$ -6JQYTC,}||v|~3ZymL5#%4?PafrqlaE)wnjab^^Y^bfz#;\ov\;"(4CFF:/ ndTI5*"6Z7[wfP4    {g^RPMHEIDHJRXj{*SvyfI3yigdfmwqj[XS_g{=`&AKWUSF2uT7|zzsgjo|/Rl!oS.tphhab[a\a^WSH@8&&BZ Gf{m[XVUaimqosmlaZG7hD# 5JWdfs}.GOajvvfZIFHQcq{hWE<&{jS?& (Di.@HW[egow{xq[L08Yowh]G9"#@_q|W6  7[yjF&zvkg\UKIKOe{ 4KXpqnged`hru~tqhiejfh]VB/eF'bsfUH4& &,2.-n]JIFN[ez +?OfwmM/ ui]dh+?ESZbac_]YLG;/! *Hiw`A-+D]oycF+'8GS_b]WM@5  %7N[oy{{so\L1tnu !+9;CGIWasw~riXL=,# !=Ros_H8+"'0154-'vqnry|!'.197==;=<>@<=7.(#-G^zvT<!xpf`YQWZgr /JczV+mX:( >Pi{ 7Yq gF1l\KDA>FP_z +<JKPKC4%(8NdqeN-jZH=8/9D[u !@m _J, ~jaSD?9>CUg|(FazxeQ9' zjYKA2019BRer8Zxvj_UIGIOTackminprt|y|pl\R@*{mfceiku ,:M]ltpl]N:- (*0'$4W}t`O7 &28FVhy~smh\XME5"#..624+) *.=ET]mw}|mWC)";Nfy}sdNC2*   $*-37;B;>92&hL:3/?71% #F[zbF' phUL<6+++7AWo /?PWenovvxzv~}xp\N3" ! ugYMKO^gy$F]{z_L7( +3BQUacfcSJ5xqbdfu  |~x5N_``YQJJOOY^ddhhba]YWFB3) +8AD8-upmgnsz-DW`mqwph\G:,# !/8AMTXSPD<) oXC) !Ei   )0FQgnz{}{txxbI*nZEA7>DWdz'2EOX]TK7'}jQA1("#)6@Ym    (0=BKV^eoqvwsmeP;U8#%.8CER[jr!04@FEG?8+ =Rbrw{trbXE:#jT>- %B`|"-+!#.8DIPXcq{iH&udN@627:M]t%*%!~vopsz!B[u~ynaJ/|f`\ahekimpyzrgcabbfbffflu9]~ znUD*xxwuy~tk`J=+"!':Qaz4IUbhpotqwuvhUD- of\[YPQPOILFMWa}*JcgF.+04?>HBD3* #&&$oOE3..0:F[b|#-;HKV[aejpmtpod\RC;537ELbi}}q_O:*n\HA;BITelz&2<>3/"  #3BZps`I9&p[SPGIIOVbo| +3251*%%$.:CU]fdhaTJ<1  $):GPbmuxyoh^KB3*   1>MVccgf\ZTROTYYbbfYP>3" &%)$pf[JOKZh  ->So|i^UC4  (,559853&"o`RNEIPR[h|0AFPPWQUSIF:2&  ,1>CQT^ggmjk`\NF81* !    ):?IHKFECFLKQXWQH3" 0DdrypeQKB?=ADDJJF=2#$$"~oc\YZYcju&16BJT\Z]ZTIB9+($',1=FNR[[`\`VVM?9+!maOF60(+6>Wk "!')-35>BJNW_alvz~_F!}wnf`[TVVS]et ,EWq{zphRJ8+|{uqqjqv %9EWcfokldc`Y[UUID9*# # " +.9<AA9,}quw}-C_q~{mU2 !%,001*#vga`d^]^TYW`jw )G^t|pcW@3   -0<@EHPQZ\elkqtxssg[I6! (Jb|}wgcVOH:7.*' |zw| #.5?DQ[mgQ5$ taWNKSS`m;Rm{zfVF5,}}t{} #%)(((!'',68ADHC?4#%-,400&&$ yzz~}unpq~$2;ITRSH;+  !#,.2141('! wngkkqu #  )?Pfr{jP1j`N@- $7Uj/@Zls|~zaG$uWE52/6EMaly~/746/-   !4FW_fYQ=%pV8# *8N^l!  !&09?HMUXTUJG72~pf^aagnssqpmnlry 9J_iy{pdQJ7.&$ '+0-,"tdP?1-+3E]y &*4<?GILQJH@5$ )))%    %!!  $=XjpZF0 /:9:1- ")34@?B@30# ,5>AHKRVSWRRMNLU^ht~r\K<31,/95;30 zqefkx.JXny{{qeS;,  &%'15@FSZivzbL/ (%*( #6DLQPMB;/*  /5?>C;;-* "+5<:AFOYZbbdd]^Z[VTSGC5(  )9PcxqaL>* |+:APZely~weH/!4DHVVYTW[Zeo}|j]P>5)|wpsquwrvw %-;GLWUTLC:+),+3??LKRTPYYcfomqpdWD0 (9CPT\WUH@,!  zvtyy+;MUflw}|{rgZN<2)&%)+.3--$!     sc_cmz 07AFNS_iiqvw{}zn_N=0!&.1:=A@76200/'!{hUQLPLNKIF;<:AFUen0=QX``b[[W[^blv~ohXRED=?;=8:5+$ vnibbbgfmrqxz,1>>FJHMNTT_bfjomrry}{~wvm_SG9+ qh\OJDHLZcw"+3264488?AKQQWTSLH;7)(!# !"   *BMY[\\PQMPORUTQL=,spmx~/:IIC9, %)%'  "%&*' ysikgqz +:FJJH?9'"   !'%*'&$"  &%%+0:@EC8/  $%1269-)-?XfxrcXF9 wnqt~|ulmnr*0?NViuyqc\NE5(#0>BKPWY^^dgglnsnqnjgbZL?0 zwtjjdinr $<IKMD>(3DWeu~rgU=-  ! z !$++.-:AZp{bT@1 zjUH3) +Gk %)25@ET\ijrlhaYZam~vX7ykYNBB@MWl|3Jbmpi\L9*&.>LUcinn^Q9(  (4DOPUYNNB;.$ }x|/9ILRGD9,&&+1413/0.$! zkd^bblx (6:@>DBPYcq||sqkja`YPJB:7+$uW?( *2HYt7LhpZI7$~vmbc`hjuz*9?IRQWVUOMKEEE=9/&!),199@@FAE@:2!wz~ ):@MY_iosxyyuvsuki]\POFHMMW^gfh^WSJKJOLK=7#yld\_\diw   %9F[ju~udWJ5) 3>MXX[SOH8. -<Q^q~tiVI?3, smh`bdp}+6EISRSUMNLNQLSQVYUZVW\TWKG<60+-/20.!~wxz$5GQbhrrtujg]YKA6"ytsw*>Rbm|u_J6~j^W^any} "*---0*+.).+47CMZnpU>-|q`VJC;959BGYk "$  (5FSUXRL>' $@Vcrtrd\J7& vpdcdajmw3Mrwts|~wd\LIBEGCB91#mK)'6@JOZhz %+43=DNZkzvkYN@=6:81-!  ~me]YVLIA:-'&/5BPcv*EZovp_ZIB50'&!udSJB>99;366;>KVl 'BYo}}hUE2# pk^]Yagl}#>N\ckpp|yfN4xf_WZ`ny(/<BIRYfmz}xl]E7$ |cTC+ ;Qr  0=KZgqxx~{{xsrlib`]TSNSRYWYSN<0wkjfgbfens5Gdzvod\RMH?@@99530//('m_VIGFLUbp $-*006243*)#%%!$%*//66;9/+ "**-007>GOTWSNA8.*>GW]ebaZH>,! "2<M\etz{weV@' |eM>5.5@Ug ,6<L[fxnZC- yq`^VXVcev|0HdxtcL;& }ob_Z_ho#.;DGKST\gqvyzl`I5"'%$% !*8@MV_c\XJ=/ )4?C;4( "'*.,,% );SbsvbG,{{*OfviQH3( "/8HSdszzg[G7# /=EMRQYZceijhfc_MC2($C`~pU?!~svzwroikijips}3Us5@;3q\H/|m_POKOX\hox|{xsrus'CeoUB- #-9?MU_aee^YQMA:)" rh_\^^kx#)(+'23>DSbl{zthYQI?81/%  kWMBDCNTcqy 9Lcwzymi`RC5' rZLQc}ujRE4'}ph]]_fx !29KUeot~xtj]VNKD8.t^OFIJWbm| $/63436=DUbxvhPC- +5>FQZht~xkVJ<61/-/,.(,'  tgXMMNUU\`^cdo|+CUi|scZPE?864/2/3021)& yngcfgo{/L]s~}~z|{vnif]_]abdbYSIC:.& lcTNPUV`eoz !(,+,$#")08CLT[agehhnnxz{wg[L:0&   &9CQ`ks|}peTD6#  o_[\hr)095;49287=DAJGF=7% $8UpjO:#zvry*E\os]G4*DYqvl]VKE:3,)8DMPSMICBAIS_jp{x{tfZH:' # +5M\w|vqd^RH:1$  %-**  &7@MNUQUTYZbbab[WH8**9Qesspggab^UOA5*.9K[izy^>$ |srjoltx %*=KazwiZK8'*/:??DCC=<223.35<?GHOIJ@;0rcN?,  4Lr$0FYuugVOGKKJKA8gM=1,*# 2J_yLwudO@*x^B ':Pgv !;Of}wmkkiuztdK7 qkeca\]XXTXV`jt+FThux|~vrlbaUSKIG?;3/#   !'"" |rrpv~0FW_fhd\L?4" !',,0/,+&'! olfjq$8BT[gmjib]UJC:7.*#$" "-3<BCCC;0ygVKFAEMTfu(59CHNPKJDA64(& !)7BMSVUOJ?7' %5JVjp}~wp`WC:($ "&11400-$  #+-21.) &'&-0:@OR_epuz|sqh_VHB73-1+068?ELPTTH?.(<HT^^^WSGA55./42:=EHMSRVZ^b\_[ZUVRLKGECA;. xgd_elr  (396;79><EEPQUQTOT[ao~}p^P@/  -9FPZ\ddgjkprwsvqg`TLF83($ +6=JP]in{xjaUN=5- 0>BIII=6'-<JRVZ\]b_dfihe^J:!xohlp}#1?FKNFE<::59:?CCD>:2(('18IZfuu_F- #-.6581/$  "$!##'01:CLMNH;0#9IYcgff`WQJG=<8/,#  !((,2-1.-&' (7LZl{{hQC5/)"  ||z0Ih}dS<* xicb^beow4Oo"+((oVD'~wjhb`^``fkkmngd[XRPQU_j|/?Yf|zeO6$ 7Nj}ysg^OB2 {nibfeqv#.=FJQRYZYYZSQIA;+% *>Kdrt_P?7* .BPcp|{t`P5"%(03-/,+0+/++&28GHPLNIGB><44031'!  ',8?JOY`_]SG4#&3JZpt]L6$  $$)&~nXOHKTf}*?HTXddnrquv{}ytmWE*~}#CUiowrqj^YQPPW]afgg^VI9," $2@OYXYMC+ti]ZVVU^ekw -AM]epqtslkcc[^Z`bbecaaWUQRNPLME>- yoc]VKE=>>@JTgs+>MUSVSPJLMKRS^elxoXE/sYLA:;CGR_n  ,6IT[hiokka]PF9% #/200'$.>BJGJJEIKRS[\[\Z]WYRL;- $'67=963'!#:H]goz|~}tg]T?6)# !!&"! -5<=91/( 4I]rwnbWG>-# 2Hdu}p_VJC<-% 1BR`ktrvxy}yzgV=' %-@Sg~|bP8)ypjehfs}(>L_l}$ }\2|tnfgeff]WJ?41/18?IROUX\`knz/Pp$0<A93#hR8uthlmz (0@IV\fiosziWF7& /?TbwuibQKD;6+$ "*69=:6-  !#,/56=BCLLOPHIBB75/" j`SSWVfn~$/5=>::31(" $1?ELJ?5$0HVio{}wp]D.#(36<<73( qd]Y^gx %## $.<BIGHEA=55-.! ng`hp)6FTX]\YPF@2.$ /DKZ[_ZZONC1o[QMFFGKTYiz/B[fuvum]SD8/"2FZhw{mZPF=?>DCIGH@=2-% ~l^SH@8/*%#),=Lf~.7GR^hnromj_\TOLB>5,'  "+.&uaTGA:;BDT`p&>K^kv|~uobP@- $05<@BLR\eotuxqk]N>)rdOE;47+  !1FLUQL:+wkbbbdmr}-G]rz}n`M=*  '.562, ~zry{ &:EZg}q^N;.  |xttwv"<\spdO@)|h^ZWahx+B^}   qP$!Fg$).*!tZAaC) +:MVip{ &BXt a<v]N<4.)-04<@?ECLS\m "1:LXo}rdXL8*~gVF71,..)+')%*+4@I[hx !)*5=CR`pymhZJ:, "6EXclsoplg]XIB2'   $*67=86+!wbVKOO\h},<Vh~xfP@/'  veL6$ $;Ws "6JXiuwvwmkdfb`\XNC5)  !#& rlfgfopyy}{*C\wyjZL@6)$ r_KEAGPcv -8:@@BCKQSZZZSNC2#$7HV[fltzr`O7' "'36@@;7-' #',!  '.=H\mv|jWB"    }g`]jv(2=GCC;7,' -KjdL/.5?BEG@@6. %5DPbn~{j\F7$-?Yj}vg_UOG;3-&  )19;B?CCB@=<." &$,(& ""!  #7LbuzfP6 me[MHADDQ[n,7HYbtxX. }_G<9=CS]mz  '?Zy~lUC-aI5" '8L[v  &4:HN[^fhhiefgdglr|~rbM1tgc[\SXTZ]ek{)BVes}|phZPE@<30-&"  usijllx&(1,+($ '(0087??EGGJLED;3# #*6?N[_c`ZLF50) +EVlxmaI9#'7IScdlfj^WG;$)9ALTPRMJA7.   /BWcwpVB(}vje[WSPSRYX^\YY[`blv 1=O^j|nYB(-<L[frxyzyvlf^RNG<5#  "%&# %3<CEC>8.(  #"*+/29BGPV^a[ZPG9" $"&#$&(,/0111210+0/*(#0>EJNOQNOGF>2+(2@GNOF?1' .?HU`gknrjkaTF8($+2485823/+' )7ALW\chmnnjke]ZTNK<7) '48GQ\fgjd]RJ<* %7IYcpu|}zypla]ZUSLH?:3$~upgbZ]]fw)BVo~h]J<.  vnca_clv0@FSYdjkpswwyzrmcVC4! )4CHHG=3% ~y{z%*7>JOVY_^cggnqyyj`N@/  (38@CIFC>0%  (&,*--$    '*0.-  ,4::33*+(&),3::>>;810-,,*))+)-1/65;><:8* ~uvxx}$5@S^lloeVB-&-3/-&  '3DJTU\WYRQKIC83+'# $!! 3F_ov}wh^O@5)  6Ialy~}vbI2 !6NdwufT;( $;Pmo`L?-~y}-5AKQ`huw}}sl_MA4,$!%$('') " (5=FFJHGG?>70'  .5CIUZdmsz{|rl`P@- ,68=>A>982/( ,4>AD>;,(!)44>==63-" |rh^YXT]fp '4<CKR^fmvy}|zwkcN?' .7FO]ggidaSI:' ~|"5IZcou|~|~{zneVE3 %(+'(#%)=FQQSLKA?53&   !!&($''&(+'% #(-..-'%%  '5J_jw{}zmcRD1"  -9ENY\gkrqurtnoebUPA>.&  $.4?HQan|iP?+ uslnps$(3:CELKSQ[[cgfjfaUE2 $&06;CEIA@30& "$',*129AEKQPUWWZRPHD:-%""  +5?GHLKKHKMOQUSVYTQIB3$ "(7BUdoxpic_WRGB1(&8ES\]ba`[NF6*%%(!" -7:;:3,#3AJV]bhlqttrg`OA,#4COU^c^ZRH=&~w{| (-7;=><8:22+(  0ALX^\]TMC9-#    ")+-.#  ('*)"  #,6470,"  /3?@IDI@@9/*! yuhfdjq &0@IW_nxz~}zqkbVOE@4.)#"%$03?AE=8-$(0..#   !!# !   $)5BHSX\^XXTTTRSVV[VYSQNLFGCECDAD;9/' ykc^__hsz !#)(+! %0@KPVZWVVLMIIBB:95)&%-;EU`mu}tiZJ:$$6BT]iknhifa`]YXPOIC80#!%,.7=AD??;<55/.(%  ymkflrw #+28;BAC>3-%&)&(' '9BOPTONEFACCBGGLIMFF?:0  %.198;=7722-,'%}~ #-089;;/,!  !!#!!%"!!$+.6:?@?>750++#&"&# &*.8>GPX`_b^`]SNA7#$5@KSSYSVQTQKGB=2-&   (5:EISU^akknhaWD:*/;Q]py~xlaZMG@83(!*7AMRWRQI:/$  "%/1711'#     (3@JLRNOIE@5/#~}x| /6@FHGHFFGBC><0+ -4@FED?:2%  1CP_jryyyrmf[YPNE@4/& xundb[YUOMLNPW]iv&.079AHQYdjpstpnj_ZNH=2$|pbYQHGDEJSZgru +8=FJRU[[\VUOC?62)$ &&+'& ###%&'(*'+*-+,.'&! !4CMX[a]_]WYUTPE>3*" !    *+6;<@?@:4,  )359771'!  !#$!"$(&++/2/3221)**,46AFKNRSQSRSOPGB1&#*04;9;8.& #'.58<;7/'   #"#!  #,.35:<ELQX]_c`^\WPJB@>9<>EGQVW]`cjgic^O?'{{wz~!-@MYclw}|vh_PB1!!&04<?GMR[gvvgXK>,"|ysut| &(0398<9:832.+*!  ##'&&' "!"   !')))%"!""&)'&   *6CJTRTKB3' !&#$     +28BCGLFGA>7+$    !!'*189<<;52'"  $'-236;<AEPY^hkpllb`XUNNJLMHF@9." !*8@NS^ahkjootsyzwytojdaSM=3  &#%#$''*24:?DIIJGE;4&  "$%&%% !"&--799:;;=<<73.!  %))+,-06:EKV_bgifcSJ9))4DQ`fnjkdbZWNNMIIHGG?<72/)#  '*7?DKKI@<3&"'-79B@CD>?74,%$.289>C?@><9/,&'%+25=AHONQQSPOHF@92+%    !*,5;;@>?A?EEFF=;.)'2:GNW]_`]YQE</'  ")315464889831&   *8AINPSQQLG=6& #+/8==B@@?860*"}|{ '-33685;;ADKQ[diqx}}{tjZQG6.!~vkfbacdksx$2FT_ov~|wvomnjjdd^\SN@9,~ttsx '0@GTVailoliaYQFA;9430'" ""   %,0402-,&%*:GMTVVUMGA6-&"  )+02///+029=EHDC<6/$    +57<;:7.(   !+38<?EEHIDC@:31,%" !.77;83,$"1>MS_edhdd_^YPMHGEGCF@=8)!  #&/0697;:=;=<67320*)%##"%'.07251(    %8ET]hijh`[SKB5-% &2=HLRLKE8. (-8@IOTWUUQRKLFB94+& "#((05BMT]aeec_\TRLKG@<51'# }uuorpkkhfd^_`gn} '',/0438>=DEFJFIGHC9."|xxwx.DUhr{vnbWF>2/'% {ncXVXX[em|  %2:BJHID?2' !'168<::2.'   '7BJLKI?=8656:7?>@><7/(" %)47>CELJPNQPQNKH?:0&  "-4<BDGILMHF?8/!  &$&"  !,1575721-,).-8>HOSZ[_`bggou}zqhXK:, #05BILQSV\Z`dlnnpqokgd[VNG<.! #/6CGORPPNPNQUT[[_cbfgmomlfbYH;( &.176<891/"     $&+..0/.+$!    $'--./($      (,59:><??:630/))%$  &3>INY]dhee^WJ>.# +<FOWTVVQMJE?3, $+4:DKQWWZYPMGC@@?AEEFFE?;4'  (9BS\jsz|voh[VNF?2' #1<M]qmT@(4J`vugZOB6*! $5ITit{hS>/ (=L^itx|{{vtpic]XUKIB<8-' !*.48>EJU_iw}uj[L<+   (*4252/.%    $-<CNOTROHA5-$ %,49?@=@@DIJRSXYSQHD=/' $'./,+# !-;HR^gkprsnh_WK=/! %/4<@EEA>71*  "-6BLOY\bgjkomqmnjicYPB5   $,07;@@DC=:1+&+57<:;41/# | '6;EHORX]\demnwz}wpeYO>2ypd\WRTV_ew'+47=CDKOV\]^_a]]\^_`ddhikdbVNA0 ~rbZPPLRVbnv 3>KSTXWVPMJC@864/0.0/12/-.-+()&*(+(*)$       "()**%$ !()01695633/1,01.1,*  "%-6BMTairuyvsl]VF<,! #!" $'3<JR`dkkotqx}vo_R@+  !-;K^m~zldWNC6.# %3GWjzu`O9 ztnnpv$',58>AHSU_gmvucR;* #&))*))*()($$$&,6<JUdrx{eU@+ '6M_s}wqf`SL?5+ "$  )+45;>AGMQZaknxxzynd\L=3'   (5GNZ\VWPIA;6,) ,5EPV^bdb[VMF<4''24?BGJMMLFA9+ ''++'# #.6AGPPRMC</&!+349:=;<<?>FGIOSWY\^adehgff^[QJ?8/% weYNHDDDJU[iv *2;DJPUTWXSRLJB?:535;=EEJHA:. qlg_`]baimrw~.COX[a\a]cdfknqruswxz~{~|yqi[OA0!{od[TPQPT_eu),4:@BDFAA<86012045:8;7:352-)  yskca`bcjmy)<OXjq~yrf_TRKFEBD>>;1-%  !(-59=DGLNTQTPPGH>=3/(  $),.,.+' "()/-227<<DFMNSURTQQKGA70' ""%%&  &+21533222,.,/038:BDKOPSXW\^bcb`WQHB82&  ##'(&*),*.+.+21<AO[dqyysi_SF7$ 1>P\lyzn[I4"   %17AHLS^cr{kT:" |le\ZTSOQQYap!%"$$$%)/1<BKPY`bls~scK4xqlnnu}"-5CMTblsy{zvjcXPDA884647968656/.'"!-;EJNQQNKE>6-'   )/7<BBGEIGGFD=/%  )/131,'  #,.43/.$        ~}},3AFQW_fhonrsnkb]PF;-' !#(%'& xuphd_\WY\\gm~->IUV][__^bfkorusrl_SF3#!+<IVcgruyyxtlfXM@9,)#  $%++,()"" !#!#"!$&(/5=BBA:0%(0;EJT[bddcXPC9*   $2@FOTVSRNF@72&  &5>@C?;3.( $!" #(,/588=<A?A?63("   ! (*-*&!  #&' #(14;:?=DAHDHEIDD?7-# %"&&#$"#"!"$).6;FKX^kqxysn_T@/ocZRQPNUU_bp{ )-6;<CCJJKQSZZcgiorutusnlj``XTKB6$wneeedks !(2;<ACDIFIFHFFBDAFIPRX\Z\]XTKF6- |urfb]WWW[_iw $&&'!%%,/19=FIQTRRNH>5) raULDGNUcu ,:KR[Z]XWONG>:0)   tmc^[UZX`dnw "/5=?DDECA>;710-&#! !$+./249;:=<<64*% !0=EMMMNCB94*$ 0BN]ht{{mfZOA6' 3GWhs~wn^P:*+<O[gpy~{peWI9'  2ETgtupdaUOC<4)"  1CYfyzm[L<+ %4=NTahglhe[VL>4& "+:DS[egkjkha^ZRKD<1&  %-3<BJMJIA91" %.4=CJLSWUTQJ?3% $+/400*' #08DKRQRNFA<;:68899971,$   $%''*#"   ,9EKOPOJG@;64.0.004255220/++*$$!  $'-18?GQT\_aa[ZVTRLLJJJEFBB?>;:93/& ~sngd]\VWY\dju+6DKRVTVUUSUUZ^^bcgiegjghdaWPA4&}xwx~#29DEKKGGEEAC@CDADBDB:91-$" |wutx~ #-6@IOQRUMK@8-#  ,<KS]doputuok`XMA8-$/BObmy|ztjZM>0  ,9KZgrv}xwpkg[VLD:.% #+4<>FGMQRWWXYROG@7)!.=P`q{ztiaWH=/!&3:EOZfisvyvsf[I8% }{{{ -=K[k}vhUF4( }|#4?MVaiotv{}|~yvofZPA4% (>O_n}oaL>) ,7EMY\`_^UNC3&   "*19DKW]hlsqrkaVH:. !#! '+7:CFMLMKDA73'wtpsw| "$%$'')$"  !*.8?BHJLIG=7/       !+.433+'    }}~ $'&(%%#&%*,0/2363788=>DDIGIIB?5/" zpdb\_bjp{"1:GQ[`klrqsmlia`YXTSONIB>50%}vplfebbcinw (39CLOUZ^_]ZWMGA:6/,+&%#$#%)),**' &3DNY_^\TL<3' %-.67;=;>BADIFIDD<2&$+7=EGIFFD<;789?CKTZadkmsxy}wtd[I=, ##(02:?HOQW][_\[WTMC>61)% !%,79DHQU]]b`a][SPEA51) *1>GRX_dillkfbYRH<1$  #*27=CBHLSX^fjpwz~{xrl_UD7%  (/=FRW^_a_a\[ZVSLG?2%  !$(*029=?EMQZbmt~|umcXG:) +3>DLRTY[`bebb[XOB7) &5DNYaggif\XME8-    ")/122-*&"" (-:<AA>50% (-35/-)%! !!  %',+.*,*(++/12202..-..++&$    !)4<<@==2.%  !%))&"   )+56=;?991.(0?O\dnrxxxurnh^[SOGA71$  (6AO[alsy|vpbUF0##+26<@DGKNQTOPKH@<4*!%*+06599<9;:766.,%%  "!%   %-7=FOU]aghllkmmihd_[OI;1! */:CMWahotxx{yvvtsphd\VNJCB;8-%   "%)/178><>>73+%                     $-0547463433/.%$      !(,48>>A?@:8.+        '.59AEDHEFAA:5/#  %,22543/0)*$% #,07:??CB?;8/(   #-8>FHMLKLIIFGGDDB>9.& xtnkmq{'29?CGGJMJNNQSPNJD;-" $9GW`klnk`WJ>0(  "&,,1311//,'" "%#''))$#   ""# #$'(&'"$2>FQ\fmux{vum`VI=0& (08?FJORVUTRNFB:6.# !+6?CMS[bhmnonfaXPF9.$  $*58AAFDD@=3,$    #.8<EIJHC:0%        !"*--0425598<;=>@A?@??>872.# $((.17<>BEGHJEE?83'"  !#$$  "#&'&)(("    $&*..1010,)%# '/498953/,.),.13757622-+(!    %(''$     #/:DGMPSQQNKHB?:61-&&   %-124450.&! "%**.0/0/00.102.,)!   "*5;ENSZ`dcf`]VNF>8.$  (0=IQ\cgifg]]QL@:,$  $)*/3:@IQU\_cdgifgdbYRD8(  "('+,+-))(**'&""   %&))+),'+'*''"!   $!#  "'&'$$  '.8BFNS[`hlrsvvrolgbZVOLDA84/*)%%##" "09EOX[`a^]XSOGEBBCABA?:5/%!(,4=BJPWY]\WSKD:3*%"       "')0.32//++))*.-212/.&%  !$$()&)'+('#!     %$(&#        #*247662+)!#(&($!%(06:@DGIIFE?83,%  "%))--**('$%#  !"(*.-/)% '(.*,('"  #!%"#  #'.030-$  %(03:>?BDIKLPRTSSNLHB?:5,) ",1:@DFDD?=9882400*)% &+306587:<=DHOSZ_`cfdea^UPH;1& #+28<<<860*&      "'08;AEIKLHICCC>=:932)'    !(-488=;:810))$'"'%'#$ %)3<HT]krz}}}vsnb[OD7.$ %/299=?>?@CDDIHJJLIIHCA;7/*    !"$%('++)+.,046<BBFDEA?:832/,,+,/+-))&#    *.8<=@DAFHLOOSQSNOMJJFDC?<:66332/,,$   !!" $++21330.*)%#   #&$$   "$**038==BBEGEGDEBDCDDGKKPPQQMGA:-&   %&,.,-/-11558954.)"   %$)*('%$          "(03979542+)$!  &8CUaqyumc[PGA:720*'   "*16<AFHLMMNQMNJGB94*%   !&),37>BFIMKNJKFIEGEGEEBB;8/' %2=IQV\[^]^^YWQMGA;84/,)(&! &.29>AEHLKONOQKKFD<:20)'$  #)0:<EHLKMIGB?:50-+)%%&'($$  '0>DJIJFFECDGKOOPQOME@92)"$.179:;732)'!    #&(,05:;BDHJIJIGGBA:5-&  "&(+-.,+(      '.4561/($  ).1445576568475621,' %3@GQV^]a_`]UPIC85,,'((%(&&#"!  "&-079?>A<<653.-,,/-22686843/'!  $(068=??B?@@@A=>;<;752-*'    "&$(')*-002633/)"  !"'&'%!     %16@DJMKKGC:5-# %)0/2//**)$" !$).269;;<963+%  ! $&*,167<:=;42+'! (-8=FJSW^afjnqmlibYSIB92+! #.2=@JMVY^b``[ULE7.!  !&-/375978866512+,%$   !  &*01657733/,'"  $&''$%%%%    #$#$$%'$')++.-.0,00226352+(   !&&)+(),)-,0.20250/,+%$  ).9AEKPPSRRQKF?:3,("!"!!!"   #-39@CILLMOKKIHDB;93(#  !+7>HPVZ\[[WWWSTSTTOMF@72-&$"#!"!  )-46;:=>;<;;><>=<<74/,&" %.5:?A><:21+*(&%%%(*0/469:7711+*$#!  #$)(**%# "(,2143401*)  !).476778:89:992.(##*+005366350-#  $,.3110+)&##     %+/68?A@C?=5/'         !! "$"$$&$"!'-4;DILPPQPMMIH@;3&  ! $&%&%$!     !"$#   &)/1379=?@ABDDD?>80)" $'**('$$#  )/8?GNUX\^[[WTPJF@>:431-+**+&&$!+6=BEJJNOPQTPQOLFB:40&  ",4>HR[dlptuvpme_ULC6-#'1>DOT[]ZWSIB7/'  -6AGPSZ\_bab``\ZUNHC=80+'  $)39<A@@:94,'     %1:>FJOOPOIHA>61)$   $'-,0.0,+(&   %(,./2..+)$  "    "%$%!"      #"$#!#! !$""!  &16=ABECCA<:40(#    #&-.12.,&    '39CGOOTQPKGA70'   %*26=<BCGHJGI@;2#  *8AHPT[[_^[ZVTNKEA:1)#   ,4?FOVY^`bb]ZTMD>5.&  .<FS\hmvx{yyvpmga[UMH@4+!&(/3:@CHKNNPOIE>7-$ !)-6;AFDEED@=98442-+&!      $-33631+'  "&%'$%#&#&%$#    #"%#$  (/5>DEGEC:5)! !#&%%"!"!!%((,,/1/101..-((&"" #,359875,)!   &3=FKRUTUQMGA:1+$   !%&**..0-/-,)%!     #&,.2332+% !&)-/,.+*$!  "''*)$#   ",7CISX^cad_^VRG?4)  #-5;FNZbfmopnlf]VK@3# #/@N]frx~umcTG9'  #0:AHLPTRTRQMH@80#  #+4:DJSX_ddgged]ZTOF?4*" "%(,)++..1133/-)$ "&,168==AB@A??;;6.)  $'.-/./-('!  #)28<@CCB>93*# !%+-/+(%  %*+..13265531.&$  $+0398::9:550-(%  #()./11/-+)#             %,28>?A?>72(!  !(**,((!     "(*.04410+%   #" !&++,(%  !&*+.02121-*#  $(.11310/(% #'-06:=DHKPSXY[\XVOG>4'  &/6>DJNNOLJDA:5,'  #%**.,000346664/,%     !!''+*-+,((&"!  !    %%++,-)+')&&&!     ()//2200-,)$ $,19<ABEEEDA@>861-'"$*.48==@><6/) #+/368640.*%"    "(.17;@@C@?72*!     "&).02400*(        "#%$&%'&(*(**,+,,,-,-+,*()()),,(&"  !$*.35998870-&! !"''+,02255632-)#      %(,**'!    ##$! &+1378:9630-'"   "%#%"!   %'./4341/*'  #%(''($$!   (18@FNSUYXXVPLF?:0+$  %,6?DLOSRRNKE@94/'#  #(15<@DGFHED?=820-**%%   !$*+15:<@?@>82,%#(16;@ADDFFBA=:42+)#" $'-/35575621,*" #*28=AACB@;70&!#''))+)+))'##    (.399;;:871-'#  !(-/12///,,,*++)(%"  *4?GPRWWWTQKF@;51/,--,/0334421-("  ! !##$#!  !&'*+)'$"        "###            #'))*,//344533/.,((%&&#%#$%#%$&$$"  "&'+--02568:763/($  $,4;@FILNOOKIE>80)"  !(18?DEHHHDA:5,&  (.7:@CDGIKLQRUWUUPKE;3)  %*1265674546767661/*"  $(/469<>@>?>?::52-*%"          %*057:9:71-&"      !$)+.-.+)#    #&(*'&#         !+07:?ADDEEA?:70+& "&+//23557561/*" $*249;?@>@>@?=<99540+'   !&)-.2130/,$  #&,/3477877321,+)&#    %&&%#!   # "   #&**-,-.-0.0-.-)'$! "&'*)'%!  !#()..--(&!  !#%'))+,01488<=@@CCAA@>=740,&$ "(-267998642.,*%#  $(.05466430-)%                  !"$$$"! %,3:;???<:70-)&" !&-28:@CEILOORQRRNMJGB>960-*#     "%*,..0.,+('%        "%)()*+,))'&%"!   !#()'(''%"" !     !##%&$$#  $',168<=??@=<:30*#  ").37;<?>@?@?:61+"   !"%$%%%""   #%*-+,+'%" !%(+/12434210,+'%         !!"!   "#)*/1669;::751.(%   $)/033430.,*)$#    #"%)),.12589<@@BBCB@<72)$  #*.47786531.,,))'(($$!!  $&+,00423301/.--++,)*'&"       $%))+*+(&$    %*+/245543/-'% !!%&*./366720+%                 !%)+/10100,+&$   #"&&**,,-.+,**&%#        !!       !!          #'')*+,**('%!  !%++0.0--,(&"   !##%&''#     "$"$$    !$%##!   !##%#$!  "&'))('#!   !')+,,+)&$  #(-13430,'"    !  #&+/37788743.,'"  ""#$!"  !#((,*+*(&$!           ##$"!       !!#$##%""         "$(++.-//10212//*'! %*049;?>@>=;63.,(#!  !%)*-.00..-*(&%###     "(*//10.-'$                     ! !!!   "$'(+*+**''#"      !%'*+((#!     "%%'&('''%#   !"&&)&%"  #*.46:<:;9742-,&$!       "%(,-115366420-(%   !#"####"!        #$(*--0/01/.,*'%!       $',/1110-)$   !#%%&#"  "##$$$#$"#" !     !"!""##!!! ! !!#$##$"!   "$%%$!   #&*-.122222/0/-.,,)&"   $%''()(''$#       #%'()'&$  !!""""     "&'*+)*''#!       !#$&$$#        ""#"       "$$$"    "!!   !         "%&(+*,,,,('%"   ##%%%$"   ##'')()((('&%%$!             #%&**--/-.+*&$   !"$$#""  %*+-...-*($!  &+.24779997651/*'#  !&*./2244665420*("   %(+,/101/.*'"   !                             "#%')))(%$!  !"$""   !#"!         !',0254522.,'&"!  !$(+./121/-+(#   !&),00366766420*'"  #(*-/1210/.,*('$$   #%(*,,-++*&#                                !!$%$%$$!         "%&()()('%%"  !%&*+---*)%"  "#&'))*)'%"                "%(*,/0224344331.+(%             "$'()*((''&&%%%#"!  !#$$%&&%$"   #$'(++,+,)(%                           !!"#""!!    "$$&&'&%%#!  !$%''))+++,+,**'$!   !$$%&%&%$!   !               "$&'''&$! !#&'*,+,,+*&#         ! !    "$&&'''&&$!   "$%&&&%$""                                                                                                                                                                                                hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/24Ride-2.wav000066400000000000000000020171521366722712400223100ustar00rootroot00000000000000RIFFbWAVEfmt DXPAD dataj\48`t_%!*NW4]C\CS(Z 1Eyת~}( 3- u%mq&0'NtwMK" 4(k 5 3 &n V<vK:028 i B E wapL%s $v z`: "a_=6Y JE Cp+%FX bv c"< xH+ $ ~T d, H#j* < 2!]z|D  {Qz, HTU  ] { By6GM%GW_ )S 0 lta@D  uB [a8*n'GWDNW[ \GC5~ P4 , uv.(~R|[ %fS"E g9 8 ?6`Dt uIbWSO )  th T pD $gI d A~^0U wQ z%k  u!) <G;m #IVZD R" }/2 9@t`cCJ'  [s uo, tB I 3#JO* 3^"e/u$uC|>iP>6 V  2\ o :Q wh  @N;Aq rNw-F4 HB -_D <W  S pP% [- c| W $ #^ 0 D4!s=qm*" Hh#@JB  hY(cdPqtXJ  i 3BW~(`  +-&    &~U(Uau |Hz _g xqPR!}r?#  J u 5O ? szdyaW>X ^6 e;|@  AhB+|08D$iTi 7P+ 0dt `6dE{ _g?T V EE`[n=y p(    JsRN"'7ZYE_{U)7L- @<R,uZG8If ) M  h p8*L{ ^  XS<$ V8Ji2n 8oLxw 1+5A z0-<\i{aptcMU"ai"OwQ`?` ^b|baL O^U"yb J6]Xw] $d'&,W  Gy"  dZ %i}`W &V4ACJbS.@g)kx/y$3jK'  ^viQ*=&[yZAWz~dU!H9M*h 2 E/e7V lSy[rHMyB z @T\Y8y#j98.4@V +1 ^1?'DY{an0 Ulm0R C p=^`s=@,  ]!1O>;c"k"9v /6 s  kZ  3  "x'3| {8J~HOd 5 Ldj9 ^`Rf W K( WB[I:l]_tE"| CF:  5!: D& 2 @ T(9 udf ')@V)@a]tl8/]u|&up3,ru)Q % W'kg~ C1HRFu Px]T@p4lOB 8 F  m%=-ir !! )_on.5-Z!.[OYm&$?,[ o^(tc`"IfCyZ U:(V v T! P@ ab(\FL"r6&Om0a@@=DU(q p% 8 | w.|SQEG5v]uwCvBw 8"Au#E0 K0 W9[>2zN"M 0|0 < q[U[*@{r$BjB,(PZt &z%){Z Q nA] XF4 j-fta$G )D>5D/uu 8 c:pM' EgN Zy \ 2 h`'sRO&xwTb 01 T~aeY ^pb   >DO  x%0`%"[>M E*-f!L:"R} A{38nb% N y"i[pTH.RvF$,}`od>thO 7UVS~nmylM@ fp B].(4h\ g YS -:(4 &jr  Q hN &!Y@Fxd.QBQNV(&= l*   } /hXgj5oHBX:dxd0LX @$(M"`dj J\VMvV  u{A]Is)%lYM   n eJr] r-c@5yPB (D?6ww {!]@_h! w ^ VW3.03?v%u5m3VRec~ ?SSJ J| C7 [  ?*sa@;,q5 4[t  { DJ%lg"3I_ 'E_@>7V 8 NF/w$  Jh/Vw sF-!O"LB6Fu nR;?  NE-N zV'8],EyXZIR&/%~??Xi\4$yD'V+cKVQp-Xg Ur9vK_tM~R(-Ot'lk0UjY'UQ". d^?Y  :MqA5 p kR!=$j+rT.=w p|+  Y~B Wnwx!)1ko@< +HloO v_8Fh.&l$fU5 D DjX'SnF~cG#y:K0r-F\qpiB-$j ek $2 to cA?BqFEbnSD7![" Sc,IY  A ; jR BbE(2rTQD;uP wmg*seMoM \# FYl YvR yEu't0PI"?- SJU*c 9|sCpX ) )1  k {- B1 9!  ;9MF~?nV!z:'QRVj'Qqp8 y Hd z 4LGWf lOfi aGKX}I_}`<f  Y0 LnEc #d\QF{S\W4%)?wFw)3DN$(@SLUhS#p+_NP`>ZM{T^%2s;'<]& Vo v h < _BC-!'5 c AO\k} 6q^s l]q2,/^?|>D/~IgIvvKOV:!eCqLZl%P}M~^B&)-X);*@IZYy]w]#MI0N:  2XEPU4 _QV;XBPf?>)Z.y{'4W=OzkDkOt%D_QD{wOL7#^%} ^[f *$f$zgBaG6`V1zUN BPSqO<>GPQ Pv}NB^^{F%3C%ttStoN+Gp0ua`,B5{? l7vx<O 6"Hx,SZh(o-, F4MV[ mwUS g8}kK+_J aN.jD`Brg|j   u<V;=$#t=/Bav)&Yi ;t` EAQt P 4@ thd-+L$f6>K9_$XQTfe4UK~=>WcL0m aW .)Ic ~Z _ 8EO-s&,9+mX!P ` fE|hqZ O P 0b+bIvM>(DOXpY6p$ST4v WJ d. #!ejz~o0# 8geK&, UhRhE6Yq}P80L%g+wM z[],tw#8 wKC,~ sNB@k7|)y^CsQNn$TJUzz-xL ~J 2Q[k x=&|#QyU3O5v.fQ:?@]X JU*Kx $ < xB{v'R>&Z'oU=idS5nO%u2ET>[[(9`r U8MH4 h$%a@6f ]!Ya_% Hm}q+${b;l&! G "Zgw>!kB}v-3cxIZV~S x@F!F5_[=fifaTUL{rKanz93"QzM GD Uc,p;034L%'G=cU$tsJhTZUj|*l,Q` ~rY]uCBX_z|p % s[6Xcw ({}`8&` byc\ Zx)06U#NX,* q 5TP /j4O-Gr@9I8-nc|6+xz2Dc$bX0ut-6Tl1>uzm7n6oW/2~S`.ZoB@d&cL,PSKv ?MpH"z( < > vsw!*gvTq/A>=|#t4_Ube09sG4x U 4 p/%u*Z>vRx3UxKlE%A$dx1R(st7ly  -usN/`fLj}nCb@aC$8(pqFm8hZ6J`|yGGxpoXVC[+P2E$3-c./u=mrB]#|J:DcGUI>{IC^Ur?V Am#mRK-8 w.vVvQM#KuHy]hVP[D \Msad9FaEFzhIeL$UfR(S!ay?BfRo3,nJ?OXf _M@4P EGtx >D`T,' !.dk=qAt7:8c2l`#glb:)YEdk$G0_'( 0T's u&  5])My?nJhN56w>V G "PED.|dkm@@d4w?}NGX+ h(GiK?H]dqegBcALp (Bca.sqq=LEuA$2ql&3[9&o)aU(U`q> \ku\ (]7p#% *"hx d XwG>P0GN's2( } p(t@GOa:i)j|tY32 3qRR5O,\HVzh$:uztNWV.wA>@NnSU|Dca#JPc5UOcN-u+QK3\)vTy~ne6N7p'B"_s8pp3x<:P M@LC~DW1@?x/&ft3,2A[K=%XNW{At O y!#VV|xxN4*F&m1RC8qo f"F o}'>NS F>&jNc7-S8H8K_IwcHe!:ZcXKVnjWabR@TxoT.ZVc[sV~Q=Y vz'm-[*@g4sHNYnr'uhl<@>V4t7"L(&`K)2f{~^ /KE@7|X4%#U..?Lp9n'e?Ol+^CRO{"A:Ib1$]7J$SkW',}pHd&Phf^_`ln|8)zo`OzW/rZ CB}\moddWD4q[|l5|"uh{q$,Rv:=C*ys>/?axGc7P8\QasaNOg? a"[x?[ #YStsx} tgaM6na)5zs)yKxmqW0/&`Nk4$LL:?I?SD ${^n% m]Qw5 +#vz3#  yT3w9; <5cf!j?]Vm$P qe{Z`Rjm1K5.y|FC WYfC?0h6wZaCa,' (5T!lHBw?RvVVewK=@VGDa;nFN.(4Lk$L#e_M/~jB@A=R`/(^b.i'0, rBsroTE!jm0}T8 _il R-jQl_LFy\` HRNz|@D?X\4glm8/S\hH J,]YFKn"X>/'Bw V.`u[T95,Mv863GLso:RHX-rZ6c[at!MCg@'mR[6|W`4Vz6!V{hqg-=hV5SB%9zUDBRXsN|xo@?Nd  g~d/MC/Ab,&9*.$(:> dcb5z;ydQY E\%+*A&GVONz{:YK1$/h3#tS2y|1vz_'St @; ]l^g KKC3yf,Ytp> S8g]h>Bo, ,OdPXvPApEti1:Q=z,U4W-Hc~8JS#VJWCBjF5b7W~l M<>})93l hcJ[dtX-%"VJP w;es(IR>]raPBeb<@icbymo@Ht)ux ,tOuc5X3,Bc"MVv)wHk'|z]{m-?\&Pug3fd*STiz.*:xZTk9e#`.>R?P7Y3AwQbDh5H6Je~I/kSCi}GKE8e'#X\Ry#}#bq"<hw&n0DrQGF*jWH)}_lFnGSm`Oq;C> S\(,?|(8AV }U_!3NVTQ-u?o!ghN9*, L!4C t 7_njBn *$@@MuuHaUg 3 3Ebs]o%}N@?h=9K<{NB-,;\Qx/Y<bW-|Dxt@%8YiqeeR8~$(4C4!Y| M rGG Hs{|)R2/oMAC-Q' x=AOj]0,zFK+ \  <93%5f [mC. 9c@*q ' k2MP  r dJj/f!2`LnPv4>~R&PyS-7 *^*Zi# [&&> + wz0Lp#3@`<i4~)! K''E! =YH@d@LC!mcWLsHfMwl E)NG/f] xzYIPdxkV-o :D%EU<0')bOQNm"9B.RY#]D x1kE'|*l$Fzi\qJ^8Cp27sCE,u{' =0#[{uaL=X^+y8v;5I}1%nQ ;xwba5I"Q6uAT0J1: e#bS Io_<@|K7 EcF%DW4pmAV,r~l`5`%Kc,i/|)&W X *;g<jv,<;r54&Hqw\@FrNH;JB|:  HJ [7k8*s^MUBDTXIG[0f}]+bJ~}dKc [PNWV 0TFw?BK~H?8X@63Wx92=vXeqIj(x}f;Se9wpce|l3qo/5RN Oq2)44R{-7&gJs Fah;y*A3BWpd[' J U`Ha%c>uT+Wz3] YS}yX6eZRU+G&p_A;2lDGxZOGAP]h1),2BB3H?_GqGK2P#xHPdmW/T^-g$ r ![D_)izI]"k:)k ea+8yCl=\l[{ (-`e4S^W>bmP5KQ?M?a>wT(0N*rc=(%x~" 2BY'9{Lb$l]W.} 1  x z G'RV p dUTbM2F#?yS~P=xeY+' @>8j1= 3-8Lx264>fdo\W%hydu\-Amj`jJ*%^'G o!U( YH0( U=`V4Dv>N`"e~#3cMp.v&yTu_`\t3mWcJl}IT J5^~g5<<C-D<`10~pUsed$ Gh(e=E-7K.0LJ >S)c7/_ a}W :[X IYw9 K- iUE-itLr@YaCiU)]]$@>\!f ; qw ;C\q+cMCG1qh`DT$L@@}##F) ?u1M@,R:nyJc?HZ,f7U[)W^0nMR.($91nJjYuvNTzQuS{.yvF~t@l'c)l~Eg<#ds)#< ?"%+-us uZw7'Y7<byr`q2 k}K &_w;&*OMAvDCB+?6`'k)KhMn %Bw/J1j+]@ Q=gw6@Lm?sv98^{!n}A608,ogAWzYqIG?@-zZ@r{L`)eW#+^#M8"t 9msT7#Dka88E9Y@ w09Ws#G:1Agb1_(mkXTwuUn WY >ejq6`D*o6zFABLd_orZHjBf4=u0oLUFRC R3i4S f;7uitV)EV~$(_;vPrZ*Ow|Zpt<+ mE+jIchtHz Gkll Yo{2\@>WlWXJq0|K2BlU2tdu6xVfA[m'B~; +f8 lY\\DXwai9Y@q$,puXby}(^N^BAbQ'Z5qJ 14J% ( !XH`, \K68pKR=p I3FG.&>FzHVAg&0B~<\\IM}t@K$hc ~ >[Hsv`O DtM` 9?tg"feP\ ak rpC&VJObt<((spvOsnT>v,KCt[|{]vvx\C7\WEfXh GqHNt$&(^im hW<H%{~^}rwvC7k[qHdTp^'}kJ6gVO<+|:v>Un5/W13BM6j99+#Ian1 .:za5*Tr}Jg^" H-#Paw3T5M3E #&_O{lb%7JJ_}K0.Y ?wi _m`3c}#E5pJ g#%l+ il6?O)PPD;p1n=3 f62},*U ne6 P ) ?r;N]dAxC-}_Nj qO|1ZJg}d570*A' )ezA+8  .p:9~; Y;L;CD-,T(/dh|y*@-=H mGq+4 d]jWDglJ6/c6ve=/i{ijS|;&NaI"E[&L~pfij7W5JLGAx;;dX]lF /0^_*v?~f|}Uq`jUtw-L 7o /`> eQ?CePD[R/KqbT8Y#h$5SMF}GEPw#l& ` O & Y^ r_s +`#;x]F1f,q8:(zw :[a<?nBL-NnQ_@bOe5JWjr^Acv01r_f>4xT M %R% 8h`4x  A|g#9cu} 4uPm3(;]i&@Tu S ]S4,%=|QKp%6(<XE 7W8Z<\/+m/ w{) O BWYH$ftAF;l$aYh}}I tpg+"-qoR7h PMfX#K8b{+_0g WA"s)#a, jprba+2fi2 G}11R ]32j @_Cr7lviTc"M oe Pj}0. he_|<4 ]^zUTq,qU-6@<4DzUbmk2/YS2"y%=)oA5?}2t= $opnV4z j"" j( >r_0+5%{l1-?ciJcj!iW?0&Hbz0:OR\:4{9L8 lgF7<,}\yONeZj^tq"X"[X6%JjBh!n`x*egpWa 9YDSima_k+:5Qrqa . H 0 RX%UG`QK&>B'{&DC-#tQfO XlZo]PRf>g-|f~aF!oU#iNT3n_\]`otk7=3ZJxB\Npd SPhe8[d; V^!k U;r@,JX1S}tu^27_fRGbaKG0xl42H4S?%FJH2^~{xZI}SPe5Bj2#o@<3@Hq;)[O;,3s s (pfy.  e(t+m8qoZJ[]?2v$nVv5x.!"5+=I'dpltA|YwIz./dz]!mPL'RQvX}P#7 WCCq e$SOW}@W[Gn;%5^|Z>'Xss|+tWIMx=O~"/rk,D+I  <VkTp'+x`]{;45-W4%'Pc5RT@= !$7f9 39h{3Q_WJHg]`!cWC" v"tzrJ?Qp(#FZ~~b4I#[ 2A6$3M/cWn4~:${*8+qXJT *  (s0dG+d~IkXUHb_NW~0]l%*p{'~9 p fkQxptXd*4Z<W]:p-OzO3h!)^n  < zQSoJHN]KEN,whB\7&432W X/G6S.* vAQ 8Lv,XFrL!-r0w?,R,/ g%mZ6Lgvyp + _9Pj   ?=/bRr*! Bg:<= 'q A4e kH7}?_4k ;h8,pmVryGAP9[J1iwQ( f`]8/,]Fy>j*I  < n[!h!XV@rfH;v-,urh{&9Il\dl~>tiqtZ1Ki~tKGz dfG>&zmX;f'~ h~ |w|*P(lc=|n`f)8VZ0)tAvfl|2D% K 5;/arF=Q%60I(% xE5C|Nu)A<{9 3oSp;3V{NW pWdr13%1b,mZz x'7mpQXJ!lp (wHBK0lwlmLH~&VXJ =:.t<rh3$8\-b;"cbp Fq?!P 3l#mpK+vD*H>]0oOJXt=ElVN Cbk2f7>RW(P] _11FIQM qCpKD40 { H)Z>2xnij0p;cmG:7"EEk=k8 bea%1IWV<VBE2FNsB"vX#)\6\s?K*v_-e;To6[V%0"O)_ _7s%s4<H2-# {3Ln \t}3nW_ljCm-dx{yiq7{Logz,pUF<q'HH mFOI=]93[P4YdNw|taV5H=93d*+=RfH:LH>c)Qo {9$+=uO(d 4eh*Drbc]QW(KECwoI  QzW_KJ.k (CImuR] hwJ]pqoo{hUMgkeh29oRCRB,=nyy d0"jVfWyv80eU.Bp30vU7n<>=huB+ `ZW2{-J@xmuZ:?4VNMoRZH'eb>[]!hKK)!%9Fj#5k7 :)1GQ  W^f-8}IU&tV\~:-", ;?N/#X &"DF hf-cpfR"( 9UJ+J,kddPXac5(I3i.#C~d_C 5M|}x4)M? [>p'b za-.vJO#:dV) @t?\$>9 _utSE wc&oG'X1in]vpD P%d!`M0h(]> =/h}mT% B]"XPj16CxnMzZ /#vsWK M+[LY{\,4@#]2vtZ${EVAqG^G-K`]24V{E JMr epdF7u$|C}J+M#'>'xnCu(EPQTIp"o=k93g sP{?d2E:fQe7!TP46=rSd-[\-_]j`3 1jFH;xuHQ}H8c_(2"$T8fg~E`xq/Ej10a"<_1C08H(&_qrC*;qd V ]6RjAWGo[PV#tv9_bd($sJtX Q^sGv|Z[D~ jqyXL|Cm9= f% 4Oa]. ~l "b*hI] :4L+ Q=@Ps;1K?gdg !>tG4YNUDQ$u`L2f}UP1`OVNFZfDoZ67RW7Ydx4:PG;5`Au@ldG^f|;L;:y2EC8|?+\\3`FNk^ -@Xz1(%vd(!@&-vUu"0 ;##Y{znzZk9x]C:*C2kDYPH$m8-![iG{[m8^OT.?2*TI&= >mE(xJmM ib9$nDl@S7$M.W9e ~H(VvqtS{yT)9,{>Q!E|wSb#DQwbC:i.q^{T0i 6|AObf*VRsx_b$b5/ ]=&cm/m1X]IZaL}jF|IdH%T \}'d,v=)E#W2ZVG BZ% $[}q-., |}g6) f_F[H\|{fH$vLwwzq4-jR1V$:| ?D~r\KW10*f5L24</#C$ Zl7:vvsF +Ze6v sb~7S3^URxzK 0{YDN;NkY~^.?r~cLq0E=b+*apb7u/r=&&Ts&NiZ"L\uZnE\#-,)a9;$K K)#43xh(pcNLx!-,01N}d 'rA{7X<k\JE19W7 LxBLBV>P='Lvg[pTL!{XOEYv mKPy$ YuGS?YAmv XX@%r&?jk5OEq=%Jq\rTg2k,_IQ0f`$TYi]* sx<,f'6zu |)gd|KE=|Xv _sAZU[@C2S.@'dEa2N27CcZJ p{w47aoXx? C$_2j02<:26=>}{?x.*X{^0R U!71ZS`2"HNnNNW CTyt,ygw\&YjU)  dCFd/]Zx` }40'dn>BC ewN#RT5&jmCq<V80"M]*?~%w5:fF]ZeVHh/VjYBN:4x!JpGlO#]8Lt>?2j]z('P#huth@!Zx)8Wpaa0AHJG1s>y8S_;82\aN.QHbfIB0%Wa /@nW>*YQ .$sNP"$6::^*sVDl2P dSZz\;`BWk095J9^8 in+u`'fpxVp\n9#Oer92mYhWZyUPN$ W^F|j'\eW<_3xx`^$jYC5jKyg\`(%KU!B_Zv?u~h#qWJ^7 FAsdZ:w1}5xr\z"[a89c^ |hM/8CW#`Z m3B*J'L6 [@C1+.$VE0d9|y'7GIo.XLFy^]$ITJK<Bh/+?9mY `ss9mTu7l&'`a%N V;Q1Clu4Xc#Thvd: !f;h w/H63@jBkv%bB5$ _K & Xh2\<y"!?'ZR:7'RDeF]2`h*j>>VV cy) }sJc V^2" #:sWt`zuW[2- #~4#xRS >-fsWady>PAc}f~G:5EC1}S15 D"sGH!d@ULwUCrV|GCLCd Y1\tk>CA@Bz';J/atnLl@pv RvlZbReU3s+j4Yx&wWhTjnMn@MBM$gK4n _j@ 0"R-ILzgL<-'f/$jzgX` o,.>^,jozWa2pyHT@8Gr<]"||R rl%"y;Ptf@"*vadaw fJ L1Y[H<i1 %Qr %\2eCf^ K6jzu>]\*SH Ei&)^-Z x/&N4UHgZ0rP@<7#xeeN\Hgfpbbh@-F"ghcjnb?lU\(9hQ502-8F-^Nm&}i_%I7Lq(c={^4suU(_MP 7^u;tjs$s=9k!nm -qRvKotsKA ;, l #i[5CZqD$"Oj\(oh`rz%]f*rlnF~N9O<4W  E\KxQGOa p5QS- NOW#i KQ@$ 07B snvI_/76ru`wd:>8?7ji[]%8j<IyCzOZy#![jz.wmu!.q5%+(Zs|9xdB-B%>DZIkztKqP#ir0+ T`E;t4.6J#t Z+du P{P(u6I<z +**Gpmu+/w8T#B(z4Y~ B'[ k?&?Kg[]@@*5r*;0c 'Vo?[z_ttP81T@*GxV:Nvk0 4 r H`~ zF:49G@[f,^| =./sIJOoM{q!F)YO:,<  BH_br6/m/smYSfAh2R`m%]n\T"c::MObcbK0*RT.a,Dt~-u!|W{h&|d l*oGir*0nFs.*CRe`?@ }Ff^(t[Ef,PT0Ee].i|aeL,HQ'qi$ ?>" |o$_BR(J=D4 gy[wfe+c7cZVnD7IsY/lgXDYQk9s8Zj]OD4D*AH&-6N o .]x =o`Tdm"`1Z>A_3{ (6~ Yi!2D?Lsz}7v o9V$;[[bhaVe&9t>,?VAh<W&]aT-& T1FE cY [0jW^%u5hxBrrY)%Dlw}UEk8VbOp !7HC<M{Y-fOg;h_ipB0T/0.Swse(PLn>U>8@3,f &H\fkYdZ&-W]4@]h oQ, ([e.CH.3g x!JHTOt.j[do0w2\PA6YC0Q+ U`AV8MRWf!P527ktLsV\(Q*a L[_UTFH[b3oc,AG RjuAJa_H*,U*U2wp,Xe6B oa{s` *%+%RAidoZhSp q0Rl#w+nC Sw J VnsHafZ67Wsam=S?8vRr/ ?Ft1PA]+u,;>=C Z*G# 48Eaex63(K3}w0>};`y qzEs0{nJDN<|%lL?X9I*F!^UzsP\nHxhJW  F $.--C)kf<1(`d6Y{1a[1%{['XUiazBuYr_t1k;OEEceN1@P|5ks !\d>&USk3D tqqV:^\Cjg;yHZt7y !I`5Id3T gIQSPPEt4g{~5Q'A"$gR=WkAoei&\8|(%90~v$gHEqu0}]I  * 8Q2vE :}w_B(F\G`!S{ @*]k+y/!d,2P{T\3~B/!|gy>IkgL=u0Oi.u?0) \?3"t-a.ZY-;<=J^q]C8S O$ETou}G+OL%imMe@wdn  *!3O\K nmu\-w'nNbPP#u1P}\Er@TVNYM zrb*B${p.Cv2MrnvVy:i0>VZ\ Fk*I7p'C:h cwn6@m`B>53-#8wd,'< UR hOmWR/K?FH5H*Y|"ZzH^p9[Kus-@gdo6F~b+ > Sh-rkBG|fX"hJw42 <Z(;:Qhtzd1Vk\S*9 D}p{ifQ+`  BJ >;5)vA 2F8 [UqFw,k!T,8xk/s=`2:7pG+,1$zw0Gqtn9mpF!Q bE|[]-:j-3AIX~2< O'h6 )XO sUgL_?(vKHxd"F*Gm2hLY #0 Xe`e~P[y^9v xj.1p oRvUaAzrby%C.>xh.3SuL'KXo7U?RVXAD zIV WU_j I/n}O,C/u'Jc>7l*': rhqQ HK]5*sJjN:rF\*2~g{iSR*nQ'7-sSsx1aOy}5`?U@OSZnf7fPs=Ux=U<S7(z;J'F 45 7kv2JA bssd7#9EbY_p9}es3#tz+k%$|v_hIc>O!HcTMi6^)3^Qo&@" :I~i<, Mqpk5o|0n R6Hs Vx~T2n^d>OkVZF.*&BuYN'08pgz>\^M9 eh"LX$vAMak~\?WI!0:}d?=EKZ:%2iDH-,. )=TcD3 iG3I5g4*v='MgKvl>+0|.`F=XR=EC&(+ ft[QLWd^%7H|.rOq/N~_ZXG6@{ ,-QF^-0WYiqj0;. ^ RwNZ',mFf\la4c4kk+V&s$I_O11JEvX{8'43mUP9(\y` B%&&j)2w"_/ i.aO\P)=}}Eqx11Xb_;x5~GO<3|kCD2/a_ W-%D. E5o,1gh9^:<qCWUT_O&(YKG;9^c+{G:iyYVyTzQZz G67m^Pe&"!YM2]JOqv}ktt-:3Nr-$FJPLLv8V88K DV>@t)D|r^m>F"^*Ii37<dX2Vd4HLaf&&}[[Gr/'d$\2Z#AUD=W5{41PZl81Ws5~_& oHO/ cv&$I=Ga9f2ZuVHh9->jUm`  (l ]h{9Z5/HY(=c-O;`''aAA04!NQA31a>`e\{Y%>Spb8;$oF6Q:Z-. -3 vw"&a)#wOp:ROz'c4c>YdToT7T7 5&qMM~u0p vNm>+[{t`M^gHvJ=ig"r%_H5"YAcf'};S%fYc%Yp-R2YYFbT-8pAN_+ Qr[( #b[f0F:B&VU/|pokuaH(6L:`(#gh#O Z.8pl-@{ >qu"xs]ZvlS=%V hxk'#aZ ;Pn><n73(0WuUn/nIxTcx`4sD c\'QyBeO{s@XAo&Wc}ffhH[wM^}Uy xl"$Mn;=?Ldahntvf R\HM6_<;`b4tM A5[:Jm_B$Ut'7o2tZ$r@JZ(bfzBsU([Uv12HO8^SLHJ7c0 `>T&0y7~akn$AI(\8,QCV-`:G})9c]' 3LtVzr_NTc vIYo!(I!@}d ~~i~+H6k DU_W1o(D1T1*lVq ?[ZIFgZ]&[=y7A}'O!VfmGAGZX7wKD)N%t9h,n.3 |})VA^bBxxQqF9B}"Tap+ +7mpO)`2P0Octh*(##<\\^nXd<TXK`jE=;,\P)d?@WOB]PW:;uBOS9@,\yHh x!u"sK^M *+%:^)|q6.t2`goF|PKmQ\"*.Tb0?|g%:g&,[vW/I/h/X'Gw[\K9}CCnvlG]~z|<(wM5/qe8XZ] YYO4e5h+LxHA+kd`  <Y[`Y8Mr ]9pLh@R`XM=hnqk|g"o/ki>EM?A}r`Vz $#dZJ|.\v%^7w+y# .MqAk4hqAC ;y-iFJ ,0(_m"km d}K?% @rG0VQ7q }[ej\rx)1aM4jK*,i</fb/^28sJ  2b##^9L"{Jq=s e*i0S=PE2dy>+&+1~!LS{X8-J\p"?aa2R{'jd"`- 0DDVm=LFc+gweEWZp+Q9Ul z`(7:(RF9j+*mE ]1TVq2LJQ/#IE&+@>{ \&IX*$3xU\~Wy8`ey )99DEZiYZ7Y7J \{&K*ysejs @x@Z%1'Rcko3WHj!`GfjK^r l =(`2[Y mpitFm;O21>Zf7b I<GF *GvGJ:5Wb>1s#r& )?itD,G +Z:idf,keMvxDLoz a1jGalT2 C2wvGg~SFd9]90|xKa+{v WLP>H}$~zB'^~{_Q:g)AR QuHn@8sOhd4,qmk3j_H g5Iu %a[mW5kzx7*fp-m|1N#JrmoJzLAt pKQsa}.rU"l}D=MqK.1g!kwX"w_3,!9%Ua?H-^u6$H>|kW &/r]K\c'1N1`:OoFOElkf:"G<#"?K"(7kTv3BK_,"KMf:F!)oDT1i8y!h$x# UEY<27x?"R'=\Z&}}[P39DDmM>"a3<Do;'=ev +oW4M@cPDIII)*?kP@i eN@#\}jA)jGsIYK`[TbA!ChVO"KrCw7R/iDlrq~$.c_nO.Kglq|MoV ">swR=6I|Q~>oB1%K FX}y^6 ~O\\0#S}G 4(c< fnP85J]x1ZWw?iE@$"7.3;OI1-DI2Tn!w>^|rE/hDVT+D]*DtL+$ {4<'yC6-oxv K3*7Y,WzgaO rZbvNJQMM*F9R34LbCi*2p~,6JlsRXV *p=HZ~*q|~ j1tnuod7@djC~)ibiMSRF` ev (x#7|d3N6KgAqZ" f]VNK\2Bud;QT|{-uC?B5Xm`= w9g^6u3 %S;/R?DqVc"C$kBN$thSSD : ! I (M/BpTY. =1p #v6py\'3>iw7_2`,(b=0Oyx'Q 60rg.ZVY\6}j O1 p.$`wxAKzn { Q(JybHq&(]k|O{_(<fHW/y3;) .a1A+\GC\wx\Wm lFD   3,k7'q{>fD~UNsLh.CW 4L( tNQ,` (IjU%[^;[kZ1M_}GgTh0duAqwry*mIFXq jzPiG }^7h`&+K3?(5dX@'I.#14CX~mzb ;])$ ?UqOf<e kc0T63W;v1,KFGSY a g' ez=F:;7aC,_lx#153p$T8i5ttd8po8y Xr%B(,Z#*Yc_x`K+\Tl/4?t>cIn|TPcP$ F{XB,a@nGf$1sn@M3I9$u2[Ieo1xv*`2JG[2&0WYcuXzOYa"\`(${h `DjM|r|PVXpfsiqHm3-T:jz_8_ u56-E {5V3kv?9 X0 !Ik(m,Ciq6ax 1#MHlQgbF% NNZv}8&0-W**lpL#d54%YSiv)gI>"2er8"Y5_eJ40P|cUG*o  g0yu.HcfUt%|f9 a)+zQ?> ,0mYv*#{Y nL$3hfpL`6v!fam SCg.ljL('uB%ZbE;\_B@\@2l*}: r23Rd)GG$ d6du|Rj)%gdLwkrmK. jS' FR>.~hz2(L *kqFV!6QpN_~-y"KM-3)cjwo '=ToO] rEu3 S B \9$^ltbf~Z)Ol([2&.G3.?0 0Z2L:"I!| br4|JI:dEQ.gE gczskijXC iu= bJ8m7\|0Z2@[l^E3>y7zW6{pN`~>f@Ro(M|u0;H_8:6D `TRA.5u'@cz(0{0L=m'\l/z7!SP#G+  TnEd:{@rIAY>Zo8.fTc WJMJ|;|G,\GjTFM[Vnii9]1\[ Kb"OwQ"q;l@HeFzbG&z"{l(k,oci)]h8JA /dt sY2P#y#;#4=#bHi/3~O& ux@ 8q(1BEfyOy.yA yN~N QW9k mmu15z"-n<>tDQ#$istI* V30an?Z4>Id`L\L_4XbYV2B=G*tE{N*|rmm&|d2$]E,5Sf< +]+R(~tfQ"[ J4I*'GnH+'sg^z2qZ0nRz/G}=\g-OP@I23?T 0L^X7 BL3}:Hp)X# "Dp3GNz6HZA67OI^d@*yzW4q) zt((q==T{g065! 1Ya1'lBA* hG%$9R"ay3WUk0+y@eXV_"V_iC!zEBkE{8w=qSz#R$QkRMcCs=.-O)jvs YXFS1GAf^^e?#".Y"}h4s\'=k/K^$M2zT+@eoj>M 8_g|J; &@g2p5"~VIoF['&nv\&@jw|m))J !!<WI1s 85<' <fj4v"FtPFeyT_pF=G}n.d0} ug:%-i2CFAGOt*z,M%y0`-9Ef`Mp6PB8j^DY W8 \"A-&neQ f|hhP rdFf P[YsW%e\:f?fr[WkA}D ?*OUO.Rq ^.[y^.fFA<]D8 ICG/6k-Es0NXhE+- yy]tpTe2 WS"ls+pKs-gye>5diO[?T|dgS6M +399@3 0keOxs>38_#!Azg@:wh Y;u.|7o)%w 1oa<Kp:T #@k%ypLnZAn_%4z^Rr_|#G>*r'{ed2(RlI,k1v1!I9|~brED@w.TC`|QVB67]unx QTen*An(p2c r'wTtd>B0KV 2i":G"x- cs0FP!cgqU}L;)qXuoHW{i/P/C]HqJwr/Rz*iIVW\e ihCI@_]77Jfu{! 2f4MNg evr82_`&&(SaM HKXa:n { C[ BGPqs{`.tq2QA4{bsvD]1 |?'Z-fgmOKYY/)B9?z\ HYB|sLg6Jb6w{"*h'Z~\Ehn9o P6 -@j58pGqSw[ -$b$QoAi>mG7`xY|j1 &ETjv_"xn <|,iV,2*032/6{DBzpxqcH+Jul?E4~108FCc'!v[17rS)zb*L3 $&b@0"*]D$72e~UD ,5!Qi8Cj:!l[ Y/!8Rp\+Y0#)_eNLFbxJ=X*O73t,skWhNR[W$/Z@55;<[aRIA.&oS@G)Y)3;CbV+|1I.}'mW[ci-m.X[1Ab$#`Tih<xj%dJ)tFBa4,H@L!,CfDgkhw.?o%(;|[Pk.Z7Y/!zo9Hd+H{WD^ k/~WP#`?Q $} Oo=^2K\;1 . 8qkI$/srIsGz 9H} R 7XK i-)?tCH5wj87eqOmV|72I~+'h[pdb3VS_*^qj/4@HDf q}`ket b?G0G-3t"t m'#n~@a1#XQf|L^]`W7$ 7z7#&aA]jMW(Lw}ZtjuGRnR06ByL_uw8&=ASf}r vs>rRk8?)3."z[1 7zw%],i.a "/)G,a[N[/e/FvKA6-PA [7N2L(vc-<6e)J%/+=/eT FlJpJ|\[J&ca ~lXfED td;:LR9;/$ # _+5v\}yRKm|s=o <7B`JG>|kL#Iwex7 <f eN)~R;c$qZ}\0s:?.Jd~5sY#0J" nHwa2IqwW/!V9 /(&xC r_QwXDq*>wm0Rn#a) Hq.X&Uy=@u[w-U.e<5f=o5q9 p$dyU akM=FHAAN^l{{abs"@+r[r# m E z[d}oXLzIhF"M7wgOR|V<l0YCip=8 5LJ rrRD]jN-}g]z4x'\hv 5a4#i 0Yfyy] > 0Z|o!skSC!uao2  {GO#@iBvhhd28_e&OlJZ\ZFbBTw4HuV%[L}:P$*oat`?Iq9 [.t`d(#vfM;L~\*M>MBt<AK:/VU/A.&"$!7Rr_7 T>Lt+6xRMgxXP2OV}?jH$OqHe V,FJI&Jdx ?3QD1rE=2 D)jy!fgXg|WB'0E6YVsN4RT.c$ ,f/! 2+y(Jt@Q fJY]i~8*!'\n@JtpxY5qC]_9Ins Tn#`lS"aMR-,d+I3!c9+'@E$n0o=H2r O-F]5V u\Oh \vjuo )XJ)MQ0I';$,YoQm):dPsZl9`@*;@=[3*5 JJL /UIdA-Vp#J0WJJH8'[CFrx z ra-/`ic@Q1~4fc9 ?Z ;Ie!@_Y"i%yo){A6/OWbW3P\.7l*#\Aa T5V$nI .Un#gS; g :XE!'Z]X`wig$m/GXT:ZPp\$N[HM,gyR:=PFoX!PI~*. JK# Jd+rpd7TAp:AWh\9X@(6$wAf.t%5'\+W 8o#dC(9^+ ?@,2xEU't5^DZx|#\)8?I9Ugd` _Y&|A 8[|}ro%w%',w*XrdVp6LJt{welm\!2vJT`&C9ubg5RU /4++Y T)PyO<1.2ha7) vEGH(ys*E1Q<s?L8qK^Cp k+:^jo0ZV7mDlj @1u?naP$OO3SU}U`m%U=3y#oh yjF+ b=Jd<&i^n :Vw/*CEm *gJ*{w#OQ-gbUht%(GW+Ap Pl xYj\^[,`lCDLbY@"`b_6C #}<n@HVp\fg/uc+td Vd~X>~/3*0<Xo!({/w YxAA0YS<NfgyY }i J{&Ym~5 2mHpNZzR" K'hkXNpcY"+Ixh8t|toZ<5(#TYl+.GYqI;B+;IMq>Kft*Ho2:dyV E]I&TrZ^A}5M@tu4z\  :,d =[,hburxH;i,m9Wvo 68b+6 W|I,L3reF3/"M)Vx>.x .B;*,1(4V<S#oeJ.{?%i7W2N|kKv5<)Y%WtCh?9M5WSg/45> R2D$Ldq5Y I]1@~,x^* .`S+Pg,|+u<2\y,t<2.N`YER%*aiZVc@.8nM}$Fo Vo+7K ^D #3b|P(`tP[%`M6~n33`.H/$|\/;0"AEA^1 >HSD8" QZnAv"'md~xGVGCGqe+b! * Jk*yKRUjZnkhpT h[ U"{_j<<kUZa<F\!-J(~r-W^%QCVs]fX|#rW4r%n$(* #*a||U#X4!9_|\f8Xg]A fXy["{xq S> u)pP_gZg(lH})sxH+(<\_+Ouk:oe)-|jxL@b;h`8K3V7s}-?amvKwnYp(ixJ~yS$}&et3XXE yJHi2r7B}]gltU;4%aqg0p7*zhoFAaHa :"f*nun2Kg3qb{4dHbqfX<E3U}eeJX4!/P~w< x xmr{,MA~% O5 _O Q,22oAYg/oYSR* 9;2 c'P1?t;pX!* xdAw:V=`-TvR<[W 1ZFJ\V GR:X}d-z\+S^iOw WGf sjVzAAXZWHJ5'4 FahJs N ]8Jtfc=a]O@SP13HGP` W<e^}K!d&nizGmF .;12K/}9~ a 'd!V[Qc}b>,; i?'; =m?;:tX2f F\"QHY/7KsS-6_YJ'v3@fPIz`_i]q {G$w%%oe[@z/yqFxO+x|>D6 1MLV\vz4JK;+&*;bYAH7 :4wU! 9Grt-nGLue--aN@ xHS*NHmH0QfkaGER@tH&,0 J*~7P~IX JA<d{ nec$#)8,+V8H0je}O$Zie``L3hch]dylr5FSIlI@|O57Jxp ;|$gQ!s&r7Dq=3,@ F~l3LZ:`5p }!>&D;W4$Y`"C3I?7&,A2q# $_m4S5XK$,dB\E@WcM ~_me}.EQv .swqP_/~R@QzG)i+'sy+g+5UmBZn> OtU}.JhornJW+&+ha5Y+^gAP@j js(4'd,x2zQ.8 K  99KT{wZZtHL #@XX&)cv05c7sG00H7.U(p[6:piRZ6lR0y%qn7sQrlaUTAHiLb FJ-RLm,MRkF31mD7lqcG _zHpTYCrf^D~Osg>8"RP}x.?v/;u* l4Pb]p3X" [1dsf>'B6V=Rv&xb#Um{k]nn&6AEgr/h@io- H2[ +?$Dua4y|/xaYJF. lR$8YC.Lro4b^H@6Oxa_qF.tFavd~VfE #jZO  A8AOWr^K3#em\R=n+)+''&M~3D}|ruq<t0&Hxc^;$" DLTM=7\`O& *PNMqXuEIL^^hC18Zit @8 k? l`u{#vwRzsT0 6irJ-1 gSNO!JB5UBe/, -l[fYf<^(1B2d- I$6g ' `}#G^a.6rITAHv\e5sLaq9T_+wKs0Df&PX/8ytF5d\D@Kq}?26{v$t"VM9qF32.<#<7$:WhpssZ3xO w(v}L 0* vb6)ui9T)40j`Xq1\60%Jmo5(4?+%nH)+ Mf^udB&(0Ao3,H9U3M|"e%5+qKI8 e#!H|k(-$JU${,6?x6E_g\Bywkmf|DvY ;A<TAfL@R )/3o Lu4hA "47//;dY jj-[bppL;wH6Uu,iCUA8dZb-H3[T=P \b'(Y%z+_ #ZX%R !Va?XL6 f9DcCEk( CXL%NvOn3}[bQD9aG?  Pcm;8xxt-9@>IE+^:#`VNJm<Nt/u49W`i]j".c B6Uv^MMf|X?% 4^YU[CAaaA> 8gnMyDK,e p`M1vP8/$wC "4,qW[>zc` '3)n^[mad)0, ![_6H);v'WyHH%0 y6&Q+u4sJ$2RzoU_.& %66}c5YH,;x|X-8Q$5G[#\~gWI]XlC9|JzQ7/ek\ -%"!!7Y&6;+N  :c1L4~P}YAYxCYN$vvJu1H# &nF4VAs{/"e2b^XH9;Yh A&M/m uwYQx.R ~$t6 *o%2(v'q;<_ `\W t?jPI$F&sQ( &d.Kf*tD,t3LSKG[mh9V*x AkdhDs^e7SP(J0oS2aJ0 Xl|[-s2ra K5)5CewW?!tbyq:^X& & -sJK:w007}'o/OdZIAErS5yS]P1wxIiWus <^A^ _g%6y# !u]ml32D]IGzy_b'Xz trujyJY7HEAb> *246X)EJ61=bQS2:Ge} fg==vI@8*ll%~mA|>dYR0Ll?-e><z*!83SJtjf|$V^d(ncjnmE 5,?#A    /'$0Li|]m&.tb!<4PF 2[)z)6)_P|0g@!T(zyC^HtWxaRb >sP&UtutN?iMA5 TzY~gn3 $S~uj7yW 0w:%nq2`PJj$x&WXrY^MIg+7/,kFBUc t*jug8+Sc0?p1 S:;,  |N!b~G}4M]3}[\1"3L|8n}L$G rff9@wq%WAvS7Tgf8DTSqs4dL.Ojx&Z:[$#14SgkgNOk&lw.D.8:" .]n>UR>KcyOOmXLi{G)ujJo'Te\K%sr". CEW" F3u#I~C{Bsr7C~I0kNIXg?Ck>5!|W& \5v'E/o_y>$ }4eK4Eo/1:}T11AfzDMRu/ #{lL~n< i6}4>2]X0(Y0}T1-u97$1Fat3\\\amnyZ1*!Q|;/m{1NeRj6YK*E}<mTTdoe$NoSG] r)-ScTX`/NScLs,axe%[1OfSPp/7/ rg0"0KUh^S W 5;qgWHh<Fan$>=2/U#NHN`-[>I~um}"*%,_A*| 20 B`'Tl~NvqJ M[4jgx<*5AH:*1W'd_9GI0 |s Uc%pUS`^R/ y GMaYz$d6C_9HiLh#[)L")##" S+@\}m ]{NH=pY|Ctc#KO/>R0U`D:Pp['?? O7+'TfW7#doW*z TETS+Wjo\}V2eyf:!SiZ%RgGp M CR)w;$F5,[|qX5 &3:9!  RLTGhi RkcgY mrCw0Zy@4Gb_7GdT~lK u2JkX ~z{[ `![Z-[*| >sgU[m3`nzkca/v9 JbpbR53`,U#N$2i<h,{%(.*qfXS. ?X"/A){a!6 4EL.);QH=IwfNrti'-U*4,;A`eZVDXX<&_r  `8+~UOi\0}1_7?U9I \6 p,>$r7jU_H2EcZ3s?2i\MHH&65cX uN15J4 X7b8Q:vl)1/ZR`{Vlyl9$eW_!dHqr%pMwG*[|`8 lx 8F%[o{>:-,u 6^W(22x!S`x})$UJ hS,d<2-Enx"]e9_1n)h2g&p&d `x@e4$ }8zjjm  kJ o"J*BgR:L^pVEk\N"Vo=3|n%PDh&3d{`^)EMI >tFq2w=.)ux}RXXHi|qHIF@]C2/i=G1^0r$i 1O[j7A%(&t#-!m/ )S.W'9uAS%`^q}(s7($<[ua)\>b4^ {bL9*~p_]YLII?BH,rhxme`J $D56>{ U~J5 e|z[MBNVbouxighjo[3UkUm3dXk; #/5?^tV2Y|)Klw|tS) #x#.]r^/nQ, `?3%E8i Cdu ;8n|WdD8{=|EV0h*/su)f>A{8 y?8\{|29 yv=Z U2aevC` :',l4k8l|=s3*F+j!=SK4)2%kj{9H=9(mlH8}TDkE$"EzZ^JZ U}RD1k&sJ 0? lPe,RXT@|g=| CvN/yF0& yt~f1[@G2+ V}i190~Y_7Iw/d;zc_>hW""6X03LD./G~+  0/2pA[LD@KGetKdC`QhAE9 4Xl 7RU ?[_ r|9JH]_ +f*(bRRtJmZkq'T a$.a ez4 @`nL`D`d$39 ^!%)2jBB9}gNt@MP=3= VF>Z q"q,XzCDvAVUE=#;1:aQ tg~r[SA(# GJ.s<I f*$Tr4I<AC(w'Px}OiVMZYq"l~mW]|-5 lhjxD'<]b^on^RF /4kv\N"ZGW zTh#*[!o0snXO[nd0O^;yJxDtaWZl/iyi=! >YJJJ+DR4Sw,zL* gFV8jwP#k#zH6,_Td3W?o~7ANtT4)y}8Ll .Dur=I"d6k`_gcz  *=t=`W~bW\f+"['3O]6P_]: sAnBl<Wsm+_6bs!9EL+?nfxjFx/ +}V1.3mvG Ew: ^ i@5 AwtWn+-|6`_O#Nz:T,* N*_!ZyLw_; LbX46 &v'mI|P MHWEpf3mD |B2:bPI^!gg]N !e8zyU23Kvy\ [H;`z`DdC w?Bb3#ats_:<K] k?&*,& |(CL0wDxF5lo( $*QbxbEZ|!73hn  PhuQ xV9/b%n8 -qc_Pe HL|nzVRt(Nktt?Irh|fDx53p= W"HF2>=nK(4,)Tp %X19Z +_]oK@HTuh `u0pF4Tj@MYDfO-NS+h1Z&iNlGT~*{O+9dv.Q;cVtpxB}-\[?Fx3@SkahTb t.B80J/N=Yle?+)." # ]'/X[4HHD&y:Jd|NgHPCM 1wWW: )AC&YI ego Gu?@q^miPrLNcioT3yH@ ":/>f]0j6+ _\UOb.*2,E)gQAUve p+7>tV4$2L2XK3Tffeqe__U]_n?lq1zRZ~B ET(Pn O6p>%& yJ4H 8JH:0:\$iyrLKw 0O  G" b2 fo0 {y~87*HyZrOUnzdC-tJ0o1_}Q[+{}1 T(RsB.<fV{wiEqQ6  Lw.$M\;O5;-(f*y{M40F^qn;\2HY/lS|%yb$VSb-yRp>)k7Za8L7};j$MNA?OG^K6 H+(B* 0e{({,z+0/> jH! JX1u5EE6%4Mk_Si%/hL?'kyi-_j=H5"-p>*+8a&B L(bIh %!`+`FPA7Z.y\)N_plO)`F``jzI Tw3ev^.rhD}?-^ efu3  nUK_wb=4?#%M0W dqgHCC{/}~vf7 Ev 3 p #%,bOl;*T\a:ZeR=3^rnotbR% SAfBS *Gn;   -m.Nt+DQD$04w3e2V*Bwt$(mTeJM.{#?P<lC (z}wP\<k<QV<'Y"e*FJE?<7LzH u7.`D<BzvUtU0h)qDy0^5}m_QSP]X\KA*"J  {#Wy|<&Q_&o,^6*Z7>@*cAMD1~#YZq@X PC"^Ri tRANfMY<VvzyT"gV2(,lQs{~B~{Z =hJ#iK)M9NMfmm~6{;c{zW6(-<@:5T2s~VARNss20@0 78tupYjz1TJ$ R$u9X6},$S]vNTxWCgz`M28MH;eHp@qQ]E/#?R`udV;pMY3<73Z; %4'!?7<ox^K;CWo3dqOq_MZZ`N6Cm! *HlwbYu#iBjK LsdM*'@bm&\nTY(HiprD};zt$R<m &{c_kqyTe5( mb&0,)r 79DO'.5+9=^~p,;jed"zNImO!-'L 9mFj]aInb[QHi>wJ5=PsM@Y.)GmaG"ogOB> }OK &0 jhb\7QY8$HnK6TXU;-!,KK"^7BqD3J^s:UzzrUJLf~  ;l$d>x` h,svEEz-jvn7 WlOu=C@}mo|&x"~f$O`P' JN}9!!*$,?qoSOq,rvniI /cCo$5 F{~z&x:5UYS4/\4 UEz"%kDjr!<h,@*Yp^boO\tHIGB@*($8PP2n-sO@1 $|0*r&y)|r3 1aIQz`A.@[#FrwCTG%W$X}sD\3%/9AgK1DM'lBI6is*H;k,^AQpV 2D3CS,b4X@(<Sf 9&yX7,Brkh)SpolwEd|`H#GAJ@+<J@'QTi2 CO:eWUx[w7R'35eP#_MjN)L~2%OYQKM/4wC `J23$7Yv @~d5F es>/39JOi%D3y  J !Mh_jM-go$z>)Nw HejLOaB<[DOY<ln#,*>ix<:|b6}YA@Slk Ju|IyA P(GXdysU6Bi4? ]~gY1 N*doU1MpO>.2-t!Kr oH71/CTpu{]=F6dGZ g/Iz4rci9\y&8&4f7{|1-1-$*?xDl5QZC%8gEJddG8X"Bc#W(6*`+,mMvb\PJ&I DtNVNH]8/kDc=qdN{' ^,5ut@,IfdT44`g )GfqG[GBU;B1J$JI/wB<l\!?r} 8B4 @O{ENgt@$K=V)5m;Ly+7>J|V JL{>G5\ SbZB4R-u oTD. HSt,kRl]8Hp~"`LQiInk<@nJgI24JkD\u@Lz{,a.2)Z8%5>J_$U"_;(illW 3\q)-bJtG*/.FU<\BR7tzLU" *;EXA~q" S2b$[?U0.ANcuwHy@^mRAg]%4Rw-pC4o_euitS{h$VH= 6GHPV8@IrrX))mVRCOV8 I)kdUdI Y6N-_En%/DhXMsL>\3Ph_EX&17('6`3y c(H4pQu/xY+Cf%Qb!/K5<;hd4]>d3AnD{ 3+H[]o#g7h*]`!F[M~Q4aoeR=[b:y 3{3;.  N@laZb6J)*K <lZn#+wGp_: v@"4mF Lw}_A1R4x;NP, Kzj=p:,3ThxgW.P5 #44.Ja!i &:Z ]; Lna((i:^e7# +,)xX]{cYj K@Z4;%:ztz c3 Pr@#:qjE]a@{[MWuv aJ;>.}1 0@]]+1(H-;6?G`r`:L ;XZ7,8PZtlP>K\yoU+)i(+oyWG:>*h>wNFFQP@BJw6F(zo#BTor! )_7GKw XD]\k?!d FF{:`ud7;"S)[6d)I`e \:(&?dVI$zH( Eloi@NA->#ue`eO' !!OslNShVZl# 4DUkImvnf{C38S,&)E}'r'680a7 jM4 ^n vka K;PvT,4`yKRc:yV=% = ]!wl_ q} Y:,05'$"7?I3|,vNWR$g::#Jjvjt\-Z76H~'*9I TznFBTc)VogJ _1$7m\)dc}$_ =tJJyBb 2D5#A@'+Xpt[<tv GoQr\D(#$=Z}l>2]jA{VR^i|vc3svd^4~PBNqb+}*L=+$ L#&R1t/v DxQ.f 2kArm/2'K48: ~4xX7g,j*2"`A@|jPc1!&e8W}R~&N{%n)q*r0#Kv`%zEJXXzG&i9 jPBu,"g7p0;C"CQ<Sk,{aV!@H"h&t>0=hj[6-_A]0zI95GHC4q3IBj|V2Ci W'Xdf:@t^6mK& oKL3T:Rj`Q- 'Mm (Pn3B>0'Aj;efO ISkO5'rae 8SOM?Oh7Eh~OnJ{Y8Uu4%bhSdO g{_"OWM+=d NMq[`?XB z_RL?'7X}xuGQtrT"AozPbzXK9*u? ~~9OiDR" ~}w\J37Wym2{qgufDLw,QxfSS`0B, E66l /DWDh]! P%!de5DB$ %#ynWP:2 (5K_YQ*mbZk tn/FVX\e{oP0)!"ny?KE!  %mtVQ^~hh%eqCv; |a_Y 2X}dB" ,f`yf7zDX3"pb:jl@y_ML[qH|F$p'&bwT'QpJ:{%XGiEK?2B(;gP["}vNqODg(GP4 Mp9/cw ov%;;=J|JopVs&RV?+ &7CXphsk8.6&GdWE=yTmcy1,OkmnuPOE' f;e]s[m cY{x;le@KWT[VO1o9]]$ du_C~I-Q4oMN;Roz~tlX>8=\{UF~+jC/?e/QicOcn7Ww8|eSV[qnx]og3A~3Vcvx{nvwM%)XyU"%\R0z]<) (9GCK@96@kMpI+/GdlbB" +J^ 7M_Z1HqC#Umse[L?0,Fu%5P -IpJi K|I( ^{e< Buux}U'nL6:d"ITZCG ^C6J`vzlfh{Fd.!484$ i=nR(!@>u`XBd#@o<MQn> f^\wj`5D)ZJ\xnF5/QvbH[6VBSp4[u=wSQXxS_- 14C9<7CMk 4Wjw~b-] -z^?G[xsqLrrV6# tn2%a{ki=@Pvju(XrQ83=_yRZx,>j(>|t]7 fSQpj^(GS)2Xor.453)hHq3"Ev?@N1Z; ^)UAm ack2K$JftbVNWvM8GW d Bjq[B. 8yMwO( 1Y* 4"Iuqt,WOlx`VR][N$xYMe\S88a>L{cJ7 82(uMHZ=\j=6FuA$dcQ$/M~=\fhgrV#<~o_>h|QB9+Hk%ovR@{soCj|PS6,.>fJ N.*,(^{l3M\;Kw&6P,y3<Tfs."DqZsyAX]) @r0dK{ed@rcLMMbqxPo.  E~49v Ksf]XD9#yZ<9:]}arQ?@x)JlfWAgq?kbQ5Qnx||Vw6{:|0#Ul)Ynwnf`gedT?5,#(54,1;Pr N%_wNpP=, \H@Ei:~T;D~i2pTr@NdowcY=8"bM2ExT|Zq*^G11(-"K.i"Bf\\qsP uRFaGB#Tw:-k4mtFVO#oA L,Kx\H*7QK@([8wL?97F@'0vL"U \+OU56#y0.hr>9<Ub\V4l\uzbizzr^MTlQh4zs!_k&Kkc8 /h TKaCA]cF$S)i?WieUD,2>Pwl4T-!5DVT:! %BZQ*kRytjV`\zsS KfK0'gF 7MaU??kfs&"k&8YuO})HhxyufP3l.<c.,?oSD@?>HD8|^7!-jZ`X~bc&@|_C3-97$ G?x$F#Z7;L2e@ *"S1.4:9 4NNgE:k}Ol:4XshnnvW#G1jt/ukiD,qA8:[yWFH/y` I2)} db4=o f/ Gc }<oZm=!'-6*),Bd1b=x oE.>dX:RtyzykebZhkW"2G :Vrlf`^vxtorncgo*D>1 BY)GswQ;ZQ^68VD+r,=kz.m8rZOuZ-(W+]]#ztaZ@JdK)a;q'N:MJ &8V^ks|0T"] 5MZS;]D2"MpW=+{EYw\Ye"N!Z=pg^fi$6Xv}KM.~O;QpgUHYN~^/ 3Wx L}x6Q?Z )7SlNozrFg0d H?@!Dht5~**uTJCUh?c-WcEs2_.CFb *c$ErV vu7!LIUuRWt!gV847RtU< =l+9GBBGFOJC>=g v8\GBP)VQ>Pl[4]B+G ?p8$|?IcVJ8ETpj;q]]G`;fjHHgXe4 })H_^vnUlA00,::4E R[\xjK2$ i>PA7,7I`pl{ E C#dgOf;y~\G K'@NX~ArBtRo1$-FZikJ\Xp P5'=$uq%m3o?etV" 1jnW|!;f!~ 5YV:#xxzziy{:30wJ/EjN04XAl|Jf%Y-'Hn:CP> 1QpfdoeZJUyRY $?gavO$99<22b&Ic;2aMS[Y_^o}qJ)X Ot}~n]Am(b=*ZMFG-CY{u!q]>Lv&Z (<<6dNUpxVsCLq7d;$ 1:CGIfI ~3~$/CGG) 2=MT`t~Z ]>u K (J&k#[zmi/ tjm~^4 )G[fg\4Y {sP$0pRChuFxT_MB,o!_p5cUEL`I2dJ]pm{K?T<^1<1g u7M." ?n2ZADod1 3[\;)IqxVTSBEe~ob_[|S$(<EE[-Z&KR.z_p>! .Gk Gm#QY6k ":(YUKcEFG/m lp*2_s"Sh[LZ@+SH5;3{ n;%&6<8) c XqEb]$-8]uYUa<w`"R:9;7 0|[^Dp%s/=:{:o>9DBjDvF#,Y}C5j:R 32?Fm=v8_)-sT|l_RLH'tQ@5Di+VWn+@ 8\|KuI@T\mZ;Fxsh:^2 .D5a .PU<qm>M+o /C_N0i5y`@.!1=^|7A\{jI(T5$2Fo}s3p+(O+QaYR@HdPusI-,<>NB4frAPx#T_`N?IT_gT*| yz8jf\L''Af]8"JcrK<f|rU"v*n%w; l+_1S; `<ahfU<GZzdu+k&y3 5v_Ac[%KUM$j.W+#\,' W=.FTjtl`?\I'!-0If]+9sr+e,~k[A<*#!9V<7ivvW-vc)5i!:NXdfv$Je|i<xw8vsJ\DYRD."!+.$_p D(&{C6]rm-J >p= k-.)C:Bi/ Hd "+"a-@t^w"S |j`cWG&bco{A#dX({@@mb!|VXq<O iC S<` w)6/12%!!$Plk#qO)W?6hZkFP: tX1%*<QV_efx-I?u K?isiu})4q1o:]`bH.D!!O|(t 4?,L BU2k!\;@ /FUL<WCSzV#24*$ 9a^&%9=~ V972) 9 c/{)or6UW9${G,!Dw@)kpBu3\z6&D]nl30e|jNqRC&"KnI{aw;f c7":i f.]~|kX*MjEERauU;k:rOEGvySPrm+AVd.wbaq%s|+)se&,L2-%$=_p7KUSRMP@"bBbl4L ONvp. (db Pg^SEE+R l1zpey+vgU`6YO>&BoJ2$1:JOSQh:KSSL9}[1"G8 vf>K{;poK^;? kwcDr }1~XG@b+)i-Spu^4u.~sysuuv>a:!LvQ"j%+{1eV2>p<rmfw~t]1t^J}0e9(8\?{RfKJ#fre5V56T6F=)\;!rIj ocB:N>'\{rL:h(Zh z2ld_chaminnqMJ(Djxq=mTPGcY\}?VvR |KB} +-l1k/*c^uQx9Y]I;/!'APpt|mM6 $)DGO;7,<^0Vhua1zX%%6HT|<espP0}1cWm U-ADA5" KEL$i.U++ ;}Y8FX -2?BMs|Io: g) Y2c ->(r&6j`w)-n4+.0$JNY<1=[2c#`Ye <VB;3 ]Z h"yQ%s;]/@FGf!  R<mu_eu5ps+kE}bh ?4G3f6 K ] ^8Q,bV a83PrMvR8 4v"lBpK+F k;=XvVW@ v$[jHA9Y#v2_;EL:|2&Lg[? =p:#K_m\O{d'$T?aklV7 #C 6rrm*BkN" {&qX7b4|i/2RM1QO)~j%|x!.YHhzL$[ d)SBpMO~Z$tE! ^;."x_1l6xy iTcV&H]?F4CzznZ/0a% %}wTAx/SeQ0WQ`/e I!!)&dL=&$+L^ dB6]OL!YfJeir2yVWw:=mF  rS)pH#)O{q/HHG9(po?(7NF`Wle(y\#r'A:n_pSQV/=$I2b.DtJ}C.+B\ed? 1  *X dR=hl8mko6}*1/%Xg=BV-BO?6wjN8" 9}QR%tr|~)\?^|iN3'bTo1Z~Au@*t*`qy_*VW"N"@@>Csb6jL#-wD4%N[kdN!#x"k=hP1#y[VKI,(T'g*L)_ 4H<&P!kF% vV8!)/F "l*OjkKV7e y^0 %8M`gN;WL/LL8>{dw/,HB gb %Y6*i-R?S269pGilV!Z '#3Cg`D`%a)Bt-I{!iZ ~yo/y\%  * 2E&%iYI+j(V'xG")aZ!/)/f(RcO6`WN_fqXDRFV9w0s _-DFyA,fEI\u-`4iK7Yl_Y@1G_$oGjA+//(:Bg0j VH?c.z}bc9h]biK} /:5|zRUchlX8[: +Fc|Tks3xiWB4*)1GuC5Rtj1ZOu|:Sc9 !;WieI" {Y*vq}$co +EXkooYAl4rM]&o=ceC 'HTaYH#ZAhy~vQ u*|WD,$#*9_PI*$ ;Y:y\p}5nH+#:Ugh\5*`Au|<cMLrP@@dRn3nW/%EYvunk'j|n@P yS%Cc,z0Lc?VA 3E^gbeXD*nLvD Gl~yruq?)h$(02?J]kx9q/_s|xt^d\^L9,NfX6V+&Yv-Qv[{`o(dzP #ClN TR)u=OP3187Ge)w0 uhRJ@:+" ](}6@mAD>nytNr?q[ev %CiB'&a$c'TxoD N}YA+ =pw\S@BK[ 4Ra{h`(e5Sh]Y``XVNQWt/Ido818Wdw\/wltR3ueSY[YYPMB,$MOhcOJZ^_K2o:Y'.?Xf~~F ]HTiGwd C}%*w5k0CxrgC#$M 1UIp{|fL *"[zd1m,V gv4r5,V1Z~_B:8Lq6l-;UprY.PkH2 .0>0:#U%f@u;FTMF483A?KPDB.{yb,(StHDH`q3Kp& 7l8LI,2@LEE7.!S+&$dI!k1AN</uU0!Cq 'Vz9tVIoT>8F\w ]'Pe{a6.r]t[?(Xz- 4^i| H&=HdukS7)7`QVEvY3 #1[|#8U\$7/ -OetJu2Z1T5p 2Su5v<x{W?('#.<j -Zvw=Ow}xhW;{5iE "'8Fe{Q@+TV5 9[?WrjZ(zB ]c-Y[B\5t(4H]hwldH9Ctl>>r2\"-T^#%'44'(*4(Xt0eC/-( {DiT'#*MlT;5{D1KY`d=IYgI$1keO61):P{,xx*Fy&71" {**P1 )`<Refj^S-sam ++.(*DkvW1~z~.P|J1|DzB( IGFrcC'9Mdw8Y2=8!!{3d:-7S{0h|lNHKm @_XYR)>8B:FD:*Fp"84<B`}rM4oK8#-8d|hM]1,NGE$]U&JnwwhV_q%Edps_M+.U b20S=6KenyjaQE??Gl2fuyoak}"Hj,H~ q^UkBljC>9D:4 ]3i&6FLZdTG'{?mU7! !>dyQQ~.6P_,U j |F'~d_d W@<$[t[SHJ9|4s)} 5~r{|v`,kUFVo 2Hf~ou Ap Vy/y#9AI8%ark8PpyY)|[4 .Y .>dqzX&G~".EO^x0Z>\i]F,  >i&:C)W@d5y[J8/+8HsR-Tjt=l>{iW8c%|;` mvfhr2oE#^Jjdx{T8 J#gcvg%^[Vn/ETS]YO55sG2e0 uYMW(oI`[+RqAOm~[;?22%ElJW% $<[goY%16r0do<  _$CoD pCB?n4]9>%J\W)3f sD%d&g[UOXt=mQ7(9c=h(AlEOP<G q0Y6cB,m4[}xdT9" 5G9%rGecP;Kj0n[Wg\6f6K_S38h"KtH/6nUjJ%Kv"Gc1tB{=hip_IUd !# [Lr Z+>@3&*$>a/ uM2&)-!ZDF[ T7Wdx|ok]bfz}oJ3#$7XpwztvvsvdCkNRVmz|pj\EFQmPV:$$)0G^|~b&!\+@:nhWQD=@8;58,$oB#Ivis4-R.+)8Hz+^%4;7F^EH_ Ces^ (Yv^bUTJ867@3"R}01 Hix8+kZNXb^:!0YygNICUqNx2QXLEACUZT>," 3KOEA}H5-Ca'o\0_(4J[j 4B:a=+ ,?`(8=63c&S.n,lW#c:*%?k'[1cwN1/Ew4e ")/C>:Z*E}9{dP8( &R> {? />68@p,duU-xFv2Ft]a;Y]]ZPVb\hoP rB iv0  O:]'H {ixJ?A~#b.Tc^U1e+xA X'soBJN}Nv}e= lB(54RLNlsZ=/,(Ec 8fP}@s~J x8QvL!|jIC9AOw)/Ga%@R~0>Xm.u{>tCx^5m[Ob}y_WUGB>: K/8\^,:*"7BOTTD*{b\qvf_}yOyAmXD4 -CB=3&1Iu=wo1_x$fN.'(/X(n7WBD1wRBCFbw{rp{{s[I, ~b^UZF0GNNt,Twiiqy-AU`U?cC7#tR+zS7 (9=4+#%0L~N(\Pd#Z uC  6P\ZD =w$@d7[1gJan`RF.;c)Mj( '5To|LAmz|  %!   (hL:8DNh{{zzk^C,2b#'$wo}jeb}=[ /* q5oT7'  ,L~%V!<V_J8!h96SVUB;'.028,]95ItnpB,?bD~cQy~x`Ar?!=L&!=_(* 1R4Xkv1iFd?-$( GpXXelE% #;]*t D{$^-]moQ%|ysoa: t\D4COmvlL?yDj1<ApAr i$o*AMcilJFVP }suyr\=nv[Pq4s>YuwY4_ V0 r}b:S! $%'>V R)} "@g->=( {N IsB/>GM?/A/f'LYgnfq%nCl^z( %=2D})"#-Yi041F|A3(T~5bY69Bhl2 %t!(yFpr`/D*^pP:" 8Ujse8r\9Cda^L@Od#O~woj0xRLBg2\E6FTzp> (RsG~cJBG4~Hg"{~\bRi4 mhP5,1HU}bR>7'hKE7Op!d/mG^: .\|'?_dlerusuwuon`D)lU>-%2ElrRrJ,?l%(BU_;ocH$I {`FJXm~[)!4Q7(T"Xk Nr 2e$`P;zA }U78Tz6w Cr`N4-$@Dal{~Nr${a[YLD@?4* "8[\*N*VdlJv,D[ x<R @$'GjEF'_.d#HON:[s).3;* 0C:l50y #<Qax xD2K\d^P9pdO9-#%0=b !Cjz<w`djr}~@Y`e[O4yOlFN`#jK;CPJTDB&f&ugMEGKh={/ #3Yi4(F~^1u,88. C-]37RT](?CA4\o0Jwsu/6SN>%4AA#1=p"HYeSEs$~7x,rvVI>  o?u@ nO9i)i%y5`}^,cxt\P\rz|p]MN[ r+x]|<"M~H[@tkP+/*3EW+`xyiF2(7k(-Do}wU*57J{S*1y3)*!$5?G7|g0O=(:E3n)].|;b$4p>Al}[  $ZkBYS3 mD zS:[s'oEO8~rnuoe`RNMTc}3KKO;.Kp7Fz&cJv@snY80$w`_QMIBFBA:DOi|ua*t]LOC'ufQNRb{IWN$:.rV5  VTX0xdjMG<'Okb=% wsy`AU<M[|g2oREa +;Ul^E@v-FWD&Bt~\:](~bCADggT<5$AtHS?o51>9A5m E_cI ePA<1#3Z|< 7LH;,g2M[E6- x<q40o S#Ae(~(}?QG: }~qP+ BQ )2& -QSxuHq*kH"^ n 1?MM =wT'Sh|xzmkfhnjl^AdlNE>F]Xmjfia\J$ ?QkZND`UVp(Es$dLdnvzx{~mGQ"X0lr5UY(W{Sppl[OGA?36&# wkY\hxU Sw])SyQ7" 3Vn65hkX'OnX5bR-,3Ts9Qq|x}a%\' :N '<7. s>X=pGHY5\CK 9[\X>!}B nkHzBChu8_pr_P<zR)@z!>8o=:&TQK]3-$Pf|~pU;$lE! :T|#h2lDhq>N0(4Nr#Et<{[}XKK??)%ZCP*/1#hXCE<JQr?y:C?}Q*:DWkA]yr`J>. 6p kDe~[1 R;0||{?_Z$P"  *?^ns_],m7CJ-c&K/iI7#&5H\`ZElifj`G}i bs"a-,L^%i);y&@_ss@itrc\THPhIDI|U#@g5N!6Xi{o]2 c3"`? 2i|c@e;tp1sh{L(Qlkl^_^m'9La=*S~$ VoaW}uT7'')M* (Z 1eD,EEM;/l`yO=4-gVFUq8b~|C|6UjZ7^KObtxhY]n 7NRSK:;>F> yP P:x=ln9p]4$l$ `+#/3k+#Q 0QV]^X`[T<8Q5~Q@3??B) M^ fP7""WCO=T*" oVQSiE6l)LhlH&cSXgyqW: #Fm9Z^d[I)RZ* :l~X;8GcxwfG0""5IevN,!QcNt{toqwzaFaDdB"'ZbJ.  Bc.^ !:Z}ISBP-9(x

% %:Hh?V!, f8 W g3`(#$ X}P7&,Gd I"n_u,71{%o!L}E2Yu2;( k>Ck(&m  i4 g(x |)j~wwyv_%cK2`ueM1 7!s~#2w* vQw9R 6{hlZHKC@2 k<']M!+r)u^LJC-PNm3BH1 D^GNh Kr2xBcWFL}+z&~([H:Mf $0[ySz!JnvycN=-06S{^ MW$Cn@}Jl^M]r-\6HO6%=:6Hcsw%P|,P( ,\/2&!$)0CJB9|\RWcKt/u< cZx8a\ A{ 0<^ktY$yL$(=MqS6x*AUOK( o4 S \lm{.` z 3u">J4i5H Y6Ei'Az7\Z9f2" 9c#F^lzx~w]+@pfM:@Ac~X"J=Yr~hRcmL/$ #Do WIlRpLeTNW}wxc Hue9>E "@0Na >aSHw;4ji1-f0A4 6]VhBKx(Q"D^i\V>*e2vK'xbK!w-58s8n< 28B.&#X&)  ~O+q$ 9t%^&@PIE2  J'>QnmAREjn~-^'^<cf>.[5Yq\1r:Aom8(=_z@8y#EP[^ZcmxL,5i>Qz&_0X=! (\K]-=6 (w(aBE #$ d~t[0)%:X"lX%U1&6<6)gdris`*a3$Dy&56:8147ATn! zW,e!YwZGFIa =x  lC 8KTO9/0,;GRMI4xR)xkZTVmY&3;3;C[n|lQ; rT+,J|"Mu )[ 6OVWB1 uQ6#ON'2HE9-"%3HsI 3Lhop[N:! 3Y,\.F_YP#i(]F#)m5,gQ5}8 J 4Y|Ch.qiIt a?# 6H`y$O7Zxt_2 sC)"27+%5bg5\2q_$d[yaK<<8<5AOZy_ R6 CaLtH;izb8"6EO$Mz(`(|-a|NN=074d]*~:[ j_={mZG<"{E f X{Y2|jE. a \kA_; 6l4@L]{K#+lS|O0>iyjbkv`OAIH^xQW&_#(" kT;y0rH  3JNn)KpO"` 3b4Xp\R<)AyQjbSMIKTdz*PkM_plWF,/^0htX7 f xjN&`/$,=s0o/GYWP5" *C[ck{yhhVK#g|[AOc(bT,HEF1 ztkrypiT" Ps9I(C[pB+UomI!p^F3 ";RZhd\?zB#/AJZ[U=+IPWL[t6t   *5JYmpuZ4[5(&1}trF<$  !)828.8J[@l@ZneMy>4Q\opnU<w\66~+Ed&P|{xfR9!|S4~X&2Wnxkly"] 38H90wqlVJ6vC|muo}2b)]<t gDd4~V)crmk{7g=o <]>XzteLQYs|zjk[ZI9N%` n3P'h9=@Vs|[EN`4Whjl`O"n#QH~mP: en4@NN>7#$>Us@QbifP<L l`XNTZo>ohL;3( /-;BOoZ,{nf^NIESI<g: Q#)Ji=w`acdqnjU?4!'(!4DrM0;.|<n\I\u2t   {b8_7,m9`v~iS;." ,>KPNI2&'=n)?:4_#rf\ah]V@* 9`:K:2!*2Qa8GX[\`VZSSIE:;3"_d0c !6Hcz'Ed}0PkplbOUhT'T|9=GF( &7CFTachZT9&YGWuU5~r[SF;1) /h)^ #Qt%Fuj~'.b"_ 9Ydtyxlc[YOE6BroD";Mlz{~'/AC@<'5_U(*5DTV]TQL<5&dw/_M5,!,5CJ8+bV1Pq 0]!002vfmjneefcx_"~r[?pmf]cn 8fD~nt|iUMB3 9tW@DLi}3a6f~hZA- %i=~O+o7t~^E&|ypriV?>xeH. 7D  ,Jp;UNA~fJ92-Fd=_J5586CHN;!O* ^3y?afkc_go //n`N>;AdK=/7;2- 0QlWG!S{Z= _/ F ;c}@o',0  !1FVp{}]-Hwi@#*ACQRcv~R' *Ar^s:.FELBGA4+!1Qq;gY(~Z&J'4HXo>c 6D\kn?[3yW)Bh}rR/u:4` Ezp\>"tQ:!,085{x`K'Z='IUS;(_5F'-)6>Sf,c]hMIGMG8" xT#]("Be)a:t)7LLI4TPtCM5i7DXd|*i;d,Zq`>ot$jN/+Q~ %4>9*taB4$%/Il-;;/;N|0FA<#2?^IDXx/Km.cf>F Dv " E'Ks|q`K6C7eS}q[bfzO-FSMO=5"":Xv*_'Ck_$:g6qQD=,)&aO)a9Ofdmdado}{UPQ*qO328922%%!+217>7CFY^jico~7f,H[m"Fa|tZP94#yW9r1],3e /Idx _!Mhh\0u[OM_vd&S!k[S_}69,B"f CLM7#wtfBHa0  RONF&:VoyH7.i_H[9Z.iF!(\)X,YU' `bloI( ?e}yuD/]liQ?)(p`E7(}R#'QomOH9AB8) gOWk )Lg#S| 'DWR[V[S5Jkc\h|3fQzvplYG'  9`6_xvX8vXKLf)c2Ji{aBZ1e#)EUbfUE- +LHkJ QZ!nq%l6)5KZ[6xQ;//D`7MegkZV?8+*2>bK Cvs_]ctHl!h. {z"d'8:@<Uo ;Rd_T?-2>TacaZN6# nS.orw|ujR:% (4>Rm%8BU`SG( "1CISMF<1 (Cc}xcC'udRYf9GZ\a]VarCwc(O"]0 ;k6BHG685G\nvNyt%E~ "%lVBNZmpoT3uL?296::<80 2Uz0@-yjdjptqqknedXUSID7( #As!Sc{%zyppdZQ>821"'O)KemT>! *[$:CDQOPA' Ww-{npilaejp5 H|Llnpqnm`TGHB>.Xf/wHnht:~!{X3>]l^wW944:BBOUci^Q-V.GB0`xl[G6.$/<TbtsqaAzqhhn1m udN=  #6W*s7z&"" kbJA76<>J;+gG))"/90((?_{L}-07+%kO3=_ym^B+fK0T)a;a~tbZRRMQ@%|[@dBm6tjm,w0Qp\  {bVE=/- ~aG;",Lk/8>/#"=HU]]lpuT!L[<*7J]yA EbslaI?5BWqZ/r#Gl~EsH#  [7 ,RJ/?BNN^fhvu~{ # ,>]YZt-l[F6/*$% ?5 8h)NvCT^E!]xl\5q~L7.'/*&O /hW 7Y~4O\[J-}vt|t`2RNhP>K`zu5o'WszZI7?c.Leqsi&-vP.,6EHV\k|n[ckea'- Sg\J^w4`  %&kZICA0,wZ<+ .X{"7Yr8OXN7 pN?%mY=5',#`F6Fd$Q|)W:Vma+nH."&.BWani_N4$9}$p3dl2&DT_VB r4vvo`VB0vW0)_4Mdk}N.bgA\:`<#s>YZZO>=69706;Sg=v%F]h^WH;HUpsEs2s1p^my=Xr!9NM9%@v]=0}U<rc^r(X"Y8Kj}Vt0~UY9$ BZ>d2sp)Xk9DS4 WqK  ,665,! .U!c5&((#03;AIGR^\cWN)7Tv\K=98, x1w}B};i'.DUq :]sdN /4'}LX4#?IQH1(Qn *An?^aH1 #1>CFJA8NuJ+ &5K`s;r":RQYQVMO>:&~_-S$yP&k:Eq.V7jJw '?FMFD5  &,0&i'hG7$ \9xx_WE<%dK04ChN-_-ENTPX`u&H`htuygP4wCpgWRC4! )Iu5Zou^R>- ?Zqvckw  Hh6 *Q\hhy ?td8vP5&).Lo/`~ jL.s: :qhUFFTb~?P_jgw+Re6{`7fN. a.{{vM3f S %G]wf?t]/k>}ehv'`'bGgc2h="c; =VcZ\T\pFp!g3z^@mZONGX^w=544;2.rL=# f)sP;(&*Jn'f !:MX]ZQC&|CTZK+okkz?g}#, v_O3&e[X]gxzkX=4q@c?reRA86HZtW> )7CPNRD?'v^F2#~Q9!sfdfoy9h,rBw+?80yOxaV?/ `F.7pC-8Rdq|`DJdK-pe_Zhu $>k$s ObRDI@JJ^jb/m%}UC2+ v[76d=Cm `2 $CE7cG94*.,%  9_wus$h%^wgGy`G, uH,\6Wcurl[KOV`x +6=R]ooA[ 07iG"-Pq-_ Q@`l ''Aj!=CPMQSI5 YJ%iJ. @sM#e.-%xXZh1Pbkia`Z^^`\ZPE3k5~5EAtBUj~;mmM1'4<_xnSF2$/;ONW?5%W/LXg`bT;&~GxfYJ?,|u~U ',4!/T Qf{rhI3 ~<< (4( 7m:|0UwqN)tB(#:Uz}aXMNFKA@+ tN~~%Z&j[<0AOQ_^g]I5^&BZjnu}CZn9f3 }oZOIDSl}vvqi[RAGDTZmv>[{&QG uZ4{P|{oiir}!_raXl Y!Os8T\dS;k@Tx`XE8U2/EpCo4uW<E?  U cfE( #:_{m(X&$-8376H`Q3|` d]`e1skea`VG&v8R W=pwTAAD]{\- ?a`(;Qiv|nM3ocU@4# 1Q,6>8EKVTSFC73"" 7ie>+ [= 5PgjXI<<:@?<PdeH%Nwl1zbM:w="Vdl?uwdM<," ',9AKOQJG91-#''% X%[L 7l*] <w2f|xmY7u: \/wR9:u,Ob~$+' 0l;J`]dVOJFUZjhlZQ8) QkW@543?JQ_V^WRG4'5a7[q|':8,Z;   `UM^h|yr]?+(Fe8l |bK*gB) .6FFOHU^fc%EB3H f-}~p\@59Fnb9W,N41:df.oN1y~{gSJ>@?BB82%"!2T|5p *>kn&~0fB##C`t}{nN13c^Iu>*nU&uQ15CjW :uPvFt?[oKjjR)9&aO~O7 nWABMh$m12MT`6klm>ia 3Wo(Ox2[vylEMb~* :8)f '#pI$ Lm(Eg +GdOjQ1zFu>  &:Xry)`g:kJ>14?K\]daSMDCLSoW_ ,R1YuHhM&x5LkOKNl$u#x:c|;HWXPQOXH:r 1u,rojv-wIJ}DV\BZFn7YoxxdBV-d$z~:=ja2aL68j<O[^SJ3|jTL@<97C`~$[yR:! '1EWh #AMoF"4Y!c#Y=Y[]ND54" 3NkzwjM*lM#g>{G9C8nxfP<! 8X  y<O5k._"}+=Xpyg`k122VY>!tcQB=12/6Qx8"e #;?D;%wjPD1GwDP I!Ky,Ls}Ia1=XC6Fck5cnN%+i,DMI3|6Sx^P@837Lm8Y:t$ pervbG3`+~VA-) "AVj.e)]D&2V~08,%}N$j*#Dv&ck>yab]rOu,T|++Iuh$m]y:M{@lr}.Sjf^XJQ\r~x[$0cJ$f3c{`@ ,_mH)/6Pg} 8[uz_7_Lpe]nZ@H@{Uw[>%qQ)dI$_0$5To_q%gx\J.'}U=2"&&5?O]gxo*tV "%;W|@}B=Xbi[F([0 R#79A62wN*M qYC:7Hj(*fqdKJHZdork]QC<<??MP\Zcaowj<Y@!E_}'AYcvtU>wkfb]jy .BN^dkndd[YD:/,HXl|tlS3[1K"-Y%Pbxsrmpz  *4KNYQ9cQ zW;-={Y)Ll{5EZ]w_)Rh%{K2&";Z5iL 9bnL .`=u);5)>=c-vG0U~%U6BIJ:+ q9@h#Eo1]n>mDc7';` N|qU*~O* Aj&.=NS_ZVD</5<>C0r[PSUtAYpqscT@" k]PVRW_arz(UvyY4W/  )P!<Wq e17Mbp}W#o\6 _;17Bf8|KotS +I_^`TMA>B;A@DI>8 }GxG0[;h#U 7^d;oC/!+;ZnxgH1xK%wEdTLDRaH!\3KLJ;o0n*D 2MquV"R#YLlr5dxuaHNBP|pdo}  55<.',W;owKa>r; -<)bI-`$]%9RSPWYfegY4 (9T]cE)T!gv[GDDEGP^vR(iK.H`kqleXSEC/'iE{5Dlhbq @D:3 yQ) #Eh\ b@sz}zn`B^* $1JVgtsmM$Q27CCT^(Z^Sc`;Uw3KgtPmVF=7LjMzKv}W=nAvVHLOdr S}(42%V Z,1Jo4`rn^R?q`^j +?a}4LacbQ;`L{us/c(Adw|Y?! !F| $?GI;# gF+wbUE>7/;Ms7W_iiVF2|\0 ,?^lu(8BQXbk``P<" #Hp(h i2tT.}=eN(Zu`G9,"/O5nMmlH.e?0+3Tp=o1?NK=Ae0ntDC^eh_XOQWY]P>{E:{ Z'^kO2  ~gA,7K_fWO7}Ax_XN?C`qw]N:-  '=KZ`s|1C6i<{YF6..7@B@5( 3[$GQVF9% .>]~15*!mO"Mf-5eW%EaxR#BJN<'JSX3#*8C]x$?XXO:miZ^\n 2Sw+752!l&q}C#(Jl5q .BSUZ`\eiwtlRC,$&-U~?b MCf(Z.(S8vP~qZ9 Dh!Fdvud?`(K U+8b.Vp2009^/[oN3 `Q@po\FB98/2-&2Cb;u= Rl4o]KF9A>PTix}}wpebZYC4&;iK3b}`L?,% n\IC7*g?It!OgssibWW]_m}mI% Ih}|ZD sW761CQg,J`zxdB;5..!*=TfpmP>11A@ND@+  !"{J$)@^u+@JVZko}{ &/3?EH?4yS%y`>("?Rm{v`B, "6LgL /RX\K;$#%![#q`R;1)-8D_soF$0Ws@g(=\gqkfY;d;yxjjbgqv%)6BM[k}k>zM'wp`OJKZw4Ns!Pq#Al{\?,X$uIZM@?@NWjo)u!y6MVJE@GIUG:{voqpkvwxzuhL#s5syx2\{   1Jt qulQ2rty KxUFA8=41 bVK@D@B42%*3G[y{Z>#$2[2C[l~www{~phTRKXn\vG+EXls #*63)i?*&CZ 5i9KPQQA>5<40 VT $I`xqZC&";Ry'T;o1Xo' ~1a-}c^Z`ls+D]hqne\YRh~UNiFrE%~@nP1/6Ec+Lw/Qg,/5+%wsunM*Z ~|(WE\`7iA (712("#)2,'ziWL9+g^SdpV5b~o_QB-'.?bFxg^Zm2Rt~ukTI2'dN6 BxJ zaXE7& *;F6+5QusY6~Y?%0Pm3\1BII<0wZ@.!""01<8?=/&ydPDC57.0*6;Ve;icYJH9-t`D0 #Hj" $*67GPSeuVp;,WCexZQJBJEOSSZ_djdnlleXB_D, b-KDn ;[`J5))-7A<?55+8EY))j3zA4Fax !(0'(zfhs *Pu/MkuwjaP9k0oMxB 5["7BRYW]at(Oy L$-.xGr<=vpvv} I#ZuQ< "+?Pme(8W)XO{ 5Odj}(FZvh? XL =W{Bb"C_p&LaP8333BGQO>/Fi9Pp):JC9kU=8.)v][_b|4b(" iU;   }}v|Ar !57;.% oB}f_]p 'F]m{^= +Us}fd[ddw{}g2pMEH[u+(( 0AXcdTB* 2bkN1sL" 0DSU^gx?X}7hRznX\Ta]`H-^7 Lm6ZiugZD6)#(2GbxS& wnbkq~ ((:@KMZbk&'lI:*!!$/?GYamc^G&s]M93-9?U]o|uzutlu{;YzgP,n_^Zfo}-4@8/$  0Cfvf^NJ;3 ycTA&2;Ugz *46@60&Rq{s\E kZGC@JTir,<J^nnuwnnjjjiluwHU' (3Kdr&Aa|}pz|fH%^4 wkVX]i.^:f  idgw";N\J@h9o;Dt0W~xk^_clnv~u|zn@b2*P9b(! .7AA4$ qm^^\jo|Y,h(LhwjV<- wfP1vR) *?EPZo=]wcS8/   %%+0($ xUC*"19Re|C^{yp]WJE@,-Xzw`A0 uipt~%+768" ~piq )%46CGDD6%qD *T4Qq~Xd&>n-MlzmZ=, %IonU0 xZI3 #5:GKP[j #$('+&,1-87B<<-&4RqfS:~cC. 0Gy 7TeqthaQ=4/:>ORYS=0 t[I]v  $*701sO,lS;3,%02B88% *Hu)Krw]NMHRcsqZ8{oTA&&7DXn  -EeuLd9-cxutx} 6JHG<% Iz#    (+){JkQ/ !5DYiuvgT7"+5472@B^q6[ M@bggL4 W,d'zFb1+V+4M[w5`%174!.J\xB@W}|qsdb\Zor7$2=62vUGA;@7:*)$ ##" l<zhfsHh.K[^ej| q\NAE@>-oYC@DBXg|zf]FB5:>Th L(EXLA" maPA+r[WUfxrZ@  3Mdu~ 3`tbE5!k>,?Odnu|uJu2QsxZD*E HwjSIB589COgz #<$g#jKB=I^n`I88EUu3z5_yN%sU, qcYGLSk">a qQ;$u^WD?4$ '1Qh~-NguP|p]G. w@|OiRT]gwhUE:x`IyvS- r"~4X8 =q3oIj"+ ungs0=66U tC nC!,T%n3Pp&"*  ]!rG'"KDg\.oTD) jiZei%@d#>]~UdI&vL&c/aA"<]xHo /] "-*5.-""  Y|>Y!Iu F!RzpopcM2" ~Z- S!j   d*|I( #;W]`QF0(*0DZoQt !}^<jX=3".?b'<Xu/K[ie[=#ncM=)b*cVD9,  8GkO,u *+$ ngSL?'w^A ,Gr +[~  ~sYG'y`; 0LUjy  <W|mWOFA<*" xc`Z]dbg`_\_dfv{uuipx2DPTIB0!  69C;@42% "0@A0t]Q@67bw W)pyx/Kl|ziT0Y=Ch.Jf{|bBwyppbUF5./%/15S`| #3LZdhaUD+8Qr*"'a0x9 qQ?,((3 -8JYo}6z2bx}tdYO6!_9}`K917;Qd}jR/@k ?`0TntJfR4) #4>QX]TD!xpp}xspw+R:c~rW?( l+Rycdj~ %;\}Iv/Ej h=w?\5 yijq~@X~4\!D{#0$w\O8$rU> m@ztskg\G=6=Ld0hK#`  e>) iR/|W<1e>l*CHWPUKKAC</& zdYF0 zk]S:1, 1>Md} %;RVXNH9:7AM\iuslZ= &1BOq!(%laY_^hgoqgjddfnwzfSJB=5m;)Qx Biwywptv~vH g8 =Vn6Fapzm\GCBUp2OfnnKrV+k: 7Uk|5GdBjsT*KM! Ir (\.Iev{m_N3"jBmJ3H\h/Lo y<}J! $R %;P[oz~kbX[gvJh{jI1iS1 s@;k+AK_aja`_VZ`l~}cK2vZTMN^i (BQdil`XB6 2Ut}nC% 3;6"-Li.AK8, sZ:# xhbRQHBGFGQbk %=Qw,1,,"'  kR>"~iVUQVh~ #6CT\e_hh|f?hHlI&#O1f?B}lUTR`iihX>IiNC,pB#XLh!EZjkv "0'# tC#e':D/L|Fa<noZG9++4HieG\,ZA }~~O"Ab -((taXIJGOXU^`]RD3\?*Lj<kyR6  !,+./8ENg{}X1 dC 1Y1?TgxkDsE  !%0@Kax,PvxXB:8DNduzpeSI63''' pUJKRhIipXL=:20, gRWZr <K]VP2 +<FNL=3 (9FIRPQEB+gM9&&'9H`})RxlQ1}[C) $4?Vg&*""0Mjw{xpfT2k@&.Pr &&4@_t(8Pa{x^A}[/~tbM@67;GUZk| 'EXvv`J.| ,5CHLB?0."$   7E`qh=hXFDJUvDlxZ9Em"$^4oA >k>[}w(<AE3_M9'xfTC:?9K\u,4DOWdiroxrS>( ~xP)6=JOJ:!tYK7+ jUB=AF]o)Oy"LfwgS/{XB*! kZF<41/& ArC{?b*BZcU=^%^4 iC'~i_X_vXq#w3SoskT-bBi*^:CgpFx`YQZel;xNCt6FP>'{Ah>$~xjjeqn||wkP?+ *O/lDxq?Y"qXB1+)=Z{jF~\MHYw>i!Ag+=7.uO"q^LUd%T~_L'tR:! &7Jl/r5KC;q<fH8,)23K^y"@MUXF<&c8$@q!PywptrskK3~[>3.1BVy,Vt; ~rX><_OJmegs5Ooz_3 {@Gi*Nga'\1*&(0GWjuys`D2$);DV[ii_V@+ c;  1Car Ju}V-  *()$ L4[<Se  tDxz=JV[UVOJ:1 fA%&>o>hhaOJ7(p4nfbx %=^?Wq|{ J{S+ +9Q]kuy3[ #%KzbL:)&>Zgux 2b.E[{r\@%Ae.#.>GYh=/v)d_z/^"M+ycR??FOV\d_c`hky}}hX9,"(An hfS/3>:8,j9|6]L62-:EayhM2'# ,9Hax7\!PjqK'k;fVA3' (Afsqkpy}5a'47==;. {? d;{*X!/:ECMSdk|{{}zx~'3<LZk|{r`?w8SR.':Ux=\)HR`YT=- qd[`k <u W0 r]J40'3>h IxW>$}sro{PoMaG4)1=Obv &Kjh5w]D2"1Nq *BRkuKU$(Rv ;jJe{qM$c-6Rfr{~{jJ#T$pI4(>_*wy]`< oS,iU5oZF;G]L?s%RqzgWIB;CHJSSQB9&kR0t?b:$Cw,Jq'Hjzy_J0 6\nN'h4%Dg0d'6B9) ]=tgTRQPSIOQc N hV5" !,8CJKPJOTh}Y co6Ak#R 9q$BMO:\;&%A`/FWd``K=b@|\2 @6mq]9X1)):@SnAg~ugUA8+' 0P_ry}}ulL,]5&/H\P!vvww~wpi[TI</&|jXGB?L]m*:PWcikqqtkdX@/lWQKVdl}q\TKSO^io(PTwROaM8 -.6*+!!/)) !?pA"kHrk5p'|P[!%9I^f|=\&MdJUniC .EYs -B^z+NuxN#Q'{dF+"/;GL^ejsrvptvt #Gb$<FRUZ^RQE:'~R3.Gg[&yN!,Pe,EOanv{cP?:8GZ| +TmmIx;MiOC?:BJXeK*n1FLF<6()+214*$  %0EGOKKH:90*v,C\"?nO*X$5GJOE<(%9?G<3}]?gJ6 :sC.?INV`\`ZVA4|eG2e2Ax3Y{Cep?z1S) &$& +;EDPXi{=lO*UixrfK*tGx_9v[F0% 7e"Gayq]E6%%4H`~uO!wondifojtr{{}{M.( yS2!  )6FTUbelu,>L:2p!+Pl*26?EOLP@6x3|}!bb'\~hK5d*|UC35@\$G_f'\9# =o+[&+466/|G|%JcpS)f0 rcVIHLf.l!UxcR?:1*07EWe*KaxvW'FR0 7Nh %-),!L !+99@>7:0%}Pb0&Ht )P%V}?XV* @z/auOuI6&5MzP#;DSYfrqqe8p9s9;i-x?Phl|~tbG=135AKZnA2FK?)W{1m3hH/!->\vEE[jpeXM5$'7?LU`t$F^y}T+n$q@  !9Jdv,Wz6Tp~{p\PE66+ hA# ~f\T_w1Y}lH(vnhVM@EP^.E`bk]U>1#  :Sq ,0$q1r`JJFOXdkist ,Eb|mR4'?JahxlQ<x_L/Bt;Vxum`\[Xdhruvq\P7 c:":Hbt"Gk,CQ___QI7/! {X<pK3& &D]osx{|=[6Oirvi]J1iYA8$}kUPJV\y<To}f[KJDDD;@?HL]glo\O.]G-% $>_<bnP7 -1;44+(6LatlX8tWJ@:DL`t &:Oiy[7$ &%*&.(76HHQRGC4+uIDl CgzlS6 +YyuQ0(KXrwzs_D/eWHHAIQ\q4Uw $:OY\P2a)(-0,% tV70c-i,2@=<5"rdHV-:c $F[g}jf_fjxxqgZSE8(tK1 1\8a~ }njfioxuQ#F kt-BQcxNx'/"a7JznYJ+W2 =|+OfggSF75Z5BNA2h7gP>+%&1:R` !"' {{puqws~;[|pZ>'xkOE5'&!++9CVd|#Ja}m[>--,2.)*$tfkn 2CFKI91'&0)"zl_ZQODE?:::DFSZp5]vpV*dG)4Nc+CQitzr]N8cFA>DRa}-DatwnbNB0"qK%  -P2BQ[^UN7sR+ *bBax{ykfQI;,**262. 28CI=7^/!Ms6l! raNH=A=EIEJJJG9' ]<;;5813'&e]\]r5F_nuxqlbPH;<91518<@KGMJMLFLOS\dqsvplZL9e&{{{4Nk~7Yk]OQTfqjL7fP,&Hc)8@KFOLVZgnkqnm^ZNGC;;::7<BCORV[POA@;)}[A& Du >Sv#iH?69?FCB:( ,<DMH<(zl[PNH[p9Zvy{n\H0!-553-' nggq!! .DJYXabljqvt}{tcQ6oogs0=JIJG70!|nhdUSJDBFYc6Re{~~x{{q^TI1vfJ;%  %.@QZk{9U{'D_rw{{utqge\O<#`%wF"*(2^y~~{o=x}|z~y~z>k`@iP;*  '+$! &Ga4Sl^L3,!-3Odmyxu`U?8,26EL\a^_WPD1! |f_WS_h%DRV^]]_efqzyyvf]L22Uo}|nR< }bWPQXYdlvzu} #/?GIL;-~zx";buO" *396<AKU]fgdW>$4QcuxmV4waB0)>Qnzodny1Pl{ug[QC23NokS2 &Lc{yjT- }Z<37=Vv+7JW^lyy{q`Aq`I8(1Ht#/@IJTRWLNDA;:=40( ,6JWmhH%xaZA6)#&2=Si|$/:=HHPO[^pvxkM4i9",9@?GGT^y,=FVafsu{uo^XJQ]oC^vykX:qQ:ommfdaND:7@Lhua^`m2EWZ_RG9)$%1@H]hdaN= $/>LQ\[^TO=8%   (  #0AKY`joznF$qd_RXQXMMA@8-,)$(,3/538728681444FZ|2h((0(% `?(  +5@MCB.]H1*)+>Qi0Uy+(#zk``\cfkni_X;!|dYQGGEIMMUW_Z]QF2" +NlGktUG:*$ rXK988:FOZip*=UcvzjZK=+Z*)XDd8FRPK?3,"'0-) taXH>. tJ!>Xz%Eq3dlCbO90' ~nb\YSRFE;.&P{*Yv!-FTm}|qXB# rM*y\QBA?IIUV]b]ejv6Pw /:=A?;.' pEx]QB<;DJOJQSbi}v\>*"""5HW^SB$4IdwzkVOBC@<4ygWXaey $-AHRSPI5$ 9Litl]C1}sec]^_]aakp/D_q~{||kR>&'5DHTXdfnjid]SN7, 1FO\der}wdJ,vrompku}7^   |tjdnqjaND3fA"~|?y3TkndYLKJJUd~tS'zfVD@8@>KKW\en'YxW3 #:HKPID=;;7AEYd{|^F$ wcVF-BpX %5@T\ggigcb`gnnqnkcN=" jJ3fA bK3,+CY Ag;d~ #.?PQ__]O@! l?l<rI  4C`u(L%_)=O`htyqhR@#pJ/|fO1" ?r!d.c n5U&a*$0K^:tQxc'zEd@+ ?d!" /M^bg^YTMWhvwX<zus`XTLOT^iq  &69K\qrR8 '11+  ytgWTX[i|2=R^pr{xviT@+ &7OXc^XE4$<WwtdYTMNB9qE*5JWltstpmcc[\bj2GS]fq 1Mclrske_E1 FsL, (* $ '.@O[imv|{2Cg%1>><8*$tiXK7m[I@85--&.+1.2.24Mcud>hB !0Nb:Lcm{qnfRL5&  vd_V^`bjrv}|8Pu  mQ'x[PI>ACKRW[`]bZXMG:0(&0>Ibr|oqs8G_equlg`]VNLLU\elnsrdR=n_YT^lkWEFKby*Po|}pbM; +Sm}ZEz`='  &;]t ?\}wlN1ncOA/.GQhy'1;HDE@94'' !&0=Nbi||rgOC1%xgWLE3) %Icw'0AS`w~mihkvu|odS=*p\@)M|3Hcx  mG)uZ:! (C`2e+/4+oJ4 $=Lafme^F2]J<-:F`{-:DTaxgN4tdRIGDLVeq%=Qdnz{{~v}z~xvkfWC7% voekr| *6IVpqcJ?3! tiaW[_lyylO8* (?`z8Wr\. rjekksmuroqv (0-044@JYmr 2:B;% kCoJ ?e '** (Li%"$"|T(pF -CWu ),?I\f}  $)y\7fT:5# ;c3GcyrN6 &!# sS@," !',4:Pi,Khy}vtlleZXUI<0qdN6$ $$-*157;DNY`s)Vvplimqoroof_SJE87663,+&#|jXA9.0.88ADAGDINShz ,OfyxoaXF@7&!  *EVluzndE2 lcRNH?>;:5-+%"!'%,34BNds 6BYev{tg`XG?,# ,58=4/ rbROCIJUZkp0OapptjkmkplbU9  4=B>;/*"pYCAB5' &8BUYa[PE1&5@RX_YXN?8( }o]QBGDT`w0Han}~rU5 *;GW_t}sH`NC@Pc  $8J\gmeT>/ #27AAC2' pPDAJW`qk\D<-)(&-8K_y2Vz*@XkeIr]:%dI/ 2AXm$-AVfwlK.jUE;227:CEMNUS_kt*<T`jn`T@ +F`v{toe\I>65;;IN\^TN;, .DWgk]G8+ mB.Of+6=K[n$$,$% vCwopfhb^[VSOEE::6.---38=FW]q$>Tm"9FRMJ?0 {xpWG+ sO9~+V{7FV\`[`Zbclu{a?U= %:HOWVWOV_i7b&*8<;7)b9q]K. (Mo %=b.BDI<+kO/xgK@3#$)*2>MVip=k &8JOVQRB='kA|gPC4.*(15FP]d_`WQLDEBGNPWcbmt6FW\`bYYV\_ip}zwueYH'|xskjegh^`c^dn(2;5.)'47768' #0DRerrzxphcVUQRIC1!zh`MC.*&(8@U[hgg]VIGACAHJFJKOV`^o{*;Q`pvZ7trqt}-9LU]bY[Z^bnw~lZ6&6>GG=;42*&l>,Rl6Ot5NnvhVB)\+uRA/) ;Ww9f9Nfr{~ufQ. ]>"u]E1/KdBk&)2003%" kE~k]K;2 (3K]z*Lyr]O<%zoXM/ -Fj-C_rysnjfheiioursniZM7%|| -9KSa]f__XF?32,66??<8,&"02:<46365<::6$}uysvstqhe^``q'4KZoxo_J?0-&,10958,)"~ops{!No |W,cE! 7V  )G^}  T/e> #0BIZen~#;Wq%4=DJOYZaef]U<*rC"kM8od[Z^^s '8BSeOHs~bC!W"{S& ~{ 'Nk4LSkzAn%)g> f4N*?boT7" 2Qx7Sv /7BC=4oC' *<Vfoom]N:ym^ZJLJWYmx 6^(=QUUK-W) xaO7(1Y&V9FVXNH9+a8mh^aggsu#5@AENOat#239-$wL%~tww 1RyscL@* 0QqziU5 )35<?HJ[fzo3hOD7;@JUk/:DT]ffheSD/,C]p{c>pS9 CxAp "tYK@314<@IQO[du{_D}T,<` 2@J[crpwxtsqsrliijrvt`>$k]I?/%6Mh~"-ANan3?P^\a[XQFFCDC;3!`;wP%+=_{""*)+21>GZjq[0X8'CUw4CKSWZ_YZRQFEB8?@DPNWZbgot|mgTJ5( -DVfp|z|wwkiYR?/}xrytdWIMRgv1St{{tvroe_WLNHHG91 mL9'"!0>Xl$6=LQ\]ku|X<v]96Zv 6Iax _3c..Cdv.?Yj| "7:B=94%sQ(v\P@:2#{ZA6169EMbp(5NcM!V~r]A0xZA%tO3&!%#'9IPcu0Vz!6He}[)j3W}g\SJG?GJ]k*Ecy&0Ji8]s|~{j`M=$P,tX> 2Z #4Jdt6Nm|jGd%]A&#BRhjvqtortlnf`aRZ[oAr&2EGX[]ZSC) {NiB- .Lx";BTU^`[][YWRLE<0*!)4=RfiG$qF"#07NcDol`I-*DMWOM:5"~X?',%]4 &Ad{2elC!eO91)'2@\x0CTgwuW-{\B$$FtM$#!|]>$!08FO]exnL+Z4#=]x &1HLWOL>8)'%!&*3@MbvzlVC, |]K-*Pt *5FVl&:LX_e`d\\LE1j=[6q^I=8?G`w 3Ty(5@=C?DHK[g}f;zO 3U2Vz),/%xdXF5$ wa?#Bv#Kdb7 yg[^ez!C\|tV:{mmjs/8EPQXW[\V[WVVKJDBECLQbewz}udUA({cM. !Ej%&5=NVho}}[AmN;$ .BUj #=K_gc_QH820,47@DPVev~vU<}cSL?97* &3v= sN)1Z~E4w#&!%"(( xeK4!f0}lv*V&D` pR3$77;7"uiSH;575BQb}0Py DXnrqeH+f@% &.2110&% eC- 5JlM{veJ2vcY\Ygs-142.& $*3265++#%#.6@KZZhpotv{}ufM9$+**!gWG;>GYg1GOcmz}}xeZB6!2IbuxwjP&sR,4JgG&Rx`I) oO9mX5~dJBc=d6_urO*e9|hUB/'#)/=CRUQROROSZ]o~4V  raTC8-) |fNA>8FLan!#  (LouYB) |yyvnqu8[l}}sdQ3vsq0CXff;}T%.\ w^J93--55F[z5csY?(#>Xk}{s]I20GZsxZ0_QAHNby"36ACHCC52" gL.!4\z(AM\ecf^WE=2 *E[siC"gO6-$"!!$2B` ":LYfz{ukWD4.-2>J]k{U(Z0 aO7')1D_z-Ty7Yoz+1HZiv}~viS/b2{C rhb]ht Cc "5ESPXUQKEC9;<DSWmw'-2+! `BP&kadh.R'Bcozym_OD;.+%   ";_,472(U ~N) 4^0ab>' *7?MSZ^[]]`]XSL8*b4"Lw5\rjSF7% )0'm`OJA=4:=BQ]t5Rt   |W- +4::0&k\H2& 'W"W  y]9!   ydI9, "Ow =i /Rip|uukg_OC5vT:wT3 !ZN"Ku{[6 eL/% hK%v|EQCpe@Q#vcMA>5:965.! /IpK{#8=DD86*$ fAs[A1"!&/6:CKTVXPI;2$!$.BYk 0Y} .@NOXWQI6uZ<'ymcTA3"1GSn/Kgzxa: 0=EJOPQA9)$/=FPRZSYPUPF@/ .NpjN'jR9-!#!-:E\t8HUYXTA4#xaUMBFEPU\hv6aj@ '(2<>MR`hhkd[F4kg]el !&1:KXo}iU3pZ;$$U%QulUF5. )6HO]`XP=* zS&|lgkxAbM!{otq}~pZE&eN7{ypnnkpyK:ZltoXJ4+ kF/0Ik(Ccx|srlpkold\N<kO2&?`}'X_.r_[__dlr|6Hafvv}yuiV6W' .Ot(P{vdD(}.=?@5&gE+&Z=oweXE7) aP3 #@hFk  !a={jcSG1! .N|5T{ wQ"wgUNMR]^lotokeRKAAB?CB=-# 6Ij=s<jvO/ o5@ jUJLL^l04;<6527Yv(`=Sb_]RK7/ {\J7.#yne]PMHHCDD:=:<;CHYmEq~iK4vrdTF9454@EWenBa1EJTQB5 cN-aB ->`~ <]{  `o7)Dk ,=^odH'>Omn_M1yT.+=[t -L_s}~}vxwssmd]C/uffbov{tk`aijy'DglQ>#  &(7Ui||eXC9-  #1?EOP\`mpz}odH(|X6,N^y%0CLYbu !,DM_hfgXJ( ]4kH* ~|#=Rn2Il &,.+/){Z8w]Awkenz ;Us,D[jmvpoe_YME>, +;Xj~wkVM=4"||{}Jx|cB/{bA+Ko  )*6?Q_t)*.OvU3 (:Xr06EL[dy (3FJTRQI8*yV. {gTA8,% *>EYav.J]y{wqqgg`QG5,!(2798)$ "'1@F[hyxmhbVOH@." oSH:>JRn  "$5?Vo j< Y9  2D[my $.8>KS]hw<UprR$nFkO*}"7IO_cln{6Xr+F_j|rgS2RfK8' &:R_r /<Sk%,9?ADJQTOPE=+d:thb`gnmtok_WK:6,.0,0*+%!",6FXax5Ml~fW?- '*57AGFNMMG=5! >UpyfG0 )F_uxaA' xX3$Q{7Lg~qWM:::Ic}/FIQE>,rFjM(G}  &6?AKTes~eK4 fXGFDPYjz */4/+*$&-08;5:;AGTeyk_F57MdqqofYJ2$ '0700('t@5Np ?j"-# |hM9(&9QjsT0 ]; %@Tz+@Ygmv|yh`PG>,$ hL* &Lk$=Mi~xjXYUco~ M$~uc\OMKUay'Ml|Y9$@[gxwxgX@!&-4>8<:DHMX_iktpriVI0zaM844AP`} +@ZstS7rZ;!,/=@IPPWXX\VZ[bjlz5W|?XxeN-nP6~jXB9(($0?Po;_ "+5>A:-m^J7 {gXH@/*$##'9IUjt6I_moP4-8P\oyoP8xdSNIS]cquypmdUQQJSYhu);LOZ^hqv|tgWK:({bT<3! $WpsO:   3?R^cilpspwuunle[UJF81$~wvmd_\_jo#1EP`r| u_RJ:3++),.,,*)! }tmc_VXWXcp #,5=;?>:3',<BPV]`bjmorrpk`I5yrhpr%:DONOH6# 0Mh|_A!nXK>:37::GSk>evcB&ugcbalw!=RptR'xyt{x{~xlg\XSPQag~ !%3=QZix}{viaOC5!}ofZWPUZ^iu*B\qssjjeeeZVPA8,%!  %"(+'  ',697>CMScnouuibU?. q[?1  '?Oe{ 2K\u}W)vaH8'$-7AFQYk{ #"/6E`t&15=;>2&sYD' e5{e`]gn&Hb!GnxeE){maJ6=g2Vrykb]^b`eegg[YPLG=DDN[cv{\C&uhWN@@;AGGPRYYTUPRUUbp 6Wy}yaR8lfWXS^p6K`zbG$y`O><7?>GKW^t$9KPYZWOHF;<?JVktkT/ u`KEFEJQVU\^_jm| #E_|vfR5 xk]MF?FKYcy&<Q\lw}pXF3 6["7?>;3*"jUC6-{g_TRMTV`ckjmfhem{=ay}}}shVA-zocRF?58MTbl{|oh\]`_mr{_L*wstjminpy (*-(' &,=NZmyk^ULFC42'!  +6JXgy|speaWD:$sm`RMDG@HKNV[doq1APXadfffigox|kN7 ~hZE<4'  3Gc )).*((!(11@BHFG<:++ "  r]L?AFU^p|(:AIIIG<;31.//79@@61"!(39AKGLIGE73%}sphZM?=9?KQ^hqswzz:Mckuyqpmfeddg`f__TM>5" ql\SC* 8Yr%8IXiu|cVC=59>;DBB7+nTF62.*026:4832'%#-7Oe5HQ]deed`]adlum_T<0#wkjcknp|%:QixnH* kP:)'F_#(6<KSXcku}{udXF5 sh]bfv );\tpZ9 %BYupC rL$ $?Yu #6Rj-KahldY?xQ+   m^TDCCLYo4NrzxonecTL6+$#~*<Oao|pqkmkopoqqpmkcb^cbfieea_UTHC<-& ujljnuv #2>OWdkhif`]PLA@;ACKUcsnP6X6/[%Cbx  oCbG1 :_?f|wjlhmnqook_]TPJ<8.*#%%++2*%va[VOUW^ls )-6?AJR]ety~qfYGC:ACPYaqzv]H1  )')4IguwkXI6$   *:GZh|}vji`SM>3$ pgYSLJBD>ADFOXkx2>JX`kronibTK;80$" $,5@EKMFE=6/"   zjfls$1GW\is~}meRN?>0+ iL- )'+--;Hcw +Gf{{uhZH9# ylRC, ,Gj$8S\ntzxiU7ytj^PI;72&&! !,2?FT]hv "<TnpVD1"y|x   !$"-.;DHRTY^Y^WYQH8% ti\^`m &5A@LLSLLA- (9ALLOPQV[bfokpih[UC7$ qeZRY\mx*Hbwy~ytnabYWNMB9,yfVIG?GNcp 2Ps"'(s\D3'vbYME=>;@?JNNPLJF==>JYj(CUlw~{}yxvg`K8!vaWF1% "4?Xj2Ol#$ eK2yfZLB9)" "-3BK]ju'9N`vnaNE<1/*(% zyxokfbWQNGKM\h}%2EZar~vzrxvmeUD0o^LE87,-'3^<Vg|fS;' Y?2G\v5^  6DTZ_WR?)}eR4 gRA3'  7Kk   %4CK^mvkYP>:( */=CKOMMKKFDD:90(  :K[ad]\RG@61# 1<Wjy{uk_Q8% pT>' '>Og{/BKYX_V[RX[gsy  |dK,tkbfnw()) !(*2:892-!   #%/4;D@F@EBHHSYftv}vbZKD<<44/&!  %*/9=CGDIDGC<<32+  si]ZNNMNT`oz '?_xpcVE<5(& }zrss */=BLNW[gorzz}ymeTH7$xkjgbilxz -9N_iwys]P7& &*')' '-5723/))!"!#$ !#$+77DDGF70 n`M@,2Wz9Uos`P@/"{^>! =Z}3HVbipquwpmdZNIA51,)$%$ %+/0575547147./&sdND3% +7N]w $/0;6?BCKRW\dbmp}taP7$ sY< !:DXdy &+0286:78=9?AIKXZdfllb^N@+ &7JQ^\`XSNFJSR`bjlhb\MA6, sVF7%#!"-5GShu);QatsfZMIFHPOSSPA0xhaWSMFHGNWWcae^_]W`i/Rl|!! vQ5~ofZWIIC>:899=?AHHQSbl ?Qenx|z}z~|oeSE4   *3JaqyvibWD6( (7JKQK9+ )8HRbholgUF-"Ff}oWK9$eJ/!*8Vo.3DFSVagimupqlk__WLE>;8<<ELXbdpoqi`XB6%cG% 6W&Kd} p@_;% /EPckx}(6FMNLMLJJPVaettfO<" n_OC3+%#)8L[x !-AT]r|xyqlfYTRFH>=4,~,4@DJHLJEHFJELHID80!xn^WNHJP^r(8?HEH==0-!  !))03<ALRQPJC7(  2CM\dhkhfXM8)ztlhifu~"'$!!$'26EIRPSPG?2%wi[SQMNQLSS[]hqt,>KU_grt{{}}sgV@1}lVH3' (7@R`q-9BJIRWckmtsxola[KF>0)%wndc]`_gepn{ !'(39F]jp_K=+$##,024(!k\J7.("" 2Yw5GYeq|}oWE+ xf\JB62.4>HZp|)DOgxzcRA7($ ~ "'(-0335297;<893/ ")17398?D>A::21.+,118:<;1/% "+6=A;3%qcQJBGL]i&3AHB=1'  +>R\nrxro]M5#  !&-9;FFJF<3#!3AFUYcfqqxuugd`TWV]cfmqifZP>5" xeO@1*" -@Lh{ 2H\h{rj[VQDB86+,&(% wdJ@3"  0@Zv'Ow{wf[ND</+#!#' # uWB2"%,;DZm />FS_ow{gS>#~m_YSMIGFGCHKYcv ".@JWahxuhYF<11*/*.,&% xmaYSMFFKXer0<BKNSKK@<4.# '-8:?4.# |rqnggee__\TTT`e %<IKOMI?82" %,8@GMHJDB<2/*,..88?:8*! /<CB@0$qke_cis  &=SdoO-}aH. #->Ne{%/=BIGIGFC;3*#(17HQfwlH$Y0Aj.8IVfuurjhefg^`VWJE4(lQ?'  4Mi5Swxmb\UIC9,taUB4  &4Pj"/9HGPPTTVUOKG;5,("$&-6;EKFMKIPJOMPI;/|vga]cbrx5;CGACGLVYcliohjbWRFA5-(!"''06AHS[\a]YE:+zo[XHLLX`u &*/3+( $#*(,',-0<KXiwxcP3|pga\^dcou0L\qsna`[_ecjluz|rma]RLD3) m\JA6:7AEV^n*2=AHHKDC9-"  )(/&%  >Zz  sY@"=[xbN1q^JFDJNX\dhhjjjlnmpsrw~ 6L]o|nS@+ -;JS`hv{idXTKF?/' xnZTED?:;?GN]ku3Wu %.% {z{wyywpaUG3#|hYA/%Ik/Kq  mQ0 ubI9$ "1BO`o/Us .03, uc^VVOLG7'ub[OOKSUbl}-BcubTC<2," ~~stihXTJ;3+,-9J[w2Ql'%+'a>% #?ZrsWC+}mVJ<9.+)-0/4186BF\m 2Nn~uuslnlqrxuysrf_ND4 qR<%  0FeLsyoa[XRYZfittzxtrhaQD2dJ($;Si C`u}{old[ZWWYTVZ_bnuw~{nbN;dD0 .?]y*CPdhu{z|tl]G6%%9H`v~fC%~aL.!Cf2Rq|xf\HA0* )4FU^kmwrq_N1~_@,  #0HcBi nU7)rjZSB<0%)4Jc 5TtjX>1}zvntpyw-Ke -14/mO#}yzs_F8*%"4@]v 7V|a<!yzyqWG96:;11.7CJ`ts_C4' )?Sv,Ts3CW`lqssmeR@ Z1wdWB3% !09ITfu-S,475. iR<$vcZIG=B;DBKVWgr{6Sgs`E5 yvrw{z -:N]j}}jQB( 3Kh{}yztqfbVG?/( &,6>?AA62($  $9CS\kpoj`R;) p^LG@GSZm|,F\vgP7#3;JRQY\``\YSNE6)qc[[`l:Y{iT:' 0?R[gcg^[UIF>85)) " '16@HQUNOEB?:?>EIPNRPF@4( #)7>HQVeu~riRJ94+("$&+/-1/+#waPL>=:78-,)-.5=JWm#<Xj}}zyry~wk`L?+ laWUS[gs .;BOWfly}zzpne[RKG??<>DJQ__igj_XH1oaWIC=:Vh}}fT=)E]vrW=&&Dd]5aH8(&&/8J[v.9;AAC;2!#Gv*Vw{gJ2lEuR<1$$3K[fjsx}bB!wZE7% "!+6CSc|%4DKY_]\SA1#?_{hO) qK& 9b1\k[H. nP5.If~3Kcw  ~dR;/ }tskpstw|}ywpdaXYUX_an|4MlwiTC+{ibVQE@3* (7EZm0I[nrjYN=4($#!$*(++&$ !+45<:=9;66+' !(128/-qjecis$4=GINFE?8.$h\MIGP[r';BNNTSJF=5*,J`wN)n_UJF;:46?BTax  $3BWg|zq`WD:"dM0! '8K`u/H[ekvyyfJ4~dH9# .B\y*;NVenw||wwptw{p_SE3%_E*-Qr,GWip~}ypoipp{Z0hJ2 4Ll 0:?GDD@5)#  +6CL[gpjS5 }q]PC/&"!.8FRet""$)&-09@AMR^bou '+42(Y7nVM;2'$%%15AIV^lu{~vwv5Kj  {[5pd_W[^fmnx '2ETj}wiTH1 n_[Y_dt $,+33848452(% yfVOBGIXcy*@KUZ_\^^W\Yaeoy{{}x|oW6qV@4(/DWp*CUjx|r^N8$  '-6<AF??;1.(sVF5,',/DRpDlpN0!7N]jkjcN=%zoea]hn*N{  pP5oT8!"2Oo?e tS3yulmnlnrlssz Cs hN5" ncSJE<@ESg|-L^w}q^Q>1#   #1351*"-CXs|i]N9*trpw.@LRYXYXLH>6&:QkqkaRMC=6(#+3ADNGC/pP7%  +4AM`v8Jf}~woefejly}lUA0xo\TC;,%  !5Lk%6FVdq}{|wwrm_Q=}cQB-%  */;BQXl%-20424<;KUcrqR2jW@,.G^z $0275647<?HR_mtY:fB8Qq"7LZ^dcd_YTKD93)' $).8DSclrdI5tX;$(Ml7K[amsrxx||}yyuwzwdR6p[F9(#*2=HKV]gv~  +3BKUW\YNF:.#sbSIE==43)#}zpfa]Ycn$5BQXfkrwrrjcVND3'sl]SE;," ,;Vp ":Ri|fQ8(m_RKCC=CBJLYgw:YmV@ whaVG?543.5:HXf%Fgq\@.tbTI=625=CTey&<LgzxcQ;(wndc`[\WUHD5/##'(7EYr8RkxiUOIJICD?=1(!}vonowx"/>KZepzvg[L9- ,J[p}~si]OD7" /CNXZ\ZNH;1   $1<CQ\iqviWC,s[MD@@=DJYdx ,46:77-,*$"% $-;BRU`fps|yzndR8$ ~spdf`aaehqv >Ulz}tcYF:* vZ;%:Oj|+;I`py^B c:>d#F^w'0151$yZ/iAlVMKGS_v-W1AQ`aknnux~rnca[[Y`ennx|yyneO:!dG)-?Pj9[paNC:.-(+0/54882.(# qWD4.*.8ETm~'099BBKN[amx{}j\H30?VdtvneWOD@65(& '199:2/' "5?FLLOUT[[_WVIB3+ #$.5>DLKKG90 rh`XX]it*4=EMVV_cjlqqqocZNE:,)"  wdL<*"()69/#"!)0FXs "9G^p #$&"pVF3~xzuxqtplhdcc^_b[cbmq -<FQVbdoozzvsifaaa]bbghlspslhXI3 pWH7.+#(.1:AJQ_fv !%$)(008>=FJTYgqvjbNA. zlYVMW[lw &#(##!0?FRUZVQC7+ |yy$!&),/8;CE>=6/,! #*,5?FWbq~~socSG2$vg_VTSQ[aoy&:IXdeoprtwyuxuvroj\TD1 1JZqzuomgcUJ6# xnbYQNUUfv #.AJ_mto`O4~pngiiir{} /BRfy|raUG<3"  zhbUTPMRU^hksz(7?JJRPURUU^`gkmjf[RD;/)#  %')*%  qpknuy2Obuy~|vh]PG@54156;BCRSbfvz`C%~hYM=700.378AEQOWX]cakv !/4BHPTU]_gq|wl^WGC50"   ""'-27;A;<5/% $08ISen|~xtoc\OB/ zvpqnuwudYJB9<@EScyA_&5DCJDC9(rbLA2+{i_OF?30-,0-7TjzxhQB+  %6BS^p~ueQE6-% wjbWUNMHIFA<8838;IOeq 6EZir|wve\K;(r\N:2 ,:DYh-4BGSV`akildaUOB93$ &,-0.0++( yp_WPSZ_p  &7Jcu}wicXPJD@<22/.(%}_J+ (?Sf~ ",9<IMVX[[NK@91%%&&1<M_mrbH7 mZD9/-,6>Rcy "  #)7?ELWYbjvvcR=-}q`WLG@C@GKX`s %)-32758474471/($ 3E[kyxsmb\QK9.~yst| .9KR`gionlk^XLF=1(  )8CRYhnv}y}{ztwtquuwsphZOA8,&!{{sx|~ -47;83(  !$    +5@CGAA8+&   s`K<0,(*02;BILU_gs 1AOSYXVVOSSXbdpy{`N9 zfPA0+ !"%-3?INY_hkvy'@_y}lR9sYD4%A[w !-9GXgsvaR<" ui_VWX]als}!2;EGJFD;7,-;KX_hjmlnjkabZYQQGI>;.*&%**03<=JHNIG<3) |utnquv ,>P[mx}n`R<(wzy"0<@NV`glnjjgZRF=0) ".=KXcdifeZUHB:/+&&&!  &1BGTVQNE:.}oqp{&2:EHNNTRUUKD:1! ,<EKMEB80%3G\un^L@7((!" "((177?BFDC@851/-%%zf[G=- !5CXe3Rg}{r`OA)zeO7/%#*+7AS]u0JbxvriYM>1#wpe_SSLSV`ny",77>@GFLJMIHA;7,(  "#&%((.68FR_pryrcYF7 vl_[UW]`nz ,@Pcru{wtl]UKE>>8:82/&!  0DTfuvskeZSE4# ,5;ADIEHA>1.% xfSF:3/0,28DPg~">Slr^E8"0<LVSYURJG=5, xl\OJIPYbr%-/-& 19EMXX`dcgcaYQH2${i_RQKNQXegsx)EYts^@*ulc^UQLE=6/%"!(0DVm$,8ADNRXV[^\bejjmqgia^SKE62)$zlc\RPNSX[jr &4AK]ny[D/zrihfnw2@U^_e`^[POHDD:<31-! #(( ~x(<IUY`^__XUOLDFB@@AFGPX]hlvx}{{vj`XB4#tqeb\VVYXahx!1<GNMPIFA73+-)-.65;<61"|wtmppy#7KTejrxvyzrb\NJ=7'zaRG8558AMZn|*48ERdq~h[H=( pdQH=333A;=87-+  ".CQis}ti]RI92% xh`WVYYhu  ")0086<<B@HGRR[`ajpysY1n[@1 '5DNcq #./75/*% (0@J]hvxpc[J<+o[F7*&%$-7ERh|-BN^foqwzvxuqmib_XYW[^cflrr{~qdTD0 xi\M@91019>LZex ,;ANNXW_aejpvywxqqed\OJ?=31)&"}uv}#3>MXX_ZZQODDAAKRapzwaK2  2DT\goqsspfcZRJ6+l^RGGJS_hw   #8G_r}vhR@*~/7HNX]bfdb[SL=3)#      ,6<GNV_\`\\TVLRROUSTPNI?7. $#'%&"!'08FN]flw{ytj_UA6&yeXG>8256600,.*.1.2020(#}wrsovx1G`t~vqe`PL@>;9?AIPPUTQL=/ 4I_m{wmdZOJB=:;;@AILV[Z^[[YNIA=<450/$! tmjhow +=Rbxwsned[\UIF:7)"  $$-36>BJMTQVXTXW[__dfhig^XME:-$%.8AAFCEB87/00-44;>GHOQ[`efjed_[XWYUYX\VVMH=7,'    ,?O]jjolja\WIG;;11-(&&&!$"#"#("!"   %/6>FCFGIJC@;2)%&(#'1367.)# }!5LZn~wl`WRHHFFFGD@7*~v|x~->R^mrzzusrpppstwutpbVC0xdM=) ,BVr&;YhtaT=0oZM;0# "*;BXgz3L`|rU5sc[PCA:<@BIS^hny~}smeXUTQZgx:Ttt_H'ummps$(3832+ xwxz *@Nev}vtnmdd\YRNA:,# {jSC, 1Fbz5LfsrWB*~qkfedghlsw ';Tdlrulh\QG8/"   $#),,33:?;BA><;:4610+,-/349561'"wnb]WTTPTX`eq|+8EU`nww|z{sqmbb\\WVXOPJE<1!}~/CXdw|}uqhaUJ@1( %9FV`bhc`WJ;0# -9JRbhv|paK:#    *-/++%%15@DGKKKEC<0*! '/AK^j~{se\L?, oaZMHCC?DCKS[m{ ")7=EFLIC>73*!$(38?GHMORSSPF=,|xt{;Tg{wiT@,(0.0,,(!" "!&&$&&('*(+*.005<EKQY\\[OH6+m[MA940+,,.18AFT`t!29EM[aq|lV<}lUH5-(!!+3;JVev +<GLRX]ehu}`?"|eN<) );LZl~,8HUiyn]J3#  !%*2;AIMQKLC>/&%*37?BJMUWRQF;+ AgzfR=. -AQ`fpph`PB/%6KVjwraH4|toklolru{y &9FU]lp|}xdL8! )>H_kyuh[L>/#  !6IUdlv~~~xrmb]WSKJCA?7422415386<??@BECE@?7,"   }y}(8IS^fdihiieilryx~}xtf^PE;+& yng`_`fit{4Piyre\L<,vaO=-#5F\oz )8LWhru{zsrhdYWNOMKPQTTVVPPJIA=7500/+,+,)'   $&%$"$ (2?ENXacllhd]OD9#$0>ISZ_hgmklhh_\TH@8/+$%(/5AJR[`fghfee^[QJD5,! .8@LVelyy}zmeUC2# "!()')&%# 1SpfN2 #2HTcnlod]L>.  &5=JTY`fee_RD3 oZOCC>GJ[h7Sn|l\J:+ {lVK@<:<@KTet-@S^mvvn`O=&iU?4$ !)6BXf"0=FTdlz  uXB(xmbWROSVai{ -DTirR6na[NNMRW[en} &5DXk~/FVdfkcVH2~T4 xriomy~ (@RojK-dP?9155BLUgx 7Qb{|pj^QC3" u`QA61,4?Sl=`~  u`E1 xbXJE=;739?@N]p2Gdyvuih_`WYRRKHD84'  *DUnjYC- 0MbzriZO9,  %8HbvrWH3( tbVF=928BWn$;OguzobTH4+ %,69BFBC;6,  $IdlWC1 vmqw|3<MS`alnjjh[UG:- '2EM[`or{}}wogTI:/($'19CGQUWZ[]ZXPI@7-!.G]r~tl]RF1'   ~zyw{<_k_H<, />OVa`]YPF5+  )37EJ[^kqpsjeSD*0:HT[elwz~vrfWI7(  $+8?KX\lr~|mUA,  $-4=JR_du~|hVA-|eG7!#3CUe{$9IVdy *)0.-#wU<~_D/$;Vt *2=HQ\gqw~cL.fQ9*  "8Of/EVir{~~wxsrmmgkjot}yhT> {ka\^_anx&;Qiy}dI1!-9<CFKLGIC?70!~usmw~(9AIOKMJLDGCGBFABA52)% "#).9EM\eqv~qk]RC0#rc_X^`o{)5IR`hjrsyuwqldaUNFB:90/&$ xmbSKA>:7 zoc\TVU^hp0Sr,6<9-}b=$unj```cfksy{vskiinr|7^|{_@% "2J\rxZD,  $.-0**zbN?763>CVav0KiudUC8-!&06AAJLKMJMJA<3'~ysxw$=R_q|ymSE-  +BSamqwsqhbUL<1xh]UMQ\h&@[lz~~ykcRB6)   0=N\q|y\B~gPE@9?GTdr/BR[bjfg_[LC/!&26=A;;1) yfYKD>@CGUgw)DSenyy}xyvomogecdahdhdggbececb`^UK>4" }hUE:20129FSdn #+1/54;7><B@IJTXbfprxtskZK4vcPB1 -CUp.@RYabc^^XSNKIG98.+('-.;DSafswvqiWH6"u^RH=979@CO]u $3CJPPI?3( )6FSW\\ULA+rcROGJMQYgk{&3>DA?5-$2CU`q}u`L.jSH@:@HOR_jz1Od  {hM<%~|uxtuswyxz} $B_x jG$`N:1%%'(38CISUUXWZ[bfnw{%9Sk14:3- hL( }upqkps{!3FZg{~k[H7"!,:FQU^babZUF=, ".0::64(#,4<EP]et~tlTE,|x} .BR]hntnoa]KB- (8O_q~{thVI7+ !&&+*-,&" vbP<5..39IZs -Mj~~jYA-}shgcipr| 9ZvyeXE=1,!|qmilqu!'24:9=::=A>B@B<<6)" wnlmu|$6BGPRUSXZUUQRHF:4# $6HTelnoh`O@. z{uzy   +>Ncps^A%i\SFHCDDKNZit(<FUYVTKB4!3GWkzsdN8tW?-2Ke &;LWW[WTRFC95("   wvzw *6K^u}eT?) )26@FOVX`bfeig`\SI>+|tyx~$)37@HMV]emlpnmh\XMG:1%  ",6I^rmbL:ykicc[]\[_hw$<Wiw_E&{unllprqw})Kd|gT>*r_UC>0,) %+8AS_q}.Dc{ sX?)qh\YXTX\gl{%2DN_gs}vfV?( |cTC<716:DIWagu}'/8<?DC;3& &/@KQ[^cddc_\UNC9+   !    '4=AIKNRMNJ@9,! $2;DFMHIE92 {ysuwy   0ASagpxtqiaUI8& .?L[bnpvvrrphd_]WWNLF;50! soec_Z\]cmt (8IYan{rdQC-x`N<- #6La{ '=Kam|rY8kE&  !5Lez -AN`k|yvlmjgfdcYTJ?6,# 1EZnnY?(%*288::82+"  )2=ECFC?6." meXUQUWbnu  $#().*.119>GMSW\`]`__``^`Z\PN@7)! $'3:GQSX[VQIB2)yk\RD<9326@HWfs !),6;CHRWafnpvytvvv}yzrdXF5$zqhhgjkpwrywzx|z!2=GOU]^gku}{j\F5n`SI?<760/'%$&,6GP`n{-EYryfN4qT;$ ,=Tj{ '(24>GLVdl}vX/ mM/5Ri$0=HN\dsywcQ;+mT7# 3L`{ "((-.03-/*)*"'++5<FQV`cidh^\K@+~xnjdb_]`^fjq~ 4GTdrw{teXD3 .4<=?;90(uje^^`dmx ->FKRUZ[XXRME7) +:CPX``c``YWSKIEC@97.)  |m^UPLLPSZ`is{ )268740+$$    wqnnp{'2:HR^blpnqnqojfaZPI@1+"! ~lZM?91//,07?IV_py*:HU\cbff^\TPIDA97//+'#" }p]TKF??@AHOYhr-GUjw{tmd`RKA<20.'(#% !{k\I?3..-6=N[r */67730&" $0;EGNQVYVXTTPNC?1)&()(&" {xww ,05:?DCKLRNQNB:* !!'!rg\QJLEGHOR`gz #1GUhs~riZO<.iWG6* &0NXkx#6L]npbL='{qkdbdgmq{'6<LR^bhhjdbYTL@90,'&'$&%(#" ~w|{  $#,.7>KQ_hsyzeWD1 '4EP]loz|wwmh[RC5#}lXN@<8;CGS^o}!,4>ELUT]^cab^YVIH@=:;::=773*# ,B[o}vgWB2}vpa\PIF?B>EJU_o .?Qern`MB0&vulojmmnrt},<RfyvgQ@0 $;J^ilqunmfcZVJA6$ &',,'# 2CVcr{}~}rmaWI</"0<HOYXZQLA- qg_]]`fq| !$ '0<HT]gpqvtoi^VK<0 ~~x{y}+DM\aifjabXULID>=99<8<9;7712*)" !%('*(*,'('()&'$#!!+39BGKIJEC51&  *0:=EEHCD85("|xx{| '9BSYgkrwrtrqohg`^XOG;-    )-9BFNOQRMIF<81)  }me[UQJKMSXckv~ *1<EKYbozupeVK;*wkjcecgflnnqt{~#.BVf{saK5 wgTJ;7043;J[akpnpnni`]UQK?<2.$% )1;DFONQMJA9/vsqmpv,4?HEKHIBD@ECLLQSNKC;/'"2AKY`irpuqplhd_^SOJ@5( {wprpvw}~  '09BMWZbaf``ZPG8,ytqoty!$!$(&)11<AHMNQONLCC;<570.&! ~scYMIC<<;@DDIMSZ[gp&@Wexul`YKC9( yre_VSOPQWbix%1AN^hx~zme\ME90%}vttsxv~  $(,.24422.-('   $)-36=>B==4.~y|{%+9@N\alorqmc[QB6( *2;@INPSWRSNLG:6*& &6?LQXX[\WXUVVRROOJIGBA>;750/**%(&').+,)# %,0547240'# !!&"('"! (.4;<@>C@A>>>87334.1165<@?DEILOQQTPPHD=0' &0CLZ_gifha`TOG<2(#""'&($"  !$''#$!!$$'04>IQ]kq|}sdVA/.?J\inz}~~use_PJ:4'!  "$(-+--.+.(,&'$ "-6@CJGMGLKJMMQTONJD>6,&!*5;HNY_gmlrqsskk`ZOF8)  -6AJSV\]]]_X[UXSVSSVRUTVXTTPPFD:5)"ud]RSQNUX`ht#.;ALT\`dgeijps}vdV=*|nhd\Z\VY\^en}2DO]bhinjmfc_WSORVU_eiqqtokg`[VLH@:2"p[?0 -+ {rmggafemmuw'6>KUZcjopplaWJ<0  !--3..+!      }vrqprvu{}'.>COSSUUWVY`^hiosruxqsnnebUOE7-#      %,8ANY]hinmli_YNG8.xtrty}!0=LZ^ggkfifklrx~pi\M@1& '-6<DGGFE?;6/*$ (5>LXfluyxxupka[QNDA<3/$ #.7=FJSU\\dac]WPHA1'#)8=KTYbegha^WSNFD?>9844.,)   #(44:330$  #-27:;;<<7<:;?>?63(!$(033433.0-'& '.8GN]gt}yodYN>3$}romhnq{ %,7CSam}|l[J7'zmgZWQHF@>9:<8<>BGIOU_jt #5GXcr}ui[J@4-' ~utsnrqw}~&8Nbpzolc`ZRLHB=3/("  %/1;BFMMNJA;1,!"! '*2:<BDHLIJHHF@<51+"(6?LWahosstqqmjjaaYTKC7% *9FVdmzsh\MC81%"  %)/78?BJJPQSTUUVUSQPLMFDA::8202'&    %((+/,0/34178@AIOQU[VWQOJFA<42+$  %)%&    %+.)(  "#)),-053::ABDHLLSVSYWYXQQIIAA:<587451.(# %/2;?>=;:8-+! (9@R_ixxsicYSK?9,%ypf_ZQQMQPW\gt&-5<:=:<8737140/(% $*113-.+')*27:AFLKPLOJOHJJECD98.*! }#'//55:<8;985+$ "&+.42;??CCFDFA>;0*!  ##-,2200.)% $3:HMW]afimmgf`\WNHC?9812,,'%" *=IZdlpvqqh`WH?3,# mcWQJLJRXeoz$+06;?9:786579>EFKQX]gmqy}xume[J<)xnigkmx #05@DLLQSRUU[]\^\]WWUONMNOJKLCB91(|jXE=50/5:AHS\hv~"3=MZaiouw}|~r`Q>- "&07EJU\`fkoorrki_YLE80'}urru{ #&%)'+,23;BFNSZ``dcdd\YQKA2' )38BDGH@;1)  #)'---++%  tmdgiq{ $%*$%*3>AE@>5/&  ),10/+" (.=COV`iimklf_[RNH@<50'% }wpmihjgkpw&.4<EGOSVUUQLGA?9:9::=;92,% ",/6:=?;><?>DEHGJGHCC>86-*|} #!$&   &+7AGQTZXPLB=4)'!!"  )3;AEEB61&  %($#  %,02;9?9=9:352-,&" ),4767863502002+(# ! %+47>?C@B=<54,,#"  wk`[YU\_jt1>NXanuxvppjigaa]]XWPLD6* xibXMF@>=>DM\k3Oay{xplg]WOGA63*'#  mYD-1GYv1DZk{~si[TLJEFGDGCF?A:84+%,4>FIPPVSVRULLCA72&  $.<BOV\b]]WPI;5%!.APbn{veWB/ "*0411*' #':Seyxj[M8* %.142.'" !((,,-(&   $/6@IV^dlqtssohaUJ:+ 0>IRZ`fdgec]WO@5& "%% (2DP]coptrogaUNA80"  (/06799/-$zwqiihlr{!%'&+-49BFPR]]fhgfefeacbeadd`^XRF:+*.:=>?<;9164<CHV^ktw~}undZO@3)whca^bkr #06AGOV^dlkplni^XMG:5-" $.>JZcpz~}wjaUD9+#")36=?<;52&$  #'26:<9;663,*%$ %+35;;>=A>BBC??=97,' #-4;BAFHMJOORTOPJG>5& &>Oeq|tqifc\[VQKF<93+'$%$&$&"$ *>LXdjrquopifbXTKGA=:4646731,'" wpecaeko{.7CHPWY`dknuxuwsqkif__Z\X[Y\_^`]^ZPI=1! $2<@HNNRSYX`dgmqwwzx{srlaXOD5+ #07CGQS[]c`gfbd^^UVMLDB:71.%# %-:CNR[]b`c\[PJ;1! 0BP_mz~ogXG9(".5@FQU_dgmrx|}useVG4"&;FXdnu|~zynhYQA7- "*-,--(%   #%'+*04;BDMRY_]^ZUM>3%   )6FS\ekrquophg[UL>0& '4I]o}fM4.FXn~jXF/  &&%# #,3@HT`fpu}wqd[NC9+$$$)'+,)*(+'&! %0/559;=A>BE@B?A?CB@CFBFGNO[fnz~m\I6! ,:GR^hjllhbVMF96/0-13<BMZduviWH4"{{| *?Q_rxbE/ '/514/-(% (6=JPZabc`\SM?5+   -4AGOPTOPF<0#}zuw|':I\hpwuvrpgd_VVPRLMIJEG@C@CFFLMQSYY^]__WRC7$!-3>AHONQNJD8.    !%#"(9FV_holoie[NE90'"%,/78AEEHGGC;3) "-=IUaiqppmb\OD6- | '6ER_htz}yoj`]VUQRMMGE==3/*! +7<DIPUZ^edgb`VQ?8'  ,8ANT\\`YVL>1!&1?IWZefnpuxuvnl_WG>1" )0<BFIGDB61& !,1>DLSY`_ejmxyrdSC/ z}!0CXh|lX?*uniea`[ZYY[X\ZY[]aelv~ !0DVi~mUC.(<WmveVA3-4?GQXY]ZZSNC;/ %$)+35;@@EGLNNSQRONLDA<83.-(%   !&$! ""%   ,2;>DHFHFHDEAA83( }|txw}$,298>::0)! &8GW`knpqgcUJ8(!(+$#&8NYkq{}~ysi_QA/ }y|#8Mezq\N@1' tfSH<412:?Qbz*>Tjw|pbM>,xoe`YZW]`ju} *8ELVZa^a][TSMMHLKQRZ`dmrw{ytm^SD5%%--.*%",0320)&  %,7DMXelv~ul\P=+  *.9@AD@@8/%)8M^o}zo_Q<-%6HWdr~o\F0  !""(6LWfowwxsmdTI9,  '*46=@GKLSV^`gkkoopme]QB2  ,26@DKOY^lu~mS?&xbTF94-./5;AHNUZcjq~ %/<IRcohT4zj^UJIDIIS[cp "),8AQ^kx^; p[I4,#""'28IUdt}/DWo|iR?*'/=GT^dgkfb[UJF<81,( "#)*/02502/2-1+-()  "0;FPZbdkmommlee`^ZWYZ]]`ad_`WTIG:4%}qd^VWY^gr$+,/..)'$ "(,4;=BEKNKIC@4+'4;EKRYX[YXTQKE@5/'!")014.*$#/<BMQUTQJ@6+!%4;HNV]_egmnstz||~}|wni^YLE93& -:LXgr~vg]MA3{wxv~&3?K[hx|sg]PB2#vk\TMEC@CEMR_iw )6<FGMMQORPSPQNJHECB<:866/.)(! !,;EMUZ`cdc]WOF7+#'35<<8932-)% !#%&$wh[RIE@ADDLR_p{+?PYglropiaXTGE@@?DELMTUYY\\WVQLF;4)  raRHAEEP[gy '4=IMX[`c`b`]XQJB71%# "%+(,)'{qea]\X\^elr~*39<=>84,%  !(0498:83-&!  #(1399:62*uokjgjhoqw} +8CR^kx}}o_P7$ l[H?5,-.5@HXgv "+.8>?HLTXbfrx|iS;wT<" )=;6+    &-,.-,'$   $)0147363501)'  "  |lZNA<845761-06BKSU]`fhkmoooppooljg`\USKH?;2.# ~vmjefdhioqz,<FR^dlpuxx{z|z{vwsnkjdb]\SOI>5* xtoonv{!1HWjr~wtleaXWNOJJHCC@B==;50)# tj^RNLPR]gx)8GWbltz{~yzrpgd[WPFA>88788<=<<980+&1BKX`cjilhha]UQID;7-'  &,/388<>:950*  */8;DEMOUZY^^`^^[UPHB:/' #3@OWaeljnlebXQC:)  ,;GV`jqruoldWK>0$%'-.22/--%%!,4AKR\aillnnfa[LD:+! }xqpjlheeeglmx&3>DLNPKKB?51&" ""'(..240/+(   &(+,%$    ## #&.202.-'# xpja`]_aems{(6=GKRRWYVZY\XYVUNNGD<90)~wpniijgkopx +6DNS\]a`caa`]^\[\XXXQPJH>7* xm^OC83***(05BM]k} +2<?HKQVW\^cahfmkqpssomgcXPC9*y|| &18BISZ\agdgcd`YSIF=50-&($&  #%*),-,.259?DCIFGB?85-*%%$ ""! !')/249:?@@CBC@A=62*&"! )49BKLQRUWTVUWUUSRPJGB=6)!"3DP^er{|shZM>3& ||w{|&6JYmy~paPC0##3?N\hq|tgWC0 zz{ $'/37=AGJHIEC:4)" *+13737342/20466:;=<?@;;76.+$  !+/6679688:<?@?><54)& '4<GP\emu||ujaXH>2*{||}#).497<>;98/,&  $3;@IMNPPSRNMIA:2% %&())*('&  $3AJWdirz||xskf`TLF93,"   ",36>DGMRRTUPOH@92+'  #).253666621--**),+0.220/--()(&(),1/323.+" )*0134534232110*)(#%%&'+*,()% ~zvrrtv~~#4?Q\hv{xobYJ@2#  $/<IWemyztjcWQJ@=55.,)!+7FOZcejmmoihf_\USME@70(   *6:EKV\fpu{~}}xkdWL<0$$1=HXcq{xpcVK?6,%9H]loaRA. *=N^ix}pfYG7$"0@Nap{~tdTC2 {wurptt}'6EScl{}tcT=+}~z0@Tg{wiXJ9,~}{xwvxuzw{xutppnjoqy%4AMZfmxyyvkcXH<- +>FS`dot|ythcTLA2( %)148:;9:1/)""#(+/-1046364624400.041648;9=:==7:55.)  &&-+0.32424121,*&'!!  &&/1:@EJJRPUUTTTSPJHCA>9:78661-$   $+0;BIORTNLC=/'  '+68?EJPUZ_bfedaZVOKF?><=>:953-*#     "%,0250.,((! $2=JS_fpvy~|uofaUOB<.&&5HUfst^L8#'2<HQ[]ehnsqrpmjdb[ZXRRQMKIFC:82'##(148774,)   #&.049564510/)(#!  '+4<@JQ[diquxzzvtpfaZNG>6."~~~ %.:DOV_blmuv||||vuph`\KC4'"2=N[js||xkfZRD;+!",7AGR[`jpy}|wn^P>- !%,0;DQ]mzvfUD0 ~ 0?KV_aikpspsqonf^WN@8,#  (/7@ELQPTRQMFC95*$ )/7:AACC>;50)   ',45=;?:;6-)"  #%%&&*..46?EHLPPQKG>6(   '*4;DLOWVYWQKC:1! +0;CLVZdhnqtswrwpqnid]UM?7-# (+79A@DF@?94-! "/3<>EFJIJGHCA;82.)"      %('+*+*%%!   &*3:=CEJGIGB?973-+('%%%!#!!     '/9@LUY`ceheca[XNF>6+% $,0:AKR[_jnpuw{z~|ztqf`UI;- {vpjgcdgdmq}'7CS`n{yo`QE6*'2DO^kt|qg[NF;4+   $/9@HKJKGJCD><;3/*&      #&#'&+*,++&# #"# )4AISYXXRLC<1*$     #,2:ACHMU\^gnqvturlg]SG<-# '-6<=CEFHEHFHFHFGCCA95/& #%*1278;784,&  !*-6;DMNUVVTJD8.&~|%/9FR`jqy|~}{ywttpjg`]TNB:0  !    !""$$#$&""% ##)-*/.*'  '-48=<72(!   $($'$# (/:>EHFGCCA?=<;:55222,---).-01669><>?972)" &)-/02221-,(&   $$+--/046;>=@>=76-)$  !%'.08;=@?@=;42+&!   #&()*')'*.06;DJMQRUQPLB<5'",;DQWbhkqpustrnlhga`\VTPMIA?75,,&%# xsnmnkqv)3=GOX^^b`b`ba_`_`_`^`_\[\UTLE<1#  (5AP]kx}q_O?, '2BJUZcchfifdbXTJA8.* "%*-278>@GFKKFFD>940+$ "19EKUX]Z]VSK=2& +1<BJKPPLIC>50&  "   (0=FRYcijlojgd[TJ?4# {tsrw|    #!! ~zxxw{#-3<@HMPSUVSSOOHG@>74,,&(%((&('%% &,0568732,*'   %.1:AJNU\_cfec_XQH@5-" -;ERZdfjicb[YSRMMIIDA<3,$)3@JT[dfnpuuyzxwtrmje^WQKA</( %/8?HNUYUTMG<3* !,5@AEC@<2,"!'/1:>HLPTW[^\]]WTNIC72'#  &,237:6<8;9:920)$ "%+-365::>?EIKPSVVYUVTNMIGC=:3.%!&.8BHSYbkmttutqofbZVMKGA><<:53.($ !&(/3;@DJMTXW[[\Z[ZUURQLMIKHHFHDC;81( %29CHPWZ]dchghhba[XOJC60$}~ .?L^ix}uiaSL?7*% )7IVblu~~~~yvoi_VF:,  %)0369:8752,("#',.404/0+-)(&!    %"'')')&%# &5>KRUWXROGC:61/-(*'('$$!!    '--2//,$ &)15:?=A?AABBGGOSV_djorwwzwwtnjd]VI?1& ~tohijls~!)28@GNSX^Z]YYYSTSVWWZ\_`\\WRIA4%%*47<>:<:<@=CEMNY^aegkjllihice__ZYULF<4'  '268::<841,(  "!#!#!))15:>>BEDHILLPOMPMPLOKLJFA=4.%    !&.59@FHKKNLONJIFD@83/"  %/8EP]eq}tgZH:+$,7;DHGFCA92*&  "/7EOU\^``XVNKC?=6722++#" ")/1:>FJRT[_adca`YUNJF<91.''3:FMV[diqs{~tmd]PH90#     &4<HQW_fgklnngdZSF?/%    *6FMX[bc^\UQHD:8110/45<CEJMRQUSTOONKKIGC=92)"    !&(-*)"  &,28ACLLRRPNIE<2)   #""  %3?FQW_eghie^YNF92'&2:ELRW[acfdd`YRF=/$  #!$%'&&'"" #*13:>DEIGIDC@61&'/6:@BD?>;64,,&('**)--339;@?BC<:3,# */9AILRYY^`dehgifhde`a]]\Z\_]a^]ZPI=3( #)+268=@FJKPRTSTRLKEE@=74*% $$*,23;=DJLSW]bdiloqqqnld^SJ;1$ %+5<>DHFHED;7.&  %)3:<BEKMRTYZ][[WMF9/  &(**%#    "&&++(('"   "',1221.%  !$)*/-*&  $(/07:9<=;9863-+'$!   "'*,1478<@@GINOTTTRID90"   !09HQ]finlle_TJ>2' $*/*+# %6AOXckorsrqje]WRHC<:9476;:?AADEAB??>75.+" %,6>?BEBAA;:53*(    %.3:?GIONQNNKB=4,# #'&(%$  (0;CDFB?4.!%()&!!$!" *4=BHHKHGE<:1-"   '4CJSXVWTLD;0$*<N^gtyyunf[PE9,! "',/23-+% %,8BOXelv||~zwkcUC4#{xyy~ *8IXdr}}ofYH;-    '(019;BBHGIEC;6."%'-+*'!%*(,+*& ).78>?>?=><7720)%     &'--113331-+"!    #*6AFNPSRPLD?82(#   '4<IRY`fkmpsonjf]WKE;.&+:HXdmv~zraUE1 $2AQ_jw{k]M9'$'/288<9:43,"   $)2:BNT\ccec_ZOG<3%#*5@EPV\]_]VPG<- $%())(!       %4>ENOROOFC:0)  %0:FIQUWUTMH<5($2@MR[\_ZXRJD<71)&   # !    $''*+.-.+%!$-6@GORUWQOF@:,% # #" ! ##! ! &29BFMNKJEA8.##-4?GRZdkt{{~{xoj^VI>/"&07CJRV[[]YWRIA:+#  $+7BIV]hkqsonid\TN@=2,$  #/5?GKRTWTRNE=0'   /:ITagst|y{wpi_TH6*    %,/57:9:865.-'% &3:GNSY[__\[ZXYWUUTONG?6.! !%,46=AHKRUSTOK@7( #()(&! )1<CMMSRNJE:2& #0:BKLRSVTVTMIA;/) %4>JU`fmotswssogc^TOGA:4.# ~wtpkjhkmt}&3<CLSX[abb`]YOI:1! $/=EPVVYUSKE:3&     " #$ ! "%(*,(*'$!    ).7<BHILJKFC>72+&   "$!"  ',059<>CCIGLIJG@:2' "")/5:@ECFDB?=750(" &,-1344799=@EKMWZdgnstwutmja[OG:0  ".>IWcjsxyzxurhaWPA8,';Pi{yhTD2$ .AL[cmpvwvxuuqpieYQD8+&18CJT]`hmtw{~|~~xvnh`TL<3$   $-7<GNY^hnrvwyvumiaUM@4'vskkklqx %*+04;>EKMVYacghjkc_UL>3!*4@FMQPPMH>8)# )7IQ]ddgc]YLD7+)3@KR\bioptuwutqie\SJ;.! &/29<ABFEJHLKPRSUZY[[WUKF:3& #1AMWbkmrqronjgf``\WWSTQOMLD@:/&vl]YQPQPW\go| !%,/589<AAEHHKLLKJHHGEEBC>?75/'! !*-37687710(# (/7=?AA@;:3)$   "%'+/359<<?@EEJKPSRSPNJ@;1+!     $'.226698:9;8:99820,%  *1;=DFDC?<4/$  )/:@FOT_fosy}}}zxplbVK>2!||x{~!&.38ADLQX\beehehdd_[UQG?4)|qe^XQQSRZ`iq| &+5:ELV_emtz}}yog[NA. |~| '-4:=BDIIMLNOKJFD=94.(%"   '-069?AGJHKJIGFD=930$  !"((**+))&"      }{} &)/03411/.*)$! " !   !&,-0402//)(" %+27;AACCDC@>961*%"+15;@FGKMKKGE?;7-)!(.5;:><;7/,&"      !&-.311/*'!    !(-.121/-)!  %&+,./////))%#  %.5;@GMOUZ`egikmnhhc]TLA9.   +6<FNV\aea_VN?0  $0=FT_jsy|}yumdWMC5) $).424674746746322,(!  !"$$%##$%%++24<BEKNRRURRLIC93*#  #&,08:?AEBC@:70+%  &.4>FJPRSTLJD@84-)"  !!$ !    #+-11200+($    '3>DMS\`egjhic`ZRLD>71-%#  "'/38=:?=AA@@@B>?<63+&||{{}| !!$$))-/353562/-*$!    !"    "&)-,00202.1--+()&%!   #*-379=?BACAB=<650-)"  *3@FRV^]`\]XWTQPPQOPMNJGC82&}yyw|"(15<<@A?@@@C?DDGFJJKIJHAA<84.)! }}z,5?FINORTSTRSMMKFDBCAEFGJOMRRSPQNOJG@;1% #"$#"# !"'%+./47<BBGHLIMJHEA=61'  '(-/.113588>?GJRY\chilllkdb[VMG<4* *1<CKOVYYZYSPIF=71'  %)058;>ACBEEFGHIJJKKKGD=6," ')//31+)$ +7=GNUX^bacab]]XVSNLIFC=:51*'%-29?AFIMMQMNKJF?:2," &1<@JNTYW[[[ZUPKHB>9/*" !&,/35140/)%!  %)/28<=ABEBD?A==9::8:89760/)!  "+27>CKNPRRRPHF?=4/*  &,38=>AB@BABAB?><52+'  $%)*))('##   "$&)),-*,)(%$#  $,2:AFMQUVWWVTNLGEB==<;;88933-+(! #$)-/36;>>ACEEIKJNOQOPKIA=4-"  &&,-46=@EKOUY]bcffgde_^[VSOHB:3+   )-7:DKNV\bijpruuvtmi`XME;-"   &',.5;?FLSX^cbfgegffcd_]XOH@4) !*/6<CHKOPTTUTTSQOKIB?62&  $05@FKQTZ\\``efdfegd^\UOE=4'   !"'%*)+**'$!   "!" " #)28>BBEEECDB>>;:752.+(!&+5:CGNVW\\\]WVPLFA:/( +6DQ[enu{|~}}yysqje^SI>4*(/9CGOTZ^begijjgea[PI=5( (4<GLVX_`dbb^_YXUQQNOOLLLFD@60$%)-0588=<@?B@@@;94/&# $,2:?FJKNNNNJIEC?83,'!$$)*./366:;=;;981.'  ""&&+),*-*.-004599<9<:754-+&#   %,04486:;9>=BBGJKNRPRQRPKHC>4/$   !&(,,216498:>;>@?AAB@@>>862)%  (3:CKRW]aadeefcecddbb`_^YVROHE=80(# %-7@EMQVW\[ZXVUSMLIJHJJGIHDC?<50(   ,9HT`hpvzzxunkfd_ZURIF@;3.%  !*5:BEKMOOPMKJCB<<750.*%"  $&+,11566746221,+()'(')**,-03010/-(%!      "(+03378;9<9951-'#  !$"$  !(+0/10+'"   )17<ADEFGDEEAB?A@>>==>;<;:930*%  !&*.37<<ACHJOPUUSSOLF?7/' (5<GNT[bdimqttvxyxxywtqmfb[RLB;3& $,2:BELPUWXWXTTNLFC?951.)&  $.8AELOUVZZ\[_]__\[VUMKF?<650/+)%%!  &+-2759797511,,)+*/2279==>:931)! "',3=AJOW^aeijlkjhc_ZUNJFA=:8531-+'&$  !!$&*,,//1,,(!    &+/35745//(&  '-6=@FJMPNPNOLMJJHGD>;4/& &.5=EMOWZ^`_`a[XRMD>8.'   (/8AFMSY[^^XWOKC:3.#  !+7?BHIJJCA;6-)   #*+148<<>?@?A@=;864.,&#   %*),**(%$        &,1443.,$   )07?FNVX^`eeifjhkhjfd]YQF;."  %(.22568878550/,&% #&-/45::>@@BADADAA@>==9976320(&    $.4<@EFGGCCAA>?===9:43.*&  '-.4576842.($   )15:>BECFCEAD@B?@=<;751/*)'!     "&),.0233401/.+*)#!   %*,259=BGFJIJHD@92)"  ')+066=BIMPXZ[][[WRMFA;2,$ "&.6;BFLMQPROOIHBA:5/,'!  $*-36<>@B@B<=81*" ! !! ##&%&&!"  $*17<@EDGEEAB=;54,*$"       %&')*++-(*'"      &*/28<>BFJMNOPQNNKHEA>:73+'   ",2;?FHKNLLHE?;3/(  &5@JRY^_a`b`aa]][[YTRMLEB;931,*'!  &(,-01000/-.+-))%# "'.065:68531)&#      "#&&()%&##            "#&&+*.+.**%"   (,3687968564333///,,)*($#!    '.47;=A@DCCFFHJHLKONPMNHHB:4+%  '.6<ELOVY]`^`][XUQJGC<72.*'%  !(+0559:::;9;9=;>><;872/($    %%+,14476531,($   (.9<FIMQOSRRMLEA70%     "'-.120.*%     $+36=@CECC@?972+'!  ! ##!#%"%%'&()&&'#"!!  '.3;BEMOTSVSNKF=8/*  );L]jx{ska[PJ?9/*"  #08CGOPTTTTNMHD?<63,(" &.16:>AEEDDA@=<650*&  %(-.//*(#    "%-14867543/-(&!! "" "  !"%$%$"!$.4>EKOSSVTPNGC<81*$  $(14<?FKMRTWVWSQLD<3) #"&#'%'()*/.359<@DEHIKKFD>;4.(  $'*,,.,,*+)'((*++..2267585632-+$  #+27?EJNRTVSTQJF>80)#  &+179=?BAECDB?=95/)! *1;@GLMNNMFB;4*#    !$++/-/.+*'&!    ! #$&)+,/0211.*&"    #*239;<:970,%   $$#"! (4;EKQUSUSSOMJDA;83,($  "$(*-.++)'%  $+/47:<9974/(#  #!%$!      "&**,+,+%!  "&+-,.+*("   !"%$%%      "%&,.5<>FKQTZ]^abc`^[SLB8,! !(19?HQU_djonpmjdYPC6& '19EMX_jnuvyxupjcXNA3& !(./457564.,&"  #)-2422.*#  ##%"!  #"# !).499<<>:;63-)"       (.6;ADHHHFC?;3/(#                $+..000-+*%!    #(*/37;=@ADDBCA@A;<;8744//)&!  ""$$'&*+047=AGJPSSTQOIB90% ~~~ #%%*-26<AEKPW[aefhife_[SI?1&   !'*/14757654.,'" )2=GMUZ`cfeea[VNC:.#     %%##    !&-39;>>A?<:730)# "*.24520,'    ',/3587864/+&  '*128:=?=?>971,"  "(17=EFKLNKJC@:/(   ',06;?AEDGGA@:5/'          ")-47<=@@=:62,$        #$))-,/-.-(%#     &(./353656846322+)#  "#%&$%#$##"""  !!$&%)+/168<@DEJKNPNNLLGEA93-"     $(.25:>ACAA=;2.#   &+17=AGJORWWZXXSQKC<3+     !(,2478::7621+)%        !#""    ! $'+/,-*'%  $&+.15241/*'   #*-13675740.+'#  #&-.3132-*$!   !"%(&&""    !&&**+''!  ##$"!    &)/459:<<==;:995431/,+)$"  $).379=>BDEGGHGGCB@:82.'  "*15<AGIMNPQPQPRPSQTSWVYZYYWTOJA9.   )14;<?=<9843/-*)($%!! #+19<ACED@?;72-)#!!$(+/269:::::54/+%          #%(),*+'("!      %')+*+***('&&%""!"!!" "#%'**,.++)'# #'-/2435443/.*(&!   !*.6:?CEGIJKFE@<5,& &+14;<AADCDD?>;84,(!  !!"!!             %08AHPTZ\_`\[WRKF?72*"  !'(+,./121222310///,+)'%%)-0253657588897;8<:=<?ADCFGEFB@<4-#%)),-.-.-**''#$!"  ).7<CEIJLJJGC@=64/+(%$$#"#$%&#$"    %,037;>@??>=:73,*#! $-06::<;:92/)&" %,6<@DFIIGGBB<941-'$! #*4;BGMOTUWVUTLG@91(  %,6>FLSV[][ZWSOFA:0*! #+1:?EJLOMNJHB@:1*" "(),+,+'%#         !!!     !"!#"#"  !#$%&&#!    %'*.279>??AAA@?<<74-(  !"'(+-,-,+'%! !&,2489<<:9731.)&   "(,2478:<99743.,'#   !"   $(*/3355521,*$!   $)-.000.,)'%  "(*/14478788897866531,*%! "(+169?BFKLNOPOKHC?90)  )17@ENSZ^`deged`[VOH?8/( "(,026878774410.+*(#"     $(*.046575531.(&!  #"&%&%$! $(-001/.*)"     !#     '/6=CDGGHDC>84-*$   !"$$$"   !$$%$$        !"!#!!   ! #$&%($%!!  !$)*038:@CHJONPMLKD@:6/*$! (4=HMUXYZYWUOKE@92+$  !*7?JR[`gimlljgb_ZSMF@94.(#   !(,279=?BBEDFEFFCCA@=;741+("!'/5=AHLOSUXXYZVUSQLKHC?96/+$   %&,/489=>@>?::41-%!    #"$#$#$$"$"#! !    $%)*,**'#    $'+-/101001/0//-.))$"  !"%%$$"!  "(17=BFKKMKKGE?82)#   #(*('#      #!"  #()-000..'% !(07?EKOTWWZZZXXTRLF>7."  $)04;?CFIKLIHD@83)" !)4;EKT\`fimmkjfb\SJB90$ &)/27;;>>@?=<872.)"   $&)+//3254664310,+'%"  !"!   $)+/2245563322.-+%" "&+,11436656333.,'#  #(.48?BGKNQSTURRNKE@90(!   %)+/03242310/*)%# $'+.--*+&%       #%$&%%##  !#&()+**(&$ !$+.36687750.)$  '.169<?<=86/+$  )/4:>BCFEGEFCBA=<9641-)&  #"%$&&$#"    $(,,/022313//,+'&    &'++.,.++'%!  %)*.0354767653/,'$   ""$#%#$#""  !"         #%%&(%&$%#$"#!##"##$##$%%&'(&'''%$$  "!&'*,04487:89742/-)(%%!! #-5=CJOQSSTQPJHCA>:85522//**&$  "'*/2679;::99731,*'!             !      !" !  #&%()))('&"   $*27=BCHIKLJIFD=92,#  %/6>BHKKLJIC@94-$  %07?FHMMOMLGC=4.&  ##%$!  !$(,-1255879661/+# !"%&'&'$$#!##$%(),//3366757441,*%!    ##''(*+././//+)&   #%(+,,*)&$  #%'*-/122311,+%"    $)+02558867665320-+)$   #&+.24355432//+*&$!  %)*.01210/*&"    !%&)(*)*)++)*)+,+,,,*)'$"  !&)-0478;<>>@?@>=:962/+(#   "#(*-/23656632.+(#       !&+/488;=::8520,(%!     #%'++./--+)%!      #%'((*&&!         $)/278<;><=9831,)%!  !,6?EKORUSSPNJFB;81/)'#!  #&*++**&&!              #(+/144531-*%    "#&'**,.-//10232456855320*(# "&)-/1313220110001112/.+)&   !$()--003477:<;=;=;<::;898775431,*$                      "$()++++('##  %)0379::7640.(% $(/38;>@?@>>=::77553300.+)&#  #(/4;=CDGFGFB@<82/*$   $%+./10312/0,,('&"!  !"$$$$#!  !%,04799;9741-)#    "(03:=BEGGIFE@>92,&   "#%%'&&$"!  !%+/46;<<<;:7621-,)($#  !&,1145532.-)&"      %+/1475532/,'$ ##%$%$"!     ##&%'%%"   !&+/369==??@@>=972/(%  #(,14779773.*#  $%((''%$     "&)*,,+*'#           !"""###!    #%),/13556443/,(%!  %).2244430.+)%#     "%)+-/..-+)$!   !      !#&%&%%##  %'+,./--*'$"  !&*/46;<>???;:640(#  !#&*,.0021/-+(%    #%''(((&%!              %,058;=;;74/($#(.2687640*%                  !     !!" !    !#$%%##"   "##$$$$$""        ""%$%""  #'+,/..+($  $'.068;><><;840*$               #&(*+,,*)%$ %+-0366866420-*%#       "&()++++)'$!           !$)-/247889:9978551/+&"      "!!         !##&'%&$$!    #%'(**+,+,,+**'%!  !#"$$'&)*,-.///.,)'$         !""""        "$'(()((&'%%""  !! ! !!    %&**-,-,,**''%##"""!! !       !%%'((((&%#!       "#&(*+--.,-**(#!   ##$$$"   #'+,/010-,*%"  !$$&'(()'(&%"!  #&)+--.--,)'#"                  #%()+,++**((%$$       ! "!!  #%'(''&%$!!        !#&)+--./,+)&# "%'*+..//0/0/-+)&#  !#$%%%##          !"!"! !     #%&))****((&%#!               !##$$$$"!   "#%%$$"!            !"#$""          !#%'(()))(&$"    !!  "$%''&$#            "$%()++--./-.,,*(&"    #'),//223310.-*($"  #$&()+,----+)'%       ! !     !!"#$$%%&&&&&&&$$"   !   ""$#$$""!     !"#"$$$#$#"    #$&')*))''%#   !%(),-00323232/.+(%          !%&(++-,--+,*)((&$#"!     "#%'')*+**)(%$   !#%%'(''&%#!  "(,/358:;<==<=;;8742.+'#   ""$%'&(''&$#!       !"!"   !#$%&&'&&%$$#"!   !!"""#   "#%'&''&%%$$""!    !##$##!          !!!                !%%''('&$#   "$')++,,+**'&$"   """###""                               !!!    "$&%%$#                                       !$%&''%$"                        !"###"!                  !##$$""                     !!!                                                                                                                                                                                                              hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/24Ride-3.wav000066400000000000000000023437201366722712400223140ustar00rootroot00000000000000RIFF WAVEfmt DXPAD dataз %Elę37LG%d}l"]ͮ&~<ސbEy׷M - 8*1+40# 2DV WO+'. זzHF  !!d *  xc1+ Mf@Tf 8 X*T m; |Cfp /!D ~l0(] #F {>v73J R"; { U /~  % _k+c`d !I2-+Bh% " Owm DG1 @ {y  !4 u% G/:7 R  % k9Mv>/>*,Owq31 t%dK "LX0) fN  ~+x o H8[ A,nM>o.? J8)^TN  K ;q-o JX3  R i!!x o.SEZLpJ/zZ"e  GGt`/ )gES<; 3 X10C=^n=*D6R dgJ-~Ve^Uzmup  . eJ K 3: / T`zj!= z0Vw&4D^U^\<|Xq>?3B &L e3t jFv ~ [- F)] 0-h{ gt-ew!97f ] c k0t  b  X8 yT [v $ :>nA +F j3(p7 y y*E Kp$5`v{    z s r1o~a b.#P >]S Vsvzf3X{cD[ 4Q %B:gpyFH WzT  k .xzMc6[U  qE  k<XVy3"d s  2e soN469MS]%d84L>C  4Wg}Sx}. -SU  O = L{aPSgz1 4klg 59n H M8XIK U#FG)  )+WwW B&.l#  Pc sK'2H$ oIDi2 > !;q\v6)3sb Q.G=x(oPBV1 f p:u1 ]4?A*- .,wue~0 / B 4c]_lE xzb [&# ygMF6VP =1pd_~ txP; Zml[  =z^ `BP*9T\qR rWZ1X b Pvh s{dOYbqG, YB T OVjTw\ j 0]Q8k-  /MZYxn G30nKg:>K, u85Fpd: m ! \ 12N;:OFir` p2W \|&LUD 57 VJ0) g)( \?Ffu9Q) &FL y *S6#Xq! E E& m<}d\$%SW SanJ`> nf x@ |+LyE'>/?5kpr8M&$ dW a  < ` RiN{ 0 k$^tdGT+ ak(I8)CGMePHw8b Y:W;%i~c]*Vi/kF ES )J% QNXWv @69 P f c 6D7,G6[zV!7|+ FF,]lnZ+Yq599# Q, jcm R J g[0d WMC4 f L F  J}7c sB^^ %%L]dQ2Rm^_^y}C~UkG; @B[` G'CR fis o, v>N7  e;(&:V6B7L}_8]PhUEWW:,q`  y@|7 FN\59p qBK;kemr ~ `J:  Wi` $ f#z{s 9[z&k9SeY#=@Ig & ,c H au)R1- ^2Zx V[$ " |zytg1RPLr^b] .  ^B F xpVZdvB)7 $ /^{V}6)7 RF?+ jz( Z ?7/ (\)a"Xt([H1.bAyBm9|o CiA -=7pe[,Sq 7MSQb (2 !h,4 #r 4, 6cLED ;gcRb#E21;P  QZ  {`Ex : V(;` A)Xz4H}h \xd  + fy"^(e J 5y< tdEN2-XCx*fl>X8N  z c s $hX`oeaUGPe~[u>RTje8R  a bz^bA)p ij t U &Yxk% VFj' =di X2!!W]?C uyie+w-/-b6"m3S 1 x 2"%h}6*DD7Bp)YFNFin+FZ,~_zVo ^G< J 9f"*,o( 6  :47otc.\il7J1FC06(  EOW jA4t |qy_l `0l>rpAs"hU 1A;.7pbcOYg0<Z%}~$s}9f? t 8{t{]3} ~vLTM87"_gP%y> v:pI)<s!j2xCAt  J77DBFG ! K6MTEx%- .Ut~-ZcV!=b?U3*, ba&W> )8Z:W"d  $!^?]\  ;V5eZ_Qo`IV3[PT#BQSp?FDm AZ11_Yp0>EW^ ,>+RfqC'*<(y=9+gPp!R%kB.Q ~ IR g +  EL+?x\PW%'JJ+:^a_)y? \V  v  }_8< oH+anSLi / 2M-"c/ =\ ~:?H0J!M $ hGlFG[&M^UMDYpi/M/fF$`  ?~gZNx ?FY)Y kvV|8k5aMNf/HYOj F1}U=  5Kp H yGE [fgA X%v!t gW^Jn(vI'/0D ~( /  HP'-$\dGbP?pc  ?LEEjW vdvE 3XX MLRe-;v|oAkK[FMue-e#b_^PvC  <&kfb/M>|eV&;p#}Y)UApJLI)MsjQA&+iCB  wj } Gu R*o,o`Lj%wtBA) obi } { M>wBqj$ 6`iTy|KA`zDVUxP @^ x:#f!;3 { u  :{w5Y  M? _$N=IjXwChRTd,:_.7 g c = s =  HTTv9,[yg?S5+OI)6SYaIwmT $l 0|>McV}taL\V b  3 ^O~UFux^gc!?kK$@SN\t5^#/M5t yQTg9H{67B6%xC }6EJ+XqOgHYjdMq5: i ;yW.V%Gk# F RrL Z r}si ,%t-:qM~vqNL6U_ZfG3M\; Vm  ;HGo g9(u4:umQE%exW i]X'BX5 \}  <48kES!EBA'c<yZTas7BD18B n * 7&)CT=SVqSzDVl>  v% b ]QB4q=Wjq@$m F,.7?di7s!yDy&"$xS)!^`VlzF>_1BJmk.K[C`Yu]SCf<*$ w$   9 R g(kx|,tu1tnlyS73y5{ /Lz;Zooc-VgGutUCiM72 CtdXi i'fFlZr=F M|Q$(pDzs {. fG8r~,l0?9z|# dPG F  K ;._F!-ROeL/V$/C/cfYD  $~F-gPE  #(}iXQThI@Q7YyL`=C8QkpT~733GOpnla?3<9nSL z KWt<33|$Q  \ ?P 4( f!PurXV}J C.}36abIak G' < K3OEL$d7Nj6  ;~}Xd/w) ^i#4<+z&sTEK@k =<Moo60:V4J3<|W"6tA!Dh:ucB @igxhoj.ne=&YCcJL;yo_Z?'OL=PH_{>Z; ylku-pnRfzeJFP k I2^lK[ L|.H@H4kbJQ@J/VnS'V}&#Loy\[pixDYL8J"eUS]q,boy|PeTP=s Pe[t[dk hb1}&P:=MP{?j `MneV?nDjz}MRqs`jMar Jt=6-O&AnyB}`{rS&{UpVm]`VpyRqH.&v.~3Mjj^RxlIq- is4)o;)St}~O5tQ G9Y\p| %St1 ; JH&i4  Pm8uGh!#;$ p3JHk V + W+.\|J99f)g$b. dGaiq#{x& ut^gbi,u_Fu1YqW}iK3gD ~S9m yi2)> 39,nN39'r*ojw3r~H3!:LIr)p;uU5(g(}t lq"fZ1mc.Gt"ryy#SdP3APD^dd&tT^ Z YfV A6/ P(5O?#3_E Uy1k^-xV*0\rN. `->n[:+d:Y  f]  z}01%Rn! K(B|~^V~=Vv0kNf"(8U k 2~*$D{Qnv'C.ctDpI+G Y=5?F(?W qNv'$\XU  CIH2V|/),czel.qZ|a=;1m:)V5yKw#xrmQw|JD(YgA8e|OTg1l nh[ ;tO*MExX.)^ QFHq" C1 !_S t)j8` \I:}yMT}h>du^`&qd[0;pp FXH`9Tc G}$y^| 1 ;xOz1go2:/ >B,E BWw(A{4b@Eq  MIO UtJPE'j ?YH~ mnvO@-f,Z35U* 1XHl y %H]e]h]LnFDjIf>"Hw5 > yze=W%GuT$]~%TI'0u%8>:uCN& S!NS k!T|^gO1KO&(HeBb Pn]CYxrB(Ttj3\+_J:"YK8w &\"$dz j zN<r#3[S0^mR#Ez^CoMg0kldXJa ) ILw0ctgy$P1E!W _f{QOQC fM#C#%em%Wk6u&ca1e >b} kg@M$ a S&+ -v Nvr=7vUOK)G8jemfTUf |XJ [HJwSK``BocIFMK&wK'|.A\/ s0KNsXo`Z5pc|p.x !nI*H[ LNQ;&ApHIE*fP.9Vs4'K a ~- ]S0vt!,B&V, V#Ji@0=;M?K+R7=/#6uC9.>Q4e:Husum+U+4pu\&) LSJ]#[Qh"]rsetvmT~y.Tw-\xV__[qtsk\ 1 s ,MAv7qX_=j>R&!lECBTc?NfC"x2:!s)D_&vOID?& 7^*Io(fSx{Puj$JUH%=+ o_??4 2  6]h3b\l ~V,mFEd `w6novb8{L`8N5QXC-Bf L[ a["(Z10l ":twU)I72a_KXL>H1U$J!Nk|\39P&Mbv/Re/j]M<<2J{!|G5,WF.7d~W=QJQ%- 8!WmtHS?5cWlV,A0 \E\-EOBL'NNxknih;ft/]AT)9E8xfnIb8z"o/>SyoDdhs 9I1os_NF^g.-3;SenY0wYcwrmkHw @%)*rNHOxmAa=p_V^cQRqi e qiV"}-{WK< Z# rymxS` Jc{ihsz%tRe x<-jL0n 9 S1o"`\ZJhMl u/z)x^uC,s2Af F%VUQno./sC#9LQ=`y+%-+ _Kavp$\ulN6vlJ > _4S:tX<.72y;QesBYi+'I}fls8.T ))0!N3 :mcGXzXI5j,P8j;ovGLDn>/ 0LyaDrkJ\2(\R,:0VtY/ g!yUj'prUwbPED;g ,2O=gFnK@l@9f\j8%/f1mK&R{VO(n\i"fJ(rfR&a5%Q6(]=}FIKo i` Kj1U/bIJM 52>';45Ml9GMl;|{`VWH45z*Y k?7QOn.:;}#4$oA'6SA XUouSw,Cvj$tbld.6^]llxB:bQ^szY'v*  i1`QsrE6 -Fy|AS ^F0t8bYUkV [40.^|5OS'8fKrWx{q4/\ZIhPf(^FJVbImHQ]LR$8np+{k0g[dhz<ag7X vx_6Zw ,:6i59Nt?~eK r}%^/wf/?ZI]uOT g%K?uQBU/h2#.a9I Gr$DylDbKrVxMNIW?lf4nQUGTo4u6R )<70<?>ke.vYK/q]qXT8]cU5pVfW 8iq;65f$/'}reC[&}? `\'YVaf]Kf1@:^CS:+9c@VnGFgFs#%d/ h4"PZB M  <   f6S*AxSpPAENI'WC@*l">Ec x <yn+fs}R6jGEa}4k94 mWEDz}:"  /6QB +PjI>^ qK<l^=3E3ekL70dc YL- I8")lHRFVSLJW `o;0d f~ c83=%SRBjKV' \FJ. M@#1#d0l3rWny/?Ne;M0xN$y'5Q^pUv '`&]9@]O-; <][@>Ril5~yo axv: ZCVF `H%8P(ztWGMm=_nd3 t16 ="mCDZ~YN&][aNfbX\X.oOOvT N CE6 C#i5]c&[?(&R ,E1i-J}IN,|h(3( + h d Zm*|xP#`q0~0h3YJ1MxXFqHoDu@M;  ` L .dIqNX//k{xp7("fb u:r - oe " H(s?/8ntw ;~ks*$b^Ny8'cu jCiU:Kj \t@@EzPD:H1 u,51DJL9G1.eiP?b]iYOv}&W,@y:(aMEd/]mq|=4N3|wKX$wJgEi@b3G|` xXs#.$ ]vEkR7*1 4xumV !=#xaDtz{Ll;,>xW+o|@@Ym@Qxbi )?'T"=*qKbW~ xhjyKIGqBg@tY &ADWK2#VVt,T/$ab  Ul5D0oR{T6<'M\^q.T&"u9Fha_)EeNe++0fy,ps)d. aQ'iy# \=) _^v6TxiT@S5;ms=oJM6 P\c9;0'&1'Jl`/~y?*1  BF7@RqHB[L6`a{ uT_Osj sqc\oWEesatfvfB7"Sv}0DZPy >.#kC(O d&vmcz`6;j}x&+9;;AtlA+N ]1Tw]GP"[*n" &IvssTi;nfSvYK5(OBB[`5\C&:CL\ DhNbe%q[tx%SP'N2=,+rWB<4uduwS$ T KGEz.RPd)A&Whv42iA(L qP?;xpbQ|T#eaTKyb/(*,&[V--jqv1}kN+jVj$cw}_ ygzxGt*.PAEqtz$ #KD7 "-#$prX&N,~\U+Usl JULPJ*RTd llRzVhYQz$s\tb]Gn+qn/S3Ij # &F4?4pp;h .~><u ;fCU<^3EyT 6n.8lj6mBK}$5+rUUWCo 1l\$#<{_z&Z{`K=I cW+f9&$`Vj_06Noi^c~_B>\igV3&{7;WFdW{+H9Ag:D^w1l@(tO>"l)Xn V}.}JED>uP7#d:!>iw*]@#j@X k0hxfSE2ai,ud0}24XPuO! # &)QWLxF(#9/"rL &/Y$nJ W/"D_)8zfBeyI^KK#=8 =7Lk-MQy y[Q!KE?#/{:?}@p>zhh 9Z`4\Hgvx _>6Li E#y\Euu8ST,1?>:S}yvgAbjvKOH#B8@h:fI#V9;wzu<MYQ`qz*#nLh+;;/=}e\~>ESS">lnzn@u$yX?ogKdz3{Mz ]G'k-I-t861c9A1,VI!7BucFG?KDw`H9,~* p&Ke^]V] -d/lI L5YZdfm:?P6H$#,G>yLOQ[^Z[|M VE/l,az LB= DU4^lR*c7KKA]{X 2HCjNCdFu F;\)@JXAV/K y?Y?~':Di0'z4g,TLoEF:$L`R|W:Z8 oK.jUFCv6"|_*f/',p VIv7c-2Rerned^vr2`[_hX?RorB0SGk}7ocF2PM;Q1OI0d: 7=-~&YA5d\z#8a9,@ _9Y\+ ?pgC(* KFqto|B-u: <QL@X~F<3~bG=tt?r.e^j4qBM@[[j \=V]j4cu0fW4g-9U,S&iIN Z#ZG ~ x;(XMCnL/Ej+H+n&#;-HV>O}+|\=I\zIUCq3YT `@ )`9>W9$J^'t'/ Z_3^CB}) ?R+Pb2AIb/+?a;dr)E7Px[>1(Vd'*_D,?2ZYbt$U\zG&<A1~ERpD6*j7,4logGjBL`2Nl1%h.96=Q8_"BjoUaDbBuT3b;!oRs8ej$B}QC'[>&~AXREG4L\P*hX0~Z?$D\ K _cKX?onA7aq@'>&4_}DrM0C 0- oA7L[A =^#e((Id~2XE=,em3}SKyP,3o.(?kRqfvE;6BMFB((trnUbVl/`%K't/z u.w{Arr%<dgeC ydJt/A&"ncAx~J15m8i(_~U7^$Kd;7 OP# lf H]^<Ic@kJGx73=af 8 LI~SpDmBw8lH u(V]c;!kG<v>(5S{p3Ae?JS1sbPI $D(CArhb2BCT^]dW9p>38uG@J {YFk:k>|e+1O^PT<?bt\mb 3^ak(j=kEe6d**B7{=v Q[ ~.8jiBxM[LR!h]S'E1  ebk4|6._L F9um} Xf0f.4e L1X7d^+BFNJ.tY!=1ic:4J[;en*)P1P$BwIP EK09S M}R [YB/% _Q,R2xCy3[WO }h=<[=&FIZR"y\w1=QL#QYcE(r2[LLy5*udJ |LA6 D*`{X 2 *>K1pyQ_Ba ?(O<h0,2Bk6R?g#Z5N{9~~ :&y?f T@V=!V 3RPId[tv  Dn\fvqD0 FkaD, jOG{TX)(LYA.JSE%m@R5(u32Jcz=|x wg GZZm&U|q Q!>PM:lf7Ug3~a6,f3lz jBPdRv4L030]9]L{N"[AK`Q&>{_ksyQg%]2-R`LVX)nm*o:eBAA/ z$N)g#L]A5@TB B|J>$}aF[ \mk092,o+c9<'dlXu/">C&lv7;,''*J2 j~@QFIH<S,v-`[,v;1t9^+@' 2]#<?x>hKa\Y  -J6 ]:)f&K\bPK8YJ:YtKcKD7"Z>QN8,d (Jgn]cp=)V#X~\"n>'iAkzOA65iaf!%J6b37}V~,$ D8>:EChy%b@ Q5WfAgq~n^ )YtW1Q (s}?'Xx Et*p9R"|~t`{?1_YQwdD =rbHK k|WhC]nGg(c   sb L?+f4=p;Jr3z\f&!3d \b/Y['E LkrATW@  87tj!%|=~;UGL R\YGY|g1WaK {fS\pD7%rcqWPj%DZX"|@RxK zwR3[l@O~ eK =( ,1q]%1e~SY(O ?dcdKnCF9}DauVmL8F[Jl |1VG*AeCO]x@7Jd![i.F]i]!E8+2G6dW3,h4ma)sLp "*6bD;q rFZBs:d+pE<((3UHH@9G0-d9x:JI;FgS.z1J1YnB4 Z^^Dkc;1_@BrC!C_B \-G\/0GE vNBf *6ls$9</%8rk4Ycf K)t:hv-1Xp,DnVQYIcMED[O<`DBVyxji{,U 2}?r?Hc3HCJ,jfbMF2.eR,;"{fP-+wYdk^P$ Cm;  LBGNAZ1 >.)?/$lAjXgkr_SN&z48Cq\nwd6,-q"&&02zO+1I}\=EJC Ov4Du$GO &jV#**f%B,3lz,K4|8ev#nz_OZ SwZ9eA =l^q: Xiz Xyv<pvS/54| V?o.j\P&7LMD]R/8*H$`O]m>"? n=5Iv9kDY;]i?Im#+jw:R:@mB tq<Yw#=0Ua2Zc4jp1ao\w6enju =_ll'{/c>yw\-u|LG;F:Vn"TwVNXmzX*3sQ"orG{/@@T<R QO{Pl<~Y[`kk?_85|`3t5n)OK0lCe3R:[4bH(L;Z;Y2Z4q ;d,'?3_`[)1wEyCyAj!c ;"&p>  k <A'J^`YjJ{M(5eH(f:f39?Z+" \^3f:{`rt N/ XklwA%U Y0NE/M15>0^k_XRa {nWC% zI8le=iyoqH$SWQk!ve}/Z=G%ixv:Y.^q9vH3dew#$%{s~_@sD(rzSIlC* :f4'q nLc B^wcK=PKSuJeva.NIu3Flo-l9iDhTaB_B)G"KiOGL&k"h%mRgy6@-8)(*26}H^2 i~ E Mg7qpqjM U>Z KAF}#gKsHD}$wBg|po`xG\/X(MVO]KL<2W Z^r/QNIJh"[M3r (S0d 8KI1phPMyP5/4;G@ 8Y|5SL|'^--'i%&C()uM~w1~0S(S[o$}n:f7~\DH{GMnGve^L6DX]PQ3G]!H=nDCHQ.4R_Q@V%H=xc$zV-fzL]iB=! trin!f$jX/f3DJXeV% ;qN|QS*-:GnpS/W5(s%7tgBL J%AH97Gw]JlF(dK`+2peKy}]0^!-Qo_NWIlqhDU|/bSh~3s|r? i_r  6jj`mkhk&I_b|"?No"j%q ]HbFvi'cUp])<aQvqs d A?n=??M?MFM\W({3p=~UI@CPY6,\wO1,Fj@!"= F<)@6E]pI_r^D~j+irOGLsm_IMT(@(cZ{5| C?R@#2Z| 'YRw"k N&YXhheQy=PCZZolTe}:r!pYo3DK .i723}6mmuk0M(J?2[F+/Kr PE ;aZ0 .TC^&p_bL0MU\p Is&%}]CTRqt #q1<iPJ,^=9dLu_?F{uWvj' Z7d x{Q 80_ "yij0Lc{yEgWk,@cWRpd3x{jX3%I'iFNu2"^^aZ~\/0"8GkQuiD2r$Z/A:>zJ=%iMhwdgl-zu,,$rsT|ZT':.Cy.i/{^Nl3 <0 DGodnIHB~E9=I2ru:4E"KA^xnYHm%kD>[Q)i1PFC.v7]h[-3f{ZaG*Ge/x_b4 >q-;M|4V~SmA=EHjZEs1&t,4E14,X$+}V6DJ#&g6>Adfz92|'L>y# }x` O(iT'C8e]&]pb^?MCVNb%VnQ_ ;==,(lJzf,.d.0+Hu#(zY@]x(}<(Z^Eow)jwu k>9jn Obd1 tF1pj@rK:Ca 8b&-axDfX2iUsd;G;9_un1030-:S1>QI5/,kw`[EQpk7MyTK><eY-L|v Y?Liy7%Xx:!6 ;F!|nyLp@^R84[ vy1hAO8z;6[ )gef%1d}FS"8E:Kq.Qp[8H2l9E!b^lg3Dd;Ni^>LuqNZtRsM~9)N(:`l-G6g`Z_GsQ)SR1RP{1}){CXwY:,pBl'$(f,O)}MO,Pv ;W4hA*}6=^97 *x/zDxI%Z;s[8EQkXC9i:KGt n*d]DFxDFMW\g23avcsMsc8=i \~u$q| tC+JVN>t"why:G7@8au$~0UIuQ./B6V#8qVLRg]J VO[54GzI^<t} Kj] Q,kjqJt0wH_44vX5h$#dO.5)at`^81x)Du&[.Ho{fm0^$m)~AjjTQ@4L71g ;>8LaL0pcG[BB{F=^>#mFrKDJ:=ydDMzXvXa32u&U99$O/j`"5v.H"m+\E=Sk5]W rMI-k _a^&h~:|9XV%qx2;2(4.Y *Av x"gNM/GdM$1 2R {i(KO(76xt[it"mi)_ug~tA:IR=~Z.PAHXWM,;l:Xn5#`1x'A!?AA5W$TJL|j=&2N'/'G$F [M}&HI;tx4nc.G9\WH@ !z4}xqT~`)72]mkX pH $o1Jz&;i 4[q(7f%)d hN(VzQLUya/0%fPX;z Dn.hp(v])(Kd#_%Fi ddKrKeo5!?_rn~a.FaM< WK+v[\7U! LVgI E4> *M:#q>UcHq.6ZHj%r8z>JI-gofS)X@gWzwqPe;s)^=|Q#tmMGczkoXEAX$5ih rFbPwVc:>j- L&R@,-lxk)}W._6\~t$tq5S?dme9 xV!]oH(;E#Xz2mYSDnD:`P m)C5;\DT~A`)V&?pIL?&hjR]  oQJd7PU-r1vhAx$%gc>?GY&Cb{y0 Qv?4m4-uOoJQaG"b;2OzGHFx6luhWj' ,Su1P:Ne7ttMcay{qZ{"E{ yQ{:cqz]I,O4(WY,]4la80:PB/Q@-w=}?Krz @S7M@T8+tM P!X!h0;4U-vaU)$en>au\3*p^=nCb"rH1~!IP [Ylj:s+Krd5zU{+R6V{ra2$VIglIaY EKrBA]'~Wei@2E"r}{BBLP qG.IP S h&?U3cmk@kDa8,9 +C]VF_b: kF 3,!74RS&6\q&YVj~O^2}p^ZAEm\  B:"&Sm'Ok;^K:+V0Uc*~L#JpIM= kDd/"Xv3k/:%:sa;cz M ,tbz?'o/_u F}|m[&Y`OJs'$HO"cE6S2W\_?3Nq[v, t u@UG WbT=[hw !,``2un/,nPOrj3j* wJ#pE,V&Npx)= }*_v4Wa/=-#A%os?wHyZh,~]lYVRcz06pEs/4`S"lNi| \*I [x\n$]exvHr43im$Z#(Z#({:n)r}W0a.ZCPjev(pa:19W/e?7@|TY$t&:&K|iNl (k R9+D@g<[a M)dJ({?+12q\G oHqdp/Yu@p1oi9LK|C+wU\3JU`QKP  aoBN{sE$7TTf`pNyD_U45tl>d Nze mR$"mn`!GDb-,X@d'W/!u cg.P=fGYu"X8'Zr[$<^O8) UNH,]Zl )caj $J1YHT A5_<$b )x#kc77fk2>*ai,1p8k;d$<c{ytG (P 462yx9ztMmJ 4RW@~zc1q|F0EizoW[l[rE /jQivNroB`S8%FB;Lvn )i@H+Ra!BxC:j.:GV7bhS5M,FhQ@V}& H,k0L\bXM+*-B)-mlsFk@?(,VUk80?D=Pk9 lkEwO#PXh65 P'=Cp_7>v-xTmg$)VkAG>JL Cy 'c^C+{7{*FeB+-tJa@YOC]$70 <,_ndg 4 )^l|riVB$ D `}l'B9.-X|H`-fiG,"k76LDV$aZ Y}FD-ggv9/SUF`[=yE{]XI6A2*9{  1O(&7^tx!;SOCbL}t-. !t7_SUo|1w/Y>;keZMXgB,C;k T.q4 )p\.Czh'ur<hd9 F67/EMn{-TBzc+m&5[Qpp57%|T(~%^:*>'_dH ;7y8=/2F5uBw+9ty%8V1;=Ab yiW-C^8 yv2{pZ90?8?;[#5fo4 {y|cqL%8HiE 2UUV~(GKi._$Kl:uY; ld_f<,mK,B'8-#EJl_6Lw?@;/xd:9ME?.dN_!S;#ito40m>$ cTQy KCV[AGj A$:d`)G7^icbM\L*PGMghK8.=K}v$I}u,` weNU$8(Ky1393E* Z">.ve B)};;b A$,e~(J 9}F4,eT9r4{L`%~pY' -'"!'Rxw?^9qgd5#}I=f,ZIconB}:@{2uTPKEW sC,SW*.t<|^Oilp2!j&dPP7KK#7LNPD)~ 6=wV  LA^:sbX:}K ,Ks{ec@$>w\(kx\-$l~IKqhV*$}o,B!GBz*p]!oEsb u0{9*p^WesdPvT$c@Qs0j: ji7_]c{%U^v8uCS3lb9q"1tNf\4TqEu@0S%OY4_ |r{%Cw]:#L4:,A$*<:CTCHN |2Dz=\eD A" [r W:$ i-}_\d, Za?;<4n=RY-}J>md[R 7R`O7?~M"$O)* 0G>7k6 K 08oO8 "b!{:t}7#T6mPvqw?##)f@6m1Nu6s;Ms2Q6>fn`T;.JM2^ ,FC?!2 G H;]!Qx.XqI79gi@62`u Uz(o%UwS>*|*j$x^`!RZn \a=JR\pFi ZN <X\F%ueZS~y8 )$>@B'}73f<|ELU 1'm,<<8e3o3tzdi3'>OLp t/OG'q ?,0dH <x3~m? GZt<(8jXlp VNnR%:qnVrA9 PY~uu| ?f*2|6F%M)F["0" ky^1}pc05 jIb*w=Fo D~%nzD5UPWfi4bkBm#H(:TD6KlQ~eDljRPSL 0#jIgwg_Ou/(u-=({|An`TxX]\+Q$vl7F:;D"XaDm*H V N1v;F/CCKcr> :;'-<2u@_dZ7Xrn2i\bmu4y`1A%<X a&!D6elHS1dH(y& X("kZ`@eY4o)EEBDJ,{ eZ]`ih =vG IDaQy{n)jAFQL(c:VQ]2p/viA1)5zIcA|}m~wh9M: &=^Y"OF}HX?\O[4Z"O~Km? ``F@DtV BxfN!wp9=lZg+FSG^C_96|e0B5|5!enXX#Jh^RV\D6;zdPB"+L5G[|CWpyA)A? 6]]g,)EDLlIVa<ryMJC\)d[.~bR6#J^jQ !$- W]k:b-Tmq<Q[ED=A\Y.`@ybB;? {tY]1TIA7m{S)rnCl(N494Vz`AUn=D\K\BX "AG_0_J}G u&J&cVtTAJ6PyX_-b#}$J%j 3%'pfQ!XaygC*v{ZM_vK@-A^,{G9JI'+"We% )C`},}f<_($nlQW|@ X u^5Ee#98m/d,ZFors4G9 7]f8Io(Q3_~W1  u r/ux'b[]V K?]Gvr bi;I aYZP[: 8-< x8B$`=#q.h lU` "moJPbP=\<9enR(vS(9Tl |<f)3<VS1<]Q=RdOFH(>K?R<bzjS;_q>: Oy;,s;6`EQ~% \hPYF/N3\/K&gM=&{l;W, >S+-:pF:Z&OI(KhuG `6.}Q" D`'='XQ/>#ZBX\Ko 7q k A jdw%[) r G%Dd> l J/2<|&F}9KF5RIAo,qQ {~.;zidGzm=s3"gc`NyE5s#+[(Wb1?e_j>748BpP ?@RLu7|.D'{0{DUkOvH(\XPeXEZ-YZK)?h"J,u@(z#xUN_{ E1m5Hb3v/`1DU8.Zolk,Tr~cdN0,z.<q =X @mVaL& 3!a[Vd7!nbQ[{\9,b6 +dZK '`_~v4~r1=+"weS5 e ^z=@P"A_k~ g1*` OxoZ' :cUlV3'qW>CGkV5aIMhnG#I]FE/QfWI%up9/1M`P % _IY T0\HtBM5FJpzbDK%nWYay 437.9oq/`Z*lTD:+ssOvYE&Rmj+{ u 1tQn3["guJ[='[>bD\ ah?:Lov:qt\?[g}A7 , -;$32vm*Nqdyc;T90VY|4(=r#R_v1m@LD{LgH/4A07ndTh8NSZu H 1W_([M+ P] *4 -ZkvykY/XT  T9p:tM!p1B:34Bm?)o<&HtYs)fy08-vogVz(XOstI5 b+zAZCgF4 1[oPtr0( I[CB`oJJqHZVlZBA/@T~K66MjV{)lZP{,Cmn31=)czObdX>- zz~zDdQS}0LoDY8/8-_=^)npZ$H|{57jgwUl>@/9E2|!a.M"KsPR F`?rrduvA,%\`X^ca0yV*]W^D:+Z ( 6P Op,M=k VW=Q2Dp?S#1$*O :VyEB| iJcR*'r*-M(Y#=s 9"(&(Tt].c4&zB#1KgEFiYs 7 {8Ob`1P ;! w@$$4Zw{UbYc d5hP. +Fe+=V{UpL{JlAl&4 bQ6fA9kgE3c* 1N%lz?@xU\QH9xcW(|o-9zl%sTV1L=Zi4!Ja#C?vhVdpM3+D{d!i#{   feO=}gqZR]niF]j0BX#3s; yps2!fr"Sa-FNH $e}8N=3XugB*(~HBP*Iv |XztFK:Gc$)BNFZ+fmr:j}<4 =A4 nbA3.4dg,2Zx?:iM+R"3v35Mu?0DI0\ WJ5DdV98t$)-sGElt+L"2 \wcHrNni.6dxvK}D  %hv&{3?lAf6N|R9?j?L)[o\pqP~"  x?gLPRc=l16,%E]q?[w>z Ux;.?f)L0: G/Bo>,]UMB*F=kmdlpvY[kj3_Xl}LI<(! :}r9+{P3 I}"]  +@!m Kk_6lE0SkFw \2-NiywO?(HF("\YJJC7WcYQtu7%yM"7_'|( [`)7WWv#VW*7mH~8KO<4Y1 =C^>hWW^]bE7^xX.<<phA7-2`z)@x:Q 0[xT:Rw-=\Vv\n,'-#C)qxLAv j;m7R pYk?@.N"$mX#5m-5A)eXu ]GCCP3)1xs3!u J]Bi1Jjs |%GrQj[QMI_5aEDh&^||?3B s* Vk$H|Vd2[08AE1>Boklm{vj%)7iaf8r] M s"E4d0ee|bqDTsS|1caE2tAB}$i0uaq@NGdHT8Cus0Nq6=*hewW!'3WdX0vOQxD@\,gh~;l\FJUh%X2_[ij qf?5/2 #R&B|HJ;bW,9+9Afd&JRXENdHm.amw$8eHm['rV!F5|br 1^5x5r3%V<,=:9$`w6 \Z;M^ihi'I i:%AQ+`_SW&6!(wf=eN,] Ad@bVeG Lfr)7=7#@?hsR} &b{Wm"MACQb6Bl?w-A$N'>\Ht$ S Gv"f~pp:b("L4kgHX3q3 D:@sK,`*[#e>w?9+=en7eso6.grHnfD $DI0T>fTQh]VSaZ^Y1\_9%Ch9"tLHrJH5A_KpaYm}uu&-i !h2~aw}R{M~v !.[E6?W_1f3 x`,W>-6bWzY R(?gA=3wV}4q:+UM5AmmA.]^Vx uug>\V} /22'+5D2oT%6 <n~cUl)feF=PDo4=L}468J<k}{bj}H9V?9<hz9~+$T U"F5arXJwjD`)Lo~ ?4KmeWv2_V*`3)27`ltbh<|f= ~zj/K$=LGFJUX)c#NheDNGU;bf .Q3kQ#H#\34Ji5r>8Acf:p|Sq.D2{sf=zMiL(I \\znBP?Y='!KNN_rnKIb$EYY6B^n{Rkv$u%a 4c+ jv<jc/_\H rSCH*8`*>>[G'enZ4"c3nYF^@Wi+ I2lg+]NMN"OQAn{z"#  RS/n$gOr*)!1%Yr)zy - JdmQ}{R :fI$n+R{ZS*![d 5mA7p}C7 Th$[ea~R39AkS{D{;tpNgT-} Mtn R/qG@wTdF14PpTgFED u6fK ;kI6U$]T N=S<f8E3,<1~+3KdS[D0. :"*e;"1:i bn} ^ "us6R0?<79Xtv[L{h6,2h9/|NNS#;^:Yq-x% Q_NX!C b_SvOi#:wf9x e6` ;Dy/N.Q>+V>4V|vn~563_8)}aZs$aYn< yjR=5Bk*xS? \{Doq1-y  :UA9~e e.jt7 u7"DgKI:y."/$rc|SwBKu14?/P2 H`Dp~w$+ %#J EO9 Y6~C*g\4d>ZlZakK&/("KM lIM$RjS|H8iWxA9ih(4jF #Lb!dpv;2K ^f{Q& rZ?ExQ);+,xa99I'VmklH2\cw:*|xeOQm{4QuG?w$f9i2yfnRn7nN oCh2s}}{{s"sW_ie`gO@@dvld6iM~l: ]bp!lGIoLh|2kwj 1 wy rD5 "hs<}K]vB T-7@  Re "e5+za;'/,RR'',#=;~ =Pi+@mzh6 9ZA C_ JB` v#i\eNxTN_C(\R%\e)xV1VO> PQn#$:`IsP>2Ve*3 jvD7Lkuv&,{Z^.BI_h_IM\A#c+\2h >MTroMWIGP(yS/$(#!*!7Pg?c21c :} uA(IvsJ[jt.{M88$I(u,g,kX. 1  R+qw c2ctae$/x"N<r;U4mpQduWQ 1dY ?  SQ+2 jC X2.]LAaL6_ CFs &%0k'D3FZ&ckAKY~'"Y9!/h^|rH|a^oH~@EB 0]`>*6 91$lg)E?~nc Me%9 /SeIZ36Dej U=8`w{a8r;ZR@O!V E\6Z9N~TSUk!`u'El-gr *(_FhX.Hyi?&F Rbsa* >{I+wd93~E"_=c -."E&I.I/8Ju DZyS'v<ZAps)FmuPrlkm4e%""|e_GSO&92pwrC7?D'U1]Z,!YqYG$$oqDU$9ep=gVERf#A#k^s)bj_?d<G.(,=f{e gJ_Ewk j2|P&SH _[)eUV<A^"_`@FBF)NzO+>](p!Q^7lH agwWl'Uv?1Z|jLfrA5f.WSnqcZ))k5 ?;<<n&tNZ<2lm<.7>k08]=#t5"KJ'(+(0~s_ZhHrx1(LZQ%cwuH2]!{ [5p0H(yp,c%CJ/Dv3s> *Q;;Ul>s(<*pq4Wvl78uRh!=jD6o bo]$KRkJ2Yat_f~m W_| 6m()B)%lV#x)d2-^ V Jm>:#\D24csFjPn 1li]JAe) R7TP3TaOj |m%6:*0&-V_TDYd;J4v'#X]{;HJQk SUw ,&`x D@9p EX=MyIA`V3I3Cl)D?>tDt m#<ma1K=U*}4e.z|zd W5zcODWsqc(sD9[v}PpOyq<#~0xm"%hEM gjWVe-_0KeEUuq5~J4V >e_~Q+ >?:JD{i8mH8R)lHH/ANsZQ\/cVE!xo zW/U+`B=n:NTyWC@dWg^c;bl/mI|7}p3bmSw;!,|bUEKNhv*]hUMV`v(huU 1!^,|=m#M3# _h! S|~}J#Rx8@Uwi^d:B0! 8?5 VY-Uj\ [bU- v4}vDB!F-A5F {2 g2 ^f@*lmI@Fm* d%$]HD- dU:{5rvmo.Rg{D y: j9CzImdc@3;dS;!L#gFGEL=kry0=r&`G[8A$Jd8UR26uFT}e5bk?i#RxmZHCf VU7a|:Ix Qc.gL4.-/6s9Ug<N0eC=CCUtWIA T4EQX}dUl\\pG*T{+)}GA--aq4qVU|b= ?ugf@B+ad4-lvz=r @$ETh ? ~fx~"&9xtRG3z=-"X~tEo+mc-?mOCq0 gf  %1'NWc|ZK[.UO|T, T vhu?MLc~h#Cm#^Ut9!Csvq8LSK; ol5!A<31RAy ZY{/v3KyI9bV|a<8o rH8 3!y;AKUeYv9r2 (`<(c/@9]}]"FB^k 3+DS_ /x{gdPC%)rD43) ** ;me`Y$:3e8CuI-! ,qP+P?'kQIoD tbAs<R'n t:3U2c0Ed7`t NP?|(c<@FuT=BUx9vI bHH} == -B`e-84{/  D?|@S@-gWesB Y!\rOpE6E\|Yx[JJNsw\sKo7} #*e&9H"( :3Sy>@ jSM(FhSShfTQ1:2bpi2VI XHAT<,jz]UN[,D3&Gz#1Y9Sm X N~^A_>mr7}J'`SN`e}Te <2$D =;=Y*7mP `mr):-lwtlo}%FKr `0]*R1E|5NwM}Q3+8B[r%O| "$Is~!q{c{OB*8 r^yv"&:vK(k~cd }'INy6 g1J=w4B96: *NY2O?C3Yz&?)B>A$.}ZGVga@LF<_WJ|S~9a_o+sN&G?dHuJrV*uQ0mz 33zR-)C_zkY:,Uq@U/Ea5N.WPzXK_k-7C|\' TAnMRE+Za)j\$ Oa'9kv3rH*$DHN ZXu>#~jlEXY '&peR[s[X<]r!^%Q3# mYRSQ94)tM6rms DzC^ef!c Fl{lSG4 D`8r/U,[vAlKsO(7+ac7;yjG) lm[\0?TzN^FH^d jVt =Jpz%xD m4 XpTJ7r\5Y| Qe{ T\4|Gw\8kt2A"_ ?3YlT3Bi|BCc59 7'gn|2):1s>eL/2aUH"]XUVLNS-@RHCi"MF eI .Jp:%Up263 +ze>`$"X{%w_klO/[JA+Qm0QUf@hb@So4" (/)');t^Lh sr5<lk 8uqFw`s pN2z,"1I!E +e ?y eS6h-.P~6j:%.PzxQ [M9l=tn|hA2mi ? R3@SFvjgpPM?<5P]qH LG 8NVpo|4ro=$S8 T!MqFy(UN-~L ?LFy~~'"s"y7!|*zW@E`K:vaSr)VBHQV%  4XYL+}cxwypzyPoX6}e.*no+BijK&\$$V:VDV[;i=x PBQPW(k8,O#nQ BQjQe*6A;q^?K+6C1uTYl&gzS/C|Jo9m` d( z_K@Gw;hloJlKqS9 e PziQJ?;!42#:^`Wg7a* By s^C5MX `,"R^DunDBvm-8%K Q 7/u1 Ha&kg_M&My;?% W:xD*:1~. gYD(^4l-fu&:D $&bs{,JUsg.)Tke\ \~sJ;Fnd5 .UJqcKE?Gs!R:n.t3=Y#24 #_.0]q9.c8D&24" )wkE *|GcX 6EU45C]bA.jrM+n-B %w*_mDY% p)>=Rpo!e?bY&g/.OhXI`z ujzj`-?vuEe,%LRS&1tf:eD% #6E$| $0%Y'z1()~%z L!O?oCw VIB,lc|mS2JhV%;/_lI[ -s 7;d#?Jf![%S#PE1 dvZ#d r0Dc|s$aPL'mUVoMG?'&879']Y"3mz3g\ht7"Y:(u   c(q@:~rXwDq`qU&{Zx`:Y}D9Il|z}SJf>&!Bd+"owl`m0$V`B>V+lw3iJ^.9?y1kq& *^kU_*=Fn{jUSrNy'4ZbrkX"]^n Cf\S".yH:;< 3W& \]_B|MB{j_YtPzCR[JKC?'B,RQ]ka0wW@7SuTF=GC6#9|6NH&/w=j-J-5Rqh@[G,p.W9\7E_"/t{K2C{=]-"% ?"3z)jlW7 #'Pk]&!?Hd^w&l4lTE8#0@iiX( Vk' x[{<)Ai!~Hzd 99* _q ~z^n#/p~~#jc&g"m g_,@P^17Xr5Pz[b s:9w=c;g"po  HU+u8#%Ua#Zl^ }a !5z=*L\#kbMv=G@4'ht-R#E >"! 1971ZGZey#e^4%%Fq=uivFqB7S|+A< -ilQz($W|E,vm-YG+{H. 2]F\qcbeb]MF7,%&HU[k;a}{d0pA z11UgM+TT(S0r]Lg@fym_C4aqJn3(BR3F{3 oG92Hx4zv~oHpQ_j`3vz'Iv?(gn;~? Sa9 A*pt CB}s7LS0(ow"+arCnHx_PbQ1R_{BVq"HI`e_5tamz 1f  Hq+-eF5 /}(1 3(1ubSA  \Jii&2,/IH 9Ky8ZfU@ ^lV3(+(('1kim+;a8 "-&%/0r0*NeabG=I_o -' }O9 2}7i0N9_A!y)%=ON9@Lt Xz_N/ nE|E*o2 =fS%ba\ ;14**fa!D`T.E'.Xcf-RT"]2 Aa4V h ^X/?"(T)W3%L"7/-L1fWDYH`sX\ 9#<YXTqeBV= j 4gJq8mv& ?_O7^[EZdDEJ498"Xz -?? 7]%/^*6:M*,8bZ4tUWu6:UsjSOTtl&6}JDQwZ \0m+C(~O7i]EM_7vT"70+KPv (S +cZb)U>I{}?qAnW 5SO?m?0]zl Ckj8s3D)go=Zz@90<tXGHJ!V8'cI3 Y90WZ6:$O~EtU1VAa !(a|\Xt &'kY]A G=zA+{ZU|g9V4]wQTfi;;O'Nj7j   1e~T<.J]qxeT2%w;[=edG5J~CZ".#A{Wrig|v*JF Uf%grkQV`GqJb_zHMYXRJb_qC[7[.+k?!nJR) Abn;UVqA28f8j\)<cV5x23/ o6=JM18g< 5g<uw*Q}O} x*p\i_D`KLM=z=SY65V St@@[eTv9x" ,9I*A x?4o1.)x,|mBD`[swA:[i/C0CuM P.IFR<04E&UdC0Am,EsnL  I?8tCP_Au6"?eK&tI5Dt k)^raG-;s(^u]> :kDbPG,.d-mDF}Y@t-b=I[!Z;0kc5}#,@f^=kcFK?!1.^ Kl\IIU}mrzUg64E?n!QP~DL1nJz/I9Oj$ezwtZGVjmVT?9?a~^3+3IE ,0OB~Gltu|:DJSr`Ge 2neu)x2NL'+u  )[+& <~cXEHNPT87X(~1u7]vp`?$xe@ L-zH>vN7=BE' 4Z-q6sFEfM2Uj5?MNQ?+7suC$$p^3U2cBXz V?dDZ9v*C6O[I~#4P"*r6BT4EflUH,?up'E9pmF4* Rgn\I??KSn}9zM3%E},g37^_Mx+#Qglz$KW`T7 #=C7,k*"w>t-LM&$Z1[_pVqS Qj1 ;a%EVkg: EBCSjljYM*C^BK@#_'AJ q.$5Puzb19S=;ciSvH |{u '$$4LT+VuJ$$#5AIE+J}FBqFDvbNTZhU3 ?;'e_evVA/`Z 0iRZ|UQaC1 Xb: |+hF ,o#tD D 5^|wxPPg*GM7d4CaQ.[ j5+s](Jz )ESacRC%.POM2\{"i eF, C OpF8O%0~H!+Up0vcX&SV: ao:7;qoX?EgL9W 9WT4q[)}etk) I~ "2Of|vi; MYhWB0'C,A`lhD(QN') Krzf4wG/P^>>XR; r"+yn/5*0r#=^"dW^T_=}2^$yCz.`e@jD(;LL<-`8++LmjLzV  lY =>% tu %! >0p;(iCs & Mm 1HW]T0s.C Z^|e}H Hq+-l0}M*#pxZOC.JOYn V& !Bs mf"qc}E.leT{XqpG19=SO=|JZ"/_[u,  3 ~)wN # %LH3u9z1@H$r; =W%$#d?vmY(m0MG~p_La9Wj>Dxr,]\o)=0US^X.tgB+P1r &O<pd\w5>p"EclY-}@)9 i)m3ro$^h&I[N8A2%Vq#F145k)Q0j}JjF]+^ZFF||ma uS%ITxxjor[#bIUlw(Y=j xVJQdqGSypQ 3v1/wN6.Vq8/mWh]};Z:'o0 D2Y " b)&W)%{.FNp;!>zE{~k[vt"@ !1Mk -Z2sRfYtOo2 Tv} n~rz4B1S^C @$CVOa%6_XZ=a3"-W UwT mTNcabRSOL"wSI\sJ 1r @yzQGHI.hJ@uI[z<o?",?YbP8p-r{{3ur1HoSgcya!3j=l|tIn'"Ui_,h ztFd"^dh9O{1)\wd2g'#XS3(g.h&UT%JyJ(aCea+!-/{G9I H?tQ3h /o!N-}\`)bsC&z26GS?\pB%v?pKv2lqK.lUB>g9{5 nj/|2f?o sm `*E24;E 4h`z#sw*lpI/@;X&^oONA5p[oyqii AjPSe1uglQ/#5@><2O 5$N;vV"ts}{bC)CsuK&sHs -Q^c]dbcBO2-c~A,9_sEMt[FF,k%4pLxE{SMcZ#@AC=R8sM[?WPXEZ#l6}gu:vHAL8ChI] `!+;=A,qkDr6|-7'/YY]_K<"ZK-yD\:ozG_N@%p;IZ[_dQ G:RO.PGVtP#{ _"NB!u @X D4a5D_FwEXYbj XBQA%~UV$3*=RL^gx/r\3EEP.%r/g ~:"U4I VZp\tf?ycLQ%e%|$rxR>%lrbFX;ty2`c' /h=eYDfn`C}mp}bPGNdI_A~u iHWL53RQvBl`$62#Lj{2c5 99=!p@r8 Q *"3GPll8>oM I{ a$x*6^9! e@R8b.~-p< 2 `Pe/ UKgRzVijE ?zq8+GN+PiFLt CSD1'*'(*'p.:Ct{|8;Za3O 4]BvT,H *MfjbI( &GV4B$ T"1l"#wbM= Jc~0%CI;v7X[z5Z,&N[K""]<k{`1u8  >`k#^l)b#-<622ylv]U u} HexQ8p l-* 6WyN2\eU#Ka[`cD=781dApTH8k79+*sEr7gubP>8<5Mayl0+40 1.&8Yp_O:De~hP3zZZ"1Y&c(4>d RY@DI9$  1YR A}"3ZbE7CK5Fb -Tz}jZu{!\y'jwQk my\\le. x\"/Gh%aX rT4;{A5&(]p }>R:9R@mVkm1KeoS+fcbAr~|bSp4[ iQSD0/R@dHw')1HsfF"| 8)mA#.)WfSzSmD5w0TQ^oD )(=z"~vkL/<2jKpaspSLLEVm"("MY"SZ:krxh)s!,[Rzc)}=t~od<^`T(aJodPCMVznfcRJDfr-i!u2+w"s4pfE:Npn-wY;7PR\{oIya(%:mJ y7)gX+ ZIu1xrJ" y<+1f+Omtv_KW\eQ//,r0<c4LbQ`7dbf|jg^VEu9*i( r<|jG*+S_[3&meyWO]N]o +&NKpsV=.AQlt>|k8ff^.m]R2  qG=W;JKUl @yAw_,U:qL l>NG!_14pQp2 cCmDDD?I[=ZkYI0"0O U7mUj3j>e5tXXZa[RB038L\~6{/  *8V{ >9]. n>tb_2  X=R\3 <aw E  QhN?FKE;VWvA#Kx *r?'8^&tu]bJPO@"N_.Fb(O|ckJ59d"%l[q2vF.+x~YeHEprQd<P _>bPr#`"6BC^Q.**L00T-L)t!d0I9@/(m5frg_]NK>1.rSE)X"p*rJq]=fb%|jq+=@' ?]{}e+[%axvnco>LbE ]#2m{xY^ Rqic\mk&YCQURewmXk4mDt9yxI9=5!N-&#2@]=9/1+XQ-Jg^GvEPJ%L} CPxc*X< >x.gk<"5[oLm}] CZ/}nBuY(m< 6Y~>P$:^jAT(YC=W3NyWZqc\C _|t"(-ru B9O2fPslmhd=}EIc(:0tQyqAnWI+9Q1 ,&Usuy zJg^B 3}<D?pq3^4yTG0tbw 1@=JzN5!&8C_WcY$  tWl=g|z~zu`I3 'b=|lJU*>/zDZCZ*>{ayO +AO>$d2*OMte^X7641 =ykNgs`G'!-Pt7\ Z2"ElB 2odB9C_llK$' ;Okrb4LvQu@IfLzzsbS5Y!B83-2;8*'(;KUhxz2J]Naf:nc0 '9[i|l"-%+$/$iK).Aaryi6^V2uW'Q1y:kJ $ ?~ X#4LbR4{_NA6#=##w 19!joL 8V? mPDM*-'Xopq`aK;{dpEk.-(3Mqm:q$@;>J$U<p=BB,zeM8 c|My^aawu]2 6h*B5@ :~SknHAdkf|[ot^#PCxB cA.<[yu-t :Y~CAOjijea[>"#N|`'tzuTTFIio=x,tO0 []%Ep Ia'~IqV9+6hl.]dV/ g$VD5EfK5e4S%JC?j~mZ3 PU*f/tWS#G GR!R YIi.#R2q=14-8M:*22G]{)q@1 - 3MHGIf}"TpNTx %ZY67\p:W,+;PkxxeK#yDMTJ:znVWgzziH1e  !73Q!^7 )g'Vw6"atvYD.-$'# %GX]I47MlnIPa}I"bpO.:pc-Q08eE'5wkw!HT7% 'FXsn r^\quzbH 1 @pA.HD x1f9+Efq.,wCT4UrP- &Hj{|vrt~u`.v)f~73e%>j EF:`pxIg(as? linzl6bM"Ds;h]cKmims" 9b8zvL"`1$Opvlnsquti6w  +P3A?r2QPMOQjxd8sG1K(WpfM,N y2Y/sJ*&-Hsb4BTS0v=& )IjRj5XnS66peN":^^:T$,iCLv:>fa`r\H@@Kdo{KS\<Y]`RE9CURs5{J 9Hx#O)=x_e[D(fI}3p>'-=;6 ^h |jSUcFIZ.&hxS$j_akH]Z-;'79MRpy>:Db(8#qYT_$OU]LG4,YD)E:ogpK)e =nc!vR3 "[ Q`Y7%  iF*/T+5ep26DroT\/(0KYpx!'EN9@b@<4 :=kx[x?# #&yO- .W<t]b*bPDOeceQSYxu;h/ ,TfymGd\/#:unp( yjk*:&Kg C{YVkGxu!]9hD:{/LVP2tI?Qcn^> }|%hx<SzKW ny =g3w)ce^7J|J/TmE vnkeZ4 c'1W$WnW7F&]P]U2+~!6Pa:%|d)Sy;\ ,Qg'^eI K`lfbG=f.&1^SKqfCwnqqL3){@gjs_3zX1?jUPHNYz\%}DYjp|~e5w"U4LLF??HhfUNT=u(.^NS}B/H>/Ly4mz576>RVC-)_Th'$AjXl?2sb[IG)%~9pon1huZME9AAEFGOO[h?-LoU-;|@7 Y#eh7t996k1zMRc)70 ;ctAwaTj3 1b o<RF&r/S& N1ivd-8t8 ;v_x5~i5 <PWE'p_@7#f5qM9@s*Yp\<<-br>G X0/>5~$<FBUs#>X^_Q.Z/ h;'=Ovw~ p`^q#,8E|ZOT^rv{{}qM1L8]:z{sshaGg_cU V-*NB)U6CeyR\ a+^`je!XwKLc'[X-v5^00Cv7EUh}Ch+7M]jeQ'= EztrHnoA{MYs\?',=[oydC ! a=^~k*g_SQX_XL#`o.%Y%izG|wouz ?^Aq?Ch6NX4iXJ/%gA>`iA*,COy 0=4yT<0;Sy $:UHq&k';W;%(Ij}eNT`ntjZZWx;Lcy] bCei=(66ODZG{qwyJyO,5e #[E]Q<lO v0g_/ AYXbf^%kRM&_^pgFsmX>WXM/n SrfG%Z:Th^CCTY_1rC(V@^wJ&zPhOlH,y/Sfn^UPT_YK Vg,^M~aU DhkP{KF{BW 'Ww-iWGebv{_RR^$}HjjyOKAMpNIGZqk?Hz dUnJ$ 5> cHNy%Jn{!pkm%SU(\r|A lGqv"dwbmhp!*P 5txtX zIS$>h4 j\;LZO]H.%z:iG( |(x t <9#vH@F`nswy}pv>"-(grp;;ECMbAb{pS *RG%4X!X|8VmuL!CdvodQ6pK,BjhX=>r(qZBDTk_Q%q5;,@|9n;F}~Spsb.4]Aq3(<B2# ]]6dyzZ:+c5\_H$gDvTipSf%6(fr ]78<[q{vT'7u+Jj@ Hn>GE$q[6UhU,p0wo,ut.@# s7 PJJ=0[6c. N )-#"m0"ntKoQtf\_hd,-Xw|wqx Ly}z^G.1:H]\XXb&?G2~C>b/tWA& [1 F\ >dzF+&>g 7F>38_O,]C.!y]UFILb0^,G^xD}E~vmO!RSvJFO'V JkmVPT m&l=J~nN,i6l[TR>I JV[QnYThER(/3591" e: {85U)U 6Pz_,bws[TO\w/MOSFUl zUMxO;($$#T$XqD'*8QXZL8;07,jDk$_4Pq|P^],8GK"FC[&!y9@QE ( Mfbe.dzM0M zP(?:)HXLUmMf_99\L<1 G9,R=<:MW\C}@7z:x[h9 $r*V"on}zb6j'dN>\ @(d Txk<*h$uI" p2o\CDL/Q9e^&4=IH@' U mLPYA5Ciueyd 8 $37:?DJ;YTp6Xp*DVdsw9xe&:K:TeZw*rl7oaWcYN8!7t!A=@-0%r5G GWQ97M}12'h$W2($+u AryZ?/% 1,U*5d,\ mvB ~\6[kL#d> xjw39Wn0&b[+UX!,e1o (<appi:Ci9+)0U4Sh\N3 ~|4~"m`J=(" +b U.r1*\\6 TT ,8,(VG O2~[eeJ#\7y'HtF2gr#J9 e^ !T~ i$sn?3@rBAil*Rn? Pd)M!x -0- ;`wcF+-5Vo(:)csA!p -*&g5$8hR=]X?Wwa_^Xr:xsRA<PfjPM'wrrk3QK44COJANl*!+&&""o_4 4= 2r?8 1@HEO_14UomxodYPUTGC80}]JFY~ Sj"XgJ/pR*;I21;;Lo=9C5HnXKB)2yD>G6 5F:(e2''QI|*} R`H0P7afO,9Ic|;rN1>ey\RMZj5irM4R6G[!O8_baWay1xM@Em,Gf!@fT xOdEU'-6GYl".3aVLl8xeG&-LtU  A8&?4aM3l5 HtV3!5m2#K]xA{:L\J'>W6-\k@v`Q4jG76]U2 >w4Id\/sI/~a^pOYA~|Kxkvr^@5.;]\828;3/"WdgI9.:?E5&}3jKi/aH>Y6Xisb0a03nO/#3RHU3@A2Ie4oi)k [ziX*,pN14 $U23?T`[U4 q(iVG=L\si@ o!Jph?H]k,y*[4rL. Xi)OqphX=t+BySbmlt ]~BmkxgO@2+?l+,5(Hw ,63cW$QirUIeAkP87Eg0=P^n8eqh;CYS7x<RmbA?BC|%10(c?pP@QL226-1//sK8FYllU@/0+ ]3>sbyPHz$\|JZ1  dw-?L S.,9eVOHs l i[:m%( @ |7KA*sy(f*kS~9'w;s0;a2  L[YA}aOZlDFkuDt5[@Bv0T3Jh,DlxD07@FE7Fc7GfHLXS=N`be t5j%lP9$!""-4DYsL cJtZMY~0rBP_WC.;su>gW)!Wsknp~zj@^- }nr^'}nN@.&"",*7>;DFaxX1 M._;q0ZdA{kE 3/1&/?[qf>qn~'&HrzuG S;3@43'^3RaHv{>w {c>aiVp*_*VN$$H!?^e^D$5MYzWB.10@MWo%Yv5v=05%r=\6o2'5<0u9Tsaoew*5w7IAoC<>RQ@ a]:2Mdv[Q5mo7R s:GExQpX>-''(?yU0{iZWit"K0p(=|Yvt%M;ooDk\RR Z!Rw&`b?m,C Zk7M|{_3nJ$.T+^kJ('&  t*r 17 UT6p/:4NRNC%b .rh$/6*(I2C9gT9i*I[bT.@U1(8^jugcVWYZ_cieH 4i=pls 4ed6K"Yzh.b@+~cTJHYovQ3f/p/f7Y`So@+4,o;d$ 4BE8~?2i f- Y3cqvVAosN1/Jfe[9//2m,{q48^M4>kY9=q*{Hby} /R_bW;#gA]>K a7K r!aqCK sc9 !X{|QuXWzuJ(k 5aO)RsSRNA0AS7G`]cA+ *_!4TS=1Ggs}jX9`C) 1Txrot;DB. *L`;(3Mm<Q=DYu 6WBV)-HpiI&$Cn<fm F %FkAr6JI6V<!-Z-+& _;64ECE6,d@ >d1Wr491\% ,AG[ma#f1Y ~s/ukGs}_J51$ |AxXlQ'AhJ(cf5)]i\AAP&kRYb /Ip<kwqR/x%f<-xF%%$ LX)T)[4_ &,&O! =e2x"nXA&Y+nAYkz}eL!L;owfqsvsj[*6cC.!:[?^*G@0z7R\Kqh20c/0518% {UxX=+'!._q8x-I%R) d=n9S&|s<LzCSJOCPck=N&gVomM&vQpF[,G{^e#AvPB41( z~p :SjyrmgQ=(m6gy9 bB Z~?Q9640Lv>b,xcQE+k}@}iZMB5 )zi({ p[h%l)k&b l,5LUVk|XUG[1 kRdv<F}^2+Ga]*ix}&v@!kL*XaS#{oVs'/My irf+YM Gb%\Gkmmt2j DR9"|Lq5$geAcoz{\!n$pW:b-vpwI^B*"Dk &542t*=mujC1Hf2ntC {KG;e zMJHN>zT<?G`qOWDx [:~b~)n!Nf]H$k)5{"|:#B]jmbOKBD?336COVM3 {kol~+gBk2TuY~'LILi5R|9TLw|a1KuPrW?$ %O`@d6#FU]J;'+8GemnV; J{XVTWj{3pCk3HJ_nh5_pM2F:\| $8B)w._NWo^0!'Q 4>384kP4h(3IW}.=*K_0)SyM' G&Wiw{}yz7ag;v |[&O\7&%,>LGE98?Lw*OmT%mWMINI8tP!5A`~-'k+tiB8ISZJ6.0$v%;?B4~J\{DyW> hUPfb+z'<O{=0Oqz=1w0Z.vI53a Ij3Is$Kpyb>jK1 LdC_+8x|TKs Dp<ZhhWC(y9dvkQ;>U{Bu AlS(oWQqqtoaG?W~SMeAjkTi` |lm#:\!PvR#33[ ~Y<'Bgm(aW$\ !&0+/N!{P6m =`h.n)2eO (bKUqfdu2WJ<qC ,Ms/k:]| Mz  -Se 'YO o&6vW0sqp)csG%*e */&/Kg_4Dk^H2 jD!)Do%Q Dt7bZ#J!]kai|n2wO"FlK:uSQgt> #;g+rW&!?b#f,uTL:<5&8cToyzus{}rgG-*1977#|M%!1Pc>^zWu^J^Sj=|cHMTcdR=@JWbo~qNd4Acyxri\i2w`'l=Rib7T>GO/g. 9j1KhvYfO5f"2HRUkrv`.x8rL;/YJWG&aL;WFw,t( wC zdUGH7+j\LGUWU;P;PLNPY46'# necP9pA@+rsA z^. [P7Qv Z5  Ji4[*X|LJmw]+ssv4pk;pvS'[0 k=6ILq9gkOM\/KURC"y{]1zorraXLOKKPPbtnUPTWUI7, !2B[t1Rr|uZ>~|}.or4sq~nrz )FJ= jH01;N_t|j]GGMp 'GlyT+{U: %,-108",00/4HtM v`KJVg~wKC G>Zknyy|{Z.p:#0W+[mM8"Z!XGt*$ */FZgvmc<T0 `wX4CxKHIxq;g cNAIet= 7!txLuu8etC L}tcB-'WiKXX5!EsmEKtr3xn5]}rj|>Uc9bqc;b%i+N UD0.qx`9 zQH khaemH}pXI)l7Od8b*eB? tz%XEg&E(BbdTDI]yKtH aBLR?. g9=ZZ&rbY[vEy!?WzF8@wG!^&xeP=/,:aM%?II2 %tMNIgqQ'AjP(G5[,s[kQU&ala<yH-Hj6^~\ |2wRZO2{/VfcH*Na\PC2/3Mil0nK.yF5D?YdL4BdqV0x/vJg/8<!1><?1%~z{VR`K(bjy.&Bg%?\]cN2gxs/}i\S[pqJAJa3FYgmhaRUYsmZ@$t-,x@ptvU:zjkZ-Yu%>/nS7o84c6c >cV("-'2?Sy36*h V- oK_RH;agXB/~sT tP0 a-g~{ra~$ef(QY|"<`L#i(VB[qzDe#eA "p(@f6CD)pExY51-*?DI5'5e,GQQ@ ,I\d{*\wj*zSP:.&+/32" #N_ HOx~jM"|VC?HU_isslz~X,vTG9GN[]_UXZISQcrU (-..%,9V~tXG@[{)+''K=QFa)c,k0yF" /j.>>3! ';HTcq|0S<+JUlz5q/r!odY<))V'D_wm^@02I7>wV8[qBPI"lCH7UukJ0#5\55XamuvyIVM(JV9:zft@]_ihf}Pc/%C_ry#:hm^YW^_[G]!u8oQrfSQA2 .JsW0~KFrbE0:h?k|aSM^9r jM/ Pm._6-hQ4`bH.8FVj&QtrG[_ }H1+K=Wc~#N~bI.t@eqp=M)x2 YVU8MEejv`J'H`B!+^!NusrL14^tAOqJT|Qu>Q`Du9oEsyJk#mY8 l.g5%'Z9Du2-Ci{|cT7! "1@B0-ANK>CMp+7k y7N L0ZL H|]MQw c2RezjD %=u; ;o:07Veuj\'_z^PXct|vohku!RwpF"JW"UTw$rFX_O<f zN>@DdEx@ZrznZ1Cx/@M+(6gPkDo#1$e:Cm w8oDzULOe;'"'ffv3@4, .Ns!/, c6Dv|`Q=7,1-4,%3S/#3Od"5:9>85/#)CW~  >cX (0tmL)OhD2AX{Vf #<E8NTzK2,,J>rP9'1?^y%d%uU4 ucl;3A?L\}x,Ahp.`F=CUZL)9&%p8uiBJpF qG1" !-(&{M, 6GL>'xa;,K v.y'R=X\CYwmrsreM+ BLlD86Nbz58^7^$FO]VQ?Y'Q&YG|&\[J&\UWJJlJ:=1~5y^H)8wd Z6j hQMD-PgwwodS[h?y/iS^'1rnB3*=Qs&Xj:  P$fE+#l6Z3`}}!*6T}@M$2WySD>DSg}:l4{Fhe]D3(-DhF{!AdkbD s>x;DPS)GorF==jV3e[ODfoG-u+tAyfUJOXg@p)IYv   %=R`VB}fQ3K R#L >~/Red]TGSf[&&*+iUd}X6Iohvf FXZ6 |cZ]l)tLI]~PlWat+d)P[N6vrmw}v||%1-* -h:cwqK:S%V&()2:FF8moK%OqfCSN5,/Ki|W>=LlxYG8.6Hfq5amZVP:OaP@@287AHWjx_?x*Gvic^j}tP8R]/]2sq6\P e8_\(zCO"f2i1KG@#0#!0@n N~}j7|)@ `m(i+{`GIPr)N\ne^?$ 4f&01$Ec.kV]u'^ [;zI0!6j"g}W?)*/?^mqpZv#sm\R:2eF)4-4R<TZ_ZA.p; ?w~H \(  7SMoR,#1,&y<uYNgO%Eq|j[[]glwx}'i| '99E `H;:6?Tl>X\[K;'@Xzs_8h`Zdt@`agPA'#6Uy5KHI3'lJ,ZmHkX7%"(U+CgK|SE cYUQADpP4#/R9H6go`P1MbmH8.5?@C3+8]'i?.XxTuwG?MxoO?=7M]u{obm|/J]Ya]J;(#%&+.(( "&44/ y<}A!@=A;lim!x2 #/B<#Ug< "S >EQ1;>%z7wy}#Onc6\PAo_6]shM2{m wkS@Q &]->>M]m&;>?,v`<' :xowmV4F2vF"%2CUSC[EB,z,i?}Z 3Ovr*6B!QZ[<uU/v8 $%),NpEcy|kY>2#.=Wl_7$cO58\gj]YUPby$Ms=UtnL}kk!Cc^U)t0r1^([V)#2Hw#jyW> f*n]5 &/>] Q7  9hE{3-CpcLA=<C>8E6=`-Ly !9FL]x.Ro'.'%.MuiG%gx9 0WpuX&Jg&Gw 3CXc_P,u/It#:Zl ~yydBb|xujXWT[X> lkS.[d'i/pw=c*[staQI3+ DQTQWe|b @{}$C]3Rb|}]4bkY;(x^RQ9%kJ00Aw W3H?-O'gF?6@K]w5JJNA,hF&A=   @gi:`=" $mPQh=h~{b=dPOKXc}[DSYPKPSdpi[3p&LW1 /Gmy7q~K\8p|P$V%V=a7 d'Mv`6<HRysCL GQ 2A\iJu|2kr>:xTF8%>`7_h)ut#Np'ZNbz\*tO8E[}Ci3Sa[E"Z* &<_wR%i CJ[WHOb7]~|].rN;K$l.]"T, ;k 4T[\G3xZBdbmZFx(;P\dYG L!i>& 9m2_a6R~dXQal^&m3K??-6vawZ9((3Ps)FgBN\X[WduG|QX4 +BOfsyAQV? hL<))0/41,#*Bt$[7NbV@Hc")O|[D.):G[^fd[dp<32RVWC rB S- 189)dOBPanlDgDAS\6MWRTUh^Kx&_lBo~s`O>GWsu?s.-s'DI}G6xH4'2Fbz^jHZhP<rH$8Zjyvi6a2|hhh}!`%=G><,$V-T s0yJSq`bh~~v\0 X45  CQfqQLQScfpn&ZH0&F)|rs Vi?5\cY7f=Q-s![>Jf G64{r_[`gsulP4 +CIbzL2s  ` Li1)c /Hwf3qoaoD{Db0VbeVJ4I$xA.),>Jc#Bk}I= w|r7 CmmLsZ(UtY?1([O?_"X/Qz^#9k]SRXVl.t]]PDQS^`XXU`n8$c 'Jx?>(` jV989YF.bpM01F ,qq x1Siw>{Uo+W:;DuX' NNM5x^A:2?r =-gXuB,9 f%]#.@D8(ffG$ NIU]2uO;, vhsAar?~Q/blZD:3nP3tbHDCW_7E=*R gB/;[+![zeNLHPOZ[nsxql}*P 0Fk9jucV[dv}$t?\dG-rK:rA*i5Ve~}p[-415]%(GdJ!CcrjfYG,jL:0>TwCJfJ+|@ sQC3;Lt*}`[UWl~wp{ U^>"-?MJMKS^}6dg=xM zuthU5+,8T|7l}ob\WaezPv>o<%SV!.AKdu9XadT:\-M{yM $9Udb_?) =uu;`B|*>b *-0|KfUQQZfz "+0"5Wti: pA% +Sx5b+6::+7@Zz[-za@.9AS[n}rFOtMC9IYjKv+Lfx}]@ $FsW+ZrBF _,~Ayrdis4ym8:2x'_$v  w0p|| kG%'3Cj '?HE<.*&AltQYt'?_; yqln`ZEKV=L`kzY0\ R! -W~#Z$p1@KP?/#-5&XF70Z$y5S}I8/W0Qp{iK"aBO$1'!n;D6n:4md-O5U*%;v&F#," d%9siv~&R;KX{@~gG7%%0GeL~'DYjkjO6W m.&VcH37D^pyoT2 :~TSzRq?jZ3*T7{ H~a34z+Xlm;fB[*Z{Cu @Sdmdiaih}U CD[!WbC,8Yf-p_&<93 >XlfU7\'Nh0 9lLy"<hti]O6G[GIo{}`8L#+?:0c5G=wNF .[wuPNo@h~|oL1~`V=,FeB:5>J\o>c?dw[<# "5;HJDJQ`}c6 *]o>3QoyvW7'5J\dpsvg`I9)66/#!"%0Gg&(Q\@~$J}5Ojmj[>vMB?Qn}Z)i+zUH<f#.!DQyL]06e/Is#IS'2-0&p*f> u^I,~keja6Rcfno}|#1LfzUV;*/959.HsZVhy)h0Pm~u\F6;Rq/Ma_G$`4 vaG;%,KjHq~lPNNdy ,1C<?2)_C$ hC!  ?Xr;y|x\A 6fH:LnFa~&$2AYy {mxMyg6v\[Za[YD2 uY=cD7Fc 4TX:ynmQH>oi3u_C/ Lz;!Jy0xf(OXd`lw\5r$WQ(DtEyRx5`|~R/ I tT> Ed@_~+Ry\#rV;m.{cZax 7dYQn~tZ,i. %8FNPJQNZVUC#7-=lA"k/\v~bY@4%  )389!jU6$czhedmtt#gGodJ* {*<GSaryH0BPUQA,5DdraA=[~yjU8.'-.,"=r xn[M6`9fRFVz0| *;E83 ,Qp#SzmC}?]OOJ^s|Fi}_.*Fc&,n:l^I8TMR]&(e*GjxSnDFH|]L<41*)'qG.Bh-U{jK %#aF5G^tgWYfn5HlpA   (46GYtP%wfTQJJFJK[p}W, 'Jj}L%-"enRJ>>10"O) E'lvZ= )5Von<`,sPKOd 6_4c*UkfP+}NtWTTkwphRN=C>IMG@,ul[M=<0;Ff#|D>x,KxkG o,tJ6!vK&|,|[TZm@n#EgQ~ ul|SGc a1wO'1OmS-um^Se{*<766&,)0AFX]dWRA9"k7Sys9[opg^TIMTkoQ=1:FaD`UyY,^A"f.iYK\x>1Km`{gmOo(f%SeoZ3L s(3*Nbron]VKMNN\br{}cF95No(^ Aa~nD'zY<3)-x7ysz8g=Tt ?x Fdop[CuU1{Q6" dL5.0+9>A6&mI2$4V|Eq _z$ d6iU&;Ti9qwS/vK"5f 6[4Tpc%W"nYTRi)LqvfM(d1lbYq8r,9LCB%jE' */,1.2_?8E`>=djO-uXM<7&!m;!+7# .Na.h r4 a +:pfBGo%?a{.Er3gs3zn,{r\N>?EeEl'j~eXI<7# 4?NVOQLHBGQ]tzS}!r% 2nZ ' wkVOOHPQYTS@./a^kXQI>;+t8 W<V!/K~mW6X<c3$=jR:R yn.ye[Hlvw^?lE }\924Hn L}KehFy"a !=U~"o7ck?qUn9(Av9iaVB" ,Hakz|znH?a2 L86}G8ezlQ(jx),Nu}g5p=}?I0`dH(mF!uhTE6(0*l\VWjEe %:Ubkjbdoxqgjg|Hn|Q0 sFD#bAS5 oM' JzG{ .HdxvoR%)WSH/KWj{=`}mU3;&bp`MTQ_XXDF R-AYhpgfyCz{lhbSF6ro`Q:-!CcL*Ny3r-`x}cF#n]A&[B*Z0P/AXrDpq^RF0)%,CRp">YdbA9~n]? T$*[9T,DD7unOJMrCoc3b!bro5'`l~<(>SOI8|dR3272x9gL86/@LVp$YY 6RzzMx\L9* %$.3BLR`oiIc4 T#:y"T s_U`oYG341DUdry~~{~yb3k)&)1\,_)AGB>1slviW@6&'!)*$! zD=c~ /<;<0( $8Y{)391\1 !%%_1 .Jey5^$#-4.,f:qM2Kv"Ba|n\NSbq(IamM"^*b5N2%i.MWfcgkvW;*#1DZq/hJU@xxrsqsy*Ng 8c Mtc1_I2.+++~rtq{~}reL: !_R:Wt}fM,uP,sk[@.  ,474)+c*l,`vypkTF"uI~U+ (=l=wSx=P&yqpr{jXG0 ~hYA<9Ts3~D) ] g9F yng[fw ])KB{NY5S`dO2[6I7 H^qseR>Z3u<Hn zYH9:=RgtkD5F;tP2zK6g3s4 AqH9f%Tw\:wA~bHCEYyTRgK'zR#3b%h8_ Uj3cxYB\4)%=\uO G]R]%|MTG  EDUQ{P |ku8#aEi|}i?}Z6#  1SsX"Q(vdL:$4d'q .SsJ-   -=YtwJ[9*#& Y8)S6p#`4j\2 {fXYRP<"^*k[JFAJQfx*Z 0NvxI*0Qhx{{n^8m:-@W`lplwy-r FXoDlT>3,("HcGHUv ?`{/x eA,4y @~ux)PpLTCs;oq2IAo< {W:6w8PeY+axfc^WSI7w/_3   3T@GG9 &Ed|  od`]hwyvtleq{unbZF$\. /H\} )L[u*OrY1|ZA$]$~eR7,$!$*-AMo$\d=g|c?"_.yY&{=ngmx Q~._&^1AKC9uOj=fC&{LJyOp4DRRM>,#/Id"6DU]ntv\(|9~U9  Dh#(;Kf~g@ !oVMBEIVaqy@n!*980p;v[?Ks ,Lg}ke[g"DSgm||mT+k6MA'*;B^u:i>b$Hjd> zcB%yo]M8 "%)')2=[|9]wA #5Fe   uxnocRC-;l#!}Q z?[`)2XG\cZr@sN( (O EgvqX: RrU'`$FkTA y\EKf<# :WcqcR) + mA~}>g=z!2AFJOOTT>)_+8cu=Y"i0;o;zV;WmuxjM/nP(&Aa{"6>NWKD$8k?%?Q_jdf`bin $.2* ""-23.%&"/Be<GOG;Z;' UsF( #P} )CUkyR^ uR(s;B&ANH+ /Gcw(Gd(RnvO~R'lL-jXQd~/Vl||yeT:/%!%,8IWy7o 4Ruw@q*nJ3"&'8FKYXTJ0! '-4;Qrc&ylC( zQ'oF'.VbA!/O 8Tz2X3BLI9"k/l6{rzwmbR@,0Gi}~zpx '>I`kx|urbQ;,",I`{`L3$ sdRPYgAdoe^`ki|{qgUF=,*'" ~R}SZmR>3-6Fc5WI|+O`{^4|O)z[O8803,$3b[xY*`&!) 7a=[vzcWMZh}^6 "5@UenvxoYB'2[~Y: C_3HS[[I;eC'_++Ca~,ACG5' OfvhE'S098=ALQWI3K~N+.?Ugilfit >m9Wh|}uU/zB1Lj}V2Y5/s=_vusmqyn2?gn-_' +Cbq*`6Gdse8 _2 &:UfiQ2tjrugTC92;Vv+at^7iG(1j+p1OglF(`B;6BM\qvDPk[D:+,#,4:Uh;cLmzj\G<"a}xtFxZYR]]lkppcegxRI"a)?J=.\7w_UNFMUftu\6}Q4/Ifw,6,`8/0;Zw!1=INMKJMNHF9'midv7g~gC4!$GhY|g[gvof`hz((6<;@CG??.&   ,1.w< 0Qd}~y}x/CZgcjpt0kn>^*sWJ7# (2AEU]w+Gevm4Z+19>KSagsx6PXbZTG977>G<5& ,Jcxl^J1  +'.(# )RmwA+15.safdjhf`L@/ fL/0Di k(v !   xI!zlTA),;d,X0Pf|rW+_/fB% !Bozpjolqrnqmopehhmy~ ,KRZH(_E18B`~ +Yw.,.( x^F=3?AOUQM=,iX;1& "%3Dc 0Lht|zsoipwqd_LPDB6+gTCHAIERVil|{{vda^dm -VrFiYNTNNC4*!1Tk (((&!',1+C *<I@- p*{cJ,$Lw.w@ Gj~~oL$u`^_mz~zaT6%   [!3t0Sf"_ ES>@4_- &012) *JpuXKAW}JD`{L~(;^f3"1Jtd$Mv%S;KmLd(k-Zagx_LLGOO^g/s+Ns0e|$- i7[50w\V#2Ttf>sK9.(>R|.EJVQK:$_,lKFKf>tOyoVC bL<;EIZalndcVL<7.((,.6AM_s -HhIk&5DSg~|S}E oO@39=DJN[apxthYY_{I*++#rI&t]=#3o)_|rnbO; 5[}hM:&"sO<6G[;U|Nu~dL-h;9NWXR]]jovlbJ=)*0Dbv1>E?&s8~l`[JJ3,0Un")),#$6Qi|`I<.?Rob*wbH21Np $Nu '+5-&{UuC 'V *Fl3D\cmg^J$cR00/"Am(g Is,5D<!vv9v   U0)C}\UONi#Wf"  \<#:Uv&<VT>ZTR. D{5Rs6x#=;-k[KMJNOU]\ku|kG)u?ouy.^@lzl]PFB=A=@;033=IZovwaH, Y7xD" Kq 9[{OLma'PW phhu|,^9^rzs\O6Jq,IbgjU1XPn5W zU]_\ }`NMRj-UI|g/<}_hRXt*dLJ \!X_0WY`$> )GXr=0IdyzzvlN.Q$CewmA{T0TT~z\A&wmms~2Kk~hK(iO)  6Fc~':LNNM,@_  %+"K dB ;lkYKP]o4JQen49=0p> QnF85F`@x (<C;<:;A87&Sjdd{ Y$Z 59*nA[WElPtU2X~SN`-dN6& :`}Ao,!cE#~/Jid48Zy}jOA6/6APX^_^^h^]L> 4?I;4oC >\ (7;:5*!"8Qbgqt}}ztpf]O=. .TywV2 \4 )49:/-%&*9C[r4R_jjqt7MjPx(Cwux} 0Op:iaJ*%?n #*?KhW)pF&q5h:%Il8pb9f>"aK.DURK' wNpbc_aZY]Xp6|?RQWUVVF4Qp`Zgr )Kie0eUL\bz6Vv~a?" '2?F:3W,-O|Gc ";NSQ@&{aA6+(*9FX]`Q2r1rI3+;Km.JtCi#" hI)~Y8yN'ZINu ^7  1L_ko]Q2t=oRM U|rpI*PtRu 2O..AYyvN W+I pIy[b2r9}-3vy}E.SsurR3wWBB?LUTZ_`rV>ZkqnfXG& Rl8"&3Ul&Nayz~+8AIJJB7*k3e>!x3vJ,(6\5RRj\JFJMdx+Oms5>+FBv<"j !@JTa[ZD,5q?IHp|[,Tm! Q!bR k6Y\XD \ b^:Ku6czkSH2# /Je!0=JWW\PA$~>Ys2 9fc6v[K9,2Bd'=(Nu|~|wrqgZ:jVCD<D:9' %510qN, ,Co?c 'a%o8xpvEl!+!*N#Pz_3oG$vJ?[->J\ezj1rdebegqw9LdlncU5tT<'P,_}~ufdkuv`9!m@$.a!WroQ*rW999Vq&Iq}iPA4 jC4"*Ij%DHF0kM?9BLW`hhff^PKBDGHUZccTK9-%>Z#Q~1`jC X9[,}uzuobT7% -lGDf?iYl,tRD53&!jaPTSc|#L~%k+`T#X6 ^F/#%,>G[jw}jdTRILA@?EXkx[E,!#)>Vl:l {cJ5# !(k: 2WY #.5AH=7${;`H1196DGVWeemjhUC" +:14)%:]_#Soxx_S@7$zb?)\. Ag-Kl|ug^GF>;3{kpmztkT@$[)Oj~#B[elhWC#_. t_@-._!XwT#K 2Optw7`X.fA5,6CXu 6MnxdZ>$!Kss>Y5S0B;Wm<A]u{iaSS^m!"t._uTD0@T,a ,AOTfss^: #0F_tMbAYD-+1SwTp\TNPWWfnX <Wnwp`>u@c3Bc<Zz|`;y^>-"(3Su0c }_E,}oTD, $2K\wqM3-IR\n J"(/Gc jHX%w`4wnn{-APYX\W\gV)`sV(vdRF4-  zljeXVC/tUF9?F_8b-V.HcuzrXD'oN7 |R0_ ' $",45?@DGA>40 6@IG>2 2Pez|t`QB7/56MXoyiTF0% #,&#tfWP9)idcv :Vy1VuuH>gP@+'%3\qq\E"m<^3{P1Ne%_:_:e|U7Kzl`TIF7/*(!  F|.Kctn_H>-,-%,&*$$&%(7AOS\SL9lF  0:KYhy~gQ;,&%?d)p.\vw^E&eFwM1%3W}zh_WWV^edlq?w/58+&!k"i<   -7CM]iq{~qkZL@Ri$"*,7>Sdtuphhnr'/+%zY8z\H1--4FaqnM/utr80!^q%xB#j0|khuC](b=zQ$GPI*v&1OV"jM/)$/@Kg|$6>LYo>r1_}U&]\g/4Mi P'a*HbtP.  :PY^UC V/s^_\ZRM>=:>T`%{/Jaj{w]5jaX^XYH;$xeXNCBB>KYp}tfls*?Qfs 05=<%\7%8O_{1FKSJA%Je1}]D=>OqCk$,4--  BXz -&# k@ x[L:52.6>GJRWMUTZ\ix ?owuhke``agrjbVWSYTRF,ylbepx&1DJMHF81* mD#?g 09Wfz 8DCIHIQIOD8[yMeL9&*0Mg)V 8X}))266/&e= l6pT5+(6Js A]uuseZR@=:?DR\_inxI| -Ef\R`='"B;*~[>qUB5#"*4GWm|l_N<*&AXdy/S&BYrz{iO8r_A$~mNNJ`r!?c .GVdmuxpS0R*hGnOD?HN`p 3?Vh}L$Y{2+- Wm9 zh\F;"   Bl Nz)Y}nJ/ wIhNC95-(Hm2My *(%`1U$#[!e/Jg|u[4~ZE+'6JTSM3!a6mP@478CJZf}SR-awS7vaN6)xnwyrnWB#2FT[r Ct%3N^v~fG#g@& i;!SNu~{gR8,  ^) &Ee+d&Ng}u[8sk[^U_bs{{Y7 qU=${lev"ZJq%# M) :`qT>&s>ynfv,]*B]s ~eH(i*gfdt$Mo>VzzeXJB73."  # tgE-'It:a1C?C;;-) |yrnnpuwrjT6 |cTIIJW\kx} #;FU`VP@6& "'H^u lT<!}M( =[n;Tq&EfsU0 xT7J q\ILNZccilwy!P /_(ATWKB2/36Qg|i=YxWF1" %>Wh4Ls "'3/40(!\6mUC,%  Aa  /Nv&<ID: z=w<(E` 9Nu%/&uh[ajpX6c.7e(:?GC,! !Cx2R^g\PB*m;~yjeahoCd|uO&cD+*9JjGq-5>:(lD0|aQ@@HNe $ !\&@Ul{JzyZ<2`i[G9%y\F-4O\u:L]b\ZROH:1 %-;>B9<0729/)rI- ,_ &27>AC97- %\+ESYOKB>;(^$~`QC?34,28BYu ]+ +M&S|Q/$&uxol^T<) }=~xc{X9{F\2jQKFQ``F9Ldm{ueL&Pd)r?Bj,-waR7!U3h Hzt>qR9tZB>C`~-5-"{[:%>^x5kh/),,189GO`jzd'yK"Jp%*9=OXipli[N:! %Jx=_mwm_K%h.eC.$7Pk  pZ>+'Oh )J^rwoiWL78]Eo]< g2qS2#);\{yjd\KC-"0KuKy@R}Oz'^h'q`M@?9;B?Q^z,I`gsmj^VPLZo$S L%BKQG>+!q5\U&}bJ72%.1IiL|,\ 3FNSPG7+ sY9l@ucJ@@KXs >GHNVPVKG1#xYG+znXG2.T{(f%-Gah8U%{O!G{3Nz0a(Egu~mJ1a,eE),R{ 4Qo}a<rT>>Id0<D:5*$! $%%"kV?("#+Da+Lg!5NZjieF%p(c; xYTLYfz?_ %8Vm};[cFNAT# *8Um";Vf|7Xp* xUD,oK37Uo+RK gD4.,7=JQcs   &,/Po])o[C.[$Hyi@ >Wx uG{O0 0TEsZ8EoYTc2fA|.Na\T:`,^,#U.Upx|qiXL8/ xcWUZdeqyN<e`1 hH*{iX]exgSI;@GRez;P[kzY(}A Kq 6a{zli^\SY\[ivvR( zEeA42>Vy /Z#T%MbfjaZJ=% X"Q lSA6oA(+KoV?h "25:1-" ")76<,Gv}].GeGzx >t/y KsZC4+#!%'0EW n+Q^ lSH?GZmBcF |o\YU\btuG'jR,?d %1G]nc=v?M=e,GXip|zxrsuu0Z?g!8OTQ=#Xr\hJ&#?Xv8Xv  4KnIse#m.V#tO& %?iK0D]evvysd\LICCN]o{b9~{$S@z7YqV=g;!"?Rl~`1sfp,mJyFiW4Y%XE+"(>\z-BEPRLPQYck16FISIA!}X3w]OBUlucE18Ui].mplvy:e|^F, p]MDAFVh #>Xbowxq]<#wbF7##.Ff(S~0Ncyx]:E*Pg~}yqvprhaR2cVGFNVp+Fd|_2X!'Em +8>PYq #!$$27EEJ=# nR>! xhVJC0,'*+8AJV_ir|Gw M]; 7ARZejtz} 6U9cw^B _E1!&/-b@ 0Jjv$Kwxw|z{ncM8tT1 p`\]tGC#g(-/Z3|gXA4f@ iYH87=RdO @w:Vti9 sD"rS/&|2d2@MMTME1tHokebm&-!vHbE3-/:?SjZ4@{KhE* '>Pj}wP(b6 mTB,34Kf/k4U*NamcJ#zInLwBsR<%  -HcN7nA]^=u_C.aD$,?MQ]`ox >u6lk<f;kP3 $1;GSR__fnhlc]F:3Nq6] ):==1 yO"W' $5HUn~+DfvW5 g4 >bx{ubZKC;446=8?=EQ\uKyb7|mmw1D[jrzx~uxqbWR@=78454) }zu&lZJ925@Sj$.4CJWV]UVN=5)fO,8Se})1$;i0Rit{pl^XG<, nV<'k9c[R_q{ /:Q\n#Eq17HHONF<'a>g6dB"$?Zv .\zpbVRTS^bjdaI4P Aw^URW]r:Qx1Shw^XW_tv_N3nH /n Mp~vwZ?%)2=70kB%7So@pkUG1+ zpgghkrikbWC/5X )7KW\djrno_]RPSOZbq~ud`ZVchw}~pUD0 w~5>NQ^Ygkxk\I4}Z.od[TY^s1Up1e-DJY[dilkkddXR>,pZ?/ lS4%>:CT]v9Ibqz{r^SG?6& 12/ 1Wzt^[U\ZZV?* 0Oib6 -55;FKbxbJ,yZ8'!!4Np 9LSZO={[G;141-+6?SenxsgM2 }eMD974/22:AYiFh,6CE6%M'~teRD962-*+/Cbx+Ss$(20/' waQE4* zjWL6/ "(:FRf{+_ #'-$|o\I>>7DN_hqsdYJ.e9 tR?7<;O\q;r.u@fyP#D$E[szgD C O'8v ge*Z~jT1 p;xP@49B^}2CVXYD2kI,hYBDDZ}T'`4X|bFu_N30ABKKNL@?4- h:yokjz/pL4AJHB0"ydN4'#):K]mvoaH(a*d[Z[q0He9KY]`cSQD8'<T{ eG) xX<(& 3Fc.U xCydMKKZn| %,+" {pU@(9kT$BOTI7f5}VC92>Tf4Qpg@y]RD@:@BN]lBCS`XK4iD#'Aat|JR" 4Fk7S{rT#{.Qyg\G?+ 'A]q~\E$zkdWQIKPSep8[upXB)}sc]SKB411>WoCqJiUxEoOD72:ISi~qbWKD=BPh4NeuShH:&&'"*&+(%.Ia!188@CGJQMSIJGCFLWb}iU>:,-1)/,&#xfRL?DCQcl #1CU`wp`SB9,"r\TEB=9??C?B9<126/74==?GTb{Eaq,@DE7 rP-wl[XT_jp~ ?Nbli`K4-Ol #( y]=Wl<  7[ 6Z&zG |V7,&"*+,+lXB3(",Ec4o=@t+?MJK2|6q7d8$:[zxskv =g2if6{>|7y[OHQ\v)g <\}vS0vYUKPYe}:` W$nP/  7`9kqgVSNOQ_ka3uI+ (2ESo"ZqL'wcaWer5F[bpu|d>}rqr|"V}3:GLGG9+\3~s|~ )F]y}tfWH% oYHFMZ~%Dm~r`E-w\I. 7[ K8R_f]R7l> zL.5Mq6_z]@9zAqt\J, _l$l<Cb`]9D6e> "/DZxqGj*_@75KhQ%c  Y(`' 8f   ,Tpq9fZF?10%)%/8Ea =g|IT13Kl+[yynaS<1% ".DSw`8Z/}\<.  #-2H^V6iwknnx4H_gpbY;#{N%jI'&Hj KrV>* )4@G8.b@401D^v/FWqnS, ~jVD4&  &>Vi8Lh~|T6 xlUE)"7IUn $5?JMDB6.%6O_psxvii\[QC6 d7 zgdbYail~']Ey:[|}eR5nV8uaB$ sl[RKJ[hB|<yDw -Oan`Q- s8ey8ud_ZUUX_kirorjiccfempw"T3i!^<i~b3Co@kF'!6G[py0XwnHviSD.'CXwvl[TKGC;<;BIYj| 0[./.! W+!;Ofv~iW@/}lZE1 )Fm$C[lvy|yqoeaMC,!zjbTMA=:9CPjGjkU2u_K@5, +P$BRad]^WWRTXR]\dihrzk<vH m5@p4] )3DRdri>iA3NbP %6BA;.uiW@7,1/;>=7* Y<iI.(>[y*M.l3^]Cn>j_R>/rWLJSpXa-OtyjM>(kO,}eN/ '%8Cj)895)veUSRcq'?_z}c?) .8JMZY`b\VH&uB$$?^Lq.VwqKVj?#Hi{Y+BmJ}7ZiwrkM4{L|tx 8l mFf,!`%;F`q{^<*:Zc8 ~^2vuy5f1HLJH1" '?`w@ol@o;rS:/$%)2;@M_w zjhhtA`&EYs}{mL)D^5<^y$ !Nx5c'!o%b*e>1T+>Vdz}~l\B$X2.RH<pb(f Kc5 $Q J !3>:;.& v^A0 +A[1}q Kp3jHoe[XYVcmoVD) >i/f>mtFykRE5oO1    ';HTeu'F\y~jbUA:* |gQH=ADWi{*EVor|vsfPA'v_H/#(@_-DHUSTG>(  #D_bD -:P\loqhYJ1-Qj|hC$}p[G3!0Mt )H]sm?t_KILIZdx!').09AQenoN,mN6"!# /=Uo"W ',0  );@?1 kM.}a=#5DZjx-Z5CQ\kww|ymS=uX9l:;a)-0;ASWehsu !qN,qK* $45BBUay)T|y`KA@=EGQGI:0!&2Ldum5obTF>4* "Ae }ui__cs "D[}%FarwnN7tXA%|b@# 2K[w<p1t j*lM=- uoeH0 {+\}AyGjw`<"w_@0#*?HSNJ8rea`kw.GTdgkhXM8-#-@[qwzs`TB;3# u^D3"09Uj!3<==99.*&-CpAWlzywh[E ^*m\D)6bGghFqfao,a7E\hnqhV9 ]FrR.4U)[ndciBs'MhcCp3h/.Qu  o`UXcz+f)DP]TQ? i6U)uaflFy"AXct|yp`L9 ):P[ptsnlmnsqlhdVI7&)@HW\WSJ@6"rvvv6Ig||gF)j4 "Ju6VrpX> Bo"/30# iJ%~U<+"3T%a m.t==b 9Ldx8H^_gh`a[WO7d1oQ4#1\9O[kr||/Trs[6f= ["iXC60 "*4J`8qIz#/8<IR[[dd```VTG>+ e>"hB!B\5_ .Hm 14;*  wV* ~TR)iB#D"\9Rp +-30292DLaphLOU"&KeHn|^<"5[{/P[kdbO?) gJ* to__]TWTMD- !Gh "Bc9ceExec]TJ;%`< -Fat *MgqkXXVUanqbM/lUI884;DHVbx%1;BJIHE6)  2JbxaG;,+""  #/?M[c`gegopzriO?%,>NUht^=}rdZQHMMT^iyJz@l_? f4 s^PC<28?DWe}7f (7CD?1s]Q:kE!8E^n 7a,4A?HEKPIPO>1aF(zxu+Db}^2 tknmqvy=QZ^TD% 3Mev`SH1%s_I=0.)39Ocx(AK_ls~~ueT?/(1;69..( sh`Uan %2BCGDEIKWao %+6-|]G5#cPE66031425:4==A:8* 0\!U|$5@BOPUQKB)pK+ vgVRMNS_lykmn~$=_x+E^yw[9f1xdXJ<+:cz(Px,;JKQHE-jAs`_[X^cn{Gm wun\S@4  #hP. "8E]y=Vu|xoqortibUG7*iSD;,12AI]oy3C^r~oe^efyuO.q?.Im!+5:CC=:7774=COWepq{~ydM7#gL9*),3H[v (Khug\PPRZb]ZG4~ssknjnjqmyszrpgWQFEAEKJNPS\\p} 1Ro}hF, %EbtvR1'<S^s{~vg^G=+W; 'C[}:Pk|hI{kcVV^p$DXjrlka`UUQF;-  4IXn %%]<%0=B6*{rh\ZX_chv@g[0oYSIOW[bonz @^ GseM2lR4nUG2.&0:Pd "IdwmeXTOK>3 ,:DLOLF;-)EgyeL8"'9KXj|xdYLE=-% !"#jL& #He(QsYK9. 6Oit`H2o^ORWk} (Cbq^K?0*+3KZsylR?%Z>  *4Jd{,;HKNLA;1+ %9H_lvNZ/3Tq9Yvu]QKCHOal{Nu=oV?( *HlCp=] $U%^ |_M9J^mpX= g;" :h +2DV`qy}t_M5 ,2;@GLXYbfeebejktzt\>!D_pWA {bXQV\\befkgt{ .BXekkaVE* (?_otfL8 g=!=Tr">b #);@OSafbaUE0|iU8) zqi]ZPMEE?ENSj{,A\n~hJ, x[A)2T/J[knujfSQBA8:7* 'ASkw|o[OB1) *<Vv!<GML9) X3 Y%zj_ck+]+:NXhw0<INE:#y1\|Cp-UmS8%(,2..-42@G\kmsg^F5 {jg`_gp.CN^akc^D+U8 &/GSn $9JXm~ $?Vjz|{rjXN8& pJrT/ '7Vm !?[#I\llY@p,eb: &PV1l->FIC<,$xokgdnp~}iG!_-j= :oBD`mQ\!U\9" sM*"b@=3}6fnM!k+t>ynXJ3(&5L_1Qcv}fP?&(31.qmhacce_`]UUWamw.?[ozkicWTE=(*7>IFA.})Qq`7}P!Fl1dhG+Hn}Q"k/ 0`L  >V]klngYK2yC oG6)9Kp 7@D8,}T8+c<:k{V,i>wfbartmb^^WYTURWbi @r-NhyhK"t`NB1% w^@4+-/>CV]lt'.)(+CNcky{z|{vxvzy}ush\NC9.( weNJIOd&CasvY,gM0"  -]9md< {x}!)4<891+|`J:/ 8dBq-CIMNCC;8/+v]SB-  va="?e6Scsppi]YSPRHKKFIJQWcjpvsvspfd[\V^a_c[P=% uUD457HW_p{ "%26GQSYSPB0    !+7FRQUJB.$|kVPEHKOah|hZM97377ACPQcq5j|gP3 vykj`[TV]ct%<P]kuvwwpf_ZWUPQPUT[^[\RF1_M8-  #Hn$KoiS=-)#&"*%% "06HST_`d_daaTI1oP>+  #6Ww!Bir[;"sg]]dl{lfXC5 !>\<u=Ztzu`H)dB(hL6"!1Jc6f+Rt~hV;#U'pldjftvoV79c>]z $,)& m]J=0& *89;3* 0L[ttoaJ;u]PIBIO]k{'Hk'a1~|potu1JNTLE90({+R~!Loq8t-{Bmlk{#Dd~ "17(yY5#!/Mt6g5\jHg*j92Kt 8AMQGC5' r`cf{ <v@g[2C`7;W}  +6@MVek|c:sI.2LuA`xhbSQC>6(#!#2Okt_@#hWHB;CFTZo09LKI4vaTLOX`v;aybC)m[LP_q,HTep]C ~znx 1`~~ygV7yfVZhy -UthLs_SGA>434;FSg "B^ylP1 /6IT]r tP|i\MNHG8/ 6On2Jg{ # jN>+;LiycN9&'=YgrujdWOE:2% ld\Wahz !8JS_`_O@( .Lr qZ7" 8EV\[^[JA)ysfbV]^jx|2Li !/=CII>7(dEwW0&3K`y&-2:AM\rhWE&fD3"  .FXu.L`}tl`[OK=7- '.DP\acdWTED:>=KP_cijjf[UH=/!oc]OQQWjs $0=Sf||hUB3$ +;BMQZYdmottwtihccigpmshe^\_`hwfM8aG& =Unyyfa[hxGc:Sju}upT?vM"wP0 '>M^n/T3^Rh'xHpfZTW`jz &:^y+BRh|   Y2|[;) 5Km@_|s^M1pgVL=2 #5Na:`~y[A"}_PCEL^ttiYMHJWb;] sSA1 |pir0G]o~zfK)  waTI5*._ 'HZsvhVND<6'#%)5AO]^cXK4o\RHIIS`j1Ge{{o_TE=3.)'   }|bQ<319Ok 3Rbu  # }dZQLOQYZ[QG1uM!4\>r,;?GJ@8%eC- uR4 !?b FzAbycS=xX? zbcY``px7D]mhI, a=' (E]~'>Yfvzusjlmy}mdQL?5$ygTD4%!.=Xq )ATgp|s\G7wbXKJBDC=;2/# " -8M]p 6RjqN u`YPOVWer ~ritCc3GQRN7#oG~R&>g {jcZUQSY^nz8hjQ-xiaVSMSUanw !,5@HT]dtyX=g3 uf]X^hs Cd#Oq 0BM]jx}}qbN, mK,U)#<^r>b+48558.62<7<-% sI(ocVRSNQQMA7$/;R`u!:Rk||q`WD@.* $2AN[]c`c`^_c[\ND(}rehjt5SvxfTB.3:GEE8 oR4($*BZt %1?HST\`[][TP>9&#3=OZk}mY:% {ndq|2Jex{kTB0lVE204DXs 7JexuhPE2-,:LbpgH-   "5JP\XZYQPJJB=5%~`@$ ,Cf *5FQ]Z\PD6%Hg  qWF3 ypcggou  $ !16CHJPRUORGI>;-$vqce^URMQM[at-=Zky\:||}{qqp~"G\sy|vh\OD;*"tZ<,'9Ql?\txfSE/&%5B<?6:,-$ "7YvodW@2 bN;0' 3G\iz #D^}h]PKA>7& gT?FXfz'&#f,Y |{/Vr.G^lj@M hC )Gh?l7^wqryr_O=#eH3% .:M`l&>Pk{sV<|_F9&'*36@@GOJRSVSVVV\bq{1\xcL9 ncSUWdl~#<Qav jD) s`LA7GM^r1H^lsz~zmaK,gSD==HV_ny'RuriN<.M]qrvmjg^^YS@+]: +W Q+$vO#qO*(Gd>[gsrkUA$oG- &8a:ZzhE* +PoyaCgSHEJRU]XK=(!08CLFMJOJJHHKJRXhuT-JTaaaYWM:( d'~M+@Oajururjjkw)Nf9I^eqmqmf^R@( X$V1 "1CYk%"&&.38IUfltr_L)o`[ZUXXX]SSPUYj~$<Qk{j[PKDHCCC61 }U7Ae.X! w8^1.F[r9[zd@ T0:St6Maq{{zX@"pM3 5Na{'8MTdm{kE. {xomfcXTJH@IGVcn#+)/.45<=ENJRW\adhflfjjns{sfO>&xif^]c]figfVA0.Lr2Y);MVhozvs\K*yg_UTN=0eL8ukfhpv)Td8tqLD qI( .JdOUpC{Mg: 1Mn +:EQah zX7f;{jcb`jy)?_{8Yu '.%Y=#rbPG>:5)# .9=Pcy,h%ANXNI7 jG0 YA"*He{ 0@Q]ekfc[UF:&o]PFIKTSZ][`eos~ !0=O\pwkS<-l_VLPQ]nw #37=7/wwuz}-JQ]TL5%|-<CGEGD;8/$mP2 !8_S$>JYc_`\G7m^SE>51&'!! Z7W=!-DeP:v fR:)gWD.$'9Mb1VmytfXE, 6@S[^XSI2# meZacr}z~u^Q=1("(9Nn9[zybE2}dM41LsAj5;C>1 xS7 sialxoK w{~4W=o e=/AKRNNEA:,#{]D-7TAt+=DA<+uCaL1%Dg}iP?+#-CZy 'AXvzdF/{qgikvq\A0+&1CXv0OlgK("=Odn{x{neR@( {U&p[VIJL]r5U ?n"Jkc+j%l=~6eoi_`^ir*R%3?CHI=4f(YpYURTct,YugLA.)#$8Md7b uEfL.&$(.?Oh"4@EHC9/ ~m`NOQaw "/;ESW_ec\C-aC 'Kg '@WrkO-paSG@6:00/*,+2@Wr3Ro|eN6 mW<#(UEikR/pni`fdnu*8EJ?5P+-X|Edy\>! (3453$^<zz?d1OmlS?,uf]SC:+ ,]1[p*8GGD:$rW9{YA& .DZr-BThy!'!mN*q_QC;(# ;Lbjssvs|/@WfyiL*~o_QD,"*EPiz{aSHJLS_r| =^yoL.~yuz   ~qaVNLQLVYel|.Osa1 tqmfjlvygN9$ %9Xw=f zK$zoa^Z]co "3GQ]llvvyrbN3u\RHKRVfz:Z RnS<2/(4${_M<246Hf(].FSae_]OC(F K3f+OqzfN+yfZLPYn&Wk<];  "B`+OplW:$}dS>:9EJ`n(\:Xj}~pU=yI(qXM<1%! 1Je|FtiJvndb`\bfksquvh`WD7*##.BYt=j)Vx`/PpG"/E[kpf]VVOWUdj}M|#WY,u+m/gYPQYl Mx+?MWPF8$MxA_zt]?f5wfRMHHLJTZgrrR0/H[t %@Z  uY3jM9% @^Fv$+CPgpz~yt_T>. oT)dD"yrghju3_Mtuje[ZROC9+ r`J8$ %>f'\  nG&}w{w}>[j{ygP5zps|%08=A=B>C@?7-I6f?c~P-$'*056<67+ uS: ;a+X&.*."\2_G.  (*79GIQQZZdenpz*Jd}zgYH+ &-DUn|nP=$||nl`ZTTRZbeu!Bd}|widYJ=+wf_RPM=:* @l 1Pr rQ2yV*|gWUS]h{5e 5LScmmsqmiYUOQXYfrwtjfZJ6}fOB7,vfVJ>2+ (>T{ ?fvlcXUNOOLTWelqCqVMBMSck};`~xdK2uomy| %Ca >]|^?!c=iM<(" ()5<;@C==6739>CR`u4` 0HamxyzudV9~S4~eF. +Z|0b|qrvz (1/0$![5 eXC:0355?HXcs~,3FO]fry{h[F+tn[VJE?:<=FK[fp"6N^s{uaC,,F^n}ukXF3 ,2;;>:* "8LWmv}rXI/ ",017A?GGNLQJMDC<@>LVnhE( {hb[a`ozsmb`Y^^[`es}4Xo  a@#<XzoX=|me\J>'0Tw#-@J[exzwroh[Q?.vkbbesz-Go#1==75'sW9!vZC(0NvCn%.:2. kWC:45859<@FDIFEA5'||{qnffelu9X}  weQB51')*..67351/# vd`[ajl{ '*;E\g}j_NB741),&)))%))'%  0?Te|lU;' .;GEG<." vy}~(7FP\`ilggb_\MJ>4)4DUdq|uncMF1' "/5CGNKQNINKSNSPPNB9) )BTgsv{yyujkd`YSJ:+ !"!&+*++(&))6>P]rt[:$ (3=INYacijpolkgb\KA3( -4FVZklrkVD( 4?X`rwtiY@0 +?N]pt}{zpk]WMC@0)+Pj )#viVF0"""%"umaY]cs2I\ycD%mYE6)##"19IShu+F^v%5HS_jeiaXM6&u\?)o^F<123?JVbqz!1K_jztT>'&2DTdr|vtificnr}}s`TL=82420347;42.!#<Mh ,8BFF>'g; y^@-+=Rcyz|!P|"Ag}x]6uDxrotzy 3:BGBA=8,'":Ss"&&qD |X4 *=P\v5IYivz}|zzyxtuw~~sqncaWK4uZM>99ETd{)9O_p{neVNEECLQ\lpwvljg\YQLG=:1.&yre_QJ>51&##*,>O` 8\  ~sjlgldfZP;eD !S:m *HktP*yP({nWG9#.AXu >o.Kj{~jR3 ~Lykeibhjpuu} #4CKZ`ksvy )Haw~yoV=wH|kfcghnsvzw{|&(,,,&)&*3/<<EDKQUdq}pgdTK<,spkqt.Lk~   l[<* vgROJTYn +:GRU\bgimja]NE70%&$07FRYkxpY9!cVFC=FMaq.d!&!w[B(&A^hI8%  /E\{iP)gH'&qdXWS_iw$'$*+.87BCKNSTV[[fm|hP8% '117770*   .NgxubK,tkebfep{0MeuV0  $7Qe{ .:B;4"fG+wiZF>69=Oar.GXbns|{{zstw{za:{\QKELT_gz%<IZanx{zwljh`_]ZZU\_ehmloj]WH=.!  5CUW\YKB8'  )-6;DKQZZ_\ZRL=9*&$7EN]er{{{ke\[\bht{ylVF*zlWQ@4) +A_!Bewwpc^VFB3&~te_XYSX]_o<[{$NniR4}W6fI& 9Omz|vomiqo~'N ".?HY_mmqgP8MY9&"*9DXf2Ii}wsnorz~p^UA.v\;' 1J]}+@Wf{sbLA4" xq\XGJDKQVdt}5U}#1:680'rZJAAAQ`um`H; wbJ9))@Z}6JftpgXPH:6.+    ,EYot]J. !'&&$3Qwu]J/p_SJS\t $,,%! +T}+0*tArC5Zt+Jj|dF,,Rs!:FTPJ7#Z3oP/ "He=ObmqtqjcYP?6! "$)-00544( pg]]V[U\ZZcl~8Vh|~wh_VC:,%+0BOW_mo{rP.jVA@:EVaz8E\dmilja]TJ?&{ngbfo'?Tj|{lT?+~zz  $$'qh]dhn~"JtgU9% "<Lbpv^C u_RJKDDD994:?Q`~#>Vjmusf[C, vhWUUWgw/Ie~oR'-@LNYUWPM</ic]cnv>a}wcTD,"uaE3 $;Yv (H`p{X> &.8;CAG>>4$#CcsbI1 uaI9-%*19L]t 3He}rY= 1:IAA-#  .AK_n~t`U@/z{}{uhcb[cew"/;QdzmS)yonhnmy %" ():?MX]it}tkZO>)}dE4  $=]6O`qeM/ xyswsx{wwmeWI9(!!0>HXaq{3Z+=FT\eiqobU;#mK1mX=*&=Qhu#Be~rfaWUPGB:31"dBHt*PzqgUM;5*xV7%17GRkz$ '#%voi_`dgs"$*339;BC@=A9==@GM[jyfF+ qO7>_ 7DSYW[SQKIJCKNTW]c_dc`aZUKE>1-$!rJ-&Gr%Dc (IYhc^I4xbS> nP0  .Nq,HS\WVLA6)!(4FJWWMI80hG2 6Ibz$Rz5ITQK9!a2 te^cjx$78?9. ykbdap~!FcO&qQ54N]pvz&Hi +035$vU0 lUD;;FSm+5?LPUUPE:&   '+8@>B9.zdMC:99ABOUgq#*09<;;4-" %&.*/,.,12.0.20;DL_kl]B. wsokpt}-;PXaaQE,!&*'% weL:#>o6ctR=!2JT^abZPG0um``fdpw+PosW6bA(0Gb} %,% }zt~3M`s~wkY9!v\=, !?Wv'=IXbou~}n^D1iN0 $*/7;56.255CRf~<Uqwsfea`WQC4!rX>' 1Nk:`3=KPLI=4#maO@+{P'~bRC0( 1:XrBt!G_{{jRG6$  ';GYdhfZJ1 vYB) 5Ut +@M\\^WE6!6VoT*rL#+CXxyvvz6Oi|qdL?2"}hUQNY_ox %/296<><CGOUSYUSMHG>BBGOPY_hjfcZM=.s\B.$>Ut'/@N]lzrfUE6 v`M=%%,>Ofw /GZumW7p_MKLIS__ddbVRI?9455?EZg~!$&!! %%0151/# lRG9:7CK^k}%A_{wgN)  #08CJUV]UWG@-{jeYTIF:7-'  $)9O\z  'MpkK/~cS@7)#!(19J`n)HZy|kO7f;+APer~ 1Nm )>S[`XN;gD|j[SLBA:6/# +6H[q/;LV]kr{yvk`PC,{wvllc_VJB6-$#/AMdz #/1?IVekzm\D-vn`]WOQTR\dr '5COZ`kmki`VF7& sgZJ?/&8Sn '=LNPE3# #22=<CAE;7&|fNC95>G`u7V}   g4uK, &5OfwnfZPRXh{6VlybA"fE/"  *6@MR\\`^_b^gkv~ /Kf#+%#eR;-! waI4~0X+Ttuj\UID:5)$ `I-4Qi%Ahslhkjpotqrwoqlj[S<' mdTG5! xbWY[n'O/O\pyseSA5  ,AH[dptxrk\@'nF* 98*"{i^VLMOW_cqy"&.9G[gr_J0vqofgekpu&,:BMVTSJ<.{qk]]QVSU]gz$4ERSZXSI<2  $"(  "4@PZhmlngb[HB5.) ~orpx$>Xv  "qL-}aD)1Ov"**"  (6FQdu)-;>FBA7 Lc.kN4(##-7I[k6Lf"=bz#.19=974$kJ*qT@/ -Kj %:G]h{ #*&$|l\>'bJ8"!.9HXewz|{ &BZn}rbN4.8CI>4&!)(-+.3079?AFG@<0&  -3ACKIG?=7*!  +5K[r~|gWJ5*}iUE??DKW`nz~ %/6;??GEOMSQQL@6%!-IckY@*w_B/  #0>Vn*E]owdW?+qgVD)0Np!Bi      oU5lZPHF?A9::4:'x`YNNOKNMJL=8&eH$KXaov^(fL>319;I\f}"#+)..1*)%Ns+;JPYRL:) yR!a/yy/Y5I]ktxmm`YJ>.'  6Jbut`E* {Y7 9UzEk0=:;4(  qg^RKGD:6, yk]PC2&/Uz*S}$&|`A%~uqfcYXOQKONOQQV\]ju1Qq$?\t{Z=zZE2% ~utorx&Rv {Y2|{|votv"Cr >JZggmke]J6z[?* upkdedfipq|4i3DUX_QM@. _I-w`R=4+.9Un+XHfx[8|fWC;,#"" gVA5* 3Cbw%Cj "0;=;2 yeXG;*ymZPI>=;@CNX[jp 2@Q`pqO( (6NZnx|dO6   %5ALTPSOQIKIEGEEB==./%"  "7GTcly~}vuqjhee\[VKD;4%qdYSQU]l5Idw~sbTG0& "*9?HGICC?760,$ &=]uzn`QC5) 2?Q^q{}o^RE93'# #5AZl)9<B8)gV=. vvlke^XRMLA@<;677=>IT^q3M_v}teZI@0* z|}|=ZvtqhXL>4(&&+8CU`nt|}zucR5 oJ9(##*39J[p-AXfkng_PB*~y|{!CbzP+ -Np kS3-EUgpolaTF-ubZUMRU^jr;_xW4(@Tl}p[@-5Je~xiT9 wpjs &*/0($;Wz%1>;8$ [+kU>/'!$"/>Qh   S3e_(j'sYF=,-,3GOVfu%D[q|m\E8)"!)3ESfszoaUC4 tdQB1*"#5DbBf tl^ZLG>888>EOW`gbe[UE;1 ~tvs|}.EQgv~qbE/-3;=881/% #IezX;q\@1"(1LbGe|i^OE64+)' #%&+)/.-!zS' !6Gbv2Rz!!}p^RA2!|t{%=Tkwo^WG8.!|qrqpvx"!#" '--6=GJVX]]aa[WSJE84/&& #,CTdxypeXTVOQMMC;0 .=JNJE/}tiklz!,8?DE?6) #+;DV`cmlpropnlhcYG<(%9L_pr[Q=2! *3=ADC:2(|sgZWSRTXads6[poT3 f\K>97:KUp(BVhv}jC`9:aBa}ZD# |_L5/S~;[|+1:?EIDIFFAB:61$ jM+f; &Ba{%8EQ\fnwxf^OLMLYgyxhX;*}j\KE84'  ,Ec ",(,(*$'*.;GZhwx`P7!yqghejpwreU=* *>Mg -OpV*vwx #!"{jc_TTTZ_q.d%IdzzaO- Q{Y?+  (>Rm1SqpXA!kL8 &9Ocx$>Mfv 1>NWZ][]PH5p<lJ, $.9H`t/9FFKI@;/$ #9DU^imvyxwqi\O>.p^P?969@Lav>Z{vU6{qoqy#8@KIF>) )Lj  pIZB+# 0A[jzlVI;-)%,0BSuR "6@:5#jI)1Jg}nM. xpe_TSPU`m@eb<  ''..-#bE&)=[y -8BEIEF=>5752:<EKTXW]]dem{Y:xqpuw,,/%   1:INY]YXSMG;8.*  rP:,Kq.I^sy{rdK4~ *;Sbmqsqg`WNI>;62.*  5Ig~jJ!r[PE>22,/*2/7>AOZm{ $;I`t~t`RC.#wcZPJCACJUbt(4@KKTW\bhrr}|vljdhgmjmaXI0x_SC=69>DNZfpw}  &'! "8D`lz`N/o`VJE96//,08WwqbTHE<;;1,  5LUeipourvt{~rmf\UJD6-  $38A<91",6CV^ns|||~pXB' -402)%'1?DIFC;*' !  dE/-8JW\jp|.PpxaTH<623.10+0.49:CJT_alt|zfR8~bE3"!/?Ws7Tj|zucYF9$tbWSPR]m| *./&xxpwtz{"Bay`C,    ~mWNCABITct %E[wjI' vbV@)0Kc(KfxxuxqttnqlmkaZND9,sfTF2%'@EBHDF9/ .5<=90%rdPHB;9;@IKXalz-G[qw~rhUB'.DXk|ydS7{zz2WrrfN<zU73Wv #<Ocrx}~{rk^PB1!  +-7BEQYdm{t`P@+umYUMOLTXdlpz #D^yjC$nK3 2EQer %*.+)+&.4CXq "9DMQC8" kL'`3 w_TGM]m-Z.:GPPWW\^grs~yqebVWSZ^]`_\XG<*tU6 %?^~"Em z|yiYG*pS<+ )=Np'<GTV\XZYSQSKJHGBDAEAGDAB@65*)!}{} '*,013385:9A?EKKRW]agonusqk\R?,/>R`fnpoh^PA/vnhkm|#(*&*EUjsvxqkYQ>8(#/ANex}_A%~l`TE<4354=EUgu *;J]o}toiicXL9jE*=^Eho]L=* r^SC3(+3H^s&;DT^fr{xgS:*rjZSE4+ ->^{!%'0:IXgtwn\@%z[N@49;BPWhs#4EITX_`]XI?'"-=AMR]`gf]YH:'y`D2#"/BWk"=R`rtg[F5$ti^XVNSV`iw&3;FKU[gwtWD(v]Q@<,*##8Pay6TlgI2vvsx}#/BK\inz~upbTB,wcV@7$#.:@N[mx "/7CMP^cnvv|z|{wwvusg`RF0!lVA1$ "$.5DOf|*?[piYF7( skcRM@7+" &;Nl%Edxzh^WG@3' nWL=<9CK^n(-0.017;GKYacjknld`UNB=2-+"'()-05-2+(!sgXF=4212=H\m /9IPW^[`fgohkc\M=,!3Net{mXN;2" .IWn~~kY@-|iaVHD==?;??DDHEHKIMNR[\hq:Pj{{pl`UE5 )9CHLMHIFKJQSY]Y\VUOPGG@>0) ysj[]Y[`ir6Td|}p[N;+|rf^NH<54+*'$'*.:HQf}2BXh{kX:% }aC!6XC_{}fO>* ~oj[RA8* &4G_s2^w^L9$lc\\^\abjhty.AMX]_^]]\WSMF<)zjf^[TUUT`hx)<IYegmie[RG70)!&&//74=:D?LJSPVVOOKH@@:3*!,))ql^WJGD?HP`q ,=IRXY^W[UPNVT^dnw|s^S:*mQ9' &/EXn#2ERacjijeXQC</" %)04:<66.% fP<' 2Pq+;JT`ahhb`XRG>4.$  &0=DPWcnq|t\A) *5AHPTQRMK?;0 m^SSU_l %,,"9YjJ5!)1=GGKIE:% 3Mb}pYL=)"~wkcURLS[cu'=UfytfSB.#*6?NZhqtzwre[E8 #->H[dvpU3|qtz .?FOWSVVME8. ~pl`foz #2DR\bccZVE8(  #4>HONRPPNED>;41+  "2@HYcpuvr_UB* $# yz| '6BK[drtzsn_F1vxuty 9G[dpvvzxumZJ6 (1=GFNPSU[aahfmkd`ZJ>.zw~ xlgf]abit|$.9@GRLUSXW][`bhjmsptu}||qdS>/ m_RA:.-%'%*/5BPdw&*569<2645698430/,&%%r`F4$+:AJOPZdp*<GQUYSULOLT_evm]D8!m`SPLU[n{|zusuqy{#)361+!{uhhfihotw~ !2;O[lz{xsb[E>1# ym\VGB961557CR^t  )*.++"wlbYRNCCGR]r .DVm}vaJ0! |vvv     #%*-&&  %u^JnL, !8Qh;ZtQ) #BXsxcR3#&2BIXaemlkbV@+ qWI:4+05;N\r'=Qfyvttqw~{iV>$qZD(  &?Uw;b|zpi[D+ wW1 *;Tm:Ut~o[VLOOW]`fhkh`\RI?-"paG9($3Mg8U} --.$ fQ9"'8?MRQRQD=0't`J?3346DQh|%NpcJ.uy|&;I\hw|vkP;zgbZ_^jo(8M[htu{xth_S>4"  'BTtwZ@!jO1! &4Kbt!2=NVfrwsjYREB>631-$}xmldjgrt !05BKW_ox{fL3rbQF76.35>IZi|.FTgpz}}{vsibZK@0"t\H5##%/9APZo>f-/6924-,# sG"}aH;93=CKWV][`[UTPRPRYYbix "*8CXoiP1l^E5!6HWhv':DSXfjluureN:!y{tx{y*3?DMUOPG=2}re_XVXXep $07DMVW[YSG=( $*:?IKOUSVSTMIB2) $,/-2,/+# '-8AEJEC5*vk^NF7,!!6D[o*F]t}pcMA1*  %%!  )DUkuuo]Q9,|m]PJCHKXf~ 'Fa3DXd`\L9X*s[I3* ).=KTcoojaaalu=_}  c>v\>0%1=L\fs~ 6Rh5HOXUSJ6(aG+ u_F(&4@BLLTT[`cpy2Qfv}r`SD--7DR]lzt\=)+=EQRWTRG=({j]VZYfv8LYo}raC,f[JC?EQ\w*89<</+" vwu.Nw  qL% +;FV_gnd^P?#uN'8Y8IZoywaO8&+ALTRRF>+ og]`chu !0:ISV_agjgkjmojomojh^OH71%!&8CP_pjK%vZI<949=AGLZao5Sn$4;?8+_5`B+ !->JZgn|1Kg +086+`@(xn_YQFC??=@EK[k+Nk  jO2neUG:1.(./?H`u(8N`z{ne]J<$s_UOUUamr})AVkwzpmcaVUH?4tdUF<809@R`w";NexsaP9+ ,3>DLILF8/ .@IX_eoqzxzqncUK<1  1A\i~}tsllf\WIA0vgTLD786/ '1=GR[b_`[ZUJG?<45+-%$"*/<ALO[W]ZSPE<- {u{,>Sho}}sjXM;0% ,<J]ovhL6tbNJBIQVeo4B[o~!/,, Tb3>f'H^t 4BQWclnw}zvdT8{U3 yP2-@Yp/Ph  |kN:vk`QJ=83'&"''16@NRer%7FJTU\^^cjq|tn^VF@0) "4@MU_\aXXMMCE@@A:60*#5:GIOKKFD@@;=;40*%"  8Pdz wkZPC=2/({ZA'"2Ng>g*;IGG=*pP:# v{}4Tkzh\K>-   %0:JXjws\K8'zmfa\_dqz%*6>AKQYdkwxurgcYPA6,wmd_\UXW[]gpu @e  {hSC1"ycSE2+""$+:F]s(1ETi~nW> #<Nk{_M3$ -666/&   &"& yifbhpv 6JUis||ynj^]SUOROJE;3* %1JZo|ytkZM;-'5>OS`flld^RH7)(@`todVME</+   '-3.-,  *4BMX`jnwx~||zoi^S>1zaI0"$4nXD/" ).47562406;)   %<YkxzsdR:!!B\{sg`RTOWVbhhpnrjkd^\YZZVVQH<,qcXJHHNW_s )/@H\g}nZF-  ~yie[[ZW]_fgomty{ ,:IYepz|og[XLF7,  '(.)-))()+/3184;;@FEKKLFA8#}kaPMFDGKT\jv(1EP`gqw{|sof`WWTSY_gkvy||}vsjhaVPF@2.!/>NZdiija[NC5!ucXMIIKTbj~   *0:BCDAB@EHPT`gqrvplcN=(zh^XNOMRWXagw #5I[k|ydL1 }ncTI82$!#*7DPcp/GZrucL>*!  $4<JOXWZUJA6) #!',7CGT[fjhgaXH;,!)3067=@GLSW^]WPA3 |z~ &6DXfwtoi^[VVUQPRSXSUROMD=65/41;;ECLMMMJK@<5%   %$&$-/455-(#".1<BIKED80' !5EXo|u_I3*8>?FDG>>/* -DRgpxaM1kI/ -X <^wjXUMQPX\hn~~^B$xR7:Pm/D\iz|zlka_VVSTZX`ckrntpmaU<' [@(+8GZn-;IR\\^`[``ipnY=#zk]PMMQ[ar~ 9Qq_AwhXG6( %2J]w %Bb)9LUWZWD3{JaA+ #8Mbw Ad~rT*`A ":Sq*5985+" $-2=HYcwqY8gH0"  *5J[q$9Tdw~tdS>- }pnbb[[YSVU\aox   !$*-&("!  6KcyjZC4q[QE:<>BKX^n{$-@HX_lmsocWD4  $*-0-* m_XT[[ls-?Wh~rfT=+  xgTG6$ 5Kf)9DLLOOOIJ>:/)   n_PH>>?@KYn,=O_hw}t^N9*wm_]W\W__fgmnx|"0AQZhv{zleSL=.# |lh`XYV[\ejw   mbOE9,%$#(5ATds)Hb}p\I7 (068;=>:;:451.'"dO?*!(1% /Ib'2?LSbl{vn`VD8'tP3$5Nb}4UmubT9+  09JUZ^^]UND0"xcVJD?CHO[h)JoaExxry}*/44,) &A\rvcJ3ywvpvw %3@KZet~xhP<|fJ8+!'8G]k-<R_ms{xxwmkgdgbjjpt~xkYL;' 3GO_dkiiba\TRNNOJLMLMEH@A62+ {\E2 2IeCcv[>)0@FQSUMB3 |qb[OLGNU]pEz )J\niiYG1hC&zjecgnx{hTF2,'*38L^v=`z*,.(qL0*8Mby{cD. '-**&yonnx~&3:EJROPL?6$-DWk}j]I6$  '6>CJOTSWROGB>.(  %0=DDC@. stnuz*=MTcisuy|vuldZG5ssv{ 'ATlyxfV@/ CflO- 0@Wct{vjYF)}y}  &097@>DDHJFMLTSZ[YX[TTSZ[fjtzy{yypj`WL:+ zruv %..432-*%$")04?GQZZacjnlrswskdU='u]@*)Mj #4HVeqxhS;~gYH>/*$$/6Kav8Unzn_J>.) hT;/$$$2AOcx !2=KS[]b]\VK>+ -EWntaO@.! %.4<BHHKNMJIAA;941.'&  %2;>GGKED97+*$,;NVbkinljee`ZWPNGE>6/}wppnnoijdb]]X[]_gn}';IYbmuvfSC0 |pdSNDF@IPYj~0DO\bbfefhegefab]VQJE:4%!treaWUNRUVep -7J]mmQ4.Ed$'&$ o@bC&(:DU^ns9Uro\C*$& 0I\q}uhO?# &2360-" &+3<HW_mrxuth_L>$ #+5AITX`dhjji]VF7   }vz}%;IZblojfZO7()AZo~rdM=)  (?P^nx{uh[J1lZF9-+*4>Ug -Gf|xdN3  @\qcNA/"&3FPabikomprmoki\T@-}ssrz.:JWanxtaO9(3FUhrztkYO:*yph\][ck~*EXfnjj`\PJC60!6LigE#oaQA:341=E]o>_rm_KB0, #07GObmjH'somims,6EMUY\^VULH6- +5FYexp]O=0#04BKYcjt|uoa[LIB85-+#  '-9FS_gnomd]L>) #-<IP_fqt}{|{qm_VB3 4E\mvvlXF11BVamqjgXI0sO5 %AZ|*>Q[ow}ujZOF>;378@INYajjrnrrkja[RA4{pg_]X_du$2FZdxt`P@4$ ydVB9***+5CP]mw ;Ugz^E$  !)3:?ECJGNLRUYaivv_M4!re`UPNNPJOOTV^bn|!#   $(,-46>CFMPW[Y`afehhec`_^X\^Z[\SPF5( zsomjlmq|~2HTejqpoe_WI@6-$ '5=@@B@<3/+*,*29=FPNUTWWRRQPNFD?;6.*'>I]hpz||wqeXG7$~qjh`gip|$;J^fww|x{tsmkd\UK8(#.;ER]cnsz~{kcRH4+  vpa[QOHMLU[iv8Q^qyyo^RA/ }{{svrwu} >XtnR9tgaURMDGAEIKV^gv"(.5:CCILRUZZ^XWNA3( zkbUQNRR^gnz $8B[ovcN4kT?3*#(,7GSi| #-089>B@CAD>>=52.**!#"&3;LYiuw|seP8mS4 #7DYo$<GVY_\ZWOLDB>42-22068@>GDJFGE<=4/$   #&)"!! {njh_a\][Z]Z^^fmmz#7IR`oq}wfL2 ,<LXejorpjc^L@1{wpjbWPE@:96<@LWn GdxbI,~ngb\ads|5VvuQ&uZ>. $4K^q%/CSeuiP8umddgnv!.<CGIJH?:0%   '*0-2+*%  "1<?DCC?>64)&  '=K]k{ugVJ7."! $*284852,& +=FRTVOK=2#,?JZdtv{rlXK<' &.9@KPY]]a__VUG=2 &2;HQ\\aaZYTKF@50'   %.5CLVds{r^B }dTD;2//29AKSdl} -4@NXdfonpi`SA.ziVM@4210;G\u ;Pfxznkda]VSQF@74./-,1400*&   -8OZkutdL9# "" %'-69BKT\Z_^a_ZZURM?;/&xkWL=," &2?JXew /AQ_ozzukdUF7&  +/:>EIEFBA<2/% |pcRK>;50105=@KUes/HXkw~nXB. paMC52-23:ELYiz0:MXjp~}vtihad]^UQD6& dT>. ,J`%3K]lzzpmggdfcdbXQE5"zofbWTPPUT^dr/;KUcjt{{pcPC1$yhWE:21/7=CS\lv(0076=:CFSZlsqhUJ6(z   */;=E??70' %+3=EIRXbgntruqmh`\QI>6'  $&  $%-/69;BFMOMLF>4 qcVK??;CKScp .?KPX\bfchhmolonmie[TK>3' {~{ "4BR]kuyvkVG8* wl^L@1) "%5ATiv$,1-.'$  !.6FLX^fkjkgfaUOC8'   "" %;GXcgkhf\WN?7-}rgdcnx  }xunsu"=VozdK3)0?DIKPLQKG;0# .HavmU;$xf]SQMOOTV^`mo~ %1;GLV]_cgad``YWO?5!07@@=;2.$"    !,>EQSTSD<*}tif_^[^_fpw )9N^vpT8oaTMA?9::DQ\o&:VitX7wU=+,;F\o 2QlzdG/$5>KLTVSVSUVPNFB:-&)4FNZ_hiqpvyu{vyrqig__\VWQRNA7, uj]YRUW^ir):Q_gsuzxzyokc^PH7-" vmbPD4& (B`9Rq bG' |}~Aa d?tmf[]X]^io}-;J\dpx|xseYF2 ,CVm|{n_J<)ymi`]VVRW^gv /<KQ[b\`[]STNGIDGDFE<:4+"   &2>DBFBA<==;ADLST[_acab]_URG?6&!;Sp}jU:' ";Vo}gK2|ocYSHD<=@?HN]hr~ $+47BILU[bllt{zaK2uncb]XZZ`dmv6Tf{}vie\WTJE?=30((!}wwsv}|)3289>9=44)# %0;?HMUYX]YYVNNEB96+( $,0470/* (=L_oyph^RKE@:* tdaW\`dmuy*-53<<GNSer}n[L='|fZLEACCOYcr '4;HOZ^jkut{|yxpnh^WOH>6&yeT;. &1CXf #5IZhovxqnbYQID9700('!!"(-<CUbkx}zuk`S>/(AN^ag_XJ4 ttsw#<RawzbO4 4Pi{rXD) .4AGMOLNNED>6+xm_ZWPUV\cnz (4>ER\alt}n\F2  ,8GQT]agfhe]SE6 yxx~  %#%  |vorv)<HSWVWKD9/)1J`k~rbN1}pf`XZ\dou~rohpr*@N_knuttpgaYF7%|trox$3=?@<5((<L[[c^\UG>1& ".6:DKS^_hkpncYD.hM0 1B\m +:AIOOV[gsjL'w^>',B_ "-087>BBIMX_musH!uI#1Om*7HRSYTPLA>63+)'!&/9JUhuvaR?0 xgaWUSRY^k} *LkviZH<+  |rqmqsu| (8AILMJ@8+  '3?CJQORNMC@40% "'04<<??:73/(".9NXjq}|~vpgWNA6' pk^^WYW]abjn{ 8K_lw|xrnlb]SJ;#~ -?MV^ceeZTI?1"7Rdzt`O9{mibehq|#+09AGSWajy y_N3"rj^]X`er|",;9B;=64147;CJTX[]VSLIHBFINU]affd_YJ@4+:GNY`jltz}|tgd\YSQMOPJLJJJA?:/(   %1=?FCE><31,#"    $*5>AJMSQUTNKEB=>@:A?B>?=64..,')+36?ALSX^dlsptopebTL=5'$'.187=>:<85-*#    *5AJU[[^ZWRC=3,&%%#*0:?KTU`cns}{m[I8"&>OetqZF- 2D]slS;%&7ETi|!|a?"wwuwyx|{{|vxuvtqsnsuqwv|+G^{vh_SNC@<40)'!!~zyu{!6GZj{|j[LC72,%($))15:>@::4' zlZQB93,,.8@Rf} *AWgpw|vsn_XMKEADIRZgp{o]F2kWRIOO^h~+?Xp~}tbZK?83364<@FJQSNME>2r\C. (>Yt :Kcsxqc]UJC;7.*$ *2@IUackmolf]TI7.   '-18361+ }"3<IOWUWOKA/# nmemo| *=OVfmwz~ywmf]KA2)"+7DIOTXSTQGD92"|ldZXS[^o %7IZ`lnsonhXL8(  rbYQGD=?>:9<8:@=FHP[`lp}}}peQB)zkWNG@BGKV`q!0198831(#.9CLOUMJ=2!{wwz+BYh|vm_UN@7/( ~l]L@4' '2AQey !=Qhx|scRB6+?Q`szfT@$~srt{  0?OXbhgfd_ZNKG<94/( (47CHQV]bfjntz}tfR:$yvkkaaZYSSURZam} $6>IR\bfot|}~~wpokc_^TRJE;3**>M[jkutumk`[QD?74,/+.+'&   wi^QLGLLX`r)3ISkxzl^M>+ $8EXduq_S<*vcVF3' 6Kj0Sn ")**$}iR;) oeZTPJJQQ[cou$<Zum[E*rcSC:20119DHSZacgddfdjlv .;GXftp\I6 &,8;BB?<4/& !+57?DCDF?<2,  "  )>M[lx|ysskifd`\XLG=3+ tf`[]bfu!;Mex~m]H6 !! !)3@ALNVYYWUQF=6' #1>FTcjvubQ:' sf`USPSYZbhqu"0;LVcov~eJ) wh_^^dox(;IYenqmkc]UQGLILQWbmso]L5#|p^ULGHENVdu-59EGPT[aafhinlmkh`YQH91$ ")6<DGNNUZ`fhqwzqbWJ8,{svy}$./8681*(.146532/&! ,:R^ou}{ztm`YJB3) #)3;;CCININNPUOROPJIE==647/1.1-1.*)#~ &(58CJJPNNNCB:5-)  (2@BOR\abgijjc^YRHA50*!!!iYB3  !4L`~ #2DRZiq{upoig]WJ9(uaG8&  +BVr*C_t|vjf]ZUOID=94/,+"  rT=! *Gj1Nh{sfWND72+)$  #.5@HSXeisrwstkbUJ8*~rqihegljrt}&-9=?A73-' !.2@HSYchgge`YG<*}}$7BQV^[YRA4):KUahounod\J;& zpgedfgot}*9JYhr~raQ8& (04@CHKNOKIA</( &26;896,,$!  $'/16:@FEKLSX_eovw}}xui`TLA3.% ttnorow~ *;AKJSOQQHG=7)"*3:BGJJB<2 xsjmmv|$<O`o{~ucUA55CXfoyy{uoeTF3!q\QB=828;CKZgu "&09=HPX^^`\ZUF?-""+338632(%     $.=AGE><2-&  "0:>JOZ_issyxzusl`ZME9*   "+5=FMOTSTLJ>:+*    &&-.339==DHPVUXWWVMI?;.({{xytwswuwyxyy{utmmffffqz 3BRek{xkcPE2%ypprt}!"))/1./2,-*,$% ve`UUPURY]_fkry| -8<CEJJMKNKRPWT]]\^]\]TWMMB>1!{l`XQHDDGJSYfp3>PZjtw~|zwoi`\TD:* xvna[RIC?:;??FMZcr$6L[kzzk`QE:'ujgaaZ\[Y_ajqy*EXn{xpcYH>2}ncUNDDDBIP]gz-?TgzqbN;) %5AS_nzwfV@,}tqnopuy'0:AFGIB@5-$ &(346842/(" (*6<IP\efjih_YJ@3(|~ %3DRZdgmjjgZSE:+ 4QckXD.  p\TIGGER[n}&9SeuygXE. $$)+&%"0>L[hlx}yuobWJ<0 #/4=<?=3.##"&!"vtux#;Oap}{tm]QC5%  *0<DIPSXTRH@- %BWrzjWB+zzxvz}*<Xh|hP8 "(076998;8=@HPT`ept~~yn[K5#{urmpu| #"%%#  #+-264:BAJKQRTQMH=7.(!"',6AMZ_jlrsnmfbTJ=* '029?DJIMNROPPLOPMRTWX[_\_]]\RK=0wcOB;1119DK]l )9EU]djcd]YSHFADHJWcsvbD- p`YQRUYky!;Vj~nhZUHE:81.+#" seWI@<68;JSjz1Kaxuj^MA3(#8Jcw{eH1~~.CVl}{iR=%0=LY_gkolieYTH?3,       %'$&%# " "$"%"%&"%!%$!"!&!# "5I\i~~zkcZNE;2&{mfYMGE>A@HJRY`js +?Oan~wpbTC0}~~| (6FVh{}cN7y`SD<3521$ &,-036597<@?EFKKGFDB>==9<<A@DE@?75.tmda^aakq#1>IJNKH<2! #4?OV`hee^YLD<+$  +087:61&%DXpzo_I7 %7Rbvo^D. 7G`n~ylY:#vi_WTYXfq|}/E`v~o^J9({ 1GUgsx|woaVF;* }~%6BPXfittxrsg`VG<0' &-:BOPZ]YYPI<2#/AZjxxk]K3!xupqww 6Tn~fK2$27CJHII;1.GZr}fG,q^QJKJR]etvtnqp|2VvqR: #'$!0K^|nXB(yspmmilkklnptsx} &0>LS_jr{zk]SA4) '?Smn\E2}{rpjcb^_Z_]bgiqu7VsmV<(}z~},>Vk   kM.jWD:3-06?FVboz #4I`oviYL=) %+1;CKUWacioortvxrrmi_WK?0" *1>FHQSYZ^badhcea^]PLC;5'"+9KZk|vjYL=2$}#,3::@C@EADD@B@B>??7:22,) 0@R_nuvshdXRF>.&    (;N\lzvhR@/~|{ #%0-0,*# #1BS]o}vnaYME:, $/;GHQPUQQOG?:* *5>?B@B<=:3.)   3I`u}|qrjhb_YSMF?6-! ~wuvtz &(.057;9:22'# %7SgztgSD1  .@N`q~n[="}ZA%(AUp (7IVjwy^H' |V9.Lf8NcxwjaUKB2+""#*+12,*! r[@. "0EWn 'ARht{wh^NA3+     #&//535522./-&!  "'(*$$->RewkQ2 5Kg~vZ4vcMA5.+#%%*0:BR^ix(E\{sX;ycVKFAEOVjz 1=HROSTNFC83'! "*1;FKRUZZSPH@7' ucRE<764=EScu!)//438;;??AC>@;94*#  +9ITbnuslaSH<1$wxx}!/7BJRWXVRND4) "-7:@;;8-(   0:ISW__bb]XNI;0xqlkejmw| !(59CKOV\`gcfb^TJ9*obPKCBECNVdq 2?LUajlw{zvmi^WO?5%q_PC5.$#"$&,.8BKMVU\Zaaghopxw|~xuoh^VI?4% rk_XTJKIOOY`kw$4DKZcnpz}yztme^SI>83)$  #/@L\eqvz~wxoi_UE9) %6EQ]gnu{vyqqc\M@0,8EWex{mbR>0}xrtrx&3CS_kowy{wvtjbVM>4" *>Q_sm`N8'  +0;<CFEFEC;5/  !09HV]lq{}yoj`ZPHB3-$ |xskhfghmp{#/=FGNNPKLDC=743/)+'% !    $ (,8BFS[gpt|~|wleYI=2 !;Sk{sfPC2  !# 5ATemyypk_YN@;.&)0=>JMSUX\[`]_^\]UULI>9.# "08HP^equ}}vk^P=,yohhglnx|-<MZlx}k\I9# '28FO[fso[@) scK=.! ,9CTdv%6AR^ozw]J/}x|  ,.9@CLNRUPSNPKKJDC=:1-%%,2<;ABDC>>950'# %1<DKRUOMF?8)  ",.546/' }wzw|  +18:<>62-#  !"&((((%%  wqffekp|(?N^r~xo_UD;+#raUC9+&#&12% $4J\hv~~{ngZSHD:90-)"veZLF>;8ADS]nz5Un{l^J@2+~wtnpru':IZdu}q`N?.wofcacgjtz&,58A@EBAB9:3302158:@DINMQRURUWTURLF>1& #+066991.' )6<EJOROOJF>0#wtqkonux '2<HXanw}{miYRB:+(.7=HQV_ciijjb_XLA5!rdSH=.) "#/7I[l&-8?BGHJLGIIEEDEECFHLSSY[`\[SK:+(5?JORUTUQRJJAB9;701--**&! yl[SFA53.03:GSdw 09LVgox}|zsncUI;/! si`]WYX_bmu@^~ iR8$qkcVQHC;75037@N[r$E^{jYF0 .<Q`l|ylaOB6."! {oZM;2%#!&2;P_p 0=R\kq{{}vncZIA4' #}wqjmpr *Dcxxg\PJB@9932+,$&#"% xdK8$,?Xq*>Qahoqrmlb]TLE@660154:>EJOSYZ_]a[ZSD6"j]QFC@FIXav/?Wg{qj]TJB>40*)'&%)(.1/77851*}sd^YRUW_mw(;IXajnkj`YF8  &2?BNQWVWTQKE<5.$&,8?NVY_ab]]WQGA4, &*48>@GNKOKNIHC@=4/("z~~%2=ALNWWYZWZZ^^ddfefd_YRMF?;611'$#&*),,('! "$'"#  #'15@BKLSTRTVRTPPIF?:2%     ,5?BEA@:6*(+:JYit}uiaVOD>3,~uqqkmqz 8G]iouvuphaZNIG??<?:<65,'|zvz},2=ENZajqty|}tj_QE7) #*5==A><42( ",9AMU[cenknifaSK>3" (/=IVcjw|~spfcVQ@9)! 1FWcvk]L6* ':NawsdRA. |zw}|,DUlwf[KA3* wqoloz#AdmT1|qeTJC7579DPgy +Lcp_G7 %>Qhxti\K>. tjd__^dlr (7BFJLMIE@85,' )6AO[lv{lWB*2BN[enurrpc\N@2(  "%$%&(*$$    %,=HYjrwfN8!)=JZjqubQ;! ~pi`_[_ejy&,7=>EFHGHGKGLKQXX`cjlqttyy~}sl_RD,  '1;DKPVUXQQGB72,"  '6CMXZ^_c^``ZZTRMDA<:4676=HMYejv|zsiXM<1#"&,**%$  "/6BLQZ^cgcc_YTG>4-# !1<R]ryfXD7*  &(.1//*% (9BS\gmsrtrg^QC3 !7G[hxzsjaWLB6+! !"#$!  %1<CQWel{v_L3! vle^[TWVU]anx +6HWk|ym_VH=*}wvtwz)9PauyjZF8* '.79BAGFDCAAB<>=?;A=@?;;763/-*,)+,),*,+0/54:8>=79530.*! (37ADJPNSQUQQIK@=8,& $.7<EJRW[[^\RMD3'xid\\]^gp,?Q`hu|{xlg\XQHGCCCECHIBC:8-(  %=Rk xaH3zoi`_XZYW[Z`bkoqxz"9K]n{dL- "$!! %&/3>CLSTZ[[VSIC81'  %+4:BCIHKIJJDC<:1-(   $/:=FMU_dovsfSE4 !-6;BGNMQMNFE;90,"    $5>LQ[[`\[[QME@=0-" *:P\oyxk\N9- '*1254-*$5HYgux{zseZL=*&5?CHFGA>5+&  ,2@KYcs{wdUA, !(6BJRZ_dhhmjkg^XL@.!  $)-187>@BFHNRY`ailrtx{z}|zwre\SC8*  #!" '6?LUcgpsqmg_PB1 ypqow 2>NS\`^c`a]]YYWQSNQMPMQOUT[]cgq{}mZ>%|gN>,!$4=Qaw "/=HHKKA=5.#%-;IO]eov~rk]UC8& $&/6<FPZbnt~}zxshcZTHA5( *7BNU]bfidc][RNG:4(" "'.0400($  $.8FM\dt}zn]E7 yi`URNMTZfs)D]nygXD7( )AUmzZ?% &7BO\eqw{zzsnaZM>2#  $,:DQ[`kotxuyvusih_ZPLE<91.# !#(),*(%! $.:AKPZ\ccgefe\XQLDB@;>@FINRY_finruxspkb\J>/ ~ytx|'4;AEA@>3.) !*/:<B?C=<5)"   #.3@GWenxmc[RH?7)! }{~{}z~|(2=LUcnw}{wnh^NC4'tokgksw +5FNZchprxuxwtqnlkdc`a^]XXSMGA;5+$ ~}{ 3=NXgozzvh\K;'!1<LVbjv~uj]I;(   +3=FNW[^a^]XKE70!  sj^XSJJLT^gy     -4BKV`biikd`UE9( "17DJUY`afighfea[ULD:*yhXD8+$"!&+8AR\mw&/8<CFGJJNLMIJEEACBA@D==82' $*056<AIU\hq{vl_P<.wke\YRWT`fn} !"&'+,//*(!%7CQZahjjgh][TID:6.$ !#)%+%$ |vtux{  $-15321$ "(+),((##    *4DP^js~ucT<)seWLB9:89?DPWdo} '/++&$ !(18CIRZ[^\ZTLD7, oaOE;2007>O\q+2>GRWcenlplmib_ZZUXUYZ__b^_YWNHB2* -<FU]jntuyuokcVLF7/(#{wvww~ $$($&"+9FVfq}m`TA4% ",:CLWU\VUJC3'wna[ZRSRUZZekx #)16=A@EDKJRT[bchknllib\RKA3*  "4AR`kvw~{{wtog`TG;+$#(%% $,:CHOQURRLH<7)!   $*3?ENS]`ilrwvxwwpk^TC5% "  '0?GQV[^Z\XVOJH=;45//.()$#+2<>GGMKPLPKNKLLEF@=40#yjZNA:0--',.9AOam0CRapwyqd\QH92# !+;HRan~zgXB0tjbVQJJFMOYcix ':IUcpz}yuieZK@4'  )3=BO[hvzp`UG7) ~{zzutqqokmmst~ %&./4.3,/),$'"#" '/<AMNVZWYTTONMHHGHHA@95,$  %1=JXalt{|{tmh[PB7* (2;BHKQPMMJB?71* %-:AKSSYZ^ccfhmknmg_\MH<4,(!      /8GKVW[YYTRLC=4."    !)(,*,*''$  +1=GMVY^_ZWPJ>8.   *1:AHHLIJFDD<;60(# )3:@DGG@>5, #/@GSY`^`]RJ<-qeZUSPY`p(7CMRXWXSRMI@=7.*#&-:GO`jz}l[I/}vskpp{ 0<GQRXXVQME5-8H`oxnbPD6*!   $0;HS^hjttxvvqf\M=,zzx{ .AM]hrzz|zxvieZQG4("!$  (1?HXbou~~xrh[M8%uaUH?98=Reu~vmaQG81# "yvsqsu{   %).14611+(")<P^qzwn\M:(xoic^WXSWV`fo| $:QivtfTF6#   "*9BPVagimllc_UE8)  $("#  "$$$" (1<DJQOUURRPHE>:4-,-(,,/.315500/-+('"     !!'(036=>BEBA;7-)!    +7CHPXX^`bd_b`bbaeegga_[QJC7.) '29EPS\\_XSF;+.<ES`dnrwvuricXOA0" &,021/-! );EQWZ`_^YLD2% ~    !-2=CGNPSQPMGE=92,$  !!$&"  "%%(($%  &1@IS[_dcdcZVL=0 }|z}{  '3<HQ[ahnmopif]UJ;,o\QFEFFR_o,CSfrunb\OJC=:5738;<CEINJH@9, ~mZE6(&3I`v3EZkt~xthbVMG:3)# ),459792-&{rporx},<R^pz~~yoj^XMF<8/.&'%#$%()/,0..,%!(3?JTX_ddfdd_^ZPK?7+ %+37889844,# )=O_n||pbM?, &6DQ[bklpnfaTG2! -BN]eoptrsoif\[NK@;1.,),-57@CLPPRNMC=1 qh]XSOQU]is-FZm{yn_VJA8-' }ugfceju6FZgw{lYH;* .<NUbfnrmmg`XG@.#$-?L_o{sgWJ8, !5CT`irz}~tmaO@0  #.?JQ[^degd^YRLF;61./+/06<>FKRXY^__Z[ROC=0) "*,49@EILTOSQOLJDB>63*%+8?IOWWZZUTSNLJKJNKQMLFE<8)$!*28@?A><60'"1=COU[`egkmikdb\OE8) #)/9>FLNSSUSPOKIF@?>?BCHLRTSVWQRNLI@<7(pg_TRPNRZeu,;JYfmv|~}zzuurrronif`UMB9.   -=K]ny{ocSB3!wmlc`ZXRQRRSW_hw%7FWboy}~xkcUK?1'"!4CT`oxymbVL=5'! !&&-28=BFJLHFF=:1,#  "&.-46;?@GGOOVYUYSRH@4% &%% "&.2/351//'"&9HYdrw{wjdVF;,"+.54968464611+)#+9AOYfqxvo`TC7$#+,49?AFDHCA81#}vvsx{{ ,;JWen{}ug]L=+ |vuu{+@N_hox|yyvoe[N<,veXI?82/.27AOd{#Gjm^MA4$ sfVLB65038?BF@ECEDHHMNWYafilmnlb\PG3%~7LdruhVI>.& !!$&  rfYTMORVam~/EScotzyzsoi]WLE7/#    !.8GQ^gqy}xmf]NF=:011+,/++($ "%+/6;DJR[^fkqtx}}|{wmeYO?- )49@HJQUYbdnvwztf]LB/zhYOICFKKT[hq )(018:@BILSZ[chjkqlojheZTJA9,!  $'(-/203-.,%#! !(-.13410,#! #"'&$&  !')--215496<<?C@GFJIMLOLNNJGDAA9:32,,%" %*35;787/+&!  (4=HQY`kqt}wvlhaWRKFB:77/-*{rg^ZRQSR[cp}&6AGSW_aiimllje`ZTKF>3,!wvprtu| &/CObmveTA+ti[QNEIIQ\cr~ +.8>@HJPWV]\c`d`aZXQD:* |rplnsq{} "+,4:AGPU_hmw~zxlg^QE5%"18ENV]cjjooqokeZSD7+ -?Nan}uf[O>4( !"###%!$!#   *48>BHFHHIFEB<7-%   !#$ q_NB:537=DSat (6>HMUTYYWWTRKF>90.(# !"%#&$&! 4@NY[aa`]YQMG?:4/( }~"-4;@DFGIEB@:5-%   #')-.4285:9864/+$ zsla^VVRXXckt%"$##! $-396932* $-08=BGBF?;4)   $-3;?EJIKJKFG?>9/+   ",079@AAABCD@A=?::70+" }}~ 0=MXep{peTG6, !.CTcu{eQ:# { ".@NcywbP;#'-7>CJPVW]]`b\]WWQHA7- "&,+238;;;<<9;;8;:<>@DBBEDECCBDDACCCC?>74,&!)-66>?FKLRTZ\dgfkeg]ZLD5+*2@DNPXYaffot|{vmeZSD;+ }rhe_abkv~!',01,/,*&% %07?DBE@<1) .CRakuz{{qnb[PB9.#   %.-6476/+$~{tuty}&5:HLXYaghnnsxvz|}|{wtpg_VN?8,#&*,119>CIQT]_dehhbaZVKB8%~ve`WURTU]cp$'().(+&*$)%*(-),,))((*#%"#  $)*/-1++$" !*3>FRXcjlonoihaXSKF<:10)($!!  %&+/,/-/-%!     #$-/0101.('$  "#&*(+,++" (178?@DBFEEDDDEFCDB?;7-&*6=HMU[bhmsz{uqf`TNB:,$ rh\WSKOOU[go "-2;?EKIMONPTOTVY[]][[VVPIB=6. |okfeclp'2<AHIJLGHDDDAAADCHJKQSV\[bbgmlplmgfZUD:(  '0:AKPX]bcfca[TG</# #)6<JV]hpy~|scTC.!-<FTYcflijd`ZLC6,  !-4:AGQX]dlrvssmg^NA1$ !(15;;?=84-& |yvw|});L[hry~|rj^WIB:1,(()'/1:=FKLPPPNDB7/!~-6AHKPPRKMDA60%  '0?KNWWXQOC<4%! #&)()'! #,179><;72)" &19BJRY\``]XRHA7*" %)26@BINMONF@6- }yw{,@J[fmw}||vodZM;-  #$'&'#%$!#!#"#$"$%')+0.46;==A?@=:1,#  '-/4450-%  &,04520*  !!'&*(*''! 0:IS`ilttwxqle^WQK@?8846476:8:664-,&# ""    $-349:<981.%   *:LXgq}yne\LA2%$3=LVcjswwvrmcYOD9/  |}| '/=JS`fnquvrqnlgg`^ZRLE=4+&3=DNU_ckqqurqjdZN@2~}|}}"2<KV]gmuy~~tm_VE:+ !"   "#"!  ".4<BIKJMMGGA@77+)    +08;@@@<82*#  !"&(++..*,((%& "!&--46552/+ )1;BCHJMOQRTTQROOMEC93(! $1<FSYeltxzvnjbYQKFC<;762+' ,5CJT\]`aa`\[USKIA?80)" '4EO]hmwy~}wpib\QKD@:71.))& "! $$  $5DVfv|hWA0 )5FTdo}ufZJ>-#   "-19>EJJNMKGB<0)  !)+1151411-++#% #$(+,34<@AFGKKLLKJHDA?52-)! '0<=FHKJB>6&  -8EPU]aedc`YPC6$ $&$&$!  %,<FVbn{yo_N8&yl\TLLLT]ds &3BP_kq{|}{qi]O;(zbRD4.(),6BOdx#3<KU_ilvx|}}zxumkcb_ZZXWUTROKC@72' |ukaZSPILMOXap}&0=EMTSVTUROIC@9-'&,7?FJRRWVROJD<5-% $.06482/)xxu| %,38:::51'! #(*#$ *>Vj~zl^QA4" '4=HOTUYRQGA3+"  #)+47=AFEKILGH@=8.(!   ).9BFPT\^egeeb_[RKB<-& yo`ZTSPUX`ku "/9IQ`ms~|yqh_SG9&%-8<DDFE?<40'$ )1;CJMPQLJD@83,!  "+/2510*#  !+0:>FELJOQNNOOORPTPSQKHD?<3/,+%&%#!$ %,47=>971,$(-6;<BCHGIIBA:3*#  !   "%*)--2-0,,$" &-6>@HHNLQNPOLIG?=741)&  }zsuqwv$/9?FDG@>3- #/=IS]afghb^VIB5-#  " ().0/.% )/:AKPRWVYUVQNGD?63.+''$'%'%'%'%   &(126742+'%1<CNS[\_]]UPG;0%   #%$%$$!!,3<EFJKKFD>1* ",8ES\kq|tmbZJB3(   &8CR^clkmif]ZOLB@;95646644446476:9<<=>;940'      $)1197;8860/,,(+,*-0145=<CFNSTY]ab^\XSHA6&  '3<@FLJLKJED@<:6612-.'&""#(+)+(&! !#$!!  ',59CHSV^bhlorrsppke^TLB3'  (4>FQV]]a[ZSMD@42,$" %1?JR\`ghjjec][YPNGEA:76.,'# ).8<BFDECC@@?9;<;>>ACEHJLRLRNPMFC94'   #(28BFNTTYYZVSKH=8,%  "%)-+..1146;?>A??84(  $/=ERW[bciehgca^\YYYUXUWUUQOKA:0'      $,7?KOZ\ceijmjlhg`^WLF:2*        %)&&##"$+-35=;CBIMNSUXWYRQGC5.$   ! $#%&"!  (.4>@GJOSX\]`fejnnqpomkfbZNF9.! {{wzy}1AOYbhlmhdXPD4)"+-54;:?A@CDHGBD=;3/%"   (39ACHFHA>5/$    &+58?DCEDCB;941*%         !+59DIPVWYZZVVNKC;/&  "%$'#!-:CPXbekmjhfc`WUMF?5. "(+0478::;:=;>?>@@DBDCA==71'  ~zwzy),46>AFJIMLLLJIDD@@?:74/*  !*,467:;=?:;640%!  */6;9<<;96/+ '6N`v|hN6  $+-58==AB<<3."  "$''(&'"!  $*29<@GDHEE?>62," "((-,,)&#    "+.8=GNR\ailtswvpojg_[XNKEA>52,'!xodb]^\ceov />P^ht{}xuomhhdfac`\[XTNI?;.& ydSD:1./2;GVk~"@Wp}tf^TMICCCGHNNSWTTQOIFA70&zqppw#+/59=DDHHIGFC:90-#      "#%'"%!!" "%$((,(,()&#! "!!#  ##!"!  %.6?BHFJIC@;61(#'*,/4378;;=<>=:96-& "!$!"!  #$'$&"2:JPY^_c_`^VRLIE=<6310,.(+(()+.45:<?@;90+ $3?M[dnu|}|uoe\PB8*  !"**24;;ACHMMRRVUYZXWVWVSUQQMGC;4, !)028:;>?@<?>@>A?A>;76/*#  ,2<?FFKLIMKLLNPLMKLLEGEED@B@A@A>A<<:40)%  !''+-/2//1,-)&%!  &*01585623//*)(#"   # "    $1:FQVagoszx{trhaUD:)  (2:<BAB@73(   #+,37@@JMUW]`dcjege]WNG:3"%*18686511.'& (8APVbilprtongcZTNA<3.'  $#'%&  }|z| !&$'%     -09:?B@AA@@:830.(%   &5=LTbeousuqmc]RC8( #-39=??95-#  $29DIPQURPKB<1)  #%)'("!  %"%#*2AIU^iox}~yuh_R@2,?Udy~taTA1~xvuvu{x|~{}|}{zzx{z#8M_usbO>. '8DVdpyzsf[M>0  #)17?ADHEGDC?60$$/8=GKRSWYSUNKHA<61+!  "%),138;8;881.(  #(+18;CGQV_dkqyy{rkaVJ8+    #'(*)+*## ",.4:9==>@<><=?=@CDDGIGGDB?74.+&&%!""$#&#$# #$),.124512,)#  "#))3088?>CBHIIKMORNOKF?8/  (2CN\ft~|yokbWPG?2+! '+6=EJSW^bilkomlja]QJ@0' "#(*016;;BELLRPSRNKGD?<53-.(*$%#         $(289AFGLNROQLJE=6/)#    !-2<>FIILKKGE?6/%"#$&"  '/;DMTUY[VVOLD@;4-(" )6BLUY^`]ZTLB7' zvopqu|  ',5:EJVZens|wfXD5{yyx~ "'2;GQ_jp{xngZJ<)wcWJC?;>>FMWcly "+/498>@GKV_jv|jYG5%  !'.3:>DIHMMNKI?:+#&8GXcr{wqe\ND:+%  )*/-/)% *2=BBFB>:0&    $-4>ELUV]_ddcbYVMA8.! "'18=ECE@>3+).444/+%&/<ALNTSSLE=/$!2CO_kw{pdYO>4+  -@IZet~tlXL<) (9MarxhYF7&*0289;;;970.%!    "#'&(%'# ~zxw|!4ANU]`^`ZXQME?8-(   '(/165771/(#  %%)(,+))*%%% !%%*,/30200,+%#  !!%"$ &4>DLQVY\^\]ZYWTONJB?84,*#!  &29ELTZ^b`a]YQI>5+! #.<IQ`hqz}~zwnibVME91$  !*48CINPSOPKB@5/(  ")4>DOV_elqrwwxwpld^OF6+  &,0540/&##&+--.('!   !#%%% ! #  +6>GQTYZ\XVQGB:.(  )5BKV[]]`VTID8.#  #1:JUdov|uh]L>, }|vvvwx)>K\jo{|wmeXO@5&",<IS^goqwwytrkf[RG7+"  "&.089<=;:986321476>AINU[[^^_^YWQNFC93(  ),288=<>;:70+#  %&*)%! .CSfrujZO>4%   $#('*)&##+4:<BEIHKHGC;6,%  )+36=@DHMMSVZ]cfegidb_^[VTONKJEC<:4) $.7ALW^iqz|rj^QC0!|srlnlqry $3>M\k~{gO9 |rmdgeijsu #,46>@FIMS[`elqwzyzspe]NA0" |soeebeglsz&.6;@@==:841/(&" #%&,/379<?BDA@<7.&#"   '.6<CEJIIE?91+!  %'+/,-*'$    "09EOS[_dgehffa_\SND>3& %4DO`jytfZD9& zqhd\\[Z]_dmoy"&/3:=CGINNSVVVWVUOMGD:4*# "$!!     !!''--337;9<:<92.%    &+/3455/,&"     $0CPaky{rmc\QL@:/*" +5ANQZ\bdbb`_^WUPNGF>;2/% ymdWQIGEDIMXcn".=IQ\blnuxz{}y{ywutqqlnlgideb^[VRG?2$uqlggeinpx#&,04558676846624120*)'  (',(,%%  %3;?DFHDB=6/," "'((%! !   #"%     %"$!!$/3<?CGDDB>=53,*'!" "$#')./334500)%  -:JU]gmswvurohc\QH=1( ,6BISZ\bcfgcb`\ZSPHD=5-% "3<MXdpyyqaVE8'  )8CNX\cgffb`YTID<2+#    %)0289=;>872(#(,47<<=85.$  &06BKV^dknnmkg^XME80'       $.7BJT_clouuxtslg]QH;/%(.1///'"   "*/6:9>>B@DCEFAC?<50)   #'+*,*-)*$" '13:<>?@B=@@@ABCFGDHFHEGEGDGBD==50*  ")04:;@BFCF@C<<64-)&  ,=IWbkuw~{vkbVL@1#  "#+./2621-) '*46=@DJIMNRSQPPNLEB;6.'!  %+18:ADGHIEDB?=;53,)! !*3:EHQQXWZUUNJD82(!    %.178;;=;;740'" $&,0157<>CFEGFED;7,(  "&+004555733001-/,.,,&$ {srojlmtz!.@K[gs{zofYP@7+ !+4:BFNPXYZ]a\]XTIC6, !%"#"/5@IPV[acaa^XOH<2*   *3>GGLKJGD?:4-)#  &-7AHRYbfmlpmkf^ZOJ?80%  &)')&'"    %*4:?BDCC??92/%   $.6@KNTZX\Z[VTOHB93* "+.6:8;4.(3CR^mr|~}ytphd[WMI@=541,+++),+&%  #2@IT[[_^^^XUNJ?81$ !,7CMV\bgijigdbYUMIA?;55231211.,)#   %/3788830*! !(6<HNX\cffiffaXQD:. ##(+,,,,&$  *-5=?DDHEDB94+$    *1;AJKQQQOJF@<43./,/44;?FLOUX[[][XVQJB;1"*1<BGNQTVTURPMHE@;52*($ (9FT`fpsz|{|yxxqpkjed`[WRPJF=;/+ (-4;=AGEFDD@?>89777767320)' ||wz "-9?JR^cmotwsrliaXQIB<20)'"! '5?GSU[\_b^]\VSKG@:.( &&*/.1/1--(&" "#)*.20200,,'("#"  $#%$$$*+125867420'$      !$+.46:;>@@CADBDEBDCDDA??<52*$  &/69?AFCB>91)  '6FV_luxpcXMA6( !+8BOU`ccc_\QK<2!  !*2;BLT^cmrtvwvrng]VIA2( # "!#%)+/034431-%   )*35<??BBDBCD>>961.)    !&).+.*'!#)27<@=?:74*$ 6K_rtdUE8* -;LXgry{rl\PB/ &7KWkutk`OC4'#,6?EOU^`hikiia\UH>.!  (6AMYaksyz}}wsjcWNB7.%  &(/46<ACDEFA>71)       +7BISW^_bb][VRKE@51)% "'*/369:;>8931,$  ")18?EIOLNKGB7/#  #(,3:AJOX]dfllhhc^YNF;3'   '*-,/,//-..48<BIQX`dlqqtstrnlkfcaXTKD;.%  " # " #%&*+0179:?@BCDDDCDBB?>;52*&%05?DLORUUUUQPMFA<83*(#        #$)+//200--('$##()(,+/-24366:8=;>=@A>A@CA>@?AC?C@D@AA;93,(  #(*15;?DIJMNOMNIHB=4-"  "#''*+*+),).-269AHP[]fknqnoie[UI@7*! "(-19=FJST[Z^YVPG<0& )2?KUbky|q`UE7&'-5:@BILPSW\\abcbb^ZVLH?8.(  '+3:<BEJMNRSVVYZZ[[]_^`_a^_[ZSOI?8/&    "  '.:@KPX\^bcdfab][TPHB61'   '08@DLOVVYYVTPMD=3((6AP]hs|~sh[K>* ""  ')12:;@@CEBC?;8.(     #',+/0.-+)!  #,18>?DDECA=40%     $%('*+')&&!!  )5=JW_mw|scWD3#    #-2@IU_enrvxtrle[PC2"zme_\Z]`io{ ""$!#!  "())(%%    !! !  !  )/:@JQW_affgdaVPB7#zsnmpt~"$)((%" !"%"" !#'(,//257:;=>AB>@<;:54.-&%#+/447632/,+('&))())*''# &*138>>CCFJGHGGGCCB?>@@ADDIGHEB<1(!)4;BCGHBA:82*%! #4CM]gpy|{wldXI>-! !*37?CHNLNLIB<3& '2:DKTW]_\[VNF<4#    )/29:@CBCB@>4/'     #).-13787762.("  %%(,+./203.0('"!&(+/.10300.+)&%#" {tqsqv{  !(.25732-)!   ")4;@FJLLNMIFC?;3/(#  !%,01569:7750+(  !(.47;::962+(#      '4=KV^hpx~~uogYOA6'  '*268;<@A>>=;:30(!)0:BKPWZ\]YYUOH@91(#      $-45<>AB<=62-"  !"''%$! %)-.11,)$  %+36<=;<952*&   !#$   !%*./22553646857785520)% !%-23656433.-,,(*+*,.0257562/'! |vmifaaadjow~ $'.1587874/,& ",/8:?>B>>75*% ",2<BIMOQQSNMH@<4-' %)-1./**#! ! "  %05=@CDA?:4.$   " ).3:AIMTW\[^\ZVOKA:-$  *1;?FHMKLJB>62("  ).0579:=?=A?BD?A<;9/,%!    &&-.26477:9><??AA>=;:53-+#     '/28>BEHHJHJEGBA@84-'!   $'%&%%&!!! $/6:CCGEFB@:52)%    &)1278:;77541-+*(&&$%"$$  #,3;@FNNVX`dkrsy{}~zzvtrjg_]TRID;4)! #08CKPV\\`^`]^ZYXSTRRQNNJHB?5.% ~{}{$%,.388>@EJLQUZ_^eeecb]ZTPJ@8.%   "#(&)''#"#/=JOX\`]]WSIB5-  0=KZalrwyzvpibTI:- #.2<?EFHGA<4+" -4>EMSSWWXUUPOHF?<520***())*+)(("   $&'($"     ").265846/.)"    ,1;<A>><4/&   !0AKXbltv{||ztng_YNE=4-' ~vvqqttz (3@ENPPPLHA;3,% #-7?ILRUYY[ZXTLJ>8+!     $-189==<;:840.('## !! $#)).114444,)!(0<@INMOMKC>5/( %0;DLRQRQID:2(  "*/168775.)  "$%((**)))*)%'%%#$#$$$&$%%  "*4?GS]gpz{pg^OH<4*!%6BN[dps{~}~}{xsoib[SG>4&(1=FPZ`hmsxwxvuplf`YPKC<7-(!    #)17@FLRUXYVSMI=5)$%&$#    #,0559944/-'%      *1<BILNOIG?8/  )2<BIKOPLKFB:5,$!,2>BMS\ehptz}}~~|vrj`TJ9,*1=DPW\adgggd^YRJC6."   )1<FQXaijnnmfaVMA1$  "&+.23320.+)"     $/6?CJKPLLE@81&    ),459:65.*! $)*-,+((!! #(-/3421-)%  "%+-276::>;<95/+" !5EVfoy~yrh`TK?6+  !2=KXbnt{|~yxqh_WH>1' (,57=B@DGBEAC?@?;<886622//,-**(&#    $%,.6=AIMTW\\^]XTMF=6," &+3=@JOW\_fiorwz{}zyqm`WH<. !" #%$(*0176<;A=AA<<870.$ #'&()'(&'#$!"##%'*./35:>=BBDBB=;4/($/;EKSYZ\[ZTOGA8-&!  %),/32557855310)%   !'+.227678530..((#"!     #$&$%#! $"%%%'',,047:=CCGHIHHEB;60%   $-19>@DGJNLOMNKKFGCA=<751.+$#   '.39<BFMSU[]bejllnmnkifa\WPKA<3,%  %-9@KR\_ffifdaXSLH>90-%!  '05?BIKQRVVYZXZYWUSLH=6-     $(,+..//0/++**&'#$%!""$$%%&&""     $)/57<?AC?>96,&  ""  #+148;<;:951+%'2>HT^ajkoonmfe_[XMJC;4,'  !,2<AFJOMRPPPKJDB;61'# &-6;BGILMPNORNPQSTXW\^]\ZYSOG@8+$ !)4<AGLPTRTQROIE?:1,# +5DOYbipvvxwvqme]QG;+ !#%*,47BFQV_cgkjjfaXOE7, #%),,//241312//-&$ '28BHMRWZZ\[VTOLC@:2/*(&"" " "!$#$%!! !"&%'$#! "#*-48:>@CD@@@87/*#  #(35=BBECC>;7/+$    %5BP[howz~~|tof_SK@8-& !1>K[dqy}peUI9-  -6=EMOUU[Y[ZXURNFC=4,$      !#)/058<><>=860,(  #%*,/0+*'# %+.49>CCEEEA@:71.'#     !%#'&&% !! ""##%&%%#%    "!$""  $&+27?CNS\dgnpssqnkc]TG>0%  !%(++//203255787978765/-(&  "'*/279>>AA@?@<;98575777:;<<<>9932,)"     "&,/58<?ABCBA>;61+$  $(-114432,*%"  &)/38<;=;75,& #&+128<BHJOQUWTWSRNLFE><4/("  #,2:AEKPRTVWVWUUPPJHD;80,#"&-16;AEGLORRVUXUVTOMID?:4+% &,49BILRY[`chhlikiigb_WTNF@<2-'!  $&(.28>@EHKJNKLJDB>72,%   %+-1111**$#  %+6>HMV[\^\ZTPG<3' !%&*,/203220.,,('&   %(,.01000,+'%!  %*.132301/++''#$#     #+07=BGGKIIGA;5.%     #&+/034898:8:843.(  #-4;AILLMIE>3)!(36=>A>>76.,)##"#%$'*.238:>BBFGJKHHC@;0*     #.7=EJRTYY][]YZSRJD<4*$  #-2=BKQTY\^`__\YRNF<3& %/:AMU[dhoqtttslja]SME;3*#  ,5@HKSUX[UVRMD=3)(3?IQX\`_^\TQGB82(  %+39;ABFDECA>85-(! %)057;;><<:52/'# #$+.03756632-+$!  $'*--131323400-,*$"  "-;DNU[^a_^YUNG>5-" ",09;BDHFHCA82& "*/7>@FJPQUXX[[[[WUSLIB?<62.*$   !#"$!"#  !"#$#$&"%###"$""!       !""!!  !"''+*.-0100113020100.))$"   #(*..131101/./(($"  !)3:BILPSUWTUQMKDA;51,*$#! ! #!"! '1=EOQVTSNB;-" $,2:?GMOUVYWWUMI?7*',16475613..++((($'$$##%   !%%(%'$% $"! "$#%%&$$!!   %(()(%$   ).56:8960,# '4ER\elqvsrmi`TK;1! )1=FQ[ahlopkf^WJ?2! !(.69A@DD@>83*#         $$''*()+&'##      !#$   !&).1568755/,# !          "(+/434333-,'$   #'(***'&!   !   #"#!  %'+.,..*)$!       !    %2;FNX[ccfa`[RKA6- #+1276:6710)%   $%*+,,('#"  #"##"   "#  "')+*(# "*,12511,$     ##$$ !%*)*)(&#  $%'(%#  "',2255560.)$  %.5>CMTX]aeehhca[WNH>3' !(.6:AFFIHE@;3& xolhgimtx  $!#"   $'(**'&"     "      ##'*('%#  "+38@GNTV[]_^_[YRND:/%  &',.100/,)$ !$)(-,/,-+&# "$%&%&##  !"&',+/00/.,(&    (,25:>>ACBCCBB<=:8832/.*(&   "$((*'(#$    +4@IQ[^ceged]YQE=2(    &/3:=A@C@@;95-*%"   "%,-3399>=>:940)% (-6;CELLQRQQPQLLGFCC>=:8420)(""  "+-21410.)#  !%&'&'%     ",6?JOW]bffhhda[VOD;1& $))../-.('!  #%),,137:?AGIJMKMIHE>:3.%  "#%&#$!!       $)/48=<>==:730+#  #)28;?CDECC?<73/(" %.:CIQY[`bcbb^]WTOIA;6-(   $*.49:@CEEGCC@:740,($" "+08;>@BDECDCDFCEDEGCD@@>872/+'#   %'&'%%!! !(+2267541.+)#!     !!!""  #"$%""        (-57?=BCAA>:90,'#  #$&'*&*'(&&$%"!     #!%""    $$'(&($%    $+/7>@FIOOSTVUVSSQLKHCA;93,%  '15@FOSZ]bdcdba`YVQMH?:1*" )/7=DKNTXZ_\_]\YRNE>3,! (+37:><=:942+)!   #$('))%$  "!!     ""%%)*,./202111,)%! !#*0168=@@CEGGHFGB@=62,%   !*/6<>BBDC=:5.&   $  !!$#&'))-.226699:<9:98642/,$     !!&$'%$"  #"$!$!     ##'&++-,-,,+&#&+49@AFHFEB@<61+($  "(068<<<984-)!  !#%'(*)*'&$   !'+.0,-)(#! '06@GNRXZ^]_^ZXROI@;2-%   #/7AEMPTTTQOHE>6/'   '*156::=<==8621+)"   ")+13665632,,'   !"&&()&(##   "#"#% "  """$$$%"!!%,0021/.'% %/8=EIOPTVTTRNIFA82+$       $(027:;>>>=;861-*"  " "    '+25:=<>;:63.'"   '(,+-('!  #%#$!  #)+//2/0-(&!  "$*--/.-*'#  #&,014857440/)'"      "$)-289@CILMOPMLGC=3.% ',69AGJNNOMLIB?82*$ !+6?IPX^_a`^YRKB:.& $-19=BBECB>72(#   !$)*,-)*&%      #$())))&$     #%&()&'%$!   !"     ! ""$#$$"$""! "##()039;AEFIIIFD?83,% ##(',,-./101/00+,'%! !%+.58=ACHJORSWYYZZYVURLJEA;70,#          !#(*+01569;9:88731/*(#"     "&&)')'%!   $'+./13667896642/)% %*49CISX_egkjkhfaYRIA6,   #*07>AHNNSURRPIF?8.&  !$''))++('#! !"&(&'&&!      !! #(*//2300*(  #-28<AC@@<92-#   &,08=DHLMOMKE@8,$   !#"$"#! &-5:@FGIKKJIHCA>8620-,+++''&!   "%+-113410.-))#"   #.3;?EFHGHDB@971-)"!$((*++(&# &-7=DHLKNJJDA95-% #.6?GKQUZ\\]\[ZTPKB;4(! !!%%'$%   !%))./366::=?<;85.*     #$'(&&$$"  "'&+')&$  %+-3488996622-+)#        &)/27;=ABGFJHEEA>82,%    !    !"#&%'%&%!  ! $%)(,+0/0//.*'$! !$*,14698;9;<88654/-))&"  %+/48788842-*#!  !&-49@DHMPOPNJFB<7/*!     !(*239:>=?<;80-% !*049=?>?:82+$   %%*..2355531,(#   $$&'%&## #$'*(*))%$    !#%%&"   "#(+.0412/-*#   #""    "+2;@HKMPQOOLJC?82*$  "')./01100,,*&#   #)-379;=???A==:842,)#    !%'*,..--++(&" !%+0165795631/)'!    #%#%#"    "*.04444/.)%        "!$#%$$&"!  !&'-/359<<=?==<;;43/,(   %*/59;>A@A@@=<74-("  ! $$'')+),,/0/23567899651/(#      #"%$"!    "$()-.-.,,(&"  "''*,*+)(&!  ! !! " #"$$''))+-+,+**&%"      "(*/1689=>@A@??972.&"  " "  ##&%%""  !"'(+-*,)+(('#$""!#" ! "!      ""&('**,*,*++()'&&"!      %+.47;>>>>9:41*% !$&%()*)+,)+++,*-,/044776532/)% #%++0.1/1/0./-./-.-.,,-))%# '/6>DGLPOPNMIGB=94/+($  (09>EFJJGEA=7/*#  "(-0458886621+)$   $'&)((&%$     "!#$!      '-.36678431/-)'&$$###$'%''''&$#  $-289><><<8723,,('#"  %2<GPY^ehikijed][SPIB>81+(   &,26:?<=:81-#  $&*--1-.+*'"      "#'+,.00/.)'#             #(,0379:;==;;8920+'!  #,08<CHLPPTSVTRPLJDA:60*# "$&)())('#"   "#'(,,/003243412.-(&"     !&&*,-0//0,,*($#"   "&'*+-,.-++*)(%#"   $%)++//112132/0.-+)'#"    !(/3;AIORXZ]]^YWRIB:1& !(,136699550/(%   )3;DJPUWZ\[[YXTPLFB;6.)" !(-36::>;<76/-$  #)18>BHKMNNPMLJEC>:70+%"  "%*..0/0,+'!  %/2;?DHHKJIH@<5/&       $&*+-,,,'$   #%&))+)+''"    !#%&&&%$!  $().159;>CBDCC@?96.(!  "!"##$!#"$&$('+)-+.-/-/,-(("  !%*)--0/12022242200,+%$!  %+.36:<????<;75/,("    " " # #"""!$"#"""     !%*.056:<;<<<::53-*&  !"##!   !(/7=@FIMNQSQQPONIGB>:3-&   $+36=@DGGHGFB=81*!  %&+.167;>BDFHKKKJJFC>92+!    !$%(),/.0011//.+*&%      "$'&(''%$#       !#&'))%% !()--//--.+*''%"  #)37>AEGGIGHFFDA?;95/+' "')-/./.,,&% !%-0465642.*%  !!" $'-0111.*$     #%**,**'! !)18@DGKJKIC?71&  !(.4:>DHLNSUTVTSQMGC;2*!  !##$%&&%$!  "$$&%'&""    ! ! !     $%')'('&%"   !$#&'*,+---.,*)&"    #$'()()*&&$#! !&&+-03254635221,+'%     "&%((+),),)*''$$"  #&+,0/1//-'%  $(,-001/0/**%"      #),144779788664554463422//,+'%"   #%%)*,.-...++'%!  #&(+,.0014378<=ACFGIHJGGE@>84.'  %&+-115667542+(" #*.49<@BGGJIKIFEB@=74.*"#'*-00220/+)#              "$%&(*)*-)*(&%"    !$$'%$#           "!$"$#    "),249:>>@?A@?>=<640,(   #(.157674510+)$!  &.28:?A??<:52-&!  !    !"$$%%"!   !(*.002311//,*'%" '*1379;=<<<:83/*$ "'-24:<@DDFFGFDA?<73/(#  $).3354520*'!  !$%##"    $'+-/0..+)%!    "'+/.0.,(!   #(++--,+'$   $%(),..0100/.-'#  #((*('"!   $%'''%#"  !&,/4667540,'   #%$$""     !"%%'&(%%"        !"&(-.348:;>A?BABAB@><852+'  !$%'))+(('&$#    %%(+)+*+*,*-+.-..//--*('!       !"!##""!!                !#&&()*((%!   "&**-..,+&%     #%$%$#!             #',.123221//++)(&'%&'%'&(&''##    #&&)))(%$# "$$&&&'$#    &+-124332-+'$     !')-002220.+&"     $+.48<<>?<;942-*$    ',.35::<;<:9640*%   !"$#$%"#!"  $',137;;==><<:942.+'$     !$#%##!         #),1147465452/.*)$! ',27:=<=:840+'" #*.4:<ACFEFED@=91,%              !!""!$'+-0000.-*%!        "',,///.*)%!           ""$$&$%## !   "%*.143543/-)%!     "$&')+*,----,,*,*((&&&"!     $%)*-../-/++''#"     "#&(+--/000..,)'%"      !"$"#"  ""'*+/1334522.,(%!      !$&(*,.0325566340/*(%     '+/47;>=@??>??<<;8742-*%!    #$'')'(&%!   #%&((('$       !#%((*)+)''%!          ',267:<?=?>;;8631.*'$"   #"$#$""!   "(+,/0200-,)$     #&)*,/./1-,)%#       %*.359;;<<<9842.*'   !%'*,+,++(&!  &*/34888:99641/+'#     $',/.11312..+$#    !#"##$##!      "$&&)(++,+,+)'#!  %(.258:<<><=;8620*'#  #$&&(&'%!    #&),.143565432.+(%!       #&**-,.,,*&$!  !!$%&$#"        "#%'')*-./12445342/.)'#  !!!"  %*,259;?ABBBA?=962,(!  $(,/0210,)$  '+38>AGJJKJJHC@;61,&   !           !$(+/1446442.+%! !!""!"    !%%**++++''#"                     $&+.26699:97650.*(#!  "$&'%%"!  "(.179==?=>;:72/+("    &)*-/02/0.,*%"  #%)./47;>BCEFGFGDDA=:52,)$  ""&()+,..//-+('"   !!" ! ""$"# !    %'+.135756431-+'$!  !%&*-1278;;>=<;861-)#     $%)+,-...*(%#    %,058<<>>::741.*'"!   %+-236889898430.*(#!  &+155989763.*&!     #)-248:;;:;74/+%       !(-148;;==::87320,+('%%$""    $'+--.-.++(&$!    !%&))+)+()'$"  !%(,//101--(&!  !)38AGMQUXXXVUPLF>7-&  &)/279<=;:852+$  #&*-259;??A?@>><862.+%     ! #$%'&'&''%%##!         "$')*+,.0./...*)&# !$((,+.,-**''""  !#$%&$$#"    !$&%(()(('##         !"$%&&$$""!    "$$%%&&$$%##!!!!###"!      !!""##%&%''))++,-+,))'"    !   !#"%%''**,--0122334421/-)&"     !"#$#$""               ""     !""""!!   !!""!!            ! !!! !       #)-246789886531-+($"   #%#$$"!   ""$$$""   !!         !(+0255775420.,('$   #$)*-.-,+)&!  "&,148<<===:73-("        $%'(*)+*((&%#     ! !        ! !  ! ! !!!         #&)-,0012/0-,*&$!      !" !                         !%&)()(&%"!   #%((+))'&"          !"""!    $'))*)'#!                           !!""!"              "%)+-./0/.-+'%      !#$&(&&&"                    "!#!    !$"$"!                                         !"!!!!      !!                            #$%'%%#"!       !!!           #####!  !$(*,,/.-,+'%"      !$'())))'&$"  !$%%&$#!  "%&((('%#!    !$&)*-./000//-*(%!                    !$%&'((''&&##!                      #$')*+))&%!                    !          "#"#""             !!    "#%%%#!  #%')*,-/./.-+*&#               !" !         !#$%'(''&&%"                                                                              !                            "$%%%%#!   ""$###"!                                "!"                                          ""$#""!      !        "#$%$$#!                                                                             "#%&%&&%$"!                    $&)+--..-+*&$!   "#$$$##                                                                                                                                                                                                                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/24Ride-4.wav000066400000000000000000020167601366722712400223160ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data Qf_I2; ,_zoΊtH\!sK_'-.RUCţ޺qQ ?73# t' Jd3}*');q٫Rߌ(L^X#y {]*$ "(1t \p9n F&n%,g)&*0@h%VX D.QZ.0_Fc ^iO w4!&VM !K I A >|Y]k WCvEj#N#n -o Gh>#CS/ +Kg cp2 !xC<7 ( .Vgq' -`,P ;B C ~k$:p)n& TL_!4 9N8 ,FzC  " UKGb r{/NKx 7P;\=#x$]`Ov+i^r&]B <h3=!F H"cxEJ >aM^=J`  C  ie< @  V }0"k 2L  j  Y hyP"| 6+i s ~ ~e /\_ ow؛)w)#`]pB>o>! H> ETv P )= ;WX8" $/0]qtMY`R\ ~:ZZy'{ F{n/L~M   =  qnS & 9O\[zd + 8  GZ3/Y.d[_!ry('Pi,0VnLOq~[qt|  V"\ p -  3#g q N6Ir*>f-tfN1##9PQsgJ"yi-X+3_\  xTY ~B6^D>p&x2 m lP "1{T0"ESj [. 6W=E E 4"` /*ZRA^K  C*gEM ni#&c ]U_ /t ? \0X.Qd Duar  /h p9S~ 'p\ AX;  c 1 Z|*6RAFH,* <uG_;= =_Iyy \~LS}|[a#v [<}ulkjw,@,; 0K-={W`W4~ i  @TeWsR1p  wj / `O>[E L j 9g G^ = A1 5^&"HQ KZs@ )Nc4V  :ta}.A/ }xb2# &=q94M/8SF~o |; u& Bhphp+O25tA^KFdh3 Qs% dNW]vy#e  b u  m:]AfU uW u )*3qL 7/ x&h;v 46$p]lIc62 / j U* `9  Y"o^ WyW:a6aD u)zz[I J>if5 X.8x "HML#1 s&i yo /X Sq oeO 0 N[!l3~ [y!#?+^kPp *Hv8ug :&/ ^yA/' jaoo )9 !An&['?nf2N[-1<E & -bM x Awnl[s-6WyWG Z :YE` z u(C"4m\\IQrUy#R}$NGw;W | v$g.k*+)k  { u 2# >Q] G-_/+mA>qdI! NTLH)+&* 4)iM&x23 [  # :Ebu^ ~lj N p{ <$`<HIf// ) zCZ7 ! i5 ^ > 9-r`Q%eu]ShXqe R L . H( N,Sc=Ry YlS  >&~VJ1`;a4tX\& !\W a2  m QR^ 2 !P?+7^Jtu q z+/=(&EFv;CJL2lhs!|  L ^ a@  %v sW  vVeT8dr 1 |3CLt)- _ o i' & WMmg'yHum!5Wm  b  D| _ 3 } X8(^r07 gaT 2 B&R Fa:kEsAE&DI, | :Oh >TDvN9 >B (D )7g  $z ` f\1X   :\~so[c4E_i#GM0  wd  e |Mj w 8 8Z  zNIcon|k&fm io. ~_ J a  QmJo^ U~;i >nV&Is n*= 2 / nj !sr4 ;V |e rN  F *Zf$m]Ml^,C^ ai9'+? *z ::`  $ "Hx g&'7p m .zX b d/ k 6(    ~m ]Op1/] MXGczb7$D6W,K^ y R ! nF0cN p  D H5F/:}|P<):63   C)318 fj)6;cew_," R ( $6ih]Py0FxJ G p0 $FNMQ2i_NY'ju6 TE 7 ER nr3Xca43s~ ^e9Y(%\N2 /  lU } g AO#/80  `yKPNB?W%@lq~cpq;r';I tB 8 B ZW  65[C!)[}V\X&;LkV"+iD  ^?L: vhb"g;~18~ D~:)kQHJaliD l oM:@c>1:nyW/QZU ]z<R<myB q< ]3a)L0^U+ZJ-V a "($$  Yyi lm  Q .z/W_G3H~QId+Z=[tDn /kW i Q1}7NGZK8 -HyyU2x 8OVrt<T.a }%ATZ'  ( dhy+ X_. K f 28 "b{Oy,lfy}JQI2rh>$cMx | # d7!t)9h uagEl_A6&Jn ("LHy'q. D Z8lj^m n { RW>(,n'w:$cqOkl ]  5s4K%zzR |`* b j 6P m  U |>OR 8;Q>,vH:r-  l)! RhOp C   +]LY.$gyE>&_?}$ v ](^W L tV|&J - 6g jG{a_{ y xP_jsHBHAc31gM#'w!UNq-#A*r/K uK k{ PtULZ)<C T 01$/h*|F DE@X92Ue} (8l/ G "@5 \ 6%I WR&OA>^fK- O,Q(/TA!Ie_q[O/S brT[ iyK0 p-d]6#eQNu.G|M:\y?<<f0X] lv l, _lI0gF0]3a9!g! C!RY'x 96]pHD BU _ *c%~DA'62 R3&BnWFUbY VnY!6 Z| } t*T$ibmB h C"^t}[z72dR ~ %iVVaab'  3^yHCQzirQ>E|}3#&"k nC8?k*/*Zd~Z D GS-{ 8  na / 9:XN\ W5I={TX(i]0 c n1A ds?B)d./6 li6lPC,2 B  AR \ 6P'~R^ 4VuEj3~A [&h:;1[D(w % w s  TK w kv Crj>Hq/tq WI..AT @VfhQ| $ &Io Rg%w`  E?;Av  L1q_ {Y$P et}zH=  X OD?R, 2 G3J?Ll c9j<J7$@/m?;$"09n'  o od2i K D  O9ja/uiX(f-?IC +U#r;^B7lfo{V;a41R@~L w .#( SNFC.ZqaV n1a$6 P 6+)z7@ @S"Fcc4e B J-Tz]V O}*;Giv.Vfgtf@)1N n :dqdm_g ,E4CFR!'q=z w L 3'z 9 ooHA? OyjzB0cN Ln,v7 *|6U+   JT]u Gmg1:v}|C(vv7WdRd34SRGrrr  (Cn2z "?_fJ*D6mk!Cga=Q\o6I:@ ;r|Y ^ }jC)`a:!l)&ex),IddYco)uR ~H WK+""?@,#oYr4{C$#AvNW u.[ &pu /On)dV0UpG+w* bV^A  J n 4&Ml6HTIf ia8Lf"-"X#eZ eyW;+y{<p;Q3Glc4"$o0 L  _: kRz#Jzv ~dD1/[{ ?[FZuqe= o 8 [X e R Na|e9tM>:2/7OCg?Yy] Pd1 nA{'I^%ka}?V6j;|bg ew_j)f2qr-Jd yy#:x4r?`ii yUu`"OiA,LidlY) )_\ s6T,7<} l~*I= 9 '>5<..6.tp9*zJ)9v)Cbn  5 5'< i1BSnI|XYuTEDBC YU | $'@h6?GG=em<>D=MBdNjS%1 ( <gg-+ /@` N9|,mnei(:6q.S=t}S5~: g+}z6GmCfyu@+d\s!q)^,rzHP : #_z5S$")Xm"'5fwUL )t1^! TurZ,+  ,= 4RvT`>SX},E-y(N7ZoV_Z )lB)76T AE>[!3l/k_zkt~=fBW2 `$YAxg,y6+lu7_be-SDjWhyoKz_L/iwJ.F7nBvpM>@L@3Xj | rY x8D C^SrXPlhB<CB{8YXJy %Fm>7K !|BS/qY&K3Zf'o.3ap ; n90c[q<'RQ. 6m aH:"y qnTz1C-')Uq% ;,c!![' -bH`(0)WwPaXJ@}h$&!U ' 4H X!#i\T`z v@zkR] Q fiBg x16'SOe4P\]+d N r'kt}gV3)!Oo9i*2k^Zi5:L+EI@3N!  L Z56w7r4/f@d]m jf?|:y)_zgHi*C76 .o 2{&m;&B($Sp:wrQ%QSlP ~G!<#,Dm1jmi $jrPG#59(I++;R~vh 7AYc-i$1S '7V5M#-Ub+91Iuve][QU!>t3Xor!oq # * iz'rHn'{j& 1N)JR  a itoM~ bBS5 AvC}2dWyz?KNec` riJowKRj|R9\ wXI 7 3 oCR*~@>2 *1 v }9j]aFb5y#xNO& WC3^_l2jI 0e-[.lK+ABycv|`^eay_a;~wY r??vEwT-ljCQT6(kV}h2lb ;YL z |/qR~mDf2hC,!7 jjt %nJw1+8- LPJQaAn (R}`+ Zo# BAHB1S/c<F>Oq8z< hS0( 15w7M`e'Db =cde71oBs`,d?(W1*U 5 v*V y sQy%[vD0^p?'%9Aq +F| R[[0&'[b / S JCF*| EIY)Qt:pu55x|ybYTgl $O_?,/j o@9 ,U)Tx9a?K1l5oC9fw,f` E'E9twx, SO O`cTB!b/m n !LF[G~vK_z)aF Si!7)CfQKJpy t t J` ~u5W/.D;w2DCU"j<=e`YS9Qgl 4 -  2W= ub`gykj1\}!wm t*py%1=fT)R!d,/?bX S g # 7yhI*Hx 8 L  ' O8M1yBp J)]v{'H18",3is 4WQor.l" _ { @ :  \ OyWD ,=49t 6au7t~$>|Q\q$l)B(Y!nWtP ^ i|ZE$nY qy# \ X@=!bh.Z+E nb}pU)~_TN/(&en.'gwMW3O W * p}? J :5l 4ZLN*>?fQo+a^N%]y7j n"G 7%$I*Y ']|J; B fYu`=z)SQ3D,U(p\?, yy r m <W Z3 ] 5l|1n}+M=1Lu> 8  >2Bg:d"POqC PqJW4 KJNv9XW.YL7|2Cj_-cGIJy }MEY7co^I1o[,Y3c=vY6*=tfMJ b ! Nn4,W,(GF,lH/$a>D;Q%  j KgXy,) QOe ^_(cYZSFAl,#d9f]l4?D5 mNqOLDd$ ]$3g MZ^R?Q>Y 9+g$ =ws,u]WCLoacD2t\lj eM?,:mv!g_q/1i*bsg+_&TMe'w ^A,}?am%kVYR|aIiTnf5ldrU3gh[Ca 5WI%|185;n! t^%{WTckGmh7gm)<F2{a rVd / EI =6b*}Ds@vlQHz!iGdZFu5  u R - v>Q i$5/C;@<X4\7 WJeWK+ \a3Nyt4"#fV ZCi,a35nwWUo~.)GLU{''_KBv>AW3VYj3f@ ~~rj,)ZrJBF6J BR n   2 mWnZ+Eu$183kr4gO"/D80H Q"C? G2gm|")}MNL<-Nu4F?Xn=&?K<#]\f|#y0'+O Ml/(b'YBQllk y MCLMkLKhd&Hral".kv5Zwo$ C >4nQ8T|/~WF Q Zn | \x!4g-_gQda+DQN7_Z&c % jJ y|3wL+)3$KZmT: NT-_tZje%1hf 6N;d\~Bj3 u::0Q41 ('V9C #T& ^<'r~yv["3DsD 2g)iei 1_&Nw/k>cR4P;d6% dESx+&3F5 x +^H&|1m!$Cg2i N}k g8   KiXi'.L%ly4U}Tb2t}s h.li RmhnD ct. dS)o@$91IMRf46YQw_Bl4a# )yv,@jS_nc;$WL CsOO/?h^ We/.{]Vd'<sAM?5AK<0cCcHd6v u  V2&wJr\{9bTh, ns-6T.5v+ +wv7JseD_4^?k|Oi+zji6`'9|t:&.R\kE-x~a {T;;7W9SGFQi h~ lLT J(LmN!<=xrE1o_jb]n S( O# 5AKQL3w NbB/T ) d,Kdpjttn(Lued r m ,\W/cs{Q/?"}tc:S=2b \@{ R aa{m[Maj=P3IY`w^7B5OEn}6d T) _163Rs-Nspu'})divA9@JH]Bug+~_]Z$E a.{v1]0Kh)[W>U\4Fw!-@7T l  W 9BBKlY~O!$')gpA@w3AT d"]Oi;nWxp8$ B 0iyYoaI( qA7l lQo'zo~k2TwI+d_wK/Ef\8/t5W7PPM 1 _-;,(T#YV9PzLP/z6r,e92mC A M V \]U|(ZB ov!V1w2l-7}|R0FB>*m u P/ 18DoC&Wl48IJazv1@74r86Xyd a W?|U_vC8yeBx7+=nKW&{8kw$|?I{Euk2AGU00 ;f9L H  &VJE:jN4fMdG SvBn_ 5 y| (   "3)3QaqpL,s p<,[OZqY~zaM UXvo mbp ZRT_-{xv$YRJ.20*~Pnp!L[lbN 1 anHi]%3O;"@ SK!#I=s!2'<! g_[%Y WivF_*21SBLe0L'r>7a 2$*!'>C)a ovG/K?",Qld^_]H (_?Jjo4Mk,,bTV8A+L=O"$ )(1Df"y0+7'LSWnCnRje|&h!*z\*_|}2gV6~{j} yqF< uonHz5;8F"Rz\Y8kA@ Z.n=n &##5FJ$UX0LMl+9s{\I!&\/om!wA'6A hWOloxJ :DX`79qLY?N  ?q_,WX.u * Y !| *so y&~0ZO.GDY{< / gq qH  / 8nY\r7;t({S{:b79iD_,&9; ?NR9_|Al1V|e2?cd $'j3y a>w57ut\}GQ&F:ER?"2" 2 d V+R\ [S5r`tVs1Ax^#=YU& l G ] g Cj!NRJ{C>\~?L_{>S(!n^M7=0hvFuc (1i 3b_oqFNM+gb w,Tt}e:JR|zyU|~RS\dzt^ 9,Bc p&WbQQ I@D wo_LWRRM"S:` ^wQ, NlB' %8<bix 3 c ;* P*tROGoLeQJDqW&JV/ Nn.ci:T% d F.  Jh$SeQ@^sQtYZ9 }Ct[A[%t)5  a eq3,|)aQ0\ m;FR4Y61)Sb$&; iawDLrBySu[$ki8 4:X'e<l*ygIgcCYdSYIEPI6FvT' H 8 )2w3s|^A80;|?ZrvNKtW$x; RYGS|>$Ege o',^b?!i<P :?rd&Wok q&FOZ}sS,">IbNnB! @O  [  A|h"A|}GRM$[^FWBVmd[KZs;_/@;uL&?_ # ( t4tn3}Sq"1.L:n^XLL U Zf~Xw- zFqlGB. W\4&OJ^+S34Feefj|27Q:zP'`~#9| Z,AtC|ZI7Sv`\wUu+z83 Sb' h y 7w UXwVXCIO1q$panN6b7  R7$5(i~64CIvd=/(.}M_PBen$.2%{JNp/Q &Af9Z&V BB<6&<*DTeRC2Uo 14K\.L=M|>M`<,q< ~G;45 *apD$gLG+Da<")?wt<]1!LN%03H 0ae|tISPe>l?gnA)jkII ,OL"% ljR7t n4%9>29) ~qx gh/+J-SSJHBD7RZLb']&^QN4j=F4luS8 F tUYr8/3<&j/v$GGE~f}8|.$-!Y<   H @ K AyABatg^H8#l{NiggWr \~J6F=!T(WDE~)6in_dHDZ'7h"pf/6B=ZLP7~'=^jTP Do>5:}4a-QQt)2QJ3vww^~y43$v /967un 2j)Ao8>HB h)6lL*Lxk/ o?Y1& #tra$eF'?p'mltG rei71ldB,:*jcglvk, W/z*B*m76NG748/q-8;9ll*>zwYBN+Rs @Syjpm\7 ~j)$~UQR6Kab'|itPS4]q{Qq YMwZ!I(bJAa|*W-#/u22 fWk9,69st3[l'D^NcIy.rgQW_M27[2*9f{1'!\lE,S1&G/kGqWw|H i\+%1%b2~m?$4 F{|~f4Q: v?O}g ' _!J ZT L<;_/wLC]` W?8fCiNRF?. G]2{lN&sDvaz #[MG>f $'BV {#:d{~# isYMd>TgjT,EWDU]M 8qSYPt $hd.=_{jI_-$P`&JFRvH/h;kd_y] gc gNT{CfAD&%,]ygN0&y9\?^T9EMMW)t$3*#,t ;J9eD'dPO^>y+v+4y7fa=a)Az%21 _n#x pK]WO|e^k<.amQlq,@Rady'}K'6lQ3MCI(tLY la$7Y.t_rLaPg47aih$MAX"Wy /sZiqsnkdI/j${J,N4DEaM-gG+0:}^`lk:j6TDbJV??D3K9nBK"b 7=5z'O<`Q w}r@y)1zji+ kA,i6g42bw=Jx/{\3?*QoGmKN[v)MW- ?id'dL191&.)Il5f+1QYc-D\U;Mo3)76n>E5sI L $NVAY~9h=7^ +`Ddr\GK{Y4v[jguOT(GO,1]lM>0JE1a/!4I!6H)wm&xO+|fD?`P$`I:,bqn, ,?U9~6"w_3l u>L#D1'|nAiH Q=-D o1e~' N?GwaD^'UKsNz [?yg\$Zg^-.o|>rCK$wSjA*f&~aZ.L~^`q!q&^ f;Kf\@q+G4m\VJGtkqrxk")lmj 7/ywY,T1,,gjBi] L}Kl7; AMuc`l&j yMOA R`n39(u2 |jFb<a[ZvZPAt!85k G/>!eI$ \z<:*+43!'v.!;9YL)>:o'|W9xq+?j=i/Avg23P,i(vG?qlj#) %w+,wmL' <:ZV?(Y hEd1;-v^yM)JJY 9?k7Vq ?G.%=/> &?/~3|@6bNDHo4- ;eFFS_)B8?VadEdV Ne=|-^|$:$HwFC4i:v6(//bnoJ1C=EWNZy~( 25qW 2't)[B+G$0l50T4y'%b"9^JWV+vd7.a1P X ecnU l_<]w\&d[a&_l~I?}'v(..Ry5F|k;rVYtmV)\2 /b'N1J~ (eL|~Yl*)eV)'`"@mQE{:I P0?|5|o &Fy!2'/4 J Pdct6WJbtcT lM_1w$&&k5bVD>;P#e##}%Y{:L 46 ![-*.*o!^{F\)k}Q]anx>'06-mhl4 6 ^9WD ?z gLO?bib#)nr K,=>B P$6q_5\{c|y|*0, /^dnTi3# RuU!WdwxuU&KgAK O9%C84.Dn3wXj%9P$[/f/~:e2C\BU 7\O_$cjw_qh} 8uUvYmq rFTTRnP4CFY:!4M[S |BTZGv 4H9<GG$6!"1(}T*uVUK 6F6)V$2yUO)5D' TFLNl\8["6U+6\F[_z] -ZdsNVOjF&(`[lPTB> q7cUh d91"VY(Y?)t?Y,,;Z>0zQ|2"C&awqM*RDi\4=7iWY342lCWFd SAVg<NrsRRfomZVC,RN" PdDh _br1v Yxym( W m =?:kYf'AF:z)2V;&l5o '>n] DpjcunVC)p-FNyW'llpi_Og243Kwqn>JbI0es99y^Dt>~p;-dO67\+KE}WsJxD/Y/91IW$7/,C$^I:p byp T. YJ&V73{-.VkH:Yn# nz4eQ2#qCezYA.Qs6RtSiU-3{ 5\oMzY%Wi1 h=e9|\u0Ek<54:=DJ"/{Vr~gX?^z5[JR3q"EW[Y9?*cGqM'L,}|2|zCH2m&a&d5Z *Y>7!e$M:@VV2 m/M2W4>l50a|S$pSVMpgabRHL$0)L :Q  Kwfi% ;b7& hw# FO8Y/6I\0$ Fa:f26t=9#83nbQM3/y[c <OuaS60Z:G||D; Ri=TW@tE*(s#D/7? 7B19v<8Z?4TAeo?+jEG@_-?f!Kr-Gor m{?%Lf+"^Gt'-.\ UbU+QF;Ou<IB"iLrRbb)]VS*ab y1'~"gN, ~V,,qoF"x6>'" *ZDBL ;JX\lajWH; )Vtk(iH'4/":a  "(I,qtERD4pQ\7= uCB'#4RvYp?Y o>\+hqoQWTv /T"P#]?#HfTp[hT#A$EuZBL# 1ak34qa[Cg=|StA*k-*hb t$.=xI"H{Q22L;v$FO >U2hoU>lJGjJFk@OnIW${;va lafC: 6 W:,k% HBbLsaD2GFG:31a"<mjZU-8DaB mQ4/lsPf!,LcwYd\W2FJ&r~*Za\qg1W>* [$k*oN<_fGooSA.G` ;e"r`~!6c<<9Ty,.yjG ug\~U'BLa84 z_tU?ZM1Lo;)VT\$4<VDsnd( otKA/"?9 ~C,&m m9l 45HN:"Y?@k@d>?ZQ%.TLhLRzq6W2/IDC$ cd<9&|  r  JM9x?&P0]1WTWxVy?D/V?z]ij*22#'>&E VKiK[.MbcY .1%lGm!baW]p*^D<NcCij-AIwwDM T1fbH IZ)jDS=vv/B8w[4IxxFFYiGn`'K'3 <-9#_)<LnDks W'Q!qtSH;G|~}|vo1 M1|]vT;i)_/d$"cm|AV9xg2BmlnIfQ( ?Jj\ibEVNXZd9n.0t  /L_8<~ |t+.OS{I^ONT%*LQO  \1v14Kf>\B#!CG4keq1 _dl*.-8,Ivlm. Jq- 2_YL4:oy  M.t=O.:7igzsOaz+w4NwqMIBK2?f # s^ AN\!7%n71$<\-#x'6oDrYKQp{uT9Gs5CU4TW\0_8nnQ rd$A tgt D jD_R7!d"?S\ wP{!S^Qd?Y%rV]+[=d?Ik2$nkyz'p/ R0XAQo#i!CRT949[Q4QkC,V(B!I & 3|ytfIJl]V]"WYv;3m9p2y>/!+!X , 5-%G)?72Tg:EP v8i$8LQ<9\6Awg B@unIz| |9[yS&&Gk 2X.jo]bFSm)\#QvB,74t <=M;O[<tB}A1qYDzGh:j}~S1W SxlR tOy>97,)L:S;*q<$]_w0dvN[[DbCvg.%uBV+m/,m"/}t0 4Vgn{F/kl7n-vx6qolypGy?IES<"z,>r!B| iO3bLYx4v89k#\:Y?iFl\RAY&;?;J>?i7 f AaF[#\YfO;7G=T<s'1qOFI{CSn|L:!fVT+d+W7Q@ll Z6ZN;qadntu/!!/i"-wbM09nUATL^Nr}x=PbntD$9a] iDzoGJGjA/+$=2$ji=oui} 6ao6J~g'|FohG?Xh O>5IB?sAm'yc$ * ,=A#)pq2k2[vZg} o f'} TC 2DNDlTR)6y\{%:%Z9'V%]FyqGz`Tx?ILB(jwWS*e3jd#?iY{?y$n+j[KR@AV[Tk"-V'_i  Lt7Eu;3 n4tDvm=xkCR81B)XE*e ltgO{>cFeQ\*r:1+4|Yn|8bl!<!eY}tXvf3Zm dQw\yp?eWmnBI@rW9ts)Va8Da  __Vwg'<_[Z|zA51g-LLR G<Wy7DF4  ?r2Xc^riY$W W+tMNYa DQ*y[; ` 8+vD<7J|B&7vGr^F nfs!a^Ulvj3I/*3i I-Q;A6h_ [f,(3Dy;G<ocQu,"q9PdX*7VJq5vn,zmibZgpn$ E'.v}9&DY K':oT^o#R[ attGT~cN UN"hIm31jcyBKj7=BW)h"6; 'u,???Cb4mA" OfFT  % dIX g";,V_1:9@X`#co{-\@F zQJv=l BN_U;"1<>|PznDbEENphY2zejDn>-J m4f4|R[u]dl%z`kO(wdD*D$)y@y''a,T;[g1Y V?Cv52uw:y. I?$ -#$J|t |mWr}@W?>Tr&A+C?n^bbG. PoeS}] V-vCWI|4S+ 2q;`i,yo;.1T/h48C6"ILyRG~DqrRUu7p's,,bi!^s E/pQL-6z4/ =Z +!kEj7" }l UB>Y__:}!7ic1@G1)P1kKYJXFaG:/y~9 2I$&g1d]iOJ.ZV9l3Iv$9vFaD+@B=adZ#llj5mRNZ9Da5R{QzJ]=A"=1O4^Rw)"55B!'Jf&G,v4TQmdTthY ^B|]tif`5$`T:H$\'bufE3FkJ9s\',!)sj#6_-5I:} [jN'+G_k .Iqdm%y,uNA13>n4=-O|$';$D;>Le'$<f>V cOLkJ#BG\:  8 5@JHCBZ}K'6:i}BYxe2U~"4W"zUl| Dm%*hri1V7y'cVLEyWFZ/2<CtKg^@l{? . >$~Pu)tb QC4sDc^{!Z 5Z5?c?BeCT'-adr:U.r[U7 -xN^E6]_]cl,:'&~)}/\u:zRN  w1Ln"llL92(Q(W'< # 43iwJ9[']g|-~ b),!!tW2+5{w ,4gl :y +Z*E!"2s-XfQ&0wq=>BaUl  /yR[{`E?6.w!Ilhc)y.1Z~rZRf/3T+{FOwC+&Tw|?nq5e#LDcF)]RnrC `5u/ m]laKY*!4,Iu%vM1rP{u "c`x&T1A1;;qe@anjaH2!:b?gQ9) yQ.YT)J 6vU %  ;G|kugSeg'9giV;sd,$[wYj}T]1OG1 ],Ua+ieiwHe4yD>! TI 'g]0#vO]ghn14&8,>h: .5_}q^Q>V'#$qnjB o4$mNeRW@a5g6 J ms:O.hqN~|AIm6>-3">B"!gzLJ?X?N6,6D ?wwK&QDTa:^QNiHvnsfQ}0~,UI/Y&e0 Q:WqpTj|=&7a,\<2DLc:6{Sa{=<]b-(u#r .l Lj&]4t9`:=_V4<tFW;3C'fvv` /Y+lFOscTvM1]^i. E2LW$w)#2r'2$dJM&aNr ai^O}6)KG+~Cu>+??FE`jy9?7cW.nt,\[Kz|v@c!S6`'t<5G4;Bd (Ab<pu\djtueW%]Jp4Cv62U#O+QN`cv/,nv>YY3xXBO2b*RgdUtLF>[M*2_n?$lg= nz]q`4Te`c~ >xmi E!FA@3;TJ%v T<Nvg(9="!G=~qfg+`b Ywi9Z,T,Z$Z&G 8D*XZZO#1x 6dYag=CZ3"Bw1N9*N7eW|f{=fmGQt o77F/W@ "!tJRloAaGq iLQVl'~?s/<9GiN4ll2`gA&|+\?\*KKFGc/ v )dT  \{6B/?ib,qn)W 0V[YdM nsOA"k*D&v4 pH0P1w gFZD|EqG)Wdo&^D=nLk8M6 F9inGRs<]\8b_/I n3sf% TU'GJ^a k5>%'8dg~]DTJNy9""6)JWUP.8y ()^Dy,o+lS,>Wy z:}Fg~FuO,?k<iQSWOIW^4lB?>n1T:r)>G6#'$b^i1k)g<-g:YPy8/e^hM1Bzy3"Q/4~'Uc~sG'(b MmYL-iIE;D0y,]j_omb?f{S{ob,#4~N4d )VC~*{K|iqrQO9 nF1>6nG%45&Q|2gY_4~8G7)><^7V@"1k8|ZO8/ NQ_L <D O7eUy%aOc@T!I3:]Gy"8)/?yYZ)ns r,Qz3C >6CbTeD]_}%Q fv"G "}"$$Ii-8 yTro+,|2eFR)w$-qFc ;VHC2$/),n}]Ys /be{C[;BLg+GhTJm8q-o:in q\w<>W*jYc'Zllu}@m?Ky]eI!j YueygT2MDGG|V @>?|p)~u)fqr2d N &7N6O>Ad(Z*i"4Y0L4RQH4;9?ZGh}P[n71x<u)(>_{=/jzwn7aejf!F47GMFRaB_N*mo>cgh],!^Km, Zbb# n,&u.^?zKVI~8!,8A]\uda7o^j +pg:2LT%y! kFlH1\z~612_+a!K?_]RoOAGcj.8?.!Z Z?V(hnNUomAa-hoVbA i!"0=F`LYs+s~\h42;qwGROodQeB5,B~bn&~NznjL"@7^i+_f}fDD/![J $$c!{ #*C:O0N% .q{YloI45;d{Iza"S'%qq4zj^n6B_wzJYaFvd,SLs O=D6,4F9>&4FOK*2FbzTOd syS8|{1Q+1zv"eNctDE)>ieQt$7gA-i2FT;\q;<!*)3o0$))% 17_ 7l=OW*Gm?:n!Dh6P<-m>dFL[_Ou>kI'G{&lcf~Q|@ /2`p*,-$nyn1ly!_%oUqUyc=|R?9&U=/Yi@>G9vd"WQbTq4drA7:O+xo %6$]zXTC(UFeUE%)  k'ZRo~ o\ygAOn1fu~VJQ,YdIsPWsGA d=!g~G*TTBvL<FB27x_Bz(6S 4q/jjcL9b3w* g.v xipusR2w/+%^)g5,L$"ZIILeZc*c?Y3 ydu1J!a&$# 7J4;{ o)}|<|kM?F)n>6+w~<W lGy|XIvD Dw~uQLl|l= Ub4<J"zj>a~gSO^2W.)>xNtRtp,@29|m,b"a4i8y?"tS?dRT;|"GJR w<3gMHYgm3f_5q 6$_8Fd%GlA" #Y[t@rCnacUY|mG"Ewv'ozJ x"[?qUv)BYblP~ <zdJ'qz(j'BoAo!(foa^7W5,dg\ =#b@Uu?y,l=6\z?2q*qjANKi i/7?jy(&L&hz\ V ++UbjtTa6_  7yK*?>Q=T?U\!*WLW !/L7|7?|vX],Q{( ^bY~C7aBcl )2!#IS Bby65.AdqjV?x#8^sw'Uh4H | Bi7!1aG3VrFI^,D9`oi6N5%.n |Z otoS<:d.b}U'(vJqFH(%2r5 0k\xA6aZ6}:YA.VR;OeA\9;Ff]y:|%t 7ydox#R9 Z\eW>Fd3?y?s?n 6+GC>j~{(g*''J,)|"NX4nLl iuCbk_~>u.FyAq*Z  m7#E[UC )Rk< R-)=Ql) ozv=.Xe_2v9{I[6wfC:T|`Lw9q trU/c@S/7-r oNQ ^VUxZV=#bs".4:X}cUto1'mGLG#^Hx9$ \T6O:eOAQ~#4zkA Zs\>;.tKR vVo@gq7x^aie5I]<<_)m,y;5bhWJoR* \o\ &J-9#q"S&p|XOuSNW d#ZQ*acJ"0)<1.:|i-.b>vXea$ Wy osus'e(rq'&H6.7 wq=,_hdY=4MNil?nOQgaIbtq|N_7QlwL%5- ,q}JHwoyll)|f1%VMM!]r3=Zra4'5q0ZG?Dc,-VxELgUasY~{>2J@jpT? )=H| O?r pb_;l?{;"`0EYzN%ILU]OL=7o4dlk sZdTlTuIi_z5,74/opJC= -[W >'Cg3#*?cGCT1o">cg^K2YXzs2vMyGy{$"+E!!om[OF\"Db-v.r|Z m>Nhb%2\0Zn|3EWa { "-EREl{= f7go.w6=d\3knDu"Yd4]uQ^V Y^$gA$, 9 4:4WDF4O|WdLu n-Nbl0E+2-DkFJF~ *'qCEI (wDJTnX~ J!/b)G5 CUb>g?2_&'lqiD\rMLM1t$nIG}ssh9^ Jk62q2AeJ 9}*Z ?{sQ$ ck +<0s=V"W4V,'Ogcm>rFX[-9<\&Y"?{*,0gBi>$i@fq'qkY2a55V`H['oo%*J 90ni;L,Gb 6pq'Y+HqyQDV}vLTS}J1Yy:Bt [YS+O*%Wt;I%ma+@>F ';q'|}~H"[J_,B1[-Ot.n~N$#RY5L1dt$Y6A'x % C<#4wva IjK=` >Vbt^c V7fex<|eN'ITGr~OaAKR'GGLs)S_LI ExUT/a@~?Sjv?\"[MJE 6RSPLZ6d<S ^MOjb6g\Nq$Lx_>qOT\ C)3 iVwttI}gtDkm677[M09H^o&MV9ChjY>f8Y"+@zC4pel}AQ2zh$t)vco>Io!(eY/\ersvcO,]IZl-dW?[zt/I8JnEDq']]-6o "glJQ!1@! Iotoz{T0TF9T2< U<Q7WY2lWZ8)Eh_)g'?a6W\yD.\Ua m2Qz-[ (9 7&=cl_{D2}3vSH4eLo59 g zcad[eLnIMZLo!C'S\[u# n%B}4>u5 SR\lsAo2TjT%'OJ yZ3s%5]}]jS{nQ x6OXdtS9A"V*5w|xlF^o&//9;8&hfYG4eBI"@)\hL%a 1s_TQ$ol}N1Qb|k'Owr<92i%9M6o~O"?|W@S u 6ay< 4?Yr/J1L&)qOW}Im wLto/lovYFM[aTQ}JY)G'59 (B>Sak`3WaRoM)q_NSo$>.) *z^"f>*$caL%+Rva/:5$I.-Rvc+F:5(DWTf>nYS&nO2eoey &5=EQOO<*JVkK0;dG9i&f{/ vd*,Sd&DVuW$nn d ~{ncTxI<N~C#=D]L pb-jzOBQ'aaJQ"t/qWVRzSodu(6k21i\OK}KQ+U"18Y *7Go6Tq8d.18.\jSd6 \B,S;kxxdA!gjY1V%$5aXrC ?W*?ofKE1 {%Ga6a}T\A '/ \&qR2Ys,gA^M(S_nBDq>g(fzX.4GD6/hcWYt5 9Jyo^4(%$l,j>LHwJ4}I=|n!k:d#eWXR73Lu_"Z~iS_&vWIby+n]"8GT|KDz?!PM f a~ Q?Iqg6'>p>y F#-1"bF8 PSj Q"g p+<uQ7+!<DNyEms|>b# >#| 74>*wvo6uV?w@!o=/bPh6N ZQ|oY2*fg}11nI_r#,S|]!d UUBh/qT%SzIY:w8]b= [tRldFGuT L>>DH" rE;>^n7)S}i5 vL~r6Y,')!7B9 ,[a\_70Dv[>Y^,}YF4a!Wiw\o5rcl.BG|{A&m,ZT%bq3(ZrO l9S<ba^lL:w)&p'6ACB!YY +%TDW2(vRC1oj9h`8o/ d<# &4z'{Oh^ho%_j";\?vAtPv[2Cu9rI[*#3 $%IuCC]^Bd]xD.\oTSL@ns' \8v*/r+qZ 4e #17|E{OKJw;7zv<\1~M~YCaQ6AXVbP<<8n>4X/gWSPwl'9{KtDjfa#[>y*shI 7;8mQL)m%QRl"&^ab5<|:G=yg R7jK6b =~r)}R. !YwO7]|Rw" lw!VIgF!L*a!c-TPg\ b}^gV),Gh1U>X{m5Jm$]wUL.* )lCIZtz1g1'q>cc:90'6DWuI{EUdNn&G#>5g#(VT&s.QTsS1gRvZ*( &SNAQ$,_,jd&ek?Ws1>"FvGuk/wy:-dVi u"24 3g&gG Nx\+L8"c; -E@DYk1?sk"6RYP;T_Q4-L'DPX?fl%|$55 d(0SFu+!x.>VGjQ)>&sy)a{AQm]Tor=#N'5FU\kQ'=>87N^|aY\VC]/7y2u`bwM")io<]L b@R.w}0X,Y4e]@TT(? RN + e[fp&Xcj D^{=/t)Fw %!{/IZ|\lTLSl9Z]#Sa\V?Pkv|D4*Rlx_"%f,[k.u9-t/<N .t+ =\ VnN/4* 4d/I *=$UU<v?&a 1otVFQ[N{"=S 9U?-Mq |kyd._R$|LlJn#Hu"h,x8hXV1*e-i(}6?A*)T=^T/'N,$QcMU O4*I+uyPSwrguyRWkKr7]S# lWbC\#s<6N N<vt!?q|3J3vs0Ub961Ck)9?:e v1|$'+)F]_y ;n 5Aq g(]6Y?G{e `go_~3jMiA" SN} c/d6M_&'@wn"/d4oSI~I7q)O]0T2R,w)ROzfRCm)5yBkrOf2`{(?D>ae0ET}<'SI?  N =C%olt}mB@Q[AjmlM$ayrQ3rWK77o.X3(w l921?d6KUtsQ g6HiA=IpyaK@\Jv[%TNBFsvLHilxTQV$F?/c+ Q?B.9GJm!'>CyRcS c=WmB {6%{KGCDosj&$n`B79%X<)QY.=A9 dx<6CM>{ Re9k[ L\@U$u]*2aeTG o%Fq^G)l wFf4$ASoOe XU .$4W&5\!)Ora5]iPuW7,K"z9e'>D(k.Y_9_:C QyG//EZY*$S<[>q%j lqLqmm-d7 O 5g7 a]P[nT6&h^)i&[~ /us*OFjRXeU$+T|R6v)NQR5/ko_IA7;D\{aQF,[} ]|AXIlq'E|;+]>gNf/j=V1L~t_mz-Tz~)7Aew 5v2Se[3u[F )|`y&Yl7:[_[ Lon *iD<2WB?5h#w} DD~){4ns"1*qR"Pn_-gQw+q"-&ImA4YB4fo6_iC!#4xEqS1_v9Ces ^;>|OWOk3vn<[9Zla$s8UZVK>!H>id^vqjD w>NpQcDe0uAT{e$fCry? gC>NB|r<NdJ[Dn'z_F9Cni,C|& T_42' ~ CdrI&+Q l tS6DgOQP~G' 7HUc *\( ,$4AVD %CmoDMB.v|Q#{&thii?|l_uujGZMxT<AfBPCXJ!RT!HN?E7Mm#T$N.5Tx?|$VgCnXzliqBeIw#_K6rr< E 61 BS !Dt| PL7$EZmD2q|hz!,dY*"XCQg] jU7tyli4 d  y%Z+tiCp@<4Ke'\t;+da#avtwDQ; %M$ `srT _$V:eFb,: K~.t!&_^t-|~7,nhIKf>g0t&kJ\vmmhe_G?FaqZ jZOr/,)wBC:4o vm,9;v=3]5#^*tbU~ L%*B;"H[CuHB6SE@g&h^|L5O j/`7V&NYh \q69-a*|PZ(r.bo|tLGyw<Y6Qoo rV%g_7$%~V|@)d.Wo{01(<qA4AZH iBc-mx`#,vDW"0Wuf3'E]as+-/&<bll~B'3CSCQG 2w0Et|k*,^JqZoA4wU#*Y{t7Gj YPm,~*Z$XOH=kwM^1W!7cm_[ZZWe8 h1=fcUdy1#6J9EM?VYAuwFw%6_3`:= T4D!8T#N\P,=&5FI9.2bw"w.#Zws +Q\WfU4r=O+alV":!~dA!<*y2e- ? 9Dm3^X"a}#CP>)X N8JrrVT[TzI,Q;~]B.#51/f6Me 'cS[LdVP%Yzm4k'<gf9@v$qC'#/SuS+w}|rZ5 :ud9 &G'2d'}mE&t ->BG=,\biddq'v 0D#@[]d{#c6|91 1WdmaUEB@LroD#34w/yA(i^scqRuBE@OOg+7$"M-uZm7WPP*jDU\G@%/WL-K$Lhuu4k?3 3 dS O^hOe!2O?g!&F+S^ gF~v]eb>s1R bO m/A IB*jPB\ F$a"W 4 i{;&\H'I7D&^L,d1W^36yfy:Zf)N)FNM2 *4i,_|UY~l3 -kpQ<,1W^.e5=D];xc)8"W!Tw!.#G[_ _g91 G^:C~WqkS9Lrz<'Q6W6&clW*_94JeA'+IkP@2_lgV[TndZL5U\[!_L_!/ Ow O7M~ r<Yx:OTYti<!7R&rGB3`Cnm= uy"AJ1%+uM<PTv<7aB|G&3^tVjr6{P 'tenZh|VOqi21W svc$|V2m _B{ vabotQa  6eW"jWA|Y:d2C5t K?I:az}|R V6i?t  gq>sTNThBEO(.Q,4n@<p*4)61|i7 |jowAxO3[.-  q1[H/O|*l]Aeo\-Q#|<lOQtzD{9DR04>3mY:EK 8mg6_/.Wa;W^>GZj *#\1"=v/)^4JYfej pRQyi\JggFxZLY0m[^DQdhjA:QeM#FIb[ RY[pyR)% 71WJ]6+#J:ryU#c1I_1?S*zAM}d|'N*~G:J_aVAS $j~:* i'*ro w ]WX"k(!Nu;dL#*rq`m u"CN\A3  %t9*_b$[,[0W<547rj\/elCrt<0l)g8?^S1}Xz jw4OicV3iW a,Mi 3QGyd\K3f 9bgY`|?L54n-?CR|S4 mOE]k<*knYDQAY4Fy>?+ 3{~r/'L?J/Wq)})qfPlL!jL]?plZE6Ce! T\!&A/f  NH%330'3i -6SmOT#Uu+ET0+CD(|m^?NJ\ !><O>rT9#4} D|7#3;36a 2CTvo:q>_z6D O&CePKahWK% ..i; *OmaSRvt;{,Io}a/wjf 3.:c!mcDWN(]9O.7l^*i!& %drt1u\?DyfQja#<Q.G9$9ldfikna~]owG)X #Ayf$FO&o,"g=$Nnk?2>L21oaVijWE]nkZoT' E D_NS~.I\s& G(W)PVZiaF$:-cO\jQ}X/}!MKTL|cq<_Ja1F9Eg<-+(U@{i: Vs'=.]40#R)WXC9^XE^m_-{EL_oQ[oM%D-:~e;tV<:a_#r i^#!d) q t01p0<24%39k n$ RUft$j[ ,U_)p\*O/qgcJ \ye<"zww <K FeR%,& V u!z#Go-tw';Gh  z_|71jP&gd yT &T6HeF!tuTg/*CR]_M,dGO}JaD<Q}MCfmn|{wv5{!"famN L;`\8|O#*QJ)] *EK9C:/OH0 97afBS;J T(/r =,?z(?/M =RCg `:S<fBo'b"^,&9s<VFgJ,BHv,E=/hdm]xL!qSkN&v[F>) %|MIQtvkd_SNSZ> 6eGV_GjHB}VNi<7143Zy'!3j&*6o{Ag>n`vsvj K 7s# QONLrB!t-SK`-XqC~'iBN.=)+Y%_Vj O.,4[A* Eq{9:HofJw0y~w/_no?M,;TTpG ax@ LG=at }UwM])danaofE4c kT\e|/gy17:Qcaf%A;A/v2\'{jgd,2o)U?J':}||IaZ@RnC|3,js|xb9Bi|$7S}&5Go[y\QC6)95|G@EQ xqyw|sL ]I tCg U7]jY/.x9<:@W ' <#1K.)AkGqi5Z e5O49O$,\6 5C<G|%z%A`-VSPMuw'LCtS'377\3v L <A }mU?sADJJbleuj[lg,I.b'8."]BWd+=On3m$QdmF+jz*-c\96jAP L2 )w_W&_0# J S_to]<mB x1\ 'K~mn/xU #"Nn3LV &Ms*S,4%D.gy=z$Iw-;|d.9kY:{YFsA.5h%=+5kd{Q: KKvl-WGE''^}'*'u~$]WiOk^Y81&:Vin]B<+efM_!;)r,@<o.JNxbEL'{`"_&|9$$/Q@>g$Qt}6($ SA9{UW]mjWo^Ciz AtAg/Cv01eTn*ygdSf^H/.82J|`t:L;a6 z7NTw}a!t.){d#w5l?HnZYcPc9|c0jz lFl ]7(dRscn|k3m[?r6AzTT} jiBL!25^Z?!%LBdiZ4S+BG{vnXF$;ld,|h>YTSg wdYSyl{{/{# i<XvNR8!I'h +-/?O$B_iVBFA)q|a%Ve"ivx-m,?(4T; z+I&fWn,$8II)N7.5ls1f &9KOAQj&~K:b5|@;)j{(57/G!+Tld)nJDpGscICv` T|O4FgJ_23B;+&Uq Q~P&1m6[Y+v0.!ktnoo\-;qd\HAt|pO,N\;).F/{# #(%>y%ULIEjwMr@8ktW} lAv#Lg.<- sl$r15e7)S9an3Ec|i9 "]EieO* '4gC{iZ!4.ZnJ;>> IY7w9-^kgb{u3c '+<l'*stW0uv%uY)$W%,)K/P3DUMK2WH:8AQa.}pZ|WGI^`A _t/sTo)y0W 0@<@0 bNC^|6 !stb^mR)k_ pS]+rDZ.j3Bg.h;eIA;?/6]NIJ*8vCW9_{,s1=hVQi3_ |PMr+=8G rWi?.:z4f )BjypNO, h&<\y}olqvY Y\E}t:Zjx'b^s.^ qCSBoTQH5ReQ }GD3'Bt;9|lP '!BvB|xQuFuUi`N6Q[G+aRY2 ?jKFKOF*Jyz\`+?8g.SGm!ID~+QUI,pQ>F6r~^au3A w1]NxQ(lL#ca63n/G6/mU-fz  MxMvK]Vsz?Bb.Q} (e AB6kn6fbG 4p-d>-~)>xdwPNI%y\b]aqyz|[?<R?w +G+(&:e?jF'|y_'i>S; $+'Z}9I{eijSO!t]ew %4\'43dQ iA[ "8s Iixvz'W^A>:MYZ OhW, 7m)6* 4jBGA@u+lgA')r[ ukt4QyY- x!RL"(t[\5q9+u5=zS7v+`/*$<rPYm?m* Gg1)637YTk2S_<aI'>{FDibPNuBYUq MY9aa7mAO3 IM$yjoUT yd,;|!|(B  dP9p(ZdAVk\Zi \ ~.CLTt!g^^OOg)~?+OV #uogT2a /1-$4Qp;nk8)dc!vR AjQ&dA;N{a ^!3}7zk.#18Cd:p6|Jo/7Dh./y_H#l =HoXPMSTez Qsmh7 ~Oj7J fi)YjgOj<6[w3<'o:eZ":Kh|.C[s\/`B1d>5H&;t99l>&xJT?fO_>JxxNb.}+Vqw[)va$|f^VA*Kd$5TL$4ah k!fvNb3-R ECl7 kt(t#F&osM.-b!WL1naN!`*8/kO7"V ' jFvb1  59t/Y,.9_R5Dd{t`B":3'N?0,DbiaB$ w-zX]pS#$ +tW%/' d'+mo}Y i{#r-a*r\Vex=V:Z4|+\, ]8=a 9M>!1 w`VfLz,h'N)otI, 2]/%\Z't"QAu F4*N{7PoJ>A7* UI%q2V\n] _( !f/G!%II?xte\TG'D#inGd?wQ4gyY:)!3!Q|q: nau ?o/\0qn# I~ 5bZ0hN3Wgfv LO&zRINOsr_2=4*Or0{9f4v^Sdie!) m\|Z&t%y1Pe}N :=/3GZU9VJCD,,OwZn ^6!Z\ [;EK6tLCG'%3;8@<4,d~ 98s|Ma6;j<QlhJvqfoL;dg> qL+Ug4/5RhLRLn .^WFG{aO$2up9\f.{<!{=Z2R#BF)z!r-rzj^yBb, p;A^-Nf VGQsaR2Gj/TE<^RT/OYQVf/Lo+cT*;V_]K>,,){YTv1E|?o; \FN"C>lYaI=+-U4R?LaIz9%da" w_5"cK_mL6i8&{]g`Qg7> VqB! *$$oC7g_duCmb]`XG~!XTag_=a=rv>w-9c $?IG5BYts,vBV7U;[!t">9 \wI`%c\7F6fx[\7!a*{vwL mBVJ Yy`1'VdTKX>n!:80/Qag)5O]r+W0q,/t'3h4j5/;;I !\J- B -]p1H4st9< |r ^Rca!ct%wA>\</dL [ lo v #/ DFE)*zyz7$k"*a[oICqkvt!/6$Om Zx\S,DQW[O(E4{F8thsvzDtW8:V74aBQq o.t-~\ Q\A^1'O))_qb!|x6,D[c=2' F#.g,s ~ 6~N$M#Zr :!hNRD*YbadF@JPWI7('K$pb=> 9!de5M?ioFQY2<cJK9oqL(H ~- qN3"AdW(5ObRj\%'~bfFDuMofn r^u*i* ~nSw:\F#Jv{- O2jOSnIKW ,h4A.:vm7z- ok!EA5dzS My}A Z~=^!e2\Y 9eeu0znkUqX6MIZ8w"e2\e@aUH7 28Iw$>7?4uRc,=7n;Q"(| bf$0vOw_VXA_orc:py[EBLOVjyx !f9F.gZ k=2?YsfIk"DF*Wi`I#0k Y KQJawa&M ZSw1m@@a1aSw+nx^4 iiJnxXFJj[)Ul~lVa(!1m0~&e5g{~Mvb~]IuHG~Kc?cV/d4qFWSTL8FOFu> ;a"X#p F t?#.Qy_HEMUvMco{0B>!g-zY`  <O0-w_K>j w_m -IXB `yg=^\NjjL1!vCCg @K" (^j$7W; i:~[Qmcq[f3\)3}!E[+(Ect=9paM)UQ]PQSC8h>)9-*f)//578/P X \|ibE(ULu;bpd\Vl0|tC5s/8|i{@RxeI$|/:1zn$o,1oAT; 8rU;.zk%tZb2-R^RP\ 6g3 p  2GidK[ULWq%v,'M^:-YNP|5_  -Tr6LY>ovF]b@TnE5<BG&R{4xWB5+0;Shoo_RKZp}~uA6 Wvtc]l4ul7wgP&My EY; ] X+Cx QxlUC9?2 %/4-% ;0br7:ITh*B#b I5G}#, ]i<mdp+vU~.ju<!9R,}aXWn)1#x'AQ}Xzvbxm^ax99%>9 ~) N NT@CF<?C\C9Js(VtR h r+{<?8(B~ .VI$f#;Rck} L~=2ip>Ch)QX{gYTn:{)Tq{hS)zQHd7i,1r1 =GCBBC7* Kt|W_JHz#{!$ y0=u."Y9qL0e"n}>F,t.6LWl"CqOp<kU1 {P$>l$F`65OUD"$K;.1 NF }/#21:J+1]]S+y93UKYHC3 pw'p "T>*UsM}lw-IN5sw*hyb!i]EMlW{AXB$u_E)~4zuANZxziD~lt/DOPK^c5eh]8l>N<|L05[8EnT_ m0369M? \B:F%=: >dxjI AXF=oJ6J~JH"EPF"$V TaGOz"V`"KwB`ct%,,fjO ,|+wSr!t.q;vz $S YSyG Oi: ,a ! !5]1+8v6K:b1/[ei/pOc6c5,vt2fQuEm/%jSzB!e`_&-zmiRr.<C"  p /$QNWr_;>ur. ;5yt{Y%h Dmav0q5f8j:A,U /lYA)| pN"O, /XlT 3q$sTU 'FVP+w2wcey\b-';\gF6+u3SFQyMNazLF+}|HIeSZ&Lkve0D+awE(H7D:g8C=&6X{q `BVMsh X2z0P{IIUlb@v*&iFeqmT3 `Pha!JH9 K9 |N H Z6 4Zj6JFwPXst=^FLw+ wSRyc~e<Ht3:R0G!>jsLpYIB.N^Vm'!F o>eeXDIg(_%AX2@9mlb%7 K]L%lSH`a&KQM4'!8ZkQM|BgR` hHKUZM6||~26p r^oYF,pAhhJy6$T_R9GYU*cJDBWWIKYDJwF(=7C*oJc'3%]RO-G!b{:eVN**N%p \21y ]e@nY:eMuW] $~2= 9V|npc7P:$l]+hE! (Nc~/zeJ,BEt`g]jI(*PL*"~uJDK[Ad C_ZD%(J]I%-V3H?}Si\u'=k##"k rQYM\~%e(%9i,{07)v&o M9->]kIAaVD9@,~I8_K4IM>exaJ+LvL5-],!Q[OE@>FR\pXH&`&Gctwqjd~5s$iz&=2SO5 F e NVi@2Fj#j*":neS0Oxi@$)ZSgq1QZ BNq:!*76$W7-Jx+:;$x,e87O~#i*A .\%(eNLA4y[m %slB6UqR4 \=#"&2$*AN"8Mj:@tV3,KXT3vL =  /FF/ HhqeQ8yiX8TV =vf,Q u$?WuwW3VGWJu- I}o@fp!MkynR.'50*m~yht7cKU^#lg(kLW9fFwhbO'Eq,VcJMlql ;WgvW[:][m +`]`0O$OUUbV&u9(0R,f!]O KIWTpSAEQsJ7:n:52Noo:v!#L:UG ztQ TQ T?k6.LaWax"RaiQ)W4G,` #7T}hEo@ZX,+R>(C{_-"`>1cri>zX>bS9_=e }-r$}5}\@($R9vt#$d_9 -kB$C}%im+]xc5d[).Ov$ `LOo~8Pft|}[#? 5?H mHpqfI/$2]4bnY+|P-#X+*Kv5:}tQi\[?A@Ji&3eBSD4R,1Mt'o'z; '1,  y`~'R'TEYd[\RI>B6G Y/A&W7|:F.H G[!F`$>|OkXn9v+Xr%ANJ/j)q].i{\)|J##:LfwS %+%3Jr&cl{.KB/|3iOS^{]8`/(T?1SN9_2%DlGiA"&Mrg(*nK8@a%)_`#0g p6 J+=MG' c]77\+ao$"SFTh4 uT`*B-Fb7~^;c@21%dd|n )GfM|M9CdOotqZ8vv;-QV;sR H 9f.@ >;D]dV2"9E;jRJ`d S%{L^eO :CJT3 QheI,&W?z *2?ES_musZ*X3"; s^AcEN{6r\Y.X#FQJ@.'/FZ[P-h)[ }E)nB[kivI5s :[&ipM6*5[|pjjkqs`9 Eso TU1z%KTL+_LTa{oAyN,)_8]ARY2PJ }1QQHO&s`,dsii^!b%sKT> hJ5x,= 7q 5?<jg;# p1hD+ +Mc t  &&$ uT7''/FTZnr KIz(dxu%g]z~0 7m1Np+sh %u3fXh{yM 6}`^2H'= -Q;b| ?c|&K1W?L0 LQnG SfGhgQw9v@4zJ:Xb"iYJLV~j9{\XbovJ0g 8XN`IU$-Xp|sS5(5<D3-pl61<+jT'T"&2(1q2(YpdB2Dw?/wabeoyFqn$mI1.xhR6=-2M/, /OrO*2U25 _?:v X q/H](i3(y(f`$ GP91z4zlwNJaiM }&6cbJa|LASrNH>4 yWnWRVqb(sHV;OgvxK X yGoUE$S O^N[kXM nF"9jw i#{v.1$ pkME!Cwh&fD07MipV4  zy2{u.)s&Zqc$rm\H8I \twG9*oJcmfy% L'6uZ)ZsqiYUMRX_nz{Ot=+}'tS}<`mO2Rp0y*53 MVdBM GVB}~xu>7&H_aGZhbF-x700@OtFf:sF#k1U4sNIo`+$Inue1C_6POIY<ZU/ +MkWb 9  J'p!qQUEX I^\P2\n?#"R{|yqL1O fF WGz[Ozwn^F1+M&BUw 5AB/$ 3Snh"5CHr9  gH'k8h<)Z@ {YyF |?$)L\mXOH?22J}C<swT6'4Qr'1}4p-r WMaNlr!-<SgrmolobB#zG^ a&@ Re?%  e_+gE;K}+O{;yP-T7Ysg>&X.1)ah`& 2Zt#kxP+!#Ct/D:I^` x#2. 9ADf b,*-RWjF$g8 #$(+$('99'huPg9%)S1C:2$*<Mahoo`@wGo -IN1@kk!1?^ 5SVI(d?19BUXP</1K-?Q4`K +X~!Bn 6V[?AwH*&:nM A`fcEeMLi Ji.{{EHtXe|G C]e6mZ- d{O''Z(Ty``vss4Zz04L[y\]`A LaFp"wP\'Jv.zE07wiQ;k5y=2f!VZ "iT KEhf>?9_tN1 q7Tt`w2]U>|LWDE=ZabL:.8o| :W`XE4}l|'c>/;q[x 5FS\o%fy]"nq$2%;Qhq\D0 m1[".d~Xw]=za\axJobJ+&}"miRT!p`%nC>V'AB &MOJ3N^GH)(N~w9/i1_}ya.V#RbMLY[l8n"U{H& IJ3/z{ 3SaYN?DOoxK ? X)t/x*mxv~m7Ed; 9ONg5DwPFPXE&^";8+ 3^W'gHX5nt1p)VpO9B8eg7"-\F5018A?=+LybasKLAHlykS/]B .MhgMo#z- A^[(PYwio-Z<fa3}zPttX'o9.]^%n18=K^{n-?&MXPIw?Q };Q/.OlIJ]1 Xc]},i"E8*d)P__h|$Y35z= KiotnEqz{zkfky#7'ovYZy.|`;&;cu?U16RhxV!SlL{M8 <{K-L!Dp<P%b ]7f\+|G%*XV"%tt(^qRCJiIg]<8'7e@NlhZ\ d7h^@=giP'f3`.k &,p%&q&5#!ZBzD!K44NZ%;HO= Hb AvFd|(w`B"C!)Tj"RAbjom{RG@"`. xA->Nj7x$v#q+*U?gtpY@rJ~,RG VX8+LchaJ8%(MfPTf7Yl14R@N=HtxN5($/pq4w j,z,u+eGc(` 4uqKKd.:+e~} />3& T|9E[ers"Mo#f@&)m-2';St'vV8'Q=@U11qeq|NX aMd(ZJ{[ CQ]k=k2 j>%6[ ;]|fs"{YaGjZXV\GE` 7;^ ??P<'B?6-?dLZZ ,b0h37$`!F !jIx.`wd7,e9{MH~=O}|rPKx|M cPR^/-::& \=7GjN%,KTd1m9=:0"&0DG@j,0C@,SOZ1%J&nB{\e=b$U">_w7G+KJ!GC& 0BksdI'f3".W{cK='Y5 0|5wjLwYLRj@u2WQ.p22P<r '9FGB*g(;:r /uCJ$_@S^emx~CDs}mO?Th>m#d//o#I\4dcG 4|xHqX5or 3]qic%Si#W5[ HQvh7M+56Ee'`vu]C&#H vt@ k{ uc_U[g*L|/.yvS{&QXF$W>kVC!M8 HWgRWs^8)m1 /o5AQ@F"7+5s- ]ztO"Zt0v<2f8w&Z5>}z"kd,A   -dR9rDy7t4a  ).!hT9{ecbjq8#E_S-&7h:uPm@*6W`86&a32$urJA| 0Wu<  zkcZRY_s0uya;9gF 'e!C[M&Q|b`oHK< j85hh_>-,@_+"+5xGw;|ewR DY%=]dD(fPFFVoGUrmUD)as({Z]Gb`&#H_lgbRG7"H[JQIg! =s Z *,YN^Ly=F3HlrB<qT7c J,hH\:'j&59FThCw\, } `SG49IYTB.'?l>%z)mnI29j?mP_#x:` &AY$qIwnhqEA] !c .`?|7]BC>#BNHJKZr#.F]D73&.\K]lTYwL s3(q,Ad`Ct<k^G8$B Crb.d.1EPZ]d`d\]`|IN+_F%2 j:-=Zy;  ApU"- ,IZXOINhQCi8 31,^{N"A(*8cD3>YHxDx6~>a)i/[l(leiJ2^c ]IxS7 3lMS AQA Pl0aLRbn2!Hhz}|jQ<@ae+jxHe&'O{&uF JgJ=txv`6c-u5d& ;ep4k%[ Qc, fYK] =X^CMIoO'CV&JppC"agTZ(9JQA]s_QNTi:D/1qt%Z K{F:&8}9{vifu~{cNKjCS/C/s49qB,-?g9H0HE3/0Jk1D[u4"R# Vk6Q8H5M{|Rk 4ZuT|DPoJC?JWfsiR$~Y;Ehy~lY<,  !7NlN]uW&8\zzY[4 tJ' 0b \ g~{-'Uii]`p>8CDpva':Px\u*6{%m@'#?[{zIE%#[~<l6Hq?r'q``0q\8pX"Cb/ kL;H` UT 68*Jxp"?GFDKXn}3m: >TNky3xIi^\\eV2~ %;621?PaAo+ISL2vH2q\?c7Dj`jHB+wh70cF|rN4%N^5;,lL6-" U)8bv2<KD'y$"&2@][DRL|RP!V 11 "Gjrqo{.s$Sve"P1meb]ZJ6) G~*@<im3'JUXJ>2FtYB0|/HT!mMBtG>zk2k7^+oYMYvFnzx]1 6{ )CKI5)em6UAHX)!r*qR~XQLH6%P7wZ#Bq7{*n=#MbfG YUk(zH{96."Y!?WKblM/q-{Y^tm   KtjO JLyAy.k*co5V?X4",Iw-_ueJ-x)CKDY4GrnNw0[>q&{(Q!/:::;DNSQD2t WJea9Yu*|gP8.+(8@E0ME-B%r- C}@ZjX.p@*{$LVKQk([*]iPa`chIK aPgUe.PpsKY |qHC?@+ 0l%bu`SC8' tU=%':`6a  AT&{G )OjK i!DRXQOKVON5E\3WN,iL}hP: tD5]pd< h9`GA@HR\`N2p]]y!;GKF7EzX(y!@Sk~]^4D ',%*;WIl}nH")n$,yv&o >:vA gD'[s,*_j36 mV+@[ is>LZ)u'?Vet%lzS*JM<m2;jWLi a\WVF0 HD02*RDSI!y>|7WIOaY0=^@Wcr Rh5"`jQ U^>"%ecU\oM09L ?>Mg8XZTF9#T#9kk#thrJd/*{>+MSF=<bU>Cmr@=yR"Y ?$~MD\yF'P/C[dbK{2@I/Fn<^ mk!BTaS6]Z}//OI+ye\eqv}}<rzZ@5;JUWC"]" #4GPXUD5"-M8\rsn`Q@E^\hH0 xM5?:- Fe?#,<>AI[2I|x]=* wUw6OZb`fuBX?o;%1ehak!o&DVYP,1JsM*l3 $Ft=oZ-tS bO_P8U^Z=rdrm0Nc% ;v%GYN7 uS >m1^+it-H4uuup{tfYOJ9#-9:<@NWPD& 82Ew+$xI;EYag^UFD827PlJn~R!^"X +Ebsz*:/Ky]HN` Iv\& 1>4D^gX7 ;s+'XK'pW?&,32)/g!9qrVD2,$#<fCmQ3  ]1N$+`"+\r F#,j-?{fJ w 8i*=Pkq\kr.rekxt`;}z<]\*EG~Ft0sJ]7-J2i4V(I;~h@b%[;"m*l17L9{sg la T <s7{S4v_D7+GgKfDKfpU%p5DRqMjHCNs*\ulG&?A}$pl-a<z*AP>F^E"U:OS\dq,*Fo;9`a.ZTK`X% {miyCFTq #+- k>%-Ak51(\ pJ84O<uXoYC=9>6,q:q)8QWbaq~9RR7a^}e.8D8!<j`>;JmU#SlQ>8Dd6k<>+cK<6'y>Ud+=Nk.UigJV:FpQ1W{RQ}#\.q|F" M @f _ s-vt/[+93& wE9Ctu81Zp"@JOKAA>;.".)p: & n]SxlIiZR_{*{ B]T+pI4*>i>qa<vhy$MV/ze28n7~i6MYa^]OG(s; ZwV3O AVji+^ wH|ubQ5Gta*eO4|lW5 _71G=gf N/  DqLv7RjkulVb9WrQMo.iYwP %6Jgw_HA@Xgx}5w3:Z\(rN>3ATw;Fz<}UA9Gl!` s>ORIGHK[iKR~dMKY}+e`mai|JV |L0"Txk/0YwsFt4aGBTn _?9>Wm Hv>Y=s:s|Ak:-Wza&m d7o'vuK e]*u: -;;%VqC5+37CSb{vBD"c* b -QvaG?2VBt%^*W}_D. ~E!,d^ +k,=N4x2 -W=};Udd[@ p\EYKNi .HQB-r 4v/ 7to#bQVafu3{I2\~5w,;bwOA{=CE [ dWc CpKH\|=YwN+* f@#t[1Q0YRq97%wBtfat(a2w)}.Oid7d4ytI~N# !() {il{["i/+Rwh'H_vQ  $96.unuy^5q *mZF4"']H  +&pUGZ\'YV S$lA mM29_By! ,1AMaq T3m)CV\fmz{nU<%ab0 oV6(K|N 9dtueE*' 0?R]__V]p?Xw)c0<c}yj]K*W[ uhm "Dn^b#Vss`= abiGJ9JBR$?~$^R%1f9)yXi<~[7|1B]@DKXRD$C iB)T<v[S}<G\\G7s|D%'CoO'[8aROQU]p#1WBE }W/ B3yyIsA;Ranod<Sx<~A^eN*%NvtT10X$;LG1[7Ip}\:5DhJv=ps\mnqtqbF%(UTi]iAn H 067-[W/m:3`L,[8c9$+T,FWH-d 8RR6Fg$yQ5$#;^h/>>INatl;n8E0a  ucM4i14*2u8pG$}D&3KlWsDk#> Au:i<z  gpQ2*p0kkmuhAf |=A3 YF]N Eeme_L0c9s}G =wCDIL>6(%&7ZUO*Jz  JI$Gjt Po= *=:1 %J L <TgUI'RtOL 'Jf:]N}MS/.l\ -.1@Syt\RQLD&[b]I$I[YL;! o[?%a$O$Ge{mDJ &Mx%b,T}Kkz?Q!$sL8D>%(:GWiT_  p7n<FF 9IRK3,Sxo>XU4|S<0.)P- zB sE2D{p9j)1'6MhmV7! Wx72Ut IY<!687.'}V3 >awIt0Szmhvs% ` W*z#_OmiklzT6Qnw} ~p|o(=7l0UtHo> UsP0 yyOM%ij"v,pH%&T6vuA?Dv>\e_AX5t,|{<5[}$[&BLYZ`_a^`enciv'pkgLLeB^}_[o.4q+|0{P! )eBk "m,zo@qIW@qMl|~z(eCo0H #ar+fk3D9]?- eNUwxhSf0nU;$7BLF:@WjkaD#pE _<K%:ZnlO'_!|`A0'7^!s  ["dD14o-TwC<2K}D,IoGR /==A@+Ejw [llJZI(?PWkqsb?}}~'p9EBAb 18~Q;?JM??}Lj;KZdcSNC2Mn]S_u{D {=P"RG)I$zY_Z"l 'z-oc\br>dyt@ ,j: dm(UPzvM =w)W.:y*53TZYN@1%#&*<hgo>]#h>19XwTN[l% (CI^.R  `/UXi Kf2}PEbN*,;QVUF4.?h3y1M]YF- 2Lbo[tp\KH9&DM,lQ:)!+:AR`m|ypnn];MD!.Q-=PRVLG/Mj*tqff]T< 2Qx37jB3'.:YBvRC+yy>>a @oyGybJ1 wS &N| fOM0 )<?;( zQ 8R<@KX__^`hr-B>!_5O@wj(tl3G^5 T8/4Nw[E3CPSXH,oO@42Ack0z]@a.+=l %23' ".$2HXF@Wq7)a=hZX$Ea~b,q2dE6  /Es[2l++jM>7:95 VqPEOtDL;(l"/2=BFGEQf(fgmKOsDYZWOMRZo'1&pCw,w uL#;ajSFEWn9ON1iS 0E]q}yvx^(B;P8f*FcjmY<`-H i%F]E H|+RgkW:4uf5vOV^ Nd@8HgKkvhJ,+L .F_ipaCyO*;*|rL8'"kA3hPp hDW)3WcieaoBTWr rr`q;{lT|m_^Y^bbd`OShEbbCl >b~xcG-}to2^*iamL2"#7^hG TwC8Zq{lN wb@} YoVC'79[[N4".Iz2e{kR4 FyDvW9_y );Lre Nwuj`Z[co}%GOH(kk%pD" f*zXELYz8=P*7:1* \4$ &9IPUNF2! e4a>$;a;_{[aeK?7-*qXSWw &$&#Q }7{YC1$ 3W9+QZUA636I^vxrMe.[:#GS,|>7rI) (*$]#1TzqW,Q~ K?]u"S~%K|h*pU,K~hF}xlR0xciy,^N-)"m@}_;" ,S?n=PR@~d= *Z%djlXM]A5f9X.dd)yE0(%$udXYg 7Yk}vmXENdE@YrNLv{Md>}Q$%V~,CO,_5Qh| B{BUO>_4 w^>n5v{%Lp&@b5;.O#\5FJH2 `)}OH6\.FQG@bR[(:Up:P[UNC=FTivkQBqs,3P+FYf{{b4 2?1jE!*6kmzP2J;zBZ^ 4]4a%_iXG;nZ-V?s^.`Dw=ZVV_L4O{Ov'ts~"@\p|mXI6% }W?7Iq`3YsnS#qp#MmOv+ 'o1Cl49 Q5$2 8WV$p0m6 (5BHZg&32@x@C$opH4CZf14rJ{\5O7p*u~ rIDQxj2!^U'AI>/  Ve_|?qd3|H.#=c 2@8M '9][O AOR<'(82 *~IB+LlFS/\xp6U~S$Fg{jDW<]M#e^0amB% #J~`C2'$&!'*7AYn&o5UM5q!v]]\`WQN[o"! 6|Z,vqu8+m{Abw8lCGA1\hcI'-8;8>G]l|qZ*3r<Ml: &Bi6Tm4X6<hwosyrfXKC3$^@8BYpwoP"zK 6J\ .=OMBl: \- (w;VZ@Q) :Nbipny,7IVgv-S\HbOACDB?60(-:Jl$8?1-[Jxo4~R;' l0vaE67T.\DMK,q$,O`nV&Mu2~!K.@Tha2r*>*nb`o0M Q'6FYn(Y_$=D7A 3k;y^`Q0ALQXZY_`j~5=,40'T+]Yv'DOXTD'x\/1l%8N`y{qqpvxzzmdU;#uddgkkvr2,Rw7Si +AXeoytmO#:y4Xvmj} '=\B^]U?3)-)! eD d@+ &8MNK6! qC(1X)u"1V~$8KIH:)$(;Uak]H"@kc'(1farjO4/1FhK5wc;k4WXG'7R[P0[}R,xy #6Pm!^0nk$,BSi#! b3 oK918On":OV[Y^b_\UPJ<.gRGDCJKMG60(,.?FR[WVNMKMWbhf[O;, (P#Qva7e>O 2[w ,MlW#j*`!xlVMDBO`} G-ATbr{tdQQR`_Z;4~~'9Qj!?_v%3K\pv{odQ<3hR|0h1~pZF8:Fc2}@!gI)+_}oqy~{ocK3>\M" 0ex5.9FX}7zbJ6.7Ker/rnotdD gmjny~ U<ItjXOSb  "2=;% MJkA&$.@QYfyJz(]  vU'GXTyi@tG,m<RN[l}EqisC} Jn  [6xl{DS5SgdR>_!}CBmZCV.5]2X~NJ}RFOlFq 7cOKD z Vz<-=a`<oFe}e>}%CO3iK}S+pW7Z+4_tWm6 4Z|c#|[)/j;W$m*[ ^>~^4_usYB$ G9qFv6mWG<6=MiMH#kx0 Bpp@KlR V'yL$ xT3a~o[J3~Gv3vppA[F=LhJa aK]wZH@K[rsK> $j#sucX^j{$V+W}nDha;$)Lyj]d9 d [ (T (12k7 1oadX,rbI1{a(^2E @fy"ORCuzW4 b: z:[}[>}aTJTb|#x4-l 0WqYZ',RpqJ!$k y^Na/xcy'M<_zHE!S]p*4s=tYKGHYq1AHK]pF,f+mHwU%L  4dvbK@6553)mUVby\k  |S:%(%.Ol~hUHNe Ag3Xz+n2\deU? s4\>$ o\QWg#O|4CJD=85CQfx|lO; o\PHQ_r%X57- kK4$yQ()a3i!=jc,K=&=HA(5z:9Q[fwybH9%f X^<% 4Zur_0nF- #374$BtuHL;=/q#=\1 yE ssk@lV=87R{0BKL ,9>0Qdf6ILG>)U]5uDuWg_(v6V:.++%&56:8>EWpC/{ mJ)d#wnj[;|]_S #47-#$@Zt/<A5# ]+-Zho8ThC|MoaD&3]o= yeFa%4I+EUL#HqA%!XZ/#/KzO06??:(c?('7Y _.PacQ3[8a<0=i$Vs@j+Pc^Fc:JwX9" 4oVlVOQawaD* Dqj`g.{ fo<-77!h1<3CK=.kpaN0Oy?%8T]7Q,PY. 0U*r'YHZE|t_PPWr oIjE/#_4"P@J2FRK9$gG)fHEV35- xfQG;Uv .S @?p]WK?&"",;Wu0yM|gJ'n;B9Ssh3fS[o J~8q)/)"Ael7Inoz5UtydYVfiF8>ZS7p  ~@=9{Cx!M8>n a)I^cS> =j@k1Yt>\ppeED'hxqlfS<z`SWbT,Xqtx~2Ni80z}Ll=LwrF/zop hKjgX29v4`x&]~yV~3i\N>*'% :u/i! kTKM[k{h=Fp{gYSJ9cD(&Bq+=9(oH7>QmgK*x( /B;"-.']?$ 0Gb9ONCDrw^M6{mbn@B t6%"f-xN\h"7a83L,$c2z(>aI55:Sl|Y!|B}h]KC2&8a 1G]y a+p5zP;5Fa~tgavKhn]^g/,sP&Sb1;w 7gBw$ga!2"X/i!znxzHn+U!xV>'%*CgW wcL.6:?QbqwlZ=D}.W&rO<..5@JQV^oc]?+l.;7 [hl yV'o> &Ah9^~`9  $-4NrRLt}gZE6i3bO'L#j4]KGrgN- ~h[H4$I,a tS*'T<G;MQ=T n-9X*tX6r@ nnyX9y!NGy7e\0 }pmi`I#Nb9P3-o`E2+9U R,]}_F=<JTc]L !k-7;0!|iff| K"jsVm?B_vmO(:b;l ,=D?5%g@ xbs_KIObFL!_K&@YcmgdUM<. c/#c V3 4g pH9crqaUN[pm\NXbslW$$kSRI<7{7  `3kK L3HVRJ1,@V[_UK5T3)=LKF?BM[sW3?8i6{p-`l/rgnX Q Uz<&9PRVK4%Fc)85*}DraYNKAA:?HC;'@sF) n'N 9j4y.Uv#Bid @Q+2IY]TB$0^ 0MdkcF!P5ObgaO9}O) GR\dju| YCXd`WB3&T|wQ ~ELT%h2dYQ J|0u'DH@95E]s>{H+"+>@6Nd(j(N%MCyS,q%Jckmna^QG7*" p\=}=j,a<% Ay`P[+Fdv|m_K@5;B\vxX*l2]Y' 5[b#8D]w22"pRA?IYrnN$zFi!i]PJOSi/DK8oZ>teN/QHon'V#ZK{$>e}FLU!Y:z $@[wyaSD@<0m{?+BXehljnxwsw ;E}H Cv9 w];4Mcq~7\?>.0)  h2Uf@Jsz^H1%'?\ -Ll+FaurIb(t@ub\TZ]hn$Q~#b=[ntoia\TNE?1-(#$U-|E3f~b4.k> ?h   rCVha``]UG77Qu8l4? %4.$zL|_BiG>~6KZkyN! I.Lhv6j4=<+  [:rh[J<'f~y[)@G7}$v"*.2O&>VpQ, /LpFkkFQHls5SkB% &W zV4$  EQjP9 u\MJTy:RIqcemz4qAD{7Q-Nm{~x,h5RK HY`_SLHO_t^$,]DMm"l2iOcYXu*w2ShheZK;%t*cA,3CYfk`F. 4W2i `, &MpmCeq''V"\ ##+.0-(%(3Oi?g/FOH+R@M%F^} %{JX>|4CZq)^ +8CI?0~I[D {w}?o4],8BHRZemux~qZ5k=pXI1 -CYtP Bq_6 }Me8 7cA&#}dTYhnB 0C^n}uZ;^JT0>H[z4e:R]f_WF(i3~Z4 +A_{  &<^y 6T{h>|cE+Z'wgc_WWTYgr5W|NL Z>"Wu#^3(3GUi~x}d S6]V2dDo|QU$gF& A~0bJ3o'Iav[/}(]2 H[tH /Rx )Eg<gWl <bD-' s_SD;+ bF14?SbibE#149IQXN:%8V 7UbS3hK;036DOco~:u`.&X,AJC0 .e7|(]S$Is`2L)qyK x,_!xFd>((I-LkR2<Y&GnL_cmI.#2Kw)V#?[gu|~zfG"{@d|nbXUMC/|Jy\H1&!1Kw8#budRMCD9)"N} 'Die3o!gB"Kk+I\u <hjXRZ;lv)eE~M(eD/ '=[8Z+I\s;uqKj+q3aL=6:?N\r2W|%YuZ>.+6\g|6|hSE.<4pgn VD 6Yoa^m)O~Bepg?.u}8p'Rx^*l+wcEm8WlmZ9J"u]K<:CSi =jHu_ORNJ4eSPWm!Gn '=VDT_^tibP;W=)z[ ,MyTCyk7cG9+"7L" .H`jnhYTLWg@jF\;WWI|_ gM4!UvO+YoM?8CJXbv$%.1670+ j\L6," !+48CTo;_|qkhowiRA0 Y&[9&$?d*IVZ^bn0Z~06,  2Y4KVZI2DsR<!Gu?9hY/CP`bjmr*Ag$y.,3, V km{8ycJ4*3P*Upy~zrm^XQC6" $T*z7i!9?6$]meb^\SF2rw!" M lVK@GTo @g&U&0/^#  *<Sr380k@wq  C]txb>PL(Of|  t8i- <8_tqeI0 uF9f"i,IXR@2#[;O$vjo!k1XgqolaVA/<e}|}weI?S!:g"#!&->\ m5[xpX3[0gI3 LM4Z~]=\ k%wqy0APW[Q;* (Go<d/yY@#k_7 J2C9Z3/"i rE)&1/!Fo5Bq'42y1]+'Im '5CGP\l0nq>"FxT%=VYU5]$v9W }zwmedrO,Z)BXp  1>{dW?.sTB-$".HlGwgUCACUs%xUsnhd^M/jl.QYPutmptwAnt)I ynbchyE@y 1BOYixy]-X W0E|Ex{iM9" ]CxhKT hF2$ rZGSlV|}-B[pmL;,2CVtX!_7#Ds(Zsl`^]`g|tI%Ay U{T>9- +Fb|H/}#/'wT%@jPB>1-v +S S<Y8vOa#cSPe-i.CUcxjF$(U?owHS C YEsZ'gD-)3W&EVa`bev<Tbda]UO9 ~>W7&@f*]#-5+lDMGv'Ji}oM%dKFKg 0B^|zg[M;( ^=2LMMJKRg=o7A9'  #2<BIMFF:+f9xJYG{i^cr5IJ@2!%,;?E<:26<JXemh\E. "2=5#X*#5IQWU\cw&Iclk]MA/)$&'-3?OaV'6)DzR6tnxIz2So}wX7 xx-EVs+RqrP i<j$g;#)AVm|>}=oybG30V3TqmP0tB|IO2ZpAtphaSE89Fl3}j8| %4:3h6 "HyHh<eyEK$@^wqL"iUH<1/09<<4)! ,Jt;~rO&W*"Qu .W>JA$wG\>! (](X}pS9q]Yb$`1ARVWI8t]E 4^mHl3}M.!:Y~DijD6a rI&$n^VLPXh~ &Aa#CZnwwjU=cO9(mkn&9FFC.! '9K^nw|rlb]RUPVXcgml\P>2+ zVB54>KY`c^RC**Ox#>Vg~wrw  $;GL@/ U({i[M;+  1Jp'Nl{{jL) 1KSXNF:2.+4=P^t!'# :{SHEXh{~vk__an~}kVI?:>HYfloh`WXau['_5?>.}Y<a6zk`WUPJB6.'*0m  a@3\26K"qK#%Nx6,$' tAfE(lTB35?Pemn]@|ZG@LaS.V #9BA:335=A@6$S& "'*& w\A+(.Fc %@\ App:}9~M$(=Yl '&%Iu{m)tY(|U1jZVoC>PO?1*'6ANK<|eWVXdioie[RXg 2R`U=J[ G2o8p:b Dve4wW@," -4=7/xR-1c2g!!{gZN?837=ERcysbS=%pnxCkr=a*2Vt%5?>9(le]^__izS1wgDf<~qX=" -F]wmR/&QNJ3N\jruum`>[ ggmTB9=PfiD<^{.}Bk R'+4SXNT)@QPL;"|Nsu!h3OtK # {:c#a@. #Omt]L:2(+3A] 2^8LOOA. (?N`a[D"C g@)(7UmcE,!$8V,brkb`aalwRN=fpP4 *7K[z .FX]TF6'')@[W/ *Ok~wpjU@-OkzzmZK;=DYq^2~V'%Jm*9<7* oG$8] RPppZ>`6hJ8"}b>PR. -Y>v N| .BRSYZcgqrzxW1Np*~^LCQh !8T} #UMtu@W$|T$&@ZvY#SyqL&IaK8--4CVk;Xu{]=sL, 3r[.ALLI?2h3z[;) 5S} !)2=EWg~/`~`A%uO0jJ!~3=CCDEIXo 1Tx7i{R6 p*9YB909@Re9?Z^M-zxx~#Oz2HXgq|wa= 9qb[Yak  !+;FNK>-!<[|mQ=%~R#%Ms())"C|]![5 WhB&:k^5 3Uvt(Hh}}_39[3X"n[QXbt8[ An%-8ASc=_zM{GSRn2<{%DTYZer ,Kf LY; )3@DLKMMMYk6\^?vU6 &Fl"@]w6eyCxW;&|oaNE84,%Fs)YteQ8&F{WxS7:`z,u O}wX4lYC6/1@Thso^>PjE''5Lcy&V.PriM2)'3BVhwvQ/sHS#D[o|lT@-''4CSfuv`L5 )=M_nx~vkR1W !8To-@NYXP?% zdUVdz5DI># @gIr]6mI%jC}pv{lhnIs1ENRW]neD'u`PJG?9*'Ho4\p|p[;"5c$C\jjhfjnza3R)}:.Px !&& #FikN/ %JC4LW\XO</$$1@Xisn\7 c1<`z_:q]NA3*!=u)Tnxrjbbl~%AWo{zqY8 XrT@/$ 7[|_7A}?u?^y~eP8!s.S 6l |usmqkibXZ^jt}zu~,z.HI2teI'b?4P`kl`TF/#,BiDo8Vlu;u/eC% $>S`c[TNNScr}yyv|S/Y[6 g>`/{mb[amT2Qt/Non2W p/v\K<4'  3\1_ 1Vt6\X/tX<j,X. +C]r 9lL3t.=IMA*]'sU+d6(D`v /;@MWerrW=''/51, oF$5Ml?r(HisW1g8 }K!MMm%\ ")374#6TmXB/n]PLFHHS]jx{jn`"e8HX`jjqsuwwq`N2X#|~vu{7h  `B&%1=7/{X/ xjjo^ 8KS^cjoukO' )Id}xhS4xvsrqpsw /X~xhTG72)*+2:BGC=4" pWMEIIKHGA3",t&F^nwO( '5:1lXRQcx(/.#sfVVWo1nW t26m 2K`fdWPA?;871-$b1| U!.,(~peWUT_kt E6YnulaO<# f>nY@0!7Oo+V{f>mP7U-m +89768Je OL^2 nH b?$ yL( "EkBd%Jg l;yJeC($6Qf$]Gs+9KS^`jpqtobW;% {M{.{YMNdGg0QjubE. )G^uF E z^VT]dnohaY[i#h@"=FD3hQB;>HdT)zbK.:X}$Df  VeSKVdr}vgL3 +k ,G^z\/KmZ?$}j\P\oM!&%((.8I_t(&'  $@NSJ.DX9"%0=NYbe^R;$ 7r@&GSZPD5#!pbWPLIC6{BaD434COhO';Ocs0Xno_@!Z# /'t^I>89<;=6.% 2k9zynaN@,|jgpx:d p@](.J[ntywurmptpkcl~;u #! ^;rM19[P#oOuK&.;;0Hg6=e N J|0Zz~rbN6 Th,>Zp3l&h!7?C>;3&DO%tO* +.0#phdiw@oN*KloY:nH&nhdiqZ$`;# 'A]x*PPI'XoxgFc8!2?KLC'_B# uhQ2 Yn4DASlKpx]9 m6f@)1Nk=n/Ok0SuY%bH/ r@cH0),>Vv ,Ls /?Ug,9FKIA4 qQ,i-lO;++<^.5;?K[oFfm7]3!7^[A.1<=85*%" *8Nk $0AN^m{4Ncjk]F&|U/tL#.>S_ae]TD3Bx)Cb~ M~5K`f[F!@ |V7wofc^ZK@5)$$&*)(' YBx)Qt|aA#_)_<)AWr%Pp h0cLFI\m}wfVC+  0Gk,BLRRT\lZb&g=lL3+U]='.Ny2?KOV_jOV;rdehynXQSf~saSCCM_-crL{l> %>Wn$N~TW(zT.vM)W, H93r6Jbu{}r^A$|bF)s[A&?n2Tr$/5CLLJ=-lBm^QQV[dks}~vzIu)8IQQD.Q|0zlb[TH;$ A?%T W/y mByD Lgp#V.Bt0eNe/EQU]ds03.h!Jw7sL)x;f(X0<M`r'e"!xS'_4["cLA=?DJS_m6_4n6LW\d`]RH963;HLTN?$yOvQ.{\;BxL)B[ -Nckpkf\SLB;3$}nicfg]K+b4 xfXYcz/Pp<d$,+,+4<GOKJ?8)" z@N.R+JbuwyjY; *K`geU?$ (6HPYWYRK?- r]TP_m5BONSSZ`ryKoJ1).5IZlx':J^lzr^I/ +;GEB.u^N=4$ @r'_  />FORWW[XQF2~pf]ND1GpO?;UgcS)x1fB& pnm}2Qrzm__au#HvBi~yh[QQW^nzua@`7kTE73,& /CWfy0BHSV`epwz{zsm\O<*yv192usz>br;v97i C}s\H,xdMB<9DUsFS!{Z<#Be'IZkjcS= 'GckX?*vh[TJGD?DHT\o|=`wxbN8' o^RV\r6`~d>WC8?Rbz )Bd|b2]1X.Pp!!! -BZyu[= \,e/{O&uT?C\-NB,Y '8JORM>) o>cL?>EEF8R*W1 3E_xYtQ"z8_y~jJyfM-f2j9sO) *bTR Iy u= cD) *>NWYOE5%xT/usu#4Gf!Rw{]5{gVVaw,^sGlgjEbxxrV< ! ,\_6h=4o>{mZQK?9-%"*8Qlk? F nF0'4Ug R !,6ENX[UL8yN$3Pky}_6J 3f#pLk*Z}n`VG4)^Gpyl\YYfx7Ndnu||zZ.vC V|O%  3Mg~$QCcy+AR^hnrvni`WH=& }AqK%c)R3Z{J{)IXXWPGHPTaly~w`@TeG'eH4' *;^-oJr*:B:5- dH)yFkB" #7X~(T{?\x yuxrY?)~^; *\Ly\4ygUNJOQ]fyAen>N@q4a=Ref`E%a4&5:/rbW_nQ[Z{}5k (5H_y<[otcFr8m_ME=56/0))'%-8Ki7\%Ji~X,yR/ s^< ={)Z-Kk].V"~]KI^~waQOW`tdBM*wi.6+ Q&{lQ@#|U3&)6Vte= a0 -R1Ws L{u]A* 7Nor_UIA=880, oM3$Ag1aiUHFPS_`^RD1$gA!>\x0Ww ,124/1*"[5!,-%~gNC<:BJT\XYX[_l{%>Xq6DKB6!n\?' nJ|dND@I[q0Yy9] 4FMF;& xd[QSVcu]1 \7$`6'km=qDz1PcH967>GO_sW)b%C\iqoh\QNScopV@#U3uJ*9[:{D|*8FOPXYaemsrqaK'nH0 ~Z7\40MuQ$D^9p qegku||u`BR$wA h_Xbmx}J+UvwZE/)$.;Mezm\J@0#w[88{b-b~]?uT(Z- %Kx1O^a^RF,8Rbqz Au)'h XT00H]jyG >azz`B}z-_8Rn}wkaURUZXV?!o)tVMPi$9P_hc[J8&W-&Fo /DXhzn_LC66254/+$"$,.54410/)#{Z@+  #Eq <nkSB:7<CQYfjpooeWBfB!7^  1S>JP>&xO/|jI'%5?;7)  @hQCpiWH8(Tvnnnzu\B3Wt =u$S*13$ J>x]L>- | $ /[dDl  uGxDcD1&%$(!#6EYfv<d,VosfO>(zT2 Z/ ywz~$Z #<Le)?GNNG@;2.()#d?usie^RKBACPd}?d~ !3DNWVRG0o&d'"7Nf|!7MMI=*"+Ca7je?Mm0k,,n"T}5X} $<Pq-4( TZ q-Z=)1W'g"Qn|nS;   (6OfthWD* nL+/j>zyU5*Ok}sX1zyx|/CMSNK=5" <qre]TUW]^ab\YYU[an||gHxY?&Ag~$4></!(JqjCb= dX ).*jL5  9a"AF:.y'pego 0Wx,ZNn-wu7xG !+.%l8t_YZfz/U{yW4}`G0%! ,5Kg=c6GME- rE!A`{k=Loc_fo@d %BpUn\K>+W&yuus{{^'Gp4a?_{S>iUMKP_rtd[TUTSH<' E@4o  V kM.vYJL_x-1, 3Ok ,Mf~qT-|9l1{|y|}yzuwvGy+AKZbnx 2_+4/iB$ {Er%U 2a&v Cu-G`tzylY;paOA/l3}ijrBq&?OX^__agiotplbWI91,)1@RmhH+%5DQW\]ZUK@0 ':VooT<vnlmy  vja\UL@98?Y'e  vkifigbVJ<)$Aei@%9Qne8M 1L`q|?hrQ;)"/Gc"%& zV3oS/ aE0*,zMz#1FWjy{fI3 Z.e2lC&6_GQqbYMC0xcTNLNRYbp!;KURJ3 *;DLKMMPU]hsz{pU5 xQ2# 4Kl ?UirvmaM8%.;ISNI8# t[QJUh & o`U]k 7c 0VpmV4wdM?0tT3BvQ "3GSSL6W!xYE6)')7Gay 0Uy'262*S"pUA)-ULs~gI& 3?MQYX]__fhng\B"Musnrz/z=gz^7f9*JiB{1[]1 gE%~wprliZK- [3 5h+e;Xs _42Qs1AF8!|T+|tjYE1%!/Ou"]X5xgbel}"Dk}Z8#0?GKH?( ~dPGC?A>1# %T$Nvpe[WU\dkt} `9e?.Ml}gXB7-*/=ToCf"*$zfI0 tR7+(3Li9Ym}zr^K-|g_`o *BZ|]#.XyzncSD.sD||Jytd\U\et$Gl0M`ll`FT&~sic[`fu(8@>8*  /BVfz3CII?2 O7S8$ )8DWfwEq.On 0:6&`E# bB$ @s.e"-9@CIOQW]XVO@3 dBd9]7Rn HBq &/:FNRTK<(oKW, -AQdx3Vt\6 #0=@HG@9, ziTB2   .LoDe}eJ3#6NfwymaSKEEIVbn~t]?cC."%1{qotx:Zt HuC)B_}# jVC,%?fO~"( oH& +9EV_kmrmjbSD2(LpoXH<824*woiijimqx%Hj{|gG#}vx3X{yU'qbYW]gqzwxolflx;[rzhM- /h/:FKOPQMMJ@4~JjD' #5DYguyzviZD1 !(4?HXj3n(C_m}q\?#X1 |bK7   1DW`mrywzrl^UHC;BH^q=fBjp2NuA3Sjz|wmifejnrvpne^TD:1&%$*5?Sj$T}dP>)ticbhoHkwpld_TD0 (5:BHKRWVVOJB71." /CZinqkcQ@#vW45Vz %5J\iy&3=AAEIHGB0T^&or.5?FNZhMt%57*e=q\A&yngmt"O}'4@IGHEFIM]ntG 0Qqw^C!-:?83)# !yeN:%9_%%!vV5 ?e+`x^I8% 2C[ozdE#mVD>DVr!-5:FTfx~pZH0vjd]cfu}uifb`^abiu )EWa\UE6$*Ff  uO!iN:8Ut#Fk_5 4Lct|}wdM*X0Cs*g  `C*  &3FTap{t^D) %),'=`|gTD5#e={w{ '8MZgo{):L[f{ /JexsJc#wB{[G3,(7Jh8c",38AO^y%6Tks\A&nA[nH4# &.>Rl-Jajgd[ZXey7FJJF@><CRi3Tr~rY4 V}@ <^y8gsLsaYasEw!oX@i6Eo(796){]?+'5lweXONOPWZa``ZROOT]gv~l\I2qf^diuy|qhTF5,& +8BS_mz !:]}tfTA3# |bJ@9AOf%! jSLGS`zFs)Hbxr[>`z> 0Ka|~fP>&.O|,e  gWF=2(eM721@St$7FKFA5+ #-=McvjP9%#)23:8;42'!p\@'*?Wm,7=KR`luv\=V">]~ ,DXx 3So~vaH4 p;AvXD5('$&&$$"(.CZS Ho]I7$ pW5$Kq .9<BDDMR[cfifc[XRQMLG;2 )Jx~gVD<4+(#" ~truzsMqlfhhq{ :YP#W  q`K5kK%_C%&Lm3g !0=GOWVZ[__edcYA"w2[@$ ";Of}@l"'#'#$z_I.~xptw5IZjow{xztn_O4 #2BIPJ;+]7 8Vs 6DHLC?60*v[A'&Ek=j%:Rbhf\E&u\D0ujabft}->LSTWZbo{s`A#a9 'CXm|0Oi~sbH0wX9$!+=Mg :Uo wY5m\H5*%$*59@AEJQczBohU@:7865,&/8EJE@://2;HQ]cjmrwy|wnZD( '@`xx`F4 oL(MSTF3Fr1lO;" !5DXjy|j\WPZj >p/D\v|kT>q4wA.8=1" >Wq,PntT8 (KjjTF7.%  $5=>1a> &?Tm%:Xm|oT-nJ51)^3mP64GRbo~,=PZgu}{yutkh\RF5%xuuz~>[wpYG6.(%  $/79<6)mU;("6HdNusL#),00-27AL]nzya<U* !1FYp8Yy+:EPU]a__XL<% m; [7wrhhecho2Obp{ ,Rt2AXkfB"yT3qX=':\y%Dl'NowaC&`0gDxw 1U{7Nl$BRPF,iO3  (2982'  $;Rfm<m^RRTar'6EMVXOE6$uqt!+@RcvpX?{ !6JhnR?.-3Gc  % qK' Y2xg_g{2d4OcxwaN>4++++(jI! 1\?]w"JvV)~\F1(" mYH;:?Kax  5Otwg`^hp~qY2V_B7-5>O]p{Bx'hJs q7{Bo^F2 ;SpM6cpU.tEu_I6!)>YtgO826IkEg}qE (AQacfbYQGD@;<:<AFS`r~tZ2 ndZYVXVXZY]^gn +F_zti]SG5( u`I0 /BVeu}2EYj #'*%" tiWJ5{M,w]OFIShWO#1;?EHNPVWSMA2sL'ybF&yjgxOv2Rv"NyS&hIyB}y}=i-Qtype\K<'yiTE7,& $Fi+Pm :P`p{~t`G( Z2qbTFA@ADNRX^a^]WRHD@;BIVgv:hunlqzu]=pego{zokfmw(&  '=Wgw#7@A6RxiTB)   +020,%"&)9Lf>`1N]khbS7wcS;% pf_Zcn"0DYwa:|pkou#:OcyjO'[A."#,>Ri*Lu'*+" tl^QA3"undc\ablx 0MrmJ(|skcfn~}pilx*Z,>EIDA<58:CJMK@#\$u[NGMVl~  !#%7G\onT8$  |rkc^VVTTXanz+2@IT^iwvi^OIB;5) *=K\gx}_?!uZC7-*($%#"! *Mm "')$6EKV]k{#(% rFdI. :^} .C[tmXG73033798<><<973/*'!|mhdgjjjigccbhq} &:MTXSOFA=642/,!    -EawiaVPL?8(}T, #Fk=~:lndUL:.}P&wg`^UPF6!wX:*!(5Oh8wN%b!6ETZ_\J1f%yR1hQ9g<:UxNYYXMC0  -MshH* #%$  &%)!!_; &B]|!4FXjz~sl]R9'uf[[_gs #.:=A:6+)'6IgiUC. zf]OA;58>M`v9Sn~}{tlZDV&yw,Cb"/2744*&$#.<Ws(HdzhH`0lJ& !:Oe|ztrw7XvfD+ pM1 ";Xq ':Rg{pe]OG=0+$#  "-8EOY]WO=&{yyusnfddis~)?[l|{q]7yww}~5_$5<?9(|i`\WWPE0{f^TSR[et  4FQSNC0 #08;5$jF( ,;KX^jw&OqocY[bug5o^THD:. /QsBvz|}z~~}tmaVF3hM$b93Y 9k:Zt=YsqR-sb^\^_ZWLA4 lS9! N/*l )EMUNB/Y0{Gh+}lgdfjjkiihda\UH=/+,4Ln @zEu&Ps i? [3^C' }xsy.9JZz<v.ekL3zY5 {R.i[G?9AUn/j4Y.?Q\ee\P<& c3txrdTNFKNYct 4Sy-UrjN0zT, bCwvw;Viy~xsst~$JkhCv> $8Nct -B\zEjsS*yKs\E;13;DTct#,.+ cL6''9Ut:Wx ]+I 2J_v3Of|~~ &=MTVMD1mG)z_B&-Ge})Eas[<^; $2>P^u)C^u1StxG B}@wS1  1T{=l *Fl*23+( rAV,jYJJPg 7Xw?c!&+,,*tcH"ypjfghhe^\TLGCDHM]j~3Pi}p\?% ;^z|bM8-!ocZ]ft%%%!   4TngJ0{ogXM>956>HV_cedXPF=7.-,-0/6=JXkEi+34'smlpmof^NC7*&"# tL& />NXdm-Lbr{}cI5%!+6ANRTM=,}gR9$;aU+51-# yjXH7# zo]N<. -@_-W(HmuV02c-{shdcjr$J\mtW6|rmjmry{mihgw   pljr,8FOZ]debcacckpy~~~j< {R'wigfq+@Yp+32&?j 7[tyc?oFJ S$DuLv ">c   6Us`.iEu_P?. M WEczxiYE5% !)6EP^foqqmid\VMF=1,+&$ zG6Uw +3=IV_myuiaY[Zclrz|~{zwkdSA"Z7 -;JW^jnuy  #B[lwz|ql`UH8)~_AMKlvje_]]_behjjja\PF=5205>HSY`a^WD2jK-%4Pj ""$#vgWF?787476;AGUd{*Mp}bN8)  '@Ubnpoj^TE7#  +9?DEB<3$oW?0!"7Qw+-)*DVp}iRA0+'.2;@C?4(|l`TLCADI\u5Vsw`L8!s^F, Bg!X%IljI,kYA,ncUL?8+:a2Sp'>KXYM<"Y-|_E8/.46AGLNOIIBCBIS]m~ 5b%:JMK8$vaD, T+Mn $(! -IdoEY$|svv} !8So%WfI2jK0 4h3\yfT=. a: :Pp&<Mbw~ugYG9&dP7* 0C_})Z$28<>:8.' qN0oGwG$DrM2Qbs{~zwrmaSE0#.Hr$8=>1 q1r= {`J8&+@h07'7@=80# }jZF=7:BRatqT+|2AGKF<'zjbWQH@8,% #/Ig$>NZ_ca_VL7$ %$!*7J[fppjZA!;YxvstzteH)zW;-'/:Ri =[xpT7vU:?fzroilmx ,Qy-RrtT4 {HkS:) &7EZm|pb[UT\gGu*/7793'qH`3 ),/)'?Xv #9N]s b8  $! njl~3[{gDqX="R,8;;2* )Fp!-4/ImP6':SpFrysqstxrn`TB2"t]<:[{0Qs #$`?& nL. 1AUf~$Mz<Ri~rY>$ jDN"wh^OHDDKWh}(P} =f   z`E$ }wupe[I74Tp 1XJv ~PmI*^@ uk`ZXYi+\ K=S\WP?2  kC{R ~iabl(Ps9d7Xs|T'gC,%.6@ILNIE:4-+*&#k; {Q$.bM>]v mH$  +8N^q|}oW<wfT>+%4Ni$Fcn\K9+  {x| $B\wr\J4$b>" 3Ng}ynoq"AYq(=KUZSJ6j6pP7,)-GOT\__XO@''A[jy{wfW<$sj^QD6(2Y6Ypyi[L;3+&!#Bj [0#7DRUWQE6! zpgip~:Wtu\F.u\LD>BFQVciu|wnc[YW`o#Hm!-7;<=:82$lAEnyhO8|mcXKA8407?Th(A\x}l[G8,#+:DRV][^_^djwdF%~]A& *3?NWhwoXF=;FWuEntS;! |~}zwsqnkqz/Kd ##&'$sO-tL*{xuu~ 2Y#;Leyuh\RK=5) qXB+ !>`>a,:BB:-{eL6" b@+B]9] $}l^WLD5&pYE2& 'Fg 3Z$JrjH!vT4|k]B, }xvxx1i/l<fsJ"nE!|_I5$ *;ESY_YXJB4/,)08CO_o~ 2Uy>d  c;`E,jS=% 2Ki 'AVitysbP8& %.4<>BEACCDEHGF@5,Jw  /6:4-! z[>gG% 'Fi8IVY[[VX^eq}y~g@o5eC. !$,15@Lf"i9y!(1286<AHR`p~~gO2kT9~G7Ut 5IQUMD4&%:LduyiN5qlfmt~ !;Rk}xkVE.'8DS]jq{}und\PF7%"<ThrM qd[OH>8406AK_r  #"1BWbjkmia]^[cdjfeVJ13Oi~wqeYJ2-Ot)(! `/jQ?+   &07GXr*20+ ?c*<HMHC5-!h.O&?b!0AJQRJ@1 :KVRC2&1<?=0#*EbxK!sbTJ?9,%$2E\v#Hg #AYufA~Z2 nP.~zzw-Ig>uNvyk`K5}P'{mehlyzh\QFCEKS`m~0d!+/-& pT: zoed^[SD3  6Tr*V|zm_VQQUV[]]ZPIB7/$ kR@=AXt "#(-/8?IQUZ`]\UNB1!1>@8'~vssuuxw{z7YqM%zmhfis -=Nf}/K\jmlcWE1d'i5 $0EXq#4DScqtdQ@.! '" {yz&Hay}zpj^UM@;3/,%!)>XpgE$u\="-Oq ,?QUPE3 'AXv3FW^\VD-cF+yoc`Z\aeox#;RfqzjS?%cK3"/;GVdu6Og{;Wl|tdP: [1 oN-.Jf/C[q $"  {_F( |ttrtvrsoohga]YPMFE>>>;BHTet'Ab 2HQYXTM>3&t^F7*! qN( $5BKZk!Oua@#8NXd`ZI7 &>Yku~~~{|sR3 &BZgvuqeO;"%:J[gormdVJ?668>?E@>4-"  4DU]eheb\PJCHO[ojV?)|cP@;6iykb[X[akz&#y=}D #?Wm|7_8P]ec\PA7.,)*&" mW< nYD1m`]^m!=a2Ro   |ztmga[TJD<6.$ ~yzyz} 0Y}wZ=|nd[[_fpu(Mmp[K:1+*.37;??83'x`O>6,-/2;GZs 1Xt !5BIE<'zhZK6(obXTUT\_hkkmmry7Us~W1 (488-{gTMHS`|8Y|&0=CBC?;2"tBsljikqvxytqlefn|2G[ghf[L8" 0Hf|jWE;-kH"6Z{ !)*03=IXovlb_^]adb`YPD. &8GXeowuqgU>& xomlu}$4FT^dfe]VM>. )>ShuwskaV@,rH $Fk%8DOWdk{ <O`d^T?) qF|hS< 6^4Tm pL.|eQ;*%4>LV[bcgghghijr} Mx &?Rcnwvupe]RI;/ sK- ~|um`Q@)1Idz *5DR[dhfbVK=0& #.:Oax~mVF2!zrqs (<Ndsxxv{}wraM1#4EOY^_ZND3#-I[pz}ug\PF>5228<ELTZ`eehfa`]__fky~Z+yZF6.*'%!$3?Qd|$=Q]fhcYF4! *27;@EGINPUXXYUPIA4 pH# $B\|)8Mbz~kP9 lZJ>654=ALUco| (:GTZ`^^XTIA3'  *8EMZ`fgf_YOA7,(!"!$!! !/F\vypaUA.s\E3)%&&+/2436,|uphd][V[\bkv%4EO\cnw{{zrmdTH4!-8ENXadltz|dP4# .QqgC~o\K8+#0H_z   &4Mg$+25=BMTWYRE. U&xS9  #1?DKNSX\fr )0/,! !+<Laq{k`RJ@5,rV>'#9On%3>HPYbp~}qZH/}lf]^adls}';GPRSRNTZgvraE* xssxz~|tsprsyz~}|~ .<EOYbr!9M\_d_YNA3umbVC*`D(>l%MqwhUC, }0Li{Z;)@ShyubK3xsk[O:' >s#[  }^7p_XSX]k~ "9OneS<,uU/ 0I\p /E_vp^N=+{mcTK?:5;ARf}*:JU`js{|xeL5" maVOMSaq(?R`lpofWB&  Bb~lZQHHJNTXbdjhfZK3ye[UT[i} %("  "6AOPQH6 z{|7RodG/nU8'%4Kbr?]gM1udVE9*1Ke+@Yr rS8|$29??A>960+" '/0+~6Vu~tlbbaedhfd`VND:1-**08EP`jvxufJ%hB #,4=@JOXck}1EYajgZI3 "4ESbnz~ztmh`WH6W0 ,Lj/AMY]`^ZXTY_jw +31+{Y/bG0! 2EZk~ 7UsW/l_RMJOQ]hq /=CLKJDA=@EKUcpr\C,(),&%   $-1;GSf}'1,&tic`XRE4x`S>6*((1:KXjtB\{{{xtk^N1kT@0#$3F\t)T)46<;??B?6'oYH6"xqlov/Lf  }]E,xcMC888=BJTZgt/DPbo|zurig[TC4    )/;@DGHFD<82/,%# ~tqqpux~"&*(++3<JWfrtkc\UKE>2," *@UoyjXOC<4/'!le[\\_a\WI:'.Hj !6CS_jpqsrst~uY4wic`bejnw~ "=Uh}lV:& zskd]WW\e{-W|zhS1gG' *Eg&7EVcouvvkdZSSTaqa? -=LQRK@1% #6K]iyzndVND<:8:77/ yZ@)!8Pf 2Jd|ueQC8,)%((-13;AGLROK>+ysqzzk[SP[rDlq_I9% }\= 6Ni *Gc"('iR:& tgZQIC;70/(( !)5Lf6^#DXhnhdVN?4&t\E)}wxy~bN:0+/8AUh%4JVbf_WC/  /@EHD>6'"'++(# #=UisxsjZH6  " |y| &Fc  yj`SMC@97/+#rM'"Js&E]w iI&xaP<&  *19=BFHS^pEs (;N]ht~m\F-mBqYB4)  ,ASj>^{q`K=, wohd\YQKB;4**)13*$!)-*' *4>?A>620.4;GP\b`\TB2 3Qnrf]USJJFEC?=97.)!  *@Xr|aB+|jWF:113=GVbp~"'1=Qezr_O;, jR6" *2ANbv0EZj~ }tk]TF8'|m]L@0% #Bg .Oh|~{xwzz{vj]I5  ,<Tjz\:lPA41069ACKRXdp /?FIG>7-&~| 6ET`gmomg_PB5+'#&*29:;4/"  "&(&$    -7HV_gkpprtvz}{xqgaYVPPJJFHCC@8/ {bK;)# !'15:;@FN]o+EZfrvyurnfedeiosx{}ysjYH3 hP7&!1Gb0EZnpXC0}vpgefmy0Key  rN/sL, %6Ibx)?Xn  qH!pO0  )Ef" $(*7Ga{xldYO@1uV67Yx.9GJMJJMNXaqsQ0 z~&.=O`wlR4yzx~zyvwuqqmmliklt{CmoYE/ykfhit-F`xwR/hXGA99;=DKWafnqqsty~#"" 2Mev~r`SD5.'%" "$&~na\X]dly   &0<IQ\_ZUI>+ %*+005<BKWbm}_Azoggjowywtuvzungkq/Vy}o_RC.se]\\iy'BWn  uM!|vkjlmu  /Leymd\WTNLE?7/#/<EC?5$(06.$3KYffg]SD6#vhUH80(*/5J`} 4IczlF[9   )35:70*"'.;HXi{ '<Nk %8CC<-sV4zS+ mXMFIR_v8Vo>e"B\w|aE'^'{A~wyx} ?_)@Xju`6sU?) &Mz!Chym[K8# |maWRPR[j}&5GS`dllqqux~yjZH8'wjVC) )9FXiz &>Sj}xofZUNOOMMJIB=51+iM1  !8Wo0BS]gosx}}xo_H/ylghku +<FRXX\ZZWVNJ?/ *<IPUUSOJE<90)(17<>DEKOVZ^^VK7!xfSB0"  %8GUajrw} )>Yq # h9}cG4 ->JZeqw$2@Wl  tM%mQ;%!6EUdkx,@WosX> 5Pnvj[L4o\QGGGOXiw:YrlV8}maYNLLS_l~+BWgswytqid^VOG>1'$0?NWciolkdYN>-f= Dd !<Peu~xhS=(u_C-*Cc$Q}&@Xdh_R:$ yiZE3hM/%X2Lal|~}snaR?'xdL/9Wt>_-:HQSSJ;&|dUJA>95.yeS>&4^+[ygM3{j\WT[cv+35+woljfgdd_a^eiw5Qk}rbSH<97=FO]huy~xwqpklhihda]WKA.oQ5  "/BRdq&-38<992-   0=KSWUOD5# q_I>1,&%#$*1:FT_o~%Hc~    tS6u[B$ *Pv%2ESeo|rj_ZUKD:/!jL1 +:6851-"  )8Pf '3ARi"042(x`L1xbF/%8O_p{6Rs %5DKKG;,n^G0rJ' Ev 8^$5@GJH=+fG/{kb_cis|3Pos^F6#jYF2$ *?Wq   ""%'%*-277;<>?@GLTVZQJ6% |`C- (?Vs?e0CRYZO?'rX<" ~umaRA, #=Yx+HfywZ@#(066/)!-BZp_C" ~ocSLEDBIO^n<hq]F1 vcN<,%"$0>Sh*Hd0GZo}mT. gN<.)%%%$! wqf`VL<,,WM| $$ xV:"/;@C@>6* jSA/$!1D]{=l  ~solgjkpvyyi[B+lD$7[!17ADLRV^fnwz|yyuxx{|yvqokkjnji_S; fI5'',;GYhz1Gc|yaF)|tmaXJ>4-(-3AQbx&.26:9<;<7833.1.0/--,&$mXH;4,06DWl .PpudRA. naSMGA?==Qalope[H1k6\0 ,Hk (4@HSX_a`bbdfglotxx|}vlXB& l^OH?:5.*# &:Le0F\gruxzx{nbXQKILHJGE<5' !*4:>BHOY^lwvT2 }oc[QG?5/'%"&)2:ERYdiquxy{}%?YqziXC3"+;I\m|T. vofbWQMGKMU`n~.FXjw}|xoibYOE:,2OexjVE*}yux| !3MeywY6vi[SKC@=>BEMU^ip} /W)?L[cmpuslcWG5  kCjN<0/3>HQ\dcb^RF:)!0AYq +3;GR`thI.3V{! u`F-~ylbWJD<;=FOao8SmmU8td[PFB=?CGQ[iysc\\fv!Ls-MnnK#k8 tijnv~r`SF81,+)*)$#"&3AXo(Qz.8:/rV=. 'AZsyjbZULD3# {z "(+$!   ()-)( -:ELLF<*kT>1*+09GTeq5OlxfWF?>=GUdvr`I7!pmiry #7JT`dgffe````dadbaXOD2& +AQajifXE*lD& 9Z~ )Hdu\D3(" #+<Lcy}gS<! ~cH+*Il4JWcegb_\ZZ^dhqz~{~pZC' tlb`_\\XTJA2( 1Lg*CYkteXQQOW[`aXQB4!',21/)" %+7@LTWYUPD8'   .CR`jkplh^RB5% -=NWcjjkiffcfjpsyzvrh]K9$ !-8?DD>7-$#A_vsfUD0 xyz|{z4X $+(&`B# xy ')0..& #"  5JguO-sld^XRKHBAEJWh| '1:AACCGJS`l /:@DEB>7- sKzS(&6KZjy %C^},BWfvmZ>|Ng> 3EXi|-Kg=WtzdD'nEnP;% +9IS_gltx%6KZkuz^E& oT:'+AXs "3GWdinkhbXRKGCCABCBFLS\iyz_C#$6BQYejkjeUC) #05::971/*)" }|z#%.9J^x  fH, (7ESZcgif\RB0~wssuw~!$))+*'&%%%%*/29;@@DAB?C?A?BB@BGHKEC7+ #*6>HQYaflrswvurh_TG</( {n\L:$:Uv'>OapyumghjttP.dO=+! '7Ia|+F`y|qnhhifjjkhe_SI:. pS9 5Um$?[|#,333+$uQ0 }yog\N?2$ 'Bb"28<@FPbv  scSB5' sH!,Im7VsvZ>$ |fQ?."%6Id%C[r|n\K:," }of`\cm *E]kx~{woiabbjs~seM8$  %-=QjpW>,~|})AVlrS1S- ,Hc'=Qm`-j<}kUF72/:OkE B_q1FQZ]VPC3# pK&RuM4%"&5FYq+B]v8\{ "1@KU[ckpz~nZ>j; lI%4\ $;GUYaenu|}m]I1u`I/ -C^|&E]usg[QNKNPVXVTL@-gPB<:BNar )B\po^G/#=Tgw~{qlbZQB4"(Aayl\I8%  xk`__gl|.>R`lqxvqj`TF2 {qfeeit%0<FR[^cefgdfeedc_WQGB;9:9?FR^nyr\F(ul`YSIE@BDHTdy3Up{me\WRSNOJKFHE@<1( t^C/)My 9j %+,,*#xk\N=/lS;9]Bo%<M`ivxyp^F%xO/saVF=.% >l/\ hXLFDBGJONOJ>1 {qiims %4DXm{oi_UG9)wdVE:,(#'-4?JW^jox 3EZk{{Z>" }wtqv{ )3>B@;0#   .5:?=95*"   #+5=CKQY_invywvpi`YQMJDC<5(  3BS]jmolaVG<-$m\OFKVn ?`vscN;&1DVblliYI4jVB5*% !$'2>Pc};TopcTA0 xkd][[cm}#;Mbuwg[MB3( xdUD9+)#')16=CDILSV_hu  .<Rj~lS?%dA;830,%"+9Pgz`D/ }z}3Pe}oS7sYE2   +A[w>n "9IS\ab[UE6" o\L9(}ncWH=4-*+4G\~>aylF$v\J?>AN[lxzshd_bhn{"6Qn  nfZOH>6*4IXgr~kU6fP=/$ #%,8BSdy $1BSj|rfWJ;) unggiltx"4DWepwrmbWH9+!   |)?Vo  jL(nVB3#!1RcvrT1gQ9 %Ca| #+-034;BMXemv|}|aF,{{#4MazvaK8' qdVQLNRU^fpy'AZopL+nV>,!!+5CGINPUXYYVOF7+;Uq~ti`UF:* lQ=' $2FXh{,AZrrV5/J`w{pg^VRJJFFCCA:7." 6JbrqbP9%xfR?+)7GU`lw+Eb}':MZgnqvwzwqgXC( e7|^E.#7Kh.=Re~ #'-.*$ |a@ b;|vz%CGGJHD?:30+(! !/=DNPRPKIEEDJQV`iq~yj[QICBCCB<6*wh]SH?2* 2Oj*=JWbhrwwlaTE7,! }jaTRMRSZbhv#7GR_hs}vbQ;+ 3AOSSL?.sbUIC;9798" `6*?M`r.H[n}sbRC0" #/7:;6. {i[I>2.+08GYl&5GTdm{|dF+  xgYI?827=N_x#3BSaqtY;|sqs{ +:DOQUQMD7* &2=ELQQRNLE9, (7AIJMIB<3){n\QD=7:?HXj$&**/08>IQ^iq{_: X2#/?HXco +20/)#+:Tju^I2 s[G1+9IUcmz.EUepy}~eK3ug^[Zco{ #"    "&+/+)! &+5AGS[dhlnjifdd`^[TL<0!sZI6)  !+>Ph:SbpuxwtojdZSI@8.*%%%*04;@EJMRX`fozzgJ+pR?.+(0;Mas -;KZhu|oaO9' teUI?5259FSf{(0;EPYcikmjf]N?*!.5@DNV\emsuxvvqid[RH;0#  $5>HKOOLJC@8-" %-7>GQW`eklomkeZOC8*|{soe]SIB@;AGQ[gq~$8HWdipswyy}xrg^SE</% #! .7BJKMLID<6/*&!"#(.5>GOUY^]^\ZXQNHC:3'ymc]VURUU]djv!5DYh{{aJ1 woiec`eiv2K\oz}xtppoojg[RD2# 0MgwdL;& .?TeytZA# zolda`dox -9BHDC<7-( *4ETdo}nY@ lWH?9;BKXcs "*5@O[kx~{pcUC7*# ~kWE;349@KWclu~*Ko}o\G/vpnmklkje`YRNMQXgx8Rex{fQ: xnh_[YSUU[_enq| +:FOZagmkmjhcb]][TRJC;," *8DP\hlstvtutppnoonqqmg\G2r`RG91' "/=I^r'>Oakvz{zvspqtv~{lZE6%u`M:,!&4Me$8GQ^fq}~`H/#9K[fhhb[QE7( |oaXRNS]n.<HO[bnwylYH6(!$+++! wog_[YX]es4Vr~tlc]TM@4 }vohhhmr},6FQ`kxzhV@/ uleckv#+///.,,)/4>HTbjv{{uhVF2#ul^RB6*%#&2C\t  +9FT_gnuw{|}{vsjcWOB;212:@LRZXVI;'$1AQanu}}{seVC4!}ri`^]eo "4CKQRSOOKKIFA92& .<MYdif`SC1 -7EMX]fhnoqkg\J8  $2>IKPNOIE>81)%#%()0399<:995689?FLV^hnuxtqeXH1 $$$!  )8IXcmuwzwsg\G3*;KZhnuutmf\M=) }naZZ`p .:EGJC?2, ""&%'%'(&(&'#$# $&.3<CEHD?2&  }wyz !)-57<=<:87698<<=;4.$ $,5<DMWakqwywwsroomge^YTOKKKJNNPOOIH=6+ }pf]TLHD>@AIP^j|""$!"(,/,)"-Ie|yocQ?'vrsw "!%%)07FSerqbM9 zsqqqonhc[UPLNR\jy+9BEHHJIMOX^n{}pi_VPF?1%nd[XXZcjv(8ES`nx{ogYP?4!vfWL@;5477?FOZgs &6ERalytiWK;- &06<992-$ "(.8<GLSRQH9*zunlijlt|+;GSZ^^\VNHB?>AFJT[ejpprogcZTLHC?@DDJQZ^fecZI5*DZs{rmmjmomidZK>- tdZLF>40*'% ""%-9FYq)>N]lv   qX@#oU?* (9G[n(9GS\agimnqpmjea]VUSVX\[\WSJ=2#vsonsx 6GYgpx}||xsnc\QJ>5-   %1:AFGKJMLQU`k{vk[OA5(veWKA;:;?IR[gnu||/?P^o|pV9th_ZZ\dls,>ENPRMIB4* $=Yqy^B#zoe_`fp "3FS\a[SF6%  &-19<BFHJIFB81' #-8@IQSZ[]XULF;0' &05862*  !+46977569<CGNPRQKH@:2& $/<FPWZadkntuyusf[K6$ ';O[bec`XSGA5.$! $-7>IPUTWSTORQRSVXYQOB4 zeVJGIU`u  %(-/5:AHV]is~zska^]^dku|{o_J1o^TMJHJHJHEB<9444;CRcr "*:FVenx|~|tg]OD6&   &/8BIQTZ\Z[Y\Z\WVLD7,! vdS@5*$ !)1:GTapz+JisW?& ufTJ@=@ER`u*@N[_`[ZVXZ`kv{hL/eK3!,;M[jv8Pcu  ~mWF2 }gS?. "-BSjx-C_ryl^NB7,% xbQD???DINRX]`fkrw|4Pm nO1ug]RF=4("'2Ga{6Ohy}wqg]RA3 q\E-)?\x8Xv&/51( zdT>. (7FTbo||jWA(zkZN?3' (5GWjz$5EWfywaN7# pN) 8Up%>SjmK&mR; >c)*+)(&''*..22/.*'#$(1=M[p{^C$ $6K\n~m^K<) sdSE9*'"%*/:CP\l|+F[rvhZOHA?<=;;<860+!1GXir~~{sj\I7   1ALYclqqofZI6"0?KXahonqpnjhd]YSMEA;3-(" }rgb_]bhr~-CSgtxl\N>0$ {qkhbadgq}4MatraTG9-}yz!2>KV^hsy}o^O?2!~zxwvz} &@\xkV=*t`QC1% (?Sj}6QnsgXPD>5-" ui[H:*  .DZu">Tk ~zpkaXL:,sh[UPJJFFA@=:=?GO\h| #5GU^ipx{~|yvrkf`SI:+~~  #4CVdptuk`K7 !'3=FRY`a_ZOH>73./057;><=:71+  {n_XOIFCCDIR\l~#-05441/**$# !*;J^ryeR=(xmb\W\_lv.>JRSVQQKLIKPT\ent|~yunjcb_ccimtx~|yo\H,ysuuy|zysmcUK@;8;EOcu %2D[mtfQ8yww#1ETbjqpnhea]bhtpP3rcTLFA??ADDIMV^kz")133.%,<L[dnu}pZE)|aI<26=Oc{"5GZly}hN4zj_TE:.% ,9EVev2LfweR>*)7FTbpzt[B)~xvt|".5=?EIKSYainrspi\M=&)<Sdoy{zrlc^WVVX[`__XPD2#zke]`doz3EZixxlWH5'yeYI:1)%!#&)3?Pf|Bg(5?CA<-  lWD.umha_[[VTNKEC:8547>J[k/D\ou[=$ wn`ZRNJEFGLPSZ`hosx|2Ol  x_C% wpe^XTSPSRWYafr-EYpveRC2#3Omzl\I9( {rpnpux1Nn}jR?)ynfbfnz%6F\pmK,{ohaZZZ`ix  &,.23310-))),06<=@?=7,$ uhb\]_clt!09DHNPRSPQOQT[frs[B'xog]VQHE@@BEOZk}%28?CKOX^ioz}vof_VNB7&~fN=,  #2EZm$=Pdq }hN7hO4-Eav 'C[uzdG)`4}xv}&Cb+QxnZC,jJ+"Bg &@Xp{|pdQ?% |aL8$"?]z 0@Sdr~uoeZM?.xia[[\adjoqw{3K]ny|seWH<3+))/4=AGJHD=6- n]WQTXdp&',+///2240.&|#*27;<>:80,$   1DVj|nX@' +>L[dnmncZH2 .?GSY[\[WPJ?8+ zhXTPT]es2Ll  '&$oaPA/ ~tnia^WRLD?;520106:DP]q'BVl}}`F( |spnlpsx|xtonpqx}.C[s(01- iP5!}vx{%?Zo~wqhcZQD1pbUKIHOYbr .>Ri~jO4   &3BMYckrvyyuoaR@-unlkq|  /HgnT3rfZVTSX]jx &0@KXbfjjid`^[\]bciijf\UG8) p[G8,$"%(.7@K[o.F]p  vX=oaQF93-()+2;I]n*E]u{iQ: |\? vifiq@e&Nq,EYgsz~~vpbUD0!tU0 e@9XzHz"?Udkooie_YOJ?6'x]D+kU?'zvu{3[3^0CMSSH<'n\K?2,$! !'*/./(! {topsx6SimVA0  %5BN[dmnoj^RA/&+-+% '>Pfv{n_TKB?===>@<<97610,*"xl`SJA@EDIHKHKJIJIIIEGHMU[gr~n`N:&|rhb[UQNKKLSXbkw "1DUhw~n^J4" yyv/?JYeq{s_G2~~~5I^prdSC1!0@N^m~p[>%&*0354-%)113/,' tbSJFGKT`k| 5BQW]_`b^_]]YRLD7-$+:FWcnv}}|zvtqibXN=-~~{ "(,165620,%! /DVn~|rfWJ=0!xxy)6CR^lv|}vkdVJ9+  {dP;( -Fa&Hevg]MC5-" ~l_SF>52.019AN^m3Jc}zfP=*zcI2;e9_xbQ=.xl_WOJFDEEMUes#6G`vxbO8$uj[OB:31/48BIXdx$3?MV`fmponkga]UQJF@=:5422255;>?BCDA>8+! &2:GNWZ_ZZPI=4' }shb\[X[[\]Z[[]^ekx-F`y}kZG1$Ea"-8:4*vO&kZNGDBEIPU[bbhjnqw}3I`t~lZI6' {w{!1@JV]fjqvy~tjcZUPIC;2#eM7(#-7BNYfp~'?Vm~a>z]C+ *>Un :Thz')+&" {eK5}gN<) &8Pj -=LXgrq^K6"'5EQV[WOA2  ">TixxhXI:0*&)-6<EJQRWWVWUWTVTXX[\[YTND7( !%)'&  .AO`nwxm_N?." #6HT_ijllgea^XUQLGB?8/& wh^XUVWY_`accababbglx $+.6=GT_n|~pfWNE:5/,,''$" '9HXdpy|}yrhYL>1#  )8L_tzcQ=-  '6DPW_bhimoquxwxql^P=*||zyutrlid^XNH?:578@GR\kw*Fd q\D1{pcUK>4+ (:K^s4QmkN4xkdZUOKE<6,%$-5AJZix*Nv   }hYD6# -?LXcmw|}qi\QB0 |y} $,6?GKKJD>4' ,:LWfoy~|vi`SI@:588?DMRZ^efjiif_YQG>/% lZF:/(&$*3?N^u%2<HPZadda\RKA;67:>FNV\adcb]XPB7'{lZK>1,*.6DVn-DZj|yod_WRKA7)yePA4,'&(-5:EO]gv0>MZbjpvwyyvunj`YOC;0' zjYQHHIKT]jv&=Tn|nf^YTPMFC=7.&|pbXKB6-%$1BZt=[wnU8|}~~ +Kdxh\N?6*"  )3>AB;4&   (2:AFKKHC:1%    '/169<?AFIOSY\^^^WNF8-  #1=LYhq~xpgVI9,   ?b}l_P>0qeZOJJFIIMKMHEA85///6=M`t8Ncv$5BNRSL?.wW7rcTJB9757:IU^cfee_ZRLF=84.-+-.,+)" ypgcbclw !'3;EJSU[]cgilnljfaYTMIFCB@>:8.& wjc[YW\clz$6DTcr|qj_YPLFEDAB@<94+# ~vqe_VPMJLSYfr !#&''),3;DO\cmsx||}{zwrmf_VMB4%rdWNGDEJSal~&3BOU]bgfide`a^aagksyymYG0~mZJ<1)&$(-9GVl  !  ! #'',18=AIMQQQKE6) '7CP\eqzwfVB1 '1;CDGDA:4,#  3EScny}~zqlg`^[YVPIA2(#19CGLMLJGD>9.(z{|(5BOYfluvzyxz{{n[G. !(0>IWhsoW>& }m]RF:3,**(-/7=HT^mz #1=IYgx~jU@'~qkhcfknw~ !,4:?BFFHKJNS[aksy}scP:% ~qdVE7*,=Pav&6BOX`jstdWI?60+*+(*'#  "$))-,.,-)("   *5<BD@91&  &:J\housrg_RI=6.,(''(+-0020+'  "*26?FPY`jpxz~~yvnhaVPHD>;72/(# }vuv| !6L\nx}shZN@5)" ztnmlmprwz~#/7:?ADGGKKLIJHIGIHJIEB<4)!  *:KWdlrsqonhghjmpuy|}}zxske]WPKD?5-!o`N@1)$ %-;K]r -=IV`flkkhfaYTMF?82)$! "$),1142/*" '7?FJHHEC@;967567677732+'!  )8CQY``_VM>1  "7Pfzn[B.#**.*)! ,=KV_flnole]OD4'  &29BEIIED@>>@FKV^jqz{tjaVG9+ %')((($$###  #%)*../,+'(%&$$#{ma\WUWZbit!,8DR\js{||slaRF9/(" !#%(+-/01122-+$ '4:CFJIEB<6-#  +6@DHGHDD>?=:97731+"*39=ABDCEDEBA<:41-(%   !'.434/'/=ENQRNHB82+&! -;FQY^bbdehmnu|zm^QC3' $&*+))%"  &/39;>?:61)"  #<Yr{tpf_TI:- zqh`XTTWbix%5?KUYadjmruxxyxsngaTMD84,*'%$ %1:DMWbiu}~qeVF:+  ~}ywsqoosy+8BNTXZZWSPPMPSU[_efed^XME9/" !)/202/0/4:?JUblw}}tk]QC7) wj^TOKNR^k| *:FRX\^\[WPLFA=50+(%!!  +6?JS^ipy~{wurllfd\XMD6+ !+9AKQRTQNH=5*   -:HR^gnsqoibWL?3& !)29=BCDD<6,|wu{"?]xt_L7%xurstsuuxyxz|&5ERco}cO9& #0;FNV\^ccfdb`_ZWSNG?5% %*-///*% &.7<CEIKJKJKJHJINRU\bjlomg`RE5"   *4?FLNLIC8/# #2:EJOOKG@8/#  '.8>HPU^afhjieaYQF9*|y{} ',13569=@GNT]_edgfa`ZTL@4' %),./,-+,./27>DHMQOQMIB91%-6=CGHGGBA=;741--))')')$"   ).8@HPTZ]cgmsw{~zvl^P9&ukd`^]]`bdgjnt} "-7CKW`fnqvwywvqlf`WRIE;5+#   '07:@ADFHLPX`fov}~yph]OC6, ymd`_ajs -=L`rxfWJ<5-'   #.<JVcnyyrg]OB1#}wpnjihffgilsx "5JZmz~{xspmiga]WSLB8.  &-02212.../1144642+#&18AEHGB=60)'$  %*26=AIPV]`cdfcb][XROLGFCC@BB@A??96,${oda^adls}$5@NU[^^YSI@3&  1=JQZaelrx~}vkYI3"%')$    zrgb^_dju  ',/469:<::77423134698;::752,*$     ")+02567:662/(" &2BOap{xlYI6& {wrtwz #.8DMW\bbd`^ZSMH<3( }uttz):FVbq|~n[K:.! ~n\MB;42,**),.4;FR]m~ />MW`fkkmkkmlruz~voc[L@3$  1>JPUUWTWXW[^bcgdfc^[URMKFGCA=61*%     %,6?NYht~yk^M?/    &1?IVcmxylaQB/    (6J[o|{k]M@4& xle_]\_diqx "-59;>?CBFGKKPS\dly~wuqllie^UH9* #%*+1233466;>?DFIHGC?83(! "%+.5:<@ABBDEGJILLMLNLNLNMMLFC=6-% "#  $((),,26<CFJIF?3% +9CKQQSQQOPPPROMG@7*  "%%$#  ||{}&/59:;963+'!   "  $&),17;BGLKLF@6,'4<GJQSRSTRSRSQQNMGC;5)! %.48?BGKOTUXXZZWTNJA5* ';IZbkkkfaWQF?7.)"    '1>FT^ks{~zume]QH?2'}{{ $*6=HPZchoty|{{wtpgd^[WUQJE;2$(5?IPVZZZXWTTQTTX\bgoqyy|xund\PA2#wdQ@3&!#(2HLU[clovx|||zxrmg]UKB8+"   '3?HQVYXULE8-   "'(,.--)$~obXLGBBDMVgy+=IV^hlruz{zzxuqjcXRG@80,)*).07;BEFFB<4+  ):ERY`da_WL=.   ").3352,)#!  #)027877622//0059AFOU\bdhgfb`VRHB61(%!  &6CSbq}naN@. zqonsz!'-4;BIPW^dltyyeP8! zeUC7-"#&,2=GVfv  *7AN[ftxl]QC5(urrv|!*7BO[cnv|dK1~wqmgec_``cgipw $4CQ`ly}~vrid\VRJE>7,#"'.4:@GNRX]bdhklqux}~|wpcXG8( !+6?GPU_dknspng^RG9/#   #&()-/7>EPZdjrtvslbWF7# !'.0/.($ +8GTbmzysg^PD4% '*.239;CIS]epyzn`Q?/ }qj^WLGCAFLYfw "1?L`pvfXD1|slfca`_]^\^^aagmt(:FOW\bfhmouv|~~|yrle^TMC<3'}{wxw{} #/;HT\elnqpoje`YRJE=:722//-,)*')()-069>?B@>7/ xtnprw{  &.4=@GFIFFEA?<<:66/,#yollqy'4=HOVWZXWTMJEA?9:78798653/+$ $%##!$)*-046=BHRY`gghc]RH<-!  $/8BJOSUSSPRRVZ_eikkhcWL<+zcK;,%!$'1:DPZdmx$,1474410--.28@IU\gnuwzytoe[K;&~obUNIHJLVaq*>Tfwvnc]SOGEA?>;>=?@=>961(# iSB3*%#*0>M\n$19CGOQTURQLGA:3(" '+--*$ )9DNRWYVVSTQSTZ`gpy{vtoie\SF4"qaRG=73/1148>CFKORWY_dkr}"0=N]o~~jZG7#vnd_XVTVW_eqy "4K_vviYK8)}zuwv{|%.3797642-,'&$!"#%&&('&$#!"!$'-17=@FILJIA;/%   "%$  (3<JUaisyy|yuoi`ZTLJEDB=:4-%  +2=CKPW[`deijmmpoponkjfa[VNH@:3+%"3AOV_`b^[SLC;1'~(3?IUal{hU@-  *8BOXaiptxzzyuqh`VK;,{wwvx{ %5AP[jt~yqh`YRNKJKIIFD?;4.(" "#%'(&$)0:>FJKNQOQPRRTVSURPJD:0$ 4Od~{qh^ULA9/'s]E/ $>\{4Kcvzrlge``]^]]\]_^`__\YUKB4%mZF5+# $/8K\s(BVlsja[WQNHD;4)|j\OA80,(*0;FYl".8AINTX[\a_][WPJ?5)   )5?MX`gike`WMA7-    +6ALQWZWUMF;- (7DQZchmonnlie]UH<)zeP@0' "&.8DN[eqz $,6=IS`iu|yhS># zohccekr| $*0133,' +6@BHEE>93*$   "4BR]ktyzfN8"uj\RH@62-**-05:CJU]jw-@Wjp]L9'vjc[VQKIEB>=8744561 "+39?CJOTY]_^\TMA5(  qaRF;6/.*''&(.5BRi=Uk}xh[L?0$   +:M]ps_H4  0>KV]dhkkhb\TI</! #&,39DNYerreQ>*sh`WSSQRSX\bgntuy{{|yzzz|| "4K`tn]G3~zvwy+B\u qWA*ythbXQJB=8610-((&&'-/61# $2>FILKIGA<4.% (1;???:61,'%$#$&(+/48@HRYdjsw|~zqfWE/ #*/6<@FJKNMKE?6)  /@Tbr~{upf_VMC8,#4BP]dlprrnlfa\TPIE=92*$   "&,16>GS_l{~p\J4}yyzy|{$.9?FINOSSVY\`chknpmkcZL:'{rgb\ZWSSSRV[dn} -<IQZ`elt}rYD+~n]OC60)))/6?MZj{ !'-278<=ACEIKOQTVYZ^_^^[XRH</!!/8?CEE?:4+"  &.3<BJQX^ehllid]UK=3%  {qha\WWX\ckx%18?CGJKOOPQLKEB;71,'$!!(-2465.(  &(-.0-'  (/0210,,)))'('%}|z}}!7H]o~rfWJ9,zsje^WSQQSYcn} 2ARbrl\H7"yi\MA6+$ #&/6BL[gy 6H\o~m[G7%,C\toZC.n_QGB@?CFMT]ejptxxz{z}#1>N]mycM7$ykaUNIDFIPWcm| ,=N`pp]J3{l`XRNLKIJJMLORSW[bhqx 2CWizlW@- %1;GS]hs{~xodXI<-  #%)..//+(${tnnlqx%6HWbmt|~}yupjd_ZXUW[\bfjkkfaXNC5)xtqnory !$&+.131/.,**,-48>BEEA:2%);LY`ghfaYPD;3*%##$*/4=AJOV\`einpstsrqnkc\QC2{vsqy  )/9CIPTXYTSKF<5*"  #,3>GU_js{~xsh`UJ@80("&+0365452212310-(   &/:BLQX]_babc_`][ZTSOMIHGEGDD@=50&"  $-3866320,,**''&!  $%&$!    ,8DPYdiopqohc[SKB91*$  %+-/0..,*&#  %/9GSdtufUH8,$5HWjxyocXK9*ync]WUTUWY]`dgmpw|.ATdviN1 "1BSh}vV8lXJ<2,((+3>;:8430/*("(4@LVZ^\VM>0%3>DHFC>:5321334532/-+&%#$"$#%#%$ zkaZXZ]fp}"4ETalszyvslhdba^__aaccca]XQLB9-#tj^WONKQUam~ $-29?AEFHFFCA=:4.%    '6@MU^begdb[TLB:1+%#  (/8=ACDDBCCEINSVZ\^^YXSPHB:1*   "0?MYaglhf]UG:,$4ANW]a`a^]]Z\[]\[WRLB8, (17=?BB@?<;887789<>>?@;7-#tmkfhins{ +49:96/*%")/6=AEJHIGEA<60)# '3;CLOVZ`fjorvxutpmd^VLE<60)%  %).0377;<@AEEIHJFGBB>?><@?A@;:40(#  '*.)' !.:DOX`bcaYQE8) "'-25<@FILLLJD?6.! !(+27<CHQV^dfjihd\VLD91&  /=NYdmtyyzxwvsrpnie_TJ>. "3CR_ju|~wskaWK@2' wromqsz.;CLRWVVPLB8,  '6BPXbgillmmjigeb][WUQPKIC?92.'$  xpjgfcfhmt{ "*48ACGFFD?<40+$" !##)+022421.(# zvtvx 1ANZelxxnbSG:."~umiedcfhos{!6G[lz|paRA3%*CZrwi]O?1" '2:DIOPRQMIA<2+ #+28<AFLRW^fipsxywxtrlg`VL?3% '+15677621.---/279>>@=;61,&%   '.6;ADIKKNOPTTW[[__bbb_]WRJB80'#  "(+*)("    "+4?FPU]abedd_\VPHA81("   ##%$#$#$%),.12421-&  zojefhjpvz .<JR[`eeggffeeffijnpppole^SF;-$   '-6;BFGHEA93)$ "&'%!%-066852-+%  ,;GNU[\__`]\Z[WXUQNJD<0% ~ #0@Qdt{m]N?/qdWKD=987=DMZgy 5JavudUC5& wi\OE<0'  );Sl.E]s}p_L9& )<N`sxgWI7(vpmmpuz&/7<@CCCB@@;;760+# %4CNX`fjjmnortwy{zzvsmf`UMC:0$$%%#  "2BP\gosvwtsmib]VPGA93*$    "%%),/4477655423379?BHJNONJD;1" #)37<>>>=84/& #,4>IQZ`fgifd^WQH@80)#   "$""  '7ES`lwtiZN>2&}yuuw{!2AQ\hty}xpfZJ<+  $)-39@FOU[choqrrlf[PD2$.<KS]aaa_ZUPJGC@=:4/%}usposv~'2<EMV^hp{wk`RF9.# )17?CHKMOMMIF?:3)! ! "!""%%)+/168>?EHIIIHB>60& &4?KUZcgnrtxz|{yph\L=+zsje_ZZY^ajr|0?P^lwzskd]TKC9. #)07BMXfrtbO:$ ~yvppnkkmqu} .=LZerz{mcRB0 $,4?HSYacfd`]TNFA91*#    $%%$"     $'+18;ADIKJLJIIEFBA<91+! #%(*('$!,9CNT\cimswwywvqmd_SK?6*"  &2<EKOQQLH@90( !&-/32310/,**&%""""'*/38<=?><72,"!$)*)'# %'(&%   (2@N[kyteTE4&   ")/49:>@BCEGGIIHEC;6.(! "&*--012467;=>@@@@:72)$ )6BO[fpv}~|vrjd]TME<4( ",49?DINPTWW[[\[YVTMH@6+"!!!(.69>@?AADEKORX[_^^WQE8'%0;ENW]aehlnqsrrmg[P?0  #)*--/.0/123448;?AEFIIED?:3-" "'*,.0459;?@B?>5.#   "&*059;=>;941-)$ #"$   &6DUbq}|ri`WNC:0'"3CP\ckpquuwxxyyvtnf[L<(->Qcu|qdYN@5(  %)-,/..,,)'% ")../..**)(),,/01//*("#(/49;;:73,&#.8?CB@:3*  %$&"  ".=GU_lwyhT?*~}}{}~%/:EMW^fknqqqolfb\WQME?6." +7DOW`adc`[VRLHDDCCDCFFEFEECCA>=;9:899751,$ ""$#$#$#$"  $).38<?BGINRX[bchfga^VOD;0" %/6;ACFGIIJKJMMOPMLGB:/% %3=HMTUYVVQMIB>;96889<>CGIMOQSQRQNLGB;/#|vuswz !!  $&+.0//+)"   "&&%&#$$!#"##')*-.../,,)++,05<CIPUY[YVME8+}|xxvx{  (.6;AGJNPRSPOKE@61(#  $)+/10/.)(#$!#"%)*/02232/.+*($" *5=DHIJGF@=7/( *7DSesnaSH>4+! -:GPV]`becdcca_YVPH?5* '0<FPZcmt}~wlbVJ?0%  !'+178<<=;940)$   #)059=?BEIMOTW[__cab`ZUMF>3+!  %-37<=??=<:850-($ &5@LT[^]\VRJE=:442549:;<;;863/,(&##!!     %'***&%"  "#&('('''$$$%')-06;>CGKNNPQSRUTRPMGA91& {qjgdfhmsy +19<ADGKOV[diqwy}~}zuoeZNB6' $-7CJU\dinooljd\ULD:3)$  #-18;>?>?>==;<::8641,)# #).59>BBEFGHHHED@=51)#  ",06687330-*('#!  )7CMW_fhklgd[TI@3) $''%" )4CNY_fije`XMC80'"  #(+01322.*%   #.:BIOQUVXWYXYYWVSPKF@93-)%%#%(*.27<@CDDC?;2*   !*07>?DCEC@=92/*'" #1>KWclu|zqhZPD:.% '3>FNSWXYUSLF<6*#%,2;BJQX\`c`_[WSLGC?=86311/0033551-'  %)-.+'"")/4<AHNUY`egijhe`[QKD>:63223121200+)$ "$)+++'&    ,5?IQY\_]\XPKD>81/**(%$!   %).47<>@@>;851/,*(#!  !'-2;BKR\ckrw|}xupid_YTLE=1' ~{xyz}&07?CGGGFB?:82/(%  !).3451/)!  '+157;<=>;:9520)& (4>IR[cgnquxz{~zuj`RD6&  $,.1120-,)'# '(+*+)'# %19CJQSURRLG@7/(  !"&&&(&$!   #(/6:?DCE@=6/)    !###"  (+02545422/.,'# $,/6:@EHNQW[aefjjkieb\XPKD>5/'  %2@O[hs{zqdVG7& #1=KVakqy|yvng[O@0 &+0378<>@CFGHIEB:4( &,37;>ADFIKNOQRTWVZ[^__][UOE</#vlb\USPRW\gs %+047;=@CCFEGEEBCA>=;;96532/+'#%3BN\epw{tld\RKB;4*##,59?ACA@;6.'!  #()-.249=AGKPQSROLHD=92-&     "&+/14699::987662200-.,+,**))&%!   &.4<DKPUWZ]\^]_^___\[XQMF=6+"  !$(,157<>CDHHJFB<5-# #)-4;@GLQUUXXYXYYZ[ZZYTNF>1&  !!    &.46999650.+)'""! ""'*16=DHMNQPPNJGD?90)$(-.0.+(#   $0>JXcluz~}xtohb[UPJHA?:61+%    ",28=?ABCCCA?;82)"&0:BFLMOPNNJHE@>961.*%")3>FNTUXXYUVSSQRQPPMLGF?;2,"  !(28>EJOUW]]`_a][TOH?8/)" }zwvx|"5ETcnxvnaWK=3(      &4BLY`jpv|~{qi]QB5& )5>BFED@;4/&"    (3;FOU\^baa]YRMC<3,%!   ! #)+,+''!!%(,0156:;>@ACDFDEB@:5.$  "%***)%!  "+6@JS[`fhllkgd_ZTLE=6.&  #+19?HOU\cfkloolic]RG9'~|{|~ #)39DNYcmu|yqibYOC7'zyyz $*/1210,+))),.48:>>=<5.%*2:>CDEEBA>;941-*)%%" !  &3AKV[]^[XQLC<3+#!.>JXbkrvy{wsme[PC5& !&(**++))&&##&+/369:;:63-&   #-7CMW^ce`\TJ>3& $,19=BDFEEA;5-%&*./23234689<>BDEHJNPQTTUTRNJD;3* !#$"  ).58==@>=971-(!   )3:=@>=74,&  "').14477777431,)"  "&*+,+'%      +6?JS]dkosussolg`ZRKA7+zyw}  %+.36:>>ABBB@=93,#  "$#$##$#&(.49AGNQVVXVUPMIA:2*  "(/369740+"  ".;DOX`fkmlkfb\WRPLLLNNPONHD;0&}||"/9>BEFDCA?<9743110-,)&"  #,17;;;973,(# !$#%#"  !*27::94/' (;J\kv{reXH8'&*/3466756578=AELRY^dijkie]VH=.!wj^VNLKLS[jx"###       #"$!        %*36:=<<;63.*#   $*,02310,'! !)08=CFHJKKIHFA=60&  '.47<?BEFHJLNQUW[^dilpsuvqmf\RB4#zrjgddejpw #(,.12433/-(%   *29BIPU[\`__[XQJD<6.("  $*28?DEGGEB>:60-(%  ~#.<EOU\bdhknprtuvrrnkheb^][ZYXWSPIC9/$}zyvwxx|(28=@BDCCBA@=;7753445646431.+%  ~tkgdefinu~!*5=EMSY]cegghfec`]ZYUURQPQOONNJHA=3,   $(+--/...)&"  %,26<AFKLPQRQQLJD@72)#  *6AMU_elosssqjdZQD6' $3?LVajpw|yumf[SG=0& (2<DLRRUSQKE<4* &1;BHKMLLIGB=70+$  !+7@JQWZ\\YVQIB92)"  "&'(&" }{{~ $/8?EFIEFA@>==<@AGKOSVYXXWSROMJJGFA>92,#+8CNZbls|{o_L:' ):K[jxzo`TC4%  !$)-057<=@@A>;50(#$%#"  $(()&%  ,=JXakpuwwwsqmjgb`]ZXSPKGB>83/+&#seYOFDDELUbp%5FVcq{{sh`WOE@81+&" {wuttttuw{'?Qfu}qdVE5$zrjfb`bglv'.59>?BABA@=:4/'  +7ER[ekqtwuvsqke^XPGA82)! !,2;BGMQUWWXUTOJA:0$ *7ET_mwyrlc_ZWSPKF@92)  #3=JS]bhikjgea]XUOKF@:3.&  &1=FPXagnsuwxxwwuplgaYSJD;5/(#   &*-//-*#  #-7CN\fqw}{xqmc^SK?5&  !(-37;>?BBCCDDCCCBAB@@>;940)! %)14:<?BBDFIMOUW\^abb_]YVRKHA=7/)    %)/4:@EJMONLG?5)  "(-134520-+)(('''&&"  "'+148797640/,*&!  #*29AJQ[eltz~}xoeWK;. !).356564565798;:;<988553210211201.-'#   $%#"    #),26<BFLRW\^__]YSJ@5($-6<BGGHFD?<62-%   !%.6@IU^fouz}~~zvoi_WMF>60*&   &-6=GMU[_cfhgfd^YSLD=7-("*6@LWclxvkcWPF@:2,& }tnidbaeiq}#4AOYahmqsrqnkfa[RLC<5,% %0:FOV^ciknnomifbZUMF>6/)#  ',259<=??@?;840*" (2@LXep|ukaVME<81.($ &.39=?BCEEFFFFEC>:4-' $,3:?EJLPRTUTVUUSPLD=1& !(-36;<?@???>><;862+$vrmkkjnry ,>M_o}th]QE9*}{zz|}#4DS`lwtfYI:){skfb]]]_bglt|$,6AHS[ekrv{~~~|yung_XPG@:4.)%    #)-38=@DFEB>93*$  !"   $-7@DJKLJFA;5/*#   &*.0123558:?BCGGGC@;3+! '09?EHLKKHC>91+# !)3;EMU]elqx|zrhWH6#%+28@GQ[eox{ri\RG=1(uqkjijnrz !*5=EMSZ_ehmnstx{|~~}|yslcZM@0!%09BFKLLIE>7.& #*06;=CFJNPVWZZZVSLE=3+"   #*,/0,)#     "*/24644342325588;<>@@ABCDDFFHGHGCA;6.$ !%&()))&&$#""#"#""  *1:@FJNPPRQRRSRUTUTQNJD?72*%  $+26<?CDDDDCBBBAB@?;50' %.7?HPX_hmux|}{wqmgc\WPIC:4*! %*04576631-+(%###"$$$%%%#!   !(.5:?CEHHIJGFDA>84.(!  %(+-/--*'!  "%(++-.02469<?>?<92*!   $+.37<@GLQY_fkrvz|{ysmdWK=/! !,;JWguvbO:$zuolfebaabfipy "-7@LWcoyzm`PB3"|}},9CLU[bgmsw{|zurkg_XOC9-#  !&*047::<;:7520.+)('&#"   !$&&&$# !%(++-+*($!         $',/120/--**'&$!  #-6AHPW]`dgffca\XRLGB><752/+'! .:FPW`ejmoqnmifa\UOF>3) #0:FQ[ckruxxxtpje`XUPMHE?:2*!  %*06>FKSW\\_[XPH>1% (5AMV^ciknnnmmlmkkhgb_WQH@7-% "(.4;>BDFGDCA?<;953/,&!  #',07;AEJNPRSTSOMIFA>9720+($    $.7?HNTWYVTMF;0" (/589;<=@@CFMQW]`deec]XPIB92*&  ytpppsv{ !$&),.26<@EHKLJHC>6/%  ""%%)+038=CJNTX[^]^[YTOI@8.%~{{|%-2:>AEFGEEB@><852,'(1=HQ\enw|~sgZL?0$ }xyy| !&*-.0//.+*(#!  !$(*+*)%##$%&$$!   "#%&%&&'(+,014342.+%" $,1489963.' ")07<BFIMOSUXZY[XWTROJHEC?=851+&  !+29>DGLMQRTUVTTPME?7,#&1;GQ[emv|xqh`UMC7.$ ! "#%&%&&%#! ")+/01110002459;?ADDEEB@=961.($!      $)17?GKPSVWVVTTRRPOLJC>8.&   !$##   %&*+-,+)&#    "'*.135665431.,(%   !%),01556564320/..---*(&!   "!""#"""     !#&((*+-/02330.&   "&*-23686630.*)'(+-39@GJPPQPKG?9/'  "%),..//0-.*)'$"        !-6@FMPUWXYYZWWTSNKGB?96/)#   )19?BFGGGA<3-"+7@KRZ^dgkloqqrromgaWNC5(  &-12432/)&"   *26;<>?<:6510/,-.033678653-)"         %.7?HOTZ\_^]YUMG@70'! "'+/24778888640-)! $-6>EKQSVUUQOJC?83-(" &/6;@BCCBDBBBBBAA==9841+'! $-6=DHJKJIEB=94/+#!)057:::941+&    #'(+,++*)'$!  $%)***'&"      "$),/47:<>??@@AA@A@@>=961-(#   ! "%(,00345440/*%  !*5=CIKOOPNLJFC?<;8:8::<=<;973/*%"     $)15;>@B@@<930*'   #&(*++)(#!  #$'()*,/248;>@CCED@=95.)#    $)-0223210.,*)&%#       "##$$$##" "!"#$#"!  '-4:>BCEDA>950*%!  #+4;DKOUX[[ZVSLG@;4.("  #&).16:<??@=<941,($!  $'**+*'%!  $(,028;>ADGFGEC?82*#  #$'(('%#   %+025686763200/--**($"   !!""#"# %-4<BIMRUVXXXVUSPNMLJHFC?93+%$,29?BGJLMJJE@:0) "(+.123533310/.--+,*+))(&%##$#%%''%#$ #'*-/..--+'$   "&)+-./0./..---,,*)&#    %(-2376742-)#  #&%%#"  $).23442/,(!       !#$%&## #,4:?ACBA?:63/*'" (3>GOVZ]\\ZWSMIC>72+"    !"!#$$$$#    &*0468;::9664433010/0.-*(#      "$()+-/033789;;<;<997753322123231/+("     !%'+,//11121111222221-+'#   !%%'$# &/4<BHNSUXZZZZXVSPMFB:3*"$+/46::;;:963-)" &.28<@BCB=:4.&  $-49@DIJLMNNLLKJHEDB@=83/'    +7ALU[bfihheaZRI@8.& &.8@IOV[^aaa_^YUNIB:3+$  .<KXblry|~~~{yrmd\RJ@91+%" .8DJRTWWVTRNKFD?>:750/,)% &,38>AEDFDDBA@=>>ACEHKKMLLJFC?:4-'  !"%-1655/*" %*16:=;;95.("  $*18<@@@=:4-'  !!##$&&),/346641,' $,4:@EHKMOQPRRSTVUUTPOKD>6/' "(-0220/+%!     &,058<=?@@A>=:72/(%      (,26:;=<<750,'  #'-15;?CFKNOPRONKEA;5.& #&,148;>AAA@>;83.*%    ""$%%%&&'&&##     !!!   ""$&%&#"       " !!#&)*,-+*'$!  #+3:>DFJIJHHDB?:73/+%! &1:AHLPSSSQOHD=5-"  !'+048:;=>?@?AABABB@??=;963/,'#   "$$$!     %)-04588888889::=@DGKOSVZ]]_^]XSKD8.!   $(.169;>?@ABCAA?=950,'   "'*,-,+*)(%#   *8ER\ekqtsrokf^XOG>4+   "%'*,/355662/(   #*.357530*'!    !$(())&$  %).033677::;;9952.'"  #(06;@CFEE?;4.&  "-5=BGJJKJJGFCA><98510-*'" !&)-/24456651/*%  !'.38=?BA@>:61,(!     !$$&&'&'&'&'''(()*+++*))&&#!!  !"%&'&%$    &,/489<=@ADEGIHHEC?<81.'"  &*+-..--,)'$"  #-6=DJLOPQNNKGC>93,&     (.6<CGILLIF@:2) $).158;<?@??=<96/+" &.4:=BCDA@;82-%   !&*,0100.,)#  !$&&'#"   $+16:;<:941*$ $-5;@DEDDA>961.*)'$$#"   )/58:<:;8750,&!  $',...+($   %')+++**'&$!    %*29?GNRWYZWSMG>6,$ (2<CJMOPNMID?:3-$  !$).28>CHMPPOMID<6.(!   %-38@GKQUYZ\[ZUQKD?60*$  "(-14788641/)$   "!"!! !   ""#""   "#()-.2478989996631-*&   ""##$#""!""%&*,/0235522.+'!  (,16:=?ACBBDA><;84311/001214330-'!  ',04342/,(%"! !"$&'*,/124442/-("  ""####!  !"$%&&&%#   ").3688761-'#         '/6<@CEDB@;6/)"      !$*/38<BFLOSTVVVTOLHB;50'!  %-39?CDEDC=91(   (06:?DHLORUWYZ[ZXUQMGA:0'    "'),./11343320-*&" !&*,//0.+(#  #*17>EMRY]aeegfd`ZTLB8-#  !#'),-0022211.,'#  "'-29>DILPQROLE@6.%  $),048=>BDHIJJIIFEC>:51-'" }~*5@IQV[]abcba^[VSMHA;5.,(&$"!   &-48>AEFIKLONOMLIFB>;52.+'$   &,056:<@BEGJMOQQRQPNJGC<82,'  !&+.224454310/,+)'$#!  !&(,.1344320/,(%    ! "!  !&+/010-(#    &,159:;:750,'     ""$%)*/47=@EHKLLJEA;5/)#  %*048<@DGMQTXYZXVQJC:0% )5BNZepz{tjaXNE=3+! !#%')+,/1346541.)$     ""%&()*)(&$       !!     !%),16<?FJORUWXXVSNIB:1'   #&&'&&$! ,9ER[ejoqrqnhaXNC9/# '1:BJQV[^aacaa\ZTOHA90''.7>EKOSVXYYXXUURQMLHFB>73,&   %&))*)((&%$#"    #&)-.014699;;;;97520.)'$#       %*-258;:;972,&     "%'*,.1233433220-+($       "%)+.//.-+)%"   #&)+,-,+)%!  #&)+./12557888:9;:;:;:98752.*&!         !$&*++,,--/0134688::9843/,)%"   %+148;>>?=><;852.+(" -8DPYcksy}~{wqkb[QH>2( !*6?JRY^bddda^XSJC;/% !#&((*,./268<>BBDCA>95.&   "&'*,/14477742-)!    !',1356741-*%!        !&,27<@DFIHHFC@=84/+&"  #%*,0101.-(%   !!%'(+-,../-../1224442/,'"            ""##   "$'()((&$!#$')***)(%# #+4;AGKOPQPMKGDA=;842.+&   "'+/45:;?@AA?=94-' !)18@FLQUZ\_^`_\ZVRMF>7.&  !%(*,.1120.+&!  #(+/25888777554431100--*)%"   "&'(((&%$!  #),0345542/+&!  "%)+,,+*(&#!  $*.2679986620*'!  !%)-/2234210--+*((%$"   !"$%''('))('&$"   #%'*+-./102222.,(%  !####"!   "'-144656531/-+'$  "%()+*+)'$  !"$%'(&%##"   %(,-..-*($!   #&(+-000/-*'#      "'-1589::;9761.*'#     "',26<AFJNRTUUUSOKFA;5.(   "%&'(((('((''&%#"  !"#"!     !'(++-+*&$   $)-26:>BEJLQRSPOJD?71)# "%*-037;=??A@A?>:852/+(#    ',04565521-*'#   $).258;:;:86540//.,,*'$   "$'*-/358::;:9752.+'#  "(/6=DIMQSUUUSPNJFB?;840,)#   !$'()'&"     !$'+./223322111.,($   !#%&'&&&$#!  !'.37::<<;:740,'%        !).279<?>><9742/-+)(%#    $%(+,./11333330.+*&# "'+/246676541/-)&"   "##$%#"    !$(++./01134669:::9851-($  !#%$%%&%&&&$#    !!"##%&())(&#  !#%'()())&%#!       !#&(*-/1358:<;;8730*&           %(),./03568:==>=;840*$    !%&(+,/12321/,($        %*./2345331/.*)(%#    $%%$     !$(),,,+**&#  !%'*,-.,+)'$      !!   !#'*.1589;;<:74/+&!  "&(,-0/00/-)&"  !#%'('&%#!  "%(+.13566531/-*'%!     "&()**(('$!      #$&),/1468897640-'!     "#%%&&%%$$$"           ##%$%$%"!   #$')+,,,,*)%"    !$$'&%%#"   !  "&(++,,*&#  !"###""""##$#$%%&&&##!      "#%&&&#!    #(-157987741/)%    !$&''''%$"   #(+/3577740,'!              !##&%&'&('&$"      !#$&&%%#!     !$((*((&$!  "$%%%%$!  !$')+,-./.-,*'#        #&)+.00110/,)%"  !"#$$$""   !&*-258;>ADEFGEEB?;50*#        !$'''&$!          !%),/1121/-*'$    &*.23679;;<==<:863/,'!      !$&()***)(#  !(.49>BEHIIIGC?94-'!  !    #&')**,,-,,(&#!                  "&()+,--+*((''&&(*,.02120/-*&    "$%'''&$"    !'+037898640,&!  !#%(())''&#    !    !!!     #%''(((''$#   "&')*++)(%!      $&(+-/022221/.*'"   !#$$##" !&+/3456665544320.,)&"       "$$$$$#   !"#""     !#"!    !""#""  $(+....-,*)'%"   %+058;=>><;8731/,+('%#"   (.5:>ACEFEECB>;841/*'#    #%'''&$"       "#$$""       !#"#"!          $&)+-.//..-,,*)&$"   !$&(()(&%"              !%(+.0234454431/,*($"  !%(,.00100.,*(&#"  "&+.123321.,(#   !!!   ""#"!      !""$##!    #&)+,-,-+*'&#!  "&+.3589;<>=>>==;952.*%  !%(,.024554320-+'#    "$')+-.02122210,+&"           !   #%'())()(&$" !$')+.0110/,($   %),/122111/-+)'$    "%&(*)*))'&#   "$$%&&%$#!  !!!             "$$%$$"!   "%(*-.0233443311/-+(&!  !"##$#!   "(,158;>ACDEEDCA?;73/)$          !#$%%$#   "&,/3689:9:9752.+&   $'),.00210.,)%   "',047:;=<<;8630,'$  #&+-01333220/+)%"   !#$%%&%%$"!       "%%&&$"     !$'),-.//.,+)'$"    !#%&'))*)('$!    !%)-0133421/,*&$      $(+-./0//..,,*(&$"        !#$%'(((('&%#   !$&()++++*)'%"   #&+.369<=>>=<961-)$  !$'+-023432/-*'#  !#&')*+,+,**('$!  "$'(*++,++**)('%#!     $&()*))(&%#!       !#$&&'''&%$#!                             !$&((*****)'%#!   !!!!   "&(*,-//-,*'$     #&(*+,,,*(&#    ##$#"   #(-0468;;===;:741-)%!          "%&'''&&$"      ""##"!       """"!!!        "$&&('&%!   $&()+,----,*(%!  !%')*+,++)'%"   "%(*,-////..-,)(&"                "#%&'''''&%$"     !!#$%&%$#       !#$&&%%#!       !#$$%&''&%$"               !"""!        !$%%$#"!         !$%&'&&%$#!                    #%')+-.//000/.,*'#                                      "%(),-/01010.-+)&#!                                   !"##"!                        !""#"!                                                                                    "#$$$$$#"!                                                                                                                                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/24Ride-5.wav000066400000000000000000025337061366722712400223230ustar00rootroot00000000000000RIFF WAVEfmt DXPAD dataƧ $$ "!#"##$&&#&#(%&)#'#'"$"&"7p5d0O6ټd8 |}\MbX 4>O < *sd79vԥDܿkrA)W .Esc ! ?qIO ,  <( c q}K?'.~7O2 Bc-(k&b{ rTվeՐ%b0:+ _z' $܉@1) p_), _{ lS  i<9(4ٲ$4 ^g<</2v$ۻ?=Y)u! 93NpAF 2vy% DD6IV F2 . f ]{.;+$$*)J {"xc~S6 q@2ܷ |pBn LBЦ #  ܎% > Ca}6M"- % k gzz1o)2s[/-5rCyA Xfٚ $qK i"5VC   ] ec _s* gA .{vo z, XEl  w +v + mn'Ci  $ "r 7/ #DYsR[~z,$W-QWطMN2PB@^ 0 x m+ 5-`}1 $G E M  = 5qw /;Sw{DR*r ]S. 4%P' %J$QBtUNP 0!T|C ,{ YDrh?:A; ! w@2^|wXT '@Z $Q ?*%j&/| `eGt p(gz{{CY 7nfCv`A!SE;io| W( ;r { *BJ4 . (5 |1Y 1Z rF`\1j VC$Xl3caoE'z4zS9u HWn{ 4 S @!tl' !c,$",, & |J \ X-!01 |Em! BH8ue֞LBA  \E0 :  ; YaQpe q# o7r @?M DTdW !gg']|m+$#M,`:A\G1| 5b$NZF\8oT.IV r/ Q q'gO#c2%8 3t41O}\ xT~K$d c Ay0t_.Az@t`unsJjqO# ) s8 6cq!z9m4I  I0ۆt c;vu'-Sy;R  -y<p *O - XwD>Go#J g|, W #;]%T W~%:) 0v [C *^7M >> # q*8 Q( ~zxK ~/0@oV]O) 2 s\ nV  `' Pjwzswo hx LiM#+$oZ8m|gpX1: >mZ Q`"= k  E4I DC($i. E A47 ^nls ` uj$M  W&^/1  ,D2@WOqK4<%A ޣMCڗj]0d}\ ej+ 29 X J   ~ seJ 8)SmMEE9 'nv vf W9Q w#cj.:%S;#{RAb RY_Bl LM mvzh  0m Q EQweh 0~UZ 1w3g"t0\zPMEu#k2  <3 /yH s[MDe J|-$ [H $]$W[@A~j M+T$ P>^ 6 et ;(  * zkk6 yW.nu ;FOBJ- |F Z` y  FN| F@ d_UM'0PlKqW6+S\8e % #  \ _S7tTh I pCtZYs;E/ @( z \tN@kjd T_qe^ t d t|H7gc  ?:w3 e_~KFx-(P2){aga Hxl I @I0 #s 4t K=_B6x,a%I 5 E1!dfL,X J~Ba iu(gYhs{+1-6 @ l` <* < a ^%#yo Z TCFdE  1J5]Co@d slr Bs 3|Vv  C >>i u J ' UA# }!(Ct xf Z],P" o   1_ = ";]3j5(c?{`W{ 1; ? }Z=T c  6; 68,V^tI h9 E T_# i| 586EpY :l eE@Y 8 b bT*  n^  A*}JV N  d =k&8D|54j$`n .F  K  xL:\*u z( 5 & byb) ^ +HMV 9@e u t q//2 r|uel1;Fof8RTr H '< T S  L ot -W9qo. aO& i r\= L}`  bv >p 7^ 04M.?+SftgX s/.C  xz5|~U qE# 4r t2x?G K Oj+/e2 1-;]*.a:M': vm ~6 e og9;_ OS  tv+ y5 n- qx*@{n[n> n4 T  d*ob$03A d 7k$@7L]430K 3W0~ u   ) m z 9@D-8HRUR\w( F( c&\o9( U=_%D[> F ho3 p  G Me $  y@ wTD6 iW$7.y\  t 5 G Z ~('(g xZjS*` _ wO< d JHuTbet4 <dm,]SzLv)b 6>R  Y[ Og  Zp  m ! )W%^ FLk7FOX.*K  >P Ko#G)|2cGAqF%@h8ncC}ric^k 7   :]1 K?/-BWVU4w/ @la;^  9YQ - +{/Z o {*Ey8N._xY[{  \~n L\f% G iaz Z ' . /3q Bn5 ,Bv(d0gxq+?y jj o sM++>> , wT d V' w{l) 0 | Ik  _{  s  6 & ~a v hM ?{M^!{n1@3m G9f/iLqx(}."&`: ~3 yep  +'Tm MXSl1\0@am P2;YKMhu3 :nL fM( ^^ xs2g.b ?% M hf@A ;FaclA8r ~= `N bx#h ]qB D P S @ Lwz$ S'@U weJ> 7   *|d  f = pe@NbD %)|4V_D%T|8(T0b~ 2y  n 2 /W m L = d" 7V(TTF .jimCzri YFDMKI4' w1 8R<sl - `Gij0!  Dv?-QFVxLo,W  ]VjJ.ey rA8;_D j  { ,YO$L$\0 `U YM$kJ DdFB.%!Wz|F:\ x p) Mp D Q Nf 2|4  LW7[m.[|. 7-1Qzis  Lm.N" G8]nE   h o UOk9G  -QF ^:(RQ%$$ VH n0 -y:7iM  P' Z R ToJ%V(Tei rB*WgI"P'r;F `aB*a%e'WY i%2ps:^ t+X})v2nj?2 i Qt'4 Lp2UisVu-#{ k"!{dW0^,IWR  Z AGAb]oK/x ]E]Xx 6x CZ| '=p_yO7S(7!)&?@U 0 H  ?|  z9 ~<  >c z:Q : `/q$38 4 F-MAE M /~8  f  p sv1x [E .{L Pf,6A@v! s1 DjR',rJ1Ij)-T(!,tG= S B%%h D/ KC%:[  bvo >+ [   d D4@GLXI 1KL>q7f    L@U ?21FgPegFoT_t t , ve @s5n r:sm"Xh*3 k} uH!7{$&J;2{=? #IV $qC#ZMj3  2U z En:@*k {`&<U*=9Hcn-D & D@B=%r h4 74'{ S zgA3JHdmns^kMGy F%J =  & } QbT'CG=} \Ur  9 HG( X^ft*z y y   QW)s\?zt<6F1QBMQwH  Hz  Lv.O>jcjSzJJ"A^.%' w ^s<# `W +hv+e}mm09$X  _% d & Vim 4< Vmc ys?/5`-8&tr}Xc)ts'yn s( ^ Z I 9He c.^?SOWIClXN LR]y9lTu^p<vwvCxM/00P7] h J4I Q \^S}0KzkuGh *5T :pB.2K { fMG\ [H C CF^$x{5/@ OMBa5KMfDa L  +-Y8*-)jD&Kq*9#{+    55;3EYdx',!;R VP*{>Vf6Fd%%sa%=+R L  t@ hGnLoh{' JX.qg11EC 7, X  $ L  u zDhwA^~}u;lOqd~re3Gni;y ] O ; u p$Pc4p6#>|N^$TO-|?a{z, \ Z tev.*[Eo x`AJ^ 8MX DL e Tx*QccO 8 q&Y} yXZ3HK  | "/YtKxE] 71KNQ:' oJNJ.TDT;w f'{ t A_m${*lx%mP wtFS jZ 6 +gs[[%d(p?87EeX]I! ~ a  cSS q _l/F >X=iP-eweG{ iwYx &q >L Y0tOPphb*f ={*~QSJ  , 4{w$1(I s {Er 3}]#6S*) fG^5W]ND ~Vw|S cXP^"|ZduO$K&}k }[ UIEa >_ Yk- Lur 2f |zs-W f[ W  io  ~]sz|e|:A?t* XLtEnVf S  ^sZ> a0o >mQ'g0GvSs _  =eYDXY Z=+|>)bNA"oB?EqO Wr&NBbYK4_-%2_^O3))AL . ;}2 A 7]/F5gRyg5t%-}sF fL~0M?8V+,*_9WI(?;A &h Emx8] 4C#{wPN~M0Hxf8ro3N)akt _HK } OH &3DS 9+_1S&  c:A\E"tKZ { 4J%cVqSSb Whs8=rFM/5j c6t.'&x ) g= @W!d >C}!H9' % jnPSklF @=qy U, W ~ N T" s  O)Ea.E ;&ViM'v3,cx6j t 2o".A4 " .hqm G{%9b^rU O * | Q1O0/]%a>Ly2Rz 28m#U".gh sq3  1(8\J< f !d+=;xnxaixfz+ tZ.AA%9bU;GIlp c ]KU] jY6\/5  q t-0+H0Ye 9h1eLnPqc 7n J k .^W@fpo9wG$)9o8K= W T"H\ rh n j  x,BRL-w 5[D pp^,i/?3} X_<?beXfGAlcr^;t!)Y9uL OD"'$RX >,N>C[{$r ?3XG$$D r   JmD@rk>uf@DdOT @ 6fyIii4tSU# d$U$*0r MF$H>"<a%DC x zU0 ]L)$vC R-4]I>W#;s-tZL _ PxL* 13O3?<  JM6\"ozQaw!"{_WL*Z-oMb+_ ` k/:,;<{/k9y N18 :u  e\ & C` CCk h?<f_pONP Q ,u e<@g/ rwJ o cY{94lL>C |; T^NLAIXZer<,KkQ.,iD4 /{U =  miCZ}Xp| lVH/B#\ZyWs"QAp  U Z,lRS]:vF zRKFh  p n  wG7Z~HzZBF f@Nw#yC%jE-N4X/ Y_KMU  kt p N@ -^awlJQl1zL9^xMB Yg\o =;>=& Fz^QaoVl \# 5 Q 9k)p !-  mU{lwM).\d:Uw #jbn  15 W_   \ d;m g Q;Z@g8OzU(X';nu#n3zyoUx ? ,bnw18  snO ] {5 31 #@oC*vb))pK6,\4Kmqx|?  rd NP Dj =h X  _iZ=7b/rOrl!h?_ewKZ  ]V 9^nI WO_;} )G+C1^#<W8Q,x: ;   3 / 8 ` :P. /o,|eSs,8XAw<7D0n:?cR  <+71~ v =  (sKP ]h?"yKdg'"r Ji:Rw w # -q W =Lo,J)+2SV!+Dc  `sqJ/$R% S . (|gz5K' <#4}~T6(Fb G  KZwA%q .tBZ3b-,.f2@XI-EdG^:Nm?4 h^vP, nS {a$1v4WdbhCpa }u^ ( [ l8y=, N)ab~>gY}%$O6 | w;Z%(v6<1j.$( " ~bMj{o MO_tC / "N &UmU?a m9rI(W ]@ =WDeNB xz>Un: Q kkOoj:#BQa] TK;~. g Ph0s4:$mB[\' * $`#Nd4#9 7~b9&rjk kd NzcB ^ 1\r N33Viww0r"<>2s k[Y$PY?R<^ H R5 s  mQ4)kw P 9t|z{Fr^+hwo5|7OZ!  5gi:Yw iOZC]aH ,Hh"W5t@^R39]>o )Bc9$-SXD.4"PPb^zp*4  C %m+ Am aTE1d|/.R!4 F . 9  B FL^  t7/IPhI/\/m({y1%USD V  % 7` &- }Q'2f(g&J#5 Z&DjPP7 7 1&|_F<1VaK/9v,(IrzvAX]p 2jW I u = _m,3zG]'x"2m|FpU+$ "w7 *= bd*B,<w "},T|f$GjLr*La[|:o{L"$o$z N=dd TY_JNHdC]r=E,} |v&C"MLhKR  h a--~c5yKpIy%K&h;$y/i} g K 2  sgZqT yz"7SD`;Jtoy0G ! h(]kgI?h_:!@b,:zm=\\B9Ns8n Q TvW M\c/ ~`e0uM=x`,,I)c>,{qM}`hXj $6{5Huk  [ -k~6&E4VNg.#3n%XG2 ~`4Of!=@!zx>f%RYSq;MBug?{n#U t7)+TUgRw: |+.|9X~XXj/jG!*8u 's2W0 G _lC M)(l n*EL5ydhQ:fHEnL/k+| `0, :Zc5 '">817sZ6'l*E fEk\nF7JM  UJ!;'*8NzERJ8dZ^HuXQ9 y R?K" 5\d y  {  !g3D/fp+UdD BHwzgXm_ 3 ; / 2 >^<9hy E<yq*g9A]tQANs#wR:zQpV~CJ kh7~^jppZ oh p_znt9S//0[ @J_E#Fb]_CwOS5r3"`B"[o3?,JGe)i}6qL:^%/fRYPWE b ? + AnOF 'un+xw5O;oaur]] * M@(|m%rOwc9T> \; nEbi4:YTR=Q ,>|C8O#Z2qk\ 9l <:vL1dl>K U X^= k @=SjAy  J c O)q\"fbpwv`*PCq|FS8fs>Q~ 5 O z z=~ VT#,^BCuhIc/j&Z\>q"d6) 6^Gnf*Xlq+6 e N K # 1sx9f;^a-1;;ewMqBO/>7~`S4Wyzl g Pf>$AJ,A/Y-kd}+ 2V[>8DIJk_20&,-^9$\~\kbJIX~{uzM1$ ? }! NY2)\:yCLqgtj Is$xg?od /f* u'$A ub}70*FO, q ` x+Bqo.5A' n  j!xyB*# 7gtSM -5K6$>>U;> _4Hkk#x;-?Jb1gWQeW&|PP 8?[4Ol5 l l | A7sn/(*0$V.z+{WtMuZ5 cW  % ; ` ; ; MT>GqeB f('\{'OX:H ] &  K1lF [:)hJyM ?r4x9mH:(3jJzIBnR=rLD%7U&pJ;6<O>q@?! x Z /[6Mx ~7?&Li&U~W}(:)N O @ -(> qXE[xc?;lS k D>l(! a>M% j&N<F~{rhgg$ *. Bm %*"f#i De?|9,AAA:M-F(Iw } Mc0$T x X  F5;G2+(ItUF@W OLLIK[~u7N4~ p"x 6 c2 1 Dr@zUCqU 1('$o<v 1q5 yssLdSicsm]]>O" W%8kCh r P pa"UK  &zcW<})1yXY yYBxE'I r n n?#UgWWUIu` </%"dc1@Y,8CM"@kk9Be4tGYNJw`S(\"5? bh! $4? x /(ClzQZ -8Idoz&@> *(O0cbkA4)R)i)3Em9lM oXqPTK[r4R_a/*\f39M(&-zd}?7~3vBRgZizvX'y rp<gI ] 5&jG;'3"E:2a~Qr&N{I+Nt\& .  n;'QR*hWe_{`<]vOqc Y|2;} $J5Q?F]o>m ,(rpP^0jDYVrhDg2TEg2PC/{C Y])"R/8kQOY|78tdUg:b=$z/]d L4zCP"&t8TIh>`="BBgI<nI4~kdH~9W/<Zp/7'<P@UFha ' MtXw^   oR!/MSZd>c+0mZHx%(kHEnU E 6 Kc_|]%yG0 I"X.'J_`#{a5 +M4 q 5|s puw~BSK h'/C NYhu#^okQ zqU#O:T-nLMPnk O  v B g6%yb31j$K3 ."]j?(P [u5*rg  j gx  S16>( X`]d;*Hq8?X 2lF1zoO5eM d=[~ [tb$3)s9F:6SwwNvy 3"(:TKG  X/zk}nwi5FSO6(&.vJ ZWoUcC [K_afE[t1oE` apQQ BdHSS t R _ JT 2\y+$7V6.~x+:ZZ0u|]h|CKKr  n : Sl_#z1!_'?O,-`A# ZnB:L[E pvCg:=hDg]&k_\h^oFSGn^K%T?06 +.X K\a  p n *qXK")~Q#m_e O"W+}1z58 N >  d *7] i #v&>].s2{n!Qhlbej b  0  $  BN#60o{~B{5gmcRGM:kTv (@C_W3k|GaKyv _pLW~n^L`7b(#+cc'!ilz"Tp(e54J(O 9h L\Z5&Ev#i2Rwo"dy} ~Y ,+eV p!Jmt>d <7J8E,seDf.{ /X5Yg]k5E , e[+e+gtT@0brIik{LK`*hEjLdS :[~ @:6th T(o<m .#7T>@1!>}&&1 ]ekTqf4i1dc6RX`d _N0-&d ( 4o`L[IN-T`w&oI.-J5;{{.= ( QZF[r(mZ,_hD!NYJB\ce?  7 w3Z#6u^dSBX 0}Iv )B.Y;_x g$3/-[=<Y1[S=L ( EA:c4ip!hl"Kkg\{nr$>9dgR~j`w1|qd-7-@xEDJ# wl8Nr]D*i%]*]TW{S} r#=tM74 k m:0{moZRo[ri%[| ^C!v1!t|DpDXD u X W D   f( ;D&oY; *z(Fv}^JF3-- .=:@n_'^LJ_0]B\L6m&|umb-qfZnWA!(WAS^K5B"/[{z&3Z5r4x7 " 33V%ox0y=j84J7[-z7) 9qTM)f`bzZ uvcNH(o^.Mkya"h>(U% g _7#F_/8YIU0b%/o;[cZ'{?1%3}M>.G ^YU2?w%:gH:u*6#)%'T/:q1^-F5^D5?%%JHcDugsg;r"C Qk8P  s6=k*J$p&BP~;t46$ 5Z  w !|&XIW 62WT?)57Z{K%M u@|_pG[usV}5NmeF? 5H,02WpJvVf\Hu4^^EoC`%b$tzrahI=,^ GQQ?P-Z)~V+a&EZct%}E!jyH8y:\y'mfhru#Q eiDoGH_ZbFfl><M*0Y;M( v 4  3$MpM1qX= lDMJG~;j!R L Z`4A# I_d}QrxzgCR)Le O J x J,YkB!n>`P?j=}0 # 9EG~B eWX%2 Uua RXx~GTt&o9+|)Q?;,bZH; gOzad.wbJ'-p;&  zr8Mr!j=wV*L /IEPk$i"_@W  Zj ?cv2|\h>vPX"=0h<2HT "9 ZlbMf3u q O u0| +  PK+W.zoYobG*k#AU*]o75 ]\w\MaLo_yWU(9o \3D)!FE\[c( g ><%)tZg>XL_q2AH]dR0v!nt;',h V&y;U7N[qf4 DcCv-|i62ZsU ti:Y}odF~y'$gmpfyaC:|z} s0Wdno 3eG,Ngd&>)Tb~VNx%KW5gTC;5A8~SCVY Q\6uoT{3zG DJWVM E4F7$vvtP#j(HPa)NgSD!;  x   M: 31EM{+@?@7356JV[O9Ds9 | ` =*6j:S\Gbb8 PqD6:N^Y?M?!Xdf={^O' q~<#lsMb~tKxb~z0l2<z z fqxN xcJ J2\kF#2xD\H''yc3;en%EV`N D6FutEnD75]#5nm->olQOxv'pO =D = .ip:Yp+ [_Iz sDolL";#c*GbaEzZE1r2Ms1e[kY< s nVnbLxu\uP[8'^]@A0)bksdc)=> LLfda<a`~yWI G_'1> %ckcs\"9b `*s  sD?yQ'\pn5?oxhw 'g0ez&w8}g|rh{ T[KXCUi+XFyn zN~<~NCp\733j 5c&0SM&,}p:5/U5kM pz@J=v!]yj  ~V > $  y&P,&?7"sQ3;T}1Dl.7qa `,,mhJ@So1#:\WLUo-_3#1&v'm_R6$FUB.&Svu<# %}yF| cP ]V72hF+M<L8m1uk./g5f7-NZVaiu)eNRe ]7#?|tQWP2/B\6bRnB1TV{?xX}E(nvbHrvG]9 l5aEA)Zi#$kv;jXa>2s=TlS]'{Hm^QnQ*FpFy*,Zz_VDIIrVj 0*c#?rW C+ MjIF?jOph9-1|'-$ 4m&R/ht[Y.Wg `}$5x}%+z,$p(yQEX;YcPKjj8)+m=.Gl{{a4KvEG*HUO'VdA%~s/5 0lF&4/2)kL/H=E>C`W }&"#, Q&=3c(WS_U+Taop  /;9(} 5[w#?8e+BPXAGN8Y<) K(xT*UaTkAD mO?fLF$m,, F1PX8Nr4kST1SLkbE.N=:W6L9d.myI uQ\# ( r!2 4VQk]}ubQ] |NfM &godZUb y:ylj6iw@RVLwP@.+A\2CjYded;s _RhlD,V).6^$sL02d4- eQ//b;dA7)J_8{>EB2`9>j4]'L!+R?EY`W.(*_106)UHxB~_Y?m PH\s^'*yl<c3Q)oWq,Q6}oPVbyUK#ZH:?,i*{>{~8Hlh%Rq_TE*'R{lL1L mFvi3wv 0CIWCT}%2q([a,$ 20^jl ug O & +=.>fc{U2*vdCa0?q@XKZ{/b[_?`#"b62GE*.NX9~!}2V6OXq^rnx(Su_[']K|I=TpB <6W2NdZxlZf"7 '/U*Iy!5/_ /\?%_wY;ABA:/j0#@ lK$_iQ2+=WcUWe+,Q0`>.]OIxy6wU9]4L;oKseRtjVrk*a>K\utA~kMi1[1L@rZDTqPBW5\t}X?{BlBB;.<C@ GS7urp=H_HBWv\W a m P Zm&%lSm[YialDZ;llPu.I&7R+`YJ<<-+(Ts3UyLG|$0H`%,a@aR 1\s\<y.y-Y8% O lEr"<=N_ v ]=m=C!kD  0#xOV(@%I<_*m 1 {q6j#,*_jBUK  # W D214[q1y}ia ;!fBAa cZ yAQ)y[g#&Gk@d*!`m(c'Jq\[hW^68F_bY\P/?p@$ANy-zmPw_]JOx";}ngNh{i?M-Td 7o9o95aQr((0D)aKp(!phZ?bl<,:cJ|~oM>\j+#_:\Gm0Sjk@-wT=ldOv&jnv1pY)bXy }J^r2g#/N XYP, 0vls>LAL2oV4[)%PEr;I8W u'rajW:kA=:~d|u7!:|?~p~'WRNW.c)R3ibt_K5 xLm;7ueDhKv5Bj9U0]#]@x nBY2m=u~ lyif>,:f3s ) n >[ &osmQIbC315cIvW<O,/R\xp~+8S2q/*?Du(wqXq1,d. jn7Ru lpdaYO2!JE=ceciW~X{7%b_ (xm5U!& VF`9B+!   x  o V (!_&}%Ti;9]Msz s/uxNc 3n#: 4NNSH q~q4 `bS / 4lf{O5:`|9?yg+~j ^Hr{+GU~T !4~G!mQSf#RO`lukpX|]K a:y\}c;M;Fu-&}[ .ekd\4m{PTe'DL+ +Y'(CSkMJL(Q|Nee}_~^HLOs'  #%;<mKtGs;zz6e{hY4"MByJ?gWWO!$i#!'k'9<)e.PH v@v(>uf6g(k6otv;uC a* +db6|=|#1h eLON _mXT63OKZKrjMv#=w2i-rV^wY%`uF  /`|feM?U>>(_"k_ T\bgU]j@b@@+4!RlB4m0.&XGQlt0\ 20:k)jib 5 N`Lm*r IIC48W@\k 8p{!$ zB'r mHcP "qvF2I-:%ytB>=y84w1)leq0X41cX's  rx~u+5L  v((-|  7.XdNTVBbU>m*w<&OiL>n_eYXC9aj&@p)4^iR_Bg ya EH&*} u  f 6 wGZN6aB;ne]uj;vNpDl%q>Qj^>OGf(<^l "XM&J%D/~9D>F9n6V3`wY= &`2A7+fPdQ\b8AV> oG(,>L # uq]wE 4 mcp&n,F K3b0 ZSAWWzzHdF|& \!`EkQ6 e" @h~Xcim(H3qt = u^XL?w&icPOq&t9Bu'u*'K&\_|<]U )0>8AvNQpl; ,MK UjL-zM`xpl2JGYdF;lMgC;EMo=EXoz8Di1z@u#k8 y355 j XCqu}"ezy}Vn >-zn\HhBo3@[px #R$a/UK5M kv(Y6G3/ g  foCl"27w4? )[Dd*,G(7}LD y$} d80\hE+2kqt l0~?GO9TXNe&9vZ {O:h"0$1R4Q9E/=k La%x]UZ6Ey5g!sdb+[mg_HG^8{zo8|S 0D^'`/!L5-hc/bQg0VoM G%wEP&00z?1hy*k2^hTl]Se `/w%6dkv,qG)ygte /HpNw)Xgb1H|* G ZO$ad;WW0^<SegFdN.-)HMMUm^+,YpM|.8m%I>mz>1)NSLQLu';{kpEtipm G$/")3E&1So9q[F"**:#>E5f,#$;p8Lw'f y.)"=vHHgG0Q~93 NDDW\=7h($3_ji. :jvU'mQuu nc   7 N , cl1-Wy`H:~~=vR"S hcai 5 ! 73g^ !.Az&[R#@ojt_@Ec&P@Z?sSo=dSWeN *UrfCOd\",@W)Zhh]#A! '5bFB ;n<X1,//&N5b`~YR~RuB/*A,:a0j(JQM|<-G4GX-8>XmGB&<]L0l..C (>Kc+;\^< yA1zM %tW%)6#v*2f"@`M}>&3NYj3#Q^VE*<lh#N) by<F/G|Bkth^cTd>//-;Yd!q*(On {n?29%i&[5_$)nod He4+d|\ Yw/v)e2v lQ+>a(c Sz/>p7_GG:{x;n?n%j :2ZWn"qy2Z@1f3!6@(]LDDl2`f6>m k;hionB~6D|!_]o1fvB+KMy_=XZB Z&*Y.LoVpA%,b&6X~.M(BH;L M&MH?L?yPr{.Y0T(=fcDO\GX~~~2@cQn bG{a\Gh  oJ UYB0O(Sk mn>r`I&y>my6PpG J 7of7^w|R!)FB|Z aRzEK;g)[e'F){=_qC\=H=!o$>>i<d8D*hu<:xIA2u6NJd]F- J q$*a`P3D(O -n- L D,FT I+O4}tZ  fazj|Qh,HVr&J:<UNx,=e{yO*`0Qn8Y}i"gJ  [ OFz(1)<{ HIL o JUTM!|>H^>u]U_MCQ1XY<x 1Y}rVE nK:eO6 dmO'kDM`S}bU1(-W   +:SAmg!P2.)zvh_6M[/lHYDm*L')@u>09xIx $yIT0(/ ,FD2  = e%\ 8JjTVX!^m.P's=3|{e1 8D{~s'Z{1zA> rcp }VI Lr9_Jq[<;t#m<4EUT$  ! F{Y%C3';A }8',QBTGPqVE`)p:]Uj+\vm]RW'>WREkPoH5+C6Gi&80R(m4$^g km|xO (vYHIXfm39ju;7Chn(HO?):im #)\).3"xj;,H%k:\h_ eNn &5k*/}  4>"GUjl~r^4l6hc0U+\kl`pK0P;LIX^V2sHp#b4< X#[=:5XD%I ,"Z:X.zf , Ek!=f2M%9Wd?Q lr//~`X,_;q KmAXR*t@a4O(;nSp;E,ya[M.)+=b }puUpbP,iDhX-l (?XEe5vAyuTH?9QuKS/Jv6vcy< * pL[; nV\zjNOzO-8/nBy}Hn 2j49Z^rq h\a_\2:,eNt`L f% EBuG7U2t-6 3R2xRj/~7@_/CzS^5dA]e9+imNB7bl@2d2Q8<Q oZAjY{=3R_*9W88F)18U3z[LH1Ml%(N"I''%=Oxb-'J`7\ko)h^5ds`]W ;/ ).H<:K|6;\g_bF~LN] #M3  DO2w9{rU^)ms_yI$9HP^3 )OvAC]\lr=tP5t -]0H;!pYG(ZnjM0J@$7"$jIDWp$a=)[&i+J +pox,b51gC'V ?d$7gx"g46}1OX\QEyAU1k>EQCoJ@6+3(t  8 1H[TBX@GuuVDW2%`#4oNL"v+\+{QK|_[gi3xi[Z[jc~b( NR111r,xQ(kq8W@~aq4v3q^Kx"|j8xkA;XH4P#bP30(v^ISz{|,{PLM]8lC7Y.9r(f/3=W<\Uz{y]fHTq`&:A*chv.BQxMU pr);N8?r2)U$BLMG'"Iv=:; U9jy40MBnxFVmYCJiU{ F[nPI+ 67J}.V(`m0FkP'bOH["1{gaL5zxa( 4dyuqk1\ [ZfCk = XxJYPQ%?Y8T'' 8@n]~y j3Bix7!2n?ID5cE' :le' ,~IDEP(wzW ?Wt!c4A&O\ !pKlnOlx[^"(&nT^cPh" gufZb`*]e7Qx;-&fGX]> s*+D/ft:T0H$o!Ou1f]u!OwGlm;YM^&BR9rLLk^ h]TvBxSN<Y]8""#@|lpAW+6 xc-X3~s!7GX&> NAw]ZL^C|xn5~)[oQ|]j#[c2&}4e&NmIr,YHE} 2hx K|ZlV Rnz s(@K}kMlk:vKV6)<(\+o>\(kFY IILKnXhD"abgR$ Q=r mIU{R93 x1TuWN ]v r0b @[rHZ2,a$0sY>l}9m3 o<8$N5 9q4J<2^U1`Sd@"O5?Pu&:?nh7ks&C(q^ZPX?f)<1``hwv2/taw1y% ;6AQiic7-yp]L'Sydd4/ R2+`Fq>@?3wRKQ =<Ld}ymM8BURn;h6`(HR*{0>o<"8\\R4/Z7K~ZD|p>p;2 ^X9?]h~2zL6jmPejZcmYH3PMj[/.[*]Uc"#PM9("#zHjN^;C;4*S8^N{4_T8 7` tvjt#<>jCo#} 2lx'[f#j\otTzGw+2,Sq:xO<]ODM5.FR&6O4W 0#D,= }nQgAHr'3F19Er"be=a\3K*QSrI+3,`a^!j]$]akj77nKO `cuZ#F#e@Qdznu\Z\~N<:5H QdZxAC?&Kxd`C(Q D9>Cz2|Yb<U (RPvY6.~k#FE'p&]Kj4&/ 7<fj4[yoK<]zkgcPdb  `+e= i ?(2|kK -[!~>Bi4!+=RpI@I!$e]J B#4'>{y&fX(8Ap [!I9 3ruWo(P%<O[Hf_t*\8JrqG i~|&@Q r5GId 05Oj?<J[spP3]At9?'wO#?yn I{`Fh!= wK&.7-.+4I;ASWRcI|5)6rX%[H`Nu]`B bL-;U`*TeKf@YTaDZe1jIJ?f2=Y|cU% 5`o"sY+EPOGDA*!: taq =j@%Dg2Rjs* H2*CA KD-{0AWh~mckEP^}P]8Y6I~5n>lw{\'>dpko!s%b8btl2:q Gt 9$0QJOR'Cm aci.B,2'_!% It./$RUFf@bx\HMUa@ )_gI-tj *.7zG<^}IsOx|=)B<7)&0KCzz-T Hj7d7 {%ss^ okpZ9'Z`A5 ?n'e%! aSKRD2z^3kc?^!C* C]5dWrK\G UxOf(T!-_U|C,Khe'Gx&Z|S}-w^{2?,}@R_b-^?G=u  9 1^`kY0C>f%5:K}$yp!l+ '`WOL(>ZSbi(5?u .ELawrG4N D% K#& Fr _O. ?7+d2+(*36\mD( iF'vKuE ~?@s2ny}^pbs~Y3of7#NeG9 -]X%QjWeD.7 FL`PVr4*J%7=3j(P0j~HQD4!lonT' m)  694?;-Q) IbtWI>IP4XhA2>E5V![j6-[s quM4]0R8} RbH1|UW1$cONxdY^su(U_BEDS"|7V) 'Ui@o[Kvk!(o ZFjK; mO-0wSsXtX#dHd/8^~::r)#0h| w*'</K%} -&h8O^OGm. <NM0>h@5-2$(*ScV I7M S,!Oaf'O>X #_v!)/;"E~s+GYy]ywJ\4rD,-4.^yd~YJ_)r_t4UQ_!|q3#]q[;P%  +Dw*m`f& 0imJ/~y:"@Mkl@J[! OteSF5/Z&|sof_+4T%3\WM]UZq?H%A-Q{`88 VQZiO\ 3\oW~ {MI*PGnH5 !bWQ= ,@=D^#,YClvNy^!N_V9,,n*QFO:Q V=5  f7M;A Wu_,BCbG'v B${4kL9 ' kK$7Y`.zwP+ YJ7VA:;*KFbn76{=k95[q9;]`[Dr )x< Bva7Q-<f-y%{=?2dh\Nu;zh|A}mmq]S3 v;<:>~+mN14$I]_k6T0?yX@R 2R'~ EYU{~?s *\FnQW4?RHzk_.,I_qx2 Oug 2I12Ll@i, iMA0#,9hPxOTy_(3]ADw( &Pv>R}xslBb|6bRhUOw>I=6c>#Jbc:&mJEYy58dliE"nx(r.GMxj1+B)~Ysn<2u[Arnhn}(9! Y"LPrnDvU 53S/zw@<x 0/ W*xzpxxacr^JJ]x WG42AtI_ cHx*~ GW I+; l VE7<>b0aG"s-o51@',4M)Ua%IBkDy9_n[MH\Vvs'w_q7sey<,5)ks;8t`5J8PUF6)$F h%":.SAi0sW(@*hT%t=T;>r8P&nReVuCp$[kHZ D O|M8}"?)5$fx9|!$D#>e M]vJ#!H]X7^oV,f1<*$f-m)WHNYu]1qDL|m1&Ai87:FFZ dOW-DRihZU#kj,[`h9gs;>IuopP MvVl>$:gc`H[jQ CmFp:]t>w C=Y C5<pg4N L*=I.L  i- ,02P\XNw)z"0cjx*'Yyb^\O4%5B]RiJk=sk aRXs-d$X^o;R5hsd9V/Mu2~wYCa dI_~/y+e&@ZwSm@ I_wJ_nAzt\m0<_7B{zG>I%xn+DkOo~f; +_v? f/q~W;3;m>l K"d.H>/ X?+kpes>%u=tYxG ?cK> Q MlNUCh,# [F bP]/?KfL , l)2Zy/D &`Dm@4f)nIumS<]#SodE!4te/'Ye3{ 9{YM&VsVM.9]dv$RLPi&_$D^,kRrVv e+ d{8-m@cwY-CnZ9fxYiP&'n0{+}BEqW~V_K7.O*.(2 f#w7ID287 |g1g9Moad2+*x F!8 @>)^z?RG@;<qN N7_F ax9^,}.c@ TC[1X-=7_vp/-s7 NK/MZ>uQL]3 .0>=U nQB[4@fPw E:Nly3F0g-cjl;XL3u9U-W"GGKT(;MmYwJ~W1BD8y%HVB|tmFD:u^KRec-e=yXp>$]ydtrMRXSr0qz`J{zOt DK?7IxuT YtXP% 9X0@K=vb?SDH{G,K?`;Jx'I}-y/}4p@bV$ 3jv xU_rY%e`[u(xE C3`7c 3ltnKZik-edI -sc3dA adY{O7>,U Q=H[Pq1w]*sJf*K9-EJT+Dx,]0u`tAMaWZ{7P [E>hS4f t?SD-R=VL-\K\~/3]Ky*(v6}wE+^M+;TQDsB@t6b8L+/C7! V>7!`l V5*v]T%rj <@Xv!Y#?w Jl=0SAvF.@C^r]e-q_IkAiV 'q2>zpS^Yx=Jl|`? jY2/aDk_-\hbP x9^V8KmV?LM}@FRP=( D)dn6umUUk` yiiuLMK 3YX yoFal_ TFna:t {HD?'MSuX~T, B dx+s1,4V*1BPVXEUNmvuOtO8<.6j Btq,A%}ja:78gq,h s]*[pX`y}0Yk Avl<XIA^4&D5r{#Uum]B 9.vh,Zg #ws2*<6]ZN?Cp,gHx35ln$'azG=tq< =\X_CO].,g!mwH,O{^Gy:v)q4 zY&2 "i3bh p.po~BZ0e'MSh"*)$IBX >t=Uh[Y9+p6V'ek>KNd? "{?aJ0 X_/W; ^+H)T+5.;'.{1+A9q <"u8 7)YQ)u&(+4 T583q/tM;p'csK'aoAY@/& 0iE"" 3OvJx@ +h~]Qm&sL%i!]TiA943\:qzE2Fx. YK0SB,f58l'J#=OftGD]]sD=]}>r=_\Lv*ojTaP_sMPQ**OSgQU= vnuri}&|q if)8 dwpq, @ ER/#yv6*}>*6 yjU}UZmvg1w0!4KBK&I.7Cqw'wB<%^~fI%Donb =o9k&ym7` sRwp?|"K@6S:K/)' UP5&wFP?>l,NY"d,&fN~x%,C\68EoUG_ppK@9NgTXlp,T^y!~\  eM()?XwgI]6?rrmJgro#]\&~XI4'*~'J%X,S Gf X-qZ%>p  d?9 &83Udgt=*dqd` XUe.#1E(~XY{[_3^$^M{<Io|L`LF7%13XKm n ^\_V'(x,51i0Oe};ES 4sII |rc^d@o >[ [i8f~po$47vnHnLLQ( 'lTWL/G2Qvr`mZO\ MeoY,y't%L3(YG W|4>Euh @/m_{[#;w.0YUX}i @, }@\Sy M; |C~aJ \[O9}v$1w;FQ NW>\k9c9\81mj R*n=paSX8$)?T@ <uC4TSs2AD7+1O0r )Bo)n\.>2.<ko 3~@:n;<o)lK6=aePOfEFC&T+wAO=]q+X i0hm~U,@rxOB^~I?ii yzb' .^wnC*'0,@3`KnpNhQ33^w7%)Wi(u0+9^*y% g *JoFUc4MdK%{QjhB^$+TdX ^ux Q,sH_(Z M0Avg9OE.sA$kx[9>7V 9[iwjRg~Hl<luYOC=w@C|%SVPrt. 7qr-60XO B VjNVGyz)_>)f#: 'Qrh=eZ(JOM.SGHwW9h?;Yb6S%l7rY"=W>.+l*~"{!C'0o]Ar7tr^74h[~2; j5\U:QEdtZ-m!n#L%u'?EMW3zXx8e$n-/u&}xVks2YA}2-7=7)&Hg~ZnP";vh0jD_Q,KSEN1j|oGj{w}3 -RtuU35NF.(0t{z,FclK_ G'**FF*2 t4& %LSXl`{+ V9#/TNcyp!'?maS BGC*eMr[ny2:8.+blLEkSE g@c %" #mE"akYF9;6%!hdh]P\R3pGEi?P\.qdP}=9UO$#:} X=qv*(4WEmhn`6PMD8]|n_\p9 |l]<4SP;.^]6@_CUBH'@?@CI{/HW4_c9D[( #Gn4Q< x5}!WQ3!<7x%#eY\8&Ms.#..9e\#-Eb&>q`B]~.WASbY bu z7g&syj9\3li Du70  ? :8DTEJN;NZT9}p48pH| f-@YU2 vo(S~I) e8 Jx,BCJO%n+ns43~)>$XYfXa5ueIMmX)!II0MV;J`^oVx2-he>n (=1! IE g ZOux];;D ^KwQQp{mUO1h%i_N=xt&{0* G(}b[PG'}?A;mox~C'G[SM-(wwD=!A -F'2pbyd.k7x74{o),7RO|{)sm(^KcuC6kL;k\>z.}V (+%zs|lBccvg@@p9,o8+{f}&:m~f wwsd7v! -nu Wqw~yMziX!:I-!9|1UdJrg$AsGJs5'ULGE Qr K#r9y>3Dc:>:S G "H$D%~I#1jf5U'8^m`]guqX@3]4A OY8 rGq="/kN`A_>-^?~tkxK#YGijz2N)z-PZj.w0TW4#jC_i Io66q2ikg:1]Y56W[%:tam~8R Vk** ,}wRd?%QY`KOgH1@g1kd {f,7RfX}Pfv<|*R]3=+#Hs*tb1u v^7$RDdM@=o*fJqzVvEC^sz^N:JW,tm *9.^r)qT/.qeAd)gNbn'OH 0x]d$ )af#j4f"Nhh-e [k t` c[  hgb'AS(9<$Fw^k1aFs#/?v&p;<40 Ce- VpS) AduW AN+mu$F]1I>EBxh,Rn<SL_=NVvH )iu, oO 7+9`bzrN8H;V  jOe Voc9cxQ1iC OpY1 'W$?>* 2b( `"!rlRH.)mo"HS6'TL[B:m;96$gew,r tJlLBQ_Vt^sZ=XQwEN4~r {TbrP# (*q-n-a2K6TX[6:v4eR"bC)3BwWHSdd'&rDfr a)p6(L#dTy&@MT TQjB50`hM34(j8p`/.Z 1? E> N$ZwCH{Q{| qJP1szH+\s*&2mkF,OC"=x'wXS8!,ZT^'mr( fY\\`** I V,_I~O*JBJ( 2F %V~? OyP .0@J7msr3q>;j./I 5 {f(R;pCTj/(RB+B,[AH;{C`NLfa9M G|/[\O>sj3'(4]oux{M>hn"owgd^@1|i`_WT:}0?N;:g8l)Wb63rrw6^I+Q$H@p1S"D::U 3"Z_N}0ww8D,&?q{fub mC^zB{*`p$/p: QZMs8XS]A0>&}?OgK{u#:K@D%utuCyTT~lR[_:(  gm| *"TwGA1 3X0f #{aAG}.W )Gs ZV. 9 nXBtR X|=b_T>mhzxT ^V'BVu8gYSuRpE94~,+^2JJR?~W2wD?ZQDg @TYtzZAQ ]U32S?H~?P`-w/ 3LUM^ ,Yp*x^E^`|u%2Cx{}#+Tx[$aAU*}3&7Ee)6\_zegxk* qs.xH]|&.(g1V>F#{b:"mq\FsYpN$#No}q]J7>pSB$CNfOV*)u$^o@7[R2~#ZA6c oh6_y==d`ko+QIq56 $6Qgi_kyh! 8JN= TT,kz fDou;W1{O&o!VT& Rvm;R%`/?SCVtp1'cwU!06h_KT^A.@H-JeMC3Vr !ppoe}B(G_eu~7 B{hpu,>2 NYlSoT^33$^w=dMDu<lP y3-6NrN60,c$98qtbR9; y+ W {+8xx4@ q:tAmO']_!O($1t%"QT*}e 8cQAAP<(A, m :>3Ccf kyvO]ws?^k}:=bv1\BO"IgA9rW+I` 4vcWz J, tzVzd>pK*s95#<Gdl_R*ydEi5>4ry,H a@`Yt _FH zGFb_Zlx4t__N)oF23g[1c8v't&|2tYUw&:j^39>2 n]8 y<h o\ASIdzD">x7NvSERi3MXo8k6acT*=k=l6.Z"$qYQb]<jn"6P,\Q+|[#se `;mTuj^yay,w%L(Z! e ?I {9g!I+{S *thqUU=myQHR%"(T$pP4Pv8`GAs4)In[EWv|O-bNX.SWvtWDlIU~&me(Xn)?KRWE,"O8iIiRTOSvh5V6uuU &slJD@3fMwqKtd%tC00/%`.%*f2/{s.4Dn/pl%Ox+k{@#KtaQR5 vw^_v>4`xUGd~puiX9xzX!hWY_!LK9 It]8/9 $#uKk@pQ.}Fqy/ =gzs%r?Y:hv1X m@||lsuAVC7gL%6-hDML\&3CM'= ~4a/ _NNeML[a+@B9XPs fgSN7 y-$W"nrYvtgCdg%h7x3:K+K5^=5g8kpA)4DGg4aC\ yd}nyd:l&gQy V?fbv&#YZ=BF/q'mD9(s*,{,Sk:% rjy +&"%Co Q[[n|#=Cxj-@Rv0to>O1 :E:h6Tx2hhd3g t# LR27z *g @: 'q&Be=!; o] 7wZZ2x6M<4 qKu90iT_7+P#"6[Pf F2J`Q8U=AA|!F1eUvp*WL22gWis2)b-wf]sQ>5g 99&ze= lk B{HJ|(.}t+fZ'=-Ddm((m/(cN Ur]O|^]1Gk87aIBBM3.n)LA 3 pASHEh* Aly9  =M5=FX5 76|$so [pM.EZ=GLnD 'Tbu3 ;%V0re>1sxQ0<1s)$dJ,!hn,O(<tCdZa]N9P3rNQT;,$*F0NTGS}:  /VUh(]{86tX8|=*1 WMRDW%v DZ %_7 e /3d\0w8R .vg rg l$:Qp:M;p Y=M5-D=\>>09QCf|%aFQmC0;fD.q}jvj\hS/`u?q)]u)4 93 2I5sy[}~HOP!T?d1H'h}7$XHS<^(4&-(]{w GV!_}ysQ$iUBGf%7v8n=.J4}W1O6Q}2%C8?o @?Ar+(|3Vy EWjsJebqj'fe`) hG.{FoB^yo(qIW W>/"(LxN&V S? RDi=o`T b7{H! L^   ^zN7j@R#RU#a)?$Q K<Vb!3e8v"/`]@9Ihuf.qc 4B$y{&Rj{1uoCBr k,U/'VbP; CImXB:bB(QXLrC ?U?HfR28F.eg}[-Ep2r>\_nr9L:-*9Xve#VMB zC6 &!TZN/#-!!?AG@w9U[Tf^x Nybu'Ki4350uK-pFQO7/G%1)mB v*A54%xwgHVx1GntjbJqwjc@} )jx&8,BWIFX~X|LASQx*N`tiG]+S\EZ"%3+xIz/ K9T+(+.Hm~hp 0YY.  VQ{[5=SqtaE5, MO;YLnqgDPeCinv|#rRt+=}FsfaUDmMJy*nkYbN#=7R^I|4j{o7 ueOdTKS PciG1 4xq0lHOs )0!y96XcbK2'G7SYUTsc6P >?YGhcTL?28w,4M`a>>b_ _nH~9<[ 0g 8,d(TAVS,@LbnwX 6b!N"k9WCz4LHwh7]$7 j%f%`wCwSn:BOep_ ?z<"J'2n?[M dJ)mE9\fbc4W {V4z)"Yjy&gLV[ M.Z`[ (cBM C F_0KMO .}T`T3JsRg-}MCa>9/&eRCXFo\GHNAz vp$n+:_e %d/ 0A@#nowKvNAb}"M#!aPP~oK 6bh8s-u^&SW8WNj3`_FomRqQ ^]E4f|:L55!?3vW^xw@y0m:e5@s5C[ \'q{`Z"eV^Og-^og\n_8Or2bP^+R&ZCqf/;yrF}[?x:O7+V@X""f?q[i*^U  c c  }}<(X6z sm`Thp6EY! ?!+0M5@@+lc[YXh_0MW@2E Tm, &,xY7ai! -,= DQ)`9rgG~YJ7f~`"QE\"JekJ Q$]-wAywHWek%GAwBCBa,w]yTZ_Hsxe*LUY"N|_7&S"_y<g@ .mDiP^O?*aYrTe oUnpXeR%@->e3zUe sx/K{T%o:{5DZ:iEB Qyh)rVnxSpYK<-Px@K3Y.)4{}"I/) E%3GO^CTvU:?[8-3{n =W209t10+c!LD&tO[5gO [?1=QikH,g)4'HOSQSYf|!}{9A4xU5y G9zBIbRF0D:t1"; lb>{"}_gu.n]&1 w{k!"S3!%e ["#cA2#*PQN*HOGV^>+^=RI@3(zF GlrfG5d<eK.od /6^i^D:q@-SmCCF')*am;RzOr|xv{r9!b&XJ|_=(.l6a Br U3!8@tY851 %Ff iY-.:Glip]Oq=$D [6P:G7PN*E{L  BN[ m`82ZP}t,I%ZxxyapO:E_ ` W0&UEF=lGm'j~wA3\/j@<|, g$MNuT@mAst#,iLHf,[=ut- 1d-x4,ihW d;7e,2{ rmnzzPB3 Q Ib=n9GVh""2OY:hx]+rXhljy8KjY8dHGJ7 mm5dx4ucj|Ml:VWoPPD, z~!A 3u<T;Lk"Hq|tiy6jZl= 9+6ENZfj\`BQ(Y np \sY-X\F F{X} yH6xYy~ DSK@"eN{RPOg?=o_!56%Cs#d&3i{y%{V\Qec|`RB{@td;?oM/jvBP#}`!7y&s!'zD/xZ#]d%[ d HYvE Tn!Ha!IRGtgqy*K| I>|o#4B|hseblspdQ>**Dh<n'LR?B$WZ,7W9sCc`*lr3_NJSik839LP =[`W5q/XbkiH (*MRg=}[8d@NyYB&fD3,9]4 Fn(o>i.Dq(6:=Qt HY)[zY0U=PP \\@w'fdIkrn>s }FvJw,s3ce0 l8bmG^r?K{Is|k|7%Nchq Htb<=~ ]}4v)#@W ]VW <  ,f0qN+)`9%vah4^Gy]!s( ?l9r,q ^\x@hVrLKJ*_Y Ax$]!)\\.{V5;C/VKp#F7XF q " <{ DT# qPbS cfWMWcJF;('AY3ewV>&M~pkg{vtr v ' 6z8NE9}AUO2$@MP +"u&m%;Hd:=)C$E1d;gytH NO/L0_\ec, >BSH|@7[UgI/@"| ?2[n8Sr# zPEo)jNSlxeu.)I&\#^Luz|>AcNQY}sIg@<g#Y''][c >O(CZd1jw?6n'I;~G]Sas;w6xQF"QD{fwG?/D_Ys7w@5]vX[EN*JO(Q+Lb)yqu2G|L@LVQ_E?t2CVGUlRs^-9mm7j8zZ_t=._Is3K`o%! $juNjYs3~kv{C#.>LJ@3\gUO7`/Y#f5XGaN=adh\(!sTI8 m?V tIoncYeT1K +.e5z z 9b4T{k{W4''DxU73 sE4'7r@ 46^s].~Vf vD :eCz"2uy~ Vn';;4"B,lxC:27)F q52Z|`~Y6]*MCoXi<$)//".l}0 fo6_-*G1Z|X4g HF <=~j])Vf C|3+d \ $Wg>"au/PjI<Ta7M=45V RX -o<~<m5uVTq^ Xc;U^1Sk!_/qa71<J@ fdyA>`w)K.[n[ ,[Wyc9IiLA iP- mlzWYaY;G}FW+e&.{ci_-YhN6y)LLb pV9E HR&l|HB_{aF3F (~f}bTuj3)-;-{}B'e_3 L\8lWf_y%4ncDk Y66Y5W;!q$?+`@35* P(L+1JjD&lq8XU)DEvR[FWI6`,b>9d Y:>0n^@knU"4o<&_}Vaa@-$gR-$)L2)s~ns 5f,&:VetZ9L_bHt^$j!MW^9IzXMO36RlO9~&;l\}u,LH+{! pdul#`|]FV?7Ey pAqh2<  ^ON!(FG`c)^)Xdms% t\[dyu-]x@I)\O|CuH}->&Wc#9:kg~V9+>x]z22z,N-(L]V N;Ea(0)nxzm:~ A|A U =G E40coZkR b?R["N#_X8#j 67{y^uLQL%N9<l _}J< FJz= ^oMaD%)c @SB!9jj-]+(++9l4posV 3"L2b e1,,R-cQv]V7: JiGZ,L;RKB;?7(NK@/* bAXE *={S-ihwD-\DDU-6NNDD:9blYB=[?\bC2;k w9Pcq4(D"R6 VM<$[P.!#wqk! Nd6`:Q&p/6<a.g 6H:T;nk67j>&1Ek+o C  "wp)N:[:8t$/x@fZg@BPnW`wEViz@XmID ,bNdVzRsBeh]H;:S}.dA,)r84p/3[,EI@s)YP- l@p#&/ Kvi(^<[25V!:1m:2[kD{6x80$}0@ad% {P%.|t6jN;;Kr&nK<X$s Io S3Df5-_o',(w';kHH &S(AH</4Gcc>n{,#7R1+X3hY9-n K^k kG#2X~l[~6&wfcU@PRmP -1E<.U3hM Uo_z aps3Mb< 8v3kC*2WT/eGMfve6S;Ir1CVe}_W+?c -AptK7LX4W5&%<C fel9G"H``v0zwB=hcFTnPo<'`+Kw2`^3PbK$VgJ$ RxVSqWE`}.P V([ R"Q i:_GBSt3taH~8 cFsuI2,i|_Xt jg kJ633BZxcPRCRqi0b'5L0:aUR.YKBJp3l,AMgiZiQw+Jr!\B;">llQg_>}<R_-Ji94oB7%^Y u&J>)f;}y;M.cZlcs_P2M4f G:cuKU7ZJ xc26~|.)5. nvGHF#*Jt d>P248_88 @MRdzP!<:(xi`R`5(YyTb(]9L 71\\E ]=^U0!2lh^ 9njWHnhG+\{@&<}'6Rs^_ p)jO^# ,Rk[ _t4/evESGQJ l+8 J*hWmTqe0/,y7<-.KV;\T:u!Uk^=qUHOc:Zp@kd(u8^dw.bQ`+] :]v}7SPHnEsGSxeFgi^@jJ@;)}pk7$XD?uBi][IU|LqKa>@SbZEa~ D 4n6j")S)/ot=w|ig^..yj|[$H"G<;!hI1*TX $}|O!UR Cq?#pd8(!z[MTsE g=i[\epA! (uW8oiGaFaI!P6l{n{]}?(Ws(&#JUh0^ 2Y&gb< ;lD;[) 1#gaz_!hRWvNmO@@F.ZJduZLLI51X j=:uEV>N=,YV7E0M(G<np)A(^sOD1ty^,J/zL@Lgse*i{ _+hUki?7!;\Z"  ?~}kmpZE>LJ([Hx[NOw$:}@/K/  vfK9c aI::Lnf.c n D{bj|3oHCdSj %8Q^DmA%3n.639c9r2Rc\L+HvMp\F5{#r zOjqyIT[E>LWcw|V/\$@cnz>bi]0M~SNU<M/?{\C.,HVd* g9;T`wS&ciX)gD8HNB#^D)%Rh 3g JV)99`Vs@ 9&aW!-Yk9u~wTW/A;Z/zL ;g[h}.}89g3$COG$}hiGS ~x8<+ChJ"}J{7- r93Oktsa=$3k+FyUyPG,Zw0uJs~`OT{]rAz_%6uWy{J%>[mUxQ@ | F\p>JLe>)dH=8,9}kP|d>_${4DgiKu@% vTw<;^wwUVei[>'|W7|eD YVq*p^.2*#J8J+^9X_5W9%]SG "Top]=2_%mg5ijY4tSuU5g 0;87Fi {e g;"CHp^+O{mbM5kPgzfN2 MQ%Fx ^x 7`0S%Qr:;G)$XdJq7L j)Q?M> %CCKCVoy!(4S)d6s7 c.(p9 $wLlWJ\z$K1e:R{c^H9#rT[B*8`BAi> ]I9`\;&P,sC46CS_itR T, #p@')?P_aS;7G1 Cew&Tt2V !*xRCJe1[aK,"-C^'MOp-.BZQkY+Q-<B6[3*`uiQx5!Si"Us%c~|W&{Z%x'8-~&1%,mI HQ$c Sp l1~_[cOM?I^}IpkP0%D~s;EOa{yx_K+`c8 6Z{~kJ7Vob8QWWcS9,;TYI"u@y^f v3 # 'tg)bhL~UE\ }72e]]W:<1?F Q{y<G  f~hCi<%68\| hz!36/",?D$sxU V& :HRQK> sS$_^'gM!- p (VH_H *  swL8Dd2f`%`/'}9LfE 5ddyq"|N7M %>Wi{sGBVK'JgBu|b@!0j56ZMB,G{?z#aF\N'YYZK/p-^cM* 3@L9Jjb:c6)u%)U"?lD;T7L"q hWp3C"} I#l0K{M@C\jc+>;z>r#Hb4A>p,*KnTt'gyI\ UH I25^A <-H[   X,-U.{^m6` 2H$ :n/uHG3Xpuzz{rg`hIrn&2ximoWbcKc uHZuFdT,&Xj=#'GLvVAR)&6\y{x7%T3lGiflar8{A5I_o}~h/j^u!^xf/?Y\X+SH.`y}l\`pqN(}t^#cGf6q~4q-4 6y&i|e2; {NWK 4g-e f5o7I,%N A:zvz|_"Z6}JPdS!Kine5o0 ]:uKFk ]We+`) )`\ >K1 oTVwoL$h"Vab}FD9enN.DiV2  ? #X-\hs #>N&G$!uYGCJfBpzo'W(- MQo6-|xSq`\Z*W3^ls"lR)R`[:eb?Uj,02;Je2B.&D<k5`t7+1B1Qs~s_.h@y8 jTJo?2S8Cb{AiOie]KD*J'j|[.?o]uHvW sp` ;D..|G*yo^2 1G8 \0O T!FE6*{&}3s?<au?*{exj`KOF[eC( 8'nvH;,a-e|L j23bq JuxB7q9w$NNCZ# 8d %&Nn{& r? Hf_?9f'i8%AB"'=N\_ep>tM [yJq,}hv^t6@ #JelQ|%9 Sr0MD}-[XCU{DQlnd9M02tdgf9q<A(pP^ lS2s_k|4mIqrI-l'z)@qDV?Nb['u'mFcD{0jD~48{FCm?&(0Z>exi4\|KWF%3. |#!}:CU,&L>PJwG ;FJ1\^+pm)[H<7-WY"q;y#z@.K'8a3s&eDpi O$d-:D 3Y|S,&iu[eX (;UrpWTjtsVj9nfta;\`ur<p/(|'l` 1O]_BAjZ{:0h .HahTEOk}som3t-H_kgV(wJE. wX+z(pK f1%[d,,70?prG *G[a^XSbM+Gl cx*vS]_"T7xWCUF$oDQFUkt.>,AOXp:RcljW5 )eF+: Q%e#tU67Xu(\'c9GUmH],OT<w)QS1{+%U7*ume),Y}yugh)P oUvP8F-m/&Crf"T!: DX0YD8 5=JK{-~en F ;v@ 4Tdw JJErk88JNE3 [(yk@3?\s{pO]l"Jly{lR6GhD_&w: PT(P,tE@IQEl;<Y '3BWn\[Wie.^[0VI&"&46?S3WiY"^KyF)%:|a>5a.u XtB$n5%7k0n|f\h Gue,AD5gLF->BIG;"z?xG)>m c'd]5}9c'.8rU&RMAUeSB8MpD{{) #+l>h&7E5l^8be)(z5M__>suMjgA #1kIZQDH+ez0$3pkz.=j{7]I@ETXJ+r;##FQ ?uH|: do=nWHSrzY".v|\T=1$(;f-uqG2S\;3hqHDO[XPRdpTGy yf=zkaG?t Bmz]."\DR k~k_L[CYvt|}yq`O!jJ:!df-LSRVdY6 9dPr,Vmf<D rA*DSK2XX/'$(=cN k/5KzuH7o|Nw>.FBL -Y:XEhR Hz1 ``m9 'FYi.+X#Pj[n8B29jF NZ8&.9JqW/I^&v5?nnjHPxc/k1_%Ms)@D2 'te7U`d:m H "Bn/X  Z*+],w_j[YVYU[][][U>C|(rFg_c&k%O48_:.K4JIJjf(L "zV%]scC 4/pc0NQ8+E]}*stngIYV<78hr>\ TisBWQ=QaZ8";H2:j$nS~HM!  gG#CeU%)U}>cyt]C!M`e#'}h%(xx/@hGg'^T{[v= P=>F P !}_^^V48v ?nL2,5Fg~w3rt0Njpd*ft`>!K;r~yvt-(w+7h(OG [5->d>RSa}K HO>>)sB e nemwk.R5bxr[1}CSD|6JYV# GP|UY,wK xW:LF'Xs.6O_-=*tYv>_` ?}rOguQJ)eM2>RvO\~vDsRY~&_Gu|AP S[?!P<5i=' oJQ[ZV!~ V|H nMzI5fGh@S?};pF |Aou/7'<t,%U&C!eRa d(F^Akiy[/c]/V.-LcQTt s@sWDx'=+>PG? 4x=u{E~PRas@ +`V c/a.4U40W&ogYrr>pCP6[qy MuFF FZQ X_K6Vgi`E 3n^)`g^Tq6.Dg-MD 6U/CG &Gw LPiK)RF?nxZdmR d91P]k> ,<;_-+n>Q-8(MmCj{ziSQo-ezj jr/'v*ye >/P^wouvU {|R|5|`+MvQ*~XC/my)a*qZK|Xm]5M? Z-"(2=A1s@av)MFgWi;]jkb_amrfLst</cl[c mHYvrjvpfIiX[%> #rSNAf,+`r( sy?>f[gpN5W&*<u 5B9JDZHdRKd)8=3 8l3k${LhjDe x}U4Fo fnHL93Dk)T_C }X\Lf5aA{,YaP-:T lY[bv vRt `F`_GJA29Km,V}bJDKg 5QsJ~%G?5py1d.TT)}>2-NkX*</sw^; `@l^oE!&)[zmAq_M{ I@SHBmN6Tc07wRT<TILJMfKy;E#<%m2#*+0Jri^p!&liI. M0NA'1#>Gm#Ac'tBi\NApb?# sdVD9>Nq{H s'fH@SF||!HfGIjK@E[rx_ KK1` VKsbsY8 %tu'prN$b{TR0M8SbM$m-HlL(5jWQTa{wx[AwjcW)2\wSj784MvL4+>g5q8D8fK0"#4fwE25C>l[%/m:+x/sfi%P 4e'%R+neF9. -vTy= T{2+_nBh oZR&=TWN9#+fAZ[+?h  rEs8 ,.~m2 s.^Da/,t]{'=8'Fr!PGWOSK<HBVe( (1t;hY*UKzMPrZ"o m2VDQ|zMPw8@ J z.m AzWwn}z84J5%S6 l> M=y)y~\|7f@'&d}7zq 8C*p5L.{n\3q}O7$ $5Tv^ #l y QOu+, cG=z 1wlN7 &clu GuU ,z\u- )oxY 8Zo2y:i;1 v7yF')4,&CzbI1-Eyz[XYn#)2#'TzzX+l9v!DMR,2g?[g#X ndsR1<dr(3C<0'5U%"h7*.PxMImJzqYQIMLF7>L/5_=ml@{\Vej[??@zV96Snb$=TcSej_+~C;X`[^}Vso1Ch9MbXPJk,%tp95KZ, s^P[~3aZKaw/-VCxVAskDps>2hVO[j(Ear KT+NmC7uhoxlZ5 !gj;t2t0 r~>IaOMQ]]R4 >/'@M(r2,=9,%o\Ed8VjlpxLvd#t&t ?r.!Oghb\r%kOF:%w6o#3h^Nlr_A Cu)'iB]n^e!J}QL~Omx[QQc|20bqNS8 Rr)_?@L"?)foS. 'cez,} ~X uw}EASceVL:0!|Ce;g:9oi%M>Y< o"^e~_/v5l8_EFHcGpHs\V`n{PT6$'/Gj(COJ8% [ T hTUqofUE?95'eitE*7[r[ }8`G&~jn~%#=xEET)R{[x.oUk03h^T?BUhN#3) NK;jYj:n\ "5Le{[#}t<3"`v*EYj^L_| .@_TrYVzV8$(S1ms=>0$nK qez2a[1<GRM4C[IOn[Ghv*O<.l/ cW^Pn+f+) |+1?:/!K=s["0`I@E>}ulWC=f~zGaN00W3J\\Kq|rC-]yRhlDKMKQUOH8, @Yc^F#7Bj jlffu{BqN<>D=0 v0cKi)9;A=Rkgt<1G;`\} tfotU6i- \jp *C&(AlN>,2 PD ! (CK(C!}Sqt#ka-Z&/YB!8 :Z@b@twzOFlH+@r=MH)/3^LibS];wJv"J';'8@1jsR9z=4C;F}(T@DU`m&) f*aJNkJ@"vKymH|IMP!'Y$xk`Q*2V~'IWUV]ne;-DiV2, B;<x  bf;UFX 8/&gQ,`8tgb 9AhY{1?L=%.M62O;9M-.]=$y}J Y>h3V>EHI`d 9cc(=:2XBm)<\CF`k[.7\FmtSX +@mGDv;eJ~4&Nr#pyL>"qP]6cl4`d# &@LONH9#BT~`.$eB**Cs5q3^Oyq~vTbV6_" -du"s|I"H)#a/vzAb&Lgrd6Q G.<TjfNIO]g_K$`.|bNDAMd~bu8pL9>]!YAo2ko0EIPwwO&U96mN;7]-S(g '.']0!`i'tG}%OGI<( >l"Zss"Ng #%q2Z+ Y$Pue+\kn}qaf~ e)Jl3oyofeYI5}mS?&*.yM) vBR#^!`MiQi8%m+Q ^mA %Q >~J'6 Xu3Riz>p|NBE_x _+9hdnS5b2EZ 3PnoViF*-+DJFPn?m<bnYZK~5c%T^)n5xJ_h"*|j(.%eMC/Yk8;/%]of3pzf41Ud^\[fjeM}mV+ib]A}{| $17=P|Ddb{jVOSb  ~Mr[47md(<*eTIcibNEOv2C[X WK$J'ZSA\%MMp r-^n(q] $(9HONP?~ !q@HJS?Z (>L O~ ,PeY5fTCt(SK%+ZN)=tX2GS]fd\F&Z /~#v<"6r>q '0f}bXe-I^X,~V V;7A]y:d5` 3/a,k<wx.SU9~rbC_A| ,Yyi0l(<, kWf/ 9V`_M9wTo8 2OL,-KI*!)9JOM1 uoZKA`'?RWOGAERPERMY,/CZqLqv}mfo$Tp bMAWY gv*a'q3dE^ 51Y-l{6"HE#;h-.dX@9w{Q%H`!iYRZdsYY6] L{zJ"g=Nn 6A#>XecN5e*%u6hsgjngKw):k:,Rkf>%=g-#x #Rv| 5t-2.yA5Y. ^a_*FYltz6ivfSKHPTTAh]%`DKo(_ {jW1XjfWOLUF#f\n|%5X5pmB>n.W"T97EWp8pa`Lu|Rbt8ToQJHSUJ$l; wc]Gq *O6A LUIW#{-[DEM$GIC0L.G 0` V/tQx&l%-y_'l3\x1s~c:##X%/qg_k'(k*vndVYt#b!ges-\py[YzeVDAMmXo^H;UQZBv )$$9:276#cI$ 2Xkg*<O[MjG_bw#ii~?JCu"U *[M"hAo^#;ra=z!M}`A" L[b>  ?4`y%\"QnyvjXG4& K~dUXS_DKu%6ydCs$u:]}xX%5j]z%OZDqY4d+@[D>U%E` Oam?uX^,Z @{>/\Xb|={L78bEk*d'LG@oK:20#}%{OCXxQs` zC&woPGhM[MD_TUJKmOB@Tkphp+OG G|%d%D!|\J$q6u&b5Ug>\vS1Bc=-4$Arjqas2oaSuY7y f2CHMY{5`,d}Q o2kv2] 0d.>|5 %NJ}l#YcWdzk2b;qTc~H; ;oE ,@E<&u.nUQ_n}yW-l'Qz=< 6r!H\gjk?&}L!CMK.$.@U8}2.?>.wq p H &O'kI:dg4=NikH+#(dv~g@PW%z(Y$,l(mT l 0WIB=- K~t+Vf`L;,% .=PQ9z-Hhy}e; +PfnU&0DmmHmkgv;SNSn5 b'MlL$3Fbg'qA,[]S^[N!E!w;+^O%kNM)1aONXQ7H,B_$~X;Qk1g$A_ke=I$x"IC Gk8ItF*.P,$r8^lmW=>_=+9\-OI=H{piR--pDGYBoLV9ZE(2=GNYfjO:HO#[GN2HjWVawvi`hPsLo0/rgQGMWaea_Z[`y0a $2+qLy:HM,L^igqyu[E5++%~d0>0&WMy<6z[B-Iz{^]*XGiUir`{p+do[W_\926g27l<:JL>1$#$#>t3j GXSC92?Wr[g.,W]:C(`IS!*Y,d(9. dF%#@u_RyuPStV5pHdVyi'b3e-DYar1fNt[/A1Z*Dby\)Ove2^GGYma4S$hK{T%pZZmbuW ;a|vys_G([ ~m3b$vbu$Z+1P#!#@WM$kPTjpvF37C<b96Xel,qG"i~0hG5%,F|}0SeL3 "At%e.:\9)7Vv5kZi*@FB.vGD`[F#Bj #*-+"d8 2J\f]ZSTWZdox{unf`VM@'XrO;49AVp,!^/6!vujU.p`UXdz XI}a<  LDQs/|:={$n ,M|&y&\ra#:2u{Do7fj;oEyIcvo*)Tsq.gyL<Gt[Odf3gH$Bpn 3|R3"  s%uW?2$S#IOuK :w Z6R~ lN 9\}tcj?*>LNGB<6(yH2l#GH5Hmb:6iUre[TQ? Cum_SL\&o]Gc$W~K<`h8_* /~c 2M_r|{Z{ iWZz=~  rSn=-s] uz@y|5vW]( 8m749 0`qedz#tL`L- )m`C4d@$ '?='w\ 5A9sA (U+o (Gby~kE 8.t|.q,s@el[ORW^\VE2Y3(-D`7A,\AO8`$e5A4W! laYF%794Sei%'GN@7!Ii0rpS)^n@$PVqeID\uX;p\g-QA nw[S +'i'i  Hj.6T^s"^y!T.TQ)-MM9`F:Lf 5eLr]w{j7!)XI9g3psK'La"u4iACg83q#2BLXao}~o[K;55Jr0\;Vme<L>a#wV>V, 4h1>C&/2!_#0i eu2Q8k5^XrED1wp WQ#LcfR3LoEfuq`A`6(%8GTUYWbo 7Z~q?IucoEv-HWP'uL6;L^lbC I:n s.~UxpYQYh}j4k1 vurya:*MwvU' }?Z"qMAMjc73Vtxd<&}E#% ]uiX[GiNUm A:Vbkkjl{yHYH j4 lJ&  &6f6J `9"2BW^a_TTU\d_Y>~]K7"%^Hi~m_USb%a>ZzL~t7}sdRa}wI/%0Kh%g*JVTD. A`wgVJP_~Z{dSEE"Q9g XE "" (>L\hoxvgO3  l7l@ =hBjtO3'0Ly[qgXD%~trw{~hH5(->\E=]wsM!r`[bwx}[ ?h <lDx EOk6`KZV#ltP'M$"*N l5@~OCS~#+17ElT.IfH$K_S<\L]%qj p{5^xn\RFKOYTB SH{\4 jB+&9fSz~c:R $:D.> K%[; g'[|mWAywxuttxhCVv/<017cO =sICk}g? l5oQ0 C Eu<a;Yr}teG$v'qgw@c-[09hi)jsNFiT{AGx9 S[ jodcnA:I?!=!d\v GeW*q^BOzW0 /Yfk jy7bww4>c#k@&8a{'FU&9fd2Ez O~tT^-n B@~<~LB[pyI8WHblv"nTmn?@k)dc)BPL3LQRyl]8>:0c%AG5&)#4e!5.n7SB PIuIPwJ9Ll!OQ0:G8jLdn@a-pV9vZ,h)])':Mp!,+O&[\Ck~k'Xp62(Zs~{~~)G fhV9Dco VkRWE> Pv}3_eI3:X1viPQtCFln0lI,5m;l 5MG(gqeYjmcgyMvh\ZPK2l]mCjw@$& g@v]G1 )Onw*n"C^~ u%:9OH .RnyrV#_lR,k\TV]uw5"]nabk +Qu(>4 D5e0)NBQ<j?*!&-u>KApvX:1:J\`S3S=VJ-Pgz?Z(l"|cWTNRZs?s4FIA>2(pG1 1LwV0Xp{{{1:#?qK/z[LK`~ #5J[hnswyb2-f (`em>3[*DI34K",@Sl{J2zp@rYEHRelgGuoaZQ= aB0*@5tN Nul^C8m.<?4"c/gZ/;\yvPSDd"sxhI<. sW?`!82l`qa/ZmW@/%#|rw<{5_y#A%+' n24Ya Dtf9N 2o%+;"y? Ku6cA09VOBlF[jJ6)He<$'.;3zXb]J FclcTE>>ARe~Z9+3-W% :TdeY>:[*7da`N$l;| 34)16>Rfv|}xxxttnbC]%,kf+K'~ ~5EQ %l3"G *0ya1U6fl.p45X{n lAi's0zF'FG/=f#^=Q Z}Gjyxwnihv Fyo`L9z<W{8iu7]nszJ2btE}?j#:{GLm<$4St*>]|#?BBuvD mR6w*w;w%K *>8$JBR}Q)^~mWF=?Za`4`%\^"0}&/RT2%FRO,f6FaO`# ~BgvhmHc<l%c}&J_XsXC@FUq +HXdmt9J0:0Vl{ ^m~a&Qj&A[ 6Mais{,HgBX8W@},Y''"1YLB_^7zI(*Ar*`|qFVNQ%xw~|TST.?n@P,EbM]Y]?38Npu{l2yY,e:3J1?T77b_%uW{4zf>5Hi3Mhzo@j!mmAxG5\ ^>dutM +*I}`I);z\G@Op/s$XUo#`iFg LW~G=O4IF3$ :XL3gjBg5gv:uG#t+@bfNqh0Dk<{={D6iGY R_$ ;_a7:b bBSht*(hUvF!Kz-oj+%RT|,a{oL@m~1-ToOLR`dg`_v^arA Z&g 2VhnfV2mAa: {+XJEQ, Iw+h'A6;:al;um|Y }p |ypeN%E'W^-.} :T`glv rR4hSHDUpQ{.m4sB-1U..{Uc!#(:M_icIW{kQIOmO`#])` `MsG TjTjNae 0`vcL@4. &C\nQ? t+HamhZD1)u87y:%^-Wh]OJa "a %My0v  +$%fGFRuT7W}3gnir"Kas}.96^GJ}vqHeI` 19?>?U} a-/'7HPXN7\gw{}{fX\jeJ9S\VA._30o46#I|\5xkYH+ ^UP>*/% &S)Ia~ F{Lz|hTKC6'XT/Wmk`M/_pjy  !_G97;?7M M,`0P#< Qh`4 Xk  2`L\U6\Pa85b%"_Y(--Gcxrw-Y$TzAc_afY9TCzK+'Em E{eIp[OC1RNn@-,Gm%-3F_*X{eTOK=#e"PHe5 YT" (,;0  hH>A^Br5[`{{3VaKj: 'IoO"0%aBS@Y- M  b2UQZ3D|`H=IfRxveU8C?YzwDi*gPPZ~E\%a9FI *KhGjs[/~p\D 8E>L>q *# $7ASgv{_2N1lc#?iJ5o7yeh bE.1Ur~z]5 LMF;u"d8!&Ns S`!m4-KE/1?NW]L+vRCOt'XSXfLEUo/b!f d0I]UB"&@Zs[2 Jg E2\5$.Lt:Z>4zU9q 2K]\Q9Q?g!u<wdg{-r"VRnw\2jA.?i78pK, q**sI!jVqQ? /83t4XZjQA:>J]y"j7j3j$EYZJ.AmCI\=! 4X>v6m<yrP3XpbLd;[ciab_fo{o? qpsta@><4 "35/BwB{=rD%%6HZemkeUG- >;u'eC ]R sXOHB. ~ruz 5dQ@MI8yZ;2F rI#xt"-*+0?Nboqtz.8H4RlxHSJ\y]3eRnrEb(s2Ni K7~@g7<.q%CHHIV=O`$\_#RkF7N5g$ kG) 'IutP9 :xijAo?Q6q(`t}f%xR>5Hk]>-);[4[YL"FcxpS$vb^XK%>c3b 0@1 q]>.0lh,JlrJed.-):atE3o *Wh |I b I?|bA)eu1}iyduK>WWw?R{Ig6"j|=L2`<J'y L#\^ ed. ^|M ~6d 8Ujf4u: CZ R(WYJjy7?3@+r5|)x!"\Iqc\UOJXq_K@W:}lb`iuB\b:cqf2mz^Wf|Fn8ia4%6(o,_ !8=,,B_$K~ 1WrfC'r Jq~d/I.>~VLHue |@RE'yF''MQSy=1o4B?9(0GgvqPi/7q{\\r#\6Rfs~lR?-$ "4Hfc7y)F[XG-Q+ yj[WT^hzznoQ=^pv"?vDcow1FQJ-:4zQX6j4 9Pe~g63IN1$5x9 \t3;d)qI0aCa:NR<{iM 7e%i\LD?HWqAq5~[gp1bq^1PU&{F*$-4,";w Tn+pH9?Spvc[\xU4Rc`<9&[S`A[|4v"Fqk;~m]ZPQNSKB&@s""  %Fu!@KVc|$f af,j$IyM+~6mY9]6~%)(e5z;}&=,]rk`M0I[K'i i<B^H=hJ#zaMF==AMeGfyqU#7L$f3eF>kiJ# pdK\YQE}EfDN+Ar`C m]H4Y hI1nl&'} .*1w(Qz|mWC`iS.g@&Py5U )48.i?gM0Pt\VNJ>0!# /_pTIJe3\lnaMA;>BJK>#SR9/9Y:FX #+($  8QZ{,(VT*8-g]j Oi5-s*9xQE{V-s<#'VOz$@>+ @x 0Lc T'QfT&m"AZ~ju)[-]/Llg@# Bx)GoqO _\2A|Y:T6-4`5I-A=- =w X+H]rJzv'!p`~4sR<9C^=Znzywn sc<-GF/646=Kbtt=q\NFrA.r0WqD-DY[[TOPb:yXhU I 8Wo{zy{#$eMU{.( ]\'`OD6E?Gr3+tE<6-ZqqhQ=,$<lk:{ _)>$a'RW+ -U*k?o.Q# <e)HH0B:sEr\QPd4H'Omx|tbD!}@vY*X %Ko/386?Mk%p+&)Q*1'RC| :T!x%saZ{}Ou[.s=c4(IkWN4xM$(e)}oJhxHa1D:p(!]~{%XU 3f(o 'ARQ?]cZR6,1+.sgca#alH?Fh.rC%+7IWfeX-7EkJ?Ch9|{Itv^E' 4NaebS>'pdUQLTYbe[O;"|pm5ANMA." pU5 !Br?;W<dpf;7FSL^E~|Al.U9+9bi7E=o,RxjZUZq-*E2\/]xzR&nK%(_7fwcH6% -?LC%z>>[ekcYG* d7a Vxpoy~@~j+(5hlN-s`Q:. n2p69na>~<E4HX;2N8h;g|ic`[YP6>PJnD)]V~"6GQV\apwfSKEO`y!&URV+ /` qXOLLKIDJXnV/H^pzufFwY3R mL2:^H5BKKOR^pH 8T[L3 %R WssSlvfGa3%>\r~pR%y3jRIRf|sG* RO_%K:j@r7\$V_(qX=$`2}A )` >m4(vVHr60ord6Eg;$zB;xx]A,!'(fD3-=Y>w 6EB.Rq%fTNJIGQcSu7E='HG\#P J3OsIiz{qY>vm_R>+/=E=%b5yo~ >c)v3V3g.hl9TGpR4 9i"0j'6CWit~||N Cu'n$"FSDQ z+}r2Jv{r_C'UP=o}Ez@.TtF ijZMG>AGXi *Kr)FjhA|hYVa~+n #,% q: "G|wgYM@<=Nm#- Y-~> -U[}6`.x0Vh6Z/cE qJ  1gW5g 9eEYfbT?F !2EXjwx{xyz|$Io0moI1/8ia]e0c6 wdH.Z~Ty"c21R\ s<o[7$#.KlsCHC6$dcnC  4y/ S1|<qf3bZL}Y=(   ~DW0Aws;7T!|X0 u8'\8Zd^XRXgw5}3<vtEza@c J Sj^7:)C^# 4Uj{~ASUH;50;AGA!WDz~RXR-Uo{`]R6.~i5Tp $T }aO<*!P*$^>\kdO2?w=z%@G=)EECE,0Jn "-;Fcl$~ >\pn]9b@59Qk/Y`6  @;gA(&1HiNaP+yp^{Pb)x^G<46;SpO>NI,l>"-[Z=w3z2h?`qqjR1g#t@qdg{c2M3b;f@>3;<-mCU,xfR1uO8$@c7q^D/+w%l+eb=%*G|] .GOWYbiqkX5cQ?(4d"q-Hh|{uV)>g%tdhsztfN=2;S4ha+pns @dvtlcg{Y E][C' ?t.+pQU{:a"iE"a4i~4W"}~P!0=Qe{iEAy+0%Z/oR@1+2?ReR.cxR(tZE=8=:<2+3FOND:.,,48/ wS936Nl  2lvE @Q(*Q)[+[Gq&;Qbsxzwle[B []?@\LLb 0fd=K5x8)5:6,%!.Ekqe\J3\n+1m;v.Wzm.]<%_ s@`#oE-FqQL^[(Z%.%US{_RPZ{.s.^~hXF<.xhkwnjw S~Q/"6O\d]A"_Npzya< jMDQh{X'};K #N[ 9\56#Rn3 F"?G5 I /I_z|Z6&l<"}#0$|fILY_:^<8HC1S0#9Jdu|uiehm}]voR( C&r4EDFCSp@#+.5960TZ(*qj^/7^  O ]un{K&=NL36"EZkrw{R1/Ji # =i -U~}LS-4\\' #?O]dloh`I)l8 )U}T) 3^rp'%mKu{oN'umk}qbnW( 4Xrt\!f_NIR_oz>V$ F FpQM2VkeW9Wd<)k(J\SB& (ZLb3`knT;OCz2gEwqS=22?P`jmdRD@Rt2lyAGi.k<.F*PtU9) o<~*W!,5<@?2{_XYqc56h"&'"%,>RixyjVF;?Mcz~X, Dj#5?S_d[I*{ImZRLNL:$@/lf< &?Pah`M+$) l9 +Ha{iK) )7H\q>@?th?^B)WW/+LzFeokU7e.6% ~lL:phgzN{Eiw[LJe4Tgj^TB5*%$,4881) x[> wZD1Aj6i 7UP(vt;mVeW;/I|T~tr7Z3<>AENVUM9tM)x:e$ .HZ`R<4rAy8Wos7o1b.or)4zc9]9WrZC$}y/bP5k$pI,.T(RJ-M}]<" npQ>, byG(&7MdqiU4-F^4P'8HYg~kN%p8{W1" 1Vm>x{YV?{`>}<ebkPEBLYoO\OYs?}2RQEwg: _E-_pqEOo379pr'sS=n8Z*vldhglfbRC+#Qs.xS6#Cq=#7HUcv)h<{f5W*s:@K2FVZTH3"EqDftkG euG(&=XvY11Nt4LctxJ &*+[KeqeXC3( Ildl5m6Z{QJsI;JRI0Nt: mN92Crz  xiSC/j2FErx^5 {P)b=G qSqt]9X*8Xli=_ EtJ/f@mh4vps@}YIL %N=p:^ym9?sT<1# fL=I`h}%h@k|DJ'eoRHEP]u BmsS$E~:1WxR\*n;BnM2 KWyB $M/{*AL?/j4tO-O> X{OJm\O>0Jr 'Gk)`2jX(t_8}:{dTB&[23Pp;=+X Mv'D~I WKYsIdaK" 4f3H[dmnkjilk^@U6$U13!>vuZB& -[/( O jI*~O(EyE5DEIFJKPMA z;=\Kz 2>5*mVzYCBGLX[]XTR[sZghrB"Uho~P<]d00PA- 0aC /CW_g`[RQV\lu{n_C0")?d'-u7r]PHOhBm|^C(,QR}rs{oK+}Dw7NM.sNO-'hQIx_N6pg`ZSG?9337F\}:7 g/Z-rhx;x wV=."6S{>`&cH[aT=uApU7 )Kn~oNAQ)%+7APe|;MY]YXQOGIA;&tmun#x AomK*!...+\(8j*Tu}tt|=_|'U0@JNL:Kw-M'*DYi|"@_u|~{yUqd$}U*h[MID@>:941+1<]KbB)(7eb Gy|dE5i oc_^Q:7I{mJ+!0X[l 9_t@yK vZ5R5~R (,<PmpXC%1N=D{>f*>C>29}8e.Ni}b:{ZB)0V0)oYIIIW]gd`U=!lS9%As4O\glmvEpQql(|l_]Z\Y^Z[WTYdx(n"@V_bWE)a&US8o}<X+NnvZ?dI0$##%.w@ Ovw[.!!w8e&rvQ?vGW;tQ/4-Tp/x]C) uG$uW/ 39E.l  f@r+XkY^n$:?:) ,WEm :s2_z{sic_ZVH0 =,Di?Ix&`=3nvf^UUNJ:+vE CRN(DXbhyX%n0ZPWf/a'dA30FhBmT4YysT/]8n:k# (?[z*d%o(_h-IO|U?5>Ur5i&]:q;bJL}C ~S-xdTF;4*./69;6' ;,~#qH}"/>DE/UuG#{dWNQUcrybV_v #>Vs":IPMS^ra.eTHOTZVF0lC}U6 &/++-0Ej7@]llmm{|_NHXn+;9.kG |}utw!Nl}q\A&L"<LH='}]<}uleYJ/65Mk oN;8If?otgSD3$"&:^1FG2 Sb"aW\g%w #4EVix~rW7 g'`$t_bv.yF 3aQ[4FJ76IwV3"Fr -Jf+9EFE<0( {^={gL* Zpiz%SuD}Ig@1~9\A&gJ/q:L{6GPOG7+  "%"$9V|O~e\WZWQF2# f4-^R  :\(3>ITo8Wqb,gTEbV`$Kgx|tmdRD3-.:QlHe$:75YdG(tK1&1Go#kD| V-;Y%r#@`h8ND}C"f*\[f B~oE|u{$l-c;YouobN;*p:8`ww]2bTUd~5Wt -E[w :4LwF nTHPl/=E@:46>G]}Dx(h O}{wnXA% ?vJwnjmt|]6l{\6nn;;e$/1/#(`>Yi&Yb,cE-weWJ7h@QXOG=@H\o,if RkH%z<^PXvA7-t;RkfL3)(/8;2Ou3tstlkDoX"Qm{viL,d:~b4]S+"%W48iw]8A{s:mQ9.)&-262cu;"HZ 2a"@Zo1YpqUcCnI56EZ}{_:_D0!+@hR6yZ&JNxuppu GaS9{1f0]G8<DZs'5>=;2! ~FEa0=(zkZ+k(BPWN@%,PY;1=RogO:'y[=&4dQrjL/780&i C yR,q7s@6Rv%b:Wk2q5~zrpmhhm{n.p`TPRSSIB821;Ps1U,CO t&G +Jcz_I85s}?4l;p(h*4=::0- vp"h^p"P ?wI,+ClT&q L2OffS,nXRS]k />P^dh_VE/i?q@(g%3Jg<T^]GYPj< /c2kvfbiyW7#"2TvP"tzAiCd. 1Yt,87. *Jv+BUo~h>b[X6  "Ck+7L_{ <Nblw~}HxsQ&k4X3'CgpX>4.:On3KV]a\`diny%Xf4{N`C*{IDW~?n?Xeovy}xdCW:+$,8HSR@$_6-^8HNIB848Db-Yw.ITK3qXI8' E{ "c! (P3n'`@]giaWMBCMh9J{xHO|}M){aM820A{Z$Xp@cs]OF8"t`K3s`K=25CaI2R3T|\.r\K;}eYbv}st6BNMRMQNPPYbq{}hS< 3@@<*qkdjoz G vst:\e:|$]^kD%\: tWGDK`rrKk@(#8U28Y!=LI9#Aet.{P1"1E^+HUZWK?0#4d'pIx 1LgrBS,;4FQI4q_Z^m!?Vr %Kw+v8]jaAEr8}^;{iil|"U b@((:Kbs|ykV?(-SOv7AA0}@^04i! T k*tlz 7^BdDBl~R"a!bG?q$_?t oaW$mk@\ Fl$Sb9#%4W 9e/(-18Qq<dx~zw]<G53M tbazLMN2M`fu!n#} 4C>* rBdt2Eq, 2YK n =_z-BMSX`inpjZJ.2n dr[<(e 2Kan\:Xgopnpqx|ymQ3h6tS4Jw",.1-/-4=TnMr?9eXRZdkpk_H2,Nj|NQ0'?p g,EME@CTsiD $.4/,))+,6@PYfikaQ3 `+(U*N{1RklE[+j<kM7'$'+5@L[kSQDpI#xZ7k=rZQOZn*dP~ /1)m(wbWcsK5XmhJSmL'xT, F}a.2$s9)[_  <gx`A& fG,|ty{`M=6=G\l `6 &4==CGYz,j|T0 #:OTH(|?2XE9Tqh6V&]?nk0_(yCV(RX R2HVVQ@*Qd%2W}X(zbXUbw;t0h$i7O[djr{ziS6}ImN2qR8umtJI%06?A7( d?$c)_B83! AuM% 6t%4y7i5P[R5dOf| Ss]UNU[mHz7o 3H]m} 'IkuNq6mC`~@5tW a+Vz0EV^eglle]H3~=~M)V~,Z3-K|UC~ M!n t=zZ>X(~N79Mk +G^~L,Ki &:B9#lSKVq  i: rS-FyD2Vlvq^DIn(i>&'=Zz-`X?\fVO[t:j.cvIi7E%Bc8EPQI;+'T#E^g`O>0+3>Q]mqxsa? l crM;05B]{wFEd1k!Qjsm]D/}Z9 *>MSWN<#}hZPRYq%W8RqrQ*sN0 tdXMD2$rZ?+D~5m .C_@^aW5kH(e\g<wwcWJ>97:6.@E)u5ro:bF' zS;*/Hs)bpHEQvt+Pv,`'Sv~Z2 &Ce},Ketzr_L3W.Vxu'yj5JPLA0&#*9CNNE2g?kHh]5$7Kb$q3`4g7R_f`YJ4#  T {;rN&[2 &@]6e3[w7^  xsl\K- }_:Nl-jL7($)8Tv fLHSM'68+j2a#jI*TN (\ }\&LN<p87y  fdx @omJfC1,3IjC{Chy ?vr?42VzI.W=8LiMJ.R&--"``DC;4~w~&r7 r&n,:DJOWar~}`4[?78ENTM6PV/`.bd7 s\C0o@ qX@x9sM,"O&u=bwq]MNTivBgWJ<2" [8" *Nv>K e5Zlsqj_L6w9x4u=HL{qC#S|%Jo!8GB-l *Bdj:)Q9k:hHvSmH9:Tw <`} uq|r7]MY|6n/OegaM6"   p0W1Su,:GKW]dglpt}vjQ2jI.H} '<Wp  4K_edS1feoM2(3Q=u =v  yR/ ,D_ug]]]]P<s?hK+ 0b C|F~7e}j]RLD@-{t Heb>(%,4@@=93@XcfN5VcbJ'>}BmU8qO2#j'h G~3`a~,WmD!"Lr^8~)NlyxlT6hE*R _Cl@! (Cf _J.Jh[/20,$%*4:@A5#\gvh[I0{si\Q?0"!+DsFF"] )@Zjrq`E}>q+g.lWK??@JQ\dhns|0IU_aktTG"""~V'x;s.sB (P BnvZB2*7Q{;^txrdTLJPf=lB{Q2|)_%[.*ZW5mf4nXKP^o<bsdWPOUdylC W.4u V}hUNLNYex]6 1_Br_/X!oX;ySB>Mj!=LL@* Hr1Iaoz{u_H)@`z}lS2 '9M[cinw !yhTF2 g=("'10"m`W_hC_Y%uQ(2i)fnWQSh 2J[YSC7.%(0D]&I^bQ#=nI2-4MlXK~0m O9gB,+7Rw]?'bqCe(FR *i1p)Ddy|mW?." '7FXbiiddem+Kbnj[D. RzR5YiqjW;!7Pr!Lx2c#PzsC ~+,tw6 rZH;_xuV3 q_B"oH(t13I" &EdzHABp<`nLts{hBzwzyqbK1 !Bh4NikJ.#&,?O]f_U?(ug]VLJGHQ\rxT*0Ge.Rxqf`dlx|tvxS`:$!(8GV\bbemx2R{ ('V bA/**4:<92 !=Zu{`W`Z I{  j7WY \.UT +?W{?m '@RUUI:%n/3c?jP;#+q$F1F[n3`zQ/h,a$YC`ol[>!08HVap{j]{XKMbz?q2GRPK?7/19Pg{kUF4% '7>?5c3  @s$Jqf # ^0\'hQ4o`G( *g aP/\@RO=N>H^JQi"Hhv~xlVE51.8;@;'AQDzz=`7~T+?~^$*" w^A+ #BYjxO1z4Dr8S`YQEEPc,74`4&<VlzR]) 9nHD:R\aV8b)|R*~ia_gs|xaBa!u[TbM2Rq ,CXegf[L1cPB8=Ig\2jzbG.xnc\L:IgnN&nV;!*4?HL^x[3A:&r`VH>-#!#GaLGHSZ\O9I&l%c.VppeXND2tXE1+',?_4RegbQ9`9v`ODFQf}{{{qdJ"w]LO[m4v T ^#YR1mj0T:)" #*('2\&wi?# 'A^Hewtooorm[Ca]=E-i"Ha_U6GAxP;e*:DHA1WabM:*}`B( ?mGq1Y~.Jb~"Dd|tR1F@nFQ~K! ?a U2k(_G0h}V+uHaI 2dFX'Pu=XtwaAu/QUZYvE#)Is"c=3,,#c~R%oR,^)p):Dl9%OGT+p6Pj,fWE3 FT h6l@"MHl0Pjxzmifq}\'sA!%Ej*@Wo)aW;)-9O[cXAyM!b/s[PRVf{ 7X} ;e'>Pexa+d#siYH(h ZMt/Kt7b   {HV/pM<2*,16GYuE}9Wu_, (?P[bae^[NA*{raL+ y|O .G_ij^F*9b|sstwcV?*&2=BDDA640238DRcr|yo\G*aC&1Z"76-s]L;0+(,5B\|EcK>52/*" kbWWZbxe7SU>kP5("!#-7DWhx}vrpnyl!~7>h-Icu|~rcM5e.q_cu LQxR. 0Vs!Dj~\9R"n\RU_x)Jv7n|R_Y(Dy6riP<+&DU^T=O3%8Jd:L| !<IM=EL ~rqllZDv? =~*O;r'761 X+dH#aB(!"" _;+*Bg d'l6w"/5547:AE;.t*z#l]`{%)#mI!zvzAu%^yQxcWOLHKQYi.Kj!U~Y,U,h?! .?Yk8XvjD AZ/ :[{ !4Fi>l#T :Rdlrm^Ecd gdOLR]s ,Y%T'12$ 7d SmDI yaM8'2i;{!'123,)&'6IdysR+rQ7.0#wQ-oP84A_K[taURVi$=O_beWCr*J[ ';SmrZ=% hUF<=AMYfknje`ZXXXSNI9,pe\amAf&Cd0a '5:>;0$o=G{[1:`Jx9RcggV=rQ4@F+Mv :f%Er'?JD9)"!2Ov-4." n3Ce3?tC'@FB(`$<dYe `4z5z$ZoK(iCzfN=.(+7U fr.SktreQ2b1h@=K$ *DQabc`]kD%T~hd T(520 q(sXo(Sze`d| *?O]i3rN0m &IfhJ({3A92]F4+#&,@\Fk@s-`ww)s!98)VXHZ' Dm-KxcP`7 fC N DuuR4gEE_QTh 8i-UluiO&T#4Pk[!-- .G`glf_SJ:. BCC 0Z8_4_![/6/v_H,oX=Qtxz}sb?tH 0UDS^Dr*f[&{=a:U"u[:AyI#Ht/EWdowz|wgV<%}pdkt^*R`x,_CD1YyiK. zlfn{}P}laep 1Np+-%Pulge\VLC5+%4Nw*6CAB:6+ AY]XE) x\E,"=_+l@`p~jL"Y2 uZ7{R*BY6p*>O[bbRA ZSDx,APRNA1$mZ=#smz^W9vmQ8x[E=?FUbq{}rY=aG/&")1593,!)6JTbchbb]Y`l   2J^mngWG<:EVnv]7{^> (Ju&- zO+,Dh6xB_t i%k38Ogzr? yc]v'wHrkZOC@;;6622-+&{xQ{Q+kR5q\VZnA&e  4I\mv}qX9pK"_+c|z9Y2a ;r ,Jdzr]?%  &$^o#vF( '3AM]lC}hq )-.8DZr v21bEqQ8d>%3\DU'4>?BCKV]hnsrss{vKdH. 7Qq-:EMRYcjxufWIKY7{mP8& qA XwM2(,8Qi '-#qYC,g87&|By#`(^|_6{[<eG& wrqpqnlh\Q@/ .CVm?`['g@N'57:78<BPbw'LU5 +;OiS%('w_F.%+% '# [,yeWRKQWgw D,Lab\L=/+*4@JX\bagkxs< +Ji~sl[L7%f7|$11 O>/Zu}wroywE~[:mZTRPSOH6xjjhow;c\F\(B]lyuhH*pn$p5lQ4 -YlI9$l#:?=%,d<n;mcj} $7DQ^j|cJ/2Q.f(OvC_uqaD$A?;'29--6?>71(#)9Wz:NammlaQ<* "-9BHHHDHLMTY_fow~r^C+3HPM=##:\~-6:1("\s-#%*.6?N_p Y#!jkQ_;lP9`=! +YM~{\A41:DKSTVUYdm[}5u]K:* ,WFJ AoiBxdG2#$+AYzj?{E Y6 7Pt G2Ys{bR@4',Io-Li}|mVA)t-F wZG=@JP^dpw|`8g{xcA .`"B]kvvqmigigihf]UD3i!mwI64Fc.ARdp~7a|rklu*TweEXVZ4LO{unru~qh^dpW6z>LH1 Z!zN)G]nuuoaJ(pH'"2BQVYRH6=>&QgfcP<p5wcP4 CbyeO<-F4I\j{'DlwM#*53$]hWH>,uV;46@Wp+Rr  )B_=`t|oU%RS4" 2 fZLE4 ^tSIK\u(6@DIIQUcs  kM-1Z(c8FPRLG?820++&$!xg]]Zak{_)}M*ujadjzC[>R]S>Rv?>n+Kq!:D;FC}D1](MkG 34zU;'!$)8H^}0d1CNTOI;&p':vM1!qQ5! +58;73/+3E^G?}I>hrQ. g:{N`1wR/#;VtIK]xuz  MoK*[!a!p= Mf,m3vF|eM7t[<}O#l`XS\jK-j1v"LtuD L}P'xyxyrjZM:.! 3j'f)FU\ad`^R?cE$Il 6`n\MLUs"qCv~gCIQn$W`2$\c;eQEmufRC3,$$ ^5l6 vY@3/|re[G+\Uhx90+x:p '+4>Qgp8Tl4qS5  "((,.5DSi~(h Mhzzr\D$`<fVE:(RLk~iT8X!;a*E]yQ#S*2-( e2^>57CWgutn[?$ !'9Kc|!-5DRftaXVTXXXRF;)  .` rM8+-9EYgva1q`O5s7"b\Dx   mL4 TyO4 :^'z':A;3+)4Kp@x,99&l7 !4;:%9}Q.p\NBBGPcw&S KxfC" *--( +>SeuuscM.bD+PtGj2FWesoU2~S. ;\|}hJ/ b7 }Cq *LsqI&5N`nqphYK7" aG1*(08@@9$ Q2T{Kr7SmxyfI U&Nh4}^B$  '2>Rc6m!ZGtsYA%]*`=# '/2:;>?<>@IWp#*38AN]yJDcoo]65d.mG[>49Lj=egF3-;XLizvcA{_F- Dy5Qemvy&E[cfaXQLHE;2"|U+xX=)%358428CYy5c^;~j\RNIF>6( !M"}(n8VvsHTDvlhf_abhpyzsnhinz|seccdo}$BdU$a9!&%'&*5EaB_~-J_swzn]H2jE, ulo} "! 6]vL tbSD9, ONnxqW:tc]as'Le|1l  XPr`TXg2BKKC9,$$(/.#~v|6Rq{cI3iQ7#!4AKS]eq{ )*! =_~   ';Qbe`K1ybG. #AbuDd2 eG) \G%Qu(5CNY\]QD' |].kZ+0Pq>#q>sCt['cD'X'|;dv< )7OnLho M.ET\VH*A-d Q7)!"% N0$g Fr-:HRdti/_]'OAhH6*.5FXkP~NXfm}9Wm  qU6vbL?)Q`>fuQ%tx)8AMWcdaW@"wz5\3Vw]1r?t$Y5+3Nm!>_{*=GMMB5%#7Uorf\TSVZ`^\SF2d>+m%Nm|}xqv|x`LA?ER`qv\?>kwLwG9VrraSQOOHB7.-5FeBu"T(RrmHQxT*lE1%+5CTbr}! w4xv>Jy1BGJ;'lG%s:rxT~r<9bg-_~{wvh]E.wU/_+{rib_er@eV'NfsqaF!oXA-}zviZB'nT. 7%wlF@U`]UG;0++.-&Q GyV3 5`+Fj Vb)uaTSR[_edcZG8(#*@dAs &Gc'W8mTHP_,zfa_l{N,MekeU>($5Kbv:Xo~tcQ;#wAp9sYH5/2Cj a4J_xYA]opiYMC@I\pt4OHzdYJ;% %}^^R o|Oh%Pn.q]B%_2`gMcEP}d<a3 kF#V,shbVRRNTXbn}B#?;teM/lE!hDq^PB6'|J$hJQ0LcMPeB.+8Srw`QF;40+1:Tt'?JD6,\-w49.b8 ~W6w_K;-*-:QiNpVPZt3\,_oT,_;(&AiAj}@n0+:DSa~,3{pH%_4 1Uw 097(4q{B -V C{ bL}Q`aVNMQRSKF6*'Grxs{[\@shF) PF7|R(4I\iv{ G;Ui!TyR4.qN8,0:L[lx~/GY^cbm{>_TF*\qS$MI.Myjjtk R%^3Repquuxx{rhO)s,M T#7M}Ew ,CJOLLMNW^eg\M.dTVbo{~{fM+ wh\LEAETg 7TqsM'yqokljns|!Pv hR;)iN7/4?Un/FYktqiVB% qhfo@nlR=%}gVJOWlrU8>f .Ii !$  t@^:!!6I\fonuz!&9Lbo}~}r[E'$KynO-sBybP=1%%+Dg&r Q -0(torxy|wpeTG:2-&'$&! ~T*x}R f#]1>?=;5765'mS_+}&EYafn~7~9^x~|wti^B$d(b5Bl 4KYa_VG1#/Ie 1WztA`>(|xurmdR>&wic_lz 7l <Udij`UF;212<BLQPPHD=;<>FO\iq}u]D!jaVWXew&6FWm=SiymS3xHyvux{{~{zw{{|hV<, 1e4FNMMLPXez{P%_1 "?\u %,>Qi )U,b^">Zx-wJ' 1Mo&$MU k/ 6PTK1 PIt-w8=mV!C\gnjcYQT_| AyA` =w?`tzqS)>bt6f0Y+&[6+x0CJH@/! !3HU``aYVOSVdn{c= i3ylhq)Qn6d*2764*"  vDwsnpqnpoqnjd]L>.'"%,=Mf| HtuS7uKo?  )M`H%,-"gR@4*(&$&$ i>0a!7HQMKB>42))(,5=L[kyuY7,77# r]G1%@\Iz|dI7(!*7H]rwdQC98<H[q&AQXSE* m-wuzcVKG@;5)$$2Kl=SXS>" ~kYH;//4H^|  4Ot{_: X5 9pJp|ywwvuqplppwzz|zzz|~_4CB`<(!.If(`XzLr{l]WZ_trD!c> X<{lt)W-Om9xO}NlF& b:ypszsqsD^&fIag]C#kBQ=U( )E]|2Uy#Lu?c#4A@7' y@O?o>t[PEJTo P)iA>Zde[QFGNXgu|mP5f7G_9+a Hz8WR~_:yP#t:gH. $Hk?o I#$"-6DKQMG:( }T-u[D/  kXRNSZm2e1Ut&3:;=<?BCIKQWaqzN|'3^%"O6Tm[/gyAq&Xi+hSIUxbH$wzbJ=4<H`*/<EWod]Y x4jel6w+Y*ZzkZN?766AM^n|^9 c@'} -YCt<\~cD$maPG:4-$rcbistaWME=."-QzeH5" &Bkb0FJH:!Z4 5^5KZ``UE*r3m1Br.CIFA-vhYJ>1.)4Ca9^ynQ,[uO94vU+jV0,Jng0rImpR-f9`=-KklZF3j> Eq@fB^AazmP%q5oQ3rY;U Bn)Hbz~mU?$i9lE* '7AF<'tE )A[}-_-_6kb4kF# (ASiu|sgYM6# mW@+:bd#Xb0Sm#L *V#%%  4Rp-d25Uln`= x#iZ d<!Al^[F$&Q- }tg]M<"a8R Y6-Ht$j2pOIxuDc0}lY:tA3PqP;{6yfCs~Y,oI"P?9c/ @{Q-l3NlrIjC!~ysfX@%sjq">[v'W?x5Qab[G(bC(iDseRE2\<#PU !3793,++5<KW]dfhgddaa[UL>727DToSb,$7L^u"Go4J[WK, Y<'(<^JwpC t\C9qpXsV$R CYaU@k[WYdq`/oI&};}B~?\xZ<jJ%zS0 ,Mt An}eL2tdaix S (Pv/d ?rm1g-2G\iwxiV?) e6EG !vBtV4 }T8%(=ZJ,J]a[J5':QapzGmnO+XJ;Wx &3GVfnuo_H&t]VS]p$P|aB uW1 'V~~yumhb\\Y\Zagy,|$qnB uXD.# kI'?d$LovI wj]K9 }`H916AUs7v1p>gjQ3hYMB@?ENQWTQH@7+# wM'?{=vphVE( fH-#$0G^qtcSH@98:@DLIG>."  +IjR9_t|raO4wM&'Py v[>(j=^*i<N _@& uZ?,$$/AM_ers2oEmd?"h4NeK1#$.6?FKSbq2gAYqkS?(f>ukqd<z)Y$7DKOHB4*sGmL'JhoN?59EPf}8c/SK+Xr|urlke[H0 {ePD6" Q U&$Q~Dx#gF ?gx[8rS8[@*s= W-t^OOYoE>> EqsM"mN0 Y8,QwF{ /VvQ|m4^0i?n>oF"+Fk 2Pm&:IYjupP$tbQ@5) )W%{<NFbuuhIRYJV*$E_zCq">MW\\agqx{mU:oA:G[C41/240/-0?W `e@ R{0>OYdej`XD0iC%g6X,%:GU`n '2>GVexoK#2FOQA,V'"?[y"Lw%**%gP<3-17;@ADEGNWdpzzdN7# 4MlZ vI# +>GKB5%&6Qi9M_gd_OA/# #7S{k6{s`L- va\fy2uPXsKZ:! |rf]M7#  4Hc|O@tvA}6L#6So 3Y 5_mIT r2!2=DP]s&R rM$ tM1.CYvP CojG_;kC vS2$Dw@5IZf<w;\}g8xU4wS5 KAm^Z\\aeiop|H]S/k $*00)b$i2 `4}mdem} (6CRlJD yY5 [)"]0.Nr1Rn  # lYA3)y^PJYw5ZveM1 '-(b5 ';PoQ ?VXN3i9seXZd};p.T{   Xrt'whklwxsx .R{9Qiz   V4 ~zqpnt|.dWlM%yI?_xaE0dK3&'7L_y152!sV:'H~H(g{cK8$X+ze[VY\eheZH0#Bd2Or!DgxnkaZL>&t_G$b'hC%2SpCl:Vkxxwuy*Cf7WfdW<\6[#xG&=PilN9($0APev -Oq(<NXemuqn^L, vY;%f5|iWD."PV<q,Uv*15864-pHiK7!hC"+G[gqv Nun7dRD:2&:k%E_lusi^M:!&:Sn! ~pe]YZdrMtH$*FcI  oQ4 /b"?QY^bffe_UE.nQ7tbTB/3Li+08=DGOTbqnRA4,06BGKB5SkN?1..5D]VHpAe|wnlidb`^]]erh6c\(oWK?8-+$%(,8ASf H+HYWM3:d&;WvZEkRKPWcqw}o_A#  >r4a 1J]gjlfe][OF5%nAQ[&{T)|]A62;Ha>v*`<p+998469CLOOD1ybXTT\`hkgd\UL@7,"zh]SNIA;430:Fa$f;`zmN&rN&fC! 5Z#ARdlrrjaQ?-0Met|wmU@" j=c>% 1[^ 7XxMZ6~wk]F&e7?~D4Up~oKo: |AOP:U=f 3Um}|jG7Z#bB*#)=]@m mP5V(hM981#UW=b*P5`3Vq~hN- /VuR4hJ/KR7s*Xr~nZE7-/4;HRbp.7?>?>IWs%"nR9&pB-FU_a[UM?2!(MvZKtlV8zcJ9&^3 1GZedaVM>4& );Uo:d",/%}\2xgVA0 4_gH,0Q~;m?Ymxxxuy{}[*M#sigijoruqng^\[^firuxtneTF8%#8St 0Tr{gS;% }tcQ:' !8Z&Hezzn]PC>:9>EQ`m~Cg|M7|Q6 xx{ 5k'G[hhaO5.10&,:JRURD7" w@Q K/X|?l2Oj~{l_ZY[VM9!uZ?'q]G0x|;Udq{ ")47:1$ -CUiywmg^UK;,{mbbgp{&;Un2UnzdM0T,pU:)IgKz.])@QUVK>)X+mJ+zh\J9qS>36Eb4c$YC!BSTK6I S!}jG!mR>:7@FQY]dejiq{?gLQ(D\lwulW4 a[&n\SGA4,)"&*7BSfv.I`}#.0-!p; {R20nMvmW9)7EMOQQSUUY[]_^fp|oe^[W[\bchfd\M=(jW@1 4_":Ws  lI) zpsuyj]YU^e{W4^Ic+~dM>7c:b $8EHIC</e<oYF1#  +:JV[aa^YSJEB=AEQaz1:CDFKP`r rI|N'18@:1&Bt>]oz~BmtfXPKGMUftmAiV*l7gXQYh8w;q #.5BN]hxwxv{hG%zmbfky /B[v{aD#%;PmnL%d: !6M]o}xocSG;5+$.j/i(124/+}k]J:-#%+@Xz[.tt|"Jqw[>*%.53*^4 ,471*!5Ps5bt]E6-%*3DXptjbYXVVXVWTPF7,Ev~rdXI8&  nV@0##,A]IrfF" #:O^cd\O4lR8!!Cr"\,BS`de`O9~aK80%]5 *Qy(9@DAB>987853*!yhWSS]kx$.*a4 "1Hi ,Ts!RyaWTWY[O2 Zs\J7.%(1Fa|yX>,(.Ee !;Y{1OctwtaFh#V!t^;3w T)ESZXSMMR]u%WsX8kK$ $-9ADGB<2" %(,&" pR3&W9esZ8{jZPE=2+"#"/HFA4 )0~X=+"*7Ndu>g JjsY5 i6tfaXUPQSY]eimlbXH:-'&)6DXk'8J^m}{fElM1%Ik'a2Maec\OKGKT\hpyxwn\K3p\F7( SV)0Qz-b\6`~Fp+~yqmaS; w^L>6236699<Xy qT7xne\XPG2gWW^s3iH|.6AFIJJFC<8."~qfa[YXUX]eqzzgP4xV: %Gl,A]rxfM4~cI5( &3Lg0L^qxhO4ylc^YWPJA;1,$$%/;I_w5i$<RW\TN>0mUA+Y2lXI@AIa-uD{|~|viP6(:FG?+Y8"2AN]kR*SzqN-m> fSOTcq unln{   |x|}|xpcZSQSU`iv7TgqxxwohYM<0'"1=O]ejjmkqw~xpmif^WI?.& sTQ`u 7Ol *EY__M4T-,;HQZan Z/ylhgjqzwaJ91%(&*('!1T(_fP6sUA59Fa7a}iJ1!8Qd| yLo[OUaw2?LNMC<6/238770nBfI:56DWr4GPY\^^cis 5I_v?im<W&}rk^VH@1*"%->Wx %.=IZgwxdSE:4.& ~X5+=IUVXUTX_r "3D]rtXA*  %1@L\l)Jl_ S|lbWTSQW]djjhbYJ<) vbOIK[{Z"d >LPF4sY?!p`]`j|oP7!'EhEs )9O`u~x]6M  gF( .F^y~vnaXI@1)!5Qx<l7P[_[K<(z^A 9RbfaRA0 #)*)//=I]jtrfI&pJ+ %Dr/Qkw|vh]PD7(bC"#Ox3MgEl *:FH>, n(L sVHEINUUSI<)xojhns (Hq^6yj9U` c2 $.Fe>[/m 4[}  }Sc~3aC%oT=',Fh 1Rq 2^<[ygCxI' zF L?p+S}.D[hy +=KKF8!v`E!yfWTRX\dmpw!7L]epv~~saT@*P!y]I93/4tX>*!)7@KR^iz?~4_Y.]'eM:)"1@Siud]XW]i{,Nn %4BBE??5.$n:o]F1.H[ny~zumkhkmy '2BQ`nurbL/ ,ARfv}jP7 tZB0*1B[} "2DPaouof]PC3'"2EVk|waD&nH#}Bs.F]mtwsi[L;&8Rob=x{9ie: d@$&Dd2PlhN2-:FS^gh_N2W*dK5+&,6Lc~>mR Ajwia]ailrtxw{wzulaO;yY:g:gN4+%1Cf"T~!4CVcr{qW:)U%o`OG>@GSn2Y<^z7Uq~~kS8+3:73$wK lG%X\e<iK2#N?[q}~vkYH/ycTA7+#!/AZw"=Vkvzxqqot|%BZtz\;{@W(7[(IbswyqhUG4 -Ig~vfUA*yO$fSB532BXzTR *9RtaD&iDNzh^^o;dBevf]USKH?;2,' wK"+4>GKV`p C`wyj\G6( )>Zz+8EFF9' _= 8f4M^eaO8Z4gF, #3IZo|u[=|uu.BYh}G F~%)  ^*sYE2! vnjv4IQPH8$ (@Sgv "/@AA,`+y[I70' vbPIENWk":IV[do|0aC\mw{zwplda]UPH=/#~Q#nM;0*+.1.* 3Gg$P~+<IMIB90((.7FT^cYF&['{\=#lI* "aEn@i1;6+ 9SixzqT-JydN6&"8Qs 6[lUD0 ~wtqpt|hL9)  #9Ts5NdvqJhL81/8GVj|#Fb+;BB4]:! 0?Q_nx{yth]K9e#sH$'-+?d-k!TtfN1s_Q>0vkoz.Ha(V~:fD y[NGKOW`ced`YI;%oU8xS7%?_'`L}y_;iWNSc,Uyi?Y1 Jz 3Ofovsoga[SSNPRU\ep{ !:Odp{wjS2ASO'$Mx'@Ul+3ASd}0AScjrl\<>h3 (F`&>Sht GirY6o=X0 +A[w<b|`D& uO)wcVHFHVjL+fIxmT=fXJB6%n@ybR@4+)/8OhGK7 FroFf%f+V(vdZRV^rkTF=BOe-g5Z*Ji}v\9 `<r<urv!,8?M\l )BZn}#/7FO^kqvncK)t@cE& sT8! 1Sy 9d"9Lcz       |`D-zleYSHD;:9;AHQ]eu'Y&U{nP+T$_D, ")';h'X!%**! }eN7& +0*#9Vw*PooIO }eTMILKMF?,"?`[0 &\@qnZ>"`=%,Jn*Y!BatxmeWK8# uP({_=4Sn 1[ -I`ki`J. NiD*%/;>B>3) I{9|;s"&((,)($_4g5jQ18Rl~ "9To\;~qja`^cfs|}mYOIO^v$Mw:ZrwsooieYI* ybVRQUY\YVOA7&xQ%~} )T} ;egC |unpq~iAzG Es4_ 4:;+g: gTHN\o`7 zbL3y`ODEIUeu0h>ewkfbfgopqncZMD:6122/.#|ywwuokdb_ep| 3Y$234+p`UG=0% }bG7-'+5FZp 8N\iouunh\L7$}re][]co}(Lt "05/" zG;Y{ Ipm=\f_B*  "DpIy @[rjR2@s Z#(#a0^(Ri=>j%Lh &Hi/8;91+()-9CQX\UI1_.dJ8(b?'(My&W )JlkWLGKZlrS+ !,=N`nz{vgUA+!'020(  ~zu} &1@K^nB]wsZ4 xJ%zh[QGEDFHKHIDDBJWl$b,IYa_YO=*ydPB4$e7u`P?759I]x0\Y)a )/65-j+f,kF0J_u2HatweI0 /?IJG;0~cE'pjgtSM8m~\1`B!v]H4$  "2=MYhqsvqk`YRS]s=eHv'J`s{{oV4 ^4O nI)'8H`z? QI|%013,#a-dx-f2 $Nd|Z5t\C1':Pf|  /ETdnzkU<)!+0:AKS]`c_R@)}mfbitgR;* $:Nh}?e)SuwW/`G4( )001(|gVLEEDBFHSZn%8GZgwzgS5|jYF8-#"%.;HVcjqrroliddehks}3HYckqrtw}zk_]_jt{yvnnhiffa\TE:*!&-475/( *6CMWckv{{l^I5oJ"_4TbfdVA#qF{[8eN:0-7Pm;\w;p/n)?QRL:~1(z.kWHDDFOYi{(Ho-^=b7ScpwyveM&]P_m7nD' 'Pb2h+DXt8q;UcfZH1`9y564gWOQ^j#Bi!_1y I~'5?LR[Z[WM>,Nb$~NuV;%  #9Tu/c(;KU^m~ kM,kR>/%{ut;f%>Tbpv wJu^VR^m-Mk}~oW1 tA#(/147AOc(JbuzvfWC/#'0ARe{mK-mQ4;k$l,UwwdN2}]=% "$  tO*gWWcxGx7fvZD+mG,Rx 1?HPRTRQOSY`mz5KSTE. S!lG 3Z!<Xi|pVA-d _+|pt|\= Fu5RpuledilsvxsmaQ@.rJ`3qDJz,l V<_zz^?!vl_K:! qYB-d=GB7Wv"?WlyzxgS3wU1~|vnmmy !"&)*-/.279AJXh{ufR=%waN?1(  .>M[hu9Zx%09>;-b<jQA312?Od{?cubN:#t_F0     /F]w$AZmswsmc\ULHCA>99;=FQ^jw  oR=& */,% pdXLF>;2#RY *@Vft}{o_P:% ~bM=9>O`zlL$mM6 *A^~ +CXht|||yrg[K:! oWHCCO^p~zqbUE6(#(4Ld '0?Ne~pDiP;3,.*-)  '3=?B<5' !:_3n &**)%%$ tIV6 &6H_u2G^p'Fa}]+HnR5  6Kbq #9HSSSND>6/(! -Pttkd[UNJFEIRavqR*X$An'=Vh|zdQ<, ,EayzZ1oBtcTIACGTbzKU.BUbkt{|}zxtlica\YPI9)zW8rW9 #a U:Vx_.<xI" $( ngjo} &4>QdDMhK)n6mhhs}~s\E(?a!O}ErtJ]yEoYE7.(,8Kd +DYhs 0_8WuvcF)tO,z_MA@DJWcr~ $-8DYqbI2"#"ufccmxzbN9&#0E[qL4l }_@gByU8 6Up(?Tn,;IMRQNH8' X&gL1tO7"&5Pl 5e?a~0BMOOGA3)"'+-#yN*zsqwzl\WWbu8ShwyqfYPD;.!kI- $3>KYlGq$0<@C?</%f?}\E+AdCo -MkiH ~BZ-mXPGEFLT[`gknpu}6a5Y{CntQ+jDkY@*-d&/3469BQa}3ZxmT6nR+lA1Kh(:DOOOI?7-' !-7@GJLGA3 \-'KmGs3Qhs_L4lJ& jU8!>\8l5Pbszzp^Ck?kEz~"=Qer 3c$5@KSUY[USLF:1!uS1 4f6CKD=- [5pS8tib_aipv2ZL|#Ef  Q Q'}hXF1 ;[ *247:@Pd'4;A?;4$y^@f%d54Le,D\r 2BXj.D_r|jQ3rEtklr!3DS`cfaXG6vf`^jw1CNY^gltyyzunbWH2eH4$  '06BMZdp{ 5]*E`zvR,`@oUE<@J]o+8???:5,3F[kuxukU>m_P>0! -A[u+LqwiYJ?1%!4BRYdlwmS4*567/* *48?@CCGJNTX_bee]VKB80-&$eK=59CUjyxkaTKA=677AHXbq$Is"Lq~`C{cK7$%2<JVclv{}|}{ytpid_^__cde\R<%wnifgkrz  &9KZlxuiR=$,7BO]o   (4IWeheWE+tK$V,`: 0Kg3` (:Kbz(7FR^c_YH4eG$pVB1# );Nh$Ec0DXcjkc[K:& lN2{lbRI:2(#$-"+[8Paff[NB3/0=Pn"A^woO&C^N%  2Jk"JvDhkQ=(&2986.$ ~iP;%v{BxK}8Naktwvurlh[Q@+ a6 '..+% !%,16?ENRXVVPA4 tX? yx}#X /Ml 2CSZ^[N="W*gNC-xW1^!rWH><:?FMXev+C]};Wu)7KYfqutn\G*e=jZB1.Ll?_~yhXF;2/./69AELPMKA5 z`D++BYl%<Pg|~_<~tnlnq$9Ldz +6BLPVSL9"fE- +=O^hf`Q<#dD!{Q. (U>|"Ifz}unaUB0 #9Ut!(*$d'vI% !6To*E[xz\A'0?OVZWI9( U/#3>EMT\ju=e+Ke{ziT: lM)jUG:4+'$ (0=HTY__adjw8Xz|iTB2 |qhaXWRUSYZ_fjv %<RapzztfZF1&>Vx }vppmmmgg_UF2u^M8yW6 !>]#bJ| p]M@1,''*0:ANYcfkfbXH9$vZG3'$,;Ma|*KlwcTB1$);NbsmU6hP:'*FdiN:*)9Mf=c z^B* $:WstS2mO7=]#GehH) |{roigegkmruy{$Kw ,176831(! }eQ8(yoe_VPK?;2+   )A['R$BYgng\D&c)Q##Lu (3=IVhz/?NU]aa]T@'{I[0,Ed Di$<Tdhh^I/fM5nI$nYH8-#&'07EQ^hu-jXSNtuQ-g=Ji8xeTB808DZy5p+i?i o<H[9vmg]XUSUYco,W(Lq  qZJ9& |xsu} $?Vo(8DRZeipmfT:l.X'j?7b:\~ )8?HNXes$4>?=7,  r>I \C/"")>X9k&S|;VssR/m\J>4'" uka[ZZer ,HevZ:wW5ndhvFw !;Mbpzyojio~h@bK5#/SS  kG ym`YPJB7,+EZq3EXhxr`K1xdWMPYo7N]da\RI?621149<CIOSXUQH8' );DNNK>/{sh_QH:4-/2AQk~}zyx{~9\y{~{ytslg]TH6%{skida]\Y\dkxtZA1' $+8H^t~l]I7*%#.>Yy Iv$5CD=*vP, .Lawu]@"(*   %18<6. hD#:f!JlyeM3 !%(,15AO`reF#%-9AKQZ^eigfa[TGA962,(raXMG=72+'&%'%*-5?BDFKNNLC7# m\J>743:CQap|{qjfabcgglmrruturrnonuz;\~ztmkhkgfa\WNJDB??;998=>CEKMRTQME8+ &=QiscL8! zU2*5EUez&;Si}n\M9' *EXmw waG4 jSA/"  %1I]w4ZM{eG$OsXE3-&'&+0>I]q-7BEKQT_lgCvM)!Lz/V|~{pdK2wX8%.F`z%7PhxcJ5w_I- #A[y(F]ytdM:$ /CUdukJ(}lcXRHC9,! +@[x +I]nv|wsmd^YSM@6%)Fg~ .<J]m}zhH#a5 eH2 0U{;Pcorvwy|pR3 ~aL4" tmqy*Qx/Nj,AXmiBu7R .Tw +=KX^dd_ZPE8/#  $-469750%raN@1%#7Nk2OotaOB9.+$"~thgk}:Sboqtqg`WSQR\k}~nV;xj]VQPOOPONJF?0% !7Ts(=Zxg= Y8)Da>kxbL5=g"!i=m]OD><>HVq#<MROC1~pbYRKKHJHIJIOVcp !?Xqw_C(#6HXjyvdS<+  #>Xv_1vL. "8IYgt 2ENX]\`eqcBlZKHITd},C`{qW<$ $8KZcdcYJ1o[@)lecnCj@d+8@DA4"{>r5>h*8?CFFGGHHHIKQZ`ktvzxwxv~sO%wN,$1@IMSX_io~ $8CLMIGDEGNQZ^^]ZVPLKHJJJGD=3-%()3BPgyxeP3mYH@:@GXi""  2@GKE6#[:!Gm5e"-179;:=<84, nXA#_<  2I`t%(((%*1?Ph`5Y"x]L>679@K]l)Kx&Nn"CilS>& h?{I 3Mk)Daqti^TJA?>DKS]cd]L7|spmnicUH5(5Ot*Ig}4H[hjke]QH?4+]A& iG)"  5Sy R)d?ndF#t_N8%,IdywLxT2 ~ -DYu-@Rbz6P^igbS=( jB|K7[|6Kcszlfcjs1GXZYI3b1U/ wolu8^ymc[ZZfvKz<esGqbWNC8/"!%0481(tg_VSLKFJIRZgy!Eh|thaRG9( ^8vfVPJOZgT_fg\N6sO0  p\K6%:^Aeu^J8)%2ARcqykZPC;3/,+*,,,,-*/4>ISaipqi^K4~cSDA@EQcs !5GWahlie]VMB90,*0;I\mnVB+~fO>-'#&)27DNbs&7Jd}{ph\SD7' 5I`twnb\QJA3,  xfM3 #Ej$X2Neuz`A"y^G.{^E' {keclx"Er:p @\wpU4sdM:tfL0 zk`VUQX`m!P';Nbz:KYWQB4 gK, uh]RD7*  "-?Oe{ '6CO^hv{nZD*zqls-=FA8$vqlgcXQG?9:ANg+Rmu^C',=OZfpsxz~t\I5*" $"# sZ?( ";Zv!FmwbK.yZA( Fk*:HZj~ $,7AMVXVM;]7s\D,sc[TT[cs !=\~Cc"$# yMzxx "'+18Jb ;T`d\O5tM)t_SF@=9;9<<>BFQ]j|w[='Fc6RjwbJ2xaMLSk  #5FUes}xocYPILQcv+60% _=$r_E/q]L:/%'3Hj3k,Uy$16981+ {wyy}yvi\H3fH* +C`>h6RnxZ9}cF)kQ<)}skbXTT\mGr$B]t|bM6)!*3BKX\a[VH:)    #0@NW^^ZQE3 "$$#" wYB( ~pYB( #Ip %>Yq~slb]PG:.!jO7' %;To7Vm),0-*$~kX=& zrk`WNA8/,+0:HWj})=JQME8"3Ndt|p^K3}{:SloZH3((9K]s{X4 {_J6' +Gk0Sv{ocQ;tpqzwng^]XUSQKJIQ\u(b*Niz_@s]G6$ !$"# "$ BfpZA/ (<L]eoqx{ '2561&Z.rJ!s_PE:79;CHR\kx"Gn1[<a pIV"Qv[G=6EQ\fjlh`UE;0//:DUbjok^J2wkcbdn}oT<" !M|$A]rxm\QB7-! #6MijAwcTMFLTey&;O`x  Y2 vqsveG/$4@OXaeimovzxoi_^_fpDu%Dar{sgYPC9. wT5xm_N?' &Ko)5AL]pz[;q\MD@DIU_isz~{thYF3*?Qi}7Uq4IZ`b\L9|z~ycF0 zdRIHL\n #(% }_B(.>Se{xoi`djz&T #7BJF?1v]L?97;DLYgw vR(_4 !=Vq  zeXPMUbv  }gU@+:hY$Ll ~Le.gTGBCJQ`m}ypnor} #1CVib?v\?%mR;,);Tu 6X8gDqb<yU/y^J12Lf +Ic~*<IU]`^\RK>,lB|Gn7hD(#<]V?w(a%Pvl<;l,dC*3Pv4l%hJs   qM&^2vC k7 }|8l'pD6e_>|dQ;* $'%&"qVC3+*/>Uo 3a,H_kqk`K5fK.kWLCEKTgz '8HMJE8) "7GYhnrpjbQB./ASahnpsppmhc]ZUVY\cimmhYI0"2ATcwviWC*taL:**6HTclputsoonnuz+Ou#IgmL,pP+ t`SJNXl'E_t|mYJ9/$  '0:GSctoR/ _3 (9GZq"%'#  $+-48<@?A?A@AFISX`dc_WL<- 5Z mS<$ xaH<0-+(*)++(***.,37?HQWahrz9]woe[P?,ztorrxx{{wupkeZTMKJS]s9Wp *5=BINSTMG9'wn`N7iK0 %4AWl0Hc{xZ8xtv~5L`x",,,U"|mgny!9Mas~q^E+x`K90+084-)"  8Tp  gG. #,3;<?;3,# ~ysmdUI7*.D^yBv 5UhvwsdS:"vV:voikpv5K]ky{mbWPKJMPW^ehc^N<#`? rXF3) "+7Ok*W2X~  zofWL>+|gO<)  :Vx=d$=UnuW4hT?$ }M^< '>\8v?erbXLJED?6* rjeegpx&:Kczq_MA5/'% gC"|pkmmrx~;Vs#9Ph%2:AHGGB<4& qQ0}wliehiqu %D]{#28BGGG?6! ^'P$y_H0 Ck"S7^ (3697.#wbTKEINX]aaVG/h=OD8r4;:-h: tO/ ygYD/%Nx6e !{`;mH, +=Rf|)C_z):HNSWVXW[]agmnmeW@[#O%u`OA3.*/7H_zEr5Y| B`}f3E xP- |hZNHBGM\n#Iq#Fk#@Ypr[A#T#lJ* /Hd|-AVi}iS5&4BKMJA9- ~obSJ@:3006AVn 2Siy}{mZB& 8Xx uQ+|}xnhhkr~,:GValquohYD0 $).134340.*%#"#+1:FRX`cd`TI7& 4LaurdP@,pZG4*$%()27@HNV[aab_]]]fp $6DXetqdRF82-*-3;DR_l|hN0xtrqv} !%)%!&<M^jmng^K<%tW9"  .?Wn4Vt|pe_\UTQRLLHIFGFJJQU]cjieW?#W4 1Kn!0:JWl{u]D/  gAwkd[Z[cl"Gr J9ToyfM7rL$[2qYD;59BMbu Cm.b7WusR+V/hJ3nWC3("".8L\u8i F7Thv}thZG5 jL2|n_XPLGEB==;=ABKPZiz /Je{ "tZA# tmc]XSV\gt 5ALONG:. p`OF;=CIOPSRPJE9. v\D'N\lx3GW__\QC/ wS%NhM?85=J]r1DUct,IazveP=$(9BKOTUSPKF?;8:AIYg{seSG<2+% mYB4'+=Wq +Hgu`J9)  /@Vhx}sg[L@2&  !%($}shebdiovz )07AIT_kr{~}ztibTH<*-=O\hlqpkha]ZUX[ckxui\MD:4,( jI, !*TmvcM9(,;MZgmqpje^\YWZ[_aceca\VM>0oW:=Vr %>^wi@wL# !,9IYp7Og|       z\9^Av^QCA@N_{6Ut2J`s ubK5oWC80/37AJU]dnx&:Ph!3@N[bltvyyvocP7W$l>re^\cq}%Fk #%#&&&(&%"!"'3AWoydL4}m\I;-#%8Qw-Qu}rd\UPV\jvcDqZI6-"!)7J]u,D_tjK)sS8 -Hg $?Vfu}wkXB% ;f%?NZ[XK;%}Z/r[OHOXl~,241* 1EXfinicSC+|eSE82+*'#! %0=GVdu-I]t<TjyxiT8yW7p]O?3%  *C^y #6BLQQSTX^gltyy{xxvvtqpjfaWPHC91%pM-!BeBihL7$    ,:K]m}zdK1oT@*  ".?Oanz#Cf}xpgYI0[4'Ij *GbxdVJC<9:=CJKLF=/wdSE8,&!!#$,1=H[k=bygU@.oZC1 +;P`lz/ASajruxwxxy|`A' xgTF6,# (7Hf)KjlX< fC! %;Ws*<N]o~!_?qV6E{Oy $-6<>ACC@?<1(f@ugUE0 1GZs/FYlzwoc^YYW\]cdb_VL=0 pZI<0-,3;I\p'Day#*0) wf[NH?96011440* rV;$ |i`Zbp:Pj $9JSY]]acks|}qf]SK>8,$ sdWQMRZew 2CNY]glw  r[G*]8&.;M^z!+.1.,*$#$)3=HRSTL>+tj_WNIKN[m0?R`oxneZPC3"saNA5&  -9KZn(4@BC@3&qd[OLJNVdv)=K[ckklcZK;)<_$&'vKpI"K}/gjL2}vnibYRI:- $;Wl ,JloWE5.),3:ERYcinpoqrw{r\F.zwy}!,26410+&!  /<N\n'08BKTVWPE1mR8( {|~}~ztmc[UVW^cpw"7DRTWUOMIJJED;1$zqkhipx/Mm -Lbpxvl\E-mXA, !,8CKQSQI>.xfUG@<=ACIMRTUX^gs"Bd)0730'hJ2{kYOHGMUdt ,B\y2G[dlieUG-rJ"rI tmgbbcgks{?e>[y %,6::<992,!cC&weVH90)('/6EVdw:b $?Ul_?d;t^F5#"7L^w *JfnS2 ".9AEIJMQVbr}_E&p`RG?@HSh &)"jF) 5G]kx|~6Ytz{~viec`eisyo\>c5 )Ec:_   nT>%oR9 2Tu=k+69<53("weU?( %.2<FOY`fjhihkmwt\@"xfULDC@DGKRW\cfpy/CT^becb^]YZXZ]]`aa_WOB4oS<(&0AQbr#<UoV%]2=d=_~sdPA/ ".8;:2$nP7'!*>Rm 0CSf{|W5 *05::@DMU`jv{|obP>)lZG8+#"'.=LXiz  '.1420+(#$&,.10*'   #0=LYk{}dI(w\H8-$".7ER_irz%-19>FLNRSPLD;.yxtspngc[RLFHLRar '8L_xw]I7'  -:DLJG;0 yZ@& &0-! /BZt5\;Wl}o]B' }iWH=2,#qS7~pea^`do}5`*AUbpy{lZH1|bL7($3E\r6Qjzug]TMJDEGMQZcpyk[D.yjYOE?953-,*+,18AMZm| &0=IR[djs}$5>EB=/~]:v`OB:6:@O`u2Kaoy{{uof_VKE>:858<BGJLJF<, mT3{v{!Hr'Sy->EHC7'sX; (<Tq,TsjJ"|W*_6ytw{.C^{ 5GZizk\MHCBAA>5- "1<LZgv}ufWD-ujd^\[XXY]aenv&07;97.)!&8L^jw}wmhaa^ZWQA-pE.B\r(BWnkU>-  pR6(FiR8M[hntvusmcS;fH0wdSA4'"#+8FYm,Kc{v^H0  2IZktywlaO=+    /CUfv}xn^N?-  xm`WKE?;8JR_hvsV7uf^YW\`isz||>drV6{h\WU]iz   $@`tS6z`K7& "0?Ocq &=Zu`AaG4)"#',3;EISXagq| ":KW_\ZQJ>948@Nc|0DPYYSJ;$ f<b7 ~j`]_iw5Tt):CMRRSPOHGA@?>CKQ\gry|xsibZTKA4'|rlliow7Tgy}n\E,  {qeZN@4,'''0Sl !.9DKUY]_dcdfigfa\PG9.# '1@M[cmqvvyttli`ZSGA5/#'-1431+$ $6L_st_F.kT<'  -;Ocu1D\q rY=& &/453)yhWMFDAC??840,.3>Pe.EZdje`TH:/" |te^TRRZfx/FYkv nZE6%waTF<779@L]nyld^^`hrx1Pm}lUA)hN4" .C^x"'*.29@HPT\bku ,;FOSUOG8$d;s[B,#1=JR[`hnx(=Nbo~~scVG:+!/9GOTROG9.%<OcwtWA'{pfVJ;2)''2>Tj&8FQZ]cfjnouzzlWF3   %)18DM^mn\G4uT5!0@Pdw(Ilo\E3"  sd[XYaiy &Ca(AQY]UG2[6tcUKGCFGNU[fr *8CNUZ]YULB7' {uonpt~2Tt %-6884, nP-|sg`ZQMHGFDFHNV`jy0D[o'03,"vP(y^A),8FUas *Ox1FWbhjeb\XOKC7+ c?zfSG=1+'!&3Ib-=CKPPUV\_hqz|siZO@2 v_O?72/4;BOZhq~'6CLTZ^_`^\WRPJJGIIMNNPOPOT[fpxX4wlh]XQHB=8;:AHR\hry!2AMVY`cgnwpR5s[LA<:8:;<=;<:==FO`p):LZgr}veTE6*}xyvyx{{ %.19?FKSW]]]YND4#|yywuuwy{/>MW_c`_YWSVYam}}eL-~Y1 #.17=CQax&1674/&*<K`qsdN: jP;%$Fn"JszvkbUC._9=Xu  $%'(!  "=Pdo{|voi_\[_ert[=$~qeXROJKHG@<5+$ /A[v3Mg~teZJ>/" 6Xr   n[L;3*('%%#!fI/ 1Pq*=NYhq{ti\URU_iyyhWE4#?_!'&uY9xrmed`a__]_[ZURLLGHIMUal|!,/42.' (5BR`otW=$ %)//0//./+)"pcVH@943-,)'#! (4?Tj 7K_r  {dM7{wrje_ZVOMHJJS]q3DS\`cbb^VMB4!yhWMECDHT_o~6RpsiZK7&#2CR_lt~}viW?& !# %,47;52& qbTJ@<:8=BMXk| .Oq &*.)% raS?+w]J;-*%')07:BIOU^gu!1:BCDA90$ )9I]n}o]O=3%/?N^ku}yqcXL@:689AKR`kx~[0s@ugfgs<[z (04652-+(&).7AQap(;KU][VG2^%}Ez~5c)U  }jYF/yO vR8%.Ji 3Wy 9PfytbK5 ~xx~ %3@RbqvfZI@3-(" r`QJFHMXcs:Xz}dO=+ (174.9Y{mN*pO0 )4A;6) x\<bF+#3?O]kz3Rk|jXI:, rS;$/Ow.`&?XjzkV:kK2 5Nhx|jW?'rcP>+ 0Lh$,421)!3AQ`ju~xjWD-,DenM, zo]N:(*LuDaxt`H, /;LW_dgiigjos~wV4n_PH@=<@?A??>?BBFGHE?5&6RjxiYJ;,/GYl}jN5zlgfis} -;Qd{  |gP4lN1~urqx&LwCh.?LSXVTM?3$pV@({wuppkha[VOPRY`ly=` 4XtnY?wGxi[N;1%#.;Qg '5CSetv`D,{lYI7$  0Kg6FRYY\]en@`|sS0 tN*hK3 !.Zu  iP:%hT>+4Ut #9Qh &000)rW@& }`?"+C\s ":Riztk]SI<2&  %5HZpt]J-|fSB7,% #*2=GMTWXUSOMQXhx+8M`wjQ5uhT@,+@\s3Qn%*37=>A@?<<:52+% qM)v\@+ *9Lax "6H^qlU@* #4DWhz|nf]XTOMHC;3)  &1;DJPSQQMG>5' ynf]YUUWZ_ahiostx| &16@GQXaelpnolgbZRE=1( &4@NU_aedcbddikiliga[TIB7." |{y}4HYgkoh_M:#|{zvuuvz~(C]w9UnsKO~ocUH7()>Sk +Jj x_@vX<&  *8DWhy#Fl *-/)! xdM7 {n^VLJIIQ[j '14222./047<BBD>4#rd[TTUZ^aeimmqprqqrux.CS`mr{xk\E0uU=' 0Lk !)14<@DECBAA@@CDIJNTX`jur_J2lXH9,&! %(/4:>ELS_l} =Y{0@Q\^^WJ7 uZB(z   p^L<0'%%,6@Pat$CdztlfaWPF>2' 4H\iwsZ;r^QD9, 7Yx5J`v '.740!nL) $Kt7QbnurobQ7\(oM..D]q>^~ wX6 oQ5#%2EQblx 7Oi   {aD&zfS?1"!/>:<9=>ELQW][ZVQIC9.%}}{ &:MZfmvzwme]YVWZ]_dehhlnoqrqlh_RF8)}uoljnpy(:GOVXX[\`bfhkjjga[SMD>62+'# !)0;IXgty|vj]K9)  .:?>8.$ !&-/57:;=;2* t`N@5,(',09BP\p )8CS^nwt[A' y`F2 .>M_r)=O`krxxypiZI1{jWK=6-,+/5AMaw#<O_iruwrnh`[URSRW[bfosy|{seYG7$yutrx{ )8GUeu~}wwvy}~iW>)xiZQJMTe|+?Tapu|yugZE4}paUG>5-,-6ARcx#/>JU]ehnnsrvuxx|xh_ZTTTVXZ\WSI?/ zph`]^ainz#/7BFHC6'vcWJ@=;?GTco  '<RjnS6 $1=LUbghf_O=$ |h\RPLKKGC=2(   -J\i{)P}6HMMB3oU?(tkba``dhkkjbXJ7& Dh"A`z  |[<#1CXi}mYC+oZI8( 'Ff,AWfwhP=) ~pf]XX]jy%:N]pxttswy}}|wp^N7mXC4&  *>Qn)6@CHHEC>:4-(#!!"'*,./1//.**'%   $-;IUcs{cE%yZ@$ /AN\hu "<WqkQ7gP8(*;Pf~ 5Nd$&$rY9lT@0# .GfFgscXJA6*veYH>3.&%"&*/:2-#  9PfxxlbSF4% ",5=DHOV[^a^WOC7(}{|(5AKValx{y{~rbRA. )9DJLFA70$1FZl~ug_QB4$ $.232-)# (6DP\fjoolhc\UI>1|xvy{ '8ET_lsy~qfYL?4*!  %,1020*%   "9Qdw~{xtrnjcZQA2 )2?EOV\gp}nS6pg]YRQNIGC?960/-))*.5=NdDiw^D$aC( 4F^r .Mq "*.130.(#y_H,x\? ~tqt4Vu+6;DKU_jvnYD,/Mh waN9! ~yzz} &%'#   (2<ELQOQLLHJHMOW\bjt|kYL?81/+' oS6!#)38=>=>AGPav.;@B?<:58;EO^k{xfQ4thXK=3,&',8Jd,T}jR9! nU;! %Aa*B[l|{o`M<)ytqv~*@Vj+-,%pQ5$,033.*$ "$&&')(*(& wdRA2(  $/7CNWdmz1DVekqusttsuy{}jVF4&sh\UPMORV^jt %3BQbp}{wldXNA4* wfQ>)1Nm0Kj9L\cfbXL<*}z{{xxtpg`RD3nG"{ts|;c,V{ !$dH1 xi^RLGGIQYakv{.F]r{hV=& iYOJGNU_o-AN[cfhhgfcba_YSH>2& x^H0%4DTgx!?Yu{reUF7$/CVj|~dI( }i]ROJMMSVY^afiqx 'Ij gI.{n`UI@7549DQf}#3AP]n!!o_ND80)uY>& )Dc+QxmR2yvtsvwz{}~ !$*1:I]p +173.#|U1{md[VTOQSZanzscUG91**,6CUl)EczlR9!~+9DNW`jp{lWI;4..00230,%~l[QHC>>A?BBCDBCDHJRWbm|%.4=FS^kxxgYD2 )7BFKJHA:2&  "0@P[gmone\N?/!yhUJ>545Of~ %=Obt4UxlDb8 sT6 0Ie5IZfjmjf^WMHA;8531.*' }iSB/"-@Yv3NcuwldZOE;0# )6CQ`jx&5@BE>7'|U/rI(zh_ZYao#AYt 4DUcskG!hJ3 "5H`y@d$-8@IPRVTOC4 ^=~wmf\SF:.#-Fa{(B[q}aF( xrlhdfhoz#*))$ )4AIRU[\bipgK1{rnicbbgmxrZF2/@Wk #>XlgH)zvponrv{ "*39CHSZeo}n\H.qaQC6(!,=<877;BJYo'Fe  |bG/ z_E. 1Mh%<Pezb@~m`SG@</ ~zxvvuy,@MY_dcb_VRJE@=:51.$yle]VPLLHHILRYeu%Jp3Mc|zZ7SsP8$ />Rfu "9Qh~oaRD2! gN5# (2?LXiy 'D[tzunhb^ZUSRNMMORY^fmstumeUE0*4>HR]dpu|~}yunje_\XSLE9) +ATjpaN<'vgTC/ 0Ibz2MkufVG7$ ,Fa} #<RdrwyoaH,Y,mN9! ':K^l}{trokmrt}5SueL5 wlc^[VVTWZcnz,?Sn&3:BEIHKJIIE@:.  a3|T- }}} =Zy-G\s|cJ.udWI?52.1:CTg}$7L\kz   ~cB#rR9!2Ml%,48<?<;61-" rT4(;Rj"Hs.HZgnqnf\PE:0'z];~qc\SNGB:0&  4He:TmxX6mR>+  *JUfv  (5?HMLLE@7*  #)08AIPZajrx}uj_RE7*  $1?LRY]`acfhmotstrkf_XNG=- {pf[TKFBDHN[gx,Hf~ytuvws\F)*BUiy}ztsqsswvvulfZPD4(qYF2!.AQh}+=JU\`egms}gN2m^M@3+&"&.>Nf"<Uovqkjhdb]RG5" r[>' #Ei3JYfmstvusrpnke_WLA3$ &3>IOSSLC6'{zz}~=Zv~hN8! !9M`pzxn[H/wpnmpuxulc]WWYam>cxnd\VMG?92-($#  {pidaemz.CYn|kTA-xm^N@5,%%)2BVi ")+148<:<971+ 7KbtnZD-zkZN@7.'$5CYo!=TluX;~eP=-5So5Mg6O`mturkcWK;/sZG0~vpljge`[UKE=:757:>FOZgx-F[reJ+ }pjca`_`bfgklooljgdb__`bhlu~ ,9IYi~  wk`QE4#zqgedhipquwwy{$&*,)'"  *7CMOOG;)ueWE5#7Ts/?Q^myzpg^WQKB<3)  }ric_`ejt)1;DJU\hox~zo_P@2&&-:I[mmS=(|n]J<. !)4=FINPQUZcp~6Ocz{bG* mT@0'!!#,5@O[kx (Ef,=FOQSQLG@7. k@fOA5.'% ",:ET`oy*@O[dggfa]WMG>6,%  '1;ABDCDABA?><:42.'$ %-5:771.'$ %&,.3667643+' }wqmiba]]^\^]^[ZVNMJJKPW^ju&8FU_lt}th_ZYVXWVRME;4*$ ~vvy%1<DFKLONQOOMG@4'{^F3)%,9Kc|  (Oq|dI3  #(/16697620*% |xwyy  (04763-%#(./448;=DJSZdnwx^D& }yskjghijmrrw|)?UjoV8|_H0  *5FWo;Rk~ +4=?B@92) pQ2hR<* 6Ss,E\v)6ABC<.g?qT<" 5Oh'4Ka}#)+//311+' vM'|dSF@<@BKUZchmotvz"%%'''!#1>NWdnxviS@) "'.6?KVcmxkR8kJ23Qm $,8AMWcku||p^G, cK5'$3AWl2LctwnbXKB4.!ueUJC>=>ELWex#3?HORUUTPH?1"}zxtvvy|1Mavs\C+(7AJNPSUY[bgksw||rh[K6# yuplf[QC7' $5DZn)8K[o~~scYMD=63.($# *;J[jxu`G,|o]N=0%(0>JXcpz(/67860*#  $-3:=>;82)$  #1<HOVVXXXXY]_dgfgeb[VMI@=52+&}yuvx"2?P^ny|wrnkgghjntzxskfa[XQK?0iWK?:8;AGR\ju+9AJLPJG?:4/,&# u^N=/$"*7DR_my"3GZl  }aH, iQ9$:Vy3EXfmtxz|yzxwvqmf]RC4"wZ>"*@[uDo+:GPUYZXUPHB6." lO0wnic]XWXX_gp~"0:BINSUY\\]\YTI?1$taN;,  !0>Si1MfxgYI9(  $(&$"7K\qiO4pbQH>82.)'&$'+4>IWds,<N]mz~wlf]YPJ?5( +<FRZacgijmorususrmkigffjmnstxwxuuqke\M=) d?,T+UyrX=(  ,6=FHHB7)taUI@>@K[n2Sv!&++(~^> /CUhr|~zuj^Q?2"|ldZPKDAABKWk"8FS\hqyubK7 x_N@5247BN]ky*9IWcmqvvtqld[RK?8,% &<Rf|lXI:1*$$#$"  $*)+)'" );Sfz}pdVE4!w^D/ ,AXq "'*/39?AHKMOQONJGA@<:842+&zuw~3GZgw}p`UH>2)  ~rf`[XZ]elz'3>JS^iv~~pcSH;2'yaI/ %;Qe{)Ie    eGq[I?8512./.14Qc} *7BGORWZY\\][^\_abdffc\TD4!'8OgqaM:$~pf_]_dkvsj`ZVVZ]fq} )Gb}oP/pXE2'(4G[q.>NYelquvzy|}}{{|}~ulbSF5%zj]TONMQT\cp{ *6@M[hs~xog]YSTSY_ckmpkg]OA0  !%(''# |tnd^VPJA=84448>HTdv"6GWet|vrkc[QF;-"0;FMRUTQMD<2+#v_H2  !3AWk%A\yu^J5#  #$&(+.02//)' %4DVi{zj[I2pQ:! .Po 0:GNVYXYYWYZ^afjlnmkha]XUPOLIG?7, }tlgijs~<Ti  t^I3mWG8+  !/@Pcx $*/211.,*#   #:QevjR9zqhe`]WSJFC?BEKQZamu} -:DQ]gvtaN8$oaRF92*(%*19HWj| ,<Sj$(**'# qU3kR;)  )8EXh} $;L^hmpnibVMC;4/*)%% |i]OF?63-+&'(*3>DJWbrnS;*BTiwrbO8" nZL@<7=AKVbo{ ,>ObtsdTG=4/)$ '6J\rqY?+wk^SF8,$@]<^ylU@)#-2464-&$3CTarpZC*~|~{{xy|/Kcx}p]L7# ztoqv}':KWaglnpqpsty{oY;d@8Ww7Unsi\QD9,q\J8." 6Uv:c1BR^ipw|}~zugXA) _? t_F2 ;\{"(+--.,*(!%<RiyeVD2"#$%&$$! !!$!  sdWLECAEKWer $)07:?@BC><87356:>@GHKIC<3*  ",8BMX`gru}zgV=)qbTG=1+#$-9GWev,@Qcs}nbTB3!kR@-   &:Ng6Qm !!! ucK6vj]TNJGDDECHLSYaiox ""!%',**$ +=P]krz|ysne]QF5& %*)+'))(*+,,(&!  #*28=?@@=93* {rjfa_]ZXVWXX]`hnx~ -AQev|iUC0 ~uqnnqw*?Wmt]E-uh^UQOSWbks}}woe^XQQRYbn&4?JW_ly}sh\QE8.$ #'&&%$#  m\K?3,''',043,"ztnkghikrx!%&+/39?FJJHA8*.CXj{lYC0 zmaWMH@><9:*kL- "A_ /Rw#6CNTXWVRJC7* iT?(zfXG<.&  *;Tm2Qr(5<CE@;."kK+ o]K?3(#  *7GWix 1D[q}zwqi`UK=4+!  "(07;@CHGJGHFFBBB?>><72*yrjgfegkmsw.?P\cilmmmpqy~tdWJ<3)#  !-6AGJHD<0#%8GWdnvwxrmbWI>1*   #.8AKT]agife]VKA3' ~~    4GXjzt`O>+yk\RGC@>BGQZep}*AWooU7t[G6(! "&$')-39EUh|,8FSbs!pbTE<1) yk^P@4(!&3D[u5GS^dknoqssvtvuvssokd]SE8*n_OC82006?IYgy':RizbJ4 {m^TNLPT_n~ ,7ENZ`bb[RD2  %0:HR^ensssnh^SF:.  ! "!!" 8Vow`G) }bG0 2EXj| $9Qh}&8JWbghbWG2nH#{j\PE<51017@JYi{ %1@O`q~~vkbTF5 eI1%>Uo-?Q_lw}iV@'~~$9M]o~nYB&ype^SH8*)>Pfx'A[tkV<#vpomqu| $.<ET^luzmbVE4 ti^QF<3,""%,3?N^v#Nv%,67:73) p]K7" wnjhehjnrv||7RmoQ4\: '-7AJWgu '3AHRW\`bfjouzxm_PC5* $3BTcv|eL6 o[H7' (;N`w;Zy   jP2raOA3* $&,.28>IVe{6W|!>ZquW9wN'yZ>$"-N`lx|~{pcQ?*|jXM@;79:AHNYds!&,139=BFJNTXakw{hQ>(ueTH;5216?K[l"2=KVbjv}vlaVLC83-)&!~iTE6( !:Wu A]t  |gVD7+ vh^VNKIJJMPQW[cmv!>^~rh\QC7&jT@/|{>d(Lk -?NYcee^UD4 lR;~`A& 9Qk ":SmnX<!_@" (C]z#4FWk    s_H/~| -8BMS[bipswwxuni_WLA5& ~uh_PF7+  (4BQ\l|8SqjWB2!toijlu}  &.5>FSappM$sV@( #8Mbw-?Rdrr`N8%umihgnu '3>N]p$&!dE(lQ7" "-=JYgu $)/3;AMVbkswzwpeYF5 ~sgc_aadgknopuu| .=RdyweSF9+tjb^\_bioy  $,4;AEED@;4.*&%$"#"#"%&+05>ENSZ`acebdbdehjmoomhbXPF90%th[TMJHMOZcq}*6?HJNKHC91'+BVjzseUI=3+%  #.:CNV]bbb^XO@2 yuwwrcXRQQYdq/:IWdsiV>(tcO@/" 2E^z.DWfw}fP;&}hQ>( 7OnBf "6GTbkotrph_S?/rU="zqlfghlsz ,=KZer||tmdZN?2 tbVIC>8767:@BDINWbjwqdQB1   +4@HQWYZVSKD:1&yolfec`a`ejq| !%'*+.16?DQ[gr|{mZG5"'/57540+)''(,038782.%ulc`\_dhr} "6L_ruhYL=1%  $+068<?>A?>96,% +?O^hqtqmdZMA3#vg[OKGHJRWdny$).13130328;DHQU[]^]XSJ@4( "1>IWbq}veQA0"xog^ZVXVZ\\``bb^\YYY]`hnx 5FXfuvcO:&+5DN\ftmN.iP=(!6M`t!4FWhvzthZJ5}jWMEAAGMWao+<NZhs~zy{~lWC,udUI<5/.03;EOYcnt #**.,,*%"   $#')*15?GR[hr}{paP='    |m\N@8125g(@R_mv|}{shTA% `?ytofa\YXW^dp{ *:L^s{n_J7 jM0 ,CGNRY^aefige_YMA2! ")-1254531-(# +;KYbkmnj`WI;*pbTLA>;:>CLWhx +3;==;4/'! +4>JTajvp]F/ujeaadiq{$'&(&'&&&&(+.4;FP^kyteR>(jZI;-# '6DVg{ &0=IWbo{qYC-}xxxz )8DMW[_accabcddddb^[OF;){i\PH@>83-% %+18?AHMNQPRMMIJIIJKNNOMGB8/! #*2;DMXcku}ymdWJ:* .<JT[_[XQI?6/$ $19AHJKHC:/sj_ZUSQSUZblz &)++,))')).26?FPX^ehlomnkkkhifggcb\XPI?8-$     ',.2255::?@EFEC=3're[QLHILPXamw  *.3332--**(*),/17<DMT^djnpoid[PA4!}vvvz6TtoYE.vi_RF<3,$ #,7CRar4Mhzl`N?,)09@FLNTW[^`dhhlmpnnjf`WOD=4+& '1>K[i|{ql`WNA6* "(09>GKQQRMJ?5'zm`TJ=70,)),-4;FQ_o} %(/17;CIQY_hnxoW@* }o_QD8.'%%,6@Qav"/?NZhu~xocZMC6) 0BYlsaK9$nYB-$1;IXdv0Mh$&'" cD' vqigeceipw)C^wnV: |sleZSJE<940-+)'''+/5;EOVbmy)AYlp\H3 3EYkz{m`QA4%yeT@0!   1DXm"4GXhwwgTC-  &0;FUdvkT?* !$(***'" ~_C' 8Z$Mt ~zsgZI2ui^WPMJIIKQR\dt<Sl~zocVF5$tgWNDAABJSao )0;COXclqvvsmbXK=2'',49?BHKOTUY]]a``]ZSNB9+ />MZaijiaWH8#rfZQLFFHOZf{2EVaega[O>- %-7>ABB?9.!6Oh|t`N8' $3DSds}ztlb]UQMGD?=860-&#   &9K[lyzog\OE7,!,4;@BA:3& %+38:>@CDB@;5,  &,/3220+(%#"!"$&(+--013466:9=>?CGLPTYZ\\[XQLC:0# (,.1//-.+-/18@IRY`cdb^YRMHFCEDHJIJHE>3(  (06=CJMSTY\[]\[YTQMIA;0( ~|}}|~*:M`rqcUE6'   +8FR[dkru{{}ywqf\OB2xolikkpty $/8CJSY]acd`^WSID=5.+$ $)+02355441,(!  ysmkffcebechiou|%;J\gs}|ti`RG9.# &4AP\ku}ti]P@/ {k_VQNNPSZ]cgilnqrvx{ "$'(,-/0356:<?BFJKOQSVTWXZ\]`aadefeea_WSLA9.&(5DMX[]XRG7&yiZNGABCIQWbkw  &+6AL\k~ ycN8"|zx{  +<K\k{}re[MA4&&*-26;?DDHIIGED><852-*&$ zoib^YUSQQRSV[ckw#7IXhxxiTD-   %.6=FMV]fmv|ugT@'~{~skhks} .7<@@?;72*% ,8GWcqztj]J:' !'.133/+$ $-6=@DEECA>5/%ypiaaagoz !'.1658676457:?CKT_hr{wncSF7* &;LXelqrrqpooprux{}zyrkbRD0|uj_SC6((8G\p $/6BLYgq|dL1rhc_`djry)6@GMQRRPMHDA?>>BEKR[dowvi\N<, iT?.(8HZl}!0=LWahnsruuw{}~p^P?4&  '+003313467::;:3-% )3>DGHE@80$!(-4;EN\fuzjT?$ q^ND=:;FR\clpussmjca_[\\\[YULC6( "!!!/9BJPTVXWVTMIB=61,$  '04:;;962*#   '3?HS\ckqvx{|xwsqle^VOF<5-(!  !#$" yph_\YZ\`hnx!2?N\fqx}|wndWJ<0! "2>P_oz]<sf_YUSPPPQTTY^dks||zz}6Pg~|kT?& '/242+$  %5GXjyo\E+vohb]XUQQNNNMORW\gp"4BT`nv{tjd^WUSTVVY[^^][WRIA3(xogfejo{/Mi~wdN:%}tmd]QKB93.,+).3=JXj&=M^lv{ti_SI=4+" "8NbskS;!uokdeehlqz+DYm|xn]Q@2# $)/18;<=<:60,'# ##%%$"! "%'+**'$*<L^n|~tmeb^``aefhfgb]WLC6+  |wtptx#6EPZbgikiie`\VPHA7)&4AOZekquuutromkihkknrsvvvsoe\O@1    -;FS\ehmmkib]WQJD=951227<AHMRV[]aekqv||vlaQA-'-359::<::70*"!!#!" $&+26>CGJJKKGGEECCBCEGLPW]_bb`YOD5('-9AJPX[acefca\XOIA6.$  )2?HU_iox{~}zrk\N<)zjZL?3* $+:I[m|(+36<@FKRZ`jsu_I1 '5DO^hvrbM8x_L:/&"!%+3>GUao}*:HXfu~o`O:'*9HQVXUPF</  !'/3;?CD?;2' .AP^ipwx{}xl`R@1!)6DOXbfloux}xsjcXOC9." {hWF8,  !.;O`w4GZhu~}tncYN@3% #*.24642-+%$!#'+4<HQW\]\WPKD@=:;<===<50(}(4CQ]kvxkZI8%ysplhdb^]]]afr~ &-67;9942/*)%$  zrjaZSQLOS^jx(5AO[jv}vnkec]YPH=/"{rplihhghiloqvy *5<DGMLNKC=4+   !-:FR]hpuz|tj[K8%ug[NB91,*-3@K^q (3=CHHHD<5+" 4Kbwzk[K:'   0BTcnx~|togaYRLC=4.$ ".8EQZelv{~vk_N=&lT<& 0BWk~!0:EKSY\`chkqszo^N;, si_[UUWX`iw 2?MXbmy|q`P8"w\G2#-?Qdy&-8@MZesveTA.vplqv  *2=DMUZ`dhkknorsuvvwuuplgc[XRNJA9.$~~}{ywvtwz #-3;@GJOPTUVVSROMHHDFGHNQWZ_aacbb`_\\[XVSOKA9/%  #)-/112.+&!zuprt|!4CS[fltx{}wog\TJA81(  #$$#"!  !'+027<=CFJKMJF?3& #)/38:9952,#-BXmxmdZOG>5-& }fUB4')4CRbu3Nh~}n`QC4(xj]UNKFGGEEDDFINS^j{5RrkV?*&19AGJIEB7/%  '-5?HT^jqxzzxsmfaZYWZ^bgmqtsrmh^VI:, |upjhims|  #09CLR[cls|zobUF9/"     !}uod[OH<73029CR`t$8Kat|paVI>1' yrnmrx#/;BLSZ^eilprtsrplf_YSJD=72+#rW?$ .S})Qwsi`]WWSRLHC93," wrpmpv 8OcwhQ8! xk[M=2$"(.7@LXer})18?FJRYdox{skcVK>2&  "$#!  #'/5=BIMRTWWSPG>/!wkcYRID>86355;?HPXdo} $.:DQ[gox|xi]OB3& !/;IR\affeb^YQI@7*! *5@HRX\`cdcb`XSKD;3( (1=GPY`hnpssqngbZRK@:1+$ (0:BGNRWYWVOI=5* *:M\nz|rdZNF=831..-)&!pdYNHCBBDEHKMRW]fq )5@FMPPPLIB<4.'  ",9ER`lzn\G3 (5BLV\_a_\TLA2$wtoqry &,259<?BGKOUZ`emqx|yk`O@-|{ywwwxxz| %,04879:;9:88751,#$+37?CIMQSTWWXXXXTQKH@<4/)$! &0;FP\fq|~wpja[UOHC;3*! ~xsoklnu{ 1BP^jt~uh\OC6*xeQ;('?Xu$@_y   ~n]I7"xi[N@6,#&1>Qe9Vr   eI+|naZUUVWYZ\\ZZYZ]_elv"7LczscVH:* wolipy!(,06=BLT^dkotusqke\TJB81(# ~}~ #.8AJMQQOMJEA;6.( )7@LUZ```]XPE;, #3DP]elptvusrpmgc]WNF>2) sdYPHEDHMT^dox#.;CMPTRQMIFCDDFFIHJGA;3+" !'19BMV`gmrrrnkc^TJB;1,&" {slecadfnv~&-000*'!  *=OcvvfR?+wndYQJC=<>=BIOYakr|'>Rhyq_L7si`^^cjs  &+06;BEMOUX_cmt~{laPB/ #4@MWZ`_^YTLB8.%  %1<FMRTQOID;6/,'$   (/:CNXahjkf_RE2 "-4<>?:6+"$6EVetwj[M>1! " ! !,4;>CCEGHLPW[bgmqqqnic[TMF@;:797999840*$  *7AKSVYYXTTPNMNKLIGC:3)  |wpi`UJ>3+""(4ATh| %>Xmm[H7$~|~"6I^plYA,zdN<*  *7?LVcn} -<GUajvnVA+|l_UJGFJPXdq 2DWgsynbTG7* |xwtvvwy}}*;O^nzvfYI8'%5AMU\^b`^ZVPLFC@;840,%   {vqqrw{ "&+..-*&!  "(+267:8851,("  #%')*++,,,**'% |}}").37;==??@AADEHJMNMMMGD?80()5BMXcoxxpcVG5$}|yyvyz{!'*049=DKTZdlwwhUA)}ulgb``bhnz )2<BDHHIHFGJLSZdow|wsmhbYPE8)ribachq}"(*.//,*&!  "-8CKSY[][XQLB;2*  )4BNZcntwzywqh`UI=,  %-248775.+% '4@JU\djnqpronjgd_\UOF</#   )38<<93' vpkkjor{ &1<EMUX]_cefhhkjlmklkljjgeb\WOH?5*!  #&(-26;?BDB@92' {ph]VLGB==?@FKT\grz.@Ui~kZG1 )3@JV`jt}wiVA+vbSF:5/,+*,.26=AJSZeoz ".9ALS[bflqwz~|yrk`TD5! .>P`o|}ytpicXM>1xqj^ULA93+(().4=GSam}1BTft}rfZL@2% #1=GNRX\`dfjlmnljfc_\ZWWW[^`eilorqqoibUI4!kUD4) '-6?KYgy"(/4;?@BA@;7/+$   '3>DNT^epyqdUI<1%ylbXRIF@?<>=ACJPV`it&(.1369<?>AABCABAA>=74-$ )9EQ\eox|sg]RH=5,"wh_UQNORUZbelotvz{ #$'+-4<BKT^dkmmh^RA0#<Qfw~vlaYOE;-!q^K<-" .>L`r"1=JS\`dfcb^YSMD8/!&0<DPXdnvwl_P?/  #,8?GJMNKKHGDB>=97321---128;BDIJMJID?92-%   #(*,*)%   "'*.03254534200//0.0/0..,,))%$#   ztmkimpu#-4>FMV]ejsy}tgWH8#}xspnpqy~ $.:FTco}ucO8 rX?'-=Qcu'5CNZemu|{wple_WOF;/! $3AP^kx~sfVE4 {tohggjpu!2?MXdkty|zysmd\QH<2&  +:I[k|~m_N>.xjYK>3+&&+0:ETdu,=N\gs{|sh[O@4%%6ER^jsz{vne[M>0 )39?CIILJKHGFA@<:40)"$,7@KS]dmuw|}zxqmf^TJ=0# ").056::>>?<:4-&zxwtvy| %19CKQ[bnwxnjc^[WUQIC90#yqhb[TOKKJOS^iy $*,01220/,*&(6AN[epzynbUJ>4*# zwtuv| !)05<AGNU_ipz{qka[TQOMNPSUUUSQKB:/$ %&**+*(&#  yutquw} '19CJRZ^ceghgefeffhiknlmlkjggfhgkmnqrtrplhc]TK@4&zrhd]XWX[`ir~$)/379<;72*!  #$$%(+25@HS[enu}{upke^SK>3#  ~vme^UOHD?==GU`o{viZK9+ "+6=EKNSVY]]aaeegfgdc_ZVOIA8." ~|}} .;JUahpuutqld\QD8*  3AOX]bcebb][WQLD?5.#%,58>@>>;853202267::<:51)" |vnia\URMMLQU\fo{2BVexxiVE2! vpkihjns}/BUeuo_L=+}sg[QH=6-)#!" %'-39BKXcv&9Obss_L5! $3@N[blrxzo^J7!xrid_]\Z\^dhpv"2DTfuxfR?)}qe^XWX]cmv #%+/49=FNYbny|lYC-xdUJC??@DILSYaioz &/9>BCB@95-&   '6AOXbiptwwyvtpkf_ZQJ@8,#    !%)*./47>EJRX_dhjmnmnlmjifa]XRKF=8/*!   #$"%$%%"" #+26=AFJNSWZ]bdiklnnppnlgb]RI<1$  )5<DGIHC?70'   &/;FTcoubK5{cO?.$ &0;CMT\cgnt} #+4:CJU\gpx~tlaVLB;3/)"  $&*/6?FOUZ_bacbdcedeeca]YSJA6+ztqmliijilpuz )8FR[cjkmkjd_WPE</% &*-/--*'%  %1<KWep{wl_N?- wj]UNIIJPV`iv )9IXfox~zpg]RG=5+&  &0:DKSW]aaefjjopsspjcXL;*#6GVer~~sh[O@2# #/:DIOPPMIB=70-(&&%')/29>CIMQTRQOKF=6-"tkddglv0<FQX`fhkkje`VLA5) 3Kav}ocUF6&}tpkgfdhkqy+=M_mt_L7% 1DWjzzmaUJ>1(  "+6@FMOOKF>1'$)/244799>@EILOPOMF@9.&  %/;DMV[cgmqtwxyxwvqmhd]XOIA70'   (.79??=92* %-7>DIOSW\adknuzvpf^TMFB@<<;<:51)!     %*28@FHMNMJH@;4/(!  #'),-/0002379?DLRV\^`^^XSJA4( sg\RIB<:9CFIMNRTW\]beimnponif`ZTLF>5, yqmhhhkpw+>NZfpxo^K8$ !+1:BJOWY^^_\[UQIC:1' #')*+,**'%#!!%$'')+*+*+('"  $*2:AGKNONIF@:40(% #)+...,&!   "&)-/133311/-.-//2459;>>ACDGJOTV[_aaa[WMC7(   1=M[fs}|rjaWPG@94/(%  yqlghjnx!0?NWdou|~}zrj]QA1 {tmjca^ZYVWVY\^ekt})?Sh| zfQ;'~{{}    !$"#! $)1:AMXeq{sj^VJA7+"ywvx} #-;FQZ`efd`WOE9/%  !$*,24::>==96/& "+19<ADCDDDBBB?=961*"   !%*14:=????;966453310,*#  $*/46:=?BFKOU[^dinsuxyzxslaSD-peXRMGGFJLS[cny&.4;@HNW`juxk]N=- {sib[YYZbl{*=PasvfVG9+  ~rkdb``ceimrvx{~ &/4873,#  !)3:CIQUYYVTOIB<4,'! !$+3:BJQUZ\[\[[[ZWTME>1$ -9FQY`eiljjfc[UH>/!~{xz|*8GXi}tfZN@5'#(,156865/,$  )6AIRX`diknpnkgc[TJA7*   +2:?EJMPPSSTUTRPMHB<3-&! $).146741*teZPIB@><@CMVdr(7DMTZZZWSJB6-! #3FWetr_G2 (3@KT[addc`[TL@5( }ytrpqqux}#+29BIS[dms{|ytqlhd\VMC9-  &,26651+%   !%&(*+../00/-,(('),2;DQ\is|zpi^UG=0&|{z}.DWhw~seVD3" 4J_vyaH0ysooorswvxwtrpnmllmoqrvx}(5DO[bgjklhd_VNC9.!  !%'+/38:?AEGKMNRSVTUTPMHD<6/)  ~}~   %(-15632-(!&-7?HOW]chlqtx|}~zsj\N;)xqgb\YUVUY]dkw->MYbjpqrplh`XPJA:5-+''%(*,038;=?B@@><83.'  '3=DIMNLKIGD@>;860-'"   #%(*-027;CIR[cmt|~ti^QF8-  !"!!  #*25;=ABEGILPSUWYVUSLF>80*!!(/4;@DEEB=80*    "-9AKRUWWUQG>0#  $$&''(),/5;@JQ[bkr{wj`TI=/%    #-8@HKPNOMIFA?<875577<=BDIMNSUY[_bcggihfcZRF:, !*1:DHPSUTQJE:4+% (3@IS[^cdgfffcc``_\\\ZZYVUQNIC@;72-' {l_VLFA@>@CFLRZdmy+8BGMPNNKHE@?<>>?CFLOUZ]`bdca\VPF;.|urru}'<L]jxypf_VOG>70+% xohc^[YY[_ckr} """ #',-147;<@DFLQSVWWSNH@8+" #+2:@FIHGC>7-&  "+4=FLTZ`ddefba]WSKF?;53/0..///,+($! "2AP^gqx~|vqf[PD5)|vsnmlnsy 1?MZfry|tkaWLB:/(  %-8CLYblry{~zxslf^YQKC:3(|vsqrsx|%()($!!1@Rbr|iYI8* .:AHMMONKHFDA;80*  zqha\XUTQSSV[_hr,?P^jvwmaUJ?5*" (19?DGFE@;3,  $/>HT[bdec`[SME>5.$ #.:CPZensyz|xulf\TJ?6+#{yurpnnmoruz  %)04<CINRUTSPIC;1' +;IU`ipw{{pbTC2zvtpqqtx{")-22330/,*'"! !)3:@@B?:6/+$   "'04<@DFFD@=731--,.01365674421.+'#xpjca`bfmv &09AJRZ_fjopttvtsomh`ZQE9*  )3<FOT[^abdceedfegfhefb`]WSMH@;2(ztnkighlot{#2?LV^filljd`WPE<1) &+1557674321211235589=@ADEGEEA?<64/-(&"  (5GWiwwj`XMGA<63-)#'3>IR[bjptz}}vof\OB4& vmga_`^belr{ $.9BJPSWWWUPKE>60*# '3<GQYbkpw}}xtnjb[QI?2& xqhc^[XXZ`hp &5?JTZbfkmoopmkd^UI>1$(1=GS`myyk\K:'~k^QG@=;=>DINV^gq{*:HVbmv|~wqh`UI=. !2@O\gtyk^OB4%     "!"   !)0:AHOV[^bbdc`^ZVSLGA7.$ !%*048;;:82,$(2:@FJLOQSSVVUTROKD?82/**+.59BJS\`fhieaXN@2!  &-58<<<961*$  &09EMW\cehhdb]XSKGA>;8652.*$ ~tg_WRQPW]iv*4>GQZ`gjnmmkeaYSKD>5/(" &.9@IQV]bhlqu{}{tle]ULB8.!|pdYOG@86345;CJVbr'.8>EHMPQRSPOKF@:3)"  *7ERao}wk]OA4(   *16772.% !0>IV`hnsuttrpmhd^YSJC92(!  #+07>BGNOSTUVSROLJGFDDCDDDDCDB?=:95521.-)&" !)5;@DHGGED@;70)")6DRalym[I5$ $%')'&%"  !0>LVclv|{tnfaZUQJFA>850.)(%! $&**)&#  &3?M[jyzof\TKB:0(  !   *1<EKSX^aegknnponje^WNE;2' '-6:?@A>;4.$ #0?JWcmw{rg]RH>5-#  )9HTaksy{{ytnd[PF9.   0AN]ivznbSF5' !(-24786742//+*++./32421*%      &,6;EJQX\bfjmpqomhd\TL@5)  '18?CEE@;4,%  (6AP[hrx~~{slbXNC:2("   !"&).27<BHKPSVWXWVSQNLGEA?:84.+'$! !$&*.12430.)%!  !)15<?BC>92(  &6FXk}~o^N=*|yvrnliedba`begov$6HWfr}~rgYJ<-wmaXOJEEDIOWcq6Nf}zjYH8&}ztrooooru}.<EPVZ\\ZSNE>5+"yqkfa^XWTTTX]bkw+F_ush^QH=5+$  "-5@FNTV[[\ZXUNH@9/&zvqqoqtz %+19=DJQY`fkqsvtple^VMD<4-%   &/7>CIMQSVXWXUTQJE=6-%  !"%(),.03367:==@ABCEFGFFEA>82) ~|{{}~ )9GU^ipvy|~|{xvpmfaYULF>4+# #-7CMYclw~zsmd]UJ@4( }xurqolkiigiilorx~*3:BGLMPPMLIF@;5-'!  #*26>CILQSWWZXZXXWXWXZY\]_\[WOG<1$   #)07;AEJJLJJFD?=97668:=@FINRTXY[ZWTRJF>8/( $2;HOY^cfdd^YQF<0%  $&%&$#    &06?CIJMMLKLHHCA=6.( |{ywwvyy~ #-5;BEJKMMMLKIFD?<50("  )0:AIPU^ckqxzpfXL=, ~wuqrpsx| #*/58;=;;753.-+*))*((%! #/:BLS[`finorsrsqpkidaZVOF@6/%   %''(''%%"  &1<HU_lwvk_PD4'  "&(*+,+*'%! !$'),-12678;>BFIORY\abeddb_\VQJB:1(  $%%&%''+/18;@CDDC@:61-'&$"!!"$#&'*+-...*'# $4ETbow}xrjcZQG>4+" $1<HQZagjlmmheaYRJB6-zqke`^ZYWYY[_bjrz(8FS[ehlmkhd`YUOLGB?;71,& )5AKT[`ehlooqrqppljea[SME=3(  ulf`]\]]afls|  &+158<>CFGIKLLJHC?80(  $2=JUaju~~xqk`VJ=.zskfa^]\^ahmy!&)+...-*'" +;LYjvvmcWOF>82+("  vohb___diow*3:?A@<6.$ ):KZjw{rg[N?.  '08?IQ[dmw|zpg\PE8-    *2=EOWahrw~vldXOB:/&  !"#!   '19@CFGGHEC?>961.+()+/5>HR]grz~wmcVJ=- #$''(%$! &6HXer}{qkaYPD:/# #&*,-0134668979651-$   %+29@HOW]bfihheb\YQKA90$   !#"$#" }z{{}'7GTajsy{~}{wtnf_WOG=5+" %0>LYht|rcWI:-ygTF7,$$*09AMYgv(=M_ly~vobXJ<.{tnmkory"1@N\kytk_UH</ xi`UOIEDBCEHJNTX`kt,8AKRY]abdcc`^YVPIC;3)   -:FS_lu}sgYJ8$  ,2;>BA@=5.%  ,6>EJLKID;2'  ):HVblv|~yqeYK>-#,6?HOSVXUSMG>6* '0:AFLOTW[^`bdffc`]UNE<3*"  "&+.24431.*" |urppsy!(3>KWfr{rj_WLB6(  !,5=EJOQRQOMIGFCDCCC@>83)! {uplidcbbbgjrz $/;FMU[adefdb^\VSOJGECABCDHKPTY\_`][UMF:0% "'/4:>AC@>:5/% ,9IVcp{{vrnje`ZUNF@94-*&!  "'-023.+%  !&,17=CJOX\dgkoqssuuttrokc]SI=1&#%(')'(&'$#!  1AQ_hpuxyvsnjc^XOH@91&  $.5>FNV[bflnrqtpojgaXPE;.!}rle^[VTTTY^fmu &1<GPY_eilnlkhd]XPI@9/& '5@LW`jr{|sme^UNE=4*  %-7@JTZadgec]VL@6*  (6DS`nz|qbUF6) &/6=BINQTUVSQMD?5.$  #/;DOYcmvyn`UG;-!{uqlkjkmnqtx|#&)*++,--/045:;@ADCDA=92+#$5BP[fnswz{{ywspje^WPG>5,!  !!$$&&%$!}xsplljlnrz/BRalwxhWE5"ui^SLFDCFJQYakw~(2:CKSZ_fkpruuurmf[PB4%uka[USPRRW\eoy &2?LZeq{wl`SG8*  ""&%&&&'$$! $-4<ADIJMMONLKHFD@><::888430,(#  #(,137:9962-# }tokhhjoty$,266742.,*''(,06>EMU^ejoqrrqojg`\UMD:/  %/:BLTZaejlopppqtvw{}|voe[NB4$yj`UNGB@=?BIQZfp{#3ALXajpw|}{voeZM>/ |uqomorsx} &3?JRZafjnsx{viYJ9'|qf_ZUTUW[bhrz $(-01210,'! "'))+***((&%%"!#&.5>FOV[acfdc^XRJC;0( #*39>BA@;6/% !'/4:?AEFJJMNNORSVVZZ]]]^[[XVQKF@80&  (/8?ELQVXYYXURPKJGFDDBCBB?>:73+&  '8K\nwl]QC6'  ".5?FMRWZ[]^_^_\\ZWUQLF?7+ vne_XVSQRTY^gq{#(-4;DMU_ir|zrg\NA3!  #$()*+,-++)%#  "&'+),*+))')'*+-049>BINTX]a`b`_[YSPKD>6-$    '+.00367<@HLU[ahosy}~xtmcZOD8+!#"  /BWiyzk`QF7.$  !#%%#!   }sjc^\[]`gnw %0=IUamxzl^N>,  !(/8AIQZaiotz~o\G/wbM9( "1DXm '4?JT[dmrx~zskd^VPLFC@;71)  $-3<CJOTYZ\[[VRMGA=62/*(%    %+4:AEMQTXZ[[[XVPLD>7.(   *2;CJOUVYYWTQLGA<72/-**)+*,-----,*(&$!  "$'($ *7FRany{pdWK</"  %(-0145532-(! vj_VMGCA?BEMT`ly&4AMYalsx}{sh^TF9+   |wusquy*5COYfpyxmaUG9* ui]UNKIHKOV\gp{  $%'')(%# "/;HR]dkqvwyyxvroje`[WQMIFC>;63+&    #),36<@EHLPTY]chnsx{|{tnfZNB3% $'*,+--./0024222.-)'" %+07;BHPV^ejorttspicYOD5( %08<AAB@<9520,--035;?DGIJKKJJHIGGEC>91& |qg`\[[^bioy*4?FKMOMLHD@>:9887766633/.*&#*7BKT[bhjnopplje`[SNF@93*#  !&,1379;<;<<;872/)%  !%+.010.)%  #.6>BFGEB?80)wrmhfhipw'6EOY_cefddb`^]\ZZWVSRONLLIJJIIHHFFE?;4-$ !$&%%"   -=N]o~ziXH4&~|{wurpnnnqv{0?KYbkrw{}~{ytmcZN>0 "/;FPZdmv|zpeYL@2#}vpnlnoty+:GPY`fhhgda[UME<0%  &-6<EMRX]aadbc`^]ZXSNH?7.%   %,28<=ABDCCBCA??>@?@ABDIJMOQPPNKGC=70(    %)-02321/,'"  %*,02454310.-**'&###!#$(,/49@DHLMONMIFA92)    #')--/.-*'$  !*1;BJOTVVVTQKE=5,! +=Nap}xodYOB7*   #&'**++(%  yqnjjkot{ $.6@IOX]diknorrpmkc\TI?4+     !##$"|zyz  (.8?IPV[\]ZVRHB92)"   !$'*''"  !"#### )2<DLTZ`ekqw~xl]O>-  %.7@FMRV[[]\[ZTRKF>7-$&2;FOW_bhknpsttwwxxyywwvtole_VLB6* !)3<AHLRSUUSNH?7* #'/4<ELU]fotz|~}{unf\SI@7,$ "&))++,-,,++)(&    "&()**&%  "1BN\gpw~{xsqlic_XSKA9.$ wjaXRNKMPW_kw $+39?DHJNOMMKJFDA=940*&! (2<FNW]bhknomlhe]WMD7-"    .;GR\fmv|{tkaWJ>1# #+05:=@BEGIIIKIIGEB>;4/( {uqlkkjos{ &2>GPV]aegdb]WNE9/" "/9CJPUVWVTPIC:2( %-6=CINSV[[[YUOH@7/&     $)*/269=?BBDDAA>=987330.)'! !&.26:9:9851/*(" +6@GORVVVUQOKHFAA?@@BBEFFGHHGHGHFFCB=:4,%  #%$## (3:BEHKJJHHGEEDEGGJLLOOPPMMJJHHHHJKMNLLHD?6/'     '+025576756656779:<?>@@@A>?@?BEFJLOOQMJD;2${wssttx}    !'08BJT]gpxznbQA2!   ").5;?DHLOOQPPNLIGFDEFEGHJIIGCA<931,+(%#     &-3:>DGKNQTUXY[[YXTOJC:2)  $'.28<ABDDBA>;9520//--+,))($"  .9EOW`flosssoldZPC7* &0<ENSZ\_^`][WRNGC=85210133668::;998630*& #,28=>@><73+#  #&*.249;@DHOSZbgou|xmbUI</"  !-9BMU\acdc`[WOI@7, |ywxx| (8ES`lxugUE3 )5>IQZ_dgggc_XPI=4)  #(.39=AFGKMPSTXY\]]^^ZWRLF<4()5?IQZ_filnllhc\TJ=/  (-6<AGKLMLIC<2( $/7?FJNQSUWXYZZ[ZZYVSRMJFDA=:73/,'#    '/58;<=;;750.*(&#" "!"#%%&%$!    &*,/..*($   &*/39;?ABCA?<62+& '19CJRV\\^]XRKB7*   #&-.48>AFIJLLLIIFCB@@?@AABDCDEBB?=:51-&! $$%$  !)/5:?ADEFGFFEEDFEIKLNQQPOIE=4+!  !%*/39<BFKOUZ]cimrw}~tk]QC3$   ||{"/;DPXagnsuxyzywtsnlgc_ZUPMHFBA>>=>>;:85/*$  "$##""$'-26;?CFGIGFC@<840,)'%   ',38=?A>=82*"  %+02689;::97541-)%!   &(-/034679;>@EGKMPPRPPNJGB=72*%     #.8@JR]dnu~zqf[MB4( "',/00.-)&!  *7@LV_js}viYK:,$,49?BFFFDB>72*"}yxvuuxz}*=N\ir|vlaUK@7+# .;FT_ku}ui\M?0 }yyy{ #-5?HOV_cjmrsvwxvvroic\QI=4' $1=IS\cgkmkkgdaZUOJD<70+&   &1?ISZ^cbc_]XTNGB=9520+(#  (3;DJPVX]^``bcffjkortvvusmg^UJ?3) &*058=AACBB>:4,&   %&))((&'$$#%''+/37;>@BDBBAA?@?@>@>><862.*'"    '/4:>BEIIKJJFC=7/'  )4>IRYaimtw|~~|wsmg`ZQJ@6+!  "'+-/00/.-)&"  %+0499<;;9742/.,+*,-1379>ABDBB=:3-%  ! !  !*5>HQ[ckrvz{{wtne]SI?3)  %+/33432.,'$  !#'*,/2335455221200//-,**'&%"!  ""%%$$"!  %,4:<@@B@?;961/+)%#!  !&*/38<>BCFFGFC@=72+% !"%&),.26:>DHOTZ]bcfdb^XRK@8.%  !(+/3589999842/.-+-.26<@GKQUZ]adghggdb]TNB8+ %1;FMT[`dgjlmnmljhfca_ZXUPMIE@:60+&     !#&*+/157;<??@?><741+'$  !)25;>?@A@@?><;861+% #/7AHMQVVXXZZ[\]\\ZYTQKC;2* |vrqquz )1:AFMQUXXZYYVTPKF@:3)"|wrppqv}&4CP^ju{tme_WRMICA<82-& .<HT_hmsttpibYMB7* )6AMXcmw{lZF/$')*((&&$%').4;BJPX\bcfea^XQI<1"~smgdbaadiou~&/7@HPX]dhlpoonjga]VQLGD?=971.)%   &*04:<AADDEDA>95/&(4?IRX_chjjjhfa]WOH@90)#    %(,./0/.+*'&""!!   !"$%)+,.1/0.-)&     "$(*('#  $%)*--,././012123220/-)&" $(+/.0//,+&# )6CNZcmt{}xqkcYPG?5.%   ")/7=CHLPSVWZZ][\ZZWURMJEA=8521/.+(&  "-8AKU\elouvxvvtqkfbZTME>7/)! !*26;=><:2,# ~wrnllmrv~ "+4>IT_is}zk[J8& $+04767540,($   wkaVOFA;978<@ISap)9IUbisy{sjbXOF=5-'" !)28<@BCC?=83.&   *4?IOV[^`aa__]]][\[\ZZWUPLE>5*!  !'-279=BEHIJIFA;3+  (5@MWaipvz|~~|zwqle^ULB7,#  "&*-1366742.'"  ',/4699::8866454430-&!  -8AKT\bjntw|ynbSC1 ~zwtssswy (29BIOTVYYXURKG>80' !.9DOYcmu}{obTC5$ !$(*)+*('$"   !%)+16>BJOTY]acceefeecb^\YUQLFA71'   #&*-0357552/*%    !%%),.147:>BGKPSVXYWVPJB:.$&1<IS\ejpsrpmfaYSKE?83.+&#   "&')+))&$   !)4<DJQVX\]`aaddfhhjjkjhe_ZSKB90& !#$%#" +5;BGJLKKHEB<82.)#   %,26;>BDDFEED?<60)  #&)+.25:@FMT[afhihfa[RJA5,$   $(,.//.-+&$  )09>EKOUY^cflnruxy{{|{{zwvroke_XOG<3&  $')*,**&%  #)-135766542.,('$ !'+36>AGJPRUWYYZZXVTQMF@80'"+4<DKNTW[\]]YWQLD:1&%0;FMW^gmuy~une[RG>4)  "$''**+,*)&%"  "%(,05:=@BCB@;6.'     #'-15:>CGLQV[`cgijhg`\SJ>3& %09@HMQTTTRPLHB<5-& $),037;<ACGHLNOQQRPKHA9/&   &2<GQ[dlsx~|ztpjf^YPJA:0(  &.5=BFJKKLHFB>83.'!}zzz}'3>IR\elu{ype\RI@80( }}~ '4AISY_abb`^ZVPIB:1%$0;FOYahmrtwxwwvurpmhe`[VRNHD@;4,$   #)-1378:;>@@BBBA?<72*$    !!#"!  &,489<;:863/,*($#      *3@HSYbflnqrrrqomjfb]WQJD<6-&  !"&',/47;??AA?:50' %-4;@FILPRUWWXVUPLE@:40+*(),-25:=?AA?=71*"$%)*./1335555430.+'#  #(05<@EHIJIHFB?<840,$ (/6=?CBC>;4-%  !&+-1367::=>ABEEGFFCB>=852,($ ,8CNXbjpwz}~}yvqje_WPHB:4+& wtpqrx~"5DUboz~um`VH<. }ri`[UPMKJJILMSW_gp} 3HZn}scSD3%+6?JS\djptwwwuqld[QG9- (/5<@EIKNPRRSTRSRROMLHEA>:62.*$     %,18<ADFFFC>:40*#  %).13556632/*&!     #%((*))'&$"   !&).04679;;==??>>><:751-(#} %)-0243422.-*(%$#!!! ! !!  #1=IR\bimqrtusrnkea[UNE=3*  %(-.001//.+*('%!   &*+.--,*(&$""!"##%&'')**+,--//12110.-'$ ~ !',26:;=;73-'"       #&(*,,--.-////./--++++,..//00.,)&   !#$&%$"  '-4:BHOTY]a`b_^ZTOID?94.)% #*.3587864/,&!  $,4<FNW_dknqrrpmhc^UOF?6,%  #$&&'%$!   &-4;BHMSWZ]^_`][XUPLGC=:42-*&$   +8CLU\chlpstvuurpkhc\XRMFB<840-+*)''$! "*5;CFHHC?6-#  &.7@GOUY]_^]ZWPKB<3-$  !)05=CKRV\_cded`\WRJD:2( tfZPE@;99<@GPYdp %2=GPV^bhjnnqrrttusroke]UJ?2& {xyy~ />MYcmry}}xtnic\UMF<4+  ~sib[YWY]cjs~ $-5:BFLORTSSRNJE?:2,$ *4@JS]dlqtwxwuoiaYPH@81+($! $')+--..-,)&# #(*/259=@CGIJKKKJHGFEDBB@?=;751-)%  $&*+---+&"  !)2;ELU[aglpruwxxwwsqmf_WLB5(  "(+03668651.)"  &,07:?AFHMORUX[]_abccdab^]YXROIB<2* %,0467650-&!  #',/34798888665443434579:=>@ABABA>=972.*$    '.9@JPW\_bdddcb`_][XVTOLGA:2*        !$$%%&&'%&%"    "%&(''%# '07<ABCCA?:61,&!  #%'()**+*('$" !$#$""   #(/3;?FKOSUXXYYWUQMGA7-"  !%,059<?@AA??<;7530/--+,**'%! $&''%$" #,3:AHOUX]`ccc_]XRJ@7,   %*-144767664422/.+(&"  ! ! ! ! &2<GOW^`ccb_[UOG?4,"   (5@KS[^a`[VNC9- %,6=FLU[bhntw|~yoeXK<+  '-3:@GKQTWYZZWSNH?4)xj`WQNKORZdo} +;HU`jsy}yrnhc]YURNKFD?<50'!#1=HRX]]\WRKA8/"   +3>FNV[bglpswy{}}}|xtnhaWND9/$ %,27:>?BBDDFFGFGDC@>961+& ~}} &/7@FMRWZZZXVSNIEA<851.+'%#!"#'')(&#  !$%'&&$"  $+059:;::640+&" !!!!     "&)*,-.,,+(&$  $'+.023321/*'"  (07=AEHIJGE@<5/& &.8?GNTY\_a_^]XUQKF@<71-($! !'+.124431.+'#   !    #$''(****('#        $''(''%$"!   "&*.0210.*%  &),,)&!     "#"$$&&())*+,,+*('#     *6@HQV[___^\YSPJFA;72.)%   !#%%&$$  "$'),..02323110-,*)'&$#"#!""!!! !)/6=AEGHHC>7/%  #$'(*,+++*((%%#"  !#(+/267:;<=;972-'"  #,5;BFJLLLJIFEDA@@@@CCFFGFEB?;5/)#%/8@EJNNNLJFB>83,'#*3:?EJOSTWWXVUQNJEA;71.*%"   (08AHPV]adfgc`ZUKD8/$ $+4:BJOUX[[[XQJB90$  %+.25699;:<=>@ACEGIJMOOONMJFA;4-#  %+28<ADGJKLMNOMMKJGD?;50+&"  "%*-1469:==??AACCEFFHIJKLNNOPPONMHE?:3+#   #'/4:@CGJLLNNLKHGDA=93/'! !'-259:;:961-'"  %*-12454656789;;==??ABAA@@=;63/)$  !$$%%%#"  !%&('('$# !#$%%&&&''()*,+,,*)'$!   %',/368;=?AABCDDCB@>:5/(!  "#$$#" "'*,,)&" !%(*,.01//.+(%    "%&'''$"   &.7?HQW^chlmnmkic_XSLF>80+$!)059<??@>=972,'!'/4<AEILNPONLHD>71(  $(*.03555533.-)(%"!   "'-37=?CEDD@=8/(  (07>CHKOQQRRPPNNMMKKHGDB><62,%   !'*.25799:9988988787542/,'#   !%&*+.002546565543244579=>BCFGGGFFCB@<951,%  "&+.368:::9873300/0022446531/*&"   $.6>CJMPRRRRQQPPQPQRSSSRPNKHB>81+# #*.36:=>????<:63-)#  %-4<CGLPUY[^`cdfggfb^XSKC:1)  $)+038;=@ACBB@@<94/)% $(,125677530-*%"   !##&&)),//101/-(%     "*19@EJNRRSSQPMKHEC?=:852/,(%!   #'-29>AEGHGFC@;84/,(%"     $+38>CHLNQQRQOLIE@=73.*&!   $*049;=>?>=;752/+)'$"     #,3;AGMPSTSROLE@82)#  #+17>DJPSWZ]_^_^]ZVRMG@91& #',/268:;<<;96510,+'%"    %(,/13578;=>ACFIJLMMLKHDA;60(! #)-0479:<<<::652.*'  "',0478:9:8740.*&#      !#&)*,,,-+,**)&%#"    !',058=?BBDCCBB@@@>????==;:8541/,*'%!  #(.39<BGJNQTUVWUUSRPLIFB>:51-(&#"   $(-1356878766645444210-*&"   ""#"    "#$$#"!   &,057:::8640-)&"    !$'*+++*'#  %*,.0/0//....//2468889853/,&#  "%'')()(++-..1123220/,*&"  $)/38;?ABEFGHFECB>=97431.-+)(%%#"      !'/5>DMS\agknqpomid_YPJB;4.)!    #&+/37798851,'"  "&*.248:<=>?=<850+$   #'+/159:>@BDEGGHHIHHGECA>;51+$ "&(++**('$  #'+058>BHKPRTVWXVVSOLGC=82+%     %/5=CIMRVX[]^`^^\[XVRMID@:60*$       !)05;@EHLNQRRSQPMKFA=61*$    tmgeeeiov~ !""##$&'*,.258;=@AAA@><74.(#   *29@DHKJJHFC=:4/)$ "/:CLUY^aaaa][XUQKGA<6.("  $)059>BEEGFDC?:4.%   #*.47=@DHILMNNKJHEC@<:751.+&"  #'+-1378;=@ACCEDDBA?=:751.)&"  !'-158;<>>?>==:9741.)##,6=FLQVX[\\]\\\\[[ZWVRNIC<5.'!    $(+/348:=?@CDFGIJIIGEB>:4-&   !%*-.0011//.-,)&" !&,148<?AEDEC@;70'  &,045541.)$   "!""!!!!   (/59=@DFIKNOPPPOLIEA<83-*$! )3;BGLNONLJFB=93/)# .9GQ[cjosuvutpmfaXQH@7-$  #*07:>@@?=94/'!    !$&(+-0145431/*&!    #&(+++*)($"    $,4<BIOTX\`ceggfdb^YTMF>6-$#')+,+*'$   (4>HRZahnrtwwvspjbZPE9- %)-./.+(#  #*/57;;<;8630,(%!!#%&''&%!     )2;DLTW\_aa_^YVQMHB>84/)$  !+5=FLRWXZ[ZWVQMGB;2+!#1=JU`ipw{}yrld[RH=2'!)3;BKRZ`fjnqppmid[SI>1%  "(-058:;;:74/,'"    !%')+*+*+**)'&#!    $+/368:::99651.(%    &-5<AFJNOPNMIC=5,"  !'-17<BGMTX_ciloqqomgb[SJA7, zpjfddgls{'-169;<;:8640.,*(&%#"   "(.27;?ADGGIIJHHFEB>;74/,'$     !#$$"  $,38=>?><73,(     ")/48;<=><;863.+'#   ",5=EJQTXY\[\YXTRNKFB<81,& '.7=ELSX\`cdcc_\UOE=3& ysmiedbcdeimsy '09@JPX]aefggdb]XQIB80'   !$&'))+,-.-,,)($!  !%&)*-/2367;<>??AA@@?><;9630,)#    "(/59>AEGHIJJJHGECA=;851/+'#  !!!!  &,16;?BEFGHHIJIKKLNMNNNMIFA;3+" #,3;@EGJKIIFC>92,$  !(08?HPX^einoonie^WME:1&  !$'(*(('%#   #&),.0/0/.-*(%!  ""##!   "$'(+-.01211//+(#   #,5=FLU\binstwvuqmg^UKA7,!  &+-1221/-)&!!+3;DKRW\`acdcb`\YTOHB:2)"  !)07=BGJMNLJE@9/% &.5<CHNSWY]]_^][XUPJD<4,!   "#!!     $'+/0344522/-+(%"    &,17<@EILORSVUVUTPNJFA;60+$  "%')++-.--,+(&#  $(,/0222111//.///02367:<=>>=<85/*"  "#$$$""  #*29BKT]dkqwzzzwslf]SH?2)!%),-.-,*'"  $-6>EMRY\acegefdc`_\XUPLFA:4-%   #),047:;>>@?@@?>=<;;98855331.-*'$!  !$*/6;AFLOTXY\]_^^^[ZWTPJC<3) "'+036764/+# '.27;?AEIKORVY]`cehghec_YTME=5-$   %(,/1232/-*$  "(04:=@ACCBA??=<;998877440/*'! (2<DLSWZ\]\ZVOIA9/%$,4<AHLPTUVUUQNHB:3)!    #'*-03577998885521.,'%"    "(-38;>@ACBCBA@?<;851.+&"  $'+.02343310.+*'%#!   *2:?FHKKKHFB<71+%  !'.5:?DJMPRSSROLHC=70)!    #),16:=@BACB@?<941-'#     #),024576775543110-,+('#"      #(,036799::87541/*'"    "$'),-/358;>ABCDDBB>=962.+'$    #%%%$!   '07?EJORUVWVUSQNKIEB><740,(#   )19?CHJKJJHD@<72-&   "+29@EJMPQQOLHD>72+%  !%'+-12567766542/.*(%!   %)-1379;<=><;963/+'$   "'+/3579::::97630,'$ $*06<ADHJLLLLIFC>93,&#)/38=AFIMORSUTTRPJF?90*  *5?HPW\_``]ZUNG?8/'   '/6=DKQV[^acddcb]ZTNG@7.% #'),,-,,*)'%#!   ")06<BGKPSWY\]^^^[YTPJC<4-&    "&+/369;<>>?==;9741.,)%$"     #*/5:?DEIKLNMMLKHEB<82,%  !%(+,.--+)'"  %+27;>?BA?=973.+(%"!!!"!""    "&(*+,+*(&"   $),0268;=@BEGIKLLLKIEA<72+&    '-17<AEFIIJHGEA>:51+&  (3?IRZagjmnmkjd_ZTNGA:3+$  #)-36:<?BCFHJLNOPPNMIF@:3)"  &+169=@BDEEEDB@><840*$ !&,16;=ADFIKLMOOOPMMKIFC?:60+$   !!#%&(*,.023556655453434220/,)$     %*-1367886530.*(&%$$%')+/259;>@BDEFGGGFFCB>;50(!'2<EMT[aeimorrsqpmie^YQJB;3-%      #'*.1579;<<<;;;998999::;===>>><;863/,)&#!  !"$$&%'%&%#!  ")/7=DJPV[_dfijihec^ZTOHB92*#    *2:AFLPTVVWVURPMKGEA?:9430,+)(&%$$!   $,0699:751-(   %*.36:;>?ABCDCDCDDBBA>=:73/*$    #),147:<>?AA@@=;74.*$ "'+/158<?DFKNRVXZZ[YXTQLD?71*!  !%,/47:=>?ABABA@?>;852.+'$    #%(+.257;=@ACCDCDBB@?<:751.)%   $(,03477643/,'#  "&+/47<@EIKNQRSTSRPMKGD?;71.)'"     #*05:>BDFFCA;6/'    !  #'*-/234556655320-*%!  #&*+,,+*''#"!!""!  "-6@GOTX[]]]\YVROJE@;5/*$  ',38<?ABA>:5/' #(.39=CGLQTX\_beghiijhgda[VNG<3'   "%),/25688988666444442311/-*)&$#       #$&''(())))(''$"  "&.38=ADEDDA?:71-)$   %).3489;:;862/)$  !"#$%'((**)((&$"  "',169=?@@@>;952.)%     $',/359:=>>@?@>=:840+'"   !)/39=ADFIKLLKKJHFB@=840*%      !$')+----)'#  %+18>DJMQSTTQOKFA:5.)"  &-4:@DFHHIGEA>:3.("  %*16<BGLRV\`dilorrsqnje_VNE:0& !$(*+,,+)'%"   $)-158;=?@??><9751/-)&#       %'+-.//.,+(&# "&,058<>ACEEFGFFFCA>:50*%   ',39?BFGHHFD@<73-&  "'+.022210.,)&#     !&*047;=?@?@??><;740+%    $(+-00110/-+(&#      "%&()(('&$#     !%&)+-./0112112111//-+)%"    $*/49>BFJMPSVXZ\[\ZXUQMF@91(    "'+/255652/,(%"       $'*,..//.-,+)('%$!  "#$$"!  "%*-1569;<;;9841/*'$!  !"%%'&'''((()++-,.--+(&" "&),-//0..+)&!  $*06;?CFIJIIGE@=73.'"     $&))+++*(&%!   #%(**++*(&" !&)+.--+)%"  !%),249;?ADFHIJJJGEB=83,&   "'*-00110.*(#  #',0478:;<<<<::87520.*'"     !#"#"#    !    #'*-0246889886621,*$                     #),/0322/.+'%"   $&*-/2579:=?@BCEEFFEECB?=94/)#    "-7BLW^glqsutsolfa[TNGA:5-(!     !"#!!  !!#$%&'(''&%$$#"!    !##%&%&%%$#!     #&(,-/011200/,,)(&%$"        !).49<@CEGIIJJIHFDB=:62,(#  !'.37;>@A@?<:62,("  "#&')*+,*)'%!"',126676640-*%!      !$%'())((&%$"!  $*05:>BDGIIJIGDB>94/)#   $')+,-,-+)&$ !"&(*-0235677666430.+&"   %*-013220/-*&#  !#$%$%$$"!   !"$$%&%%$$$###$$%$%%#"  !&+-0121/-*'"  "&,/48<?@BCDCC@?;73-'" #(-158;=@AA@?=;63.*%   "#$$%%&%%%##"!!     !""""""!!      !""##""!   "%())*)'$  &/8@HNRVY[[ZYWVRPKGA=60*#  #*16;>BCEEDCA>;84/*%  !(/5;@DGKMNPQRSSTSTSSQPNLHE@;6.' "%(*+)(&#!   %*/49<ACEEFCB=93.'    !$')-/23565531-)#    !!     !#%$$#"    "!##$$%$$#"       !%'*,/1245665431.*'$     #*28?ELQVZ]abcbb`]YUQKFA:4,% #'*-0121/.+($!   '.3:>DHLORRSSQOKID@;5/)$      !%),0369:<=?>????==;:853.+'$    $(,047;>?ABCBB@=;73.)$    ""$$%%$$"          %,17;@CFHIJJIHGEB?<95/+&!  ! !!  $)/58=ACEFFDB>94.'   "#%&&''(((((()''%$!  #&*,.12332221//-,+)(%$"!  "*06<?CFFGFDA>:72-(#  !"%$%%$"    !"""!    "&*.235688776510-)&"    %*0379;<<;;9852/+($    #&*-036688876520-)$  !&).269<?@CCDDCB@>:73-)$     $*/48<?BEFGGGFCB?<963/,)$!     !$$%&&&&''()++..///.-+(&!     $+17<AEHKMOPQPNMIEA<71+$  #+28=BEFHHHGEB@>961,&  "',17;AFIMOQPPNJF@:2+"    $(*-./101//.+)%"      !$&()++++)(%#   !#%''&&%#   "%(+-013231/,($     &+0379<<>>??>>==;;:87541/-)'$!  !$(*-./1122210-,)$   #(+/158:<>@AABAA><84/)#  ""$##!   "$&'*,..001100/.,*'$     !!!       $'+.23545331/,*&#      !$&)+,/0232210.*(#  #'*.0244431/*'"   #%&(()('%"    "%'(*,-.--,,)(&#!  !$%')+,..01235667777431.+'#   #(/39=@DGJMORSUUVUURPLID?:4/(#  &+159;<=<;941+&   $+28=CHLPSVYZ[\]\][ZYURNJC=6/&    !&)-.000/-+(%!   $)-02455420+(#    #&(*-.012334444220/-+)(&#!   !$&((**+***)(''&%%$$$#"!   !%'+,...-*)%"  !)/5<AGKORUUVTQNHC<5-%  #&)-1379;<==<<:751.*&"   !!"!!        #$')++,++))&%"   "&+/37:=>@ABBBA?><:730+'#     #&),/267:<=>>>>==<<::87540.+&"  "$%&%%$#!!"%%&&%$"!  !&+.24799:99752.,(%!  "%(*./244555420-*'"   !#%'(*,.//0//.+)%" $+07:@DGKNPRSTSSQMJFA:4-%  $*/48=?CEGGHGGEB@<95/+&" #&(***)('$#!  !%)-035778742/)%  !#%&((*++,---......-,+)($"    !$&''''%#!      $+28>BGJMNNNMLIFA<60)!  $'),.0000/.+)&"   "$%'''((*+*,,--..-.-++*'%"    !%(+-/000/.,)'$"       "%),.022321/-*'$    "$%&&%%$"!     #$&'))**)('%#   ""####""    $(+./134422/-)&"      "%'*,.01344444320/-+)&#   $+2:@GMQUX[\]]\ZXUOKE?70( "#%%&%#" !%(*-/0133444443210-,*(%$!           #(,0368:;==>==;963/+&       !#&'*,./11210/.,)'$   !!""#"!            "$'*,.13679:;<;;9853/,("  !$&()))('$#  !$'*,/1356899:9:9876421.,)&$       !$&(*+--//--+)'#!   #%')*+,,,*)'%#   #&*-02566766531.-)'#!  "&(+-,-+)&#  !#$&'&&%#!      $)+/13668899::99:8753/-)$        $&*,02467:;;;<::98631-*%!  !#$%%%$#!  "(+048<?BDFHIIIIHEC@<840+&        "$$&&('(''&&$$#"!          !         !#%&)*,-//11122110/-+)&"    #(,158<?BCEEECB?<83/*&      !"##$$""     #%(+./0010/.-,+)(&$#!     !$&)+-../.-,*'%!           !%(+,.////-,*)&%#"     !#$%%&&&$#!       !!!!            !$%&&&$"     !""""!    #$&'''&%#"         !###$$#$##"!     !#%&''(((''&&$$"!    !##$$$#"           !""""!                !"#%%%%$$#"!  !"""##"!    !""""!!   !"#######""!   ""$&&(()***)'&#       "$&'&'&%$!       !##$$##!                 "$%%%$"    !&*.1479;=>?@?>=;952-("  ""$#$#"!   $&*,/23567776531/+(%             !#%'(())(('&$#"     !"##"!      !!"#""!!     !&*.146899986531/,*'#     !$(+,.0001//.,*)&%#!             "#%&'''&&%#!  "$(*-.0010/-+(%!  "'+037:=?AABAA?=;862/+'#     !!""#""!!    "#$%%$#"       !'-27;>@BCCBA@<:63.*%     !"$%''())((('&&%$#"!    !#$&&(()))))((&&$#"!        ! !    !!!!    $&)*,-..--,+)'$!        !"#""!           !&*/369;>?@@@?<:740+'"  "&+.012311.-*'$   !'.39=ADFHIIIHGDB?<84/+&"     "$&&'&%$"             #&')*+***(&$"                "%&())))('%$!    "%(+.1357776531.*&!    "'*.13578888765420.+)&#  !!!!   !#&(*+,---,*('$!           "#%%&&%$"!  #'+.136778775420-)%! !"$%%&&&&&&%$"!     !!!          "#%&'(()((&%"   !#%'(**,,,--,,+*)('%$#    !!""!!      !"###""      #$&'((*)*)*)('%$"    $(*,.///.-+)'%"    !!!       !"$&&''((&&$#!        !"$%%%%%%%#"!                                "#$$$$#"     "$&&(()('&%"                                    !#%%%%%$#!      !"#$%%%$$#"                      "####!                             "$&'(((''%#          !!                      !#$&&&%$#!         "#%&'''''&%$"                                     !"#$$$$""     !"#$$%$$##!               "$&(*++,++*(&$!                          #%&'('('&%#!  !"$%%%$$#!   !##$%%%$$#"!                  "$%%&%%#"                    "$%&(((('&$#      !""##$$##""                                                                                                                                                                                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Bell-Hard.wav000066400000000000000000004123641366722712400226540ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data&*("&*26?=:7-) :AwW49":7,@6}4 '*|)++O ( xuֻΙ q)d4ƕ Pb2<Պ}#'w "+C hLi]   j1a{٦FCPn&n1 =*#`&y%dB s$1y*$ L۱WR lpK"xy]ֽ$4(P q\+-.-3!Lެ=/N5f.+(1)*H [6%00 ֯~B.C+oDD^e^+A'O_I.p PW M&DAah%WujȤߠC jؠ b (6'2`Lݘ'17%Y(8x6,i "IPum"( 1/  3~uD I ';4 7LPR; 3`TC!Rs X<-n%[h#PbMOmؚp7? m 3$ (I i[8 }%v7U $]k1]j (h1> $*V(|e@/XGW~F ^ 9%e   s~@ sSI9M͝ :!}ڨ#OP&`6 \"# .(`", 9`C ( CbWP6 d-c  %R:c >W N|-Bj!P6[ g aMo zG| ^g 9M $9(+ 1)*K!O;"ޱd +#8c% #oq. /-&72/j H dGS  !B~N-h2 2%H.cy(2|;CIW7Nga{a4ooHg i 9|v+3n x O _Ytz 8X & Y `ydy4 ; A d[h V OP= p~+xW ) +i=o W !c=d-| Kd 0J*}u:|_z] b"Pw ~ :[l* "C: 5/7y ! yx ~b hYd kB#rV C> *W96Tx8-3^E6 z /X)+.Q|e e!m1 a ZESKFr8Q6y/9 HY gf:p i ` S  #m G[ `3At.:  +<_X-X b $"{  |'kQ^}$yl _ < a'z2 .HKowPH$tO}4$ 7KH - Q ! au5C L8 ]$ haY j,F ODpF{),R ZH`g^0 _P s w] J\A  l d, b, (9 k O  ,4 )9*X(OA- OJ"vA s)x6 : Q 3  ^HhD> SfcU:b EN|qk!NT , $y'r' psqlqj+F>4+ m]H_N A  qhPOXPl Mq( O 2 QAFbf2v _  f<`  W @Q p /" i TV TEa@| v a:#x/_M @ lZA:j;\b6HlCdX$1-lvu Bo4=v [ 4(uC E Q|B$ 6&;_ G \u}` !GH)hubt`_T N{W6 NLOT [zL&mmN  P sO*9E `DwZ;S|R<8x]  =YG]E`oMeEW ;tzu .fi}Q}a0Go 6$Q_xrN hz*J @ ) \-kl^v1:9L } FZf9(kHy= l tr{|fp q U'q+% kp  Ztwz`fsdEuV x #6$L)nl0/By_PpY_?7X0hpOp zZj;N7lH7~ td1dlTN L W  /!;xf BCEr=3 4cD F[.0z=CGPo I hN+M  .XcCJ + : j[r'jwdH'p YbzK w  G 91\KKkYp!W-.~^{=u ,:1f0 H tg@]=rJRB/B}R 29Axm:c*7<?=;n &YExdl[7e5m,hEygnA0%3"D|: 9,N^xj2q  0Sm;u18v0 I/idOyn*Cm%{ sUEy(u&a1ecp d&=D<]Pig%! ~EPJsp Y"kKUnQSXy$ISQZL*e HTsx ^JoJvFw[Q0`+j`1'cU 5%h~E"?eUd^A|E H0AwM0gdL=AwE; o(I QMgp:AGR~=WBVR<[HE .1;N=|6RLe>  gA^ NlhV[DF,=Jaj"0)8sqk@c:th. a[s+A/#!p>$\NC7Om;HDPbk1cR*I :s#ps[S:/F"33z0?O/O--h:?Fk\:znga{<\#XX\_:Q~aGED<cF3a31_FJM%_ l ~$J+* 1 t4QZ$6 67<`pqo7(K3\.T1$Y?h(wgNNh7f7\ebPrbFT,=Y,||%h 8Ly8L<Gb3@o9y\?GmHh#Q/a_Z?xItE ,Toi-HG#dYYuin\+$l +r^Oz@MjNFxp> ~ XVf]*,g),J"- GX%%EP' /WL=Q#q.;=LTv(Y]Bx|#-}o:_G1,Irjwe7^?-Yv +I\e\  m6.ZP34M205^%qQZ= Lcd00,pw0z9?>*dY^iau5W7fKXZ H@v;0 ^.|( $" yV<z07("osUh J\0G D7)D8cDPYPb8^>2TWp+_j$!iq ~cbgzS&.2%j:,?D-riH)yu] zd+">Jm&[=V@|S|[[*TNTe@ziT(t8}fwZWCB" ` Dn{u  [ 7/ D<1*D<UHXZ tlM@{Q>U ^:Z!F'i<zqavv\BL-: Ux h >`bS*~cfv r7uXj]aKO6S/5hZF|dZOXf\0*LS{X$Rk%.f*]R"gN`#W>?VCYpOMx ~['r]L6p~}u"]gFP4E-cN~ghoc4jPm zUHT|?#sQqT`/vfooSd8!RtyG>/YH?L#fg(.'\T$@%.QR 7YuvK^*?/gJ)!Y$xR,HzM5d%f>YJ5"xl$2vz,O]$]$r"d4F?"\$xGZB;R-0LN{]*OTl{GPP|sl y'P-XO0y#:1Tl|& B1f~Ie!I$.  =Ddx ;4^fmV @{Hk~[8`rtCYGx :"&8/bLL$>k k8>]V!D$5[`9Eg'[R|:8~;(a!ug \hPZ$zavw=xUdK, p/H) v5 Q,=x|OgLKi^2/@y 3 $ K $EZ}[/=mxL@COwlY=<hU0?M+tt=q0tnZ=v}jk}hOxR' <,7(4h0L *t@pu{|l7?OfR, Zyl_D\tC$)j"8Th.+ ^[ cU02,]!EE.vX~1hkJ0PF[=]Tl@m1152QR]Ptjp: k3@&%!ts9N*vP|YI-> Xba}F}e{8FJE+SX[ q&$_|Dq8q=&i}Bn H0;@PTGe~auJ>f/uF/ b{@*<582)eCBJlk4PBq e2dhD:4 1>.!x#kN%!?%8>v"=lR1Fn|mCX*6bvgCGFgj *]8=e~q<9&(Wpu|}HZYF%7jOgi5`RX561QBWFw0D) g lWw!`\\PPuP>uHz1XniIqW,DGs?uoyO\r(4LW$D4O^|@ 6hv8KgsEi6k-2i mOEz'/nV1bqbas@C41|I+ "%'c+&#kR &/`q!N~Kh/G1+xT<SRHd4 &,.#, ZBGO~n6$Xs%#P7hf9?rhf\6"@^FnH:~ P.c>]zXV q$_ORZ.r,Y(Ff>#Zb.0gACW\pn RpH&`R@ q,lUF1w 7z.,jlPrFU2Z1OUR.#Io ZJLx$SEE:X1+DP ~j2,N}Ul UNNmP g<"4{Y7@xiF3( f6CzZY 6jR WR;[$Lv\7 YUBl>V~(We5=4_d<+ xA4]z : .N']k'ZW0a]pD" aLtCM!)]n 66h t" g"vT]%e~awFjhE{g*, c|>.,j13M(L7 t jd16=f~}i k|Op`{c6h?#-[hn@{,|Zn(IF"<HigZD%ZMTeD ZART$1jne!*#1IP rWU|C|lId.1a/.,gQOPByFsUkC/-(p!eopa&wPfC Bl1~%R2@;}8)cpJ{WxyZM72^c. ^7_ycpzx7XBG&MUqZhc4Mo3<> 7oZe7`MG!sAo2yteGqn44]8~6}dld)![G 7hlE'6]4S kYl]Q`R4tRz>St})Gi>[_1ZCg+5esnMtnZ.D&q$5L'm5!Sqhtw99GAvZE80X?X syLR<yBIR%ldT)Ln[$`-j>9>/z :-qz{hO{4< T.L\K [&0$2x <(54.VR=i&SrEf R'tPn337zbbg~OKEkd(V)Zh *39 71:,=D)m" zTcP9gsTBR*C-TjC J"Y65vw )33TiF) 5o9I`e H+MG,,Urjv?dAl!*aRAcmyf21%l  YD5w6LzO'vR u=NJOGd%]:AUy/"n},T0Ve{4P#4_X%r~U1qgqh&Q`'eg}'Z{MA1|Rds@vH77\4 mXp no|AEl`SJ|x1@sn+oflX ){os| DY3<[3W:]B;o`sNZMN6O: *(mCg| flsbtt`;(/axx,s**zr dMmEj:VKv$}:oL$J0Xn M5f'._Ed \L~'QP^/{>Fa3ZX{6#C)fl@kc=8Y{vQ-$ j3'9 3v KTdc8/Od0~P|pHEBdh\X(wpip2Ih}j<&E0)n +KZNEtY Et7<+!B@M{$hI4 t /+ZUzF 8D=JdH$k! O|eYPSv=K3 nAtYm1%( ~ti1D0?b ",`!*U} H@%`P~b#-P-.0CYM-j6W~-m2R~H5"Gqe,|)/)[TuJ%^1i, v-s< 4,H3+[0>n!WVfEsE\!ieMS+sbP9yL[ [1oM!&X{)Dt{Y8o`H#m[}M'"A *W$N ha WBm?\i`$;$5 0>*Sr|}4h  +i~~<u$f|rGDbS+EFA+VAHfF_B'2t^Wlk}`U4u[22F buI7-[;(YHj2- 8&JA|\|KCOz"0\8e)CW1VXLXv$k*f(AM0VL{}|="J[Dwzpr d  bf(9$5pL95j /I`!%:>~wW.; I"QFvn @83 .xm.ODtr,`#"g:B}eFOC5E$%ikqn&X OfO"*3cBq2.xtNwe*H9gJ]G91(mpCjH<,n]O}B>D2\uE:X/L5@h:o2Ea7=Q]"m*V3-;b&Vy H}b_*J7Q:5xqS/$8y `i`|*sszLg|yf rS@P -V]YHU= !YB|0U(!?W4j`<jp ]! (z'L84.tw>m%, \UEKeW~_8@B Wa|53i{oj0mp({zGz1,^0{[*9)yX&Z[W|4fc$ro|F8|& ! yjtSGmB:TeUSU,0=.SQ:n 8pXO<|eIt oj+7?y\%jq,-4Enxp|I_z*\r"dFa!76g#2QahIUM ~\?'E&%tlu[^3"T-nw+RH F> >%3\bj4gZQ{0W+Da@2=Hw7w:;"o P*co}cCU.DZ}^-Gp_4`#wtmAP[Gr!C0m X#nLHL3Pm1I x =O$yZ2.ZjVdYjU>7ZTt YD^RcN1Ne@Fq4rDfgO3c8P%W7j/B9Kp )g~ # 2scW L^Cf*R_\}48)`D\vVcxc Zq}b !_G,iXJrA#qa\mJ,.5(are~}F1<$ VH-}-U<,4Wa4r & iIhdr0I+dqK7Z| 5a\b;BsuKS-~xI#pzmK>JDCO4YOtuxv^?gXm|\$(s~W F`q?h>#C6u0 NM,!mv~*s9J -KC?UE+@C<z /cvCpU>.0^%bz&AVke YE]^<R6pcD6 vZrrb=5:)B'xB&{28`_)0r-Qu~t }B^+X;6=hx9Zn~~g!r8dT>bSZr|1BoV7> U.JTwm|;-$S"Bve,V1 *RR,>@kM}Eu2:&nP7l%W:m$Aaa\/tTK66HFiZ`qn@D TS6+fO>+~?FstW@spJ| A z`.c5% U~@0>Ni)a^>o?n/yWTI*@34AVIp . 8!dC($>c[h~Bj(Fd[* 'H$W|9e}L$?Pjb/ tJzc t iUt>=2gE'!D'K'3Q-KP_`ANT@adDoI9A 0Vh.y ai,bwR_LUDD\} ZRkW-xQZr&oO41dhT;])JjS\c-M]ss;I)Ss.?hF0~ldn*cJl8}|n}/MvRG5Rgn7k4.qIq,X?cC 0.T+=q8nd|^V4~H89;$ yp*SL0yS-K^^hQjXkZL50n[] o\w p-h);AJSV[Hn(KR)BR{ua% J$9VQ+/ y0 y]tj10|[hI!dgI\.2@Z=QAQ] ,24{` Nf)) bpIjq *%1v|| : Y hxKJ9Jtyf"("4n aviv: +L#z^>`Y+$ 6Z(a(o/"?"]Ld,9_!sK3sJmW%"ps>I|:;?gFr0g<(44)UdkdXynK0 *z$A +<> t.zSa9*lx`eW^V$RazL7B )[/o5m== DnP8M_2Mt+IVkGHeNOQg[iB"5P`& BGQsN {~* Gb0hT?Twy:"F ^ |&R^< lN1>sCh ,NMUyBV-rl=%W \Y E;sd&~'k M!X{-UA$MXOta(6n&aL9(C%?o}8ikadc#tl2{vd "kv|0#V3n} {6 A"gg-b%,d$*e}JwK{BC@+r ! vX KF{Y=+Kp;|cLx)JM] *@%O`=61in{Qd2O]`  XEqaHZO=D`w),g_bj WP9B*A6Pc'xFgPvyQ^6fRxVaZm ,6\?dWERp 5&ISwjmO(//QD`3!V\`8o^OH5mdkLsa95H/<.BGRz(oOO Lj2~id. +|E \*M:'\WK.{ujo{P6^ ~W30U` F8HD~ovPghq=qg^}m0f{j-!LUd:ZqtxShDU:(v&R=&y>$@D:v3dhy W_]lL=o 1lkx(8%u'T2I!yB\u 'mVBDfK&N6Zv nFk}H$dBb @&q?UfOgPi=Cn=CPEfffil X/g^?2K]JT.j  t,:h3=.&=jWT\tORqr]Uo* !7y?< &FHrZ}bSwLoQM9P/~F9'gQBjlxtKK=8@h,1:38,<.(v|A2: kR/mZX>h1r #Z^Su u7*>FBvoZAR sJ"%Qj!<>Lfpl },m2&1$6>@Jk+ D$D2S N7"\5E F4vM0JrZEZV:DDrG+YrMqxg_rt=Dh`J(ypv)BvZf]v(& sF6MIqbDa g%i>2\kK<;:1}&~r]\h9Ts?6H>;|iN*|!x"U0xT[)!a@QZ0S#R] H GU|(I 71jdLJpi$D `JpV!$o'?7?LP2+x[/4 D`F^s^+>Q!G5d cfp~DXYure',,ui1N4*0coqoKT? $H=@oqimSvYH.8B~H*2y()R#L,@@ -R^tt0,Gmm 0Fd)*,2%m:_+ t\_)szN$39Sg~tP+=]lkK03)R@ob S \S  !Q^##w ,]0LB.~e&m^0 l&{1U.\z(yLaI(|Lz5X]-E$XJ6]/{{~ ,%d<%@tn@C1oi9Php v mkq A]} >JA,Ag\D\ IKhh_R?>vb2dX zDdL;d,rc(\}u W]~C Fdol7 +@,owJ;4I[m5aM Jtffd|ax 6LP:xU1;(Uo>K,r*`_;IF(I [T2d /5h:G' |Mgh C;?FImzxzXB^ _p#4`5PCp11u"ji P\{1]QL=~C _6?c|8(rIJ l1lZ[LFpOuR"^WDTa]x^q*<)\lKm\#$xLKqj92bsieR1q[*[W YlnHz3c10grGoi wE ?b3%,} rk712@%dR/85O/-Lv"I&$46f\J 0@QmU0)hfXMD&|[4K'D'=sM.B+{kCG :NhKRg;wq[ a~BFlY6c|y{[%\;*p|,6+ @Pbj[$z%ddE4!4 gRCAOsy2b^:.^5.'=^"`/ZtC Rxonn/f(8dIX"B7@JT3AoK hyI)$?r fA+n9keVv1@nd3s1P( :h<D@PqnFysK4 l['&I\t$b@R}HTD[^PFqL9g@v>LnH>l~ T,Vi (rXvdi/G78e.4u!AVI;s[* nw^W//vx/oh[1z4EFg`A,W{ R$N^1FbjMb`!*,+h'K14&Vh2HF)<"hH-C3l(oFZq7x=U51iGb,7|nh,W\JP29GzNDpXkr;K`ORr(t(H:wc9P.vp=!,uR3Nb`&`(ov'IvROl_h,6Mf` r*&(+1[dgX zg*7<9.Q8ff:W^@9l<"Y--De>pp-D98ET>@(j|?;-@=W7=i*>vj@^IJ\f?jII NH$h`t}v]rYrlx2ePm3> K4 D_%hNU;TTtRddW ,Gn37r:`&51#(960qkauj OAKQC(QmTroUOV xAvjTy,o72Hf!Sd/sSGdd xv,~UJp ;Ld`*h*juK3,, .jh*)Di<O!Um[>Px04O%z5H{*u[Fr;w00 "W~^!iJZzm& XmBMlMt)(hz4LVf:Wc)J^0#{Rr~tY[Gc{a[M5-Z5y9wHg r1#)hECZyL~-.9]Z RG.h2T}fu IMlpR4FM-]G /hs2$i L@{R?`,3S.XJK%1Qed 7t;e$ZnzD)yc>Wz'^mCZ0=TE^R-B?}r  .fK N5dQ VAIW#a Q$eB(7ZwkRPo3^AfJo TJ(A-{-|p@/V1QnB(1UzB&FN[.eu"!{Te^Jo|ZbtNSlqp F)t`lKfLP G86'xp$>wAxf}8Ijak8&gO81x\Ikn2.\vN0 zF*8xz6fJLRvRbPr3%P(:y2Qy^5$Wo ~jGh b6(>?EzMs :+sgH XoB!AlT[k+idQsvW ^y}c#ai0>=o"@pm` $ntNLAa.H'( 8VH1fq- &']JYrN {i*<4yWtdI,CkbpXonp}gmI9hD, B@b:{ F #x\w'/4b ediy;NXZg\_QrMfwHRi"-4y&M:+mo07nDHZ740 '3B<Hju\vM#&=rQ iMET:~[9Q!vPD/1BpJ fUE=QW!.dV3]M}=KnblvLDT"?_!X.cuqj1_ W"VnXK~)(z(#{B-")VsI@K ^SkIBo {/Dh">dKZB&l,h$5iau]Q|hyc 5DbAAx(1W"bj4c[N}3o((#Q^~%P5/ b;ho6t/azH3_a%/]I>nx1.ogPo~EaoT6@r~bkf} t49SXw'[ttWp'8A6U5BjifvXs2ER:{<Z8'~DyG5=1 N{}-%GcgL-*B%xs$WdABHJP4)f&/.I;l"U ?XB j0Qd=-vN/exZJZj40fxhy;8bwNShfWO%6Ic4yrC Sr&Wd*EVZ=-z4~u-)a`~Xk"Z* ?!iX"{{2P6g!c|qfvT"p p-TC#T h0XTGAd}mkfgQb1Y*a7P'mT2#ihdo`fpky7Xehc+8$W0NsJg0CJr_KI  ?6/6mTI5pO X LLBTr@[^6jy1)fNM\:4+_ShlDLT&YTRZ*#r&[v ,1cWK kJf  tKU_ZNgJ/w? 1qA~8$zR4EVTfFu{W`x!m AS|=ZF "c zWt`.7%.=?Z^K ;n9?}d{+%c4ZZ4eU E7tVO,2m"bv'/9H  f#Jla8d 7["=,F1KN]J`  !<~K=s`*UfTN 9O\vV(w!dm)t84UpR0{xP 0m+9=0Hswy8V@'.&T7@*4]CX9,P,Q pR(^|w;#Ix:Epc g*~B0)D{1 D)1\Jt,G8i d.wu%*j.{&jbrnowRtVZ% ba'r_ T$9=vfE=1^1tZ^`qn,20wt(?%} tX`P[pzt!V3% \5.4FCTdAJE+a`$v4'fb(y +<~vJ81p*y^'Ab`*lO5_ U C$q. ^4f7SKF?m(0h0 II| Z j`>vU]A  nW2 t&?~I:r:$F j^v\-$wm0&}6Av sj?l*vRIS9oArH_ %XUW5K7 />}%x@p3;HR?{A!K.0"5{jC"*L = %.(D&cO~t^5D7qqN0VVW% * |dtd|ym uB)b S,7[]>:Hg~l@k_O9I V}&~!!RN>P^kPI=N 3g iMfu') Fy"{~Hn"trdJRM?mKQ<A0 >F1B:D$T=a@? DlFxr!.AUDLcdI(- Xd~OQZ6+"( vSE`i SINPR;5X|cz{6!>VL$u|^stIy[;S(_?Mv1?950SL>UVe tt*[ 5Nkdg%vx1"Y`vr|-iwGgm$N$X 3pDFf,W?C{S_~ ?J3+uUoN*%x!{<  tFHbGy!eQ[,t3@_ gek q4 KjJhJn_3=Oug"IMBQ %|V,` %8{'mv~%=Du"*L`8YzTf<bNorv C;# ^"J%MAN4r-339! DYdm{}<Wr`{K C{ K &ERu(rfW2 3[-_it|pyN (@nor2Ua*Ej:^<x<>fRC2W%o ,D/LK`*7$ xxu 4)W}q$re@}prFI]";;h~r?^edW J K6>@%Wwe4^3(.>Tto2h/xNI;4(HUJt?Md:Ww `\u~  ~y{9C8,p<\#o 0jm"6wx:7`?VR\*ZwpyF0|zxL.;  JKIU}C:I!A1)uqF< $zHo."VDAG}/ h~-SXH@DTQ#q*+X:ynftzRZ,t4m[v ] :Q`  lojS"FY'y.G@"eycTq.pJWDkj]uv*6NX^XfY@RA[gMc8oPIn7hl{kKj_D*%?\MfG&2 ;vl%y|DEm_`}>|[VP Xfx6;i^oFPKA8(rP]*7Sm>UJXo^rP5ay_2nd]gIo9Q^Q2 ^20+y}+>2eY"F4R<(ZvWfRn -cnO$ECkz.h#87,Hqc6lfP={!^+r[Til]eb-|q S- PyU;  'hxjT \P5i8>g!vt<wLD~$yBu{*Krwl&))0Bg]5dJM*V Q`H&+ma?3YR"iwbmW>/r({x5Z{4Ut13<*)XU.Tu?{0*\_1EQr>Hd*nyX >C55+F40lCU!T YN)K2}t&-bH' M C @nPk#&XBjKKTl4<te\"!8PXk'zhH^f_OLOb!A6)m1n&"dRe< S0$+$+WBpF4F^4 j^1VCh.olH%ff]s|;1[{p$Dr31K WIz6U+:iT\th-O\T3mRFizzp~KO62acZRb9{8 9=Z-8wDaO8Yyu"^Jqj9 Tt! ._:W2Hi.3K$3'fvQ" (oFhF`AV 7bw]K8W/O[d_6":V-QtC.mk l [fu!0r}4TTT&e5a~Vn%mbVD2)pxz{SfHvz5Do-@ 9t*Bfi /D|NsiEJ3/ 1u:A|4Z|!LW9 SeRaF3WE-/c> Z/C6K @l8BP#m~rB Ka&|[aZ^Wmtn%"a]|M,-89f!=NGo^&K1^R!T5qrbV< "3U,#=*`/{l>nURXFPjapL:qisF'=@N ~' 4:@?LJ"fxqGQ[]&Wo`AJ0Cdmb]W> 1f 63\PNUWgo-(4L' RSI~z Sb &6,V, q`hTJ66ea#v5$T_e.&V }b=>]P:'6F,6>ys/4R1~  1\07wI ~](IL j|WuD)L8HQ[]SL@4!rXtx[+RT*gU8n|mJ \\4gtnilHL#V<>,q)sqo-?F0+b*Ldu/>I1aOj4w>xh4!Hm0t []^mN"{L"193bC.q?pFCJuVyOfT R\*N *n|,pByjg &d$PTs[f Lp rq 7WUj q7k c8_f ].JA6WquCpyqyi { ym# |ZP,LiWegTF%]}bA$ %4n@M0FaY;-=/mYbwuzE#$n6' 08HT@PF|3-9 k;3HSCg['lwl, P'hvz!xb55HYUj\\FtF">;?WM'RTPU9wbr,s9.Ku"{% '`T.@zwB]-[ E, 4q#SV=n-su0],"dHN7K#cgi{Fmvc68J\~-d"9h9&9g0:$3z U9Ifbfe^D?!QVJ[;YW Q@l5]{P5?IVlx}10Jffb6mwV#'2 8 jZlM)iHZ|" :Py^s XU- 7*I:nlE<6au/ gqK m+%ZwFR9Wr=sflb&Fw{sDdb]h~]f t.X?OmvF+(U?@e^&*>hf6~p3,b=[m|yyirslQI,hcHVxy).C#\a!~fs7:b=e(|luo< R?z8yW/m`F~&No|tV5(8tH;`| Q3c}U1./DZhy1LcuaJ ;g $3ANT?998<?m00-|dhsb~OSB=]e:e jnfxo:]0H?"c!]>v X+F6,1%kh!6.N]ODTx:FPEhC$VQ=zzxxX$0phgt:U++'{o6Os3 7DXH 4fV%FL.bxv]6ur!N$%[o47oWlZRU,qRt0<B' SI6vsVc.Rbo3lWXoC[Ou=/`HP9"RN]'4f  C>vj"1lh"=F$dcr.^yW v ~~: _t#_.\NZlL[dUxs@[brVK9=Th\X[yy`/'Ru=1 @igO4(Ju|Bh=8H H+tAl~fPl@v4G^?9MKmR@4'^Y!DL=**%^EE&l3++ \PN+3\ ZM)]BU"*_&rl-ZpYWxfs?MC pWy[ _Ig !\((Eat|pov $cM*Zl" 2P5}g#!Cc :Af_l,x~@jk#nu&:o(CE_H26DsPb>#fnI8)I 7u-N "w>,g_ZzO^U8FK2]fr :k<rF@ hn9$Y1G W1;@j5 Cx][Zsl[H<:-~/Rwvmq0 u   SgTgsO/ ='O0ytI& vD46S%iP3HE$i7O(=bL )(,/D7Qn}w^2Z}:$ w{n_q}j?N<>rIbbV1;2%QxH0S-o5Y<y!gm=4L~ hv Y$WP!x|1t%;b e*~z~UNuZ{LW4S@s/]UoP0t"Bs38sRM$Se'7B(~63l ]i[@,E{^UX)]o'1-SwN*)%]LPL1T\7ClxgJ-(<mGBe `R _5=Wyk$ p3qA/8VCC3Qm'Tu,y& D^' Z<1|9-d 3ZmQ# /bv$gk' sb. i0li,ISdNZpGs[{I[/QS!U%D "7YLU/F*&yl6@h~4W}g1ot}r}o%8'd/&{p/Y+!\#zXKg&0c?F j'6pY=3e|b&QN.)!NW60b>TXTYue*E 'X/ zcl gZj1RIv4  3e1c%<{LNU &L+9(Fqh 0Mi_5CyxSyVQe=iUQnZ}<?M*c aR]Fe1wq*:sNq~5,n[2`*E#rL?fz\L\_'u/g|kV5/(2JTiguur`LOS^IN/L$91x<{~,;73~Z/A{!0?M}10udS4yN4#03# *HU*}(l:*>bi:I3O Fzd=+%5=E7(N}<ZQ'K~bt"5&9 #],GP.yYg.ML $&CGjc? QA;2PK^s Bhv7f>l-z[x^C<S<x  HL$ {'kfF9s;1u=%6E$TikY-j7*a@7 mbdLq?K1E`J XK]>3Iue<] JV7u!BHQVWW2;a"1$"1G|!=W^z\cKrj$)OE{?8^:/Q@M?Y /B: Q !s  dWqGA .w>B'jLx~ j}Ai/9:)Ul)TA6:Mv!)M-xkg$vBX5+5S*k|D -ly(VwfS4*Nz;0;A65-r4xyV2 }!uSt.ArlU>7_' ERZX=[o,Zf[\{IoZ)\)Q%L^fT(pOD5Qbt~^< A'{= C 35qn}XC;PV`~rhlr\!Z:WqujOX?:7-k}eMg5U(Rd,8u@(e*Qv7)A $?k'=a_\W]t6NS^&\Z!+g-1mx@ ;_n0mr&FB^R_vQ.B21<KG,$" "8U#IM',>^xV>n^!v&(r;&6Ss D WpaJ@3F -h(/ * f R&@<NJ[}0r9$4euA-ePQ\.({?L! v$ .EdtpeJ;Y I=*Tc:N)?Cgg%_wi(]OxHtR?INH)  #<y(7,~evuY9Ft^QaO',Y;csYL( ws 4Y}zZSW^`aaQ:&$i6l_pauHNao\>_.~D_-`S_ZDv hCjVF</*@juMma2 8{NaAW7/:a4HEF[| GvxZ?j#A^BOBN.) ?&d onbQbk0oa+3&Seh[k{6]5%>P_W~dhu'@,`SNjM. b]:%#n`uwRX$rEM@?% c!%g<am M pb^wTs(chHU!RZ]D#$[q#+-IR:Ev&e<aKS|A(&<^R4^cCkxjT=2>c[`sssrjoz`=xkOP\y CM9}OdJ[9d%)9GHC%uK*2\?}_94,jItFLr/E$+@O$H CCnr+-mHLo4'Y, ,Do'GbX@ "7Jfsd[<l-M1_tlcQQXih^CBbzuaw,JD_'i#Ip|uMf:%=yGs Ypfp!1;88) P}0wq)86&3Hn0$PE#Yp lO7%_.?sQ! OJWL1yen2dvrG5+oFljWQ (GQ^cdV4#,FXmqiF44b1=@BBVdt5Wp+-ffT^33kru?8 Jc.9cM&Us`4 |>s?Vh</YqtI%'T j1X K?PX\g{.0$O< e%`FJvnO0pbT^?`A`B7Nli!rc&iQEE3%/Q{4nl9hOBOa'\\<i&vZ64T[UX5}XO\O4 7==- (Wu|i?6'!8\=?wUmlC>(o#{YceVTmmU( ^We|Y 1{^?=Fd4}ddpp3j~vM {]C(KM?'H'l p6.eZ`VG<J &G{7axo@v{yEL/SXXO66KA-{XOa+ZRXm87i'GfopR< "Jun&n2)W{F8]_~YxZJFXu6j~c0gad 6f[" 0QoznM*sPF[  |@xA+RK@),+30,)  2pmdh]WDuH4:U8Z]= ZU]lto`U\r+]G!KfwqiPB,(&F_vY7 Fs'$DD7$ EiM1!tX'ACM2i<@2oWTMJ?n^z@n 1"2yudv1 `V`2<~j2->#Ihur/r\c=6[r_mLbB~\UoB{pk +xvC8CtTO+-S2'5<_^*A/~hSSRbA_pN 5J\d_UC8>Su}E"JsvK}P>>Pi %3HgP3 1On:LSAXGw|_:+A{'n|Xz!x},g{`2^e'\e@6ET\*dCN~5s$R3,>a+.HB %9Vi8:O*q_DBDUT7=4|LfS$C ZO[9%x?rC\e Lx46#*o>!E_dg\e%<,7m#TnygZUs fE*M=(f2 @;gOad2;LLE3&&<cp/ XzpdIHBPPRR\hoj_e[W1];V SkN5 E^Q(RwD%$-864$#2ftdtoU ! ^;(IoM9Jp6EJGYntdYMKPisyaI.)#8KlwO' ksy#TKS:fd(4q09^|vM**Vw?0m9G8 ~-3< T6;YD{;Eu-J6P .*i6$.r_v6cYs@"N"UjWIX7Eu1z'FRN9 dpYK3%"A}Cb2 ' E!qPY8Z"#q/ba:| tgI5A!zZ|&}V]$+l~ROdt@ +z7 {O<.P4 >y%h nFIj3w(iam>%4i cqL "__Sm\ M7@r%lo3Q7KqS~s-4zpB>] (B !/kKVno:v+g-!X'd* 9q8tnT ?{V >1 1(:%p#q@V6(dfs`G4=z!9.0{$Nfpl[9 F("/E\{6~f2x@ ,7luB $)2E=ze>07wi &OysQ 6F8@#9s/ O(  >n`{L/>h &4EJTYmyK#[.H8|?aT&`=;f9yq!*8 `Btp} XskW6 9TM: b=*7G_o=P\[K=)!#87]5/cVd|E=u8 o'<eniL!C<rj&+*/!G]j^Yfs:l`A#V79\3PVI:=\q-M(4iApx`L9;Oh{sP!:t|U  x"3600JJ4_ T.;2J >?+~M6&hE?olkH]3+3@L^hc[H?#Fcy~lO,NF)JO.pXmiek}&LaJ8|5|E'@m4ehGt_u!7gMY!I`uiO%{kz}>\50n,4w.C6 qcU0*w P#-" _Z  2]^ ^-Vz+601f|kK)#PvxL*pzJndRMHB;&U;A\TBqZ45w8cxeK4&rm(nO %1@GJA<<A@.}O+(F}n[f Ep~h#b*"F5ynY[w<t:-F3ybai|uX)gE7Jd3LWP2x6x 1HD. -[gL.4Eo`):o^/mtbaz_f!z&_Ul!O,4dJ=q:!-`,g|V>+2Ru\; %!R-(IsgE47Wi[;DsSqdqRMuyBmwp+zb a"2Zvvphme|b>%!&!  #2M[geTC.  )APC2*XzlG!l@ idyW!^)$ayOa7!V37c7I9 S12DXbX-<akbJ::;E?@3qTA('8b!@E5u8Z"xi(I!,Z''80}W${(glM8485$9Al/cx0Qp; [Sv X{fQWkCgLCNi Nkf( (XzIa \9.9VcokO o?re|[tVIIPXUL-yG+W|xN+ v$, ~WDERbOo?[\Owz{a#X91II|U j+V0@FGD9&} XfS7.(&#$##,Fe{gZFX}R'M"&Ej2cb-=RFuz#MQ:bpKAa&  AdN{wz/9:2"3: {ih%*U4)6q6CN63Q:RNEH0I%|q{M|8dTQ[_cjwz{}/PesjP\Un<]n|xd@$(Kx` 1}wS8FYsx[v+WB`\5 J&o<u[*Y,8l!=Pgf:%M{S0hZ^@^Z7dYez #07ATupU?=Wu:ttm_t 7@=??]}=oC"1Cj'&'ARO4wu%FZlnoi]TIRbmo]H- O{H#0#|eMymf][Tby;gk7rjfego3KmBR29n9OQF>D]P' 1TxyuV1 %4$ xX/=c+/)a</d1}w[5 $6W} X#|4[{sHZDAO_rz{vtw "! #0@;:-1?h}N)880 ,GWga>h&"j.A0OAO&$?Ms 4]x~lC LkjM*"S<?M-)?`~KtMG^3:'~p|ZC|AUXSDCCF?#@uubJ4BYZQC@AQp_;  (9>=:3, aC;Hf#7HO@jHFTu)`fN3?b&fI1ENRV_ffhbdUD!rXXt?anxhS# "%.+$ ).(O:=n^oA*#*23+$0fx9rJC^ 4EE- Cq{e=QxZ9!! *1<KXb^U="f>./;N^lN<;Q2KTNHB=:-*!'")FjpO*(7EaE|upllt6KE1IcgYMHSU]OC!,Sjwvoos{xeP+ AKI865CR^g_R:$cV^!)0:BC>8 _Wa8\fbE.  '# !0WrkW06Oqv@0IXZBnOLPZgv9[s]7pcm /Oyi3#;RUG ox"@D4 41uUaZyM"Qn@":Vo|}}lEl@* #%9V-.#s^TXqJstYG.#$5EPB/gi-@ml;(Mm{oM 7\ssc:hK50RK#E ,rKjO1o2)kWv\H<)mC!+Fn ?i:  +B`d+ xPER,@>* &+,${v8CKS_wrR(z9 QXV$>mrCsU8)(.F\u=uzH/9E;5(%*@TidZ6 ,9UmtQ5 {{-Vii_AlD#.G^nyEg,; }6ngi~Bcd6  &41(~t[FFa@]dcVI/$!-54|L+#2`XY-##151ukz8zH& yP/$<=AORN/EAIboqw~zb<lF11Oa}xM, ~riq,]pb,^E>Niv`WY~EA8pT)Z~tL5! +<KMG7%&11"tF1:`%Rlnl[YZj{~zhR1/~W<;K^eV-w^QWl mUI]z,\pnaG'#  '789+0>Qbi]L- *=I[WH(0VmdJE%?n(\y?5 G .c`*.Tk{wnZD.TC~| y`Zy ~e_gwEa"@FD7).Is6  '=HD5 ]/'Cp +8.kmv,;EIBJShyvaD!BfsT( e^aw!{twxNhucL'3]yzhZLA2'8VpU%dF@?Tv /H[U?$BNKB@Qjc0&2KeoAC]aK7"(0>@6qifk2A=)4<=."  5\hI<=NZ\N*/M_dX; vkqvcf{G\U6Knd24CHIB;,-1ETdqzweTFBHXiy{eAN';{*+  !zc^f6yvujrnuiO( *Ie}nK   9_rdG" '@Ui{i; '16CRiyy_6`II[x #8CHE3%rL31QA`fYB(#)CYmnbA!EV^S: &?VZS<! #Iig\<$ *GabI2NlxrQon{UE}[HFTn.Y~I /SysQ2"$6FasyWZ@F_ 1UwyU4E m]H5*Oou_1tH27@OMMGPYn6Qab\SD1"\eJ5( #'#%""&->Mbv`/   }g_^o .KdukIzN,"4b*Ss~pa[TTM>&z]P`KruW:+*Fkk&qhx'3.!  BX_S='zGK,Y}WM.4Li6PcW6S$Z5{=udg5A?0""3KixhOJ@@9/  (!DkznJCJyijxQf)eMPo0S|W+";ZhbFvx %2BO\XO7)~|(./& xpz8lhE$;fh>vrx(Pyn@tc]f &  'Rosigt~\0  mVHHGJUk)PoucG6, i& D0_qgL3,1QpYw;qdqq.w`i~4TkwoW1?nyJ$69FPh~xNm@"":g6g}8oOX|&fF%I]bXA( $(/$$BUYU@("z6p~I[<*-MY|f<rygrL- Lwr=-,!*aV[{  /Klz]/To_eq[(fSX{=VXAz? *b*SigU2 )"v,TjncI/6Y{sKEvxN .[Z){&.04>Pfqw]8L..N 1EG:,'0F`xsV(7mnWLLYpV  ":HFA-;]hlgfheZI6"ClyY)$FTQ67]meI""%;YlqdP0 )MokF&430 hZ^n &4?;+lLIY;nrT>-)1>MVTD3rr?2>;%|pUye3lk *QjeN& 6`f8  !#%3BUh{xRoRRc-DA*fUTm-,# *71idr(<F<+)>FD70(" &=WfhYA(%4L`hi[E) *5.$ "@ajlS-~Cye3%:FJ@5#'CdpL ,@?. "(01:8.#  4FUee`O>, 9VkmeE#q]OO_.?8!%0-$ %5ARYYL/%/.+ ";Qei^I) l_`m,ATgg]82ELLB4*!'2AIH89PXPH951799780(+:8/u|9NSB-$# 0APROKA8) 6Rjsvj]O>%  &519ORI0'% 0Vu}\;  (=E?' w*:?B8/ 0AMLD01MbpmZ<383?ZhX4zVMh9H7!^mM+ 2G]enifL0 ,FNLB5.+6Icw{g;*.*<GF</ "3FPN< );71 "/21$%5FM[]fb`TI=6(7H>+,Pny}k\<&  #242#$)/-(&'+0-.*'#!'&'"-/'+9@<+$2E\qfI'<BIC@;?BD>/ +DOND7% 086% /;<6( ;f~qY:  !@\xjJ+@ORD#]OM^x/Pr|bB ';GQSSNC7);RPA( *7;=:)w6<1.QnyiQ7*RuwS1 #@Uinvz~zo\D, "  -?A>6#&13<FMX^[U=' $1@GRYcju{wa>dZZo*8=;1%{)7LX_\N; (:MLF<.($)+!!3:<2' ,=?0zbYWbs 4DTRI, !9XrnD 2AO`s{xa@ !AT^XP6#t\U]z =[eX; /RslD)@ZhqojcUE+ ")16@KYhlb? cB26Hf 2EQK:vhl $26AFHF?40=?@==<CHWcpro_L7! #..&u]SVh 3Q_YG+~t{7Z}o?1W~_;(<A;- ""!  *F^msnbTKB;40-(@Xfkh`N;&kI+-8]3HVVOC90(! 8ZwtdN>) ,LdlmcS;"  )AJG<* \GEVx BUibN(xfcs &=EPTcoy|o]@0Nn~bC* Fkf= uXHH_   )RsnM%%Kl|Y74SluqZ?xS7'"$7Qu'./+%2BLSZivtT5%&"%2EYq~hH !,$"CX\XN@>?FJC24VlhJ+ !InsY:7UfcP+8V`V= '-) -<IMNG>4+(.4<8+ '@Vbig_UI:- l^TYh '8@9*B[cZI5* %Pux_L90.133/*# %.5670.,/42& xljs 3=IWfqtqaJ.$Mt}Z>& $3==8) ~~  !+.0+ '7I]l{t]; -BQOI@3)~.<EFD5(  &091# '353/-'('+-,'!-7<4!  %-68<>AEHHF9#:_owo`N=2' +FYceieg[P<({qv *J^kndS: !;OWP=( #?_u~oV6"273$ wnqy(/6:=95* $2AKOF8& ,585'%&%,"$0=7+!!;RJ9!/7:==BJTXWL:& "//%&*&  2>KOJ7 3:DEMMPSSXTK6'/1,!   (;II9"08CDE<-   &#z  3AJKMDA85.# $/44-# 3>B9/$&(#   /@IMD1 8HSTH9$ %6EORMC9(  *43((15420++)& &0+"  *32 nn +685" &" $%! ,>DD9-     &7GRPH/#2EWbf]P9" %>LVSE/',#    +@MND1 ;M[[TF2 ~sx !,.( $6B?4" )773$ 3HXYN6 "-0) !,+&"*//11580" &%'-9IXbbT;#'*,.4640'  !)28>D?6& '+110% %:HJD3"+259::83&',-..,*$ #  $&(## !.8@CIKMJE4#:P^de`XK=* %%  ,>OYYO>) %(/273," 8IRPC/ ,0/) 4EIJD;1' #&*) )77,-CKJA5& 0DKI?/  'CSbfdcZWI:#  #02("?OK7'-,0::1 &<KQROIB>:965.#%+*#7DMF<&5QfndK!!  &BP\QE)'4;4&  &18?<:0(*:CA?73.,'%>ScaXF6+#   '2;?=<43( &,152/!&:AA7( -=GKK@3 !)..33;@A?3! %9B@:/&&DWYTD6% :XmvwjVA#"*'#   " 6ENH8 ,IX^SE/"(02+ ! /882'(4>A8-   $9?>/#041 $6BEE8+ )AVfg]B#  *8A9+(*) ,:=7# 2@F8 %37)%+*)! $%"  $4EIE5 &(   #'-254. '27888=DLKC-    )687.&      (./.,+(('&("  &/0)  &)$ $**)'&&(),*& %;CC5%!-;;6&$7@A3  *,+!),%  -=CA+)?HB1 .9;4# #+-' &&$  &&&!  !$/8:3$ 2=?7&(("(;DF6%      " 6DG>, 078-    %*$$.45.& "*--& 3FMJ<)      '0553-#/ANSOA*!  %-8>>4  /9@@8* #+021*!$(,*(" %&   *020-,&" )8<>5-)675'2APVXK:  #%#  $;MON</! %@T]]XQIB:3-# 3;=6) )365*   -39885531-'  "!!/9DIG?/ !((& ".:CD;1  !  0@HG:& !<OUQA.&>Uhsp`E&       ,?QZ\SA)   :KSRE3+.+8LW[SB+ ")3;GNSPG9) **$'7>@@;81*" /FV^ZO<* (<KLH:,    (,,#  &)-*$#.9=>92( "+:EMLB3 "&'#  &286.! 7Qhvxp\B'#9GKD5 $%     )49<83)!,897, .1,$.*)28850&   ##    ! $(+*  #%# %+00/"      !*1/*$/51&!.31) *0.# &.24540(      "1=AA<2) -9BA>0     #)))#      !"  "#    "%$!        #$  "& "+/.(   !'&    -/+#056- &,.*    *.,%       %&" $(% $)*'   $'"&-.-& #())#     #.1+#       )./( !&#    !&+*)"     %&'" "%'$ "(*)%!   $&'"  #&$&"!    &19=?;6-'         !(,*# %+,)#      )28961)  #+2562*!    "(,/,( $+.+"$*+(!   $+2551)      $,232-)%        !'++'  ',110+#   #*./+$  !"       !$#     #'*(%   #%&''((*)($                    !"     !    !#"                                      !!               $&%                                                                                          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Bell-Hardest.wav000066400000000000000000004123361366722712400233670ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataU$RA',<^+^hb~ss7=^עdi,#&+ eo@% 8FC_>cև 2ߜ5XElA܋X.(U+K9Lht{0^ ղ-CDh9Yb!XB%!!4]yQp$ !: g>/ʚ'#98# n0ݓ(' } ]`&_x ۫ 6LvVf]$8|v|\-Y4,'' :ǗM@i J6Y<)v+ w 'SB9!F44 7O:q4=i S#eoO)s zwfD}}1 ہ  D ^Hi)2X .tJߔ,1!%#!/3&+Ic@ `O)$A153J 0͸'7M},2WB%; 9l FM J}JZD߻B' yDMp x~4;:/403m 'rtJ'm <Xۜ jKY9E {~YZ:IҐ_q(*ؙݏ @'1lة(r*B"6I#%0'n0 5(yu>I  \!'  Ot(G Qmk UyGR@  Wj*ێ4 * W`A n *h.%($κ8y :/C%[e+$ }-SMY(^ +j i5'(e9V#%StE&  `Q -1ˈ! V - ж+ DaD'":bo )>^@l @ E :M #r ^R51)=4Z"&)! ܭ]m0's s%  E0h\-=f& l<B6n9qA- &$WE $c  1 eR#FNط2'qkMsn L9+K>Z5 Cw\- se aC! R-U>Fv 9"D Xu >!<fIaJ B"%S ^D /s /H  fi'?\  ot@P} ;Vev(u; ^5 X,l(\o>+-/*K(h& r'&^v9N@` e#eav^Oc& <;;@)]>H j$Z\)" x@P B#lU \m  A;wy+' ^*x&H\@@ "ctVq89:Ps W  X"d  xAYQ 1iD ,;>/  $V5~V9[ 9& 3m`\"m(_wja  FR /!|$ +w rN1Tj~{ T {p/%Fb z-$u  p53* ' +%xXH$} 5 <$yL8>;A D Ihe My[c/NJ;O Upc)Y5  dj_1i7 GioKzE Ci}3_ 8$iw?~`C  !+I X )As 4 n@a kQ5b1a95   { l{BO! F W(7 / q0 $D<9mT F d#) aR  N e :.o#in>M) {cF \bK!8  m|a[  <7;sO * x K4l%:o <'z V? KV} x A?Nw CIB_Ta{} FS <nkAU y1- F\T ~ Fkbv_M`cI fvvE R.LF(_pB\ 0ZvPcrSt9*@#f B SsP^ /: ]cJpW<*_'fs fuh(fPLB < 7T2 LD5W} R tJZd4vc}0<  J < K2Ii +_vfh6+  D}tV k 9rl'laq $ P O[n s2 gih6AU?q: _ < Zd]B  U %~yIgb H ]<4 :A2fmCli/K.b &c_H,4 3u  & 0s9j g =X,8,fCJXb)f)}m y@&$cx%!$Xo 9`"? + W B$#/"Dds "d,fX1|R2  > u= /8Tb " V{ x~!%  QXD ' qc1 ?6%K HVUCz-W_U  yCi])^#YhwaHgZA.g\.u52%*;DH>}F6R+)4)*[5b@=o = \Z;lk,|8A,^ZLOb f 5H-v  La96~lHB2F"6]G1  J !iDa<V>#\@c,strb$z& 31G#o_97p!D 9mF^lm>;- +VqwP]z#Qiyp)mwY[`GS jKm.Bu.iiG6iD%7 u5% L  q9H4-' ueP(^OX]OIAmdzr?3%ai]B$Poufj; =~MoP p^ 3 1 )$,dNr"vVbo*}V/4Wb<kmg:n#JnX,g5",(Ng;Qo#4'!, @U !cNx(Y/24aJD TW&'-}=_J.Z*1x$3 ,D:c saj; ;W3-1v'&Yeg^" P O4"H 'U@r@$5q#Jk  Kz$ m# {c.6_)Bk[\d>@YP^*(bAB*VIiX.mAp]Q]_>#&q%IE~J-Jo= "8B6> 7,GMXd FLPd&`K @Sl&7Y)X6oZ>n>yZvN.hQ7 voo =-$$@'A~  ["> 2/DfZ2ym9D[~J% 0Peky Zj'}vgo2X>m oXIpTEt X3 G ]7}HL V  lXOfwLP0pLFMf@+^&XQ>Z2+dUj/y{Mq1(_g%Z'?Q< ;(j$U@IB^n 0 = > OI=e w< 2i3}+7 u@JLmoca*:YhL?e qi"eV@DQ0hPd oK+t9=y  +\9 Q M?N^30_U8hsa@{KnM$3/9DsmPe8@T4pbT*&CFsqnj\XlbOqNu3{LuwFG5m*l!H\Xye0;$TB97oY/U ?Yu": :d/w 41MI\F<(= -q( - ={  X/ +_ !$c[L<AG\kz_x[ N@,t;mTyTCHHarL9.|}ZiMT,dlu" #!06A!P2:(9sh|5kIYux/B"sA9i%yP&;6IOnx>^}F=L6 $ZNM 0.iH^yyIgrt*"\2n(Y1`cSW+<=Dw  0Kn9KU &`%8K<Nm'4+%00>_M4H 8FfKY#)n. i!)U$#cWfVvfRdD,F dP5w\\`&Jv s @m)*)GLys(PyUNof|o` Xmy y(Ni2Exgro8Jf8L!NDv@&by62Ly-L4Sn=zaP2u HHV;SVyqYysX@@=5CT#1#2;oBSN'5BwhMC-}JB,>oy_sa"!pn>(r1p`^_ Pj6d = }US  ~ adh:;-#>YTB*"uB%Yy /k|Q!fB exyw6t+9p@F{5$[{]*8C sejXg"k~oe{PGgQ}^D Kbc?)vF^4_MtPA635}5ItX|`q qc +H0fd "zDg]pIdf?V#/'uJ:R|: ijJ'Vnl:]&!j hdm?N$k{c'7Xb*s ]ejb;MyMfFO4!]H"znUlTQG3J8V#Tb =4j0VX=g\Z*)dai  i}#d+NiKrq>ld="Ff&;p%oJ eI<GNT@XZs ~i); &>6Z l'i&N89:/H[13)fQY38_ {>/r`l7c K>^0oA2FClw} ,;{ a%{= yl).fM z|>@w= ~5R;X p~ ]Ns+ Q= UD|Fe79!U|5$w-Mv N]MUB{HuKoUgpIjN{\"bM}1]l ~`%6VnPM NkP6hxT MQT:IQ .k;W\LJ>y[ % U@-)r$#FjszzRU3+<NRvge*@&x \d]VuV ^kzR:dt[mXT0  ZR% ~~g0\x{Qeqvhs!iEws7P 69uaoEu'1ky;#@Y0=u[a7;u=;Bd,cD@e7"S>)F!IiJqR*ehu(^"pdcdIYqN1M)2Wv.I^F)M~y[vJs>a B2Qf > U]p9|PU6hqL}w{G9 j"oH6NR2 Zh%W)rhDR}v h 5*    zRNX? q2=/"\ u t@?+=7c_cv'F2#`m<\7$;M;\b~ vwAi!=D8j*vvH-^<suI."e^BwxGs,")Id<^,r#U2c`cM*r}N@vv3s[ u6k5_}&/%Sbt\vV]c}2=:OP Ye%vev-rfQTX3@ xujtsNPP{>mC^2$4uMA2RlN*[8GEsAMbNChbqfFy.:0 Z*&u8*j{!9^$Vh';m3v@BeRlTxxTLZ0(W;0yRasT FFqm:kU]`a6Vc QDm`w42 n|KJTUf{fWN 6*U" D8.j}(0.9 34o$`8]3%AR2j$f@4DZQDP\CP9>0K[dOJ&[m>2]zyD:ej%U`JM'!s(a[^l)8Is}LcZ];kLx#2sY)P1C/b|CxN8]HS?kR8f\NN**\~qP(+3jv{nA+8J+uc1@D:lm u3iu_JXN>=bp TK"cj[0'| cCffnhclo_W~&y!q>3;!=YRw}(; V|}(0&;+/ (Y7$5K@Tn?dMzL8`_@BR\YYFro&DdJe#Wq@ZHqYAl YK'bV7 uk e<Ljd8U[LJ{cnb^=mV/}S*+rJG+ upZ8h!-lWm%`MeEOL2Zy>m1xs4Jcxo@cB2wHrbZp8]Nr9,Jp^1EJ+!CG]z1H2&Vu)s'.6 w1 nYy:J7sL.[ >\$AifcV{c6p<l%^{#]Vd{ok~< %. W;sFFy+HG?1xA-|(P-)mPpa)Nj^Pb_w%sC^8T`8 yj)x3Ac@=a!0 iHS ]G4 MJje926p Nt/ ;K|p+#4e36p:7 fXO&cCO>63Fs&;WPu*8tM+zR!N8p0<cYn o!u.2] s|,@OM"g,2y![Foz<_jd(t/;&]f2P*~;rzywR4R B}.A/H]3.Ayn2&[)T".oyyv,NXF p|BC}aq30hu$+@> ha z/0G Sp:Xy@uZ'.e2Q]bJQF }w[ ! y+ny=HX$3NW[v( 0}}*)=%yx 1A:/SxxR15' +b?0) lm#\?=-5B1]rBOL'@-|YO%Q"Gs"D|@+\sZe[yz:>v="2=p)!KH&| ~I~l`;+`FOuNVRw]6d6k1mp-8N~~`A\O;dP?HSZP-6 WI!j%FT:3FK`39[;@] &X)is*e>D/f;$suW?XU iIw 'H\P U&/AaP!Mt9]o*YP/Z~3Y6<.%r Rui`HYTD~ LyAQ=xn<)S !NXU&AUS>/ok+d>Ta1d'!y}FHV*^.% Dt~X \Yd >m2NdjaY\ [Xw&lnF30Lyy=Zu*67doQr"b,?tMRe%C)2sz-m>HQK  d.98Wq{rH}X[*C^Q,[ '[|HOuS _w6rr-qkQ}3i$6t[v`DBiE^J$("|k'q7wtC+XUu"l|n8buDw'-R^vK2e6wu  K8kA'B?5Xr^] 'Cm &G)3plNoD+EmLxIL&Ll?$l;%zFO< lBanzTwV/]/thB-:795]g raK!O-[}iK#P'9 %T ro&hZoTGa^N@:TI]dc|M0R g' c fs-zmh/hE<fR9Wi} ]&W)l 3T%4bT US6l'\ SWe\d|Z1 Xx_ 3@JP  t*rUkGpfROEBY9+;;@fc?!,z`D ` ;6I<P 5pp>M<Fmq 95>q;PCAK9/9F$\B9Npr;ky*I*O#/GLiS#Wo?dL1_ ]d'zoI't2Fo*(8EI'0_0>"1o@S  =~Xhez]Lvpq ( RjGs`{u Q,&u w h` d~B ^(j#$ b`6gaD>M!7SS,C|f{0))G=HaooJ^-7k>s@3^BU8AA]s\?.-{3(->2!s{vTxV2ui<+0O[8O>^ ] Od5yzyZbp`'q LI* Xo,gi d_WrG!:4Yh@?$c>  g?)}dg>Y4-km>Ab-!`IC?5"9rJ$v0|7r,DG6s4[yti[PS<9~<Gpe/v$3/w?+JNV}oKxL1-`IC p3Y{\/|~6B 2]i*^V/4]T&1K=Fy&A?e:`6S'wAg<n 3,<`9I/DV{Mla`Dgx4lo3" Cs6vD 3)}Uz[5\0~#kv{?,>n8U=jK=K(,Z0#vGDV IgHdTe"m]q*oQ[n8W,>cM(X3pF \FJ!pWObIx=cgFKG Pxy9s9QdLQ>Zw-L1CwBOtrO; c-aZD &!I302IZ\;e3E}Uw^z&Y}Ie;8/n9yg@Us$azS B(rVoOV (9WQa!;w]_\Jcw0mW`#&=xR?ZNa!i 6+i"4[t& b.`N)M+ =?v,#X^>M FjIB~UdOAeE/Xp|f/B.!u 0JW='\4Ymiup&nf)f<QF$Yu~uK"leUy.>ut{'h}m/ S!2f6J%>*\Da#/b Z5OHdY~;P~0U;{c/qIhl*k[ jNl4t2@0l:\5Y U$ 234im( iSsp\Nlv&+c-&$:> 2bX9yX+PGkX'r>'FJ44 $hoP*i\#wXqFs,UeZp R0Da3F\ DO` YQpov!e \0 zC$2LbiC*:#Y1{k'<(#MjT%o@!&XxJG+[G9tu#cVI .!V$4S{Da{knf *EE%iQG.CUH-AR1F'#;d?7~#Z$G>   OMWTAGAYbGnd.LgjUN,cDnd.>;C2+F&XV4@6B6#';2_,1^`\@YZQh[V|LC0}uvkp'93f~.S t? _zq r=\ j)Mb)D ?}2f ; ,7LAR*51)aw'N>'~#y ybBj yT8CR X75kL.L<B kd + }Le'P6?b;6XeUOVGP0 LDL) 7 @g#._P sjsR9ZQk@K2Rygn)*d<H8X1+ u+m%z}<49?KbX0TSnsrJy:< ? PG 4ltw dgS8JdkGK6$j5I@zR 9[Vft/B[c. tQF$04jkN_aY  ,IzFA iwdh% Q$ iq#7Zd6Pr4wdFS eF$oi>Z, b]twc5o=@do~YcT\p4k L(7'! o88k ~/Lh_R'Fg'CT~9$uE{J[#,dL=H H/=>\TX"h_T 3H,"b]Eog`dFf>L,kkL_N4u+' <wrWWvG>U~)TtUjP5>KrfL{ O@QA;" &@/cr$Z'"$IZF+`_~P^Vm:93cpF" Z~^sHL1kO?} .m:k(h; JiEke&.[1 (}dfH,M)sV8K@ pE(Ku68>>4E;5MH<EzCbkDR#\h~\Bx}Ts)U+P{smd]N<] y'4j$:OcF{ *.L+&'' ~$V19_It'b23@O(Sm"M%7P*nD@" ZO6H3Dg%U. XIsnh%]F"7L8bDa-n93.#J-=ni]LbHps#UY3Y 85HCfH2fn!}$$6 /'hm*m#Kq^(5O3E 2GRU.iW;ag 4T^G{X_jCc@6ZXB)7m:mA+/T sT2NE ynjy8&t )b5*YiIU>Z .t8NskvDwWw"G $[(x'r M:@CO}_%f /Nl46\a0D@Z5#Oyp:$" WJrBkd<pxSB^ Y8C5/^6-Q3JX(@x7">Q'0Z5~ ?\rmu dDXshllj-'3TP\nf(bHK$Q+M>S83?TcKmyS` cklX11wU$24wH@WY4:.?>_0/r&z:P>fh$k#Y>]-K{!]z|@J&C_A+K$+p$aaR~`Py6dHeFT`x}J,tSHD I /8G&- RS;+p}[VnGqmyE*8}BK[99[X7R|.rh)x0`-X5eJ0fIi p-5<KmaQ ;N0I|bhIP{c'1iV{*Is@@Cwp ;?:T<(ZA >'(BV{E0Fqp; rFJh"X 4@0%1Prw~~TrUjQpj5Y+6fi$7}t35hl$m;/DB^2b{&:O0\:emFZUs^T2BZeuQ}5UdLI]8j6@j3($Ax2d6^D&b\/8a*d46"bb2]3OaV^$j}8 bw9Jy-/X/MU0< y6 \$=d-FB_HPFUH/y8ljwpLd(xUe%>^Z\jK}~wzNOdom]i\e@^2[z@wXs '9dw_IN,-ui,>R!@CVlhy/Ydnpmt9#WXtA,5Dy(v|Cdt=0:A3F&%2KPB'14nLjdam_>`G 3_k\<<)`HW ]D7n!75DU|$n'OGcYM {  P>yX8_7@|6f/<FmyE/k]@(f3f?`VGF<D3 i]T_CViYh8b$|G.8--_6O>;|ZLUZs|LnAT$_  `Eie[{%%0a/S2gB3v!L<ZWFXtwC Aip< x@@++O^7{pZc0-V+~LX>KiN$)?fK@ JA 0 vv} F#(I?Rf1wfB&Jf+)L;M$esf?< 2;O" \3TI6>7VPMg{k BVfg5b\N;%| k< 'O>OD#WUM-`)s+XEXo]wC  Vc LsNM&;Uc;^0bDdhE,s[0/>GVchhiN ad(F b3D#tP9fAnM:lOu#g@'^r^qew4xk#Ff(9a*Pgjvt9Q `9`F ~EQfFbQFa'[& @oo>x^)LKronEQW-mTY]%|W\x 9Aip!{DU6k\@4HP/$tF8&ww.^-=*VGF ,~/EjB#:o`U2;qiSK]v[>Mt {uU.PcL{R)Sn4U{)"_&g>2>y]+a/,+\Y%T(C<Z0(t;wR-=OYo  QTOk-!!0#kGR"{A+9DV Xo><'CnFxR8,-s`|*j|7QsS`Vaw8 LTw5Sb?+b$iC5D<A,&f9Yo!T54 !?^'CJGc\pa {6{.UOFfQw<>@#l!\{;5\aomfn#Q,9|,&3VeT_F89o 10 .hUY:>)6Rilc;ALf`MgQX-K,$}6g3{>N:r<l%bpULN!0x`s f kv. Xhs|jT]';X0S&kTsP/(]8rJoc*s7 +(*]g(+Y-_L)Z;?vrQ`74/IE?6d#"T}w[dsU`k-Q!9-yuJX1#EC,#0U<}C)Qqp^" hUU)q Yfda+^0Bv23D ey4QxE^#HU?p.//\#l*{Q+"|j3@b;)L#c&mK7@]\1n93{6aGnE,x?V`SOpII;:x3#N;HXf}9L|0Um9n;Q>b@_myby$~SJ6y{oUvdwISw99a e/hMPf.;#"#AO-/+`uT-OkR mkv|s[+XbTf4]F@FwD"') FM1?6Vwf9!}IRrP 2ND_WI*Gu-=*zRv3s^^ 56;0o$\=DnqnAZc-It trhR5aH}VL$ ZM\A1_@S}HMLkpR@h " YkliVzs!vc#RXKf#futfQV<{F?!\0 wma? f< v I6zzaZ~$pNd7u3D>98E8fCDfPQO gG~tSsOX-8ipMHV.\s ;T\xC'V{fcEMX:'lQyke&x1y/#%pMy'"SDy}1DR+dl6L[)> eX3]`%ETO8}6:^&J'+DYNw,!sL6P2h45Q]UJn@m#a|"beJLe pG85xwSX\_*4mQy#j6?sxO"5;GzONrAGY[gsuE@G7Rx0PI}Xvz'>b@F [22&Jyn@u _Lj!?>vQ {D*]#F*:A]?o^ '` [0: $+K9epq56f+I"~H"dWDP[U(}~-[qf&$Iv=W2?  k5cMoqSX+P![D#m0[bFN>4jxWaj#H>}/9?&oab N&^avNGl6;?;t+C";;v/  T#nd[Y VPqW/QB]7:b#Z#s zIi"I 7+u-;|np6wWi|%oTD*[c^04QFMv&)^w3.N N70[+MDwi,PD Ru_%"JiV3yEWJ#K yGO6# .lvAw2/h3BQEdM/]zb! db|dSDyb}Q37 Wcg lKJDQF c#iqfY5CJIKec2H-a> i4/{7G^&Ll}g#C1e Taz' F1[n-0jqOu6VM% "T;71}`SHDO3DUb\C;JF-'1pUf+;"IM!7'CYSG^+x2fx.8@yg9]pVhst,}|"AsD 2[~8%r#1'(T7 c'E_ ;;$a~ rs5#4F2H78A ]=E[?` s-U&c( v*mD>Vkk _E_[m7\O86Ns!I1M 5GC8$-3pc*'/a ? yM ; 'LG-SheuZ,1Bf3eBWX' Rx_~F vPW%Fz}#U,j > Rvq4Ee]cB)Z;#!b~MNfAkXqmpCkHK4 :7PZF|GXcSXQ JA@X\E4)Y_$7Nw40?-Dypttr~Q?YJ!2(MH.'nu2GRsO0 kYzF}$>E[AX]G>ag]z U:%@v'{mvA/F P}^p 9ERRo 0|F'4%<NpxJfw \MnNc;enC>vv;/,!{+U\uMmy=u0Wo'cXwdg9J-7VLNlJdB%,[G}OMU~l>c/RD{,kHJf7T/a|2&u3zF*~EYCn42eR^ ]d<S BIV:I+| pup  {#vE2iVl||>~ ?SP9uQQ4A@8[3>R7FQPC?4$%56)v 9SSZPNx UW!nJ/~y)@j5fA0UdE-1mXF<X@gD\}92DP)6;L58\GJ*'^fRP_wE]gA2DU|BgKyCw>r.#ND&O!EB`gL|5|`BzH]Y77rM6a cNW#Ip%nU~d3kJ h<^j ykt;s)g4>P\@4i k p/N -!/=)NNHQ@%NZ}CE3fk#o-4%Pt=yL4\K65eS0ri}sZ4sud.uR7:g<TjS5 v>A'm@#sdHa.g{25wEpx4i$fI}w aFD.T;rVd*-rj&/@`{z;[dSELoT^i3Q^|{ 9G/f5_8j8*rmadaDJgF++2:Ol(4b &P >oh'K&R'H9 _8MI^RF~3G.N%\11||[e&dBe{\:%D2|0H|8tG!}?74"KY16y_7h@%RH38ggyD@%"UAvI"a2,F}lGU[~dgn>amI((T3H.H$Pm4'd7rk-3&6\ 4<u| 5sP$, ;8+G`7:W'Q6uUr$emO/GSeJ[j]%o&/\+kfjgX6PZruv^m%urU5MO h) U]|Qx=O=9Yuw)W4vH?;x=WuS[0hP 3z0RoOrX)H96 V7(c5d5K VUp O o/3 fE<#! _Al W:; 8y}nD :s4 hD-p1zV ngSgm)$xn#~xJ|@79sgk>jC_1&^{=]JJ25=,@6 _w =/TxVeS//)9\NT)kA`#y}MTmd[(pmR*3i5uXaP'r~"LG h(T5d PB9#5];2q9iI+6J:'bB^L MwFbs+fP $ MdC/V.}{&c<8dD6MX`]Z F!;'K"U#|~b- C7T?fI>0"QXM}G~:<5SZ 78B--%nmqF:fJa#`x>AllIaq%D?)fx& oFC\@//cmtGiyV#` 0[~.7XL C|i6F}R+Od#T*WahcI vl'gQAb0 FV|s(f1ZU3| ^ Iodf"G-m 0^Ixu?$8S;'9 aKY|lUt>2X!1n%!!Q~.dud;p) @Wwr7'h16[L  9fL_<4`nn.H&dN<nTX])RRgm<jbhgB:l [Mdh0;o]IOe|cZxp.U\)m8M!wY[oG0lQm}~2[:)3RB.>N KD,^[1NH_^aEN<w=;pDv3Wt}d3Es:ySG t=7 n+;LZJ9at@n/q;p6t+ gfu#wTg#Kj__rs5{sO1&.-(Pn[PR<J +3#|^ (&d@oBx" ycT$geY Kkts"v7C.b $g.C+A}<&\J[OT; TbQe{^s?~8'9, !'rde#b5}2, Zp,UgFPsJ;=>J%5m; <1 ID`E8G7JvQ]ha2"E,[ {4kWP{I cN<DBa) _BBCH{j|{h]>p &bRch$1 C5{\,qGaiC_"h 'x0owFbCEpF:x}>bDRa;/8PLhHuGd::io;A&k\vivc3zR*6 >!} 69TVO ^W\Hg Xlc5ce6L Z{`IWV<>2HyD52pzgci.W; .W p\_&"4[4[1?#C:j8OMh`J"%uUtRK$ae`Yxp9qm\0 ifJYbmHonO|jG,yw;I2^. Q)[aH]W){F1^]Og1 N%6vI ,!p ##GN > PUb1Ux5~_No;gc;e:f`SDY?X1?e,3sCT9mMxBUoP5,Q9uJ8UgpQZ" ./l2erH OB=5YR #34h}`Yt\R'f6;XeF@)'aJz@9PK~>p:%diB>(K jXUX8 ]hoo0<I'[jsESf<N/EK k/L.wKPJYwd'  l5kSY:we]koF@C>Vh,)6s8syGAj^(]hW$,(a5!;jfd<N'#K`5I kK~Ii'|t';<al2MeTl7(uwPb;\3dK6"6.5Rm+4TgT g+]u bs=(Z&`EZWS9fll9AFM- g[+\5"j@UPI0T#\g{[o u,9eQEBdO!GgQP su/_%pJa@,#@ ]8s/RE^9\0'vih#II0:geJ#$Vzv5d$FWF[ES X)82]sSo ,2"Nstg|8U1j/atbRz(rD(E BGs%k6OS=Ri5[Wjy(m|Zm=FCxdc2g[ /)"]65hKkt#GQP!Gj\@F,%RKF$5]dv'F &\Ti+X^ z$!rhG</ gqn sB1qi`;UrgU_%>F69@7eT(m,%^!# 1+e?.jQP2!#@8~ UNm(9Dj`%@> h' ViC `B:S)]H/eo)'J}t}F?267#Z;"cIe TnK8T6aD>~%!%gWjpFN 2ZBAV]B9.},G#,^Z"/xT#[zv(kaijE%F>:?.Ic8K3 %p%{38r'G>*5kM8=@Z7@kT MdH[VAd]:sGJt ufs{P:,-->)FrF+H  64*=O. 8iO7D`Pq 27,r*k< KTDmZm:me :FoM][*+AH/ ^N]~5Yd`pO /< 4@=buy}&|1|=/]Wf<G5`cN;+)xtja:9rrM:VD>^~+!pVCeq9l:b\1=::Rrsc77%9Lb^~v}[ Zl%s)locL' xmQF!NjqmKT`' A; ?j0pJ&Mj#s/" iXy?. e`mw[; 9YLc4Hp`X+-f}lO zjX'77L_*cI~_LGxj`&UH >D/38$Rw5`t^#U+Cq~T-_1dH /uJ5+!9p} CvLFAdJseIWB{\7`ux 55)!(F2An=';:Qh;|_JLH;]r^f[JAYGwnvl;PK6#bpnodpaSe Dv1D@{BAJ`SoC7>'i<"iL^^?25@'a&X9mQ.+8,B[N\J1xuumF(;5[n\O84?We:mlX/-1FEN |,-yhZW;QNyN\ltYL|D[LD%:z*f&]`|/N[8Y! (XfdiMu?@GEvH#"N6Ghi<H\]Fc6g .K)a!F*p2O66,'Ko I!=cv8Voff< 5{ae!\4sq(z.CA\7JUx0i|9&(S*3l?}A#i#tB=}.G3.Fy5X,22^jFy>0dDyi$kBoyFWziM/WY zB'Zxyol_1/[bMKa ;At8gc@J>iLuPJvM^q#-ynfWDA)L_T?FhRITafeXB$#fS+#U }M5&]BcZX{5TFyA B_GcxKE"OIZp.u4;Yt/|L$>0n :2_IoG_I'd YmP=4Yv-fIx@e\|Ii>-2QY!x6a8( <e@^m95d gyAVa*@T\ JP!G@:^|'|5t>FH5 _dm"MDS=S{0L\T5^.f x 52^t702$q\@~RsM7:DTf,hqjK'eIcQ@o!{R!K\bK1)fdZ$w& LJj%4(wO) ^QJryNbJ:LwIK!Pz?0IZuXr:jb44DuB*`FuAn#['Y,zvy/ZUz@JOvO5+B+ZbR3o? OaOm*,/Ivd J C ~o[%'}0{-/p}3#-MCz(a88b^@G] =-dw:o U9H+JZ*n58iQ[;I@ -,#C8<|' ?L*.pHs+hWBa&[`'r8/X -C.* ^:|+I& 0!n{ a+b L[.0gH/a_(PbG28?Z*;/".eT^u%!iR;pbk;["V@ =SUXD#}h JEq]&$o>gZ9D;c9(O5ZkfS9//@8*f!8b1x>nK(|z[rjmnq)s\4~PIp P*q'z:Ew,Mgv 0]T3pPij&d1i<N)YN#w>'."m:\ D&q%? qogJmR.iH!N?g;!ycaiJq`y3Q@ Fj2 EUF>DQe []d>;]ejn ryWHYwlD:lp0N(cbB 1Xd;lWvUduLba :nq,&\Nk25O}]:/^XpIBYfH Jmvot $6H! IzehF y Z!5,> &Zu)&kPj5l0(T.IX`%hQ"0 Fvu7;>M7ij[PMIm>=?^hs\=";YBoeaZDsbQ9U+)!FP} TdF8+CD(}!dLz cg@#d_i _8#>u#6#c!i} xn>)BAIG[Y]^.rVT\FCU/3$,} 4Os%.|w"RLkc8>AZpA2=,5I6^v|}a^c01]}!okc}!L(b[+n9b[wXwVfT@92zb;rJCt^=%)2\,< bnrO. @fvIT6=c[9 x=nb/4]~fV,2p\wCL>_IOgZ7TuwM^>Av2C A^0fxQXD'J3ot)z\E:h6 4K+;Qi$k'Dkc4]gC^Z;U ">j)_t)>#'hpE&*]ps4>tr6j F$dDKi X"py2# 1#S|#'/YZ@Bm5wuU0eADs R|WFUN)>-H C! X%aBw[sA M E.Utb[QI:" 3d9S+jOm&.9>w>G!t LgN'WbI~xCm(pnxn v50 Mh>Dw?9S R (BGD1 F3C{r`2?H-n\([}<zdKjv';arMWM+PM5051sK 'j?U{a\B&;!{p_:?d p@As=bi^;X&| ;TAO#}#@"I S7($3lk^+N{7ahv**Wcu" #" !| >O$Lc" J+ VmkF=1pz0L|}T! +LF+RF~Ure;U?IfKSJgl RSz, b@:FN[ib[ :8Y3E ,!M1v!L uF--hX5Pnd^fmFrzBm$~YoM;w#J@=^Z}=}wNHB|\o#&NZ.:*vUyi.3uc{nL ?~/bsj,ct!$ 'KzjMN@*c%KzeYVF'(\Dls2OFSNg&q -rUXU?0(*y0'US J& @JO W7z 8W)AJ84<i |F s BDPFN{!2=X\8+{UO# U2Jexyv9W\,.M6ByXgQ# Dy-3Zr w$n(dp!E[.Z$Q 7;' 5bs(7~AyEQ% (SpOnapjf,bd tr#V#^rr_6u\C62&/ut wL".c]/]ilmjd&wo; ''1JcGq4^ZRC%[A"Vo\ sf~$//5D{ j ^# 4lR- Q~xD",lY;!w8CA^^ 4KX`TOd6!Q' }s'J1 GFjFF@?3P@PJpWanW[M%p{qH<Y1^rpu\D61i2T)G<e&O0lL})^iB,3PvPJa d/uU>OsO4io'/`| SjaN:]? ZC?j7 Xu%{ .=sc/&W,[,(7HPP`h4ww(nM?D_-H2ZNg=TEUS3!U I4@nYE!$1*^ JEg2UN/b*y/#K=9tp3  1K[S9QJH@A4jiI/7mkp' T4zr'19'je|)#%,W(fh3jDey}*b99D #-,~))edJ?4" G+_ |ciYp 8Slrg6CjW{oe@!-!T%h+,n'y^( W-]1ZiFud eG>QlrG>''vV}uC K}f*;{d5 GuYXN)A> dv|7Yk]*H5V:Zv>tbi\Cg 1^@pzEMGs3p G~\#1dn2PbL*yh}~w.;$M6L kHtWLkN k%LHim fDvxrgWb?{V* FUl^= )Vo{X!.]>RjmK ETFOdrj#@LI_ah11EXP;8h^+}8)REgSm)RqDi 7Rs4B`Cg;b)blu7p+mdOaCpyQ% &6( qro3<skSm6&pa%{y" 2 ms@ c1={OJ}s@n*:,Vhru3 ?D!!30:q8@  4(T"My_n1Q> >Q}YDP0.#ULH 7C]CXq9d[SYNDBTx1!AR}FGtf$!\RD!v<aRv)`_A5W+!@PN5_ ->&1oGpBJ\r|Vqs;h|r_I5h!24a]{@D:@<\JZ\1favJftdN?HUjbN#qz#pDDOpADWI]S#tU:BVfaFvwji-w\jF)g |v3-Eh@n_xBv*YCk5yw4mg&/hoG37Xdya{/+Ns,/OvS(^b}b!4g_gD8I1pzp^pf9&D/za^qMne+MnfH)K, ,z3M.u(xxfFj:9V|~ny;Vhnb9pn} RDY;|8% GQ'mrppn(%sF~uFV>@:]W95v1,X!|=#;GulwzOzvd:VHVh0@n c^6IuW3|k' J%,02 n A%c;U#nV%O,9vshqg3IG#jQm+/kb m{Q=@9K=zoRdO&Xvi Ql@drP[L"iA|Lvy%H_(c@q{}uIr]ag0O5K0ygbPD UUl"&81<5x;hAhmBn@z'wJ  ]E w5 &-Uc3XUM'u.E+5 U3oZy&cw2sbA~>,\?t},IX7"OTak*1/q$"PJ27L2EtQxp JfPf 8RE(99~KaI&tpZMz3E&j .YS*@E.5WlI/NqSZ*?I ,FUf|Fv{A>1[#NX5=]Q+9g+TL,rAA-a '~ZvP3rmlsoZ):GK*5t6.CU`^XtJba$3JF8hv^O; D_k(F09aD%Q'8F.Ke2>J #!,$zfBg&+A= h $GPp9'b/]R -V+K :>Ol]y,oZ, ,e(AXeC )\|3XgF?>II6I~|DZ)|z;.h9WL!-F^^;&(xx*8SF4MLttDT`9P<|.8pe /l\~SL;&Ep=zMnwXA*;_>oN9OoFIHL3UX/y8o rq mP>n#23oOWm6VpvpaMGHOK?#Y yHN& ,1,xTQu'O?bPDD2>gyBXDf- 6^ouUTaQ^Kt GZY5 & i3D ,R ;xWk,OG\Rql6)[#Ljv~~vzCfC@fEroS(51-##'mafpg\rdd9`eHg>HzO9&w x* /Cqa+3+NU{JSTY5)gIN]gDI~lJu~`,R96# *@7FU rET[ T$oeJ'6y0hp7R>Dv,]ynFB!5 B'v8-X~D2;a~.[Q$]L!3q"o]swWk #p \Yj}E(:Ri%H[?Ik3XR_m`=g^N!  kLKfOQ1i=U5DkEppU8>,^9'+.0hK(K!$V" ~([#v!J]`<y3\8Bd+ca*mA9Im#Hckkppp_AhXZhD d-u_ Q/ @*7O!&|yfwq91 a'o}C^Q0 3f9*LgM0#"%/! mULsE? w2Pdv=&)[.F &Ut& y&aFw Nr;VdY11 9$_QA8=9{4WNVO\s%tU2@l9Op6)MqO+z}4< XvqRS%#LIa6.Z7DLSgqSzuY>Q2ed*L5/Hmw(dy`"|4mZ4(>G5OA*)^JJIv*WU?st|jgeRc[FRI13TdZUhYbWv}j?! .=M2rt:QZ 4JI#hySPWk-ZX ~c'! WcP?O~Cv- h\5`BInRI2&O) LD)S&rFL5>!fO&Nor>~MbmUj7K_a\z&HQ:Go%gS[y1OqToKp`tditf5)* s.m !L mp&Y!dNCWj8tL7!^ ^R/k/ !)) d?C{pSy>>>< nI^r 8L2 &9Xg<c5>W k * MvdO>9AXv\!@9T. mT5>cT/]yZ AF0TL=RMX )PV'[I(Fi^J/6LcL/'W|5d@,P2l<: y>0*y?(=3XO48p*N%_-2dxy UuxU;(;]')&MT#:y$Azv 5rl09$L (QF<.4ZLBOI+2%{d a;@p28IYEDvZ/'SaZ*4@91zcm^@@uIP-p~y*XqoaN+75gVlyJ,^^0">kx!P~{h9X)E "]hUPN3!M! Sy9 5Ps|cXf ;S^R;dQU}0,go7^R. (:F=!'q(\[?sADm) }F@)M]sPN{p;RJQ'>y @w9 0;;4)7e|LzO73Da8'Z i~U^m0 M(+jum98 jEQ nmzGIxaZ~A]D3yZNZ)5=:#u|aFa mu&L)yIX\D|#1, LF0kk%A-stNno{4 sE}]CI],pn< KxjWLR{l)PdufQ. [!nNPN)\X4*uzg$xn zo*9f +@Zk~j? mA08_^J EbhL/  cOUKhaL0+0F\caEq-WZoDFz"lF]dejjQ8\>8OtfVp->y^&Xx.S  oA/'#+@IL<_ ow5s#ImvOPyzh|c&lI>?botc=8`)y}! ;$;{z'J y Nm$;vVF=,Y)q"hp$x&H@r|x oT DX^Ybtuc.Z?5;dBz,H,7PL@'Eo{X3 YPt4 2p .>cIlnO<m{ `F2p88c9;fzYb?NeUn'4)g9+Q!%g" u9|#6|Y[wN*lG22L~7u"*8>q]Xj(\b"9P>vqnhX<k-UP#7[ "@Btk[?^x>k*Jf2&on u#Qat3{3ZlHW|UnFx),u =xoLOg5]X$m7!'y*'2\):L"7Au5sU3<^u6n&A}4> oK"a;/-Df1g@os 1P9Z52W>l0Gd)' ` NxiIa\) dlY vYW7,g.a}uy+tf c54SfU;U-#>ij qVB-+-T#w;]<)k^F>A.B1aT-nyG\ w 8^=/yqsgnxsbN<8K$k|r~4I1?TmyCv 'GTP'2@yj'PTaj|4 FYSwYG~av(}p(2 phEyocn#Vu{kR5D-9ucXPy^Aq-F?qd0h p`rw>`p4HH<[tHPb:>{@8mb3T%B1FflfLC}4T0]|oSMJZj]+g5 K~)Rnht'> @tc4{ 3\J{pu{=;R 9A0$DQJ@M1a^!}vA"0^;:m9Am X^0RDmI@ZRp =?z S9~%W`+.7qdO2w' #TRj?[sGF>f  3SvcB  Ns_d;\bDLiI I}( >(?tWp"N+K4i;uyCuO"M>1}e7Z"pB.5V /KL/il6ehD'.|GZJ2#93[6@w!w>H 5L]YBw:nd707FF=1 %9IXkeX3,Z5Om||a/}jEF8nS_zFP||!VO# *OV0a?3DzY  Jl\OZ=NN rB)2 H,;^o.q`eipy>>n?/-~Ll{Qm{$@;0$h^vSb7X|&9C~{X?)%/// sL)=/NnvFh]oPY(0gH Uz|X6w`MTbF9I M*R&l)yLMo{JT6ed+e 9w 1R;UGQs)cg4[.^>b[7FicGQ6 6sb!M-5s}:YPNPt.d'DNJ5&/}2LX{g-i +D97Wkz?u_<U@6vmywgYsRd&'X|]I/*/Lmp9 [FDp!LWK!>USqSiKX~z]7i 21/b|1~aE4>gF`L pr|jQ>5uq4 &:B0GmGc)`3!kZyBcqA0-]6YJoIAlOP2)5;2EQZLHJaWAhh8/gVVgpiT'v|3?-I;$Rlqr<i6w]_w3y i!iB5].(S+Z^? : +QDIrkRJs$;PKG5$ )#xg[c}Z'Hi[dq~yzoimm)EyXE$).fj ,9gp$DcYI2|#H21AOQIIZz^NX#E-=IJ@/4;_|mE)NgxmM,*h-}e+Q_'xIlxxM *a&@,CE][9  ODx>9aJa)Uc"SR>eK;9&%4CXadP4eBT/> P( 9r$(Dr+{rycYJ>=Da6(f)UF-J[D*&#s7WEX;k7s*V4>D6zR1xs{sH8V) 7al;Er]XS;yQ|t|Y<nRnE$)5?`!b -k Dys'O~g)fOL9+ Kjy\RXZI9G#KOL;}ipGR@5 n#^3R9oe^lK,SdF{7):.XD^_$f>+Rs|vegit@oj/^srD q ?fcI Z%C$Q+P/a4{5H^6N< yuJp,Z2 !5Z%,/4Be!["7uq mZc tC$ 3Pm>k=b]4ilIFoa ;|B6:u,o%G]-^}hojx+ *$ #;1 ;nu5U|uH>8! P:y*5B`yr<Ng)!L'v7 ygYQGX?$-#;2x #o/ 4/d|yb>^Oh8^W*(,?LSEB?Pv$+dJ5Oh| zP= "paJb 0#gP:e d,)IemT2|>%jO/*:iVl|($kit qq^,!8kvD"RV>v_JDIfMjrp*d;cSvN:<uKK6TB4pLIf$1 F",^pT[O[sAfpwlkO6lA$'\q|^J5"}$<VDI[8106=DPTKFJz-_aRf[,'aP:/alLrd:j9q!1fv$ (L]H!9Fn G^lrg`6\l/cnENk,MW9jx_UY7 8K ']Oi>OV2D'2U$gs a9pn4vZPSbyR+!5KACL&$P&)C\R2 2gn!U%ssF?hpO63/+ )>jzC@] Y, 3aSBmTG3203Jj],/9uG/8Jq#&znny0NTB+=\oVK\fv1um&<edRJM^i`82cY|eE<q,K j5sJPoo2%gv7 $FhsmK8^u9=bwd<ycr#F^V0^ 1%N q:#-[@LK%a"T6k=P)D< j'*v_3gh7lN' .nbna4R2aVOz2B{NLOfQmSMGGQt*@6)Z|T)!/-zZ`vFsw`B))=^p=Ltl6o5aX})wC).>N]abfp3aaJCmL9AdXv>  2L`jd^JB750$1=I5y4 >UvE|T YB=J\Dr*?B&=>k(op)|$Y^z_M>JXh^D["Q)OqeL!}iz")"JiY;y;1bs`&[rOD9>DS[^qHF6t\p,Xt/2``D a# Du?d+) ~7[gOKY|^- m1 K|^&2vg<lzsq\=ImUC>3AcR!9GMF:^:6k *Djs2iJSpAxS%O]+}LpepwN  ''76d,*OS$]9K4 5&9Ec{5C`O,1A[poaHOhd~XD;BILI4Itb> 'Pyw;k]Wp ;i9k,>"#_( /l\e|%R+uebK8om&ni_A)Ac s?l&_J`iXI (#0P34Y Pt}P/]QPZaggdge Brpg7p't&|#Z >gt[svF?1jDF"{8Zr>7b&<.Xs4F1d|~}tD XJ!y+ih 9b^9y{Cg\2fc-sD,4@>8Aw`v hrxH(sj'?{R, &Hq#TpveC*gI87Lyn!-mZI1 z 7m}R(@p Df+!'c>Q5asNI `9 a!LSI$J);5wA+HbL*. }dbD},AA7_eWv;?=2Hr W=R7XZ$1ky]q#\8 9V2 ->YnPPT&/L}XW#m Ea [ W>WiZ-oyl(O?s}V"kw jGMe2^~~jI>*e.y0 &\=X{xI5{3 IB8X#ty?ND! B-UR5{h{Z2K@v$ ;zLqVa| 'F]vzv|:L&$@C{vmU/p$dIWO!{ c*yB Q|jXF'cH=I2*I,&@to/q~?`.\2.W;Vd^Y[^^X8N5b$ISO>- 2KWYSD3 5^{n@)R5P2/SXguj^@6N0v[& ~QXU21Iy6JWe|opdaPB3" 1f[ g2+T#%/)sw)pvdwaRl5lUUnTr5r_9K%L^Z3>E\^%m~C7.<O-L^R0j'SIQO30`fF<D;aqp[A#qdao-hj9~=l]3 6\j\#~2S^/x'ld imVyrw|Rmzab,*) |8_T{`d|&'F|B'>p4RbjhV; fl\t5_Sm FxxFI(%@^+FR\u'')fL^ Fbet/]%X/;PNN?!yyz{sz5lb%.=3.-sUs[=AwKoula2":lm[ 1r I q2t:*[RpvdZUav{Zabs8kvZ9,/Lfl@rg$5*ooy%HlxT%~yjtx XX0wg}cROB*P:Dk/zd4gUD7+,/Fm.@ILH4;LD%+t{/ =RJ,Pjssv|j6oV^h!Rv~vaIHNd}u],6*gvcB.>x4'ka|A!kV |fgKpN0  LnoX6oI=:JgI8>@]>u D=oyWv)q\E8=LsR 4;5d~}vu#%0Q';ERL;57lKV 9;>l4xP-6]&o:XEsv;h9IgAz;2-q[ X=-<[zs8mnM8 #6:/ u^Xag||x[A,>l:&u@g2 NR`/F@h>TNYq .y!7L^uZh:[fu|&A^s|^F(  %B[jkcI7,(+155+zf`mN}2qiab][cs^2a 'sNNU7^W$?z|4shT[5">d|zSs02jOiHs: )ah$75O3mK />B(v/]4#E|3e#d\tk8 $TO_'RgW, )@Zft^Uv?[9+n@hvS]mC$Zv^?s?2{4 qTLF;_8D= $,"t:l;  s^;K AN#O;5/ ^i8C?8:DK> CM#SwM8,!a}VIa}v deSU@spO#5Yk1[DN"jj-Y doo#uO'{ir?8hnN j)x\7F'!r**[IRyVbJqo:}- 8%li:"5\;f ,0aA#3v]"k8 yCK=uCx* O<MYWZejogN5 s\TRds?d_C* +9LO@ *RQ/R)BUl"]8x|/E8 U*3U>.SbE <z3r n)i?YM< m-,xA{]R@(=x>p9T>sFOh?!u|@`]+?EH2 NO.Fk> yB7TOu;Lr w[Rc~$pu?(>BR[chY-~m; FufPLMaDo8 z_X{? .?3fcj0t7snr" EL1t:mpA$azq1GB6HeO{F-d' B7LTH4L[0ocA2/>Uzm#[_<. wC ?KrM.-3GM?8T Dfwf+nRM`wBmc9 ,*"SpH)5qOb^G/  EfqA^9?d%W}vL[1 1U9TuFyfr Bai]T`rf64Q @i~^'BcukDhWj%HMSD;,*0CYg_B~sgR9&*.55' ;|w7y^PbccP8');i-W}~Yms E^dUA<DYyvV5`Y- &s}6{2#2B>.%k7X)y\1eC72Bd ve$lk:|9ht GTO6$-]TY::X D~|;kYW\uUpF&*V!"WbW91WpYNd:[mxvm^K>3+ nN;*%.Fj*8,)"( %Pr}`8A\ZN4 8bY Xx0{R3)?SmM"8j&A>h^H:iYc(WmmS#( 1Pq{S% `=7N9Ygkr}}Y8P85V? C '2+t'cfrJ/"'1+~/[&cxR+ skl|8A; ;ip@ #SogM:Ff]Q%$G,Il\~/YNwwF PNBt s"T/B%E+*-FC5{lx(c:O#a>u,2i* (Fo"P~lw6 *e'Zq= }`IBA`7LTQHBDQpV+MahcU?3*,"b bC. zB 8t ^  lM)"$DN5B7:xkc]fv:u#SeU"Urr?gpDwfTF>Ie .H^eX8}keR<7t8ob'wT=%\AC~LCTH5|;pG>)"'`s;-Nm7Z2Plyf@!uLL>`iS|j^L0C8xm|N r0;~AmIWA =XWPv_ 1\z"Gw#6#Z }z/amXJFA>?;3mPLXj/EX|> &GRZXgl9yo(`{cUWU[`t^Ul9N4slAP&8Ris8^scP=2>>".f,D%s]s,Ap]F1 vg?uBYWI~K+~Ir'DU22W%kv R'#F|:b{yubO/6 \)~r5xU8#'D|.*D8W[9@I>QKxL0\5&)Cg;c{jR2b?03?Qew:cypV<3DfQeUb "=e~lE~rx~-^Ru:*e&Vs~vsnrpjNTV4\k~AC)7{A$/Q %9PYkx\z]WYl{'465:?LL=Zx69Fn$N+x yg/ '/7=BPj8@mn9PXQD@<CD@-JlwiWG/# nak5IW- /n&|fG+(Q @Q{\D8,L,jGeA#2XuhJ' '_K[ Qx]|._'Of|ATG4Zke\\a~4CD GjzsdSFQYibII%%E} '0,#>YfYD(,JkzRiYgP9I),=b~8tBtPHJbm#^z/lTYm #>dXrl{-<KSTN9%' C_laI!wN+'Gx$Wz_<yhl5uqbRC%yhrH{{Lzthix,U{yW0nae $ )KWTA2)4Hiw[:/98248EN\ZP-{{+[p]ULB"c$ I>QVVW[^dd^G(}V4%0Q]yfTEBGPTK5 0OTR8 $,# .YxzZ$)Ef\"K =|=\\WLPa~~<FT,LM:4ccm3-\ (.' *""+12'"(,/'AeyfD* +v_ daryfdpTg&&ltU9" (;KRH='!2EG4 rggz2SYK( %W|oG&  _Wm5smB (A?.,_uU1"6A2(=A0<\ryvgF|pu.Vn{n^;  6UggJr^m,<>80'($ 8fw`J<469CE=- %1."$ mjvSwpR)|gmDypB !8c}d@   ,74& @G@"# u.YZC"Hiu_B!)<Scq|}ufU=.3PPF, sL33J{$CKD,$+(#4Ob_K),LZM5  <I[^c`VR?4{q*IKD, {jq 2\h. $0:I\qi:~\d />@;/$-:9(   5Qcmvy^9 #<UgpiT3 9UehaN: (9<*)CUdjfYJ??K\giW: &6BPWcbZ@!*jeB$ cJ?Ha "$))-&yldkz 4YnyqG.?KQSY\]YOG:2,' &*/0.&ug^t Ci}udJ5%vrwAr{T- {":JO\kZ z`Zf|.Uu~iI&$<RegcQ>'%09>GLOMH<1 ysCf{jN0 jTIHXq 5[o:_[6{|+QtoK' 2OeneM+ ww ?Ye`H%}8ke6 <dj@|'OwgJ.~qqt~9VbT7&Mivyutu|z]: :XysFN[:Z:"&@fDi`1 yifl7dY&|~ 07630&! 7ShxymQ*2]vtdUE;,lW[kAmg9]=)0Ek6Sue6wifk}3FTeqsO"sn{)Pn|xhO9#;[wxmb\RK<**G\km\E%{wttu~Bp].phjq8ep> 0Z}g>/64-  -PhphN4 *F[sqM&|qkqBnueR> jbh~:[wkM*:VlpnU? (4@CD@=<<><7(7JXWQ=.  #=Sgv{eG%zicfqAXkkh[L;){{%Fh}Z5 #7ADB91+%#    6BKLLPPMB-:Wlw}a>vpz #)5APUQ= $2BMM?$$=LMG>3*&  1HV\WM>1)%&&"  '1>B@2&=M`imaN3 .Qpw\= $>Q`d\K4$*'$   (?IUUZVTI9% *6EO[_`TE0*@HH:+ $'!  (:B<1$%->ITTP@3  0>LIC5!   rly '1>KRTJ:!9Tdhd[QJLPRO;"   %&-GW`\N9"?VdhbS>((>Vde\F- %+-)$ "//-'*EXa_TB.   9LVWRLFB@;5)%-0-%  4FLIA.3Mbq|~xl\K9* %)09?B=.    -=LRWPE9-*('#,:ELQRNG7#!.53+/AHA-#,33.$  )0-('3>DD;- %*%  0CUhruiU6.DQSMD6-" !!     (4>KVbjngXB(0DPMC1 "9GNI>- $(-.+!  *9EX^fbYJ6'#+33-!$4<;1"yow"--+&!!1K_kqrqnhcYN<% $(+-16;=7- !(-(# !(1=H[j{|u\= 7K[`[K/1GRSI4!2<CC>2" '.-( (//)'-/*!&BU^]SD1!>Oafh_UE8( !/77667884*  &,0(.?NSUROLHB5" *BRZ[VK=+  '*% #(+,-/16:==;7-#  &*-+*$ +7;8- -;BE</+:CGGGHLNK?)     )2995) 3J^gcT7(9FKH<'&-233-$ '7=@9.  !$! *7AGE<.)BT`b_UL=2& %/489974.($'% $1>GKH=,!.59;>CGIC6  )./+& +7;1! *386+ "&,2795- &076.  9KVXSG6# '7CKMF:' #$!    0<CFFDB?:2$ $<MTOB/ "0760( (.,% (4984.*))*)%"%$  (263% &)(# '03412232/& *:BB;0'" $$!      &6DLLE5$'3=AB?7. (/31+ *0."   "'(&&8DIHA:0&"2;=6((.,&     #,11-%!+./,*('%")/.(          !',-+&                 "&%!                                                     hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Bell-Med.wav000066400000000000000000004123761366722712400225060ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data  PwE 2),\+a;3e $ 3* Hƒc?02#Mf2,٢ &C ֶ?z &G@7$jJJ9 z gv * p tiQ#8o < 4& ] " 8eBMP oyۺl"?&+ k5“OY*l4߰+L3YյKRPd>2of*l'\tj61[mԻ7$D.y 1p.T ?\$47S M F O X W' eS%9A< bH[ۭ}"8 3 {, !w/4PFIA3)+% nU:(R%ZU@hT h  hq  <PHVjy Gv ْs JbW# 0j%!(k  +zy&%Fc Ch*K uyq zc  x>i$ 3i#'Lz-j0Qe  DgU_ ?pVIi~| Ksh f{ { 1VL[_ ^&d Evaqmt'ޜq= `! ?,f*%  "QWD c?v\L ?Fm y c<q ~#  9\ /">Cvu?ie#%Y \3:g? 71S-yE8 *3o gXt ]n a@&%)IbB"\(1Fc#1  TooCIBO)4n  C  n\I u9U#r 9 , z $ d2   zV`@, sVX  s:~1 6\?Ak qPt < 7 ?aR C- } {n*+ 4^F~Toqe "QI z5+} R\(rrl."0Xn[mqs RZ:}G 1 r3D+H;[n5mD4Lj^qz * 5eP1 { . F ~ ]<pa" %u,}Q"*E   Fs, T}T}/wV  q [ : TU1 qFe<^u&QbV W7%KNcHq[w  "  m R4~sg UK' #7Fz#'"0g -  J p ;BOJLX^1# -$U5-@#e\_m-B0~T?B2[ g?|( V B$up`L  <n<V !}kgt. %|[ . U.~mu `JVUqA W O3@"t&`, O@N 3! 8po!z E9{0. ; \j )Y  1d ;(2 $=a%p (9VV~Z`Ozfa (!e"P n]a-y/!AAx Sb5xD ]Mz:#j )%.]C r M RgnsQ= BOYIvH``wR( Hku% S C A;^ xA-'& dT7j  $wO1:lX={'=ABg lnr 0 /{r(/sjON"M  Ql(Fs T[LN9 I?sZWN h HG9)q Q/3 >DMF2** U> q u *v +Z>M*} t %u0H % _4)m10H } |Lm  %Zq  6 TK* NY)z?OH \K}L56Z U ` +" * T.p 101"o}"U]/ 4oN %Jc* ]Pd$V+IBG[mu7 f H7 |' K `D&a[AKDG_vr R, x7a;/w( ieN+DU.+d$)NSfK U O1UU;+ Y0% _0B ec* CX z)u! cA G0 ,9??)T)e  q bb &?' D Gnq1C}&F=SD %  z&Z4P U & ^-=b ? k )Hv9f/OjSRdq,MDPNnm vjI7;I^4@]O1]% T]kN ^ k;Np}: (~%iZH"U OjS k~h3Jck !C p%aqjZ\K[* x!M R:U f 6 pQJH T k)/"Rkpo:Z|{Pj@NyRZ_o mW }z|!3mI>\cE [ &qx?5A6K^5@d?)P;`O.9&umr9W .R[ HR1A;oR" yh /x|BvaJ3 O|) o6fp30z>%jKpaIF ;-NTL#~zQ@?"'`j$:w'zox"JcZ*/6j *{u{dqG- rI`PrZXSa*YL-%AX!L{77un#i H04_ , ! B?yjljJ@n/gntja$i?HE`^E0q.|l N[xh}`jQ+?|| H{[QZj#`-bmo;3LJ{= }4f#Om)SQ^_(=-5Z C-ZAy|ugmjM*\P 9Tr %>"!vl (;oEjHy:aW N2f y[QrY8I;+phC9*^Su e:%7cf  7P0Qc|F>H=8*m6_xBB&|G my6~Np|Yv3A\(H(`<z 1S<hI>t3TLiqo:WjSlh?CaAY.~Z@,Qk>)a^1U: lfCxhf:\]/&a/|9H)h@%Fsn>}BQzgOV*I@7,>.2 ~I{(E!.V"M?3,E7kc3ssBRZT!%Cwd B3 GXz9W/&SzkN yJKQ  E=-2: Gz.``3zD r%"Hj9:_ +0q elS<+Mi'0O {pQ` QXED.p ZpA}46 p3;6S . V0LNJ T~(g'1)IIeTK+u}YQ/Ls6P A{ZL8J+,yK3nkw,ymPA[)1{;Qc}F8`}Qq"@OvVkTR_V(MG}hp7RQzZ6fJ{rAz9G4M9".\I4<[g~3fJ <8kb }tgM[QSKTv#^x%[UD",4bP S?q! h 2*9X])s?IFr&*.c\K:J qF`5o`)!{gBw]i}*r$S2> :E0Kk8evJrn{ZX` ,igZQtpRj^ta,xQuRqP;%c<!F1Y/`6'|@N m3<3>S'Al,\uo^%(`AgnUe^GHM3|4|}9t,dd<imT]jYl+#fqll,XPF%%tKz#Iy;/o R,7Y5{eHox_yy^,_)}{MiQhXBFIen #N^J-g#d~?>0nJ6XTi}kN? ~NS$1wX?DA~)Tz+GLwV[j~Z YS= +GH_4bORXPIe4OGb541s@) w3p)d@QWYuPP>t()dJL$v. ?t~oY5xt%[rNm%Hyh^a; p`MxsT:d>?7c/::JxjIZ6&vB;}vDPZkeh&@x1P;fu25@8bzXEWc?C""Gx 72PIa HL7^gb 4\8yC|Zj,}&]M;`l *('q/98zeRy d Mft\nPnt!*H^`#3s%\d. 9+W< 4VV>8K& j.\ND[m+>mK%tb.oCI4ip$I b3yjaP n_V{~dulPNhbo{6xG7mJm*\pa&mk"4a8<mFbEE:?FzPpr C ww5t-=r.YScQ s2q xk]vjpSPG,S+'cg|]h.;m {Z#t3Q;nR:sf|;MltN SBz1c>A3L3KY$ mMu#hv*zc{.aiU? }zTd,T/S58sOSLC (Oal AXO5&keyB&LoU@b?o=I@WAS,". K1#H7TDTx~`%&{dXR635k%F{LZf|Z8.UVhc;![rAt%fV;LVX no{+ _|Z%lIE_aV"V<$-|Y EJ]l=BqPD7Hs <rVkaz2c,p1b\Bx&tQJ6Kp5'F`gD_=y~{ K+gyBno6FkE*:Gz7 Q8r4zntCI<k%HvHt r,8deD1Ra(x5r/(j 88y4$NUvO$n[hUHtU@n_[SPzdkv RnmyL~8&kK{0yEzF/xy`7.gM`=*9YC\\B&kAy9<7);`0fe- V1(SY>$?t#6~sjw9\3g?ym x[@ Qh*k/~*,EdmZ|% #E97JDkzg[6?"^LTZ0 Q BoSXe\w! u~tPWiPF&Nx%2yh? h`>qTVWaV"ifHyK^?1Ge[2t:bgRy&`A9z)(`1.U$<VU/on(P AWZNw[ F4pw2%bG$u.]@o6j"!?L%_hYOSTDN o92X\>@;v9qG[[:o{ 34{dC aH.ApBDK?:x80q`b_)pI5HO({wyT~6huhril>w7W{I07tJnaQk_g o+]:IM33b0 vxk~5]h&o|'\3*f-MF0U:Lo,(L.)i]3OLVlsji*Rv=!?r ,xCF$x_|df]BnS,j&'%Qh_r|}"/\D<_sh|$ =_TYC(5a*>\ {H} W_C)  c WuP3LPm:EQ#mW}5SP';RH08qw`NM@^hFA`N.APKqEZ/c%Zhd :]~Yqr7S"du%A,n3U|Je\"Q: c];v!#"D!JPV`k ~SUG "G-9'ooZ:F#:36RJ+SUOKx.!Jxs(f<<}4o^ ZGyvUu_{(?r113]l1q#LDq($"t5R!P!!,u d Nv4k:z0L#c{>-.7io"cUBu7515O5+b!2E$'{u5qI{7u.h`TB4nfx'z vm)n\nUX gpDPf6Z)Z(*wx[&2eP3i@PoD) w\1CUrM(3f=+E +a3'nvn4NX`>bK bkFH +)>5`i=&kR^}-2h5t:{ Y<t=CD1lMWxc knSV#~ Z yg> *~Tp\);Fd$SLk|jw9v1>n1) v }/zfjZKkc27}^y2l :e*\HKA+k> )0 rJgEQ8?BiGbV9?Tp'\~ 7}NT7fn ^fAmV\G%{ Z=:V$z8gGoH)PhzUCv|~uLdv;: Y7E. +:kQ18e@{9U( Ora2O6Z9{{T:T=rj4}E9ulg*j&L?5t+;}IVFlL4} W{L` h~&xgfW<v@5 1Q$"q Ohm z0|k"mFElaRsIj4qr" ~:QMlU[6>dRu ~u5c^ \joU|-C.5q aTN5'>0'j[{L x6D31FeV] v0MfNK@sZ8nZqTH]8=Nz1|w&`}ul_( `WrO4$ Z0|cm;;)xD$k I1!{n.1ykDsDJIj~9*%gy6Eq-O}Z'wP8k ?w{ [-W51'x0\ifbl|Q*95 g &,Q<5OOU~,hig% '7 ~z[JbA.}J\wakhl '&#>{i$/o=UNf#~Nd,G<1Uk}K2s)flC,K0<;Q%alY9B:S%u+97X@xZA8Sj<>K+ wN(b&Qp+}dE'=bzOiqg>MRu|+<*S3a @H/{i7s_oMV7MapYN\w+ Hw4|J "dMCUQmz}73"qSvk1U~S},K< OE9*wt}Gx \>h[}P"<<+7p*r.d/h [3u,>DPng;}x4g#H,AFr.+X*9VD /.qV%:l6r7.It$@mg|=BaVm8o[9+M*&sR8,1Azc 3; ?'E:'z;cZicR9#U%WCx58j^:G0} NAvo3vNdRY^i,c  3)S{`^i>B Sd]ft(,#(k &)2mH/ z%h&QQBC\!ffpdnyN_q-*]F] | y?MP|4A/o>XGZYME_P#ru]<18mi23IF?*w[U&[8y!"e's{/V8D`b_)&xxz9LRam bfZtz {]^ug\.iM)%872(:ufw SfCAcE!;TU} \|7@]..viortkL+lV p~5J('uKV4t|joR4b2]zmO 3>RInzrS{{]aX<6-Gc}A;Do,aW`is]@Noy?%cdM.2zf"S*qz"@}M )uTzc_z H(>{!/v#U=m0oj) '`1Y^ ,ayn  \Rw! O@GBD!`<(& spi.91fxG&OtJ6*a )?Hc=-rwLG XbFFkVl.Ho9t?IkK]ye-E#gga~I 6<Zlzh7M^?]lr2k<Jj1]u),9R""=fZ $sr+xw).I #{+C9=KqPQ<<:M57,yeV@{|_;- O>*iRU OLv.''3Nt;RF7#awzvN0 "|"V!'U)\M:DwD<KCh:q|<+Uc h%<?ao=suoA,>5'cNfPCH4gTgA=!}Mc"LxHdes%N`aEUiwsH17VaUHOzS6P61-RPvlWZ{q @.bMm-70(=D3^S\[,R$ox].gk5,H%F hn|]\<*)+Y=!FawFD" 9BgJS1 2"O o}.c 8lUX )!5_vBC_95i j.Rqs0{Qj\+8TS57[bV's^nxy4J)rB"5 l_pS]DlGi {je-S0ol\j,L*O*sMeuMx"w4 EfxnURsd]6-re.C~9}*`r}f Uc~jI`#"Vs/S=QrDi}IW!$-$s}!QjE~Jc*'n|&ND\L4.QE>cT.?eq:XGal&yUV-]<'q8"`\k=:p,na>{gHmI+BY(#f\'ggC032^Pg!BguM&yTZ?x'Uh'a55)id,&^pSHMQ6=bcd*gtF>6{wuhvY<N{Bo w3bykV uDe[kmJDh| 12vF`v\VaU:gR''eik}k_o|`mX\6%R>+S5iB# *p\|>s5Eq#z~:Z<\mxMP5 "1J&+7 2o 8-RL-e-+:>Y><KnB0xlj}nhve ?<Z\lh"nY iSYzNyo2jz@ueA~ ZY-x(GS>J?l"KGi26F/bk$Lj5 CdxEc5CMe;]454=%J!0gvj.D}.t(5Q~E<^sYcG,~M=%Gy?j)/5[t7g`F`~o:vn'Do #6`.\IMxF m3c; 'H'eLN4'ViP$W \e]1}$@G$g^O`I1*Z[Nc7)@D'nif wi*$3#JgZThZ?=5yQ/E#T0Oh ?N{* lA' 6ETTF[ t7(Q9 FK uEAedC{$`=opRR7UjgG0{QAfc|I:R5N&z1. z]eg1wP}Y=B=BVz% C5V|kn)})Rt&+1\8p(h`-zpY0,qE1B}4n 'GYX=M/FGD ChQ$Fdl"61U9=tdS17UtX<*nU|i` HvlwIvL`cm}fvC9z'uVSF}f:, u@xhtb!}}e5,oU\OCUjxg.iTDXasRtlXl &B!j%3Sj s?jXc-'taOP k!NdDU*9B mtp\I)jMbJz-Kk6;]u,)O F#"td)(EK<,O=/<b/N@c1wsdi`so,<(6z/7.av,u!WT9cc=^]6(0HI)57YL@ +d?p}0E*9knS2^Cp;{H SAbH:(V@RxP4nX@K%?8`m _<'hM2pt=XUC{QMZCi"Tuu6;GxW|#h-#) `Gz}L}#% ewuuvK#3Y9K.equk eOS']hNX%N`?wxBa:OY'yKv"mxM->On{)H,PWQ&8v8<'3}X2&$FBQ7845i }=7%Uh[,w{pSe$v qu5U-(u8(8 C{\*oE#d5Wp6qp8x`@R`PR  JkuC$+kPr7#AVkoU.]u$? pD\+kl0Xs:~jl @>(3JSyQ0V&yg8KymNtC<0i`t(Nm}LKgW[[&BiH#=BcK\P {?XVo"q1sS =T{qW E MJKg4Ula7p2W$y`9JO1od ']qh<7 G]ygDYy0A1&_&w`74&}FBI(k- x_6XN*hlq?7o)G ,a^K 5%lL c *0X\C~i+Z>K$OhLLz bOaS3_n="J,! S3<*RyQBQ;` I} w/kQ fLKSxfD7m6j-[m8qAxu83(# DOqW'YRs!gezfKJf1Vss;4(?C]|h'z6Q\[2[]j(Z+>I^-Ubh1+we(2a;[6U3}?(;['#CpQ?ijSZ52x {`0,Odu}jm4WjQEiSeKD~:~4DQpd ~@5`}= 3~S c:\0si:n?5t<.<L2)e[ =oH.rba&+rB4X"TY3 d@yf>.t@yz'LQ)o%]/XiI.|m|rY$4v,4Xxn Ix!zFp>B^4 YP#u/J=Q"fUr;6D3-?USvgHiPsy@;J5C9^$djxMthkqrj'KWgj\ !\ I^W6jn>7^e$3:12hi*d% ^G[;wUr&: ">S&P1No5,:z~jT' hv^/>  /8msR{p7sIH*  }6oOLiuM ^6bndZOLFK]zOvZeQ:dph)pQ<?cm@A69P@Fxl&~t=78 ]9iP4plsT=7`kJ 6u T|^'c h7uEC7"[dK-0ACi'%Zs.+O@17RS=AU6AI]')C;^}%yZ^k4_"0jOi[&i/#-}k`'| :*?jP04*W^44&@D!ydF$*?8WP<1$)XL"Yw.nF7I,G60ZE+dTX)gR5,~SkqY<QKN4S.DClAIb eA* d*tG"S{ bIvy=x /5SzChdOK4k^ l>UI#BkXMwm,DjE3FOuiAkb^&eA|8@zdp6OLey$b[c|,2Z 4wo}"uTUm BKG70=G5=jNHO?=T9Mk[PT j<]IFN,!f|-zn;$C/j[d,F' =&qd-]4\:Ls?L kSlT82K$zR5@)m+ 0KNGR 8, 4lD$:..A[ Ca;Nz-L\Kh .=>Zc%bNq3^1p q"e%|x:TOe8OA5*f.# +Dg F,QYSU&X*[jx,SwmF"^ e7*`)jT4S<6JJ= Jz}th_:$  o )j &,;97OVW_.K|P{2l GVJ[9X:Vo*1+oS Ed$Q PA\5?h.b@:6;J:GL7{@qwbI#Tef7!~+IQ=}m{ l~i/1eX_v+RtTh@ Q5e JQGa: LFOXn|2~BsrhMYFc#t&w (SuZ (H-}h%+$,a5; cpj-o7K`g oOt' js, q0L3U=ONnQAl,o1Vlk\al,%R\_BL;\p{vKG  Qz(Sle)GLM)"4aIY 9j^6S#mm h_`F#:X6 k{,@1 vs}Jw: 1P-t4&~!qiojWLZb.,2YBZv:6eiy= [15VjnNk7W-@ITb7'd!;qD9OE1Ptt_Nq\s=(P"OLe:ge\lX6n4vi- N )a2s!,,@[ac*^k\O1 b`7Mna!NQH}b\^c`uX:( Rc[$.iVd,7f  p y+m0]M4-3_TQ D=m}xQs6Zhhxi/@Q O \*"-8IZqU'ly),#I8 s(=c q:=r<, t&SwIt<?eN H`M$QdSet-?FW h$'7@>mWB;emc3ndQM}W9N 8WM!7a d/iH.)FSF&Q6 8)RcFM1iAOZ/dy wUA3jF~LxpZ/2U yRHb`0pu;<-Qff cZ/+v7p'en 4]KPb]Y ^?Q~Wg9c4NYn#~xmH;m,c5fO @@DCzG6l;Hg 0:3o"vW)H|~mE>jH=T &rKx"mU k*p(5gm?G -lx Aa6ENkq"%,fP=X:.X (9NyR)"}? i5MG,"8$\)bg'/ dy jJiGp&"B &CvrTD/ }U wtxXA%MS!-K jI)Xp{o"Ef@/?zk!%Y0 vK0PxR.uzA&\,VOxDOML1t +hrV,tT7>}MX9Q,&]8-qxU;_ YA[@ uRJc$ W3b@YG?If^H="nx*l=Nt+-?3!k=YF,mOt((E+B41EIEOG% V^(&CSx <DoG6(k<BK`4{.WA08 3y79|-+aVRr}1$$AI.7VhXv#TU&!"bxX:5* $;FOR(W)HRS'cOrG7U{4?'% D{,H< !Cs)Xo9 ([Mvqw"<`|?\^zjm <UD ! -zW4ozt]5\wTfp@R$W3 Da1Hi+fe "/n?b&UR,OSFcpDVP4R|d ugg#rIk2-Y4HK:5e6?e>~a/`I@c .nwzX_tbpM[[&|T2=s-bM=n"1Ic4(aT A/%Za\='38j ^}eURfz (*X k{1`Okjji hvYNpq0oN]z9<SY.l!W_sa,6<"aC|Ts=5Bg4@)?+kt }y1P>uYVHY?-Q2;97 !rx0LX<b?`R=t?f:_hS)c  :+so<7.LT+}!pI/9A|W:8%9^ZT4X{$@#\2tVK#Sy=0w-R3cA1oqs/5s~m]sUNEKHqPa?@v]}2QB:}4I; 25 "3?o7K4kK,p#S*q:HH?!sk} `Zg [iTQ/)13vk(#{O>4~p*)[.w. 9aQ(;V+t)E\rT{~G rZ+;qwdYL9SQ:I(Z#I5R&pz- #H>w{<#Y=fq<o Nzt-puLftUpY]Y,Tt")^8z<JhI@h~+z822K*2po?Ii:Se#o-gN:t@S3OZ>ROEeH]1BKdc}Hz[09df`Xwn)"=8ThX]&ib6\f":bx'3t1J=wsYmU[U?{y&$'EQ5;CtT.3.TE\@y6cm)FMi9tV;jp>!b>A6b6 HX:i }x;0!H]\D*sVHcEp6i(v>Z6qIl{"Vfp`vIJmz1~j_3[V&[fPpMS.4u]#q(Xe0DczI{d_w+kw!uID8?|Md:r')S>tbK)9P+b&5ARJ{0H0lW HOiHE$;}Jno G*WJMdll~ ,*I]eqD4J!'8\< vm6ZJ `S3~tFj ZUG\qD(P @,4 ^I:$lsdrqYSP${yC "0IM\+:}TjD|MnnLeZYtZaX&^,.n.FaWR** #9H6#)A*GO viAdE.R&ts@ &Ei$niRp_TQ Hm$ :whEL `~RggjiAPt8<&e9l&3@9nnHw=*uY3@Vvj>k3ng50bZ[=#3NF'iq*J7Le=KKI(@ZJo-yKE'qf4Uplk>At$lP5 3I0Zva& :.ate'<DJ,2p=| h7jJ0 {]tJEz>?~J7&HDe'9bGAqG9 @MO)4?UPJh:#l&Cv(SH=39jt"6PNt BhY< %NCuX>&|i&'_*QkmgJl)G@ B!P E2 X)| *J:y25uVedd=*E-iw>2?%M0sSwQMK8\2z $.#R:.Q.C: Z'%zMvxX>5J~c p^Tgb1jiC!4Z76Q_)w6tE:mp8D*s5./BP!eZ <TP cQeJkk]o;Gj<-[--`(my  E?o k }IBy,:R[BbM.wGacvrV1t9_ SV 2qZo@d`aIc#}%pk.-sRqk4@ZC m{M%nB /t}5\5gdt* :fB'X0e/XWovJ5VucPX L8`xNckA.><iS2@=l'\gp ykl` "DuI:R\4L)p7TsO#-y { <,O|'yaNk7 eA$=fj3Y[/iW K+,w\ti zfFYAR:6> z,K4O% iNtX}}NH]>b}#}rL b-~>e;4]r0Na@O:]GkMa6Pkziav[nbI0.=.PLx?"Cse)9( >kJ,`3'+hn#HTo+4EFG \_y0>-buaboH)a88[c.C%{bszL <10"C 4rl9V`E% 7W%:s$HajFXn,OpXSwEJ* 9&S"1=%?{*?`J^%E@zU?"}l`Qlp|5)3HM),M*PCf?| :,T)e\)0XgR%CK'VPtuSHl ,mn$Z6"'g@bOK8`T0&_{ X` T@P*1]<]@EUilR",AA6"]n W -A!4+SzAFIe++SUl9a /JN(DtqS-3Hd uY@w\7n<7_0 WaoSu/9p"=^1.huA4_V=vkVZ^H)$DTe%spg'5.5[;Lp4SUrs]C*s\3=|=]HjZ<:]? 8g)%'xs5>duh#:Q zfW3K(H\ Oj}2+i aZ<E .otOwl*OfZo}Dx :bO~Y@H0RRRNe]jRf;IsB:+kS^X@<B$*^\}}fN, GeXJPI(+R1 >3YTy"QR9C0 Z%"'6;#`M/l{vsN{TMQJ2Rpxzn}<Vw!IRI>+P=s -Z&:a2j1s^^9J`+S9W@^oqmgNta'v-$ }#`{pukX7vUEhUW .=n2*]7 R {QDXt]4EXu;Z2kxEh-/Zl '<4Ao{x9"UJQ*>smWH~l<O-/Q^C2:f!QD|\\;{X"<_@71RP i!`zUEq`zV bs"sYq* !|`gSK\gD*'ko-AKenW}<6c&50j,7jLoam>w(^mq+Z?(9d~C7F*tdT^`ewg_:yU6>w8%,)3JtI@ AKGd_y 9eXmfoOn18' *-3!|Tl O4YWEHxP*d^ nF0WF3|fQc67tM]'2qx $Ai~Z 6 7kj0>}Va x>C|b vb~OwZ\OHnM2,$ps ! u4 ,+~FdL6*.V Tc=cX*Lbgbj`E#" "$Y@"\b.sQI\u3w9]5XlUbQQIo2GcU Kk 7a1C#xR?ss` a@adBM:@ =^FL1h\k@6! 1ft+7x)f\4}z:!Q..#qV~ @+i}p7h}<'%gPkBi"n+wlR7\y9 C\)2|dHY\.4e&etuWe2B!'-pP]EUl`b^A("7j)j/OG!S;B]dZ4&.MEwcW !=CBsiBt[S,N^'c}x@e^,a8C!,NX83@Ym8<% M)6|sEm8Z/tAwu!7[3\rl6BxC^XN%?!Z 3URW/O]=2"^\8qr(${R)a7d)KX/nF;,Uw"P{]U[L)C4**]ID!i>yqSHZ!\-e$IN 8|SaaM#/PxvJ ;WxmKm? X%7H<b?USd!9YDD!M14f$8Ow7l;[phh7J5v \N}Gjq7^ITc^cf F.n^f \uQPO^X>V e~7> # &-.MdJ>?g\{/.<GRCp.?4wJ29q-ha2Q`dVa4tJ,o8BGR1\U(hkH2M69og?U oGiaStOK 95d8m~GX{("r{bU^orM#!Di`*P?Jo ;01gl $nGQV0G;.gA$J;!p(H j{EM3"m|\{I|~O( -}qfD ZC &t >wNG(ezm5`YpWW "-d(\uiz#jfy9Y+Wieh^__797^rOrhRg\xD*Z+<j^Nx[ZPpWMJ#op-*OI_Z<m'+^5"=@(>Zo MyT @8hugbw .> )fn>x5F<%ga PC8dQ+&4>1|j)f]M;3ug1c{WMP hQlnWJ:623;dBg:O{mCp|8"IC suCg>(l \{iW.G UYl*BvYZgk{<J,?]!fM3_jE6'!!WLkD+FlR1:y<oWd f>LKi#cDcAF5~qYV^6pqC?`DTB8w~u% yZ|vYsC.Oi# VM}),,,7HR,`hD;k9o)cLa1l}]ikifjsszXy.Ofejv|M g{ &D#WB^Mp&OFN|!fa HYz*O*H\jhc==4M lCv{DZThJZo6=eUR D|9z{`: .q$r"EgUto =\jggap' v&{6j!BR1=,O).o)sMb4$2l@"T*a "@heCoue7 >tt#xkz8xTE#5PyHPs$2qx1IpSL{%NEvVaU+.*',CJXH7DG%n7q(iOlDr@-_T5EIH+7"0"hWh^t4oiV(!J9tp"W$5ZWKd[[.r-5~""kn9Y1Cw@'`(zG HQv\0-92* &AUXGaq [+d ]?t18,)Zty.Nwfp*5\#3 ?Ef5-d@- ;8S{l1^Pn!y^^1M4*/6gJ{]MZ_"RJ)E%5 YxG%ag,Y^.6)#1;;DJKOed%>G4 aV~,s|Hyh=Nd.JgoSMU~Nn,my4M"1 / +Xd {\h 0:< 5uiy'R&{!oYGGz[l*?!@ '> } 5 C@@:H-  gg)Kzmz|/Ht[|mF R< @|Y7/AH_[G2=@[\a8Ge+ v#$s\]}J,A $yt-A7O~`^0 X yZv1%^x, rc Bxq'"8G;YejJ (ket& pKGp 2N[#>6ikTyj"S 5W?T#+|R b&(M\EpG*Tep~xP1%:jFd"_%xjFLLW\R|i{x * r*^cN{Z&n86ryw)JO<I-ncI)D[[CO%^Z R*_9gV1X  =`.|7+9N+'Y]0##wg+ L[_l(w1''\vL_FS0PpdR@G9L$NemovdJ4Jor=pgP|WVi(Ml\kS:3rHH.RmrD%(e3~pe^6 -"G+@GWL"{WjlaU6d@l+ xVuVK|=2tt8Tq`b#MS0.^<Ci]-D{W18l"5tJ,(AJxT[28V>6L<?7x !r9 =rGHw~iJq)aa!aaEO"[FcN w*B^[#Og>b dh'o$NF)i<-FsHww9iOMhYX a  pL# =u[g<`YePwA6iGJLsd#TKuuo/}C.G9#\NDn9,dG+G*JQ';| CSL($-<G]}kV0Sg9^[G --  2 b3jj:x89oAs$uFAp+<;8mp DEy^%^]:%%'pfwnz(mu},"$F:^eD?%Y|eK1.05102Cm)|h?f`+JGp8!*k(!wUba~] ,RrC Kw^Y'*vhh&lg+z]c"I{Mh\O6<0f^H.|4q~;R p5AY2]m} 0WV ^9 ufB2ly=X \Z+&GpW|k01J,5mi:@YTC^Uq"CuY(i/[+pHq7c?9Zs1epL!)>l*OcMYeJkQ~xgI@[f1{RF ]i:j h #!gdCMa/E*tZ_p?$ B]`J-TeR5yS=$`_/ :#] UC"NXyqN' :|=2iR*7)t\l79a?h{=?'oE{c2Z,+WT IsK@P|:m@Y`TH)sl2!3u^' -m!1[^R.%-^=rUVW$9M[djlnVR@99`tibA=9cu _%}L=a*bwhJASiub,5.3`gkGWV2wUC5`f~6Gc9.hG" "Y0W3|JN,I`huyi`uA)YeWB8=GF^triastMz\F"1Iwj*JX Yvap[XlJ`$$KCo2IWpmzJ":@je;H]~k.[*'n*l3AT=iK~yH $fH !kHI7wnadVJ-pLpfW4:o6q-^ysM bCO{>n~z(UF2a}2*4U{08gqG B+ReX->F7&(Y \?0}j[A 3s}6zNN{0@ FZ=alZ&~ 0F;cOZQ4 IddBZ/j,[#+Kkpc5_*q=e*ZV>K/ $["'^;(SpkG#HScQ( (X,Rvt7F0!ZBr{>eE@g0VIuoDw`1"3Im  3~6+bFJYDj ^m*.c9"f258l4=%Hvk< v|.yk~;.wWYKf=criLaDD`^AjW&{A6W%*hRe0 J~e6p) 8kwU<8Z}TZi! %A<#`.M#1Tl3a8}J@FlL4{T!&pgMv<kinD `FouY31?)~s-Rq~|R{"G`00JXJ, O=`puncL<+I { O3B(|DzppU6$e[D2Z <&[] +D>)2ifA&&0DIPffF61,xNVSxt`;%(T {U>Hq 7(c?? 13+qJ-q,GAsHq= )<3! ~5xe@&4{GT9'RnZH0*G[obAuE-PF:3lXvCqi8 O`=jV)E"&6N% >pz?;vVz\g l>)}An# :d|d[\!oLbDU$85#rl n1 8{!bZ go3wW)4;RwV i|N xSbc}GtOCTYz|pVD\? Z?41 mT7?Fi3\|f*_47]{2uqPGVPbZxZc*XlV?k1nXt8(ikJZV"VD&>d ._k6f;2(&t_n}9H6zN# }c`[o{  tz'<:t0M,57I5NhHj9O:a#`c:bZ ,ZV T@YpTSvQ~-/j x9o'$1oG> L>f>:`H\cgYBegW?#"Nol@~@[>e}wK|N2)* 2h|2,2wbjC\cDnk@O;SH`Hg;|q]7?TA *:E0 4KKy(\ "k"0p`xnDnf2-`}\.I}E6j@ Kqa 3se*TExp/ }T~95XsxaRHJZS.VHf:Jn^y+LA &jnwZb;Au5JFM<;EA(wRHXKcB2)st$c}xP4,K5K8*jbx]}S+ ?<ZT4og'd5 ?9 TTj'A=##:BPKG851;Qix`0#0W^x`m;|8B0J!I{pW1F}b&;|Ky}LQGzq  _I\)cW3+Zf4v0#yU5>|!;svqu^0Y$:|He86Fj1obSQdyyX}*+G:UGW[MGV|i$^0TF )4qZ5RwtR="AL6 Ka{"0-& @v\%o.hgk*`0m;Wt~L-Y]H')CMN?@FRTMG@A)oh\"IIrV)bOn]O@&&J*t }+ Qbpf %@jmO3 6ri(;WbT< "Mou<'~!0g)6 NRK+Bp5#k};A)cN$"$x1GFst>-cc}J-h~[q!N-5 l+F#tp^-wUm],y~^uSmFTS(-p/=l'[ug$Drh^n=?@z?ZZQR+b5lh3_]\ `%o0]&dy|psyxzL#rNiB J2P=gprcX]q"A'=[qOe;K 0 %n?I8g7C}Y#4vPh+?c~YRn SpG?h\pS7tT+>XN+O\4Kenv2Kp6| ]t'a )Kw c 'yRq1Cy1%vG$+TImt|IZ$h7A}:[P0-_ $DTM! K6`8s_d"D,-- af4 %<='f, 1n|_j-yv0b34n0V3*S,MJ tK4R@[loZqJ(ss@pTLa :ZX} <]Y=1h}GeFEsFrd(ZJZQt@.4!FZnZ= Z4 %zL"1Nj28tq|xBbDo| $5d~cAUMU(7H3Tu2Q hkm1f JO@gC) gpxSO`8F.*C},i;b0oVFt%X = 5og-u$`  J9c;8d*Q)^2cm }e}(iK3GwCRQE=7-vlgjq!pwUZR]-JkpT,2Y{5N5* } >9+mS=h%.v xZ6R6v5gX L30Khg;} OrhK'<0!-r 9<#o$asE^nG5v- ^$vj9 AIl*2XdV@,IJ<i?5:Tk&3?8)$7Wl\}?WSqu![!6lp38nn=*AM7X.9+77+arO2X^J1!!!I1Cu.SU=D!>+xIFwN[Y;$ .oYw2lO x.@8}os,9E:$Nt0yA  c#ab+nhd#w| #"WuaTn zRNnm7"JpeD-8QfvuvhN1 Q|hG0 OIDP.9 'z7"fKX<G_bV &t~7D4c36k>As/Q2}Z'!1:964*;MJ:o_"[{ 3CZ"!97KhW}1!^WM~mcI=PPCJ?30OPWa?=3##+"VphQ- %S#tXhqgkXx>& 69cZaoM{xWqFk'M2Txtg`Cku%hM  +CX^N3k*%w.tUOqBxu2LwCiA"$L;T6[_ I>wgiR[=;CYp;2'"7<( &(7-4! Sh:@s?JCiKH yz_V|`Yp=|~FD2_O*t) [6aoqeds]:Q :G\^aYZSTf[%S1n{L.(F3 |`@ +l}E dPS>q1V0hsA$0O^bS68TbA7)Coc?% 0SmnT,.GiV+ \nGvn8z)2`xf2Y /FR4&QBc 9!W3FH,.bw1sH&b !JeSa-%sxH?{c %iOl D?iP `% 6`bgCjM!I")o<jEE}0@IM#&mI7IXw|u5Z{((Twi}) k3a9"R j~fX@,['A+J#&:o9S-{zM>X e?5$Q0,h[8P`;>M06AY=4%ux#v8J}@J,Qhr&_ UQ?Y@0nCOV!h0tv8Y^|qZ;!\f?+)238.!N)p'}c!v=7>#YrU"~9<F-z =b)>'qK7 9YsT>AEE)tYK@Qs"M\IX$'Afy5xU ) csB#"QltD8Ac GtqwS *o-LjspV:~kds&zT509HRM9 zJ^O Fqy!i+3mqk| ri;Ktllw`Amvs# US$TTYe+F $j2zooobPIe* R{p7[Gy%^i@v_Pex?NY?GU{4oyFBQa'''^i9U2,33e?>Tn 6lehL@Wfwxs\F,$:e*rfqkf=(2\Ua.,w Nf@OVs V<l kO]Z]Nu`eVy"Yb7l@#5f&XL '935_d4v* ~Q;xaO>;@\2L}Hnkw~Iy>m%EeqA'uU.Uik^E !EUS&y_gzmO e AVG H 'l=}uW0.qh2xYT[{LOL0Cem[Zo%.-&  %D?&)TkjL4i Snd8Nq~f'b`Wu+7G %E~ Iz^+ X3b]. #521*( )Onm?9OO:1*!Ypl@H=mA #8C1XV6h74kE$WKh(V{OU"!?aWEW,!iO93CO&HK?I9U!-L"kLt.M9]) Hq" 8d<zkTFJHB2 cjXOG9 DzeH=9NliB ,^vvU3a=/.HfGchN}A0@n^ lO[ ej= bDMH(#>MJB8!lz2jD.T^M)$)#$D^dW4 G >zfG#RtyJ];=],wgOMd {ApXlb!(`s> '2JVg^De3 .A\beo} +?:'FaNb]E*!'6HizxS|v2ba1 1l E^]KEc5Y,8He7Tb]C#"geMEZvm<9IHIBH[X&8<1hf0h?)7^-Kgsl7T.2O(LKF"Rm}fi",%$R]L!Rzb0-fwlO,u_[h>m}n7[APg~~|qu ]m(HA 6D(o<arY)i[x6^eKz@4W-A S,?mu?=KG(yu`+~+GZ[ONUo}oI|D# %X &. ~:TQzS;,>PvQvz8Uc v;iti1XCN'ThY@g"@c#9EMOhvlApJDX}3O aulpmf_Zi5[y5@cTjy4727\z}c3 ,8FHVgd"P5?aqG'4bDHG+Y<>]p}}YfWAEMq=eb)R*cIa2 M|iR5 +FTYTH:*u? 5zTe Y>ss 1R"a$"(?kfi^O[#Rf]?) g90Gs+RwcR<;475.%'RF\C#}0'6;/F w?'vsZJ2' gf&2?@Zh~yu^UI6z  VxI)rV#$Pq8W ^smhsg[G4 ,(w tZ80gHh"KPA hxo|~"O#pzO-FHB#`NMf+UnpjmuXG1u7c j.uvJMiJ0 !.9_M s',G^lkg[brk,9[ye? cC.AhLol[=e: +3735Nu)=H#[" [;2?dl>/n6hNGO[k@p9"",C8' sUQq5KBhwubPHCNYkmR,M]6nE9Pki#f\  sfgifZ?g~GUc"(DIJFkBX+2 vAejXK9?@T^a`MSIK- 3?NOG9-.C[vvY!o[SVbs(45;?JL^YL?|`9G62=cg j2 +DaIox{s q "7Uln[<)QFW ,:<)v`m "CycgJSu)Y)`sGxz|)]i `9Vafj|0^xZ<]4:]9S^fZ=# ?blTC4DSsR(.Q* *a Wy@s"/p2UU *d;(#2^IV$ ?`N3wYgjMTgwyz 5KVO8+DO$-"t&^toZDAT|O)ODEx/:qzE!e$l~[* BbldF$4271.)BVfqwkK% 3\gkgT;2`|qRv/5 X73i]RI@&G{RP*[Z'k"Z'`^2z{|D.1MkB #\ =bxpKQ"D2@35%5HTXJ'k: #L  `,([ ;Y~wdc{s@ EnY3ULf&H#jn|vu~|0gx]6 paYv7neE+?nn5""gKV%0w7 @o~2Xqt]6x0?--)P}^opTU =lvB$LmmV'tmpvtpzu{9InhpEsuO ")>A<#=z!Z59aveFJ:{q8}H`OphA~p.oq:CVK; .FczrXG<ETozDJ&~2('H\dN4kXWm)z H ?HGMXtvEtj*|unw"jn$<XXD!=lb7]z'I&.Dt`T) M&xGP?^ fgQe*B@>2( 7jxF.is8%&Cr]fSZwHrh>qhuuuP&`j4[hhea_cl&e ?G.v+.cuqK`V{)DH2>s!")# DssC   zKzf/|i;}danDpsC/)C91)UFzoCEo^QI>$ {ee+%Op~+yic8:!jPFPd9nb@"fVl{rbek6E'VH^a[RGMY +$mia@A&4;.shcdiyfm"dV H/(}EW"8>HVf)YJV:15>IggS'Y0W)Vc<) }:7(HF$ '1)D}x2v{#0"{E ?t.f}bWYP3pZp5]t]2 ] =F6iDHz+]Dn <O,q{ ,vgSMWh}kD53No $9SwWyx - zH#64)(;m| b&tsq!%N SYDg7-zpo{kcpX~g1$237-Cj|jI CeiJgSX}Bth: v",ed9J#$iR#@*nF65AJO?$vbo9s)(MD|Q9Qg#84% '"V&M$&5e`,ioVUj|,a h(TSFw7A+~u3gsb9+^n;_:'$FA}X1%;ijbp)wLi`m{9.&Iv!EK:&(,;Z6!;IZO%ujml.sdI6A^VVC`" II%ys2CHB:&vqu3g{}ifjv}kI) (XYs]SdUx8 X;=cl}A +@K$>v|G LlGZ]B):>+c6'/Ffy|w"%-:J`rmU<$JQb\^l\[7G EG((k`zEcGXvjLAa +$wv4zS,JTG'?`1(@`wGN# D) uhX.+m <E+GaZ"/s ZuoZ>0W{W:210#*Bv\%4W|mA|FYg[C|x{ DjwtB ==KBt}b>$sCm_v~_Zj~ Wg--?M;3)7COD9#$,J]cH,>YlqbVPINII8 Xmmno-3~O`U,XU!GhxlK1FV[WJ)DaU?W{5!8A7l:(?jaD74Ab>oBSszW0"Mka,}ljWwzc:$8SqwxgR1 0KOC#w>!&P  gRY$la2 Gqg%;LTXX\bie\D+5vcJ12) yu $RxtX"D{.<eti@5R*DAk`]~IdVJHU\n}7cxtdQ9)BXO6 +Ml{ymC Cez|hH'<^k]23wQo_Ed P#.d*=#R&#U,/(e# 0RcU.hm'Pyf6ss7\bS>& >t2L+g% X$)b*|gacn*qT-"DdS,|'`uoR!-\vJ=Zfhggmx~{kbC1 i=# 3TFow^9b]vvZ1 2FTQ1[OZ8Te]Q9#  &+776#9TflbPA7("1K\V-Q$!1Tly~} 6bm;,ai:]>9Iv6JPRHDM]|q<s`tK[[H.Iua$aA*+2Qw'?R[cXM5V$}? ?pB}fgnV|kaG_sntx?JCquU5&$PiO)4XnpfK'^. %G$^vh3t@ -[!^uIiN( IJpA  >ld@ X7*5Of3d~\!pcpj]~ UpQ d) 4zEPOGM\}q*!DWxJ`@]{Fe|[:_4 :[9[z?zchVfP788LUa[N2 8Tnj[<3jOAHnB|<~zD2F8 <X2%1W0QwH"n^i<wpS0#5+@vi:VdN='+8[q7 # 1ausM1l!?[^W[{v\$}pd^]TXl75RO:i&!25vP2"H A^HsrO: eKADHRZp ,*2:RWd[YLC1Dpym^H:|]mRk|jU>+ 6v~W L{~}z6< 0U~1fkV6lRQb#YV& )@@),k{M(57.3h! r  9Q I  p%U,'1a*i0CDa< v~;OqiA ghazh.nNKe0uj)'56B5$ L@=p(];GiL*EUry}j<tH5:[:Zfkm,,nsOQ;?1M,B1}L9U FRA!GJQs|paS^tt<yv(OtzA {h_F:->]FMwb.1n0:oD0%@hAh0 GrxI z},<OPTebs`WFIRelW1=\sxwnnlx~tV.W(0u%F^aS, \4 *X*j~wT3'-HgwuW)w}n }{~nP#6EJ5'&5C,o0 Hxv]fu(9;:'~&1COvKL$"qYT<!ux  I$ #,<^   #)+%)&9QVM( %Mk+FH]xb7&$"R'-Qn7k~R#  0>+ 0N`\At{*4GNVS[`omo`M-<\rlIeYc"]+.d%;]:}H(6e9lq[IEPanhU9Js~Y8" `9/*G^ mA)$;YbPg'N[< aK#J~m-,U-4t}2d~[4jL9'*6S^oz &BPbi|~y[4 (5Ffy}cB .XkgN0EK.xQHd=hpHh2~M(19hsP% 0]~SL R`f0(D<{=fscM7<W@ 0=@B8 BeiQ 3RZR=|knzDu@<]mcOC?RmdzUJYo  'QbeU56JG<*kV=]jd]WW\QI7$ )8-+F`W,k/T&06@QdqkY,vbcz+Ui~tS, 8OW>CWV; ;UcZ:! !IgubAz# qq~;Uc`L3 Abu> $6D0j<(@jBmoO1%?RTD;Vy~lU<& cMRi +C3IP1FK(;RK?,(0;KZbQ75LH6DpQz[1vRA 2j4D=$ *FzS7gurV6")* -660c\iO]n P](Fv{SfOMfkU^ Mzi: 0=0=IB':TN<5@2{G%4& P\2j=)1b.5FK\gr~f'i!o3A:0'*=Ta`@yUCOg 3]lnVD20;JlIW\2Pio]<oUGSx=sfN:'ofv (37)'2Fnk'W:<\1Yx0u  -Qn~ypaG'vih~}xjox7V`R:  *-5(EXbYH- '4EE3u!'$%0JkQ:Sis~~a2thd\@-"Q1}fF55@?*dv7]pi\QS]o|vqQ3 :Vnmojf\Q@'G[cW?oZEE=FOf9NbmuyxqhG43J]o|KdVbt&Uw]6 {>`~]=zOI\=D$ DH9 #7[n1 !# <beE7% mM;6@Obf|QkD),?};X[UA3&)):0( xTMeZ~khj~pA 2VZI! !$iA$0_7mj^MZ`f\>{fcwK~cF.4N`d:E:V:k]c=WkfLW5(?lmH;du'p|jH]Hura,Xy@9ll^MXgi0vM71?Kj{ %?GSB3|cL-3mR\>*& #xeo@i7lmH ik@vc: %Fj}qM ^^ih9YYK.hC(0It3Y~aL* |Zg2fzlc]VUUYUG$Ob uiSFOnp)Q8Q`iH6% `1-d15@@>@0\=EuDlsb9 *20 zex=rc2 QW N{T0&Pur4>-e,V[&]4 >m7WtzfS30avJ/ .3' v7tX%5,bRV}+[v}nT) \T$ ,pd^U_jyxnkat=freAqq{!% G{j/0VtwrR8Gji)iv/eVwvB#"A{VroM! )G^`B _ W27'$ *&# @l|rT; :D9 >rg[`7KD& 2K^N,}T]tmex KRG)#BT{O!0<91-$4H{{8z,1'NVDzm$"'5CVWYF) 1TlvugS<*! ()$ *43rR@=Rv%38F>4 7:D877:DS^mh_O@5' 6UbYD#1'fo9Z^N%)')tZRUmBSZQLMWi{hD?ouM+  ?sn:2B7#SY~Bdtp`D(4RUG, BwAHClpxEA<8GA.,," vha\ht !,/40%!%=[wpZ-#=N_VM26UmfO%*cc)nrEII~U4uYx~";7---2DOIE7-!% %,7?JU[]aba`O7y%]h6!=Q: Q>Nt*\umU' 5]mb@ UABd%(:47/% 0No{rZ1)Rm{eD5xezu >]gV4GI &8JV[WB'nZ\`mx%QtdA  <m_.;JTD+  ;Uuh!{ido1bQ0Spwa>sruy5N`_fWXNI4"IlhG-/3! %,1&Bnwre^K6yYKPpGe}~h]9#rR6%)?f)idC#(YD (60!G^lneN:" zbQR^r"$|O. =y_zpjl`X=&xwX2 jMFMg Lv|]>'lK-#"6V uURZ~0ed50DK=% Dmn[ZWcbfM'`0-Q".9;?RYqpqR*l^WVbt2Wb'P1)Dd<j\-| *Wxf8 %Pkm]: 5N_VBqirEwk#eRCORdlog]`vIX&N',5y[K8@Lo>Q\UM:!qlm*3;>BHEH:$ 7rX&<I/muMi&N L3bvmT/sO2 ,Z9oL2$ 5Uyg1 $`j0 n=$$Cr2:0 s? 0i)Pm~|dE' G~pO(_FAdGbPFGID8gjx%/,% uwoqou(=DGB::@Wk{w_: & 4QqoO' +RtlZ@'d]h{ %6KaiW*L$$Jy %/Ltk!& ,MnmJ)930$ !TwsJ Z0>1k- .wk xdreO@Sm$XytT'/;588=GC:"  #AagN:)+)6:?:( (T}}_AmKBOt8g{qR. -3!M+%6c!PieP1 $064$ m^m1VmurpkjebYP?3#  &B\nnbL*(-. 5UaN%pC8Aa!& $$3GdzpHpy '20(!$6RuY{|*/-*&",6O_aO)x'(!$+2+&(@\x|j?&9l~](N`%StlD -Jr}\6 5=C2&.3*xb_m'597)Af|gJ=,(% =ex}hF 7LQNG26EA1 0GZ^\N<, ",5<5$ $5BJC<00-63*^MWv  +33)llx2JG@0$ !-=MYZP::MUF1 ! %DVSG* -@Tad^G%## >_|x^5}v!1 !EUR5oe{ .=.''( $0)+6<3(  +CMRE6!()!0[g[5~*Wi^; :hdI.  %''"  .??<'    6S\[G/)CLI8,`pmH&@LG- -ZaA ,44  :YjsgS,=MNC1 '1+" Jgq]0 +R_gV=( '?BC6" &/% ,>@G:' 6QYO87U`\O7 ,<B71OafcVG2 "4A;* 7;*%<U^d]WG>,!"&3BPWXPD9/*&' &,'yu~  & 4RgjV=8QVN/ #!%#'*28>B:+ !+MdhY?%7N`lmV9 &*#%8LRE%# " .0*+.AQcii\C, "-54' %0.)"&# +4(1?F@8)'+:LX^S> !'.=GHF-#JirmZD2( ,<GP[`nrtfR3&,8885747452512/' {nx &,) +IbqrgXK@2  )<LQE$077+.<?5'  ),)*#$! #-7>@9, !?\pufR50Uksi]G8(-@JI:'096&   +.! >Unu|ytm\C( ";P_ppn^P;* "4>>:.! (9BCDGJXfrzqdF* 9LWVG+ 'BRTLA5*8MTP@*(:P`tkX=*  ):MGC, *;?@52')(-,"'>QclsssqfP2 2GWUH1 /@U]_W<1?GC=/&,ARZYSKEFKMMD4!5=@3 !>OVRG3>_zoQ6 !9Odwt`J5 5BB8*  '4DTftzufQ9',?GKGHED@1+:CE=3" 0572% #.5>?A8-!,,.)&  .=HOPH<+ +10-'#!'6GYfqpiZG5"    ")588-! $2:@EKXbnssmaP6(1/$02) %*&'#(%)&" #/<<?66./**&  "" 2DJL:+$=SYVH8# )6880$    ",(+.133)  +173.$&&  %0<CGC:0    $+*$  %4:=5)%4<:8306=HRRJ9  &0::7-&8FIJ<4! +1,         ),2,(   )(&#%*4;=8((/1*    $4?EKNQMF=1,! %-+$      "*.432.'%%*,1*$  %%$  &(% ! !*20+   #043,  %5DJI=."-.,("!!#%%!    (4ALTTQE8+  #./*  #    (:GNNG@80-*,.))     #2<@DDINSVTL=, "  '9J^hg]F/ %5BD;- &,&  $%" " %-472-"  %/31'$3<B?;2-*'% !!"'-32, +5:;::<ACB;,  "*/32/'   ")066963,"     #" %%!&+/6<AC?6(      ->MNH8$!*)" '))"       #%(&   ,8=>950-+)#    #.6870'   *288/"  ! -24*  ""  !.351((2984&   $%&'))*(" &-,%   "'&#    %'"  #+,+$ &'%     +5:6-  !#%                 "%"                                                              hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Bell-Soft.wav000066400000000000000000004123021366722712400227010ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataQ'R,+H3E&J.)  z8e_ԓ!Kkdx݁^O AAڿ$"791P D4l,Y QWB3c&r)+lI3).+  >t5G9m nB@4]}1Vt-&IlKzTeeFQM& t]- "];'N"/0"2s0iNP43A eM "@1K$X`޺ I7b#;9,^ XhS#'$Pd- ,-QW y7c# 5ܾO-_1(=2a IQ97Q#$zغ:y;;;  ~ |Qv W O n{/ Q8kI{ x2 = f'k.we0ALB/ +*Cl'چ:M$,7q{3i!)#d }oAN iHo @H @@igXx W$ [[Juwak!&I 2s!| !tF 2[p+  f0z  UwsK|1 f'ܕ!4y T+ ى؋&d"rJ!H5 i$c l> [c XUqq\1 G gv n 7, "z >Eo . q D&BEo[ N]c) <vv9 W8 C (@k ((bm'YK=BBgA uoV+lP '&$ 6 m7 0 mROZX\  33Y*-<ej[3 p [Q$X{G UVk!u| \82  7hY} w0I^= < rZ M\[ + s`l7 b!X( yHvj _ xPe@= K ]~ & 2 j9X n#GHSOrY" !=<7Y 6%MK] 6]l 57  {  h_( r od&i$Q|hJ $?r >mS ޤڶ.p qO so( rh5pn  pE z f=\r-% ?  28 3@ es Ejj  bw&Dj' % M 5' :Gr VzYf*M'&wGIc&<0egEqP 6pt % 33 \ s C[b<I A >_$6<\ K \*] X6%0)u2 .#i.r% vV7M )+u .yj^ 9 @ . > & PAT Nu[ 6@ f+o ~c5d> i C8s6/@2>s  3AO k)$v njP  gkr@54R5 OL>   S2Trs a?`^ # q 2`*KkgXf 1W |Jl \  "0Xlm"UT%H{P.  <J5 = ,gY P _a*C h <9z=?.v?z: N + { cx d~h {-V! NWIcIn U+R Fu G3HkqiExQb ~  NK  [*D5G/iB k 9 h^U^Qm v\A*U'- 8 i]-E`&h-j!$R@O31t# ` uN|c' d0 q  {913$0O)LS,/^., ~ Z/x 0'-~60 |Eh:K[@m" rft G+;RV ! i 5 b 7' @u/ecQ vZtKU{!5 z@ nphseER$/ +g]0t ^ [a \Zo:H7r": R>j[z.,\d!H Xp,Iaj>P;PXHgLkRsn fGmOeM8'2(g+j8z(l:ymuxrx l5|~y4d4BUXxpwQ'D iFR<}f3=*B= VIL8I3Q2rMR ?)['^; sP Ua]OLpm9_^a:0jL4>56{V- 3 O :B3Z9CAOcjdAw7m%$DKkO49 =Sf:s{5KKK{g7x"WjKUx&< Gg$3cd3Ax3$fK?X,2 Y 7TC 'p09pFCIg5pz)$M6frc 6@ d  jKs?;|~pd:(.QxjA/W<Xi]!*Qx$8Vmc63NMA2$:x'? Ia~N\`Y p[1LCE jbQ2P*JNZJX:iWM]xle.J9 dxx& Co`B1 :'2@D1]?TaZZ%_.K<7ngb=??j|(+18<Zl$a 9YQ{Ll]5'A /;2~^AN!E4xZfR**4$|u\o*bi\,{{Kk ro=c&mCalRCuKS6. %?9DWurjOy3$*)i N\x;6 krBNd{ ^-KWWdd[w"p\ K)^Hl_drr|$U6n-_-1l9z&!cXCi Q7~323 %/eEN -3WN0H9'vH%G<M1t2'! EwL1B-Py;O$$KG13$BmP'5BHHtXrNz[3u=B0 z/6,}6#E^VcD cB)B' C|B]-M)Y#&'C:uq4<XBK0?c*1*up.g 'EE{T$y6~->f- MZ1+Jmala9:\x+4^I=> JA#{ F,m4U-uZ!-aHEjL^T.`i*)f'kW z=^ry-;ve]RW.?M-H5'BM\vOxpW?:;-DcWgi@I97_x2jJG%v|0,7HrvCMwBH1J.6y  \"urWK/)aVQ8NZFo8U?[sK%9OeBIOmN{:H]gB*m x".W0 Kpmf hHdTt7 'S%<NJF?$'*Hqg$  i0A6y>!Gk0vsQl*(Iz95&! { x!85|W"ia`Dfcr2QyboRimM$!l"KK d9@$.< k4y*}"kEH{HdRPcI]=.>Q 9B{ ,8?H`IK[jOH *@GZ' ApX [#iqX\1Dyfp&!cKW%  #B=KO D~2Eaa:bk9wNU/!,qb^70 QKFM8fdMfoVs0$^g%`.9O JNN0$AyyE~jMvNfqBs^-hH?EvJiH{~g{ {u( BsZ1LKBa[51RKi]v4tU8%ajT  b0avuT;mT{Nd7c3>z5'Ri+AgO_";M;K e)#xu#70nh~@?-s1l9 E`i^SMQ/CR9'h.~;H7*}8[:#,_]y1%$?`o!Q_`sl 0}b&i:*TH!pqozW:xL! 2ZwN<J0E=X~Z@-^-'9y6sph?yGF9X|-3g'EHF'HQ2{K^{D a;  .nR,-|3?|Bb8c{`Zvy'x99 =;-Up*0d$o/&b[+x{TjLtz' TKR]c<&/TDoi  z>av<9's}WA;R l^#E[kXqMWlj?VLu]6w0~Tn,Qs\m'&yvRK5r3x v*{"r<; =8~ZkQ$.n9KTHyjQ7'k!- G{g 4L[$L*KErD@q6KHcXqc(*#$jaN]3i,j$0W9]1O* Z  zZmNSv!{R03d@FIc* ;+)|K72MkRrfed~5!'u#>bXG  "2A*1cZ-u -X=>DqS  mWX7j%?'<'8H6{fH*vMv0(Gp{"Bu~Kp^$r rx'U YyOFqc-BkBje{!,sFDMbwc#,r=S^RUik|>J63s1FGexKWuBHrqI7jL(bT`V03VT.vr9.=9fi,UK3U Y`4.],9f&RU<+VBR/5+f^Q*^lQ 7-zEdfA'-BCNmKF[- dKKw0E3y+#K2lv:VfMu\k>Nw?ELB{|!B.ze6_v*+n!yO7$0zs/*.5J*PK9XE+gf|v'*=bEZz< eG3$BiHFZFp{^vj( [I:$f&dIKcWdE8d\DP0Gg|LU])ZB _ Egmf.N0f:TXE Bh~ Cm3E3h`,*z+ZvU'F|KA_XuQP0R'oZG_jEK|fHeHJ<%de~UX]l_E^z# _CK@v6cRYXJx&O9' fp~D[5CEUfKE *gw&0su QQXv+9Ec,e1@gxyi^I'< ]Su1Ta0F~7\|.R3<] fan.CWIO!n0i:'N7_A:yE,Lc<l6fpt9 a<:0Q-}l.?p@<KE (yf4 `J|p$o?673C?^3=fYO-frDjb5LB1p*Ha7vOBc]*o BLWEgv m-ci9p6)Z ?Z@6RO&3p5 5h9CBZZF1<9*38i7{A{?)OZ5AQm:L{< '0<_Q MdT'(Q"lho)4i1 y-1=EbR PH>pL%IHcao ]J-({`N-}&f0*z J-5x nH_-TT j3 B u7k%ZlB3-gXf0j)e]Ez r#3U7R]N\KuZKpb ^O^ Nw$1#49gGH?v9'gV9@$QU&[4]n'+R)\.aKYHV uNlZB V1=pRsc y&I:c -:zCH?<]W:{z<E1f9(N+*$S~v?CvNlnO$F(6M!'` gdjyZdM7gd0Wa~jA*kT~Ed^I '>p}(LF7W3]/~gfN10a0\!gT]~v $`1<6uf^$L"O?7/ 9/!0m'd ^r7Wi7`?U$|[ mlR U h%/Uv%% _ohb8JuC9)TWQs Egfkm?HHHjLm&'Q0dzEwu"Fa'hm}]{"xd%F9Hj< h^j,hK@oP!aF&XoyG4m$YypUO DfErcc2 pvc2kzQIxVzT^7m[r*O1X!1DEB3VLlFT<96'gj=sTy!|^6n *W_/E*X<vB(E&J $@6,5({]X`2A*z2gp+*h3Uc cy~^lx+Z6z1J0%! p|e}KZ@R3 <:L~2o %1MP(GUl0Q] w i~5Wbo01oB cU>Z^ _z!v[PU3saVy]oE3c*sjL3?fTXhg$V0p}y0TQEk0\TxfgFc|aQ+gN g""[R l%FW@ BLmN6Jvi}B_n=-!olcj/cxeHC oYR{+)-K+ p6Hk0Xdh{#hZOyj^&<jYi7[w z(~*G\O%=DHi50 f'R+o~~- ux 3j:Rd4Ke6as EX F1V6je0ic96vcTE-'R!??+2aa!!sxrLbNT~I:FJlLdiT$F {Y9FFx$\\xxDtK 2:XukKi ZE*mZ7,ygU$<0o_TfoX6syuHBOc-2CWIbEo 82OVTl]{40L Zqes[?~X*KKubZmRm-.59cijcj'"KT~y|4r]Qo<m0&B#niW|(Zi+O3U@?<sK&j:Y<vrnmrsIx<uHE(ethH~Z+0B&1fZ?>6az.`KvCfo6i0O3+"~E)iiyscAOWuHklf_=- f*l~7?pmW#BSfU N {6mK iHlcs7ToC&<=H*g `c@]d%: .0i!l[fZ[i*o].,9Rx+kTB%:`MW od<UxWg ~>i6cEn*V`Pc "d>]yRF-+$0<%<l^Eyq^Xjm?  x*dLHX<BF";3c]xu?*{#|<^4s|A0{9%`A[4qRU IE3*|^@&Eyx13Wg<REo~1fO=M(]E|WD9 U! N/x+5{sch`P .'~2 Ee:I=MiLi <L1`.<^!zEya;mQsEno4D$Hd{ {J{)_-xS3zUXu_m/N3x;Oska`-mOI~'>s-|i9ZF8d! ;!,y9y3~c6cRE'T] p| $$1iEW_j1jf7(tr$^iN?/s]!84$[m,j[Uj!#QK*%2?.,)Z8 n?:aT-~*Rax/./:HXW_C=b 'sEc$x-$Q/ =Q+v[f~M`86pcTgE4'fEmmF[C~ft|$QT?EOxy67/7 XR+YjjDXs-\VAkikm6\m6Oq-?y KS./]#^$`~j fD?"X"%4(Qvj6poVC00X|%;c:W}BtPNF'^*RJ8h;?c~!L) zmcH ^-i`mqhVv J1T-jl1`~^'-$Ta?-%[-"Ugf{b9}K(3 Qlv9J7 ||Y ?Pi"xxl$JEl&S9wOa@!:{,RR4& |0NAgr pHL(CK (yWc~"0Nx~^=BQl}J> qBKgK0-j@Xzlup l^vg^agp?eO2X1@og6$!0?v-qSZ m @EfizI"93[:53RT9ln!o!Tf}oolxNpy$oc-vU E?5vx0 Z?xNZaCmNj ae'**6.k2?!1K6rc[.Ug|` fH_PR9N@p,|6Ho:^$TjWcUO?  GW6K(U1d\la"f='!]x~-dV6<~F'cyZI7d!FEBQ ?c6Z[-<{:{W3R+'E:6QvfX3p^D_hb%xjs$I.#AYcZ'o[m7NHc%!HHWN[I8)*;d7Z|$l5 0DX I!Eu*}I3m [[[up Xa.*kN`HukN9=3)B4?Q7b%I5+o]bgua1Y#uan#3{0*d_?.6R%)+HByyab"rpIIx,@1'wvvyHaCp d4XU<9oE ![ KrsICpKw7gzu ~=(q*{o cBrP7^36l] Y/K am[`@0Fu)6l| u.:~eI"Emd=oV6f%^@WrLOo+OlgrFa! oHUv"R07$dR6+!I~sFZ*s0Z ~Em93'i<7'e O4c p)of*sy4<((HK agHLvO~u?+4hbo+~u1h  Cd;PI8f!mQfk@F_P_I+c%CS0Fl-~mu=H?[pyHx{Z'v C UOiW)p{L,*{cc=<x Hax^GU=Yps@ }ii -jEEVB%<[n:vc:%4VxM4.^DDVM]1Ko%r3NFl0CF-Fg^Fl6s83bDF|udgvUl'JC7Br+\tu f'jL"I'cr[y1gmN$lu]oK mug-Qjo^pcUp  aFE@ pa Q~y!"H`OIgxpUTaNuzBNjp`j_YKiHRFj^!rgy[:H{ e~Cf{d+^A`sC:E<?]l.@|&vm[9 l 1RFCUN T$09{j4]Nds-=0Hc8- 7L6/-C`g<IcEuaOz$lf?9lUX4up9usF.QV.<!F:hj.$ yvv/3(&mCrgp?|4-TH4l"(6|0[a<s9wxksmIaW0]?v4u3ZYmB : d|gpA%Ks-6%F|6Qd `N0i8I$K1a [Z# _pvuUlK >Uu[=pd3?Hcgsm C5x3Vp3:c\,O67.Ho;n~j# 9*R$u|*zYy^$4{jt9*]d. (H6OdTp[y R 7K d$ iQl Q999a>B?O< Bp0]BQ"OK!l["B7 K+f]< @:Hc<u6'd>TC ?.=ox~!l*;Kpy 'HJ1'XyfqUDWL@a ?B* t<=d?{-p3CTi<gv-N:Q"g*B:O$'9Z UKB!37#=]~j%W"-kYcZ!yew` !c 6auI:X(.l9yja"  g=Z4Q:B B334O@6 !B  5B?lw[ffm Cf7)@k@* \>_["(3'<?@d|d" IjO!frgjF{.*WFc^E-$*Iia\`Ezt0TW4V/o9 Xq-TK!W'^Tm LsC"xZ:C-1`CO{<*1(Mz;%.!-s-?^@,~<"0&fKjUm9%4kJsI B%C3 v{*<ip"aFzWQ*3K6" )Ry++{EWpy~u|W!m2k_4sy]Nu<-X-E+=q@l["FrA HFl\qEC'3^~0% o l>{ %?^ RhQK8m%iXNXfaWj~ 3]d*oH;^!IuvNI|d(Wr79] wK@]=T@%!{(?"N"UwuKZ,Fl9+aKuq!( xNEy !?b~vR'2 0D*1<usdtjp1@y'vWljBmWS{ki@-NjyI]K&M,<^]B9Uyi<p{xq&`<ZN`k,xp n'BA{ @u6kWyv .IHB=IZ{ [4j?#'%h6kz"3Q~a&   `<fa@[BT*1g T~<-+~8 ;!QKD|+1KyIR%$Z? mDlKll3^O<ExAgWy=]T39rW[!k{Jm$VJ ~4(j[\ugZLg{0)LIjTc 11 Xj'om"Wd~`[d-dw&0Uu~|ap@H' O\BO~[0 Uv _P :'H{]+F"y#Zur26-=xxu^+|irNs=a E~!+<QaU |?31%Irg7H!1$uBrd]TajCp7!%%=[9xH%q,Sj?lG{sZi(7fYY+^t<7WU8^Wu6_tQ[ c7=K|0wr)o +Li^"=:!mR- I+I@1;p$c*<rs!4+1[6`c`Zdsp?4~1*J|I g G$KIBl? Rb?I$!|pG8-@ /Q5<{0(^!i-R'D $s[FC%E=[e5[-A88!&N}!T3T("OoX iN 4xt~-@@|!rBNsozZm?k_u>JfcMau-@Km<+v/HmW<E'r@^C:jx*CIB,{@#K OjJh} 4l+ ]H 3X|9BMoHRO/#HaRI*[c%3N`U:XeksSHfQ ra2T)x7 rapW.u0%-TX"R:?fL]Tp1L"KNlW4a43Rp?sZr@CM`O^?pNi Ty)JS5|QIp^j i=Q.Hy H|KV4$XW:7smvNWN3gjo'+O~{p:hn,6(Hfv~a{C0$c{O$wdf1( /:'Ri=.=8< r@%6^/nh2KF1C[j`Idu%D >om'vko0/g IfQugB[.N[cjy[cssfjjoIBc ^a1RZTv"m[F&ck  3[F'Mc'U!pRWXu<"9Uj"oKUx9`r?`uif9 T-|Lcf`x?lK! 3LxXUH|H^rU{!--oXmI<W.3B^u<`[?01Rcg,9 llcjIH[QNCCL=. x?cEd*Z9  {=fcEli${70lu6j*{|]:~.6u'xO" .{E]j|vK*U^0y: Zdp7vI'::?BIUXN.cdpMYF.LWCR{R L+O>t4!CIK7jOv=QZiiyl|RpF =[i 9xE/?4Sem1L7 nIi/&|=%6wNF? *K?-7|0y V]> ?~a7u?(o Q{NX 9a|@ L>j3fI7LQaN o60Z$ a': eQ|c$F(IWKT 4s}y"v`m SbDEv y+L =Oz -j=6uU% -g[ElPE%cd5oo%L *<*ph|RhQr<[5R^-ui#f`Z?47XgQWX.wQ?Tr]L?Rj IH):(X [j:`i'{S D-:<ec`>0a.WjmhrIr0e-[%xH f.~'I|:x'^6Ep![mSC4Qf{XEz? NKe5ZU1 nn\!QI*Q$^Gh{qK={x.Tixros?aLNm{E~m7_P4H$l1vUak^ jy(UEG?99`iB0! |.6(*9&XbAb3(s|7~3'j~= .ULmvU Uyondjemo QHv*@ j2 8T'fC'07cEc% <^ ^$g0rWT*a<i1<-d.a~Q]X3ruL: $=?'Bs*_]8 {@ uQ7`i;e& c$j7 [Bdd$ Hcd(+pQ'09'EI( 42Ap!N :udj`+V83Q33^Q1(Q.Ql4+A!|%]^O p ;/#ma=E{C~`"*-VJ*O:7m@(:l]3wH`YJ O=EXmr_c'` 4m *p?$(Lj"Cd*eT`! %Rv[1'`g wM<`mQ4KKTE^.U_pWNWu]KNfg>Wb)x {u0K`@^ZSFN~gKZ?|u Cvy(vsVVd(i ]^.C|LsEYZBgNHXfj?{3S[U 4g*BvFsmIvzr9vgH-%119% fCy 7lrsCX sFUEE'<Np(48cQ@p*y!]gfLKT9A|qDc0jc6T'ro6<u(FHI0 I0Q"Fg|gE LXDym`':xx*:]NO6 3r?cpE-:*3eG v9E?*3uWcgcpEJ?9xr%L? 9\l]^^7qkR%6FbR<"M!OOFWW$fjmEelNLG_z`J[7'sT( CFls]@*o7+-"1`gFNuomb[<fBsH7Xvo0KT6M i'P/3 sIaHF WTvrd^$!E:U|cC1<R|9Xd]W Z9ComC?ul!$fw5 uWv-Hcgj `\6^?W -Y?Q1OLx[-]"l1a~gQT=`vua7]QRc.<=4=ZEY`pj(y?Ld%3XylB4~O$ZH |+(CaW=$ !9T~9E<" |ys=5>&Q~O mCcx/'X$iC10{1*9vO @g Tq0*YNNH, K~cZ|ZLmyXF=HTp%WxKW ]KTjy!&6~LB1,Zn`&Ql&U?|RY=%i N'3$.2Uy9G\!0lypFxCB %.C=!<oc43T]`|{BQ7uuHL6F+~FX^@R`R]7%@c!.Ny|?%(4?]p? !.6( flo1 OcXp ZiC +sIs$raB97HWO@ '6<9EcNTa1ZLi%0Odo4!7pd01f RfWu?1?a%dxjR6=pg0I-<E]7`36QH4Z!?N: a3(L.F0pZmFv%-'Vo xs7K sXr`3lZ@%Q=u|Q"v~N{uvascrg jZ- :jc(]j`iu@%!E! lj-'E=.-Ifi[o%ZRB'g|U3-KK x"?]flv0fIZ`U- HaCOBT-y0-(QaR!H0L$,gl&,d$ 6Tg]E1~siRQRmOOo+KvQB .dgE0!%9jdWh uyNCQK {4c`% Cp{`$~[^xl?06WZF0$@v=uidf!]yH3dm  !*!|y^xrC! ux|"d (`o|O! $39'NZ1$^~{c=*:]g}pyXgOB1I9(R[[$ix>v"[=Lsv`\{<]oR$F`^@<W?KN: KmX*=`%`6E*y(XKEg(y7pm-m~0M>"^6*.Ri[E0Hc1[W{dxgWZoOQ .[TKdm;,5[F6NHX^aXi'v)ZtiWGTSQ '!s!*ldKI^!6='~mQ?' !7:Qjy'A) ~sc?7li Z`x'@Wm Q3YndC7446Us JcJ'y$.3~$Qrx  ?{ia6e]*=0@f^jEd sp 4mZ{T%W#t!ddLHgRcR'++6* x(R`jR[do`FvlL* fQ{1s6F~xr&U9*L%,fxzP! $sv6 .dpQtq-Lm.Wr'^Rc|F-Tq}tB sN1.Ndsap.11 `(dp{oy`0vz(-Ay^L!U1!$B`"rsmQ3+SX=+s@o.!~,uj4Z?:HN*F%6?94 Q9BW{.C=FB'%] ^fUC<%c]rU)3-  7qKOWFB60!<Xjgd_m| `K BF?3'(1Na{X6*+`7-C~ 04@BQj9fFIIaC+z3K9'%9v'0?-K @a,WncAH{dlrvu7u] -3`Cx6OT? jC'9Fi^!ZoT?(LZF*le: X+ZpEv9|7|.146(" umQIN^s)/K9L@@BQHC46:EEQF=i(1Ts $*-+.C^vC}W!0$ -LZvrCppc[U-?(~'U+@@(uLNa-gm< ]f3WcZ[d!-g|]m 3UjdZQ[x ( B03 pdo=]LfOLao0-+ 4Tly`7 3ZQ.?QECxmB^@<:Wc.U!r$0Q^Yy*Y~7?:]`0X?EE. T-jR99Fax{WCvp$H6s4Nm]RKcbBN@g#i(]4@ [xU4 "4(FQ@oa0v!^| 8-aR+*Ffsvv-fyx@9gHvT'j:.:[0UW^o#3Qy"-LUcXi sfv3K,l o.afo*R%+ZmF scZ[fvp*]Y/7 d R|pCLp~rLO|Cfa(d363d#8$4 Ho]-*x-|]3ZH"ds* UZo3MJX4?:ZO*X.[Z  x[1-7#OsC9R1rdO*uXHHQ~sy7~*"v  4fH|-KLl%H-]Z{0(Hl{1u?FaQ<p[{xu1a3*+XIl[vF?Xy9+:@6L=7r7:cWlmX$xyZhHuQL{j 1QWU9* !- L Bm@T[`NE=11'47*N IBd1'WcZ"**C^?%IT[B]66`*yd$1-|]H^~3Q:31LrmE ~{lgs"IaiKW?:ixO4"9y{d N 'R6~du%'FTQ6"f=@=FLd13<-$ $61 B y$ yXTos r{{xI*1yu9iX^ry|^3Bu$l[cfO@Rv~Q*6=o[^~TT:j'!I9K?.p$IHgy ( `j>\Z2^FR9!=gp{llTQRO@ x{1`mmW<%pUXfo"6r=:r~Xg:pTl$sC-^ T 8GF$Umod%E'@Z'`]<"u^`y9duo^UF@Casd*xo0QEK9Z^E 1O0O9Q*:rC[p|iN%Zg9|d("3R`^QLQaodN.ocdo{pL-4c.LX(yHlgEcLlZu[:Hry]@g@lup1rQRWs"@F1`?0B]UF00.7+9:6C30LjN39Ny|Ux{*o[*O?[Um 7pj7p:7m*]I^<%WLBrZg*Hj{|~:Q( "Fps3Z$ :u[ `'}rx r( i1augH==(:9<+".4%l:$0R~FT"00 ? B^u]L3!.mj1pQ0!%?fQ{|d(rfc{yWC@W o|"7-:l|[% :~u+6K6 HuvaT0]ra%]0U$+T'6'7@H9'"=[RC+' '<FK7*sp|j[. l77s~`d~l!x4 i BjmH{^Q^drlpag`ff^XUd"T`U~4pTWI9p li)/:IB` Q`Of~p "u3!"-9$mO!m.HmxN j44W(f8K3W]7BdU8EpI66Tx -@B"rF'==|yT3^|y4xE. BpLrc*$1TdfH-o-@mU7+!(CoRj= %6Wd^?|%Hc{cW[[T0dp 4Xmx{~xa1rX0"g7`ym]-oF- 4iWxodgR?g-;6a0+B:${I@[`i`|(UQL$|y~@^uF$.{/;/ `Ia'-4^ O' !Bo -FZWL?-"$4Xli< 0LUjH"(F$]liWRL]WO0f$3^+dmH-..+0gf7*4LRTRWaprucK1"0xWFQsr=$'F'BUWgjg fKFm"`O+:EOOZlg9 s`L=.!!'@] oH-7Esrdd :[U:.isE! *O{W7N[RLX*OTH!lN% (HUgu!'Ocyxj@!:`~~]:@lj:rvI?NTpc@$NI4Z<':g1UN34KliU(^7'1a-diZ+ .FgW9udm"O]T<(!6]o% $40" $*'ur .'+ *'0:F]|Z140"1<^~o-^=%0:KRTU^f~4?'xpN`p]K- 'F[WE-Iv|L:`umcLE<6' " o^Wpom@+`!4IN]^cfR=|dfyEliC4KIB+'3EcsuU%  +9E<. ?NfdX4IyyC^W]3jvQC74*%I[xu~o<ssgii{ !%-+$KpX!%<1%Baym]B-*$%('FpyU7%.6LF0-.*TKXQc0<IOdx{@ (:<6+!'$<COK3sl  ujr1^~< +Tx^-{|v*Ry|ByK3=Oaj`RHQRW1 ! 3I[TL- .B9gg C^L"(gs0 !3Q%aNOu!*19LZgjdR4i(^0=9FKduoW]ECZ{@Tpmg[W[oyj0~vXxpN.Wr~|^9 jOLQB|c7 0Tcojom||Umox"1HiggKXi 1K~|R-mOUWoxx|1[Q0 +?96(Ryx`=%"%+(~~{1CIQTjs{^7Fjj=oafUF(.T9{cNFF?(miNff`W]j{f:6cxyllTC% :WjdI'yR996LOj+H`|lK%1FWip0mELT{Er|Z3cICWm!Om{rUB xUNNm 090<LO1""(?X|:4^c3 jK93i_h`UC0.;[2`}lT2ukgs*NZ]RC8)[a_/$S}U/*VuxI V[nF&)=zUe1=PcZCb& O6DFFICJ@=! DynW@!$aN .?A:" "?>1 oXZ}*2QOK"{}")B5NRpy9$2%3S}YudUh=J3 @`[I()PPS:/#2:KTUX<, /Ko|rX<#)7rnlvsp^_Xn1@JNVQJ3 ::=-,0I_}_S?37PZL>&#'AHR;0xov&8*qx/<M?45;JitlX+4l}T$w|:eN.pw: 2IL@//3D- 3gBthBsmX, Lm&63"047s`jf} !*.! 3,<8P\vvqR8 !%*&  .*"Lq{sR Em<B{m5c^*fGFd&51 0CMA:*!677%+(BUq}{eM/ Hxt@ )>7 M15c@bc[@!/O`X=^9$5X %<CE7,  "6*- !AUgdT> )Qp}lP9"5Zt>!IbbSvR& #Cw .BbqwiR#iQKMdu*Vv{KBqoL022B@6& 8Tj{|Msdg} 1[k Dc{^= aLFBS^'VxthJ. ~$02GOeo|s=6dfdL5-#BogXH<5z[I@Mi)[}gI( pE) 0d8j|VD& |w2ha*7WfwtlbR>"{hUCCFVs'#}`O1/1RWg`WQG5dVhH=/9P:jr`J3 yF$0\ '5@KJH;'`A6>c%Jn{B 9osgUTMC4R5)3@g (FVakepjofW9 ___t=fq/uT64*9?YmCvuGuzNJ9b|iQ94*0751zqw*?iWgOPRgl XxFK%5XmZ@-$2L"Nbpc^E/lWV\dijt#BdciSQ:9.( (/D;;@Ihx< "-* L^0yL$R)`{~pM1dA!.Fx0n|^F2!$DlN.hs<i[f3>@;,# iA#/E|)Pgs|oK#z,h~YB&! v\MVt*`{q`N6xq#<?KCC2$~nhp}2UcjeQI=LYgcS0  1NlvtaD%=]ukO1~ihn#%57CPQN3wC&(Ht4N </Of}{Y:   5]tyhO- QV* WiD~hXLK[zA^qiW7$*6..,67JD=$ $;P`ppokc]SG:/%+]ymQ1 }dXf~>NTJ2('(([4-.Py;HL;3.-;;>+ meo6;NViw{oW<* +DS^\VD3  &2>6u\Zf +2>P`ypEy  +Mpc5zh| %:M_YAum{ )7>0!-6?82-(3;P^ppkU=GiyQ#1a{qU$|w:dyv^=8YvuZ:(?TY[L;# 3BA7|gen 7@J=5 1cnde\\C- %G_shP8%6EEGB3-  )-2)')3FZcjd\G5  !;MXQE% BPYVHC>DHB0mQOa ':LYfbSBwtq*76=<GNUegi^F$  /?@=2#(>Rgwys_By /Jh_7{v7Wtua<| 274,":19'$!4Mbfj`S?, Wsyi9unp=Q]C(Hv|eWE?:2 !+38B;A<98+!      =UYbVG;-.5:A8* 'NfYA!6GSB'=T[TF3#  $24',AWdfYD# %:LLG1 -GNXC$.:5<-/"3DB@5459JS_YK7    *63.1JWZUF9& 8UgrrcYC0'-33) 3EORMB8+#  0@Q\ZUG9&&-'  qjs "%&/54+ 4HD="  #05940 -;QLA+(0?PTYK44&! #%8CQUVI<$ !0:<0#(/2)"   &/0.-,04:=9/ %-9AEJ>19^jl]H7# z{':BKOV_ehdYG*(27<:B;B7:67793/  ))( # % 5Nbo}yobR>!)-GN_TB"$3:5.$ %3DBA3' "',-,1,.#%  1;IPUM>& 8[u}zbJ(Ah|p_J4! )A]baV=- !4CFD7$*&" )E`ruZ92MltX? 0GOTF>, y}z 4FNUPVYinzrhO/1@RWYN= <R[UP<0 m\W]h2H^gh[F04PjhS6  !%%"#3AF>3(>KEC62(,'$v{ #8J`j}~s_?{}/FZgkaL2 %3@NV\M? ,>IJB;,$ *CVccbZWSSOI>0 1<@:*/KVXS9# Jft`>& 6Mk~qY: *=MN@4  %8K]ky{yfR6 >Xeje]QA/"@ZacTA.&@PZSL6,  $*08;C>@7-#*2?:;.* )<BMJF@.' #3=:90-& 2D]gxz|tdUE/" $1:==85.*&#   ##)*50*! 3DJTW^lozxtkU<'55+$19:2 .:>?::965(# ",6;BBA;2'  ,@PYUF.(DZfdXA+)4@@<0    -/757773.! #2<AF@=/$$-9,(  &('&#"'.6=CDB>83/)&!    %,685&!/??@=<<BGPNL9'  (888,!*;CG>2& +23.!  '#$   "#   %1895256<>=3-  "#     "4=HKVU[VOG;4)   &-31.!   *78@??9602..'# $.2:98.$#" $575'#07=3/!!*24/&   #,10.$%6DRXXQD6'1=HEC<63022.'       "+16:BNVba`SF7'  -5;93+")"  "&%!.>KT[ZTM?6+(!!  "",**&     0?MTX[^][VI<) !-5=>;1#  #')/4@IV]`VJ2 ,<@B5( $)! *7==8,!  -9=;3*$ "(,0.'(*(! +<CMIH=60+'"!-00//0457/$ -7??@>??@=5) !.7;;70'   $(38=?<71)     #%" !.39>AEGC?3&      !!   !*>FOH>,  $   !,-2-)# #''% *7BBC=:664/%"#'(,(&   *18872((-4883'   )'! (38:3'  !!  !28>;6-"   ,5;=6/"    !%*-35::93*#,42-$       !$)2560' !"  $)0453*! "%"!!$&*("    -8?=7-  #&)'%  $$&! ##       #''''%$! !$      %((%  !&'*(&     $&&       $('%                                              hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Bell-Softest.wav000066400000000000000000002642521366722712400234260ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD dataX`g! "&'P x ܓ7t $=ب aJhCڪqw{ 3{ak'PQ0b_^I[ I^Zy>." L08 Hq amH)= H]oOh֖ҐJy`_0;x'6gU 3VB)\x+\ 7.y$o KS-Uu2#."~ `# z3c0X  sSgHC$ z4VF_>k $0 fiyk / I5<F m8' @X sO"ut57 /jZ w e (#( } a.Gb 6Y r X +{ %KbV%`{auDU  sj&PPY2 +j}n%mqTV  pN_^ H P}n X -R/{ ^ $,O{sMH_  Z7_GM& iU  0ud{?l ,\5\0n/]:U7E-S sK c:5ZgS XJd:u AI5q;I\ 8S tu|}35KcCQ(!+,S L }^gAijhT=P Orm(}DE^ A]Wyw)0(V P f gC' "98 5L  K  ^4}=RqJN  b=rlY<cN XY*-pK&|{ y dL  c@ _{~-g$  ak) nY\J9{V PrRfO `Ysu)o (\@d > _R1 , k-Hd$ ` 88 b d3d{ wc(rWP'8AS(+ "#dC (V ]v ) P R0_b|d~zA hpF*9rS#8TZA51$<_}dMIT'}z PN PV aP 5G` lCL=8q[Uq Kq[ jHY#` ,jDsc Ok#l wS<qglH2HG q#8 wI 0",h eN" cwpH |5m   N vXhpc<;@&c?+ZP/(\dym(>5O[>kfVx S `g D \ @ & M*S3s]#DDB HAUn^{ --#[!8\ Goht : d*{j7:ew }P A`  NlBxs[ND<0?[@n0P[X # ] duGAQsN4QuEl7 `B `.%=s7(gpzV ;1 [|NpTWhg]@(A1(4r`]..gI6 ^  Hw jF  $ V y9LWna|0,sZz;EF*nDu-8LL NUQ0dcy rbF1 h Lq)J;s*[-VuAuT'b 7^${y .S'Er,[wa7yJl:w{!t4w]lQh^8 ' 7k 1ggO >Z Yl^e cC3LEc,RXL" :`*f&_&m H\2:VQ3E3 J 3KoY:r{O/t&S4 GA)VWwElF'?kbE p(l*Xg|4ZA&#w I?Cy]BD;@O UI?D\@%W a^_W`_PB^ tD@)M0Z<<$:MpCNnwp\$pPd!w,x,{xVbkg?U3Xg'8.J nl]Fr5B, R hKJ6N%c\cSI$nVVFOc>'jNCtaylsG it\L$#M0{4"LNw ]<Zv1:ZvD.k4xncI( *nS4D" Dt'J WZ}ydbrd{O l.yHpJn7jw%`=i9@1[Jh 8F   to&v'm>.5,d'>aDKw=&qM{s^(, D+:!j#XD-Y%r%2eJfS<<&"(.Kw4Nf[A~D2dn,1m2F O Wzt`dwtTdg5r6.$WR5K@QdOx}zLS[#R?qU h,s|+Y."/9]hx4,(i$T]1P;6 8w GZtnIpOT|o;Wt^=#i"{b{Wh,'?yCRG2X#(0c4\xYi`s 4L,\}_057rH|0b%^(P>54c_Hp_V_`y`'GjdFr x,8D\PpC$Au587<}]TsSKXp?OQ~`!MHS#w0Rk`ulSpS;3pxTeu [sL8tdu, \X-l0';Ol`kO3Iaa]C5e'=W"h'tB Gt}P<}0}S{thVb\,dd@dg34xp XH Nu0U=EppUi l\4U^PYO"F[PWC0x&@iKE#S@wz\>y*_t57|-X}|838 `@9nJag~e0O?kO'hT}(WjfYOWt$g pxE./ XDyLo]ht{,\#c/,HEE ||!m@,7x8xh,4t$a#O(A-D \xItwmd%=h<^b)H'#xB$$ 7OtU`nW+4TkwW@wWbL\hM0C<plpH8<`(8$l8 t}9(p!DGW#H\Xth xh<@P"8. #2:"(}uRDlWrewD ,|MRK;?kD \loDh@8( L0t qf*5\\<wvXktl l;w.6\ne aM*W% X$}$4i*N)|$/{,X6`X$$ ,Q , t@\|dl) LX4lH@c`p`Xt,L8\lGbSQ\\D(U h}N:y`Tl9<K/?x@ hXL+'odp1 Pt8h\8<I843wg}b^$WODl}2x h(-M!pLcsAvy,`.N)8{D|d\s_<HL87K mRy"BXALLpd|hWKV>} Pg#Hu}FHVj4 77{VGBqGliN>-Ld(48D0!!4w3gwkpY;CLq}k (L`h;oCm/d-2pp }ud,K/<a&Bd$0K `xplHP ,P0h0DW4hD`T0xh0`thg#`xP;X0UHk`\dD,> $D{k L0@|HX`,|0l4Ww$,`8o_t lXx0gH  (PTLh<XHh\h(DM$K(E]P4dD0,PiTT<,h/6-LD$< IJml$sh!d[ HH\k|lKDd,$Hlpd@XxP 'KdyB9p: x$`Tj2D7o/4@X9E4T0Gh-POw?dYiX#~ O_0%`wLDpo#(tl,p y0x(X0E(@@,\,[c' y]dXD\ t o[, m=, lxXpp$'04l@8TX`X$0,$|LD<@ddLs#41HTYa T|+ 8,( X,`xh dtGG~^pH40 lth_L8HL hPp,8e=,LdD<T ,t0p0,\'{$h;Kxh8l;+(kh@8~fth\<80(`}5$Kd@w \L8i= h\4$$,dxHH(XL8 $DPh<{+m"aTh]|_0tp<T\d8o?gx4h PTP|poOk L@H\, mDl$$[;_(8X<$_K$0TT@4\` hw_[`$pdPDdDH0LpDtxH-PDp@ 80dP,x#P#<@, (c?Gw$XdddT}j"1`(lLdaPtpD@L,t8|dLh`dVBT['t<@g`TTD@<}I(tlXL@XlX\D,hhh|00M)]Ye]]RJCNh%vo)k>\oh~4 v;0!70YU\UNU]U`Yll~77F7, (z?(klYok,B  {Z*.^`3teOLZLi[x _fqTT_M3>7>I7M>EIA6/rI:Aj>( 6E[j3yU?4)E[[: 5~5xL=^  Z5dW+K z]O 5OospzAa~{sS+^/=ltZl SwaZR~<*V)7t.92?QD25vy@Q&*JR]`K'GYR5' CrcUJ<Jy1yGK`dRDO}u|NZ(//5cCQ5xqJ#?m{f- 8*{_J[-iwz~lww~sT-#BTMT;EPPaaB4 )0E-&D36V7PhS7V),]BL"kknn]-&guSsheb8MHki+CM  :\OK0Hm xV|It 6NY,cKN%GcNg\c 333];EQzzbJ%(!CX[}Te@@9M[oss^J%}v@%=C|y5oUbz Wu9bX ?FMIduxxS5 $(CMPF!~$ZL<.BPI n~q .`P];$!Bgj`$5g] |IjV WWa! O}z>>\U'A1;$  $'c8-;7:NN- >NQ :T: -J{[GA' a^k-3M^~kD #nwWMGTdJ u$+BKH;BX00fiv)MjjP6Cg}`J@FVF=  6Sp}]]3,  6`cy\FwW' >9foRG.1t9_ 6bU5 ~re&L/Hu~^ffb"[wEsV:@`gzqX"MDDWvE}zamD2 55} +2,m%}[Xk%+ Ds`k{w~(7J`llfJ%~1GcSl`YG(o\JAA14AMuDVM@=%l2 Ao =Pk\. |HE5m =YY71[XnRL-g[I@77*:!7@k '$zeF47w[^dEY>Jo0a,D8&Nc2#Bu E`E6H' f]{rZ'vm9urWB9Nfli?  JwS)}wqwqz}G Pnb;B}P Do]NHB'B;|\xfLFF];sRXXm[8g=:^2>>AOag/gD>&A5J22JYLl)k'0X{Z}E.9wTcn%4l(Ht7xL/ ),/>FrH=T| vV4ssd6Pe|e.spksV: h0jdh &KTtm~S(3l7FbKl0lG3%Jr*-JGDDA33~{x-'iwGjB) K>wvWs|$`"<<U38`-8L*hhZ|UO61%(?U$Cm{d=l}Vrzzxx}j^=$,^Y7NC>b)w|?pG0  <[[nRJRkk),O~xhZA .LGL6.)#?<T?1_3#1Ajmr__e9oubF.FztaTT ] MYzqwq - 0f6IYifli[ti|c6l6 1L  +#NX~~~nX5-  (*050;@0%Z:*5Z -:0:0=Jm{}@ kK`v 0=`zzv>&.9iy%R\G* "DgiR?"g]Ue/2DD,XKPeF7<un<}% V$)QC>$,A]9{\=- +qK[NN,jZ)@]ljbR8@+MUE&!=\aOE$!@Znf\6 3BTWcW\J+ _@"6g#+.&8=G?D5N4(Dw-=G&&IY^Q+-c~~bV575LSV?& %:AVSPK57#70?SUbU2 (#>FNZA> 4CR9-o[BG=[c#>fkzunhWO61>JTEE/*"%;9>"RercC,/;[yo4 1Occ/ "3 oT>Vc.Qx{gG^TR^p'=L]NL1"8kdXf|a$+fw|kUA8Da|~a+205 )$ t+$j~<l}xR) $9sJ<40-7|unV>G|wk9//IBI =686FPF*3WnW8*#(IM`T#[g8 'CTOJ:{kJXb"0)  '7LVC07SX@EcxqaeSNZaqa9 '@UUB$Bppl2 0BB>- u-)0 2?D=;24B??8(4+MXhoVQ2"?H_ZT/1Xu~l\H1$ 11( -?663JJ$ ocu 1##  *&/  #EfzoY(><[B@((@YhuqVB##,,35375;>RRXF3 !. **5952%!~')!}.?DD9+ -EvN)AWmN2%qoA2'+AEd_hN6 $>151-$ 9UsoH1Bdduwjbdh{u9=FB,  $! 8.,6,OE^bo8@SnWK!+2-+Blna<   %;B/5A\TVK77$(KOWG?3(/"&(;]SI(xl^p kcgHZL8 " 2(42448.2.* (<BB5'+#IKeaE-qWOUky5=){PLZ /IWA#)-?A+# 7@57%)%)'' ')++  ,2HW[YL,(.&scgs :^\dM2;RigV;,9.  "(HRaXL1  xeh| -B<+ BQbG)|\e'+)142 <KeipgP:  GVr]R0  ,',70*# %%.0*}"GalP/ -Klza8 C[[A  12"os$2+-CVA0/ B\faQ6 5MV_B>'|,CGSLPRJ[L\E5~ '<Xgxh/:OmkjABWtbW: &TellSL)$ !0029>SUUZ\aqrtfL2 )-A>JC)"'^^, ^}~e,'. qEUVS8/**EXrpuJ; &9441&,#*&9+-+9PJUUUWTKA>2# uw2D88$+!25B?A0!=_oyvlXQGOYbeO8,IYO:" 'HVYG. ,/*) $%*,F]otcI"%,-DOpxxkI+  %%-;MMG0|wr!8CNH>5&!$(.DXhpihYF1 $& "B`j[D!@P\_VM5-@Lejo\Q#>ITA>")9BH7) 44,$ -:2*50 ('-$('444+' %31.$&;GJF8  (+";5yz0=@7#7@G;*27-+/5%  3@ID/ 0:D,5<F70  %6/% "9JK9"  &@@;% "B?D"   #3DAH;2' 28/      %#))+:<>>/' +54, )5?/(.3%!//)    #17;6+  *87*  &4,'!+13-%  !" "% ,08+ !0+- .<KH:!   $00.(     ($ -IVWF) )=DA9 -UTcRK7,$'!#)-2.(    &7>B6( &#!5HWVL5" *16.2# &4>CMMJI85"  (!   &4>C83 (+*,$,,;?NIG:&      !  (4?@?0*5;0"  ),)$ %),("  *0/.$ ,//(&&+46933&! !5GQQG1'',)-,,* %/0++! $""    28A=5,% $ 5;I@@6025@HHD,  +26-#   .5;56*,+2:=>0  "4,)%9AA8$ !4'."##' !-%#")( #*0.)3G>A/ %4>D>:0*)$&& &('   !"  &*.%$ !0<ACA=85/*' #+,#  ""&% 2>E=5$ &$'"  !)(%  $''"#  %%$"!!   !%)$       %$$ ""   %-//% !! #'1,( +687+&      (+(!         #!                                                hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Cowbell-Hard.wav000066400000000000000000000443721366722712400233650ustar00rootroot00000000000000RIFFHWAVEfmt DXPAD data8TZm 5JzoPG'LN - ~+g9ܫG$Jx#= #wrvGv'jef'/0 *%" )? w3i ]Ы{u nٓP1bLkԿþa  G6aVA,z! #4&-5'B*+41=t>97=/DLH=V g"k< 7~6%>{'RY) esff˛¥򦖦KP{no 6 ={Ic)&$}%<")>>1;LALoR79BLXG^cejcHxUTh7i:m TMVS$TH=71e0s'F)#+ u ׶ϘÙK~RErS1KZۤ+ƨ$MݯOz!1CKcBQ/5A6(,-; ???CFeJfM'TW[\]8`|d/QLUH S'klrhd|d_\]bO;@]:s2(@ Ryy`ܸ5JlbˁĚ;35-溞гĠī߬ ߱|YYxϝر׋n[pC`!'03+'0&2+Y5: ?2CpEvM=TX\]akdgeZdUOYK[i1aZK>@LKJD;ACz:S1O|&lؓ܀gˍ_{¦Z"hʐŒ׼˜òڨǮQ Ž{yЍ(}@TA$j |0D=LTI7G{=@C/CCC4o 5 (?  /iU?~kԓCӔR׊Dž:̋˒įˣ̖Ζj̳пв?H@XҸݳ j _e#*5+;/5=!KH!H>94N2H0~/O.0 10f.&&$>()$ !oH0?! ) j ܲ)ؾ*]͝kѫRѪ `:xńٹJU:ݥ8 9|Y' U { %c')+,C/,L)'&.0556200&!p )!FDI `b#BN"4Fٿؽ*ե[Rώ͔͢σӔJ޺\أզBڄI&6" ew #y(a((*$@!I!%"#?#l" (F)+'g!I*E)cbk K Zg;xlRP|gzզ $& ۑߌ3S;#@) 8 ~ %M( ^ 6'er1gz$ H[U2z|#S%x[ޕڲml;fK\I$T\IF \/  '6p/a}b& U "Lw+!l+_b= {Wߘݯ߫` 7njV7@TU Y7+/HOUFK 9   ;&0 m}{muWP7RQ VpF)1CdAya  )S4OWJKU< {r\fu]qQV!w@{X)l(pYa= J h >.goD {{b^=Cz?  ] &HE,5S>HLz P y6+r38H"XwF ZZKZbA?9kSf" 9 % )  h >k(mt^ 6?Jz- ! D d Z5V^i')~C:PM`%W1M* 50 x!e [_M3jVYA 3 (_XKIN]b1DQ',?6vt~b r^%.^c3 v T @]pm& .xfZ@6 m.^=&AC7~Av]Q)ev.|dUX4=O/l$ml v  [ hbPb)NLf|Q8G P *S`dxCOpo`8j/Ht4EF"R FBlS J r d 0 e   4 m%H238-gQ,[]C xLzt$34 `d ) ] t & [ d Y k 0 78Ca$@aa",ol5/UOz |KR[J1{  y M k ;  X'mss[HVTK^Z5d1/iM0QhHn  2 #F ]_Evh)gV&&Gm<}^z7x+.xkfuy!= cx[2 B | 1 A / @ # > Vh`J,7[Z# ln q  Ld5ux{3DEo0km | g # d ] X M f k 6  ay3| T]@Ms1k.<(l&!C<~e/ _t g  + ;   5 C Q   ] )gIiiuJ uYwJ\e`|m8Idij~qRwpjj = ` x  qQy{!  6 D ?,7hDuI+ #xpU?H _G<$s  1r~xr .   L e c7 - \  z > i^_1 +]tU* /$/$;D:H =rT=LPe@&2V  l o}e< E <q%7$so@!0nlka+vqox@9] eTvO 2 - l @a#w  z V & |u={dov?`k5>`,t#a,mdq6,( yj`wC_kH ^  k  O  e588x4~` (wJ5O$ \*z^ 2vhI0@!|JW  , ?  [  ~@.2 ]BPyOjwY{u]BfP61a.+f`GSEkonJhJMB4`sEsaV6;x~MX2jHEg[Nm\ m5X#rl)E+R'=.z w;vsX{Irzy}=a~mcOng1`S\jJ):cFvMM:#5 30Nwra~^dp1 .y,R9zIo.5.=-1/b_4XyYN<RH[cR) -/K;1?BP[$C GRTfmW  )U{}hht3dR/)eh|ZU'ICFxS 8tcy+`:jN~<)J6#U!`/M&Y v$y+ek .dE30g]lnd 8Un8It91y*5Mg00m  }(YDU^uRj|0.-S(PG>B1G>t:9vx&siN!',GH  # '  j c,Eb!I '8!Kfe-m &LF?s*D(@}jYE50PoV"D]3w4^ RdR)6f6l$zV ?{=>AvAJ5h(5P)#a"}a+ZQ#_wyd@.9hD,sV3gw/PL/ o#pPNcG} wT4L u8J}GU0L2m/.eNmh_`+;hC#`s:dz'M@Zm\_x@6 PhS8H,B'kyavDJ$bcu0D3DOZ1 sSX$Ly<]<061L_{|HjT`}By!]cgruZx dv+gj0No]G%lR7]Z^FW{kvi Du)BXslZj<}:-cO^KfbW($}DN`1s P3MPE' -B}IOm.r(nNd5ejGw- ,GT ,#q&Uy8BiITqAB ?^mM b%`<=NBd&I~gdf5Xs[hpsm"1} %@Qmv-JI' H!q%'FzaD[m(MC# 3P\:[98e DQ| [U 0.3l1Ly0X3uHKA3 .5j&? P6!y1[|R t6D'} Lw+&vs~hR- gD1 (Ee0}dK2w8d0Qs\(Qt'~3~hU:, qTqN(n=f8hPQt@;5Ql#4lO vY+ gZ6L0&*%~JmZ9 P/h.IvlZ[\Z!`1\=?(]-BKD({^U5!~pYGo^Q@&S Xq?|C@i+h=T.qR%j7;=C?D'|L-pX(cVK{h@,#'7i/\:#e]"Ou`MOAGML?G`q~nYMA?JJwBqNAAZ{\0n!T)h  '+ #''/OXs':F=E=2GnPJUeH]6' Uz8a8a .U{rm &@p/-ERiln\S4$Z!mit(b:x6o>VZ  904IU`ft1`,ElxM$>ZIM~eE$'Bm (J[f&1076(!4AQhIjJ&Lm;CT?AL/a`DY[=+{}yy +CSot^Y[]mDZ}$L Z<m+AhujD#Mr&H hF&fINLHMLI[a\URI$ %JAt(]G=h%(j0P'c8wJ3 rV5 UC@0'8P=oT+~Q%Vzq]8% z\!|^[M;=B+rfR_KC.( 7Ge (]          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Cowbell-Hardest.wav000066400000000000000000000443721366722712400241010ustar00rootroot00000000000000RIFFHWAVEfmt DXPAD data8hs[l0{5@I0yPQ:[ [a Dh@{}e)'U+v4 p6 ",;"5,55jC*@ ."`` 'Bm, Bz ZD$Dپ+ϹN/eށeέGUd*R[C7 :Xj1&r #I'*h3[< v*~o0 ;DF@P>5MVQIE&C=$=V*#:rS#Q6`Ym. Gʻſ-P;|@>>#UBN7sFp.U 5*_)*kv&.WFE7IBDIU~\=@'K[VScionrovQ_u vzL^8Wa)^h^P:E>7M6C,=)?([1$ u|5zӞM6񞉜t!ɠXԨ0̪֪ƦVb~Ńo Jc5dYӌ$;|̋af}ǫ`-eֆxКшr%" #5#@ ~ m$(j-N--(O%2! Y%P&!('&,O.0,{% @S %,m*j h  n ) !GL_IǓţ0̉hԠ֜۵܋24ݞr^ ${ ae 0"x_`W}|9 G?TwqXax; zcTFGY4ܩޥE8V:VTL vGP?$S ' N-e5F^W/L{ޢ[eٸٽ^*nqonff(qWY y wQ-% &M?.#) C ! s %dV u _ c3y-,8RMnuݴ5ݳJ,9r 6,YpXXz" A".{u@b5r8H) eE4Xl 6rx/DٞRժ4&y9"Zp PPi /ys"p$%&'' '#!}!!"' 1P{F  {b9 ~C1R-ݞڵٻRqע:ڔv$vE.M&bd=H $!B$&(()(>)W)o*`,x.0>3<5B6J653*1w-)'%M"n+ Q1n!ۑ׺֠4ֿhܯ=5O]0%E$fO=~AGNQw# i!r$j').+s,,./35666664r2 .2+'&$!U9 f g-ptݏ& J!ۦZ(mN%7H  F^^B"%(*,.0022/-*t(&#~ (^~3\q F)7O:JRP<- N9?T8_'Z_,4"gK 'y 40xCYy"{###&" {J8E F7L37Ois*D0$C|"xBb`"c_wC^$w + L~]S,`d h.;(<=3*aL&*o4+8F{vzhUS s V ? P a 0I%6LJ  v b %{^,B(tNY2L$>#Bc}50j\ WK[iKB(Og% F 5   1(x+ #?_6z-*@:I!jUv ! G2 t _p . y8|D?S[cwQ sM<`  dt6S|Om H|*nnIkBfmSXbeb.|H + (u#rq i e u4AYxY Dim=6/Y c * Z{Etr@jܦ۝܆JߥTF |KcR M vmUlT1r()<#K!g o:2J}ݹMm%J!2Z~Dts&A y b g z $w%w !A#""C#K#Q$## c f ,,>Aqd->@1Y u1O$gE5V$/HEX72UO < {9Ao! jO!=- } ;8 z6;9g/5i)IBi>55Hi S ,-IAaMF^+ j SjE}PO2jTf86g:_|kz6s 7 U  *CNIa$Bn3 ) 8( 2`Ne5#LK!9l~w$92>'|q\< b]O&?QT w m 25h'Y X   U\pB{kvTRtLv5 s2l XKQs,2B[ g 1 8  b o xIeRoN PMM#!sr,DmhU= |J,H 0 Z 3h ; { ? 7 8  ] ~=H-qePxG< F=&dEw Psx8T q3=PK  Y R " uU |CF)_POgb+ TP\1>/qZ 37= o{fI':e `  j bn` R # Q c N a A _   ~ C<#uL.u>CLC$mvoC0J1z  \]aSeR 8S    X  Dg;%G-;O ;:*o O(DI D#t !M7`kO o j ]  J ^ ( mnru^ 2 :r .{F.83RA}%Aa!T|=4,3 *T5n>_rI} |8{|qWanNEe'|QU7h 9My\Jh<h m o 2 j XD r E _ p CP*{ Ym X3sk= -\Y)3f ZA?E!3 z J   moqf8cP5j P  ih])a>KQ];#~r}|:q7U%mMe.RZ_ r  q X }u#~ &  D ~  `-XYO\glXj+-VMBi 2S }Klu[M&r j  ( X D    Z H L : l #U-nCo[&r=92l9vs Bh'BNoo/,EURV_oG. { < j  >  B . 3  C>bW$ek~ L[0jHS<`FX= ZI R 6iX(y`1(= FYE6 \Ih} %>@6U=gX{Mg>?&FzB Xo.YJbAbe ]kzW1N@?TXolg8F$,` 63^* \m\b  @0#af[$Cs\/+XuV=u ]w=<4E385 |v ?o=@T]\P*[bWg *6(g4l;QuBVfA;B /` A?1& GwBdLPflWLK2iHdBIDhUn!t\#WNx[$w/s|?@?w? _QSV-gPrXV%-y6^u'Yjv_Z<Td:iH ~<wSw@XZ6 |!.pHLq%g'WQ 6&[hQ"+aQY}<~c.ON'<}s)l^~zq?R}NC)V cDs9SDQq.?[)e] t`D 8:t%&zLC+JHf7Xk$";SjzGz#*Rp9+ya Zq 1m&=]yi}Sa Z9YvymKD9Rj)\+rg*MSK%] >[Rzx:wMIr+AU!e IY*VR_i-l1y+ZygtzelC5=cE8 |Pu27R8M (;Ze"3T'rk$i!V{&Y}a7`ZR`ubg.W1Da@Vo2e-p[AXjQ5lrGoKu}zDX6}{`]794ix[W'o$y%|5:c ,ik{iFLD'K$w5{FiN;&#/]X'uL.149= ~)&k Grsi-_ykYu`B2$_?gV[@ue8d"m*@j;z;fy'gGj_>l4|QuVJOIB?B7TzZE ZJocC#26~ VUnEOg_]1I1a}kWE!:)65. uR~c-Ot"F_0 > ?G|VQ!iFx ,vxipvugp #9/."viA3 G3gk'oH3 Or H<`>/u+-2KPDGLL/ #Ux P_kw^;ys/`QbR s`X# )>Y+e.sM%4`{ !3DJh/A8E]trygb2 E{"VCI:{\; )5S_`!jE"  @6;R`lsW,Tp&,DSVU,g%ee2xQ/>Ci'3`  );U"Sws@j-\xpE3`AMDS'qO?,.)*;de| =WVUaSC+%');l},El)V*^>nCX JQ U/ ~{fW3'.( waW=GDXlZ)b-ip1^ 9Hu}wrSOu_;zKp?{f3\A!oB64X>q?10{8h() ~hM2EjgWCEK1`SBAHE,DHfIQI=.6-4p5:840w+$w G l@ݒ֩C֊VTѤUɖtӾ*qCm_;z(RA?R#A "','(%p+l26;:; =e<:o9+7$;;3<2:452l761^)8  > W `x1ݶwܰ#Fޕ޺)н#ӬeUD41ӶҔҤU؋w8  ޼ n -!R"%*0;9K91-*'Z&%$&'&$1!-> u V= m *96*!*[16D߂޵ҤUPֻW܍ް/nwa+3%AS*B aKlI "#%c# $&**y+d(G&Wi>q"Wu {` QY Rd=܈(U׊٪ܩ9Zޕ(:-E e\A]&  i iphW " Jtn {aR [ d#9c0ؤ֯֊ي۱$=:^c  _ L  \ s -  \h` :aU-ip efa`=rScIpGU`xfy ZUhb Z5 r D ! l "+GB} C D dz= oWyur<*l8s c7DEUql?|[rvp h$1iP 4 +  # a&O% b K O + ecC01.5wPxiE7=_mCaS *7kb}u+s $ ) d Z7bZ.P ? [J w  OZN?(~cteziPb3f6oG7(t>e K  3rU_6#? jKRal\)YJ"CD5Ag*Qo{vyn#?=` "`/E z FYF_ % L(pu( eebq%FeW l8#lhjGtfTjF [hU2D i "F$%i&n&%$"/ y5HkwK Nqu>ajDrc*eZa;y<,8?Xw d nw'!!$ &&&&&&>%# 1-5c  \]K rY.T)#/vw'[ +[vP]ec"&gKz Lmj8!o"##!s SYtrVI 9 6=wrDY 4l ,z-y'>YQ4c*\ x ? jR,rr'OE,t|`o?2m EG%fRPhi$6(iq-;u-~aaE?,'$L kw% x 8 *-/ y  6  %b.@zhai7#p, kOj(CHMou= YnM\Q d ~ = r D&J  N  aV*5h-$aKI+ \NoN? !H f =b # ! nDQ  9 1 O*0b&|x }38@gTa_/)t??k?BPBhB ( c z oPCk+5t- U r 'B:<+>]ZL8R9msfzvjtfW.s%CX  F 0QA-3r#"nF(nCt S<s*CY 44",D>#R9>:r]uk_X*_< r &:JDXYMUwz'T*C F 1ZK0TEW,qhGr!d-oheWrvP]a@%x PNOl m .;aIa~/ I OSJ0cj;sC)? +k8ft;'iV1!~N:D q 8 \lBW q c |HVfD5;Pp!H:hGm7--Wh`@ o i q - G $ I r5m+ v1UnbLxZ}T@(gE\HMKb0Y0pFETu  q C d@8yorF ~$f~"0U~gRH8qn1uhr B }  ` ;-1_)Q[} GAlh49K=X,VlpfW;K&jcjw}gMvP0l%UR[$  AA,MhLS %yoV Mfr<&Y0)n0G]8l(W"FMZvj%MYKYAW# `NPx1RcMC_#$tBfx7hy@ l('`a/'>.j|TCr    1  oAE9h^W$B+{Ae= 6h?Jc~)K/d(7xT[* ~ u 9 . 0 W } ] ;{B(&]JN$QJX_[qfU3x #&'7pON dCL4~$  k - x _  K 9 A 'RH~T_nhSA}&x"a~]_Ki3u. V ~ M 8   w ( RWWm{19ku_`1P)-v N$AlS4x0}+zjE W    O  ~ yHIa"N\E1$> T2":-RBdq A  Q k : B  5D28_ |VL@9T,\b81c.o2TGB|LLq-_<|uWFkj0=9cX<?b^g{l78p99FaC!#;bx,9G&]k#n&7JZc/ak-8X l x6 0|-\[bRL 6vRB&\@:TP#xWo~}odPJ^joR8Zq}pO I`f72]7]A8 U`q2v?Wy H=VhW>m#NsldOa<}cqm;94,+.LXSWP <TyovhM.!2[G!`jc>^yfxcu _I4n?Z *$0#&%"wrfu|nM6#QR <WzjHP Y.< ~J$g(z  Ca<"KB: &Q(n_ntUWhoN_?;l=^6):0_TEiIxe _K}GyHOox"6HbQ1-?+P>FWs2V,$0fm TFi_CNib&+g<?@JMKu|a.'gO`t<J6.a`U| d%n \jdifb_Y'i<iU8(,H="L*k-dO]6*MNz{H I_7X8x~K:%1aL-2zAw!`lAh"ecUl\bc@/x.{<`N| Op $:f;E\- >|,_Q)D2W_&'czR JE_,aG>,j+<Mast]:u7[4NtC$V\/Y>nAv9v+\?q .R=pQE a(L[ f++@x=h)[:bj 9BY8k*_xj4D U0sKdA lZWYq.&,.*Bf L?Shu#:e8~8i+G e3c,} p;;O\p0ITpxunVXk|p ! T#Thr^b[FpnSUQv"U4gt KD|:Tun7 OEcrM1$neZN>, njH% #bLu5q')r<z SmvMu2|/dRC."x0kH4tT9$wZGHdIX)uU4s;h37:kC)~a7{d:}b> ^{: e^OPQuR S5~0h1gNbw`>yrheQ9>:6/$fXJ@2wOZ\[>#X2Go-zT6 ,;Uq *CS\[a`UCJO^iu9Tn1n0?`tnOC uCy6|BogB1 ()9BTSds~.Ck}<qL|""Km}N/L%n9mS8.%oojtsb`bD5% -LgFiI8a'GRqwspZV0{Y< yN,p^>4,('-, |sZ;=0;PnKx"d 4Lu2;<36$ s\?,bJH=.04"vK1{yvyt~$=U        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Cowbell-Soft.wav000066400000000000000000000443721366722712400234220ustar00rootroot00000000000000RIFFHWAVEfmt DXPAD data8oq:-=i!]'' }w\*3 Hi G 3cjXe? 5yW'Jg'` 8 ."Q ~` 28Z ?w,! P]PPa?=\$2tT`N)rQy1 6{?B c Ei"#h ;&&+("X!7%(6 MQ6JR<@ m|A#" 8!$+[.~ %G+158Z97(0:+;l=C/+01/Q/("t7/  V+ } Eh&*֧] s߲]['ο̜H_ЏPLRHܞ_iw6F -D$]$!t##%')+R/Y13G4468-+(.B<4=&@ ;8854,$ ^ :Exjlj;ީڤװм%ٜռҡ)ލqa.ТXAѥw(PV`5Wz xyJ!#% '+^/2%446=<$:%9&3092V3f;63>* $+*)&!%!& / Gy}cwljBBh`ܖF$s U RgzCFu~yQT4~)kMg$gQ !CzV~OO=z r CFx  b{]H  r y z `Ay2Prtd_>~soHivh[Vj~ti$ B' qu`'[xFHz7yE <$ Cvn$yDy!Bx8hH%Ry|PM{1#R\=` v C ( 3 K q  w ^ W%q i%29Hv|KU jC; hz 4Z+ .a.GvFz+ e  q 4 q G 7 IV[E\EoB}DBP-J]!2ChzGX>P."I *  U (b4l:RDK- fSG`Bg-:n_ZbT MS0 19*  y \  h|]iKZIe?N;G 9ncpjL"[n5+\sj k  l L K ~  l   F 4 yl=rm?fT),:|cX4hJdJrOc.h`nwz 7  t^ . p [ < PZEEn@PUHm3RIn>I9Ol9}^6Re (HL4 3 c=v % d  xr/Ez ,;QVj3:,hm9K]#J".T_wo)Ch>:  o ^ ] e Q | = !]Q EE6~7?NfArD5S-id xf[;9u}y  b M C }Eq3rXSS x Q 5R5ccV3QM&4`;N . WB$-K *!B Q w $ z\Kx Y i  N Q # c[vLHC`jP8^/]/O coPFF T+^`L b  , (R M *  b  8  4p! a&W0U/fG91oRdMIlanvQ, * V 5  K I X & z  Qv\0%u${5>Gxa}\iClH6gyV/&,}>8OISNU8^xLc-p9"b?]Gt[oDQ6k9su#EL7NG](QzGwcd4^JUaR\HQ=UcTh&e 4~_\(nkb=|}&emBri% 0Czk di\|?$B93<@ \Z t*Vt9A[Y'i<Zj b*PM+<@Y{yXG#$1HmmS*_VY1f )o&6mTk>%M2QabJ}W29q+gT+3)3"2  VC :[%mOM>a bB|i=1RP[k4  +LBgc`ZhkMamp4#II%C~b=}5@Rqe{&"d!F:Ftf)o:|PRlt|V1d8:0 LNMs!HHY0[+]b~ dnxq`; #U~=BMh@?p=[7e f.5cOCsY$b]w-a.56b g*n$J1UQx^Z} zo>N5b-DP70')mg ~~IJt7bT8-8[4J9V1n% 6Q m$(/Q8@Bfs`#X l6boQ A&fzm!z@&-n)G_,k ) U~nf{} |$-pP [RX" HMsXA_Yh2+<[r&p]"KbrZF-8 &J2!fW2|5X,'|)Z+64n2T" j/BUfps]WL]f.[uns{iV@7.C`Rj@3lt9 P-+U*_/;z!UgrwmVE8 +YY(-Vd3|kww9 `@h  /D e{qZZ`<m3g(*47q,OI5w$X\@#lN2)5bgB+@Br (V<.FQEZa`=u QuK!CWerxb1A+3tz8wOi<o.f+%.T|~1op "?\`7"$=yM Ez J@iq'4Lt@odw94=VMYTr;0t@j.QKV 7j{}Kek&>p6z[@)uO#aSu(v5M/v#  :irjs[# 1 LmzY Do1nEe46;/(9dHF7qp]yi=p[#8 vP R$~EKt#wD0Lu,wS6.m+E\@j[G< X+c>IlL7#%N2*Bi'^TT3b(c^)CWO]. dU?C2{vMELy7@s?x7zXMQRs> MY\*Cb Aq *"(9Hg{KS/9h#Ai?{jKMu%fCfGj2k,GPd[aZfu}*5>JVdq|q{aH#e@r7Y{=h,uWy4^*j,PYjw.Hk 4YP&X`>EtJ;& $8JY *@Tcid%-E_t(.?`guDm=bt|jD" qU_![g>(xkik|)@d'DE`x)Gb5j+>QgCE vB}Q0 "0@Sr3Mv-T,e (Ko|[8 c:P a># {unU>@GNNIMTG>0/44-#vKtR-#Ei4`.U0>@BDBE5+" wm^T>0j;{^C0DTl+S3\m xP#l4 vV8$(9_1Fh:K]r{~  '/5@GBFB;G/}V/ t2 ogU90,-CX:Wn/D?<KOOX\ty "/:8FMZ\]SN=31f<M"r_Q>.*0No6Mh  (/59AHNTbu*8F\cmp|kJ3j2 kB xeSJL@B[gv 1DTi{{(;Mm 4J]i|rU/{U&z`J*,++1*"7?Wl{*Pr /A]| pJ,qM(sleH??4,  .I`}3e/BZyuZ:/ rU7 wpjhgkj^ZRC.!wulbbgp~:`Fg4Pdzp_S?4&~p`E42+ !$ n[G;7-  )7OXev  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Cowbell-Softest.wav000066400000000000000000000443721366722712400241360ustar00rootroot00000000000000RIFFHWAVEfmt DXPAD data8l\6 "7a .G?Teh{*c2Bok s,}1i^ $    k`/M hnRp(%C{GgJir{=Pv'D -2 5=ib 8u .\WN  r O m/`) ;]܌g܈yTI6%{z 2# A  >#%'('"))|+u!"i!!DD &G X b%5 ݶܷ F8HjW> kORw4 m%=X=!"$%:%O&(R !*T+j-)((&+%<4 a.u}npߡ~LW%wޙJnRBha hI +R 2=l!!i#$Z%&*))u(6$!#X$ *&+$|-vk@G  k}#?oZ D)R-@Nݫߗ*5YLQk Mc!qZz \y_!7$"+"_$$)$'\ _f>w|DYtbztpj"{o(es\ ( p\EvE,+ n.u,7D>Q1Op AVpQXUM/ZU 1 % ?  3 A Y a @0cR|#S)`X KL=9#AB?eL-N Rq 7>e< ? < n^K vl EVU*M,VC & EKVS{|`|Kgq^3<ec3 : U P  : :3/t}X$+OqeF;Y+eM,KLEj.{1NQ<U8 ) bB%QOrS:ec3wT5btOl#S32u858\MP+_oG }bU5w^*msZn2X!g::Bpy/L{8B0a|%KR1?J;v\_LK5 3 " 3  ,| tt?`'r,&:a+C>CV=-.4!Ew:v h3rZ  oQpm H Z j  y ~ F  \ h "6*~0OoD`?/jm$ 9x$`><6VjQ3SK 5 v   _E Z X 4S+X G e P aDR5-YPk;wv?uqX;ya33x:|36Po 2d|J.@C Lq!" + < A u Pty#4Is\,^G1y\]PK?8\u,J=Tj QobztVS!{   h.d>;#_HI 44k(]5 *|Y3mnI = d M x>AC3Z s ? K ? 'fZ ~HNG9Hp?azJ|%mH%cKIg9X @   B<$V$4* (OnT49:W|a?;,< `,PlE\Q(Q2v[co Xrr4 @|"\5z9\ZwD,@N=KAZE~bNWsFmdq1 W[5lF WV4 7S\ Z+vzqrI+5B"<|&qjUdC2,nkvs% c LeVM jYBlyljA 3Rn`wJm < '  -EQPF1`xzK=+T?zu\1k= j"DZ;Q- ; S g u v    ]]-_" [.%fLFlV04-vb7J8JT- eyU\-     X  < (  W;&E`S hjEZ)TsAAj YKk5oo,5h/s2 {cVV[Mz!' r ^ P V 1 B C   &%e_xi,&'4hv2g ]/.cTs -Su(w< Ug%c V g Y l $ n ]zo:'C@<p~xqYV^ n ^dZ} k5BVp`]M  % > s # Mw^s[WBGX.DXQ_P[7G?kz-o]|<V)8I S  # * DIwegf(pw$O2gFe@8 07ARK>>SEx?(ZyP~2Q9%IHR/tH?$a+3"f)sA8OWHmaPdMVjQqK2"yt6m-r"sdq7u;loH7eqEN{&{-)_%# >hW0[~ ~A8uz#+ R ;d4">9;%  [dY`RYJ[3 KP u*F }2eOMM#wq 9fjN9_a$KV2Q` 0HC(e-  53v$*4pW k+dwn26e K5w<~,*.""b4HRz; Mg-?ice6e 7bt~V-$R/=M6On')2!AMqB82o3( Hp0>P.?Fk s0l[4_ <h)T >i*XO,=Z}:.oOwz_hpt9}qzzO m*ceQqBGx/cv*H ]fE={ a%Xk- RJ[JFE (gON)qACf"kr#W\$O`]a0]+~%q J*IR|@.HEa gl)z V?%8O Y @O<-%7a[\6WxxS- Rr4 I? sYI !.rTo};pexJG0~ `H&.AB3^6-[<..) m@b9',Z~l'oV< ^Mu(}w}9X'`3lj..q?JG /8AAb}Y=yC?I#*@P4\um7Tep_Qz(:TC7 nQ1 a>jk9kJ sY]q OgGR KmZn$Y~0w1z =S3 dK;0:Jh$Qe a ^;ESagTP9IQnN|y~^<UuA(?T%Y_t4` !0^%! (EXp ChFl*t3q'_mYD5q*\%SjT%2)M vRV'HlK+ zL* 5/Y'5RcxC  Pu&Pv 2Z`5j0zL$VP~Y) 1T  1KYbl4m-KP TKt Vk:Lj&BnyvvaG!~cD " &HVz6mZ[ }%2 &BNdbccZcQ<UX ?{@eYE/sP#0>RUM8H O.~11t0o*<T^nj_VHA0o`8n&yS8eHL~D. xnig^ed8~5m&q y%Oc4`M5\DCb^&GxaRDF1'&Gn>$Y$EaJy<O]Wa@&_;\5 r5]2 R)W;n W /Ee}'8DFDOVakbjr~#/u>^(d"nO+ wab~)S #0V~ #Km 5L_kwvui;wP&Z!]@*~6Q]gapm_F'tS1 xeFD73.' }enz&;]|Ao=XwgQ;ycM1)! ypjlcTF6$s_G;-#$1Fb,Kq *Do 4Pmr_TB6!xtvtqpqm_M=1lUH0 ^SG2/'((:Mq*Iv3`~'1BKNL@;0oaTF?2+$Y4qZQQYYbo 2MWp <\ktwd[TMB;+!uW<' {xy 0Mj $AMZr~~~qk^T8pS4 4Han})5APW^ijktvqsttjeY_ZafwjX<!oR5# .0=K\t !0,*577>ARZU^ecdkqt~rdH* cF* !0'tP6~xxpj^RTTRTTRY\ZWVRC885::101" &4DSl$Ga #)8;@@98-+tbP<& {lcWK?:.)7Mat1Hj r`YOC0$# ~urk[SPHF>=<=:?KR^hrhydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Crash-Hard.wav000066400000000000000000006133421366722712400230350ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data   wh8'iyG2 /d T !Ozrbl> a` e 'G;LU:Tcf^3cDqQ :-!-\$?bk%30\7te w E 7uRq 3  Kjf'@* Jr[ Afz;jJ1*CU<We :GA:R)oL1Z>^%\' % 1:a3g + |{:5]3 YiE$ 6w$<1r_A, ,($?vߏrbz z-ߗ^c(  qA!8)|dnaI80> Lݖ72xF_t~^ X ! h` $ ` Z 6 u~)F@!&),!* $<>`l*8xaߩP'+qȲ= ڲ_ECx; 8[&#&* /4!769.|36671526/"&'%!:# ;=$!  uXosOْi\I>Eڌvb| e "cX 0F!  'B4   [ R ct<;0byw&?tK  U  0 mod :i T $eX9kߤ.cCBet 4;#d^ _ t 1o#](&$%%02j0+*%-G*+E,-G&"P%~G{9t -՟vAԣ`ϵ7p̲7؆WWR2ݏ܀Qsym#E! 'Z!!**599?>9Z7,!$&M&X)%n  3[ C   t=Bc}wQ˰}4ɟ,tHҵͻ+VSW 36K &+p&Y*-3{7>?DJ-KF<;b:735o9;51+_#)Y$X~ aMfFمzЌӘӓѹّ~ޥ]u؉}6@) q0) >'HMJI%L ] "Com ]^u qGgW~YN( h2"U* {C3`uxVD;wVZfMk8J~& }< uZ t 2 z \ Y/ +R<  n ]9#7//KWsm AFfX? {{=B n`w$?c!s WWN>X3PG9kJko-'{B(} aJ4h|rJwj b|:!#D N=D"$'&$> XF ]#?&_-:S5j.#umxYw0 z q }6z5 q %c>r]>?i7@r3u+^gݑQt0vC YTDS56<F <<D/W n Y8 pB*H  M>\ 4< f !qk 7yLh) 4KZyh{9`2 fk_vI F 3 O{= G A&G7 ) k(  zJ =} P  7+Gd k ;Y  iU{!WM$+N}FesU o8r >"g. BoY5Z g % &j SZ`% Oi 1nsfPܯٵO܅ pe D_1;| 86O y .iN30iGGd +uc    3y ldc:!Z kI 2%` K0$~wq)3e.$NI: +  $] 5 x h ;w3   C&n M   h!&G WR3 #q+^,AIu# I~=G X-fvniV|(J ,ށd߯Cd s %  }۳Ԫ-9$&X^f]gE 5sy   Sb0t94_TG*d Wgo9Fٯ cHS l $S      -#u~ @[ t ybRPo K\ 1Uǽ  qޕg,.3*5 H@x&nd !+-Q N M ? ܈@3(QX$wa EO7]"ی| t? @0ޡMQ"Hon{k &:7.&6(/{w.e `  ,)Bj:Z6j܌i= ;bٔ:lr bv d  M9 + s,o.#v!_= hL ##cb3$(JgO# / )1\WbD `yvdR1`| h! I 2 e#"U.$2 0XG5  z"XZ8i{o h" X-zwMBg 4 ^{! 4` "m#X vkR7  f b X U ElD1Ki y 3;M_\;zhZ5Rg uBs2 5 XICn /xW i 6 D QN0e3z eG5V2?s]. :Ug+;ky.  r m&c/-! u+; x.T_ld1ʴ! ? k{hA_ *$"SJ)1/M&i*~{" IdJ֤mN[&1t3$\A"1E ,.!e7L{un $ ' D +I :o. 4%?#% C Wd'df 99^ mAy6k9*g# c[]XihD LZB & # \ hm'/ .K Z 04 !'!t'a_ s0#e  )3TfcGrp,8s2\Sc\A{7d + : KPq/ Y   i q2bjG "X Q/y&1Zs _cT.H ]M s D T^ ~7 G tUd.F s F ;|~ a=, d4 I J`4K=Q %I Tv$`0 qXfb;} NV.%=A c9[ Z,_J VS ZM F`y }t a'y L d'{ qG2; <@   I=$*"$؊& > Hf  8&IsbB8Vw Ib6b٥H< 2 2 te\ (z}(j nn4l Z%E uU K kL<1nW{+t XtGjiC }y utxEAd9SLc m+ED qS zTs,: nos) ua@-_5 #Rvv u gf4 >#<ԷހrJ"UQ>-(5#x`b = @!F(^  6GrG?1 Mz40?F ehjTm dV$d'm] {ݔ~zW} nr  ;aY4  Rz?DDG  i b z  5 N oxlK :Cތ%0{n irb(p8  NA uZ7Zmiz(K =Sa_!!VSo%[NZJng  1I0! -fI. x ] K]+<Rf UIK* ,%@C Yl`&9aS!j! k g Rl2RZF\TiJr_5  Z K d zz9|PHN g`Clp|8 R n +(To #:w% p   Y,XH cQ;,5R2XzL ~z ~a=Қ߭cgvF "-bWge%+i% 9 b 3Y ]tDz&{ $0#: O:8f_gKJ[Ip ݡO<z)Z   ab 9Dd] $! V O' (WbB l3vX |0 G n).E9 S-3h1 s|~: ung  oLSݵiSQ!_ykv73 2{ %Js :}~`  lr g(Un 9IgW ^Bs? I* {$.UB ]8 Q i y*# P W(+wQo e 3 iuQL[d#- % k4M k0`v j 4yKM5 5y* N" E,b\{&]2KtT^E" |X  % MnTULU /5ru:*  gWy A SL8y:9x0~=Le <i )9e) 5# jR{BF0_ڃ(, :Il ~6*udc] [ > -8W FL2 ` >_e x 4 pcP/ Q*/ o)-t3n-bG..s  ~("=>` D 7h  O8E - w@x k  sr-#bb;z7w (  jZx? $} +sn/64*D|Aj"?p 4 CdVDE\h ) N>(9$a-#T b ;k7 hmR6X ]_ c2$!I H7 eNboKLF>m"["4 3 d I  MrQ9lQ! R}Aە ' 1` ' wxLD `R1$/a[ s?f}` A| m Z&^hiPG < C?Lf,k:BE. +j% 0 | , a( d% okF}A |NA$3 z0u;!N !S 3t`Qte lV / [3 rtD o "b GI 7_f q wv[ r (bLJZZWB 2  < g  }HI%:q a7@vu O y#CfU .-|:yhF k սؘ : 4 [kha +B  DY"=>`$K"d 0^ '_ 6s,)H6Uf /Q W yB@L=\B ޽-( H!+o = Nݽ(I K#@xlj@* _%/`h K & a}-O ]!b C`!'U kZ9   ܀:L$+"&o7ϑ̄5&@-$&r%3+6N-dU*YgWb8^S 7? 5 ^bXh  ~jd !,ql ~ T1| Wh|L}L2JB%% 9N |&p] *۰s&S ^BfPj<`1O8 qRJ M "] NL[Mi N )^b@״E E$1MV 8+H,TG"w f b ycTJ 3   ZBx *=60:]4BhZ@{|S^ = |  CrfR=#6  q>Sx\#f#Y w-W= ,_)SWC:?-/3  h"#"+J>(Y9hlY uS [ b'c_<m ;4/zH JS!WXy# \ L N]!  J W~#  trrxbHWV.#>*.&J.K=.%QT >,p$d F ( 7[/O]7H#n o'd  l ^rh+~ Ph _Al ~/ R 5  e Pg[J( 6 * J>1$i|) Y f !   /Vb#=B 6G>1t r]c Q'XB c~au ZU&b v| x C0h O~]Sm"(OIz 5 '  *[fb #  g'U^tG E H3l3eT@A UmFI.=X/qf%OUG/ oz &Ng| 4!{,T3 Q >9>n6<  L+q-/-MgB!fddZr _ U /6S VUYu Bt cfnYKYtePc x"P=  b=/? j  ba*I+8t),!} o#>x@>+ 1 T_fX 06O1W:HrONCfK.| 3 !f 2=* i y | RAa  q408k+SZ!n] WPا$x | 6K= \`1   PWu$  25C= > u 9 BOqzh Z{! f.!BUwSftor%/8 i qDb? !#&|I3}3n7`$ bXg&) fX: J5%R" ] m - 1 # }  lW $!=HD1 0P#[, A O PY']n , p EQ    C= t^I X) "$n`ݝ73d }TW l!|"F]\ޝ  DM :+h-g# Z_ U   q "";&7W> CQ 0tG? ]SJzkQo~ |D Q%+ ?Ub2_ށ9X t 6 Hwte   G8Yq* 9.. NtpvB :%D NS TS.odi6? s 6s Dixf}2  #=fZo!a CQa  qFK/l "fq 8a_\ y4 @Lg:! 5KBDc L m]q[ (dC8 u-7 r. c5S ]x"0 y lymd;&EHP gG _1aM %c .+ nu o4<mBob 9 xjB;9 d^\?7b Q zQv Pd 4_[ !blJuG ALbCO cM< aj$sD!p  +s))7DEDdh Q Xa6 c: L? ThF ukBY [oY C>3 e 8 GzALl}3"d$) "(_5kt qW /sj u g ra.dfy Z&&_ 5p  (s !ah3, TTznBy_ W %=HH# BZ&$%.P]K)Rl   H4LGUe ]?@F f | W[ [k` 0n  -FS; W=  zYSbCM G5?aD8 = F-z k 7E"%&r!. DCE3BW i&{ >p4 T$lz[IeYWDQHL݈a6:`8"s 4 l t =$ Ihu} U#'! R؄6%h ;U$q"޵8fc ; w1/w!- T")*"&^rlc| J7  ^$&;p&'Dwnݧ=t4;Gbs1  J )   R Ow   AfP /#Q(+N)+Y"MY;(NO?)Ly o{ by$P T is  v O U g &5Xfhrog":ty[:ASd^p u $/ G Cy~R  wY O*H  s3`qmߟl Gqb] 0W_.|7$mY  | i  %0<ebNsbaO4LL/!w N}AM 2h^g"} $ Wsv M ps!  { } .8jv | -l_( BdjN0S  h9 dqH g?f aRqB#XjV +j} I )  iNAaEe#V pXS 5C t S |M 4+fE f wi- J Gp>  kniWs 0 ^ ~ X ` y ga w &llbT< J 7I:G K (n/ 6l c `f fT#g !K z.},?u xVR y9~ \@H&@Jm 9;Ca>I?a0,   =J1xi W | xeS) r rX 4 DWrz_e / ^6{γS  l ~#$Yr R .  Z f" GLY-  -{gn#1ZIl   & AtRIqDSR;-9!xg{UFrck;vfXsA$)" 4|Zb Xt +{LU XS> -P6DlVt 2@$j qeKED 5l#%!8g6" 4 Qii! NF> DR];$})p+7X/4="R_ hW3 ; Y 1 DTQUI#K# HWc ~k?\;Z{'Sk4Bpc$Wޫ(hUSѬ4=. T 0 $#5 F588l>Js %-" ,G,8K+i} $9m qp|F S( 4MKC  p hx h9mXo5="iE$1tbcݐA~kL6 6o jZ &i= nn 6$ Kh#1\S v:)ko >gj&9A Ewr}}:4sm "$@k. d da Y[s[ {B =m! L/bevi J; % K2a{8 i o :aR+UVO 0 Wi2A\D+lWON_ 2 w WeB 6 Z R T I %bX7# \F i1'Aa_U 3dhAkdf >"P J(z _a* :=$} iA > _dd܇|{ `LT^ !e 6MV'a R 0 8 zRY%2# D+U  fWCV\o+9~H!hy!- s>@PhYi Q !d21  (pPWD  ^ V' <CJu/D  p7^$ '$6I3W > J 0 ^:@m  8Z0 !  +m I/V8s d $ `}JsU 0s [3P 8J O]#h?M ? % [EA `  ]\ Mz4N84?nYO!XFQ*BM6mcw :|xCY6P R{4'k. 6^  0;*5 %XP gs6m^m_HF\%{X5(v &24 C '=]$ 4"Gj  `dSCx$aH =)]" F*h{{ VB < g & IQ N1T&E6H m\3kG?- ?5_z^9!}]` AiVST  9* V c~>[k%!V}l_^!dGRCw; J* J |c4OBk  a'{ zv CA]:\'? 'h+W1H IV  I dvP~+&h%,W [ $h"iR sI ]y c5 $)ICWsPeR ? LZ =+*N C/ Ah W ? U Aj h:  M Y-,z`gqN  5E ^\|  8%xZB^_  HokO ]~2e  y+R|#yqC} <U= tJ+f0k DbB  6t8?  M )3 _ !)nV  ! rY{>q(s]u~F5<3 Z V B !\ Ka[1o  P  ~OY j; qP[l2laXnmhp5$e y  WR& { q ,R(  / \ :u|Yj 9 xv.TY <% # OUNcrbV r bn0~, lw() Y SC E Y/%E6O~Q@<tRc `]-:S&l.9y0& ( tJ*YpyS p Dr4}h)Ti8|xFl:Y  Lkl} }{'j ], j'$  H$  LVS 8  k=JtoS H ko<<E 'EZ G = 'XLq/G`mY`pG64Yo'={  dS8)ta,{ ! J*`c`]\C ^hY5XBNKdD U {y%> C44kKi{ 2 d 2 AYy ? .zU8T?{bB2% p%qe8 kjE  T h:#rt4?ex6 ]   )v1r0bK nYdE&9 t.ejEPw w /  [ :V3pYC  T6}}fbL1JpC N\#v?%_3F 9Z ) k  0z$V0myb._2tx=f aay tZRI7% n L KF;\7 )-o \uI`=,\F:*Y#E+jC,NbT4Y1k @yZ5|,l+G\Wk)k3DwB1 Z!7 I|z, [F8@ &   D|zm Q+2qF*/$&[ COI    [cJ,E umO 8 ( uB;|{$Oa]kYZVQ4 Q)rH }HSA5PRH k f >~S 3 Y ZLkpuG n $3Tvl2.;0Y'H79,0n"% * lN?7SMs!\ m}  |([N  ao#vQmlK4=^gLC%;u\K=A:0mJfv7 - 4px !'JW}u~ a : ax ml0gdJ ] 3{JDC;c:3 EsO&][ ,t4!-YsU^ C  r> 11D d dU{6qA\ZOOgS } [G+ fzFh|\f$?(jk5 /6M2 pw?S /ru{w 3 ^nN6- C L O &B^ *v<s U '  # bfH 2 _ $ Bv"ue;p(  xEmO_kVql?A1S!x>~';F+}Snx >i  [4( : % ~ Yw{{O %=P].{!J5+?uq  qwtDJrKtc*[!0_*?  * *h  iCx?f6?+-nNtS_ { `0VST'b  b 0Z1UNLBR'1n[ j E IP5{+y;ZnOtw(4r3W "5'/N  @ , $|P&x!9 &"Ie0 OnRpBN= &Ga6mm R K]k !-B{| \Di-dZziylap9@6S~'C c8y [#+h#  a Tp 7 X=mWg2L Z ` ;Dr ,{ P (fH~h ^/ wo*Xk2 u C q \TNyIJ;HopxTp8_:{s ^q2+ed5m F;h%-  i8>6 -` 1t o c y08C~rW'<Qtt&Y}T;`E+]-T. e Ckf P '5yR2 wWPm^l>ONLF,o LuXu2VW$ +LcM8i W z Nepb> 4 FHpaL ;Y5dY >s PYrcGr%)! z   ` 6&[ s |g*R8z e>6}qVZ^!g C hdR1 W fwEI } H7wm9 @roS;]F8<u{As?@ , 3 q$X 6 lm $ h%`R!U|d%*=]L8 . _ /Eq|M ? #qw&]/T $XX%He  c |i6L8yn 0. PpIg`:d@cTe7=qy7+h $ o vR3DwN!W{DItBT3O{ >3Xr @U d R ( [ V 5 .I/U O[e^ |  --B6kb+r2jY_ {?" % p 4 ^TS@:m yWta1%MWVl>| Mjf8UCO5y>1V A64r7  ; =Gr>|| H s S% ] 'n VA3BL!VDk_VM^ t rwo4  cp } ,yu-3FChRw_Zq/Yo]  VbS; ["D    &$x7l]& pC?lZ )V9 ){BY ` B P IhJC  0  ) G kwD g @ ! |W^>\#X%X LgN4Zu^@g {'~z F P V QRUnRw#&M  u$X ^?!r(~ ]& ?3f]$L F p_1~ o K,`]p V t|  Gy-pD  qU%`_60UA. ir.b! { ? Mtf !g ?/*WcGz1~ S( IMHSn<  DXiJ fiU.3pH4{X! %?u(  3 k0[4gT5G)=  l[MJ|PkGFT*rKbv's 8)[  \"y S|3T . dN 8GC.9k*!_![-f;^?9H!48,c/ ?3b kAy E!= U S}s=Q=VLLDb ` mI(<+L XKK`293W0jSY_N0 bR & F F wXv: l_": y=t)o1La?,Y>RyNEXJ4mp R @ u;#@xo)@1vRT`0&}q0*}u4fN)Y<IVK W}`nrl`I:A(cgXWO6O \O81`bZJW>JF@u[; 86fr D_\6'}&$9$%m9+ p/w+;6$b:v .$) F5EH_:.|2   x S P [ ow`)KgcD3!P hq~'Ojm,|' Jx $ m  w|ze`f8aF3rV~N9~/z%RwX u&H] <  qU M n `8 %W/($uv%\" }f?M,*7|z\kFrM \ Y8vB$ = 3  \! 3f g\F/v%6fwqa@In9t Y]O &VE:A RuM w *Z?L8"bPzj]H05@H97QVC+f]!GD]RBu7G!b%Zs4  1/ - 5wbpk:]aXnJ5~f sKJlxaiD $E [ bW \ y:Mq\nAdOS8wa4\ [}} b$H2TJB1*/2ydSZ-<"T  \ )a 5C\MGf#"3%%1ZW8#i>nPq #Twe, k v L 0~bS4uc'cS7$fx']P7pZSS1z > `%'&n   W8-Z?tM+E#R?kus^{tVL.QgWa: o 4NML.  ( DT/N h7ivR.6_A)|ijBNMDIpN=K?7u hQf[g |= #"fma904piReHdA.I I0v'kT~s 8< RB,8 r? & / ~AplVOn@CgI p/cDo-Zqpq#U g @`t( LO4U0/bj SgtYejT psp W_BL\[XQ G 1a/+T 50&,6c_0%ez4F vw)\e UzOz-H.{ 58o&|h 83{"xx: { s@GIyaU(sIbe7"Mh{Xeyg f 614?I95 g % U1d`Ek  l2eoPNs'XVZfeOeN_ !l A `6  {sAp?l\"x"^\{JO# l 5}UbT1U0HP9zJYLy0*bp6;J?, Dw+9 B}%>AKt*x\84 Iy]Y3un8}P%AYf8rB-n@`J j ; j&zDP6DxRb=\^]?hS.,N0^R*v6]O<w _kl+]/z k*wjwYJo0^H|g O8 p9J V fZPS1$, uSQelf-<1D+E ]jo95LFZR*f.PyZs ?@M>- I4J nM x<zrc/^ % K|$GFC%hx`   @n W ,|I '/ XsQPUNvQW4kU/ +  v2  MCs/ = _Oc6CU UUW3+[ mXhr6]Ee  X7jq %[(o=0=QYE ] Q!%bv5 f6i\D*K@1/H4,2Q~ K }4vT&CXy RSVs[a1,|Uc8%a) #>X}z D< phH   IxbK* Dm { N,ac~ s8` A `kMlGtqV l WK "m^ z=6Zf>]'z*snQ5Id%eFk))@`'fg2 y+Kb? b@`1z]A+u)8L y=HI.L*s`FL9F)h a| #yRwYD~Mco[H y 8 k]|_EmJVMR m-^^IX+SF{-N^\osv = & ^r{ 2}v+m >ngAAZbB=![Dh ) H_O j \P;7 ''U 0ug` (k daL 'HmN4"4513h<090-&<9G<; z  +MK ^ eZ %* b Jve)TTG_]S:RH^+Q2plI<=.wk9Z 0#T^lK_gU ~ 9>i{ymr 0% Z*c@ cqT!2J$llpGoIqq5TMB:8D K S+ k7Aq\g F 2]#[E +X mdHh*  8 CS GZ;. vGlF:|*D9Fi=T^aa   Wb4SBb/Ie Cd C_e% a j08nBzQ/ I "]Ap!OE8|n` j !{$)I  .z=4r? U }6rYb) NdVNYIUu;b]zYgfF< 0 ZK /^3sI4tW?,^& 5ll${&+]r+'S6/]X^Cl/ C8Ba S1q~]$UK$clGV?HXiV|k ^oq!M ru nP*-uzw5_9J6GXQ[8}sW!AEN3R'F bL5^!!P23 &^!F]a h 74>gt3rgi4% [qJm_y  D  Ii.&`JBn, lW3>X&[. ~lFm;cEst F  # HpQ:{{>wUq[;Y+8Q`+&N9`r9~Sb,'.(TG%I\ghu?DA@lQ&/A1RpTXI/m$WI,:T; c4TK4IvFBl ozB Qf ?UU1 "Hq"[iTk&N=y[q`9PyWP  >X @G`D"j2]& {=jBdQ(X@|+Fi O=\CA/:x {C ,68 '-M^ \4pfLt~9i  hl >2 K.94]0sTrO7l^bbhLZ,ChGwuP; f@"5q& hC<5 + ~ WD$:!KMoji% $q^@Of(/"*Ykf.B;_x6$ LOH6.R&smi JJn)  rr<#)|W TW;YCMel< - U5O+Z]X >mL,nTkTvG Z6nM^?k(c F;j:q5 &D ?Yc9* ] UP @/<2 9B3k!pB&'06gXp^\\F r7N3 t H xg@u8' 3SU:"~!F+8B?U  ]  o kyt/]j) R LBFU<KI8zM{7 /]FH)"o 0 %V ' <5&@_U l- & 0e8s {lR5t Xm~2 w3N/4.c A p  G+\ 9>']59[B6  w%Cx$5~X U 9`Km"L|, N p1Tz+: X)7p"v>*hFg/ 9 'NRl1o ` [} B*0 P>q9f3"/spid5S { N oH_.*z`!i" &CwCuzG`<oA E MMJ omvhLR *+<038g=pez*U?cF, +n q K Q+  BGR.P BGaJ _ .:L-k5 KO-V"0Yu^D^&@M56  z? 3 ?DX0HbQ4'Jhf];g| w FGD fT i>w]IJW94Ng&D Eb\^DoJ wyv0+CsZ \ C`tk,Yq*ek!c4 5h9}Q Od  F9^W*1N { X 7w3= ?&p@<, X F @D 6'uB u ]HCAGS>_&R>K;/w.r W n"v? 2 9j;L?># 2 y 6V ? ,'>@aR8h n9f)*O s !Bt>hvm5f J \560Y2 3 WS\YciQ$:K`?gk3 !|9   gy) [w-;)\QYc[ ?Iaws&{YW;,Hf_.x`PET[AFN82 =w1_0_\z3)#kX9cF'RC =M czStapq$M l] L&i]<EWx4I]gX*KXeJ0\k? b"h" "HIx@SQ3rohv3wXV{jk(DW4J?jE l{ f]c.N,Xs] $ Vx57EOni/'M?r&2=B  !~ P 6 S " _E;43@hY py +*%`t`  L* LDuI uM HU"7%BEgNB^m]* K ( f |Gg6"sf% 03LO$r/{qViJOuBk>{!kHc 1n|El64 e D{2AD n,ygDeJ9zvHH SM nm O~M *ff*@]t_ARlu?'8wrC@;|E F'vKErqw * w_Y=1/^l ]gQ\ gD-B}}c3W'`U]A y]fZ3   Dlfr")[+8%:8F{(Um0h3mt k0aI[gp!1^I%]rg Om}: A s 9Jt.hcbkjVLPd-tUv ) *5Y7 t _{C[r( ;[>qTNUI.Cr$Gm UH`Pc ONG \ b j^|[  .}m < xQM3g  <.h@HRbz7a+a  =jypJ q U!YmiV =!MD>+np 9 %Tl?MQdYjB"!DWt| b (~.,9_#8T)=fItJi t9A = b [$R~ M :  V 8Wm 3js`6+QP|u/NQ e 1uz!CX}HJF]Z5@.wwC1 TT9 0$*aekH+;LW%O>*)S $DIrN2 $ i /5>Hu~Aa K *|)0q`>38 \ B9uTXh*0C , j4lhoeqKP0 D T%'J~p'MaklxP f O={h! @T+u5 yiB gEC_r48hpm&) Y y ) W jWPH"+p cv n2 _!4,  !4: 1)+|kw< <,eN <*bQp, QbQ)G%X.Lo-a C 6MQF "}dA0,1T c&l2b t5h% ( )[Jh?4ZIzJRPK>wV )1E ;e015dvg - j uJ3t pL=#OUT+S2}Wz n 3AxA :/5 w.Xrw'wTNPH?O13:qcKd64q&8dkA-wHIFw}%qi0/({twYYHh$"CcX9 \,)2V!^o\)RF/{7BU:@W]>*Rk:L% n  b  D H +Kl *% hpu kcr}%]Qk*N&w=}1sqlmH 'BY|JB, ?Mj~t L #q 3# pBw$brr^Q+  8|<3NR H^~l)!U5[J'^TXJ`+_E =  ^C0 KB Q% K5D 4DAOmj6 U:N%}7zP  6 # /phwtM } UR3  qr_{.kHqjJaH o uF .ZL&, L5}@wam^KQ@,t`2 ` "4{4 { S;}EF  - *3 f4B>"Ih!X3Pj:l{V|13: pClxiST Z Q YlSOBL>v;01:B Rn@9L\",&FbKs(,1jJnmr{X' H - 5t n:qy863 cF;)CNX MO[X? ,Hi  = <OLd.  S WZ_{uKzk0O/].^q,^3i %. e e S 7 @C3xHi z"<(!EL@HY-O.`Co DTfguJMc)QiD 1! i)yfwNY^tNqpQ`0(sT }SR/f^ *@/:s+HRZ+j 0>\y2Y`!Nrr-O`{N d z bd ) 62 MD QN 6" | aj^}H}s,!Ih_OZ' N5tj 2Mwe [ Z|N av ! ]3w f2  A{oo[W& J!%"% &C^1VBf ;r: [ . ~I } ]J=+rYwaAh 1 a b;xG? H 2  7Vju  KAJ #}~{/  YHB\1H i [2jK$&,I ' =Dh<?js o!NreFe  \@NT3:, =b9 @K 'i5Xr 3Q66 9M zk J*u;PDcmSPp]MI6O Nn|Eh 2="X` e pg.%AITy=4O/w'P~QD 1ok|M%Qo[j@6_,/p{_6'}=[.& sh G tY!P!d L"0 GluZ^ 9 KtY0DFXoqRlGu.\*=t;nIQ * <5~xDH} P5r$!X_!M ,imdG"mCq(j}2NIXKGmK/5DA=WME+b9-rW ;a0 b]|zf`Y#,xk?l%Y9^-`ojfb1 Q C n XJHD2nl^ I,^Y&cW^8hj |>n "g)O[a)kc*_VJ:;RsIN gt<}NeR<fvWE!o> ^-eNH b";I/cuVpLEt\F L'83`+$K 6/XF|3?\$y1}|uODS\J35y g , I  e \`EF7&m v% Ht# a< a {]9 $!zP eMf 7d INVx:(|w}vjW`tX@>>$Z  &e0  $ w1[z;*L>~zqJOE`h% sa L LC   s/7v46*k$  ;c t M**_Vvnt2I$L;OQ0mn $? ]dzh{vV+R{C{n= NpevO URY H W gqA ]^i6=S;k/hP6_wTj 8=gK `0/y1 -\sJg!s?  b# lyM(_ ^ TV.(O%4bOD5,c  ~&m s&@@G;{O9:"')2]g JTU@.)|%x - I"mjb ) i 1]R.CSH0/~s#jf;ZB:QxU|u V6qpo+e *t;+ H A L %^I3S%a{~b%m* 9L|)25'!|5 0 Q,w`:3J8y.CLIIQM-Et3a ?oK&Zw*z Z+xAp8ae/+m}N1#0 ,d|H`Az4nf .p\DifKGe#?kqkF03t!D?l^(mI]T^/dgX_E <u)G 4z4"]Ak+ =p { > :Xt}|zV~p$ejb0+Li@*v9>6VS=V  ?Jw F  2mfcvAQ`a#j1O)] Y< =0 1 8%4ntv l8`&t~ j .I  {  !r06XsYTeTge L: 1  K}|3dIjlKPFYY^spW3G#Wq+ b\?H( vv> s < $hj Ds]M9Htc-fCt?  07$w x kZ%acs j &RR%M&)&&d(=^w4!M&,t/O*&m d$Y=fj.or JV{3]. CGrC%! g6uNh*QK|x#aC@=vW`R_ }%/Oh[{C!qtFH JD0H(_t{GxX\]cJ> jTy&*0y9E30   3\foDtqO/%' ^7I }&[^5%'1U,C>FV%cJ&a{kd U[,{ Ll 2$c ~ w3+ KtRGDYV D.?v ' $M r A*(11K:?PY-;RtV743Ha[aw"3$-g)4  \1 0 8< a^ Mu`77.!m\}O V3m;"Q"H 7|T h J=*?6SKx+s@:yd BR`zZ1K%3,j]lG33@)%:X6~IexivlE Y;9OKrk}|M;lH}F^!_DkrNNQTO!p ux[d*GyF60C"#\~)W=6fT=/mly4(/XB{]wG ` Pc:^pZ k!M[|{^k0iz3>``\1Td e W]amf T hODH%6TIV>ukg9~H2 Fv:p MY"sX, ~g^I8<8G>E`4*4A7le) fhZ%^PMhmCQ0C5;p>T/-'r=yu#lHY9KJ$^&l^ y?(j5'o$WI>*Uc|IB6D,foa=F EVB! T" u4OR9Xv>Q^ ,5"kWp\!M$N &MEBq@/a *?Y[6'3-& "?>Ob){Z] 5sn&+LXD96r57c &=5NT8;w9k{TpZs)C) h94fp8* 8D\  sok]>vV4/P?J xR0V o q p`6^Jo: ckRt i0U3 a N/ ?bbD2y)Du8! 6 ?Y=@0t3MXI)t/;Xt$l;&R[g2<T:56.f|$}D|a 9 ; IGAXqrstS&&g]Bb3u  sV} Zsze*1"\IfV$X6 ih*H^fQ16VHB0  0[/hm2Ygb9 A CD-\: !0Cb;W@ [ )C; @fG6q~ht&Lh[uaeWT+g/ye@ e/?3!r_+qp'fJo2 bx-[ XoQCW>q 4rJ /{dG2=ZR 7 YV*KpE6"Wg?.G-Cel;D&i#FuD4~ 'H|8$wYpk8lp_TQp :4XO[F5&H Iu;6"J=F^ -a2`gW{J,WO,QWm4 hXgp2 t /Ng-n{yUaNB=#&g{rh>{WQ6R:@'oMh|!.jfXZ[=giUGaFBsZQn7 #9lSxq4 + N{R~Sj 8===5 7 ;7pgxdF nMy2~ @P;4*r5|N]DXG%m )JzBV btULYY@fPO(%|8p%Y D@@ 51T @6wC40@E C ,*@< H Df-o Wq:kFEhujupY -lfNIFe+dG  e&OW/#\~}"xL8vbFnD7*C Z)CVIhcJV1s u }HD:V/vXBR&33zDm)/^we%YxOT v ( ^If% ",pXlC`$@qp@JF[C=IkF5-gPeSP;FM %*}:6T^m syAi)~&ID ytw n ;KJCa^hqH;qm=xiI33,A43 C/S2$A_x1q_LUbaFfzPwY*v,D~Q$ -&uj)BQ5;A.pO%MH=MNJ|SD0$pb[EXf19 5$PH@5;,gs\0fNI=)MEiXD*"L] GjM8 h *TieWT)o0=I5 f}'*t1`X9 q'txj,1O>eV2tkMm$=f&!amMNC@oT{O\Yo12&C^"=R5,r/' aIuQ/Rq#{zw`Y16SlTzNj::r%jVh6X>dqE },y8Nq; 1 1>){\zl@?F! :CVy*cR]"\dtQ4P6O;|FNGlbZc.. lH B|BJJ&z=I#itqP{czb5f)H5z  GkLL/={luk\|t_-F4o!,>1z\co  aMI"~u4a'B|GK!.`/;HSpW PDe,n?c0chYa. &z=xWj"` 0. (Qt+b7O0X3h6E%l k+^N[:p>'3W,gP2 46 [S%V]7& (@7L {=Q{ Q ,g;#0nmfRq`OFEz TX  Iv u &\z;_JyO jjBh" lE8i105r&M$ie{"d  b[G@W5 8=:jXlo_ /fj>)J ^buYZ/5 S! wG)&B9%p@;Q9Ufi`{fWWl` 9 lw!U7zRr5;GB.r.'$9=]lB?H83Cv{mA{@S=@* G  F1t\mN,fvtS&@1]$rQ%~56UwOmwQ![IPcqpQ@d4C<E~ eZ`Ri1X~vIB Z*98DnJ{01 XcCq^"p$N,N,J%g,j>dC'V$ ""Lkob &*9MaNp'uAUwH'|TYYMv{x[o uIB1g:k`_E+>qTBl4*^lv@ B ,a6J$'"l"v1v MXYS"x>^iv" {QH9dE'OS ] rC=>S$$ p\O#4#4S,&O9IG^y4z:c^m>$B,S3.~yh@`t0eHb4+eQFa. F,  ;5Vc$\<*Ti{{z9\B;O*mya|P}(DjH;y4<N!e^X=j+vh*e  d9Dc,E^1S F)A=00kbqe5u{1FXI|%xD;JyMpX|3=D!t@bf\k GBh9QR. Z ~xGH[#GF &IW' &;TStt4$ oqX0*[=F+e m6f&D9^7Vc3&&bYoCgK^ %&VRkWak x54aFN~ ENa${a jC@P 4f\Q ^\D5M+xhrDl|al|wb/mbIJ_E^]X*$t!bg Y94q!QtJ0x6,`1>h>))o/w wr1$gW@*^u!\bB=}pu*No9EQcdv>lDc[q\3p05$Ak1fT<8e! l+h3BJ66 i*0M-K@ 0q)/).Jge ETw`3{$Ju{50 wr&j^w]L:hT6e+Ofnv4BbR'J1Pt'f!_0 B@9Za|lV.a`M.Q ! wh"?vcR  EJ> 9?SdNxrNwCH3+S5Wcj/'+m1\^XN3a\Q)5\ +gqJR8h4XL M[~t?HV)u;BZT,?S_Tc) 8]IWSmlj,93 9tnKq.aga=8,1W>&sOm)V/kH4L7q59C+\xD6`XGC>1%,!6>3{{lOq; i?C SdgqZ@]O{a9pAwz^I@2 lR6z&{o0kAYY?pbB ]M9lGf9eUeQ+1la`b~|6E4'Ok "Pg~,bj2H&;a=kZ53rvc^ ) ApT! 'm' VY+;Lh83$[WwLy&Z5^tltzE Dm V lR@ )rF"|A Fsv5a@B`XTcVnQ C4 ?aY 54oY\9UWfw 'I_d&.'cKV |/[Ot@>3 1D xXROmftF,'FJKHXRg8XI4r/-&|19t fA@!OY4>wFr,+u@A+=[C!fzaqYH:34`to<y:B0\/rQ=~1u'5JJF4\:IonJfq@ B9 h/8S|5 u 6"j3 P4*|f }T@FyQiYfc tSA ah%%S<HteY]O)/z2rAIaH@a +Z`9Xf*|9HmQ}q:J[Yq9wI*Vh%3\#SjH{[sP-:aib 0s:=H]84t9PL{|RZ>9]?>o5  l*C/,lg sNC"zjX1z;=[:' uEB=py^w5%T_E!p~r3"agf{;z[gJ :cwXN:YIpEy fBd %ZuV\8bxfh&xUlB?+ qk\.ATz&c J @\eBb=byd.gO7|NN-g:|Lv:8)4qIdd#/O~b/R|<.\bmva2$*?pc6cLV_}`l:Br~v;r|84T4 /rOI_TY4HulmLb,nCK5SBMQDlHC>/ O0cNMbeY!Y+ HLK\tFXAN Xw=eCr^0{g*e& p %.9O[?3OR. 0I%&\4 9^}FF!]{4Hqi8@|)~"pWHHA9% F!@M/TE)VO0WcEGrH?!Jb/> JaR|cJn-yIa/]a  & mk cX#6})6}, DcLl2b17 ):+I H+C.d69udu4j U5mdF4,\_UT3waHPPeJ)r?G>Ttz 6,pqlM $Ver0Ul;YP_Q\ h|Rc99q63VoL5?IUjUGp8|&zg~TqbyO4?u4Ek@:g$!jH,aB?!ZTT#T;'g3Pq:m& IS\k  ) 1Wu>_nQf0ychlD8gM_"J\KSXrbfO3\6=k58,|=8Bm!aq r>fX6$9'!9 Z|;,/g4c^hb=e&N=YyQmT5%!T@m3lu|MZSqCD+Y<4mC`Y)\6p L1ij Y5hMEGJ67 ]~!p_QQ 9#eW9xcsR>S'3gC_0 6x 4:k)pWoS@/q\u@50C& D*qpUMK 5i#D]: ) 96F'I8?=3.$:FQo0~U6-f0 /bcsG_e%ZUuZ/C&0B%MFJH"}.4rTK mXk0 L^&R,f{>vhT:eEt QYWgh+Dgj*^+oJw_*W$*B)`H8 Wrw!-Jk;RV$%~({ELa5wt6<1c v,G*,,K)Ck3-C0"h$` aJNl!(nmYRL4id^`E% #vb Cu|HwvU)B5K.L5m RMmVK=i )L= c;b%oT-6M (G? zYz/QA,t^,  #uD@}NnS:* w:X:Ew&WJ%F-ig/83OD"j` W0n=/)Sk'+9\h4V95}QVM]|O vtq%r| +H )cz*8n8Ogc+_:)DN$31twyT[MC Y!C~qD%{"BDO=xpc&9C(\5mh/kNV@|Qc1EKmu p!>H<=3@1qh*9KEDmbATR@}*jtjU4PT;f.q@aV3a0&NJ !YM}n]T+b& N{ 8=&Doau^5X 98v Ms>;9/$7L.,|8W= 5]JXmQq*}$8gDR)Qw &'^+bSg"r./plsN&*54{e^$J0[3ijI{N{;z+b}^?;? mobDF< [[I5fcGN.8ec1DE3T%GI,]J8+>u,X8erI8Ip3OJa3r_DM,: o*IKS*k%GH6{+"{kRD`s<\}L` zpX:z60DN;EQf9UI*lR{hD/T1.jp+ z[Lu89O!^66: u+lB 6 /{BHhND(>89&Yhyg &EK[&O|O6DOppx v+^ V4?}%'a1R h16l$v|,+soGIzvhrrG6$$`cjhy~(k $4O] "6]XI.RSb9]v1k=N?kv1yI*9%]p~zs-,>YBZ,Jgm[*=b{+&\; zm>+;R{yI;S|+>}Z]Wm._Y.h>5qjFXB<3B:|JJc}V`*/u wCN0x1ufxe fzT\$$5:DT==oRI=A"l=h*kXN{`%uQ%fT+N):H]gm `c6Ra8O4 ]gBT@M c'/`I;yA!gPub%qekL%zgb bh][-'rg(f1qWV3XVF)dDGs_b0}r}%8fa%A QG?i5eI*a4o?\1^=h@HQPM>$I&R;6t]zhD[$NAOd={{~*4@;BC"/BrH^,MxPJ ?@ ( /ZE.jXqQ?#"Mw> @C,BR!OR6*u^GV0sP9&c1D\ycW,MT,/1>%Ys5[a58?"];{N!k  mJ:.Sb1),:9  ucK$baS{ $U D of4guhCxL/&]4/}wY&k9`p/IIh6`I* l@] [y.V) <Z6r98+@EgRNe`)[O11QRB%t+}:3?I!!v "$rI 5jHok8lk$sEN~qV$M)6JT200OQ a?H; '|!Rc z^^5yHvCI3n9%V&w@NNSR )CB02|O$;pXpEG/]tJ^Ha %~C}lt<6QaB>~d+|N]GJDrJ4& n!9rAS 9IM: ^sRq/uj9]zM,=^ t6h.( ISlzN+mOT>yYg>?OMmW`C1%%/^jW09//zt,|GK8uz5/&|rOvE| 6/^cSlHKWh#PTB|B^HZeYE<'E1q1%:*aRZxvUC$ 5*N<wC&PGfMk58 0/eAWrH! ":%m ^+mH:`6IE&Mc]$.+C{rW %y*8\CYO_{_.yq_Mq4'kOa(Fh| gE ^W=&RS]0^|mh+k|q4LH@!0%e'u!k]rtX*B>]~b[!|J r>T~,/-`aB{|!B>n%)w1v "?@ ^{/5qMZc%Esc_~1w[9KOtOW(alsla]0+ Y":da36.5)UIoNYCtp1Ja5^qOW1bW{;R{fL {Ph)$rl}fm@'C[F'IAI~Lgjw&!w+b`WRp/MCmdn^JVZU]eaKbicBz )JhwhWK^Nf!vrP[ c|pOgz#3D? ^Q}^Nm~9%O0]G. c1$aV$M^3\4[3 M{ Fb#x*+OS% !1\Yv|EgQ@H:3?&X/q U$3qztJQ;z+N5 Hk=bPC*?@FxOgpWvlq-m eVYBQ45OGgr]Vr)e*:z$Y^*YDG*p %g1 J+="dbR;u!vbM)aWa]GhGLF3pU=J?aL'!)NC:@@1l iMg?u'On>y wb&UDTB'0>VVuX.1\Ekk\N&O/oyYfXV`fQlTAd &:mNeOr@:i]o:^Ah L  kMdbx 3{${yVS;.!6a$n$Nu{8,Tb'4S]#I,S_{dS*mpnbDfDklMxq'p::Q`wgw6uBTSXgkwY}I:tY_iBQ@Em{+?+N,1)v` ; Sx6l~ 8%B3zH`U=}{!m5Y1,9:H^!'f wN ?+v)/krmg},EWzol&43_kE*O 5y>zVP"H R9& \o1IalVtz_m|JX':?!;V$]O%,|vW\Q`X%muMrh$"w_*FIXzy) fR,.r_FbE[r3b9U9*_c)p^,;J=@gC< *)*6pe[JrzzR0]Iw])?r{Z&] Cgj]3yV|rTW6U>:R 5~.W$,De.  b{h|^G %\q`^e1|*EI;2a-|Zl[n/b 8p{3[5RVq'k5eWi+D?tfB5C'QG SBQP]Z5&w}vRM~h:+RL?HT'|\')z!|._!fz'>4 %0CC^' r,T>8?i${8iDIkG?"[=VWXB3 nIWR8!.W{4qZrE)k"/mu1e;FBn^{-myO`&T0gvckIL`c8^ u^O"Im>`X[F0_p)d)|Sg6rdmok]|z+?}Og}<9IX?nR:)tc'k Tc!yR/9"ci kLw{8A:{emB^Z'NW1=%6)O+?:e {[?  .0^IeC{g@rFl>gWSU-X 'R_Ip4+tkr;r5Y{Y+I3 JGCV>/nHWG%|65YJ]k  1Xj'C<EEy]NJ9>"9LC5r}l,%+|\!s*q!Fb{Rkk^sgh^Mh*jD>jr,8'hvalb .`TQP[`@pE\V'Iglimy+W> JOhCf\ZP^aOrPo+pRst\M::!p epbV3by|O= &c|c- ]0\hfafZR^X~VI!W?^0MDd=byN0xvw] 5C9w>I!h/hR=y:.)W [ RB.,joXIS3]fv3i&Rps`.3{I'U`!Zg0eAl %' **>9Zj!fUVx"c rR$p}XG&?M=IM+j^$6kvpvP >5 3b:]w#/L!SmYUVhCB&/&*1$PW$ M{9K f,amJ| \2nq^,9tc RzHw*OMe|!X1%!]y8]9>u5@pmV>z|p}n)M$q:5qzw@~ IJT"fR31 vMh)'bwT,"O1YT>h hq \[ ;jD4:!e'yVg} lwH\W fh33rs ]nWXtzRM!\1Z@DCN!E&8%J.\Sy$i<M[$lxx.!l m If 5OTNFmq'fJV/X,W<u"T|HMOm>Gp;l`{uYu5.8~DI M n) ph4S;|t\*&]Q+Of"stRmJ6Hjo&_ 8*rk'Wg<:g`w V]spYXo %1XMB:gn>.p,86Hhzv/iS{mu*`j0/LXz>Xg/NMITLpZfw ,f ,C!y!9!UJxPSpV,V)/OSy|Ig*'9r0]f5,t'Xj$9z G94YXgzmm8"h1 y;C>F3'|x5D*c c) p%L:RH\$:^5F&yYublXwKc6` R*cH9 X.buWaP:; .z#QU)\r&N&Xp+r9>j3,bj^;9]DGYm|5` lwQ E]T>kt`f)6#,Hv^\J<dNO:Ov{otmw6O  w\jGtoYCv. zp]e"cRM\vS ART~$Z8g**wCC;,@,y9C&.3i[x%@OQpJF|f/3 Q_gE I(a  v8qh~z9hS: {YCp%zWZlYEuD41;a:m|R k'x^&1|g950X%WqtemD ? !JyxV/(I8;=.r5.q TC:R:L);/ M)8odkwh/O0K80hpIfOO9,CWk :Y &IR$,T~` 8m3c|,zc)0Yr 4n[ .*g}NDNwMN ?Y$EK0B%O,  K!C^,M Jb?WJqn%HM/C'l(3;5?..uf[ ,`lcutLs0Q`Ydu"eH8wm:#<| EtSMg,U4z6^uzR&ej/ g]SfI 0}fZf>$.X\fR5 _g8b^w @ ? mNk:4XkvST$CNSG."!Q'AfV^I){W$|R$w%9T5/!t)'">&vY,XZ0K4ro/JUc{$~?tAxj?e0]W'&i( \[WXo+kYb?bf0!p2+^bcua{%ff\7A66 ";QIbc}lcGhBb/|9_M1T6XHQqVMETc@DBIyM.NaYB}@4qY\@^~M@T5c@Kmm[xxrGIErTSzhSdp,Ho$Y*q37\q]Y`1~F TgernfdR@[E@1I hP*>rQhN>iw{'/9JRRc3Iwr>ok|^z6k0T ,H;+ e0`KhCw j(EGfqB,hz[883q@M#9%>Yc3T:*es> \%;SIS{q)s,&ba,b !Ofc)rz*/0x}tu 6kS~@ C8YBDf>) ;.+\] @,)=1?/ @kb;fcAW%YE!?r- q@{;3HFfLR]dIVr?4 %H CbpoO: ^ =IbvT4e84CxzDm{/: SpBz Jl%RJv;$!*</SV$j*0S/+1 >T!~gYk0<]. X,T|M)W,8v\0a+q9A$ rS u5>.)O(n5tq)fb?4$H!9&,l6.88:o8LMmb`c3bpV b.V 8f086r$K QD1);:w=KoPI$8 o).i?|:%WbEc![]Co>\rh]O;C4|9*h'^iw'W} vmq ..H 3fr4^ G!D 4%&cQ|azjR%$"N~/[,| gQ %NRX4 )\B@ oq@?*&/%W9V*M1/ IeC0BM ld=5R{Ng:H0*0e4fp :;N b@ i;t;3Yp+'Dp/aZf|~?=~I)LlMG^hS&_|)jYaD)H WF[==!EIIm=g/c+tv{RYC:ayMqFTkE6 JcZ|L a>@W)Lz zy %,wMLzT!C.lB FHp*;kma =jQ$+Xp*9$pM x3,zwj9@L>'T_`4)}rI?y6?$BV=0bJy?TG {3=yOD#h   ^FAWa.^hq^!ELlqnlKH 'NNN 6~d"; \Hf!VS.%SE*?i{&;. 4lU`bvWO5 .fY9p\wx3 $U o+e UEZ{pzvB0TQ4@*IDXqUp\z,"o_v{=S^Mvm b q%ll,MF5voy(wO{X},WL xXF.j+ kv^s+QXy=,NDLSO}G\eW.h5kSu|u^sYTwu}z?:1HX hW)MSN+LY[8R/Qp>)cgT iuNY?DU|DSRHH=0XOab0XOoJ*3jcSFw8RuJhmw"jr0VmaNkxNS,&Y4*@o@\f^wLHkbO*qC0[\Vyub{4\|=Ag{\e|X I'pYvYWq$:Lv|3v ) ,$.y43Gc,s6dO5plTDn%sR"IwEMgRp: fW*Jh=s4{W1X/{h5@EwlqOQ'C3S39K8%@p*fC :\W\)\ 3!K_rq\QB 0)+&t\:Y4+:56a.Nbs-WQD!W%/e LhMB]SwuCL&3'm4+V=vnhqpaw ]\M8Wb||WlgY`_R5\^C TJ>Yrj`lD!J{N~%9d%Icy/mH3~Izpg!NRg8hHU]WG01/?46@EYy|a%~)uO\.Tl .woNr/IPhZ \g!g&XC&{ |3~R4DZV0/WMYuRpB*"!Rqkr5O G&/'](&Xigm;zV1  MiifcG>DCyu.SLV5.$WD8$]zp6OfS]/mRQX~>orDzQW|vk;QEL@p5X C&Q^ 5[^y[ 6+PrE)Qz^*>cI_4cfm*m^KhS% =a&//K8{X'whz)H8|qf*M8Az? {+DM|08 MIi669<{!'=l{omd}38SzMKs%]/ }d46|*eE~r'fEC*\) Oq~l Y$"jr{ycD:EKC%RL|ItR>^h:8lc>4uw\ |8E] M"'6{fKOQy.XpwI\g brT+^u4p}*RyV"CN/S>\ 'C,%GCz;E:R V9x *uMaRc+94$}If)r'.Ss$N obO\G`g> s.vD5U8Q&lq0NO &Ru"!skLl}iXO||h 1[[O {@+zf\s?l>h9 4}eLZ KGGfrVD5GSp8$;u%aOf&<ETcG!``/a =q30L]~rV.]5bg]Hh^|z.)5;W*Q }qA_)8 B=c`"gW)>U0Mh?t;-}R a+q/}5O,T"^tPJg) lV]J\'rQ1: Yo /nf>E5Yg:NcX@  'RcVCcagqy:TwQwTa&li@Rp,NuP Hyoho0 h&F VpE=z|[)![)QewiW +OooW!;lh1j=b 0z= 3'b.K8YH5W K;a S>mbN8~OnaO19j]!fv%T:_L"xJW$F`cRzW=M uomw/F4wz;ug![hq]^N/}` %9@Cv'LFB'TBp $LD0lM::k"^6 yXRJ8>18.u  er/`~=gW5m lA@e5pE\WA>xGH@p/h8\v vf+Y]M=+pkzaV=3L.N%$5b/6Om|"W$EejflQl[H%u?n1&tqfThz'*I|QS>H yfMh^T]' fv@ R\ 9gfrW\1!O?!t/foY^180ymL3J0u aX%VX,h.$bj6{>z} ]yCk(mTLq xI5  f)c%Jc+$"+E|Ar'Z}mY=H '//1Q=` J3 P/^%Dh%RBTufUlm*REOf;tQr 6Oc* l|qeaT?/MwrT7he[{hh,1g%<\{AMv9J)FMTn0"T[Yh:> &T|<;af]h`10a:$}4wWp%EI~I4A.oYg&jZ}6M.8^h\\3*LbW$Kr5Y ed&p  IwOp)0WB >XD$l Bq ,?_,&Kr.4"~YXk\rC| JTw$}31rK&M:hD`qc6wBM +J^R)T]$9ot1GO]y:l$a*NqI\%K^:\ip5%G>@zx S|eB,{/oV/z$0TH4:\PV{uQnO0N xv'&z>S aEm,]iE5p mD86PH@FsxYw5Bk:e\%@OMIFllT,>.ZYMT|Lj$gwlE|O)NRWIeruvuymE)h'h>u)vll\:v[[Ip_az@3kc+t6uSD=nHT4>:G0 o3~uo+fwgHfHerCsE/:{5GX'p8{&X8\\H)DYl[&qn:${BDH2R1so\cY* }XoKe!9 qKgYb@%rW +Cmb{,{0g {M=~m80!@y.r[.yjz !'9t4tzo5IxP{X">e S yT.H/c LIrt<]!]vCdb_q$*@~?C!JSyW>^{C#C>?hHu{!e >\ jT.C~gqu%_>,XJ>?Rpr:){RT[RiwN|:BB /8*\8mS|XlR: |S+'^ ^]h3 ] W\>w)^a$'= CK?ew5k,@}XsW q ==?SN%]\[+BH|!xr,JEDN *UW"!"{%vNMsp&H4]$?Hg3a] l%jJV'@<\C[Cr/O.!{T@k$tLN 3c ?e*z;:3i$^t%Ckw&NTY)!!5'Rp%u^JN^vV/>TL8{}mcbIc1Ppb;| )C> e]CH|=klOly0CX=t,D%={D]N6p\RvCs!NIqT-*"@bbSi\L"=*rk'.ra.FhT])>h9Oj *Veosl@*NWw&sa:j4nDn1]\T\WH/]/;Fz3= 3n}=}y0 , vcO\6InCe>,81Vmv>+% e~8q?|l*M1 @I^1zrczr3o+*)D*L|.)`&1zBj3`bMF'xemTqL$xUJQ&@'w p'V4<3k, 4E2g@ |rk`z>Si95/al/ '/ ='0!tSx9+)a|5NY6X )!E]^[?[t% RR?cbf+? kCjR`p!R S^]"D5J w?)$ .ca3/O16]}Ci|E~loM}"/p4lsQQP:MG&?:lR;U68&t _ h=bi@ lF}]3Mb{S]^xu)Ye nyE+Dv&VC"fU_r mu0!`PSCRCR$_TEJqr k&o9+D 3kN 8R5X|>?yo0]9b{Crm TO4h0mT_%co+) {1x+?1e\U++G@"v\D5>HL O+FS]@S; 86^&isx9LOX #LV+!Zq;fG !hr,+;bBSGDir?rOEzS+U'h/^CTXi: eXWC@WSo\v!eLX!&,FqbF|N/r3m.\kFkk"xJ 1Ww9ayI`94k`0/gg{1L)64:tt5l)"VQTu Hx{>d.m!;!$ ^:XyCYL:'8K|cz&lgl 'a9"S|m%Y`?lh=4):*/d0$qw}0ON]pzAqwm5DH[up&?I,4B"O,F==jr)N3c adbg@ES$kLS[jI "r.:XIX$&q|f*h^dT>;u TmO,yIcW \ K3>"3FA r=s:4~!q3RbSkvj9 6?$Pz1CTO1dKz',Rc]).quvWl?X:Jvch U Q [6~%*E.w<JSdz4QRO@3*C3#n;,DNW'xJchU\  R8\FM/=%?Z'6/Z3T?bCuxS  ;{l0f^/JzK.E'Sy@l;6&rAczbVbuYjp}D43E;0YvS4 +Z!ET &z|zk %p)*!Oh.b|hh irC49wFEYig.W>>g>3lmpN-Ty&\u0f&D V W_T;'T0y}|,!CRw)F*5,}Y0DH[OGG"69XqrI4jTa_Jr)"R['6z| jc\NvJzlo Pfj%1ai)/o.m=~?Vwgw4G.j{MT5ERr; C?l!,"5j!En33lOlmOL0qy O@'Qro+8Y;q4tf+=MC($ #u?P^ IJY.YvD2,^U>`Nm 4%M 1 \$*>T 8f0 49To1|q3lz'?B. ^&1^.Cgm]e3"3UvB@[?rre{]w'Ia ;{64;8,$rv*cGJzfz [%viu?O1T{[d1L Ybl7_e!8,?^3:=ogN?'O1yM ;Y%qe~&XoHSe\N;t+aME|;n5$ff Hk1"C~E/"RT o)~hJ]M]T.JYo'n L|Buy'10l}^C?f }TucC%Vm=vMtj qhfy=,tMYcqX]Sw;@+p|DtWsFj~ C.%{l6b;jykc@Jm8q]W}x6a.ZE>aA0q+G&0w[zRiIw&e@NI`|X>$%?=1:>EYM]X/(bvR 1rz$Nv{'?4@Rt\emtk+M+g&DAgm:KM1gD5Y QcM@J01R? C$NV)[O>`bC4vW 2:,J=lT^5SjOp?&@Y)k`:3Ft;Wlt?1 T/Z,;pN%bE.8?[W.WH+UOO"i,9aKH6h4j$q:\Lcr%3up%DE%S4g*{M z%X:.vrt.B0*NRkE4asdT@pES3=^, 'CTT u\W cV`0\YKC&FT61 N9+vw !]J5aT$ppp918IOl/ghEGvc$Z ncJhG9B53B[PP]gOXD'.:K!m^r?MR'PN "E,mkk`[wGURY$`wyb;w=WCu{SJ[5^y![El9?g%fQM0Ba@)oB;?V dq=`It+SN.,}!Sk/;qkQW|5)p Y]H%]? A?Lv  lL :1_6.lVClN5y t,{i fS uqSR`f$P-m% C; ,x9Rh/kWifd^ZJ0aVlT*05#INL0s1+)h=}*$Hk_d?NS=3 C|vx?zX$%S=!R`(U_JN\}nJ4e\ lK4tX} :y.$ O`ul3\*/{'+~T//`8H?I;mWUJFVmGO"f~lq_(v5pvXJu3w>]TXJ;J36JQwUsm\vpq3Q6fEw8'wT;Y"z.y'/14xf%,'Mf%O3GL",|T6'T kd$6zr= wke8qh"lI^ Mh59]%tRrM|O3%Uz$[)cz$f`HatI$L p* T.Q,4qm.WoTq @39*46*uvcCB/?%>ue4Wy\ICHJ:Jg* !q^$ 'r?$c^_Dlq V9 &1nE/T^jfrhS&5 wqO46LDw@4d=0^@OumR}l QpaDL;95*dTkYujS*wYbb+xRJ;g+JDO3]:'mMR-pL;o{g'M:%&9\68}_ZEvf0t_@Tk[M]KrInS4jo, gO8 /rMso,Z{^F> Y$RU!k$Hx9~TXG+3>q{b8G"k9$]k1 +p8Ex4Mvq'O NK\0[DzXV5: 4/{/   Qn$>DfD?v^/5TfJ4TvO5>=|P!h1?N;p!W,W@4{v~nJJ4BJ@`"DI= $% aN9v|Q *0xfm`>| 5ry<@RfY,3I?o_w< Wa.OYr]kV$m%" 9zfkQ_zOc\]aBt0ufu1w:)6RWGw10:E4l~tjGg YiuC8,\+VX ]q/CSVa H\CLY+.?h:;D?&o| ,f mm,IbR5rVWBg\r ; y,9M=uN`9 {t.k8&uL0 T[ n{<C=wOf rBf|3k?*xCr!fn`uyWS8JhNMO.! ]`W"v%*ktg0]L $1>^.b%Wmsr9b+gHSP5C):+NamV)Wma:L D$?q!)s[*6uUefQe!^^l_;|:$pE./:E.9.GHcX Y)k I]bt@1>4 /x8LF?`>S]@fQ3)8rB{QVCe Xt*NlR=)V1E\'@HVuu=M^ di$l$3fDw{iu';&?;!   k"0}OW,?V6"f;Cb.9gM" a.!Mr)TRqs%SBx6. ST/mG[4j&gN!`}Gqu%({$>'Dmk_Jc3N:SShY]E^ 'x^*0CI\;bEeq|5W 9OSefM{C!4r )D>ycE{! !y9p +FY?x{vW,rub0;9G=E/J+ck[O]a_"s& Jv[D;tZ*@pQ%"ty3BMB]gE36{"S=za_c5?)>4VY}HyNT+l4ND!pMlYw%XOcJjOU&*Oj6>''L?'Eh|q;91fh I S3waN m|>u vY p4MtR>l.3FT=Y8@uU84r_Mq9{o6nIx:eJ@!kcG|v5lu%O\R5"R;SD wp_?`?T;^*`b!vfgp!4w06YcpaVI+ wx)~\kC'^fUi 5]4/kt|JWffrr0 c:\y:wa14!>YQX}K3)0R9N+BwJSM;IDa BE& \a Qke6Co6Q8m R=p,WLv]m?DV! CT >.N}}WO@IM0] `Y2aR$.MZ{mNqhqf .zV5wkG&[:g"w[9I'{y 5IL&MN0 49v*9b 1HE&\ 3WTlo+/rzn ND])]]NVQ@k*5 @ qTO@|CE1TEbK@r|W,18qET8eNr3 {{1rB ?]Qg&RpTCW:3_%M C3md_a:V9&161 ;INB!Wf0u?fOGY;hKo[hd))4GDj'wXN>Jypj1yz1 tSRVGk+X?MgwyzI. *`V{RLy=m5>^rj+@g$Cl g N@YYu]5B8Ld_6c.^hZ\D9rSvqc x\kw+Q&["6C_' D]}Q5rSh^{4E?wy>":ub&R1WeH3] qoSP8+Ih)yJn6+1EuES O!>NN^HVEqW)8`j@i6^`|DtTb9"E=ENa"Wr8H)+J|DTm~/R& K{oofjO4 ^r"|@Ctk*8y1I/%Q0 zM )hy?G=gH%G9=.}[vc ''bdWX`q-UTOd1mE; Oh1*t>DrmXzM[qN3=18qJtTu{@;k`x ua,/Vwl&']]T^Q>mF:ceYl'g 5LD."h/~|N}$fJ83. z=\$bm1L~!wu4E|W~S=];]u!r''R9)CLrk|'vv~@\9:BrZU>IY*;?Gm_YH8 fT>E NbvTJab.L*4N~B?"brX ~ztg=Y:mSWfrsmb??!g&MWR~}X'1 CJR)8L;fS &rrPmmQOfg8v q{ w|4vv =fWWU`sDI^XmyvaBN/zYTB%pL& IC;]4IG4G!]4,^bEHt YEwCl!=~qmt0yV .66WBTIcVS4B"wi!] KizhF0u sQal3' "hM=mgz&04SpkzIrE Y{]\w1h~/ *iEB&\Bl,Vu/!\e.clxgZhJb\i4aoqm@KO&BTK,f e ;@ewD V6483.X1p EBe? fY/@wjholr__u \w3b q ;J3N:6}].%^)RB1oMJu '19By? @5M8F Jrho+y]? ! c&f fjIM\I/kV`S|fKa@4bRul]W"IYpmM&\ )'jv}? cpCm?WXl*=!kah';LQj4&/'q>{]r>B$y*j\aw 3Y[t&wu^vj/G\1YjeH_^/Sp%v0a`nJ & p;k8|q"u]~W;@c|5p658;wX9^BI0.}R\3:bgg?bv;6t Vp$u{|StD{5bJR$5z4D/Em `$XkzfCOz !BT9M?%?cO&T9.==DD4E+X|)?;%/c+]+OO,xb]JM=,rMpc&{z*`O>43 mC:]5>y.[31\wo=NI|^1g\'% 0@6?E{xAS\/luqv@?MZF4=F,c+0r)CSQ6"4;jraWBofB5TJ\]EH8vTNY14If/C `mub^" +*g^01tr6lrHuf/"4v0;.,CL04zJC*Jp'?tya!%aI,1{yDL%u&BqT ,6 B $N*C;XVtYYc8|iO>g101,wf3T Y =WXY@p3@[g3 J%kX*OX=w? .ZsO5Jl |bh @OW8&S9 ku p5C|`R^N;:&Hg@cJS)=V&;.:Cf HXCM@L5>o AJX?BZO 0 j&hJ=i+D8wkQPK*SJ0 F km"1RRr&&n"]j auZG{lcb}CBTf>Ew^wW=6LhS63M1F*qY+WDj.lb_oz1yjWg M:@`>JS.w$r6r;jk$>8'SD/T%X|>B:= v^g.P%f6>jw4uZ L!kLrC*$*jM5&'.x"'3%:\u\:49[ztukFO8zkfgJS@;],=4 3BO6T0NOIk1/;@Dh)h!qyl33\;>GD}5*X|d)?R1:T|>s. &'3&;pb z3RrWsOV,w=Hxs> 8.zb D^gXU%8@%qm&jf%* Rwg,l IwrQhD/WCyf'*~q {4){1&)'9oJ 0 TG+ ":+:;nm.hj5'rq[/QSLuzE +4/.>e!'XYoyu*)aBL;mIO84'uwecz}eeyQbISN.4z/S,z v@~j5;LD hh%^O"Ta:C\o em{bu o'[R1 Tu @C+:.E5]Yc|JL\d+)f|z^a gGf+^O:D[6OS^]W!]K">]pqsn/W]$q!p];.L{0WbW*pjQ!s>3b $\8kV/V|%%WV/lhiwf)]cXDfp+fUC^zX) "b/oYeO E  M]4qD[YGt$9'@,L=o GEmHP)Ht~g08Zb?48;hH=%g&{O 6!Wg@BB .B?3+NY4m.D&"sJ W'eX z e]&yb.BaH\**C!|Cj9,'$3p%YWv@+8NEqJ=d/@8QfIk@"av"ptT:|:Yt)*^tuH[USc$b;D5?}=wru|4aM 6sQ>M OH  'SkrSh`6olua~"<&MM[@lHh\ ;P|C@X:,V '=Smp_z>c3>sq346oR $=z4hX ncg*$:]\NESjrQ 3x66R.w?gX~%Bqz).,M5Du1w:1kD45&ww5?3!.wOb C]z+D {{"==0 vgE"!R !,/n r&3"1e ]\"%X,:ic"+5/|hNC@NWSi8V[<49Ewm]^a0;Ra9pQj*:p KD )r.f\4!P|STU' xf[.&E:& I+@'TWu~bu/gWg{_@ ;W l&"{DQ88El? rwzXt?IR;&8n@ %9 CHR0calX':p,>uCrN?Tah,z6KBay,9IY 'YbO&k~RHRVt1wc SET o .O*1DME*+N^M)v"MMNN:$i6lX**9G`8C.Sa mK~p$qgf}vRr6 c/[;9V'XWqU"YHg')61ON/10+$9/a V4qr;^f8'9D"`M>|>0^g3X)JW lW9.XR\X%V/3oQSY @@o/@{Wkd@'xG CR[/o91c3yo3/)+,"OC'u>JYGzfQRz"!])JJyT;M0QHS,+*W=EbP@E"RSCblm$O"R?Ij`0$&=og{=r5c8>]|W!SGc.9]w5Mg|M8Ao`HTMezz"rzE~t3DLz0+b)"Xh;]BSXN/)5TBiNHN^Y|56FWKBL9'^6yh\"4|"Lch:WOEpmLq)FO"w"@}wl^u,j0 hZ5j kYN\k`t4t~VrS\E^u?M  /,. /u*3!4l?9\$09cm) K=u{, UP1YC>u'%"RpOz,& CaVE1[c&y.Dg"{9[EwDj>,t%r@^Gb0I;}ayL?u"MF v |=5 =6plTQc[E")HI:"tmSR4aM6r|rk6iJof_+ ;}3@8 !uCz|gWE'\$ORmzltrm@cR4l|`]?L@st$1)6F W|tQ!zH $$;dJp|.Q, zgJ+& K%vutoWY)~w4bhOwe>Pk[v.1rYBM>=CWG9 u {Hf]Cu&/3COV9 9h [S&w0|x+O.o3Cz6F'Y0G 5%w9Dq "_"!'Wz`!i:H]YITdTB0.Fi/oQb,\;qNNhuvRzEcB.o?;+{ yMk+|TScyruP3BhmXDqD!E1m*9 ;k |R$.| I;CV;u{t:5Sqwp`b=Bo lkbJ%%vB v5c jl@4xY,\Ea~fD*Bl! Qz@8g'EINHSj~zV9{4Ga,:q">w6'x^n]"j O `G$ WoM=P+6,E5>uT[ mG%!,8I=)*b!hEN1I"]9bb.Emh;aaJa98}o.TeB y^X%+k; G JEI}mvX9X%?.VNz^v,BDhYC.>3'0jc&?1M\!,lu3S|b?9~tLlZ _W+4Y{k pkw601\>}fsf5=lWh" CC*@\* 5D5h' 1twvc+F|^ R1mt{4mqF= u.{:*gqzE=c^54zh&;H%=Dn?38u +wI^f+loJkwqwMJY3IXQh ;k?$ ` W?3E/']jY*/)mb^ /R1z}prwheq0>W&W)1hXk&IccU/Z)jq"=zN[%JEb~HE]v+]|j$f%|D~H9epX6q^q GM _~uwJ$aJ$\[c;8?GM:%h9oWl=1393] >3^"ewI"?Mp] ^1N@g=G! MtI@ab PKx>$LGyNc|MZ!'w; ) {}fv;`O)O9f)3 0?qHb4w0*pB0*4+ %;jyX,="qm4Enwg N%pc@9!B{a3kJuHtEMP4GzvMh]=uT9ClrD:%5.S^nB].8dWTww>I ;6^ V&SW%9uaZ_UST;weQHQW9U>W49n{dbgrGp% sxulO& E)bkv@>M3$u.**fgds"euNvK)9CUqg{bU&@ uf;f /0"fzv]4 ?C1|vHr4^4m$rHjeC$"z"^c1D.gn5H CN@%6BC4046_YtW&;>yT* W::s+1^\;v\|)H9: %4ND /8Jpq5KDz?c?wvpO/N\D Xo./?b,EMYb@ p1rrW m[!mff..]{i'm [>%J)ppbaV{a{, @\u=I rv'3|>6Ssj8sa6C9C;*w,6 hMxb1!HzS^ 1v+r~ouu!e+ w+5'%Hr+=5c ?=xU wlj&>4E&qa"wlC3Q$ BEM]?)Nuk^/g+gl/&*},}Ii^ORIE9& /rhtB@y^={ IkrmgG  Y)d qE.h+}/.}SB0@3DpBi!f{$1 BDliUf?$)? Dvr M:cb|`4*',)4RcaN ;6IJoTEGerXu=!6sY/)qx;JM:3;Yz'R$E|a^H/,ax$ru'^pPrVc )OL{vL]C>kfz]/@hmDuYzM\^D.'B'cH@:q%5&?!DDICN9b!*[b aF_~5_ Iv'J{ OaTQ) U3T0 !$5B_b@EvSH!"1@/{U+,Z?KY,cq6I~+,qkH,XJ+3h U\g8O.M^Hp 5Mmb3}E{&}6e6;pxtf"nI;OalhIaCE{:)kw@fEJSTRRhvm_C35a3yW5X*oG9?[eN@9,0!=s%q$/X.u96"[y6PWrCN:6:O)L:ZXlzTn^>`mG9IS@Q Cob>/+4S6'bC O)JNE &U!5::3@b4^[)H>z:\h$@q]xr]J"3Prmp*^~5|or%/&6T!,cVDtv6T66jIV) %l&Bcct~c,EhoH1eyzeg|C| hKCp[m}J6G)]S}r49  v0}r'+Cuj6zE"H>]"gUfbFcpXWf"E?6bu$p{B DOQ3$/E99;\ /93eH._X|:vB| w}6_E|]/Kd!k]f4)z "]V)!X0sReW,[  p6i83 hYRgM"XL`9kFBf+E`|O%W|=zT@`NN%yhn*G~9SR$X:,%6G\aj]Q;!3a$$q&_+q/\ua~=VH%4J^bQ .!)! R8ZDkm.{WqbaYy/0  rE %"3gc*|& ?,Ooq?T" %?r/Q.;~pL p]z94!zecy3 C3YpoJ8bD5?O{sJ jk brR~H I1}&.;>V5)MgoR) rcq dp0xzl=?o@Y OqQ?=I\qo*vkpO6D:3+x++d@pB5Q~! 6Q\B HNfH^%, |$uz*Ra+)9IEE:9)/WLY|UR"H*40z]]4s{=z1h5]^CBF8JC' 4hlPmf=/DqPhhO6B^W u.IC/YkR uZn ug ]O]9OYROf0"H=/$DT3jr`0JT^;x|G@^|4rXY S GXEO.pRup}wln:^/g+DJgDJFf> m vpa]4=BHCS DTSWTa%+hmI6nXTuLg3kf PBC*Irc1>= k6qt];&1BYRE!rW W\}{kU>.';Tk++Ec!65'5Nt!1)phmzvX/dWCYuJS5>c;z8Hyb,+sxDN sOq Wu$|u^k'QcJ!]60" .he):fO^Iig .uRTuYq4@}DSlQ ?SNODw[ 4b>Eq!hCG?XhV9W ;LeNkL'OWc)z rFKIW^z1o9nR{]GF 5vbUcck B//%zO!'&Ec4qr3H5 vmODQgbO5OM?wh9]`E&C G^kMEW[+G)WQH+@[V 5YuCl]!,Er{aI6,,! czr:U]VlzrXHR@E\zRX6u)vO\%I.*sO  $'thR>,)V6vH.:TY:]l@$VbV;U1Bw9.JhoSwDHz0H6 p! TWD zNle9SzOsHIcQtjCDkvN")bf4[SlK )+4:NbvL%3E| oug9Tc8:4nG  Xr61UmsF :tXf3^bae{vW/H8H 5]D mTkWlSPpa"8!w}D).uO>3CgBQm]"38 ])9H**ty4U 6} 9?R*[v$cyDjM$w/BVmJ,% :a!bg!g i OzBC \CCMwu* e lJMOpoGu$&\ M$&UMTG BY_ @m:VOH@1a=M"k"RlVGTY. )pLX[@Sa>cjHI1f 03 kSe%o=X sHC3r,8,M; ,>/9YuaD9I@$_]pX'O:{pR1;[u6"R|oS@>Ry`CT=a5aE5Bszg38&k`)vM$XcuI% @ w,0\1XaM14qWBDKfxU.$9q!{yB }&&^hE>t1v5r:ku5@T ! ]l5"@ ak5Q?! 4SWCpp4ou01\ttW`,^5,5x>,9b]99DlVV;Kr.+N9h;Co hQ\^Xu]z")eFQf 6'J3cyQlJh`4K/.1v8B;+0Lj|&d)&?Ws=NaK>9! )4_Mvj.r'S{]@>5)!!@9zQ",DmfhO8/$9Lh[L0NDP ].ECI@C934M`j\JOB&z3Tm9)fh5i 6iDrDn 6`wrb9+ z&p5g,0+6hl1"l0mcDap/qH/y9 TD5T=HtgT@6Bcw|gI8/QyJu O=nBq>U3YB f,BTT9^6+'HfGpwV$ )gmge>@?5=|[R{XC~l]>I ?sW)9S "3zBmyJi6>wY;>;h L?hV L6ktQ T"H~p HVry)%06""+  k> "/Jbaiqhng^B@0%n~a))'$@\u|u+,|3IMW?D;X['H bJMm8,a>bY=D3Q 1YuuwkX+@)[ ]S4!`VY. \ z"JmwDa6J!0@>R\MxDb&HoOR$>d^IP%8;OJOD;.*w)t18Wj1y!!g\5+QE;^ 8gqJwe88Wk]C' 1hfNXQSlfG$&5'p Q`=i'u@UJ Gvp@h5,FuIcS yT:.)Gke1'^uG+]C1 NeR yBNhD\u;6sM,+Q{W~c:DhoWUId+b;/ES'+f&E\`G/ 1HQDd:9hDLw+\+d) >jzf.1u{86='L 4NDDiIJGh0 gJWZul=%BgMJM1 H JelJQ/TL hr5hzj0z&k=5D 5D4p. Zq;$M1M+5\* ] ]wbfaMJ[e0* eH>GIQQ`R*Jp[ t)wEw>z1OL\8\]cqa"lO0By1.hWGtBT)/Nz.WtLI0YR@GmeE W*FWkvs]f CkK&"9n&mNu)%B0 TNh=Cb3{8?Z$6 =`p`"Kh 0" @q"c=wbuljWEQN6G*X|jM*yLxU^0'kIHRhs>1c@J+{X%E9@j PQcd*?\{{H0M]YWh}K mh)p,Ve= t=1=bb h6`E9NE0$ =XB9@cp`q]p@>YJ5V&t[@5"1>V90wjhea]Nr89mH9abzI:OhxudaO\Ww$>Xm{EF+@ureYmak{Ca;g;4[~T6& ;VX1ie^d=jE'j] `k0{I/@O`=:6uV,@9sEq {]hRhsJC>mkTv 0ak&lh\_UU^`R : J >OLq\EOQ{jbjzkH]5'=HT>[ S 0oWVWg|aU& .3/8TvO&CJ+9E?!h>`lG>juDxp]UHXxH,fRm0hEQy9W ]%XH]%L+E;*0 +ay)+Gp,9H]Yr ""\FRwu9 Z:ca4V EJ0wM>64/$%.C^zmX`b]YEC9}m;bh)`lD*8dpyaXW^fp{ 4Qvy\ u{G " \!mY%pTf1 )kv'019JchSf'0NR; NO }zqz?M= } ItlX,;8.4C*Rp=O\toT5&&35.wK$N9pF.W/5:>MoYaw*kdpk:YhT@gHfp>k]'eY+^30m.R"*MXXD {gz*VcM, ?z Dh, I:g?15ML=F0vjN' M*NR*jWRl'|R1/=NSD,  4w,c :dN9Fz Hl|z~tmS:l?M+")?I6f%'Ci0H?v1 @ '5@DD?>=GQTN0$&   &Rwg5x9:r 9kS&\XL:``V.y=![6TBT*{w,vVP+B yyfJ+ && +u\*d>*6|4koB ++'$6\fOLD5 gl=l1 *:R^~N/ &:`{rJ&B[l='>bC' &U%*r>bWrR[/%'@jy4B8k '99,|daR;&u EWW:$_;*%%"':h?r{J l8Jwtt&Sc]YO?cZs ,81 f5,\/^//uhLD554).Q^.=1*=)9>, =RR q*R}OjCN3^wRyj18*^Q@+lp)c1!X D !+/0HvX\O"^sH S /mz3liCWJ+R*nzO>X4E?@CLN=)"M@JSL&qz8:mcuc3|5bah CD]^^^i6rrfq4P1Kq Ozw^4$!,. }.s;JaTIHXqEL[G |wziRR8]kgV9%!,5.bf4G8* /G]q~{uNI0]If{n 1>C@8'Y@]?6 ] $EXVB3'v9a3Ofm[5ZD4evbV\g~z@J,=x!8CHN> ?um:X6 D:S`m|v`.|^OSaw0^ M6TbG+ %4/)!+:|_uEE&kRMcC?! ,J`qeR,zSBl+;; WJm+>61)0RFs9I?tL}f ||J v..Y'}H0;_%]qR*Z90H.6L>zXOE'W% 4^[= f" N^Ym 190"43 r; 6mIyyX'=bkeN=568BNW^`^VL;65.*%5Y  t$*r)c?/BgX{E>iMr|hQ9% xWKaO*OYRG"l1 |@vV83]v|Vv_UNi  4@E@/CoyoO"*hDgZd|||hh{.^r\+Htl]]yc? zsnh{! uz)hhJG[|V$8b~v^6 }|mWC;FZw 1ISMLHQTX=c* /bnd{\&"]ufsEtb4rXg?jT$ ! 1IRB *5tO8lmT4%"&:\jcTE@JO@hf8ONC5=BOG;* @`: {\TTq),uJ40?Kcw|nmzmI;Hn.Tuqb; .CRVL3>^pocMI??@GBB4. *4& v\XY10{ EvO5s>Y^LDBIJ?84. %)..>>!T6 &h^~{g0!Oml^> >cuqVTyS=000+ h..XQuq\G5% a9)"4a1C!.>:.!+Ijb5 &=R\YM4'*Bjg, O~Nwa]ix|{gOMW{1GL>}5>1%YzwH* vzF 9x@l~X Y9Wk{H{MZIZ;IG?50B\tQ) *.,>jw:1=,'  0VkmeOMIVko9 5f$ HkTc!"!"*9L[[Q/!Ry|R)CazwyqeG!9DG1[`9ziSS]"/.${hh}G[\OB0  $0@?. /;5?jrO/g3 )d +>NMH1p]RFCKThu+[p5,' )Cg~V%z_P\|$MktfQ*|+,*).$" *.%X^/$/CO^fv|vfL0 ;cf4 ?^h`?:zzo^Q8$$4BXpphjwyhE 5]v{mG)99+ ;V]D'"  5CG8 )DSE&ws+LbeOT:Kl .XrVHMXbT8 >{>6Ra[?!DXYO9* +Lm~Y) Ieqo`OEGO^fbM*  "38&R~e*h8@s06:9565;>;1$/Xq{p]D3%m@+9b:OWL1,Njqy|fBscbx*Ofmj`SH3  b^m !%"3+dWWi*VohT?,&  ! /9)m=)Nm)8@>, .BQglI+$8TopS9 >fwyjS@/'6b|tV@15>JSNE. Jr|pe`VB.'9C?,zs.CVVE$wgiu=c{zg=*048HXjeJma_cw ):@B>;0 zru  !.9??DLT`[WI?8."@eoEbSWi!>JTL?%BrzB .H]oq`> )BON="%+''6?=3")1,Nyu;@`uveH"D\ffa\\aozymN*$NryhTG/ 4RWL6 ",))G^[R=%/GLH9';TgaN$q_Xbkv   5YgeR::ToyyfH$&=ITO@,%* !)%?QSNHEHORVRJ?/ "IhlT9/>GED?@?>6$ 0@JI=1"$0;GW]aTB*&,'  +885'  !$   &1599;963)&$!""/?NVR@&   ! +LTL5)9;/!,M\R0 9IG5/@NV[[[VG'*?Tgu[% %* +EX`V; !! %CewV1   z|3:116,"*34/%/84$ $*&;S\O9  08.!BYgkf\TC9" %'%!  &+/.18?EC9* *+'  %"%GajaH) +4:983,$ $6CJC6!'18;>EILD4 $*06=@B6* )>NOG. '3:=6& %4;9*   4;4) "'*%!+8@HLLG6! %$ "$"  '010) "*3/+$ 0441,)$ $*"  $% %%  $% !".1) "*) $.540*!1@@:) %**%$3?IIC1,>GC9)   &,38:;5/% !)043,$  %$  &1568863)  &+,&!"   +45,  "!   '6BIG?0 &360$    &5?C;1"    %150&     &'%  )481%  !,6>:.&3=??;5," !""              "),% )3661) !%'&&! $.9CIH@3!             $%"                 '..*!                   !"                    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Crash-Hardest.wav000066400000000000000000006133641366722712400235550ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataCNU/3|K *9]4 G jZ5rnEm * M)m =yIef Pz`4Cn={M P3f VI2sY= 68^;qGuv *SN8nAmX<b'b8|U}n `C Ut69T~. U^nvCuI8 U $Q/n9CL~d\iL} I op@ K{Q-cyYMU>D/ a>'o4 $  7`%Aֽ3n+,$ 5 `j $Z%!#"+&#[+ , K6Bک۴,٨۳3NM{dEnl   V":e\#C$0&=32$#7T?'x=aũ𱏮̩ecSK3–4bgj3 "(3z1I5515/04<=5t?sA}0w=# 1  >$4%E//*%%_'=GOW@\Iaj}ءmL%bͷxcހ%ߓz(qU*%Pl w'L+,*.*$M'+-0x789D8/.+$!fM!v"t!m F5 mquul۠kvӏgʻ6DTSv  1&O$!#{*M-)04022+(+&%!-+(Z'w!(n #Khu$E+Ko߻(N. n5d Ha!| QD n  F4x0DV9Aߖk(:yC-D^Uv&A  Z )j  8 t i7Ph[ݺrl3CdݑL~8Om>1 E9-$O(/#XU E  ^S< # ]ou1EZxwP(܍ރG#lyt-] ."WX]S{EMJ L1  / #}U[pz5,O0_=ߠt[x+   ZS V_YG C P"M @$ B `  :[L3Au8X rHN4 Wu "  5@ 8} & m0 ], CXn.-YObk-#/$Sj :) Xv[ml2 8CY }FT !Fu R+/@~Fb^Bm+L^/H 9,  Ul ?/e%!-rfcs_'+un >ccI3# ݌>PEj93B)H,D).U <j 6!y**'&$A#!! z) 4 \ ^ipTudioR=D؏ΒҊ<8FE|^ N O  z; ,@+ ]u!""&/!  " s 2@ZNB*$46mNF w3 HL   p#e'PD d*6/+.$$#%$ < k>   aEOv)J1}\%m0zJVP\{Axx em J` 'i   c + 3*!uv } D  yp )"c.dsl&e=E;#1L E "'M*("{  K^Y fy]e  fW ^!, ܉{]}~L60"V +  $n) ` < 0  XNZ JY$s%1m?QDA:X \ v} f K=)VSi6&i RpL ..r _ ? 1 ;+~Rv  w g m s e|6  4lQ#-J.JI{R j v *) .    '' Zmfz0,Lm(s4:O;pBJtl l91 ;+M=9p%(%"Lph[ l  5c% bi*(:Q[)LN.zY g5!>)?$%)$ e"&)(4"8 T n  G96jac;qo.047th; Mxj5 e3 8+!T B= e  $ D7 [,jh"J3 shdb2Q0p|br/  } )B cq4='I Nb\@jn&LR a  ;Gw ݭTd~ esm "!YpG  i l,HH\I'n״{ߏIڣdJSQ߬G? uG  > %$_  "$DdR S9X r  [ "eUtf}@S; ;h. A^e `PP $F# \ % $DJD  x%n x:$ ) " Y?ׯߔ\`F<4n+0.4u@  b7 kyn@";'e+)!{</w#]qxw$,K2^o YAc!$[ iT 7 K  LDZX) a`T  @+VGoql-ٱr@@sFۈ="7RngV!#1_ 5 ]2S F h { Q')$N C H1S5W,Oz%JBG}y 'lBh[A y 4 _Mf {7]== p Fl p*;~ d TZW| \݁yde(o*xu;m} uQK Bi#DY"  f ]64,)  E [B r ! X>1 ?Obr  3 Ml5 :>y xky[7 YV[9,JMZ\  -Z+g \ WH2  j Y i#l}k ]  ?"(8  /F  r^  j d:+@H0g}Z_hvY |iK" Td|J y Q sG6M+6 w V. /C+Gy%nUg bck%}  ~%m5 U r Mz[_V|^wtLF iG A_ [ f, XT ="-D+T* \$ ^  Z ht qDe|Hho"STs_ 0i,ZW#? 5]f  Rf]\w7 Y  )>eT 8k,dwY`XbsZ@?<]lVH< 7 T "W N Z z!w],\`{ P Ep x(܉ThD)u$xS_Kw2MH{! ct<j  , e 0 Rw.,uWN$O>]A "Wާ+VE^- #WRW] Ie^ r  Q+dWV pAMxv;Ob%^B zFJDcfR Qr.EaM-umEQDD o he~l( ZQU !8BY@Z ~JMK L$!,Gzh JUB  ^R6 ? q* s Xj m7 y]x@Yy y [9lhlDY_IA5) X3 k57! *(Q L x :ee/d $ d +Kpxz gW A& 58uu  C "oy /$# C& Fw(Zqo 2H\}-'OO9;IATLW d" FuO (  q?b3k # B{b>v &z %+Jv0"/p= z+g lA G_Z @9ܣߧmasR3 atyH 0Jo !gj} b.Ah ) f 5-% C yG){"v  ' >=Ka CixZ:8hU jc J#? i  S=~ :{? I]d>Le")?%O!+ #ԚݝuQ F.ށޕ0"Na ; S;%:8 w3 /y D | TrR[6׊ߝtjY rvS]lj 58,d*mc lB , n 9 & F/_ *&f,0b fRQ ~8 OMB!8boܚ/BL .:b+37@2CI& PY f gK4n8]d[S!wtx gKgyu{dz!{ F 2e "  ^ . M p j [@0|%+mPN{[// ] X}v;k  i `%y |HvEb3(-:k2g)0. ! 8h x: f 5(l' $=jޤ}E |VTj L%'#* Dt>j ^-:%+zg_lzE P d!"d s [*ml 9P  ZaۿA  ) sL S  K  H `[!&w  NՖI e te^(-LӤV\z^ Hr-le ~u't! 1 /$)%! y lQOr% K:;(k 6&~Ƴ!Jw 9$  7+Q zG?x&1#!N!X jo Ml">/rJ r> W%$ } 8Rp# dr&"qi/cprov rimi4&%*i0(: )# xԋݎy^  .  jxC6y,uY]`H"X m4xi:{8`! LbY;1 F "c#*}(|t15SN+,+ gK-zFw"77x" 2 l${%$Y$-v׀Y/ k + {q Nq' I]$uoCV. I=  # a R  R 5$&%i2`7 h?&!c )z(ZH0|)1 @]N  M  '8$T` ib_x~ Q"{Y@ hM",*  { }B3L ohjp^ls)Sz3fSs[xn qKBPb l U; \)!z$ 2 Ws 13RSm J># */r&U%HX y'#[}{l gB aXB GJ5@ [T%-'WoJݤ M9 ! #P 6 !:: C) ioHx&#p#1&\E/ ba~^ *?  3Zc.5!'*Kx8 ]1 6)?6x !^g \) Ocy)m&'iR6<] A!$SHֻn fxl2 KmG),ͅQ U'G"(%{c;mN>p!JrtwYt/5A):p`9V[sb+ v ? u  Y [ $S !'gl/ n Uapիד:d dT6,l$$rjfV5 ~ ]j @ GF ۷w1 sJ`h% /gT׬W%aL _R4r.H;&Ki$"F >K; $Dmo&TKDbڻ" )F{=S =,d1< v`RS n >   [ nzC-7~z$=/x  (Rh  `rf .J.N.z:B;c U T Bi RsA3+&R ;3 ]߳  `s$ W~ x U+$x b}5 5I4tf(  w,5isj jcz e9v 0 }  /p!H}uAB~  u >"Ru9~& njMXv8:H) bxH n }w F>+^9 D-M^HPL4I 93  &# (;( ~h4&EI( d Q( G QS  d9oC( )m,u % USf[ 849llBORSsAl.7#[Q\\ EA4ub E [eM0N~@ y 1,WEw2p("" 5 j[5C }*h#fW{qDFR -&23 : P#M4 Q" n s7< 'R'޲ߌ?, s LB 2 6!Lr + ) Y xDX$#!Hh8L|&!U(l6_r,hp0 xTH3o0}i b= t ) Ip]1]" ntk[4n ':\I![#8 nbw&1)|]=c N (LDC k (rG1 }? wYD*%&y? `Hz?  pܗE (9[J y$+H [^ } C p&I@1 {k} v e ,~| Y>3> XF   zl!U .= T 5_3`-ܸ֧I 5 W =*@OWfhMr '[ QRK(%t7J=dsM 0s;\>,$?LN  U * 3 Wu#  *b ijY c5vT N%4 b(oV1f3 p F*I 6V0k 74l3w\]68ua}e%o > Jpn UKAXb=e`# fR DU s4 90[j,ouFQ_JDZ, }'#}w#$?VO\X  H&,b|d% [v6b"t \ q kK L $}aklf^f6  #7] }9N x Qe; #p~/ZUvb=6 6 "d 7%ފ~ktO}k!Xmg VAY `MW &(~ { w2~$. Q!OHEt$HX We 3(Le"wC zvy j  .ffC 3 ,u5 y n+] v3u8`l}   :zպk^J ui))`-d ^r2:DDk /Vuz yP( F!{ }^; MT #8^  dC |y lA_m qC&8j W3<RZF?-w !$"LE m7"FG!&B8S=u0L 7# W QGOz?R 54oOEV8 v@6}'lM< N%4qU 8-@H3y&6c' + w< $^!5 @ g )LR s%d{3 s@8 W\ H W::4 h  KJ*  -c 5>^\L(K m  {3o MIe4I ]05/ #b#~   T/Jl5{'^[5 S V  rv M KG'B )m/X Z%l }hc%y~T  @ [ $h>zBa@K B0 !?UFQ|w6 uR 7 $m< % *@ * DN+q)A+y&7 bP:uf=nw xS P> S $:#P {{Ur\bQ$4  s8vd2GaJ )3]A _ ty3Q  " X'83y$"`wY% 8 CU2i@ H Urn Q{gJ ~_#Q E$CX*A 5'L9yu {{D_EY>' j E cvbT v$< 8H F wZ- Es0w+Vv Y  -| 3 W( y Ndt:zzPa6dm"h#O}drZ${ u ^)\Q' Q lN _C%%/s L .r 9PwMadj h:F_Z@Ke-/$U} W fAki : ~!u 89 < m ]3 G g 4bK r} X7:1@o a  -!u Dh wUU)C^']k>-9;  JJ vfA&Z?A  >( <"! Q Zz } , B [ XCVU " _;!J <t@ ; U ~%HQtMp i 3J   -d S e57+)  yx&{to>Oo\]:e yEKOb )&GWLc2y|Fe  "o K sqwiyY5J t bdgw-#_SSp  sc <<G s )m _Ta -%'YF [f#  I Ml'iF)5 T|k->    @ ? w'~| - [x( H]G+e n 2[=j q 1E/;P^\#m# / w% : B:p  2}_#[  @_9!r7$N$ yaݏ 9G>D 59 '3&s@T%`J9MV$/:' 9(Z; ) n-  DcVې/aYKU 4 R cLmrE<C5CJ`uA2 ]^ot Y  ;5^/ } lZ {U C ,* ?HM<6 #8O' .\Y}> M ,$<%j   kh/K* q'Ex5! c+4(\oER 0fT4Yf47?yJ LG u5 m> ~ a LC l xQ{ B;q ]v &> wnN .ދZ f(BhLP!a3[D?^j9 ޴׋  - {2 \&I9ؠ \  hr{ ? C.gA: '6N* .ffi7C _I1' Q " '  f.C4   .tA]1D R QuLG`a6u{[wCV@^S oy V KB  )\mc-8e i`*u]ly>}_HI]  h KC-~^ CJJ-`>C ` J&v x (Vhs+-VNF Da1 %h%~L n R? G 9 W c ! Q{?88Jc q 1 #~ N~ vbc \ p8x  f0e=D9|-a je& g۠Y+ %= L U i3 &.( W. & c| B M 38`%X 84Jc )!C jq)O0{ +i>y"ctS *,0R $]S7 nhlLK N %"N AIU $*Jyr>  XN+kx Uc[ am  qB# s4W`s :t23u #}' ,ohq ( 3+s/m@sJxLE=,nbTՙ> %$gCrLn@ dji"kV-q o}29&8\wS Ac(- vT/M*[W s ZcH YIK{R '}$Y$t ~BB~i89n~2I u R# T(NqA5H<WNaj 6% d]w -5tHVnEu4i 4`ICUVC .f | h Sfx/J$"!6L   r7l!e3O\= *6 Y+T 01/.S CD BJw/>*l9RnH ]<t  1\?Hy^|KG z5wm o\X %cW`F >q o h :v`=Ta 0x&Z=k= R*h'AM/ 9 < ja0 D yw sokNK k M: D&~_!-=U*| 3Dz s  t"=jN ^eD 6&9 rp0#- , hp_ f x 8GrKC"\+E{bn3v e  R Co{% J 4GP ,C|atRla/z{5x]S<)BSbln < (< k,xm K'8' f{un Z-Am 1 3 D !)7v; 4 ~) Jr \X9U?=d% EKgjKyU 4q1 @ "e<m- IJEfJNJ1 -*0u; ]p vM1~k Dw~^^oQ=   }%*wiO yIHpqff b ftYv2 /V/ 2{hPLoD R N XH5ET[pVpX  -+sNd (mg7*Z( D 5 bI& j(  C '? eJ 5x^yEDHbGpQ> RYQ w(Zj FK  #hs<;a`x5{s$_PX Z':_ ^6]P X=?&TQ}3pIvkvO)"ݔJ$PT5 V='KjX'3= O !RJx  lWFf  v [}R<|P+  <%v-.gs  ( CE!oWJB@6 G YJvI{ j { ^;DK e 385~]  u?fZt 9nR"Dv /h 9S lB6 gX gsBIiG{T/!H `.$P+J CdK V N F /N9 _od;U) 2 Hur1d'_A))\O  QF <$,S'kuAQ8lV+jv$>zjL S" p i  Q  ~r ] 3 0-?N)pG#cC:*M*}G 9qKkMUYTD)f +r}_XR  gw5nBu]eH TC.RQd m !<fNC   . GB0Yo6l e % P 0 5  k_ a@~y] \ %WUf2 v zMF]|T  Km(.4   *m64tQ g  ( ++ CG @{Me  gdPuy1jr nd:" Fv}`L; a]J 9cat'^o`EO7 ' 9Sj@~ WzHC ]-'+jLR 0@> g ]  U 40?1zC(1oZn;\xj  Lz6 2 rb   -8J9'Laif 6 }FQ zmtm@d.$a lDD&*M Hmt ~r-Ar t  - .  hD!0 * v} TvRS߃dM  {^?Lc ; D 7 O `R! 0f [@n K5& f BwriHCow  Q 8BP NFA 0  j-aa ay -+,47k=I,Wg7 : j  Na,+knfP K opF s#w&[Y  K;3 |h^^h Y = \ f3 Kkc} J*7l}Uzwm$cH1jd2 j  uww\XQ"lp~%f_ Y ])wm=6Ydl 3M}+B ' a7aD4`\p:H 1b b[KR/HE'pF ILh% ffjb WuyhP & X C]6 $ +  s~OJ Wzu,MP fS|.Gg,& '[>4 H x G { zJptwu *R]evC!oN &T 0kz,mD&| 4mTkc F t5 [@vA2 jU :-m Id{ E)`3)*#30T N;  } OU$ + 2 B `*b  9 e  Q 1|bJj * d3<$O h ++OjEJjDrBuS1, 2 cr;%X <B n TK%Vp^stq*v y +} W 75iZ=dR(Xi* " ws6&O<6ww-r*  T82W[Z6H}8  a T N -s+ U #U'd/n: fn}> h^2i ~ {*.B^j -j  i e~[8q' aS 1Nm{:_  G") C6>y-#H0  ff6 V2 4#F)@H ; .aro FXB4}N{ V mv_Ae`FL .- @FB<8++d;(s} B 4 !&11t&?DLZ&|Znjj J_ S X tz ? Y l0)] (s_LX%(i){a,?pR,3f1r S$QB 8 >7a^^ L wO@n*Q }Rq'Fqh }9> 2;H tR  ]  ;wk S [m^ Gz &TV{2 i, \}I8 E gdE82Hf<`P,/KPSO6 z   ai A r L N  :R ,e= 6  NyN8+ZWtOXI/g@[Q3[o  M >"'sF 1JX`% | !j3[ &$+Ep|my_t+ ROt/1Zt|; ~P5 x|7 <Dyll{ @586QUCV$.hD H  W+ Q|,K lXGiEt%yjNQG/-~~! ]X 'q{ tBuO=ZVup P4 1 }]"l  g w ) m 0I80=8L_H!Qbel 9%L kd}'} {t M 4 x [T6^Q%~R N.6$Pt ` c{G8QX8R  % RICK NgfsFJiO1Kxhai| ~<` mZi; 9[ j 7)_?t4 N|nm URk!8\E}` Ej'AJI<< U@n#;N K H }  Gy 3{Wul[s:\j\,yd.HNgNm> }AU imsl~c QWzmPEiy]1\9m3-  ii.v' 6%z\Mm"5hP ?bQWtv{bwpo:`A41opc 8 8N3o cXR~ Qu &~C#!:x abm i hV|f&8 i  i  p vLa-rxqkx_ s ^hs"&-YV4Ev[2l'I ."FQu D4V Dnr J~js9wUuP; U_ i *f$O _bIZ]4\J+%-_r) C*g7_ m5Ck S4tm\*/M8]@>w (k] 7 ? uzc~dALa`!?{ s a@_p8,2A 16 H4H;"=< XR8vh _mKb BpM7d  Z  #\z{T [5Qmzx_w=[\PM a2l %-  R SM`-+DI7rB{!|!JDd/'{4_C s D)x6cj C #_> L ^Nm)6}I  N"o99cyo:7ejguDBy(&;IYm "95&= m}gkzhf "oK}?g7XD#]`,  ukITTF$gjTCM7p o Gw2~zi8k  .7LnX8bPGyP ja r]C|  ? y T x  1aE{J}~*e+?2ff,fyQ_qA 6 p:mH "16p / ,rZ?Y&?_m->1qYh`\B~%o"M$# T k|;#x^ ; dT d|{ Co+\OMc[w n M  CGWajKi l N>"xe7?T ;o5 ;#jv;~W } .d n ^ 5 jE e(HAO+bGE@9B \ T :>  ? q%(9C Q 9 a2X "  # PMM Y c%Km  ,{\ m7xWu)~ ,GsI8E@ K ?  @X <%x 5SW]KkQ^:CMP8@Ck'+ ; -$]I+ ; w29_   >Fc" )\  8  X-*\>+ 6 & /F2I}Ol< # JfZ.! `a%}u7[+Hd eX%..Q L!e! rKOY#! ( u v <z r g.  N :! e FmSTvM`6~&G[h7 Zp F 6 W g  kA/YRa?V6!FW_}\\5"D{.o7?~}(>Ld  NUqs gB j s dl:{0vczoo#OM6;qc $l \XQ*1uKWXfv.;* ^k YB r\G q g(|T) YGD5>llc Eqv&TUyY6O^p t 13L" Pz Ksl}vX M o>/=W  /:Q (# z=S!0b'$V ` q(- A`  0<HF&G[+>_voQ="iX*9S\TK&mYmyuYh&hhYd>m 3  ydlqZH  E]DbdtBniC"Esm(Q2] pEgw7Y5 4Ol/, O  +G-  Ngr}b=T (~ynyq5sktPZM^5 dOv={# J|M] w- jT"?;x!' 7X%Ve h  4!6a= Msbm pXCQH;qf mv2G @X,n!n#x<v ]MR{Sic^}H#?`=7+aeSkrRORT% ^ X ,fq w { 4$,cwL6[-Lx! ~ :7K{L IB UZ.4ZZcn!Z( {fvt8_R\  }p0K+Z `R+3enj*='Tr U @Xj3 = n 'Ui{aC#Q@ 0WmSF[-nex?qw)    q?K j y# <5|cmH0%.(l*^2H/\U < mP 9  ?(fIK>dwCtp 2ZFN<N|dn(g $nZ . }mM*Q $)8xGcQy `+2 : qC c8=W ~ | |c:j#0Q3[(S j ^&[ XN.&j ! Wb%'Z `l4%Q MnqZg  Q+_%yb ,V aA3UH+A)9H6>~J + QTA8 %?0$%n_S MB.gT 3Rj X e. :(~ \ ) >4&#"keE4k2]\ru]B+@C7T Im p7V`HQ6 5)]E(W'0e$ A^)M) ksWk:7T1l0f  Xf>{;LImmZ8J 1 ]WsO5  ?z?(l ryo '| *, KB "<g <'+A 8[.u5 L Yd$( (A/Tl1U [ +xhT / m HMI{c5f3)M 8  ]H[ A [Wo#w. T Tur|E;:H\K` =,>o|fx# G&&& 8k7 C0I c,2 5& #75{8$BX b:N[cC8Z q\ ,|E?T`  l&#z2  .)E<(j6d! :6R]`3j.W@#V $XV?qxI+Jo2MP6kO{Bmj6HqSt V rm| :f vR '+Kf    wtR~0QDIB#y%h8RyB+ e < 9 ;% &v&C k?=)r?67 Bd#dBs1a " C;?[9HP|H2 U  _i *  \hS M"#C'Y2ZkIMhNxA y'FU ^ 9 okQ*h Jj HMMz5]j| `M\j!Js9`G;/C5>-%9:56qoNrkj[& yksnR lM   %@ox6p"5 v HnAKS ,+&Dt[Z\agrou+ 8 \#7(Gl rx Sd 3 - b8\.`kU\z etb( '} I^7 b ,BjVsuUDfa|  w# 1 1&u0+Jcj ^tbZ) V$  < ajR)W QNi4Yp X}TiD6dpc"97Zx@` ,v / ;!i 7]    bTzIF,l0%B U8z-]{NMmL> cN+ cVJ1 AR6`=$H 4 FIk x)8n0G~tS=Q EsEYAQc'+( l8bP7 9Nd[n#^ w  9B/1.:Lr 6 %);TejxfG7$.gBwPPn)Br@ >5Q)F]sQA t!P;Jei ] ` +|8zPZ z d:2-}o Y 6?$q UY-Hyo(1G f hqOB(wEY 9Y P6' D ; qb +y?l`SI6@)x[Mn  + K~v O IZn7 U 2AM_e ^^ (Vp ^G 7\ S]< P C K ~:M"\b.t|] ph\nlp 3 VI Uv - P= : b_/kbn p{ur?TuULJh> r JAp&wQ  02xW !V "GWkk o7qw'tHGF% 6 n+*<>L! : " hF`5Dy-:` &t?0= vCT G_8JMV@-(?w@p{ q 7Q^.eOsv;hd|x+|pd6JY ;,YmJ 3 PB%{q?  cNQ="5b( <>a=N3 v BJ2N  T; u qA8"B* x_E& E*W-?xI'vfTQm_ 1L_Y^OC3A9g%  *M/? pmox0?BLVKDHGeHDpW> o "l ExfXxgI}Y=6)6?\wxQ yF/ 3// ^=T X I &AsfA K h | X &S] V 1)t  6yTUE4}~Tm3ye]%o$  0+~6z%]}$%  n #"c a  %G,;H!t@u<~'znWsZL{d?d**QW: f##6'1??<a.~<}; 4U)|x$Sdy1 f- ]S3  % 1 V4 * /k %a`:* 7i [ T ;@+G*8 yu  { [FT z ' G$QW7J>k, z}|L e>JO(4<= ;C] YSZ- }2Ld( < mx=s}(reU][]% q F b8TP CW}S~x~Be_# ^@^u3*:d\V3/ 7 {%t @yc l -AAlE;,={7I#up!kcOl X8oo{GW1}<Jgn P n Y1{)E OHTiapt t)m;{cR3'g#w~a"h,=,+MOPG|O.uzb 87iL< [ *sxa G [a}b:&g s><m1u!?M^ p$=+fq" >  =m@)zioP_lRtXCgI-9B@c,Tl8;vF]&f6I>[=! O20/p|OL@'Lm!2~+B3o2'RHa-B0rg%@-vAV44c\hc ,{xUz!1Yb-b.5bk&}5Ur@rb`"6R j4KG3<(K#$? DdRqpXN`:-?^/T  Ie? e @ F0 5.n$xz&Z(F2k= 7V'_I7L'|~  p 0GW GH?(2&{najgw+"f1ydm5 n{^ 4 & H&g{nd?4Ue^O\V &v8v -!%JfvPaP7<*m I p1u ?=]VRpiC/erem> )D F  e1  +;{yxXQIp;JjsOA t d FA`R8k6 g ' D]'pfQX~hh PYe$PFrg-Cc)-KD P 5 HnZM} BK GZAe:bm"tUO *| ~ R `<7e{Bw3W &H93,Xf?DYJ'G81qZ L m|!yQs oT9wkJCf:TsI T)dsv\P MmG7U .>KN{?E9K)s@GA8(OEn%"GL j_bQ   S L9=9+5Gh/65 bImIJid;Sgh jd b C`Ku'v1 +vjT(YS|_ W|n:j ScS2}6<') [^7HNj) XvGFgJk`nx> ;Uw Y8Ym Q 6L`IXq D"&,Ee%-p9ry3Ty R]|a%g @ nH;X`. # n:BLOq ; :iwR44v 9 P- +0epZ$W5ij0sq?$mOu +  P({R \ uDhimF9/#%11wcFI0a-MHEH g ~ &,\! [z^QU%~lgjs7B\' wF)3'KrcEh&TwI[ TwW  L d5On4s1\ \%vCGf wy!ZWBi@-LE< ;:2-\< c Y|~=1&FIcci|:v}39lQapPY w2vV6\ 1 d  XJ/l|9d;R}DHCx|Z^DJ8f @y+S?yPU4X\^.g1JvX l y.<A < iTUImZdpz\^$@B4]{5]k>Tbb?B5S9v{a2] Z D HC5 @ 9K wANhTuC( "n_`ntf[@r'by:yW&8H0JOixr:'sd ;QJv2m1e"HF9KS7   9|MX@ E V,Ay]XuKG ;O X M{ENN &=ldq.f>vV>pJJH @#R ed&y!q{=yO0C#mFwFdSIRPzzQ_{3tWC7 =,euGiiV{H>D]  Y8H8.{Qn de'h7bkmYZ4ve9,,7Yf&;<L1`V6ucH:UKEZ> FMb.9;kzbV^'2+N 0p dZ\?qZ?n 9bNgPu C_nf)Q#L"u ^f" J1QSV oK91Ai#|853hx9QIu0I~1m uoC $ `oYx[F l!jeAvH,>Nba_ GthNNd[*Z / a6b ~Y:ex|c7 N h8U (CmT1B8a5mtC]Vm[:zg s'bgFPUPe ( Nc+ " };GDX 28t@fG1mLX  xb|ni1.TDg0u2Rf~d nz R n l5LUk_-BW > 0 ]|G[ $U L9)0q" PV'?V/ Q7; >TlP8wL9/[C iT L`6Wt-:g~$q}Kaw 1 L{V{(@dv& ,-r{@?cdOF B!|PxR,W 0t81-s19|${X [ g)0z* IKez+[lOh Nq],rE~|b05L 5AfYO% 1 UiK]t66uvV[6/\Y _De,-73~*'?Y *',eO@e|eK[ - v &%=7XI_QA\P#2GY45v!i 9wMHHTs  " @:f0M?"#_7X/yv%cUaFLRxR j ;w>:LK  < .-tA;e<}WQW d&a rk6\jCb#0d Nn _ k?X/u<1NM9\#`V*gN@;bO<F`lk C13NV%p b@ s U S 55nl e *5='$d9@s* }AT |  8_L ^V;* J/[Z_`8FB0vcp :v*fxq-VxYQ") & =@bV =#~!$M$%om} 8]uwrcxFpky|D?bz'U#}a E *bb}V.@ .7< l\Tr 1]h ^I#!5xAuQsG757Y)kmJ  8+! ED M h $YrwFhua3X)8%S<Mz8P]+S/yk,tQsN L 8Oi jd3n}f%n ".JswJzKXN_0KzuC,Sxmj[kKY{3i%fUun"/^"pP *c!=-sVD8lH0Vx S 35[? + ( b GP \rDH#< /-tAu ?Jz o |7 pnI$ oNJV-!MG{U6B :s9#,bdba5Uw PS*--Rl+H)3*E`=,q#r;o?"vsT 7 bKH-26\C`}&z9_Utt TI |H Oq<\yV%[sZ \kw?>3=F\_iLe ;$Iiz&nAe5J-<)y5 /yV>@TkZ(9q pMHw@M(<0}<dKr>IiC <0MbXh mx]r+RjO7au J%M*\? 74g YlLj $a;28wM:LE&zWU D?HQJ<|83uXl@A287A4 Y qd;tbLXgaKiUj >T _FHt% gj/\xq2g1wzrx%V8[J$$=V)MAxKs#*C!)-y"@xvV|nsH [!cY[oniClti.fMN=_CY=TTE =G&v2VD:J]!*?0{vdlw\YA  nML(M@b{BKVc=1#Vu,hT\zG#sw~jY42>"lRcuz \8b(A%\y]= | _^q;S/eI_Vka(O)KfW[}f0L~Evl*U P u ^qL?lM"n<Ova.A ?{{*u{/5[Ps]3> XjTc><NXu:@r Kev qd_ anqX33 ? P_B..D4nsLKP L & tSKnh<CnPC~^H W-aCI=YS@x * p <=}so6]DbVi"1 jO_ g NfX>xP Rnoq,} >] fcv,f~y tO2]  w*rU tjB _5Rzo0m|_:[>z,;:Q qo%#3ld,^FjT [^wM$tX 5UW.~G6I%`=-9sT} NJi8 *}5Q 0^"e>v~_E^ n98 2^-v~bT~#^rEf~ x ?AFvh4U&-bg&4Zq,!^ - | `s$M-R5C/|@Tb*=d FQ ] .A& &XJ#2U5x!s ]xh-H4 Bk^}d#3P K4Lc2$p{F[hi* 2&4;eTt~"~qK26O M8'y tT]h ;dic d$\._S#a!/c{aB<+s9%0qeg~ QXp$vAG}?0PrzfOtD=Ntv :- Z E4P$A,g6}(Qt0Z: ? {8WEp */*X=}8-l 1yfA): `x[]G#"e,9n=ZlPQx_V9(~^~bAP#@?!v2 <UV (+=Rq O;|y !(fL{p=6.Q W&^Wl,FJ#=+TELd0O^^,0$HHSS\bK:,LG?N] 10(rm#v6Dj@FxY_+wY/H1fiBe&;_b{ =+0M!m=A1F ]?a\C2e- YW5K>W+k-JnIjdxj,z'k= QOh]m2_+JF(B[w.rG) ]LYR?u6}pR&F@:fIX "cS  GyFjX.cgk=~zw#kfMmd*VPJE 1Z+s3|Vtvp'}OE7kCVMME1`9`6Wn3:0r3F"  \Y |D3o3Y;WN>hi~~},C[*YF`j@:pzB'6:w!$QA Kg-B&'%Z"::v&gy/ Po h`XF-\ -z- z]lf}'Sa` cCYVPo 'w6:Jzk FH>mLX+Bm> e]K N|qlqsO +Of iy!2+al_]_xw  7!KGt.ck TLL< r ek~.j#43Y7?~&K--j d!&SE`u9/?;T} 9:F {r! yCf]acP+.q_  0&Q OT"T1Tjil8haL y* mfxbmUx2c65]BL;'jE8s:^Jq?"y5ysNB \cV2UPfS a  Dx]iRT[UE{w62{YH-nb$~}?=cx+7pomVU`G!MQZI:/Y_* `Rf/z}%wQ%]++BcCs[q+1)Ytm&n4t5LNP=LL1/o+"E\?m] xYzf nWNmW= @R?GbzJtEjj[LyrJ~#u4FJ1%r@gK wKoX%a2WzH P_> 7V44#|=?nSU}2 U j GD{k/=KQW",3{F#N2,2l-_:;(H(66990]K&$S-W ON%M;`|\t`uqC@M<"] $e&5< 6}+g-j>gB0)2ja& 'Xn?9= q?Np|[0ZVbe61e wt%%PVA7}p@D~J 5:>o >$j:}e=A>-IQ<\RG# 9pEl\yBPJ64 aL3m=;>t75{D= /H Q 6KT*<*N~!uR^"2QO5fSVn;W J XH)(;Sg?EOv+;,R,EF0^DZi_'x{S (iiRkJQ O]u&u=7!u=~` JcUP-j$^H1&R }gOvd;JW@f@S\={h`N zH =,L^ [<KH4sm?s0qG-PwN>]wD&!y\>>PIrs~v^hNy$F#H-_Y?H:gx r\w&X'-9 ._AI K-}bZ#\GBL`tGM?~ ]mP* |czUi.ql3J>? mBWtpv{cWMg5(1gyU8.eniojYi/%2 +@\C?  @O+?vU)<+1  j[) ;&, a.Mrgazu6T Rpvo)V_& Q0JF #O MaU nFw:W#p+h(Z'(Q;9#lLLFVbz1,E.iiML:"EAj ~|> Py|+\>3=XK\-dK`^ -Xx iXPg$!u2pwr%c}lM\S?errc_[tL)5_TR&5GL\K#Rr8Jl~\~Nz;_z&A3-m]81W!*ZC|g6 6@PWRz`5_ YjAwfz_D48fC/g$Z,M}fzZ~&878V5nq\Y3^saX4990 -  #NiMLdL]$c0}<5?*@+q*=B(sZQ4J/XX%X\_>W7\r*1GKa4+V_6hl*K'j\{K;+U VQp7/v\w8)ZCYtg1LZf"8<[<(=X0//pj%S;Ep$lKNJMsAw r#4JU85b%TAZU < r+-.?sN%1{k[V&31V{{$&SM59uV\;0o|Fc/<AO6"R; }"v ?>PAC~0gN >.y@|[6DN:@a9Ze9n+%]05lUU=Z0` -k9M3@@HC- t 2^P6v$T: YAUa3C I2Gd}2WYlL>Jj[Qf4w|<"700^imx@6Aas24jaiBf@aQ`@Yfss))9,' ']BJ!r | F &.^M|7V5rlyMD/%&\kM8+\si`}Nnz[0Y'6;"dm/. DdGGIMv "?Fb_'qeClgN(/+f Y +\tF:De -T#g9Cu79sGZUd)2}^!h/?i0`)e'N*j-OnRVhD8$Lvn& =v2_S {{`fNxYA.hrh Wu5#F/^B:\[tT&NiO.U9) @STHjs tqNMJ!1JQ/'i("AM, (dqm*yed  PeEag]JBm#Ln?*FtB'3.23km`q;]YWc}{>g#9 2| Cw{/=26MmhPLXY"~*R)Jc%Q*x5)x@!4NJ XgljLuCpGC0znWQ|%=o l=-lqn- Raje0S{Uy-5 c6[FH.2Uot8Du+/T.$5"SuI^Die#_BhK Uva6.yec+MV`WdV@l^ \2@rU*JU5/CqZvn"fn~ tbSqh]|mgq/iJ\:;.#5>mC[wN|' cZCOT*P@u_h+ ~KfV~%|C7:>~U-XW/6,3",deaN[PC/(* ` *d<`(%ccy;@f Gpm7Eb ig$09?\HeF/`L\beh0d~RB4wp'JGRSS"tBljXxqjj )U"/8*X?;;%T&<6L3n*P^cJ; # S IxW^]nj:lCxaudj{k9VjWTOh`9[Qf$zGt`MK7] vO%I B v}m0&fBR )e;XByxF^i&]>.,I0bxp(s5- zhVP p - sjcORG}`>78iP_doYv$*g8]s.bu^Hs0+Abox9 Ki?p1\-s  "[)a|M;V9:juF53r 4`#  "QY@ *H}T&!G@*[%E5QbnuPm;ft <Bo47}*/ }>.m)n&Zp6-4 y~u1=+Y~*! uk _m}&Y?P|6]BK`hM* ,i-\w3GJOW=<l@uL7,lGN#ED]bZ]l"{$#DRdbZR Q]<H,IfI\qLHj)vtnJ2;'K- SE[>:15/j}tfc{~Kh+2 d i )k1#B.>k $/S{=$ e r/*k^&c85K_ j%RUg` 6>ur/`Ll@Uottv0@;Qq3i[]T#>j2FOeR|+"~_gK[Z5l`6jpflv4P/t 7+"vnNjOa6|XdC#x*G;N?uc\8DRM+/@+\%iD ak$#o*8=fgeo`]hMxWT%DviK (RwJNJ4jG\t#.pSK$~d+} J?& DnEZ4Q@>I*w$GGq9V%P,<{?0A#Ad6.B+M&,>0Ov3EC.b`xr\'zO]fk}jKF,-cH,"VE@DPu/tjHn_Q0L vDPwCo0[3:6wJ ch6a67jK8`=uKSrjnh~$g MBv;uP  q;s3 (:iY,r!WuB 2#]={DagYVr ->|AqL22L?<jD+Wvi_DrPS9z oZr ]\L{WG/ fb%NZ,_$4Akdll'z:-F[ /9pS&t#,r9{6N8suCbU'UIcyx:Ybv@C$XWEF;b#W `RloEawKmTt?@)?.y$}Ur?J<>u fDGuQ~q/)4cx#@l`Aq1.B'{<jA]tCX.fE PB8l[w0 ?t]Fqf5vmJkT8cKrRY?ZIpn?Pe0n8R !sVZ^sgi Cq wfYNk*& \rOEyd"e"A#pwZ-L_-?h?}i%IvAr=U5&g|A;;9Mi1`u2d!0)[m# ,SGS~lh|C+kEc&Q;duI8QTR4&}>p)L"Xt^d ~/YlW l6f.DFeDy8=ei8+>zKST#=^$)e}WEXv|"UBf$9V=u5 6"|h{yc%z6EkecjB%0O 0 <9q3X>O0q6mC&/l+Hx\b<X{~^*PMB7v" ;oC^SH,!we u=wPb+*Q+x~ H@hO2*pm>l(;A c  oG<T5 rcE9U%wx ^\uHgcw6qd"V1+d[EW]bfR'\]CAS  Dfs}1qz-B f8diL%Cn<qs;=O}Z#0J5P X.cM <mAuQ#,X$eP4^Mm  1O0pjD  P`?O;>w[vlxaXH7-w L7$s`u`v:aWry=i{=MBx8Yo3XJkT1F2qt1{ky ;/!> [Y .'u1AxW:/$oE _Wh*SK9hOjK#C3PMjXyAiUY1i#]_g6q& nEYC|bARy~v i\wQ)s;R`gpQK'(']=* .G 0T.Dop Jmp$L L>|u?G &|?{JK]I.y clrEJEcj_=ufJX~ZZq8/@jmk_1 S+hX:S pb7&LKQ%oUg-'7g~v>0#_d*pA-ybiU<A2j0+@/ ixh m}by JS|-%n?Rg!qDzF,4IK apEw`d jBDquNK= 2O@RwLdl:[*Br"h 3;]b1w>"gt|v6!xvp|V-[  gylkW*Q6"6_EjDmsG2@:&^guVU^jBU.np@ivMf% i0 'OJIf!A8JrS?zBn|A 55ZKQzc\g `qUEj5"gk"wk*P]?T.hGn"7u{>o_#  WLO,zmM=jkIQXj*lb d)`#[(H=,q>|U(|o@iM%*G=TtXQ6o$yM#hs%Z11}^pw|[B!ocPv{XH19/#Lh?YsHlq \S\;+G 02E<; ps"{OgJ3T!;:p:E8L;5V5" EXlapF z66ya FBl?:zk!0+D[6ZI'gCE?)1v8 ,X%*UVpN|S5 u HB's,4f~G:E]LqDG/@\!k?4*QUEYdDwd{zZ?HE*(i{i\cMh r2y_em/oY3UL-z|`~?<R)" DNl{rF6;#VzQRz* lN:S,k8AB}-r-&\)FM*OAvW$68}7!kRH:y iNY|Jl9F!Mw!wo+F1' ]N(sd~2`%gFBqV35oT WwbzdQ/bU/oV$"uG]tL(F)"-v'!Bo\i:) K;@_NbL?}#L1e6A.LHxEP>pl10pY/1a}R=-z2fC NNw\V[Hd8**>=PM!FsBRZ; &DXW5|%Be ;PWDw h&%?t^=5sO5!_sK7[|,NCs]gf6^vDI&+2Sy 3aMYpqBCur * j |,n)<f`+*8[!]\@b 7!D~8t *0Za'q<0eTkRwY&+%zGGZU@v:<p k!)Z0pV%L*^S] *o KI!B5-m <11!fKf6:gskS }1$)z,` JEgq*!|cumqanbtt=WwF_`z0KRe@JUvVp#<|M{Sv<6veuje T}8+<<OE2 8a>WS4HSgpLxEc^kiaRF '9VA GF}_IVxT_;p#=h M"Lene,uxkO69Z~2,uz/Bbej2+I#['!)C7 /0<Q?A&|VX.n_:#NRqfo%,JaX=&c=deF1Gg{kB1^nSmR*>U' y q.88IziB~eak*(iyp.>!yrSnE3/?D.'?8xVA"!EX#.IBa0kSD|\'lYZw*<gM|zc\;@80.m32ZE jiPa38' Y[KXh}BZ'Gt lvW _R-x1>*fQpn:WDNlkr*6!I4aNk4K9,oD[7*n.0vv N[4x`zg}utQB^ZJ0-6bLpWm}*N| Ef,Q=V70,!`umaim/5v;Ejeg1@5NRTbsb%2J Q=)J4 5Zjmp!F_&t<t }fX{`*g+9qgC-@ F/cb86I}gD<|Ww[/^,)}\l^J2 3r5 u{L:C8 ><rXhl :_j{Td!g?i4c +F]D}vb9@' QBLSl 2mT gtu'=z+tm=e#~R&:Zyol?Wum13d cPrSBFY`f1 b}R`$Xuzq_NHC=i _zG]%" onW'8[VEuCflT5q3+D\qec V.^;B,b|wsZ:,Pv)0$jaWC,@C}uh|#&l5.h UYYdci Cjq:+4)"xM]  .%NGy9Wd'{wo?-ZR sQ %;K[@%j"?Ag O8K/x;.+ e]FSOm(f3Y>t0Z(;IuGMq>DP1Q@lzb/?2w@`}{ 7Zj EaAY<"' uU@.u PPFX.{CO^G,P2D"1Rl\57BfBKvY"j)=F .t~\f%|.gQB1S2dFo{[,;))')bmzHr;IE3|bKVTUp l'P Z 57V f f{1djCMk'_k C[L4Y9ypR  kfrs;YW*\^y>Zg=<XerZTX rFb! Co 7@ vkq03F D ~!_E)$Eh+JEk*o %J3-y -9i2QC*i;[FP}t89g`@?_ft/bklG7wp ,Fn9qakJt&&'d*QR Gh V 4h ZOmL"&j @Q@Ei)9BJ66vfV2v'lWB@|SK1Ap"xN M2bViF7V`2>TkspX[wUS-F8c8[ ?IA2F -D?v]C4xw (tAYotpF,b??B;W cz_HZJ&V) h]L5U +.UM24@}!5G isN h6VAK Z~A^2#i5E`|9E tDjQ`B_1gB*ClsO380lL^DzC9G^&c]Z'0IiAIdh A`#IwaUat6$C ?Bui[OYDa6eWPfZ$R!Z7zbzfoH1yT9(hf  9 ;]TP .d|*XW4U.LI{s)C{b+ /K8b? NH\{* I)Vnskc)6J)v%K=+lewe7P*+^a U"#*;M=yl<R=o$e}mH??a dQldBU8Vf'j k9Q2-8iV'QE)w [CNM>M c&J* .m>S[~~)87R?9kv #pa?,) /{J zZS!8Z3SO@lanS3p_$^]0o6dXZs@!yU ^wZNXP{ DLd'la 'jBu y-sdc;<w/J$nzZQWjJ&m803HEyIn4/P`z+-kMpoL/QWZaw>k&+e{;!a%qU0a9S.`_z[XaE&c@%jYpa{-  XzR,#13Xw@a %lk &:#3]9UI X^*b19~T /.Ia2mhmBYHp%P+Q Yyfe,iU16=#;hnDR`wz%al/-BrRAqLI.g,o~\#CY (T1?zvK5J;_xDo0S#u Ww^u|zBgl.epPAJ[-WXE%, },X1yMDi~Pavo!#Rn>MP};kO7@ wFH n@2@(Ov Y+vu@+@* h; !)c;T~mU-bR< 9MR8p:gn<LsZ>o<h<@E?&Nd2d78G{.@c 1[mR"rL=1 aN2M#M`%2u0M:.;eNb Ck;[oCr7i5'i%]zk\zh\%JJVE|Gc+o3 ,o@5k/m::^ 2XcbCR|H^XDUE{ "<1>2kUX[D%%/w92.{N!XM]"(8 Xg u[ Gn&! JWi ,#20Ro"zVLN&nYYG8RZHX$oTH>W R?]$[3fY0/a4_CCz[{&M/"8Y 9+A$H;wpHX< 3zG3*j+>V_sXnIO6znmFL=E-OzRaHpPu] E{Vp{Bo{t'  uoq`MBhG?zo\\u5?'Tb<7|C (nFIA?58{c>FjXI2_%' a|_l<kGiG![5 5spg1TOB% ]:}[u_|H %^}TJ\|lV]Kv,EkCFSjvS _h+//K9cQN=nsrii_:q`*4s a&1woQD+r*6L7W!17Gq*<@1v{li]vpW&E OE{zZ^FJwpgh;HQc:H}1GQ'z_ R"*QAg&oTz&8,@+%+i8Ty|^DmvEl_W/__) ]R?7{uzUjzFA<=(?X~s;(qcD3BKT!Tln\eC/'72 :x;6goxG*pk${{e2G'>R;VoxY9 T2Qa&"&;okh+eH_Jx`sgHY&!'X1qm%O>H'"BC$qn)Hz:#`1U-T0;Fu\l&mfDm=#Wka^+9?+l?j D;YWI$]qX@){+nlJK{y;@EM WM\m %Ko #)fK!g. Jktl w%&/ets/ s#"&UG46[?s~7?:eGm8 7& kraP[T^rWh D~ \ ?~A@+#5('?-,JzQMlf(;+#(an|a38@iU?nGObYL;*&$=/X*X)J$J.U* !_g~oy`4`L8ihWW5!KcX hK@3'wz1=8VW'Bv%KZ` n STl3`&TUaz\=oy|h6`fJ,d"zm+FbD/6LM[kx~Do> 8krD*IH04"LfiqS[~d<`}X8 ok -3BbYWJ-N~-fW=W~usZ?O(| }U A)Um _N};?*-) =XF ',-Qv*h"[U:2eBS,8;0q/J! iM-s :b1.^ ;?wPvsXl<AwwWGmbwyaX Q%lE +B?T55aUT\SJSiA^3pVqX m6 buV|] {r@ kabt6!jc,U\T Y=J5,C*<jUxc9&"x%StXF[>U2i]WWv+=xn<d m_<[2F\oZ(&';5706c;.&`vo6]gA%/BNU_rmS 6'mS o_G$#Q/[i.b J\ISTt[VZden.Qng- 0RrWsK<<:sc GiejUy):.3p/:|p3>{@~+}L$=+9}6g*IVuU53I;D9'jS'QD5n7b)(oJM:bbqwcRvYG-Or2&Fl#_)oSUlsMr@oQQb2 c#;{ XNB218IlX;V`E3aMZkeFt_8Q=GgCs1gdi0PGv_ot\#D#p(&BXdSXT' \;~ _{/!&A+B#zl{?*aT&;pDzHY;sPp\tKY g(o&[ x_d4TnK ugPTl(GA,6GfUsekGi?d+mq@jU"Y& )j#dlini)%s/cD+X-6N1WQ  ( K0#Bl1--a5zgDMGQ`z9OPm73|0y5] Zo 9dL=[:UGd>(X]"N\_l&X6gLMWjVXs9n BF jU_m-ugrT8r@*]G_WIn pO} +f+5F \)!e8cU2?_>< p#Xi J(G'rLp<eZ\lx+uM0J a *t!ety'_,L$-;2 |abUO@H]WOg qq<\d 188MK8ypHL{Fp~e0\NWkT4v 'S/)yDCvNX62<I|kWn5?Vdtw S&aj?1nVP5 &,$BijhqGZe,m~_[A|.R.<rP +;,Be$OR5=$=JTde-(j:[|@3Ho~mL}R|pOWnzM&\ypgwt8 !~06t]VSt~tAu WN x=(+-1v=SVv ,@e_:T7-=DV:Ia`E[0z#PrPB ONnbcE5dc(&Pa"dZs5&$x8**BQ70hwNd(O%{lfi[a3e{ \>iF yGmYl<V|/E(r}D%8 &XD]?%w8\RF[,>d>TWst"hQO' (fs@Z BW9g^?`1PT#Fw8: D^vb? Lab1%y+]#xLXk yBB'y~:pGDx#<"Om3%%b+  MIQXV<'7r:*R(KGg#u&T2\<P;YK)Bk&Mx"N6-kpbNd51|4uw-jkzQ.r?"ch:-x@LB;Bm:je0C{"D96Iw:( 71;` Lw+H!bRT H1TPT J&,$>S^BFdlprk%\b+jU9b#O%<.F5 Sby2H~ <ziSZE9( 3.,|e3@Ze/Q@x, 42!Hw#~8 ^t1'=r+Kf[y^e:Po.1FFAF<.m5P1SbU$> +}egK,IcMRjNT";+=A`=&C1bvF[Nf=MWhRUxgCNX`|C\YCm3FMeLL`5WI6=84)24hX0@4.yzv`/?C6du"z9Ciju]FD$|-*a2-'.D9/@\uofjY.`G."/& 5Y}@lE_3VmsbITG%Im%*h:]De'] tQ`+_:pPU  Q>_vj}{z@2,D&DQMKZ@tn[8RvFr4NWEyHvoN8Bm_:f\P;.+q0qXb"^Z;vWB*=6{ 2dvz-d 2[`V'(A.>NH<5CqS&7WwE;Ce-7M;P`{5uJ5stE6N'YOWm8;Q-_KVLZ #CtUZA2Va@90DT?9Q"%br7V|isE ~G: )4+lh^!?-5%db_KKhJ <-=mn/T?Vqhiq#P0;yFi?% v3Ri2A]ESAX?t~ )PFT%~72f]bTHjL[Z3F:,{0%p}(Q*bZMV0l  B } {Y m-_3L5UWaJZ'XQdZzdz9<~tTc{@>G73V2JmvHPCgFM|Wy'u?JtUS_<T+ N4 _\7:"]52,t}ZCk\<7E\H#P iG$r_{G I^Sg?)/U4cSnBq P;*M"ifEMZB|pBK] SSW$}7b*Sg\d|M1*-m0{!\fEi9E&1Q{R7L:O&)L``NJP5rygv x~G33]Hk}qbUtz@rhbQj ?%_atV/)iKPq9I)?<?+(-5xw, 4[JAe\XC;c9q}=r{|<SL)kK%oHW/v,dtm+(LyK`7P6dPF+ ~Vl7=e!^Z l=,-LWys,&:7qz8yG xNt2r- 6B+NL2 /M#WBnUA;'>O 92uk1r~F1 $a([(">Q+n)N+ (~ZTYu- oJhJ5OA3z" Ov- 2 = Q_'&C ,6 KF v Bk#Ho 4z.&C38@XKu+'-(>JJ dQz:H~`'7i{?HeJfSzJ3NL#UMaG04UOq :@xo7:[tS"ROM6@RaY*EfpW'cTOrq s]-| 1hSgk\A[-i& JL7Y{4_onR;TZBJX,c%?wXFw~Kv<r:~md`:$U+/MnEF7V1@z CU?i ]TT;Id}RfgVo$[nRw-ib6L{ F_GQ(R+_<H ,R9Scd*plST/ TJ}L9ip3,Ibp1"i FlV#yB3Nb<bs"5 ,iZ: !oqOW&b2 [=l;NA6|%;}RxVL96ik<-4D UYS7.x>=Ymr0 `.!^ J_il>_Sm6V]{ xl   )8 %GS2MT~gE 0OG<19#^6W. s tI>r O-O_tWO7ni .5F(2[PqmT21-58M^d-pY6 Ov4rfz?:pCIvV5B /;^T]f5bX v*m&fI 7I%Qm~X{]#LhJv""|illzDkgDD:+lu +4 :O~V m.{`2@bBXVo%O JviilGW\;66?VT~Jt Gc47ZA!(GE;zi?q Vj9Ui+l(i8~{nUAqkRQb%d1 L -SbF4`yB6o K<\!Q(FV1o ~:Pt*<5E;3NCIvP &j^eUuLVCxw'NiA[N#h fWIaw?6U7,W0<Wv|v_ :V}2GuZE]35!bmT"7&]%^+"{bkUj/SMlaRLTSu^belo-F Y#l+%.$[K{bR;*T~EG;L28 %~!4.@gf.Wb8F]Zj*GC}.U#uso\otSlw-ws4 _eTvv]LDh2}o"J9s`+o"LZf9Ss +|}x8(=Rx;FB@ci $+\`fiD&[| f*H(. eE7;0hzv8omBoX5[[,-THwcS4B^r0}|3LXoL6sy7t #, C<yHe ,K[=~*<_MnB]Y  A[a[ U~ktMLR}mT7E9BsCA?h8XS'z8r=PwZ8<I8 BVJOI 2awT\`-;eyn)@LerE\!OsXk+g NPh IiS&p#'3im (fK6@3*h}XM1f [@-@"l_9I@9HH{h)47+4<$u{iMd?C#p1y_UI^ 5Umv) \N<%DC?;Enf\bc*EK~(5QSi&:$Kwhg`s}rS^"2)]; ]*\}%i5F7= uFU@D4:yq`.iAnE5taCAx?vPpZO(QdYi4T.+k-^5l]wL\^o*QO65R1f~ =uvX) 4<+/VML%y<{b!:Lo^'_$kGzz7fH,C"T HZ~?|7ysV  sO9`.UMB[gL=+HQS%{dQ|N` kj%P_6D'!<uF*~F ]`1"\U!X 3.YQva>~Wr( =!i[-VMtksi/l[:T3(<3:_me$ "m:h2\)$1WC~4#AF*)E2,b 8cS7t~)N?Jn;{w)>l#C<PyfE*~ zKH Abn/ki>EAeGoRKGOjzPt'T72 :#}<&,Qo4Pb0LA8~;!Y'y7[6!`N}~je8(lz];*6f*g &'+28&k} Pl!: cx3)&$x za=f&<!j1 @aCU>+]*+^aU-@Z]wY?"@a'6JS^{"%y!]>?-k-]GC{bT?eo&FC~^i {8,Qu35le(,TLT8hw zf-so>'@eXN-0?@x>zpIJ?g=pF@#v@[7.S!?`2>>l.Yw}F71uuo_h$</;&m03;{>?{#yTuWJUo6o'(Zo=NHaaWU(0k2yE>a-o!!SiPse\} I^vGr8[H>Q~ Xc&4^wp:omC{E#:Mf9k>4bzKZ;k:"|E?1zBX QUxd?J&l=n}hT_pZV>J3[(`j=',wM. dTVOfSzfe9e\3W"&bLx2yub]oNI?lb6X$mQPC;GDn=1Mk]* q2wG_ W|,a^;;~NLp$M%6`m>BMv( Z5 {<j"$H_T E?3?4G3"VK<6 WeaqxN['9dVSpzi@9b7|-f@`G8p +pq^[;0Kf  ,O#a]**cbK^|8YYF70*D UcBdWQ&sn@&Ay8Vn,gwGl j3TtFkxKu PR+b~k~DW)b[]Cl#PR$:Ju{0>F_Hfx1tB2XU_ml\?gU:Xe^qMX`v<{'BV :\gfN*S5bnQ&GS"L>u<}1fw|gk{O,auz+X"%;&-/?p`+k  vHr[,] /(I7T##Hj0WzoR6A!Lw|dQ._3cRLaMHe`+K"{YV(3fEmg=u` hdn 7`;u,?wJ+nrPe#lB2qk +8##WcMf8eowlfs_)-W D-x~zB(zLJsR*V9e"tf2-Xp984?fk | M5RYW$(~,Y'R2 /A~)7z\ L##(1,qsBC|,NNF"'#+ pitb%5IbZfDMu9klz>PA8lzTKG lz6{/K,@raCLhDoc3so[JhDFi7cT@gFK[~_v|py!86yD!ji@W:~Xlw\0Z8{Xetg?IJ*V1+}fl5em'5DmLFw\'f`& (?C4;kZ@Pn?tY?WM+GzYJHQ R UWK%`85b{u.Gt- gD7J!K"Cg5!* H_ii+Ai -< <$C0it,{hwn,M!^&[hW5|p{zB!:`P2[JL6"8&| C}{R0t7u1 \+-6`U|?X>pR?uZ413>*O~esSZY ~ 8(.Lomy4!5! ;_T:a\0~V>=5<D$'` Ut p V'G_\7=AS'a)% Tj5V! W(E<(uVSB] E(<7EPc15p|lOfZ4Q*9sZ@c&Nj65J,#|NiR6F}#k;9Qpdz$M;CtuoZ%wdbz >)te]mNn:{?&~PMrw|E_eg/'k(et:n?;YjUx&W@N;,`M 4%/KbH3Qn;#&T ^v$K1pt.T8>HTGx`dKym>=TV1ODu%-tID]{B|Q%Tly1W:5,xG$Pb7ev4}!qAJ/RWB)dA!\l M%.Mxf'~ , c0mNY'.PTA!Z ]ji((E[  3elvyG+S#| 48T ->YE)XW|9N}nj8vv&wQkYvQfJAKOIL`cW##4&O;UZm$  6UIZ80g*als9Cj; +McS$nG)?S.O}1q&z#~7cP>,=fNL$VCpFy~)l$3e8-i,e !8OdC H8r/ wS_<sy?MHc8(Vpz{ke;"o~/|h!|uCiW t+1 GrHZ P7#HjWnk3zBG@Pg4bmmI7 PA5P:LO@LA!*:% ;?W+oLhbPOn7\o~q}n!VVba ?P2\/7AAjp 2t$ H )P.o<?^;ikKc(b:;:$8wzgWj[j<},-;g"H++>`&i)V .NzH2gzD_F&ezya10dJSO juW@JWfWSk OB 9mM/Oi.u}7,tjL-cY%C XIf++&kilRp\pnQK[tzF@R Rw ?JDzj];FvB!DL .+ k;=6qB Pm)PU7sn=v1);O>;wQZVvi9 ^u"=?@qtyP= LW,!P m;}d`wB&h<3z>"i3lY-w,flNo1^_gy?7TBXN}xQs DE  =ZHe0;z~J&'lM8evw0nnVNpP&=bX{KGY\rgk+lI,wvGT/io;}7FEMHDVHT3b7R&W_}]3N%V%HA6)`Q4>w(\vrYR}ydl~RbwV:8'^Q$"V{3 XYtef>{R ] _A]{l/ W2$tHnX 0wq b3b<0_{59]!MZ>k:Qq6g& 9<oZ|#A @ LD'"uK@tZ?~*QhQ`/[5q8 /J@NPi(YF!6e,I={u 2\i]Z OauuDl {!=Ws k<:k!\[[k2 vbVF#@& F~6L.mT7,Vlr7IyvO)3t[;D(]'E"JCMJz9/^=#kF'2G z, T &#}hJCes. j?i?t8#SK i[Tf| <" L>lD1+E5%f&{|se}Q%~U6/ p>wUuzMWBF q_)NtW{m?T37ljm.!o(MM"  IY/R _le ('Y{kkQunMBNCV74LWl"@8~7 <sS m@&!o *./" :aH<{Qf+FGrCM .KC_+%-Rm?:[R:,h&`rpFE%^ A3o$t<)(q ":XY=e"4zl" ?B"Hsr>fe>aX>\DtyCMs+V!nX;RuYb.oPUrwV<1E[u`.W4Aw~ "qpJ7OXspl`R<u&:jqP %P[C{I=.{j*@D{nB-7][&q, Pq#ZP*<6xUDBLm`.1gw)bChX'\ Q`X;R~B 6rk WYV. 8L;TTAU6iJl\u #jt'==9*FC)La+-\"~&i7 {5![k~&o2 .d,:!\\8!Q: oUQz3gC9@_9w HsbwC1_C/{#7K[%abK2:{9H,KT %5M9~y7!zL|P>@j3KTJ920.35-,xlrltt^.<3!dV B<09j<.5]x@B|j bxWHCWv=+w?zP76Y>x[G(Klxa*2[NAv!b~p7YLI(bU{T ]j@mr:ZT %O`ovnT Z(cl@w">v{Jt\5i/~' (jl|V Hy qHU]3y6j6 Ue?!"*T7UkzP!O=hsI.M;g8HR6@ fLbU~[OWFwctURXBiZ[\:)"}_8,1 3}`.L=HaW<3;[`UU z  J| nRn?o fUqf/oWhi0 )h0TT^$D?H?dHGsn@ V|8{b8;AXDe @)]rmift/ua%b=kOuAt J#\Uv=!e r._l`=G0IQaEwBy007X,Fp-W'P,%<QJOo1R`W#Yt<'FRFq_IjL0o][>JQ;,QB'FiVY`,F*7rQ]S5"2W MohG++WQFF v2_HiBd]R| TiX<uD ayX-tjvF@P}8WF Z,Og =RAoibCi<<"g{3[KD{+IYV!# 7+1Q;Vz7V6~@!(k*wN!dp(']j^:H" ]L+-`nVk a~_3"@z{Tj3C1S`Zt~JP|CM(THMSOP>+=.fuUE 21 99JR(0zK" 5/qCQ/*<}e{0'u1'e(Lj~y_+I^J42A@cm&vc{x kCBjU'(W'807cF]-T=GD" A; rnM%mrdt%|_2]\ zvcC*.9VcbVOZx o9&N oMirQ(elF?GUR'}).4YBTr[F A+<$1w37wfFyBm eFPQ% .*J!|GA[ La`kqZ0 TyQd:A^ '-e?4*pFk`<mfoz $=1ytVFlS faNe:('+P7VV:f45k```k:WUWxu,j^%mjgo~nj->6 70At*.3*!/CZ y&R@ X+J6tqscs ~Sbv5FXLI0O"Ka<br26M\{o,oR" -GTeld8.2Ute1/pFOzCJ%DH:K X'"Q/FS.Qbbdgi\J8?BmAjb.*#1*4-g y?&JN;6Aw(j#6yua#~? Z 5a@Q"v.TQQI #$,-~]k "kU+2_7aR2}1jSj.rI("QJqhaveJK$:BO]kdLw7'cJ *DeZ+WzjfF1.X _xlF9DpKsOay/CQbD- T1Z<-=U|L\_r6%:aqLxl6] Z!T~o@t=^b3z ;TGl{ #Hr   (8o*vlp_sYl*mHImym=#7pkyA 7vC |K1"-8T3(vtS( zy1'LlR\]v,.z,5CU\G( ~0@VPEB`(VY//1+G_ nj\v7vWGrX)47Ee4 ;oR9cpe^sc`Z5WXL-ut1]-R8KMH*',"MajU 5l Wt0OwvoVA*&2FWnwkJ/mrjJj<K>oZ@qoDjA_MwjO{US n+6$g{h;(urqJKLuL/,T5JdVC# E#/ LS jLKOaBrtNz5z;+^'iUA1 +~ 5Llva7(f1W%MPDDc6<\ :LG#V*~0Z? 5kfL&mq""&yQ>( 5_=qn8 <|cB0#BcPi T0&+/0 eKoMSz6`Z +g"6_Hhs|4PGozkvM -_( V8TLxIpUQbSnSBAt(~t-Xqzt7X !W:Qv|3pW6.4AQXFXX.5_PZ dFQhTwwGkiq,!_ e},Y{=":jRT!$!P6k~u?X&<K7pr6P,GHJ`x_F3.-9* g' #8$1R TJG&"\y?rQ~;fUysd<0bx<'>T3Q+YPeqpp<^Fv S&gLBS0l0ZDfRH*,AZ(tk#%_g8D.]{{}GcU:.CWp}I,wtD3Q{U^sJ@Z)[jzlU.+F8U;87Bo6vob^l'|j`mw|vT &KFemZ`#G f d0RZ;_$e=e@4CVh-1|0i!Ut3d wP Xn9h,3kFxKebR d1J 3{2M2C8LIrg( 'OB56T )bL+Mdq,#x7Oez7[a! 2vb cjw|]5%7k L`@*%5iM_ yO&_6N2U8(3U6$RPN;l;.LrG'.r~oNppc<"*:U <zW|!Tf U\ .@E!aPm4?ON1:,yiQanZU+=cH:B6.nVy]3 "Ai=<1fxza0{o\UM^!R_L.qLi8L,7{e,]<U<GEnp= XQQPilBX&"t6OW #+|R=Lo$l\3?Tov?r;?Da\aEzd_UXC,'3NOAqekzn~~zoP57_bi vTT*kg7_X.*^fQ58mbRa@Hj -TznXMXglbg U}WvsGu6~Z_ZutvuvpT{)HJa{^GJk X"32zX :QfZ3g2atW{L ~P:#+%g=:S$NC2ciP&~~#1/[[#\o*!W|@ "guBm*]yt#`^ uzv_TB{#~x:zs,.#X5%+Rav~1p]D" X/|!68)lsQXw3@3*[tbt(0Lw(=-cm+'!/`%8]p8F=.Edx?VdGqE%i W`3v"q]X]7y{5alD7t[.'T?zAHE*V_{;"5\@o|YoUs C; qBP}:cQ#BH5fq)M 3WaL)*CPudo~o3oQ((7@L@h (*_3*P} cN %CW]eV(p_CldmiV8YF&+gmW "Q(g5!Zb`JJoE%=RjW6tX<+H<#<mf T4YQMTSD\<PO;3{VV^.U][~Cb CL0H 0Q'@(0w=%+Ae9[N\Wojs (l}#KBBFW74L n+3Z\;/Ln,Kce3KU$ :@ayYP+[I`*4*.1#J,9_. :woplpur} "?tGb!AI;'*-(F PF{7{8]6 6QeeOGz4s65`X"uGBw~a4\S1'epi!J 4=kx5yGS&NbqxF$/PBzt{fc: +={ \(upPBn@ZBf-Vk(L.;Jco21 C3y:)?{Jl,%a|N/AC0*V >7=.1+mX`1/(  !_/fXXu $#Au] {TIl Tl/v.d`e<*@Wus]K;BS~~`d9vyY-0T3W &uu J[_J &_8j:n  2mw8VQhzwaW#wX\;x@2GQCl3|#5J Tu2LJDek# ";M@=5<?83$%U.|w@3QK5Cg$syZdD5W_7- PO~Fn`-yB;Z7[gk`P/"<[wxb6fC58?OarHF|SY~\Uv$`rZ31iV}$% JjiF$ *$ y;,[Ni#[G#7dA\!lLD5Vp\1 C5}72`Dl-_fQ+M( B Jq7k> Fe`L 1jfxm\EAX/,% jjdl3(v_tiNu=K<*`n+ql[J1DF.Z6=a7o$GH'n_u-z#|w8 %' |: OiT ._rK".'wjA  =| bC3Hkj}u6GV5:L7KDQil@ 4-k+iA K WJmUW Zp$,U4T#:rZAbG_( /uCFE~{NsQJkKni:kj+HbQK[ZQF{?O&M_Z!MJ' A$kyW#>0\"Zi$\lR' _BAf&bPTv:{e.0WtVx;GW9?>dk@ B0;!G%7a\ O gvjbOBThzHP|3 C$Ego3 NP.UA(uB}Zf#~jvByVX+_cRKe8=1d|CK_D_ Z5?jB`cQ00dy#'v3o2 +\yz|R~LF)J8BtX" eOFOThkofr'XgX1W)} Zo -=l;=oVTVhysdf<x]@UAhQ[[S:4[d]f3`fOc/b1I? 3SGuazC<GWg~vDE`\FR|mTQi9l;2U L{~i3WD-!ev^TEa P] *rK/cMt$uV_/:1&=# c0L)#H#?C, ,a*iqN6Ie6xk,vU* KAJ%z'\1Tq{m0e_gmiu~o_:A^-#RW*J%" /SSCJ3&77P.{B@rDvCQ ;Cg!- P2!*DVa:L;eNxuCsS@Bpc`>^: 1aofEW7>s 6,t`p Wlay6T=|w~? 5h j+|wd`ZH$s.48HtT?;Oh=4O ?&B7Lhp.^RR! wQBVWGm'J4PU3y[J5& \HG`&E+yaVm3WU7Z/: OqoJ;AVy (1Nd (N|~&KTsyg.(mu#]&*IAK9<M f60KgdW2-@zF2ZKr;}Kl[L:-%80M0Q&Ti9JaWf8\WiG%w* p'V0:a  D@`"-{5]vvK$L'*H~NkfW;2, %Zf!{ /$&cE7ta' ?tmA#VupdXP6*\b \% *Hd5OP5La2xQQV[bE RI(57B9Vew]?"g!G\[qg% 7Ut{W%#Gp1X#Xk{&-(fKMa#/9pX_A 0, L 6g|ho!AJ-rE5C* oX`xf? BE$ {fd|UutVHWa 8s]QB# F5;$"$@bwyeJ26QtoV2 '3MXxpYE1~ '>+t?0kDM5G<ctM]Od6`xo`K5''9xRe7vbk- wUKWb0 X{o3 GW:]( [/{bXcqp[2<<}K%3]kuy<Xgm[?fd}-Gbk@1$#{}Leo2;<TS>|`mzV/4MbdA2Bh`-3#z8WLt%'Pr4AeymRBl_tns:bcT%!0&$5Ap ?-=v3yj=*>u 5HU0k+n>,0e*Xg%3t/+a=UcC5j "qE\\bbw$cadcM]s%7+0r Ro0!/Ssn|oZ9"'TbWYKdIgR7,ORoq*'o[dn~\G!!i:, qK #%&0GuqL:0Wva=Cj8_gHDLHfe_Ko:gziKINUW@,%4&mF=_qG Gx7KB|kbYs/]z{3)p\* *atQ6!p2Qz1B^eWK2#,]fdJ$wIhm[[`ct0z4PJ"H*x ;nhG7;3130/(/#IPVG$zA&'Ec"Yt|}lJ'&8H>C#+:HK`z'OYUJA' fYPER[axX8(%g1it>Q/qQtX `_)q[Yafg}cR vcSVdsxgF, #i}H5ktWoC3[ ZxhGXLU1J8{"hSs"$S|c;&~aK84NwAi+!;]ry^G'oJcV/fQXfgB G(Xe]SI@+ ml5KK@6%!2V}ucknpqz]9 LjjX-xhad}2@CL\R+hS\M`- '?C/%Y{Hy*4#"%3IZpuy{U'f78y' F7=qod=!_D !:bW-[@B_%DLJIWlp&pq~p_LMyB#" FfuiB/>GCLA# #4IF,W!U0;IT> cB+&2b aayO~E%j3zefqh)"t"ZM6I_ %' :Mbhtr`L- 7+ ?T_[OQRVK:'3UxtC-qrdc]hv-;/gPB,9`w{tiN8"%7PctsuX8 ^Yis @v{aH) >qa!H.Av)KOH  ( qS(*W&L[Q'vs%8"13X`adTD!tlm}ptnVBR. +T{kI77B`tCJ9QQ21sp:")DhvQKO*P}^xT hsBS<;s[/<c\HOl[I(r._X6Gl+ ,Nb]AIzn'u<)S0 >xeB3LneB2/<VcgJF<J,B (c BL@ddg OxA=D?E_@iy[2 OP nWMKJKET`~2PU: ]:',LmH4BS2TYE2$+8HID<IlvR,|vZ`( &LhnX."Op>Rt< +@9<>O[o|YNgC% !wjrz| )DHDDOr)"d 1:9#K+6]~ler:gv`> &AOQQLK=*&30xB0m8/s[sMs{tT%;JG6!.LZ\H- "FI* 99&AX\P'nOI[xtX=:HZeenaKNZksjolC5C{aafUbqF~yUE80$$Hc}xZ, *IOL8) =ka",*NL!M  P^A+ "=oW 98) r(%O!>C1 tjNX$ /CNNI/PkjH! ,FVaqk%x:cDowY-8gx[/=xP|ZXz#CL7& +R_dXQ?0+IOD2 Co  !%% (.%w4aaqU {h]s>]U#@^VD)Xo,twI 0ET2 @p~S%*pwR-H|i=Cw0TMXo~|Esl|D  Ls|d*  " 7DO@}[DDK[n.a= ! 3Wzg]VB* &6GUjrlQ1 }>mlWMR]luupkic_POKRZ\aXM;3*,,:Yo[NG?,zNsW00OeeeI2~]MV sb1@4  $TspZ<%?Vii`G2uLFk]':#en $274--;DI:"T([ !'&   K_T. ?YKyh_nff)N_V9T0#6P]mt.,/7"8/ c\g([tweL.ZTZrIvQ f\rTl0P5;W |(CUmt8<ZikeYB.6\u2~fg ,<JB2 !3/Ht:lPEY,ACA@JNSD1 mfkuwln{ubVUZobVRfG}W8%!)26.Iw~V-K`mm\<qm} 56 &:PkygVR^gruxy[& :hxE!AKF1 AW^L*xpju=tgQ=/Tur[D;>JYjljTE# <_u}jN"<_~T1 .Tp~[2 *@FD7#!$&"#4Nfql\=8m\6-3- +Po~pGYMWy8rS#yF'%9b,Levg=u^TIMHXmgN:36Lgqdj @f~~||veDpabt %=O[djpmdO<55:AG>*}tmpx"(20,%  4D]n{{mA%%=F@-"+1% ]2 &Di,=3 KY)9oz\KFCA72!7RYO76]uxgM*W0%C.bjK(6@FMTW[]\bbgdgenpC",8KYa^TB'gC?Gcs|obN@3=Kf ~C^g_MD0,&.8CGLFJOTXSVZiz|[7$Eau~|v^G {pwwzrms*Q[L}XSb*9?/ESSB>>Ur_=2~Rrs~nfl}!??,!H]bUUPX^d_S9&&J ! riehX> /7**H[jaG)Ogrnf\E. }xVKUmz 'Ga{qP*w`NS_~ %% .GU^N4 mdf+<,?Vo}nhjsvyb? ;]{{W)/5- d_ix :V]O1 7ih4     "*(( zu G]leR1 #26:3, 1O`dW:yad8G>+',4."6KZ[I3kglqpfWPN\n=_mfJ!$44"|ztb]k1>, +AKRWZ__ZK;58I\s|pjgrtJx%#!)6?5( 4;2 3EUclmbC!@bmlVD84:=FTezQ,:EKH<&&X>6=Kc{>Sf`P8*&.351)056$!$  !+,-'  zdXTh2Vh`F$))&  ,892!!028hzL V~rV?' -5-!8Zw~bC  9EJNWac]N9 "1=@92'##)5AJIA* 2^uT7$-42*    $D_mqgZKFBDA</!%-7CMQLD7+!#+?UfhY6k\`|!( )./-+)+.3- (CUWK47X`aO4jUHTq3HNL=0 %.,6R`lljdcir~|weC"DZ_OA31594%0Kc}teU:  $" -;?B;10(#  /5+"@kuH& $*/' 089+ '6:4&   rr*DV^SC- %4FE9%264)  %55*#7<2% (*'LekeJ,"+22,#8EKJD<8214=EIG>1 +Nivs]3#,7;71" $$    ),( $!  "*151.-4=EF<).1* ---$ $!'5;3# 0C@5 !'"   %! 3Xr}ykXG9.!QxiC +18>DA<. $)17:3# :`qyjWB+ $2;=4-&   $5==2   &11( )7DLQM>$ "4B?3#+(   $.')<FG9*  &/66.# *231*$   ++ 7WmxzxvpgT<#  /6<95/-07>GKMI?)&)*# $')  #+% .88-.6/! 0=DB<-    %-442' ''$!%% $!!#!7LWQ?#    #8M_gi\I.  &8CC8' "<P\ZL9! !,6=CFC?93,'$&)+(    %0561' ,<EG=)"+," */1( /@HH>.  $.692)$-10'&' !%#   #)+,,++'#     *8?A;1$     $.7<?:2&  #&&"  &152+! ).-)"    !$   '3<A?8* %&&!    "%'(&!  '&                                          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Crash-Med.wav000066400000000000000000005402021366722712400226560ustar00rootroot00000000000000RIFFzWAVEfmt DXPAD datai<'?z89eL K t \% =r9'4N X$Su*I%5agQIV]? N 5  fXWSqP(1? , W ;]:i*l2*(ub i:kdyT` P{xC _p;DQEnK }nV c!<7 # k  i B y}C^74~7q #DVWa  /EBfA=\{;(M< \Q 9} r   u+IBvB8K u=bClH [ :o U&(Y,P0%1+22)+*i/54//,/+&d'c"!#A @2XBݿz׺֣ƿ^[@"Ȅl!bce قr$pZ% %8%S!_"B10@-0k,-71u4:=:K8 7Z3-- +'-j)'n'*b n?,W>+h,m?U2FMU  u2  ?@E ? JF (HT! n W58~^@ki8#T q[/j k9#^ ^:V$x Q U!P! \pvnUft $2y>O~GX2e TkQ1 *#Xy*7  Vyt] ^7MFJ4 , o | ^ hQs 3[R\?cu* +FdcD[~k M. y : i s } gH&e;|fK,c  'en# KG&tMD 5r6MX'/QLm?G0> vWl-6z4E 5  \ gd !QJ >5v 4 (a~ InTa L`H8o;U5Mzkw/Df~c $ }]4Tkdk8S& 9>@ = R dm  daNeSe S vOjkSb cn]x@XP^?<L;W|Hy2_]SRz# 9n< R  V D)F 3 IrF7+d2&DE;jntFq+If V-k/ok ' &5PqVR_s^ O]B"! #W`kVoMY r#lRW% dBX0eP:Pen &Vm /   _xMY p4l2]K /j dl:5<  brGV:}q); B M nnvJ`yp6gHdhG_C|e8 [+3(9f3_\\Bww Z I" F AH}H< K F C;8{ rFc_D@V//fj[M m [ t * *    ojc YW4*I GPpUBk yn}z^)rTh* 0{RI+  P/   . 2 : ' t     1 R%[/Y#kr'gm'<mYG(#} l}U  U  5b$w,_XZ@/c$=(on m6& e2b( UKm) Z Hwji1MDJs:~62 *D H5fy]rjF'S`%W - a  7w  ;$ k  &C:2  Gc5e9kwS?C&O<7.<P` m<L""& H@ x j x9aq0%bv] &KA,y, j 'M/#) > LR0 lK ~e " k/ d^o5\w!9Y`weqQ%w7 :  Mb $ *f=r:@6L6pCxv]7\| 6j<-<'.%SKHT1?a ~ ^> p c "55u \J yFgWl-aQ%T!UD3\ 5tHIs|=7E   Z %[&mW]P*1 z7 xiE- 3_A69r64(eq#v8$'h.i5D hAQ k 1gC {5@ Jg!E ]P@JHQ ;7/#Rxt5l0AN<~ 2 eN3 i S 6Un=cmJ+ Vh Ck2P K+k  gk E jfEtP03rl]t{}S?*ex4n@!f B2aUe ,MSXt m Dc m  Ke[^EZcs;hwD+# ?Y $N@ Th P x; Vr_h3|_WlhTK5},vkpMI'?/(e GM -] kw _P r1 L U B" hSi` ac)? y3L # D I/j0 Z+zp. ~q&11\uS3^:k  g&P#} L Gb & OT   g] Y }$? & <~jSkf,edo~N^r4)pgj#v mH N cKUZ#Hk+|GF"SRT Mt L V^N^N s 2 Q t  K d  (</BZ    K,Be'7]W.3A}crgrNP nlQO , Ce ^ sJF dd o&zGMwrnDR8>_|xvmq|C(~ R JK y z!X(sMQn_X YQNyzNyxl!3wJ-y3T8>Pgl[V, >  y HJ WU W   m-Vg(  0:  gDz kTp|%*q{H6n4dtVs#@FE^ 'Dt8]d*R&MDoCf~JLs]%{c(h+p ; g ) KO '|*  u [`q9<4 J\ qYea $zl<*7F8a*3&.,un1,MJ08#LIu%\5 -SO_ B!lVS0PiU>B/T^Y]g_ Yi7qo@u} o~ ! n M${ &Dz;na  7(O\YWcM{ t42 CG.j-C8YXPC@4_[U29T m~D9;  P@F Dj *s&[HHc}tv, K E&vE\FxKA)CjZmY %   l=o6G%h4%1?)VF,~gS<3NTm1 ^ DP UP YU;EZ[, LLY^ IG mtpWwBb}m7{`T{. o Z  L{  \Td+(#897"Z n  7-Jj^xPt :  V  ZB . tDE?2-7 R{  l' IF? l %D "wFer7Hh NWYJ"VUV ~'O!P *% #!l.S2 ']n | _'9B \{E8??.UKdHG>Z X YXCWTZ 4K^6Q .jI pyQt]ZY4 {!;hsqRM%5N & ['7 u jdH8 :fjlw& X8Wwa'c()w f{Kow ?m# Y (\ZXGY!,[!|.p({4 bZ * +=)%iuRNX8aZ\O9 y :IT $_# jp|=uRF#Q%k`82 DM[r!Ge yS} M C .Ds2%wF1 :@:zVX: Rk 6MS` v4fO g%n x)"h Yb,Pksxvv|-IXzOA  ( G5o]q3#3 0 8  /~ %c w `[gE(XE4I,@$ ,- $q4  Saa`yV 8;Xj e 9 GIG)>  i8J`b. oi,'^8cB:\NSL1j    & .[  4YbMlo. Y .+ yypE^B8   fSp t\v  3yH,~}? 0 ) ?Ro[@]',=y+6`zQ0+ m 8r=  "1 A## i&6 - a gB|ML^(f2]F)/qQI] ` W_ ~ $ wm 26;.Q0r|K qx<WCrTS!g.  0   Mo xWkU;R  G^l9N+_; e< " K' :6UA@inc? A*{_ hy6kC Pby <^ Dn5e<   N3Qk^ 2vQMf>Lwk\@0%x46v) CJW}Z?X +Zu+L cv? S:G |R = =uTo^: =OE$7J ,b q A) ~_" I  8 l O V 32!$hAMMD EL{T~1@6(qOE k bM I ArY /0T!ef# 6) xU-`=^)OX1TRC@ym4>A{,oL %y_ jE 6W,p@5 k7G-z5op54,j0X5.wH`HdF d   w +u  J_G!5l82wJ,(CL6M E`8 yl uoZG* 7 ?rF}U,e\J!:JS &cBF H # h u , ~#23y912 g+3, X?\G.G.Ok;e QS 'Pp hd P ~rM 2  g m i m Q :JlB  "LTBr)1O,|f ytd2B ^ /ro  z' ! LxM < 6R*tX&}b&FN i 9rx-< 8 /A\M } * 6 DYR{JNg%BapzQE WheHw  z {vS h E"i _ H Y2&sV9q$,DvKZr{ CTdFC6W {oe# uD3rX70w?&k>r!l3ktL#bO\C%^Nq\Vi_k[HRv'KyD?HH:rF '% M=S 96.T]D;)  m u - xyda^ . 1N~; _]RA+25;x5mdoJF"Ty? *Z y k7L%A Saa a 0 ,MfR# RSeDi{i4\. Gl<8[?& _ 7;jI 9fY< N>l:= a9eE-D+Fm ,m p G A  ;3 s2_/D9"ijNrdFzi1N-D]  8 rR y 0_( pFq0&5nzPAu%2}[ o&V=/>bN  4`=7e M  nxn-9_7Nq,?8$iV^;v_\^8!)A< VpI AY j  Y U t~2 %<pU?_:qlazx*w Q  _ h rH!`#D)``(`[o@p.o5yOH|j=e f! 6\a  7 <G2##4? o6=v7o9ny<N? Z KWn1V%t$p G  H tWO 2H )|guC>^ } t`t X2\_d" MOTjz $ a #p 6 .EVW Vx OJj7b& o ~&x $2#kyk O 5f ~E8p G(yl "&\Ue OT(S PNQB, ; I` + ~I Naq 4~n B]ZVsE5?|0   G`C6aL6V ] ? : %C ^ @P V O, H:]-6H|e6mc A Qg, G3U vTo~v{?@ xU8  5Nq}$gn>3 7HP w` Z=: w6Y#C%6" ;S_=D ( tkf;F+O/' . \2 M Z  V @~E (^  _9<e>": c/dB , Y 2! ~ufPO S k^wq)<8Bq'  2U<_79, w/uHz, D+ d J369Dwr9  JuC3A~)t3>zT;hQjlTa =` A = qY,  w-% } \$2ga=+\~2OnTx|K ke> ,w- T 2 4K(tf5 S~DR  /9Y9z ^  w m2~aq:gF+_6UBF Q Ad ; o8z9817 JS Geq  @fA# = "O]0F9?"%6"iC Yi/ UD5j^STW$" i \< I J NXuZz#R UK>.T9  " <"Amk4h)} "p 9 Sih yB @ )< p3 t  aY}3[n?9b64w@UNO7( tw  > p<Z D7 DT0MiT?Uei87xy6*oO rj7DdS Z&)&aq83Wzj)wY D? [SN  t,F"  + {Y] yz{" 3 [ jCq7f o?}B)p dW/ s  i;m%Mlr Y9 2 @6_LCmon^.A  _j:GBH] (w_* T  p rq<NkOR  0 4s ) bYivRO 8";3 ~ osb_<pC8VY hF{T+ , l/2`U *?b"-j$Zcp Q9}c1SHM .D \ lbWd[j'  u &' i Y G ^- 83M%])@`L|/"&\ G~ `6&Q^ AlT1 o6DV3xA`` [a|pm>ACEmL   fk f k  5 E@=&a?*kY|,JowuP+lHp'5t`(! 3 ? % Mvzt& \hD~S, R^$CxxO/NqS6j?8[V<gol@L 5?d h / "c xkVDV`j]  RSHI `Hab`r<py U x D ]0 yPew#RN,:Z_zv&@b-0i w ?ai\Q sq E 9 - $AC%kV ^ r6J6ySa g HkD9Ct s`fa{qUr= aB DG 5 vf z Z ( kMk1tuI2MHL~] u(+I!F-X <ia>9VhYt` Y6b _T\=nE9^lFW_'F\ydSKr5Xk P s u) =ONv8Z>03IF'9(8V yQ-&I+/G E m @pS YK6/q KGy#}iDZdKx)E  M0U'D":})n `  o4V cm  mQ&APA5j2XY\^PQ?E=f>s{H Pz D( ET599 C {;*~F=N$`o)7L0 0 [X Zh^k w O C#wNo,q}yg1m&"{+ GZ=cAw~Q]J> U'uZ% =J  * Xv^,%gLC(wt*mm)HM+{  {3lm%&Tz\y~T;gz1clH.l*7W ""  X;g NN&~^\Pm<y,\d]=A (; ! RV 7.oE 0 n byDMLFYlk$uf,K f=@ T9;gi!x/ \I * ?A0y v$uU8(S*MOm)u \ &~E W (z H b9 [ S: E 2%d}g">Zk;\uJ-Djq|[T 6 ^) u =C 7 F h + 54C8   [nj$ ;"t7 60 $wso>ORa r(F_Ts_ +0c  Hk[He a 8 s?  ( o KtqD=<Nf78:T=<4U]\.5 %  v0I& t#5ku I W )Ia?qe k BsiD F!*Q1_} S< ADI N  a  Xd0Up& K ; o_GX9#N"{<X?rM{ hQ=8A |;'G /8=oTb,>cfh'Z+sITsQIj?)/Vi"3s ;C} 2j+'S ]J F - r-1M"]C7nk?c Lk!$Q qi[Ovs>p /~ ZOodx(qN3e`$[LI,?,9XI L @ ZT d ` S s= h ?/d~:dmI}16FV$\H:$T0r j^ h_h > |~0v. ; L }^}o I D ahcWH)QH| 1Ueh&Fy^ C a qazGl(. k d t  3j$ =hMVz(Z%<(>m(dh S cii `qaxQHiMrAP cTQkA5.bY= QC"XC  L FCm0*V(1Gs4zeL R]]/& # h`~,ztezK=-|o%vV%)1 U ez9uNO"| D W q ' rcFp]BC wus5Yv]>UbRU<L25UF` U r[aH': $L+2"Sz4g"h]/p\`fL[${C! 1z~xTQQ4y@g [ `35-*$"I'M=?.lnrO< _4U^B@vnE"mxKyk : M V wc'/KxD!_0C -Z'Hf"0,a) K  WsVN?W\yX\D42%I%/KB5H:\8,M5[XsMHY > :K/  _ K  @ ez,>]wHHLud\glmKH3Wv]Z57v?yn#.* L  1U3oT:#x)tym>Pip8\ rP$|~IsvH]DK\ c l WLT 2Nmle#^XPP q0{}APj  %J;[${Xo z=P B D>H; U br):o ZDI'[L6Exk9/ jx "OZ &P ~ { f | n  #UYIeeR"U}~oj$6l3 PM0[rZ,99mh f>1u! QBf y I(pIML)6#Z L O1E{~Yh'7H`!R  PmFs8/za4<E  -N^  _ x/k/Aq6D> c}rIRX1 S ?}[lMg*FEHh_P_3 D{?J.wQ<! n <)"f{t(s0H4Nc3qA6f>KGf6%wBr5jH eni"HI-QanXu6N'LI!88s OEOR3/>9ihan6l35 &1eG$wYOA*Z550_TF`*FgF,49!OBj1}y"2Ri$`  &uQ * %C;]Su ) YZ*qV`uq(Bs4LJR ~!Sa 6 l *L {;:2/sqRU)p*k W3:WB~z]B-ss= x   kgH0.l X bsr8MKGM:\H%[hI|rJVgWt '0  xT@F^ "q p'  L {C*q<\B%w0b21=1/3r9E@W _+BUHcsO aRV /J  ) w C U:QVzT+[v863rlxQj<V> B, '9,F. a  2 66`:^| {w%@=/b^JdB[&U,s>qHQq 8 0)\59}XL9_ [ V'I3j /V ! ] k%F+  7&e> 3u1< =y-IZ H 4 9 %/~J~aJ2 fCCHLA 6KLsfB}Ywiko <hAuw1"b. Z)5^T f%kF g n} 6 ;; mqC~,'p;)Fw'#sd!yGJ >&&'im+Ayl{T  [ O k?(rW2{e2R4@D}{UDqf-)NPKO  ( O Z}@6l mxT\6& G zp3!x:O ,2Mk v0[ P9RN6!  w ewJZ:?6QNhH@9bHX^2 { B6@"}'gU QZ  E  <$q  ck3M zX2  fe MH^o&0q{ B  %:b0+ `hY9Z ~2  .Xni- Jf4`0 P @/aRB&-yD!+s*M  n SD2l)TJQ^  " 4."RDTm  EVgh /C4hU(B5*[}x,& v'=6H`6DzlW5/z;   Cm& TJ <+OcsCT?Uu4dh8}]. %o2:>yG- C &.T Z%P  U~+ B7Q~6C,^qiY h 9"h\RyCx:m"HIREU<' ; 7 N NtK _ l Em`)<]~[Pki,~ /T2tbb4$DNhn @  l [ M8 cm*e\OGi5VR,EFWI._?3v>:. eD4P0+:`Wg ' ( | my*-=  w nPK/biIpbooDog!a t    w 1 D~vjz(F'9qB26;c4w Nm7w } \3_!`9; { L  /I @@ o W+  L[ |Yqsj*H&Mgb+ g0 LFOqse/u*l W jSn3H8 6. fp3g,J]qZU1a5Q*7pqGTP x^+i L%qF G^# \" % |0 ,cok+i]>2~y:^f6SXC"Y3jL ^  ^fRH = d:JN&+GV  B L @tmToM'Kx(a: wM73A882O;PE5ikQ /SM  E.p}IX{My d]op@ L`\k gpA ~ /[X2@4= &Q C 2 ~  HSn|O/-Ah7( V` rzk{./>v  X(g(3"fF} Q'9 eJw4$cPe |   T  V  Y  8et ;T|-@o@yHE{\\^5fc  | i2h m ,L hRysVNeq!pT"6U C~xON;1 F \59n[  8jQ_%< r\U < AZ\ pt1bm0)bt]Od%/#,/7t:M% D  { Jk!E"YzuJN j`W^~<J~wAfqH)!F 6 W <m-W f 2u  Wu1J hnb=91[D:DZ$# D kRw0_w  n Z2{ m\@P  f }K;D,C.,2kCn7" I T!UH Dm  MJp b&;*KRFB;h} db*G & 5oP+ W  _ G $G H u 6?=dG3^:<BlEAg;uh  O hcc>DxI 9 _;JZ`=0{0j x s=3{| VsLwU-] n s2(P[ pJ1 {Ub(9C*W kZu H : > OI!m/;"Rk  ?CC^Y)"Pk / kU6T0~laTwF{O{xe3aK{b^W J i UX&<r3L{<`z_ye:v5$4[&j>}c.#W[7:yql]U~T~%+^ n_[ )/.D(`Or3ajlObrS.9Gg0^@Ix:1s 6{-HU-#<.d0Kp6nsnI/!4H I*C d2:gNPHN'eV0-RP+vO" ni ' u a -PTe ^Q  G ='M<w.  2 f}o   f};,0%" BBou">UG c \x # \H t H f3 M f+S0 ~ Q*jU9c.PWL&Gk1z$!I_xci`An8Q.?4W PPN v  - > Y v2JD@{ )AAvfiTg(z$Ce*${sokk--pLWJ9ML4x~!l*2NepLvQ6DCjsH7 3 - 38:HRG`?{6u\E Zz`Yib'f{4p _NU6,m6)h@Pw> # -.fA   * _%fE6X=<R]KzPCniBQPL I d}n[ / 2 wO e   nr(cfZJLMnQvo>*sSlL_sBbk$ $ l ~ ( J2C,8<-.8BS` X~,jj=p 0 #8HNe>s V v  ,<)ZH |v 8Le/1{H# Z{% l >)z ) ~ =w*~U " 1 7Jp&}vfLXHBj|Qq B?L(#{WG r E0H&MAY;+\2#<BP\<H~(|b@,t5qt#Kk[ nbe-I<mi :JyVslazl  a  26F@]\X v w J =9 a, .Jcn B6zs\/,8,Ez=sq LK > x.r HE \sU*+upG[pg}%6.pcZWW9^j?g - dUM9  P{GW3=8G In)43=Y@zXD\DBq 4 > 7   f5 4 P D/H ]GVFx)36PeMm(qe Sv3ZW } @NJz $ C0ya6Kd/&a8cT,.+TQ.37.] 3 -32 K ` zmP-=|m0f/9H$sS2@j Xq4?bc   -TaeHK % 7NvIzhohptV|Dj4J_VFr$O18rg8yV F E;fN:rp(,"C.;h!^t PH@@.+3d ~R,KWI X  s @i[qL|s~&"4 :,v\8U :%pTypsH+C'0.' 1 9~2f! >Mp,.A }l!fJn}mZXXQn# Kd3meULIB1|\_`A6lM~CfP$GzfJ`l6U # d;,\fHU*/)t  -~UE$KVd4/Aqy} e_d9n]m?|Y   {v0QEd r2Z1A2(bOW@-*; [N>V .  B-2  qF#A Wuchm%[s-KW${$.$iYY. < + nCO0yn5rtZA\v{SxC-  Q 'I  ' - N -c> Ngc J:$,Zk{H B-4{g%In~H =Y , 51 <  h _  lgfd4lnuC$5qfEW,k  |OM.f Ema[  ]/:\ipSsVNi@yiou,8koPI 6( w # 5 ,  Y EL n G'~Cj~V'! mQ0V A`1zwEKl ir?4H \ g G4NYO " yc F  xi[ q=ReV>a1gmiE$3/.B("?Bnm!.C_lI":P j 0  'u0 { l Djid^ ;\=fxgaf%PwrXqWecF@  ,e 4_ z %@;N)7+~^ ]  g *_@X # y7LA#$W2Yiq}p\$N>44!2]"\vzpe_~ C'fUwl1 \ nQt Od"2Y QXGvW^l`;Q"U    ;l n_!J +72YQPl-#= PH'iUS.zv=IH8Feo.SXvp^7lA`i(n,  1oxm$AnQq%A8g ]y3nY jbGJL } :u,|{Z?0,0 .v^ R T3\;d _ ^#p~R=<;L#5YP~Ud.M@pdc =so({s F9ZVI{%mc$=DL) L ~ k\V}[4Riwx*dfnG,`"F L L kY  k L  P0tHKA0[!ac7O9cYr~ Nv0I"_&E WikG43?Su  M l  zp,orp/@77/sMnUrQb+ ?  qZ.3 a= yLK[/$3__ +^i;R"E5 Jtv $ MRB]P_<y Z-nGIMK/~BI?gR|]Isv:k%7dO)hOMewg|DImB]0q J r'v1< {@M.KVT>f`qm[dRN3H-f^OF6pL.I(h@BZ,lR3>7;q '];_Vk]H`V ~?g| )gb%)J3P 9@%3% f1% xgt`i  ~ KEEm40Ws4gh~ hA"qsSZM KFe_F  D`t'9~+F.d'Yopb"`  B`79Z9WXlS$3 C#^(g0VriQ%<4kkMfP8q$` > 3tagv=AWf$\D?X_8{P@ uGp 70 I K|WZvL`QEf~ x[$ eB;#sD#1v:RlTWx@''-_%RTeJ4Z.0 " f<\'pn0y~QQ)`5 <]KMF;8B@IRG Yne'lH{R- S~D"drNb&wPyK} 0F> 7W)4rb6+z{}.p ^ u lF6Hh]E (4C.@H}]B4Sd{Q"jN. ; 8%Wm}D419dJ<HYEU>?h {q wpfhjtyxE2ft'4 X?"03VTPkW;n,r[+b2!K'-X '&; ML0T%P0 NQ6 z WsW(G*7  &Z|$Nf%_<1M!9aED _   !}cgDRxcfWAvmNn1(T< f9Q_ 0UanPLI/9hH# d >C8;FPlp u $z% $8YAz$Yz2Y'f2^k2.DTMu;5U'q|.iXR N!M>qGxV7Wnq-ll -q!^em r u 7XNiV[3@CbtjR :4])_N D r*s}H ,wUe aW/gM;&!~ f%?\ z^EGT@U%#ZaL e$o183:j'?n7.(  ^O .dr>~b35^ LPik):nXE<:dW2u  M ]dMV?(jE`4G0i:xLc!$X`E3eKv4> 9 9  W%2bpyjr`"K@+KOI"k29`,$n?X5AN4 U[  )MQR>:b- / ylW.9B;w$e swPK*0cuzT'u(RR X XG  9 - B/; #;k }N0i-#K 0 =uvU49{:YadM _ P ="lS;q e,@T$'5k)C*]9q/HLvi%D.1 G{:}n+ G WN}xQ 9Za;@9_x"JRbaiI.Tf1~SRfO7LW5 & 8V^]0 ! 'xb@=fr)9(\+B QGh @|q ]qd Nt 4! DDTkKF0Q]SO 7 pyP.VD'9pPsS>&805?/G}<q'a^$ N\rVTve!%{V,$kwb+<g4< n G  MVT44b?z;  c`VP; N \XAxnsE 5  ("7!i=<`;65@.#^oN NZl95K{ "B [4jM@0j?2GY0ZPJXz !? +}M^Sc/ItE&^672h3O} H ` J% HA/NL[+kCxQycx[!KnG`/'^isB9mS?yI:!~W}XV>p8H T L6FS^1"C|bf'}{ t!DsBD  X Ov3DKCau%#*7D5Xr-el%~,Hy'!  -eJ  Kf{T[vxsQ Z d   # ~J`   K## - >[SG9sE4T/yx~ZIM .{  ,aDvq`9_}#(0h_O}3V x 5 {%{?4\@h #_&@ UEd !zZqt;so5/(K  AzYmeiz|MI^{jc!UN zH46= |=Z<#CA  uD q>? ZJx2dOu?g!x;g [^ |P&*&m1c`RPg~^>>:c'\Z r ?:NBG1/FHCa1&:'TQ ] S r~ RIo4EP  Bt1Ny f7C I  94%|?3ye4ypQc`ed %yx JA2 H*}XpWJ@sTz H)KR%6~4[$H\<>+ Q]K7t"Ens7HrG]}j"c  fE?N {[!.v8*jl w]uSQB':VM.e#Tz qo `p l3 yOd )z*3%GVyqo+>-_&9:Hh, C|}/<4#wO({c7@XF|WZG9V #^o e'V[ODMfv$@74h7/!k @pM-<H,_VRr]V|=E Ke'B#T P 1CUKN%XiGk'R*6U* c  ?C!#M+8;d64xlv(DNQ>^//J 2( moL!.L$7nk#0;:ubv'|  ;486T,v Rv~)CW"b ]}nCu .]p5w9Nz(5G  }W[>bJ6n*i]\ g 22nZBO,`DfW ABTB{ Pv1{ b2dfI  lw+7BtT>uU%d~m1O8p 9k3;wWEz3_~"|m  :dg/AqDY.mV7uHY V.IIW=AyYv1|^$:! K'P*N;]Io;"^[VP)W.e<~>1#d;u'.1[RdPU`)."6[Vel#\5t:5a~w)@ e/x/PIvaf$h]zKZe9C%#d5y)xToUTgj\ Y+ c>W\O25[F q.jNWjfJ 5VE8I7LzZWts4Y@1#pp0#598ajYU21U;Fs!TWp#wY1T >\(d[%M1i r0 7-mE&Uc*7-xeI+H JfXVAN`<p$UE9UUi`e_0R:rgMLP8V\VX5 @Bn5n qtt u i>jaytuZA= t4Q0elYc_J?06 ]3Gn:2]r|AlkC8RKAP)z \Uk H'lT-5, P /qX[i0W> T@i<m* qsKvUEla _kntTZ/c~A(*]Z ;=ut2~ZS6q,e{N9!yVd0gAxt>l mW\QXG':^p!H3D? f 0_gM=16Xq0db8)|%{sks?thHl? ]*>A6YR4 Huo.m{V0tvdfVUSrk@5>M}RWH ~:~n ;S/.v =U* Qj@'lU' 0fmQ;i k4Grl)Uh OV`&`olbVh^#_!;su;YA58kuW0U!dw8^{LN q T T &2EP2nhk\+5TxTDzTBcq 2-$)+T%])Gh=1~D@|jrgB" w{oTK 1jscgOT({ y@]Rd6k1dqj+~mR8'7;);I.DsH3ktjM J>rglk.Py7%& 8 PseCC[FI/VI\MQ0`FD ]xmoHC* v=&HH Q qee^{R ncC>"NK ;G18]P@ eCD4#+"_B &B, gBfget- ktK2Uq<c't<ZN(lU>@n-Z :MKT?>klJc1HU+IX d$fg"gv:&/cfS>.0WRZhFf6=(tEb _uHfL` _.OxqJ2 O>P#]=[B'@n0&zzq5 PD}x:u2 F\.rM@1H7?O^F]P!gY/h+LnNpq8M'3fYAxD/ JcpxCO~uIQTB9{$19g/^t: M1Lj3zHl8TS/pydl^ O=RMbNZs$q0"b' B5d+DTpZnD${2yy:KNg hE|&rr+:Gi9z4O+)Xt b$< BWsP{.%M2#I~  Cs/!gNxSay%y M#J4*)0XC~BFmReqTS"T9m<8 +Fu 2>zK/^ rqX2*A*xK1vX4:=m~Ipd<xoYJ T#p~H:}5VHA ? @D j M.COyXn${{7Ag@oCl3M_sFuo&+}KIvX p BB+kcR7_a@@t3\$LR;*EUXYv>=g^1!YYC<Zqe`.]PtwS`B']10;g6yc;)'_se2a'o*0\$";Dk ,  + NSaoc7nPcVZ!D~Jy 9 5 hN]+ .T;|6/ ?Hhn< 8 R n i.6BRYl{1=1eITw$H  };!Wusk@<%qcO|N-F)[ =LUOAbC!n/Alu9dM@n^1^R;P_\caUzq|y?4J0t))j<gdlDAOrg@uV:iluggyYYW{ 43. on1u b80 @~O{~f>b% 6!C-eT%M4WN%?) NQd5LwP Cd>QHr0=m}ym4 ~? Ud4= RQSula vP{2D\|'UmisxGbc~6 7) tkG.Tnvl5i#LZxkeqyOu^|RKL$p}R`4td  W%K~E:[U} /1Zw"8Z'|<efK<4G9XhPqN =d= lk>J? R:*Wde! &Z {?24mFzVlMAv[602^uxlE'o4 $!-cUJ{1N\ $Wa{V1&A"xW#gI-\E8O>=6}2UFas*!'wW(?R($s6|4Pq%$5wZq4yj@isGshA_WG#xYpD08*:!_=%TWP< pfS%j!mYlACxG:3Is7Tbata6*9Ib #|/(kKS 0qrs2cx {>whUg*<=-= \%Aup[&G25F~B3P`w6$%/#jZ_cxL ( / ^O!)XSC(OoBABTpkX 4&R 7WaR].,lJ,yk52{ T{i 9 E`gk:\>V<5@|s7@Z-,OOh9d FB@\*vCxq28fS6%],z#J`&j/Jfbm,(9A8vcAVk5D48gwixFvq%b[4#E`Rv<vreZ>3m$aB#t(zj\ygdMM)jGI?|%#LL; PC6_t%XKf2QFJw`sowU*`>OS3>eo&_S%o}Jl>Ja3=ktt6nOx 8%FQ%*('K 4?!nbckOx4Rf\0?I~ F`Z>A[/itduMN! Vg kp_n6 bRWVnnXTm!c lB i~O~?N]eVYRl\Mp"1$/+s RC [S"x*/+Bc[EFV$16d qvO%4e\6,d4a%>6Z54i:'XmpF%FpoTc RhMk\=k7vM"n?K0Q:%s.?rzKo#Pb  7Xf~JLX+R!\\xy% BN $8{\;W[DhXjIyOzc[wM'!\"_UkF| ;DE8&'J6&3ePejJFP $l}IGsgq1m0q/$"7hpC`<kGQd 3)v)ls3+J p?P}H7+j6c#md6|(P? >^IJ q +$ '1.C+kd !U<0#V&'ZC%bT=/ws)*Fwdp}[UN|>xA&Rq~@ b"HYVi fYbjB lg9,lav4#] l$Hk[,e}+mCXJ :;T4[=t  T?= 8h+>p ||>,4@]6/6H o-lWi,Tsk ab2=KHl:-_uCcLztp27pJ8T@qv>_G9^>M3GmDnfZAqGb[r(bTT<OIf+yOAl "j1sS@i V%{ KPDW ouatr{|HpU.GGI2w4~ g<#+ [ pH;$e6f~WbWkHT[r+r5,*0<*g Sj (9D=) as#L<m3{I;>_i ~RA5/x<2tXVx? N4FG1#aGiv^Bd.sOGH 7>.<,H$~fu(@0MbXP  y6$\Mr$`6^EQa /g%tOW @3g@ny,YA~$ MHCa93%[n*#_NYnhmxn2XW;_h)O.R<9RW-9=N W#ZRt%{Fn;d6~|~_E%hDH>2BI>a#ysS+'ivd;i4U^U<yi:&yW?FM !OO-&k_HqV2U';+AKM2$b'e?n}.$`e97us)>$,EVf'K HD)caW8qfV213*X-Jx' !_'W{6+@2*^5NbKS`rfC?7I{C+Fr&hf rvHH/^\*?PO;FN*$] KkXUF.?LIqhj~knA:(n_N,x<0a+i]09 qO7gZ <7qsMhVh`D%6n$U4ok%C`>aa `-dg pQA&q]qKLGabYY?I]7d5buS+rIlp3j3P i*,@E=i9G,$ldh0Cks+x]s3s"x>L/>5"9 `7?N+] ^gnc@@ TG -"xt\]aK_ m v>7.3s:`~+93/c~^ B]k_6_g 35OC'~'%"|K10{#'Y`=bTPV *A#E3E&_ $pqx/4mDKzi9~C`VP/o> U`oMv|J_38q,\NVlyszrE0B%)jIraZ(6sO$E:%G1?s}X3x,C 3:v\ {T+@JC%gW1,4XkL\r2!szs, c57gg ciA~$U^hJr^ XnL _"2ia6ei):gK~b*(@<h|MUUXtM[qU}' p~fP7ZEz(%;KHy%6 yg\Xblv0(:|YL65Tg_3(OibQF\ztlfVl* =&"lq'HT1G{YM!IE*wIUls}VFW."q)HNk>4%DU]P&~y27T?3Zq%Pl(M$ X4y8f1Ewe7p)~z*X5a+,UynvvM|Nv_D2,#a8Z#Ac\;W@E9fC;5XF%"M ^dyi|PV$rBYNH](]FU$e {GFyA?`&<=^\ik*\(VDK"<]om"p!5<~e<T W{%CEjKEVXgTE6zP3]17v[& r\nlE, 4gDtt(WMZ;{7)I|?Cc" "ICFR| T% mgyi7-T E#  K3 U7Ges> # +sq;Xi!pCqZ5V}K]*iT/,yEJbn,rv;!0\9 6y$ikbKc3~R?6m3]Wti"Sv)W\aTru+|U^J7 G,tLs 4U({6}]qt%V8/q ei}P' ' :ph^67qyf>"Wg( 6y9m=y9k1JZ_)xVV%`QE)D]a_;K]Bc1NXEB x)_K5.\d@;&R ]-7 :}vB"hOVkYbnX99>vJ_S@'Z?YXFI *mP<Pxxn*pf(y<.2U(W_N+ FL)HiS~KU'xnU6+ n\e?<qzb k^FJ|5g ~],5}+{YDl 18m1.7NO]p51HvQml'?e%5Q#-=("BoX;e9Bh,LYh  95*C^{]<}/#y^R.UnMC!\{_\TB$%VatclZO.#XJ*_k]?YzHMh /k_V%l@D/L'M{W.nP7(BuTtqxU. s1l3[jO,2 -m3bcW9 AkbWr<k, [)3PgLP?ce3;Lp} Kc(BG#a\3<qm 0mXuC'3.e`jCM.606lq!k 4@:Nz9A/..X~U}$,~zxw5>fr_1\zk4=/ *$-C%PZ{J9=rR;FCkA4qv J<.ebt0A &7 ;8%=by{xTdN>Q(7u>HM}FA.#0TgRoA28n*7p Y&,f$Jxpu*)$ z.+)CWUkdP~]_Us1KK ]8\3d-'D9*3,f3F'x`'vTk:3C 2PshG.!\( !jDg)-7_Of%XP/4Bri" jLh8My/^ &IfJK_& \{RbZ.KaY MLMVt!;0V)%~+dp/x8B[&i \jy\,`~K/QbeF7aU&V3: r#1@"E[y7B8qN'HE~.7J[ 'F 1AQjb3)9TY ]uWQ/]a)g9k^J+ShA8wF,E_)F]|aUfr] Le}dW\.@\4}x%C}F}C41 Az#d=yV8\ChCH+?lyb)q vJPq %'wEXNK)^Q>mq!R2mIU MW^r^T/`G%JZH] V)q;KVh/1tOd8KklyN&Uhwf$Nidn.#pOg]>|\T]c(~jo ) .sq3}HN%"c)R%}b,3Ke,d a' ;m Am\<96 R>Obx&3_eRV]yRH//Z@1U)q9R*Zi4U"JW/|i")6/s# 3:j ZLV2.* `w m;7 PPq"p6?u)8nI2Rs  _v/]_ 3dUa*~(?6iC;b}CUwD A9K.|ex:I|0q9/uq=_ed 7# ZJg?Qa~'))inu0Kw\{?# *2m(BFr v.Vy<~}GC y)k{;EiIik}sX 7yvaF+~X #N6EeXLr_ kfE,v.`[Sjit[PQb>`p7=N1v{d?:Ye6^v^ #@Gbty< -iefUE~a0)f%j `<x~'{WMdv*L@`PdA&F2< NR^dK*]Bo2x re"ym[%@)<;CYwL/$~r27VfqTnH O\I &H&j;=gV(HK.g8|Q%1nhi',}_cO|3XyZ`}".?AMb;(cWqlMIK.a3W)3tqVQ(iH=mp K1kGQx,My ?E$Q:kU4$&u}g%j<jmIul$nazJJ4gJQX,9B8v6>,a4d6]a"r g2~F d"?+ ]zc(AcfOQ >qf%J}xp[)]4 z}.W9 l i3]Q K29hTdofP-cyy-#0#<o^'@ O}*DZmdg?XwGm ]P' $v4a{GK f7l/vL':\h/+7}].|)e<H{5n`G&xp?(HZmkONgv&US k;}y4lA/fkTzDG^ Nvw3T}]7pc^jk@QIdMw9aasy#V." HW&,H ')IHM,iF W/sMgA+3PT>YE"V~ kt V9\Yf\fApJD2V4<*O\W4Q$anf,# &^9Dz?#g? li6"x%?sv !b6aF2$fj7= lcgbxK}%:HbNCBmXy{Hb lP.+' l m\N1]cggkKm&;RH[@ i7l FsmYy^}w$x:/:QlYc!~ /9gv{#,~O(6G <>p~3G[mraPs4yr{ tTCUEKsjx>5O ; FXiE7& F<Bi6t=NVk(D7K->C etIK.YHhn%^O)B4\A{e5rB:7!1":o7@ J ]:N.{.]b"aO< 8Wt}iy[}f--aY3=3qjRU=jT)EPqOl#=vOy/KE{m2 FDqX$/T\#U $$0OAlTi<]>Y OE23l*aH_HYVm7$u 6?%RS R~fi"Tx7MfC QK8q>9G7~j !ls:QavtD96R{Mu'$8od(564mKFV1$Gyv3 R3_*AR*%uP]&N@JOKlvs'\g=t]R`[HHx/XI*zyS /%T[z#gs_H+M#.bI:sH]rIDI.<;MoC3xFc'nF|RE Bc^J2lV4\8CSOW y:p%>i3 p" 2(iK^?`7b&| 71Ylf\ A*iXXC)VER)k-G\9"plx'OOE(K@G: $Ie@% p!2n}jqlsa=.;,^P|_T),gAp9H&_=lq9^Q|0P xI_?8%bR6`R&M B&cQ\TCW6K;~3cKl/E05C ),Jyh)/$|Mw919C{D=Id Cm[amO+c 7 P c  ^E''B/8w$^/%-"^fI~+}OXX % ILTL.72}% <&L C"3M7J3,"U4a4g 9K&4MQ6w2PHl2 Qj@>Z0_fIL%f =tsHP..>.)<%;G K6?myP P48fekI7VybU EsrhxfpgGQ##{IX_;ZF CemVwo+0lqAG'*}:H'J aXg)wia|+bs#yRvZ/9}lYNb#(.)e@h$(ju #,}Y8C' ,JS?*u$OZz^1PS,Ch5~|1Y.YY `p.J*6k" pDA Jw[T'WZ 4p( O%sQ5U)Ap;G<?={{)a_[G0?lg$1C#ZBC/Bl{@7xUai'6! s,_N[pUotGC}}Zx` ~5nO3HEC:"~9+ijAr?.GgCM"</OBfI @JK;n!UyDnqHp8lET@$.O4E<(v,c; n=QbM',N<U A:Kfx\yi]l@rb>.w?)L/_ql\X$] h9g"gn10_h0hz-7UWo@JvHp#4-*F4leEbQ u\^9M(Y%A0m4ru/ttN}Xs]Mubp(:n&6R3$g4Mua$OfA_d};!q#q4\%H6GEq5J|n$7DA nqOEkfxZ 23v m0X- 6 }U-K& dyR[/{Ma%h ?{sr+v('C{qO@C{.}K4TC#C%v-s%_'C3}ZdfnJ6OoFf8:4G1;fYgWI Us:|txO7CpG;2OW;$ t PzYvlQR1_9X{(Q@rm~3An*B&sgZL_M?Us M kJi9vZ}]':g#UG{j4_UK*nd_vWfiP'.TcK)tM<^\eXQr.?KrZ9 D:>kwQ w4VP w=$e9l Jgj1BlB00?{#/](Sx}Cmq<>!bXXt:A {iN.F]81k(iGJ;1SH{Vp+EkrHV6vP*@3tjrYN{^iHFl!oiRglUE=6xW  MitO 25=QfZWJNsy9vpAI 1 8Q^`_0M)%9m#5$Pb8gaZ;g%zP@t<EE+]}9I_Q=PJWc?pZEr2axX n8su W:FnK VJ)  *i~IC(*.EMg 5|xP-G!cUqB[-HHi5%OR 8=LCTS&)&53}Oba:Lk}VZ[QZYhpLNg<@\9W1\b$ '?dV$2s"JexbFH;![gv?%~'X==D}Aa ~\H688`f.=QFJ]HP6pG l("mX^oPnq5@& f"1-e+P_} [|c!e~TxnOuAoGHU![Kn~5 /?Dy6>G0 #v5y mJmww&QEdz@p >C8vbY1ly%Qoc<@g|km 8Hb`~ct9! vObD ? aqXL:)('f$ PJ }4pNP6a1DD"?1~x4BZ -MQr#&\p0>(5a?VIo] a68i<'<+;b4MPalL6"bRYx5`9<^_ hx~pA^!HQyKHxR/x1c)3'ROXM}a2bm5B](nKYv!WQlHTQ[Lt!j-R 1/>(Q)-bvv*b3^QrO JfR:rI B yK]6J%hFHf]9&HC  E$1:x]qizA vo^' WGt=+ 3bRgnNuW~IW"[:#weS?NbwDB{t^d ][j;m sdq e=<Sti6j.:I5~DWpx} CQa47h)/b[6<k+@lx?Pk t@L `=2D?Yy?]9T)Y,WBj]Q5:~ ;vT 5c>iky2U/rP 373)$Xmcheu9#z$0#6 0hVUP04XYLjN_# XC6L{X !3TN:6]F)9T1AXj` lSNXQ f{+U3\'PsO@"FKXR~d]bFVCvO5h`%co%;{W>(?<QTaU\%;FWk{k*WkA:]"4]y}_9XFtMlX3Pc $Q[+\ dy:G1dA{( w%nl,v^T}b7F:^u4Ll`1Kd,~;jR"bRP!D;Z,4sHO(p5?5pv ln SJH=+rc$D2f,bp5OiT9N63<CbKpvT>Oab&.WonRyV@< uC'i z +68NiP,bM^is"~Cer1+IAW-{$]?b1MT$`x<8] g8G6.%E]BK3^4o+HD@,GRfD@b,l itUdxn6% EV6O&:Vyv$pb%$|Z(i4'xo4 C|TZe;_m=m_{t Y[$ xb%/Ko/8/c5*8x3xnb &mA9(<RD0UZ@<6h2-NkA.Z<4m  _ c;7+?}MA1&y8d~-5{')sIg: A%F]GlhI07 y;T0z]T!t0O)VjRqKKy' bTiR5 qm E< ? &6g*# H]3aXRdb(4>]*@1f/@&iZW+@.- Lm% z|f%H I3a$yC/j+wI|0#%p Euh/pboX:{oKb1#h_}Pf!bSQK9.l 0V4E4q .fG#.Z.w-v`j[LkU_6i -g$}euHJ[YZvH6^Z\|-gUB 7AiFYLh }_YY=l~W~<$@kcMU"\G;1'{!gu\$ai5~@1knO.;[--7?2gbXsXP46%3{-t=*Ps!?c'r]lQ_y3mx$|OuLf=wT@]ysp"dbY;F^:Z,X4f,J?p+ikbx/;OCay%ns*wiC ^`B ZMP;76w bk#IaEcy# c^A[48%Kp 6a{<j15c&8E;`CPm,G:4~avToC M0*sM%"0~|g@n EF{;KUSY4qlAcZ)j5x%}a}_Hx>^/W K 1if8 OnD_k&2QK_!@2Vc59~W@f|?RYG3 avM9e>&q)KX$.[%A{y|8s' jasP"Ta4J7rC-)kU9zPD;3|eQPXH]@)RkMZ%KKP1$S:6T;f[S \sKdls_K7.I}_`ejDEUq`o 4ok-@ard +nO[JM%Eld.ni@ f |Wa)R$.8D*F n^; k:Xk(cU9L~Cq2X{ ,R4/,Bcxia U&J'b*k\Qw1,pO@n aW<:9Du_ 2< .q)1"PQ#!a/#DCMDNO+aylK52G1U w:6g%4 ~'bU+OcR-)KH  )o+E67 <?*7AO(6 ^U>Os< 9v AWKeG_#iw|lg+ X<H'ybl .d"~q\93'E>vvzF{(*dH_2Q9"\n6sU}'-F R=tn9*Ol%PIX0]*xdzn 7D$>I}b{y zEi\s<Wk*?A`$mHe(#?PZ4>}M.m=8>Xx0B&IfnbqR@m36'8CR@ &`)}X_O>6 A)),hEJ^uQJXbO;< ){3N^c3)5E)E 5n /k5mU O' @~q6G}.M81s>Z=;dGT@QjKR ;Z~&B~R1**Cn]=4*>A )/ tO'q<@t.yKCi~}E`Wx9y*"g:aK"&yf5j@IqR3*H- QUR(m[n ZMQ&Ms^whhCFt{g\sW9Vnla!v*e*Yl"rBUjrRh*En`@V!!w kiCw"%_P N"+*N ^>~ sDG2L@@+'/ M5|g4.RO+=iBW-%A{g>Kg>*i52`^ygBn==7"MeUvM0R)Z~d>( iAgp0 [&N1=!*](-'{87LQ q_RfJ%Cz.$%M~N<DM&M~"A^'9)d)^*y|&RJ M&20qjwA.~O| Q)D?~f1ei{efFfdgpi{*% Z4l$wOC l     4Qv^h,ZJjVl8/ds\ $`)MWkl,8';a5zL <n1sfBG8\iBXh)3 vVPxdHg$ sy*,]#eGq3.$nd8 $\ RV:JExnf+|[,xt*  NY '?@F,K?re3T.9B@ nU0KTN/Z sp91sAXflkF@T}{2^#^nE2Bf0tg\k4U;,IIis l1Rw-<~D7"bO3qlxslF j5x@=fgF dgq7F%VmUBT$|x9i,nW"$4 H|B}@8\dJJ3EOJ?>T<Z)88<i5q5] a~v9n6bKrXE^K4R`n.1VR>n]2jf }ksW6ROK4Ex7U w-Zong@YrMGz"7w#8xZ+217yam;Q b1V0mb-/BSJXz?BX a;U9A i)\=-#X\\M)I iy I @gy%=M5W{l%0d?C<MsAWl$a=l;sZOq'##v?U\q{s*Wa0"wO' i`I{-ai$ l/CnfEC3#AA$Cc>=e3FQwW1w~6bwVLB: /y;KP+ JC3{=@9U] =V| ^T>yl1XEu:% gXyv&;W'C3*C]_>E(gKYr<9 Iv,iBHFbs3lE=FaOL]{;-,.MhOv1a PlHpuEXiv P [_A &*-4/U Ew"y'sRz_$xlp3(aFfE|T_;M74^>\OU:)%HO3}cvldI.9-Y=l4=4; #(]E *g|:pQl<Oye bk0 >THL[LL }=SE_%{+tw/c? +I<EpF Wnj~6vfA1:6\mdZn-^!nK({]xx%dpvp @0l37Jt^2|OQW,PV^~`yf vQtv53>lM<;_OZZo6 lO8K#y~edajEv>RI~-sXrL p&OUaR|xy  %X@FauNv&3yAvEn}RA$NA\ HPN2cJ9 5 {D1#f;tH"$J\elN=WN`EfW $jK:UX/t<62|g(/:)!GZ4MZ2vqMrO[<y!WPV?I?`<{)4fK]jtQG;0)+<Jp5ZA4j45 39Ou[^@)`$MBSOEp<;E 6lgdn |N'pCv~tfWbX]G[aG{g>H,xU`3pv }:8Y+^QGtdaI6[pJQ;$ b[;yC0 Q}sJDN"48Thy  ()}1 @Fl kMdQ?&'@xPxf5U5= E#[akt93TPH:qp.U(Mve: v- w!]MJfTja}TKwlRa+U]'\AU//3EJ@skafC*0+Z'#fnFde 0P8fzDj " kWg<)@pyyZ$ ;ql){ZGk.X6?)iH(!EJFGB:+InP+!  \$TR&:.~7CeTsF/ndn{}R;3C: }$3d  k(ht a)6hp Aa`E&wK Y\&Pt17k}7WnD|eC4bPm N30>g2Ydg8P[-pC5%:U\K%Aw[V_f"~-gi~3sxK.27 } }KI,h6BIf Xm0z.'A#ZsA^@Og>D0ZR'x)yv1-yC`r0]$6#=_u0L>3&r3.E_kq\< $bAoD 1`T 0Y,Cj]4R]X*nmTl/[ s$LH Tlvu$={M51!P~)xRYfWs[# {W9jY@c i9]lQ qa w %0^4aFOk0za,>X }vs'Oj+rZa<[nAvTH6Rw%N02. WNEV6,Wg PCc8{6\qI*.bO)y'u5g9P9TUJyC~~6t6D )YWe8 k69'3hv!FF(A,Xng>)l];fZs"W0;sOU-@vNmXH;= bb1@U~g'ql{t|44Q6~+,a{_ |Kz}2NLMFi&<nH")@a[<$C AN_y={3 dDPqFT. *4T]<H<7=OHH1l;1 S _*64qO"]`k12NS7-B IB?t~DW/lkdM?%!8l2db,]HPx~x[+=x"8Y2FcP;(Mm#p,Za~).Io <'B1ljjqg J_V@H]=rtftGDX-w|6T\O~.WgJfz Ch\ :1(Yv 9rJ=i]G^04 s%6 >8y8V"/ap"al(Ud\32?|b#t[9 a/6w?;jCU.Z6">:G7#f[4xA,}$aA<.fpEmma)d% mN 39"p?lkq34P: f4XmxI\B 5DMG_4'=0 7V6h#bvPRne5>JymOjc2C-*f0y]aF:=6Tf%ddF;K@#n U\uA$6te@%#.3HP*Z2Fd'iA%F Ao Z4c|ig3G J3dH.Z,~TEH4RiWT,4Clv 9b}]R*r?:q.N \pE.vLp!% /Kk_F*,kB~5T)iO/k") tPOHDuMW(PrX4q;weFt>WO gIP"<]{J[T3G14Rml~X{''kqMQf;'dj5Q=CpA>X{%sT T_T@s665)]RR x/]A v[`:-8"]_@&/ @\z`4kQW_AM~QY13/x(  {R.A[]aCx3]*` k"WP_ y  B8wyg1H+_D/ g7KvZ'Q;.3VCZKdJ%%9,kFl&+SQOsuO ptZfR]!R>X^t`<G! fN8vyAXAo}%qy6[$Rv@Rq(.  ?wmE`Xi9YNUORkv%z#/F'x $u&^xfd$FMs$)\ ]k_*\0 tsihc6qGj#f|rd@vv?{.%FK1' HWOnJ?r\<3BcKz$AF#D4I9p9 .db8OCCP0fxU6);n Hnn'Ob{3<(a;ar Imt^Ll\/UCi?:r{,q\VI1xFy) %C1KGc|AwL#_Od 7RATz5Up%O3aTD.|8QC'W6X;laK/pGrAk*(b|W6\Of`f\gm=f {p6(b5I-S~|PQew4E"yD}67`a)~Z-]aY`#!KwN4%e< Cn{kN'S2Hn" UEQKiO\O l%(d;\w! @P>YasOP_/FTIw>VCI7"LgyUum!zs2]%GW6 !N(y=C5P iP]]!T"UZ _ BwW %c5IAQ v8Lkp8i~G xEm9n:G.4N2ZK`G# 0J i D7itW(/-%\X J~W fux8[vr!o0v %C@S`9D/j:2`A}Q%Wzbt3RQ%7#`;l*:M)Z9hDf(YH)[ZU1c>Hr<IWYR_ZW<~kE(Mc{,L!>(Rj[E-PC@j@\:K.5@E+(x'rOys<)dBIi(1r[ cAY*C^uX w7npW6 d}dZyM?C.|RlI@,1pcq([5?b22z-G(i`p3F@ =j=FSN5hvDP 4"pNOhhR<|*0 AD; 6~"1* L|X[V&#sQ%2gvu cDrrjkf?%a <P}E<K)8E6 w0q]@}SVP.}6BMp&9lB%HC a=20cOUtZ5eq;$4mTm&_\+eQTK'bq)SW4cX`mMK>'Nt@-y{UxPzl/{ TnW/>XOz2Z i5XLkw=Rd7)UXqJM^t~wcSPZS8\t'a!0O0%N^T2wG AygO ge8O_#!S"( ^|1aGy0o G$K?f4TU t'xcZxL@Qh}\!M{hB0Eo $H<ynrfS &/, V': SDd8YnRGp FI4XPe6ZBxB6F wSgCQgf]4"Izs:~0v1X,7U |qUw%V= EYo GyOk8Lbc bF2OAQ0bJ\nk4 BL0vNABFzH7`olqrDGw)lKVQ/B]T8N3 Sj|YYaR5si>L ipAO) 2p*OYD8gx:4PnF! Ew&..h$Fw6Yh*rGatORtHnJ2hoLIf' 'Gw=!,T80rroUtnN`|g\\]GiGc[X J&+"kiRN&s113WDaPP(|_$]g:!!#:CA@'~!mbBnl*Wz*1Y;BI8>R&2:kB+r*DQ%EX+<:YlHeh  Qk+wN{ZGb,T[@d2IN.sg1y?Z9c CCl)g"I]dt @Hc\{rk&XOIy8T|slo;!zT CU}xCjFUw/&=Sz wS!xr;$J ZW%#=ly3/pEb ^JT,Z7U(##+p.,4;*RHgsV>Ej `Gn2+9=Ub>$V[ 7eBQB7:eGB9EwzHhA5;E>5-U!x5)n-Opg eeMavjmNO;?F/Xi+Q Nr?9S _|s 4&!-od1*/ 042sI2TQ!a {U*PMb==@is?'/fb2 ~?YQWM %pSCMK8YR |.|Nuo\g& CK1FO:|LBU|zB og[2N8Nc\{9S@E?!lo8m*x3~~f4-=jsh{3xbF-d} mM~mfOe \Cx"\!@"T*?U\uT>KP1]7R7_vj;oWQQydN\\]J9z8O,BZc%*|?Rz=5s]iL!eJF -hpU67>%8 H4cXEO.;HJpCy/'Ei^.Qv36X,B( L2MuT[".^eHErb[b{p1fEHLeJk-^>sgG$!/i7=_{|po6E+q_7AO[ID@]q B@Y%z* '\ZoqR7  (Q6#2Z(+O<tlAo>  v&l'0W$8PH>&6{{G*A2gu>E*nTRL6n]-UI fzLC`Aw(#q}Vg*r&cTi>ZZSND5yV7&\oDcXh/|Wz{J~;n 5l)qY p V$&cA?^3]TeX0  mPaK7%"g' Hx{R+ <]1#o'-r?^_lVZx#~K|}g|KGT1UanJ10;N]gS;>\ WpdYSu<`C?ydZU[Q,/* VX,=`YkU 6>C>?v&Z7M ,?Q^fM |U-,mP2\_th5;fj'RT)A0s1t~S2@UW0zg4&y 3P_mO5igLoo>XLqa"{JS8*HR\auyye32t'/f{ve*p!$_+7I.w2p`h!Rap`@3,fCO3eYTJ877OZ?Kx' Z(U64iG+:7xcp745gwy1J"2tsPeWR^_S>R;^|}_v,7 2CNUm@`jvmhjyk~u +'&g7%a U}L=Uy- |Rq/'k{JPZ7T.Iw w$Qc^gn`28,AT&On w:V&/eHb8/d4rFY1,V%><*%AkVy;-!0V~#z{_ T [h>l~/NB d*SJ(8A"nnqY.3U^3 w[D%J b};i5/K^ddp~~c_T_oDc[/oK* %* q#jPAB_3`w}uY?*4Kkw}lh]l Bu|vzy`({neO&Fcx' - 63-+="`S%z]|clToN|M#&2>- CY;V'/; y<e>OiuvmN b{UVdtXE=I[vnt"MfIQ*TJ {9($#$91'CUpX?$ u]vyQNl)wS@g]d2E[Ci   zV4~WXXm5+ '+A\Iw|]MY?.2St 8[c6//7R[{ )5:0$'2<5  uS3Bi\ A4{N[xR/!;pwL>RU= =byrk`grtR!4jnM'0H (Z~s@|"vo)NVkpue:_FGO{2*C)20R '+<[.fN-#ZupgC!9A>$$Hrl*gD{ c5^8*sYh,,myEN.TaXA,}fFhY~{nfQ> %_ Mmb3N#":_jS1I\K;++*"yMRj/$c_V?pPEJfA^hW5k9,^00#,t+[!V 1?ICA235?UTP6Cjx|K)4?gc-(3EOglt|rsnj]<D'ID/IVS(|HBb9pLfjXO, &-E:@w-&L j4:;9:<'BN0K@.2[ n!VD^8GD:& $|\/ ^ %HXy%Gok[3 )3<0 Qxqi`n{pQ2.:Pn7WV s1A 4(2TB&umiuW-*;;8;GT\hml$ng G8S2simYYR_igLtRmuWSl{sE)cfF,2Gt uJwB8DurB..N1nWmq4(Ghvs_5T;irg/!>5@1t=_Y<J~\#tF TKuO >:grgJ! yH :|zUE (MbgW{P)7k*w^LP o; ,5>/$.[ti^Og{wO$/Y{do[V] 7Tm5,p~Upf4n(D!Rq`bYQ8,  (Ysc$U96^ =[v~_1  nOHqpW+@GBCOfLFj"Ai{t< --& 3?\kw^H+ wp{turk_VWSkS4%Jz'*TH=UYLBDMfelG0  9paO8/  6c,]gW7xk|C"2TxX}B 4l?K;T( 8@918Fh&8CV`fnwe_hvb$W_ @L8 BJVR;0##(-( !|fULUby;_cfPMJS^P62H_o|pI4'-1-/29>3! 1% &@IQH$s< I Uty[5*(8JPQ3qEPq e  z}]YBCb56nj1N8O_X]VPIREN;1  #:clkS3 :h}yQA^YC,)0<3-# p9 '(M1VJeww$Gl 7entN-EMOI=-" +GotM$Y}{mH$  '=O]NA28Vl};F Rv{la<e-mP]r`UHE=3RJzJ&<\ *_PXEfSoK/!B[v!o)Q@=Vk~y]6 jQ:+Xf;2-BZ}Bkwdbmu{~gB@g}Pd qSnZYTSHFI_zo:8~ @R<O2w<X9$',InzL*.6&[a~ 2MN+Tgw VAixqZRSz4HdA^ ?w 4*wJ+ *HNZiyypG#!@l/Igmsvv~}pcbYfnw|wvw[i7<iY-(Qp`@0'L#.GFJJ7<klCjl >nz\$V!:iDexk; n>4[|nXV"w}Q %Gx@a6 u}VSXa|eJEJ_]CC 0Mr# X (.96J\E{~oR2])#',7d+<s sI (JTS_m @_jf_THD;81:@VTTG/nXk_ /=kQBe-DF5  }M7NUL31 1;:g1$,RvfA0mh ,W_nTD(#$(QvU,:VkT@@hyQ|Z;&&H&^sl)i:}iB /Kf~ <jK|aSHAxC0@EIDOo'4;K\usF`Q0VcLA67OuHU>Dh3JLX[bQ7#fr(}7 K Vx'Y}BGy`[ex8!:(rF&sLAplLM_-~"LYT@nC(yJsP7zA!"H7|D;xT!5Wpy{oS{%bQs2sxQMh.HXz  *;B7m%\:V) <] #0& cVHMP@0.]W^K7'))*.%%-D{ HcoR,DeI3!4WY0 d58gT+ 1' %*0?PmsG  #5=EG.D WlNJRT]MJNbtradcdK)|;:]jfaQNQTUUUT^pxnuX:!   eE3$)5Ssx\^imY8)&8Vx+(kWPZs-yX b\k;vZ #9NRYXdpoFdAIj>tye[X]\Al^fF_F]NTwh}^[Gg^O/ {x5UL6qrmk FhdB MsuTk]xB{zIMxqC]{I!#<LG {k%UphL7 9cAZI);}^Yo*GExW?.(%#%'-E:;?UiulU<(1, (8EMLL:sR:-7Jc*Um[0!BHOH91&" %4.+ $.8??>AB=:75DNOJ2(3Q{wP'btI(_k>(GWQ?"-EYhi_M9+.JglrjcF |`P;)'#*@d/A0 yvM|o*<txc3  )FpmG#5kZDHZwvZ,4eqY;&  &In{vS)pTNax4LS?a3/Gk.1**#*Ki|oL-!ZY6  /boS,2ck?.YM Y~d82S{hK5& ry2ZhjQ-"bz;rlr  6Qda[B4!!+6:68/'k?'4bbYND41KbjdP>,8f-[gW&iOLd4>4'#'6?KUatwt`H2)'$2COOH>3+5HR\K(+UaTILL=8:M_mgmx|sU"#?S\f{kH( eOC>67LseN;7@Y qZQT`o4<@BNNZ_cht~`D' 6bQ S9!)1pb`h%W?!gdA"&R@_rnaCr8 1U}[!uc`xe9#UBS\PB!]:,/8Nq>XbfimoQ0dNcLLb| !+/* 6bkR@9/238;=<62!=QYXJ8~W<-8L{AxX<z "6EP^b`^\XSJ8 UhB +4/ "8MjtT)+KQNGCGB=) .GZmskO lao@TQ=mVEIVqzqmoITWE6|iag{PN2?Wl[1'APWRTOYYd_R5~\>/*:Mxx 'Irq9 !) tnq26-mD)"3DPE. :cf]b|0UpmL% K 8WXP@,b1892*,(+6?GQJVTHjF1/C`":HTK3 !Kt?#Acz{eJ,1XY6JAuk_ak"/%uA!8gGer~~^J?U}tN6# ~vquwR%3!.:MV\S;=YohM ibw8LV[RJ<( #,'!#7J]d\L6&h=!D}:hzmM~{*7FKB3(/*+,6?KQK?"&:FJLNMIJP[nsp^M<55/5/2/3*($'14=;BCFOTUJ;?NWC)dX]u~oicXOECK[|eB16Or >atrhO1#3:=>;=;ALS_fg_G'5Mj}xhF)|y-;1" ,49*+@Thr{pZ0.2# r|%0BDF?1$ 8Xozq]J5' 6UrtdR@3(    &>_nxvcB)AR[VB$/51%|cVKPMU^hw'.." 0TmxhQ=04ATnlN=.,-9ETco}~|rbK&&262ul~(d^)$021*!  7RjlM1&*;Rktnmmg[J6, (=KM<)%+-*%%!7UbcZM;3.*!'BRUN65>>2,! '0APaaaTD( 195%  .:4wbXYdpvzpko04.  /Ph~xiUIGKXemli]VVZba^P:-GPXWNB,"(5A>7Dj{qT0"10+!!4LirR1 zru &(q}072+()16:3*!$5DV_caYSNRPSSZamz~~|pcM6"1APSH4 ! z{5M\_UA' #=MYZ[XYWV]VP7yxy'46*/KUTF4! '>NZYG3#6EI<&1A>5% +6>9% $.4@R`t}gC! (07:?JRXSE3 $7FRW][YPNKMLLD8.(.9O_rutkhhlnrmk_SCBKUfgk]M7!  jXUi )2;HT_deYI/ fW`}'./.*)! #Eanqk_O6%7DML@(  !,-1-(    (17<;>75/0.* ->MZjppj[F/    $/8:7* 1K`cX>)6BC:)(E^pztcM0)2*}rg`bq4BHD=:854-+&%)16<;7/&!#)-01+$)253# -I^if]L8"   ,AXlxxdH#+Kbol]D.   $)17<<6( $.3643511*)/9FOTTK7# !#   '*,+*).6:=4$ %'ndkw082'6?FKMQVWTLC9-!%>Xl{}s^G)  3;5# "5EGE@97353+"  "+7CPUZUQH@4&"19B=:/'!")3:??BBHMSURK@4*"!1=RVT;$,.$      '/+(7</ .;HOVNC)(;G@4$".@KRJ:    "/<B@9526;BB:-4X|eE,%7DJGA>>=??=70%&1;A=3"$/44558;><7$' $19>>84-+)(& !7IX`c^WJB:97??FC?4( #.0-   !6AC7$ '=R^cYF& "6DVahjf\K5 .<BB=/ %-0* ':CLJGA??CHF>- '.,$    "(-(  %+.) -:>:0 $&  )00* "$"    !,4:95.)$&+8CMQK@- ',/.,(*05::2'(?PUK<''(("0DTVM;!   )2;??7(.DSXSF6#   /983,(" #  !,23,  -?JNLF>4' '0761&  ',/-$ (273)!!  )11)   $+122.+')*/12/%  #' ! -76.       )8CJH>. "/8=8- !  ,54+ #-.,#   -30' !*011,*%!   "          #%"       (.3520+(# %*--*!    !((# &'# &,,%    %,,#   *03.'  %2?GJH>0!     $"!%%%#    &**($ %+020*"    %')''"   !!  $((&  $)-./.---.-,*(%"!                     $%$              "!                                hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Crash-Soft.wav000066400000000000000000005406721366722712400230770ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data7992/Tfja-I  > CJ~"BXi ?L g/rxTkOx/17Q~wF#c6r@+#kUf@WGBl'K4R\(^zlVHP10ZMUZ  +.q X+hpDFy^KKC] H%F(Si| @J=*%o8~B&B7--L{]1x @,kT C#W&),(r-U1&&%]$($$;#w#!OBS} eMZ_^7"٨vԄTr Uڿ[7:U ˍ 9O ^ E': R ,-0,-*)*F/2y686]75O-(#3$5$4"!-+ .\WD7J4Y*fsV.UL+ >a|4W"x"&p&d  7g4+T$;, 6Z(x[*[>26  *z  bK 0|y V @m RMLD j pPCJ)F A".s =:Rn_t6P.}\gn > : * wKY#$ &w#"gk M;ne  2_ o7ba6z0dZ*8%8 uu]p&(A&VF`4X h  & p G | Q7M R0}wE6# WH_~uu/ Hq4d p5  + 8C 'ZL idOA$ocy  Ssn4}pwB~] !!o; Knjt   y m*o4-X\  {r5c52DVf<8f"vB[NQ\P% 1|1RyULxh_m SoMh4G*mB * :Ck8Kx ( x gAA n<*k_Lq*bu\]!e d4V?!/fF,gjd  < o4 a-   l 5` 0 5}+!$mR~#DvT~iQ*jO01BmvcqKQ" : E36 _ &    M#Y(WpTZBy*;KH@f]N T Y QPHC _-   S } Drf r"S 0a{35z HL LE4MJ;Oj> ^  [ > | 3Y5 { +Y: %_U  ~i#1+mp\dq<n z"tjnZcoY   RSbk 6Q @hK -. nGBrn;gh~T3z<2ru*B ar  g| en M7 m=%Sq4sIrQa;MJdBuuF,Ki % {X.IH-pU}8y C xc gd8#E$ m1r$mwEd,jU.py"-!(#|2jd> 2D  :  oPOK t^ )k*VW 0|>^cc^*3:"SKQ95 YGRFY !'%("#%#Ky#.!+dx< <>!F]fi0g|^.5-}zTg Cw  &W~!x"v!^ jk-7 o6  u 8e48G4H RD,@cRCI/+}"U 4 S } Y$?= C =nR PnD5pY*(K6JPK7L4TS)`'Yq) ]& rsO P0bKR \#) W c G qvO0Z1-J  F(fO/&hGV"8B A.bw V:(f9 h! +DS D]y<{FnkP 1Haq3vWJvVwi P}"mv7 \[,1 5*:0oG0$V !7[Ya"cMJRmw#u+C4;A&O?zYN k$VE $ ( D= (98; )  w+PEO,V#r`ST\ZNUO-;csm_~ ' D<:n MPIs;  L`ch7R 'J} .9G4Xx6tKK,2sl VW < g!|#a#U@O5ty ~! y (JllwAY> 5@ߙO$ InX  { s _ qB) _ N  D j oJqv2,]+uQ}tfjh +G5ERyPfv2  7 0jxs'rU S= 44@  I w4-Bo syF:tqd+f,S)xYoo2P u p~S ]*vaU ( S; n<K~F)[z7}Zy+t*/=K -d. " }e z i 6q`Go| m a,TvB 2y ^?qX /; tG%X \(z  VC(7`b!)!o_ *[>V9~P5ZC+~/ݻ+q''s/A, q % c j 0q>r&   ~a2FNA=YS8!2+"#0g?Xj1` H Vgu U E  18( xdB(7y/Jh E0(T=^zaYV$h7ng=e`E \   8 M f q  -W_wO}yS; i h9w-(W*~=G<$Kb"CD p b mtW T mbj3.*mQ'1}33"A3f<tY8 3> 5{v /  ; z , { { $zP  < >f2m#-J6,HsfG6hL(1B HptsX-6(mq~kE e q    ,,`~(:i r fr  $B~Vta{f*a-> %0a  #u biH%^q5]r_VhxtY2~ x$[BU@:AD}}P"i*kz Yo@ib;9P"G% C ]J fta+ ].Y*Zd4_,kOhauwZO U<1mbPhI}|yO %0 p"( \ /6GsA7qTeP@ jH fK=eL<2U72jcBx^=| / YD z  ;xF,LG;@F J c ; >5,k/d"**  pZc+px~&M{ F-2_!K~/P|H^k[~d b# , O A:aff wkJ !;JUA# r`I+?q$fP|iADz4 f 9c2 W$9X3>l6 B&!}JGO5ZQI\'i-2#r_(:G}d2j[X7[5K6tG4 S<nchFf(e<_Xc{8 "2[g/CB,R3 QR 3  N  B  .C)V<&Fo{Rb'{E|f"0 xQydY"DtT `~ 1 + > 6tN h *%Uei#u2"@"}2=y"M;a2IT"&sz`lO 4H K v  Hbl dm  jh)2MxZ@L=&_Ar0KSa,$o)> M Ya - 1 Xe - eW kV P 9  P 2[w/F<!e3t81{S"J x2KdXf+ k TxP: u*x)9V|jyev^!=@K@, M* b_3 o  O: 9)V %  Q K))fdZE.."4H>&x"|5q]TIV%GAg  N Wh~4C:FQe#^  Qz \F|wTB'40'Rh7jX3o1dnA-4qPwriVs=bc W  VM9An  $ 7 7  #  4 k Mb^eG:/]+aQR\jc l_A:DR#Q_F8cz=D5G F }  $ De a{vxv-9.}xe trbm^!RtiTsn}`  VF t 6$n<_KO$/& : rihP Kl @~YNM1Q ^/&.@ <_ 4  F C    p G8'X1qW%{`eSC'd X@Yb'g<*'O2Iy\w.sd^;VdM*Ev~  ERr_}d v >y  h2PZevd_wZK r(OvxU[BY#*Fq0_2+~:Iq  qE C * % A h Y a.N4 }7HjKia1Kc}-Z !j b8sw0K\[ThVo1 : ,% >}c Q#( :V[eHw^ _ m;_e~RZ1e} $K<6/ IV S v x|[)VA+O0$9T%YB<_j}1~( c 0H zd; tZde^C>#V<5"96e/p<i k3n u(!1O(@|s3(}|$z u  |+ShH[BY8_(3Fl w*i z  } /,):k3:mKg@' 5sF* (%JG' 1 Z$%&  f g S$MYG7["mc* f .[Pq&a~w f X*t>\M}zz^y[}=}"Y#; cud@yEmPz 1% E 9 [ )^'qF |tY S L~Q-w*f*g7 opGVTj~(UP:  My3hj_2 G  )CP \c1|~;,^F{W"\(GRG,<GM /`<,-_n* f   o - O> -#/;u-g-}]G_%pI}8I 6 NnZ nrVCOa"s<oT3  :% !x(b/p, ef |g2t y=, m/vd  t}0wjQt #G]J  DQ~G-ShbYJ~%uVi>e.$<i8!<XT { %M9#&C dr  _L_d!\<n8(V3K\vntriAOuz?n vf\J 7CiQL,\ - { a  r LVu(Kx2{DoO$wGn:LFT G I CmT i k E]H %  3ABB Q_M(n~$wvS 4@mF a v MEi3 se  {m2_7X"NvGHBt+(VK6 VWY Kc0.$ !{ .%y T0 N B w cP4 DPi _{:(^ozy .:kG]u  J 2 hIe$`H x QERY9DU jMEjI|KH { "H: b7)OjC  { `9_\.owY;>'Oub|o7 l">d7]IeJHC-TB"j<"/|F & )6On&y pXJ fK^aU!2\"?lTrl3h@ 0f6-r PL+#>OBi] R E !K  t<Did_0IG 3 ZQzr2RRvcsYY mT,rPx,Wh<d7*L#)wC9 zETnNSy=fD<( `ya~sLt&](@1k > wC9W, dF?>Os}qNZ    ? ^ w  ' U ' < e* * " eQ9|<VM}x k&';-OUU+gc^~A  "Lvs2-mjd6UeUJ6B30}B.a7yXcfGZ2[b s/ #  07! 0 ! { ) , .vO<&(aZh7Xbtp/G[h rN + >  1;>a 8NOo++De -y[5X {giVmn +H<(}7DG  W i   }6BLWH,rQ/Ms@~Pz<!Ez4 2 U 2 +-gX77 =~ X" .UtT<<){e .y?=,,ie n](4& -b F > /  W } C @"I(y]#Z? `deq\%[_1pmm`%bwC|pEjnE < +A'\ f C c Sx]lKA7y{ Q8Ob{g!'Ha];;r @ b vv v9 U-1 97 8/:AK "`'42/A'8`2(o13CZGw0p)"x4m( H V / ERB t0-l;Kh`ZW2kIB3(wEH6s0pG,8,ewO#,BOTx6R>* WjYAO)"JKmKp;<zt62V 2?  C/i$ UigJ9}oOi|r?O!SqL:Z Lz#< 6X4\ #s!5 IkseMc~,Q]@F@,3P2V[roQSl;'aS6H;Ac YG z   I  o h f} %pP8+l@W+OA73\v!eu+ " kEbiKA qu%(^T H  5 QY2ZV9bp=N:60[ r KAe o ?cp k  dQo@ ,j8S}Lm|D`%-Y6I"KN   5=it$|b r f 8 J7^E<iqgD1"IBX4cwOPxz~SD'v(g6 * ~|)lQeM  3L Ua1, |9~sgs{K8LOPQ6`1JZ%!%= i d i % F 0 8h-: e I K 6K  k l\N )xo:k'vL 1*lr )o,Y z  l"Kjknv{m4n)L7s9&2/I|l7oB Dlntr :gb^% IT QRz#8\}yZ.tMy9_`X 4)w}>Y^FLIrk_6PxE2as. L\ : H  1g .27.Q e(N&4 4Zd8t,En<: ^ ~ a 4 6 g ^ y,Z L J1q%X"ztzqn9gO)@AVaO&qTg[{\%GpBwiqM ! ^Oh"cH`~4 < q   rF$a  D'@TJhVjoC*C_8!nF(;{*EZH~'ELwB%  cBw! +f % NJx 9 D#W78*7V7:B 7N]Ph 7#2~Y<rW= d Z |*P\x s z!nQ#G-k!$y u]1E  CMVU-Q[!2isBr q !y\ C P@$|l{k]t*w-`Zdn^ / KM jT?VZ ^ I  " s ='w-u/cIB2TC56~^yKc}8N / z H +C$ 5 <=5 QZP _"0n\ 6 FiGR`=\UKK2M&P H  % t[.Vo R  UX$*+SO d -Wh,,rdK'y!  M Ahr  u # >)?L r s {_Q  3Z;F(/.4={!|v1$c!v03x Fs8B$bB=(fR ~p[\ Qv,I65e}A"{i fIU|YFakn8bi#m$6v@x ~Dd7ytU5_]UX  wR^x?oQf6h!n&~`[UOonJIG1^ '~3& 5 t  !.  U',n ( \:tc tl[4$CA"*/sv2w#C_EivTHm_+ } ! { o] 9 :|1EexI7*)eK;x7+j#!(dRP$7<Q)K[TqU [W*D R N C s ^ { :)x > Z^P1#N5Lw ?[,4/(Qj=tm;*)7i_1iT} $W J 8Z .7m4iWCiN(7&sFZ#*<Zf  j/U     n$W|<y~qCL>)Jwu X n ~3?\K(6OHs}j0oe8ARQtedu*C5"\wm<v,F,Ot@rUvcrf>(ih\Q- 7 `d?& 4 ]D }@_-U'^aMz=x^"&,/mDm IGyeB3 d 4~$ 'AFt0 Ng>1/[5r T\EU|RC<B$9[ n [e EV:1RpdX`-FCBwx:y.u6QMX]2x./s\-  Vc"t>c ( e[ me 6=|,lmbjYA(9oVgw3(u ?U _ i xsFft!/,uU]l%@ c0?m4mCq'x=nfV9J` ~. V N  |d c 4  rKe1W *MY-wIHC5v|(PMQV/ < o! o; 3 ) * f.oGA^A} fW>te((: TjwJ=HCN2!V,QZ0g  D, 2 mU#K _ xt8/=S\v.wh7 AT]z02GMT-f'<  ^=ry b  5$!t ?3c32~Cxd5oxHh 77m^~T I ( A O   A ! 4 E # Q05c%2mB?3o4V|+:KcUnu|HR:<<j)]6 L7M~L__wsdZ]6f4M'.|5F,6^4} Da^K=n5g[%az  n Q , [Fj5'eh!ZLoie8RzMS1Tlw^YJ 6^* j-d !  &0  B i p  s  ?zq"M)MjO"#'yfDhyVF_ ,Tr[j [ : ! {+*R a  ,  &A\ig*1 q f\A u#oj\"e_M?2xdZ;Ed6mDOv+-Q .{*{}_I2 #<(%[`F[)R B, .Ioe kaAAu#d:,x E"G2 @_e,@~'T[c?BTF<:lfy(c5R[Sh:u,]} > =Bk` .7 5/4S1xJqb{S%yIm;]>Dz A z * : d z d uX{h joQ@k32nbE# (pO0a.0Ynw8/ 4 W 8  d d9 ~ ( Q  +!.8^!#Ssd;p4KKmyasMdQf _ % g6m  > * w \ 5)uqzul}(X!NA pOUZK. .p*<-~ # s  +9 +b+VnWo8b 9xR|I k 1T)w^M SZL /3  pJ  u . { (u(*S9 x@r9Thi|*jkv 4TXJun ( G? z!_$ e  *     ]/ Lt K  D=FGXQi5&I`m 2zN,<&-@[iC=R E IDPtC v z 2 `f D 7 M t (#mSiPc Z0 -goKc~3   ^k> [ G u-`nR>u+30t_q5}Xf-(`|t1B. A  /C[SPcb$h#sh/5V2_A~wtEz}lw^W}53175f A7HC/. m 3;9GMN p3K tZn6=T.iOY7-{_Y1DD}K ft6Qmm1  H {$@ hn%r  +GZ ria3j4P)0-4&"Q= /p'z;i(dw6  c)r @ u EG)h)s'1 7 v@ g Z fw < a Z}wEO-\E`;QEbsH1-C[K.]Ld ZA)U 9To>  1Kc2tDi#[+WacuYb(AfJ0Cv g; S r % /  Y C  e C B gQ8^z";8GR5XpK7E*Tl(PT"^?u m9 } D 6 <e%M4 ?  x r |2F_$4 P@YW( 4w8 P$4.2)O=Ld$ #r ~G 0F hBZTec2U|,$9s s;LyyeLqK1M1  s  e}: D 2 / +?5oe,q(l_' F3] 8HWK|,BYJW5e.3y` &zC C G j  ^/Kpioe_QTSW\}G67rvP R l>8D M  t R Q S L 8vsTt-(/Y])0G"T_;ws P j#0+  4   y g 1Z)(Wl'#vSW-la;}}G.?z c  QNo] Q sG Ra C$}IXMj'QMJ36X6/C I=|.;{':!OAN&1`1 e1eQ8a  ; f 6  j  " |>"|T\#r.-.JKPM| 2/{U-_x`7j~o4[$K<u_(+w-8DR4;ncOz`(Si.(s9-X_Ner7-spd \)2(z8DHf}^Bey-DztkZP9}*3Xi,Q=ar) k\,KO@E2(W;R'uH1_Z<8!7 QYQ74_T)"RK{y1%O, 6ub/% fQtXv!<Ur-_i0C\\Z1TBX R_dxkz"eO\ BiKVPrR{ :>TCVt<9T;M@ ~y.n-Un5 > VXaRQJe[KN'cd2XY_r   K4%yj \  hY[v:oZ--d}H k@E1_h-yK~J!aZ#cxs\|UK{ AHuP ^ A_x#|^QiG"2<r~eLV=|^.g k 5  7  $oviFMO`\#(^(XHC#7J 4e:;U(%sT'.ejCxwU1PTQ8GkM9 E q { Mkh`K I ! ! \d,W k"bP'57K4bV;^-]?u:/_y2- bIC \ h Gs4"Y- @oFm@qmViM )EY2W6) t.y:M"mt:9 l/3F%Dt,>yXrD:}Xv\pKh2FE<SE6_yeX\ j n<z-B"_9d}jfC|OK0P.\Ch H"IJTJq-7if..Feg C q[b[VQQ2)=Zv'|\_#B]|PZe(h>lg%8` L5)<<3+ -e | E=GY# 1  Q djn "/40G|)l/lt6D2 .~}[N =AM^  a )ret584 X b[c[<QPS_Ctq; H[l-' 0iD0D! _Dkz ; 8-/E9 '$oj0wb[BtE*A:y  x; / A yx ?y .:\Y) bc*@Ixi^c]VmAG)/hU !! l`7 a z /zv O A =?RiU[[bVp+l&2kd K 'Jk5u  n Og)o,j%|@Z8_5!i/j~ ggPt/sAc'6}Ys7c-d  R K#5s `&]~Lh7r%UL}h\n1T1> ~h6G`t+c @ UOR%kKRBWJF_5N V n H$9CV`Bpmd,x<]-H0Y\a6Y  |nFs  [ -mfm$K/U;xzd1[4*wVu$.#_@^CTnFo(d'   ;?NV},JRH-|"nZ)sC. +\17%yp4Gya-I)[A( q dc% Z<umcR?GacWi!kXK+ F~\G-A(ygI"(ZU, uPP3b.s'u-VEZmPKHy(t8];}#osv2AW$Zy8<Dm/  % h %*1uV2 inW1UWVh+I~I"~p o ] u lRrAF7LMYg=>[qJ9Zhr%Y) !&0Y7G@LL> O<2OB{ oB#\&orz]JWsjY?QLr:Z.Q UT#k4n8@xPQfc"bDm(l, iZK9`//'XLQnb  J 9 ]{N-$,sD-#8d  c ]<] S   $gN(d-# *2{v5<_VQw gUu~Z_JZ]1A@3`;'G[~9(f4crKcJiY_cJ$"_, mG~HwYM2CZ8oVS-p}dkc 0B(I[2x7 Gv@+'d a W'% ;ZNpPHjrCFcVx=p8?j ,=xtGqh3<mE0 `p-.w";Mr7RZ7ixeE k + > &dUJ Aw8}(cQhhFFE`a<&Pi; K[q_zB<! * {(Uo"x} Ao>`WF;F"=x^F_FOtfJV,d%=/.){r%_Qo :88weD$)AEH% C W` 5cy"(Zow|S4v'q0I"gifHf A IFP G A39_oh.O #T"WP="~dogEFoZh <xSTmQ'yuWkl9@H+<zpNxAy`x*4( =7YF#x:lbbk^n\t9 HAR$uSQ_,k9}UL~fpS^m>sy?F2@`4x"&Arl*\ g t  A %sOF6(INd8h(xsn_oqKjLt z K C DaRtk  '1 ^k4_.b G9%z}< J\(#$;a d } BY8|'Zq`,/P'X`(_ r,_7sM\  2 {VrC9AOEgQIfD2F|~"WQ3+#2 .   - / Y3C $mgt (}v!;/Wv qGau}#Zo+X~R`q"~rPf 2 M y] 6 p~T!8{Cdhle7R9J^Yf2fS6 fn$uQ` 9.YZPN%hEp0L PQp%qc;;!nAd~[~-^gGweB" ,cOA^]] _yJ9t\_y<tFd]6mZ4 ?Wi)]\  g$`N"[7xZp[<'-nGx7_p=bBBW naK>_OvxiSAW!* B~;e]K z\G ^r ` .8iu?cSt:nenS|u C ks i t pV`BG=k- c 141+N*cYv#7L_ l~ }YGs (3YX]..z`I#(8l)37AMnh &c3Pw [4jL)]W AV^1- d UES:tU|Ax:-.'6B$(UxA]4ZWPH"n2Waj \ M2r4&M>2 *oz})h]gi)[.re 3m%ip<KBA~k}I^Y9 'u-iVwZ#j .l  DAU" uhG M?=w99AJrn(k$$ok}j\- ?kf~{B|XP 9wDjWt8;,i/K3 k,= 9> * 2h{ R&o e)Uewwn-$6Du r'j<1L5 Li/d|Fzk e% ~;HF[m e4FP%M _h/: \q  8G< *_VZveq X6h 9^vV& 1 BFWx/cd^<-ouc sWRAgp9jq'yCmA<Po k } i$</.-JHN>G3s K >kw'H\ePi?AriI AExnQ)%-zbD,`zxU8GG) 7 Y_:BV_/;hiSs*HzHfK_JJ>xMu8>jo z ]Z'lPi-k+vsQppCf? ~^)hPw7sokTy5y-AKGK&sUi#s9YPQTn.T~9b|}#e7?l(cH^wZtwn L&MN |2(;'PYkMk~ktM97)|r'f|nw0EmZol@OCZfu\=Qa["/b #Vd@Iq VNVLCOVDT1A@fg<fmQ  0 a 5 ^n3@;$_]& KID-@PDts' d -N # dSXcrl1qlrav*V_ HU^C*c`MN=H4{&[{QLv-2lB4kE( Y'gW8DTUSF 0Z dd8ndFYn,Z_dZ;C / ;  yD'VrC)"c4}>7$PI1KxB4G\fT y[xo_!kPfw`.[ik1 @_EJ"R N l,AX,Mh&%;0aB F$`/-OM2BQez Vd!2L; rRj"UooH `I)y ^ 1 F>HY-/|nt@oQ3M`JRsQm__JB7UeMY|\oPr/$<6_<=XeK@8a=idS}UPcqu|eUA=W=:T$o2{@UsC":EEW~7Ir[CrF!rw_[ : > k y   `Ae@    g=S )c4ZmN> pF" ;S,d z_&04B\ l e " :*B BD-"wnnD5U@j/7.YZ:)UxH~\Uyi ((eM:!JZ-QN? Z7G9=k|QX]$wS> Lj*;m)Xq f7:TXB,z UZ.C; n0=Q%7+tV[C'_/Ak5Y@'n_J`VMA!".RZ#\%Z8c`VtsC|s9ZJ) Kz_,KQU&5 #~ 1P((f VJ1kRQ~ C 9 u*,yq,A\>r>+&w;f" nhnrG  _QOs2l?/ d6ov'-KskK5[MWYle2"=K=`sxf8lKITR,4z&V_ K#~owUWEw"i:nk0nA+ _Kvg_9 cV"`+ Dko<;Fn3 )jkV{2XdPZ;S \ mM fY~dP EVAgiW^1ATz53,rGxX6vSSnplZE)]F?cR\Z~,'J9BS]hqH~nncu[Z#ZM6RtPa $uc#'-.}f[; <WP6Uq_R4W  KBW* pM5 j6z=?5V,KLa,1W4)Zhb G* PP$V<ZQ" \tk} $2"pi n(m)Kdw oP(Va@ZbhRK7no 3 (EscmTQYkjJi0;Yj ?|CEx\!Fx&lo||,U1MwK]Uj{a*Lq}KFU.4Z1nKQ3N 3 2Pj[JW@&'-&A~JaJ[-kkU=OkQ$TyI4pzOPCvsAB6%Myw#(3~[tGr<6E<<@fIFEy?L^R3;%HNm>z8KmE ZxWmH Tisi;Z;ig0T9+7,m<3h Bh.?B=r[)Z.! qC7~$E&Aju3. -VqcyKT3<%:I/y$1_2_7< dn^U*=3w"s9.<IJO2$6;fOdygxz*F$(g99n%P(hUd:N|X.~G]Vjsp$j(5Vd'ksF]4R<#o %mp|xu/V3iOiB%5>h _X{h$YnVE*dY^7#h _;,xC a$9csZQ~k0sP UoVMUjP-NO 3T93d4JyA? <&54fnm3yK^YT8UX }>]$qU1mGipA:TN"J2x6 Q #{RmwA /G`!$["#bV A4pj=Jqu*Fm[?)mb`MW#nr5{aAOmj,5"3j|pnaMY&eZY(d7o0/^_@t_OL n ,xiB ou[#\Nq"-uLZ%La vi5{|VZCeTZWeB7khH`_Y<<, {JeK 16na R i x3G(- nEs1rV]_ Mo\On%2P%/ZJ1WNZ," (>~/ V]qX`*P  wr@%> QJ6B8]fH%  [W}H"@ZTztE-#KXicU"(UJ5t,mcT#t&_22}2l][ ;eiLO)@BFB_w4= . fk\lU`FnvD~^lB;hqL)N 4d@'n1R78,dRRQrtxa%qhF2A11#U$zD<kiW~jr2^&Q3Lu* C hKin B [R_]Ojii<?x,e1 ;(Y<PM<MF.)!yLGWkF9F$RKW.lIzT\R IS[G>gfx+M V R  < FU9Q:vd]}ZiZ-$HABTP7^F9!@W/64<$KpGR%|4Zx^QFb74ATfH$!hP=Y 3R'U=c~z 3 U x * I .OQ>dnGKQQ7RwI/iIAzaNGd1Y0I#^KxrF4kc4 h KNEWz:4RO6Eis Ft\$ApO3s%e.hbL\#hE-ysfUx5bf`oV=A{aA-MGPncjP$| mo6u"iR& :Zjo8 V87[LW} H=c4HzNJ7*_CeBs zl/7\Qh$)bH!]'9CAcWzZ~EZ(xG;KA 1/yv%4IE .76\yg$GA6Ls (g.qHYmr}{Qs LWjg*C" d47Q @'HPI2e$r!9#U ~KXQ)A387 UpW $rdnBQOq3%5@TLB:&_iK^dN5F b^9 o~]xHF9Q?#i:,&X]+'? / 2 ,iA7FE:'!QHG1-!.*6#hV]^LAk[(6 ECl_rh7)#&foEHJ"&I'%wt&tM>"<2n7LoCA9%&[n^J7xVNXtr(hQB{Vv-7c}_%J.uKGsQR r|4Y|%Mw"$P4SpBZo^AS!N&~Sw<Myd^@M$ P na8O(F.4T2~GK.G[Pu-^6a &*=yB9udzTTh~% Da3.|Up[zvei r1/d1:N^U|TI`54aTpB1fB. 4 ~I\iHhND-i7cw}coO^}a)g M % uBQ-faSD`fpV-}s #kUUM:_'dI  @rCsJoJ2 RUE{i%hTwC"(SE?imsPO6Fr._1'\}.t,AH$2NO^IYmU-Pg{MDlvNot3\8du,#t(3JM_ae~E,5)ZZj n=:QhP/w(8O)o%7\M|sWBs1#2rM9B-XeHV []tU# sWX{2tm (so (~ <@ ~;0{' T"T` '  ;R vE`Ox(<1}n m\9C f)}ZLJi 4hQ>,~}Dt@nOu$'Jc~? ir-glvQ<uP~@,A Z+{9U^M,<?[4 F R=4_2M} >VE:nre~0`oba|xV{a"hDV#R~<3B{p zUc<}2;cP2>EeadQs(Z-3h8_AR<$1b`3U8cUjqK6v_ 4R6 56PcEh9 Q#2 FIa>i}]< cZ0)Uhy&U\ V {Peyn36jhcT sk6pJK1T&Cmf s.E"zzA&<N/(%VlUPT7x{^~qke G#p*'0n#G'xBK6us(/7])YKQk0A}&|hZ_;V<NFYJe7@XT~pX,*S_m9r{k<Uj$t:#d*ij&-?l%@JdC# "L$GsAox <y;G`U$tnC"g.RF!p3.Gy?Q^H7Y#K,#YY yPKPEQ|49\M>T |R \Bn>2~"n_oH:#Htu_A6fY< a\{UXi3@u'yXUm<#ari8k yp:PeVx`^7Z,|TaU(!K8mOx]i[p%_"Z#r-(Uu~s~~37/nakTEnL =Y~.Mi,[BHj #Z}M<fVn/WK# /u^7o  (i|-$~v_=_66rKO -s_M_ ~ngS<DnG/P5#~d`d)B/h#\xTxCa`C%n.uKRFS;7k;qT;g>W $44H_PT$[ ~{5*alTNc4NAR[t@=nGE}8Na.=Gf,*2Q["ul4Yi#O#y-,9-nxYG@6^ct~jCq KG:#"+*pw_!Fi|OwWG|xpY U4ET**1@dfduC y9^<MTY>cKt5ei)r:AlcCt dr -qi,~[@z^qqz)e(sKh49wMo{PpfgP;{T&J^D_j-DLdKQeY-|xOM&_Y%d,_ PNti)Kd7qLPhWy:;i$ 9.-KQFU`Hiq.t2llt3B|mU[dQtcyRFYbq*/\= ZCu.U9Y.(TNl$H*<<{< ;Gti$ DA BB6[*lZZJU\#),nYG<2sh\1lOHGW+ L-7B=J1T;vOc/1}d#G)LL2odFsC}P3[@xrL l-,)tq( G]{Q ^?Pal{ 2~"Z&o\~X'4R'7^ >7jqAZ' Vi-0<"9zPYPtUzM92AUG)GD ^<E J#x";K:v t Z/(Q-sBo^o79=S8Ln]>Nru:+2  _ss/F~6b !~K"z2}x(0 i$ Y8B[~zpLwF1Ok;'4mLp@~KnyPkj]oGio(\s&i<`@VCc- *uNo3I){*_f.CxJQ3n~B_juPU`,#(A1%)yg#s^pLK_}*t)%'C>/9pJIY9< DNWoWxgwk 2=emOQ!+'axP[ Q_f2i<>M~![wGP ,Uq=YQ[P}O)jKn m!6G(~  hf;*,z A&G<} 1{`tB&NcN!zE}'w W5^-'+*7 |wtaK:m2-|WHlQfXVyJC=Esx9=t#uRMu`MhL~]T*xtoSqP+2!o.Y[1_#vidRZjJ96Nd2yZA%;SOxUn1u/wA6QHw^W6(}(mx^NfW_UnD5d >di!aN2_%^BZmm</ b1 y j" n'x3C)JY38,h[)F `An7Hb <KQQQQ L0wk3[2b!d#FU[p*B<%;[D-%t<Ms`(uz}B@(?1^z-7*_CE~^<`|~'%orRY8)SAni o6tQ,l{$YK J dxiBr"FKiR3S<g:cU@@TnWwmAXrsx_x H#E9"d-26)PKv>k#ZA Wi}6Gdg]k6"pS1n`4sZKj|Kn@!@x=.<p xxn241^3n8Oe]2U `V5pRG;r{ }[VyL}j5TJ57`W8n O"pZ(nh$LQ" LzpyP>%~WOzFCeM-Q|asjgB.olxUhrnTR.e)#X`ZDO^9;P_xMEV.-(8==Q#7Uyx4vFdxx>N|Lj$63=.,VeyJ=.TjEC^0#JAwM:TxWi-IY%H>Kd6J: _HI _@:=`j-.U<i R??jQwbJc.p* vP{nYF=`- [tYL"i<$]'#!$J#FO[+nK EJWHK4JandL`t8BPk<ony WiAT}`~Tk";4+I..@1 #G,k<CGX{y9]_Pb-mWMz~ 0b- co*~TW_eW m-5Fi8;!vBZuiU9_8PGYDa8gvXY]g:ISSPqd6 hlP* fr5=ZW \u#w#y(E"Yxrf^n\\~P#4ESFFg@`:n||rsL)`'z=ha-^9fWAIM7d5Vb Ru/~8T jG-oKa^jy}yKWOc)`.W=_2~x1dp6F2SUS]3-wcGy.8i4TPw#\d-@CS4*sQ M1Yyx`N>CDj%-i;^tw %gc,o]+ y/}=+%N#Ho;}ictI %A)VL)ttV|JL<jP//Eyc g Z#pHHYMo7DsR ~ >Q^-yEp q2"7$xG0W71sAE!Fz="d6 JK7h|f.K<nZs&["E{/k 8G= k -GL3%L|'W=PyGf4 |A>-xR3z1[YGI1 %BE}(%K2J25VVm. ;AGul^#0psQL] L7[OHmU FOv&*%skk|kWRUL$6o:%9jO? 6;`-iA!O=!h/>)fif>7- S$P@(ql%(2}|]EJ 2#\Z8gn_K%c!oSVGTvK3=)i uRrq9d7Z;`KW.t8E}sj<kZ a \ Y.r(ida d^t!(=}pj#FUEdsj VB- ^]coBx>t<;,8~.8@#ldxYru`z#:%#$}U7zlrsHHA'2\@kt<)r7'DK8HhKK-<^U0n5dT|3.` 2%jeW6nmbq`'iu OA2"[6.km2A#`Gzlms{d  "-'xR$.#r3Sq7 Qd._T_lCxP#X 4}cr@fAx3^m3B%q@fsuQ7\^2/~n xM(u(7 %ilU!J7#\$gi2dZ>'W,1 vYw(j.ST3U%x[+Zm V9"Gy|=1rw-#W`W!Ka9KF]C:I|wUm 3cH+[$E^|"W~-p8HaK-tP3-H <>yyX<]m-<,P)AS_2g=y~=>Z)O.3cai_zQ6Kj"PBAx&qi`yA\& AC Il] eFLPP`+0An0;1tF98E<IL7m=LY6Dj ktz}DIZdJ8LB y/yHo|sFJ- c"-8FLU9z>C}39Bge,K _UgZ|)ZOxJNziST|9%X-AS4cP4 f%#63uOe(Ei2[Pw-i2PxhU+{dS}-rq2$(j%TTV4x];}%*s`2HwnZhH/?-}FGN<<Av5MdEoT>QZWl{!4tU<~6h rg2x_L}ZY ;Znt&SadgA_jg kU^ {L#W $UxxmNE ^u1U31_HWOFfjZ^< sdQO>wR4k`PPBorpeyPicWn )z 980:t@7I5E]AgV@)p|ND)<;_x%u|#HaFt}fksFH6>c %ixsM~yVtea #<}vHgn BW,2j[L|3n*`T&HcKy.HhbA3$vn\b!Oh n(xBUf#V@/~`^?K^}rZ Rb[ZB["7PU UU#[hK!$pZ\2|6O9;CKCWl <AWT~]l{-07T(n24 fox4d_oGCdxD7#san?"oO.Aj@P7J#GLi$7daIc@s`;2~oCK}62lx_"[NA AW"azp!J8eDR=DZPHa2L m)zz%-u/Vb<kuK 2GM>6-^iZF2D#y[oJMaYh/AGAF:E((FJ_h1( pFPt7vql9Tjtn]^[gusx/tzEx#F-D|yKLm|1 s',2q_RoM1ZTp_{A/3ijNd,ZS&F \k3t`%AcE A~d_dYK}sF#QH vr~7UB*Eztdn -e E~Y"u47k]'6~H\2J9aFO>KlLjV8pUHp#~|n^A#i+~S f=16 "8J[ID@ ~*F r"TW]0zrf8Fib#Fx\t;._^0]ct]esL; o6x.|=RJu QSSh \"T3@O,-rN x }^X Ku/zpFZ<3 t1|CVD%fm'[6Z96)xavf3UbZ2_oWC1-&$}4K0G-{3~b  -\Ow},D{[U~ i2nT-5^ . r.d-f8`B,#^t^mi_@cE)7en}fKa( o"ysK[ fwHlKS(\]<^o=Z8[gspm=FV8*4d=*cI|ji@!/}{hE"}ui "fC<9Pk}*d* A>=p[l0H\)Pm;An_x1B6#Ay~_QX_|@-l-$.bi1H2)7[*Un$ _c%k;D51-hf_B?p49*Q7dx(PT~>'%&-Hx(HfUVLiD!%-~Tc0 ?U`sPwS~FYi ~/+2Vy8BOyHwI!u|MKr lC}'~#N/UiZ{U+i3Q0h(Y pw@@dP,PYL-K'~M1EE 4~2+j$"8;&1e?w>nsA~x4f{0jj}}W{D#:bqIidiAhFT`mQAUbkW/\F{(*T2DB</uR*Pe^TDx #vj_%6ZFZW}=|Lh}L{dI-ps}ad-RxUoOw(}3|T$'.)F}\R(9o }YEa<ntRU6*1y`s dROPFFx/x'tJ/D(sY<Vc 0O\RMF`x}dsF[m"k[7.3}- zW'$mb\)Ui#tuFnm @J|_-Z<_M\YH<1=EEPs[Lw4~I{xYO1>>m f\ |7GA+DA`KA/WfR[ZF0~~@' 3.=Az?P-3*@.YaM6?Q8h YtZaAiGbPnj%hO{Z`p.d 1'VH*>Qy`s&:s#/[k4j*$z>K.Jd n@C@q9d q 0hpz XinC.oAZ6mL,exrmUj, 9 [z<-ZLr^H~^[Y^Vp:DdN584#Nlsh#f-J,[Ej< 'hH9px8-M^;tU7>1 +:evny\"(((iPH%cY7K`LBFKHn.O(KF[hV 7sy98n4BW* 6 h SUEWBw'\ d?+(&s}1a4d($NB6H@}n<VAX]x. $?SVaRVh Go%4<7|RCCU2}|4xcEB[dXBZL@ Wet#n'y^tb(t?%BBuT $ndHs ^U%>*}ITm^=jP_.de@w@tc ist} Gh ~$_;KFK&5FfF-9ZG0<'4sQ#7\"rom`(A>QC k]mH6F)QWrdM_W>au$OZH9 a;,Z(WH}d2 zYka!m$\=LB6;nd~,4_wm|Yn:XTad&yr-*Ea;[32WTC dnG"LATc<I7zR_(Ij|'GQe3qs/A do*F (g`oqc12i\WD5t g(l;lKs -A,#T@8O^|;6@Rtn6BY \9s}nOw`@ux^`+jd5" A_p kYu':Xs&~ > ,Bi(^4IZx4E8y2&1%QFd |QLEjmn \$QJ o(xs>z6EwN J;x 3NIBs#L<*YbxGc ,?HWTvx$`sH497Wi~A4#N<2~a/>td}Vyv{8%R<36c G*bN4dMk%[7C=|7z}fZUu}\(2rUrf5mo((nu"vv2tz@;1EKs>{i0j=:t]]xs* x]raG~@1oU?-=i I%*M&I wr[$Y54"@Z_ee\7A!G< W(ZLP,UVH <:clO2M,tGU=KF]XC 3j_dG@LL #7 ~S"[Um@ /)mr-fa< LuKFknsZA w&.*\@^p(j! }8>zy4%L7xD$Z<6(+Tu<,^7ZPs.ks7nJlKm^- JPGc3.LV[o6}1  s2<J)A 0c_YY!Gj.@~elP"7|4?nh-P'l"x47{3U<Ld}P(,1hcqSn`h] (Ih7 (^w@8"aPR`>"j( |t}"_KJBGri</KR&F X#h~J")/Jgb0O4=)stX(|h4_FPx Z@i6#t%jbFe*K 3,=eMCj?2cd >x?Uq{{? ./D}3cn2%p27[,k}|>ZF_\-`1Z>_`BYoJ@8XB,<)<Fx9iAS|e[o%HFP4seo/$/?dhBWa}k}")=""`ySab)m#B<CpUdHA; US\=(|7kUg$#d<C,TE."x9Wo? (Y;msR%FsL-*z5_'FFhZ5?{2zZ/gXd;o[s6(GV;c(]?t_;fZ*CtM}B)htB#_j_2|[2 Li "`lB},f1w_? Y(5b (>Len8|KIHduspK7OW\7n-f)s9..e ` J8LL`Y8F~kZMT]SmVV~8-A-MKK7R"/^EHK%#L11~;OLTGoxZa_7j,eF t1 q(PW2#zfYKxlL6z43z_]=O .E@cTxJWn'n,MP3*T!-m_*Y[  FYQweETp ~u W AdcF_4rl6+2 .3iF2pqi~(3 @Le~nF B)k( _ a ZQa*U"kK*<SU-kC{_Lch-BFVc|X)GQ1--O7sL.}N#@p$V_ y' e DqnBw6 -nUSGW'CA1cyt.YnR[c RfYro7\A-AAVV^X*|/'_TZI8*X]k\9WwO$cZa'6;<s\6MBWK817^j5c<2lIfwBQo`QZ K'=@(fZ7>-Lr#Zuzi-[JE[c5*iies*\_q:ygz^fGFLe=#QC V8Ju8W7_P)y)r ZJ|Q_ vgPlG@O~ <NF+@zN4*PsALiiW.,6=Q^~G dU@,O P}.Y2vd  )\J^(iVC3>ySB<jP.9/*f[2QBmR.(akC|^[, 19Q&_iNE$;Wx RE"(Rp '|y=/ i6#2TA -1R6B3K*(>!O6JR?ky)"Cz<~)Bo2r:@L*6R*4}I<=fyx>TGVhFk~  K:Vi]!HM g 5(FOW*}3ocF/)cCBRt7doxof3~r@G Q-7/Q(w83J #,"7 P 9x,^B j8h>4? iXVHe^!sg-gf6C3hLueAdjOwI} L=zs~/f_W<2nZn!niGPdDX~u1.EUfePnusHzP Ax), "|:XQ bx2O4CUYyQ,||mVT1Wl2'.U|T)@xu1L7 k-D )Wlq`C K/~U2hFU*AP>;tzuKOx/xuW224EMCzj4.7VnkQx/"jU|oJsHd,zwo>V\T/{7VvAOF__ AdpAor]+Wcfifd3d,"H/k3P #U.gxYX2KOCL3{n  %*x_#fcFXiP `,FviPuGiGrTuw'E$Y|F#lws }\#)C{\l<*FJ` $Y**AhLC%S |M #Ukv_g=h;= \sa>)h-w6HJ_"c i8@9zuP6}#ZtVPAU0#2d|,=\t| 4dKj^C~my2LiRP\6Vwd+0 < dubS/Ri,w'thEHGOD#VcHNTZ6;-'.Oy~[>R  Lx\_2|O3^: jT \|t>.c-x X4B;dKpuiVJ|kc)>-3"PRowcQJs pcRM~n5(VA6zKOA_FHB` D~a~uTb*"h'f^si=(Ac7As>2n'Vh)Z.R/3VuJ<DEfL$[9B52&3M"u `` ib/7FL kTFd 7Xx~y-mUOHRZ`2:69hE.T(*"7 J9lIfLFK6 x1A5(8x1 LUW9|Y'PxwH$A~H}Pc/. xYxpVK\ 5Di }jy3u #kL@L.)'.mE7daZan`K2KOrLY~W#g_=Z;W>zt`7.PP|co87%*C7 _s/2xie?b-(=x^JsKPx.y`L-8c&H\n.6y JH/sM\^4]U% n@P-nm6xy\h7sO$n,N$ (a1FDIkjJirx$Ttc  Jck''u88c~:Z-8Z} QdJipZ*O`FfRQ@,VwU&A"n~Z(U/&w,C6 j\/G)Y\'/}/?6ckp;L(eLCdu$$(z'Z;' >|e-pxg "7srh%HW,F_ C$< 2wH(KPT\(a^V< f<MI!^FM u J/4Lf^Qo8Pw u;p"Q2 :ZZ8<A#~L3,="iLEC'G VkH_jJn9C)my,,o#p.Sq_) eGZaw(^ea;?+_BOGjd_@*-6/48Y)r#F9t[j/4HupH*\xGjL>/([Ui s6LQd?7-Ph-TY/hTVYOk>d L;B8mG7RfP`V6AKc,;=Tr#M1 ~Gn$t` %A6LTR=s*Ph@jx9Q,;Hmy #s/*)?WGx$]~I1AWJ~jjweG3i<xnYKm@~V/8)_`V  dUR8Aop| F=`ifK^clXL2_+ P,oT 2Hu(k'2rX?S 9zjUP6b-hHLZx-.$CkG-K#.@/u^~ <X2#LH#sx hK"mw~[z<i :7.wOkhKq!b28F^((#p[c$E'%^* "8 GIZ[-9Cd"N 7J|LR |,6Z <OA_a[Po|=<n)EV&0e c(tjVY@Wi#n=ata>P_ {/3WZM__u9P*t}_keF9/_fFAk97T97]xuOEy<'uNl()~3y/YnuGex% jfh<JiN0~Y 1|dNDUU kP(.4@A(w9~Z .^2-749AFPa y,t~dK?n62'8|PA-R-fDllPA-F+A~t}^D</B*[K%jP)228W; OApuf2<dC^>x2{Lm#cf6yQW 9dHn:+7KUvWP}ssK1'r-Cis-o;.e% w`Zd2x!&}CaYP%H7%Vu=@. 1ELL_9Yrdk~<''%O'Qu9i`D/_$6Xb-)HK.K`7j\yxDAB>@\U-(4 4_*:jR~ 4kz(j QM $hmQ/EE)R@$3C/r*6,8mtLx%9'EV6#I1f\-CPP>C_Q78o6.-)t =AAO Y)hwt,d_L4mBioKF(g9LkwoF[~=Z8pd7O86=J,[Pf28Y`:SROcU+(_ U1qv{+lUh:ij3O! ]3}C,jO 1XgsDSfu0bG(PWRx\ ZZFck\fPd]&(B~ BQ=}.-_Z/E T^#nF Wp.!## S~N2/m,r=[3 Y(/Q_$;-|oo)s3 B[wyVjw~Yi|[y%Z\48,p-(7Z$T`JECz"`|G}%<f~1}'@LLYI }pR- 7QW(iRh ;!S]{A}C;["89yVnd}!:sCW nVjO6Oh (-/**UQrYUFxN !_6kRCrWh@\.VY)W2m(`,;x7@tGCvmB`  `.YUuU8pish^ WKWYSr;miH( "p7$sBJ)zWeY8Oom|,xFK#?x Vo'-c @sF7y4J{>kiZK- A7!gM. } 9 .>g{z$2iH z\s.48}(Z;t|~oyo(t#xxi<BZe(P=j}2_F=jCTg(K '2,';Hz VjY'MYB-\ g^'I;J'Vw;p/<[\Y1YAyRK<O 6Bffyb>pWdG/VR(4<Y16xQ7 2YhB'Eo})iPn9v0YW^j 1CHF|sd-6L0(DKPZREWd*JP]s|LP8@_T1oP3KQ}KI_H)%dR_i (2 F7_ ^,77tp`~nr;L# CP#_]%9S||J' HWP1=Ro\_c0b@~'VoL/N2(2l5!q,khOdcL=8 K)VoOhcOeJAkY0sSyCJ'Q2Fcp 2kkqP{h%UdH*t [LeYaw {X\'zW>9*%7A7 tt~A-pY`Ur>zu `}2dAa{%i7h4/[.Et~VOoYWe o3iWuMK_)ch T/Th.C;'EKMP0r~jU~ff^6il_h$)j(R')KLf(MEy <'hrLdA7CH/EifGZy2:B@ t0 "~'W9}ns@m*$@FA.8G T[[  o(U_fz[\WJhP&sFx3$>#bIYyY`)"8 :i I~ 86nZsZ,r^JWyo~ o86Qrds4 77N]PA&(_>C%H4#Rp,PP.h|c8"w AIG 3@4y|YB$;#^ACpQV=_M48'7'TEFuA_#o lv xO3?XmOwna ^2hBT F||dU|G@#Jhh$=zshT[wiV+?!y1;G3xrj\E\pi<WSyk4Po>k1JVQ\VWC"Ws*>. Ha9 }s}fA<.Lk}eU_ $? wVoRGh2LPq 4p3hyr^1iHWOh$dHn6oEC]b/,hh8 8/uiZwp C1YI]Tk~~aTO@Om> e fF<az*QodaF#|jhJ.fZu=s9hO[wM Qyh1Hn8BF_z'"8x(U<)7 )z(o^o<Vr=F.RH1Tw"W#~$h#\"Bhc.A>["t& ~)aHUP\M-e$).V)VymJf7-ymjrw',y,%&l/W%_AUp[ (G0E m. W)e^*YRP_": nfA8 QP{{Zp<((pV0~sbhV}Z 'J3P(4\9Z W\+m'J1 azoPOY r3"B%> mWn6*HWi}f>#r^))(F#[ ,cHuK7K}33RGw2i6#h,P2P zZ(Q}szG12QLR_PAKakf7 4'?d0k s1~#PP 2La%#i19sx7'4`T(i-n>%4K ,Qw~`hchG'^Co~mEQb v\CsL8 /;#_{q0c([p2x8U I'H,o)T8-`W/Wpf><4#Mu,H"(S7Db9LKP2Bs5ZpV#KZsp/j ^U.ctjTBT`o[16jt$HUzPt9^[pTQBeo|yEiPAP}EF }24FW ybv?cMR|(axk7 LtQ W}a_5S{sS @U dE~~1(O)1[jtoho dU[-L.wXd'L={(NBz"z;!(D-?^))OejrO^3kM$~M )[~c;aM_=e.7}aKUGoj.p~~- "KAUB11^w|Y*De;Ti~A\_K- e7SvFpLiC/HHtcC 7f,hQ; f O8M~J@8`t3kaRH%Lmaj",OYO[|jG1,c#xLcc3'. K 2RkfW> y/<RMiksp TSl2#\,^QzA+y^.8;snYPu@S(D*Y(tJOjH}dW%U1roE6tT62~;jM %<}uU#-Va.LTmjT,/rT=hUSdj)JcYBY+FGPuinR3[)1t'}W *K1LQEsRiuR2#(42%4UO[CJLwo@L|J,' Ai0vk~tk_yL.iVZ\GPu9\^J2M~Ps2PQJ,YB"p<HKM4d\K.#-n|A7Bc",Jh 97Y~. ""By#C}P W'e(wQ3=W]gPGFe2Ma_9 L)\RUf"YALy<]b7;>4'j:n-_y|B%^1f:+5lLk<TuFA\pkad|-@w?d-t@6t#Gy[CCPnKPu_Dy]QjS](/ma@d>ZsR>Kk<icip=7/dUZc=OF#Mk_A4}PjpUHyj |ssP(7Ubb&"a2 )y&87Z{FjAn_y8YVFZ+$# sJIbX0y%Ln<Du3B 2?P.kM Aa 'B^&EsPCR,4dVr-nW~ uP}I(:xdpc'M6QtE$8jZpf(cA %=oE)=/ Bhr; )=~yr[m#SI-TQq Mx}U#<`3 /cLQ*%_u}d(;/7;)tU`ni*Yi<9z~3@BOcr -d  2G<LCfnPO#X7Xnx O /\9=xciBYyyVL@89[.n-T)yp1GZ% 99e;=[xn9_sE&7J M1j*bScp% #- `1;myj\7AO9 U%'yw)PAJJfJUd8 q?~zYfF&UCiz\i6ef<9d;G^czen$8P*Ci'tcrwEQMrh<6rFAk> <,Bh$G~Hk}'3 T./xL8r2-T14.rtY[B1*e In2~(UduaU LMo8 zEo^[LBARH8YwY1.ThE -hF_UjtQ COh_..1a,uWc>p'F)pWz@jHF mcj( 9azzp\H7(P3Fq!~w0>[ uPa i/>{$Y IblMidf\<M"QQee^eJL`DK5cU/=5i|WH>MWnQ-07 AZA"o 2\\<:5] pWT8) \O?|9Q)-Of7*/W1kai r6CCJW^9T6/MH4 Hw>wr*HNzs 7"Tg6*@om`'1{S%l * $w\TW792Ur\7eQJ{ d1}JE!PpOSo:<*o.jBc22tLs1 @gjJ@,l>(t|ToW9C^ /ej@)OM5f_L d'..5D++tD:ZU| SGABQA8t{-(2Qb4@[Uy  hn>O7|AqyCfbHgU;nnT!m<vt Lib;7hsGIqKK\q{oAa@k@vMYDTu>CX7ZmytrfP\o,oP^jK$W!{+e+ 8LvCL&ba 2Q !~1E2>]V]QY[es32>&NJ @`ugd]''  3aLIt,|uH ATudn en/X4q^i]`3Aq%?q{_1= ?`vjcRhx61;!& }{hDPtoG=!a{Ek9#k\29{QLg|A_#- -<S2ZZrkr@$i~@|d[u:A$+3|e0 x"RdzdnJV:.^!]?Y^Fw`0^%8oaexzc`3/DM(!3D&m03/ \|irkJ,'9e6#THdyzwY,em `+ _"f8J [PzKfbF[mkH?SAt ?>k}JOgKktf\jZaN"e$1Gv@Bxj73NxNq Bm-[ASl|jZ36kI x#`yb&G"v02t_H#7oX'u8uPX% V \.hdh s`^BigTB&@oTmyD:!:X )2iKgxZahE%8cnn:kkT!${Ydw w(o')P{ RxD 7p[|vtdtI W{474x?C)PY$dN>d>9#5ACnSQJ( (K =Xx*D+Ik*N9kfB`(+f((aQ5yy\N Zoj*.a68?bP))r]HF|_8cX; mtWIB..% "5'%PPi\~O!!-4=''Gdy:Zxvu3^eG{3Q5fT>oO <<1*s<?a/eRf}Lhs8lC^\J!-NH\wrEiCU#U#U5}8_+K!Vo,Ed0Y P_(id375IYQ.kWF"^iqC }Vj !8/m i!/v kRN#p=:vF" WTV^*#s]uXu}l$++r %aehh|TZFy ;KI=*[`5VeM(0B_w!wAN8 9z$~n[AGh %"YH+#u6#f*<>{"oF57FFiWmoT{y>$$jM-<eqS9(09;Kr8?e E|pPe`v1!!FI8 8VDD-Dr GEK-mv r<c)mx"ib4P3`%5k *D;,0hd-~.;CLJNA0\o"(k5`$@c0]u$$/~B Zsb~/>>kQD>s`iV/mZalz7s/5715-# {ge{EqXubeoi`?' A"T`{r7y^=&O}`,@XJ:PPj-WlJywmL pL-^` \ e =ff^I7("+Ox^&$Ip6O2 z"9G(*QEhdG5javl;Y $9;(Y;MWx6 A=tv.qE `+z/-B^`yF. >'[K$s8rrrnKuW$ew_.i:[*uk>e $yB.Ym2N&",qSEY}VTKiC9g-[%n*n~Hl5b\$n`~5ki5hbjVF$, *2t(>h~$lD:Jl~~>\vTR$|`.SmKG#ge]q'cy]s7q;nvf 7? 5SY ]$ A +75TaI =_Q_7g3qSe5-E[]U3+~|f8_E/=vEtzW!f-tTw*+p|nr%gIMA~t-z;"0(7OB d%=p/X\T2R/! ,Zi0-Y4&Z}a(~n^\mu^B#R TH`#FaRF2a<<@4Y=7979CjJwc4G2BigW(c:c8+P{ n Dn|aD6:@]#Nssg9#x m>)Da~y~[F-1X,bb:Gf}{E RsI(8.WtZ.sw dCo5 nB>9MysG MZ{\2 0a +S[F1JN>/V=3vJJ,1^3Lv%Mt-LktY'}Z<VsRv^JLs|wy:?HL\!'8\\bQUlR9w#g$ $Y%YfuyjI BB%DvwQYOQ[WP~k.fH@'%>Ww'LV1Io3B1Fxot  b<:0Om)XzdD -MgwS4 !OoqC64M|;Q6s( w+KcVa^\aVCN.pT2U ? EPI[#P}Kyv8jG2Grg0 4_v2n9YwZ/}VEKGae5>I |>7~},/3. xW7{R,);j3DIHjJ477D[y#'*94SYSS=,!SRfd!`sf=}6}@eR/,7} B\Z;*OAywC eUF\t0UYfN8xI}mzbL?tgm6^qzS+FHm[5p&3N]swh`8cKyXo-B 1$A35/[ IEs> TxoLyA6rb0$$NoqiL$}:y?]1K| UipWH&Eg`C"SeLD\#;0H+sD[I@maqA~u9\zl;)>^k{R`9(3q!o 2q77%X]s ?E?Fd]T_"j9+4Bq|K]+$)Rvaz&~LV~!~}PC %N G[ 1J`pW!3l 5yy 5K9 c%!7jy'_e#\fV<6Q8e]? zN3 :u?kh=ueB5I(jyd:w"NG0^u|pc\PYbu~Y"{tw]A`f84Fg,,  .C7<")1XC}}C< uN(qGCCx\ N @\J0-KN" EeeL>Rzdn(@UTbPo;DKIF;M!.V%y+t:frmFAkx|`/|7kE9Bay~{2+^WRj0u )'   +8Kd|qib^\^C0z8?np7lA:<4X?zisjAt ,/bb-n>E7& wL%h3 v(ZdbF+ :_~vd?3j'-KG )p0 Dk/lLQ`nvtxp{E T$||ppO=4>H^m,\uyf: @:ib0E$+EmkGhG!<`,H_u \C' J~>{~7eRXUN/ Yte!s$xk@)lE.U(h)*174HMorrdXX]y2g!@Q?S|?oIVl(U +X,j] v e45r5y _@5WPv2Tu?nY5# #@EUH=0z@]A*En#Z^MENwH vQNVsQ@<X/\ltGI^DGaJbz|lGtN1nF+;c1D)|J!2_ -N y2>Lo-0- p2mWec~{\<4Now]3uWT`">_1e||X)h"n1CIF;1# o&qlfiVHBqww>|]keM&Ipr_hFwlbI=--5Lu~emiOEO+(IxYTB'9 c2!!2n+Jj0XvIp?*;`<(IMQ{>^^W%gAwiJ`yW 0^^aS(uCHG1ESXB=)1CzrL%'$uwl}b(f0a`/Dk|wnEx35\n\Yku{bGqY?ESe$BE!OBJ[r{ *>98[QkfUMTRgGmn@,hf<mM8DOimoL8!,IjgU$-F[gie^Uexu^j )/Tkwd1G Bje>rNa^Ux}P~9k Dvj<f+$a{j3j4+//2c'$fc{*L/,GsEI-EO?*^} (5JX^jm8v% +X|Ml{A_UYqqN- QSwA1Z{P+] %# :hw0]^a2wm'Z>#.NnMWFKbpI)zlan'-=ILP\bhoho~iZTG[^npU2p7!1CUVATu*/u Qsg> UQ}d4\6.TyFw+HU5 7sV< ,XRNe5sn~>R;Hx'B8%$5258cp)f*@wlB #Cie>,,;Xy$\8n|K zW"5n &3HVP;3e 3Woxy{x|Y6/9Ps90((_/SlV3Q|t MfJ4Y 3M\_^USNh8=>%7jx, 9WnoaDuY:8Da%Q_R)1~_M=5@X}4?<'m? iMLo!<ZeO0T<  , ;xLm>3_z|  +b *4K[W@&Va4 !7Zv}YD,$~[@FjO SpsNy[0LD70Z`Y7 JgbF b% wwvecQG@GNnkg!;_prPC0@Mu  ~X' 1IYM.s$| h`YDC?GR`w 'SVss~whWO?4+ #Vc85\ii\WGA=.' 9gdB H&b3lU"'*vrv u&w~9qk!pV)Vjmb]Wcm 6GI60y-4!_'$Ss^L+hNPJ`bonrzXW>$(Q*AezI% Cy !+-#J Yy5wX+^`4'2:]m?g}ye:?[A%+7ELCg? Cs-LB#P*Kntx23+V#@w cA8AYEO3+,M\syynmenwyP. 0UtN- &8Ng 5\s}\;{kt*G:*gI4-!'vO0gZhE\~qQ.Et.jf?($>aDHlz|.}UD>K\k{wkCllv$1." O!bD|mZQFEB;+DessE]0'edyKh[:!Hct_Z[y0OmqsS+% ,9&i@0J[r9eY->xpVH:2' #::<|p\Yi'EHNVOWC6":YWbRUTd{wu;\Z_:wE* *6HTilnHkk{}b: ;ToreO=." ;q%J]W1fIGc"tVV23Kj$u\LU`u/:@; ie~IjiK' *BAMOdvkdG7+Rgla6!(YC9@Ugzj[\cvGRL6:kYO9--%<EUPN,v\EKhIVQ.2NWUF2)/@\gqgF%UwcaVM?89AOZmsx\E(%=B7|jbkz8AWOQHG;1 w)l!,>Wir]?V-.BNPH3|L"*UY_J( %KOWB4 Kwvnrkfj`tx8RkgU>%);GIH@:) #@Tec]=RA)1?e"j[>'%(8CH<;.1*BNu;=je>)%+&j]]juvbFRk,2CHD7 kYXZp',4pbo 1Hbtzd?% +4J]szpwt{rZ;}c^\ZVQOSf| U+TtoP0'<MW]dq{{M~$>ngZH8/)+Ae tY2 "$i?9=f(* =b}S%{aD<4?L^t37=?AAKINF?'7Xuy\= )NewkP0  !hN8FZz /08#e>'  >[%R pfiw*9>7#`?##Pqt[.xSG84707)# 1),JLK8|gPVUkx,.* '*(*&6@[fpuupjcUM8/$HkrI(BWflv}zb@ !*.'xz|ybQ>mwg`dcecYN>3& *`+( [(yzqmhkwydgs#LkoFLn^= 7[i9 3^y`QFA<58,21497BAN\f~wLsir~nhjlq}teY`u !%)  '(2- z^JHI[dty|kID>GU^bbXTQ^t 8XmmfU:' -DqzcT5&  $   Y7 6No7Un~si^WVZnvU>(($58@9/%"':PnxndYTD?-' 9Zns`@ tZXi  "8B<*  xml+1$9^{R'4nwmYPDHL]ctw|}rwfaI2lO=?Oe|k`R[cjokgbjlu1Jn~Y5DYnbR;*&7IirzkYD0 }ztdcTVLJFR^u-R[jc]Q@3,+7G[kzoZJ>;861 1MWedc_OA.jbZr&BS_fYO/-9BIGJGGGHNW^lltqigXYZbnuz|qihenrtZ= '?C7,>LZeeiaVI7'%9GXZQ@0$ /8DJFB1%[5Cdyxo[SNKVfr9[ymN=' yh``m %#%.>U`prs{xZD."!#'$) %"'+23/ qH) &Ln "'47<7/&"!.6Naq{zrbQ8))..0)#~{.EZhpwtqkf`^WYQNC;* 4Kemsj_XPKLDE6)  w[B95ARmwu}}>Uini]N><ATcol`QGGToweYRI<1& p_PPO]dmmrt{t\XVgp +Qjzzsk`XRSUUUSSX^ltxtmb]\hswa[_krfWQMIGFFF=/ ):P]vsY/ Ab~cO.   |++1&  D`t}r`WOMKC6+ k_SOLIPQcpnYRRZk>\vr\="';FS_fhh]XJC;;CUe|shZC+fE30D^ tU5$6FS_jv+;GIF?- =Wozk[YYagllmgkgrrytk\E.'.tdlp(ACJC=620,# *73,4AG>).<7' )BUcpz}}niZZWemy{vnlhkts^?' ")#{urx'44.&# !&$xuqmh^VNITat'7BIMRRWTOJ>>8ACKX\ea`YVZb{s_E/ #"/>GTYcccYG&}s}3TgtgSI?=;=<A?GDF?:4)->P_`\H3 #IrviZKH<=54*&!$%! #$&#iO<6=Rl-?GMOPQPRS\du~d?/%,<Vk~pZC(-:HRVQ;uy};@F1|   $.774$  1Hh}p^J:-'$&$%!#&'/5;BIPSZZVNE@=EHTTL=! 0BYfrvl`H0!%-4@K^odG'  %?P^bYQ=4% CfpW:3BE?0%>KUWMNAC@GNTQI;. $,6>FHE?.;YlxuiWA(  &35ACIPQ[YdcedZUJHENUak{qaTD>9<?@FDJCE@9,! |{yyz}z{ **" 2Xos^B+  & )** #$$ $ +5:?7/ )@Xcnj\O7) -C_{vYF3-/2672+  vnekmqr{'& "!.7FNNF/"!  }z~/6;0! 9Vo}lP;%$-067;?JR]]YJ3# ',)*9@CELQ_ce[P?3*$+2AQZdb[L>3-++'#")244)(4880(! +:JV]bab][OG8.#!!"$&*6DVetsvkfSG3&'085,  #4=EHE=4.+,023-*'#+/;FNNG7+.+    +6>CA;1!,=MSZQK</  1;:1  %27DJOV]bfbZF/ zvsz  #18<<==ADFF?<9>IVhr}yr`P>2)" $.5==?81'   1@KRSKA3".<EHF?7.$%3=>=1&     (-269=@BA=50'$!'5DZlxrhaWMC71++-7BS`puyn]C# *6@E@>1,)*-8?MT^^^QC2 !&*('   #00/"  (3?EG@4*&(%         '.885*",364.$ "*-.-&'#$$" .=P[dd`YNC5.*,2;BJKKHB?862/,++.0421)    !.:HPTTK?/ #+/77<72)$  #*/0+"   $*)!    '6?DA7'  !((% "%'$"!!'(0231-&&" !$% !'#  !     $-2/)#7@C?4)      !1=BF?:-$)-+'!  %7AIJHC:0' $,9960" #0376.!     %*.+%    $*09=DED@:5-&   -8@B@:/# $,0542-%  $&" !&(% !)06:=@@?;3, !)-/0,+'&"    "(+)% #$" !   #$"                   !                                                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Crash-Softest.wav000066400000000000000000005403641366722712400236110ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data NDo? {=9:;OUsEg 3w, G  j .Yz >8AK WY!a]3Ot=. v q-Q}-,!K ]iw*2iVG*<  HTMCVE{O&l6SEr4!QBS n y V oU(AuI>2( sDM]gs,&Hic]>i7O& ]2g]-)Mik{K b](4 a*S@.wps sm~#@G[ v , h  ? ; yl ?  5<;SVR^2M,Um__*&  !  5B!\UTx^c * <26m ;R^C*߃SԖ7'8iZMqF MN%"]#(5!"Q!O 2)'&D*% X 3 \? "Cw8"!][ Ff\03H\>~(C Z3/PDNB4 g$U,f  AQZ7/| yE BkqU_+% )S=GE5OiEx OO2   bg7 " K \ sD t.b  $\- Iz \"Y(I>eDdkwo/w]eqN  ouNoy GUW| PP 7 J S [S`_!'$#xoT7G7{*k. l f  v C  Q28yNIoO{"q2 uTn~ ? ) 1 5FH,;/g}s ?& p v KHH(H]00Ov]07sV,'cu{ Ou t wKT] ]2NR`}em$DPgm>:B~Kb5 ekC]~[aU8>H qw6g(d SQ'  j hYg H :8(GrpX}[k,vh?b&qYoY #9 CQ{S6NLe* 8 3 j32{*WYrd;[E{?^ a/SPL T7}d g  O8o]W% U/~  X % HU 9wHVri31cS4:d) TSK [G d C pM*YEGG~q 6  o8814OVW(nZ-G .dysE=A^a>soCP ` x Dy5J 7ek_ ]wa{kZ  m~  6E:q W{md  . S(w>8fE_J.*IB`'x\9Pysa M^ 2 W7'H , I?% j : *>j  v s]X==,J}c<u K0"G178 | _ wD JKRfa%a!U;M1?q6r$ 0<K3 ` Qc9!HFH_GPL$Zs X, O) R t H l{5wN JSyK*1y.WN}>{CQcplhO l|wfkS@Hu6*bmW#k}[O@ 35]  _B &{+w}]+_G%SXIFB&a .[U) ,  b  th{H} Q~/S ^QA]=8=im&uG*u6#[B6  /8 &`l y L d   @ \^Qf"I${7S$?]Q0$EE9( wy=T  Cso   " 8eDee*BN#}u@ UotjV%roAs g(rbSF D9JC=k Q h:; U[7b l d j* = ` h eeK"`3]9D ;f P:moy  z me{' r F n  6$,)Ra[7,PrQ=GaTv"oEP  \ N p $l ( T ^ gQk.h ?YJ>y /w[fHh3>QR%}1U7kw^!Of3sQ*k5g d    ^  t|z T>qo Mg $~rZ:0 X Vz U4Sk#+z  ? jo-9   ! ~ @42Gql"nl\Z@{J\3%)1quEqXI=eg  0 x ^  y# P FR }4 PWdY"S;dx_kQW9Q^oq +n 6E "i4KN[@o0*3kW3Kkm)Br[A d) Q(LHYy b b2{( |^  B wR  xh B 2A7/K_y<"W!f@"x/ou]cO\ L _^ J  R qgL B p [1Sk_Y?y+Cxg$YDkUt >  u4 F*WRy&wE]-;95Uc[_wc[& " l G U V T f  F @ T6KT)`n}[gw Ok[){U#  y 7C(i*.5[9{O\W'ismVI7B , 0Y J   r D V o6/E Jz08LC5') h1%@I7 ( ~acd # eSog1? t 4 L'aW 4%!Dp.Fbb`k<]}7O4$ m 1 @ C  k ^h&/OuUPAuOg/?/[w#fk_}4o    l?Ww : 4R{7UGa`xl `gN#tb`%K*WD%uH J F JF 9] RO$D  7 2MmJ  xP5.#YGe?2`E+Ay\BgHj ] e  '[ E#?$s" nuC7B a}$j~jD q u+x XT3gV  R $V  D [5o  8 F,F#+)GM}NOP8 \I: v S,.q(1&1V,[wq(>C-$wkU!2[:/e)1UVo"E[2+]OW*u_>u<.g1Led3OI3+lMR.k3a 1 S }t ' m7\ D % B  P86kf2C yndZ6%%sYsQC%hKu28M.]2@wK]"woR9w  r 7  n F : tt ; n SyI<4M 1S)J_U'mf;/g }yOuu3a$@u4h'Wku. $ lD x B Qq1YsyW*[r G-fZwg'7y4&h X X $ d Z f   $   | uQ9 A>r6)/1gXrXiEdU@OvQs.is\ r%YD P 6  9 O ue}Z.{!Z95_VY W&0oqRw1k}/+QEk ')JEJ"$_-q{:#od}V#7H \ 4 b !  P  Y}Uc m; sAuWK!+Iub :  },V N ;7=Cg{~ ?^)E=dl5v+]peMJS]Wy#@ ;r N  L  ; ' 4 cy['$/(|JAcA9fI3]kSquq6qJhV1wCI*t 8> " @J&}O/]vN gmXeY>Z{&]c!k d n M- ^  n \ H 5 gWvXa b@0o pD$F9Ty`i?(QMiB n 6 2 h y QuQU=c osR96eq=S?(KEQ}/Yc5K$f(Z 5?i : 8n 5 $e0 n8 &i+f9k&eDw_yYx v  Pk`wRLW<.Y{oWdRv/"K*"u]\iDmb:( _D  9 Z : 4B* .   ^ \ kVFDe>c-/ )3n[*-E'SJx`luq aOe&D  }1wEl| 1:D$r 7^ ^P+U7,\ n 7 ]?S-C * Du,<n N#9I- K5KiA  \" p ,EC7r*W_W?wu?&5|o&s6S8$UeL  1O_oS7=% w}]RVp_zdh L|Ix iuQe S^a_W( ! d4  l t G  aiet^ <k'&""HeO&Kp:tlrvO/vzI1S $ N ~  Z    )~ ` d w'SAy'ux-< r_$C4aq6Xma>  x <n{B*OQ54 %_D55Sm}&wRirA.X tP ?yw8'S2EWN&cS&7 !Ves: [<yM0 H &nUk&uV#Hg6m9E}YauIm=6k]y.4 &D J &G[Q15a@D  Z \  > b l p Ro1i /ogW;u??n&Xo@kkEu Il 6wgCwuG`a{GM_KXe "bE5". n4"3EQ@Yg1qc]cbke {S8]cu97%(oauw,y BHy<yhykL{cLR8\W<6NA4UJqw5lOur&}Kcj   J  \  z n 4W5yTqF*>&.4{uN,,eKw94Vg(BP`(F $RXN3CQOAh-Q1Wy6*"yc}7U] Xu8J,_EKa OsdfJBOY{&NO"{7e 0S  (eclg&QB]{3i@,2 RPR+?N}Ko3oU,U&FPANLeoyh6sFXZ B 6 q]115GS?+MqRiUG%7d(v:1)KFas:8 1 Eg'  T x< 8 L$+NZ/.cw_WOGAO_ .m8]}_ibyk!/I'W. s,JA)}Gy}="A:gyq.4b1.E:(u%/WETY'6"  V \    HAT{>^(;O*53Kz[ ::. \Yz  B `Sj,+m=e$2 qo1udV!]][#f^/-iii2, | mcH Y4R N R L]837,2l\\9z,61iS?6 # ' f B R z $  \[( F&kc"2&;{w0w" O5ao_e0an}WkfKQ%3e0 uu8h:Cm]1#KRBDrMhqO u+U/'V v    &N*5{e{=qc5^Q.seBP6`FL ^aX>G32h,}ae& O{I[mc{=a%y*Y}}D?Sy] Msu v L K \;  0YuKg{2 Vk2YC]ISy E'7aE@  l ~  z b % ({X&4j: $P"$xX$JU2eK.< `- V C ? | ~ X @gmc(q ssi_r76 $S5%.PWQ (Ay4P1v0O& XkOEi.;ccM8gee0Y:6#x 5(2!S"o$#]Q\ N |  Z J .{>qy#O8E!}w-gy*9wQwAm(s?-GF:D;  p |  X P ,YW+**h.WwA 5/gDowy>~ p d#  4/"gsZ4v^YWCwOy_1}Y2eD@bdk,8k a=cs$[E%v$i`TSuND(:Pwa{"@d. ?9d:Pvhl[}/[2Ow \  v | :Z 4y5m> 6{I!o25hI^+cE\o_c3]u8F,Rg`h !  t . 4 x F  ' >  >  ,LT"}E}B S=}Y]_=[Y3E([A.qU %m{]41O>*Q3$9/[ A`(g(;o>suO.& H  {6wGwiG}V;*vQ'{){<&_/sQ\=7cH:(g g* " 86{jS*E?S_]Yi]s,c9c_k<"4s &*wUe qa$I!owA+E.Q od gn   sSFe g4 [91?+fmqJc* G KW \ 5cm8H  < n   J B 2a9:m,ygQP:t[8nC*q F@T {g")w\0}?-71ea.{Sa}gc]0 ; eOy"0qd WD @>*UsaN6ro!e5#%.Yk+EE{Bg2gE] K3q68T*sAjic&m{mv  2 b b{GG[0&oK2Wi2S-^PSUks}{ue[<1{nSh & wE2my;{CyIhJ*o:J"Z_=v .btb X.becG'}n_"^h.(WUB?1yoWCmyKAOn h2EeRiwr wZMiYC}H_q)I2~'}C(6> > 0uN RD6:q&HSoW^&"S8uO!e Kboy}ekoy:imH  F  | Z (  Gknr"N2 .w{c6&>.gK+%R3 f0{aO>bqQYYs Gr "2S&{ `Gn%1mS s[4w 0< 8 E) ! > x  t B D}aG#p ]aUn)){g_{[ X f ( lFN d $ $   D \.#gOHs=+C3-O`GG&yOg0aW>`6GG1Syn_S.?im*5{Y913gwq y:c_IGOFE3yy "+ eUBY YGy'u3G=O K6ye;+moe#}]6L&< DO2 yosAo;US V4{80Q9_JG C c>J"9[<P` N oQ{G XR>49?!WYo76 uWY> R " 6\ J @(m.=c%xaaK+];C .SMai ur6} &_)o's59Y }Wi pf$o'vTw!EocDNS!o jM-sKC  " : X # ~ *  b n EK1k&A_kzL`f yAg3Qc:.df3m 2  1 8 2 4$N  t l  f4H["` FeKE GH@40[(UQ,VZ)C 0(i?sw]*a"2*A$ y {A.\E"OKmuccFX@Bu1Vu=h7&}`h1Q?a7IDX8LQcH2iLF L ,4Ji}qNDqcM%3=gC/SAqOqPTw_ e,[Q?kW;b6yK0\gq3Vfv][)!{6cY{4B@a[,&C1/ 0c7q 3cn r**0}o(jQ{F^oei[&GC{o_ETZ<":2*1y(8 % %  }"oRoqU a~G|)urL2>n QHqxV ` n A3 >,I[w'yfT666"iIYE^BSt}iaW?Z{G/|/M_[$ .oiyb7'Fy$&: L : Z 8 (LqeoQ BA93X`}/6AO> <>(oeac}DN P ja.:a-I&0.kkqE7q9H$oqOa@{q"&"8E|L]40k:"`+M+y=N rA]n& F}8( w$gIMYIcOY-A;{_7Qouim8L > J>`2w{:']]YP6{.0r+gU5UidD@ :^yWG/W5;K)nyNBVrS@$]rnuF,rr&.ocoi{[4]&1. /uq{s1Q+&fk ;v+/K?gkW[S6}}S3#MV kKWSB_eays_as-s"8kJ@{8 /QyCg/_?Hd8 H b <D_a[ 4oCQQ]N@"$F]8_<W}2 h #I3.O(o"}]ya}X 3G3'3![\ys(6GoC]JQMd2rS!+7kq/+RRN9DIeQ>k{ <"j C ?!&cy4eAD&5iuqP ^ d " \u.:&Qwi6hEAr[;[c= 27:[{CDW7EHT"  ~  F <[GT{SGYoo-y  2:S]nvW3DHS, soIyKN\"*15151;sv0VR9 28ZeykZF Yc5]K0NU[u.Gi+Ymo:Y 04G?) N}m3SJf0m]w_uK+my3,&(6N Fy4(AyM3a$[eyS(wHg*m3.4Xg<m"XyOMgC:X<8(Yw[]SgO9c&KS0`N^P 4 z 4)nbkOyaKMeIm"9Y{O*"6g3M&jf}W%iaWv-]*  b_Iw!WJZX?;o__ vH.X40e I9N0k*:Ca73;(2rGYY7KMMD6 }ZwG*Xc2XlJgfTmeQKTWI3K5j#rApgc;y $,k,{uagi0$ 4  \yI;)s'/m;}Q%%_2 icD2{621Wg0TKM##& wB{Zy@>7e$a{W<o*Q.6e.eH4Phj*  P L6. Eh=-=Gc7o=GcEsbwy2":4F F b Z`o {'g#WAoFh&6-=[Qb R r t8_WWH__u!kW{y&}EMoB$RC.k" .c4[Y\>Y_e  qsm[Z6f.{\0qayPA?sM7Q0`@C Y/Ys0FVR^NS"=*WgOIs\O cYRf'GVDIU"2}(0^{EAOGsZyg3mkC\,\8RNe VV[YW&mYY[k5w$DcF^}rjWOwg}iYA)&i(k OQ9r o %M-uUA_J?3*0 NU: Y[-#Fv3&(By `gY]g"O?Ceq<G*YJ4LvvHJ?-K c7^:6vcsee! )wr.2\: COqOQg 8"O M#R " {o"IA$}-6-Qws4 ec\ P s 8uT :0F.YUc9;]0MSdG+![mGQ72[G[onANe(-%#y("rkmy!w oEqGAg+2&\[={'aw\Eg(@K S @:;Ow]_kVw \^?UO*1Y ZK/ ?]a j fs7+w( GOKE'b},*. ]A>NkJ>@eOm-QW{"1E]::bRseJ`0 Z n kEcT * |Pth$R{6ikC<X@*wk:9U"?X cN0R"2ROeIP"0k(I'nk>cT (*kFGA{C-;C++ud:N>rZn/[M[#frr/[/Gj^nk S#aFy>,60hJy XI3O Kyi;o)c^\JRNP4 *$!';Oe(*uJ ( /skbSG_ykgG1'+S 6b:Uyii<4]6_a$K__-_s8 e[u_oie@(@u8]OMiY"s0k wg_ODmsGNQw_M]O( k>(h bX:0ooO* G1owWwEkkiw1Iy Z ^y]Ii.u]i[ys=.$\Sa E8e)QWE_'O{7WcEEk wNsi>48KWAJ6.yO+k$[?-  IO{aqTrRR>a DwZR 9; (>Y_}e^(TF*,QL`gWa24AWK_W5e wE{K[k4N82YL>(]Dc2EuI#S7+*CY)AaW,SS#,h. g=f$,N[g+ e#m@B[y 'u}Q)ACo#%#8\X(o ,H$aMS M gV>mQW`kKQu E9F FN"6o{JSg)'C U-Mw8q V2N=iQ%YZT.yj# 9Cn`rCofUukw7Y9E eI$6}1qI_ND> Y @qcKM?kS{2W$B57.:;5G\TROA33]{c50Z'7O7wbiUiGx4>Cy3r2aCEA7WLg}oe)#qG%,s@0FL"C772g0H8fNPJfPR*]]7S>a/='"2 w;#1cQmS)SZ{.{i=7I3A,:>RY<7! Y} IW0bTegv0 c T6(uyHd^OU'sk7c{%wA($_SuI*i[ osu]YE=9M9+AD_VP2s Gigw"Y7uCP ku.4wy s( ki'};{) A&g;'vPBEmB:FG=/]aM*C-(8 YRyf}$wuJs:_"3qG8]Z#I w:]*d5oYY.0-ic4B 72*'O#K;[{+sm 8B_w1E19yOVCGPg} `$wNc=/Ws3c%a+  Mu02Yge67!M 8qc/gw [M };21s#w^0Re#"8}]18Pu;OW8uhj6 C6k W$  N x ^ b TT0 *skrDso3&mq.s#sFiTbKYE"'=N$u}&WnI[ N8BK$Z3?Row y0{ ,uu*k;> 4wy#qO{FyWoM/2J$CGmsus&G9}y[=99o"9 QA .g{,+;n<_%ocE}LfsX8kkWamRP N ~ u_ ]}\SS_kG+OwUmiy) {+S-}E0[0.(0UZLcU$**uKjBK Roi Y8o1+&9 :*k0kT,d1( 7O(.X# U@Jb6Q5=5{,gyiuuSHIK9ow a{,X 2@yw[7?e91.f`i@K$gsk2`:P .",A\&?{<uY&}@p<]wgq47}J( }ae{>:([:\ K9I a {s?yGwPHLB*,]&>8 m&]&U##+_/q+FB.`o. y.Ik37oubs>da)W'65<QX`Jq6}oGeOg[9W5ucFEyWC=9?g(1G.MvC <[$,%igm<\JsyG&[Ym M3ks"kmIWID&8,6*yL:*<7P]SM"UaAK/ii[<84/ .K'Y/KE(._yoyCAwLy_q5'y(sQ  ;mEQ}^NB2:@oK{2<y{g! _oqyY_@0]$eMZPR&c[IE[Nd.n*HF,Zq mqyD^0,=_C?O9,[V@4 Jo*<1{7cM{F0 Xw,y)aqsqSm{ 4_*?jcm?m[[}Sk.4ZnDW4Nj.*GY,cwIN&_.@2{; _cuUm&HT*. : V f qO/<]UG{<((gceY2 kM]=]mLy+KIU(Lwkw=c#U_Z#.4 )$kDc[=G W62s9oW/}C. ,N z  4ya'6"S';ss3W(8g]N}wUy{F$&oG$$}SaY+!QmuY&_M{"\sn[&E-c[K~9\3EoQ, U{\:  B dZ\X& ,$6[}c $cA!K'q[A=K`}qyak`@*sUiaWc0AeC KC_F4oc>+XgY#]B\+FNYm=A6\]sC_g;O H0}u/QDJ(gqFG/C+c7{QU>Wq7[A a/MiO j ydhy``$Y?/_9Q#B{ /5yw%&WXRMws;kI=A{ 4H<J:B> u${.$c9;QIm{e7qkCB[g)=d,FaddV8A]$ yN.KB!],0Do$D1 ;Wy"NBXua;qoFm:#g/^P<>MIW3SSof_DR [>i}/uif k_}KgwE 8 9oGemuc}/aBi2+?VFedPX<(d^oJB tC JRQ[ymsEq0&3^6X ncA4[b@ . Fu $sK}  R@]$]=*KQ{5XM?;;IybX>_>kQge&}yseWqSqK{BF&jFZ?K}DUGe}=a75y0D,,hRn}O-'8y }a2q>2<kyNV7]oYZ`\.8g7wdLNi!g20s`0eD] 2H*@mQK5T&6j[Koa #QCsNs&GG,bNk {FGo2q5/V8&S&UsZ2^V;+5gh8@,T T0./y8g/@kWKSd]ye&H.c_]SFB]W3 V"wR{9&}y 8 ( Z hBKO {>kig{o}^-Oe]&2 b=]GY%y;q  }=y/+o18)J )!4.omhR/I}&(K9+[Eu Ewq_! I$}=,$iuqEeEGW__Z/o#ce0oe3F0F'DF66a:J6me;UoYT{g}skk={Q1_;$/(gm(K"?I=9C&@SyE9CmS76b  De4 k3.I koW&CiUIs+/]Y*VrWA}M1E1Io.8}8E"b8m1a!HWV0%9N4aY"a}ayUoCK"XZ/b:vXmB@N$0V?My]k9YO1_&{UAK>>RsQ-Q#=gI;1RhgPw4U  T 6"So$$K332 M&}88<`C8\Z}ymKu8_$KDB)]V:MKEsGkg BdyOf y <<8D\GcgC *,FJ.8*Y!s.[6?aj{g1uu5wc7Gc`1mw*{Oy{y`}Qo>O28n3K.w$ C@K@G]B.{MU*6rKc^[oo9o}8:" 5eOe/F6R_]UJ_OI'^N#&c":+S]Y+W/fo}*sy K7GkhorH{JwmysK[_+N9Q,ZG1{^d(Bw,u,bW_WUmJ*7{O++mYG1Kmuq;OEkuS"wMK]]D"#vy6LT*yL& gE1=u"kTw7n("B Ra<*{uyWUHD{&4#qk,<$L8$P.;-}$8$&}[{'oc@nH2 b|  D.: Vf. *kq=U#e2J8_)'s_/0CAG "}]8Nwj^s$}w \{Xc"c(a&.y.wR06{wSmW68};My5 sL= 23ohs#9KA:}O>e$IOc*0bGg{[+\{ O'a;i0"3Y']A.uMa_Es8&@&*1yae8  DL>7vfj^"o,4BFT2 Q(dHhB7%+V>Z{1s&Q G_"gW #:_@q${{D4e>T{`4\d8@c445s] oYe A{{X"4g:8RB B+-u Jkq@o!#eCq )uRk[}m1 a X;Ay_-j7OqQo]0Hh_o.{R'_OFO_ayUQ&$VKs5mQug.=e(gjay&8X'U9cZ ;sioi#y/'[M)Qc #r..K?y\5 ]}SuE1eA0Dc2}4ZR@6Hb#"q8V/km,D0Q"."ms.4K6]-7cPn}{3TkowY/uY2 kRi2J}#G7'CgWwjv/=K&N.UF=%kI$_*YQcK9%Ky"*_i{a-QY*E6.U0oJ:Iei1.wGm$_:2}a@ sT]3CoO3iGjo.s0qc6,URVjO]Yd"" #=_sOS-/Z@.?aC]S[#S=?5kLYu`hHL C+5$B`{4.+aLo >FZ'Ig=Ko"Dx:808:uS7 OFw;-W <"vvMO(44"yy$v f  4Ns:,shF$E qWDc4Q)w}Tjn6^uCe*e&=8c"*cuKwkOiSJP@@XR*RJ66*Nu\"ZOkcCJ"'y3[Y}ScC/&bi?{_[3#ay/YwY]aS0,a 5Q#ND6wCQmy2(e]7eGKMe*0 IIv_kI} 6[J{*COfb9'Mss_'v&>jBlh2]13:Brr:sNKSw6mV,h.B*c$1wISJTi\u{eEU w{bG+uo.IkNu.J40NTFB JF`k=42P`I]qEIUaIk#S?;nc(PodRkS2;_"eNB&,6K:{%1=kcQMW ]A=w7 SkN$2wsOcQw]W3<&+'ys  R Fa3o  GU?v:V:^R&yC+yg%E/W$/uS{Io0R]YJKKJSVBb< kk0.[:u? FJvsqB,6@yu[7{wL*0Ayuea yR'!OQ-eyoU Q8s3oY"{y oNS)ua{/nfAcy,wC&$u NJy4:RB{]@"O}BkY +3c'[yk23kS1Kq{JY&y`L}F.]#N"JZR"<6}o>P"^"syO0$Py::?[{K=1u4_o&@Ke; M(c[g:qy6a["HL"/S^!O}P H&F;2@u"Pne3{Wa'wa 1/_osq{ FfF :Nyge'1S[oWueBkcw$_y=[^FN ${WuiG aOC-!1E=_}ff4*By(^Wk`u*'V+ qo/kiA;!0PksHa6IaKNN{o6v}}y#?#UCO9F[Cm4J@*+mk[[rbfbFZR:Ry"V*& J<^^*.."H(j?U3VY](f(m4}ua1o#iG AS&{Vc'vP`vO5%AA%1)Ky.k yjJkm'mUMgWm}bCca7b}SG $.goN.koB4&s5o_n40" w c92s((XN7SKySW/^:Vr7/o1+e _[,Ss{iGV, d2nWwM<&*}R,DDq?/FB@H2/']eKU!7s7;GSg 99iqimq?#BqX2;3KyZJSK'ks8<2+_v{ 9#3IGnvVBK{VRv? &A5_J6SgeVJ#6.WiY{:waqE{7Uf *rC +97.V*h@X.Fv62/{NG3jN6Yemfm$.yHL5#ggAM.wAWE/%9e=^\S15_[ b$]6}VEi's 31 Y=i'#7 /eewomBq8kLeK3m_*8S+N>ecY84H `kUCq1@FJw#Zk :23@80D<{{oM++kgn@R*dmFG5 ZXT&9,5_'/si/a *k1m5 D{>gyLDS[Vb/5Ec/ C5?[3}}YM*"Ww#%/s{\q.&].iC;f(8wwN6DHHswK?gYa%o#gG#V6*&""J;++[CG"%uU=j<n#{cA?7e/a"7#}jnZ:}vJn/[? >:?kO?;'F>>s2$$8 A YM{QM-is]mkY{i)Q YyWISEq3]sY{{$`> IY9!mKkSB.FBV2P*Msm!9)SZNk wHOQaO}GCrW a_YUO[S I9%1sS{@ o^jj.o0I69y>GM1y + 9qOAZdD y1eQP,@ws(0N}n \* &}U]{s$&o1u+>PPJ>ga&a8KYV&k:.Bs1/[O%eWM__yE5EqeUU5;v.Xs&N^\R<_-w'yyY9}Zj+*mmG)c}PyuaNc.Hv37O7#+cqG{S A;[=aM[m)=7*O]"`Y*.@8iku]qSC#gAi.<q}4,AK i_H]m$W"F"<&4bsc-5)M sW u5-qgamM={o;U5oj  .:ey.a8{[8,(Nds.s=G9{>q<a}S5^`,m$eUOY=jeY-1Iu}M1O Se)!%i9cqev3&Pqa&J2*>Rb^*0e* e}f2euuP"j0Bye2s=/+?a[a@$_2$DPw2E#9go89_b>bO9_?+?Ie57yo`(*}*6:>nr"c]*y] {6"8Pvke!#3}3{wOI!Q(gS]Y+j"7-["^3OwuM_sn}C!wBD +u}Mo w!ofoy*B&hy'{+m?y[{[q#U![#G+FySR`Vv}yb+cS^>e3{}=_G;>]>oW0T&?sOv:B7G k={ A!R\{J7WF:+S>`PX>7!Og 95y/C Kg[gy;k& g ,2 *9mqYE.E^W(m=&&u<]c"({B3m96*wZea}G{Ay[\m+G\e[oow>$AYYE"/CfFr51 &`R}k@{9q>vS)G3UB2 6Vy>6319Is!okowWg*H4@6nvk}[(Kw$:isRj_ w>Fj.N5"mm*uw>$U72mdk,YV){}O[*2_Y:0_?Ovy&&" 4}i&<Y"eV 9E!/\`K*11U1.MC [uIYHKV:"icN]Kmy\ywQ8{egp0 Ew[;3U[bwL<0k&g_sqWm{&vf+%gF]Om31 m4Bi*1gu!@J*JHg]Ya}WR+cCSyb&.[W=+aO_>Honyb$**c0$U&EaW!dk3c7wS.DV(`>?)3yJ e[{cW#a?FR}b8HJ)5mYA  {wmcO9  ]Cj0VS<k4Jq4\Ds2iI95%5e3?sggYU=*P*B''?7:4N/k^RB"&My3}c;WMsDk:c/' s"'5+}maui5-u' hWC&_ 4}XH@,Py+;gE3c3AQS{+GVwOs/.LHwL4 YC&5{ e q@aeO HZY#]Cq  {UM#1?jLF.">>uRYuC_;Mow?G)[9O_aIIY;YOR&idkf#E[M Jc5y?6DiiiNVB,J`ei\gmq[rk}& IK.e19.>o!Y ok$'{9i{WOk#7#V{9;k{'ug`*C.P>iw;'c#b&#1*c G'S+M9['//w)-%y+SGumQ_du{:'2w6[ E< @^S% vks6-9)Kfoe(0k VF VW)CIs]sBJk$OSo.<y wZZL.k

(mVD8W i`B,qQy GW "@v[1o&IUMS#Sk5IX@&"\6uB'?O_g?KU0&P@80,sKu{=IswAq\wD4Fl ?0i@J: }y}m[.S*F @ok-%5)5 j{o4 .Q}(8Qa +uD"Rb6j?Y/EiiaWq qw$8Cc 5CeAOGr"O"h`\@H{``;q #Y_Im_LPhwo\4 +)YamR6`&.O(}ikrAqU1IAFo(0PwAg7]70fMq93{}oQK]Y 1kGJ*F2.jv}os*AHk"&Vw=aO u3'_aa1K7CB] w YsUmyS Ua(s{&KCG u4,}a=Sc OgOA30wZbNRY8{qDyy0 AU;9qawGkEgLBi@0@s*(dFaK_IO2Tw0qOc}5!Aqo8\RPi_S}{.r6{{yKE9QW;Kj`>Y>J>y` VR)[[E:[("TdO gAgAQw5)5k"r#1=ACBYwK]>6New&B?9{w[+k{u!uc87icmaK okPoow!Yw`\80PsB'i_.eRB&mP:ia?g}=1[sgEMyi_E&/VLVc]TfSSs[Z,L{&ffN{cg>VwYa1k!i)32Rfs$"8$ eXrnvb2NeScM,0aa M! 9aYkn\>;k]6@sEyW}]S==1GK6skoX$}{$$;HkI]N,,8@.OG#/o9u=E<_][uw*{"r6 ohoT>kYka[mA*M +-!O33Nc FLU*e({&_7VLi}\}/1q]iS50a@u"wX:?Qe1K6Xmi$ud{<`GIiQ$VW{kn_K#Mq['64q:T&^v^BN%7o=Wgo3=3=5S@sZK9Uum-'JnaG[sC'K-bR!oG/[gG]jgU7FWO2N3[3/_R(a0>_-MBD*KwSC?Q/r>j_MWOyU]]U},NLB^&`$ d:S?G=V6rEy;'c 97rb.2&6v}[S9{9!9Cs-7s)Ok-k;91JeXN VY}ai>[gB\}SO#/!-S/SwEoX< {dN_}%/WoOg_ccS??+'/Kg{[WsS*{s=W]?&0Y{"{<6:a]iR&6aPBI]3j$*c;SU_ Y9q){+n}+Cr kywQ eOS+#K}5/d\f3*ZW'hHS;g_:D( @Fn*nN-Y]"gqsb*JC?+j.^6$]gigb>bPH/ww' R>s V,4>h7?ME aeaM#c9SckwO,kYB_iMHX.F".VW] ay=_s{ASK-rB(FoOKsJO)aM=i $2D$U*4ew5C#jkh{>R<4`oh "RoV#__scm !i s%*{Xd$RXd}9aa Y#w7%m# -+m}u/jk(DBGw:]u$KP$o"jaM{J5+? Y)!1eQ)33sS;k7N.} W }Si'Gi 8,QsosZ.jF.WKgJw:&?CCb\X@Bk`bS_voBFs^wi'Kq#L$F*c) u;i_VUwYw+3WGOj}qy3[VBy=ekC'cwA e SF"fi]=c:($@4o&>^J*N_[+KS}fQYIk'mW_w'}e1o+ .^K/b r.$Pwh@Lw{{L(}}8>99OS3#Wm_&wc"j9 %{W8,8SihX:-Ow 2qU;[*ME;y8M&U].{ce9WTN Ay98sW3+SSSgSIaW'3/;oHPVnf*>*.BwJY .:">Kk iWO4#{kkRLU6*Oqy]i6 >L W{ ]EIn.r q ck3ec 6qJ&}/3bbB8R6uG15_rw!5-5!wCRBb }2XP7Ks 3;COKSC#?vJ F .;w#jFrc%9yMsrN?ccK: 4,0,w2 n> 4T?EYI*&]0"-s;6<&:q[,Du`jciyEkIi5ww*$c[$*sdk4{.864,&$,g P"*Zc)Ym]EU=[k*X{*  Go;CoA_s]GScF&*ZbjJ `u v*>jv?%eWg =KG=]G7aKM/]yCeI%-5c}k^b]K_eVr\@k>SS 5Y;! !Uam57P}N]h"sIq?F^r.BNGQUE}i aQ7.M_@M&d,hj w\>&H(ia.*mo "wy_+S&Z7Y?;kqeuQAIvwTo*>.J:J."`PDDPhPPDZyc][$]w".OyJ FGgCb>oH<PJf$RijWGy[!}#_75[GK}e&,c?I[Owkr:_9sK;M0Ssd&. rs_A_$y]-K CKa'XeB m0,qmJ0Dc]J )G8  r7oQ_Ok@=C5{;3CeaAEOvZw}}9U6&(cwD:Vv/oks9k7cR&2nG3Mg^}5a goWB8HwB%ueGbT(JW)-[\q Toy/S;7GWe? WJB;aek#7nogC&y&FY\Zj* 0 ,qU@YPR1#A a,o O{wso{Isc+yo>kWsO[:BvG}#U o?Soq=]80Ac, YUIDiRB"yq}kd:G"0gk0aw'&@40Be;s+Q_&^:^7?G+"0ms*{";g >.:^.N_5GOKc Afs8hvKKO:iVVJB&>!s-AQ7 kL4HHO   Wo{c)gRJ:%ya]y6 O+Fqe< 4FDD,] wwgisF#_I/kO//wO/G{KEoNFv7Y+3+=wy+Kogc)1!kO##owsg##{w\*"0Ng55!{^wRu2:6P nWW[sv};}ukUqF0Em!e [yV2".2y 06<fAY3 W?Kkq# k[ofL<0K.Jr[9uSBZv'I MwmR *BF kHD8Ws{*eR0oh o8Da`Z1ycw4] _+C ssR&S NR$#Ua #?i_G=cv:>4[\Ffa@c}:F6.N{ey5kWOMso;wF$qiH6cg ywKr&T, %'y&6G-QMEImME {e-ob}#>@@]sw6'=Ay}O]; *= 1&]qyae/SoCZy":JS)Q3u4R& iX&}CqW'}yF(F].i{Z} S9i_'w5u1-Snrs=_<41;'C{ )nNyFsNw0>u.sa ?K[C//}>JUs[_j.X\wGYim3nB^35=Y1gRvQEUYumbVZNs*[cwZf?Ag&*kW5_v6oD,i_0(H&.}v>2^{EYKgr>4 k:Zy8(Pk\hsdHTw^m+.k?+K;g]u  kO#}IQ'D@HTd{ho @< ,$,(s&6#% Uqgi;KU 0 Ou9Iq+Ssc[7ZokHon#S_{wo_#rZ2y MM'*XLhVrB`kF'/rcww33+-QeewJk *LkDX U=g1Awa)o_A3cw'2\<4\BKKL@0d Vfcw/b}W *aM/QoN6SMAYgsSu':*6:uumeqV"JR}iJV8v7m7c=ua]Y1{o[CgEY"5n"V"}<kH@qqF .bVvS1EuM-;C+;WsO'?5Y13b<<DkBjR*J*2Nyk!-}aq]u5V&""2[U7"5O+=JV2&6Z}Zs @4<4`,.M?WCCEsU{o{1VBRN$yHqH66"LT( 4XX sc/3[)Q#7[K / {O#/KwKK)YKO'}}Fbn+77%]{R&"*:> D8TP":k08{R*:\ y]ao.rXiudJ%!A]E91c/[!]i}ieK #ck{A={Qmm=KjB0( 0 8$(T6@i@d_EqH{D 8b?sM/=qyu.am*o=?`} o$$4}eH0FcC#jj^n''7?/?o3f027#f"&+wWZ"BZ{17w)=N.&nOAAI}u%SOC//-;wK4&hBfJ2PT.C+SC_GKCCI9YMEYeiUOn2yB*"BJ"kw`V}yrrZZw8XJ{UeyEyqE)_OS;eE%E}=k4Lw8Pw4qmmq4w6v7!%9AUv"`4k&Bjb^JR3o{w;[]iO1M]a=]aQ5EQ=={C+#ec+;gkZPK(48@0 Y8>X>;cc+_}[k}9%%UaI9!iCgsg7Y9s+ZJ&{S4w 2Bv++?Ck59+s3w3}F?oC#6hGK08oJg/#E YM_/}L4Dkrw/v/^n_ /WU[+#s%aESJ.RSGfZbc[_#33C /Bk&6J]&<$M22]0Y,kB gG[UeWoeu _s{/eA7w[ -;N0NN `o8N_}r;Ve '?gW }]Eo?_+qBeu\B^rB&.nUM?s!97F .G)5WVNbV,\V=95Yi;=aM1S^&{cy  u(s*bjjf';K?3CWS3:Ffrbs $Xn7eaK7eC*qwO/77G#'  mQsy$> J`i&gg"\LH8w*&y[!Gk/y)i#saG(5w7/E[VJC;Ks7dq>mnSa}q%+ZBF :v37#r"w&^nbN6Demm0*^7{!C_7)k_ !yQgKvF000w*bb6< y&y[cC;b77S;}y7]Ec[KC7/+OEm%ki;_OK 5gyB::bjynV`(:o4(OkY*{)G1u<SW(] 'u/Jkd4nnk  D<0$448{V!m9 ;GwQ)G  2[3j2/EY=OjVB>2S]kK=Eeyy;K?-w Qi=o}..JoYmiA'f:oo@Ddw"{L}<RZy ^6&ZV/;K[o5Mg"a===E5g!7y jF><0oBei4Rdeu]X{w\wdJNv71o"IQ g7Sgw{%qsR>Z6802s{{sk='rvv{my)Um}MEe]y FP80 L ,i2>w"7!=ieeA)aE9cO7a}Y+Ns7'j` T\L@yyhrG)9iqmea3oOQRnAC;3'3?;K-[ #/?/::J W  g [eyEs.#''CGG.Te*ssWwV}W-q/R2r7WK'+EWkCj^GsS2X4{JdyI"Ia0wqL&S5G.*q,kFiyeYBYU>F*"47af`y* }FO,ikOW&SVrK-}acn?)c3Ggb@a .a4Z?cb&.2JjB62Z+wE] 3g{k[KQgZ2PV[W{O$yWg"2]Yuu$W1{eKFmF&0Y?[oo? f>Lo8kFiyF2 >bW%.$w{g$a}}AsO{wWM+RwTP6w(km\@y}m(o23wA$k .kG_WiW#{S}  #3GU=e[kYkj".J^J"d{.g{O_gk@\>j G??jk$ \V+si[[ess/ uw[/RFYua1bqmB6 X.%m/{{woo_ E5-Wyw,J2>u Bws{d( i8kJ?_ccu#yquSe-E)[>BJj.wL$0iF&]kJ}bgs5ENf?_GoUAo_C 5C _wS -cCbH VH`P$<Bk"!aY#oWC}"bO{-}I95}I_3G[[A K[w'igG>k,4.*"XdPHH$T{Nk_Qq3S51KGj}2* 6FjfBbnV.@ee 2Kg{s1u3c_IW%ya)5Q}]{V{(mYRqHFjn *b#K)=1) 9IYU-K}j)[{en{XH8 26D\Hiy8\^ em]MM04IW_{"qu5?+WC#GWgC}=o7b.{{ >}}vybb{P<\owrL@PT:w{`\jw%!!YYm Wgk;)O7g!Kbhd*BF& .q0T}k+n.K#}GGr.:J'/F7_{Cf 2rJ&\\DVO_ Cec[_c99)Coa&2BVY>>FwrrVd\s"j+{O# #WEqmMskK[{crA{QyQ'?ao 3iKV\X(( <sXTL$H# EUim5'V&dyLkD8,,FVCSokawI[VNJvvnfLaFV$o" &yQGK/3 Y9Q7K;q!_//;;_s!% 'ZF6K3">8,T$(Jem3% g#+o^h"y+cgO3/?GcSaY9 w{!]mY=9%5! 5)kOy&<TdZnv}+k-?K_^ }WCC>k\kf++N>2.JB.*" Bjb>:6&6BnjZsP 4d6y; -=QmaeAy ?K'Ase/w{ 2DD>Zk( Lvf@vjwkTs{fgoG!a+kGqMQ5AI}mm};{w G3as#>TH86vGK[1)/^*fy}vr;no8 doX0 (0\h{H(.wcga: !)MQa '7gK][}f.FN^yZ: ""2r'=iU!s0k ZN.RCKWW-[{GU;G!a-^8>:VDkFnO;#OO})//5y.QSe)=MEaWGSW g+y:6 F:B:bWWG6&bb*RbKwwOc/?Cs;'jFXLL`{.6vjJ Zb;{QIqe}]q_&um5W'o Y=U5 SF`eVwO[WosK8D_.,X"j2RJ>}O]cgGa%aeqq]- IqoC?OC/OwK? ^b}+{9I+S?UaA)1E{O)kJJyyN:&  & 6^B*636 :Z::7s-a}UgjbCW{w{)U+#'a%On^S-u={s Ko%ma=+ r@0PL$Yu}@B#:Z&J's]og[gC_#/C{}Aw3Zv&>&RLDkTD }#7C^{kV7ea W y`$oow,iN4s22y[skSI/ a!% )!m-%{O Vh0D^;II2oB/wGS{G#'3g^n^' V qaNiXh`sDK%MeIC:NFou.NP*."dP_QK[}A)csg_f@hkZ&*JN*"X$8T;)Y1{[K?+##;/#3W5mU o+/Gw A=+5_NFC'G/)q /+ esrjybZJ2Vfy?;W;/^w`<,0bGCcr^}jwT\P*r K--%-{gKR.*BvZZ"B}# b^NB^NFRD <*v[os?#V*.yWcoWO;KW1AME7j" J/)]=i1)wogWCV$8,`> kA%3:F'SS'y^Ww_/}P$qB*.  &*Y@F^7KS%AQmCsO ]{O/'GK/7G7C_YyA1sgSg=Q}a]%I%IM51k?Zd }q,0sw.N KI]k+n:"*6&.ZEYsCyh@@<`"Nr^ZVRj'c*FwE]Q?+y>d``kPk4h`>.:\JN>Ru`nOgw--ey3+cwswoo+''O'3 i%A .e(@4k :FB/ySAEUOk{SSKO 5Ym1[+i_'V\m"@I&=YUiw[[2Vs{^G%q'SOK}I-Q]m Swc5!s#** &.B2:>Nr}fB6*fK)uYMe  /=O20Y,<2e0{3';{%KAy$S{mm'VB w8m0 &V=W_CeN "ZfKc{oO;3vd&Kkk#N&8( ,Ss{7?5au5 EQ1ooS}s ?7'Ow{SCV&8NJd:vy^{yGa7CWw{kS3]me9Orj?[oS'3Gs!!.ZNGSkG3+/KCkwc%CC/oWo? &L }e}k .jJ.:}[;;+c=%!s_/f>Nvv6s@LhoL\kJ/YmqmA9!59iye-wSy>6/C6 j#3_OKWk{[Kf*2+.&=5?b22^F: H"VqY [#C[/ma15%!=QmmwwG[{kGyRJNZRyy}rjd0,$((TbnZBOg }BF"\`<\h?koS;#F:*jGC9c[[K7E/6&f;K# v}}bT{ BRGI5U)5K"N&R DhJCSc/##;99AaiG[oo[Mc;v6kNn.sh>^3{] uQ!))AYIiiyuYyum%{wkoww#y"P,Ls@$""u oS+;_1?CsM=IK#])sS*P}g<4O2qmNm@.>26ZG+C3+Y=M!3V.y` P@8Tk{6j^Vbnyf.fUaQ=599 w}'Gg*"9. ? 5'6sk 2R*@N2 wN}7{mmI5KSOgc{wowg_G':,iB:aeqi>>BVT}{WvfNFjkiK=Mu]=C#c)["{@$  TF/SGS/sc/^.>Fw,H"V[)u+c11E.&[;uM)5AQ )&"B}vf"6}{P4TJf7OC#y'9YU{+vbfnoF"-!Y}={{%9YMU-W'v?Kcg[wC[?w9EO7VZZ ks7[Ko3}>{L( Lh{kTH@db'{KV*+1!E /3m+cgsWkc{cwoJwko:VGcGyFN?ooCjbfVvbjwDorr^B*:. "Ny+ocS{;/7#)1Y-#r+go=ieu=;7#?3Sook/+^Bk,$ 0`{Bq v/;cWkSSWK{k >:: "BZnC?CSIUue)/^&BBiI-{b.Fv}n^B *nV2 ^nN#kwwk!-%CjJ&6&J^ryjfJZ3_m#;o_; 3_w{BF6Z:2kXDo{$\s\Bc%Ee}}mqaIo;y^J2:rJkkPTTDXoNV++?O{ A}mYQ)cSnh hsk< @ $ ,DXJ+5U1S+ 7So!IuyI n<0$,4sv7WcWS7G_O?3+#SMm%!%E5u}yyesrjbD}J >q(k&J*rJB67[_'mCcO7#ym;:DRa@XHDHkFNnvK%5599u ;C#yQqqAk3OG_gk_[c[KV2dP,@L2^r[qyA_ sOJ:VW5%9)!_/7GO[WO_?WGosgwA5eYag+3OSO/;#KE)?::F+[}nfRVFVVr}}b."BNnnyZ2H$iqBYih 3oWvZnGs ?KO?O7g]a.#-3J"Ww.De6""JBY8s{wk&jfyC-]!cw]#;;A[jHVN.>}  ,2G3G7k ;MO_1=ye]E97Vw,4 H\&>jJZ"TTXoBvbV.FFbS1?; m%g'^VyOoOR*2}v\$82}yVjfC)+[;7  M/NPDfB&*w WOG#;gvfc5MaGFs&go]bF8(\Z3k KCk#S#%C'??; Z*&Bb}jVJr+{ -A9==}#'E)YGW#Y3r0, V& .N}dbv3G#Oe+w&YY*sG9k'v \aR**BJ(`o.by}fBvv;sB{H Phkh48,P:_)]}uyyaym}u gI*OIwCNwy}aV.*]T6  YI9]yyMg''ww7RL@J+jjNJb?=/Ie]IwW;m]-WON**ZVfJF\@Ho.3O[S_osGv/{7r&6_gSr. 6*2:&2D}?g3+'3oImSs'mg[[S[_sw?'r{"**oD ,o2:7C7#Os%5AAeQe}ek?7GW{  g'#KWgC+'s!QuA{CgkW'r:" &Fy 'K_OvT :VC7CK+#g_skJ^Vy#[?K+#K%UUIGb>.*ZGs{;Z& >&&H $<\26Rf}da"6 N#OSK7'ciy}Q=IUa3s7 G*+iE) O^{B}^ , }\J}Jc'J*>Zos;OO .sH`s"*:"{B#;ywAiiuAMe OS#5{?C7W;KGggB0yV"gas  &JO5EWSsw_?Aoo{%A c;^o4(h.j3Y]{KOc-m#s{ko Qw;'ksgW/Z*dRc4.^yGw!9UY=9q  ' M?VN.Py{k *.e\&6y OwI7'Sk{www==9em}= g/vf."{TLTe&w&V,Bvn+_?;C 9qqi}}9 "ny}:`4TH{ooPH>n'c Eiu?C7O Q7k_C#+/-kS[Skgg[ks_%AY1/V`iV,P"n}V:"2bw]KkW \0V66Ru P"?Mq]-%i3'OeeU9w7M3Ck[Gy"{dhDd:&*GWW++RkH4 4wb+K[Z>R _ogS/{sOry?{O' [SjvBff'7Z2b^3SGCKw{cKO_sSCK5aIwWG'fTT,To:ZfvrbyZb^R.622Z )]mu] M5!)9%) [+fNZv/Kcw-1959M]}yM{+jJ.kw(0HDDm*HgoV@ojCoW+/[o5QqUEQ])'bZ^^N*:R?3CC /Kcw{gO#jh<(oFNv^}fyf>& &>} c-159159MM!ow;; ;7{[ R *JJRNB*>"N #cwg{wSss'!=AQ5W;7[);/ +#^\dw":"hH@XwR^^bv3Oscc ?_[Ok-Qq1kgG;^v;c /{{O^r^jfbJ& F}vBsk`D4@k&W['#?w1QYOC+#  YA   Sf:skvnfJ&BFFB2"&62:*&:^Oco]q{;F&.jv2BJvn+'+;O_o;ynN*":}?gSfvgmI1Wf6.*>FbV>{H @`{X4VnZyJVJb}f: *>NZbNV6F2NJv'/cGO;F&yGsss[So%-SGcs =am%;}&w{.VG_ =#c[CO+}I1KjBBNBdsXo8,d7ssU#kgG3C?[{scg[G/qQm}[k?)AAqQ-C(uR"2VJ6&Ba$DT{kk\F5S[+ SckO ;?+Iw+cG{[S+^>wXh2;5Y}ai]miQYI]=sn6Z?WwwGbbFNwD}a $DPh2vZNdyJu}0 r Ok=]q]1_[7 s:boA}/9Xl^ dM%~v~n~rm]mUU]eyi}uI2]q#V'^ @gkC,z?v7OKr;[3nbnvG;OORjjjGjn7sOS,[ @sHtQX1-.eh0wN>3e !HXkokH(  {D!Tsl\ALEEEP`l\AV>'3'+RA:Nqe!gLN'X&t*y$[S@G$8  Q*.JmU6iiI@ T6]#M]2 'q*lJey?NjZN?+#e' :Bmet|U2&6Mt|E:**RC77VquRu7 j_Wz_zjzC^G; 4bO0?^2QpdhQT`{X P<x:_WWffnrn')85 5~nH%<[ERp|la7FB/QUt]ppd,$/'o4@rr_H9ckg_ks&DDHcgP\oT*>d&H_n{+lhlhwdQ7'YM9!W:aJp7)-H-111HOf1)9")H}_[-O_S$/]wphlF$ $$ b5 kss e^:j+FBFjc[M<qcLW5Dj  (3kT'   188V|qVmL@*1yDm8<@@&Hy  4Z4?NtaR! aN!0)4r6z/w~:Retx(M\MUvXX// e?)!!hJ3RV)@4Oi:Qg~o3 \z;##9O|f@hCMcjyF%4`J0F%TAufSj_R{? Jd1vkU\sll spR!wFJd!!;,%! Y`4e"S.O@9a 0U`nccM(S HvPE\QMrTrcIIxbW6= +2LW^./HbfS+ A$P\n@w zCj:$:qyu!>PqM>e,uT;Bnk}`X;MyynM(EnQ0%3(;(%n;Fr7n\UJ`B7vU0?NkJ[x^E f/(([PWH? =^$$T e `}p_;|et zoLV~v8 PL\}pL+ r4{O w~e~waaa~pO6 9'' 9s/a!Z+'OhwDHADD=OZZ]K2 Kew6'$.]els~+'2  +*kz*dh{[PM, 8)&CqXKrD`?M_qx|X&5_c8F &M|QSO%eJuQG#!Sva/+sdUuk]vR2KGxx|u* bfFj'8Q&[~ebE&XM_Fm\zW%,^esP0x#}9Uq g $;Fpittt~wt_bfpF[i4F#fMt~T*f1.[pwmpw_tt?i ~4sl 7~TP11;FP^zlTI.  /D@U!,:2)IP- |)WvlKTCK!(U`g`9 ^)|yIv}^WELPk}hI)&BP}Ir,j__7d]-kyB}hk0yZZIVka> 7hW7IZAIavBSyE`gk>xK|)z81{{q!@( +5b"3guVOA`i^'Jvo1xj`AwUG%,/33=@=ft{%q>CFyasC uSA)GYcRK:6%,3K_m/q)~-07>H>ucLqEOxu{G !%p6gZu|d 6DUD= VPSdui$1SWW?   vJ 9CC6W! w:Ej  x$9aarho^aaQR1]V4f=,&D=U\Rsw0`jmEsz}N6e( 5M^^F [,zGlsDp:_\Az#-0)7:bf!(<<|Lgx]L*khC59<2?$$d #n?F2Wkux{Z<+BS]B? qjLLLc(+?85(+<j@TTN3?qggS guSZ92%2S]g{n{{W2/S !SZ,Pn Ywwtmm K}RApa}s6ry|$vD4P%Kvle'#>bRz9]`S?IVmm$li7O LsY(z\;(!$88OV\mSUhbh||vyvr|olN' 1'Q H'#>>DX^k|xkrxXX1- Z"{#aua:gnTTTJTQWZq[+({h0xqNDTArkU' b>74e$*]]PMJ= 7ZwwTrU>Ub0j,wz<3qz LcSI?B?B/(0oY?<2" 9\O? Tdn6Yy MAT~kdND17D{;e_eu[obhKn]S]p #*33*0Y jgM-MZ`d `pypsfpVV9}} & zq~n1x"B+w  ^4!;a9|.^t~D_ 5K?OB85,?EOXu<oH)&9Onx{~re 6SbeeYReRreoL3{E, R 3rru@@V r\'3@55aZCWJ w[85/;Na}wj2]D;>N}"+pg(Ad[jWTQAEHAE(p(%^Zpmdtm[Q>"/T) +85%  swE ) o\S*7!*7SfLu "D` UqR#l:rS$FobV.+7MxlJV\5B?N;5 |`D8>Gc %oMuoJ1i],5NNKK93,&H[^s}N+L{S' '7Ct}\:! !:Rhzz}tzwk@!'!Ik8r\qz}Fw7! j0yvaRgwtzt (@\k*L^j3B9H)5,` a<oJ) #&MJuouuMG& ##&sLXR#o9]syyfmvs6 Qsy]*-?EEN6' 6NW]3$*?N`]Z0Q 0CjaymvjsgvvK QQ5;Gk;r<*9QcZ]*dRORjy JAM5 D \ 2i`TRULLLOa|,J\)8GSMDD 2 )P?NfWZK?H9KME<wS&/G8P,MD5YzhS# ,;SSM/cuo~Z[R7CIg"%7C@LZr,X@Z`Q@7B+<(D8u^uu~5,^pOaRA), ARF##OFjdjI@)&ms&/I^llu[@, @CirlC)4FIli]7w9<3S7c{~uuuf@#qH<*{~;h,/4$7=BB=$&!,1<fw|J y]XU|yhhcsyvq]G.).G`[RBGM`yyww.Z1SRcnhqh?)## hbL9. .6lN>5Nt  wYF" (-g DZuZ>_6. +9;ZOoo .WruL&A\#<Z]W<L 1Yr9e$MEzQC:i(8Nal|a>IdiaK 0 >IFS8Kttwi|ffqdQl\;0(3(3C& Tda\w Cvss~nk353=@S`nn~sp{yhVS+  (0E eWE'Bhz0P=SeXpcsk{8k08*:U[ 8U-HM2=He0j=:XeRB*-RmjZ?5?2?57 iT944u$[p^~ 9,49hzf`[z`^phIIP`VSc>XFVSSVS}[[xF>N ,mS]A]e`]]wwbU6 )KCPMeSHC>Pe`SUUgzhmwo[SmoEMZtt~j]P6..CJ6;$$ CURlyxOd=afVBGDLhz^?~gM@1,'AF!3&!5.M_s@^n\G#v ~lgi:^   QJ&0+(h7#S0Iper[:80BDLowwh0 &-Djtrzmrtyyy^+(IjQ0 22DD<A 2SvbKA (D?SKK/7/277?FPZb~vy{{v]S7%A<PKI9( --29*b+(]ovt?8 :]Vo`ojwhcIG& )1;8LQm(Zc%O &+38&f4rcM%%Uaa_K9*/ ((ARp'6YJjt[ kZbp*EVwcmcV`JO8/"1O{loeoj!+-vty~t`G33.8`{s{{}V. ~`MCHH^^^\T77-a=Z}u 2YcwrWHb],"fI3$?GN]p.Fp.Fa|mSK)TJ2>! (Hl{hM>2-$Cc.FKtcvt} e!<sO>9TqnVC&gX>! (Od!+49+-&enb}4Q|p_JEQ_k|rkV;2iyurG vP4#PXh_td 4@Zf_ULD;G11!(% @^U-y|unVE0:ObpiXVTMAQQz`bJTMZ]..'  %Chvv{_hOQHSm >ppe^KNNN\jq|qU922ScWZ>UL@>'BLa NUx ^Z0).+)'@PSaSjBUng9  {C3**66m7G0 {}$K>[U[lpgreu[WYkTD;  7Mwty~dw^^EB@%, >cwl\\PNL.NNn^nh)?_o}o[2;q%:N@3%|ojs@K[I9$|a4/$+({611! CgsLC\L36/* 1LJQ?/1(68JsE^$AcwPUEG7,dP5*hR>tpib`ee!*31,,%(:CTo<>NWR[Yoth<\L" 2DQ^a\XOHHZl!5>_cy~ &53C/81(j@5  lR5!/<<3"/$-&/3/6+" -In 3+IV\ro@*3BBB9$uD;(*.7WWddYhsu$("/5``w`m^uhwyy "lB*  "$5F==$ 05RPavtW?&HcggYH;yY>%#!CbAK|  qXC266GVki`K<%#nnnvnaUcDN/ %/8FFSSWdWU:1+8Mj #/6DMct~zSH-/#)%#/66HSYYJ<5!!   +/>HDR>B/3+#57DLLVk~qV@1);H_ZoXo\c\VZF=#rl\f^tv}{{nu =I^VP95-K\ttnfVG$}_>8,4DN_i_]@* (Uz$,GGj8Jbb`H1!cI0$$.&, xxdt^`LV3)#@^{w{`^o $6Fqr\D.kM5Sht2HpvjJL&""6KUcWS?{9Oaa[KKCQ]oy{iceouqq *q]I?EKQeoq_MI;7'bPRNlzxvr7IZOI-+'+/%!+)1++! %;7B73wmggYaMB8* &6D_o{/:P\i{yqkckgskgUH6 vKsoou}4OUk|.>Yjr~'+@>B:)tnWQ22sbRTACAIP`dy.6IXwwXVXPZfh{}T;tpr|xkgYcRgWo[icq_=5.AJeu""-BHV[_cY[TPWRei&|aR7 p`]QW[bnrrURPLec} $7@M@</-+8FUfjohQ8#  xI+$@`wwb`WYhy %\ix}v{yY;! %! 6A]dmmdfSP676?QjzzxoookhbfY`F;* DHSKF00,;QcweXOD1$odVVLb_wda<:&53R_swsee]ep{:u~[>v{iritvxidbffzzdRJN_"+8EOr}aDlhZ_SOA9&" Hn"4]_jaSB" 4KMZF@-%.;FIRR]ROI5@2D@FVXikif[N5" #;Pod\WbeunS5}o[B& 1Oax *5EJ?8(  !&%#  v}ookkqs/>9=! $/7=EIZ`hfhe_XN>22()/066-6227;>ILIXZjmcaE;"  ).BCUQ\VVOZ]~~upuyumH7$$0LXlgdO>' 02JRnss`VE?..'   |%68=D:6#  "#=:GRNZPPKNUdm~m]ND1/~vlvyd[TT]dlxx*?RjdW/+  $3GNI= -06B?QIT[Xe[g[VJ='  $5@EGG1&   *4EFTMWJPCMFKFOHYWgkstpn]\RMOadntlnfitx|nZK% xxupsjjf[e^bbhu}(/2( (40BBNVY[[QJ4+  5?\^y# vbTGB.-  q^M7, )Qgjrm]VGGF;<@FDDF@DADACCGAG68*3.6><FDF;.{pkmnmeWOA@:2/&*44EPdrr}   :FZ\bbYTPMTSPMKF:/  .HZkv||wyv|onh_TK8-#'$-400! 3F^SVIA96559>BGLFD*" !  -6;3$'<PTecetk}xr\K=6*.19@@:+    vz]UQNT[am{ /GJXiljlUQBLNH?AUXtp}ymXO;N<OUQes~~wmkagQO:<)*$ *3@@DIJQVPD=47=038=NQSVNMPQXT]`aWVTSQUUZ[^UcTXW[a`epx{wrnjuuy\O;4$((}vl_XLEEAOLcciu|%,==CA<?:?963/(# zuslf__faifvy &&#&-0;>?BISakt~qq`gRLE8.qjhq}  '.-/++25MTcjn_Y@5##'/2.(,=OV^a`^carwsgYL:;--(%24LIOMHE74$! "ty} )+4+<29%''@Rmr}ffTIH85+' xlhdchnpsshhXUMLMWku &6GKPSQOIHLRVc\e]bd^iet}uj\XJNHFF<7/*  !.7ALR[_ZSK?963?DXcmyqqa\F>% zzh\[Pdd~ $*08@INZ]kr}xmd\XQKA4$xiF@,20CJht!.:N^mvz~yofSPA7( )+!*03/3,,')'//89LJTOOHB4.&1-+"  (2EOUY^Za_hmvuxqi[G8 +:HQS\[bgrwc[NMNWdr{vl]SDH61)!tj]]ai| '2DVkw}|lh]bcyt{me[MI<5'" !$& 5EcszlZB4 3DJXVho{y}tsegcg_]YRF8, .050.0.9;GQhpxz}vpg]NB1(,9LORLK>>8:=9:9=98?5?58*!  *135%#,3CKX[]XR>4%9O^o~|wssif_[MJ;<30,'  wgXQNSW_os  ./51,,'))+*%# '.1701)+(,./..+-/5=CLQUUG@5'*@Zk~{uhd`SSC=,}riacfrz&7BPZ`fdqupdD0  zslkdg^abce^bY[USQPNMIIKPVVY\bnv0Pe}ylcUF<,.(53?;92   &&-7DN]]]USGLIR[pw~mP8"2DTbosyt{xx{ucJ0'*/4?;B@CA8/ &:>KHKPPYQUBD.-! ,)66997900()# ngcsz +2;@;:/  $+)#|pnikrx   ,5FKQPRQTOMFG:?00+&%")*5;JOZ^e`_ND1" $"  +0=<EA>5.*$*)19CQ_djlpnmdXI3# t`SHBDAPS\\^[YYXaepy *<KT_c_^SOD@=<CJXgywg^SLHGLQ\]^RG1#|sqpv %.::F@FECLFMLOLJ>?,0  #) %(14;?<</% *%4*/   !!/,21++! (1?@H>>0*#+.,# *+36<CHRVhuxv{{|u`P3 vkTPAB?FLT[_eipt  ,-3/30263?DOWaehlabVSSPRJI?:1+!  "5GU`fgeecaa^XK;%    '3;;7.) ';K]gjhb\PC7-#  $-/9<?:600--,.''! ""./=?GJKIMLQRYY_XZVQQLOKNLPRU]^a[RF9)   +355+*!# #$*4>GJONLF=:0*    #+6=BAD@A??DGMSYaeed]UH<4.+*,%&  $(,+$$(1AHS[]gklsqvqvqrpkhgb`[NC1" $&46BCFF>;.*  #%')%$ %.9>CEBBA<:41*#    !(346/.$#)09?CE@9/& "(.8>B@>:;=:7*#"%%&!#%05@IJH>8)!       !      $,03823%  "#%%&&"#%0:GMQQKF@9746<DKSSVUPOGC>:80.#$"$-/569?;A95*!       !#$           #"#%%&$#  !'()'! )4<EFHDB=;;<>BCFGEB8/%        !"#    "$%$&!##(*44>>CCDDFJOT\ahklifZWLG>8/,%    $#     #"%          !"!"$%)*,,0.2--#  !'+-/0.++'&$#!""#$##!          "#(+.2365633..+'%""! ""%%'&'%%### !   !#'&&#"                       !! !!                   hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HandClap.wav000077500000000000000000003407741366722712400226040ustar00rootroot00000000000000RIFFWAVEfmt DPAD datawOq}8z4dQ`t Mh`s@`q l   FqI+`YUSA I 5Q}ETn M \#*/W5*tzOFUAS/f&!% 4,!825ZEQ$!  Nlk"f % 0x 5 8Q 8 =s 5 **U*'%'"%a%%-m"-=$CeFHVdlt aDAB* PT&4o74<BpP[3]hn |? 3&X6IFb,r@-ANtCfm1[`?  xS:)4v> g H0 3m )UF so D>[q.xC F7~/[NJ6+ %|j) l 9| C  0 )\XopWq6ep "ihgRn<-s S0CVtdVx>y0rp^z"_s?obk_o*b,U zE0+ Իiu[6mBO9Im;¦0@?/;&G6R-?$Mh_*8*2 +,ã ::JB %z*U&Vw8} FzR++Nݓlܠ և=r#v(-;3 b tT X/{bI b9CZOoQFermF `lKb5d\ a+G ^}Z[fv2PM;S*R :k7Mhre64o7Dk-N`t^nzLol 0p,  ]+  2 ^0M!=$qk/k} Vu @Nm`x [QixILQ-_K[8.BN) - +H\.\J}jh@1%tg)Y  ozv? a e Phgk &V|s 1 nz=Eh|\eA^fH t ( 0{K _Z  .iiD ( Q aZ?s[]  T"ni_ v   + 4 4M Y vS3or|#X Z= N2"/ { _  30ka5UH-WPY` g ;=[U .  ? y  ,v ^ ) (4GIM14E enO D Jm      /~ ~  o 9  K$ G = lH|{\)K6W" | O/ * g . j cU/1- >  RjOc]42l+ K i n ! 8(  m + g^ f\Z5'% }4 1EY5xe%UC'RO=J@@ h )2j zt f  @~ @  G 7]^5h0}Hf %Kf2y 6 `F%8]QL'y gn A [ \# { x#&9V0E  X I ?G  u X9ix8l('g[6  R eP k  Z FREeR`6/J6owr#   (= W\6 $QsB]HD,", DSo@!  k t y(  D2T*/vrl=)BoN~Jbl C_  .pX 1v  8 D  ?wN&%u@i$j8  ag 3{(6O C  $: dNBe^(.&Z  9% cL >UM[/*|CV7P}+zw4Cc*9 -tBR>(HK3War^ 8i8e%33>HjwhNw(B_RX`u/3)iM/ i n%tY5vyXt3y]w[++>2dr1$6h0$ +N  1X : c ` F$A.iG&`` _' <QA8|g  Gs]mu >8;d rK(\;.? gNlwFq8{S]d!z1y99g<xa%*J1@$>2K(<P"Vb%ortI/S.'}m"CkxJ:?p rC- cNN H`nR0E*E } hXl\ }Yi U|0ScDb{1ay!+[U[ C9$7Vy [cJOV@Lq8MVLMUFDZxx }D+_&0_R Jh 6 7F8Y^% !AzOWY" ~q  ^p<;H@H '@-q|bBH[e$|G GATTA, pzoh;lt3[bJ^z\D}jNjw7 nntih H[f X!gWRRNv_9\YI;V`aNF1^4 R]tP}MY d4 i*gxHOrb,)j]wuE0EoH }h@\;%?~h'e}*7Jv`{OYz~h $( ctn&i_4[[5;iHH=dF,chg M:nn c t{G|:`Ah"FYV$<XpP~)-csSr/d >m~mP*/[kE<A,\@?Q``.el(,2,4MU.%e&KM2ln@.@^ot?(TZ_p>SH?9cl/d#WRC)u7<&mC*!=>;qoEoww`:ZC);Iu(DN963?Zu0C \,mC\Ql]q%_mCPoz"pX.1} B,V}_T:b1% <. #t1.)(i<m~\~& y0T{vv tL 'Df+4*h2Mjzh`v//eN_F W+R(( 0H-Z3c85zDHR,SU^oslS3M8b )]6*tb1>brdyC1;JCP?9`:R^7!CB=  'dfPa+Q%j:$Fi2LR?vjsU1"rJR|JY=B/>tZGy 2Lf.DdS8Rf"@DrG+$ix(Wg)Y5 APM[,H@H@5o^lS@wJ`EX4nRz9B)p!\!=)A).K YKMdl2q]kP^'l&|ocVgt-_[5TayIc#G<Yn'si4#)sT7.Kcpz^5~Z)zW'LMVKK (%2}.)qgm7Uv!$!)St1rw6,[!_ycPZlz]y X)/lr*Fi%=tVFg=zH,e[X?D7oXG`V4>S1,H3fz 5^Sne1&? sE`x]`y7^r'nagS[Z d}Xwra%IV5E'9Kwl5SXI_BPs/4G!{$$uc[5CKd?tQ<,<R7*:w _'8f  Je*1UXA<?.l}X!#2Gt]\a^M1vU]  <'yXfX|ic,^qwVXa'P2?n(A[oJ)77?vvq&_`WSTlXyP?='>p}H$= Enn5evt`PPvqXHC!3]=`7T:qKjL  !t,+gy72H8vG[flkv{kuv,za;`PBUStcR& c:|"vU[MMn$JV?\cCsv2zwxyt{=2M [5k\!P~4fyfK;27Ti)]#tEB^P ?j|v k'S&7')??LlD$j?a,i)5!nk`Zi`f"KK3477B|\/EMqtlR ,4JP\qT/?yV:(@SVP BFHctnVS'4$</C;1/i,7-7lNhvd!i5@Ka^$|7[!iSi$[P =gtR:3E]Xc4u4fy''1o  '(34fy7Z$QD 't]_? :w1\|uV:tDH6Zv!a)L2EB!rop4f4Byd[[VtJBM/X/r$y~!P}{@qvC*lC|86  *a2|2mogU1|V2;,c-5AXMSwK'/BRtot{tc8UP5i#V|9f'M77//=XlNy;,  y:onlauPA/!Elc:,$w/Ma^M-4J4kav|5vyv[g<1^F'{jT4C@2$$47vKYbCJYS:l7lFeO3+a>^u"l\ @'== 0/ yiMS/)V4qXlnMHXanl@)NS q"@1P,#| w [S=@S^i.Izw7A{N*0T5|5,9)_Vyni}Mr!p5n ~(m\P=cvJr@y!Xn{VsSv^oaT[@B''ThqiL/SqfK$  #ZxoX- !B.4Rxoqg^qiiXEB'K'$;~VdnU/'%t2C9 c/ .HbpkXV9`Dhs'8[V8",7S{XRNo~fTM9O@W/,)5Pct'@e8^a'szq[Pe}2^ci~ibXUF qXSPSgS]KQM[Hh/ G 72]\|!2SkGa,*us +Yfw,\ES[cqzfloqqq;fXS{2'*$mggF"/EE@,yccv'8-Pq(29=:0l%= @f|Q5#Hf}Z@7Uksqo=`o~~<X~deiRnXjplhmogi5nEqKn7W8wF$se y!._K(|Vuw^[w[/nB)d48DRe~l`KFE.^'NoV:!5=:y+ny,=,!/=<,H,Y^gji[J)||2KXK! U  )AqZj@ftYM7~R-/8@Pe|'5NiztaYV PK*=0/7+mF:=8HRbl q *5@:$!,::5{hkv~`I:79HEVYrs~t{d[HC2  'C^ll^YNH{:v,wvznq$$2KgzzwgortwrdN,!'*$*'s*d,]W SLJLev $! )//7:$722=C5} t_ G.$'+Eh =Uhipo^VF 1, H[aivo^zRzG}KzClHdUVn@$  ~!{!y!{!'*'*$$$:NSSV^gd^H2x ,&'/3* u] O>B?JSn"/+7)2*'($$$! m`XXimw*8==@CC8,'$,* *22/''$$  '=C2'*=EHE==KVVadigaVC8'znddb^\S\o *=HKNSYY\^^S@5w|!'$2,/5CN\\doz}iSC/! !@NPYYVE5*! 2CNHEEKC8$*:KKS^lgV@5' $,22228' /:CN\\VC2/*'$*2,**28*!'*::@HECES\\N8$':Q^\Q=:8 2'-58C;>1'8Q\o~lS@*!:Qg%l(idQ=8*!/@NV gz%'$lVC8'  ',+$2 CQNYdldS:!  */ : @==8@@=EC=5,! ,,'*/5:@@CH(Q%Y(V!Y!K!@#5'/' *:HHENYa^\\^glogVNH:2*   "$(,#,#25 =C CE@:8=52,,,558:=EKKNNECC@"8)*&  ,:CHN\^dg^N=2 (30/-#!'28 CQV$\6^9Y<Q;@,5$' '5=@==@KV\\\^ddgYE82!   $ = Sdr$!}jSH5! &"/H'^ u%% zjYH*   *0';-B/C@EE>K;N-Vadjd^SNNKKC82--$!- 1.4<FA3-!-5=@8EKYgjolljdVE/     '=QYjuwzwlg\K@/-! " %7@CM-T8`EXQUSEQ?K4@C==:2-'--22//-28:8:85/5::@FFF=255 @FC@8:: : 5':%=+8+8//2-7'+*!-88FNQQKCHKF=2/--'* +47<?96'!/ HYjwz}r aYK=5/'    $CV_ agju}}r$l _"\$YQ%FC:/ /$!      !$'-"8%C%F"F%C!F!=!:==HN\ dgd\N@5-*$' !  !(!3$5*2-,/$-*'*--5@FKSSSKF=8(5"/$-$*02)5.8*:'-$!  %+1.*./(8-='H%QSY\aY\VNK=/*!'*'-'@$A!F!N'H/?:7F2V/Y-a(a aYK=2$ ')*8-:5L@H@HF?F(FQNNNK=5-$ % 1=7$4-<8380=:@ @@=@FNNH@2 / *-/--/:8%53/;*E$G'D*F$7*4'.-(2(-025205*5#5-2588=@@@CCC(=-:385*8-8!::>9-+   '*/8=HNV\\_VNF8! .AOOUS*K/O8P@EHHSGaEj:u@}:7(u%o'a,S&@-  $ *-25 5==F=::5-*!,4<7*B:6F8K>S<Y=a2g*V Q@2-*!  #&. (60'F8HCQQS\MaMdMgGaBS:Q5H'C:/!$$*+295A=I=M@R@T@T@L@FC>:'5/* ----/!!! $&*)5.86852@2K$DA>2/)" $' 5 /'%)&&247030*)!# !  !"!''')'(-.51:.@+C-Q(Q+S+V/S/N&N)F1C.:729$98 8:@HE?;9)! '8=CHNKQKK#:.=.:3:./:'7F: ;144,*%%#'#2 8==C@=&:&:):):4815+-,-+*,!&// 055352:4AC=F@@;:8:$3'"*255 /22/-'$!!  !)30,!&!.%(#&'&$$$!!#(1<C @ EKPGJ$A$3'%'$!$"!!+0 9 EMJJD9($ $-2:82$'*$)7;ADGH FA9<(" !'2"5(:+:1868124/=-@';;0-" #!(+10:77:1:8:913**$/5:=::85 /---$  #/2;@DDA'G/D5?83:0@3@0:'/$')$1'%$6-2 - $"    $$!$35@EGFEEG?B4.$% ( #/)'0*0-62-26/3-2-5*7*.-.*+$#!$    !'*0!3!<':'@$CC> 6.%%"(! $-28=@@5 2-%$,57@;;>ACGFGF5;/,)%$ !"***0'2$-!6'9*629*='2* .#  "%)255$:'52=5=;C;F=I=E;F/H/F$@$7-+ $*3/':/78:;=8:/;/0/0*'*$  $*058 ; < 0--%!(!%! &()"%,,7=:C883;>AC=!B$=-9/4-)-$*''!  #""%(/11,/,00.()$+/25,@)@(@%F(C(@*5/-)&&&# !"#"+(0338;CCN!K*H2K;B;B;:;78,- $ $*,5!3$8-5/353838-8*2$-$*"'!$!+19@E@EBHBD>D5/) $&/8$85/(*$!"*0*,,) ,&'$$!!''$$$'$ !  %(%+%+('%"%"$%((*.005990(+.36 5;@=@=7.#)' "   +),)1.77)&!!$+..//7;@C?E<:6+.  !$ /;8;55-($0+++###,''#! '-8= =@85/!"%$%0)0/3-(%$$*'*''" # #%"!$$ $$$'(+,/1/251 10-%!    "$  !$','')  %+0399? <<53-*$      # # & .'3+--/,%"     # #), .-*%#        &,1,52, :,,.,    "&&      &% (3-35294+)     "%%+10 .1&,,&&%          #(.1.74:/4/1*' (0.47742 &)!  ""$"      #   *'#'#$)$,',$$#!#&&   !"&% (++'-*,)   #       #    ) &#&#    # & . 4 ,1,2)$"      !# # )##"  #!%" !"!  $'' '!  # &$$    #&,5'*0-6$%''   "$$ " %%%"    !! ) ! &'  !$&#&&## &  ## ##!!     !',*-*%( "     !#!#     &  ),*) ))#        !!!*'0'-*'$           ! !$'(%%                                             !! !                                                  !                                                                                                     !!'%             %      '%"  !       " $              "!           %(%"""      !/+..&$  # !    $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatClosed-Hard.wav000066400000000000000000001041301366722712400236310ustar00rootroot00000000000000RIFFPWAVEfmt DXPAD dataXx8T]T|M;G sj So T!kz  ~w_(_L~WU D< hhwH K#$M #/T 8x!k 4uqHT$@snآs 9bu;xrQ8YCN_WOR= Bi &%*Q1^:LkHcuq#َO aXeGH?~BOhqݤިN> beإ9 &^9~))8](eQ/ 9&* gޘ,"h# P'.ߡ+B \<r=88) 8>oǩ8#UZ Gc|S]1x <.A YOa<( 2 >Aۡ!E $\}%fCv#g 4Xd = %/0v T[? f՘fp5#?ޓO^a83?|d1D47<'  &o\f  f b54e;#rQ j]5  6 s!$'PY- (B7ղQ  #r;L xѻq O'JU ܲmK + 4Ε`  Khc 8!\,pQ> 'xMWV |Z"` E}" G+Y$ʒA&!kw4Ck &g OfY4@R5"WzkY'7?QO2- E< d$Gt >'2u.|l #l8ޝ aBdHq *ن; .N\yqB){Qw3 /$ J G>H ,!Z+$>8n C  jO?-Lr Zܾ9tzVMGejI7 X%߯?'G-J&z*>.BND.`qg!A0$nn  z _ a۷1$ y g~Pmup/nJ :X- : PUQ|-G jڣ:G7XdI%#t* !2;2 a D L :] RhD;#2ۥ&T* ?|G  lH \i .<&!6+&]L_=^T#z ASZD5K]Cm/7 P t$a h+ ~5B , "$\B yt y& B 24)KD{ bUc$*/  4']-.eU0Dc[ D~ 2 dkI  A 6o a E583;%,[ *(x ];73!S |  g 7I@aE} kݚ5!=@)jU \'c.~߅O<62EMmR<?yMR)#d 2  >YU 6:!T'I*v :U;LF`coF  A g/ q LP qG ~ U i DKa%,v`qd &?%x w Im@OXQz | R& 9 X@d , &#F ) l"PQ  {./vq l~ p%V\ ;!n[YA ^e{W -hi"]["0<9^ B< k[Ry_"AIۊ<$  'v#{e$ud ?lw n~} b!hO  D] LxDr(d!R1(R GjKP-'/*8 WkE dR+ G"R\Pf]bm,O45K,,1Ebu)  ( !XKUy]Pp4\h0$j J F7 <i"6"A[E oxs Jy4 q  & 7>  )l;sngl X+jHd  tWZk 'V& Q\U<NpU"cV x}6: `" o#Tv& fJP VIyyKA 4o s6U ! N+QMM::[F 6 9*vJ 'F9[4 ZO%3q T  X 6 f$ \Pv4 fX:icOm?b:X (X KP  i2  @Q 2# ~ E ppz[9(XUZu40{f %Z HM xcg qL ;=,3+ \=< a4eI +FYD5x rog^g=S 8} EJ- 2 : fc[e1  x Cf5] 9  n[Q {Z,/a&08)Q I 1['?Lg v!&sN GD $ki J OaBz dN f iwTV20uCwdj0 -y & HJjT@n\1cDj(bS)(m4m+F IZ%X ]u e ~|s$ J @DM= v=U*+ ;  D Odb2 w<k}gvh -/( b8 P~^s.L z"/YVzN Om!41] }&  A\0; otYp)@~.< #MHj6*.)A+fWi' ~!h+U1 jA Jv 0Yw ~Y#p9 XC QynO_1Y De&ut &(,1~4?c~ '.HAB&sp ~.V +CB 4H5 \&pJk{w~~[(n ybXPxi<ceH^Fws 3ZEuH GQhTb<tItjf.$eP)YZ7"6 j>*" RF&.IJN2{q?X :&kAAWCP(id:.ai65W9DW4/iiB^2}Iujl2~lE.& i>(my`PNlnMv 1$t,eX6"r_[WGffW:w~U|:yFOK)\qM}3e]4 %Ww |7] &[I ]4~lTKk/$V M mG<$+>Cq{[Js:CehQwn0$_#X'Gyi\zC#F3AkWRoW|6j;BNX\T`TE^^Be}~= 2)*NYOi\+*Mse| yl#ew,OkwFB9YAc'nhy+dME>qRFD\>;Uc1PPwEdju8 AG3-&|idJ|CJZFKD<,A0J e<&WnQPd ~ k^aK53j%8s9#6/x{AJEDi7L#mot +( D,Rvyi< x E9J;3&"6J$w:u;Ds:~TC|J|m#^"4#FEiFhw\w}$qiJZQ|%hVuiBCv?C\5}lruPuN~v*i :K+H BC{VNtO?<&Tj>oZ%,)GLz46v937)WvDX~pK }2Wm~%JAanx>Pn;J.F_,'*Z=iL9/%>tzVN?BSLjqW=Y>+MgjD6'sN?4IGMT@pNiF,Vy.ab}C(W1=Ow@a?%scJrTo?gT(o;`(MxU8jG uzNSl7zR1@;;D LP;_^q/p<0(b01W4H),=P> 9I0 Il?ql+n8^E N25DF%_4FRoaN)#ERC9OT#+=;5f~b7h:k \AU^+ B) 9R[ 'oSjPx}F/Kwm@JcTzg?KhQ4@%7z=W:sPq beaL-B"{osRzL[u+S%nirlvvD l  v`)j9=z=H/ @n|@>CF79\e3j[,':"EHQ%ga /gi`$}KuKdpe[U?;AHfezMfzSu.r1Kb{l2)G63%J2$1ir4+9D[@W@KYnA8;m}Eti}3} 0&?c+U Y !H+T\ l`zEi1EGlXH}6aTDaWeW=p$"z%O L-} dI7R[//f}RLNSScOjpR=y$y,#:^Fbj|ph"ElNc_$;[jiqKW*V{2Uzw=[YL_ dm6zkY+yb0=\D^r ruJ* ''@J9tns>3)3)EXru:G=GEGgi+lzHL: ;j%[uMT8-)#Du3fE@lmAaa943TZz hq[3p{kj`R*TKb7klR0nEyy|*pH#oreLOtu>HbC$Da^*4^|oRK?wyzXYiAK/-K9z#EfHv1 9o Dz/&c{UJ#Zt$;jT&#S0fW^?@:wom@Q'3=hb 63/7NTPn q%N2$pVf;b+*QCEoE?_?/UJOZ%> )[R)N*1SHC\4h "?3,-w}pQy# SW0 1 gir,)H^[,Qn=0uD9 ,^ , aQ"27^D=G 3jYm64O384F47Z/7-4:r # [1bX?NZrtKQLyF r'  )p-H?7 Z8`J'",Q{|Gf4  a#b d,8>  16? +-& c{$"7'H' -*%pQzgDMLQ3S2 $ 2?9=DD0#E%2M+oL@)[%_NCT/? $3-##S ?*# T? O D'6#C4D)8@E7OJKK&~fL) # D3[ #>4- 20N_6"2/ ' &/"'+h#" &&   y$ 4U&  Ta3  :a"*1 UoEA/^S/&0HG2C"-T"', $'   26*x)9 % 4JL  ?`K'* $*$A7+F$:  ,+  %)ACA 96+ $6,Nt\'+/'G/HH,*" & &,%HXH ,$-AaJ=7&" #";)TQX/ FoK&AC"1NCEJW`bD"Rm=)cbWE,R7- $;& 0\A "/" ' $?6 C;-$1H6  %OA1'4ZW7   ')" +7*%## -13 -'& &)KnyZ  4DF'2??6='C6  +@8,   $'0  "0?0  *9  +/ -4  &    /"  2   "'%    0 021      " #74 $  -:-  #, 3C1 / '2% 3"#,-FJ; +GM@>)C$  &)$+,   "=6"-;:&     ,  ,72% +%+/)&'+*$$,  %  ,0',*KQS>& )3>6*,0 #  '*3/#) '2>20)&/ '&%'''/*$#  -%  #& $%"$"  %&=8=0$%  "* "$'3% #+  $) &86 )EQ7$  )  #&)    ,:2# $" #ANN- "&#4/-+1DF7   &/0% +63:# '%$#96*12 #-13 :8A14 61+   $*+ ,=A-'A>+*%2A/ -'#$$$6*1%/&/663&)+%4?A87MD/ $0  #   &,&   4,  $'$ &1', /'& 4,' #72 %   "  4KD& %%&''$   '4,  % /  1%3# )&'1%         )# ,1  #*   "     $%'$ ,-# '&'% 1;:8*  &#)20" *)& #               $     &     ""6%                                      )  $#                              "            # &&  ""                                                " # $"                                       "%#%%#$           "     #   #                                               $                         hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatClosed-Hardest.wav000066400000000000000000001042461366722712400243550ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datax:aD\R G KlTgq 51#J] ]0#hrZYz`& '41B!vsQt|K% $ AN: 2 ,"?8ӷ!p aڧ-$!Y)a vɖ"߿ht۱Ypq ?;a o 9 ŏs d -.  1]$Bw T,[T{)r Vt w&{Վ*G}**! *.' mOD~'oqd[ li+*349U'Vj]'Ld UW-0c 7Q ,^e ,+R{# $2o)Pt T&* & a-#5X7`OS'O\X" *cGNz6ռm"7>޶Ak/@w7/:oqovG7>E& s1: :` }/n7 |6&b G ua@3|  `p 2  $ o-'5$g j, ;'4m(3>{31-.(ffqE U}ؽ\ݹ'Jb o x){j"1z"M-%7+ $ . GrP/H (Kie~!hSe-L<  NܷU256 !0g !U  &C( q۫a<ŋ Ϣ"|(%VѯI *"~=f*= y >-t?!9>c XDK< M:T7 .  ~NPM"YCj }#W-   0 IQ#C v0DQ,_WQV `{XGP_#$qrYUH*V CZ-٪%8%!pG/ n`p& 5T\H^.:.Հ Ca m? f"eۿ/j  ~׉ 5,~ % #k 7tGۥ$e g Wly\ϟ? R)21ܘ4t q @a/Pߣ9fJjo  # -(/p@^3S\ }N 1צ%y$e.Wc-ߧ6U$\m%O>P:*%  ` aH p!"J$  (a>-,f! z/Pd;Fqܦ kf wf^(" %&a/frՒ3 pۑ ". z`{ 0`#Mh\ D x9/Ϗt3.-\pF6i$ Ӷ 5bC%, a(3*~) ICFg*g yoG sh8})O6r2 "U |Uaʒ7xC 1_ x/ܘ 6`=&.  xzG)18< .Lq" :>|08 U &K ]o2C)BpTb I*!| W  fD&&V  + !Oɿ !+Z ktޫ+%D1i ϫgiGfx%T\  'i +i lQXHt!sUJ <#O 9m L߳#EQP*@k : MoR`20<tQ J0ssUkݧ&7~)Hېd 8j;`q,Q G #(B+/$ $wr, {"LC s /}c`Ij&~^ -fz"1װ   pb lU6! <#!>5;+g%3  ,]51+>( =|^ &!!ٵ1  !I6ܕ3L԰   c1lt  XM$ &5"X '$d5(m!^a5 Z /AFv X|v'(MC]y"cN;:!<rB|z/Nm,SSI*U >"9ey qyvroN1"Gt I׉;>- (Q # " (52F a=@'d7D K Ty2`OPQG!e*Q w k \ bnUS U  r26KvK 9z0%NjEzw iFM} E b(eK<UCxJ#B ߄d x0 n  &[ %H: a&jf$b[  /fCS|9 $TB 0P hLGp {NMպ\ 1dH J9 ESa# Jn=.XfnA j\ fd=\}Bn R<\kh 8`_ Jr FK;x G4 Zs 2?t1lY= e$:C+ :zA*JR MW 2O "kr#@U ( mt8qY+z W#mvl   p^K'Ȇ ++BrLb&s 4=E! pf!N[5MU['  2` _>LXT59 G0 F{%#9 "D & 8 F   VE6V `i " gCrw`Ru ,x K[ ` oP?Z ^ N@*q[g 7 J6hH;m r- 5f@T v5nde z,+V.+&S:+pl[c ln8=0(ypCI-U 3 e p Hm\~Wmh: z g * 1&O a_\lV=t.J | FzO T# - RFZly$   rD 7I*1e2 V]YT )Z wbk@" P0{  da  `=  6w.m;~ 7, Rx$L_0%&*_] FA( K.XGg Y' } > EH lm1 S @9,J<Lh1 4FD7i o[/ 1p<[ Q(  a kB P# xe%.5\ Q;}*( o_ & m"YhsT11 =W. 8 | M |^  Iw  ! hP(izcq /iRn!kb8 `7[ S04 \ Q[? l: D 7cz O@pGSAO' 1G@[ #Z{vM.}!LN){o Ra u`Kc[ s} ~fA _L\z$!K4 pt!c?M }xdkQq (q&&XV/ CB:;hcmV%-"g #)H#0DQex!=w!EBr] O = B/; h 0-T@Sf$ #U 3Y 4/ xWplq.?)ZF@@>= Z}U _ *XO F? ?  :_9'-|lj $#gP2\+\dT``  ; P@g-y ]yx(E 'g`[ O X 9Z F`ho09G9 W-J^ v'>/ K< HGx}(Yz=G +. 2 DM'@#Z/`y[j,N8uugo($GeX?<(#EO8-Z  G;idXit6':p`.ZDOyM tai 7jP ?YkO)#<] 'Ov[ R gj92F h iF<" Ls6k^~mBW^)mjpMI@ QeN6M>B\  c (42YOzZ64Zu L^-o43A Q m E xa(6U0[_T?Z8!_H3NP(%3w"-_ 'y?g':">*Rh6 J x*?&Ffj 3ECyOLN97fp\g2o&.)Tl-kR>GxV y4CxU}gX,_X||(Ykn~ f|d_&tn%\OFSnU=P{I0B;RvO(E":HK)j**:3)z :32["Z7Z[UgL^HvAIO_Ltpb8ZvJ|Nq[` '(\v[CPSafoV=2Rew3#'j{v8>E-8AIz;y*M 8n $*mDRthy9jf,Z{OL%:7Ps]"iWRO%OH@ \ W:r.'L`k!s q<%T.Y^fmQ/5k3C2X3)1wPNTFD5T>@f2d $4YAS{z!"5uX8MpI"6;S}apN-0 \[nKb%fyQ^<#=~x8g-K08i6-Y] D L[K~8GQGMhaYzc+{U4wP4+>O7oZyy69{{P&RyXV'oea?co19zo8e.!DcKhu<azxKNTF36lt"=? 9:JW>5y 9<4$fVFRMbYQ_Tw;2mFx c6Z#my =O~/D+yj]&%LZ-A)#61RrzGn"##LOr& f0&o \s6yxc-Tu/]v6.9c/h``U S-*<ng qilB^- zqfJIa6L-D='_a4nNqL~0ZAR)qls|Y#^u.66d]Ba\WS2{D>GR%^A-;2-cxP;iIceq}6]}CT MD'tnM\1LPh?BKB|8QH;]jI9 Lt=; (UcjSIvf |~g 5Yt&*(@/7rf"xVw):ef)ZW|tfNp`EXG^aZ:X\QI% r,j&@~1{#2a)oc!8eR{FU]U)D3&)z *=ux[dINR4 Rs`LP%ij l.B_^C,}?0n4 +uwQD7b{P:a,>0"Z+j&2x:;*irIE9R'(lo"0*d!MvI^PG(#u0-rKr|>pWjq{q`>4o;/ 9[L^!ij>Puz;3FWAv9j"H!,a"X `t:[/IH;0'/G[fh +Z^2nzQ @D_=:. \T9UzD;-Ied'rG2alH1EM/w"86,NclzW1$jZMiM_!GwTi&/Npi^4Q=c :Ntnm61E P4coP { Xi_,l7jU/`p,fuo9=UH ZaM_IL42L'D^{5Ui}>Ca*j ,i;t1(lK +6_ -c/b3}77 ^bo&?/RsT/h!6d: Vs1[^ u!Z )e(wdzICSqbO]_zLM{1KmxfRDbgpwLZE(!9HsC}[,*-#iWT/r_|a,a- [j{ l+ h0G~(jqN0^Z&Ze{le7ZPUM&a}!9^7&ri \i&dQ_&- Md=zBlhwT +Wn!9(W{X_+;=BPMeh21r/nS_Z^#'Ps'r0alNxEzl(fz,_ $Wvs',eY@n1jx$RQrG+CI"Bvre#V,Qnf'+5WX{M-vP?jx(i@(r! Dv)ei? (  e!K*9-vlwq*?M\||BL2-9h"|wRGSfS ={/Icx_SnPd#? SZ)AW4'(|Q_ ^lS07jD@xz2#L;2)QWn}6;MeN[dhzi ?{Wdm@ij '0fUd!Vf,sPz D'-e~'j'j'!6m'a:^?Mt2lg9`9@1 /Q+~hu+@gd 25"'u5:M&hi-?,:{xhE#hIUd="HN&I[&s1?H N#=S'GW97 7N{) :#(xIto 2IIW0?N@->L@ V D67 CW\651mg'5{v(#=72QDh?R)!&#l|GUq#$a_4> =US^)\h?:19P=1: E_l,7#L;5G?L"_q6w`0!=1!2#;GW&!'4`9EG&2@KWiH74z2Pl?;Ra:K2/\^X" ,=WZ';[}GsqZ)c=>:#GS9a`+)05 $?QX)7 I""$lV 65"& 1ES MjdDNl`tX,CUhB&l`/M9 +9m:9eL+Gn9)6)0{Q&/5  2ISrDXV&   xh7IzW9"!2$   20LWNBX+ !D6 C? 02X6"#I=2 6+# 05'$ 1/! -151$) ( 4B  ;1 @' q) $050 'XaG'&# 0 '5>- :^[G("@, " ;, +"QB:2#@7H^(WzC+7mEN5#C!  '7#I9 4+/aZ&9_WD,$GdR/S}{D2=, &6$&$/ 9H7&0)(R\eB> 9^69eW) $9fmK'+0/( (9 +4;M- 1Q0 7Ra_9C6!4-+"2=HR- !##MHB/+-;/!CLK>;!'  ";H= "(Gjd; "222@GK769MSQ=,#,)'7E2#>EL># $;BE6 )E>(=4$);=IS4,)!$ 4PM:  +;:"::9)/?G$#),  "!C>) 9PE'+@\ahN#0@L>6=#$) )6(   /!  +'#BD1"! ! &(=E-2,5&&27  $ (:/,D?!"( "4=?):7+0/02-!7R\X:+  "-6) &   "(# &4779!20)E6'@@BC1 -6,'$EN, 0HH+1N; /5"#' ! (:4 1& +CN: )2&   =K2   " )-  !1-" "6C1 +@$BB= 27@(7MH'5=,  $GH&)   67(+2& , # -" &  ',,4)&       "0+ " '/$  " '561 #,-   $(1&/'"(6( )    /NH#(+   (&( ))#'#  $"   00/&  ")-4!$2-((,2+ 6>@0  '07/(,("$2)')-,1!,6& && ""&   ,6>2) ()&,5PH?,@MD6" $#"  ) ##   "#+! 2# &"      !,($&)#1!  (      + '  $), " ()             '(!#( !&                        /# 16/!        !)' )'! !$  " +1-/!"-1(& "     "' '         &- &+0-(&5?9- +2" "-6 ! "(+/0!!# &1("#&                                ("    " -9/$0/     !#            &(#     ! "#)! "'(#    ( # !!       $!      )$"   //$ "&1-+!&"'+&( !" !  $$     !("                                                        #!        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatClosed-Med.wav000066400000000000000000001042761366722712400234730ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datax& :JYH #PP (eQ' _ oc,`ZT/ -J~W RFFQ }sdScL u9V  > GI!H Z &D  / p+vF.&gHm#)tLLюu"c`yq* 4n c %M +9 I" *F>ַ-S (OGc? և;  ;uXBs   PebM + cZQ? | ׳ 42 &/1z6Xtu{TUptyA/+!D iFNZ!)b(#,HiOz%nTU݆ J-N?a'F42Ӫ wA/G"$$f 6S56XR5iiSt#z1 eW.7s1Ӫ& L@8).= -h uՋ)4^q=c;" C##ܔ"r% 0U%^a*Ѝ7 0F&$peh >)DK |*1lwK`^"A}rE@A|)s<E*6$M m$8 r 9 H  Hnp& khCP fJJ7L ݥ,U8#wF%y:$r" #ow$Nb Hj (|" 52 MOM8( ;5_X"Oo t&AP \' UPkF;f*Wd;!ާwރ= fU Z1 O/˶ ~(GD,7x(fV5 2$Lx z" v,Y usԤ^:!/%zj rD! Y' ek /1& NR p#@"u M5 1c. ^ _9 {3Kr  ,#F #MCpP# +fg&E ި9 T,6A``sw #}f;"cڊ5M-2p?Q$ 'F޺.^rldzcw, "%݃!VZ&" " Y[U"w_$ w<i uv&% &d*;E~3z ڪ 9 D-6?43 sXa#'CB&K/J  dB%YT#-)SI KS, A .),Y8oeoϧeb rL-b%  |z EqM e o "6(C2&TT $+، #_ "C  <7x H"(: c< ga #.{^%ݔ' \؋!c0O  . %v~Yh ?aXV %|j  <+ w R K lfl/ CT!sLQl' oYMURھ" !##8d\lߵvB^n( Sv? X:H*2 YwY'N!xs( 1;\v) 'Fq;L -\݆# l# 5L' #*H$ UT  Z{&| x 6 V1m 45 EmK Vv T *  z\  Q} bSnpk p+!#{ bLF1!~z* { (7>h: l y;`'Xd׵1Z:6]Fk$ ^gT CkBp C #P2k  N Z ots OcemnK _Y)vR]jp V = I0s)"x ! R Bha u:%] 3 AMܝm(-< ,r ,  zl Qd/bG`J\8; rBx{m]b2L T *J>Y`-;4 _,ce[ / % h :t+D ^P~W!2EJ46Dp9nh7lwA xEA> ,z 0S 8  j dh] -!&[% Y;E]Ge[R4B5HM  KdjJ ;T9 co 4 g hgX&!,@  F! p> U i$[ nr * m`{F 4 fR^Y ! >IE2p+l AD1 ?@v/y 7 5u) {Eg  M pPhdr&RnhG 'bXx\8X[ 4 6 k\z    ?r{VBe PU0>c   '{4b&YlNA>-vg Xmlr0A ?4_ B 98Lre&L*?,Tlt 3qgxe|3M- 4U $ Zof;su,% =m(+` ;MK o4 `>v|?SV k!sl] 8'-x y^Z3A6q]~% 0 t2'& RK = k[J  s  - \u xI5! [Is q3w"B r_^ 9M_`M6~u|GB!;=u8^%cF `X0@c =0TFd: 'Od*~C? [ {BM\U8GN\F-I-Gw 7Jg{*(s4  cZ7FbA 4qsAAT!sx*y 2 |(yt . ZuY+_c=MXQW AY:e%x7Y?%KCJ_6^9~Lk!W#uL8r8fm $A{Y3<(yFa|u fj5Gk%9=w>8n.Ly1RSHnj | |h }0&%DwM j ho 17b3:wg7Oh/#g$#'JKY)u9&1(-i+ ~v5J1vr_(JNh8j2nrhT #Xl|"22 NO3GJ. oh "qOmkcVA*|H4.z[CJO;bp$7 - Z7XuBd?+zpz:BI ^xx}QiJUt'GO_YgWBCebc IY3L)}yB7i@.C& e!!^#(PIdGuYY# 5HG)30%"Gap=]y4r`i[jv_: aREr$tii!*)`k\HD r00'wo)2oCNlH-{`Xb+u',6q*dp -[ahhvL_?Nf -;:<S#9@4@^6|%\7z[R.EgSc(;H Yx"0\5UTVv|SuV03UG J?EtP$e=*ByPpZHlpx1:_/*X#Joq5\::VlrkY?t`-rB[LEd*/ gIAnXY^>)lM{N4k\FD4r\{cbO*MYMCJX c\^f +LB|$u_ ~g># :~pw<H3[9VoVXT< W13uSV 7X+:rnVTk%&9GA34ScI}V@S^==? eGZ%fCYUwXu F`GWnSY{-8acf} [04&)w=$aq`|b7fp~ruQ<uS.DYg7Ym=%-O$YSD#Mr,YGIbG9Xn3c6] {x4R-"x @S f|%WmMf`>G*r_MS/69AJ(J{.~_Y~< a006iX1iUPGIXt?=nLZ3*o(SXhxx(T\5JN*OGq&\DS'MGIE|T* &G4SaP Verw!-<176q<RLS5RP$_Ry=rZ^b  \ 7Jq,g' BJFmqLJ0xO9S%-7PD00aqBwPh|-s[Z4]@lin93 F4oIS{|!QPY{$f|Ms<1Qv-J l1s8kbC ,a<]\*SfMJ !EiI0M]uVJc F<-<e={[C k  s!boOYR <T'|~ CS^A|oU@LPG[rr3Ffirn=*,~-p$ykJeon| 3!B1m#JLGo_AF7[-ky VwM~<6*?e!&$c=l@cOUOrRL_\\4$v4=sB@7^ce9-l Lh4l  *`eC >DJI  #CC'c:b#\7VlhcO6U9`f<~q4khqLCx[lU^:(:*V'*=6C1V|IuJlPG'S-S4X)E0CA~k$X.0OY4V7{r:cPko|#$`k pL:C?Y`Z c0IR>hxc4Z9$C[9@{&1mP7YZtD !J: >Hfffr1F 4]zEwsc330_340V?-_ c-.rMv:rP1~]J{MR3T$Yw4|hsqcJs1xoJwO1$RiM9R{r(P_LM_=~WOUlrx{- niVF<k1bvS*c/m {60u,oOw?$|bl~EP7Fo_:*u\\1ufVrh Mrto#TFD0c@[a@1SB^3<S7C\l$@O #WlqrCe04e %Iv<:_[Ms#&^7uxk4{U)I94/)&qo$-lMb qliz7\U!1zHhsh/-9~U3H='ph!J# /9$$hi3PL:Hy/ l[@D4X #+{lSx~[4=3x6$X?J14FJo/,LHHIHMM mJX,`|x$[MP-Zc,P\br$iPb<LBm60/wE,J#@Va *&qPz/Fi'foV3'-){{YRe0%o 4 UX5J'F. LS-w5GL X3j    GH Zq| kQ[[I #db`_W  U@}(ut*C(E\>ӕhq-NEBP2$   Us= +D  " 6:r`ڈ9 iO X` e_,JC{X/ge] YJJ t# d Y}e.Ss 7/-5 < ` z~yW{Tal-Pq =_t$a;+6bvfWq Ho?>ށ% QN_"yWk"b4 ,C :/z^[4iI4ڿ0r$q  pS~}4kF&BE@\Yo{[B k7Z~^: o3 . |po{  sC{a vZyW ). \b$y i W~e}t! 6 E O A < z5 kT?o#([:,y DQm} w z.n  H$/  " ޶ ?+P}JC!  ul6| v ISwdi N 9 ONGm !j0   eKg1n%?S V + s h U(R`, g_K3JG S S{J# H-fEY_uMD- 4K { YsZnLgaS(fHB] RWb97nb V  vzb<$ dW7iTD#K ]*xH9 vs 0Z rxTtS m(1M@ r?] $%g?p3sW'N + G # 0T F?t4 _bxmeihq :6 wqh2aTF WHWU~3uLv>4+-#@({ }fN * *r[dPi,%I@[ b[v \? fF x_Xi DC>7ro m}?eV>W)r fgBy & %8 hhBh,wM! f\ J28!N(n - {?X/1Kp1\ %A#rkd kx C6\H(G2>p$M^ Rz.5z u] Le  )cBVf(aX7l"SpK@+qfY1\ {)# 1$K8BVb J)\{~REWS$%mocA''dX{~r KJXG O qNffkt)l~-[#nPT W)F&$E#?o%D f/-Yxgf^7:- z;}R^J76; n-mO+:%1B'W3dq  EW8m 7tgi)fbeWNQUQ# n+5! gf;'o=3<MQ90I(j} .oW k!p#FDXglI*|vP UY7%-v"$DR2Jw~ U#{S;p\/3qmnCvqkyX=!.r.2Ng; NsHl<`n2%<{:^uXp~HP;Jc0j>%g%]{! ?v@,izx1bDop`?v)V ,52: FtGSV$8HO]Nrh0U!JAt0^Za2f0Y@}Mc|.-c 9*f9b,T$76T^\/u7BO JdwBSU'i*] LSi64nj37 EqW `= ;E0Df('4v*B{0gju& jR t+Cn#szommy2#awQ[eY\`q0LK2rbb!$&gen)*Su~ h`m 8<.Bn1Bb&jW9Q#% ^ TM lZf\T'Zp&&5^@k4#C7Q#4*&8@:Y0a72_^3 ET6vM1b2l J v&RUXU @ ]K^!C@W{3NExn`!jI;b}V0G+ju_%KY gO<$U;nfW 6HwbvP.fNTS< :1\O:[_ ~)sg?;")k8qg>\c5D 'Corb'gk# ,7e; 3* D}Z3'5 2WP0zcEPyw  Ex\y s fD^w`nK/~Dme]&4QNn#kqH;:r-Z5@a]v!!GST;B(BY* y6 lcrG[3Qz 1J;<s^A~"4ZN8@aj5+*)-w$/1Q E, otQTl^0<Nh1t03N%Z83ew#_82H]?W;9 46""Q75Fq3 T2U!ng ?aI`+>*`DjT^sH 5!HfEvNT@|N!gNDO(D/4f^F)'@m`r,Nlgp3mZ=ZhQN/A&YB !t~jg.dRfZ O&!w$m]2&`y869cj;+N?+F4aB `45Q#q8l`Sv2}so1oMW]S q;86T 1+\%U'}b| Zg/B9SAT:;"YaMF$& #p7yzcd tHA;g5^lt Qzx;g wx>D#sR 2 + D>#e)HaeFV6%j_.!|:TP* Fj6e!3~#P3eYd^j+"Iv##Wtre>S}\|1n(d?Y*gJ{4*>U R!6x(t>yhNg6geDX!6%0,f|3O~O#68cV<w:2>/7X*MdR?~m Ubif!#/3hR6 Q^ls^3q9hW^c< z/wyJ{/1&lTv4(M>:|T5AZrhiV/.*qVMt3'v7.Ofv0v~qc  uA 4>Vm6Ko/?ReB2'?   wVH]sa)z@JhC)5it6MC?(@.DZq9sa:\&;2<P\ *1!ho\ys& Z_G1+^O'P}Oh+(DWHKY4c#/WaP\aSzl+<OE{ 'J(Kr;"bpE3 R)o}eGd/% b7); //<$3Et& OW<}1*  ,. *]~TQ.gR)*CFt \]x1@N$TA #7\_!2`P5_~,+n,C@Z!BX1>mfR@7YO.^ArB( @@ EPBn|n304Wm(tFv9:NtI"G&$Q#'!0Qrg ls/gN0?qBB1ao"$sd Im<;_4 51(D#qr+4;QQDj%dp %%N#C#  $ U_FAQB@%1T^CpY+" \e$>f]"!/ _>'B%l' 'a1(/KM2Q&% )Cn9KN +9KB;HTIHT:JJi*3OT  .07RHCMU*2?nO! I4OW1 3g?!&"0Nj#FoX &CI! &+fp!Qh' !BE"g6 /# +<E#0>>JE.0 /B?I2Xq+48!&DyE!1) #*B;c@  34%<&JS< 3TK '8' ,E" &< 1_JO{o7 %  %A2$6>?:D* 5 8u`G 5)Jb<VRDF McQ0 4 )5,0EC!!OECY6 $8,8. )."#'# 3A$0;)%5%%0/   '" ,P.  3* !/BV (HS. (;#" )*& ":3  *  "(0*(6E JB1K< C0)&0 . $'<>P]A"*!.!!  &J3 "&) 0/) 5K/ "5(  '!(0 01+"  # ..)/!"  $PN +!(FC ) )( &8^_.") ;1 &)9#) 3C   ))('&)*(%(( )! !+@1#% $"4('  "1@ .+$*KP/):3'E3'(ZI   $! /$*NDAF8  01,       8B@,&349(IN> :MB $   2+  J? 373  $"  )0*" )F6 30'    !  )34) .) # .;3(+ ",) (*  )     !          8.$5"!  (?>#6JW2 2"!$1<7 ( !(  .7  "!  ' %$%'' ).12 $097/":81; $(,  '+.! 3  %,"'& (&$59$    &! #)' # '     %,/&?QK( $7,  )(   '   $%!!+ "   !  (   #." ..!      /"(& *    # $      */$&!#%),    $,$+ &!      & )      ,1+ 8?1 #,   +      "(   !0+#;; /<0 $*& !' 1. "     "" "/    #*  (1(    #( & :0+    2/+$ )*%      #!   && #!&    !%         &+&   !                 #                            '*+   .'            "    !#   !      ! !      $#                       $! '#                                     #                    !      &           !                                                       $                                                                                                                                   hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatClosed-Softest.wav000066400000000000000000000631141366722712400244100ustar00rootroot00000000000000RIFFDfWAVEfmt DXPAD dataLV       h!ms@_Y}i k*  tX74 0Q  {z / }{{%K*vo8KD Dz /P2N,} c ) 5. ,P7 `Q |#!NBq z>3uF"E FXzz9i A+  8[J  I^miRe AA  p4 EW _E~ /LR51 ?oxze JXI}t16 rE A u= q3; W5 N}l` @Kv' `y /i "xP!RC:A@x?RS.{ >~:'Y J) gf' C(P :o{5Q (mB N i@Zg 8v %#+ )bvqWb  /E;~P ?t 04 s.# Y vV ,F*$ xg_+ VE1sj ud, ZG[ Joro:?LUk/y@u$f_ 't{ Y>E+b  ` ]*gcP1k<P 1s #dZ WxtL], KE"vq q^/ JUo}4Is#O2` jIi Q<v@bXTQh$xKAn]`d9 +(C{ (MGyz V `qJA(Ob,7 v} )O+ _n :<k1A |o(<ot}+;&,6 CoX kW-lHK6eneQ Stz  2_ (,d&Ng|; 0|} O!3Uq`)9:!x I-iP(o(kr-*3G(7CL ]jfDD @\- [U qx4! 2xz&tC fP%`<vgo,An<-t]QxUAQJ]x J4-FMbj!_x% zbrpb dbt%ggo`]Y} P[Gl}f`82DeRluBYSqSL$j@Xip yL4u E[3ZZH?( /yR~8N ]},{F,(Sbet>YVZLXR1\-, )lRO-F)q1E? kE%1kE3M#[3Q9dHE~WCzfBlhrPSn> R" /BfsB_N"|sALjf\x YN@e))&cme8:>TE92g3b''b .Dhbc_nlSEf@'9IUb&LvHH|al&} vbJ+Xw^yj) P 1 >81p"~~#NFY l: wzbYX+&tZGSAx^=bWp6eVNLKLMYI H u(vb($: CX 6b4: cfiN'l :3-~;f9-4_7 Ngby'A Rji166F'!sa~j~4JW~jxnlc4d$FcKqYv"+E/"D 1-3b:ACrNM*uZO}~P&&yy$L9>lU ~|}:f6g2 CeZTKoF,HS}$'iuPCfTvoU P &-(U^UwAzMY =5n8cvk  ?iL f 4&mL} q) Z[mE/e&( >zc#e .[{ j>ظ-7Q7}S̔mN xa#Խ9C f(l!#%[u 3h_% 0 0+!y$S 9  Jb r )pܖ$C"z| ; d@!Qt0F6vPa.I.Xp !#.~!o.ta%3L%[ ^|8|fN # r@cs `Jv/5=T J#o  Zk] /9]ہ(L&uLy mܳ~8?-SFy m#\d 0(  "81-jk 6.8+tYG+?ԃD$gڔ1YsT  L'#!7\ҩ;xX7!O}?8 $YnA1Z!.K!k }x,nپcy GJ/,-w =;v&|w,!* =n]&j e13x b 0j\O o B"u˅ 9 Яs 9! M +!!{Ip.-|!7 j 1' P:@ Ex#G;d/h X# )aI  nQ#%7+%1w7dݲj?p)KQ#2)@StJ%E ٟ# [B@ۚ]lT %'$ EC,י$'^8#halݙ* ^bkF{|֣#!A#|*ӔE1Hb 1(U   x0lښ D?(_3Ӆո"G Q&/3u7_ؚx p(y"G vl> Z/qMqB/#&U@r1*M l rK&-5ۂA) qV `X]Y+[yk֭.M\rQTiZĂy`N5%B9M>X*2\":/:+V B4yB /9+(lg/ eV 6a8? \jS@ -AJn@ 5}M(7>p;c !t$1n[{fx'?)Pya igCb',(E0'~ - )n 9xώ  cs)lH_9Ԑ*' Z]6 P>W +}Keh/4y"O3 r, S` KcTk v|b] kU +5N :a3N m8{~e KI?"5{b9 z c <![.UK  5 ^q818 J \, * cZp Q2#Het "?s Rչo %IAv(!,[K=   (QjBC$TS` a+!~ٛw #b'N1j (w ,ރX$i _ 1b{ t++ -,%R 3/=Щ-UN>+ 4 `4s.+kԘZ)$ڊ,#1߀ #-v".6q#]x<$#@ L @>DXGHi "|\tLo"[ %A'sCQ ?, +G?ed!&} hrOLJ5LK5%ns # Hm_%~m  ;7  | ߧ w 5  _ض,(.:i:lER6+[y/yyBLOQ(`VB ) 2 u% z V  eh+_IBz1 h^#6o`x4 c8١Y  _ez5x7dG) c#T*-?$f UDށgAo}xO < 8"-1^ g p3(oB4 e!FtEP54c=}=Wsq?Xe#[֑3H S*0(Qhf"$3$@ "[Y130 eL E ՛Pj^ 3Lߟk"@9gR7 e75 E!fMf*}0 Ww UV7 (ݲ / 3}#2e{Rs-;B  i" \32.k> #N k {z40dT b6N{ B0wM' wdu5) 8 m-6S V%H / As bWcfzdE&*O` xZ8 h?,q@ #Yl N -dQ} &.s [  &#WPDH ! |+8 @"w*{fp+9n\_y'im91NCTlM w[!d6P!!! o ^ pX%'f> ` ҂)2 N@bhmW"6 vrO  :& [, l ' #2L  G 5"z[X#fZ. BHT# rj111"C 0 S8RLi tJ#:R%$ Q {7iQS V \&yf 5 \g%J8_ZW wj Rw$kUTpN/ܬL ?]gsN F$! ^ 'i\Ww\ tU] E@g. 2W?*l,j̧53r" Ee r( D!} ~[7 XG Bm3"zy3   It]}:2a`H z.%J<R 2  SN2 /d=N QX/MJO B +" !qw Mo T MV' f )Yf1 v'%r/(E6.o  3 }a\p, B|/C} V  4  mF[ `'  2O =XNkDe+h"a a\JtaX6Yx Ki^ h =jp5h kJJBB3llpT?qBz n Z 1}?0*x9 &? = 7;?  L1%ilg2WJ3R@=D0'4 M`HCa F~> JYdY4gw7Oy$+O 5'}Rw  .gCiOW  @ *l[B'.fzXu~UAV[|[,m3 S v Ue M  '}. ]49E }CuO8`-J n; I:(Pk:oOw T>vU(|)h3VA qXwh  O 4]G  R5^}S N8)9u6 {JU0y@7}\DgyFf : 3 * C  /a51 + t,b}y s[m I1V  qSVYO + 9o* '4]kMT / U~T lj,% 'l i yjnV %J c <J16 _5Ti> P7";| [  ^^(sT1 zki62 3 /2 1) g?fT&In `NkqSkf1 B2c  # rb jZ4 x+Y]<Z 8 {@@ S 3 ;Q : 7gFT BJN\QAu /o# O;J1 +SA`+P] <6,IK'1 d9Y %)oR( ub| 9ZGlk=l/vDj r } yrd |@ =L::   c/z95d \ATO0eG;D Nn U8.%vBA '#W 9 d ?v R%ULoZ  [9/ {Rx+ @0831H%5Wlrw1 O ;s }Q ic] OAX | + r.U"f`l.{Qjhji/ ! dS +iXbmDDa[ ' - !4 0 [ .zDK5JI*\}F`(Y _vzY  *n-7  q S FIF #]3 [*, 7i '} X ETa u_~gw \  ]1=#aw,{WP\b >z 8 G ,e :d> 0p;sXtf|2 ; hHSL ~B^ #FX-  X(8 / O3asL? M4 BMbuL5ZzxFaj!|q%]i]  bn q {.~"4.D   sIs^ '3(u  y [[r$ >* # a 'oh? gw Tg" [WK + 2qt9O " ]Y8$@ 5cD4I{'3$;{ 0v  w r"P7B4eX%, z^ a5X^'lN?tw^ . (T \Wr" I%w t  be\K xW*/ 38u TQ.rJ?Y 4V O٤}-}"i ,T  _;, M T Tkz '$ } St vO  W< # N{  % c+) pa-q?cmw&>Zt.~ Z ; .  +pVYXC! "T =qɺi !0l(Iq(0 hC m0,Es UI~l 9Re&9M 4!o. 7 gm N;v= ܫoٳ aZRF ' dA` X \&2_GaV  cxkjeV9o2\cqQ l]cV nj^F^( f- y`om 3r 8 j4p X %!0  N I] [+z =y$PW(muIdu)au"ظT)gMs5c k\ pCp  :9? ;] S=+4>,j vY  -z 5 4C\p;U /)/R\,_/zrQs !m  ~R  9 p" /_CnMG ` > DG 9]ضY}I..# {M$d 6feVR"i^U / Y` :+(! r*-HUS@^s,f,u+ mB?V#<'^ 6A "z ! vtd~"&!7<w{qG,x qoJ kH `Jc1 b~v31g!  R~~ .p% J)q^{ 4 W=zG6o{Qhl#(a:_ yI h& UUz^b H+ -B]  p  yfe nx @ i ;ZK rZ  >Cj?} *T" N hA~8u  yL + 7B .Qta /*QXcoE?Ky`9(uP| :Ld'\ g~] % 5 ;0Z e 8+K2| 0.RsSyl|x5 - ;*,Vv   46%s_L5de 4.we? })o7d R6@0Ak 7; } t  b{x'$ [LDQ=7"g~ o*UH bN4 \_f*%4MNq ;Tc d =+leJg bk O6 j79*.D7 /w  KiXK>& ~X`' S >G%zg0FO+X9:T<k:6;^]  |D { 8 ; +d2| P]S;\^Na6V6 9=K  k=:}GbK X"mQ pK6K1RL[ PtD7 E # >7.K \Ee. vb$  Q4C xo= { \QZ ~I3 % ' 7{ K+ ie"Bd,q!{f ~ y8j  . .-,Y '0  9 4 O jUA{fP  :,26M59-S  jel  l =+e{l1$@pq  AV_J51AAWq(9AZ #4vIjH1 LI}4qN_R q[ , ?w  .7b P 9 (VD5Tw5 f{L}@a6\-F9uwo+ J x :i(5cG2JQqL4cE5? i -!A }{  6 BZ ( ivP ,q$VjL;<I[| %  d;o "( +}Yv[>HlGxue @E % 11}P=? Sd^xq /8?^ T aV +o} H|{ ] X S9 ].]66# H/ MpxL&  Q %2` VVgZ'D  _ |'%&^ dHxHK |: a|,X};v6{M GfdF:*/ b3a e2 ` E o)5 sw }b(X ^v^ N9546QT7E] <QC l5  $N'8Me3 !9Yw s   _k [N77}{ J  5u  %Hz Mh[ J J W@ + (1 ݱn & Z_|x-cW{'1v`?,0l`Sf_   x{&hT`#@ j`8 fDV5c[,T Uu4E )Pw kq! C ZbNH Z @%PWEVs4ReQ  I04p b| %: dv:'?'<?. $ djF (!&j^|U  :}H1Pl*k +#6 6V - YB<NO K7HH4 +=e d~kM& \bdK`}a  Mk6z" - 3? r` C_i \;^#0,6 mIu HS.xr ^ * W mW@H_72 :  >em Ol| c>mJ\P 7 1 I T [% C [&"vB X 0gR HV}f -?N D'15o|;7(\ >  v`'7 5*xn(. 7 9}" [f Qu,S  5+I lH O5Rx C=p6dGasR%sXRM V:O' U 7uF>dZi1VKEi S(  YsZ VqNm6(#A?xjft| kyV r $J u Ax ^} dSLd0?}# {LxO n -% Usf$ 1UEuR#bIr \0\`Q !Xr+B  Es ? \K 5F^r9g k i ? qMq [z 2*u;K  MtX /S  3. 3!O c߈8%; @ZH4$6 'J s?+ R ;l |M*&:6A3 a? D/H^N "[i]1QJC c ? 24Z* (Xw c  {HWxOv?ceqk:w -^/WY^jn Ie: = b=6 !$'* `D#Uy$I0t.v$MXP pk5 i u /u M mY 5M# ;N8t H_} vti |- { /9pf $ mS l#] H%}1/<5%4= ZGFm' K  z _uX{D{7U F|D A0QRlgX T / x. 'rg 6 , Nzg % - L f :;K: YdJ?E[AjN| LO  e . g E\  S eB9# 6 8 gW x. )G YI|:8#b K:`A6vnE = l9 z? |o q  >DdPAEBo 4 h< b\4   q5\14. y]x G5%Ge IH'PpZ/ < %d C%:  OGC} %@X p p .syw-d13B.P.F&/P < 6m>!(ENC1ql9 cA o#  6? g4Ud9%#/xS?Xs+.  =PDkQWU  6/ "J S }aMG#tt^D;\ dCj+/zx Y2 =r@6 ww5CU:+@zU #+@ DL eZ ,ARDN 0%% pj[pRaiU_ 9l T F 9 5:v`R eo1/US:^1 gaa 2 & ;P/,-zT H.a) Gh Q xr ,s;k+AvL  sO}B;_ qK+:AlI/%Qt@p1; i{ Zj2 /Z "Kyn= oJ 8f_2* <ߩ|@e>Bx V, }0 / w+ ~jnm muk~)4{A} E5 % r"7U45` E_BMD" v@zQ$# I J-#kEW- {9& R b!_~> :J  8 705tm9d{O (8H}  6 h98iDw#7 Uqkb5o?} gZ.; 9I 1M  I<g W-0.Kp N 4hR)Y(Std)/W  < h} { d%= " O; d(dL| ^ ^-D^[Nz{)pZBzU  ! 3 2 oi5; hDr9^ @i&V S3>v?U s gu  p  *81$!$ T  4QN)}$]I6* w  ;4j(T0 i#e@   6$"r@,s0 lA] S')$rEe/,BL$Q v0tYL P5.C.q< %0# .' U q!n#>B(n#g{ "~b_ -}h:L$ (g1C   9: R2 & ,F/ X~ y] u xFYD|$`B~4XEp 0Fl8 }Kux?k: 6 2 =.zxp7d X)H ? I1l) *Di{(SVv,2ldy w#LxLJq4 } K\~@`^ }03 9N5 ) q  'T hs[-2Y}p E ~ e J SO]OzI, &5n &#8>^ r+ y>l [l!e UD?D iV  BG =9u] Ijt 1R:EO  _ FRn$': P{!f jTVuQ (Zy + + | 6 ! .fYcUY |z/@ r @ YMUA4{dwF Ay <_ n rG 71rf0UR < .A50v _YyV7x :$S= M {'hQ. \ Z_2 2u  J zWF PY`E'n +NRan'3Q  _zG567  >j })I H2Tj_\7^ ;Xc > v  eI,R R0+yeu9Uz %  g9i2ni0-( ? VB) W* 9%fD) ,v YzM y GEB.5J'gG9)SU9Zs  |z Uy[xU{ap{Au l tW Af1a $  z  +WMB h  gm{_;MF JtL87 SFu t 4]r QB !VBE _$ bS f?dwH 7- U$ailoEj\;z2O MvQL q7tZqC<{M_  Q) E4 .N  'q*(f6! Y" 8z[Kfedi zL?nIy(bvG'1lv`L 0H=jsv~nDm5pVr?`\= 6$I qQaxe 2> 4 km AA)N.? . 5UaCE& e$L Z%8,v I hT @_v& ykFx:(Bo]oc w :O gMpisL 7 -d>+rPF@S2Z!Az$Z8q0& ek : Yk7nRW 2u)21-4!8_ aJ,6==L*OK] T "rx MBZ;j.4 zNnYi r`7U #i&H'lJIF=cJUm<b QC`LW l\^c[F^q'%Aw ('D$/a3zbSf|M}?+c }  ?u9za!s p ];! { `j*$>m ;J;F(Rl S sBp 6g7Lr\d 0'SG|\!U"?= 1.7 t sovF[CN u  )y E y _} IL9-y#{UM|&?< c&2`KA C.5hX!2v&re 2U , Sm P y 9! }=_? Y MF[9 (rWO Qm*} ^ ! !q [c9dT FF yVu i}m  na;.(0hqBEWo i EP'gUCCd+kiz8 }a5F96zmO AR \@  ` MBwo/y /Ew f Ye JE%#Q Il qTJT6xp'/1ps/ F  T n5(hFUIeH  r`OH! <|#l W| "*8] K\DZQqp8Rs s tk) 1Q.*eAo\g3?(-~>\@}`Dbd%9# P (  M. "D neh$4:D*0GS:j(2 BNJ#P LIg&x@ K,-r9jhc J < g h=To)sr[ErW ! "hW N)4  ^H{ {jJ W:a^~ . M}8)6/""x({_y~&zz]Qf:[ Jf2'#quFBFQA<P&< uk 5A T RY<%mR !VGF"x Y"5 !@5 EPj9 !e8 J444z/@ p.aW/C) ~$0F3:y{m C\;;^X $3<[[ChR;??a0G Lg~ Pg8xAqiEa`3g U~_I^yb _J<2{J,D T U}4H^0^'7F\ J Fj#Sq\{ of1Wcl 9 p4SUY  9 wG)9?iolL yvmw  bns D $nZ {v ,f =V">p!:4)u^L%)\lsa4! v?A8`M'U:":HII$kN0*q\Qv`E|?cC/\hT\=5u4kPG 7QxhJ) Eu KKyd}D Rk?\3~}A?<8wN Q7 eH/6}RbA8;U_t<  2("Dh >Ef$.:L  g v 6NO"`Ex_*]hvxY 0tM!w%T+.@WlcH 8/sJ9!f,SPmkg;O r2k~JQAfq("e] Y .XP%i*{x ?_  4+QQ|N o1Iv{HTxU*i)K.}_w  )Q> Up*BRz}~}4i6SIfJ8 :]R=Y]h >jZwe D&@x`Dzs  W(3_(z .b^.SW!+ V3e ukF}D~|?]D?p1vSvWj::SB1  p~b:c* 9yv@ t7D xJ-FCd H8yK 6{!t4UH>kiK!p tw!b6 P8]H: eqy]M~1  hw1j[m7;y s?Po/.rl/| + d\ !,}"s 5,Z{B{?/WZd~:LGa4';Rv;_,CKaTVd sW['n !)? He |u &%dpEEReU-6$+!z3oIMeiq. 1u%_C!9 @xnTc2-.k !> ha 8t ,'](/ m B.n>OQCOtQB#{ MU? In \[X~~hoM0?Lim%wBTY\}(cG`+uD:q\Bl) N:=DR3+Jvj]x oa/5Cg "s]!5 *5 hB:| b)Z! asM%X*3|p]505Xbx "RfQxh7B {U q'ycM7ADt5vh/F%dNc*8a->RgHO KOU~N lruW8DCa"4.WmPt+0ndUKt76paf`;q.PlX{0$mgR: opIKeH*IaC=,vc?gR G5\3E@Q=BW6sN) q1_N VWzz(`PR%bqAQ8CSm}hG^(pW+85N?+ 2;L!l; 4WFlJ@ch lQ 2X:g~T[+;b(72og0)U<*I` 4(#(+ba`sf*Ch*-%r@x1R%J4nsm& 3$.VVd:K/|U ]4~. .KyFK_6OV"jKa@a.CPQx'aW :& J/&Zue(mc g/$H T?nFH?qhw)7,) >Bx ^duVs 'Mi[T-4D:c-< wysNN$ 1"m|p6 ME}i~42tKTy[{ m!d4*W[L*uU@dS WA~c6n('#'P;@{=b2FPg`AP76"W@*UA@ V>$5H8},Ds[1YhK((BIl_LYg{o 'E,5 r,:AG?Hk23H|n8s R/e L)B! YL ] gzl{DX*ba }Yk\9Kc}4lj\|\YFd(,UkM XJGz\ Jtu ^= 1oNsI9["hcr9PviB8PWm6aYMrY8HF+ ds(S;ZQhM5K, 9{hso4A! q_9/j HNA)Dqg&vY>zgb2#+LR^g~v8A+8l{0ekqa XddaDw-\N-UHI!%}F HtJ><'kDB<)P.+HP 0z=J[O0Af>}4^-$8a]7($q Kh7IZ^3fNn8>K(K}S\Q q O-A~]?}/ t`Av{uau8&'G/u'6 Vn& *7L9|UL tag}^G v6"?t3 }e 7ON1`px$mi^GC .kP[Gh<GzS;1* CnvDI z\;UU>(POeEN~2I{9 R-gMi?z2 D.j-* \("*(bNHBT JN~43W ,REl<`\=>S<gF*'_q5J>^oPBnPL O ,3U#1%`%06>Xm&.'VP@P Q`cN\LuOrBY]=G@G>SxRJ|)1/ .#2$b55#Q@@q^qW)w&7EPY>(uKr`ZtMii aCG(u RCBHj??&&,G+Bh$O BMc0*lP$a7rUO\&nb\Ek+b<8Hx+pBgM|Z&U RJ_L;Gil$ ccnKHJMV7pt1 H ;L ^vWa}Fc y-,e(lwG=}M>=5W<m6C;]Hy;FL5t b=CN0Xp"bo4 %&b miD$(4*tC8cb)bkXa>o&En"'oA>'sT6]9Wka,RgjD? QMMM74fAHf /4C|oZs9^2C=u+cX|i^|HC `r]@*.R"BGVRR5Q<v I%n z{KK/,ll7.NHg `0V!;(k$HkBM`Pk );I}4Y5mFjC+;jXR~K$t(QnZL^N TJ0pP*\/+}`{le<t0ZAnj;i_47{j=C) v\{ ^;hst5=ZW4&xy"n~UrCH'H,ql>8A4O$)`=S5.N%\,Qsn/Z2$D_Do3J2:T scl9HkcMFc} b{#{b *PH-%= ,2W >X:A_J|;58x`m;4LI`qh $n191q(_e$+>0t9L6[C: m xb3\ 1:L\#LnA 5<Jo&D{51+J,_3F p3,x\3-?Inai%Y6W%fM %Tz]4BhHAugBBDO86TRS}d)_hfaU>;@M^'n9<"NX>=0{NN:x?\iCL!:h({Do!iMa(8E s"'OL<6z5891nS%vP^>WZ{y+0!o.qcTf,8j1<Zo|q{/u8*GyJo3o5Y_ 1<>"nLe d'|jX~}%?_wUk@`uX2}%m)qF"-{z^5 qxUSM1x?8d4uG0 Xs@td%}Jtc)j,0P}Mt8xipBQqD,p[T}Kt$SOSp V9u#5> ?;$_yCYoDJzQ hw#0lnrv;"M-6;Ya8{T&= bU`#_qKp z|[D >,2!z[P/t=Q5 yaHB*j{V8jC,3kRms!@r3lG.'^5t%*QETiUo3@H6z7_Bl^C@PYwbY9[=J41gl?d^`FC.uih[> q>M'Wq#sa}0VSV8W`ka[h&=XtRA>mL"E;4HalGl2T^SA?rJB}L6uWn,6L++.=2`d vqvurw{t8.AId`7mpK"80/5_Kp\Hn3iGMg#8Q%?MKwjY[=QWX};@\lA"hRli^q\]*o!l4HCD 0Gdu.(:eD8%,~SB%.NjgJ| FEJW8]7us{@Cczwc2/q%#:jnc q ] N/HHTfBoE [$_H?*R">n\8rq4^1j^F\vbMU% u=s+>!y1o9o+<U7R^^T_"(.j{h({}x=R utJ-e`d;x. {u "O~\aZC'faGZn4)9)D%|=j1m1C4Tdac DSluc;y@nvW!,i1!{T#Re\HJSRV%YA ua9v3 @!k/ >kY  i;1oC<36STEpHu{rEJGG\ r>(sy(4K,@)Z~!4d{+_!0"| /i YAK<F(mXUD:#B%)/nZ gqWYa} Rqty } gHJf %RX}SxX\PwOJ@C{ \yEBZ*:^v*i[ %+|b'Dp3F %{D "[5CjC.Q+dR/VYmg3y,xP/_6zN* 1 LL'9ZbE aX>2A5f4a4&hw  ~umg_X}o<d]61mS8,j.jA$VW#;9E;R%n4+ qrSJhD"@3485zwkg oZ4)d27miza@#M{. U}]3=RZ65qZ<==Po] xR`!!n~n5meWF440,D69_F0%dq} F(\M[{}(3UWMi63~';S_s?k+65kk"{ IF8jiVn@ ;@5|1'{ )LyZ6)mkU8iy oqWbJ 87O[&4E AGbyti1A HRPU,/[ vYsOz55'i+|_UAnAq UnU[K{nd*1@\~7yx> A,N" RhGH, 2Qnibivd1:v vA$1DsNJ265q%n;= tnt2^S_ya(t.UAj,M>;8,xlq\Z;)"6; #"CAD.9f~ ;Lz q*\%) i9wnlSAptT3Sei1"{NuvMl?gh3NFZ{EvsCMU7E2a&\tV(!cCa/mb:z*n\qR3?*\f?5}$l WkA HdS~6=QwuhfHVgJyf<di4"Q*/_r _@u%&/;qEq) T3-37 M_xrTV$==>v3nD/s$1gH9|ts_W>CwNF)ba $mqQ6E6y)1]Q"_8H68xs=vjeQ,y ^yV5M~dj4OnNRv }-dFMNi5TL2v7nB aM {+UH%R]a62g.~w W'5Ag~tM I/ Jy{nT;RB{TuCT [1&.\,.Ld5,)}dH{3l<. qlH ~=THqv@ L0n:kMlB@H&Y=O4SJTos0A${YauMnj@d{$}7 ru9,]{/xwsM5+e5AVjcP]G` _l9bJU414[&4:#(^ $N<_WC;\x^C$1<'+APLqox BflK LhQrq'K8Nf(c% ]j=S&UH1g}$iqZ_e=1wP UBU @)wX0*\!/xEUw _lBB{'f. qZEiwWxMMF_<i~)uBMGvlWvSdEL7&[%\vL0FGWS^N~D)UH6LSQl"@Y nr =R~=d_G(4+ f$sJUzGlEC\UgUZ"9dH.Y6$zg( )\+)yJi7^OBBZ[_~P"Gv>MAO{Hs=5pq /Oi7%H 5cWM)1u7Y9+<WW6@&( 9u% W0E>2<P1(i) Va,#Z~tNF)@<}$$UtW2Hv]1i0HJ[5 Y RY{H$7i^K1WJ]R>RO%UC]_ d,o!}zj9C (SHN\185lu6GR;aLJ0=viR@5P'1_JBL[n66C4w[2HIHiZO%quZB a i~UU~[+)JY4%M8 9fSJkeYi _]8 }-w_c Fidv&0$l{:NZ =Y}{y% i8*JXx9z1iNPT''`eW,yGs>@X&J.2f.vKN&W8U2}<GdsY3fU__M.{88R@1|>id!FZHZ}NE=(;><ivTXk,'vR)%Mf3R U)t$3UZ)<g 1,E n4+C9g~\5l9l<XQ3\fa$.;4sr0Mrx\2~si+jE{Y1,PqEWQT^>v a2SUMRH5Kj4HtM:=lMh!Z<AJ0iLzsq WLcPMv$-[ jN2 qPd='qL.XnO%x~@X\}7sW>dCK}di;_469\UnQ|"7cZ9T AnEPv]"qf#,RR\h*OB_6?S7u./)\EM_]</2?psl,lnJ 0!}gRIN^]}R).Us+!M/>i/{G<k,= U" ,Yn\d$ R  SJZgC QE._lzB.5q8,0u@{_H&!h("4ZvU)s,aU V9Akx}HR191 n sf<;sS}*j~JZdG~4v'BWG"F4US.^AEc6,nUKji KCxH_ldG^r Bv6_'q&7iZanvxnM61jM_o !,oh6%vjY]Z gnS9=f._!LKJSvnS $s'E^vitl !p3<KeJ5) dPUZPC_qM.^_v jCM^\H+9ikd> apF,0$66R@xAH@1_*ZbolU\gi\W~JkNj,.\ hZX"}"p*3U,P5fAxo';/HPx{EEu$@UZ{EZqlsayRF4 * p6A<nx4 v'NN/d^%;iYea$q#$x%7B}9 +&u /^C<ui+@wq l*EoN%JyQ,E4xxl@d1W&{aW/ }z_i+7pAf4KJ {vul4)TX}/s"n6!&>$9MbR59 4M/4Wj.{p^WpZJ\,4]{ot1v<!$UU/WR $ZpWR;1K14dqx/Q/{}* \lm6 uMt{$lC$Y4c) ,1e%kW= 4cs8.'_zJtMHsAb]i_1A'kcbXQCv^g9k}l R<,g9vokd"F/]5<3^9{x>Bo 7}YHeLRs>/sEh;!9s<$Esj;dPd9*q> 6e<aMVE}gK3{Jn>Z"2kkP o7v*X G$go<"a a;'_uZ7.H 4"Eq9 Cn*!J_ts}\12C;M"vZUiJEkXC9Zs\]yH_A"!Z"2iMN _5.sUP)eS;$ Bs}>d9Z11JW{lJK/dJyaq19Pk1/ }yU, Z5o6/.jFz2gHd5cv ntuM%sixj1dN>Moe1Me*JWe~tR@s @/ Na}ynddMs~l>l{7 /q_zX_C\ 7$^Pa/KJ2]'MPZ/ab fUHl;v2<K }MC"]al;v;YW E%M;CbnH FX~y%CJX/Z@i149U]H_1G/C,{e; l*__jFqCH_ W{n@vxX1 ,Zg> 27Zvsx Kqb4c4,58e1a/ 4P PH%nC7 ERdJz4</Xd6_.<""iS7"_Ny>Mt/v'K }.Aj {b1i o~24FA */N<2RJ ;9gA.}q)M/tWZaM$N\F)xF6,2*FR"$"19 XPW 'Sy Mv,6 UWlqS*]  'Sv Jjl/qR<,v&OH2SPCW_hSFN> E }"EJK@M{ M_}n.1S}16gW<v.K 7{iY$iN 6nR{$6q\)R 1'>y9K.EiJbH7{>xM_S@ $h"jb29.tC0Jql%XtF$3C>N@6CavR_b$1 ;<1Cp7i4}%F],9JiUUdAXEqLFx*E fE@%4%  CaH)lZ W<FaK]% KoM4a Z2%P}d 6xM /@K%oo"clK,i{{eP >Nq%{MB\"<>iq _4RF"Z~v \eWXdW>lM W'1 " 1E{_C%kiW;HU%NsH >UdZSl'2~ZR@\x9>M$ aS\W*>6dK9\a Cv7{xaE MuoF$]FUU, 9 Cy;)jeoqKFk~s; T Kq $*" MC^JFnnU$EqfCNPP^$.>J }".S9^$"Z/AySM @'RZ}e$.Rv%_),1FJZdWvn'jjJ @$ /KUX)F,)7SNM]e+dij@}cE4.9XiS>EW$$2USzE~g]S7lkU AC ..<P*,ERlj2H,W)_N$a' jZAM46 \q\Hvn69K<s 6M*,lqy 6."$aC_/9e4M ,$j''C*64\ M,R/t_%K$/Ua"'99lfJiP> @'* </b*1A_])dt ov,)%gH,]<F*6g62E}vX\/ jtix~*.U\*,$FvH,;l"sq9Y$P]N;Hv <\.U'4nU .sFKiRHeR$ 4E_J7)*CZj%1e_W@7b> %7=_% F%*M4x N]bC ;4H2;%d*.1b]a4>F~%.U*9s *l{]uQEJ>]v. .g22EZU% NN }FCH/4%UvRi")t/'E'ER 9HUxJ);6'XK'XP)7gH%'")  aX_@7.qzvHR*HAUjMKHXXj{6~SCZCE@/C" X2n}*Z,dT96NNgd )_2 UX>zjK1)@ayoWdd4{q>j%HFMgA bMXs<%9RNqiK2PZ\%zQ '%X */ 62tM.>>znAKbxX*%KP)'  4 4@N4*9M@W]yjA4/) ;jX 4 R)p ;xZ7)21"F,">CEg2F/k .U@*$HZ42'/.9" 'ySS o'>sH .9);]@%]g%ARAJ\ J4$>qd1 CUi9 6xEb% E_e"4 Pd$",FCP */ 1J) N\$H) ,X< 1';KHR.n.S\$9.)4 j_*KM>2 2C2s9x U;HUF%h_MJ,gt.9.$.,e]$6Z.J\J*A@@C$z<.4;"RP)'>7%@//9,16jR<X)]U1 ).21P977Jd'C zp6PW*_ AX.'%"RMX6.$'A/ ;RxWjsW1><% oF $J]H6 1E 7<K"/ *'  ".6H191 12" "*$  1P$/\nU H1'1 %6 XC%l< AJ.6%61 1  6KW>WK  1 ,)9 ,47E)   )"6 ' *P_, 1A .in7 J< 72 'E/4EM/F7R ,@/Xb% %,64  AHA)@bq*7j. *'' *. F9Ei\);6/ .*4F;%HNS;>>9CtC *   aX 'Z> ;P .C4*Eeyb$ )PR.WK""  Fy).,Ui) >U\2$,<qa.9AJ2)9/)'7N   79 )Xe];% $ JWX@*   ;F;",9EJP) 62 4.  F*2<R2 >;1]n7' ".H~ixe@)/% $ *2)R6AF ,2.q/ 'R'4R7"F72/RC6*4-  2U],, 457*9# `nJ+9-T-2'"8a?&7&   %2:;*+! & % +! %$+   ) 10(9S9  Tl<&! 6796&) $B2! 1D"! =RC" %cK 3/%!:F=PM  '0 -% ?.&=+} ( )!  %/7a4 +14/$#,;,22P^; !$ GI- /*!     06+- 1  (887+ & + 5.1.>N))#&( )#-0,- <A 9-  ':'CG#64$+@ 'NQG7( ?>"(+45!   ,<)/1 003   3I+ 7/% #-E' "46 &6:  81#$# $>ZV 1# ' 6c0     :6$3$ *0,-T[5   !  2=KH<- 8--5/(& -=#   /:..$.3(#   !,%*4!<SM&!( 4JJB   6J\1!-((<   ('  )% #:'4 07*9 )&#0  (DG +@!&3  !   4+#66   &*A1)  " 26  "+.   #>     '))  %8  *   '!)   $  +## 0     2*  "-        !*. +    #   !  5>=  4# ,#   ,/ (    -%   "(/+% + &6*   )0   + #  $ .#  #(   '"      '  )   ' #&)$  (& )     .#  #%   '( !   "$'        (  "      "-               !      !# "!                                                 $                                                                                                            hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatOpen-Hardest.wav000066400000000000000000002643001366722712400240430ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD dataX$!ں r b^  { S JL~  7H ;Tc k   B;Tf/6B X5i!2` '&"#6(Y$'M D/<2 ' ;Hw @c) 9ՙ[K$!" 8%: 7B") d$(}  ,^B2 6 !#_8C;= "891)NA$H>&0&^(JIa(=t'' Mpth>|~ %.R&/ % ap)b 6pD%|K(΍z_ A O-isx 4 `Nl\*9 ~J* *u!b 0Z ?3=};5 Kh< !)v@*6 8{4 ٴt2 :[$xGp_ ՘ z(qH '&p; |5v#z!' `!4m \2C<Gf!z)Z?Ue) ,k gr%\ TA `  / : |!Z= 1U֖2s: [ ! :2 b &ѵ btӸ/ܙ  >U  m&Nf!M qf@"L؅ S{1rWh?Qt7/1 K #$ Q6JИ/0%(S\ Gr9I =.$ZI/'v@"rglc۫%5)Ѥ 82 |=x hd p?. ݜ7 Bsst ^ %Gf r`=:&0Z/ P{\ K '"c|gcz\>&o"Jn'q32`d!A ,#L.^A!Q (\! N% ,5\~q̋nG{\I 0v# )vFyg&,= Z }s h'(6 ;w J5k[a!αD nsn+ Ubz:"Ӵ#(oP&N (M!\ $(>   dY3X kax˒װ |t26Lktƿ!( =1 d z9l'&GH feF.`#[K'Mw#o wr_v!(WԜ 27Ra. g t %^ (׈ gB :U6 3@ I?E*v @B7ߓQnUbP܂-}אP۪S/!&{/F& Kqvn?q-2 l1;}zj}&-ܽ% ,$[^"vtݾ#X " WCU [$I!6f(jh8gL/8dW"#^ةN!v(N!3  4ϯnقD#*>;rC_* rڞ j.Tx ,[]& 3 1sL~ߌIE %)QUH\f6rXy "CJx(2Gd 9'Ұ.B*yG %&< X72% +սf| 9 y[i  i e" 'y+)* ]Ϻ]`ݕa^o pˠz )p(A_*++f\+ [sSW|)-P f*d In $Ka v`"(+-9d6g3pY zRGsB+6; 3|F%$I + +_)dt)y ڿvK 7 N4  `*#!ܙ-ΐM!0v3R x(/?q-(B.`ʨu)> .zdv EqZ Y& Wd"P(.G $;#/<)( XkS8< BT+U|e 2M1v #,*U!`$?C?$ UEg#/h֛~q x=a ?5&fw8N"w"" ?/K@q!) u.rR%'v-@ ߀FE&K# a- <)> S" iO8{&BN !6 n YE'z%9]] <͌W jG ::|2t Bp(n.: kRv ~, w IMk/%%Py$ v~ddI  IA*־o>A"ݙmI!H_&1$wX& X9g8!|;,zzfo ϩ]9=%(kOʿ y 2|bբE  6O % O Q2@ ft( 30G 5fb֓ KC  - fR&8m39Dja% r0 1,4rp+"+}. 9L"yon<w u n$ѭ`Z sɋҬ J' GW t , T i if~ "P`uH 96HpYvT  ?'W x&kn@\q\57j ! *Xo o "K:H]T0# I]/ bZKR aQKIft  \NYr 8d< < F3    08 ds.NP :n ;w 8eI A $$(Fu3Cw.IL{HL R .Rh%31mLL͈ *KS  j{{j~ . jAv 8 v%ܕH A|<"D;M_qFt;Iߎ2o$bB&*C(87[_ hbB:_$w Kp*/ #=Y ߍkN_EQWH}Q$ [6jKS-m 0-!-"LN( Tllz&"0 ciV75ޏ߫?R#`~JK =~\QVR[g? F #6' O 5? .7 $$ /)lK۴g+/^zp x: > [1p9rTb9j(mXہ x5)E Lp) $ZjW %P?`s0*%s% `@#wch H .){$׵g8 }8 T9ac: Dlli0 1= \%b tS Cxی!ty/lٸٛ ~ ?5[C3٘L. Ozgb_  c^  sjdqX)A V{  - X5TLmTocp۳"}s#oc (p v)@ Z|Sna35N&@@ rUz eކ -'o I `fk0<)XO4)9H  % !H\T T-d9oQ5f D ކMo 6 $> C S U"vq Ph r pB 5 *"s{4e$W`mnvpq< (?q߻ -V ? 3-') n o y6^E ;j,v6 $/i@v N9ywY  Dh/Q40\'j$h xN64 Fegv _+#m5 $Ad`}j 1g~) Nl\ M 0Jq \!t\iNQ?ume _" ;OguO,cc"x=hu 8) q) U g 2j"v PlL + l5\ C>X h_8u!Ye ;Z h!/ E~: - UD9S6}   Y 2X J& 9K?"=k ,9S@]I%|V 2m3&HmE` c"D@2lv 2xW Lb";M :6 `l{  & TxO4qn P& e1Jf;^tC N)@ ~  ox~^ wc ,ntt\\w`>  M y4%\ dh 1 {HD6VtZ*"#)\MXtI _9 '2) fm5YRA(SR}IfX7a {.A2 i\L +nKUi H oB "B  yF! }%p o RB^' Vw3 a`m 92QI++]!qWPVT 05%J&V(G>   +K B# + # bb YIDa _8 jO f[ h׹! Z k @ FY#]e}|2+  K~\ fP,dޠWO + ']!.=Y!C 6Pm-V7PC}2 $% K 3~*tnnS^cT  2 $*o]&H#DKk!9(} rj*[{ ` N\' a w(D4+e>o!/r*D= PLN e<% udj B0j`BE`y5 XjPh 7j#l= "O\6Bi+w r1/g L/\U1 .  Z-k  XIz# 4P -,Z Q*dHtn=Q9G4f l 2< E G+ 5{- # oq : G ms T3Ff a&  o o)N%A u(jqAj^+ UU%cu-`ޥ HP ,[Ac<,X+A;$ [N{. Uv Z%  N_K  l$r @dޚ2 _G: )H $9G :[u Q" ;,ejI[i5I *UM j  '1,.4 ^џb@%OZL,fC N - $ wK LvSqK( #}T E2i>}L w0(C {G [ Qo  Q ^.r pf r p `B yA6]֌ uR^Y[#8 D%QCk's BG}$6 v @ : T ;0 &de 3Gy!r(j ' <7^d @~ Fq< RWET 'J<8:&Mb/Ux xJ.L3k g pV0 لkWt!~VD_qmzo%.PeAdOJ[@^ K9/bod[&|!+S p  m S@ XIUB#S^WcJE] Z! , J=>sb(x B$I^ i Kj X~ D(v_oI 70q3v-qb< {Q* S<**&{b>)w6 @5Z _ %bH)6 d.EX'4&w.J o1% r  rZUi4e :-=k ] % Gd@H  \7U@ (tYH |h> PL d vj| N9E } z 6 75&Q 6JcO-p lsHxEF79/ ' Hv'`sfC U_ 4 X>T Q2 )t9m b֊mA D'u&6  /@TY2g PR:d*O{H4 T2,&4^o HVj  @x  wKx + _| P,^}\hI| > m]~+ b$nX ~ h}-m~:`+ Nf :ZL[0  (~Q g $ U `5k_ !F< &?{O:9K e,X&`b !H n~ / x < 2p /V`eKgE}O~.r^ |==Vi z ~^4]%f-O Nwfg 91a%zQ_| `iq 4h8 x" Vu*?) v Wf1B)29)"  -  k,^ IP o3=I@X7v'KS? ?s! _?. ]$ X PrxrHM+ x 3abYI}<)La2W }H 'A(?@ Ca ~ HJ *  d#T Mh sc- Yz_'L' + H.T oLF H R    1D~h FY89^ZAeI,&9 * bB V<2  Z  h6 uF &f9*FQv :4X " ? ]cc^bSvH}  C{~92!W 3B  Je Y s F %2< ?U9bX|S55j ir4at ]cWRE nRt M -"Dr)n] D߫Wx(qI$c$\ 5d}l U[8 W*I _\:3 chzW VP3E Cz  PJu  7v ~"t'6C s x  |1U]f! 6Mw$9%=NBm, o8f 1s-_C6 < #U Sds<> H&6; & 6,1 s [ZerZYU;} w# K W) $mTJq\ > q-@DV_+9E   k"o .i - * #\G~_\| S>T y"EDmO D'<ݙ}@  !  a% 3 1  5 . -JHXOUGU$9)w<4E HkEO ^+.% OPG 1 0k 1w\JZ @Y>xo|?Va  <Cbln3+ +&0 MIJ P\uA)Kt0rU^/ & " "n) Q%EC\9 ~ fRbl3]Wq gb  =M[WM'N  R)ec/ &by- q&22~&`=)mZC $ Q9)T@p T ${kZ&  q8@  A- ),F"X |  [e ? w U*:b(# sI &z}c"sQpi 7q y+~ F gv T ^ PIJ 6`t  QBuR5{j]<$!qyQ #  x{ 1). i\ hl J JE '| x'mm u *2 nl8' $ |{B)OG](Fb5G r-. "B3 @$_OSkN CN  o'  : )v sF[ X" g (\XO  y V &3ao} # O C [D| t@G 4H}B" 2O 2E\d]^mQ<oEDWSY_ E3 Fh|/ D 1BmN8%$ 0 sjC2  O%&J;`_7e /=M 3I@O [& 22|F! I1 t 8R[#v % /^ G5)C;(/0CfN2I|_Vmi5mH(F ^D yZm ~ :.)#KKXWm  Ub +n) ,4J ;:*!  q" ]u=7$ ~p X jz {+^O[Ki p6{\' oTd m+p{A[Mb\PZ+5 $O" @tv{* )U  2r 1 " .R"d_9_ =/N2WC! ' :-BA!2^'bN j V 53 _ h d;5z@V+Q 5Fe 5 TN xn?\5q-\ qIw 33- P /k$Y_<oo{;J9Pmv ,nJJ9t ' YH bcD>ki izw  V [J2m#To+k. N}kd I") xKO}uw7 Yb9u\m&YS ;1 av  J:81CK; g bH^u '` sxwoZ { V gQq'2  ?;JSh>iqXv @['"J% 'SR &fJ'j 1{MvB8RQ#[ oA;l]o ZOs$O Z>]N "  XC(8e^6+E{ U+Gn=Q ,  Hw6G ca1kF9-T R o=8c5b#T #p^@ i .M SB}/q r3zH  d 0B+dy F/+X h0IA NP tZ   S5 LW! |U -) p lt]|%C=" f J\ v>! ^ oQwwg  Ej{0 BB E11  Ic +T z.wyW  |[Ox m M {}1h cV@% 5.E ?6f X v' Q4U@ b. [h7e P<hB U2k Ft U+/fzm) fV@ Lv {{0$M U ^'bM / @q{4) u~nOU[d-I jgHV 6)Z30w7 w D5T mo $%2' ~ +13< )I]V@`wlB  r @g@c8sS[}qwu`@9%^?(m>^v`iMp#b j"b~Q< [ / D 78> #  xj %>  XM !nN]3o  S 632 U 0s4^ VI1{cw6 @K{X s&Tp[3 ^c 0j3. ] d\ cd`Um b92~eYb~S?Pek  F 0@(xVJLPmGx[6ZdA O ZA3d U.M 6s '8Y J sRdL7qB8"x- ?w(! B / { m\:O< biYgTgmwL- RZ3 gDd- 1C(:D7 t[L~mD^%"< lT$X%v BxC9+N(\  zPA uQsqNO "jk # lOf hWDw uVR*+ z+W^y LFS~l^W"]bmxi W=^t#   6 q[JH=k 1)F  pC,t_Gpq$4 BxW3lp3m=/)D  2x MO"Dq0Er<u pOfa 0k -D U< XBUI .%  H^}$S4fSIj.Q B' o< u8] & y]"Q )SMd$HK&I/"BP* ) tkd |b34 .0  i zf} uW (_ $'Z 8$~ ) y?kq i n_ 6 ih RgKX }\G " YoxK:yRi6 Wx#a, + ] K/ 2} 7sZ ,Y -+%S`of6hU Bl g &U`  Hi& cDh a Qzu  x^ vqd6emue +?vRX 1^ |0APd@I [)19r{6K WD",Q-S" p7 w~ \~!K 51H&xedN% N9B{&KG }\ ,oHaz'@\ 78OV 7m/"!T^ 8~ '@4f, 7 oZo;"l!D6bU7Ot/3.$OS \;BBT  | 6bt /PYcS2U NCS*3dJc HX> UF bt7 6i%.%eO 2 c "yv  Eo f"* g~K -d2oD )$iR+>(-R7K M Z42 fiMSy1[VUL_U9 oD9*` /y 30g ]sta)o)b/:  \ZdN,t< ;1Wq') `|Q-^vx,|oUttZ`>9wjYh` !uM+#BD@z=tBU1>g#d 4jhL z0Os/UJBM^|v +)8lXA8 -Rl%H'o v @ +WDTGtK?q '; 2Mss583l3 1QO,,*>;tQ&1}HYT\mPx? . b`K6F}+ufn L4[w*O ) z H:)F>6"EZuoT dQ|SQLKkpx|SL{hA9265`)#1 ~oYF"s 8}"b{TN M'|_&pUv#@/S^8j %7R,zTKG(-Zw M\DKseAu"} 8'C^ + \ X4F\)> M| |7^\_Y`DON!ud Q|Ya"24/|K}> u;SLh  >E\ Dd/AsWU: J=.Jh&vaid]:^;qXQ*||]*-hvepFL R]pwak<zOqzC,mN@^Hy 2O|AV}U,sXsp#~ 05 3AwJpo@1Wy@#Z UyV /MS`QISx|8dVjB{L6Mz/!& |YFdo~Wj Dkqd>(~:z. 9kg/  #[[]q@V-C} UXzGVKmS^@D"?+` 4;4 5H< |!^@IoK=3&ukbnk7D}+jL^f D$MfK A. [hp^sY.*+IndH :^u1!K  bm)}  !]Pz 3j,Q(O \ LE O  [Q lFP 3-TJ4Lu%8 >.|x&/2=!3 /al GgJ8x'^Z g"z-%%<$e *#y !B: /3=]pZ"z6 :_ J $"{dD(%Z f6L!NCue(1 y7Z8\F+ HjJc MM%kIIxu+O 4=@OO$)U]Q@FLKl YQF^yQMjG/+5G [ _!\_{]NZt*3<<I8!vU< N&u? +@JOS5||-h[{^2wYEcb7 ` 9dS >w# >IE1Ybt+QKO Ux?^ssQGf$58X>3V $}% J~^ z& k:$  jUl88j Qe,qd5 TM,  =v ^P.c)f3mo21wqFB:cQn Bm%^)oBuZH d eNQT>Kx #Gv i"] 1 HtDKp$J/Hf@/ ~$0$+Ek"K/k/*' ~ />Y@ 24f< i3;9c9b1yM#~Ya5k<so2||3 AOa|F @}%B>% k  K_4 C.:pGvp | EFU1\ E k25 #  }d[.k|Q O;m> *E)-5OJh3sS`>H Uk3>ksd]dy588;b#AFL&L<pkiDT||qWX)Bj:~d:!a5Jh&%% ERG~z1" M}} _K$X{o kP>8 kfXBCG Wu A3 |e! `X5j]&B.@ED F~ r .$ ZiU 1 I+ zQ51QF>[jTxn ds:Rf   { ~dQ-f Y^;3C u ewO%FUU7gFz/ o3mwsOoRowCX)`C 7 h sUX*dFXtJOFJ240# )'i  1r`  &d+.5auOO]n 0>z 0~CY/#A ` m \1"x 6H$t ~%` qH,& ,e{/|yM<,6 O1^d8n,/azAF$9+DYF  ,\8/bnDXOxQ'6%[~yW!U 8WUYVG8@$ZSMd uFM&nJTuu}} J >w?i&\BnZ\`ZN yq.f>%z YI2|ONV g^Sq ^Q7[g,yPB >iGR.9 oi\xr ,s@Fk@ }<` \hQDff@$sF8 ZzG(jh>pS D3zy}Qqb'-Y! S%7^o=: @Pt$1I1`TP;3 &km+) [h ?i29@|8i=F\\Zmu %Yy3y)mh@~| uK++%U +r$^|GJ:"/m \ 6$MRp( KNt1w s+X+[ZD- R va2F% ~aT>::>h:b ~e$z ~ > p l hH@@sw+h%sW]BxUV"$t8s~( )r{5:-h-P S { lv=ju6 Kdq|FzZG-.LLD }V[}m9=Z^(&>OB|$gV`jM7XB||3Z  _16LSp]r 7OiD3I3V /  MqUsW@w)%i~  AUM=zk?HCFQGL ?T ]@BWO  7 0S*_"cOd$Oz$]`1dbO7Eaili mx PB{qX .]x_miB>~m&yc/SiIU EjS)[+ti=S~F`q0|nOl.C3soN>YR ~'QMp>  ?]ZoAH_I}ZW JfB,RIuM`[P~g^+5D+Z'": Sg5H yo/p - <$"Uz9`FL$TZqR i<KQ i 0y\mE }Ihy ~}&^d7F$ BjV6UbiqY d K>qQQ8x WkJXa6 b~Jh7 - :US~]TVQIwByDE/MFHEl 0"d83&S C6o#(KUeDSg &K^@\wfDzw$ ]J>"lY2;fjQk 8ie+Mi+Z1k.?$ ~ s7vYBumM -$ Sc`"943(sOb-N@< YH+d9lujY-ZeVN WW@*NU#K+oW! /o}+65mQ[#gBzwZG;V#w>FhKUbK:lhyOw~ Y\PG5" O  zS)%= %_K"Htn fq.$\> 1tXv4\Jp&@& |#I2\  ~3ock7GuzsX)|$M.)Nx"R7&e/d_IIT35/9`kEn8>qDDe*\vV g$fU|q+|H+XOH^3t\~Z8Fk 6z"`NC&~ki)%2&13w_|]Oz3*:F<< Z aegb5q^i"%^5 S~1|OUiUo9yFE#No^E.^F`oeS`~hO|Bz--n*b~]]~f+SP /z M @(bs+q#6kK#UrW;/nhF5B skxT_1ZzM\&3 S'5CE^&^5YYo [o#3b `bM#@-_Y\/G&{F"<  \Uz,iRc{MH:k SM/[@xsB YOOF  &o%5>z) ymq]:m&/ IZM' [-@Qej!|@jbMYgt<v 7G uiI 3g~, |< HO -bb3~b$HJJ1AW7*1S6xb^yGy/jy `Mjz3x/D-z"Y4x+5q(BmZ+11J@wS u3ESW H3F$%bxjU]k"mz>uR*mKp@@|%&hC\  h^kb1><^Vd;YqX pp\x\c 1bqOGB: <dP+0~>1 J(F[Y7 fk'GH;:kj- Q>~EBi3ok# B- sp(3Wa~s{Zu*C"5fX-PW&p)ywE"Q"qb,3nW2_VIs> mO]@b~sQVq*/@k4 VO Gxq e-k\b6bXl@\`'H77- -bI Hh5 zfqzXl9lvGdw2QYyJO|&n*]dzl: 8Qb>*-LEwq6/3,OV Oi/y<' Kc`W^&zw@ 5=,y].\^J>!xeIBOLlS%26/ed3XWsXcH@ksfq$5 dO@Eh$|nQ#i:\$y+b3w|.Ii] c[iZ$d@IVd $F uWzd  *o UW 3D/w+5O5+_EZqdFRmwYX>1 K~`SP>;[ x^ (>xOqKk @\$$(tSoUfO^n m t4O* iq {H~M>b)OKqSk<(D%\.6X!  )o9Bx^_}< & SK>CPGBqV l_,G3O\DXSMkDFf"K3(*$rX`w~4Q]<u\m} E(QAd- N :'ZSZ]~1egO+ ikS9 tM1odwM6y[\)q~ bBWadF0g2xF'H.Q]Uid(s@ci`s8;OSn>KQ&O  < *Kd>3>`TGbQ1I5'~F3d+~h"7@zzl)\juA8&21T/qco>DH%RSo6U& #sT^ G d~Q,BHVq\5+>#qJ)kFQ7S91R>lIgo/7YBP)+Hz^3gQb63:K WW!lQ:U^$JBI 8bBg8 :Woq Fij  -=W\q^C(\]d>=` -s3OK<hB,EBjw LExBoodyyS(3dh &|#xU]F5'CS$gVIzM$ &W\,>6/kBD$/q;s`qO+:$M5  }QD)MF^O69 O"/~"1>$TfmV>)-{F5" ^()@ :_UF)& +"Of#7w`1Y 9-#o=^HmOUf$UgI],8gOgZ'm\$ u |#5e-.`d\|so&|>bD^k"Tq<>@<Ev` kwg/6d-*- Q#WU<:h~"Z3w`Xai=xKSN/O"O)>4R~3eDg6udz2Oo,iJ4 x D/1q6@JszG^o,YPmngI#d v)Gl'XuqG >\/6Udk "b^Zfgoz3,+'&[oSFWsI$ 3Ue'Ub{e+//q[.:hwsSbKGt.BlI1X'B*Quz")^ |ub#KOT=q< F`T{\{O`:Wd-d\SN4,gf %3ldX tdGqo$~$:))FrGB@-?g  5S>ws1$+R^>OS+>i [} jF1eMx@U|k1.*KB",Xc8u  F}jK#@:i9 )&v>GBty*S1B T8g'WcCG8+ vUJD[Xsw3;+&I* \_Os@2A\W7K I Wtj +dUT0q"q%\/[%;>mfW1:U<1r hBh:"($ 62oqP` ' O o db/ Yi(Gr6Ozb$& 6Yv\;CuyW*Tbd8Tb^;A (zFu'=7>>.~]b~g `m\bh -Vh@gQI2/o`.*Q"h1J7 0]DE^fqQ$m>ay>FUAi< R!U+%\&FCsu^O*7OWI Ffj:&- h4qo|Gv lEn{*P(\ Q|"rZuSK*dBtPmJk~<-TQCOq duT)g]3VmOH k~ 3I8=/b|'tfbfD@"]F6O)OB/|@$S T6 iMa~%X~ tg\sIgW_ |5:] Wy|C@bQMO3T=8F 9E$H)/^OWCk@8qqHiSd6`9o5Gd-w5s\e>M- ,/8& btKv |f@06;8(8^m1v-.RvQw+$ZQ3eCY1;U-9,U@$T9 9q/(h@7PDdKn86o0kOfq&\@ eC+O)q +m+" (bX"+ L^;nSf,JH/*Z.Bq\_ +Wj,5&k Xm|wt-k( Y`+BC$ Udw+La|O'&8Od?PnRuJ Q>hu)j6Z=| PB^^i6<ms-W'|Kz<SX>} Q19^oxX@_ob5mfqQXY!1 zq<9`3^YZ^;}A,kZ^Omj4Mw\{B"+[ 3#-:[\6#|=)sx>km>' 5dQvo"SjX-sU);~#M o $sR W>x1g8@ ")FFguXqGDbk;o@dO -F#|+*R q`M)&m|d K+('z=d+Z` yDg@^7DW^#dsdH@S|T%X>O/H^  "B!T:nN,U "* Us)WOjFm~+ K8cmw!-(Zw| ,SX5M-%b|N6W(}O5WQ[)`YZghF+B-  <`f)F Z-$+S < nO\Z/ vlU\ \kq38w(]u< |fIKi[d:E``<5%<mC'5yhT b5^8q:f wSk~|k3eMO)U<s~F"/|Ha:x( .lzt`A6~=7-CM@^DTY+koMoVze%iRoB19QQ@y'$[IZ\K+/'h<@HO>m~ **r$vm^:<`[3s67HF61:aO3<)h \S hIf"3[]F/>1YzoP"Z<6]jC7a@}$*Z+Uw#v>h;&3&KLf4&kS:S +d S e >MOjZJZIk8/wqlC|oJeM UG<|*8SJF0K.s2V'$[sNno-/~  > MT/9- +"nH \ Uez&+uBBZ3I4 b4uZ 5 ui " 8>o~-kI4t&@]WB+i%:Wc vYZ59bX+d @1FsEod% W8EDk<ideHb WitO6)Hh5ZzKI3F \"BU/1@f`"qgm6^/--{ 5:$%^`UZoqBWh$sj/~xtDS1F'1ZJD|5m@\G "[ 6ekul5Y"GesSoa b>k z)SR7:I$W B4~:9>$7qD,US/(Zt7KEQ-+K+/mkPuk0<q7(1i5I1(d)SGX4O U>b aYDlo4CN>j;W wnOLO #ObPyfQQ Z+ s+^6$-9`vJmyt> ~9B+z!3qs~@Fd-=KX"Wg{KE h|1V" ` enw6MZ@FmZ69`\t6oui f5&C^ \jd%'&Kqe1>|C`y7\G%q~"+bUdcMwI1u A2/83w^QqglOox%ot~x>4b;AC+vJuk W'S/:HSLfXujm7ydSB6CdO /Ja_%~Mqt^2ln&Md ~A|SJQeV8wWQwQhBQOB<^n"5'xh6m$\Brj|]d^;@Wzqz4DKS 6q1KJ$jjc@3. :QD')gFMK|"y-ZioD <>~">Hqe^bbxZJj12qVrq uz&kh"mZw7!@g|D!t]zXJ1RA]ft I L uU(&5")HRPtNm}7sni@ZAqK`&gihbov)2sgy\Bz%Tm7zs> Li -%|SqBz: \"oVU.:/EYBmI>m)y9 "%dLN1%RbGM<koK+ z)*~/g/&+'|ul^5>8ZMbC*/\>C 8T,3Wi:b+mb$O&y+R| CkJV&D |O$ bbuWD)D\Q/8q^${fR\s!U6V{u F^i Q<sBzwH|<e:q)u`g:|xtix# ,>V@iS>C Q]q/\<e l  -Bl8'>*4*LDQV% Sq>wy4Z\O#BG7+>O{/d\So@^ tP8 1qi>\KKH Md)>qoe'Qs<8hS3vdiY$W.nv@\bwE}d<*9q kO[H q-&Iu<q"u%b-^9q%\ h %{)W'|eJVO-u@KdufEPj E 5MJrOo1y$skoucQ`$'|g,4_^&3EjlA'` .7zo+AR*a`*KT/oE;X r*dBtrS }6C%^GefX zxE267;fqc+n+ HOT  !4 uX@ 'fG`l%H6b&| -It++s7Z +2CnzF~N>/4@xKU>KO<~:## qv6)oTs/OQjolCyck2d_g>y`s 0\sk%2sU-z$5>Lc ;,6b' K+w1! jc@~m>.4 }8o&iFzP@'2m{V%g_+q\og<^2df2t-[qr@nj{]y:>aP+!:r1N8uqHAg>G`IbM|<>atDyiFf\0oscb!v\i:i>W2+\<mNXH51x.oFh*sUD>NRb@cf@b^:1 +tI ~-dy>!WS>a  .l]6XrG-'3>[IJ qsE> } 1hOq!1XR io#>1('>% (G} ^J@oGE~m~Noh3@Zvvmuq^k- QrYdneut n/6uskWo:/qA2T2>/v= U[>SBK"F&\3V-8X-l~z& 6~a6eyKG ' 'R l4b!26#   `2' ]8mG/a/\S\q-dK ]MX T[eq&[`@qXeacDyOlFW-L~;NC s(\d& 1 YOM1< tE(1E'#\>[ jqI&u]O d_`8C"82)VLZOL5koIQ0f2>: ,@'I~\X0T-zTv'mP|EdfCbs>oUM/ {HkV/[#:!z.!.u/!kStJ > ~8KI%:a@3F: GH$!yu9U}>oK) qkG6G_vKqVA O|!tl@7s<)!4 O8b^<S>j4dgN=V%A% R_>B/@-e# >PT^~:VkuV/ eS*r@:U=7h9n /AfwK^CZ9>OONVbq wn2o6lA><[UPEOKXRC= 2.+3U@/2Uh9^S :Z8t M>c\+tjNGG<OS[sn_xB~O@hnUT<8m7_gOx /x 9~ydm}Io"[[q;<Mr h3>>4oTzX1. EbQ@iwdB8I+clO)J{_N>QG'8@R4^`G:+tQL^0yKchkcsTa> qRh0hAPTjP\ %6Zcy 4jP>@ K;[ P.)@X@`#'~^M)uJ9z3H6>>*o'|gJ+6+X}u>Fdmy<x8,K->8POkC'6r//  { qm;CCC2 T2!wkP[Hk j bQIMZb.Oo> !SX"`vZ{qIo/_8[ /z6BNZC!^L2/ q4Gb}&EV-o]/)^jh-HnK- r>gi 9hP 0AYd$`wT4T dC@kAZc))>KosEhO_R-yJ@]$8l&u tw/_0% oK4)1 15q6&>(d=$n]=T PTr4>%%G^8K82>Ztl74fD> 4@#>e)Eo#4f"~V:g| `=sb5-q/^nyLsCT@'dP%>6@O4O^ZT2%m0Eot JaI8a3|vV#m3y XX{QL28dijhO>F9:!4[%cG{0\`<o+GqMReaT|@8X AM:z[gCcee<j[7Oz_)hY8q@l1XL0e@f0@r S[@qkgOK'G%qk<_8%gh_-]-M^I,To__>RK'.b=#,>M~8q9J"I%vy+ 3:8'qAR- @4]F|aIoaI8Z)>%za!9jVqa<6mblyn|G.Ywj{Pu$(nR2*=K<Kt%o0G2|t- m@c+^@l{ZY0:QZO Zx 137>Z%W[>)>/!{IxAX f`:I~M)2+rt4} kIe_}So %)CC8ao(MM<T v- 6 V_q< k: i@~Wx%'dE-!@t^!6`#F+>C: k9bG49 I~-a eSNu)R#}kg]un2GTZq.+t|-)!%q6 Rm+P:#>EYo  t .c|- G2Ix)'zR8'O~4bk: >RAE;a%sqe{vq=3u<wusGVPHj:m Pvx }%a!`/ > c gw+8:T4aAP8KRwy #FLki={+-%G{M 0~\ k-Z0A<o `)@hdw)c Rv !+%Z#o'ARm>- 88o32` 2!ToMeX<x`26:>$*]lk/<|k 42G%M6!PcK2x8Co8o^ciRG! g}WhE  a~ rcz 86!8Z>bGro/F_lnfv:< #)%q EM^o )P i4oYS5!>xqh$5GGEi%a-Er)mxnstR q33a%KakEsA/ Y5 Wo/8iZX,'acv }yGK42 6cREk-Y  6AEG^/Ege'w)g@n @/ K`!)% 'zIkejI4%GE2ry-R6To+w6iK:S62>~ E%0z|#'<g :OxkX+6  68-%XeT{sGE`qX0<\0:tGPg}'A:GC _`@tvKg}2) @mG6cz)`aXGRrGZ0Ra/XK<Z6Q4dMq%kMVIPo|</0>/  #6 y4em|4w'mr/'\@ IU:VX`roM@dS rX-8-<4/RKZP+>KR'#PmO  m8 '> 89O Ze^M% |2#\<#O4-JL/%@V#-b{EMS} @//)M}A^Kv '-+gu'(U\V @Dd+KrG'sQEi+<eITTc6@qI%+3Q)2 dYP iOE#m`<\ox+>%o;K\ !b:x!6'qgk^ 0M<E2XA /{!Pl>P88^#i M^:q~%v-sIvkV0CvPG<#>e4]OXC)zvZOC2^Zo-8COZ28/ 8EkTA316voDj+#B96`T  oIVXK$`)#o| A.3Z)\zI# V#atP%["DP \^i /itq>jMEv#-L&7@+ G6CKGC4amP M0 4G>/+z'W d0>6I +eMIG-%%<26iq#j <ws/-#a!j]` ex+4EC' %_q'- ctT X<V '!Et8 ^T'cV%iSy Z 4aOP'2a^ aZTE4%O`2>!6>2XgIj)0!M0%!y460:RRA6CxrC /K!4+Z6)Ii~g!>6/@GXE -2KMmG oG 4q`<S VT)6\I^|G 6V! ''O\ZTgc@KA2acGa6R`gxaaK0! Ea~:l )C|MLu0!)#C-0)E@6'#%0 HY P42O+%44'! -#:-6a'!%4 8I 4P^E' 4>C8 i\ Z<%I6gxZ')2P'}cc+@hOu/ oO2MqBNs>P4 % % ! {G-Ma)-4R' 2 - %o@ %~@y :GoG 62#2av/ C:%R8+/ )>'Vk akorC+ 2O /OP2' gov0!<AJhZ/RO6CP%P<!8 22C8GGo}ERPx:0: 'oK6R%  8e|` gG>oCP4+ 2VO!@rE# 'V!! xx!oS/] !r8&Cc99-VPqe)aA Vv4C|r2@K+'!vM# )`N >TZ/LW #'%% /Avx/uu)`+ /0 CVTi%@0Izi-#! '4K+{ 0'XT':\ <ZaiVA')aCK% u#0 YNUu )X2 8\`O426xIZI28OE/'ReP)22  4gm 8\`O+EXg|<0'4XkRmM!:goZ <t~ #)'Xx`'OO +`2 OG#/TR`C!A`R4''OiVMGI@iI/MggZ#/6Ca\ eI4)RC@OA2 IATtxV!>ee>6 >631j!O@ )848cX82I^: ' 4k#>xI2 :Z\4)' O@%K~P )<<<v%  !EK'4>TV:--`O8G 8#@C +RR cX8O2I+!E%6kmC%RxG4K/+- !X@ uhGgf4! )oPK2% y+4%+# eRr@6<axI`R' :%ATG4KaEw4 #+'8 O<A+#A: )6+ :O!8tX-!M8##8g|V+6P:#KMcG<IoZ8Z8-2  #82  CA0-- @etXTiI6PZ/ <qmO/+4 EPx@+ct6w KO< %k\ %rk#!%!#  #>`xX8\aI6 0   `V uTe< /%@<4%2  #% +  Gi^!'K-)PTR:y)0>2+<:'@@/ +CI< !+MxO'ozZ8' 28 <OPxZ@2'> 02 @zqM6 y-!#!T/@%V`R# 2ca' !+VZGK)MPZ'@E)6M>%8ROe|`@-oeI #8V:O@:Kc2 % 2C08)#4T#)=RHLf_mS0U|iJ.OUJ77WD%(39\kV$ 9$ (   E@>J( )-(:600  6;/ O= )O7fd, *)7W< #!* =J%%!z#=9[N?B^t@cd+ -C0A+>Med3 '$ %"1,e-'*- ChYOW6    (((#2)0+'0?$&@5BVWO$".C4;*31 CXNF7 )C29:C, ((2A2??0*/J_='-3 ,! /*$ *00!/!!:\PK_N;/2  *IT1   .3) &7/9&<PW) $ !-5'A< - .V?5)/:   (QP+#BH*2  HO7 " /gJ (7*,   +  <C  !! %%"*" '3=5OQ 'I;624   3( /9437"@4%- . ?5 !#%$2   $*A"NM?<+ @CT+'/. 1' C2 $$A/  / 8#(! IB4>. 1LF $D[<6!() + )@8'+%%# '+(!3:8 (*(  % 9*7110=+#% " +0',77 /CNC7 6?C) 1-#"18% *IVMDH- 0U[8     &'( ('3) 7RC'-(/" 55%"   %& ,# ;VQA, %"0,:6$ ""1=%!!   ! $187 70&%  */ #$ /&*#) "5 :+    !* $,#,00'*      "  )    (  $!    !     !10' (        '9-                                                              hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatOpen-Med.wav000066400000000000000000002637221366722712400231650ustar00rootroot00000000000000RIFFgWAVEfmt DXPAD dataW| X  eH=  5n M=   wl^R"l*ٮP8@!j1 (` ~e ]T Fd:KW. [y] ? =H)% v-$" K7 {C [}  [ z ] e}' . q l! :FF\Tn/ 2nUa({-; & . !( ; 4cL{w g!IPhk:?$\L.^# 8GsZ!L ]tRk^J!+ ^K._c Z  w3d|0f,ה *l=vSd]~ @`ICS ] |a o%{ !/b  Z-=! _ _RZ1=cޮS\H:wxQ3ky)$v  @7q%=%E0d3U[h95IAX) H $1 .j &&%oh_&* ] W <f ?JB*o !#Ӱ r3zJtۻAu ;w }/)!g> 4! &t*;<- bcB\MI F+C@>T" T1 p 4 ="E&) h X I-)jA : pޞ  rUrބVel ; z&BD{AP 7uo r)V)K K Fz{n w ~%$QWοo-Si>?KjF1p!Xn ; 40? ';p|ڊvh3Rpʡ\XD Z fT(= c ^72*P#x)s*$$t }, Z6_eE<֌o7mQ)BCZ6ߒ V<+$@ ,!1#Aq 1| q& x S0~| ~ /)/*R mTYFg,H4|WAUR d 8k r+o FU Zb w3 c!N \0G2-p)b2  JG:#Z?kCyPE:ԩ`ӽR܇v= *p ۮv 8 N<A p&۾h$>%chL ~` Ek ,R KAOz5{ e $ EuP >. &d/'90\mOh#) I  Z8uuʆ .:A{jab i%c!8 ^/L#SD-!{`W@$ ^80 v" 4+;q'2%  : ܪ)L 'b 62!  [TK q  ^ z% @}  $w  pO hP5`JX. [i MtpM %i]Bj%Z/% X f <r HD48DB> <] 0Y OsF| pVj%y {&*!c,hB -{) nD vRo?5-HL8߅$8ۦ7 yS] G + 2  (h, J c&HII ba. Y3O,r Z9$ t  @\R%Gj '!k߹pcu &sdGB P= g*F. z TOi Iq' HD /1@kO ~\o޹, K NHK Ev>P 19'm p  d- }kXJ! vk&3U8U`Z }[`Hv M xlJ H"[ .,vr ?jX'&r}" _ _E8.[j'z\b x. 9+  !v *6 :X_ u/\ 4> 6_e $44lL 02Gws}4 ek le:&1As Ool$ BR ri1 @; l  7. RV$W-`?-' 'W.h3'}h j,c Kl%@nJ62{ F [<h/MKIw,<} k M!m =zt"` *a ^  !a sdDfW Fi r 2%l5 2)!X#U 8fK"e7֟ph), V@"c %"p FI. k ZN%a>   DڄxvA e#. Q +'Q  [3 ^5& wZ -yo n6 * $ FJsY }A5Q  6ZX^Q>I:\ 7>mWv{ _8 ydM##m8u"  R_Q" vo)i$r 6 A 3#~܏+ :b / 7oi+[L-&s>Q@[ d[S~x]s{t9Zg0Yva o!e 'RI wsZ4a @gU / ;W!R3f2c) w} p&CK mpcsW){`}mbd o՚  L}L'E.E "!. e Rn x?m; )n 12&OkG q >j t`?~ +! 41!O)| '7^-b߫CPF=ڒv+  vhs*// w eC & MNLx7"A%4Yo/J$x.h}_w>a u1Nj{\ {L( qF {c*Z c1 Hpg:DFs7g aD1O  ac&D )  feW3A!  MIR N[Cgv{ (+-B YA5)YF u s' <<D{D:t}  }?18A* `u )o -g$ g v~ 1pR) Pmf :k,F;+Mvj a i~8  y,J wQ1STWN rt|u .  .iJ  + Y6`i)4fh  Ji@#r4G<@CJ6> 4 d6n^|\4$ v |VC( `o!A N/6cZRo}S' [ c  ],K6+ MmM5j 0h3  G "R߂F?&$M LC 5 |< 0p6 1[F 2Y{ { mA*(e M iKv/V!A:h=3 [Af(5F {)z~jW i L CAO B$c^<l@" )L LC Kq   F0[ R m : aFs1H|7egz'l<iOskI(.d, S k  R  M oh`:, 6Zi r 25Vd? Q?\`X :I[ Q _ | r9EEM6y9 e F=}j} U j &Y29 *{QJ 5- O;{0U- K7 ,v Rg3 aTY:BQ]N4-:))hm \ oQXH2B V3]  i] PfiSs3yE MYhbVvH9&@VO}p"dPO ;=]x'gc '1 ?  {w "  ` xBAco)vt8l C51C)aN_  lZ d w2 o -O2xO{S PV3*'$= 4czݮ .xjzi4u3 lAh )  A .# |{8:!\8 , q%:3"D e0>  bAHf-G 6$["    886(>&9 >vVN8 W  = "/ ^yf_|!mH2l5bvK t()HGb4+' 1`I s%   x xZ y f/%:bcV EC T$c(;wY(w2v:$+ei+>o{= cE 2)xN{S  orB :$V R ,wz L,mf B%G+!VuC:%_n ?)h9d`)a Z {\)V~ [ S mb Om ,q^b V yJ{eqZS[O;o>f o $f J N6qW  v e(jh/ ?o',B [A dD }2 |3'k_ r TTfh}) k}f4S mV  .^  v= B3 3 JP`\ Q~EurKpM#&aTYR!%{sr 5ltS l5  ? NF', * *~N%X:5F { L VQw#@[J9] n$ mi B98^v_  Wa')% q7j &WPPeWD-U:> 5K)"qX?E'yd&[rOrm7L';{*7_ @m~hi f05 "$0uVzJS y:CL3MtU 5/^ U+ #2])  c=/t' iTnT$>):^X 7v\) 8$1  C@ !I g S!. G '>KU=~wz3_A% /F=+(U &QCHMD\c k KIi%!Ho@4 W:(staJ,8 M?J I"A  /hc, 7y d ai1[}.`|y ]cpHm W  3P| c M## l`!Qk (Q&@ci--\c- : j_8 |*Ug8  h4WP?gP+qTUx\! Ew2 L?=3 fL YB ' b>$J 6# hQK vXN_ pDPD585n,  @E/ 4"0 nmgX fS8j W 2 ^ 2Dec bM {R l8 _c nZ@O IRp4|<HM AGzy`td 7>.  $.d 4dW7l MO}<&| 0p0  mFXo\\lU{( / "lEK | 3^lN[}  F ^  wh#TX+ E2>68- T 1 lN 0bEd W >aH; ~CM5?{.2T$a1[yb\lN2l:,3`v (hG r  $i KdH*28hD $lL[z+ s)m LV vN =WWe)2wn(_?v>/Am(uTIk}@ FJ@v A Y j r} z] 4>oGp: p pI[4>:<:\A#7ol \{[DV|LTz7nU+B xz?6hlb() #sNL?cO| z 1 I Td ?oa bmMH[k cWq'H(  '  # I <= & g-':[ cs5rg*a)o`yyz2/ ] sO%gL Bf . Ybp ?A G 4nK3Fw@p L rN6+&a4Tdg) MI/ mX[P PQcY wJTs4y tqG9 F6A/ "A2VfC.EE@ /.2a ?h  r{v {5, < TC MIr B lm! pA \[r,hT)Kj fad )v ; ## 6 A{v0&O=D *PQCs ,@qe?K hW c  5-e@z[ r"(8 ]w6 +? X5"MGj emYZMF+"o06e.6 ~ /tLP N S q& E5  @UpEbJ$  k$@ i'F.k6V:SCQ` HI 8Qd m { (! =L7[xo%}b{JK~m $ a 8_ F85 :a (\CgKG_"48Adq .O7 )"IC m e7v +QP my\VC3 B4IT$S -:{%l7AO1 d 1BWD ,4Md t"8 oy? . qI[YJGcfS  >.+v{ ~Tt`@ @)^= U|5 *  :v N   MYK\)i+ sZ FEKr :l:i;07{eyG R b!&odI ym$t 9 k9bn^ O45D*0 2Q&+'J_ r _{ AO L H>; 7)]:yW" ;'_FH1[C&& YT f %E B k3K[)c( w c & `vn\t\l ~ p U7b Ww 0l J %{mqjC6D'.O%bv'HSG e $_ Eyv X` ZdgrT1~ ?a Lhr}t $  \$ha1Ys/oHbt)+ t]K R!49 sL p 3T0AD'nk { x !!&  MZ`l[e 6 V(5| u vq/fO\}2bdE  $(I:M3, >$P # :+K_2flRcBaYJDK` 5_-5p_ B>:tm Ct !Q%(1ObE@5_U3*l T" h73 _PfJ vS %b ^OkN +UK^ZV=a P5ot"?Ke > 2h <v'< mK\TXc -6 N , Tk ^%9tH+>f>7nS elg-F 5 & !jo P ,p3 u#FH c#rC qk _q,Z+ U Zr ap A$pf+= Z/  @b;) z' \& F ~p0 yWP0:  k?S,2 w D w E!) < B yw_Tt   o _7u  8f_- 5 > &Y?U R* M<HH8 s4%Dt A8E kLl[MdM|QZf8 o _'%C(qry8 k 0 8dD )q|t [+.xcU  %3y) 2bv W o7 Z  7)|IY<c  W Q= -BEoJl rlG ahCow 5'f i I R<<Vh 2SF u_!4 5,/o. % lfxO { u aODc = xY1v  bkis\n RfR~9,V Z.D [M$ g$hd _fU A0 jW|M)H y!>\ }%Wd_)GC-6: Y 9QTrh " v: *)[vp4$"?  -;nRXd$Ff Lp,4>U [ ~aK  :iC= W\tWh; [a &5@)_ A ,< e{PPQa= I/ ;H ]868<SQn7 % tRFTqRwtt?o  F?v]7TA h P9 TGN hX C3 1%C >Z, ;A)$ ] y Z FxnNj+pYJ>&]:r7 tle dX|- Nd_T # eu?{JP b ' D ^GE a8. C'U U.Ej-l >g?=K h. um{V [R_oP euW  nO M , 8 ne  v~S D)L:1# (S H 5ptP g}1 #jF $ x*)!  ] Mu7B^[d `rH$L/@ 2z9H]C]% !  C `$ .)Pw.H:x-$~ ?Tx{Wof| c{3 'G A dkTtCV\:fRo(-oa Ye e)h^(Xtf C)oAJ-+n; Wl s"Am 2k hM I = 2GH . gp YF"us' e V' 6y [;cO&xt\l>]3eW . ; &N!sLd | : C i.oC 7 8F_b]b%:r5 lXvd5U;?v- |py `'bqxw R#>   t& A [AO2.c~1[OHSwiu || {W h\ # ]}< " E2 U d!Y3t&SWXt"K!8 14^1[9H#J T)` + w:p  fwrsVd r U[cHx;p 0= %xs`+VP$J;0Zm _ y$&1 K) ~}}jN {4 F9~  3P'A` X*@2'*o0:2_' _ vT4 cB K< NE.* Kp0@v: ZHav 4?3UxU:/ #{ ~cPZ qV-:9u-{T3y% UhRG38(I YG a \*^ZX W vh[K JmO M68 1T]8 ? E[^^eTf3 yV?\ q,~ Q& ' 7B.WO ;6P/&hx  } S z S Oa `5 l%g)</8 "&TV|QfI.2O>h2 |6 Kyb u Uc_j\P72}# t3bitNc?O!I`d ^bk? @ (we^?f?3H%_H 5wh!?6y*{?p t:GlQ}  :rj5  FZ6dFl3tMv}w)k  g[B^V_v< ?m zG=r?=_m%AV{ Cd cbD ,c4 G%\=bcr<D?GImW aJo/m}W=pW P$b  WP'9 "cu; }<  (iI  eS ? Ph+ o^L\%?].njk/.j+\*HE   oWb /(]l+rjt lkh:_q)zcM @^I . h9g3MD}Pv8R;CQb Fj +Sm"})5CG ePzi  qB* +R9x; MKM`ug5A D S]Y$KYE t\ V FSObX)^OW_ K$E.REYD;  a&*wf2O{v[ c>DPvXF I^ AKa " ! wH N-<#gv>}BE(Qe%R -IKUyAzhU ^C Id Cm N7 t(JRQK=(;>tCC_`I:Mz ,&" ,Sj  PD6 )>8A y>Ow4\8[j.<O _ B CcI A t^w9kcX&o )-< 2Jo@0+%1~C[IA|; $BdX2) M\pEa yQdgo .')U ,[Km0W@DB>:g; U, @pH ?IBy Bhq jK =_gm{WsDQN'ZT$F<"HdxhbmaTR+(uC T3FiG {W.cV: p )IG t;"cvmHm;[[ *z%}"=Sto.7Jr lm!a # YN J}e^i=1Iu 58zq+O0aOBjx ) rV"@)j cywW="N~ UW ]\ M.b d. "gl}}'ZDN  MS\ljcOMX"\> *^E ~]HE:!&::$HCS  fyKr| <"&}4 `.!VV ^H]b + r'wt7u(&xtPbeI uHW *~k C"IW$B{ /'?E1#ZOLDCFnKNnJSC ,~<L?x7GHN<1+OWAee'+)Tzhqp%9Wh?MWNkK5(u^ q=$/NrKr`m%U  x\A( G ^A}w*I3> DE?,)vib1:MB5|_F3-C[` P#<xKl18*K)tiLG=*&G_ @)|X F# 6-v;ij9G/KW .A(_-Goe5m5 vNRm0 e$l"DH4Cst\ (BK!\?}x@'%/K^" G"q't) f":g)x8TBn^0icD"H%{t aKNWy] KUZEs+wt $:i*Q[l&;' {M`Dlz u ;3:WD7yfw y v\ 'BI-D:@$O cwIYj?6: CVoxMDc^sc'ZQT?DabK{IsXWD(Ovm"qH-~SR)h R'+32YVnh'l'^\ '[ K F% qcKRV 8 g)^cmRIdRc f&yS3q&A2o*^ aa@qm _H4)8vTqc+T,)4{O7vqH(FW&c%lh 3wt) 7JU)0O~RMf jC~1A  D?_%n:oV;Y:3$!) ` .yxh =jtq%%)kPsi v8r}'~ }&2.' ,(Zr pSKP1[q$9FK4q`VhAFf'^Q"^m#hy?b=d@@ Cbr  JaBIvA?>Sy^Wm}kag&t"1%MYjWty HpmY%T"'F%.zE7mAfv/wzOx|=,B%Nz]^y .V)?x8+lH%& t E$tP?QA:` z~BA9Fj.vw:$M YP_ycFI71~ 8z(YVH  ^P;o[:&269G?b3 NLT'DUUgkR78m"_T\_DoCImf+Rjd4UlR".DRAi T]Qw^oq= A?3]?oZ ?fMWG3 K?Oj3BBA,8"^><Z Wy^eW!v9KY$(oyyN1"Ny)~zkp` ;>@WWJ88+  ?{M#u  B6r,%00,kXfcd^_%,Z"$ 6$,\ Fjj:HN6MSqZ,X:Aw 70&Fkq0'(8K: @;0Ns@ ,v]P9^K\+d2[e~ZDV1!~"Z0{e(.?m:!Tr3'W_ *|kf}^`R*ewAvSzC 6 |.+ c'a{t)mTCm0Q35~O7\btID$Y3gkVA [6Rw.1l2/aK5:U*hohj)&)qt\F+{b:rA)6Amj GP;tVo*c ~U`."m 1ju6+++jAIU\Jb?,gR0a2^JOy)yjO) :Tdjt`EFOcc[l`w L5yzQ a^8 Zb[,uG")#Z^:KIU 2??F:TvP!qFuWXPYvMZ xaxeGI]S+Q?L O'^D%)`f5fv_; pS{M58]Pa+L1,j8j<E `5&73)HO^l5SjWg$t,ccMR}/JeDaK :q f%%M6UA7`2_*G R,$ )@% f{{.%Z*r"^8lmJXm_a #8C`McToME$Ij}iwnMS__;?HF]jJ.6o!".y5 v|KT$ ]|)`yvy=h#+"X$( J _Dh8R{tvEO;v5^h8m;(V T $)0Sml$c% sHo: 2:V);k)lU3yAdMUofeoI"q8"D~W$8mkI cy0WKHB3xyc| v4+ K7-5UjcFj0W.=3cb8~U"v$m{q\CKc1kKUGW%7QmMTf>I>j6GGKA=r%NNy3 "McdZ"9h(3QhPUP jK]?%3$P .[:;NC37j:$wi[ f]}UW/"R hAs(C'"d4\(Tq\+q6vyDYy1+RAYZeC}',iUt2;8rSk YA(KTtQQ~PEv< W|/M%Mc=f/PN.a+qU WK%/.bZFe>zwQ]+~0pyMqlo7`l3WWPDf_3^+ec_j^%r{]{mD?=H),gyR0pf(TT3rR F%jh"KD`FmUq)K^PvF30vkD j6 (vYKu{[;t$FQl^_B C~O i:^[ Votx &3$)(yq=mBF))T 7lH{q?WBZDYd(_Wq*` y!08GR%{v53Hc! $lsMHyooR{ARMFT *sy4mA DSM0pF!_2:"THA20w^I;sz*bj-`V\o.jS:0jW'x+Yh`dxrB3Kd%RtIwlRE%$?*yZS[c:;G? H~Cs}FF'MF[ji5eCVVh%Oo?UMBd.go6@?Hp.1$[vc$k$O?tU:Dt.a5w^RK XW>UCg0X#tk8s &?RzUorWim5 mHQZo5$xu)X0Ah]cH j^ :@} I"'jFi]j>1HJ$h uk(adyo1_<.=&ys~lC0{&WFyN*H 8qhy!=Z\6Z,ym08xR_h1j5P?lVD0y3<a,%@s 3(:CMd+[ )""5XB15& @2ges-tF @2=zb3R"85/.G s=o N,?%iw1Col^g}(RKQ<]{F4]3t\ 14`8ewxej6aC&o i @Upo*?cYjgc;9U_L-"mJ\0dATMfT 8AF<z}! 8!\R?8Fj$,j\b6"/l-! V1,x2<_d9$~|5oyXO$c6D:o5_v*g.3fP )z^HTWZ TN;A<6,Oq u b[:7o ?Yc(\ ${rMRU %P~o "t\v /S`wD]z"hzz({DG;FsEAf CjkF)Rs\sY&iU1:iK~;IZDJU/_uj#.G^63)w R Yq}}+6*>8R:=FCa 0oU03j XdwUS"{2lf@Y%,.:c XRUc1;=>yc 0+:2.q kTbotc.QIx Wq:l'r["'\@hT4k,}m4to\.n8%H9Y)O1:_681@trUyPQm(M{STmso)"(tN>v*!H Ky3  mh 8">oHDX%c,'6 DqoFi6ywWA|[dsy.H)mrY"W|QTNgcF,8r(lW.;rJ+So"BYkI dtffRWe7Wcd=BB0`~<:C`Wmt@HS@f f1$:A&K A$cUy1B> 6D@/?U86 +&=z ET+[$MI^5jO iKK\r UD3 [_8;0&hHaLJ{:"0ls1fa  K+11N:dxl$l-C,.A6'@@ZYR`vVqnWzIdW0/Kwtg_jD"poAA%WG*]T=N`)xKna"%Ov4djmYB:fCpc,Oe|/8.:]G(DPk 3KVDvj.B }T3Gr)d}4}8_X"G[KVce]ichMaYtZ0[a,X^XA1 r=<`UQN dW:QQv,'CQtM/8=KtMt;GSm&Pf&dAcA: Af\=IPe4, k m7)^M ho HuD?eKh(zbl& Wl$Bub".4bmL \`~pz*@cM%2Je*;OCvLF\{l'\v#_w1Q]:`Toi3G6k*W74?TG`>6 DSx6.T ^WKW),{-. ) qva)XLg6UXBKW{XZOq]%i/){iM@amrlrkrPaD{'>vBOVi6j {~i )2\kFS8jfyr.W8yU f5`J 5?,3K;wv{S;'U;WHaB{SBe6X~0o @mbF@_vevc'Y/L%8F68~\ :!UgO_,v$:w> *^iact`Dj|h 16XtPFWx#lT ? .c{TI[xW*F%.Z*%~\=."DPjDPNdL^8}fS/Mw^e^K >]HH@9jHy9Rl-01 dp6% ]( NZe)Eb6_9i[zT{mF;e/+oXU;oR:KD:?j=Md!,[xrdmJyri0;O8UDx_ra\ /uDc4.oMh j(`Y4c D[1WbAdN.kw B8_FPmxrKE?o)h7_{K9e*9KYQ^w7\Fa; XzzN#k;FrA^M9bl.OCwzB+}WYN43z,W_=EX d:F81p"3c1x: /@%eWW EtPwbK 8Q8jJ_Z=@O%U(Oic^JTEX.bUW-MoDSWI%K6D*cedW8G9j6f_Y:[!zg}Sz:8\Y`,A}w|++ IMj}(>.iYF,5 }~3%m'i|uK,KpGW3]TrVA7,vJ_G(KSMznLIs yQgXI(PIme[,%y3>VVu'iNyt1 f~soaG<>]J8Z]oU6~Y.^y][I.~Rh KKKiGa:I0Fa/X5\oDdPy/4]"1|vJ(GSYYOfolX,U@}yQ2s,'d1Hd6WuLw_PdiiH<@"% Vo ##Y.f_K%FXJoX~#B"BiY #.~dW"*tce-x#(+FbW= ?tZdW]fZ[sgG.p{[#cF1+"7bP&oYgx@ZSB :\Bb:'N;6\]87biDBTQ 1y/ @&K=a ktWgYttxQ8~*T{c]dD<~\>%cWiv3~Bo*S'\Z.\P3/.n2l e,Izvv*Wam@ X#NcR wha8gEdz;v6T\\imGx(Q{n\l /|6=LVu o4.8Uc/ze< Qh)"u;>N8Z:OWKBQ|khox8\8te(hJXW.Xu #oI8W3\i;8FLN y"|R?WB F#W{Lii5UP"u;[5eNO" *T1\D2hxWK `:jB=]}I1 V'KTt VU6@#4ZBdx^"|2)1k$oD\Sk>z K%*hBUzF;4GFZF@>j=/s ]_mX:(*F{ pB Q6f(zWc/.(tWrsKtG2[3KQc,ke,=Zd|#K;oRJ.}f4H}*1?yWq z LIoBDL_?,F\?&Wxz(t1y(A&U o3LSXhlX .p@=oY?k FZ0 e[JF(6rQ ";1(U=3pIB*Dlb ,8W:#C(P@*@FID:w hPUu.PBvglm]@*QkH.g9TY= zyLW j84B ~GypzsMKz5u3K#aFBGoADp]fB1x 1'3 @4(% _% P=(4:.LDPWm_?xV.$1;@S\(b+VNf`Wmv3k8"5":?Gx`#"3 'Q"%ZS#SD'H).s3?SwF,%L,foD1/"#B%'F7MCFov:WI*7 Q yQ@Ne 2yD mi>q=|]>Gyy|Bfp}m:~4sL%%:UtiwWt@{{tyK/1p=Y/zLmrXG6@m 'tr}|= d? K7>vDW'%~b4bDYsSN?P,pHb#W;?#X_GIW{1N/uQ Ii!JNt"q]3 GIon[j.o' FS slZK'#BGI'cwNm%w N\6l*L:vz;(Dz( 'T&q*\/m'R}8aB14sg,1X1crGP#3Bc:.:8]' I%<"*.kc=X ,JS=S,Nk{3@("\i':Q(#8, 8" D\33Q ii-q#tdD1%U 4f"za 6Db6;1',|BzD/a%[tp}/u? ]4Vv%IN#XS{J?m]' i ]>oZuiQa,1~S?U$i8,Lp;38G=:.iP.3?s : (p *1 |P#}66GpQ|11;^]=rGP%8(h@ 'F%Ii tdS"Lzp6_" K"wc;UwPa, Q#mPy~@a,? X=SZ1UoXP6U_6:6 'Dx/?% d@%(=.(#' Li(BI/*P k\oUat 7\D44=U%U] j lQ%1'\tBFBFkF u6Zh(Lx 3i\#D*= IP3 ;Fka@h%3oGzvXN:= F'8I:XK=U4N8 \4;: SZ6X,'6KccU;_m:\oz;okr%#II6##|zi|;#h|hGXmD }vsZrQ%1a:uG .3DrSZ.,zi|DG\%F1Kh.tBp Qk:UZ% {v% (  G\8W.*=8 .FL=4~1Q14Ss.BB,,#,. #Xc_  l^aF#d#,(3kD..@,(qi16Z,m,(%6,_;Wi'_mM:*LcU1,(c3B  ;6DKoP3: =U #  @X,U:_oL%S, kp3KBQP SQ'1DfUdh4('a;s]Dic:k~Nc/ :'?K"* 'oL Wk 8,U:4 ? N(cAlKaWL:8(d "I '.I La8Id/:% ;#%.]f:"'tS/1BP ;:cc4N%.t;t6/B46zz~kGL"[E@L =d*/fyD1%K";D?P Q=No#/*,PS]#Ik( "k|3;= B%'1Bx( #K,16cK" F]X*B?/'_k8;{}DZ:*I~Pc,4F ZQ8I*s,,hW"/ ,* G/ %Q'F83:*:#BB6jNKDP *'dwo63*Y(WcP Bi':61:?:Lt  "/Byo= ', *\]dKF ,?U3:68';DB 33*K'Pf_X %,;B=P%3 ]wQ=8 1:|P PcB,3  %PZP.:\:1((,318'F:8Wiok;3 344#3(%/D.N|*""4D4]' #cU D~B *=/"%% /]a?8.#" 6 IS 6 3khG%,%"(.8s]'1' KZ4F' '; 4Nk%6N1%Q' 3?' arG PGKBL;',QaZ;",:#,/Bi/@NF."8LQN{jj( '.381;3 6iyZ@. DfI*' 4p\,%3#G"#".D4%/N= LG@G\ZdB#(  '%?8 #PGBayi6   1# #(# (("#IF/Z;6"(,L\W:(**=:BU;":ka3 (  1?%4=68NmX Ui=/6331#D\.(DG%  Km]..   4B/  LF="' 3P4/% P]K/4. % *@%#KmN' 8?\W" 6'"? * B16''#.LZ' ;pN ZSD6#3*6@%G GP4*"/.@I ((IN6'/ #;.6"*QQ'/B.FGQF: 8I% 4"Xm=  '??%;6B""3=  , 4IS]_B# #%86::@/"  4( 88* (:1 ,SN" 13*, 43=4:]ra #,/ .3" "1('%6'6DXK, "X; "%BDKB".* " ;B/   #:.%/  ,"*6FI/#/1B3 "/48:46# %8 6SP1 '=K Ff "4?=, (, "*N=: *8@??D3"  6LW8FPL#F1 ..%.3 ,Zth3'/8,  #%3ZcD/  IZ:=]I%*  *1"" (6# *%(B?;%   % *4*G,%.?;4?=/ ?("#3 .Q1*%1B3' :N6 % Gkpa= 4L/ @P= 1% % #3BSL61 " "If|rQ:/'8:P@:?@66 364 (. #F]UF: %%,%."3KB@?* BG; 4D34.461(66 Iiy= ?6#%* '/ *GK@,  (",*.6=N1';?, DUS=I;?'   .1"?F( #'  38/DG?=1 ,* # *%B\Q4  "/(  33  ""%6;"/"8;:,   (*/" 6@.3'G1%/1 .* (DD%%,  ,, 6Qc1%3." 4;/ %18#/=,  *" '#  , (*3",'*  % ,*";Q?  (;K8,,8?( .4SQ4 *:4D1 *4*%" (1Ia3 ,*% 1. (  "#@63;6 '%/,'=1 '.(.I:I;  %43*'  .%48(% "((# '%=I@* '''(@PBB@8    6'% "  ,  1I3=1, %4DB, %#/D;/# "* "## "D8 "6'' /4,    %,=.'  3'* .,8;"  %"'/%,4 4;(;F@"# 1=.'#3\a33D3((%  #",% %,   ;D6#%4DD " BP4::D( ;@:%"4.=\8#" # "6L#  %/ .So\,(    '# @F"  ( '  "% "/88'., %/: ',(*'  (#""""* '(6 %(:%, #;# """ . #QPG3 #%3"## =8 /*, ,(*" "#  .:,'''  4%8.  ,,   3/ ##'.%#3 */,3*# '(.'4* (%1 ,4 F='  ,'   "(;%   8L/,6% # *%.(?#'#%%" %1. 'DG1=GDG';   "   ( " ,/ #?*#'/  @#,I'.6, "#   #/#    *((,3 '" 6:44#"  .  ,#1/=4(8? "3*?;( ( " ". "%     *% (%" 6,(,# ' , ,(:,#6D, 64 ,6    #*1*  #'# '   %' %",  */'B8# .     B4  " ( /*   " "4 L/ 3(1%  ( %( %, %3 /;#3  /,  #@"" # 61## %(1*%#  *38 "   ##("  (%     /  /  # * / (   % #, '"816,    (4 .P8 '   " %  :. *' # "4" '''       F:'  " '%'""  '%   '* *     # %('13"   %  '    "( B      3 6(    %6 '  ("   '  *1  "%( '   (44#  "  "'( '613/   ";G/    ' "#"%  ':4:'    " .,'/.,%/     "'1(    ("% * #.%  1  /D  1   " %#   * "  ;;/ ,     '#   ""   *"',    6  (/'# %  # "#/ "%/," (#  (  1,##%#    #" ,## #*  /,* %(    %1# "%      #    '1#" ,3 ("" ,4     %3:11#    #8%"  (//   % %=1 */8* %(   ., #%/. (  "' "#   /4..,  3  "*/     "% %  %(4     "   ("'          #      "(    ,%( "   '.3(   31 "#,      3/*   (" "'%%'       ## "/   ' ,%  ""%      (#31"%'(   '#    "*'"   "  "#  %"/1((   ('(:6" (/    "#%*4,"       (1'.'''   /("  /;*%   "'', '*(%*(     "    #*.,, %  %     ,/#         " * % hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatOpen-Soft.wav000066400000000000000000002640701366722712400233700ustar00rootroot00000000000000RIFF0hWAVEfmt DXPAD data8XGS MnK~d K h  ?-}cl{lw 9R9G]KJe  O[+u }%4v k   U nn w Y wXn M J k!KLVq^TXY@6o{, eHhku)5 $(Uv  gm Z+v(0g ,gpEn*0yt$[ f6 K 2Ov |,R"J c4{< G |$ $ ".JR@FefQasf8ބx b\p=4 0- =+V  j5 J r M m `oEfT ^Ze\9O{ ,c,j'pi+X~!@6.^Nc[h4y {4;T ]  $}f ** s2x! " sn  <8f )3Lp@RR  "2~u%| %? -|B_[&{a:=O i6F*T)?! giQ z Tt Z 5_~t3}]Aod/kJD" !:k1wrEE <'n~1<I| R2 D!vF}z((W$ 8>&6 N~^ NQ iێ+W~v< +ߏ!-3 Vr<Eq G_  ' K! , T  >Mj /#_ a=J Iy(N2^u81.P''z ~_" fx3[ t 8iMQ)  > 0  ~vhv fr:k\I$= MKi ;l?8rX]2  < mQ3"Cr G"Iy a3|(r`=yTM] \  j6t #HU Tw 1) 1 Lt 1a sbr0 py>N]\U?ls2 aQB?oU(%<yi z P E LgF^~rY9a ]i p } |6>q P^8.k`Qޝت<-yK M R &  V&!2U^9g8L  d!# X pgW#U*5!#Di_ :@f 6Pm)al+e5N2x n!t CMfAH8+.f$Y f*/b & f=tq2 6(B)O &uBT(= Jd ln 1Cr !}eLEe2 PdS' Vj"aքJ_@  Q L 8"= yMߧڅV){q>g ,L GC S,C)&S#b]! 4S 46.0 %\bf f1_ 9!  tvgK-h 8 d_Zj <2rDv 'L }0j_(T\i8pi4X GA(b5& ^   Ph 9 v9RTKJ:`s # M 3c  %B a۝C (  (.<%0 e X#gh p><+N}"6XO ' Z?X} $K 6 |pDAcT&;pF?Lޮ|6!H-ؙ sz?;{= V j'o 0 2- +` $2)' JGLTEN#MbZL dQ s#qMvVpG 8;\S W  B3x~ omL;   [&~" 0! r=? p 8 @ >  b nfT_G RfV % gy\=3=yC  l%!!>^ "* pO\@dn+ #:WZ5Ҹ-/rjSC) C {FQi! iUxByimy# 4qF%v.o aI<(uE;qAnp Y\alru )LV -p[C/*<@ azU< Bx*`9g SK"&' SDzMQl8 % TW?"mEw{' [ ?V +  )+gG4 G Y  u e@Wq g)lh ` xwG Sc~).  <5 .b}{ I_(mY &oNJ:cueF7  j ^Vy     2 @ U" oq &  L~KY /[hU9 i tz c  .2 &@o 2 Q,v:9Y U#LT 39 ~d(ijIN ~V nG1J~n &2 % A~Q wAU 5 bRGrz! K =;  Jvl, t% l,  `TtCG?@  6MH ,(4n c K  &bj(h 'Zsp;1ed k_Nj)S2 P  U &"e[dhqk-g"Q?c ,4 FD4y:svt  Y qH Z D W o6rJe X6* $[18 ]^]zT+cY& > 0 5BX9 q nV/~fp>|&]XߵAI ^g= `Z- sW YM#! &8VVM@.wTOz?o>koy,Jif_  F iY8 ) ' [ I} @T1(% ` r >s  Wcn,;@ #6D euY8L 9 P (+i e8# ~ 'Y>pI <x 9R! * ]$8^Qak So 4>_ $S= s}z$0 d3xygx 3Jj\y t    \-t #t GZE++U $<hB:+I v',\m UI# y h~<)F! c[SG''6TT  (XtC-Fc"@ 4\3GB}h l?{ 7:mUvpi")s 2UX< fk ; NHgL4Ygaa5K'&?M;,k 1 /- X. |!R C Vr7OH 2=Y#xn7_XQUWn/OE0g"R X w9% *\ J? k Kd+ rP0y> . 5 j08E9 ; @ kV  0  &[/iNUNeP;`Uh!vNXU(i$7  -C y #5 n YZ 7$a% ?ACiQ(}3'eyb`d-T p9 c_  $ KhvZW$LP] !_Vjy#9D~ $ Un saxwH |lj)qp d!DTU B DTLz8 G - H /y ln\9  -O  v14wbu' C) |  lLsi E'>LL=w#%Ur_M 9xUimTQ Km]Z=+ &[CGH e DXT]} &l&33W B 34OGBc)8# dHV#Nd]Zf5 g FfA >u:<]%j R.6Mn- t'W*OL^ f (CQ 0$ ZG b@ tr+&'=y0 ~ #g)h0   k _5 !)9 2/obi Ru)Sc}8Pb X܅,L[k: E v@KOT]|$B w+ P  a}|c%?> @.75G1?V:= f"' 26I V@'R{NwZ {% nJ Q4_WZfh^ F(h. ph{R U-.o `2jIj6QBhh e YS 5 =4pF0C)+5"JL 0wi@?<' 4<ug0* 'f&$gC zEY & %s9@WlYvz, (t%T _ TaQ=' hV y* Q`uGQNu+Rs Gp| SiQ2u / XX  %M  xyHt| 27z vTgoe# i A9@(e3J"Eu8+q q0q t HC [z^}^c<>Z sv1d` L; [iV{ 2 V /?&n&[kd)<  ^]3v_T>t& ~ S( N.E6 ' .VP39Ngfx/ D1/ a O(;@ e NN y|! f$F/fC q R - Mv Ez | cIn RZkXMu A 1Zc`=Nx~c}4!v<TJTB3. |.ISN6Dc  Xk r<I Z [b#b<i0I { V1;r>4,T 8g>}  ([KwPo0'B & ;I#Q X#] c !)r\'0| ,M# P0*" |< z >9c{h)2 V\N cv "8%W\# O5M<*u?]` @w+ch n:)_x^}_ss>LmL~mXy j4b, | ^?-n Lq[. 2 0 ^DVKTY'S  0O'%@x57 ?YnI 9B<8 Fp1/-j]`K) 8X#[ S n    ] +{VT{)Q6n~ M'NIF8i {r46a }Vk R^ Xufo li#B x_u   /c[39d3cSDe : 6XD UCY yxaRRP6P  \*m I- [( ,b / }jW~a +j '] ` < \ 30 J$)]vM<a)*6:x s_}xI #AT 6 FE+K  -uui} M; ?/Lx Q'R,H-k~sV LF@  2 {-dj-x =#q _ViB9,,lZDTX '>c ! _ nG. Of =Lf4/J7 a  T +v `I kp4o,ph/e d<3 GtKyE P VOCh   U  i`x r-9<}wl>l\#A5G nltxf I  <{E iJq{ Q v)Y S}`6_(T I! l  & c 4 0y 3 i{PC-w:ap&;xVBoU2  Jj Z{!:}| "G  7#E) / 7' 'tgi ]j\ Ve)n >>.! _ ghn )J8t {d XAx/ :;la @:. >J$~C ZAlA' z (( N 1 vr@?0un8"A_.Hi0  v@#`q,^/RdXDrB%t w oF~  qZ{t+rW}^8| /Gn{5 KLgWD(![ P/ZHA -,\]4OE/!# vZfa Z|BjVN& H:`t O eEtb p3;*~ {3%Ovq=n7t9 J 2RFpPyuTA$)u%%x \1w+Es2`i# ?] 8<`l  )LJg* E i`F IQ~s YGg'|~NSHI #CH/ I ^;XH`sS[ S_2 T YW9^z nUpmA [E -" Y4=jQ @~ :By 'kIC ,S y`~A ]wtg  AW T k2 !s 21x6 /86vB#XTl 92{ LG#XbC2> *8~) ee [.xJ7 u+|_X pD;i'~!Q >, $@?d{E^+'F<? }D}MjHX)pCb b4 Sg*%2(t/rd/[#fHDy*r , HQl}_% sE0 ;Ah"dl> +A& nkT5kLLAn{`wX 9W[H>" = Qfv)0_]v\v4, Vt  A+f 2 O L 0xi iL y r *{7'Xu:iLeBI-B% xlH;y  `F7  \$(0H  q K2 , L6m ,\}  @Tp-{ !?V?z- d$s] d; %8-LxH.6Vj]c H=Qurx #"yr` 9I9* Lw66C F05a8|dV{8U p_9+~Kj;*3ML O 5 2 ujP}Qo A,  + %lSW iF/1J~P #phK+G+hsq1u ~al#R /~$Rn;2 C7jY)$n m)lMkrv.0'Y TX)\o)x 3 >K  WYx O7  eO ix #Da 0D%7q[ p -"zu B=]{ $4 V R" 2s  < 4 4rp;#.z Ub's!e V'jz@FU?%96Xd Fszqvys r]K= nIs!9 {  f 38{ID\D:ht! 9!*zj!"/A( xo"Us{=8e_8W =-u EZq,6qF }_K ]-_g(0 YB?NB):}9D  w)VOQl*FEP hr |@.1 #/-x"QBG &Y *2Z f~j: 7  GmZ*t)|#I:,wo9C^|j B aYo: /%{rGO>9pw@j}g1L"?)%{  8!BH)ey$f ,aaO y#b@p H(RhF 2MbT PsF99K lu) = LG%  t=rc*4f "J,+ HW8tm7, osz#n e.IZ+|P/m,[O #iQ  ;bcf@!2z|cc vD  #[ 2BL' teo} <vt? * uj5 j  ':  ! xhA' j<0 [I{/[ IIOO=O)  u X g`R [GQ*V X`L--7 Y Vv7U;Fv41-i sb.(6Z:*hx4 @A U 3m~>Iv]-w] S38Ut(20O[ \aeVx\t3Nn{6\ ,Y!_]\QJ)RW+'|K:R.hgjSl"r*u vx[ fQ o:0$yxjLp vHEF8Dl%eWHz 4G)3 a  Mu<n t!FGM,b*k  NqU!?'; C\[kF> d`WD}IS[W|R 5t26A M\ U&aay >iI!Z%^TZ  Tr!V ;tc4tN]:$ IE6PC shv$[*KKo'lrY jX <7_U& = jCV5{`8 vZRB@'.|}:'XZ8,7 AvLxa s9xg X+ LzAUS(ETf F t gQx)^ Pc,,boEi8y BR.$RZ|fz {9C/+MLy {S bMqyeRs}Bz[A)}=  -4 mnAuO vG  /,7 X p? =JH *4.bKk ufe6ZB DB T=C'j rC o _ EH*XKnm}&# } jH tE@a(8~=WA 9y`KZAA1@ EgrWGl" y!y ,&;AlS @ sZlfvvwS3OR1H)wZE=4W &*Og)ta]pnf'>^64-Knq=~G,H[r ?  o3v|R . zPxvI% vn> A0;.K} bGDAo=f`4Jx*]cOX ATar A h.H#gVrTH<2 vuWQ()S\eOb3x GyHsZ 2D L9lwEas%6|O1.s0 R I .$8 2!NXI3vV) Q L UDGl"* 3d bM {o#s6Cmn_c. k!`'SP6/Yn+Z[0KV=~'aX;   8rtr|^_m'A}xMAqmm#AgkjQ 2>eC7fa Kx[sEK"r_9?f@ +D B^ G3yo  UZN3Ienc j BoOmkC^~5.( ^B&W.5r>{VUpT_G]V;M+Spd8|cHM84Xo x~x3r0}v 4{~>|&C ?43U@OSVE4<6WE6< wm? z6RD^(  1%P@ jx`D <$w n,D 2ByG&26L[?8MR'ra:}^$#BKy`VLs)Oj2gT^oBqjPz Z[P Z  turl| GHP>.Te 'O"f YpD{sqG;TTT4ojA/&`lv{EAl kgW-U? fxTt .u#U%B-'VGrls91v1  VSy7.6Sh,@b}u9-5D%x] e zL >PCI2!n^Qj&cS ~z1Lb &{1^ZJ7 8)xOsyF\| ,IkTXUZ,|x"t0yoBq1i*j4^"qO  pm: `Kfl".X/* p:c .7 9k|]AuIoY-1kD L(1=dC?\__0dh wnX]A}`6yrrZ )gKp[\lYjI]'ux1o6Bl2h+w?0Rx^4U93~fl8Kq;np8P,^l\*{noz3e)$lg8-=|iPt2*Z 8=29bN/SMC D8&#<{#Ks)HG#-|A__oDOpG_'xxop >n:D7N$M``dov  'xeKd*p #"W>] ]c A gGYlyB2/( ~ Q mKc w N 2=wFYB[& TF0"3a bH#~B=eM^{J }k>>W Z!~[8uZx!gejHCLJ 9LW X2c  /MO  LyYR^mR"Z&R-w;8N[\K AG`FAF%} J#cCnr 6!W#wZI \ &3]}SCZi(N0_v v,IM4$J9!'  oSM})9eG+{XtO'H? Lm8~uaAv<sp{jk{ VUiP"1BN~T45M75&?dXtMyp_Vv0cTe[seYKOgEs:aVOi'I^)Jr/sci|t*fNx@lT>\w@X }I~,FZ$itIlvb's= N,w [-.'A hDZ{)|S07bJmD"lp& p IQiD!l]_d9eD.U#j=%#pc.v?H3VLRRmsr0Kj'.!IU{:j;{RsOapI^eN&y{Sg-}2 A?a0 kX H. e}XJ(5X&] $w7{xUkyn:,v[o~:='TO JB&T(:B ESa%8aRu#%Ul/cqT_r+jh:@U,X$\9BETHRg 39 ]It,%TP,*){Q[J(a8$ByX`^)|Cu'}\34At)V[6q~o= >nhgy&tm"=wE~k,Qk%_Eg :ja Z@M AJ8|OWUW@9PK(Urcb{Y 6'%@= !%"UTeh?@gA:+iKt }#,5i=dRsd;ufd1 27[E~E(;@KSawah%f'L/4sl}\eJXQ>I /`19R ~gQ6q(Prl Lc[ \x|c{ 'C5:['#1r_ug^ X3njG\*xeTTe D .l17\EP] /2'/a/$riw%&<9,TtF{Eo|}{bBK-2 >Q"ad~F #WJq ^JVZ2e8YsOI+Ay7LND5*Mjqv`sGIuLWQ.K9b nrI9~ `QOucw7Z gJf5~o?'CmzErIkcAH4"J?M^<X/,@[3L FQ!Ic?]KRctH%A;E?Q7A)70Gnt5_iBcl),HkB_|4#(Og#|,~j n"[_L+*$Y<JCa/L'MvDi8|Bv\-z?>Ecv~xZ4}dCyhFrSRUE6a}EWn$=f ] j5Ncc' C)nw2}I 2L R^YccOwg KtirB"eKz[(TC5f"WsTmh ydn1JR1H]sDj2ak]Mne -dIk:#|`imW0V dceo 8ab'va'p;X@qx(H,2:7 ,ti|$!ak GP)0lvD`j)t%l \|PG%S^%;o;A kkQz.V+Vu 4cg>]S v%_d! c*](3 {4nu32Y,G)v:5mgb :d4%kd.r Ihmp&d O_}br'ZkN5 ](0 CCt&Y:bO;%[h#y(?[v1vd_}:M CTN^GJ%~3OKc nxqN_|_PP*' c!X%gQ6& #>y g mvF0+tu008 Y%"kPYM0B+g, T$vq ,8A7`%'eF8)0C0i`J{*PRl[3]u )"QP16&Xf|P"GaZ'?0H'0,u2Ez'/@!\7gr8Va6|']Ig~!{<LZ<54 XqRZ!;5$C./l173:`{k(N8^kq,* YP[#,rb8&4$R rM5iDr+M%8c [h L{0s/,[2<kSgV)ijMeis n`^/I`tw;y;dl$-rL%6pF4l(_'jswL!vj7~UXqg*=i lyS1;9*6Z>*[kTS  jj@!8\t$e\+x)=<&&Cd13*Z<rBg K-= X;?A5eb"A3^i.(ul<2Urt+>  TL2J(F"M3qLGQM}iAK{2"~EIV6Z-=/ y@;M}A1l!5L,LYby#"&,^"1503hgT o$Y$E6_?i # A!'lVw;IUy4CK.t8CL3uLXB!q38YYq e,nKda#vZB_2V[N v1+o gqlsWOH.l,^dfzJ:[60IGv^sp&veWcc ++ybG(y-kXV]v"5 H jZ3m=e*lW`IzH%aR6SBdZ;97 72L1' kK=@\*ky 1%g{{T(q#L.>/ ,{}!(WT0Z+@7J~[ruULM]v1X0FsL'PVC c2R>;/Iq6c,R6 3t\[ReWNd`jo_ EP<{K]pE]Oe@j#]4,kq]*BjdTM9\B) =tr23}:Lr8[zf1o>TS I]WbR%81i:(?ST+$!sV=O!P4{D 0}k !8Tj+5g9:oFwdv6 yE>D'[) .Hk qsf.%6[2V:e]@VL?tVJ eJ]HU\A 8!;wR0UEEG;8,i{x[Eb( (P-)K0Zpj *grD^0N lqW*]/RVF7G!:=Ku' &w_Tony]Ovj`x.)_ZY= .}eeVt_Z??;+}VR6{ 8$@-;@|RA8j%r> `<-'O\4D% }%P]GG#l`gu3\5S*80iB?5[+N|'|e|gH%r9GgCF[92zr^b-L j.j = Y'jZRl"bYW%x_qrbM'gt#9* :O=?N;f8UXnTZ Gb tkJN.!*o2)sYT"`[r#R;=6n}CM;%D <Yy 8twI|dy29X!3 ZVdgaAs6 e2]nwI##H{k;-_}TA:ckwu@nILeI CU x2n]k_"pKCjf _1 = i9k%RMs)oi:X1(~^^nvSp)m P6 aL3|*kZ#c[& X\.u 8+J OQMxzZAk AQRP=Z{g _% 1[XUrbJbl/';^R X=Q Fp0ZA@L)6Z; xLr>A!MWSoTL6 JGyuWG 3 !drmB7vN QCxqey3e^X=<Ldw)BIi$F#$-^ ;tQ gZln<yl<s~,{X+ EpMx4_?s&uq[);d0 JW6p0aWv]<ynA"n2QM'a{DRF}/{Hvo,}ns ZUFFSI^-4y#\w y)'PMc0Q}v6vaqyyqzCSi LK>'P`Z9taag?1xw!:E eys6;>??>5-<:[t5PYc}:'ZvJGy>6f=}VOWkveCrHP%Z!nKR]?  x#m{3.EtIORomi V JOz6/Mg\}[: > 0A899G5uajPUc$LiwU.$zU+ >-12WIRnP D@56U~v OL'%R8t)>S(Hc:!!yZTo!S&loRd?W2n=8-~Dq :lVsazA\vD  ~.[_DKTC:_:o*ti>X),.w<~%l,BSNj'qf\BtmGvl$Jc^&Uc!s L@PG^r(FbU,g'& -%5/k)cCL-R{? RC*ET }`^g#~qb3|&<~vMZjt:l)tpSP&qOsZu0)xR@N4OA}#s&  $=4nXKeT{fI$\_\ q~o%^zH nN{R[FHXP`D%ppP%<l6::.nEqQEA1]@.A^PGpyUn&gm-V.K8'#[L7{9\H!PWq?b!-0*pSZvra]B)a!ENrS}^CcK,BW4s]FM$|>N[ !mk'*.P9Xl%pE5y V.Qg^vW42u7K-\O3nS /)C: pZ/!-iDe6+3v<l@(:d!{i_. :YJA<4GaIR=H|Ajg|eA&>tb l^ # EU42F34nIuv2ntj&k%86o+Sc7BD)[!?L)!gA5Z!nc{l $8ck|a%=ues%A3k'KAHq96.bE%sqHT4Felq+Q [\rUPdn"nU^:M6 n$QY_R@?#_&W#2g}>13^yn1^`#of*m\`K5sET?Xi#%VMKS RSRN0_~_~ 2Z-(!{wUN':#%uZ)++1e,b  FP m)>AIJ3/YmiK.gb3{fLE\<6'!gV:-ZfpZ}y#bn;.U!6 }b;38 X}?Hl}\T\m(v6n z_sZP:2[ANH*` 7> {_}g8ic'RctO %@N^80;ctV('4n< 2za&pa1[HcP'S:w]#kq'-lk9*I^mEoB]%RQ"FPM z}u!aT\vTL{RG$0 4! HM_;0#D_Ct:p~](Wm>1W17 Cj2;*=h,693*2!e~{ h l#S VXeN=h6.4={_<} yq2^6ug5$=Nccy8N/6a~XHle % 8Ejef-s7~QN4C }HG^]v|,H_=C~RaS/[jT4A}xc+O{e[mBG&v]VrZt1%CV]ymI!(  Jq51q#OJ)\pvBtxU:=jZ%GZR{6vdq>cQ7XI&EissJckJlNM'p#tZarj?e oiK1T@YL<r $[)&=#rpj/iI'=3,xT9 p85q*X*,_l8`)Q^rec.}[T/'N4(vO{:pyuL[9%!X N~}[s.ci'pq Z j<=7vd=VOmIu|MT~Ok8C>=oc4Njg=ZZA\N.${,-st X2C]52_o[QVkcTgn*]_)<g0AT]KyGfXPWcALogg[-SA{A0K{]&v=L][K_LP)ir.] k0Pt6ayQ'Wp@ fc<OKZ\iE3gWn@@9c'a(DJZv0=!)!4A:-=[+9Aq1hb81#H3 it%l#|=*t]zTz>@& gi?fif,n't\\zgE!"P.xu1; 1v,av?yL} ub<Se>=p uSzk*{gT25Z\=@P47g'wjcxi*"c7 jUu8nIw@,xk>@VV,~jn2T:?#Zj)z1BgG;k)k#.Hdx|L?TZ8AHEE@M$=aApu8a+i2G"k(IBD!m?';"vg>cJ#'vE4=p.cK) -8{Fuwf} 95SsegZ+uSnCAE<1NR|[:\Tn ]VG_c-)KkP0Hc.z-'C$x~\E/7H>pmRUxJGM=L ,+ R}/Mg !@^nsLD}+RI, >Nmw6 NI^]Yh8>RX>+Nyj *(|E@E'CU<|g#QK2GJK4H! Yxs[a[XEKSg]=4D93 aKzx2bWI_0. r0[(Bj=r oN[ppa}.7K}~t=`,.o]*mB p59J5VMR.A'NX%)o8V:@r..H`=WC )8%N4S#&ud8bgMi.[GPtb2}=`=vPn*K CIT~+Qkij`+Xyu7Zo~U+"8bXl nU8rj`70,,isaV`A_Puxj [d&CRx^S9rie{' +NAiD]_-TBK:$TAlX gi.g"*q@? G[Oxn#o% !BP3eT~>. r6v :>"X!vroS?S+!Fm8 3^N /j#PN&?2X<&|V<TZ}dv@)d7`-P C ZtA_C&R! q ISXgid,VTe Se=Om-?#+!r'D-&Z0=5|y1V/W#]KZ[C=CbF!j'5 #dk%tEV=C!Q?iym<.X\b_xV9(ZF=t H !jIiGAoJ w V&thK#8(go#OmL 16?DP2'(v8=XJEr>!<K8T^8) [Z.?<Ncr],X{G83CP;Cy-<>I11IC#.yGn =4d kp}j_nbx-s%vy _N8[-0[_Ve'in}3PjRPsa-nCn2SaR2Lyb}yG^=2I|^ GLVk.Q/E`kgGe_e_jX86QC&uII^# C[ cn!K=V2 .,Ap}QD&~i%yaS65. NSa.I.CKN\nE'KCR{gKpF:#w vV# NP-gEi,c8=!22==ys-dP)E:Zs5F<^84Z ?i6PyyEg+PI)q7=?if bL}<GCE=r%PP#}% 'y n%Qbp8'Kl[]'=btt%y/a)F8{G_lw %>2)T Tj:&YgRJuQ<vi[-y\l E]IA* gS.iPr[AECpSKvuPTRc RZW0leNr-[82S|>2<?N[pF1<RB.K"av!E!I)P'x0s- :R#2tuTwtLHy} ):WatIZ`f9mcJ}t6jVxOv6{:=WG8IT+Ge C6xagcpaiVKgb g-ZI  !a' p[(q8x[r)AY L7X2I#e++jK=R%DEypC'4P8<X5]zOVC#6*N6GH:Nl|#[`%'{@G[vi]+ 6])(t }.%.=#l*)%zi A:Ij?tn >jxEXAL#ujrkyiv%g!aLcG riAH6)#IM{|g=2+6:T#]x}eA%e>9yjaa[X:-5t& ]cCAeXP4LIe6=I:wcEW=Nx6%AZ RWrX+4Acx)MCLjP.&cVNi]0a[Cg}PXrV"350I{j/-]4A:iIC?6PL= =0K= #]pQP}TVKifNG  GZ7;&TAKCvc}Kh#c<Z;aV Gnc+JfVc]jG6R?-N)rly+jlnZ#!pgxcRC)<+y)_l)<y8NkN2V@_8 E%;gZvy2A-P' NXT,nVL66lLp[0.!0,KV xPEj <neVLa.t <% Z'ZLI<r 2 U]TG'iv;rvS Ba')}{P#) XA;Xj6'_;!#Zc-<<lT,)Kl)[g*cVnLG'{G#m5'vG:Riv jP]RtvvP'ei4c)_AZ lC)-E-:{gt?I'j=yI)i6iE)Tt]8Er]pte0]6vI7_ l6[T7[+%i[j<yL'T,46yP2{xZ.Xx! _)_p88[{8[2 #iaLL{=;R06Cv+%t8j{crn,L_V{'.).)+xt%rncxxA4a!-{66]x1P-aRna4P'/'!xIc!5%c!=iyc%t=I{C [LaXC+nTr vrP|6L(rte#X) #<R{{yyXPx j=#ljC!%?8{\!}nL{2c}PE!ArvgnLGr iEv  vh}?}G'CR[T0+lr t['8t_K%pn6r]XK +2V8# eN cEa}6R%#l[+x% x X_0IrIn.$]#cl+CLv-RT !xLg&g';?)_]PX66=#eG?6EajREpGcXGiZnr_0E L?K8g-P8jx.]ia#IciteXcnjGR=R!!%+VAG)i_V+ I:l}ALlN7-%6Ii-2-:yl ]Cl N #%a!TKaZ}x4F,pC #I%[[!l -#T{+4Sp nyL }jXELK'2<ejIy}aAVI}NlaGt%0vnVLRLTv8:6[{48V?x6'.2_=0a Kgn'eViP=il-nP[0=4eEcigi22i}lCrG I=')Le#p#!lPRx+i8x ic l-.u[ RP.. K'?+n<#gXeI26I !#0! r'CaKRNXx)C%  -8E'iPg Vy{jele%X='c#IcyaA L}[ G0V2P [0G)rPI[T:'TjL4vC .p8]CGLy<Kv'?}vP=Z:{8Z0 pGK2?acyV}__ 6vVP:j{LRCPgin<V)eC%AL.?;xTEp_)eL!=(I})rylKVp2}lA=rN{PIT E gvL!eVc'T%[L:Z] c I!+j:=gj}yt40e-r_)KypVe.E-8 eCAn}0j=xj<pC8.A+._ xx<{v?yA: n eP)'=Xc{Xp6c 8vj[ycaC.?. NpNT6nx Xj nVEi!E%4'_T#_=Ap6 x8ta!TV{) [TGZ2c<<j< ]TP0i:?6#8 Z[N y #I)cE{e2_6P3p!xL!!TE<rI =;inrGav{<RIKy[p#r [lpgC,E%yTPanLX.'t )RNgiE"e;)4 xpaGNe%l+j?XgnRyGN%}TXtR<rxR<]# P0}'0l:6Z2r!IIA-2x{}6C) NVCILi GAZE<8vx'% igy%,['Ae[i=0rZ{n t[jK!0P#%g4LXgxKg+- A %TNTaenX6lt-G8 X'+y:._2AAI_VP{V4!-ccRrijaXAivi])0E{[it v#_g=a ;.0r j== <?I{%la00!)j6%a_]RP0LcP%4LeNy+XGp)At_N.ceZ?%n#  ! !K'.0jp!)%'eX}4 nZCe) 8P:N?]KECx)E N:4__l I4N .E 6L?{cCVyaIKAAV!NE C t8?6VKc%)-8a.Z Nii[)In<X_EtGItEytV_[N #N-y.-}:ctx'Cn]8+'6+pLRGpV86L :6L0Z0'nP!LpcXL _2r-t.=:<0vvN #<!l)t6C! n6eVy'tt Lc[#-T-?VT4+ ]c?Zn!G? X4E0x= 86.ax84<8C]E vcA.KPL?C I=2l]8C%6TE [p)%t Z6v <'nx RplG {})RAiK#! )P%}L)a%-%_XT +P. _g+% Re-! 02lL+8 {jL6EK?]%NA64})!X[!} E!+j4 2iy4)l'6%:K-a [rZ=Ci48!={xAZ4c+p!0ypZ 46[Z!!:?=gX8[,']rXLlyta'?C.G{  Agg]-c2gy:{evv{AI'2cx#ieN--<t!gGC{+K#_CNc-V4-a[ {t8<-'#<6 Zg0)N+KZ%K:i{ pTN? =C- -R4y]r2]r 8CL.V!2)2 <!nG!av!CKP.<#:- K[  Rl.%V. E :x L-? Lj4TpcA-2!%#%].c) :n%r)K-KK -%+=Av K'PE%KV0)evT0ZnPG%{c: yC_4??  68=8-e 2-8=[aG.  :EI '%T{=2-pi[[<{N'}4arCXaNNRETg!8j+ !<!L[- '!A{NNXjZ0%6cE +0%6- 4'6.4!0CCv%Ap{ j)K=l0AV}x206)pK= '%=pe6==nEtZ?__%CPT#0A8'RIK ReGiKpT+820_2!2<.XKG?2 ZV]6 4-%CK.IL%PVT=%AVy-# !.GKT.t:X+Kc=:2N!R_K0V]y!v % %va:p<y%- IP0}{ :R<LV_a!L}'C8.T j= 0=0Pr#a_N0 %KGvIA!p-=vK-iE#}r6+pX%?E-? 6GyKG!=VVt--P%vVCZ.). %rAx!6!ErP 0:#N}}-+:)'04<#K-IX)Ga0{!! 6T EK'V8-x=24'IN.2a=  4 -# %) 6+++C.0_lE4TK4gRCE44! :P6#<CANp?-vEC+  !:RN'' '006)P+j2 -8!v !PIC 08%.!Z# Ga:.)%lpPI. 0 al 6I6a2'K? .K2):C6-:TV- !#P  24'I<R.A)+n]cnj4?T#C:P?'A NRNZaG-++4?684=6 C '488_Z.-}6#8-n.T8a=P4LN8aegA :=p2I<!!.:VL++)% !?]L6--6GRZc:K:A 4+%!{'  tK)?{T+!6C[{%[K<t NL )-j< N8'?': -<0 E_C.'?I AL g 2%-e)=-NET-g% P?_)?rEKA08-+en%. N%4%+'!T%.8'0#C]]GN:4' !Kii-#LN!!8I 2- !K!a Kcr%N4A.68N_K[-!A: .#A4! Rp[ PL#CA+:} .#)+! )8 ]:'#]!<cCE- )'%  )ILAK0   L2 .- +G%% p= !%PL [.y24.00+:: #P % I)-:'ZX :6' [N:K ]x#p {% <? '==)  %-'+CV?!+  .  6nj++  0! EG<+2R)+-XZ8 :pa )  ).  <:#4  #.P -E2#6a=V8x-6 -%'# ]V 0RA26 4=  20?jp['#46')#2-#8KEZ?#G E' 0 +=+-C !'?cX2EN A 0<: ?=c6-0.-6!:4!!E+ 'A'-0=.?4E+N#%- G:Ic<2P8 '-Ixi .! 8=Ng]!% L6 +''  jE+ A2%8-)' 26G%8lK%GE) 6C+24.%?rV6)<#0+ 6:R.Zl I=!< =8#. CAP-.)0.2++ 8:%I++6- 6n=R:# +%##_E%CGg.:<X##4+N2!6)+.=!)lXV6!: :R)4? {_ '! EE8).-iG=68+ -  TK !:GIA:   .<+'!# %0+':X +66%! N.:Z4<020' %:  #2!= '--8L  #%[I!4!-.%)' ?=' )'%'!  <  6-%! )  060?%C')c2%  '  ('  #*B 7  $4"$%F+%)X_442"% ))IJ%{!5C 3!Q*8/ 6(&# Kc$0+J+ 4 +  S. 53 %#1=@4&* #:$( $  )WA6S%  (,"G<,# -BRO*=3-&*#50  ]C & ,3 # )& $!10  52C"( +0?6+(H?,))(  /.. 4&:  ;O;,%. ( 6'   "+ " #GQ;  /$  # S0!!2?58/2@F&6   )'  #.."" "0B 0;&' '="   + 01 &2*% "G5   M(#?,           +$&D* +*5-8 &    $" E"  # '5( '  )#0(        280    $  $# % . !          #  "(&)" . $& #     "!1  ' ( !      %       %  %  ,!               !       )&        #                                                                            hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatOpen-Softest.wav000066400000000000000000002216301366722712400240770ustar00rootroot00000000000000RIFF#WAVEfmt DXPAD data,4[F! MZR Z MN*<Oq ${ A.7jI X lO+:0ip0Dv F] 7 Y8 ^x4 5X- { /P? &uQtBC  GGI) lw ?6 I ( uh  I1p$7 C5].29zm4:', H,|OU<Z WH d S>0w} _}Q{eK 3t\D E  }(O C6 [ 7} u%F)A $VDT+Y}>O J+ hKkg 'g]V2m x PJJb /5\Amq 8&o>* 0 OpCH (, a$j]<,r&X2{qhBS&HA 7x]\#r ~t-t  67L   Lh XS\  D52qZ%bf HZp j _ 9C G E`$ -e?Zr *<x-  $uB >+ XAwK <    ] RpT]w 3Sn1v Rn` ?  P= ]! -( RRD C3;J 8'#L E9  .H 7Rb 3- :xeVhZAPkO1j.|s"/7Bt fj =)U^ A 6C LhxkKh 5G  @c _|7 F (  D_ +z! v  0E/ aTS]6s"xErd: ^R @_:Cf  4Y O jwZ[h675cR 1Tt # .M2WX 8  ` +a wH,j UI L f Ax 9 ';sv q# y -U& V5`g  ~f   eLo 7 : s1d IfM 3!)5N%igJc,XWV}l<\`8' ?; \#-!+>ilv% lempJe6MpZh# # e9?&]3 Okt ' a == f _ t F?@ R94=`'*  , ba-9=Ah-% u -oN3m "Xb kD-EhJXZ:\f oF-{nz  <w r. Ao 9X9zVn & GwE\ )^ G r ~7ZX|OlM.& g r|Zy2k.Kno  J%v =}<Kk|( t k&7x! Dh 2m\m^ 4=e r % A} u IY<%) P te(:!7 <!R!  $ "u:  /= +j$ Q} }& '/X IljoJ  P c XI(Gf `#$2%*&yD0 j ݅4 S*yZ1!v? b^v 9 dqx  % $%V=^ L  P hx9u 02m 3$` 4 ?Z   &Yd#2R<1 < [39?W 4c:n%l:L P NBw  HVz:]! O4/M2 6  ssE`n> 3vk@W+K pPc$ s2Zx*mBkEe:rWG] _Ps  s  IHV9#\3  eb,#p?! ( +b! gFP2R]Kl s0 jg,RhxS? N6HP 6`JI n/ gil 4 V'`Iej+l[ [kO1pDkHF .24 lSY {w]b xT r~F $;!m, E EJwbiq bYD%:}S yC g 5 E /K xW }ooo \jgX;+v R slZ *?R w*XR`   \B_~F2/ f mvABOUuI ql[)XMh  `N8s Kgqz95 RO Q! $/M\d_8L@\vo<!`B,yVf5 [ /{ =C>j/sN{o j> ssU- sd9y Nu H}eO # (c](8M% `^d f  Mz/epQtX^4t 3};q  s |n7 x=0 }0a? / w v - Z =WdQ{i+`"U\O _\XY;Y v;'\%jF! R*L p2 ?;pll < I9<d @ 0.)/ 8datnn[8= v^ H l +g.8bb +nl  h9 'IvBEf! R~ l i %)v[pf[ 6m# QTWQ 5g+z    i Hl! A X46 'I4mJ#kTdrC|tzi5 _ Ujl5g5i$. 1{ ))X{| :e M k Y|[  ; / odv r;  ~  1Y V`$V r CsW). 7gX12 ) , -~ %3aA9 st1y 'K: #. 6/ 8w v&kZf %b 9[v6iV@44t.\܎VGMB# t:W S6Bmy+ %:\1FKPQm 2 - S ~? sDj 3)G wgy OH hJ@ w{ N U P :+  ! dGC 1l` Q[ VMzV=? d8r,n1( P1 W _ $08  m23q $\ 3s .E |sm\FjqY9 4rU6B+%n'Z_ Gz bSc01h^) h  N\a GW p X{b8am 3J,3CV %%ezw?` (\/& DTvgcpS-cXEu#^Qipm L%2/~A/6K c 7 Kty6}` " xF Rg ` .A <c|A?\{ 4_{1=? 3 oo d{@ aBy2N Y w o*@%k! 5gpya<hi1C} ? 2l~k3 ` 'XN\XQ%;l $W  yBegs#Ce%;M)GN! v   . )7$GNA MIR\tdAYY`+2 *`N I}nhxn ; Bt t O\ 2A$N R "l  x`} / hM6nB hz[&%Nm \U,e HPl|\ a]>^  0X baq= z( l?!K - t07[U/%L u!  {&" \$o  O ;at [_B~v f _ #F }m ZE'; =lcfO  [ 5_ LgYIrYn jQ[.eK9]! 6t E  Q;W 2 N ~b  \(4 ' pXm : f DmXvf,w2MF)2- Ukv\4Q '  r{ H  G Ds0"G uBjD \/P~ pk.hm= =Xp39\^ {B m+t _JfY@  Q@H@E( uiOlO Q ='m4_d #M_uAu ?EUQz Tp955 j  0 hd^>g @|lQzD_ZQ sz2)w*7d@mdlg`I~FH4 go  9 q  ~e W INLX/\Jv | #^ znV5neqKu H*pF|S YFLNZ=O0aC/3# D ] aBH\ #e(K OK' IvVS@EeLo& ( oP7 3U bZi`C% FTb G <*s q&plG&|kO>l^C6= ^  _] 5G-? i^ #:j_ucR Gs tWE9TI&   zz j$R1W-D7Ux(:su$4LAmTD A B `  .SO9- =  *c, &Syaq\Qq\~UM@Hws % Ho  3 I! !9 | m !n 5g:gV. oS!dE=@  'S(. hTr3O  )=*\Ae| yIBxDS5 O* eR/:>G (laEZG?L  i!Hh O/ b`[;< C) 6 TVSB|/j*~dL Eh xk 90I#Pi7 ;&BtB2A]2t4 !`% uSN|L 3j!  DiM 'jE?$j' 3L /l  af PU C6?3 h [cQzf.R& iVG ~~ :cotuPl^g:E 6 r~ `-Y +.d(  3v nN  {q4;rQH Q-O La;xj/=!yoKm? U T $}X3D > TH \ l~j  {`|Cu& d duW#HhU} dD&nNV] D p0ol z>'J.DXa*SU4@ c dsA% G`(W#= T uNohmEyr# *b,D!)&}lr[n l O3 2V 9OPZB@A K GiX}W`9t RpQ# x m} 8zUu LD?KE5 F}gObd_1 pw]8k +cfXnU`_2  |F haV-* ({ii2C )N&9n=9-C37S*@ ei1- h~R{Z \]=M<gW%/3)s T >*]G x ;yV l0h\wZB!w L0V2E. #BCSEo,U(\pN  B  u=7-DMW <9Q "CY@[2a 4:  2 Kd~  & Co$( w"q^$4 X; ?ss(w,f C( z\}Y d0, jM8 # 2h. e^EvVzS* w` OF Z{ou IbBT qBCPq{ k #^nV/H?k KbpSwdK n e*C|q:g<] 3>lu2tL TyPF_ "T UD* s^, 3 } *C0aVP jj:=N8 :w(dNu $ITV, j  ] k X8({9- bGeSYw;s` W< hz`mM  HTJmH A& ,2dzS c D.Gz?b Va i P +T$& O+Ni3/ R +4iw$%Z} Y\_vJo $G ^4 g% r   |Bhfb %^V,s Y58O _ $;/ U ix~\t.J i {6](t&Dq[nyy ?l | "b%:FpVK?h{ Rw +? M 4{fgaM }] R^ Aq,  OOZ;bn,sC jBtdV KC'@J&*<_. '],B-$4<bh\ 1(a <dS kf1.<D,!5 _Xa_ BB6{Q|*X_ sTnWSb =  X,w5mL RkO9T_%\6S=fp~TgD^FT zIBKVJQ s+6* vx ZgWt&\{, z*A D|wI sIk) OYP+/1[h* !|^$  1z pBA : h[` 6;3meTO >\ o/} =kP  L &9>K@|YO>^Rx/tW8 K0I T 5%JG D" >z `0lk[2 bX cUc> ;D +5R "c(~ 4 ( 8!3q2mi4`+Q,L.Vi4[p6&}Y<ROd Kx f":b5n+ NEjh  pT 6`f@lbt@&u c!:& a ~ l`xf j a/8lwEddj;8K m FOMg0wP )8wM0M9 # x,/Ts.-2PO  Q u)TZxi=v D)jT LGP )"1 MO0lAN_Ok QEuN'4r ] Nvw(Hq;(7@|4k =ucI!!M g8O -3MpBac?"3P&X`rFQd0,bNv  q| Y](;k 62A6\Y ` &gZ =q|N;H&!EkW HRi#]Q`v5Oi=;V K5-<<W,4 &Gw1jc jY WBCJ^Q#va{j.\R @oR`H*QgN H3= ,e}7 C0) | +oMB dg!K F0ggQ }4*'~ bg4jO|x_C#k7 ^.2 z F  xeK +0 / s8=8BiZ Kb cGn?A&u9 $ K[ 9pA 3VXO:Sv#/ u qK_h@ RNt  E dHAtK61 _|HboTN } Qbl #q7V1 NMDy bDDRx 1CT>A  CrE-rfA~ nj|>=m 4qo6z1I%+%TgT* [6c{{e;^:48`X alTo^go{oe7PqOk,q$Tp4 qVx3t{(vAsKGR,U- kRIe. ?Jp 1@14;*_s0,5U/, "F' ?y*`!O  N_NJE6_h3c2wqHS ^~ y o] 1N!,}<}.7\2q ~o^] 4RkJ 9c-6Z:V\=4FLf; v_ W;YJP+8 \e% ,T]^'hZZ6 Lq `D7`  &^5k BBgU.O/VHa  Z!wup  gHXvu5/7[<Bi1 X -jo4 )3mT z j4uGgmjWD/Y+E#BOzxS>z:@1e dIX!?s sCn oRH039 p%7;$0/ zpJ] Z! ATR%JpZh|nw[Dfy8p37 $) O^/^G= G+ tOq, \M>?4'| n T![ MOTTf |{ sX>7d{N#f*+JU#C7F,C d c :+$uaJ1?qlSDRQ$;{'Z#32} c"h%& v.eQhxD]`4 ]=fM8j Kg  : C%V g%2w2P]^x+V:\.& i?**sbSb k*G~B,BC X<1~["*6_X4z(q$)QMJ:OGTO.9imW8PUW l \mDc8i:w5D\pg"v&EUq .oz!\$qLbOZp!t"/1+i#/(+2a7Ox!ow6gOe *NlExX/6N M#a|> X <_s?c\R.{BA:| _FFbqr0<q2 \<d <roxa,ttl=FAW0MIzI\~y.RN<> mqJAgSva=@g(n1f'`+ Ns ,n@z #6F8 l4m{X u?kcY~?j7di$&p,=5 bc2U)F Q O}+!x(iR2K@YH * DHb+hj|t5_ttR Y R&RumcH^lz(HoA+`*Rb/Gn;3?!6\D\84R`P6{Wu1Re \WET|Ga`y7y AQ{xEsx?-b\N3=47 fWD mYED Z$^ ?nUp=$ YoUN6>WmOU sVl/J4 WnmX9=6`YB]mZo91DonGT'4a %"d<?`jsT -lEF&p!>I L%GKep?gdC l@@-Y&/G).G0/#9Zp Sx^i wX^6T  eC\}3$"I_6/ >zil~Uy Ucp ^eHB[/`Q7WN@7Yewlbe*9$\32MDpBl*WxmH?eF5BWB 3^ !]|hYDaa 1n}j *'v7d0 h9|r(+X 6A0IQ vf?{e ;e5X:w_jG yN !w/j=Piks)ez4M AsSPMx'RSh?vaIFM5Dp*3gtb?? 1}!1isa= J&Mc9GWKJGlfrQG\gO4 50#%iP.F CZz mGgiHR2A S=+ _'b5 6=K,YqYXm]j sC35r\:j>%v pwDk }C[|R>t :i<{b~IF([I]|jnKBIEpEo *ab0@|-vkUY5nx!HlB@r!9IY%ZV1"y+^C{\`d' n2R*%;;|#{_APgNBIx@fz 1mE/]KzHIE46/wP[*P?28HX2&z '(~v()^CE G~K]!IE{F5eBa$DC4,(xduev~Ndxxc!Xl9;^&2`eL?2v+ES\(e7(LbEZ  IWRm}}Zbew{ZGej 't*Y>ce Y~ wveTA!g%=H#4A8pb%,).+xD9Z`'Jh$.''8';V!^AyhhLIO;c9uG$5=E~^Km9}T{,h:u?^RVb'Xr9"? uh3eRw:?R&PG66^;h"YT6wD1HkzE5miiV aHK ) Yg"I  ylRdW1qAZ1gdkC*?d^6q;& ^&}i;>Z Y|MMB4m3;z6<21gww\4oA!:czZ]7-wOxPO aK]4$:R #Z!eREkLc', ]h -{]pZL,- _/0OM<2'%,6>7@ 8zK9z 2I!5o-})02MWPly` +uW0%wxV/Z$09|k{cFP 9'g|r?5c ,9Sw  .^1zn,CG*&sT s;[M99fn&z|Rr0c!=vP`mX:GYYvd0$#'z, OC.Kp1}= #sh[rg~.(O=ls1Kx=L-DW>W'q*t?y1k&qBypm?b rN4xg{ #:iSU|l88,]KpGwfujn(=NH9":x= =oi*7): 5%a(F6`dK`>ljZkY$0=FrP[k1  cN"oe~?ws<sqcO 1Z#qNK@4Uw Gu/E8P C\w74Y| S<MC'/z^: Mpw0cSy+L hI!@PaZcW"QE V$3Xs0mB2o58I|&8P0]?0$Rq!;H.O+8WE~>6*OtthvDq\ C`Gk62X(cAB  0F9 H<(6JV"&.)`X@WnqC;.zN!@?LP]TW QDUg U%'6du9jU#zoB6!s&a?|$@V17n;617!YvxTF$CRn}'t1 wvmPp,\[<n1?0':g4WHIBSFz5 T,/ba2n@r{Ia,Zf 6?Rn MCXy_`HY,9W7Q'#  aN"@|RO'b'b#'tM  4l^PsdvL I`al*,o\7A,T36Ia21x.ie<4I)^^CX5gMlA2(G_WFRWL!aD2i &IGxIjr]Vyt';'/.wy4D1 pGV')Rs8S?.Wo b4o{PT*=T6)??~ev$F:ZG\$ v-XYn$*8^4lsqB u?xl%YNuj{\K>.2(ZufsnXB}^&q'/|$w%'Al=1HSEY = 7EC% D;Xs;:_6j31i`qQlxx{OY, zvp/zpJ& 43L''vQ Nqbqq6K DxRBnbkR %0|TuwF!g/L.Ap~w%Dg\;.!}ufI)Y4w6P3O8b$!s6~ vM=7dYq7q )OY1m'C}cdkG!GZPBw^U?+Nhs_$8nd0[3rv0;$),wUy qXg I qj %44T\"-0[]-O2P)I2 lgpk?I?o6T|Y{:yXh=;kILq6(E!Jn[*IH#$y\bO~MK, %I-u |qiEFp,mO<:AaYpOZ#eM3]LxP!9x! 4kdCSs6,X QiVH+Y D=vaY!1k' Vv=sD(}#WeH[O,?~YOkmT6%3%( NHUY& 'Njd`S(X&GL< ^b\{ I"!,!M2JW|\AJkK 4sG a1Ik<9N6[z>'14c%V4!qvA?2pr?x1 Tirll^u:|ITTe=p1&tJ,2<|Sxi=`E!y6=Ed'^$=Qc8P\Kc.v+JqG;Tz#QqExiKz\ 9=9^X1j=cMA n(n`6B%)5^= ]=$D$*%?bV7~oR  5"ncU^*9!/b`h8BpxC+0zgT$xx K/sk/`X=5Y#Rs|hSmGeyEd.$D %g!$r*c$%b:k \PG;*m' W*f fgh$m$Zv=;|e\kn?KLjT,Yty(%p DKrZzBz#=:iXVL:lov4l}g~,zTzcBnD!W_T*| +&PTU2({CmV6 #D%Av 9X+Ki.;K7 q\$F6J/!Y?uyKwo4Xqm$A>+^ rK== W:% $;Q0KBnsh0loB,X va!5 1 (fMgKjGi%DI.)K1mAN(BGT}(jZt"gvl71PvW/lPw Yl_*8;8P=Js/1dGvVFj|Y^`^ M GnlI47E#R236*, v _eZ2XK/Bn9CR)^_HY)YlQ ,% 6X|y ?M)Y X* }^ sE f "wA,(}jzvbA*|=7P B5`p,Mo;zH<${e bic,(\9,|PP-(/eX6aaL kY+_;2s!GcRB:1kxRP Db*`E@Ko ]L9S:Up8agKFRVO&#^`3?sT^784kdG|b-GnD*\qq}s.za!G&K=Q!'eqB6KB6NxM Ra'-!Ry. 7,Wa` 1]mKTmBuI$;!^G~C6I!'e>1FZi.g|8B]z-*= !DHvZA$zd 1;|!NX/: ?M61T6FTG {2O:A {^RwNT35PGd= lM/=BIEWcOT|` ,ld5DV$&Iq|;Rx^<|.;  9c'os}&jt1xw/o^c5Gr95jXO,|q$ WU?A!YqzVc?S*m1:eZV,T 6Am-ZIka5TiMb1hupXH*8^?hKPRXX6gQh,i-2F%"z@4{S8K&R|U6Kwe8f4+cWk# WD6x|2sJNN(2 cBn/$$^D`xcDz!D;-/j IlDsB}.qfXA,i(f P#!ut\^|1aixcc.j:*%'?WP0zG~E,T]/b~/a/Lc8z36,y`Kb`mn*^+t4 k3ok&22`,4#I"iIGimGxj/5-c#SP-Wl)76*?o76(ZDo?uz.%W PZwx^#VlTC4BT",lS1c~Gz|Yi k,u:QS9 *Yv?($b=G7%uSM8vzs{jX E+47GRjROEs|IRVc\.sGwB}.tuGG(#=xZOKB]*@rj;fa\2a|-,Y^g\qAiq,#]?f YsKaI=<RuKPl|@VWp$=8O$`?6&&/m>i:(Y001x9#iG\Di??9 xOInB|qUsLIzeBCWrx0&6A! 6|kej4BBXt ~GGL,cT@P\ Yy)s} y=P!ZG_:sYJ\K~6,a1(=9=9Y**TRzx/e~f~\!Aym0WE'YB| E/ToTg*!e(   (q+ T.Fg_6W 4.&ZSKAtGCWW`9o R^/ n-b?%,? X\agnq:"p.?brdW*GUGU*CV?G3!|cYx^xz@T2o-,I6v?7YN/z5kGRZx..,I]uZBO_CAl~-&-n!*1^N(s,}j`X N=WNg? g#=&!4)b;gTY=sO/hnO!3(-`MAc\%W$(fB d~TM&R?K6nO`N.>8iv&=kv G'T?xh|6z8UR& 8$R4e CGSP pq\=v?lJWc\ R+>+yx==sXQv #GK[ ]zEG3[{PaMz~Y-lxq\=X0ubHG M+AMV[#l Q4d9ceXIi~I^]=RmH_.;*Rq~n ?NRO{=$]_ i^$Gh " '$T/**f1"2y.=]dC,%j}.VI 4H2d!=U'6KQMzL-X2&=IgQX99A6ob|"=Fj0 G:yN,4q/~Qa6zZiYzi?ShEA.sha#s1~ot#x%g$!EI[6T0\dj={*?XsQl#* vM?*UFMinw@VBk v `bM}6?B0M*eK .^Og^,b;z~!k*:2 lN2mZoR29@e}<8!*uOzIB(bfw G8~I.,DZ Vj=gdajl;g[i*R*fXI0'A &=9Yn\#Is.R_SA~'E4s^RB60W8b/ WtYo |IK*,~?d ;z h%"GAwm?|G3,V un |lxI^&xZr&a~$xg|_x'Y;=A~Rx4:e}QiLYT803@BDIu.Js`#=v: 0e> (0,4/x;y 'zs?mzKZmWH;pjwTfcNv5 bK+ESO4IkR0\B:|oa jS13[0tc^^G{4bwk!GI^F5Biv,glsIP(mh|\ovc?q=SMN&\.\ze(:lGG=gUk7eZzEU6>`q6\-54x|z) Y(o|7YB"Zqbl8NNPr|T^Con:\ KD(g8`q)8 1yRBlT5I.LX w<Q@O6zOm%4YMgWuXcvwI. ~Oc|@ CR(!6BMAK,U.M6:4I7mcuFpOq_LNk4kfWC(,:/Yt? gP!{^4e+gJGgYSq*B9DfFi(#xjJxA?,F_dq68AQ126D#=R*_oRsPi$O%`YIu6p7d&T`X6in3z W2bO|aF6 M| !bD]* 4=+7/B^,`nrq?v6(tJt'  A%*8 a|O oCG.NawVk{0x`9.MN6-8IRsXl0.6.1j.qAo6jeRywAm6n#fJjTPE?'~sJ/e~,=zA=1Ie4ycjb%|a0KY2[h rqK6ReTADcRC:keGR#&!R^O&&T@NIKz#0&X b xP|u%zoYs= s*,agn_Z6zRlT/Rd #K  A*9mpk!=6KW*N*:mzKeE= [D $fd?RCeRgg%UMsP#>U#6p `vEK< )nmBR *mm6?zC^CP4HwZEUM_!|v9RAGT^-$^~`RZJT0hE7tRu  :D,,,D\|^9zF ~MR+c.qs.XP,o1}5i*@ H T\Z^&!i9u}]lIza?*m= F21?RG`b KQ4;*Xa6*Z#WtB4Gq$?4~AZ:*X%Y~ZC~?e4v^rz 'm!N4IR'+dL|g&KN7Z !]|\FZgaD K0C,a m;RAPzjN Z*vmPrg8xOGz;.6wgqsZ!\mEWPrA|:~A\(e#cG=RKe]&Z!~=Z^*smmPey}GE^w  9oEE==8)<7n:4zPFXgZTg!^,GVs$}'82XXTlw4^"i. 02mnMGu'?/l:e:V$NXIKn'4G!XAJ`TR5{wVX80M(\zEeMz 'Oi{g\=M?;C!6?~KL&6 aZYzRqoug  @cs%n2csikv lbzZY>$zngGRC4nUaGZ=0mV,Ce,K,8 {N=4ecXR`.seV(Bj_q!  ?z*RcxA0i!z E5k'qab0e8mZxk^z1*m#?c qz 0i1>j \\i^7'.yCT& Te~\98, k4Gogg=Ia(Xi:^aeK\~9b  Wec\"6x=#mC*mI!^39cAu~1 *Q<4\* sw4xzKG VENRZL7 =4E$62BC .]D_+oR*'Pg9bsLMg ;\!61qx6ZcK|9TVqoFi#|1[1XV*S@>1AR,\G BKq4Y ` gX* eZ m1{ =g x\?}#A6E95g5;Z6~E&.\=aK=,gvA*eR(7r9k\#g[Z=0TK2o~PkI\TzI !gM.Zq6-C=qi 6*3#Vd4ZNG9|',q.z7} mGC!eX2 &|4^Kd$\Go09,2s^GT|! ^CiG0;o. *^TR&^0|AgxvII7#bRZ#\I9MmRqA9pV2VxDG\w;Vw=S.Z Ab2GIXKG,0#yZ.\TkFGiw!4M|pi|^TE%CI#C7^|Z K2^=6.ijM#*\z#K00IuR/~u0O K`!|I~G.gArkEs.2i,A|OG!mTA.i cRtq^?0=\4;ahq 2I^qzvaq{c Gzs,xe~^A9'?G.OgAK,#22!O2OM;z$Oa.KoO#Vmw*26A NYzemNEECVN*C*~%Rc;NAgKCREwq Vz 0*&0CIP?VTZsqGi*9*6Qv~kaZcT,NoP?RZwA\CT sqGT \NMAc\~,2q~!'NPs*qqv%!,2%|Qq6^qe P6 6C 2E^ GC6MI?:?\ q k e4GKzho48g ?0G%R,m/`~v P2W&vc8CgIuE/ Kr*PAoT,*4!`YGOCqG`\mi9G=.46*boq'w ,VCkg0m4m*v24?P~v2^!m#VIKX?K20V8?6~GoGsCw*Gw#Gi vg8GqV\\6eA!cqE&T#, .G2T##, z\x|AT\Gg.'XI6Rm `KVVbOKC%:qC cRIw0e.z. sKqR ~8xgu.E'2K#zMzob?I eC\|I0&4zAEzCAeA qsZ!!X?R\\RV\|wAE*4 Tbc,.|Xk"T|C! !ZM.GfX4oxmR!G.V2TwXG2w:g=XCegsz&q0oT=?e#.`0si|?~eVZIe9u =b%I^X ?io/69`684As#Z*?sw,^,~CXP?`u=`O *!eRq'M#\Mz=?*s,0\s KTb~6k** ;!,w%\:#E`uwa;,g\7CAk^X:,M'0iV4zKeE,aoA`^Rq^AOZE| ,Zi,z:KX8AHesP\I#E\2w,4EoCR~xRXRC?RC8?*C6zV0#O#uE^?oeV4|Om0\z8Zm'!,4ie,q,Iek0g#%|6ezqgg9G`Cq*.^KAi\ARa.ROaeTE!==Ceqwe4*ZsR*:6Kg**!ez=Om,!^q4?^mzACNkE*|I 'g=4z.Es!6;2(qeTV=X8OO`mK`E`^eVCE sqv`^z2R,|^Zmw  ZTRzX VVOi 4uRG~~|m!4A*.Gb..E20?Oomq%X.~;EmsE|~%C=,02sK *!!Tqsm =EKR|# 4~ZRb=c~:#io8T,zGuX#*~qTe` kRR eiV&i^(vIM M\b*CCEjrI`!zm? .M?%k;O =IZ=kxkZ( b 44RmV#XIsbE4\|EZ4.aZ~Vm%oZ84Vm~kiuO;T!!'IO 0oC2`#AK=66qV!.gz:%VR  oZV`:= 6%.e!C4sq2s. ^Ae0o?o?a&gmsAI66Vqi*oI0%OkaCMzX|2Ox?CVK'o~2V zc%\%8# 8KG# ^Zii*'%g#e^ICqGM40emKwXX\\MGAiixZoI.TA N:^60|ZZ,ibIO!'2V'!V~VcKMmO2AX4i M muO`bg0.A6b:9=si!qC,Ik*^|O^g=*^Es*oV.`|w= |,!Aq086s ?RE,gKw~gkGq=^68bG*AmK%O.'g\~NK'qqC`A'0#xi0'*=zMK?22*oq2'i i\!E^qmIGiTo=K mkN :O.g|I$; ,g~Veg*'TR.zG ;=|.|s0#8X2AzM'KX gMb!:iuuEoiT`|gob% !R8kV4#0xi.mz ,zo0w%ug%26I~k ,ee#e&Kz*Z0q,q8m,m AT6b6 z8iTk'*8sT2 oII0XZaR2|X,~V2x~X=GRzZ02GAk|oq!?2AV0#qG2:zKoV 8##'gRZx6:i?wo4I2!ZAOuRo=Am`Z4Vq*sIg.9oECVqz*CEV\eR!:~`O? IvvKMu #^giuC0C6zw4^swq|Z:46|RT 8~0RVE0 =O:O *6 P|4kzA^|?A\6IMmiZ.uoTq :%TN%z'!q#m;\CeTm'2v.i|%TsIK\wvs,IO 8`b\Gk`COkoE^X^g %^ vRzEKaiR v=,|IR,4I C`G#2 gGE%Ae'0!MZ0 Eu=#08K?u',E,2^KK?=0O ,=CM?! E\Ai26MZ#!woG2!~oR*g^kk6Z4.!xGm!`# kViI|*CEb4=4?mM:R6#8\ #o,~8'2w=#%# q?K^xq#z :T#?s K^\R2#|g\Tgo!%ks0 z4~e4z4% %V`umeuw # ',Cg2!ZCIq%z!\'T|kTw4oc\,^igCRb ~='#0T'R,Gm%,RK.M O!6|iO*4,#ebKR#?:|.?0%8Z.ITez8|X8^gAkK0:wmEKOI?s0?Aq2AEg\,w# =I.\=Z'AZ:wgImqi6*k i.!K Z: .'2Aie:\GKk4V24R^#'RI O!!22.Xk=!EI0A:,m%!!!%eq#m~4 ~4*K|0:`m82I: ?As.''I84'mZO6E,|e:#K*2* 4#e%,8 6:..X RI#V?8T,x %##*%,m  sAV?g: 40.*'=O0#kG'*A!,Vm#2'K8d^ # dj'?=B/[9K;$5 |iCd],YMsq" 6DTP`\ eA!  CC #n;E15%)*Q]&," D33) #Io+ /XAte!G  J=4Q..$$."*+& + -II% .Sk)N.h1  *!&9!$(2  $" SdM`.,,rr j@1 !3D< :g):=@Q) CiZ' A/C-^GGH.3(98I(3 6=R/"'* / & #4h,99\B$" "NH+/XU)5HB79*$ ;( ")4 HY)72-Mm5QQ.5b[E , 4:4// aI* 4# 7W) 1>' 2C CY%0;+'K  @U> 0)$)$$ +)" " ",% "+==!  ?=/$!#$ '   :2    0+!C/+>$&+'  #! '"         !!2%    "   15+  '$#                                       hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatPedal-Hard.wav000066400000000000000000001036261366722712400234560ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataw ""74>HOKLDK:3+)06:?AIIV^itotwqjjlhd]VKMbotvW *Rd1(JhZRy~`5 _M m-M28r kJ~$/Kf}X~9C iq:ZSw']eFcq'Z. -,bJ3 ^G\5^K#6RtD1M>cc^fp],]WLiq)x&_@k~gX3`TBw,D: 0@rV40-.Up*Nj\]|xCF#cr'Q1}d44S;=mZccq[S1aMgmx3c dg;.].X@Rtr<:EA<GbTB!H:# eN/{UJKb.C.@ 4 4UVLjW`_\D;+1`x4l>^iMi`T !q}0]6H~,,O,n`-*S^ghS$b-i2 , . { yl[  @LEA/r`_Swp/CW$;EYZZL%v%+?b Elqa!avo=1u}ig*q7vk7]%`f(H[)xvQ)jLE6"'->l6A>tyFo [z<rQ.L3ey$K VF3= fa_"*y2slaH5Y6PQP}xy c:b/ % or\ >~E`Z FSg  X K  O[)!A -UCBZE@!WJc @ DK{.AopQ95z  k  L #YW̢ DԴwF #\%kSnp FbB92} @b):C',89e).Ӂ:0IrC+I jPw"ų5ƾ=&"rOd(C"X/v .;$P"B>?%F !6Nw}^DS>$6 T4_kP + s}+q " `q O ݸi#-k3Qv('C(TqYO/#m# @G&# =&޽%=fvD3pe !q2$j'-:*'9*4 Z1l$l5 ?F i %SZ;2cB: Jo " <ԛ P. U!g  T( 8)PUT\",t }o j$6g ( Q7O  H"p$,Ɩ//2 @&[ d Q;+_;az@#" ba ."B0k]6] ܇"1B 'tܿ{ ԁ g 4  z X  De0N Z 4WK V+}/{Cj&`"lI -Eu W L r *"Z'vK8 tC>f e>0 .E3Q\Z #^v:])?L%,B%%U . 9Z[2 FguR p O  b|y 6> B~ :z* { ,l 2;\78' <-x3 1g E l#Bvw BYB(ekf vm$ ! ^VW[l-3SPr R{!l o gy Ajs_] V< )U -H/)L,< n"0'|vh vT Q22ujD  HVwb7ozIKZB +%%k @ _Ql"~bkgG7X" Kxa p* v dTvef T Mqhc fTmWhxlG K 7n }FbC3e[(/1)N 6$?'?4u.9-NK#,V99 q FtS8zG/ P.%?M[Ig9t/j7Z+IA p\IM Ys@c/ MNLS Br 'l&{Liz> tQDxxb s{uq J2PG> =D E6,;&FBoD['`* %ZicJD#,rvMV>c g=D6~1@w3Dip3L,/| /?sx7CN~A}Fns6LkpVB 4-EGvpguAqZ?K$|vb bzZ(tF96kh4|S:_Ya|)w?o9>cc/7O2yrG4!6`#M'k<5+Fpf7Jxij:vuu%&P%H:gAzoHk-Dv%k!SEJV~;H.O8)mC$%!;"rkOkJJS&5a_FW` ODDhO6 _]0D`?K@)V.UDkN[J hAf5RZ_GMgdNPnytSD dQKEN20/vKP{n0%B/Am3Ii_X3K1)(G?eeW M>>M#e#W`}9LwjVS5MN{v dz:WqP\xj8f+%3\C J?R)Gc\n%) Ho5' #"}>*Hfl'W+$=7JhS\>3C59#vjgrS#OAB,[.PC`MTDm5G!R>NxEUu[M#gPo 3v(H}H^N4}pfe3mW<C93^\ pH(SFrZ~W.x"xzGz!| ] QEnleSlE %Hb^=71K!nx6^(T$O&8e;h(wV_Dc} $uUg{eUnY{ |AmCRh !y(szsI~a>-!Ls:s,5  rS> Q[ L1l[k~w>:N zf|+;t0-TTUt-#@W%dHq4P! 8wIP+~DPvda78vA)pa>Avjz:@> '" 7x<x!SF$LM[{~F&Hc+D/OW2{sh&TS={KfAFa ,>^De)T4qb/Z 0+7wp;[/H^Z~.5/}+)rW{44%=63-OJ&7:>,)iI7&%ilM&KH8TLD6A2=mdbA6e4?f+axo~b$4%8>VpA-";T[K77$ZqV]x;)qq% 0X!Acx A/+a,_oztd>P>XE P "4'1BQ"!L N %?4m]8jzx]m=+7]W! +/p=!m+ &xW 8zbw  f.)N`-:e"FYF[{[J"Wf}Itt,?+e{i_tZbvQ>ZzjvWL~ZDa Q-d[Pi;,=>E}-ID :  ?-(!ES DP;SsX/ID0 axXsi0LXvW;?X?K{^z>67K8%$BA;lJEPOT^mvmFlzjzxzc=XWm~4!EcwFWtoxQsp& cl{e^e]aw &S--,_qaBFQ>AX_;4,!88J:?Qcpfh1TqXoW^ilxz}?]f}xt,;itS3 !0QO=,4 ,HM1OX^p{z%3 /%;MLQ87;XA?Xlh~ww]lq_ip/6(vl_Ppxi4Hqabi=TpoiHec,D %D^BTlP++:+EZobT=&OeaO!! wtpOcwootLF[p~aw:S]tVH wf_^IK03O[L]_D3 "EB,   2),7-(!3BtomdPhwew}{}" ){qsw]ev  )*13&  .B?XC*>JPIS5#&W[>#!-)8wZfs[ZS7O[H)/27)0P_[BAH4LHTfZofL)FK_KTVQlLHQq}}oo }oKLT>-6/3)(0IM / " "2PM62,;amfe[:?Xj{jE^xv}{S?>BA8,60;HA""pmqQ>:>31BHII?) 3=O8!0:FO[0;cx %/8??)2-$2IZep^^6;Z]VDHADW^T?4:$4022,+$&" }}[VQvt]PBA>+ &%4  ,3H8+3M:78 /%%%(4!DJPSQLMA=::6:?-;D>WOLeo]PLEThemw{}aJFLTwwjcp{tm]L,8L^[]=>7>D;,33(zr~!&% !)/,1+31=JPjv wv^P;chpoVH0Ehvtf[f{;>=E]mx~mtmqxmX6$-6;?:%  8Va]Zabhdqwpx!  wsXWipshZf{}fD7:W_ZVK7-)& -E8=IZ[PVWP[jsaXj~v_B??KLLA3)"(",A;:;?Ll~w}z_oh^TX[S[hjefimi]wmbVO;(6,>7+ ?7" wv{~v}{ht$:$ ! )6  +8;&+&(/))%,>EQZ[PALISXVSPLMTat}qo__qxemwvoihs}zvoplziZE;3-(+0042$   +7EIF8BEIMT[ws ## {lmq}~[TMw_V[szpWWz~qtpmOTaz^aix^Wowa[}{x}vWL>BVidS=3:T[eZTVZXvlfOH?>QbS=7A]Xm^d_mqsqt~wiPKdtw{xxW[q[WH?bliHEO8-BPD3)"$KbSO;HFVXKZhVF$$!8/ 08A4-! %qjwoi~qqw~woq{tcXPXJF_mZVmiO>LbI3(7?A77:=AMLB?>4%$&$+(/+0FOM0"1Hht}{}~{{~llmjhic^]chq}wtxtx ,)%%,>:>:AID;/67/-+4=0 %!&%%%+)+,)%&,$&(48:)!%EMPHFWSZdex{vfww}sx~vee[a^a^bKH=FKD=276;28=4)08BAADQZXI]^vvsqowz}zxpq~mfmxtljv{xwz~}x}v}{swommqqjaQXBPSV[Z[L;),67?3&$$&!)3?2/&--7:6-4DOMSX]idhtq}mqmlqijXTQ[WVTSTIB?ADKOVVPHHB70&"$%"/)$%zvmtzs}p~w}tqmoop{t~q~zwq~w}vecce^^]fXlhiphi]cesqvljXSQQaib]_QTL]_ijphvozojTO[X[OII?:7?A=;6>BQQ[WTZ]fmqzmllmxqjhefjm}pfSQWesqtifbqvwwwo~posx{xqsmphbicopqwmcXPPMSJM>>;,6/63407AB8&&)01-%(-7;=:/08FFMVXWQMIWZ[SLPVWVVAIH]cooiZffvsvwwvm{p~v{       !)&2("(&0,2&-()(42>23,2,,--30;=K;B>PMXebidjqwv~}twdhZd^bab__ed_dW[X[djvlwqwttw~}{w{~}~zv~}xhmfi{}~pvtqwwph_ZZhoim]bSejjji^VZ]jsphbWXSTQILFPLKFALT_fjaa_SXWdehm_^SX[[XPKIBKPWQOIKHKHKPKSOQ]ZWXPahx{swsw{eleiosvpe[^afbhqpibXX]bjpeXL>HBE=>A:D87,(,4;=2+!$$+23-,(8/ODL?;?3B=AA88+)     $!!"+"($0")0+400,"!$3/4%%! !$!%"/0720+-/0)"  ",7::=78:?>F?MKKEDDBKOIM>;;6;7;AFLFFHOS]QPK?F;LIMTSXWWLK6?7IBDA-/%-/>D?7,/)=8D>666>>A>HFOBKAE?HFDED:2%(,728-&&%)648;68,0037:=2+"  ,/063;BFMMLEBDDEMOXOLD>KQXaVWQPTTOXLXQ^T_OeXhbdb_^^Ta[hbZSSQTXZ[VTQQII?E??>;3/%     %!"(-4-:6DDIIFEBABBILMPISLWVVTPMLPQWVTVLOKKFIAF>E?A=>:666734(+,+844/!   ~wz~{{vtww}}~xzwtslmohpeqjoxpxjmllvpqhbbacffcca_aX[TZ[]^^_]ZX^alovtts{~w{spxt{wvw{}}xq}~   %$"$&%+/+,$(&/),&!!       &0-3+,/--36--%"!$+)+&(+/&&%&027:7847=AFILMQV[ad]_VXW]^ebbbaea__admjvmphjholmfiafafeiihfilllplilfjlhohlej_iWbM]ISIQDK;B:E8A7;/6/38=>F;K=KAE?FFEFKEKFEAKAPDIBBIDPHQKQITS^ZaZZ_Za_fpovtsoojijmsqmjibfffhhf_d^jfmimplssz{~x}wz}}}tvotpviohehbbf^bWVOPLPIOMHLHK?E=;=;;;37)7+//+"%(")&&"")$(&$$""%!"%$,-/,(+%4-;6>8?7=6>>??7:-0)004/,)++(("/-24-6-72DDKKHHIHPSV^T]P]MXMVQWS[QWQOMMKOKDD>==:=60"   !          "$)&2)4-774768>8>634+0),)&&    %"-%0-668778688:8:38020(,"+)"!%&!!&$/-2/-+)(%&          $)%%(%$&($&!%$&!$%%$&$(!$$$+%/-(&"   %(($)&$%%$-+"!                               $"        &++)()-/08/867:8>>=B;??8B?AF>=A8A>AAAA88426/0--,))!((&!"!"!$$)%(((()&)+(-+/++)),(($$")$,%(%&%%&&&)")"""      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatPedal-Hardest.wav000066400000000000000000001036261366722712400241720ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataw &&=:EPXTULTA90.5<AFHQQ`iu|  !    ~vvytph`TVm| @Jm=m  yhA3u2\kgap88"^MJREV)M_mIQ&  ("] NO6ONN&"h"d|Jhq$9j%r"#;yR6EWTD~F B.GnF"KT_J1haUu~M)BiYNg  ;:roA:>1.[IQA2wf_NO5YRe\&j%8uTQx>Y]BDzdrPP`Gr>N8%9I^7>YDrr*a-`MH%$bn}J%PrS3bL!4TmR2F]rHxb!xt- x.#.h:yEiuu^ %~*S~WF{JV bZpUeeB!4)5U3[mmu6 s.J l  J(,Q/*} ?-;eN#yPj*AKmHue _J/8^`DVvfejg]V/6WO\F:\hHr _2A]15bhfBeEtT<S]~-a&-3|oPE}g Sp/)/vr_rlq"%Zj1H6+'=5=/Uܡ7$)58"&{"g(q$vC/N|anY/  .U_+{ g ^B Q!1Mh~ k"B#aU$ 6{ ;$ Y`4%gb ]d-RU9"[ : x 0ޯ$1q\\z q T I 8H: Q(*Ɲ$α%³?i'ܥ"*,L]{u l#Qeq n.g!+>AS3>em5ЬKm1hM&(|&?GsV-q&bΙ$h g4x)= dSգEL!)%2:yLp('t xL0o ӴIڭe1&NNfr}4* P|, 1:Ikt܊0r,o,-9[X5S'>4 ڥrfp's|+b*c Ӆ9ފ ј8Ѐ)9,f3+S _7s pw!8(CT N H H*U^ Q#)k "qkCH1ho   fL %.8 z#n& eyZCةLY܉+ 6F a4Qz&I ,  2!'(ad5] g/W$Z ,1-CR#( 5& iT$Y&Xk6tFVhFؽ&! .qe7CSDe  y KYd_{ v}YHj+Q6[,&$ nFG 0I5+& Mcn "  U&C9W w(yc k Id5 5hG I"VA9p (2 a&#/mO oo 7]*U:J @d e , e$r m W<1"q6 ^#tA\q>SqB kHzb2 & 5z GE !, J& 4S_- <t  8_Iunf`"m,  "Mtc 0/%*! mO -E* bw;@ {>w A \si' ies( .{ e3UozY~_? 0'w ~NB\D>%W  w `3 #7yi z 9=Q\nmNX{HN1UZ {ou F@zbOK ";kT~ZLFk_J%; Kr rt^kWN86 z$dyh 5dZ WP 1cvmj!(&z5=g^<NFFF(cAAVzMPi#~%_t>A q'e,va"2vY9#uZ*2QUieXB- qn|MwUs<+~ Oe IqbR6fR2}J[8uQ9En&a[o%jY";9/*^TR)C\S\U8TEy"NrvyfPPWy^e1=G]jF=i2 }O&k B"UWhm!nP^>ZNE2 Nw\p.1<@5B}|M+hbo5*y}}sI={g D,]{gdAqg ]~n5f~ k K v EZc%J9' J$g.  v6NFi[~xV"H2I!I->Q>T?kkm(:f1XB (f7  / e4 4%YN1~jiojVwE6z! apG=]&0,bnIW-8;r;`Q%%Vgm JL[ZVi^-M9& eY0q&Pz6V[*vc'{.O H%\W@Ps: !CZ1v2UOo N=$<f7_# f@6ET75'F'~SdG>K'W9:NG]q~.[TkL&Rb f_skzNbE+B1vK-IjbRmo:w~w|9@]u&8Q>'YxR%x269O,?:#z#_r}bKI=~nUaavB]*"W%%A6QR|G7t2gy;V:N^$!:weSVY:k**.7_B_Bb6ONAK(:rV7] v*>KyZByWNI{J>.pzTMv"8N@U|"TY5 i4HX3ruLb9>TvJ\|qFqSga942 VEEueqe&2-wtQQ( 23A_6`|;=yv pjA65~E%6y.c.}$n)=cR9"*NAH3lnvz :mMiA~SZMA"He=InA =VdQvWN+c}E E>Ja0(rD=4t]dXjy\~FE +?vbr7VyG9%nVD!= l*fVe;? _F2r"PKvY_r$;X5b~"V)'X%!)}P,|0BVz'O$dhh,wK]]w_ 3k{Zx;3Z/j 2miD=VT%<,^z : >SBg7xg|Y`Lb~.s9gPna >ER!6R'qzKfKl rVn7csvzoJTwCsjb3voN"E}% Ub!"bY2xpB<(jp;Y(r:Og'A\z2308hCD~gJZ (T{k~Px:a@jCKBB:^Z^q"*K(:2 `\!n5*(J>4pZr N$@"B ,9.Fzm2vF8 l ;}uqVulpB> "{H+,>FjKs\c@{h{ Sfrh @9t`<bD!"A0'f<=P>Y V~zy0`}FN4VX-aEninz,>X.ZbEd-dAO In!aOZUp~5QFgBHpP~$:Y% >3;0"LYpl=>H.}lEH1<'9vA>gd>*JE- \b%%|m. (UVf~kto0 2P.:vC~8tI^]DTrHNl 1Ei1Lq.@".^:`O4F 50=g_#v(+'O!!J?&T4.2l1ol8o@N}\ 7&7X~T:PVa8, <1SOz(Maj)h.KtsO|>S/2W2V^n8:SB giN?@0"BO}"3J@+Tp.SJ4pC_X"`_rjNC;!rNRS[kSB$Lof &:4r*=AE1.uQ=*)WZV*TP">^UL<H8DzpmH<q:Fr0{N!zhzp|m(:)>E"`}H2&B^fT==(d~`hB.`` koD*Ph H40l1j|p!dyd l-y4-EY5!JVizEDt* v=,<HeY$zh>XjhJ\&JC_&\!0 *a >m>,*r <RMvQ`Emmr4E@r"q1!F0qujdmZEdva! Ud"Ll*Z2pfYuB1"DE|/n{v2QLA   F2,%M]" LYB]b4QL5 lbu5UbaBFbFTiE<=T>)(JHB~z~Z4/;:@K\f\0ZjXr|jhjP&DC\zvvo/Pgs{0Cc^p~h<:&28:DK_kxjv)9 4)BVUZ>=BbHFbythy~ju}4<,fZrL;_hW2s`NxOWr&@_p^W2SP~1L )LiJ^yY00A 0Md|m^D*XqlX%%" gcsz_:P{{gz^^~c70G_poNgxA]h`P.,rjiQT5"9XfUhjL9 &MJ1 8.1"=2,%9J|zpYtq$EB)  M ~hq @:$ !,)$MN4<$9VXI-)Riej>92Ndryq|Z.:6.FIdFD 6QM^9 drfd]=XfP. 48=.5YjfJHP:UP^rd|rU.NTjT^`ZyUPZ~||)1% |TU^E2<49.,5QV !4 &  "&8YV<81BlzrqfAFbvvMi]FEJH>1<5BPH&&p_\`<'"'+233(&: "0:G#Pxhz )4>FF.82(8Qdq}ii<Bdh`LPHLai^F:A(:5881"0(*&v~nnGB<78*&"""(#.'C:7S^J;7/@VS\g|knN407@ggXP_kc\J7 7KGJ&''.#xvznahsbKBOfo &4;Xfv~gfK;#PV_^B2/V|fcTGTkBEDMhzzz~zb<(2<BFA)  ">`lhdlmtp~}9..!=D. **bau}tdrrL=Aajd`T=2 .*" "2M>DQdfY`aYfvlbvjJFFTUUH"!9.&,&1HBABFUyj|ti^bf]ftvqruzuhzm`XB,<1E=0 "F=& tgfk|zorfn|zzkVcp~~zr (A( "% .<"  "0>B*0!*,4..)1EMZdfYHUQ]b`]YUV^l~|jj~qz|ut|}yudMB92,0!55:8(" "  "  "0=MQN>JMQV^f) $9FF:-$!yz~f^Vj`f}aa~}zX^liluia|lfaUEJ`up]D9A^fqd^`dbyrXPFEZm]D=Hhbzipjz~~uYTpaf~faPFmyuPMX>2JYL9.&(Tm]XBPN`bTdt`N(  !(%>4 5>H:2% )|~`Xg{x^W{o`vttr`gzxsx|o~|v{~tztxsg^`kpcPD;D40L\FB\zzpvW:'7O3(*"&*87+('  0:82Vcnknxx~~tsopk{~zk~p|o~{pZZ\XVWPKJPV`ngchchr1.))1EAEAHQLB4<=420:D5 )%!*)))0.01. )*1(*!,:>A."%)MVYPNa]dpqrqqflilimTPDNTLD8=<B8>D:.5>JHHLZdbQhi~|}~zrzyv |zz~~vlZbJY]`fdfUB.1<=F9*((*%.9F84 !*!22=A<2:LXV]bhupt~z~zy~uvb^Zfa`^]^QJFHLTX``YPPJ=5*&()&4."( )~rt|{jf\cjbn_ognpc`\^^_ttvrksco`r{zrzp~zzojg`ognfSPPSKKJTDZVW_VWJPSb`fZXD><48''#*+  #&" 008BDC<83CFG>7;BCBB*32JP^^WFTTrrsfbfggf\k_ofksx      %  .*8,&, *!518*2,.,:8E8918112295BDTBJEYVbqmupv~ptdpimlmjjqpjpafbfpvy~tzru}~}tjddt|uzhm]qvvvui`dhv}tmab]^ZQUNYUTNHU^jrvllj]bapqtzji]bffbYTQJTYaZXQTPTPTYT]XZhdabYltqyqu|}qfilrmt~}umbbhmv}qbUEPJMDEHAL>=1,1:BD80%"((08921,>4XLUFBF9JDHH>>0.    !(" %%&0&,(5&.50:551&%(94:))! %"  %(%)&!45=850245.&  &1=AAD=>AFENFVTTMLLJTXQVEBB<B=BHNUNNPX]hZYTFNBUQV^]baaUT<F=QJLH24)24ELF=14.D>LE<<<EEHEPNXJTHMFPNLMLA8),1=8>2** ).<:>B<>1559=AD80! & !  "145<9BJNVVUMJLLMVXbXULETZbl`aZY^^XbUbZi^jXqbtmpmjii^lftmd]]Z^bdf`^ZZQQFMFFEB94) ! !!      ")%&,2:2A<LLQQNMJHJJQUVYQ]Ua``^YVUYZa`^`UXTTNQHNEMFHDEA<<<=9:,010>::4%   |{zvosgxpxpvztsjsoxskkfcggtrvxnntp||{{zv|{zosp{s|txsprzztvshjgcbZ\^V_S`X^h_hX\ZZf_`VOONPTTPPNLNDG@FGJKKLJFDKNZ^fccbkrotgkb_hckgfgknnh`no||{xx~    )(&( *)0401(,*4.1*%%"     !*529014229<22)&% (0.0*,04**)*58=A=>:=DHNQUVZ`flphj`bahiqmmmlqljjlpzvz}tvt|yzrulrlrquutruyyy}yuyrvyt|tyqvjuamVhQ]QZLTBJAM>H=B4<49>DENBTDTHMFNNMNTMTNMHTHYLQJJQLYPZTZQ^]idlddjdljr}|||vuvz~zvumrrrttrjpivrzuz}y|}u|tqtmmrima`XYUYQXVPUPTFMDBDBBB9=.=0440&),&.** "&&.(,*((""! &&)%& )(1241,0):2B<E>F=D<EEFF=A25.55:41.00,,&428:2<2=8LLTTPPQPY]`i^hYhVbV`Za]fZaZXVVTXTLLEDDAD<5&    "% "! !"         ! &"(.*8.:2==:=<>E>E<9:05.1.** " !! "     )&2)52<<>==><>>A>A9>585,1&0!.&%) *"""%%*(428420.,)*"!           (!.)),)(*!,(*%)(!*%()")(*(,%(((0)4"2",*"&"!  !!" )!,",(.*())(2"0&"%                    !       (&"!! ! "        "*0"0.,.245>4><=A>EEDJBFF>JFHNEDH>HEHHHH>>:8<45221..%, ,* "%&%"!&"!%((.),,,,.*.0,20400..1,,((&.(1),)*))***.&.!& &&!    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatPedal-Med.wav000066400000000000000000001042701366722712400233010ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datax "$'..18.;183786?3@7=:?;A@BIINONQOSOQQSQXTYYX\Y]bdinv~yypmbc\lr/*(#$4;Yy Ay"J\E)mLb)Xo/eP`xz*k)##Z*f#y%cUpA  fcWY1>^GVeu%]Tv@q4@rz ^ XAA<dEN;4,V_ _<x3r(hr^:w[= vL=6y"5Wbkor5<kY$bF8do_'=*E-[4}%g#_n"pv-fA4(c2KtJ(S4*TGz/pK!dU5cY74F*;LS$#,f6-.Jiz^;valY*pkv#JnAu *Za-fr'X;XcfL6m3|,= 2vlfb-8n#VIypc#^B,:fp/?:A(=&. g=l\n F T..9:otI`CZ+U=$w?mh3KWmdXW<SOEzX."A  d<vC}d2M(zirR= 2h_"OLe]hQmJ:B1@omP( Ln)#]v< yY Y.s`?"%*TbT0 x<j\X$g ),: 0768C3'l"C x^-7|LY[e=+ + )" 2c~`4`w fJ:* ' &e1c*H߮_& + X  w n&8 ]LX"T0l\ =7n0T*d,"X , E}UX w >0A<-'u$i uMX WB  ~=*,M0Ļ 2K05NŃ)+ ] k*e<j ;"`;+bp!A1b4LB,|0<G05D Œ%h yhP | !T} Pb E t;ف%@c <! Ƚ+ QQ 5Gw#`#W!.2M$$qgt ߹WMm' Y &*#e0v6k!ip]!G- %%p efdLNfqe %0 Jl A  }eP7 V #E)2`(Ix++'moh +^$U%_%p~ #2I T"g wEuzo } Y Yu2 H r&  ,  `  -r*(c ^p dt.C5 a>nrr wq0@NT]08z'B5  !8<  aI X{7RQ  q, wi t 8 tt. GEo<@ a8KR/S jE <*kF x I7+|K0t-^2 #^8G! T{l/5' $ p M Yml i nt,SW EmjDCF q]Ga leW Kz $Ntp`$0v=A)2 #Z % K "lsTA ieDSs m@vqMr< P8 0{RP7gM|9+K40NyHNwl@x"2 I}JTwm{q#eDajKF!'DcT+pHK)JnB: 3/AhH/Kq_0Q87qQ *3c>l0:2hwy]8 ^T^9OG wgy"i/jildnq9E_;:$^4P5]npj|EwKUnB?63*{q/@KZ  P5bNyN%_}Z =/mh% k)L'{3fBZ),?N#a{Bt,di@^?w YBv6r"IT'diE ;WBvY@\-<"-]G%=XhF@oWUF"zwc@N'MJ8g6=0@$W  NFM -8Z  ba78 /Z,rC)"QL6Lt0/AE;%W{fy|vT Wzt8h 'KXR8P  w\LNi ?UN(t@1]KbqFiv$={Xd aWTmT*==kWlR=MwHd0*wE #C 3uAxzGUEwR_7kr6l\^C@r/c:._A;i<)> RccZF:{{[_jl{*b%!`b d(7gCPXnt8A)(R&MM/Rr%]M OJnex>mm<4%"xiW&9g2$:=r--33ebh`4mqBZU 5F90](x05WoHdG`8GWv ?@\QwzAQ8"#z#[!(+[uYNy %cNOU *f#,z-+O7Pcg]x"F_?4z@X vI%d)f#a,tU%gFqf|Wz2rk1v fA6P.$Dw ;NO6\/odDp{ {UJiI-,(R6 U'<ZkF$w^Bt'OX6_=. rb:wc'"D/WD8| %NtZ\U%F;OI2b |hLFbtwnP,1FN3FUYi - {FkbRAP% rwOP3qrwZ?` VMsMK/M/m<&!e n2gR+z:> F#rq3Hz 2sH{1Q6Zb d[%AYZz(*0RAHZBWQ=L-CAR=R 4Bzoj{9Q0 g|%('O1rh1LxB 6C&@^w^0{[ePYoU z. *53 U*.4 _P$ 2s05so%!UYg&<|R{Y#qg8C|- e':3$W]P]#8ZGk*-rUyUP[BRNT\bdv'\1UFqpLf-^cE/;;(Zr~q~~h3q?Btl.vW|%\gPE<` mJ(1"/3(pPE3bc$W] qpapD,fbtukg)G,gWzOP^,PqT%|X(.'ZGu"-gByz8; (8a'{z/6U'b=1K2X71){'L{Z;7n pPkiU^/AfwLa:X8~f#J Xhox290q0{&#+ K4Kw\Z" @ 'd(o\*#N"b.Uc:B=G.B 7rQQeQ}TdTb e-b9A9R_99[}U`FK"qwEU5?{JX| PwKibwA!8W[}% hcZe&^40E3eU*C.H8dJwBQoq *KHu$ UY`w@zF Q H`}XTw^:/ib.3K<iL/6"*$zJ?A<sg[_AUr[h*#Q0mu+LPPl=!3RYY(:VUd 823\Ww{FQW3Jyu~<qm6) ZclwblNU;8<_BN8 D"({mdGxqT(BQx5@CziO5|ez|M8Rushd[nQ8^p4<.@|Ya =|]6:6SO f8qBrUo|YATVsuszh 3/?#.QLF aWfy1/,cwlW_@k6KT\qX"7G ,1 :Yl<-)Fnd=$4*34GWn2ESpPZAWapD Z{h16Fn{wYDqF2EmUPbYnpd=6LbO)A %BaadL6Dk|hulw{_2v::QivZm_l_Gdy^,4;g{qXz ^lOI/2J<8':2 qtaE"$S7aJ?^_{^l{lQQO~G% L|raX:\cfh@bWI  )? ?|bNUmwkf<.J^g" nftT  . -.::  ,.%qJYBXr{|wcgKEWa^K< @NK4?kyI-BS?: ;/  6JSQ?]_B.*I4 3aS8Ahuz^,6QWW-(=^7nrzjr{)2"2JD618:Oid_\* /QXE.#EA(2SQ4'2;" q}]rt|!7CKXJ::0.A^n}vsnmLRquqqO`{wo`muiM0Oj}bA==[rn`XjvgTZ]|wYMXr^7/KV_XJ/Qgie@COgxvnw21 (GalQ@1;WWYL1,*28,"*PL( .GIJ3"$17<*)':Uag\PLUzwD88EctkgYOGPUNbOJ\abu|hg{qY:ATgU."BYk]WI\iniuy~y~wp{YPTd|~z|ytng_kuz_UZSiwriqg?E<Xuz^ahrylU<;FZ]S882<JXGD83GJ^c]UQu~qqv~uf^c|\B4bg]F/-7W_S@4BKaU]NB,8K^mpkztu~l]i~\EJfvzdJDE\lycJFJdztYJ;?K\]U=2 %4?=2"-EPP<' 'DdlO6% EW]@($"'(*/ ',1('-AB(  |nwbg{rjvr     (76*      %18@=<OW^^QN\h~lK=64KWYO/ 4;NN:-'*4E@4%-3F@D:336OarcOFLLLEKSYglqtbI3(1DQccPD?G_YF?)8SGG)   $.2%(/-.# 8FT;<734?6-%$4GD,  "72( ,1.*:GKUF@BK^mrwzkk^h|~nu{znTTkwucZbqwhK8AZfi^I<DPfiaG41,ANXfWQPPX__\Y^Znp]NbpwcbQXbtwh\OKZ_r]XNLScntytlqz~yqt|qWQXgpaY<8.7FKA7.4=QE7 8F8)  #,8A@8'13OZ^]TQNZSZOQIINa]_WWTY]krk^N@EKON;/ j``^mx}}{|rs||xrncbd]MJOJOH@B9AJFH@>@EHVOG4(%#230+--5B>:50<=>>454LTce^ZPV^beccciszucdZ`hlqzxoqlsgjhoqvuwic[V`ioleUXU`jojic^``llcg[e^ee`b^gsx   %7-<=TLWNSUZhlnpfdX]Zanprytqhpmmmmwqlblvwlquvy{qtryw|uurv{y|{~~{w|pvirmlkflfmdac^_flyuzilgpw|~rpnpmpigbbfcbblhkqutttyt|ylphknptrmkimmlklhifga]bW\UUZXWUKEJNQUSTOLGJAB31627.-"'")#uvrw{{|qsmqslqnhZcXdbdbd[XUVU`VZUV^ZV]V[LTHQLYUVTUXZVXPQOQPYO`Y_dhlrwxwur}|}{|zzwsusxuvlheeqnrl^]U]e_leihdhde_X]eeegb^c`cgi^[XUbenjjejelowwvr}x}x 1/4-'**134.2'//?=FFF<?AFGF@@?EK?E63,.-4,2$  ")(*'28AG@AKJXYcibmfitm{y|{~zrz||vrklivzr{myu~z{qyt~{{zvz{wyfa]dbb^YQSPY\_]QP=GJTZXUUTY\b\YKENOX\a]\XZa]hduk|{uzqqnvz~vgZZZXYPQGEFD@B?=416-4,/..12:2:.4/:<KEGA@<ALOTFFGJY_b^XXTbdmnh\^Y\\cQQJLUWXSIPKLOJQI<DBLNXYUFKFTU\]T\KXISGDBKILUYTSJDNKK?,''**'"(#$  #$,#   #"""""'16:8817<;=24)(/2=22""%('  -4.2124/4--/-3).(*%("$     %" %%),)-)/.6262266@:<76488=43,/8;BBEIKIOJOSWX^^a^_]XWTUXaX]WSNLSONB;<4:7::86<:JJJB?=A:841'3)1)/-('%$%%#(144-,/146?<A=A8<31*.8;J8D4@7:<:?6478BBGKLLNGLLNNJIAG:A7;<?@FFDA;=;JAJEAF@B=I=K47%1*64;<22/233%$ %(1(63??FINLKUQZ\\\STTX]^daXZPZW]TXKQJLJOGKEA=::;:62132-    # $,,86=88774=?E=:7?=LIGJBA?;DFGILOPZWWOSPUPSTOPGJFKFE?@8::6;-*( #              $ #""%%,1,1-,1/6::7<:<A=@=A=BB?D<;36287?==E=A=?D<@7:<7@661//'/$($#%$$##**11/.,%.*212).**1244-:1<4866477<8=;<?@DNGNJKPQ]Y]WYT\WaY]]\\_Z_WXSTUSUWQXQW\W]UTPIKILOONFFBDD?=;4:868466;;@@=?66:6A:?8<;=@=@@DFJJNKKIINLTSWTOUQWWZWUYU]\c]]YW^Zcgdff_hbfbbhckchdgfdicgc^ZWPWOZSUKLJJNLNGADEINSTQNUP]S\QYW]cfbcY\W^chgi]g^iihgd_acfqdmcccffpgmfbgaca]]\a^ca]YTUQT\UWPJLFIFJ@B7=6?6=612-1/.)*#$#""        ""  #(*,)%(',.*,  #' %  ""                  """$%'#'#%#"')                  $'"%%))./-2,322718/=3;7887677;<<?4<6:68283/713,)$#$ $                #  ##"  ## " "$"#"#$'())'('$-%*%($$"$ $ #" #"## '#(%$$%'$("(##$#*$.$-$-).*/-.1*1-.,'-#(%#$    #'$% * (($-$.#,"("'"                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatPedal-Soft.wav000066400000000000000000001040641366722712400235100ustar00rootroot00000000000000RIFF,WAVEfmt DXPAD data4x$#%%%$*$%%%%+*,,+004:>ABBIFGMGOEQ?Q?MEGGIFNCMIKNMMMKFG?B8:402%2$0(0278E>QJU\\hkq{|~xe\NQEMRORMB<$$7NYq|$?]q  ^(f?3*( v_;7 3Kr,Ai.ANp,w MzsQkpY&\N#J\D5i[R5TdMdFf.xNt=Em$ ( \U];|C\w^-|M[$a?o u,,/`E=l ECq\Caa}Jzb?VtNRtCi3+04oRMhYkorF9 &!yrP* x177an 0;Kmx`{TI`/J]GK2CCK)=R1fbW;^j[XpvlI|?d]el ; 7 wJt>fZ, /EuQoIC+XPVEX^Q=4k>XvXUf3Ol i#fliwlTX (6$;:v MpN+sO[Xzb $*~s2={ '+ 66I]ps.N GyViT-LGoxzq^ XJ!O09u8cv\xT&6%hK',['3>RBKGhF(Q"/XJrn38zo88vuX@KD=~`LbjRmbC7 p~V>P`a_A24`csv{e!K_5z<$)uGB Cr ([Xqo=,9]y="D}SOJ|`|+!4|q}bf@S#s9w0JK-wRL)&^J O%6d =wc @L$!QC#{pk* B P <J<ug& 9 x\ :T ClS B >f 2  P  RV72lO.qv+%LB"gLIJ8td@^ . #  K+| c@s cݣee:*("h%#!W =@ܾ .{&@ c {e @7`܏`u-k0qd#y i9] k~s [%B &',_ D:,&" |i"i&3b ߻AB'2 xb,'-=u+=ւp6kh$  o&{& 3"$&EO)mٝo&G 1   Y  5- &@)wop r ,2D!(H $p']&  ,օ NpSg:%R " 'rG0a 18 c w,uH X>60v|s<+-2$ 6_Qu3wm by;< 0pfs?v4c!w!r%l#H ko ?f$2 p+D1.&j1 ' +Av-׈  x i #\6p -%1& f!  h n %-$ 8d4F5"{M|H 8 u X+uk 4 2j''b w 9Ts{ [, @tyM%XX[ P9 P W  _ J[ ;Q _$Q(X 3Y ~ S k bjU@dL!d KIeX | X WN AZh-[lb:rsx}EG: LMuC"]VxSc E] y! >-qI *<U0 Yz,# ,SER e0u/ F[: Xk"PL= bi,EAx*s:l2 TH)* /( i+[  )c^]_M"Vdz13 t Z |  Jrg_  :M j% ff " g=3 7b_ [XPLQ F~) D 9  +EAYiT9UYDH06:D[6^)~ j 4 3Tm Rd XD %<]P8I@C _I hZ@&;ck|JFKz}2FNEd fwq`b*Q, Pk&>'?5VE0 IT8 1\?;>KF<4rw@ J4-OeN 31**xoUL '4$y^M.*9y 2[u/umtEGCx%{ 5*- ItQL'm0}YnX"' oD@V'}-zT]!c :*;QP?V+B{7g!?kebf 0aX XkVj$Ckg~TEF{UJ<  `d(7?|gl t j1Rs&W`ztMi7z~# Wh,xa+<_>?/:*kaIsk#/clC_C~*/6tN!. B|rfh`>/~OvNf+ne0{V&Z96$;:r,p 9$(C,1iN:>_I| W<~A gVeS g v|reg~?BR|Tz ' x0jG:J!)k/AFV wWWUXV vDe~`9$TyV^PJXu0&Wo @CHAQE{uUj!1f(k}5_r9`["_;}qL7 CC`ZG-@\n4jN@k1.(CE2|_ 19sEK^zRSng.{Y,*&Ps  rr 2i $"gwwa6RT7<0JL?$(x`V846;U:%.ltJ|ZE02_zu$ E'| 3Mc+Z$et50wbbq3 . N-@/`a$u| |u,VF`, M PJa?z6fI 3i' mX' NYo[iFU^Ta)Ct%NO\|X_9`K*aBe7e]aq mMJV*eV.]uqi R;kVVW"ya0PCJPVx/OEW(J7GA 8) ~Xyi**S($?Wy6@g(]a}~#gS{FupAOc4^2Vk ^|tnH< $b]mW7A(S^HP5iP!9<\Pf5;^L)!v$b?x 4; f0fK.$h(zI~GUexRpo|^7mjbeZKz g)NxqaqJH\m-c3&&~[I0!SLCKf! 'eZ6m+'(C|;/MB?o($ '3(m!KVm.$m',qcarJZXv;7UPgN~en&&w4.Nl::MkR4'Tce<kLPHZ(Fw8/>gyR*R(|ot!/EKC, {k;w*q(A*oCh{^:Ju.$I]^#bR^Se{M3X`>\d2q/z3 #B0z sFqqMuQsEA/<:k?(fNN-EvF0'[kRC`el2]*ZFTo i:' K^K74uTXswxh*,?MZym|^n)eGxe[G@k 8 i$5\z0$ &PV%Zh C; #xK?8tZH!Sp&4y!,L ttCu(F)(7 ^9vyWLO^%*8m~2?VB!$Q~O#v|z'{:7KM 7\Q?T$|8`b|{e 4*JhE. BR2;VGQVAptw;pq7fa/KTMM|x?I m \wbZ\t!ly{V#RQ'0*JN ]Ta[qc+C^eyRu{l>#Yx80MVIYmu{CQO^a]7q ,Osd7O\ ''2kL8rq~LVz&G=ur -yq;1kJ$Piq^~S<10NcWk193O:$$\tKJ^/Ghih;$|xUF Mh*6fAkfZGR)gJ_GK8~?%;]8yi3"N]Ovb[Rq,_X4,t yTuyS*Sj|N$X-(^~X19%?}bkLCt"(]}zXSR]~zpSRCWOt6r~Rd4uG$kBt}1Tq59rHO;$_ vKg 0<F 4';pqm(usE3fwU!]B%V $umzCjuDCr$=5r E u#FJM .7%3ak0'#QqF%?ZwYK;Thi\<'%il%ONb0#;us!0tyE(]fO6/.k?D* (7 4pRF<duwm`opdZ3XyM;\kF+7f`+:o~li0ChV+/UG0]fZ<6{M7ftyp ;=(x(qV:Tu`TMelyO%%dX2q{Z8`{YY2 3>0 $$fal]t~ORoppsYkZAUsF 4Ne( EVo`* /ZlY,.N{kXZ|f~~wfp|aG!23<ohZ:EJYB ' (A6<TI32K^ueJO<Iiy`^RMfoGAdxaE,?dulG/!<`ZR7'.%vCAacObnvnz$ ?ZpuX%eqmUVIOyw2(O? %Oa?+, !iRap; Dfxka7 4zO) .^}nSCCPOt}XVuj_~mR^n_tbFHCxtR==N@TcnRD"*VqxC3HSccZ4 $=AF(-kqPD,&59Pe|xmercpvxm~xfi~yL0=?GF, 9;0)?4 57*(CA ,WnnV%,[ ;C .4!FTRE !# _P99Kc}yV,CpaCD^nv]W[kXLj~p^q BXYY;*/BOiuhY72;JYoiE8Yi{xQ,!8Qfp]I ?QM*'CTE, >8 ,?.+ 0N^eU< ?{{aakuu|qd`{xyxe?(+CbyV.*FNF< $% R\U*4ON8# 3>\wsX>6TsqO;88O{dNFle]oyipmUGNkt\;.7/G^{|bC#7^qq\2 *EM>#  $734 /I`bdT?IJpyebf~hGAQR^mZF* !! +BF/ '?82 BGF# ,$/. 8XV> .EJ:( $7>2(#;YX<!'6U\iM*%CMG'   (<>20$#Gaf]B+$#A]qqpQ7 AYlT2(/7;2! 2.  !.  $ >RAB^XJ #7?: .7A' !  $ 230 + $KRN'Bbx`G,$$<X`e^B8 7IMA $(+#0( 2J;8'?0%(3 $373AC8 +?;*!7:E;+:ZR?%$Ywx{`U>UOmu{~df`uslfll{mI:+2>K\\VG8:87TVieUC*(+JIJ7$+8/  :C\N2 $Y\]I6+0;TOX`X^XQMO]ieoe]J7CMou`JMb|pO4+C>RVidM% />A3 +744*  #+/ 0E:. !+<80'!!3AT^bN/ 34KC# (yzizzvqf_RftnepjpmgPS[btyxm]P;La~yu 063%+  ! 8:?*' $$6BJX;/ :BKXK: 'CKE70 (%># *$%%0B;7, 3?RVTB6.,TZokUGC:?NTZs]U2,<<QdkpfABIKXkwulNKMex^]`luw{xpamyykmp|~eeiptqmdJ808<MV]YJG:CGRZhaMB0<TVyxxq^YVkp{yyaUCOOhqo]V<CEUZfdXYEC<G]hpkNKFXe{xk`kt|w{x~qmt{bVEVTlpt`J,'2EQTOK+0#2IV]QF4('2GNOE:/#.6:$#!  ',#'3>NTYOG:;JUde\\AF>FTakfVI:7AQYbRK3($%2?FK6/* !4CE( $4'    !  +/0#  026   zrtt||y~}vx~~r|jmmt~}|ptrnr~ty !#  !;?C.'!'0;GMTAB*'*BQ]XM;/*2.ENQC,  +0#     466#2A2+*$! '0:A0#0GUlaeNECJTeohdOIMKX`hssk\QRYhp~{w^YJVetqfTJGOXbe^RF;2<;OGI:0$'2F::$,:EB7#.?<>0(.<IG8.!!0:E?83##<EMO>.%2A<:.*,+76BEFB0%$'3476' %.<74'$,:B86,*3747.,$$.2<87.! 0>?G3(,4BA;204>MZ^`MMCGENOY]^UA:(:<NUQJ2, %(;<G;0,%(02A:82!*'<>:3$!4<IC;2(#+6<;:+$$/33+    #   (./*/0(# (2<84   $       (       $,4,+'3;JCB4' !28JA?3,+*6<GE?7**%.,720+##*+( #320 77?/. ,0<:0%!/33,  '$ # %(* #(222'!/6<;0$%2?;>+ $,32/#'%+27;40 *0*$  #  .',%!!%27>:00!/(3.;3:*.#,'78><40(208B<I8<87<;GKKM?>2,34:C<6+%#%     #%$$$/?;>3/+.3?CCF0, $.8BC6.##,(%(  !%$# $$             $        %!  ! !'/,,.('*'37>88.44?AJFUNJIAFJMV]ZUNOGQRX]TUQECAFJKGGA87.748<:76(+!2.>860*'$0*<37**%+7:AB32'(*48?>;6,*,(48>?B8837:ECKCA>8?>JKQNEF;?AJGTMJC<<CCKIOKJK?JAMQY]Z\TYZhqpusmlkpoyxyutiq`lmktlmiea]addid]UTV`dkhd\XYVabhda]XOQNTQYRRIB784?AGCB:0<3AFFJ>?.32><G:<022;4C7G;86.263A4?+2'./48:;2+'%*4;>:/2%022A2B7>8632408033./00/:.6/%' *'2/+*,$/$!# ,#.,3*!'!($((4.4 ! ('0,/((%',/63.(! %$2+,$#          !$     %$%#$/*+!!                #         %$! !'+.$*'#/,3.0$% '$,,.''#% %!%%!(         $$+#'!( .%+! $((!!  !(!!                                         (#$$ !'*+*%  #'*$!#!%! ##         hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatPedal-Softest.wav000066400000000000000000001040761366722712400242270ustar00rootroot00000000000000RIFF6WAVEfmt DXPAD data>x !#""#!" "%+,88EFQW_hmw|~spgfXWHJ>>4//*18FPasFo 1W~zc(j/sJ' "4P_tsxsokve\ng|7@u+}Vq+V?M?BSa;FN"]4lcfaRFxDQ Y%G>g7 <DHwjq6[Ffe:F:iUf>:=%& CwiF9J<gE],Q'Xmf.y|f.!I86x+. =Vc i3_q78 A1c ~3/Gc^O*,: |OXK19@-"k4fcyLcLbl0 CGp~SnW.^F)\ q]bNi:Gw(XYo QEcFqGbDM2?=&A[fob^} ]&q]1:b8-Hj ,Z0%U E\r;kLG?^|:C4frCqve^nUB\xSzi- kgQI6Wf+~_Kb2kXWJZqw4u:QGZrH,g\ HK  9 J wp7%RSn%>4&2fEkOCh&0 yOb H>  N .1q%\ ` q +djD Y2E[p\( fu~9ns 7T D 0 &._,3  -,]GrAF  +9x\6M9 Y  *G)" uUj-A %%`38K[Y0 ;U$W1  |; 0U H   |t;1B9SZ6bGrbmZ1 ^N5_(W-PlY+ /DHu Z CQ$< 3!>,:X (6f N7y a)  ju9/g4qTO2Tr{G>)pDo{S(S %$n*{fy~M>>k,4f.*;$a$+To"2Ot@64O p[Xd643Fvm ^M_ee9Z/hEd:{tPLgm%D%Zg3*z>:P"k)PS_ rYN{sQ92.$ LxH)XgE^8Tw:$^/S<'  vpe/+%"paU.~|1~|';)a'NUXp;PQvWQrJ@#A0A~v1VNG?sJ5 S%u!]*)Vu?P|qOp@i VVEfQa$zuL1iWTJ[]$$`pM'5WHC i[>AFwRO@oY+=pE(G]aHsEwV2ijYa%T7bG `*F{+NEwOE[@jx,l[V|NW$0?>yjf=K?IvD& x&s\ .w)SvrR X^@6^Xt3D2n<2Ef~i@Y)Z |#q<2 q6u7 ijkz}{<sJm1Ao!xSC8J; s ^H6wlq$?"4iJ@lT:6fB~Y]ng1a2-.KnDH&,^~wi3^~[w 6!o&fxX!p)@>Q%V:-/6~Iu`d=5_LLY UEt%tMM N.t*R^vG)TE + Lc f WqC{92C@|+1ui+ 9-.gkP9|-+Oo\H>MFek{ pB{>jp??zP F(H4 Vr\-{O /W ?[_Mc Mt W1f&7|(od8q;jH +IS+] ~+kz]x"R%lDm)Uj (}:Q SqPT3G9cuK0q VHKq~1_|o`B!'$So9;`,< Z+J?\8z aMSj@(K8OCgsP sp.B0F#4#>NWLzu[Ch /w)/v/7x<(r[ (@oakK8O |.k-PYr:|Kg|}$J` S.OWP}ED_AR@{f0KHKx9j6lMU~H -`[C*F:g {{iIq#-eu05[EZk*qPi %tK-1yCCl)JjCg'E  Q,EQ K &)ha=D0vj^q>>| jXj|Grhy]U=;Uu'Dhw8 n>5C>u c%D71,V]QvV$|[D9J|^'3Z$3"M:\b%.L}wZBekwwE` ,%|mT?$#-La7Sr`fj:h`0t^:G%b*%=Gko,j% +-8vPsPP|{d5II`axZ91" (9y;1":stU`FdGyY%V Kk"*Ftgh2-`_$s<1,La>mNI2w A0[ #S:5*= Jk9A=:G%r Q\k> 1Ep'BO*x[n~rhXc Ug J"3&pd<:$ ;1 q,,nBO,Aei;k^gG?ZW^Risoa`pzreM|YT{J0S'J  +4# '']gN4^s`?$kC$)#Ol!/dyvlB,'5Wk/6U. 7Ry6 AI0OwFghVzTxkyk[rcSev414BA$1cUC=-LV?/I:0$ FWS=;c\XM +Q (&,7>[H.6 CxeXs{gpJJe>XdB+MZl0A@$*.%E>+91 {%%'<C*>V>&%!5 %;1,2] -)IqmVUNpcsmWdnWRC\{SF11dyW A$+!8  } #<@BV\ |X>)%Jt3.$, (Hb[)5C1  #/%" %32==`4, #+/;:7-;7UYWmnn~}wbbnP.Wooh 13B+'%+VyS9Oet[D?hYLYhypoz}qT85+ tQWW:GUPaK^wijLaxzYF1$DHD,& $*vl~ 1,%#E9ZVjmhv}wxxkqj[h~edOEwyC,CIN]|lNCr #=AJ=)C>* 5-)5E/  IbW +F'-ddJ>&(CJ6JUSWlnF)HzrV?3>TtlidC5H_S6A/%  f\nRS||}k_JR[fu~ '(;1&%6S<(%%*0;4>--OVo|kMA?Trk^aGAWTJA1,-6[cM:!GmtJ ,  +," %A/  , 25;   0+ .52CE02A_mgWQVrd[EW||pg^gkfTPCK^g{{]P`vvhVlimqy}lfkZG_tY[]L?<;C8( 1OYM8#&% "=IPR4/%AWshI7;Kb|d^Wffcpqhfp!hSVWfgdTH<FMRjolT<::=49".BNAGG6.-F`ccYJ42Javyb^Z_lzrJ98FLX[Xf_ojXO=0+:Ugg_=0:an|^NIhswypQN^gp}xnlsv|yyqqqcOEEJcrkf7#:J;'  !"><)$-?6)" %7HLM:-*:SWc_TYTWQS^QC<7BJDB8.16K@5',@JO>/'1A]xugK559=EQH2 1&!')/OYRVRMMMP>+!%,<  zwfr}}lhhie[R@65:HSRPE;FSdqfJCBDPgriUN>[TVA3 !2WekO74V^X?31BYdnooo|yx}~zv`bq{|^93;CKH>,5C9:6(*11)  *+! %4MWKH51@RNOPPQdmuutdSXoi`gucZc !4;*&4<;,#$IORK7-(8FWV[MG>JMN;(&,CA?  -!  (0.$+9JNJMXe|~sc\`ao|zlpstlb[cp|}vtgr{|x{pbUOX_ppbK4:ERXYM>Lael^SMXdpskU@5>OTVNCA207LQK50" &)&!'1FPSL91>=GOT96=KWfmeW?L_zqaPbp||zxuuyib`p|}n_Xcys`YV^mzxtdglxpse^\U_qnhXKA>MatoZ?9>WencZNEGVMK=A<7-1.%"!313)#!+13' %.- .:I>."%((1.%&#3<>7-39JB414FYkpibTKNcqztaVWYaq{yxw|x|~|vlnwyzeOB>:D@9#   %'$8KG=1($0CLM>0% ) yvw~|zw}   " ,-8*+!*%#)%0%%57:/'/7BD:-"'/APPH0.0;B>- $-("    +25"0=@5$).1!4ERWKKBP[csifeip}|x|wklp}p_YbqtxcZNT]ledUKJRbf_YWOQVXf^_XYU_`fcaQWccdbWILS_ik`XVXhovhdRRW`kponkjnqwwtvxtw{}t{p{}tlw|y{o~|{u~ldfgpvnif_fmmh[WQLWYZWIGFXXjb\RTZgrz~pohstm]]`ch^[VB=689:6./2-;452155;8/#$#1850, )/:;>7.0.>=E7911/.+%&,9@GA?-1)5=IIJB<2;BHOIA41.;?B?BEFJJI><69=<:9++.+3.) }{qmgomqsujfZ[\ghebZXX^ekihackktslmec_pnqoksxy~|uqyrgekt     #*302,+/5::>4:9@KPTJHJPclmd`^cfhtpmgfgejgignsz~~xqhpjq__XNTVV\YIE<;8AD519.<;3*(%(("%%(&2.@27>DQVOLEDISOcXXUW\dfimgqspzxpwt{|u||||ehbqchk^f_\WWSWW[\`b]U\RW\`fZ]UWW\\XVJOFVbaca\`Zdfpnsttwqnpmgrrqntm[}eUhAGrk5H_MbUYyu[/=]D08?) (J>1Rx^BWzn?WE $VM!BQ17$#0?TYNVO>1 #'%67( %:(6K4P`<>OC&'21<  5E% %*! x {}l^dxkXduwgaMD2?VXY^aj^ewwp}rt{{wvtx~zdLXiqc^FGR]hptsx       '(+0%"-1' $     :JD<?VUQNLOD>::/%%-00>>+09DC83>=.+23,%-'11)"0.%",(/9QYWGLHOPLHLJIP^YNJPWHMSW`WN;:7JH6% )%''++!$%%&-(""/,%!!)*15@>6%*-732.+0'*0<7>6BALB80:CHJSOTW\]YZgrtvt|zpnmkgkhjYPOWgicffqpigc^ckm\PNQ@7) ##+033+'% !## %*$&#-.2:>&&3-*#    *,1).1/31:9,#14BJNRKEDISXTRUWQJNKJCNMG<;?;9,,         """&1&%&"%+432+)'(+)%&-6;@JJQJLMMLQIF5;98/(#!&&)$ .'39>@;;32324(%'.2()!*&&'%)"#    %#)&+!)+04-+.3;5.+" !!"$)'$ %,+/28429==AB@BHMJQVUVNYY[XWXUTORVa`OB@:>9:/0..'    "&%$%(-1/35977:=@8511562-,*'"$)',&%$#-+,(.*,3*-+14/1+..-/)')).1+*&8382441213940/-01*)*24-+144/$""/*'%%&(,-5002155/)*&&"#   }xywumtzwvvz !! %###)%"$ &(+//21450+$,**%%%!!'%%  (#"!$%'0*/)/,1/0101/&)#()     !%*176;7ACJKNLNSVYWXZ^[^bX[VUYWXRVLNGEEC?AAEEHKLJFJSTXVRSUQQOIFD>?5811*+036-.(&)+0;;BE?GAJLLOIMFKFIFFGGF@>@CHCA@<:57254788;;9:453879731/*/,1.0134843...-(%"&*02113147<890918548/2+75A98115488:?AE?HGQTUWYXWQSVWWUUWOOEECGCH>><>B?<:6>=??;@9:40*#  " " #!%(.+-.*4,5*0%*!%%%$!#"!&)&+&+'%$ $$    #                                                !!"! ! %$&)()*(+&('$#!!    "$"""                            !"!##'%'%&)'-(+&+&*((+&'%%""               #$$((%+*(*%$ !      !                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatSemiOpen-Hard.wav000066400000000000000000001572021366722712400241470ustar00rootroot00000000000000RIFFzWAVEfmt DXPAD data]%)=% q J+ Ik x 4N(#~B3[aFdP  C~$ /'v^ yF veq O4Y#b9.$,-~548T Q3 F _\5ң [(ۧrz'J oxPz'3X|:c +8|q 8.vV8j%c 'DC5 OCQ wP?-v%#B Q!K`E,A @XvD*- rz2 S,w Q!8/(deɒ\׽5ӶVw W2v 4jM+S0t>ڂx)Q"ڣ݉<Q_p$5"go5 fNk'],W$j%u] * `  yL Hh d.y, -Aw^u ) &nz)&p C @e{Z3ImY^.pa]"|QCg( 1: c {p~G&P֧[ enA, # * | `Dc,(ٜ"% )` ; 33!-r#/~X".+ "cP%g ~iIN(")y L}e /Aڼ h.W ?&Xq MֶX$$R.A ()@ JE  ]y#?#6K16 ##h';5D޿΍sg?C!U_ ft]yp) dskeGy'C>Р  p˥Bx"f-cw $% (}"^+P  4F&(;"(%< EV d6 `]ȋHצ7w5 $Mh,1 j;'gopߐ[p#x{ "W!$_7VE  ,@a ? Xt xD3mPs: XT B@ `dC9$u1*^ g ۼm! um ٺ JOZ3 y D+TG_-gh;9! 0 / +5$&$|(WW K 0DH ?^ n ,ʁ et7)۩v߾  v C1:f =*cN  X,k02r.H~" dw  ޑՐn(/ u13R6 ~ GN$E"BCf׺!TG pgw= ! ݭb3O W B :-4p&G y*&-Ed!)/<6f kHT1vN?( SY-r <ܾd#ۻ;?{v,T9R )Uf#;W 90_ pN(Y=*~!!,K<) Z'AT = T+ vtΡ {+\e&^ -״zQSl"Q[h/! s޾ n&2T#R CFpq`P1.G#sH63)W_$ Xl* 2t_ 7Z07z'7f rD(p/c I&rl_ X&P,r}JG~o ( Kakb>U(qT):&&+S +T(#K%2Y s L& D2 }n$=0v` ]  0 /0 ^EE*?v۩ 0O>[aĿ S+ qe 0އ!ˇ'D  p$!% #6V Dvd={(1 vP0=66_x3?_Js-=j*w)SO # 8 c$#5 ^08 o QvD6 o Nϡ wP ,/= QIZ: _+rFv f i:+}ـl=|3= g S G}ε%Ny Vh 2  n R  @%."aWY#-H{S a;*V s`)rr9 + 2a fWVY G1(C'` Is$X)~rqCO F$˭ 9:NG. E5] ;S؁O bca =-2 e0b wSRL rB ms :d.K 9MG9dbX"j?} fz(v Qtx ed#8>]Z&wb` )n'K m| TѠ۾`RU{6 yZ" d 4!D'{ 'Th%] <OXi^T ^86L|z ! 4 !/ ?I{HZ\N" :m<=) aY'v' FM  ?)Q/!_Q)v]+, [l|Y G A> d X5KK`=< m] 64 r  W]mZ5k+KNIV[1 '0K$\")&P |9 *pj0{OEc ky#a#J& tg*T| pw<l, 9 'Px0&HSQn'EK]Vm T  {MFZ# BtmVC#J]#r(E! N ^E# | 'NKp) ~WG7 6{oqm# 4?-!fqRivE|9=},wvK6U(- -y Q%E8r *T :;ЂC G b* [3 WrkO 5:H >9X!Rj0e!/S6N*ܑP ]ڐD  _*n O I tl3^O(9$ݥ  lP(Y y q_-0E!+X4` Ba   S;t   P/ c +04 ?jzx;_ k6 QR9i! 1 ^E(h CSv vPHkP &8/rA-Vj9I:[J 4!޷J ak@ L&,t b ; .y G%E $ H6pmv- o@o+2" dm&S F%!6.,! J#>2-El *_ @@>h  | [$4 ( 3Tr yđ L4 O a+'~N- %iّ  Bi bEؑ dS&="5e' 1ߓ' y]v?,w* Jw a_Vzn_%  #o c &{wz  te_.G/G\- *"AXeߧ $3! ft(A  {  3  t GkcM9#/ 0 : |5# ./Fm :?L m  |Q=3| vY xwz"u_QSW2{ V MQtSF#5Z[-mtPo 7 N9P'C jm|->nb@jI.FNz 1'd "za ~ !R bM#Yz=<P #msܚ:Nk >pQ/ă-:X6 WXJR ,Dm 4v 5)Pa#RHd=} #*~ MmKU$d :\X\G j sq)*%#v )4>?W1gAHzh o5H*ok g GY&(. ! Lv  )K] _=t`׊fh'0 @28h JRs >m8 f*rO  "KCR, KX_L&?٬#%5,^/&AJ= nAxcm$* 1|QJ  g\ߣ\f > L &F n3R*  ;W =@ .=e:3M]K)rWD[_  +fx-o`,ڼ0wrAZ'as5;* 3ij}J$h @ -+[PBA p  G,Z,}h( !{`1v axuv,RA 89\ W 2 2 CgC = dqo;ߑ1G # F  )$$ TE)3/H dR wbVtCY&eEN yKCYkW _ mn@V 74 wxg ? +pB&OA 0uc <( !Q>?1 Y}~} #m(    vt N ].'H k5jU K Tf]J  _BR Z* .1X j mBh=  wINa05 Z ?t7'J :m [Ei;3 [  DK4eg LP `#P A(ZX2 ? 3! 3 1 :j R B`It =at}$2c u "9[l*O# Myg  HJB0`*v 3cX8pp 3'rf`lGnhKR8M> Xpd 9 E`k-!FbV Y X &}eW) ~xC5Vx` 3M K  SqUi &r -U`+T >=DY K G|  >% 4d]u9 Gr^ KA! i( E 0 @6KpS0A( .6J5/o&\*X~9QC.3~ay GK?}<f8"#Q# E^I |\ee4 hsb "J6($9P 1oh  Bfn _0 t98V }ezJX^ y P2KRT` el JZ   P[ /Y] S. ) @i VEZ9s eڃR }P,4wO}[ : N2R* |  _  ^, T & y $CH 1X4ng9h  rBa;Q0 @D 3I(3Dm<o?IcS; Y}N!".U T,e> 2Ng" 1~N RhIZ"$0 !cn g8@G &, e G6, P +;E\F a 6p o2 &"fG h.ACE.9Ch<  A}" |$+g4Y SW8Wy 2 [j {9BvN`WoX k s + YA} L' cWIg 3 e%L}8 hv2)##} Twt jK!F>  wW "zh[4-Ltcqr&zt}# 9G6T "  gei_(y 8 n4f! |cWi Qa'c@DvO -T; mFNR J I %)k  oq _ a x uPM;_ m_D +if f 9!vee; t E{ &rYa\1qp}a`MYBb&O  0J;n# ;R2   5u  e{~( '3VfjU)i!#j *  J u# [ w&an" x: E/2Mxlf Pqo;Fb 4.= [ U  -  >q Q _H~3V aBd 4*,  svMjie.;0Gl /q ( `=$z jzXl- }SUW  n  8m0rFKaQ)|:M ML %4>9:ry h= JA y7  b ZxyLZ ;c F#m&J EC_Xgu$ \=$|O~H *n7z^ 2g+ ^c 6"^. G$ ? ?D P I3 jQ  PLd c! U1 O " mVN@QP:9f~12 zk-  px^!l:404  ^pQ EX3$r` /SD] /~1(bA!Og :^ ]tS J d [8`udZG,Zh tIc yUWm !; &K1 i7r $ l41K1 ~!  -2O %E0g b;  a*'ZvC  x)a E5Rx$@kB ^;B> n+6 j1!& 2pj K R ; %Rs=N qx@WTp )t=" "0 (6do@ t*p%lS8   ( +e,oC37" =l d+vy* V ib 5 RY m8uQVVO0Y| R8 cwT-) Y Hnr_G v 1$/0J =  iVIHH -u>i!y<sF)u jX= a 4 ?B9)  dpe@7 D H "  qr $C 4%@]StVS c@| 2=q G vEF. $jc" ) Z5nB? t0yK vKh mr:k  'Ue&Q { LY c p (U " s5j#zez0"l7 k v*<X}I=& !t=  .NRWqGt0R;v)]-m Y1 Z,+V )] M: .3 1?%J:!gF@xFVPR< EAX >WO F{Z)_!8 Eq30qK!m( . E ?ZXI ; 7 \>i&j-e^MZIFNdONa@ k szTD `]: y  KU\ ~a3 !b 'r  ]:  ;`L  $.8y Zvx= u[)Rr p>Ao ,0W2q [ 6F| 'W} D=WZ4 W 7m@$tO8 F=FWbS1~:f ^`y1R u MAC`Hu%P=mb'/ ug%u  _C5 gU2IT l [ rJ_Q\ 4 3Z)M& {L zP~ NhGj:F% t}%"  $h pf, i {> SgC 3N]6 Z7 x C_ kX js]t"^n kqQ7D|\#XwFVAw%rK&F &S4 h^$XS GK* u a;M :!5~ jiu$j\}rSw#;4HeU N >Rlb0 %puTa _aK v 97Sy[|_{  ^ z\ t   ?a  )aeHC C I aM Zo[V]3gqJvJMO5 YJ# h9^ +rq@ ~ )k(?Pq`)m*oht> * &%d mnJa 6e pnRZ1|,O0Jy2Q P6 3u LG xSsp #Kz Y+V ~ Rx"Uk!C  / 'oK2hrq 6.C"!b8xOp ^^o 90H] wBA> !< ;pUx R]X1[w f# % g3z{s30[>hu o6rb55 aNc H<41N< 'k&< u  \ p( W <{@/ `gCv}X q~OaJp@b5z(F: 9m@ m , !_{+% (S/$ rLw24 `Z0.SB @'RGQ(&VVp 0z -*|3 R@1wkgb>D 69 )/@8Y2"Ej ># 96q}e0R| 4R {C}p\ Uy{hn6}{QB qp eL[oFX .a4kQ^HYA]* p}HcMy#Ca Gbe *N\ qa-..FJaD ,"8d//G {c&S3qb)M @|8vJ;aH 4St8BEgy X^^]Sg y[gFq7'U6o\ !e Q 49 p&- i bwv G654K CiKj@oQ VFSTh ){r KvU)~b-mpSmo|m$M&TK z9e5s}<[(`R{&;q[t G5\g{0ps_Qbd\[ H_qZn+M@.z$u g2/`M\ey  GWPoT; r`: W6T) Kw9 N6?445R B|z#8/=fd Z)&xg&@F.M_ F~I=Mc u`O B?>Z~ w"v  ) ~Nm[2HMcG O6W&cEaw+j#jR8T CbRe5|R! 37]`^FhLj>_;#0|!~qCbPO rV~f[391^`E B ~7}+hU H . &GM{ Zsw_ Vy1Hj +A`$jhUI&.teRgm|uJjj88Wr,9_ZD 3, |AKNz}6WHKg?l*Hc}E` gG^_ !m( ],Uw HV`DnGVvU<_UVoHuX+z8O2lYUUy e@*;AK)5s"@CqlzDS=XWW: ])6h2A+1PwPm`SkYIKk=jr0s_{rWc-Ckl`g&%Sq S>ES+`+gmUZ]NM]{0Ulu@r,} [D7O o&'w1#)/T ~'`\A`WKM&M][b+fs 3or7FFOE*a,{" !;Yo<k* $qBP OqD$3!X#b \T];]+@)Pz |){9"1 $@b! 2>r.C.LH(PAYl  7T1tQ$ T$i):ehmPR U'h 9|87Te \?N*S +sb=~HD +q&  83rHYmfh8Ay9Fc=W%O _>+=6?HY~2w:u9_FKQ /Qopbe%4wly]" ]Hxo@IWi 9At/Q[/Ie i}s@E3mFZ?{!dT;kH8DGR7 !ZRgo hLj95JfO5JgAz@/TP FHGX v>Jl%fa~/ /?1:m s:fZ K[ >u w TZ?`4QLXt:`zA4]zS%%\3^u"t~ L_ 8K5o GlsV_xW3=<ueO` [o k:ze~$w=%2v uY:o/8 B !GV]J0 p9& F8U@NA^6=3]uKv9&LEx@8`kdh$iMEu<)F3gn(?ZC) wj?;: &!hZJC+2<aa}nC[ j=_  G,2'klC&E4 W* WW)rMo>hV 56 8c#W/&`z`$z4~8THYMW]S\Kh8o OoY0FN%qSf1Vo}nY'n.2J |.I#87wkq`:F2tv226>?KLKZ:$ErK-xZZN3BuM@=d  v suo}v27MerZS;HqgE#r'l,F4YiQCgw1tPD$q=h+'r{RM{\1`Sz$9ijt| SCIKEKd Ing{1e6kbkAv=[dl~0>$,Opy~( (&@W1G7dq8 4W60>yq+|ycnuh><3} tz7"HHE[N_Jn-syj`b'VT7,y=yQJ6UAe&X.z_`GC r,$!lHh_"}w|wJ;vj.;"gy|^Hw2o|\A\bZ_|_J>K"QKo`<W(]-4$.[lXfw]  Uj8(F@XF7At'XbfP[ze: c$qENCUru;+1&`(2:HM>!_AHY#iiIX9I8Q yCE$B rV^M0%-PDVLE?k/ 3mPVF3?EaZ%xQ (i^MU@*McLH8~, 3B! ;@&P-c$% zcJV 8+Mr(q;iHjq# .iEGQUiBxTX~lxU ]rh*.#bN(A8;SbsSRURzMC A*Xc{H mk ! J0hb(C;;e<!`m|Jpx[wXF=iiU__u~9. &Hy(tz~ V}/Byy\ XPY|n#kt3>O@ `.EXk+f6Kk 5C<0,>A;3GdJm C6zZ[0lN 4l`!(u~!,Wx)/ [k8aJx$K] T4g%7tPLq)}XWWpi`c{eml5)*CX: g(>SLFzb]oZmd,!2\cI^C !U M=0X"ZSEtu}Q/lLo 4W:4UAGMzC$/&T=b'@whmC+]T &Wn]|g vO>R4G'N;W"4$F!)q_lC_EKNS!i$Yq_GB-bPMM] ;o=( o'4px(kJ]PdHhBU1F&G e!$8lHk0{v9GB#z@Ef6|.93Jmnt+ZF-yH}:h 2T +gLJi#LRCj ]GubW4F()g;'mWY?E X]_!r02PChg(nz+m5|~4@rHz6)Pzj49 +S!$o;s8#VM4nF#Ab`[FS}_q0FH)XW6/7P` PNj&:bb =wR\hmA[u+2CZeH ;N.>rcbuVwaJXg!Gv AMbtXuYf|xZ:c~\wK6!FSzS?/yQNc# i@rrez W.!X`48'q.U 8t:q64]/~#k9m4t]~Kh; yHm6Ph&|xJ]u .yQJ<D_Z qP8PKF)>]3Ox)M"RUYFpb\0h\=Uc^.=p4@{4!d~mUaReo-?_y` <x?``@e)F9CZuf+1SCm;j`0P0y<#bU)]t=$K&IZd6m#HP_> ou;D$e9w.*K'wBz~ u y'+herlrC||c;8O; mty!LV5[o-2@6bpZNvoWlGE'7#o;-tl WF9u@> |j#CfV=O[0~/1z:O; o6hjZ+I^0(?M]`.e+#[[3;}S=:="QlZO C0m6N8)e69:]M &HXu)bAB$~4RozM-*EJ}i"AOF0FghhO^Caazb$} Q1Hb !AAWjih )3y6tS!O8S~J! M.a:.o;:NShdO]r+`2yw .W>p`[&1hV x$0 "[h-..7CFCj=RCz-rdq{rE\WSK6dO,Mo@lH{'0Z6qG I,s$Py lbzF@'$JHEor.`8A_!4CUFN+I4Sm1&5HHuAZ 3P|3Z1#`qR&u[uES&04 bGwO.x!- Ckyz0 N.Nq9#@p!PNP|zI#ar[~Pi@tl8rr !gu 3!0)HP-(`bS0,C<.QxO6MRE4#gy\ Xoz`Sl F5 TN0e'?TyCdm.H kz_4Gx#mnP}Zju1*R~~IrF&!~-JP ' z.)c#RHRq!M4t m-w`nqC(y$l>d+]ur66z=S;(w)J|&qKKoP#{ rPPW)E3!]C-MB+;@C>9_UuO=k+[Ge5,5| y~dX|l33P3Cu}Jgm9D;\ &+b1>t)7lR-e|5q6=yE()H'IQ>3_@!=] NPI;nljoI3vmb;A_H 3J)!WXj( 3~(rFZ|+d&0)|XkXNb[>H `oa-IEz%Pm]5Wg3-_h4EC]\&S!9@eAR_5 P2]nwg#6tkPB=cqPg1 H-Kwb{u]>gb.\K[)H U+1n&"#9@UU'~o]F#se9A],6K{pJyo~6)(+wKsH]A#AOy >8[===jH=0W\!`bl>~pVM'-0CXU.R'AX0XzX;j K]w0._ ~IH =Sy r]jP=4j4}d:) lwS`qG{Yvgo1!Pt!XKtIeZb~K!b&I4+=PXw_dWC9CmM;t]`m]lMSFEuPy.,68m7/~=y.Ra&0- ~)][eqA;Z. _UP oUm6:6NSjhhd)|]iRPQWm0.]I >l mC,B 4bo;&UC=W_H9M0btPC>_|_jju!ANPj8m> 1:aK8@gU`XrZ$mAAuqC)0~;|wD gqE_-N)'CJXhoob{=4 MbUCH&mh)XzE.!).6r(0 he5eu;;,9tWtW'Xy ,!+a1]o;RDH|lqre=t.el 3C6Ww m[ U1q)tB0)wh7n>:l-:mz@y>K,idX.S!UtHl).tPH_b.|9;w H|9)g6wZE]H[le! ';C@@be!Zd[aM)90;6X)U]|m.|J]~#z.dH$N SEN[$mbohroXot. o ~eC;zUAwKwZ ;.lo1Zo .,!N~o&bHm dq;)>qw.oPo|!,XG&Cb!u8HP1.$CH=e>!P@zB5]BrC#e~ o]_! K>1.)zqPKH].JM3j'Rz)r8$S.4>|]|Hhul>|P|PgrUN\wJ~Ww+=uwUZo;!$60')05o!|`> r#j@,PUq|o6r0bj6OioM1A[uXKX;db._Cby9mH [jMUe$_XFr,#Wwy mX>C.1P)6o$ 9 .tAK;h).r]>`X!o3q\AGw> .)_JX11l$&HmXM1|tZX.yU!_'P `PRtNS|b$yowe[Slg!]H4$ !e] Foq4rywF9S[w~N$Cmuoo#mHANK,EjKCX); S rA,=K.4!o1[|)ydEW!]t8M$j N,o86P. [qZ!m[A H!wHXzeXH  91$j$yU;qg~#C[oFSm~l>`HqUXA)X`#0PHo[Ch1 3!tU5 HSuSq ]4Pb)@Eb)Hbw)S[6A>]h1[S6H|gXm!ylX1ole(zbbF9|PuP]mU!S~'[XW'zWH!1u~FbWq!ZX!h`]Pj$P!!),[j 'CoS'U',FhlH` |yjF!60jq!H1ZgZ=Sz o|U. S`P]4`mS Cz> )>.;X[m|,$ o0=b'F t]J~|RmZ6># 4hb4HK!r|.|P,w1KPK q~]e|X .1m;)u,KAe h$b ezAbN ao$]N$j]4U |U)!>w|4o U=oP] KK1HX{).H )Uj AKl'Z~Noj6$][Z6u;UC$'|ljCNg;yb]4|yA>))tdl!9jHt|jK>E]jH]'!>r&hUm.9(:M33.z CR PbbCR,XbH ]C)h ;NC$]ZHr.'1N. 6[UAh[`h! m 4 lNX!FbP=oe_ 1wgM'' Ub6Ml  !W1PhN14wF$$]H]m,!KoS!Sw1[m;A)e6Kb)N||Codj',|A!;)eNCeCU.~,'PFU1jN9ub[ ]H C 9w>$ S4'MMt_@C ub9rXC8+]| $~|)9C ;C.KC!$XhKb)419,9hP|[[$UuNzPH]\+F SjzoS)X4hASK!U'|@wo[H Hu~j4UC,4 $Pb|y);).z99)1HoNR`(4m)H`[9`;R0~[[w>$  $$1,oorzbUA)4. H!PeM_!$.SojrU`6)ubHbrSU, $P>ChPeP~ 1j!P1q !KN=bo Uo61Xu4l4FFKz,9uH$19Hmz9$m9$4$mm`uCNj.C]6[wHz]UA>bHA4U,) o;| N`dZ|JCKSbN' l4b64Sg~ ,>|N1]4bXP]);>qjMP'>1 ,q ,uo'mzj]qH4bo )`!8WX|X9$]AN6 1Shrjb!,);lW=,KX`)6A9A.6`uKA$1hz [zwCA ou]'.) 6NHA>4$ j6m`6]]>C,N.;C 9`S6ubAw],9,$) ! >Xeud6].$6 1`. 9Fwde4~PRlq |b6UX,4$Ne`mF,`mw uj,;'9,;;PK;rC.XN;P|zj 9; 'FC11 ,,.wA,''Sj>,4NN$Kzb4!;'>CNHKP)) 19 'NSh]X,>H9PK1.N4>'u;td$4F 9[64~SrA ;F'R]4AHF.S);6o$>4o91HK'!FP)HjKwrbbwh>>,9 .[UA>jouA, 'A9!4K9!4zh66]9).SU,A]9WZ P[6q Fwz CjS$C616 FC6l'!!,4;.!CbuC$'4NuU, 6me|` FN6 )P[F4,.A,  9h[$1 6CjP! >[1mrj!ol9K)'.y>]Sg_t|A,UKF 16C4$rj~!HPF9 U`N 1`z'9.)`N6j9C!9 ,UF1!CejK$1,9H4$9U`[!~d$9KuFHb>$'>AAKhX4'1;Am]P,[hP);[][>;]]!Sw4.C6  $KweAoe6!,! [zAP4!S|ASF) ! o) ~|tKNH.,'  ' 4,,t|)H,16>uS4>A ||9H]1$! rmC)  !!$6!F.6heCPbP9)) 9X4F,'.AA|m]S9$ HU[ShS';jze9!KU[z]! !49H$ )KS[K[S>6XU !1,9'$]oH$ '!! .4>; HUK$NA>;>C;6'']!$>K>6'. 9'.N>,).1.! .' ,$.]9 ]6'$4! 6[]S>$,UZPJ3}8+(ps FF96,6Q,,BU,:NKF+&"C:+-(9!2]@!&Uv_!3UI * Q<A8*:3\A)   5+ "5$$9  /-6 (DM$/L! $   @7= -+ $WuhF *=&4A8*?<  %5>%!H;-    6>_M?)##1=' 'DH: """  $$7  ' % 4- '?T; ( *&1(-3(1PRC" "6" @?)         0! "    &#  %FD+,.5"'8$ !/! 0;8)  27# " !   *1#!   +$   $!#                                         hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatSemiOpen-Hardest.wav000066400000000000000000001573001366722712400246620ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datah- 7l+ ( n  l,kDtH^3V3R,;d 0* nZ;~x z Sd'Ch;4 , 8^Oaq" \ dZh #F9 !/K w"H pch ] OaUSR= @@ݵzF|SIr"'f*S tm'$(@ zElT I 9 8 X,ދ mڒoV  }R ;c 5  \Sbmk *,r$ u 'eH  kС nouf\L/[g vR 'BCu8*4d nkQgX E B-j@~Z] U FbSZ[cwoؖp@pWx`n4f 1 ZJ:  j=o@f;. E  G2 2 NX6~,Q !cfJGh  8sXBOu1{s`"!HJH .Fq is V4Gm* @H&%5S gGsM 0#F" nsuDbխ"φ 9t IH H=irZ`.<Ga]E KFRDQ 7 f6-!P7t F8e zn֢ 4$"h 7J+'g~0P`J 0:\& $% ;JAuqhWP\ Y G*κn%l2\ H Nz v({~D& 2 i\," . cPz jsm"Q"+'vL u|!J{ <z* V AQ 3 V)"PNug1 1[` lM2 wQ#Nw^0ګy67 "@ Wtk)3$/$^ W):L\sG @ d-ί< LkF2 835 u.'H#Z?%929vF[*IdH + !&UQL{qf ! $Ρ#ףR`'Q a]F!i=ޒk:2Z@ CFr3H%*n% . l@ -&#tR{B5.wI_F+B {n "ӿT)S џӦ~(4e%pz Y) ?6W=% R_x\~ U P_CpY%d b vږ$N*FI/D(5|D2 $,w,' f$d i1X%Y~ޥ  @(RڭxHss J@&Fs[ڊ; q)HXS70$!+Um 2U'*EWD.z( P~$OR&Q r>oS ""nRA ,d%!, a !s]$Z"#4   eϬK^7$hWp|׸ mU Lvv?9)$W#W M0u!2 V[m-x2m ޜ^7{=)9&`)@XN |;Nx%*,#H2sB-J  |' ~o>ʥ>HeɬE|U}\ǻv? 4ӯ 7V &(t*TfB &2H ${ U6y#2.2ev?bNޫ ?V ڈ1; .5sUm Wack#^\4ַJE<{ (-3!dq.#k,>7eV myI-,.z  f<&ޢ B\  XH  ny&NK S*/S FKp8:WOI wr A-rbە۝%#$iUIr2Pel fe;&h1T"JѓcTT # )ϻiz K y L`A 2?I6 f9" =iD  12u*%ب4 hWtmrT9&i qp9ww:|t1m Um +,tDΊ,nZb  _hKF ߫ _  U .mr'+e.=(4<NJsj?B`) b_=@ |4fi,h@b(Ͼ )s )`'FF+'  n 'd3O $K 95 p {{. 9H,F֝ +2lJW)}1 .'C " kQmq O0#1 DW B 6r(A.i&U[F Cz5~ g3 KT_Y)oPGoP4:IS (7}$ntFk #{ Q F~\xZ{ <|#8l@ 70 |IMX$ b%Zbq +9 )H!qPe[%>>%qe3 .` &| $] i<!  $;#& eN AY(lIGv;hLj?6 1W-7w  l)|+_%x#+?W Mc K t #\ a oXUN l< KKz= ~?3HT}^ w a o% g` A ':gN! ߸Jl BDm ,]# )RyBH)fsx@ [` 8C v(kaF/) _3 j(&L Yf@h}"L 2:<sk'+\!| )s1j~ ( U <2  , o>nN| @ G 5[ M$(L&TC/  L**vl93gry$ & !/$fI gܐR:{T߈O!P&- h8a<>j X y8 SO&5~icF_&3(`qs\MKܼ$   1 V(ha3 +3? A DS iJV))*;-iw٫*Ud r"ݥ 9:  2gCb( F*V/h) [c' L % -3W0 / AI4X} kIPZ^"ex`aw.'G {W m `2kSl 3# jyNNmDE$?7&A  Q) ;( O:drJ'yS x d;@ $  ] 9 T p h k"g 0{~S [H r  JUo1 Ju;t jMr.B0 ohU ` qt i |0vK9~37xe;FL2 UcUY =d  w  H* ukg k @%@$v 9  FG br L,fw, ^D _y Mz*a*"3o&  !{2dM K#$n & Y}B(  rfa9 /w~m V 02kf2 vC`g,$ FUPP\ F 6C 'bY%7=[ ))n\hgzr< vX >ja /@= `w w<rE & JON1o5  u H9cG P  "epoT ; m w _ c3=&H wWc z4Yl %  }{  zj RTg -s Y #jnTk Mf0{!  ZsG{ a7^ bb pS$l" '.\kQ`[oB: /d S <_j L }- ; QP>:(% ^ 2=' >a Z| &m I9 N u0ZZ O  D9 CR&X JN5_, 9gE"{ Nrt ^!{5  U""U 4TFw# 2& ^Y~"T ! UN'95_v  ?{z(1x F-5[0  sxt: =vk k) $ | n(ME8Yf3Y X k# cr vYn38 D 2 i ? ll |  7h M a -5 Q++;~%I8^D;$s'N;5zQ,me E{13 |hy\- Q +d_zANWtRE r#6Zw _$U O'6O  5vor~ (1F \ikN2MY%KmtRNkrV]M n -5^K  WI%q5t\D?"sGl  9j4pE?;qQRzV#J ( p >Nfpf) t&  I+qEg' ^ ZsYXj*Kg ,Y y55W["!eWC1|io7 k7-% A > ;h pߧ  S7?V!2ߨ3b}VmCy[1i t  tBiu 1 Z `; }=  r[^[ < spZ wqD4 #CPxBW feNX^('S|r 3 + -<CT "  ~<tVs rD" Z/  #XI 82z *%(>e '$u 'kM #pZ' h p_.@Q 8)L;)#"^2W 2 Z (eaS'X oe  tVH"f xJo" -kNJKai 6SST DF]Jbv/a^o@ 'Z $HqY zf=  , ;-! P,q "2 " ~i5P;Q )< EQ >E,6b   ^> e  c"b OR< ku0nV wyFpZDO #$B% g&RyFy?yX4.=  ? Zk:J*\[ ! , Z,Z gFlyl=# `@J"Vl 5vW5x? K;qE+QB)[(e K C5#h;J1L6` M - __CkK c a.:m^E-.Jt k 0  T`S@E@q *. &V^: ] Jpm l3 I wQN qU jHl-.Fd)U ^a*Ubr 3mb pjb s-Q )H<\d`;l V: Jk :%0G :vuN{A 9S Lom`VENO.$ +$~| 3s|G3 7\Iw5gVKd1 I ae SqMedc+T ] \ H D AB'5 lf  !^Ts-_#/FaC Ui L,P SD23uOD V rZ? 'A OZTscbDj wy`l _-QePj* $ T tNI e2  "COpP dc MgZ2G5VupbbB99$"4  a :56?l; ZI|S.H^ ej Pg@ Z~"\$K'@ yn> D  7Y nr3` qeNy1uP<W0LNQ7<W sS T-XZc ?So{A8hR)f sg^\h(/^V K yY0 l;p^PT"y88J0Z*| #h3Q$ +8q8d.pr(0F 8n^E6l `BR sJ r.M" ffWbn|PKz .,c '|Ee* + ;O0(* ={z` d~bV (~q yGV e 1h i`0( 3t r bk v !.[ |} "_ d < [\n K.6x Hy@ X wRiC 1;G I VxiH n7/ kgo\'^o~? 4$" =]vbq3Z-wBW j'EU%G KGGT6aF kW+P xr@ qq_F ( fHdf[My F 30H  4ZaMmBXGA{m  0 + OtaL[:7 D E_Yq T  lX&bm)A^4=?j fZmQp( 0 18}} Qb O,l+^ N{I6{y NT-oUz p8Us  b uL-. $mAGcD8% `b t8gEX&jwvqQ;L t&  *m  -C&sm> AZB(6)X7nY@Q/y H $ -J% 6gpf "c:uTRhD;Y ca2LJz9{X ;CG} o`<@0M{  u #/p-fB^L }j O ($; zc u &fvq+}.9TVeEr MD DNd5/9 ZXT b$DSGiQkTO  r [7G$U QA d ~Jn ,G ~c *KA"is9r-hk`Q/R-Yn2MFVmem D^ , 9 eF K Q ; %x?= Y GK 6xB fE%D_BD|#yIj=T \ E\NQ:SADwIj? {Y3 W  BbUXHK O Xd :H9oMWxz`3['e& azU \9-HC-o,abdh?`2:OhBSl.Wphob = `Es^# ' l? _ZNj\>|,!G" 3t*UF`LVQ*Lc HeF2 :\l ( c9e#QJzF bO( {1L 29Q $W<iy U E`I(p gHE5 _ e n{> s<%<Qn w)}05'&F eFJ ^ )D9 + >?L PzV# IU~<"  M6=6czGL%/DT  ' |GJIz n~Q qmv} W)HA?)6 W*=F 9l?o;/ p :g Q*IX\pzi z_ 23m@d1n01][Q--EOW+T>CxT;_Im: 8 +N'R `_*$gi?O<Ho+e(A9~ m\$b7s~BrP)J 4&]4G  qu .l*C>Gf|1gW5?Y$ t .d PY@ hOHt-}};/dC "gK 1@.TC \>iU. aI%]yesTt&plXo neIfb  }OU# 3 wlk.kH_g)Z ` u|@! T1reU :"S]:c7Q~<"H:om%Ha7 l8w[ E{t;Y &&{x  gXU]_A O{ ^*% "GOKnu" NozSe4AbBu~Hb;Kgnsp{Z UZ4 H0K o UpC k\ (2f ke]7#y<@ F3z0Xv}orc*5BD|1F1JR&%Q*d8~v ib!  = [v6q hS Lx=OTL@Xt"2E_`{B5xJ:38keS:dR~ kz,^>iux}  7"m-9~  # y49$mm q '!XO^ 1C915</ywIWo I%k@ 3zj7S5u6-60tTM?H u\x)4 ?dcIyf Fenr1Fq7a [ y;.z\mZpa h |R/ Xw k $; % ?I{}aIZv!] s%Qd  qV `^~| Q e=H 2.H,T_LD`Av?X/Coi p ]J q_7 A \ >?7XHt\s;z\d;N QO^\@X 16g o4>Y\tF :RXXZ- *1$D4  '-NU(pYVm{H% eE_9Jfhk7@ rUKK}\ XaHHb:+*2 Ba4vm9$WXI! cwQXphbIy{3}jQ=VnO k?QBF d,]8B7%  j1 Q bR  i#|E_x xlmq _<0+XkBR p1 9k7`Y #AO +.aI I2 K%h  i5xfRE Xv%U ~y9IQ G"3ob EIf<|,;L\\?M OY$\)@^j3If|hRd/L"L0?=-/ :sr,hme%c+vk)L fKnTQ>l[ g o` *(>)N [\/^;C3/lny(d~nl3YG?wDBcRDJ4:XK L =o  mp(RV8k ({yV%-Y>kF?` (|wo'1jN?SKxS:5ZY*Z'2k,' z}.o/?^ ^k@h~^&y !;s|xC2miWu F^.od]$'kk 7?KU M1zdy <Ab4FqYCXe%-mB\ M_ U"ge-B;n >RN4w\J:,,0wZ&p"3xEP?^)7 Mj"V2tWA esDv y\s]#7*r+vg  0"+>{B/%lbaR^S?q"kuaK j|ky?u 3 s:13oU@ s|BP~8.[7e|s}xwMK!4*E&a 4KrtDmEc??y +(O _E\* -\iza9MHcx Y sb50hH`kz@s(Tll;Acv*qEz">&;{O|^Az Ht%AYaTh2%,O-'~Af&e" ve@HYcaiLFz4ZvP|QvODZ s"VskY#1:]PI{O0cJ"9Ttu" j3QuIT[;#=F%T1"nDYsW2Y@I; ad#QZKKJnGMG\$F!QNSW& cVZ%z1Wux? BB g{VcfGn>&;<4Dkp(<gT~!pTiLeo{L_$8G(Op,hHbIB}J;_,(M  xck~tLnS*K["7*X1,uL$ i uJCL%i+Pvaj.TL sk1F}l"pXG0Cs$60 c`^7Q_z,P[`y~lk)F e{]dKF'Nv4= Tw1|oCf:f S1^}FwJ2bn<}^M sZVP-n %qiRD%Kk^\IyZbB}Jw)J'yk:@uq& :$T$L6QL0Q"yh@EGT{m$A@e< ` 1Kq.: f_'UT[No%^(t3!GqD*iaPXX a8nTB7TM/Cd5@q(p6]9fW}hZrRo|]111AG$vrmuY{("(;]L"Id7p.euI(^*ckWz6BQ:ea`gS3qg)>ZF vHQbM|]A YxTIMQ z~N-P -FY tT/XO^~} zgb{&nFLE H{jjIM>|D:4B"Uq-We<*8c@Yx^kW(CY~7V<:5d5LiZ[#?tn-N hfxbj~<gz"u_D[2B 4*t-*ofS_@j$E2 U|wDO*' e !7[y~^>jeL1Xr0 -MwDsOIhpk:pps<i8y)4f3jp<&e e<h.B$}|$;GN7b[11$G:+aGBfb9bfK&' kklQ)D T;zul)j5rI.Y[wQXK,gp) E:`,}&D8M@.^~M2w^Cd:"zd<^3X 4e0V"p: x=i[$%;S'K\Hb0PJQD`3(#9WbT"t}IaXe`dXDhqfBj{ZGoDl:mQY;G23MQ8QI i~Bsa*7)__Fe[plf=Wu"hbiQO; Q,'LHi2g'@"9?1hDcMy d3|f>w%w SuxSf*fnG3ki~'?!!{h_ (~,A\*B5^fRTlfO~*Z~<Qi/itAVK; ", ?\-K@cuye,9Y}g Iw0I4\ $cG~>r*u$M%*\ I ?{RN(9 G>Gl$G51u[A72#G"~2|0:Y*;) cMCe.Twg"i-hW7DE!>aDPIo&Evw~2 LaAasnqVs#F>$.0wAs?|Jt5cL}Dm{~|oDVf5 p4$)` Y?` xB(sT5s-B,Ty^oOWws4iJJW h/T04,y'B<*JpDq Y.C"lCsi7,^VNGp L/(g^D;:Q,B|8!l<5 a*IkIqCDk/[SQ=#Pp^yhkn&$XG pgyn 'v*?v$'6%bxe-A2QG[peB?7 gVjrUQ$L8DeSs89 nWE sleqFAZ79P{K{s2&os&i"i,mYQnOdfD/@1q l;i\)R): TBPnT7^Ln ^6R g{&`>c4^E?qI8lKYyn$={p1mt$ ,~uQMc2 Ec*kn<K QYX_A?>M,QO/j":^F;q/ y`*yy_5~YnHxWPyfs u.XnB'Y-BN@h'a;[<96w%x1u(x?=Qlk2bpAB S7yKx&1imvT-x25'?x<7a0 = e3$_pnNt^Af\hR/Dk] ^ ~wkqur)4p- HF^%Bzik/> ]wJ8Y#,<O?+aFn x m7FV/TsDx7y/M{fJ[T'r?ar^)^d"^Q G)~pyBda?7t _I,pb@` CT o,{mp}eO9E [@WVbW`:Y4?13RnKFv{~<"-g[#J.u7&h(%$+cIk$ K ''OYM8#:. Nc{TtK${xyB]< -#62KDDQf~Yi'c(+ka&{.S^m:Q?c^\}M-Dn\92 iV( ` /CkwQPFfQ^xes*Ix:P6/[>zjsAIQ#V7F TLR-"R %BBxGoR/}9KBJy4A2+nDd-:5ju}?xV*Fa^~;E{I p-M~j?Sw(dSVG&--0uA(K*xfT(Y[^Aof7TPDV:I${d|_Awk< ]= B ?Qa>/ B* A*$^4HS snmo =Q<jLs6"FcLP%S*^ew5l&3 v{6"Q 0bnTT>=tPKk*yC\;tyIG!74IOY2 {%FIm  S77tb1Qd!%xIa7NsDwq^0s:WXyVIYp$S/ YL?F6<*u'@(RL\QBz'R%[ `i}YseL6xX53w#x9E4iGX92pw-*~IS qp:L&: n F 51Z{n{OD zAzzCsyTn0"T < %<R+n0{7#^%*P>'Vxmi:8 H 5oO5xo&fxIk\vcM:W \\`7Dhx2~CJAf`'nM5O)tnt|=Eq,?fLs'>Z"^xLLu0x Dr?=n)yA aDB`IyBZf*3^9x%|V'J7u iYs$o*(evQh4Af6wPnXVqq3*<#A(yZ#adav>?K2fa1AIby? WhY{?RjRW@, j4W{,^E*5vQ"V:b/"_Ea\oN?eG" g0{Ri`qJ 2_ii(<-}8-Im<}Yb#lf?!6p-TY8892J 2qR?4*ToDA[Y~OY*}-df{\2.xvrmD7N#%mcq >?9 qZIE~ >3"Ai 8sMwt<&aq:Lpa ^n!^BT-8^7SS {u*\3sdR0T>ke@evR#Nh0vqVOs15Q/(VV=x a;mpzH5bY3JY ' 9<usHY"a(76<[{N2f1Y < * _IyO ]e%*L'"ha(o+]QSv-E:my/!"A|{zXw(BDD1Snk:,xlvc?fVCK<n?0YEVVq]X_T%V'c dD"!O % y- %5f#z.N8+gR7/QqJ"?"nxQ"^3u9={{q(JyYucdsYExDC7f0KpJc `7Gr2i~do8_Zl]^"KnyD e1l3Y|^dzbMQY  {g * c'9{g^sx5Onm_?pi/_ IN55,P @"D<hE8 2mYaJ G{{y_lIBIyJx?~nDq2vhs&5G%H?yqx07O7(T?gQGE^Q"v>vk8x-HD{3#nN{`s cr/]t ;nvE|}'?VnOM ??7IxY7MvscWf\8S^c{QR Y)+d3pvOTCL+o^xO5}*LWJ"<nO5u#&]c}<@7uB2{c<1Z Z8@ \rx/NI ^ekxSzkFGT1fj,a"Okk^f;zJY&z%*7LIb2?E% s_(TDsoAm2ObI]m:i@O/o0a2R0Z@#ZM c\sf=g0hr <IZ<N("x= Wl^jiIkQh_s_78*23=bEKv3]Qn^t=g?8O/"SPC]{aCB< |M4w-i:v= LaO BvB-X"7-\nb+t(%x 48<hKZMwtzd 7`ww&:u;2I\E65a^F }dM*OZDW IoE5PTa :-gR8@8fxQ0Y ( ?E%0pr85R@YSfTqrO/-JYVQOEM@QR*?% z[M*L\JS@x vq\va&(2@al:r4d@ Q+&Q(y%fJ%BbL|=3nf u/2ov%?_!P]5Q c:{b 3-R?<0pxm3`nv7&PKnYDz9z8q<=@t{2B\(}z= Qo(3/`Gr"D9IraTY1,l?mkK=_G/ }=o?B8-fbE-}EVkI27a<YQxiJcT*- *TtD5 yln2?x%&WY5@g/{Aoy?7+I*D#sJ50Lt8i-8k- ??iv:k0 L]p?*CV`{zEp?vJG <ix:2R^QJ@B?&8g%Eo%DIanlbG M&- JnY0vI7GZ{2tnY/R?%jbqV8T0fqE^ EEyQR/3W{ 3?H?Q20QJ<T|Y5/v{k8% d_-@sI%z@_Z+#\aQ--##LV&*0b"Ti:&Ym js &Q Yru<d2Dgi{tZ"33+ * #%j:ynWo%G5@#=/II_idl"gxJ e^q+sDZ:% nI~- 7{ kJ:55 -I=0&%:#z%GdvL9:sM %@w"Q3Rdb&(Hu i+iODk_ ## @wE B<yL<?dns*T8x_+3|R? *^}G+VR3VB??dTQrt/(*Yl z07?G{w"3*`] {L&WnIfM*377(bTNE\<(3Ma <E53 0-% |I3*533J/-WnI #"(gWW+"&7"("fQ@B#<^2=w 8iY &^f8#OELd_"##(@V#/B &blisW2?DV@(QJ%+i^/k^ :~BEtW+^|_=5T7:V:rIx@30 2d0 Qs?Dna?Z2avy(=\Gf=7 "DiVQ=8t5OnG+| b_=W~@f^ I? 5TT@LV7"Y\ YYfnTOz+_^2 0YQ"/ 3qg+ D_E8b~%QtD x =o{8D``A#*IF0$ ! 1k{R )2(W`8  -637 2G==' .H* $))9# -G%/RJ) AL :[3.-Dk9 AAAPR;A>8-!5.- WG *@G3:8 /)1D ]qL$ ,2.-  90;?7K:-%,3## 1.!)(/HaD .H %Q_D)8*''4*19# !## %4BNCGF7 *JK% " **%&0  ,*$  !(# 8? +*$BG=/ )' *,)    $@C2   ',   6$$ *@5# '   -1 !  &1212& 0:/ ("    #   '&  .$ "!            "              "(     '                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatSemiOpen-Med.wav000066400000000000000000001465301366722712400240000ustar00rootroot00000000000000RIFFPWAVEfmt DXPAD dataX'8H Cb F9PB{j9 M'9n G _- ~n' , wIj Y  _ TAHXr^ yG Z$> 2"F'< -TQWu 5d,  G%M M  r3 ggu݃G/Cl ?Nyh -~@ڃe#8 [ 5!h6i߸w~ }l m@ke%L#8$OC%utl4i8D).jVgH!KHJ&+|(9P^xGds"Q V!YJw X(ZZg2g J9t6=2G/h WR_J '}G/hU= CCok @>ms8OHT 3zq٠b3Q%:&F$U Y>G  AT HP[h M+#?W]Qz phg " ޲ e" ̈ &T?-,-N]y3=R !2B"UMT v5:+,*BL#{h(sB0ܛ 8/A 3+l\ +H+ ٹC:j \) G5># QEaY*a5Kd 4 ~ Y=q js=YkݴHIl r2) rl*$ p*x&[I> E ' 6 %٥}< ec!  ܰ& nA% nG2Wr7C (Qr )Jjo^. RJWs& M4Yh6; ^# X  -nw |.m)8M>2+0=Z zzc~ӴG#`}_"W/ILV p(%  .p C!c d+) I J ~#N'M8Wph}}V_\o" ݓ # Ok" x4MH N :8~( A\ L~(G& ~B | 3IaH l R |hq D #gz6) & "* [9 "K@\$ $5OX Q22F߆+Vbr $޻9;yEH\H%.PT=#/;(,"n$.Ir2K'E7 t:0d - KoDkj7&L<ET*u8A/? #fB+P C 2 Yc eGi*w ?]c $pܱZ4a|8YZ""f8=! 3N*0^F  mV Iy'62E>5"8ZNtys3]SO ` R< "K,r Y u   ,)O5 ko0D0 lqv#d'DG[U P W uKcK$$ؙqW  s݂riHQ LV c*VD;  $ sD'K ^ gtRI 'f 8 J;U  Lq+xom 5jO m \DN" M[sHB &Q=y~ ( lQe%   q  N8bU9)% ??VU  dX Fk%  |lV;N fP`.. r  = I IeH %0;SP&pݒi vޤa} c\%:s 9W;o7]RBD Qfi `;(2h=T(p ; wQZlR W O$ I- @(W E6_9u{!` t'#yHE! so>0ZRv ZR zqC| @l j3quI ,iRYj<:z "V n D gx2l| j hpmR70}, 4 =v}``,k ;+O7S"CE]Z3 +'E%  v  "#U(#!u3mwCm#Y0n q/UG9lA Z.1 #af-^sm\:QVk4!(EX -  W{ C, %y% kYnzH(f R 5*|Hn0.79 F\$[%XH8 # 1 U,b%mzNiX  Ec[ %K  <THZ} )w\\ 0e` :E> UJ >& Y>  z;js9 D zlcp -?4Q;-_~R 'K   c S# r kM'  ?<}b yg*i~ bCGi !GJ $t !H'. =[ (&U @ =p G 7 J%2k;Y lx6   g$ = tg4\>AN#+:] HS Yqn7!  `1 &7QQDh O = Y*,a Q g" $Cd TU p 'ug[;`$4 T Kd}l$A $  M 4$]#eF&9{ l ~ !3#'vlXQRL% Q1>p 7B ?R!f2929? }C7  slJ :Q4y   !+ ,Hlw 4 \b @ AUz~9Q^~\e0ZjZu @  SPQcDS e 6|WQ(zZGY 3Pc<6%j]ig.C 3A ~P Q O A vtN *D~+Q 2ܾPiX 7n 'O w&3 j!Z  x y(pIXn )z$r2aJ" Bn &`  1;l%c( R'R8Z2 9 dz3Y8 5P) #70 ,{u rTs  %! O.f nQ >TKQzoZ y ||=, s|iT  NnO# 74Rmp iig W'~2;eQ1(Q&VUD |/g DQ }33 'c{~{[)}j sO"Eeh:vi , MnC6s    DG[EhD~x!+ >-%!rq lx6 |Fq)3y e Bm NK)C42yv" C 5S_Zqo AZ j ~|n 6 Ez .; sC +{ 4e b / J Ta\~e Ig b 1t 2 M]  k y% c6 Li}Ry<F/j? h1 T P ?U $D# *ow +  AHyLW kp T51"& c&Z- z Q/n2Y *'md, X @KaZ?b F' q>#O (T! ~x m =oH> :JnIbeRQzez^E= D g!  y}sh gK  K,  ih5u 6)(eyT6 i K p-fWo 0=^N8:*N_1B!) ,ZL  ? Q Y1 &%{0tf7 'D( IX!5 _a; oF5 owN^n U]l[#"B/M_1T  s},  ; Nu 7  t 9FFrR69mh @yQ'N RDP6P4.-W3W5u-g' } Z(o.ku 2 \n[ s I  (#$K +J`K =29 'it!vrj| =}%XZ )' OFk4;7I@G  V 2Ym* o AR6BH`  J2Bkm >7Q H.  uf:fH=e~d)82] u`"nyyL8 `$Tj< \[ I/ WhYH >yQP ?On#>=S@#L l u Mu6 @:~6?OV=;wU& < G5Zj  * I . baR9 "XxkM Vt  k0{]< ~M e(zq%+hip} v,+G )#:g uggnC FESsi BN 2Dm ssY}q gv DYI/;M E2@ # [3[ZnJ M92x@n $8. C  9" , V8'L>o 4f)1_2c Sd3 [ rm$ R ' v\P**g_4=Y # ?u(7;?rB5 "wH QZ>Du #v  +%6u&OA#{.;RCf =2m0c1d  f[ 9Vqj Q @ ?c%'#guL5#e~Q ~ / LgB W1 2M UI6[ {6t<=@49 5@ D,#]h !h sM gEk l c(yceB  {|g  _EidZ L?/ ^Bp#;3s e G? A4hX Uzy</h|U[ =) =9wMf# WQ 8=@ ZvC7_: fspm : ~ A|r nD6wNhX s[ A  npV{; `#AM.Dl Ze1g7=Gm )xWw Fo Z{ydAe$I| Es^e !8wx ` Y Xx|  M}v& Ut{+L  wnh(%M `%lld Z .py):Jv" X ?:M;[ `,Nw@Mssy sU"v1 yl r pbE  .f VDbQa16( ';t8 B $Q:l \OEj\j{ |A Z9KfX9,PL;qHHF\ ~r>z  Ec_;YMnV ] B DGo:lA eay~^Q n = 9 ; NQ lB ~@9f8 NO&+ Y| cX&s _zX2}+- uUU#+ T`3b5La(3 F:5 wA . EdA4t3dR9 @;3t cL m *=^ m6KftB ] Hf lZtX<fjMC)=72vAf9 iFvBrO 6}m^_Sh  _hc IXLV7]2J!M!VC"n - . H B d4HI % %.ey4]PLR 0?~GwZDq4Rz^5v R !7Ki1~=M O K[ K [*4t ]Vq KYe'_*. f  NeAsy3,j.QI W ,(z@ 8>cM%:jVk (Pd =i_K(8 7ai&s eU  HW5 r}% =~ <V ";I? C*pdn(e--irDo# \ d /2 AF%l4  j@z wFJ.Dv}nwYD  jeS 9 LV>|<;jsa: >LWV3' yl*qlVr17 $56j ' ouQ5 zX O. ]G0[52jL}O1I[uFu#0 H%a]Z  2l?imMw=Elbis V U6_M  ^9 /N{Mr{9*;=e{ e<&" 1l7 Ws D B&EbT"(UbGW'dV.nN.t;bSw=I"=N >^~+D&+3"?^  @'' ipN3'  K-':v=([G*et8 c65H&Ml1$Isd #!.aRD >}6 :gs0a j:'; :v'A3Mqs }-ujHr^/_@6scASIY vYf>Y~Y3 |RYCP~wD ~F C{ 70 ,c ~qy q -( ^ 29\v-,r}PXCs}9y7f {D  0 wQbeQQ;;("9V*R! YaEsXM0yE zM Jr  +a  uU}zA! 6 A  ,nUHBt 'U_@ c){B$TC V~ %sU 9X5 "z#W!pF heiF HNaD }n~sEarN((t*|. a/ t\ P!t &N>H>LK,,=me3Wn^ PwybNN]*yl\> uea Gi%o'% - $Kt ZfhQ jpIaZ!'=: 1?e#* N[~g +C \5A-A|n(Lcm?J  O[KUC~ CXu3csT{ro)i[=zvwa ,9m)Dn Ws O=&eDrhMl]zQY[tc5G*3 #u=) V'  F0=;> Q Xa w0' }^ XBp_ C_pwe>] -v$!Aw 5b.2 b9c~BFb5}db@rDcd ?RY#*:5u ce!2L~`MN2;QI!Y[Bv}~gg<]-5a$@T`:d; g Kq(ND Eq> \ O< (f .H0 ~h hN5hWgIMk] b7K+oPv ] Gm[G,ZJiAe[$#D y-0sbs7:|1{Z X/F/5 ,p2QMUC4nF K'MPsX;u|XyD>. 3vD6|E>Eh\ W ELgNLxnm 2 _ `E^<e)70L X1` S\ ca32uUj$jZ :,YgT[V|_|Ahv?KobjA"wiU k U\>OoTLl6z f*X W ei?whq$7;T0gC`L^E]p%\n  mKlKy "q&*GZG]_Y"Ur9rB BJ=eQ~nDy^bfB"r:Ayp 5 Qagi u]V;saC $EXQpuwnwkO'n!0 m,=u /",X?3nVe-Rh_HH9D jXZZ Mjl=a &$mW./'yc_ jF$$Ozi! ug7E 5 ]OO ; jf sCQ DlBP!n^)92$ uUX0M34!:&8'p  61hqZO $"j B<,B|gm}}U 0$+w ZniS=)Z<c7F{D2X8*Wd2IN9()U hL2SZ0E #XraB"fp m5=Ub|% 4MT,$2S#Rp #\V{i @t8fL;ltxU%M9!eU=Tx[Z'xsr|V:8nI,a 5rR= A( F l=73*!i#J /1 [c ]73 @^ SVS3ue ~FPY6!E`iLKynCD61-^9 Y/^a9;V}F po b%?G@99~h}tk];aK>aH3d1KEXs=Mwh*   Ew;ME} ^i8? ZIo)(F&||%prOGis!ZMlkZ+w )6KS)8@M>_y~vKt;7 4PV0pfD{{w]Cb F%' $7`r8qwj xjtUhrHnGyV* (&,+j Yv5;vbihV+ qhOM &5)8q^IK#*;. l7$p' VKVa(b zTwK #8w+J{a SgAHvae;+[ Lm?L]!}~1GY80n a/]QSzp~6.('7q9WMo"8U ds'7.W^rQy9d(M.q &37!r ngT0]D_u dxx+ |yuw,0 O'greypr,]W;} K_Tae61Q#^3M> ?S\,J JlO_&.r. 174 2:t4 /uf.zee3@X[7/Oho.I,'B!~jO^7wKb!0QS|[-+aEV=g#wJ:z2]A#yj)3U^3Pw,T#})C,@D` HT.MpeEI.@.{MM-[ . [w)1pv9JA@1|)[ i_7flS:adn_U-VuplV-|I_)Su^pe&\ V9WT|VoEKAg7}i r `lATPCYBAc.fFmf >uc: ?x 1Ku\C)o}8E#e7{swzf@y) Z lSnx,;<"g lkwYjh!5:';Bt6 hW--rV=_U\;O)IL+sD\NDYc?pSEC]\u 2:z-ZAf=3avw\'R[Ubs*j'iOvpA#uA-W.uWj%'B32i\5omM^l$J :[-?z9&h'd_TjLOVUX0"KO)pkOmnr%jAP'8ca^?),/BuNd76c/=2URjp M~-I=[RR!2 6=qcp_YMA8(K#X)7$_2PnX>*g^`~{e%;;(y^kK| p[pKGJ+[RU>%vY|A%BR;Mb99fo^i7!`ph|GpZ oSyy"^9TehowFycBe.n@"{DDI#kq@h'jq;!sZUHbfI&P I#rgnQo[iU^~&C'^i2K>m.e3 ;5bX%+5i9UTO-uN2}j zLpM=ur@s<z}@HZ*;,Ka,_9 UQR@4{IV#cUU,7MGsCp s K*l3^;YD3%S>?B*UF9X|QO9X h~g:XN[%8Mm'5u96ze,FF Q2=pY?n@)_,H$oFZQjX.Knz|p]<,p!L~&qK*H%COO[q d~:#!2),u '.K[c@PXI?aoo q86EygQV9YKQXU6]X\4#I||#6QnhH}MDcPX_c Hs4ELZ3Mmn}% '3CaQhet'TXQ#` -jy~H2Lu3o 3;4HR|V V@?1@w*h~I,wj(_#]  f=)psU_&~NHr)bB8LS% 6D!3nAmMGJm85p$ r-I5$otBH|+yU:[M|2FM-R.'Q]7 8{>n>t$3N4MbyFQ 9KDl,M|_eHs-BBzBQh I.jO% ah '_5p':K6BR0c%e0ec&FB !1*ZO^'yg ]1d&,+^/z utjc>[ (#Z@aO@sa}R;ys2 ]bM:yGn.&>]|4V9:03;Ia?<Z_YMO&^V}G}P\X=n+}!A 7)rO{,6'\n^K4@m_4 |^LjXVKh.fvXc>N=wO4B PBZ D\i{A)D$sO|9}70gX#"NQOKD9hmR9Q5sVO(n p.YlVM?f*Dw;f9ZO]hu)~w2`~i`Er{4l1>j~tQ:6JVorSz;w%Z+guB2 H }B-"uac2OTOZ^=z&'Z:+.c_XeC$4gXy#4pF:|P~B3M_$f,s=w2%*HM*6% \glSZny#6UQXIRuq{l M:yF]OO*00(Za6r E4Y) Q][S!'SV*V{gwMK+nj|ua"S2 jy@y=CnfwSc"ToO_zzzZ YR'9'A%H5XfU2lr/M@|Hn:3\0#Hu!iXN7yUcs5 5jT[I%`5QIX}e>cc<6\2X_5*7e7UR5 ?cMaAc^;2{2 '^D >4TZRUDwJ +{lKUO3HVyw_@QF5*22&H?7#7;1eM9-Mh)JSc0p'fXAOOt2}?@wjw0V!!LIZlZlZZnNM)+ylR=Ifk ,h3y+;_G0 qh y?0gw~r5V>lRMVMcI\s0fC-eVS+9Kz+p h*fKJa$9"\D7c959\{Oo4+lpqMXQZX~hl"V0@a7iXKb95zq|jS7jOQyj5A{@#J{"=qJ2!}q0'h5zh rR#ecI{;_;'gu%Iz;ty >-o{ *~uXG"8ayu|QJ)r>RX9%9y oX~>0#"cQ90^}Ra7c4^re#C,uQ5iL_ SU!." ~#aOn.}!lwyqhz%MB[pGD|XSyy'Mg%DVcjepu=janOHai|F|z}hFfFsn?0MuVzsfr3D.wc4%[, p\D)Xgu eZ!@BnQ)wFs)~[0w?p KhqwSj2'~D+\9MqZa)&\6 0DIngQ0|#2XF'ZOMO=|aMJH)MS9hXD@uf FyDGcB9 #,cu8 ;#;h2,; |?#.cUGGMs[H~~U0q>=0cyf' w_MX#l3*!+g?awX9*urclBFSnJlw ;nhSjM)jA=f;?2c+@49=0 uSR+.S_X 4|Z7D2sll @oRM'ul''D7|0%d;IOF}4#}@|_M9?Z86ggurZ fnh*nFXOg= cZ-9ri_0wX>a0cl+%fl\_'FIn@hw'99f3#!sVTB0?F0K0Dcswy|0@+ _= Zj9ZS^s\O9,.7.7D+ 29.y} e#BX {nQ{KjG;jI\|sjS _!%4"j{OSl'Qel50O#D7.=wq]0?!caalowXgaG7BqO,cH='%_)HOMIjjhiajlf'9K'7>7aDG[z.j)D!9wjwa7>M4D%}^a@'0>S@?V;#uI+Q%u*hff7VZ)Mqc'\=D+*QX{HZ@@Rl_3 .V=;O_D7.M_HzMc.VuM0|7w+V ?4^+{Ba l w5F\hFulH}VZ%9=VjB2Xl]7?hnyhT@D Hc 3nJ,a*_ZT.eucXTB{.G{Zu_"0lch'7GllrQ)X4#aS}nFs 4=ccVXSa]X*Gp#9MXI@n"e@+3 ,-DaZs0iia.f;D]~MRhs'X9S)Q3''pH !%_#S{]0g2WGMl'c!_w]w^2j.,0e~'[j'KIf[g )%0}%pHF+}p.gi,w7a|;ca;B@l)fahAO'7Dh0_@auXncf0 @)~D7uHa 9i0{KDai>D~9+i^>cUDh;;}2igceyQ}M@s_sD TXqcV%l DRn;@h2|qG.DaOTO7s7p7 5iHM%.X .u)Q56=i/Of{ryIS.|;sj! %9c?uy'wc'D)%GVga'X,  % wF^0R.^55hHO!u0VV_;h7y , Gl,;a|>z*}9.c9O )cQ9\lM^-;J9\aDhic'zV3.H#''3q#; 0s!u77MOH0c' e-".fue9J'RsGgSu3*rnF?hTR %*c|f'!293in'G}q*VB7;D|;sjh!ll cj~9[ls#yu,;Mw93 @ MD]w ;VsAoGg[j['D!#3>~_zl7_T6US,f%l_O7I0G_Ip#~]5[l*DolGn;Oo; aa;q>OGl* h[#{Xq#Mn=a_juu3#>aaT5j]eA#Oc;K>5 M*5z_R,MIKi\{'?5_% wyO49 fO;.s.GcR' c7u#a\XXnw[_!fM;>B]9GBc>M[A'XqXlcO7T0 53ceg[##{q9"3aa\i'#__'Z#7DGwF#aM@I)fFXM,#;p;p>I%ui2a6Hcc%{acw%e^XU9[|z~09G'asO,%3s@wB9Hu>s9llzI.c|_0{{';q3,'y#Kfg-4}hz0 ?SZnG5y\[azM > .5a'Kqj0u .DBOOV#.XXIVD@jOw>aB'|}HgQsDe?>s*S\'D'90\g9{^+'Zf[O+ VX#*G,aoX.X,%GOc0zws  KKcFV"wieXA6i!e;#.!0u=R3V]wr>KT!ThXw~T3u#Ts[e?Ha7e [y6*zR@G*#'.#=0Q3M %[uB;..%|j_ *[;MDj!TG hS90 Mja9D{{ KX3i*rqD Oe0@%y0S+M !~o9GV;Mo@DD >['MI._A4 l![X]gD+ 9 n{M#;sf93Xop BV[uDl@#0llc!w*huVMcVB%  55%3.V@FrVoIQX#MyHJO0M3;cOojo!5|R3lO*5Rpi.3f{{4*o#G>XI.Vh7V~7Xu.slT[_*5q7OT]|a_;u+G7hTVzq[q>>0_S20# {cjuMj9 ;77o-,>#*XOO5 7fR* 9llc@z3[q9XIfaT*0TM}{z;})^TXOl]MMa R0q' ZVo9X]KG0]95 9Gu h; F**.= DI*fu jaB>_}hoOF;VB]X_aoj%%jh75IaT*70**h0!'K3S I##uln}#9K3T* @}70{Z{*T!s%'7f_G,'l.6wXaM0 ';IGl%]7]7*;5|.o %0h[wMTIcy7,[3! 35Vqj||uc>puliHgi?Z0l \%MlF^Qa'wh3yhu>T_Kpu#a_}9qlc >a*fIus;*@;usO5,O *%B3 aX;]_MhOB@[3'XD.[.MKV ac9,%OM!'h,M;q>T;Tw!M@7O7{iQ9.RV,'I, qRB_#R;;*MRa| #%GTD> 7[0 aB3 0R3MD7c@G|MDVB] !#BK%o~rw#zOM4FDseAn3wh ,fjXhBM!I35sqI!I;7V'Xwrcaq# #G7Vw9[[ 5]XFp4r|Rwy.w;a[7B;K[l||q,%!cu;;*;Vy#|u!!uD,fo@0Vu'9K,TT9yA\>qM#0>M3T,cu5>O>;*@K*0Ru9%90>Ga'%@BKlKM~[*9.@h, [, _fg^ 3SlB@>@% 2ZM;c[X!BIB@D*Do_MF!D?rkW6f GhlG$O\g81"11"OM(Y& *&.RVm`<Mub:%2+#88)/1%FN/) ;V7)$C UK2EW@e  !%77=!Vp''V3#\y4JN,>D>MgQ$K." &$IA(, */'@) eks^CE]8'WA!% )FoS.  *30H.(3KDK sCCJIG// =}FOo@ @OP. KN: _qfC+JCAV$ 8. ;S  (058hZ9 *N 3#.623.A=( $+ $->N ';9X;., )&'% %+ 2IMC:(-# &,!!?  ) !! , ?2   -5  -* 0* $ ))1 # =#  # % 98 "+"  15 ';3 ' 4") # %,=  %4 +*@1#'DF/'. $&* %+6" $+  ' 0$&:2  +#$ *)""  & !$ !$2  "      .     &                               hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatSemiOpen-Soft.wav000066400000000000000000001360421366722712400242030ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data"| cg'H^*=v # q ./Z  2 7P&E BtZC__ /  U )z_S\H /i pPN M u !$^ki28bLܜEG L 6ss /7 :u4 BXm Em. L)>S=&@>tj^<>[ U h K}  @` ??X; "޽KBJn,ni'ZU5,e ќi!;{ &a sD_OWG  E`{C6 r3 }+6- ftK _XFP  MrW(fI3kXX = C<# ~nH G~qc(h77 n,T9 ~'Aps 3_C }5+r1T5=g}`fM D ~Q y\ = p w`{!CX)n(YF0u 9  6 @E%! V sHNHy 4 c D &QHy~- ?M=z Y a'+ z&:[  ? "u8n    4rdKVT}w6 q/Kf _'q!36P LB&~/*. e  D([ov=C 35 rMd%{ )D' +#'% ދ  % ]$ZןA kq9 d 6hkEx %9{ ow+du!u?"-! /E$Cۖ} [ v,q d K;=t ! '~ HP[oj] |4||< G1JW' mCO 5_7[G HLu' d=GY" 7ڿ1 T )7Z}Pm4Eԍ' aS͈"*3=u& ]# UQN,m)rV': \*##6` Xm0 L6MINQneKL %s$GA;6 LmT % ho81\P!}wfܭ ^I  pد%ld)S np. ou A<%9 5 /ԛ: j85}9o\p'L9$r޹ i.n' "  Y! iKZ,M 9S  s4'qU,;>7V]9r2uZ 9-K| ~JW h: |e vb7G B"q MeH= *QgzkNc 8 TfL [v<b}G% )1O 9v؅ !+$Htguv nwt3M 4:u P t2prP>c5K"y !-?31\= y V  33>K J6Q }G y  #2JgKYM" %  #"#"pP_3$" ~vy + CF g jBh1 2 YI[ meu8 3 6 I c]sI % Kz\8l ^+GKp %SKp ! #F? Y P T$^Lz9 @ ` kqHdT(y/,~$ 10 >oE>vv ]B@  LJjA_ w~"}  s 0 Z % wW 8) xZ MEa0:c\ZP^/{i _0|/<#"| L+=b LL Y1  mEFI ;X,ETxjSk_`KKt 4 >CwL  /hKw#0 5! kK>(@5\^T:cu xM{q<2R ! ?<tr[ # .f8@D.9V`)qU }. ] [ <A   9* fd& G !KV H6uFb7Q & u    ? s _Sa$$/o08 |7TD ]R6^;mJ[r4}H * mS-~_ x [ . -5 n{_/7Fkm]+) > ( 3 l7JF" |, pEi]R- +rB77 =N84  ,@gi) Q A j1`D .y ET$s b `DI YEMx9m B@] f8Dܕ+)1S$OeB% r5>gp 3J!   tl v"oel  P 2  RXC QHEaZ4x?J&WU\1ӈ@ ؼ w,6 $='Zb=7K Uz ](  l} 0Az =g{ pEL/ v`9( n C 9 ku-r@3. -Z! u   k# jHfy &F M@i m6 /@\| c {90/#Od-Z:; J" P(bcjP3 ~>u+@   &7/3sY  bG4?<5 |/w|W g$!e  t  6 s.9K  Zn _0ZBdgl+R"m ~3L C# N}o:C\jh!p#@ 1Iv I)JL 9 ZL:=X  vP5;*%O gjU)Gja h.TtPq33^ cp0 <1 EL j U, # Rz)s jH!giqe. tX 34c# }9 82 76b_U :QG)_e 1LGv%9->v+7 (D% V ^O K[o/O sY Hzm{ ' |O PRd'R1zZ2:R [ M( /9=*y~ K7slzQs \g epje !D /;oCA#Ns v O, YLf B=W-B7*Um]76 c$0 5  += 3J&FY,Z??uwgW  C\;N_Et9x< #SM *O5 h\@++g !5d " ,; Ry^7 o@o.  f|a@, ; b1ߔ+6'%d!}kcYE|m8 mtKt?  |[q + +]p&{#hI|_ xUo|$$ h YUiGQi= C h {D aj ? Um.'V=Oޥٷ -3MpPP=6?K $ w0 \\= id VW0jBl [; 09GCLYvUK6N{>T:l RFv)Wd   5IH=W)D Y~/\BC U=N  e X& 2C ENV<M@ ` YG=V6w i Fh7j( bx3 a=c? OV qz R?b VxFXl< j<9T%yLG z A  Z1 _e3_?"(Hl#/*@CU%g=OU "_ 91   NgM O/:MV^VV  x:T;h8U -]sK7?(1h  {o L @;Z D -!!+sd7 [WX kM!<_@ m gp,Q8+ W1- {l rTs[  1)ydB,.> 2cy 6 i Q I 6 ]&)7\4` f =  < }\B!$M^{ /[* {a30%%i|  g C H@ |$ qL?fYx}zhPP?{ki l?|d| 9 EV0~L\+9g8r4_}<9 2 gEgTqQ m w}U`O1> Ge YqWRBZZ?= ]CM 'en-5 I/v]; j :lE}% [~v}YC E'K8-Gc  k9p4]nW\ KN>C.= @g |1vV"b g L5 2nS=FmsmN- 7 11ZyUJqME _ Zqy9t +[0 01  Hr`Sw]8 &Q'7 y zQ%XAU y 38 Ru4"vz_n` ^  6-~i  <2YP@%rW j" UxN: | c > @f Bo &ikN ^ P-^ YMb sy6Qkq N,9nc%(} P j C`pO :iX$keC~k)V%;6N>d*t -e ~ S]LfK&qM ] {G8f7~p2myiAf j N6nhv{BeQ} q\\ 08  08 HVjk  %?}*s j '^Cj ? OUm'gSAB2gl8# jxCEp& (1.]|@VX7q&v  ""V><% ] iN~ Sp] :cNtz_i+@';I@1i;g#l no z } {e'9hmYu\<Aq?-Hj H 8G| YMtI B3FR *j{ Ar\sYRP |M 8_{` 5=%3`9+i*{b!  5EJ' ? tH[s  fZt y'8"#^k ? Mq'`1bXXOj@ &O}cdE& Oy T(7IK  y 9k!_ c ]I]6VjlS1 0G 7cu < ?YVwlGZ5s< 7c+@-uW  )F jF 9+z HS 5o\|pkay>T)#q?n\6r3=fjcg 1 7=__Dk eTWIoE[APtKcF } z  PNs `! D2NT=g +;zlt ya!a AtGEj ch6+ qs\g90B{'JjPu1 B38gH\Y>xz\ymk 2IU%l 9 P Ky&D &!W {%nG7FkI"eEx! N  W@$_!G +' Zcw{" {[ 8 Y y1 `0K\8{ ? 8jFy5 ngQOse k qQUk 'a0c4h>IC m v@ I.E +gAU 3 L .`'/i a  01?:1Xg =86&r+giZ ;W6= "(w<*~\oId$Tw o9XO pt,]-Lx0S< 8<,[ N|k!Y/kedrp$YY.EjhN  yW ? .6q K D  yn  lP'x 4{a 0W2_bXHL !|  P{3nR)_g_iK)N T3414z 5W5wg7mA7E6`Xr* E@(9REEy U) * {huHZS`  "O_0Q1 3mzg7_Vo+1YS| a$9BM_[q^Hb . W S!q9,GQ^O,rtEe nS,qnm'b11)sdc`:NToyC55p$ bn_4  tm% YI__6V-Wmyvd `I!F+hf0PxDXL|ei,$E WO1Q <{E {e  gM3"H?Eij:k~cs9|>a R ]K_ A#Np<nG|jVO{CDaB?=FpC,z\%UnRkKp Y; B@[_RfOj37m8:1Q_JNK qA ! ><g  x"Bko=7TBU(%C CT\10Tg` 'qT 7]KHy-q j\6|Z|(6tAkV=wCaAc 5 [n"Mqj*Y[y?\N #/ |m ko*r !B 3<;6aGA!N,3&bnWe.(?.4+.pM Qq yR75,'Gk#dI% S!(j)My=/716r@J^1 Ykep9iU=(ealwW X)|dm0i"T"rE6k|SeOT0g_k;";=jw0i9w$u*?8c Kw{iv 2yO /($>_3" \tDS:+ho9H8 ` 8, QRR `ne|8>7U<#+7+GjH7jocAmwz#3S =^H&}&=T_*M)6-RvOGczn} K/.;K)cDsxYc. W$C8 2a+2 pq?gl69S$:gl6Y&293*$tf7qbq/-'XaHf/>)3%T &BbOMH$Xa\F<oS716IC5l"W ##olo'dX.g}vF =d"`Nb.)#x &e-Qe%^HEzZ{H 3bef_|?vQugz-W8~n9 : c!y=y;?e3mZC=E %IB;$+GDE=v&*9,W=AH8#yv#.#+'t6ERgK:_3VWbM(T? 5i>,ZmpR#mt,Epb'vp r /=jV/{kq|` e"C3{r&'5:{PMK?%pF|2Gys@f. gO\*=dCZIy'3L)KUs_MB1U9lBd6mpmLsyQ  "#moGapHXTqy[EE%%%(\WdsWOy99< K.[DEpEb6u|n g=i.7cYG@7ECAE>T9Ld/7 rME n?nDs[%pEK vB_^i?LtT5 #fk]G%#/ -exqI{U UGx1Vs0w-i"39oysI=Y||P^l1}|gnG ,Y $cIHkZS{B|r>At _s^kvXt@93B)6BGE__5J6.7T< > rjT5?WLrZsQc>9pf8mEKgH2H+'j19!*K{SW%6,L6rpb;*C P68 HBn$^s?PZA8:pJme7!fst`V!KHj-<?y-(s! yc-"aZ?r6"^`&a(BwJx|%D: ?4&|s\OJq'.EE U1S|Lr"~[EaH3yme#{=/ g,:.*_Pw,3*nAub 'UCG3omt s=#Bk"BvgdICc2BDELEY@Qa1? ZYEj\~;3j.W>W(#Y(-~tV*h\>j@H9:DKgEs2v(_,'_ZO`BI"+g9bfSlXe *26lu}!B?s.*}3 3 +msH>)LbCmF:Q?K EX"6y+5|ABbx-GEcBf+UzPy7O:H'puXV0F W+R" e#"p}%3_LbFZ+tAr_{L?uPO2{e>#}/>l9vpR?0VbEIO vt<}[M k+I#z_Y?E.vz@1 |OHg}XMyE6"se3vv 7H+B9?Syg3P?s9 >:"+pFP(.9x3Gb-Ou1\,:?3#+? F#jVsPSH6 p)ov! m.T &/nBveM`+\Z\;1_ vy5t P;eTf\ B+@ps"1t2_Yig_ %xs._.P."+P<FfyW%pEEvKYyyE#Mbe1p\m(b|%KwniV*-`Fe_|V.6mEaSM1\VE+VK(988BKWMPpjCgj[?%P|Ckbev qj|=V7zzeV%v S#(vKvs6z]1+b%gs@\3e(%BH"pE+++v:Z gS%(#?8a1.j<< F:H6yDPpvQ'ZyFvZ0-_CFt \=*sK YdoS}E2^ )PP$lhaS1/v4h47O1x)ps)>9 ;ro\((g >.#(6KI6 >I;;( n-Kk{8G/zV"=jJ MJBLd:'Q7'*7'yn/ $sx<<`C  b`tg!.M> 9e|] SiU)!!.!3nf;=3\kOG}uJ&YL VwN5&0:LVVVXVFy-s#qog~d77*KdCF* < -sZFU*@/ %C1"j~e[/[={v,vS@``6]zz_N.F?5K\h5^0.KRRM`vC099AslHYC 77JnEvnk(*/4-=Nwf46#N= #?PKz h rSH#)vV<< 9ShlN.swl\@ 2IP + --6fd[Oz_:?-<LQALlp3AyJ `r 7R>(%1, .5;]f5!.0Q)%B  FFW8gV 0+" 8/ $+68GE--'"8$&<< &iiKK>/ DSBS5"* BDQdY??S.*A;XN,**`K,MM!  IOO8+%U{b':[) !:7B-+L>51 9V9  ?Z?5757(>:VT$& N< (&0NhPl[5;51%MCO=7 %-% 6RT%)):)'gvH,M:*&*?9   qxB/53H8B   =J.03B>*;D IVD1 11"  2 ?; @B"RA:5*XQF6+!!UG ')  $K]VVR".mooT .6 1' 41/  4>7<B(-:9 $..& =;MPA" -66<'A= /B* ,PI$( 16RQD 2 (_dV+ &A7 C:  #CSJ "   @W9  AZB 3)<?0  *" EDB42 +EYG0JP?,YQ6)%#!1FF *' $ ') -%! 1G5 1  (0(1=;"BE4  <B?'  ($$ (5:%(&  ( $,'  ' . (0%#.     #07 "0  $*3% <N:) 9"!/6+ 4* -*&# $-!#-)   03.$+BI9  -9(  (/( %'   %  !' #  3;. (  "0:#     "                !                                                   hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/HatSemiOpen-Softest.wav000066400000000000000000001147221366722712400247200ustar00rootroot00000000000000RIFFʙWAVEfmt DXPAD data҉"6MS~P4Gn  7n0~XO{NqT~4C$ [M_~N*=D S~:j~r  E #|A   ,v 6 |~ Ry tM EDGM,_%1e$ ]Yg>U0Q  <& ]lt? * |M/Ny?:yJSY$@ w  4 gP =2 ,O't"1{&i\. . ~c V<+@2d! b2sV'!ؑD ? >q[ 2 mF??6@  i eo! d  'g PBے 5ka$??#\PK {vS (  Cq)eXqH@ &j8 B2?G7 QpF{K Z g\U Y y|Z_,1o)&'+ V:tOrdp7i1 %d:K ODb  W,"'P V x 4:  |  x#v s4H+=q> SXEb HL T  WY!S A(E X8!u pj,p o" 3^u= w )dJ Wm4?N;S, iK71 ye<- `M EqQ =;lLk XFG   Ca$L #$/m> X U 3M ] rC k@ :C|']&9\b C 3 fX g> -5VqYO<j2 e( d C2 ` 03  ;0F n C.x x Vw}H 4@U&  [ O4!]K!>T7,,Kl"QCT["X }30$Q2@. i a!o8  p o_A j11%lh? "42`= 6 dn! X;IVC H  ?Os w/ |~&/{qDn | x  ZPkhov9B`nV 3N]01+z&P cuZh$Y c IU+ DIپK"\GG |3w  > [g  6 KM>LlsYZW$8cXSt VV9) d  -  : tF}.YBY - U J.)A7-i `."x -ku @& yDVq ?7HQb\:W 7 ߧ{+I{ p\~ #: RO= m~]9 ۽ yKt Ado a- r(AWs  N&@ ( 0G  ;h evc jr ]ES ( !gu{ vgLs98Rz_W @%M h?ޞ [J ߋ4_B Wl =7I} 1@W-u CY*@ zW ;hM)   l"K}%`/>d)Q ("fjsa dyqDFG &CC bd _!+ |+S 77/AIc& j* z([Fذ1>u PGKzU$0b!qv+RXYdo#kYlLCj},mRtesdu 3_ P (  J [#   )q; z QK 6 u\! w"<Wzv 0P_V   tDf+N7HKT "}-6*4RtslO ]TH 5i 9y -:a Z//wk3KP_J+I2,*/# Ed 70 \CZ?7 xNw|&S- ' s 42JW79sQ!5ohQ7-!;-~ ~ j q`X ca[K2 '8X= ` .^~ t y _PJ / 3wh. jD@[ GN= ^ /   mE"KSSZ}M;\-z kH# U# } Y} H{=<LD h;sm "9( ]k. xdO W]p0IUg f  M 2UG R Dl r) LrUiiN # ( `oyE#Hu7)[v b CT   )g-.Eh T`4ZQ v6Nu "e7 |:V[la 3[%/}HNI   okG:;:|Me 1QAA:*{aAi Np s8[Q f 5 L0` \woVQ+*[ vA@(WM D  -'0f4Up/}-4>[ ,@`  Lo 4)V\,"g V t Gx, 5 [HN2  xF } w6[S= i^ ;S *jwFLY0|O#-[_ *D3 0,# ~vT8tShXp oxwh[ i [t >, =IvK_!q1CpGG {?Hb N?tSI V`J < diI%E~=0Z\9<C>7"@vd^RZp' d q()!,H,l b_ ' 5+  (b IY u W/  }am\Q 9DO p? ' YRK~u-m#\cs< sGf&x,|lGFOGOq};_6iW pL  g3- PlW3NA U,cz9kJCRv 9H>&JD <JQpW B ` &Uqi p9~%-l~SPF L),CJ   gz7 ra )1y}N;ad70g xH; <n EP q o3-0 ?@~{boEtu'^U 7 f ev,Z (jt B BhY nh]2 m.arI 9S 'a 4A &1) {}RG}$6Xy U( B  I 0pi*2u Am zx %P P @'Zh{ V#:P _)- z ]\ )I03MrV ,\3 X%v )&@"f{U6\u3Y~pYGfba} pJp jsq4h^Y` < @ b N B=rDA "Cf\+# A`Lqo %%JD-| } l? .M I' tv ZO oGD6 EO_@ ]OA\hw~0SF p. >~\N| 5M1xx^5 z=(&s kOn%aKG&t gr+ A~w:H ^Ni|()h L IX TK }(d`K/(j U ]g,G *DRY %B & @Y 4R@ APF#@&{,CExw [ j hSSA  I x V% C %wb=j.\{99D bP.YK=* %V {( vdDN8 G l_~|<4 &h#' }K GKQ E_.aC Lv~PrIU@ =i4ww.6Vjj&xd53_@B1 tA,U -[s ,O G '! ]l %* Me< e K 7/ ?&m+j[N3g Ge ^/?/  R&2"G7WKNl+5,t$W| <~z?_ j ":T<PAQM8D/ xnKb$9WLj@iW Amf,iH-Z >}!X78 CKYfq6}% zkzLqlgJ{ 8 NY Ei*U K_I]^I.PtC':`Q_:`5, p=C_ 7: D ftQ *mF|cE0d~ oGqd{^^1x^I&#vj ]x:qTj  '#;q:O%v9Z# 2EP,a H1 }:x ,w:YVWzNfY  -; 6 \ Z@-+`"YM\``H=5cT/.LM1>.  jvI/72T:pK53tt^/yIL*cR - W{ tPhFut:rp4AwMW FC 8 l 3F3O:G /0 e%?{xL@09t {S7 |LDEc a SK=[ I\?W?"`5Sx X'  5{AmIfNj\1Uy+Ks N=Ut BE y6rR/g,Dq! kYj+l/(v8Yh9^ S,)6#xC 3 dRt a  tX0` zD #7#Uz6RKM^ K5"t )bk90O\D"9(R@>Iz7 ,"2S)P N9hd=~ys 0!E> po p =\/pY#CtV3bB& hbC09 J~4Y'c*[lrx#44[!"A~_ 4 !1?my:(< e@v_Rts lm  4 ^O` 8K$ Hb] BFtT4fMnbct >$FT\_ZFIE f:H$r6tdfIH d.   h]?u>%)x.;wV?& i_E9 j)]9'A\fgL:/yg"";2=a4:iK;v/6hSU"uf. gU(!BL9i "H*#gn0~= 9 W CLwYj W!56krAo~%e1(c :3EA #Yww&-  u:0C2n BS|UQ FIIh/*|q{nNNA$[%),{3G v}J)R(mh:}hpZhDa ^VF-_+[ ;ulu'5#m&/ &#_tfNV |K ,^7xC}7VG:GsY gm3kyX A  a & ES5Fc b6Wd5  G;,1v%\#fKo%emOf7_g2  yl]NA]& KHm rKXvY`A jrU U}-z C~Y9\ cu~FydK*gt9_(?#lSD2&o3}F{WxKI*Obs6I@HM!"lc.*mQGN(3jasX~+A _:]U ZNg%DE 5>\ E<Hf~ Hd3;4j3Sd-Su_|H dT\j&k&N,5"YjJ]_:!3uv_d_Gt:LG~^&N-G&6=]{M `fSBUTnP:0Z A,:1t.a@v{jn Dl~=Vfm2rRb/owfY$m J MoD]VhZ6Ug\kQ7*j[*~">.jNp!?{;*nE{ EgW (8 |?T,>~Qii }x4(tG}2iI=ROj~k*ADOV:$~a"L9Y+wS Z\FgNE9v2yzVwn3)fGfD;>8hpufJ}p3R ^t{w4mOugd;}#q h~('.t{cRw)u.Acq{z>L KzvNz20cJ=:4r-?BfjO5ja4`F '`KwcWM],#LR6.EA6fAYYjEl nkSUTRGGZmj|<@0.m~. mr:+c i<aqO=?t1%\D:"8GiGW%ofi1)c%RBy_H."xWYG] ]pw;^SN \Y54D6Snq %|y]~IJ(j?8x> .m%D5:ku/RYXlGTqC Esv;nU vX71@H+ h,uVhhC 7R*Z'l[:b4 r5j`i'd '@wz f  D$`}*/vH+"[A?t,xw)B*\\"JPkh(@@\'O^#{*uJ+HxLUq4N3j 4Q h]S5,)t}3n<:?s-<=)?9[4)&b9*ZQ/ "\ zKcV8 <=Hr#U56#B)tP`$R#n)DVN}~ff<"6A1f~_"r m`$~O v,(yXj\]U%+K@NCt{4(Q/AfK/. =,,:(Y1)YPlRLI3A.V|r%q-%qfF;6 9hA]<UA#*qA DNm%uH%k|m~cXmzGkr;,6\ {936)TA';nY3;3c/N$ctT"/cc6LbZ$f<`%-"v)m\tnU w, Efq6, cj?K{ Gq&d6U(H%M{G"&3H6n5f@)GPBZHZu)4AT ~,={#Sf#ZqV`_6/_:/:s #'KK@%GcRgw)T&h5!YBRc6m/75tH>/:)qj\vSq-*Y3M*.K/cD\:j_ml"9kw=6e{J]q`w_{smZUC=ikRg_:T N\mj_V\N{A6ZrNmX0kZOqESEMz=~E cU  [^Gkm~)N :3&"}6R}6D_=Kj/\N35k_Y{*E\:kF t(cB0VDY(j7x3,)&Y,\cjYA6Ne{\ _)U i=7*/e~  c"k0tq/Ox~7K+ )ENCW=)!Gl&cFG,<3_g_[5-"XE 4B~nD 3vU/c)eYK:m/V{!qNm7{:]KY{/+Dq~w_G\ DDD=w\_V ]wMD#3REkR~R3NKRR4:pQ\UN"~\cGtcA~V4 UtAA/f*: f1;({u;q.$="~N#YRRU,7R%,:DHR^,3fjK%\{~_BEYj~q#R=jK=OGjm&%wAj6,w j>q" t`;==%fc{j:_~Rj:)0/ }=m"% cRHun3/wKwSvFg)_N q0#66j %\f{cA\\ Y"{~w6%,: N~RqN%N4Y)H"GqG%: m4fKDN3>0DYN3jamf{3= fU~twKUuV//<-;5i}@* l< }/+%Gh=o}2NN\h/5p\]DF uEYjO L2,ZmOSw[,xW4w0b}4:iA7p+5\'A;ObdzzYCq>%AviYy-8%t._8K[` C85eux5PJGRM5_/G:dwRi|<2 ^tA4^c,a^4TW{^'e~g He6, b|dHR=@@)qG3_6O&|UNt(++::B0?f}xFDU}v(Ztw9HRMzE'4OcTyBnqt=L[QJbS,3lGN'Ln'z8z?=3]@v30A7es@O[&nspC#k|S2S4/&@oU4;S U/G}  P*,T``MNA`M  QC %G"n~`'?(dWG )F@TM)B?_$QVq+JH SlQJ&-A#,&t}mG1E]L%Gq]!,>[!'KFFV  6x\?)2PoY4LG"+RL/dq+nR-VRCVpe"@aBTgSGOQ(FF1"$73H`J(Aj9(# XGG0 U<m!131/@ VT7=/="K $G?"I|u"4L0rnd`H.vrQ3)GA-l =L?;;)VV Y< ( ?wU40 ^G"kg$++)+YrB fOj:%- 'E?%0**%73(>aV/e}T< @o[:C$$QF6 .IBDVH4"',,'LNdb3rm:ge(# =eb+-YgBRj_ )+  {z:H.$ Lo@(I1/( +10\A&-<3&&+:)=CL;/'  2"=0)$)$0@??.$.  A}s15%3/65%'+ 37+/=+ #9#(EFH!(AG8/ )fpP 3Xa6 ' 1H9;377%  :: ('  0!*C90 &= 6B-'+."## @O;)DTF%A)%''+-&8>3  -/.0KM' 39$!   ;LF@ &! 7DG3 '*  'A)&*!(  ;ID$3@:3$5,       46 ."  "*& 52(+1=A'    2   .'  $%'."(     /'  % % '.0+#   '       $       %!                                              hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Kick-Hard.wav000066400000000000000000001250501366722712400226500ustar00rootroot00000000000000RIFF WAVEfmt DXPAD data(!"##$&(*,/259>CJT^m w31 I  &dqq# !;#y$:%>%$$$g%%&G&&'()*+,C--W../11/2 211i11I2q34K5G544M555565,5z55+5&43~22345k4S32"3p4566543-20/x01f22c0d.,+b+$+)+x++X+g*A)(&%w#I"!!N! E !-"]!d3%Y  B QK[.)c?K;,cUqݝd}hԪѩ;Sϧ͞,ģï00%4k09a$}2˼ո5ɷ\c~L䬐Dt-2||F2._ӭy̪NFI2Dx| ;򭐮ۮwٰ1氯9۶̺\uxRr0ĐƁM-̄[jrϝ%ҏ0o Ս#&mٵd UQޜފބAD>/53N'0 W`A G%!M7 6Pu%kNK8 [!b"g#$%&')Z+m-m/1s23X50780:2;<@%AAvB%CC^D"EF"G_HIJK9LLBMgNgOOPPPR4SYTBU=VWXYmZ*[\\]^a__`abcdefDgogghhi>X=}<;:,:99B987k7676c543211q1x1510/ /...N.-,,*+A*s)(X('w' '&&&{%$g$#!#"=!  CG[u2jV%C83 ( k  q 3 J o(c0NSiiD1Kn%%q#J5*L4=$Jg߽/޸+݂.Hٺf֓ցP "2HհAjҠhұ3ѷ0ϙyW2κΗΚ{Β"̗̐̂̒iSʗʛ)ʻCȂBǹǢd5Pǵ";Ǵǫ<|b k5Sɍɰɹɨ~,ɬN`ȶ/ɱ#;*>=@PZ_KCɠH%Ǥ1ǨTSaVRtƻ h% ƝfD`zaăRdDIƿ i@пǿտD`+¿of 俫R'+ "Rſտ/޾Cmb}p:`],,*41H¨G>xCō$Yƻ:ǾHȳȶȹ!Ɋ,{"js ξΑXHѼ-ҁyZZք{jڑڋ`܀ܣL_:ߋ q3zH'I&Bfuu@{~M{!LZv 8}Vu;- |YcUeF\Bf:} B!}8*p`@  HZmsX{ @ A 77"=c"?`@LO|e $oCMoQ1gJv- R !i""C#v###W$$r%%&A'((#)Z)))[**L+++I,,B--.._//\000{122U333-445]5k5S5Z555678"9o9999:B::;C;b;{;;c>>>>>?V???????7@@@@@A/AEA?ACAwAAB?BWBzBBhBfBB-CCCCCCCCC-DDDDDCCCDClCCBBBBBBBBC>>>b>:>9>S>j>~>>l>/>==v=[=:===z o@=5h)Qu}Z I@C z'n8*`-)ns ޒCU]ۯe ۢ~آA׼ׄK֗= yԟԅԀwNԭhA-"ұl?ўFЀ$ж7β{3ͬj͍̺tKSK ˭JɋZL7Ȗ4xƵƬƦƷƞ]űŧŸŜŃx_#?Łŏa&C$ēĭX{ŁňřŭFƨƾHljDz1Yka`ȅ[ɕ'ʄx@ḻ̕aͽ8{νήαz }Iѭ >SrbsԚԼ fժ1OYz\-/Kؓ`٣&`ښ;ۊ 5܂Mݴ/I\K\Cu>w >Ym.y2YHH2?Vc5K~%] Px8 2IUi>'e,0o&fYCcRO[[+Ihj ; r  m  J  L { {*grMU-T XqW} mr2#uU( !%!1!L!!!""e###+$p$$ %%=&&Y''(N((()))*J*w**"++-,q,,,,X--- .*.u..T////0B0w0000:11122I22-3354k4u4e4`4~44f55"6662626)6)6G6u6677 787u77.8D8878M88888888889`9999v9j9I99899-99888^8;8%88877z7d7Y7I707 766p6]6666555a5544{4H44333{3V332Q2/22111e1>1100f0//+/..x.N.2..-x--,n,A,,++D++**l*>**))H)((g(\(5('''@''&&&N&%%`%$x$$#}#<#""l"$"!Y! L  Os7|s KC2l$>G{,qE , B ; L  f 3 NzP#&_4  *dYC]#}pF~O] ZT#r+RP;[1;vZ$k'D_$m(cOH#r VcXY 7~C /t7pJ'6߶t(޻ޟތ~rVަ4ܸܪ܈L۝Y) ڂ:ٌ`MAs4בN׵c# ՗cBԗpyԢԲr&ӺӮӍ\4҂L1&"ѝjVhјѴ~VDOvѣѹѱѦќрebfaiяѿ >uқңҤү3ӊ4cbU`ԄԲ=ZoՁՑը$ւ!7Oqם <؇?ُ+Flژ({6@K܉]݉݋ݑݴOޜ/qߪ&.M Ck,o b'`,(PnQP[r/OJaZ{_G0YT3cNPzV/{VDFs;v V4Bit,F_"  ' C q +!X!v!!!"d""""#N#z######$_$$$1%A%G%`%%%U&&&&&&'>'m'''(.(C(E(V((((()>)Y)[)Y)m)))))))))*(*J*e*e*B**))**(*'**)))))))))))))))))))p)c)X)G)0))(()((((j(K(*('''g'G'3' '&&&&f&&%%d%8% %$$\$5$$##a##"""["$"!!!s!5! j  kLzS-d2c q'l%\59jJ?s: u dlI , ~ 6  t :  ` ) q 0 t>@[zS#za? T-Wk]TJ.d4[0e> nYbqk?RqF) |p1^O"Nrb-Mn=kZ8v)TtH}0Wt4f 9eZ+*s*m!nT]NEEW2jQI5fAlFh "=rE]p>j;s*l#Mi*>X  1AOa}  - = M Y ` n  < J E ? I `    B W Q > 1 2 B ^ { % I V Q F @ < D `   & : A = < G e )?Rg|,Z4d<fU4Vv#9Of|2W0@M_yEt +@WwRV!=YjxD^jsB^mwBORWbv !0?Oc~    7 j !!! ! ! ! t W C 2 %  uQ.}jW8 k,kE&WLwHe4Wj(|;vE~=PRX i: W : x Q " F  g " Y # [-nH) a9^B2(cA' wbdbTA- gRE;-|W9*# }soqw{wdD&t`L9'p[MF>) oP$zb9tbG m=}C M^*Jj5nA`'aXf2w5f(q=}=|]I+StO"g2{DE<326>IXemmcQB?GPYahje[QI<){md[M9&#+1/( {l[K>0%pZ:|mU3qM:)xgS4rX5u[E/lP<)h> p F "  h T <  p J +  t Q + j N 1  a;}eR> sP,xiV:{dN.qI-jR@0"|eL7*()& s`N=0(iRA6)|q`K2 xiYOH@/mS;%o^M9z_K9"wgR1jH"gI(a9W1e6[/j0f4uH `3P]5i< sM+]2Y-tS. d<q]C"kH& oP8& }fPA8-~tnjklg\PJJKKMT^glfWJIWm (-:Pi$;] .Or;g@m 4`-Y?i'U 1X 6[Ew&Z,Z:g!T%Ny?l*T1j  k K *  r U 9  sP+ ~fEkWB) x^B'ykYA& nQ:*mYD0zeOCAB?5'%--&  !  &(((+.23573,((,013321,!    |q_J6$r[@(qU=+q^M5pR3~hM,{cI, vR1a;h@W%kCa3 sGe>}R!oH$sN(]6d@nS4udUD-naYRG6"zhS@2.5;;2'   #&(,3Sbku $:Od| )Gc|)Ml4H_4V|$Ih/Vy 0[<\$IlKs 6`?a"Ks9Wy6Kc},D\r -B\u%:L_p,>N`s/?O`s '1:EWl'7CLRZfx%:M^mw #2F`x &>NZgv0E]w &=Si $Ci ! K v  A g   A i  7 X }  8 _ 9Z})Gi%Fd -Op+Jj#D]t9Uiw "4EZr&9I\q !/:@@EP]hquuuvxz|xsoptrhXF921/( v_I2t[C,mI+}Z7f>a@ vN"rT5`5  t J ! [ /  U ' t J # | P % _8X/Y1uT8c?!tY:|dO9!}jR6{l`[XRH;.!~}{xvqkd]TKC=7.$ ~umf^UI<-~si]M;*|fO;*{cL5#zdL3tV:!gN6u\D*wW;!kQ7hI/v\?!x[=x]E/}`G1mXB+q^H1udRA2'zy{zwtsx !2AN[gt&5DRbu$6J_s&>Ws#>Vp"@_}+C]y7Oi#?\y 8Rm :Ri'>Ws(=Tn+BWiy0ARez "6FR]n $2AQar!/;IXhz%4@KWblv&3?JT\fr!.9CINV_isz #+38=BIPT[hw &2>LZiz)>Rdu+AYq*@Vo,B[v&BXm / I e  ' @ Z w  $ A b & A _ ~  ) D ^ x  <Xq %>Vm .BUfx'5?GMU`o    p`PE;- }jXH7$ u]G2nU>&  g K + q R 3  l P 1  u Y <   p S 7  uY;sV; nS: nX@'zbL6|aG.pW@- |m[J<, yrkc[SJB;0$~xpg^VNG>3)  wl`TG9," }n`SF:-kVB0 qbP;%t`M9# pZE/lU>(~hQ9" zcM8# nXE2p`O<'|gT?,ygUB.ti]PB3&~zvutqmkigecbaa`_^^_bhnrsuz $-7BMV_ju~ 0AQbp 1EWh{ 0E[q&=Tj)A[q 7Oh1Ke|5Kd}7Pf| "8Og}%;Qg|)K[m&5AKWfv &4@JSYcoz )17=CKS\dmty~   )179:99<@EILNPRV\bhkqvwxxx| ")1:DLRW^foz &6BMZgx+5@N^n~&4DViy&7GUds   ) 7 H [ m |   ! - 9 D O ] l |   - 8 @ G P [ h r z     ( 0 5 8 : > D J M O P U [ a e g g h h i k n q s s q n j f e f g g f c b ` ] \ Y V R N J F A ; 5 1 - ) "    z o e Z N @ 4 '  x l \ J 8 (   s ` L < ,  mYF2wgVB-wcQ@2&|k\K:'vhYMB6*|qeYOE;0$ zupg[PF<5.'wog`ZRIB;3,& yqi`XQJB9.! }oaTI5-%  #)/5;BIOU\enx+7CP\gr )9HWgw%7IZl~(:M`t "7J]r':Ndz/BTfx0EXj|%6FWj| /@O_n.:50*# xsmf`XOHC?:4,# xph`XOG>4+!yqh^UMC7-$ zpg^TKC;3*# zqh]TLE?91( {tmf`ZSLG?7.(" ~ysmf^VOH@:3-'" ~uld\SJ?3(vj]RE7* xl`TG:+}o`RE9+sfYL>0# pbUF6' xiYI:+ ~o`RE6' sdTE7)~sh\OD9.$xpha[TPKD@:50*'%!  #'+,.148<@CGKOU[bhlpty%.8AKU^gpx!/DKPTX]ciouz~{wrqolhb]WSOJF@:51+&  ~xrle_WRLF?:3+$ vkbZSME=5-$ xncYPG>7.& ~vnf\SI@92+# ~wph_WRLGB<71+% }wsmgb]XSOKGD@;731/+&   |wphc\VOIB;3+"{rh_VMD:1(vlaVK?3(xmaUH<1& }sg[PG=4+ {qg^VMD:0( zqiaYSLD=4-& ztolhc^XSNKGC?;73.*&"  "$'*.38<@DHLPTW[bhmrvy~ (/6=DLTZ`gnv~"*2;CLT]dlt}'.6>GNV]dlt}#*0693.'!ztngaZRKE?92-&|unf_XOH@70+$ xqjc]VME>71+$wpib\VPKD=70*# ysmg_XQKD>71,'"zvpkfb\UOID?93.(" zuoia[UNHB;5/)$ {skd^WPHA:2,$wpg`XPIA91*!{skc[RJD;3,$yslf`ZSOIB;5/)# ~{yvtqpnljhfedcbaa`_]]\[ZYXXXYYYYYY[\]^_`acdegilnprsuvy{~ "(.39?EKQW]ciouz %+29@EKQW]cjqx~!'.4;BIPW]bhou|  '-4;AGMSY_flrw} "'-38=BFJOTX]bfknrwz~ !$(*-/147;>AEHKOSUY]`dhkosvz~ %+04:@EJPV[afkqx}"(/6=DJPX_fnt{ %-4:BJRY_gnt{$).49>CIMSX]bfkptx{|xurnkieb_\XTPLHEA=940,(# {vqlhc]XRMHC>93.(" |vqlf`[UPJD>83.(# }xsnjea[WRNJFA=84/*&" |xrmhd^ZVQLHC>:50+'" ztnhc^YSMHA;5/)# ~voib]VPIC<6/(! {tnha[TOIB<6/)" zupkfa\XSOJE@<84/+'" ~{xwtrpnljhgeca_]\ZXUTSSQOMLKKJIHHGGGFFFFEEEFFGGGHHIJKKKLMNOQSUWYZ\^`acehjmpsvz} $*/5;AHNTZ`flry '.4;CKRY`hov|$*18?FMTZbhov} !&+17<@EJOTY^cgmrw} "%),037;>BFIMQUY\_bfjmqty|   "&)+.0358;>AEGJMPSUX\^aehjmpsuxz}  #&*-148<@DHLORW[^bfjnruy~  !$')+.0357:<>@ADFHJKMOQRUVXZ[\]^_``bcccdccdeeeffggggggfeeecbbaa`^\[ZZYWVUSRPNMKIGFDB@><:741.,)'%"  }yuqmieb_[WSPMIEC?;84/+'$! ~zvrokhda^[XTQNJGDA=:630.*'$!  }{yvsqomjhfda_\YWTQOLJHECA><9642/,*&$" ~{wtpmjfb^[WTPLIEA=951-)%  ~zvrnjgb^ZWROKGC?;73/+'# |zwurpmkigeb`^[YWUSPNLJHFDBA@><;9765320/-+*)('%%#""!  !!!""#$$&&')*+,-.0124679:<=?@BCDGHJMNQSUWXZ]_begjmortwy|~ "%),/37:=ADHLOSWZ^bfimquy} "&),037;>BFJMPTW[_bfilpsvz}  #&),/157:<?ADFILOQTWY\_acfiknqsvx{}   #$')+.02579<>@CEGILNPSUWY[]`begjmortvxz|~~|zxvtqomkigeca^\ZXVTRPNLIGECA?=;97421/,*(&$"!   ~}{zyxvutsqpomkjigfdba`^]\ZYXVTSRPOMKJHFDB@?=;:86420.-+(&$#! ~|ywtromjhec`^[YWURPNLIGEB@><97520.+)'%#!   !"#$%&'()*+,-./0123455789:;<>>?ABCDFGHIJLMNOPQSTUVXYZ[]^`abdefhiklnoprtuwxy{|~  "$&(*,.02468:<>@BDFGIKMOQSTVXZ\^_aceghjlnpqsuwxz|}~}||{zyyxwvuutsrqpponmlkjihgfedcba`_^]\[ZYXWVUTSQQONMLKIHGFDCBA?>=<;:8765321/.-+*)(&%#"  ~}|{{zyxwvvutssrqpponnmmlkkjiihhggffeedddccccbbbaaaaa````````__________`````````aaaaaaabbbbbbbcccddddeeeffffggghhhiiijjjkklllmmnnnooopppqqrrrssttuuuvvwwwxyyyzz{{||}}~~  !"#$%&'()*+,-./012234567889:;<=>>?@AABCDDEFFGHHIJJKLLMNNOPPQQRSSTTUUVVWWWXXYYZZ[[[\\\\]]]^^^^_____````````aaaaaaaaaaaaaaaaa````````______^^^^]]]]]\\\[[[ZZZZYYYYXXXWWWVVVUUUTTSSSRRRQQQPPOOONNNMMMLLLKKJJJJIIHHHGGGFFFEEEEDDDDCCCCCBBBBAAAAAA@@@@@@@?????????>>>>>>>>>>>>>>>>??>??????????@@@@@@@@AAAAAAAABBBBBBBBCCCCCCCCCCCDDDDDDDDDDDDEEEDEEEEEEEEEEEDDDDDDDDDDDDDDDDCCCCCCCCBBBBBBAAAAA@@@@@????>>>>===<<<;;;;:::9988877666554433221100//..--,,++**))((''&%%$$##""!    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Kick-Hardest.wav000066400000000000000000001250501366722712400233640ustar00rootroot00000000000000RIFF WAVEfmt DXPAD data(!!!"%&''(*,/148;?EKS^iz)!rzk :  k o BCQ%j^q ("$%'())X)')s))g***+,-./122i334578N8=887p77k89;;;l;i;;8. OHZO  m nh;i !"&$m%&'(;*o+,.026578:;=?IAkBCD^FGIIJVK LLMNO4QRSTUUVWYYZZ\[]^_`=bcdveJfOgMhHi?jkkylmnop.rEsst=ttuv2wAwwixyzz5{||{}}g~~$`*<}~~~^~}K}||>{OzwyyxxCxwww xw^wvv>vu(uttsssssss'tt~sprZq{po oEn}ml[kxjFj_j>ji0ihahgfe_d}cbbbb{b&bUa``_U_^^x^^[^]^]\g\)\\[;[?Z YXVUTSSRPONMLYLKBKKJVJIIIIIIIqHGF5FEDCBAEA@@>@?>.>=<;:9877y7767654_4`4Z43/3R2q1n0i/.-D-,G,+c+* *U)(\(j'8&K%$##?"! J Mhd%y$[^{Ol. V q l v X,tRes]Z;]uX$*6:Fgߜ`1lmۮډ.iװ+Տ5rхq:Ѿgw͖S̆ }[ɱɍg>ȷȐȓpkƇJ:LQƜL×Õ½u3|GeQm$$Gn-¸5tk-†§5O4|=afF7ÑìyVmÙïîñþRÕ|TCKJYMHo ̿a } 7"{̺9߹rCڸ/𷼷ݷ<Ÿy""C}и𸝸PDaN뷎ȷ>0ҷn,*>B2 $)8nG$]'෯AJGe,޻tƼɼƼ5kPM|&o›lnŞƦHǼȨɈ"˕̖` &oєҩӵԀq׷+S؝٦E;ە=ܘqRިߢX&t>fw3ZX9_#3^r1KLXZ'9/1 ygB(?/x_s;_!\D35+?T[r\ 5 / U V m rNO 8XyMK_ _$KHD. 4 :{3 7!-""####C$$%&-''''E((g)**C+ ,,-(.e..//000M11*223244&55B66679889:U:::~;;;;; k?@q@@@@$A^AA6B~BBBCtCC,DDDTEEFMFFFFFGtGGGGGG HbHHHHH#I>(>==n==FƻY Ĕ,ļK¯Ÿˆ@eͿĿU Ծž|`T8^n:νSpս0W^\fyʾ;Ϳ¿ſڿ]1bj°@ÕÃoŌńlhŝ!6OoƖ4Ǜ%pȺȪȭȏ/ʱ@˖m̩Eͪ#Ou4Ѐж9Dig=QTs>Ԫ?Ո 9Lqֿcבק.ؘمi=n݈۠n"Yߘ9rI#>`P!Y>8XYVVW"5Q3|sRp_?did[&g,wm.HV(B[OS4S/E~z3p1U$i=} ?^ w!@k}* K n  z  g 0 ~ "q l?H si'S .6.Oz8%ijY !v!!,"s"""'##$$%0%=%\%%&&C''(T(((4))**+&,,,9---...=/s///e01112*2o22G3333 445o5555%6a6}666;778)868k88k9:::::::N;;m<<<<<<<<=k=====9>> ?!?>>>+?q?????????@`@@@@y@k@F@@??@'@ @??{????>>>>z>?>&>>>======<<<՞` ԪԔԇaԠY2ҢW ҫOйk0 ϘK *Xyj"Αp]SF!ͽ͇ͤ͘tr{F̹̎̊̚s;˻˥˹"=J?˥ː˝ ˵˲˷˱˺:Lĭ̩̇̅(@d̀{l~ͼ΄6jϣ&>Rd~ж r%=X~Ұ*+8bӶ!ԅ2mՎլ6f֩d׭6س#UW^م3ډڻ.x۸0CLoܫG݃ݰ1މ ;߄;sLQ.P Nl,q ]oZs31~]IeHA$B[6 1d QaALQ4-]%I+~VWm08?Ogu-/CPa -_ H ; H +   U  2 5 2 ; [ y }     ' 7 L j w y     : n  4 l 5>Lr4FOcQ$f)W4q2k5nS-l29r/r:[n U W= !V!!!!!"?"""V###$$2$f$$$7%i%%%%7&&&'@'h''''("(6(O(((')~))))).**+[++++++,<,w,,,-,-/-B-}----.F.d.g.d.{...////./#/M/s///j/8///(/?/M/K/3/// //...../ /........~.o.c.P.6..--.---}-X-5--,,n,5,,+++f+]+O++*]*"*)))Y))(((Q(('f'/''&&N&&%%%B%$^$ $####w#@#"w"!!K!! L  qFXX5JWcp .y2TwDb..d | L  Y f , O  | ? l"y!sM%x/EqV>&>}rRp:GX3T"eK8iQ;{X-4y@$\w=?zY(p&DMmj, P$N)h f*!t"QIa ] Yk=ߨoCޖ3jܒM tۼڅWٝtG؟T-פT׻֊gBխ}Q|F@J=ө:ҫ҈^A4 ѥуx}{kR3 ?RQ<  #/Lxѡ :lҠ'/12Hwӱ4W~Ԫ <^~ժQw֌֣G׈׺B؊ؼ*Yَ%tڦں9ۑ@sܚ;]~ݶNގLߎ C8\#t+P}8l.x/qA9>;p=A-_"r\z BkJI~V0?T:sX-g!dcj2Kd}<Zq5`$>\ApDh~&5=Le 0L\\Zap+6?D<5>Yvzv !+3:;1'%*3?P_hh\H74=GQZbd_SH?1yrmfXH>4$tbL9(fL5 gJ/ yF b:l7uN%wYA(yM.a*j@uQ+ l G $ o V 5  h B  p P 1   f <  fL6 ^<cE1"jM4_G=7, }nX=$tdS>)t\NLMI?-kWD5, rW=*teWMA.ydN<4)tj^RG5vcDbJ?0kG]-~W-[9^5d7 yN(]:n<Gf.]1Y'_(vC^3^%vFSd0pFd7 kS=ubK-zY6]9߿ߵߩߙ߇ugXH;,޾ޱުުޫޫޮ޵޹ުީ޹+9Nh߃ߘߣߩ߸9`~/f5^H~ ;n!M~ 9d6h2g5l#S@sTR>r>m9p'`(c5i7r?t+b :h >p8X}#Y5k"@^>r6^Dg1Pq6\!B\o0Pg~,U$ASX[f|:Wo1Lk(7I\q ' C U ` f s  & 5 D \ { & D g  D t   ; _ "?Y}Py -T-T'R}2a6^%M~3Qv@i /Rs&Iq)Ki~ +:GSbs"*-' &-242* }hL* pT<$ pO2oZ;xS+a:bC"W&}^:_;T(h@jD(i7  ] 6  y T +  g ?  x Y 5 z S *  ~hM(jM3\<"tT2p\K8~o\F/t[E6,$wjhieZK??HQQI?4+(,6?D@:327<><5+$'.9CILLLORWXZ\XPLLPUVXXWVPD7.++,+(!~jS<(xvraG)bA!~]>" uY=!pI& k<vS*];sI\/a*eE!a,jBV$iBQ]5nEc6 bCaI5" vV4lZJ7"wdXOC2 zjfmttj^PD=ABB>941023-'""$('&)3AKPTY]_cku| 0AOZbm|-EXi| +S{5Pn:Wt%Gh(>X|$Gm -T~N-Lt8eDs"FfIl$Sz$Ms%Lz !Bc9Rl7`+>Xt &?Vm-@Qdx'9Mbv!4FXk,<KV`l,?Vj| !,05BXo )=Rf{)6AMd 7Tu#@^|7Po " E o  > m  1 V & D ] z " G l +S)MoAl$JvBdEk#Cb#Nx$Gk 9Z~(=Xt.G]ip{(6CMQQQRUWYUOKLPNC1t`K3s[E-fK2lK&c= wI!Z7xKT2S!sGi? | M  P  _ 3  r B  d 8 o=qIqIpDZ6yY= ~cE&{[;"ykfb\PB3%{vtrrponkhf`YQJ@5,& vmd^XOE<4+!xfS@0$ weP:%lTA.wbH*~aD(gK/z^C%kO4pN* wY=!cC!qP. nM0g@yaI/x\D+~hP7zcM8zhUD2 sdYSQMG@70.//)'/7;>CM]m~"1BRdv *f!Ej1W~$Bd (C]y2Lh8Sj=YuNYbir~ $*17>@@BEFFFHLOPPMKHEC?7.+,+' ~l`UE2 jVD1qW<$ pP0oX?% {X6 q Q 2  j E $  { [ ;  v V 8  } ] <  {[;sU6`E.sX=!hN5xbJ4p\J8%rbP>+ xof]SJB5(~zsoh_UKB91'zqh]SH;. {nbQ@/ygUE5%tbM5u[D.lS:! s[B(fL3u\B' kQ7uZ>$ ~dI1q]J7! q^K8'm\J:,veWK@4%~|{yyxwvvw{ )7GT^jv (9K^o,[x-Gaz4Nh!?Zs ";Rj%0#yl^RH?83(yrjaXOE;/("{qiaXPIC=94.' ~ukbZSJ?3% |n^N@3%|iWD1 q_K4t^H1|bI6# }iS>)oXA+s\E1iT@-wcP='|eR@2 xcR@/ zl]N<*|oaSG:." |zwof\SKIIIKKIEB@;83113799:;<=@ACHLU^eiknrx| '1;FQ]ht ):IZl| .ARbr-AUg~(>Si-DZo $;Rg}1Kcz !7Oi-E[o"7K_t 2GYn%4FWi{"2AM\jx!1>M\gp{'1:EQ`m|",6AKV_ir{$-5?JT^hs} "-7CQ\fpz '3AMWbmx ",9FU`js} #+5?GP[hs!(-28AIQYafkov}     % + 0 6 < @ F I L Q U Y ] b g l p v y ~ z v q n j f d b ] Y T Q N J H C ? ; 5 / ) !       |uoja[TMF=3+%! }vmf]RIB90' {rh^TI>5.#vkaXNE;0&znbVKB;4-& ukbYQG?80*  |rkd`ZSMGA92)!wpg`XQKE=4+# ypg]SF9,"rfXJ=/|pbVI;. ziZK>/wgXG6%|kZJ;)pbQ?0 ucSA0 sbRA0 weTD5( uh\O@4'yog`WOF=5.&"  !'.6=AFJPW]emv&0;GQ[enx ,;JWco{!/:GWfu*6EUfu!.KWcq~ !*4>IUaks|  &.48=CIPW]cilouzxsolhd`ZYWSOHC<73-)" ~wqjc[UOHB;4,& |wog^UMD<4+  xog^SH<1' ~skbWMC:0' zqhc[QI@80(!|unga[TNH@81)# |wsnkga\XVSOIC<62-)# }tog`XQJB90&~skaVLB8."yk^RF;/# uh\N@4)}seYL?1&tfZOE<2(|qdYND;2)  xpg`XPHA:3,&}zuqlhd_YUPLIEB>;742/-*(&$"   "%(*-.137<@DGLNRUY_einrw{ '-5=EMV_irz!*3FMU[cjqy &.6DLT\biqx $(-148;?BFIKNQSVZ\]_adfiknopqstwxyzzyz{{{|}}}}||{zyzyxxxwvtsrqponmjheba`]\XVTRNLIEB?<:842/-)&$! {wqlhd^ZUPKGA;61-'# }vpjc\UOHA<5.'! }wrke_YRME>71*${vrmhc^YSNIE@<62,(# ztpid`ZUPKEA;50+& ~xqjc]VPKE>82*# {ske]VOF?80*# xphb[SLD<5-% ysle^YRKE?94.(# {vsnjfb_ZVQMIE@=94/,)$"   #)-27GNU^fnw  '07?FNU\dkqx %)/4:@EKPU\agnsy~ !&).159=BEJNQVZ_cgjmrvz~ !#'*,049;?CEIMORUXZ^adhlnruy|~ !#&+.26;>BGJOSWZ_beimpux} !%(-047:>AEHKPSV[^behknquwz}~zxuqnlheb^ZVSPLIEA=950-*%" }xsnjfc_ZVQNIFA=841,)%! }zvrnkhc`[XURNKGD@=:630,)$!  ~|zvtrpljgca^ZXUSPMKHEC?<:841/*(&"  {xsokgc_\XTOKGC@;73/*&! {wrojea]XTOKFB=960+'$ |yvrolheb^[YTQNJGCA>:741.,(&#   #%(+.047:>BEILNQUY]`dgloswz $'+048@CFGKMORUWZ\_bdgjlnqtvy|~   "#$%&()***+,---..///11211222333333333322222211//..--,,++*)(&%%$#""!    }{yvtqnljheca_\YWVSPNLIGEDB?=:96420-+)'$"   ~}|zxvusrpmlkihgdcb`^]\YXVTSPNLJGFDBA><:85320,*('%"  |yvsqoligca^\XVSPMKGECA=;9731/+)'%! }||{zyyxxxwwwvvvtttttssrrrqqqqqqqqqrrrrssssttvvwwwwxxyyyzz{{{|}  !"#%''(*+,.01234789:;<>@ABDEFGJKMNOQSTVWYZ]^_aceghikloqrtvxz{}~ !#&(*,/1358:<>ACEGJLNOQTVXZ]^`bdgijloqstvy{}~                ~}}|{zyxvutsrqpomlkjihgfdcba`_^]ZZXWVUTQPONLKJHFEDCBA>=<;9864320/.,*)'&#"! ~}|zyxvutsrqponlkkjihgffecbba`__^]]\\ZYYXWWVVUUTTSSQQQPPPPOOONNNNNMMMMMMMMLLLLLLLLLLMMMMMMMMMNNNNNNNOOOOOOOPPPQQQQSSSTTTTUUUVVVWWWXXXYYZZZ\\]]]^^^___``aaabbcceeeffggghiiijjkkllnnooppqqqrrssttuuuvvxxxyyyzzz{{{|||}}}~~~~  !"#%&'()*+,./0123456889:;<=>>?ABCDEEFGHHJKLLMNNOPPQSSTUUVWWXYYZZ\]]^^__``aaabbccddfffgggghhhiiiijjjjjkkkkkkkklllllllllllllllllkkkkkkkkjjjjjjiiiihhhhhgggfffddddccccbbbaaa```___^^]]]\\\ZZZYYXXXWWWVVVUUUTTSSSSQQPPPOOONNNMMMMLLLLKKKKKJJJJHHHHHHGGGGGGGFFFFFFFFFEEEEEEEEEEEEEEEEFFEFFFFFFFFFFGGGGGGGGHHHHHHHHJJJJJJJJKKKKKKKKKKKLLLLLLLLLLLLMMMLMMMMMMMMMMMLLLLLLLLLLLLLLLLKKKKKKKKJJJJJJHHHHHGGGGGFFFFEEEEDDDCCCBBBBAAA??>>>==<<<;;::998866554433221100//..,,++*))((''&&%##""!!    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Kick-Med.wav000066400000000000000000001245601366722712400225040ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD datap  %+3=K_|sj4OFt@^7 7  \ x;"2bJ|r A_LH]9X7xc#P 5 T ! !R ?ut;- & Vw L!Y!!} 4yt1xpP*O; tjbU!,0fJ n n)Lj#iE i?rKyVw2Atںy.uuOշֿ֡bZyұёaBϔόω˱{7Ƌšjw+7NjNJǠǯǘ9ƉƮ 6ƱW À¥hAĔDTĝĨj&!8.1X{wJ :Rň >CaNε9Ό;͠R=3~d .ؖlMںtپR^ۃݑl1=3f2>SGzA'vvAl"W/k ߔޤp[#uSF(؟TO։}/Ղ'ԍ[=ӬӨ Ԝ Ӈ![҈Ө \ќVҬ:ծE.؂4]ڬ+yۇztT ߺ4D "J? w[Bv|Plvx . 6 C R :^oL7'  5_f"~o !"h$%I'()+,f./]1234567w8799:\; <{<<9==>?@B8C5DDE7F5G=HIIqJKLMkNOPQQKRRRS3>====w=7=ͽ7βn=ЩFщKҩ]Ӯ"ԁԁw9P؜Aeۻvݩ g 2nߚ,;%Rdm#Pb{R0bGN;N9zLH'60afEJ}Z d|E ." ->Pu9t*}6f0yN$Om5L W C Q  & & 1 Y ] $ %8 D0/*8Lj r\R]W=DE>Z SXL& !d!!!&"""B#v###D$$$4%k%% &&''(U(t((()h))*W***5+~++*,,,--H-Y-w---.4.F.p../X///700A1111"2>2o22/3334i44H5555556x66667P777>8888"99999999W::N;;;;;;;;;;;;<<48778:8j8u8A877$766666u6655464433e3222111z151050/U/.y.@..--]--,^,+9+**D*)V)(a('x'&&&&%%4%$4$###r##""g! 8 \J9!^QouJ:VKPO2^v,)`Hx Q * +  j * ] Gq1-m3%p pY|%h9Ygj8f 8_aW~8L>3Iy_p߭߈rhQ%ޛq@xݠZ<)ێT%ڞl[*ٙمٕ٩ْ*ٗ) ׍,׷?lt8[KPtɦJʟ=˓ -K}.o͊Ͳ-jξHψϱ=З;HUхnҽ \ӔӺ(Ԁ"CH\՝L֑׏mؖ؈mzؾ.ٞYڽ$lۉۈ۞>ܦj!xޯ$ߓ W`c,Z>?~HtW\ *<%T@8IR^u (aI{ Lu3.&g}[k1R^$Gj6N_}G{?SKMfNaFXk%ho3dA^ X MgxD0 JZU>gV-Wam0 ~  # U >  H w # L2<olS(:ll;XD[PHKWO>F ~ 5!~!!!!:"",##($$$$$$(%t%%;&&&&'g'''()(H(p((0))*S*`*_***9+++%,>,f,,,,-[---.W.. /l// 0&0!0(0o00t111111$2i22 3/3'3 32373h334=4X4l4x4p4V46444'4P444444|4l4444444=4333333333=32222222p2T2F2/2211i1100v000J0/{//.....p..-]- -,,,,,l,7,+++*x*Y*?**))))`))(m(R(G(0('''':'&R&&%%%%w%#%$$$E$##W##"""a"%""!!g!! < OeZr#s,n8p)KU6IavL. e / @  q 4 O  a8V2#MJ_qNu5m@*n[IC0\')[G8gp)}+Qyd1i= _"~TD8!w? {(fn|h"om^#s3 l"Tb: rO>lIt:X ju"mAJ߾ߡp4ްޕh.ݘSܢk+۬o*ڠOْ]ػذ؋lL"פד׎zOֲֽ֊b@/14+նիռոe?U}՜ըՓmbuՁsZIA<9CeՊ՚՟ժո*1A]m{րք֍ֽ֓֝$Icw׏׬$:U؅9* Wٵډ7\}ۦ@Vc܈@ݬ Rަ޾Pߦ"1,4aRFkMOBz&u0uDu2a8w LhJRqErWt<-/nK&b ^(xs%f#bB>Yn^xz,7Jh[3X':0"#=k 8 N N ? 9 C U d j v w  D Z Z V Y e r t l i w   5 k z j ] Q Q m 2 M V O H K ]  # 2 A E L l 7q)9Rz8^np%D^zFs<x8f0g7tF% @}-Y)[8w [1p1R| M !F!j!!!!!"^""":#^#h#p#####$D$h$w$z$$$$$=%h%%%%%%%%%%&I&a&h&l&r&~&&&&&&&&&&&&&&&&&&&&&&&&&&&&&i&H&@&B&7& &&%%%%%%%%%p%G%0%#%%%$$t$?$)$&$$#####Z#!#"""j"2""!!!!!\!! v P $ @wHR#mP={#zF oSp$uE1nY09g@ ~'w9F   L ~ E  ;  I | W < '  ^c<qIdT"{P'yM,[&|O-M s;qH?D6m][T:nG+i7`:l7yW8sP.Pz=Zq<9Yj#wO)O;\1o0RsKb6n |gھڠڗڅ]2"ٞzdacT/ ؿؐbH;:HQJ=57:87>BB?8215H]dact،؜؟ؔ؋ؗؿ+F^oهٮٳ٧ٿVڕڰڲگڸ^ۛ5eܙ&^ݔ2Psު%\ߋ߹ .Fl/qR"@`'Jf1]u?zEHP /Swf"Vi"P*l a9sZ1G)^0i-s7-Z3k5 3Z{< 3W -YJ7m=v%a(lBpGoBP^/0)9f $ 1 < O o " ; I \ u " , = W n z { y w t v ~   % 2 9 : 6 5 8 6 . ) 2 H Z b h s        , ? M X _ f o  %%4Ur (Pv2Kfsml2Uq6`w#Khx!O}Dgz(JYh|$O#0-.H} J7NZi Jr~z?Ug{C]hcTTm$Mcfm~w}eD+ u_^fmXlZK2 wX7Sa?!~4Ly-~['@sD[EY xP= g @  \  v R +  G l _ C  \0vaO:m; ]6 gL9) pl|{]=~hP:-) f>!*/#zsu|zbG2 wbD-&,' ld_R: v[QE%~dU@&nF& _+|I ya@XgC#e=@yJu?Z/j*uZ<Z+zFu7pAUX.v5u9xN)L["M#O( k1{E߿ߎa<ަuFݽݗl? ܬ܌mTA)ۭۓ|g^\alvs`NRexۈۛ۶۹ۮ۲9S\akzܓܸ(*2Ig݊ݷ;_|ޗ޻>`߀߫ 6d+`"H{&]Lz-lGpk1lLh.j D V[H,] Z/q^&S AyAy%h'_;tc6m;fHp.i"Rx"N1JWbsF7]}&DVk,CSj:Tm Dy &@`~ % ; O e }  $ 6 F Q X e y  + 4 ? I L L Q \ j   9 T e m x   ( O r $E_t!3BTg+Gby,Os"Qny(>N^r5Nd{ +B]y6<3-3?IRdu"5A<' $.)!#.683--0,wcVU_iiYC*vd\ZVK>4+e?n_TJ3 mT=#oU2}fO7V0 xgS5 q R 5  } O &  u : h H 8 %  q W ;  nO6b:dC*|]@(kK- pZF- yplgY>t^G1kL1# {vuun`L2 {cNGMRP?!~eQ?/#sG*jWD/hAbL>,iJ7' v\I4eG2sGV- g=Z4 q@sJ ^0lN5hD%_3 c?^A{Z< a?V4 tT<'pWC4' paZN9#(37;BO^n~ 2Nl,Hi7Y}/Hd 1a%JxBqHy4d g -JeGn=j .Om/Py .Le (D_1ARg'@Wo#2?Paku    mUA4/) rg\H*s_J/bK:*lQ7{bH/uR0jCcC'bB r N * e G &  y T 0  Z 9  m M 0   ~fGlV> gP8gJ2 kR=*uZ?(}kWB(~wmc]ZUOID?=:2+((*))*+)))% wfSA0qV<&scSC1hM:.# vbK.zU- eA!gE$_9fF( kG* gC ]5 Y0tT/ _=kE!bB*sW<&u_M:%|cL5%|iR;)yrlgaYQLMMF>86772029ADB@?BDEGIIJNTZclsx~'0>N_q &3CVo6Pdt*F`x7Rl4Ro &Gn+Km M\m} 0@M[l 7K`w+:Mbt#8Rj{->Qdu.<IVcr(.3;FWiz+7DUhz(@Vm6Lc~ !<\~3I`z ; T k  > ` }  $ D c  ; ] z  E k 2Vy0^7Rm6Ro1Nh+?Ul9Siz/H_x !)0:JYbddfkqvz~}zvpj`VK?4+${eRB2  y_H1yaH/qR/ rP0uQ. yX6~\= r L (  e ;  w R - h F % { V 1 qFiI%xW5cBuU4dK5~l[I5r]H7)yncVMHED>4*%%#yoe^]]ZTME>93,% vnib]XQI@5+!tgYM?0 yhVF6' ~m]N=+~lZE-lZE) ~dN>0 s]F+tV: kT=# w^E.zaJ4iK-mYA)pXA-|jYH5sdYOE:.!'2=JWcp{.CXk{*?Sex3Mg,Hc|3Pl(B^{ ">^*E`}%@Yp %A]y+D[s-D[s2Hb| )BWhu!3ETcs ->Sgx )7EOV\gv#.<L]jt~  *28>CJR\emswz "+0358<>@GUdr{!.:EOXbp &<P`o0AUj/F[n-Ea~%;Tp 1 P p % E f  . I h   : S k   7 N d { ,>O`t )<Pdw (1<HUaku %()($#&*/28>A@<841-(%#" rcUD2"zgTD2 wcM5 u X ; "  x ^ E ,  j K .  j N 3  l R 9 # qYB)q\G-}cH+v]G/ybM7o[F1s]H6*sdYOE;2( ~uj_TKE>81( ztog\QF;2( ~reZOB5) scSF;/#xeTF7) q_O>- p^O?. r^J6#zhS@. kXG5#{dO>,uaN:# r^I6$yj[I6%pcWJ=1%{qg`[UMC:3.&  +4;@FLT`lv(3BTfx 1CVk 5J_s'=Tm(>Ti)AYq-E\t2Lh*E\u2Ib{%;Ri3J_t0EWhz':K[j| 0BTeu ,:GS`lx+8DP[dls{ $+27:>ELPSUX\behjlpty} #(08@HMRZbiov}'4AMYdo}*8ESbq~+9JXdq~,:JZl~  / @ O ^ k v  $ 1 > J V ` k v   * 3 : B J Q Y c l u } } u o h a Z Q E < 6 . &    t g Z N @ 1 !   x i Z K ; )   |k[J:* q^O@0!xhXI9'|obUE6) vgYK>1$~sh\RH=2' yph^TLC<4-&xqlgda\UJ@7/*&" zqh_UMFA=6*~sf[PD8,!zl]J7(qbP?-o_L:'}l\K:&kWF3!wgVC0s`O=* r_K9+t`L9'}obUG7( zmd\TJ@7-" }upjd_[WURMIDBAABA@?=:9867778889;>@DHJLNRUZ_bfilptz#,5=FQ]hu,9ERap .>Oap$7J_u'KWcp|%1=KYfr})5?IVamy'1;FR^jt} '/7?IS]hr{ "+4>FNX`irz  )1:BJR[dnw(3<GPW]afnw'.5<@DHMT^gpw~ !%+05:>@DGJLNPSWZ^cgknopqrtwyzzz{}~~~zvsrpnmljjgca]XSOLHC?;8530.,(%!xrmgaYQLF@8/'  xof]SH>6,#~umd[PF<2' vnf]SJA6,  zrj`WOG@80'xrmf]UKC=5.(" zskd^XRKD=5,% xpha[SJA8.$ yoeXLA8/&}rh^RF:/%ui]QF;-~qdXI;- zk^QE9,rcUH:+ rcTD4$ xi]RF:."|sjbXOF<2) }zvtqomjhgfeeeeeffffeefedegjnqsttvx{~ #*29AINV^enw~ '/7BMXdmw'2=IVamx !+6BNZfr} %2>JU`lx'3>IT_hr} )5@LXcnw *5?GOYblw %-6=DMU^gnv}"+5?HPYblu}$.8?HQYbkt}$-7ANZdnx ,8BKVbmw (4@LXdo{'2<HS^ir{ &-6?GR]fq{ &-4;@FKORW[aglpsvz~zwtpniea\WSNHB=82,'" |ume^WOG@92,$ wmcZRH>4+!|qh_VNF=3)zpe[QG>5-$wog`YQKD=70)" ~yvqkgca^ZTNHC?;951,'#  ~ytnjd]WOF>6.($ wne\SJ@6,$ vj^SH>4*  ~ulbYOC7,"yqh`VLB7,#vmc[RJA80' uld]ULD;4-% {uoic\VQMJEA=:50-)%"   "%'*-158;?DHKOSX]bfjmrv{ &+17=CJPU[bjry  (19BJQW]ckt| "*18?FNU\dlt{  %+17=BGMTZagmsx} $*06FOV^gpz ",5?IR]gr| #-8BLW`ku(3=GQ[fpz"+4=FOX`irz%+29?EJPV\aflrw|}ytpkgb\XSNIC=82,&  yrke_YSLE?81)"|uoh`ZSKC<5/)"{tnga[SMF>6/(" yrkd^VOHB;3,% |vpke`ZSNHA<4.("zuoje_YTPKF@:4-'" |uojc\VOIC=5/(" }vng`YQJB92+$xph`XOG?7.&~vng`XPIA92+" |uoic\VNHB;5/*$ {xurpmkifd`^\YWVUSSQPNLKKKJJIHHGFFFGHIJKKLMNPPPQRTVY[^_acegjloruxz| !',17ADIMQVY\adhlosw{ #(.39>CGMSY^djoty~ '/6<CIPV]djqw#)07>ELRX^djqw} "&*/49=@DHJNRVY\adhkoruy|~~|zwtrpmiea^[WTPMKGD@=962/*%! }wrnid_YTPJEA<72.)$ {vqlhc^YTOIE@:50+%  {vrniea^ZWSOKGD@<952.*%"  ~zupkgb\WRMIC>:4/)$ }wqkd_YRMG@83-&{uohb\UNGA:3-&  {unid^XRKE?93-'! |wrlgb^YTOJE@:50,'" ~{yvtrnljgedb`^\[ZXWVUSSRRQPPONMMMLLKLLMLMMLLMNNOOQRRSUVXYZ[]_acehklnpsvx{~  %+06ADGJMPSVY]`bfimqtx{~  !%(,/369=@CFJMQUX[^aehlorvy|  !#%'*,.024579:<=>@ABCEGHIJKLMNOQQSSTTTTUUUUTTTSRRRRPPONMLKJHHGFECAA?=<:76420/-+*(&$"    {xuqnkgd`]YVSOLIFB>;740-)%"  }zvrokhea]YVROKHEB>:740-*'#! ~|ywtromkifdb^[YWTQOLIFDA?<9631.,)&$! |xtqmjfb_[WSOLHD?;840-)&" |yuqnifc_\XTPLIEA>:730-)&" ~|zxvsqpnlkihfecb`^]\ZXWUTSRPONMLJIHFEDCBAA@??>===<<<;::999888777777778889999:;<<=>?@ABBCEFGHIKLMOPRSTVXY[]_`bcegikmoqsuwy|~ !$'*.259=ADHKORVZ^aehlpsvz~  "&),037:>BEHKOSVY]`cgjnqux| "%(+-0469<?BEHJNPSVX[^`cfiknpsvx{~   "$')+-/2479;=?ACEHJLNQSUWY\]`bdfhjmoqsuxz|~|zxvtrqomkigeca_][ZXVTQOMKIHFDB@=<97642/-,)'%#!  }|zywvtrqonljihfeca_^\ZXWUSQOMKIGFDB@><:86420.,*(&%"! }zxvsqnljhec`^\YWTRPNLJHEDA?=;97531/-+)'%#"    !"#$%&'()*+,,./0123356789:;<=>?@ABDEFGIJKLMNOPRSTVWXZ[\^_`acdfghjkmnoqrtuwxz{} !#%')+,.024689;=?ACDFHJLNPQSUWXZ\^_aceghjlnoqstvxz{}~}|{{zyyxwvuttsrqponmlkjiihgfedcba`_^]\[ZXWVUTSQPOMLKIHGFDCA@?><;:8764320/-,*)'&$#"  ~}||{zzyxxwvvutsssrqqqppoonnmmmllkkkjjjjiiiihhhhghhgggggfffffffffeeeeeeeeeeefffffffffgggghhhhhiiijjjjkkkklllmmmnnooooppqqrrrssttuuvvwwwxxyyzzz{{||}}~~~  !"#$%%&'()*+,-../01234566789:;;<=>??@AABCDDEFFGHHIIJJKLLMMNNOOOPPQQRRRSSTTTUUUUVVVWWWWWXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXWWWWWVVVVUUUUTTTTSSSRRRQQQPPPOOONNNMMMLLKKKJJJIIHHGGGFFFEEDDDCCCCBBBAAAA@@@@@???>>>>>=====<<<<<<<<;;;;;;;;;;;;;::::::::::::::;;;;;;;;;;;;;;;<;<<<<<<<<<<==========>=>>>>>>>>>??????????????????????????????????????????>>>>>>>>=======<<<<<;;;;;::::999998888777766655554443332221110000///...--,,,+++**)))(('''&&%%%$$##"""!!  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Kick-Soft.wav000066400000000000000000001267521366722712400227170ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data &0?UeO<8yh@{kH ( % r p X `  ] j&fC*NfbOP~KI6s;(?Y(3*ZV/6F3aL#O 2 ? q  H  o R , _i uvR,>]C&`WzMsdami Sss}CG/lC0 1ra#*Eڱ|ڗESۊBeںiڮzIז5طة؃le؍عؕؗعؒ]I֘ YSפa\ֲחׇثګJHݪFްޞ5݅݀AG d7]Vp/ \Fl2gFnRltCzopUP5ppPo|*nbL{!ATfO+ I$<>ciߤދ޺p߫LrEovPv޳UߴoT:JZweM. Z\e6:=nEZ1 eo08<Wu!:TS6Gn M Ae`%1cB !"$4&'Z)*+Y,@-C.S/50012234n55Y66a7'899:;p<==>|?%@@ABCDE\FGGHIAI|IIJOKKKALLMgNOOOuP QQjRSST!UUV"WfWuWWWnXXNYYYYZrZZZgZ\Z_ZBZYY6YXZXWWTWVVVVVV7VUUUrU4UTTTTTqTeTPTTSaS-SRRR)RQ%QePONtNMsML~LLKKK6K~JIHIHsHGGDGFFFhFPF?F%F FE^EDC!CB=B BAAHAA@@@@@z?'? ??>>>A=j<;;:K:9982877666j65!544444k4363z211o1W110/.- -s,+n+3+*2*6){(('(2(('R'&&&n&&%$##" "!.! 4  #N[=C-IzC83 E9  %   X vP@C`az$ (|9oI'R-MA_('BE vYga6Ql jm=ߏ߈BݣܻۀDڛ$ڬ\=ؓq2T֔`A"կ՛ա՚qV_qՉբսՑ*ջ:ԡӫR ѽѪѿ;{Ґdѓ\fяѭѵѰѫѳ^ҪҮҘҾ-ӵ BmG (Wpsԍԫԯdբվչ.V>էL ԣh_ԑԽԳ|H1ӕ9ҡP$EҔҨTрНfD4ϺϠϷϢϙ29ϦNAH0ͼ͌h: )X~͔͇͎͗͌ͯsmO̘nq̴̍&+(CbZ"̩8͈͙͊̈́uN,i͂`* ̳{̔DͨXμ 5^ϢlЧHьљќѲ8HA[Ҕ=Ӟ|tGֽ,ׄ״@ؤ5ق4ڣ~۷K=ݳ,ީk߷uB9{I*vzBI[lXOq)|-5N~KqRHq]Jh~8wPc /a-E[~;=&NSj  /|o2di2mX :  K l  _ | 'PTkO};pr_Ws 5qnd27tN t 'O{d6v X !!!"!!!X"">###$L$$$d%%|%V%b%%K&&L'Y''&&'k''+(w(((((((N))p******+k++!,,,-k----....@..K//.0H0Q0h00051111111<222 33!3H3b3Z3R3z33D444444444444^4N4>4444 44333334:464444E444444444454r4X4k4n4U4B4X4444q4B4.4940433c3J3e3333|3D33222222y2\2S2j222u2I2@2]2222<21111 22111x1:10t0^0k0X00///(/..-r-E--,,S,,+|+G++*1*))))_)")(Z('$'&I&&%p%%$.$# #"A""!!!!?! a ns5=:V|eXLM&gmNGPD}Ler 6 g H  P N _  :MNTl.}8uKa=ZosKa?r&u5 b-sW6 _3  \>`Rhl7i*kKF$DxlG_V\ߣVިvgr{jG}=ܠܒ܎]ۆA'\uH2 gؔתMՅUQYGԃ+Ӹ~Ӻ҇kGҾ\ЧsO?:.ϫ|:!&ξ΋yd;8?7k l<60U5tL|A@z7#4~  *k T ( ~  f  f  [ \g>w[]/1WF,v8 z8]h&gE[l\3K8u Or 5!C!X!!"d"""""#:##$F$f$$$%C%`%{%%% &J&{&&&&&)'^'''&(@(j(()F)))L**** +7+~++(,X,o,,,,,,-_--....#.O.n.|........./!/4/4/5/7/&////.............i.=.--------d-*-,,,,q,$,++Z+:+3+J+e+e+=+**O**)))P) )((T(('((''':'&&p&G&&%%%%%]%%$s$8$$$$##U#1#(###""F" "!!%! ~ & fFBI*pCx8,1ug/4j <h<UeR>,7v ~ \ A v ` + d 5 i ) Sd15\aTm7e=M#U&Q$ z2 "=9tex4Z4]vbA {MG`^W2e&T:~hCkY1$vK?jM @Un3`T!sE13+a- l4 j/ߘM޿޷ޖVݨzM@C-ܔqD&ۜۇvWڽڲڍlTLWedO'!%ٰٮ:Aٴ٪1Rpuxڊړڃo}ڦ8Z}ۗە}kmۇ۴Iܚ9mݎݶ/%"4Mfxމަ(:n߿ &r Fl O U(h>wMIEeHwEwRz.v`Jwx=L}X,fE"_RdjGy:`8Gx,U{/e+k5o+\ JpmWGP!K< D:@6>[t|wp8RfeQ;6Kt  8 I =   ` 4 H R W G 4 ? _ | v p     : V [ G 5 5 O ( I _ _ V Y z V w S H s ,E`y#^F-?h0SpWNL}Kz>l:rM}9}.Nr*Qm YP"Q# @ e !/!?!>!&YpJ/ kQH9xV3_6 {wfK(ypwnL'CpHt5b%tT/3wY;6wM!N D]D1~R~YV 2x72^+lH- ]~Fh> \߱ߘ|[8ުގw`H(ݻݔ}}݁xiX@ܷܛܣܸܳܓp\UOQWXP?' &;D>9DUoܘܿ )K{ݬ2Vrއޖ޹ )Fcߊ)Jh)Rx#jFtGs0X *Ot/7C_  8 ^  2 ? N [ ] W Z n " 8 A 9 &   & H d a Q S m      " - B Y i t   / 1 - 2 F a q j T D M q "'6Suwkn{%# >_r !9FLXm3DIGHQZh~ :f,Ef  !:] '()8\<RZRUt$7/+2Df6LXa| (C_v&- #S"/>O^hkmqojfm{ydanpQ3! p?&e<a8y>Z7M Y m8TMTm=V( L J  Y '  ~ U & q 1 V(``C63(udP2 jM6"p\F5*#u]KC<3( tz~waC00;A7~|mRHPali[D, uh_VLGD2gL@8%{i`XJ+cK9kJ+ U/ []!oG lJ7wBsHg9Y(r<^A2&Z.f3dM1i=s:`+{D h5d?RqP+|MvZ7`A/ {=cJ7ߩߕߑߐ߈}jN8(!޽޿'=JLGISZYUb߂߮ >iC}.\*Ie*Qn.k>yBuLY>u9(]k_ j5X|&g ;j H#S-f$_ M ] o x | 1 U r 5Tr *D\o3Ld~):Qk 7Pan4KY[\iz%6JWXROScv  ,6:7.! )4621:IRQJFLUSIADOTK;*"*354." }xslg^H%{dL;*pV9%hTC4" nSC7'{gT='pL.  ` Q D )  { a K 9 -    e _ Y B #  m V < !  f P @ 2   v`QA*hI,tcTE3m^L4rDuT:!eJ9+ofc[K0xaQD1zz|{p]I2 mYI?8. oYJ?73." yeXVYUH2hJ*lbWI@5%sh]K/fL?7*X2qVG:#e7eF,^/q@ `D* [8yH$ V.zW0vS(pI!pYD1yfTA-p^N<$|eSE4 !2EYn$d 'Q'T9l5W|'Tz =k.W 0X(Fa6Vv.Kn8Ph-Lj 1DYn0DYk 6Xx&17=J]s '5FZp(>Ramy #=S`lz*AUl-Kh D ` v  4 W z  5 L f  / E [ u  + K p Eq 'Eh9Nf Nw!CeEm &Ed~ ",<Rdnps}wkaXRLC;72${ncWI>5" |fL3 teP5dK7'aD)uZ<pX: r R 4   r X 9  z X 5  q O 0  k H *  ~T+xW4`?"rQ4kUB+r\F. }gXNIC<2${nc\\_]TF7+&+495-(# |xvvrpojb^XG3$ yrj`O6 fO;*ybN<'oV?(qR0c>yT7 hI.vI% yX/{X1 eH-yT6lQ4lT9 xX='~lU9 tbP@1vcVPKB6(~|pgc_TJEC@;50//*#*9DGHJOSY_ekr{-;GR_l}(=Qap%3?Qi*?Vq*?Xs4FWm,Gh"?Zt.E[w &Ed$Fc|#Hl0Qt3H]u 3Jf 1K^o) _  3 J f :[x4On *F]t/I_u !3G\p .Jbs %/<JXdpzzsnjf`XOB2# uh\L9'hQ9x\C,tU9gH'}^= s R .  } Z 6  p H # e =  m M ,  kJ)X1 kK.nH*nVA)iM5  wfO6#vgZN@0 |wri`UHA;5/*&  }xusng]OE?;:82+!}wiWF<50-)!|m_TJA5$zl`Q@/ wg\SJ>0 s[D.zdQ=(kQ:( s\B-lP4oS:&oXD/sX>'zaK8'{iXE.ubM7$ueSD9-"}zzzzxyz}"5BMU]it4FTap&Wk|4CUt<`{1DUh:Xq"-5D_|!,6G]mx$5>EPYbq!,3:FQXbs !,>LRTWX\gqu| #*00/6AFKSYZ]cego{(2<JXbn 1<GZp );Pl4Uz7Kc9NYi  = ^ x   . H i  ) ? \ |  = R c t  3 G [ m 0?K^r &5CO[hsx} &.1268:BMSU[becb`_bfhhfea`dgc^ZRJD?;63+ teYL<. {eO7# n X > &  v ] D 0   p V < "  t [ @ # q V < #  z`G2rX<" mS5qW<"nV=$ oU>+oaTF5#ynbWNE:+ zri`XMB:3,&{slcWJ@7.$ ~rdYOD9. ui]RF7) zhWJ:'tfVE1 veTC3#}gP;( jXI;*~iVC/ p[E/lVB.q^K8&}n_QB3%tj`RE<4* |xupkfa][WTSUY[[[YYZ[[ZZ\]agjihikou| $.7@LWcp})8J]n/?N^o,D[q0Ibw*?Wo(>Tm*C]w2Ld{ #>Xp5Md{,CYl$9Ng} 3FXiz"1BRbt%3AO]jv)4?LYent| "+27<??@BFJNPRTWY\bhotwyxvx{} $),18ALWcks|  -9ER`mz"1;EQ^ly "/=KXgt~%4@JXes  $ 0 > L W c o {  $ 0 ; D L T _ j v    % ' + 1 8 < ? B E H J M P T W Y Y W U T V Y \ \ [ Y U T S P M L J I H D C B > 9 5 0 , ( $      y s o g ^ S F : . #  s c S C 4 %   vfVI9'o]M>.ziWG8)}n]L>0#rcXMC7+ui]TH;. xlaWMC;4.& ytojd_ZTOKHGE@:3-&  vk`VMB7/(!xmbYOB5' }qaRE7* }n\K;+ yfR?-sbP?/m[H4!~mW@,wfWG4! {l[L;+ xi]N=*yl_SI@6+|ske^WQLID=4+%  "(/7AJR\foy )3?JTanz -JVbq)5BLXft #/;IVbmw-9EPYbkt"+4?JVbmy )3=HQYcny !+38>EMTZ`gnv &.6=EMV`ks{ &,05>FLSY^dksz  (.4:@HNSX^djry #$'+.259<?BFGHGGIJLPUXZZ[\`ceedddeffdcbcdb`]\[XUTNIGFEDCCDFFB>:7521/+'#  }wqkd_\XSKA80*&! wnf^XRLG@8/& }unibYND8.$ {qg\QG>6.$wndYNB7.' {qh_YQH>6.& {sld]WPG@:5.(! }vmcZTOJE>4*!wneZM@3(}qg]TI@6+sg\QG=3) |pbSG;/# xk_PC6) yj\M>1% wj\QD5% wk^QE:/% {rjb\UNF<3+$  !$(.5=GPV]dksy~(2KXeq| !+6CP]iu *5ALWajs~!+5?IQY`gpy #(,06<@DGJNSVXZ_elrvvx{~~||{ytnjigeb_\YSLFA>;72.'# {tlc[SMHA90'|ri_VLB7.& xof\PF<0'ujaVLB7+ yqje^WOF?8/&}yupljf`[WRQOKHD?94/+(%" }wrme^XRLF@:5/)$ |si`XPF>6,# vlaWMC9/' xnd[QG>5,#yndYNF=2(  vkbXNG>5,# {umf_WNE=4-'! yrmga]YTQNID@;6321/.*%! "$&()+.257;>ADGILQTWZ\`ejpw} $)05HS]gr|&0;EP[fq|#-7ALWblv  *3;DOYblu} ")07=BGLQU[^cinrv{~{wtqmiea^[WSOJEA<61+% zrkd]XRKE>6/'  {tnf^VOG?7/)" }vnf`ZTMF@91*# |vpib\VOH@81+% }xsmid_ZUOIB<82.*# xrmid_YSMID?93-'! |uoid^VPKD=6/(! {ungaYQJC;4-% {skd\SJA91)" ~wng`ZSKC;3+"xsle_YRIB;5/)# ~{wtqmjheb_][YXWVTRPOMLLKJIGFEDCDCCBBCBDDDEFGHIKLMOPRSVWXZ\_adfhknqtx{ $*066.'!~xrle_YSLF@;60*$ {vpje_[UPKEA<62,'# |xuspmkhec`^\ZXWVURQOMKJIHFEDDCBBBA@?>>??>?@??@@AABBBBCDFHIJJKLNQRUWY]^adfimoruxy| "(.38>DKQW]cipv} %+18>ELRX`gov} !(.4;BHOU[agmt| !',17BFIMRV[_cgkmqux} !#&(+.158;>@DHJMPSVZ\_bfhknpsvy|  $'*.147;=@DHLOSVY]`cgkosw{   "$')+./14689;=>@ACEFHIJKLLMOPQRSTTUUUUUVVVVWWWVWWWWVVUUTSQQPONMLLJIGFEDB@?=;975420.+)'$"!  |yuqnkhd`\XTQMJFC@<941.*&#  |xtpmiea^ZWSPMJFB>;740-)&"   }zxvtqoljhfca^\YWUSPNLIFDA><:752/-*(&" |yvrokhd`[WSOKGC?;851-)&" }yupmjfb^ZVROKGC?;851.)%! }{yvtronljhfeb`^\[YXVTRPNMLJIGFEDB@?><<:9877543210/...-,+*)((''&&%%%%%%%%&%$$%%%&&&'''()))**+,-./01235679;<>?@BDFGHJLNPRTVWY[^`bdfhknpsux{}  #'*.269=AEILPTX\`dhlqux}  #'*-148;?CGKNRUZ]aeimpsvz}  #&),/147:=@BEHJMPRUX[^adfilnqsvy|  !$&)+-/1358:<?BDFIKMOQTVXY\^adfhjlnqsuwz|~                          }{yvusqomjheca_][YVTRPNLIGFDB@><:7531/,*)&#"   }|zxwutrpolkjhfeca`^\ZYWUSQOMKIGFDB@><:875420.,*(&$"  ~{yvtromkhfca_]ZXVTQPNKIGEB@=;96420-+(&$"    !"#$%&()*+,-./12346679:;<=>?ABDEFHIKLMOPQSTVWYZ\]_`bcefgijlmoprtvwyz|~  "$&(*,.02468:<>@CDFHJLNPRTVXZ]_acdfhjlnprsuwy{}                             ~}|{zyxwvtsrqponmkjihfedba`^]\ZYXVUSRQONMKJIGEDBA?>=;9865421/.,*('%#"  }|{yxwvutrqponmljiihfedcba``_^]\[ZYYXXWVVUTTSSRQQQPPOOONMMMLKKJJJIIHHHHGGGGFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFGGGHHHHIIJJKKKLLMMNNOOPPQQQRRSSTUUVWWWXXYZZ[[\\\]^^^_```abbcccddeeffghhiijjkkllmmmnnnooppqqrrrrssstttuuvvvwwxxyyyzzz{{{||||}}~~~~  !"$%&')*+,-./01245678:;<=>?@ABCDEGHIJJKLMNOPQRSTUVVWXYZ[\]]^_``abccddeeffghhiiijjkklllmmmnnoooppppqqqrrrrrrssssssttttttttttttttttttttsssssrrrrrqqqqqpppoooonnnnmmllllkkkjiiihhhgggffeeeddcccbbbaa````___^^^]]]\\\[[[ZZZZYYYYXXXXWWWWWVVVVVVVVVVUUVVVUUUUUUUUUVUUUUUUUUUUUUUUUUUVUVVUUVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWXXXXXXXXWWWWWWWWWWWWWWWWWWWWVVVVVVVVVUUUUUUUTTTTTSSSSSRRRRQQQPPPPOOONNNNMMMLLLKKKKJJJIIHHHGGGFFFEEEDDCCCBBAA@@???>>===<<;;:99987766554433221100//..--,++*))(('&&%$##"!    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Kick-Softest.wav000066400000000000000000001253721366722712400234300ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data %.:LhfX ; '"8zK;1(   * _ s 3 8 r ?hTNz3"2'!^$tye>)aSU),);  u   $ SA b q>2 6c)z,yX.>z`G|/VD$TX,r#$n`a~ޒܘܡoݱݔP 7ݡ0݉:T"ۥڦ2x1)avpt܅~'rۥ(>ڠ6AܹۅxۿD=ݑ޽ߡqw dJ;R> B(2` fkLNBo Y|Lc"z6T0(AS}wWO{?T}~4qOMp8,]TMn/pt2sU[)|iS{@-Y&+/c}8c7;\n/Qru *fC KQ, VA  g  R 7?/%w_mK !k"%##a$${%%&j&&''6(h(((().*+,,--;../p//<00123n33p44M5556z666S77Y8999,:f:: ;};;<<*==2>>?>>>>2???????&@@??Z?.??>>_> >=`==<<%<; 0/'/.._.K..-w-Z-[-8-,v,,+A+**\*P*@*+*,*@*8*)))((_(')'Z&%G%$$L$ $##" #"""3"!!!g!1!>t5%,#krHgjxkcPy{Gg_YC ORyit[ kfH`DzYNIb1j eeZߢMߴߝ߇߀{j9k-ݺݡݤݭݺ1uތޅ4h3).q (.@|T[?Z0I at7CQ=\P.Csb6Wj%=::,BgW.U 0   9 u 0 z . p i m [ ` 6 ! & C s d r k \ 2  @  )m~\BA^XF)#cFuw3rPmb'Ol)75Q~5m<2b3g7OQTyRh + "   9 ~ !A!a!}!!!!!!!!!!!"T"p"L"""4"["p"{""""""!!")",""!!!!!"Z""""" #F#p#q#O#$##J#{###}#Y##"""r"v"r"a"m""""""""" ###"n"K"V"g"g"O":"Z"""""n"O"I"p"""2#e#Y##"""""""""X""!!!!!|!A!! D M_\M-i#.,X(`^  XChdLv0c't+<O#%Uz\ z H D   ~ w K [q[0Z/|`D>Sc&<J*c;Vh( C_n9*+ %E02;1:$92~H|fW7fG!]xmk_DfUhUE}yoCi LnJ& Ul>woP~= W/e%U/S3;C=PouRߢc0!3=;<:0޽ '3Xߤ#0>6371 YOHFfkvvr 6ZpJ#?JV 2q7|+Al!jxwEHhv(@Sx)LPi&o%WrHMM2P^ew7s&9 )hF[CK`s?H, 5 I{2CXr"%h |W AN4)7BTx:fW9` 3\2Tg) Sg ?{7_ket'=GRQ?.'(-7=>Rz,D`-'2\K% v 8 ^ o 3 ] k j p  ^  U "A}(}#1aO -f0HED\4aAUJKN!=Ij>e7aw$-I} ,^2SUOVdfdwZJtu>  LjN">~W/XBA2 T&l]UF'b#  p%97Y*}P);~bR<vHJ nL? W  k d A | u >  9 yH9"Li%}E *Vl8]b2!Oo4 [9q{ZTRM0hFy5r]CwI{>rH|^A-=SG*o>!Df>{>whY9q[J6[FNSRB  Fm} .:9'+Xj[[y 2Oo"%;SarBx.ks'7f5g+`L*@Pn*n o ,Up] %\3MM[@5~UI gG:ev}`o -EK[hpSR(=[ 2Q^p$A< DvX6E{(LO-  :G5#)&(.4, "8NktUF;:Kr!%5Z5t     = n . F b  ? g w {  2 Z { $ > U #3J|1r2LKDKa (Nw%7Gav2H=5Jgw~;Vi&by:LB68EX]ay.>?.'G^qrbZ]qcZhtm^feA3."$-nN;'yq_; x]E!lL>HQ4PkTJE4l:im^F$ S  u >  } I 1 ! x T  Y  dSM>xY-VbRDnXD, \F:% t[O:`B0lA04ANA p{`?% u}s]7 ]2c`acS.o^?k<$v9G|V/nL"b;/5-i=rGf>Lm;o3".0lC |cVA |Y)kCuU7&ulZ? }cME@;70'  4Xqxtqy!GcwMb\SUh75%!5Y 4QnAau4`s8Zchr~"O{Lw#g FHT'Ln&;OXSIK\p '% lU;~[5[-~Z1{P ^ 9  ~ [ 9  g 9  u L   f A  i6 {Y@4 V=:<,tN tj^M6}hI{t{}eJ1 xrj_TH>AG=-ot}tmcWUhlUJE;217;-i@)#! kP2!dTND&mG) rfP%m9Y1f@"pY= }`E* zSGOJ.dE'yY7mD$d:w@ kP)kEbYZU@z`N8r^@gB& umjknolpsgL7:M\cgjijnu&:Wu 0DHMd 2T#8X|'M~0Px+ *  ] 9  r a N : (  {mjh\E)q`L9)vg[L7#n[H9- |kZH3xndXD&v_D' ~tdM2oZNJHB5#rkigd^ZclbI. kWLGGFA;3,#q`QGDCA;. wgUF@9' uaC" w^F5'oaXF- xgP9^8j@!hM2~^E,kN;. jJ4#qL }gSC;0vi]SKA81( !4866;GVfx #5BLYhw-E]s"=]v$@Xgq! X }   ' < O c x  / G [ k w  $ 9 J \ p    ( 5 F X c f i s  )0698<GS[_[Y^ejklib[UTUWUKA=?EGC8,$ u k h c Z N A 4 ) #   v c Q @ 0 !    y ^ F 6 - &   | n a Q < '   } n \ G .  qS6tZA)x_E.zbH1~jXD/ uh^RD5# ~nbWOI@3%vprtk\M@3' ~yz}}yuohiqunbVLHKPMD5&""se[TMF>4& q\L?4* qXF;1%qW=%lQ7 lSA81m\K6zjYC)u[E3|kYF1xh\RG8$|qi_O=1) zk]UOJGE?6* #-4;CHKP\p *?R^hpy 3IZgq~'AYm{+AVj#.=Pdw"=Vj}(4APax%7I[p'2=KYj *6?GViz !.JVamz 5IW`iv1G`x5JXfw%;Par  8Us  ( G d }   + > Q f |  ) > R f {  " 3 I ` t  # 7 E N W b k y  !(*((*+*)'!$+..,*%!  t j e a Z M ; (    s f Z K 7 #   t f W F 2   s b T D /    m [ F 2  rW:! ~gS@*gL4v_I2 gO9' s\A(p^M;* vfRA7.%|wncYNF>51.,*'$ ~~}|{vnf`XRNIECA;641,$ sic_[VMD7+%"!|rkd[SMG=1# seUI>1%{m^RH>5) xm_S@, vk^QD6${k[N?2#{kXF7&~pcUF7) |n^O?1' ~wuutqkbZTQNKE=77;?=;99;?=:61037?EIJGDDIS\diossvxx} &4@M[kz%5G^t #9Oev&4ASn"4FZm#5DSan%7K_s -BVfu (7DQ`p *:GPXer~(06;DNXalw%,6<=AHPW\ahov~   #'+*(%$*5=@?@BDGKLLOSW[^chmt|#-8BNV^ht#4DR]iy%5GWfr -:IYl0EXjy-BScr} $5H]n|  # 1 = F N Z k |  ) 2 : C L Y i w      $ + 7 B N Y b l p n m m q { ~ u o g b ] W S N E ; . !   y j ^ R H = 0 "   q [ H 9 . %  zhVE2 ui[J8&q`O=. |gS?*yfTC3#vdP:$xi]SG:.!vi^UNF<2%{sjc_]YQG?83/'||zvnf\SNJFA:1)"|unh_SD6-'"|vrlbVJ<, ule\RI?6/$reWI=2' yhXJ=/%whYJ<.! vj[K8(wk_XPG=/! yoe]WSOI>4*! ")2HR[fpx"%).4;ACEEINQWXW\bffc`afjnssolloruutrpnmntwwusqpollkiiiiihhhfc`^_`befefeb__behknpppqqqqrsvy{~  "(07<AFNYclt{  &-3;EO[hs} '2=HS]hs}(5@JWcny "-8AJRW`js} !$&*/36:>?ACEFFEGHIIIIKMMKJJKJIGEB?=<;;:9630.,)&"   ~woiaWMB6-$vk_RC4(uhYL>1%{l_QC6* zodZOE<2)! yrh^VMF?83-$ zvsqng_YRKF@95/+'  ~zvrmga\XTME>50+%zsi^SI@7.%xog^VJ>2&xnd\RF9,sfWJ>3'rcSC5( {n^PC6+ume\RC5' zof\TMC:0! ymc[TNKGC;4/+($   $+28=ELSX_ejqx")3>JWajs}-:GR_m{!.KWds#.9DP[eq~"0;FR^gt} ",6=ENYepz"(/5<DNXaglqw (07>DKQX_hnrv{ !&*/26<DJQW]chnt{ !(18<?CJPW^bgjlosy  $(-48<CGJMPUZ^_`cinty|              xrnjd_^\YRKFB>:5/(" zsme]VOH@82,(#zrjc\UNH@6/(" |wog_ZVPH@:3,% |vqlfb^[UOIC=851-*&! ~ztmhd_\WRJB;5.(" |vng`WOIC>70)# }vmbXNE>6.'  {sldYOD;3(~tkaTH=2(|qe[RG5,$ ~zupjd_XRLHEB?;740/,*&$" "%'),.12346:>@BDFJORW\aeinsw| &-4EMW_ju$*2CIQZaipx}$,4;BGLRXbls| %-6>GPXbku} !(2<GR[aipv~ $,39?FMT\fov}#'+/27;?CHMRVZ\^beinrsw|~|xuqmkhd`[VSOKFB=82-'! {vpkbZTLF@92,$ }umd[SKC;2*! zsmf`YTNHB;4-'" |vrnkida^[XUSPMKGD@<9973/+'&$  ~zwsokhd^XSMHB;62-)%  ~xqje_ZRJA:4/)" ~wpjd^XPHA;5.&  yrle\TMF>7/& ysle\VNHC=5-$~xrmgc]VPKEA=:60+&#   "$'+/268<@EIMPSUY]afjmptz  &+/38FMU^fox %+2:@FNU[`fkry  !##$')++,./245678656556665443210/-+)'&$"   ~zuqlgc_ZUQLGB=73.)%  {wrle`ZUPKFA;61+&! ytoke`ZTNID?:4.($ }ytqmgda\VRNID?952-(# ~yuple`\WSOKGC>:50,(# {vqjc^YSNHC=83.)$ ~wrmga\TNG@94.("~xrmgaZRKE>81+& |upje`ZUQKE@;740+&   !%)-269?BEKPSX]bfkosx} !&,16?ADFHJLNPRUWY[]_abdgiknprtvx{}   "##%&(()*++,-.01234545566678888888999998887776655433210//.--,+*((&%%#"!     }{yvspnkifc`][XUSPNKIFDB?<9741/,)'$!  ~}zywvtrpnlkigedb`_\[ZXVUSRPOMKJHFECA@>=;:976421/.-,*('&$"! |ywtqnljgdb_]ZWUSPNKHEC@>;9631.,)'#  ~|zxvusqpnljhfeca_][[YWVTSRPNMKJHGECA@?=<;98644210/.-+*)'&%$$#"!  !!#$%&'(*++,./0235678:<=?ACDFGIJLNOQTVXZ\]`bdfhjmoqsuwx{~ !$&),.1359;>@CFILNQSVY[^acehjmoqtvy| !#%')+.02468:;=?@BDFHJLNPQSTVXZ\]_abdfgijlnoqrtuvxz{|~    !#$%&(*+--//123567899;<=>?@ABDEEGGIIJKLMNOOPQQRSSTTVVWWWXYZZ[[[\\\\\]]]]]]]]^^^^^^^^^^^]^]]]\\[ZZZZYYYXXWWVVUTTTSSRQQPONNMLKJIHHGFEEDCCB@@?=<;:987654321/.-+*)('&$#!     ~}|{yywvutsrponmljihfedcba`^^][ZYXVUTSRQPONMKJJIHGFDCBA@?>=<:987543100.-,*)('&%#"!  ~|{yxwvtsrpomlkihgedcba_^][ZYXWUTSRQPONMKJIHGEDCBB@?>=<;:98876543211//.-,,+*))(''&%%%$$#""!  !!""##$$%%&&'((())**++,,-../00012223445667889::;<==>?@@ABBCCDEEFGHHIJKKLMMNNPPQQRSTTUVVWXXYZZ[\\]^^__`abbccdeefgghiijkllmnnopprrstuvwxyzz{|}~~  !"$%'()+,-./1234679:;=>?@BCDEFGHIKLMNOQRSTUVXYZ[\]^_aabdefghijkmnopqrstuvwxyz{|}~~~~}}||{{{zzzyyxxxwwwvvuutttsssrrrqqqppoonnnmlllkjjiiihhggfffeddccbbaa``_^^]]\[[ZYYYXWVUUTTSRQQPOONMMLKJIHHGFEDDCBA@??>=<;:98876543210/.-,+*)('&%$$#"!    !!"#$$%&&'(()*++,,-../00112234455667788999::;;<<==>>>???@@@AAABBBCCCCDDDEEEEEFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHGGGGGGGGGGGFFFFFFEEEEEDDDDCCCCCBBBAAAA@@@@???>>>>===<<<;;;;::::999988888777776666655555554444444443333333332222222222222222222211111111111111111222222222222222222222222222222222222222222222222222222222222222222221111111111000000000000////////.......-------,,,,,,,,++++++********))))))(((((('''''&&&&&%%%%$$$$####"""!!!!   hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Ride-Hard.wav000066400000000000000000004122641366722712400226600ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data455>5>@AMPXagssxuskdXJ;77A~ #2 >yp*; Ri}'g߰Ctm!@e1/ݗ!ݾMzUR /P'ek2P8 2-Z@,&&Bil C" O) ; h&I87iG(OI' t٦#@_ {,8!""4y0 ) `Pޝ,̟+0%4!a!c s[5_ 1,d)$B&<]2.<<' >%! oՠiD؇  }"@uKo$ wU!ySP}  " _ }4ICm  l#P W @+qFC ~ *+uE 'l+ܥ W r g]N*;W|WC 3 u W]'z D.bn]?,!"!Dy qvbF *4] H4 U d5M^vX m*QVUzYz [@n 0 W*4* ) <> <Ak \ !@Te  eEU YN L ?P4vUA Lee(O|259 Ux* nd ( 8u x+t` N) eU e+5>LG$B j,7] a +Q k5)  x0h -<lmY& 1~\KC{ U c@ `TGK6uH"U +R.y G;3&v> $O/ 4c E 8 J*c x Lz dn* "3t vGM66 x$eUx/; e C1 qz_[pVE A '$ Br IX =$6 / o +\ \M2Jy|v5 ^@ ElVy=zs s7N  bFl'A[UW-yD1  %?`] L H ! 0 7 Wk S CdZ )  Mtv 7(Hxth2#. "j0PLjas#h#O.Y 44 &,T`, F7 s =N )c 1eC ~=la]}_;UiC@Oj|j /(,AxpEDgn0' :`o7[\< Qz sF rLb $. [UV}{1v{]a-V pL1r9v_h6'<-o/T [ ggPnLq sw\ +p 7N>l Y Bwe^N< b [+2kPJkdbAWG I m N OElRseM]PpU LhM@I 6j5Uf4k MZ.w } }w  *^=5 /"2AhaMT6.uw CL  J ; lG)V o y:]FqcV9% Ee6  _IP]B4u 1w KGIy8SZt 'A *]mQvX   ZNK =:$C'j S 78.`X8<lOS=X#il+!0:SG>@ /pTITi 0: jDc)ORk Fq}Y:m36IwUpWWtU |5Z k_Qt9VZ kO'k rmC] y`kn?M0FzuJ<kn. #+e@}lh pfQ5fvidP=YiK|vHC} &Ij l 1DbI{@,.Nsg'W*+`U%]k}H QT7h i |+mLp`U?z]d`$( Kb ZNg!)NqA_) b@XDO>aK/O6  t QC/sHCR j2#BVp^/}D"# iE8Hm C 'gjSf"UPM_U_.EG$laRES^6[l6W%&jhYo  svodMat^6D' gW~l|X  sQru A7MF {S s Ei_o;zL A%!F+ 8 (&c3IL$Y[=A^ BI%ec+q`n'6e= 0SL^99:4c1uJ:+  + hc3/MY()S TtM>$. u\&t  FbjL.;n; A1B 0rEzziRZG43U?dd hB(e~ C?kg=<? 5 Cfv3T1;BDPJ  [sL5:usg}NGl0W&{iUv8Fdah )E{R&,  /AYC 'm=i4RjQP |xRj.PFJ%:_'R]:eZG D4 {Damf S;a]o:O-G}97 -F4 t  A^]RGXD@#x?k0C{Y H d H5J 4bc1&V/= Xc8 z  ,>9 5?Zfo6kL9 _`F,D,@09cy.OJ+PW }~TQ0l^v woMW EY+ c#sZ N G)r vy%1dBAYV,pXAw(F>rep!1-wT:A+-@oJE5 YUjIX>Z,S|fmHP rufcxPGeo0 W|,=p+y~>@Bb | c<he O 4%-QHne- qZo[Nc}H <4B*>r^s;D@P"} Pj q>WfB1P8NAmwrB`9N:| SY)CIX]/5Y,_W9pB P#l7?gU0r@Jf,0 K)H" :-^a gj.5}YKSJ5:$u="\EE8N5@=,t _:z RO%8zt'Xei\t="tUFYZc3hS*U[YgaI 6M AVLb;( "ukv+,-wu[x}*06 q:iGvXVBE*"=DynNj^{bKqB[Qp  z_ `m4 y @F%|w#fs3I|ukkbt){ c=m]CwB}KG#7< rLv8)^ A i H% DS9?ML 1GJ*?Vktb`6>qX0g|]VAk erc ^sk]m-6Y"PGP+)RR9F\-3t`<t*|.}K!PQl`wBu#g._lRX)Y`P % _3$XUqR\qkl }yn9l]0-T`,0OJW40 E;*';FG;ck62*/hMFD;}q!  P yvSIi~,NSc~OR\kj*OsPcnKK\<T*_8>Xg.]t+1!5A?dI$`A,Wzk}0\bTa},@F82^V{`}t7]{E(`crn*<e96"DnI.=]vc6Tl2 =oey#z&7jBArp:Z hgk^ YO> /S8 NR}C?l-'pO PBkY:= )W`){l"tfijG4I$ :tm  .3 b`L-/4&-C;R$ma|BFFGmWJ 5 *&AH b)|m"P @ , #fse$L} 9ZzkLA`nt B hFc|sZBCI Lcdda&{mjH:l9wkY\DsefZJ6GkS pX_zi $+LXn:w |QZb~ VOxRZjW5&4 NT w/; #YD{W|:S?G% kPy%vfDb P ge+WR$q@ {S_\MLgZj^@ Z,-< rh|\t3C)w=bTQ>dap6f}g8: :W~ a5/c*5,-~wOM>#Yc`nGqI{B%Gd}c 'M hsFB-NAg;lCcOX*iV=^'a3 I@XVL!ps amS(+ up_n9'+>eVW5VTos#Q,`Z *L)hG|J\$!G}M>MS]kT&KS/jkZ`-~L iYznV7^KGIP*iaik7-{g B ;;K0"D: }!Q!qI"+Vnhbf?Bjw[lFwD8E|R$LSic^;cD{U'#8A:~LYDgw&ZQtS@mcdULj%\nlKCO["-0 m~4/:Q,'<LVD ZCAv}b 338HK!*6qP" 5bK#[fW!nD}hWwO0[Ti:s*sBbj4jW;awG*@.}&BG+HLx.T$w/$Z .>zB16Z~MV<=[{JqFfmck 1f \%A"`n1z j"6lA<Y2 13*Lj@q' W3,}FE @xCNG@ m'/PC IM=B|j5![J!T*D>hnevDZkVdPwx~) F*:=nm4 \A<@Y)pKe4_eb>j7Yz5]-j&{ms @h bk wj B%in-`J_ yT8sBA~n(12|uO!~4_nS%PdL5x l ]``A_qg%i# )b]:S: i&slSoQL1EBcfgwMh0lh3*U)4`)@j*io/}pz;IF9ISoxpwxl_H]M3&U"X$#*weGd{{P_ EwP#}]kESSmfk +OnmA0DZZ5P/yYBuco9K|Oe|k|je0 <xzCh)VF&Jx7s-W!cRt13uWH}O$p+sZN`_]-9Wkbr&NS[=32kh`Z3alQ3zTj\K# DlAz!Rl2x*@ VHF:Im@B KPtc-m:+bs&RM:X1f $ L"Dr'(%#VSC,/(1uh&YReUWM+ z|G>Ly~qQ8&#a[+@,MWaMXXj-.#Ze8t^//fV )TW$$RKI -N=i]oJrWBj  dY_::GoW]EXW;Erz<I}=0M+p?7 mn sA9{d4x0}Q%)0]"'x\in]wGJy<%1e9Il `I9I!Ie0&$[U# x4*4\q&:\iGQ$=XY7I^+:KB? 5V0^z9l3dr0]~$>a= SzL F ct`"sCZ'eZds*'TcT"D@BG\6Z@` 0\CG* 'UJ3 Wcq-`fWKm\ZZDHi|$q-wv@&s);>-}Hp.@l>p} .c0A<|0x&jPHYJ 4H@\|&_4:W+*F]W*|W?9D `$RN 5"&~EI A,rN (*.Npj9zsy ?P_sEoAaCS-,lPc=+b x< x/L}$`WvZxMUyd3fr)@c}X cAp<,p `G!zO]3S8CBJ]Kr;LU7PX_0xUj]7b`=Td/FlYF9X`$.sC2A@FC]~-0.|rUsc?qm2kyvhlscxyTk`VsO!OlY Je0q2J`@]s3Dk*lGpFF&X i]jbZy df6Y={324p.m}JPLcfQ0C")G$s2acc{4:PLn}I=i&4MZPI;.wlX,lVR{!0|&9vrMZ\^ ]OiIn T^6aCS"2c]~uzgYSdW!drR{p90==j E3I!K(7<!L>f]D\]zLL>9/w\NC#K$LT*F(*=T:R^9u!I &}w]MS;6t},4q@G)7(E[)iV-2Q4$4E0 v2;vv,\|Tzi4 Y-8v^-=]u!_=`4P=c06!;`@~z@0R9Rw-dd}D|aC M)_f- k0.KI0Sp=KSpc9qYzJ"3L\>RvSpB2@vg#nLw9s]c"!N$P1&Zy@^52P5)''Q5(gFA af\P 0Q8ht gM u6XMHD#ps_r =z <{b,/:* )&sHNV?0S!TlP]Yl[@Pl}~Tf8u0I;gqz5Q]\iE#j'a&5A15{VH@V{PF7F7g;9Kms/ 2 [N.}=<4 26]pwB4;xWgM$ 8YPI0wTM3\~aOiFzSi:yRru*ge4{0|kupP+6\=&#%|I Dfcm~7e4q[Nc2 l,RwO5n&j3 mRi}%b%268, I}=/lnU06&e`%UMG/ 1N$9fgi $eK J?#TWU :C !FAP7)m6dRUsZ*'aNG~\}{'9P1"MxD>aE^o&oR$UwD%`&T9)@_Ly51*G^ D$K% | 2``)R@?q`qLu$L9@ },XP: '[K\*V$?Gk=}b"7mj;kVb3fZ9I`kC_qIE~ ugynPF0kSm p&% cgY,4=538G&C~g.C :gb-mxm~@BWM` e MhAN8c0nB7c}ycdV)]+<^M\eCI*h U)XR=ccJV8G1 BxLVMp`z2JmF*WY}1!E8R~-a% gV sN42@P*;0[<u'!k/ D ~9oC-#{=T="p1^,TTAy)l}tz]*s"q!m U'te W3MGM50Bj+f9bcnh#8.U}F.g=}/Ror Zc$IY}j*FOfIq"-P9v=lOG5i~`e-_ Y-j=,P+y Y\/Tc7\RQU@MiY$0 -ej&9)u['SrxP l@O_I` ){-:?d7=f&2=eDrzd.t~p|?]g3$,DUmJm(u[YWB30%5M]4I*03030vcS*Go: Kq;M ]k M}s u?Of om^W3?4"]BmmEZ*D#SP=w6sX1^ C@^zY=sVfM7'0Hk z07H7#+{W>3DK@ 3@m{sU#i{}Q `1 =V267M4h{_3H&l:4@$99O:-d>c FAAuy9t:39c){o)d}m_O(!_aD=M6^CN+eR8y@6eK 7&d~S:=!2*7GU {FT j7lti8%dqI2SE6Q~UI?]$[>Wx3/jI "[XX%Tte!8aJ0i9F9'[1dTpZ4A]M)"ciqg1Ynj#*As4s+KZ!Q*!nWcAx$MMJTTYy ^@KB'bL`0')&4Dtb+fII!HM* 2I*']}:hu c'^1=NgS[3MM0tX5k9%Q&luhw=]"jj%8d)##}cVeHVNb=7s:)R_KcGh!}7l j4O*1^t+_#VYikmBy$D_p.mWU&NeLQ80{JM: 0B6+T=J*:V,Dn7SI5;yP}X]?,zSJV6#iY\5OU@tRtdb<kYU ~j} &t>2Z07P5iUs4v}"V:'zJC*p7]bm=~2G@~0r0E@F7[f>s@g[T M%4lfQYZ/9iq8{/*aTG3&Yr[C=^PX]$*n9Jcic2o3CL]WtK^o1 jw6.P/ AVtP\GsOYz`?mwBdfVTTit{~.Z:YgUG*wt@m [e/H->=YyR`Fj<]W ; %luA9&}VZ+v7:s/0'm_pR"k3o9^Fa1]u~ $ C=,"Qr~f,wn_`K,HXT=N:I=_+[A]wO} *@u],cuk )'&ux@N1DPJg(F[s&J2eWOu$>QYsJw !x04-]{ KPi-1J_-dIC]R,7"gm exJ X.M[=vP#5;>_XBMVuF@0w&p m00Wm]o!!Ai#/RfkbBT?gFZenFQ2?41*ml0]k~e IQ=26C*8}TJ. O6:&}+|m 6=}8W8`".'M:RJ#3xx$'m*g-Y, - ]CgQQ}tng@W@#yb-K+& :Q& w1]5>>P cd%0M&W6j Gu 7yzHDwZ*`W *=TmAg 0?PY=0tPWm8 WL@0 F`Xa ]CG}kzM<3.\H @mc,V<&`mk;r H .mle4G6uJK%5 f X~\lI.Qv#!,T@ug730!,?Hkyu@2C,,6xc.OvR& pF<rk|;cnJt Ry-"Q-n0pPt@Mb*I1* ^u )gfR- V5^|x6"BDM`g"A*wm{gIN}>'J+W;NN? ]G)0U(WXFFq'ccPS8b!V+~VT#W@2X"Xh yF pSAj(VWt m'i  3-*O7e >BZ:o(~j'!7E)p.Mxu6G 2y5 q\ cCz2\*SqJb:`Vo&RY 3`{r,fz`YfZ&f =+-hSgmKV~6TJv8B sjjl>g| n)rE/}A'[Gs]~H #ls]CH9w`kX@4* _md3mt}j!PSsSvxK@6xsHa}n*d>ZYn6-90dz dG\p(3s'hsGN;}rR #p]#S:AP_*.iw4xiET Y\@Q`cI&JwITj0Qhz'S"aS8csC )g=%9tB\ )ltdJ4bGD}*pg`''jV7K!4MJ.|*P Q10^y ~;{`"uIy "Fa@:B.HE6 .=mWn:CI$!|Gt ~VrsS]{J aDHQ]#VFKj&=8_=tWp POi9gslpz<:b T$goz Lr/JW5_1jVO ^*%B[$R]pyW8hx3|P]3[^ Dyp pdJR oc +b==-w73O:?bzi&C"UZ~TP\rk176?gQ qf2*2)hmB-: ^a:30rXC:+!YZ2 Dk*g }KC<Vy AYtR^ ]%9`jo'lt\$05 ~oD4ta@ RdY_iO'[E8C,"~S`[e phv1`f]{6Q4sM#H0I~Nb! ac-fPcqMpIL()YK-!*/ZZ.ndWwfP-``"<zuB g}]K=oYfCMg CsYQ(4]HMc~G;\%{mvpUo(X8:*~NcszQ%[7gE8!Pfwwo5Sf1/CBBmKlpXJj?>%'Z F r3I GYQKH[=U AOA"=ffj}&~t"Xq[{u$M}7aEcG. X} sct E:[HFG-qyz$SK=pLX%%})At2AD-qYVXwD024$W:oP=  id)C:bdsIS8q$XpF}M}3w4`gC06Pw4:\;B#D#I*zODqzo8-K VE6*\vPT?ys+q=&&n z[^h[-$BU\An/&%|:>Z-.aEsND4p?T4W'23)Oh@3pR%w`ZBs GczV@`*:yBXCyLsPs?u!! DV7]cP}_WvjwEZ>Ci:;&]P?#\{CoWM/T"eigaPF[Q72|/:uZIYts2=U<Pi vDy&a0D|WX*u}tDU)]`> yj T7rO z8#m~-YM;IX](c] (@0~.G2j- b8CEd3=0Bc*G)::iEXF )7O~pn> Ct@FyE.W"Vr96c%DvD}_2'sESfcF).Yk&Fh@J @)pLH_=\[VLgli() i d]CWt%+=RO\"oxQT&|GnW9Q|t|gPeg6}j]=<!w.m~gVS?S /zJ_kB93]%h)Fx}2KWvox49uRXaY%[W,*sW4np'&rmp58M>cXZ& #P7}k3c[ fM{`!GOPdc){c=6  p\ka%O(k=fY4=',r=`:O66M`p7dMR0}D Z,!*}]u = )(vbQ]jWmG]WxNmk0!-uco$]N -JSG]*2DF-#pHghST:@8l <TDQpK  |5M4\F@``xb* Z1{!6{<0zinYE  lw`4r_,.o{K:vk Yi;H#p \xGaUY$}.n'[Gi6U0=`87"$vf(mw8Q\hU)GdsJ:cG@q> cUMif.WHkD&Ml3'WvN!OctWe]#2v;Phsh/\yCdO&=6HrEd\kV+76][s IdM(U\sRKskSFAYX?.cqd@dMU`*O2Xw0Dp["M* M=P&7$GLS3l=[M@AY(z`2<(_X=u {h)dUP\oU3o5D|Fs4gk+.TFyLOD5=m*R*)l$0u[lI$ !~ I'fUoW{m9[ Mty?"=&R=-06J-!eT 06_)u2D0 `9s'R 5dZ[*EwN{ WkqcH!PH 4 $.wrQQo,,Y^o3 YVM:C,hW J`$m @a:79O-Kh3\ Q9 O<#=+ExA2}#m. SEe&c:N6Z%| .T.huXk&_,k5q6A3} 5Cv-.)Zc {d%=GM]P/ 0dPcDs @v:5]^ "0#93<Zv cytU/`&g]1OMIZ :(P2mo})iM]@}=Rn:mcg:Yci0yyJuRg~ ,w%9':=_8&[#zGPYgCvz:H"1mk!UkW`/7\x|sA` P 'fweG  -gCgR}l-sJ3R%Oi c-:-g6*P8)]43qyoeg=(G#N=F-M !NU/mc`J,YI./S]Jd65C[}|Y"W9^pVfuF P[E:Gey #J^KJ=iA!#ssMoH-_i1nMsMbV81 C^2JR:KFg(x*JNNW<Mt=L1-'*FHx*BXE&4mmIc 7M[kmNNFPP8W,d:@cEGv]&<dH3Z BP3BJ!nL}7*`5n`fph3% dkCjs9|sT 7 }Wu9!Ao(9 Byob(.EL=*=HTZ"pnf<6 0_']TP1 cj>&E}]`4Hv$]}Wf7JmQZ7l#9:pm~.NCUq)\d*'m8`LYP?(p'Z4 }iSA"gAgIIa=wb2R6Ig2Xa _VQ[*G4|#"c>M52<MUCfk#_>/1W,TH-YA&Fx7!AN`J:4nWEFhT ZVD~8pO9c'}I_]]iGFqCBr3y:qBkmR[""rM"x4RXp%O'(2nBwV}w+AXW~=TE31B*ln,|XEpLq#Fgih]M/a vxC QsXzT`dYCOxu0} E-?s@.3 #JcccF<|Xtz"T%,>tg,: w7zf=|"g`[M e!~^5i z.dkQ`KC`79Xz&J8b` uK` d8z.NUf=I@>5,xpT6T ]4l8`]Rmd;gn!tpk4:!g 6Yd-//00pfIF0Fm=z-.Vq B3fghXf0c[PKl)) K?}4gMy ;s}}'f}@Swj`Tqs*);egsx M9<$ey96yK3(m "ifo'hE]0Rrrjv{+-kjM(N0y0p:R-eY`]sm3rS3H!`SGy1>=eWt7{z `}wshHZ3_C\BtBgtt F%D-(JQ\.f bb=lSeD{Msm=g>YZPs:UcNzkBgUoz:{+T0a&YzA"pV}J@0/KKK]g)gm[R|%y Y$%nobc-s#mqsU0 ztRQ;xvl)*\vByOl5 *C[& G$G)dc`>CI}!Ms VP5RP)y0Cju T0 yp]f;1BR']O*tCJC-7R* w3 xdB13-zJ($pNK-JxKSRM64JA];>}dupuJ5cc-w{:<B{aLjiaO`\9z2vpjRY q6!`DIO]E?xd]98T|P2.!f__iH=[  }gV,ElgW$Sv"h;4_M =K X57x1yfIMQY?,`=2B&kjy?UVf#`pq]G-i|@wm(x7M', +XY&tH%Zdd;tY_ww x/fK7$T"'@x34 Uk3p|OJGc0FYFR2.4C@d,e ~Kk.zOKt-qCCwosMJ f/Y K)0 8N@>7r@8 O' Y=[d*pH;mwKPkf/fXfT#kFPiD7!BZOp -"QwZb+PNuts$K` EEm@C3]*ZzuvdY=GMI/d!MKw2C9J Ad{]fh@G[qooVU\ Q:p+h$!P\b@m7KVK,#{'{CSE)c9-uUuBjDF.R7k&k$se:N&*-v-x>.-(kl>uKo=ko3 vo=[p:zjL$6]9_[&)K@p *A9B0f(^K]Yum$1910SjitH*/,t JMD)=&QTS,VPOQnkI5_!n:T&!k]=A[H-hBW86#wrRf*R:JnGp|(;N@t`[24>xkfyRUJ_W(]K 7JC=1>@\5kqc+Ic`iv mQ #<:cshxwkmC't:+DZ;94}6pFxMD4d z52s.b=" `4*U2sSwb=S 0K5IIhE&]7Ls+`!>$X=l*<AW=^mu #Pj]Kn$z#1Y$dcv*iE6s >5uG- .NpMNz+u =5E:W|f`t_TG/AoT__:VdYM3aM08r=OugC~APF1Y Dd#9a"z&_Ik=_-)Y)2 O7s:nG=[=Z5_hi@a00DWD)9 I~E5 ]}*k49w-];1rUr^G -F2pJP=Ajw6o(8?j#,C9[b==14AjD|u2\nm49*}CMk>/Uks U =b,$ Qd(K+KqHBV\Y[+y-G '*{V0`faLNh \_KtQbaw0w"& s"HdA+aYyW9Q*0- ]K5o,_/Wf@g\$ /fED&raM&=ELg ~p!ds Ox/k0-"]`eP =iks|eC  5^ GM`yI?= }qI'[c{XsMOy}7g>+)VxVX@_@r`l - B/@Ef<= 46-rR|2y-JOTBES(-[YnacymY{Yj}r`Nkk$mzwcG| -!9GU$.1s8M7u47aQ&DH g:@2;{x+Zp=~{ gLo^ ! ] YOM zqQ!lrbfT0]u:4U@' -=jP}i\PP:;"v ]E|oS[j38&u"Cto5esf_( `&f-z yM+q<`:.,HBsv_S2\)}2X-] PS']u{KMW( tZ8.=!3tj%pf[m#F*.DZ}77e0 Q UuUR=.ed =OT) I'c*3<9S7:_] kX D`!  O77h=g'p1w_ !yWv6*+]-k!&Y@eSudLm]J6U(8'`h1AfV  i[e0c /-6+JKO&5h> @c%M|'g`s:Q\jZ"s&*@b10)MzM2} _".kp*,wqO =?Yr"w1!3;QP_pm#guPg`(6V/K&~}5:mg9L`^- -V2NIp7Bpsy}f99BBggxM0Z.=-Fu$KS'Dtn$ttPefp$X}D4VKS,wB vxZq]Qu8;dkzDfTnpFSsb>H{b 9W`E2^pY~ T t3AU3y@Zvc=c6HBcmBP,@*i@[jBCQ`xP~P79@gErQ%rzK~n+h [ |1O{wX^iqNj4Z+)DWPmw.yZr'V+*v,Peq \c-q rV!yr_yw~cc*1]6|.gALr`LCI-G]6i=^ys|tpt4w@@`&)ShY=Em18Z!{&ULKsF "9K7?L`?6W0M]6D. [g|h gAT50)1 l\jMXS5fcPV4')Bv{9Bm\-~"vjw??cG!L[*Y,k@V#l{5 csHN:Psr/Pth8H@A~2'*48XJ!Bz0d n54|\AueqvAX`FXe g4%G0Shs]o@P;vF0 U8:CeN.YK238Up :#\=A#^,3z>;='NNPH Y-j1MIkXO([L7D_ %[7j=h~YS?k$N?!DH3^Z^D>.6! JL6S5YbSH$R+1cd[YiJmrHz!JXt gGP\8qYP0{qf F^hWZ.r= 6VF(0IengXQ:2vP{=@b=NQlSGF]}En[}M-92@9@}-9 T]vD&gPJ&)[}x,m uIy& >aSV]YKuN=V]M G3pQm}|]MGKz6#y^u]f0EE_[GpSEa~T6] ;pHjsD6@q [>1=(`molzY 6\p!%_*-Q/nxo`$Ta$6C0~W%Y5G[`*8Z&c(@-3)-bG6Ag0de9?qcuyD 4o.gz@-*EH.WY@BiX,h=-EY(XgA&s5j+z}O_:vHs/}5b `Gk{+iuvaX u*23Ix}28Q{!=U: AFRaMqtG2q/lz'>K wLv](HSYCt*X*'D-3N u+ht1y*yT`1Dn(GuGfc@-e]p]Kjn)[B-gr)r]N!ZA )@aHmV}[N#4aNv#4ND= #9]~2s-v*cVCs:R7ZZ*@ia^c! z|(S|y.-39$s(]WRNj\BD@K V/|mL}V OjDU)@=[T1k#-`C c(Ps Ou` :,|bjN#=~a .-y'-yV{KMndHPm|5I vG p|HhE1o7*p.{i*1k PK|LS].R,+;7\ 0Kg)]8  JPyY 6!$Ht.Zc{Pk!h :9Dxn=foXm Pwi@ )X4T4v@TZ{=m tgpDDUdz%G0BXd#iC\,V QUm(v /cz.fS6CV 2r NC6=DV)D[5dMK*~WJXJ{[d}]l =pkk=YEG| >'D)kHk!Wj;m8]p5v1kG`TK% eKy-2G)`2.2x)%_h(!9gTvBAMw, `B=XFCUT3Z=CEVm ]81k$%IA0+k-JvIz d*M + x$MP8? iBTU>(`4d50zP }\_p:Kn kEn 0*HX5y5hF5^;pSmTJ<(y}`S9/*UJhjQ4du~Jn*)}3YM*w#oHcEbDVmij]u5Sj9MlsR33LI0!D8TE7^K$w zv&<=4 5[j^8H zD24B1bT&Oq ?T `@>*%=6DqQE=|AW%"tZRaz{h^*_l s!6|Pz2ilA `cSC=]9~5f93riQ![|] 1MRRD)`i]m5)6 Ei!Fc_(7b}BM]yb,;EvwlK2'^ =')T .s>F,/Be7@{AUxX#aMRXFl :g}F n-"A;Im%XY-k}J 1KkAAmR?%`]av]H P@c0:@PkH&F7V u,HazHRq*;#%r[Ce}/b PKM,:^!m1D$#oA]Ek#k EcpKK35k:[8ckg>M(D'ceKY:S6sA7ggKpgR9M0R{j6>H\0z"DRRukp MKc:DBqAL5vAa0L/pnDA* ln39UP.A3Rt /YA 7y50bg]G\&r-&9i|3{wfpg]S3;D!*vz]83gwP. 6<:-Y5wz79mB7xH 3C0|=Pe >s6[LO ;;Yy[ B# 91hn+ :V`XxcCT`kvh]f a?H(|B:#L@&.yFFe!o  4u!uK(9x 3r(~ /su64[4mMF^$czPiYWy3w`@J7ZnBBsa o{m0nz$9 (P#c {#aq]w[s['~-KJY}xvU2K;Q(2PeM9S~{]ycj:3jsI sL_;ue20-0 mGsT$^g`Pg 'pXT x7p0kb 01db\Z'M9e@Y<-7KL#[MK@U:00Z{R*|06}P@ P7cQ4 +:(2 p=[!"+e>$|!&1vb34 w eeV0E$;}-]dd])p:mW"" bIq !0>UEc6FMI^m>e9"S$J=G:Iw Mm"Flm K R-KL[=1r3DoB{p7T6D}R0"^h]*{0@k/[.s{?fJZ7:NR].VXvc/msI=Kz[ \W#q" PD`X xXkM4u+_.uYMtJ:":!PH p4pI&l-{V#TP?:3}+F OOfDp:Twu'7j9 D;P4XuO*TV@tGS5hP>ND8G: `2&vP?%}%|{}e\gZ|9mP[9UG)=Pp@.P}O8K=;N]%{U=[M[WqgK;w ?k*"b {B*UmB X@R@$<# { SHe$-F 0{s{B=Auc\k!;oS!h}-?H =3?D[~9q@*r:E?ov3v3u *ZQxH~@\`d Kd A.A5'Mz~YA5~ 6.H=5l5$COm5U/+9e#SS BeQn- dH [Y 5%-'=sBMl* >xZ%5PzZz-F`r 1>Pxe$g  *l0 IQ4i Bm2HYg8emM} j7C^fVIf[Df2<#._=LPkv+*O*dkIg Bl6DV0] yUe+!; ^mHrpb%+|Gezp4-nis&=sH X=$QEIc [-[z6Bi0 ((4e(BY$ pm9)*'N8Eqsx}Q"Y8JdjM\b#A&I(3qg0~Bs"=S#Kc$ q)d:ths 4uU|RKIB%P~';@9`F$>1}D= "x#HKV\mI CHIVP&]U 0eE kpPt^N0).35 QNed7CCwrg  m]]{4cmT1)'@e'bOY2Pr(hu'w;Y<1q@B\I 7ti4Ll;H:+!v ywoKh%MOR y9Ub H4_p$~*Ok5,B> ]tO6jE ?'8Kw4_ w=Z-<t~ N>5P" DAhB /GV 6=.NX g>MhCh]E:bA@gfZ%RdP{;|XHD^wG7=Um{ `-l%:IuPID(R@0@{[QBJs->}\BpqTc[\u+q8Esn] I~6AH5t^_R5GP\6)7u% A` >sZ'dF,5 B`*%Vd2sGy$Bl_LM  T2Y 7.Ui @1w21] >v#W2e;B53yJum K)V,c(x]f3F] *'nf$?S/YB*0sVy*NW9R }U.>]q{UE}xj==fKOv#MM|X =v=\-K'{u;xmetk~ZCE` )aUR-!d;2zMAdGCzrx'0d!(/M&ccps>.U=~K[l~N0KCM1f:!e^%oF6ksdfFISzmA = e ns^"/GB"dnBXiHn9/S5i_]p@PDo9%w8`r0fkooT"}K5Hx9sV] 0V$JpF5A@{0T~%bU[Mmpfc =tG*vyM-bpq7*s-Y{},{hxO3P7Hui>@`DSnsCRWPXJS mQri;6 T_y7(?6y?}w 9m2V$zKfEeT1eo\w^W KQ. XB8T{-H<" EQ>X}R]UR 0 "#*H/35`dUJ RH^d2S`.{] -8HBK^ t@uj*k}.5]l53W1sK)YwR0_:P 5I?.K";w"s>@y@#,UZ@c$*:2q}q -"U5n#OUTt8 Q:T71,&PZbwROB:Y 04U/x8p+Be?B\pc@k@e*`V% j=K7cThH|(/=Z.MrmYFqcyHVS@Cu@W 'e~kA)8e -+q DDL z8[0)Ng3_|k8E3X75B]dQm3s >Z"O7(6DG5-!=7x{tzE2:-Fz?6RsdspEfbhuc\?m-_3+h'kt#]Kfv*8+[]1v}_8-T c' (9 ,T >7}bp)XXcZ4Vk$d[n0$Ht\r*ZK)& Vp<*k HsIb92!%0K>|he-tde4*sgg X9SHR'~/PeBS#1:*i^AZ=)krPmF,Y8'74'f`_:(%+5[h2kuxjhPQ{EQHpQ=WCu}h4.uFFCLc]t"[X#[Fl"<]!.22 }`h3r4 |c"]JI#uS;]]*8[m0 M@J8Ecqf2 Rhb#Z) x0:bw;$sT.}> 6(~-.A.&!H9+EPmBW `J(?}Q4CdT8O1xo @c^TMa{1$q2L%$U:81{& @25e^jtQcmwdJ!-M!J(:`!5-FbmAhmPq{V{+dmTYU% 0mc v+e=`d @*{5A*BEI@HOyMF2O2`@J^;wAz`^8Qz-:Bc"J[ZeR eeSK !j_A2Dns]i/6]|5RZ73\(NZ@/=:mvc1G8k:vYx(PT@0`7(9@G;0s6l'fu $e}5 X%cBy-_fi k2RNs='ZG1VW-Y E{gk( DA'HK[Cm[| 0$I[]K rcW Y~6Ej_=D0v*@Z7m YBv 0t%bGaA@*6-`hB sSpyCpT09rxsKM6#w0#K!*Ybhpzu;owg]IZ "l_,XPH7wH__cD'P>?H~)wM'iuK!HHcJGqSF]Z iAx.%Hkwe:JD6?ts z"MSs%fq-]0[jmyox6^$F$L& !gUZN 9cA-@9 k.N)_@[K 9zPZ]-07x:+P(qZMGQkDZk*m%Hv*+iCe"m~k Gq{Nu@H2k1G$}q +J46,0:x*sD{Q_Mng)J:h{DNb:/mszK?R{m6] zw=u$R-P"1hEi0ma0wv:)(HK\l ;'}s4A{:[7%A5PVf"Hzp3f=KwyUm^X{eTy cc7VMXBcfcX&%30);.)} 7=jP^t"kKg~,2uK#J/vITf`y lV0 | 9}NMw6n*UHs8p5}=-&#UR.g0[Z{hZ3ltPeeC!:Y2xuM6E=se?3MeU:Fm6dVRY:jXR+N[G*(4Ue$w8`D+]W% H*8)k5WhM 'hX'KX%* {J:-pIGm2E*:!1.2=W-{+Psem}tF<a1`Ly`0s?UNU" +U:Kq{-72nzE:ncEb5 P@tKw@=2&nPj{2@BiCbu E u7C>4S|]o@f>O6.K^tC2wq2y2Sj\@6U[: 8}G7 @"Q9DV@~c{[oTh/IO7T} -WC$\aYPOe|C3l0(%j>[_?NB-% R=k+2o,@_tZwh-%! %>M-7"Bq_{qjF*)Q:e6!gJrwj. %TzEU;w*,ZW}H0{8K $aJafZc<9=+e*#=*'_Rr0z`i7 )=%uh%H8  9+h}+k`u$c WgK {u:yc4qO;z6pR=4 ` K4Yea.hnU-G!}!MFx:q(dI={-2oE{e IiU[3%=*]Q :kqgDvZW{80JWnw}G:$;=UeD mUAB\ePP}AS;TK0 kxVbnSFXEoF0 qAZsXC PD>r:R7.E`t`-GvH]OPg4gN@%=Ea)M*Tx1.p};pslv/WT c@rs' +pEmwlX4_E>}.B35BH8bK%!iMHL"b:4}$6vv9:Nh cT0}BliGv.UscY S]S~Jg1.$E;{rPuU 'M,:8#Py%m_ 9z%kg)U` :S3PbZKyy`%g;mlmuyYM}O86:G"Z/K]!xEv=musfB4I&2h51.ef/:JsoMRed+wR"TXU@|RB9YJy 37a_ i9u6pem`}g V%3i+jG .szGC{PCi]MhEZACM[%Hz* 6X^55R`*RUnc{> 8G Y2R/1h~W+%=+RoiCM 2$GE`Gx0'k#4]`B`pT.  qp(Aggm+5:(OyrceIhr4$6r lP.jn{g% 82jHvi2DmB!G6*A `o+^+Ep12dSOS^-H1mk2 MxwPy"h 8GI-d x9$fX >Z)v1wHZZ 2 [pQ>nG+'Mwzh6 D(SJW0+Tc.* p#9$eN-:ysf@kY &>reI)HiZ>X_l*}I /*w>7xPe%c]WT{ePSWl`c\Of&mL%<=I3W9p!yskXxx-E SI}N#q"QX5~mK-1Khx`"(z~2 $6:B/k 4U6WJ5cbml]]`:%D!+KW7ft9yL)-VJ M$ ? =cm}zmF]U{}qUT""f N~NT{C0n^!;7[ -yUN1GW]Rw<`jL5Q[APm<8LX]4mt}UmOSkXq8|`*iq{# R n*-eNDC 5nXFMUOk@E KWAqXmN~gcB##Zu/Vb:\65@%ka=E]{hkan;1^G$~suts5!*A^eldJsVT} yi8-A]xu@p-Lr.k{|W64Q#KjDNkj8T};o%sJX-j2 t-kw\sc8mM.>m{}~GfP .uuj{04 F-BkEj({1&UHP*_BFy4JSp-bO5hngA{&NpN;^mG[5i%Rmg["{eY-w@fq(_x7hM_%aP8R{(A{'E(:`maRNX.M%5R_cz}|I*~`V: M-?9SbPKh0nASZ +`T8'5TJ"*Ja5R3#F m\AUkz [u:&/gG-5Ik `uN k;{M@R Xs]28S+sMDG]RVrTerFcmzKMchj]"{h\k`=cjDJpKF[P0j'NW gEn#Da8{:6[$ewH%JpkL %F3/|u75]=\yyE=: =8b`xuM85 F'(BcK k iCPnGJT!OhGD {&[msMmhC)Xyk_UI5Z}gA U9S:hedj+N-_R2e%!s^"pcDZmKHAhT(:S@gR mR-Yev8G b05wgDKGj*4  ]wKc4:T6v 7K:Y<`+mthQT[t:48yK=uj`C *3 8ce 18`}EO 807u;SGns'Wqj[X CH@E\J: w}?M F kU:^hu]a+eH ;]' SP1p2p|3"Eau+MDNRPEsH ft[@K#Osy<FP^#=geA'5} 6K`J. JsWh-8hFmL)*%? ~Vp-8 pOUBpQ sWe5{ gj""psWTU8E)mNX4\g^Et=>!(LTZ>5-{0%(ETe8 Bq ] E.}^ $GK==E#{Np6T!zw7 l= S0W X_ryI )|r43y '~mp>$*')!p{kH2wC3 =qy6P-V#@u@VkmlL?SeDHYC]@MxE+".>!]HtF {7-BQZ:*Gp9}gG[\=E>Y5c'=mT2s5l w{M{-vPW&%H>A]PsUW\k^9nsIBxJ _S%ory z7Pk "RsdK4;^6:`2d<#mi[lkce}RuZk=va#snA!]>!]=g` =}iF\0]yy "PS25^PD J1~k7?*T.fwM uuGJ-k<*,kU^DY95!5P'|jx}'.$5ly6]"L u'xnNrP/& b-`cMI4BcJv} ~d QyE@C|KN7!;JBEmP<@'Dl*f_U_@p:kV9UVIpCs>-PC#9^>;SO2ep0=- 2!=AHLI}@QP+y,um?Itamy MNcK2\& h%UeGK~0(-czJ'[kaKW&DXn-tPGxO'&u]8Kvl}<+N6`E3 #-}[} a94 }1WZ4+%AMPKOl@Ev*dp%!@WXJ>2ecss[`Mzs= JP(vex|lkxt};e@ %3(Ex-h0W+0aqf@= YMnNHa G%v)X}]tmDXR<_N2lB@\%0pT5; =PQZ QWmjesT^sh'>x5"1X~^P*R@1EEuG78|6Hefpo kM3B!P~sG2w :()n:"S( /s.hXv yIMcsd5R#1v2 8O%A[kn@#XAaaN;kE04qW9 0= :vb#8sfs.=@:% :qf)55Tk[ uFcM}kP;{c+z>2Mn]6 )lxGn'QGp08$]s_%h{P?o8&<\bYo/JBp&(u{BhqDha34.6@. %N0X,ZKP Tg%4lKF*[2u c[/B.jT`,*Q:wh8X:C2V3PgA*u]%a* \br92u?hHmU8+Kk4-ee;4[}2UD$L!@1Z[NIn+xrRBE-U?x}g0xM@2; :R[S0} xK"25zg VNB5-;Nmm:pdy'mJ- 7xkC?v8gsBl#X&B We$K_;mH:%tQ~wGFr09B =sgp}Vs=*iI)i%}(/_gC9Q'`wG>c82hz-?^}M(*//uD{aZu{ue7(m #@Zm1lKP6z=(QGkH#C:?csO(C<1Gx#` `7Y*KT kB7W~4`(7=K >uhF,BJ`@H{Q![Jk> .}r & VS[iA2c=`N&5'VB~wYXDXB  *Kb[?s)R>Fc2FH*[n~I@+ c4'B,bWp m_L8f@n[\ U.-sjz#1 '',0=rsM gGn]p_s" I8H;$!:u^K se}*JzK2RJd5\B 3]pS,&iw@Ea7Lm 1NNckgH7Hw^vlK[X8xZU `@(e[06k[(Y$=8{Pm5U~R vRR..UR*EkFPQpm45z-FG_ ts srM8RO]$BFauKxjxHGGJ"mItN= Gbl:hh_L r Cwc{e _DgaXX01ErTR"@R\:ri?25`-zk$.0`Wl'Q@szsD @5KC>7 -] IZ#mdp*2p| ")x%dx$UiHb+Ag 3) -:h$$X^2HG*mc3f.7{cIEfH^T='E6~__}`Pd%Xi#phkmARps=-Bi 9 0%]Bhq;HMAMF$%'!=MW1%-E-Y?c`&v9ly|:]ZXN`sG eOLv7eXbueB %;m;Z s]~dA`?MV& ?*vu`{"0* .mpp(uz%=9m{@=RyZ i{42pMI/o'pxR48cws@odrbma%% ]: 0b]`5hf:BxUp wt+[+2i"@= (QEL=[oU ,""UN%i( -P_fK*zW>$:S)>-Kh(ms4wM5=t^Kf"+}GvIV+(^ =a4Eh]% RKfP08+zkwZ8B*2WKA(Y. Q~r%RYTiF1uB2[x2!%[Ej!|@rpc\\YcE(Fd"9&"8+@2k~=QnYD~W "PwVJ1@K!r=s @9<V97*1DLQTH%{-nLLIXRV_um,RF\uLN qDS49)jIXS}r&d\<sT#Ztf,Uf~ 2@buOj/L (%%zu6g=nAh{q| G-U`P)`W1>>*m/,M:d,/*I_quT*i99Y_Yf Chzkp^h02]XOez'.;`aG WziAro{ /Sac!AS mG * J_&Y[s\knoOQ_{>[?xeY4( >SpnXk9`oBfZ *YN.8ZY7d% !}JjY4?jc8[/8JRZ/vq@Cd ~j35uyCz8d%,&8y- cw {4\M I1AnMnnael] NAM lw_&ry C! <b';uhe m -S.soB,; bfh 7 z`j>rUm(+"eUgR~rof7ZA4J{F<yIGl6`E<~FRVG#0 t#0*})"IlIf>zo2<&R5a IagZhpwx$Yb ZxHzeboxu?ih4ohp09Z v 5oK9No=`8O:0s[>  ]_fiBxL~~O+ =dI=Q4qBv(grX:($DntD K~kGc>2 AT4D pejwg-% ^s<Y4#jbo(vgl @;hJi*X?$!;>MsuxQ'Hte$uI/P$0c+(s,^'F7,at\jCf:(cE1$^ +!ATgx%dlZ <>2)Hmg-`aQ^%NQz[wbGQe"+-Rnv RxeMKic)L|ov_H$XnB2<)HF7! qo0.3C ]-%7(1U3~9}/)/btK$vJX}so~|Sz.KG9ySVP(ys{x5tq.uWre>%Bd$2 "'%<<83)"Z(>^X8S1 {B@x^_|$!Ze\<UAfQ]ek[Rx:'4}X aoL'~-ag%Uk("m2FMJ5u^IVTb>'3E;$=.~}@H2H< ,{QjdQ[ $&vly/!fSZ\Zh~U9=8I] 6E9 NM,4=JUK5 clW; yyv[x/W{UsQ+U/\2hH)@D*1A- 4S7w8kX|@q!9v_Zh  qz$7A~&G;V^4xKA"Qsg~9Vli`= SMKxt5<{N?8IK; U ,| 3LZ_YH.%',|t.&fY:DipH#J4QO>jb;9zUe]f|[/""\TyR .Egw?>c2tPAEGJZm|u[7 2q@`'L()0zXd.s;;a$+#;OS_|^ C}TKS &YUw>^qV0  /%9N+|^l2c}~XhaYZelru J`+21'%@LW?<b6:Vm6Hx~" Jrq&P6p2.h|HWTF1#fwa3pQSjz2Gbyi4pc)bT{d,,4=<?LO[UV9dFS;]8^Myi$qH1AtUMi'5.%0Lhb; 0A:#%Ftj54Vh_6P![,1# pdp{.RO*G8eWof]O?rl(N7|b3LbwwS9+,8LTQ>qu9NO>0qPAo(mL!  GvjK,9QOB) ]BPqtk}2\oiCTv/<Z\M2 @vw~ymk} (HK>:}x-atrD2QD1BjqY#%r`[O! cr"]uJP-R[N8+1+  O,1e C_[rX$0_rtaJ5*=WkL `5n"cuG+!1yV/e35Y%*% >[jkT!vet0+#%2OSS@* `Vr S^2+Bb[H7ikVA, (N]ild!|IHy"X`>-K9pOPw$W1b}O4AYVN<Vqz2za4?;+;U[ rv\^B&')5>'of[`sVB8]n\E*"$5bsvmniaG&%>;'3qEP9^Wiwpfk}  ?~&9:) % =jxT[]u)Osgaf]-'41(//(#*Hf{}qd]P>$ m} $ 53zfu ">IE&e[)@^aWSlZ CryedpvmDO';ztfI]qhcR_' O5e`%-@AHBA<:9CSh}yf? 00YzSTz|^59aa"jW&MJ+&~y:![hC&Fl}]3(7S`N3 (($ -MYG'PXVD%"#icy6`zb]~m+ ,AH0 =aQ gV^v<0]}vT$paT>2,7;$ wh| ml([{B5Jvm, 68! &9;,3AE:)  $ ^-J6u_an|w^9 [dtCK5WDxt#,386( xfp)R`L.>[`F($1I>l9C:SC C`Y1$3CE5 ,Xb0[Y} #5IB%.344.+_ZB[Q'x 0'E* )EEA,$1Oxu8*F=}TKl494+"%7VysXECPjxuU%(.Rq~s^INQUHKXy~d,%LbaBVX7. @Vb]NB?G?$5VstX*)&,4?MVO5oXk@s{aG0+%.4C]qxdG+E{Xzx1=0##;xpH9uqc^c`T;! >TK$VK` *CD<1?Qt\' &XS.+KO;+OUB Wzg_jm_> &*/9;BGG>/+8, /@ID>>GZug6 ,1.$!$2:83*,*(#'/<6*2:5.#!GU@! 0A5 {zw"Foz6qWWk&H^\PKLTYVWXawc3 DRD((./(*5GW_YL1 -& -"#DUjwS,#1[|m< 4?#7TN+z (Mn{mF  6Xd[1#DM7 !=ZibE'  !40# <7<WL3 .3+#u}&3) (3/%$$'+%(#!#6Vfa8*^|a2 1g{tR:0663 }`m 8\jdE+ >dumP, !,28:=94$  ,YtrQ*1U`R%$ +>GLVetuW. 3=5ab /@0). (80*)6;ACR]bT8" Fli<-PxxU1 ,!(3'9^rY&GgfS( 8ivX2 );>& &PaeP0 2F9  4O`ihR! ,YkQ CbZ,8WW8 33! !!1FXXF! ;]ttmeedd\I- 0wydJR CYX;/NZP4 1b`9"  089*-4+!r_av/9BKLB5%5,$/.)0<*  ' !21$ MvsH('(+0HA !-0-# 65(  $@PL: "8FM?(&Ic^<%, !%++) ' 26..6' (/210+&"#+* )484'#% !,1% 2?<$4BB3&.CHI=- ':BLUcbWA6<FJ7&  (.:=4+19KJCA=4*!',.!   )<7)  #*1.-*$#" )DLB-   ;C+ (')(%&:9+ "'! /.%=MUZWN9"   +( 2GSJ6 &   !.75/)'+8HLF- /2, +7<A?13-~~  (   | (-$ 5DID9*   %73)2+06&/;DHD9' !" # %&&!#&)+$"%$  #-279>DIID8(,==0 ++0CMJ9#%+' -?B6 /-'(%! *;@0'2<;2.;:  %.,);<. $,00* #&   5FG8 (ANXK9 '/.#(084)  %5@F8$ 18+  +,  #-(   '($         *.&'8<8* %/( #+)     ).+"  !/7:?DIE:,!     #('! '1/"  !!  % ""      !"    "       #/1)         !          $%             "                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Ride-Hardest.wav000066400000000000000000004122161366722712400233710ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data@% w mK{ G; N (nJ'Nx"P! > q#N)Fzۢ& * @] *f )/Acʾ2' cYel 5 i wCÓ "!Lusa'5 A#` w<%i q} %s /*֌ԃ)u@g!1 P= .m (MH# QK݆ZRK#$/;(1.  U0%[ l$J#ծVEP C `"^1a EBg4j J,ctU2Ms %1r! D 2ٲ#m%ۮ4 q"o  !J:6 5 \=@ ! @.& #ށ) W 4#|>27! =x u, sPR^AIWz(80 5& .ށiG Zk bY  \Wo uLe j  _lU _]o!Wo %E qx u O : [ ݒ2HPb:VJ 2Q xr ic)i 9/f[  "BSL$3VV Tq _$qCr,L aT=/#c/FW}  =IA[B,z b^~ @> L$ ADK= #C A Y ,.bz VCR>&w# GvX>>  Jt$$c yj DI|T8cDx  \ 6  W  {zz 5Dt] Ui!C'y U / K uN%=1 ~>* :bA>M x 9 ='W ' TTvC8,I+/ 9^ ; &" NS, b= gsE5 .c. `M91t _I qwhc^D /~C y e > c -BB$X^+."{v*I\ wd n[g C (qOi E  24! 0wX:|K [fz@c a /tgW{ r;]Bkqan7KsI903KU86aW:UT/T+[ A0 ! e` +b~2AMH{b bxj 7a j8FJ:WiuEc^JvH.+M57H!6| ooU7 $G z #WX>-(1IOr& PDzu{<_A.iKb?9 ^fGz&9;Vk fvI>y-Jg`O;q;T(+k<*N+7L|^( r ]gm9j tU5 V!'o H T|1qwxY/K)Z |RD Ky?]xI~iR=>i 7i!#0*svf ; ](wW LY)Q56)t9H-e} )jKXVB_b}h,yw6 !+ O]) <~2DO NZ<}Vm aBGFFV+@fpP~:-Vxv]M"_p%T<BA xd6<D} hF-K4 ]y5'+j_Qof.U tL !^e :]%Jd*bC -!!W6h[, x%g W QQ&0zi[6Wv>t av2]d +*,_23RSG"58D8m+Y-H9z%0_n-xRD8n" fZB `( 0tF|PuM >%!wRmHCOD<E| q Ip \M$7]jW7KA= cT@r-./ ?J{!}90?avejbZO(4q/~C_G)!<ytP@|#w:g&9]R|^*F|$ eZ"6#@K&tHaw{M%A)7R>Zk&`{" &; qUe}1-|^6\(3I/9:[e]s }t 6? zZ! n+PB6Q'0bO3{S6rgNAxg)4Z(LN 6nK$2+,~kZb"bZ?e,p\lfP3,9o6c:@ :@@'m  >,?''?aT[{r~kO:RmOqd&bN@B./x~O8stZOoF`7Xy>7y;OILn"#qCd_N='_&bYS%@)B?0 3:vr6=' ;pI;gAi , |$(I(3L}mvbVr+d7| U^` 2 s n'$"tiUEw3a l+]u/H6UNk O;P!zd(x$& R3X#QU e Ov.F$i:] )! *N{hv4i7eR !Y$.bkUS`}`XFElH d6jXre%Hk*]]C$Y >6  v9, HFU?j D)~e[7a uKT4T IY,>n#`e9`EeU.{K_L9@>,_-{*3`T(Q^k0a: (-1iFVHLa#&(TU|>  .\C  LJ H-7q2\|FJV$@]V-6_'4;s 2<~Si@: FY;*?{;F-;"1%;hxKn g=.8h`X<Vbbf2H0DCd*L=ywkb <L '?n:^qn$=-Y.O_ RFYn~u+dri#E=R9<SKB2nLGJh'0*DsU`(;,?<u |7o'4}Q23AwD~QuQXg~X i'oJW1&,WzxjS!v ^!4E.9-p~|Qn1UkH/S_%a1m>d7LT];99hW*BI*QfwC--F@zF&j^ViBz$Y#>!&Je@Bn`dtt,;c0o wB9!y L'/z"wU}^@]g/#t R|#6J%Ax:EQLkSo< nBm.T0onT%Ew-;r1l>JpM5@Qo=e&wR-)il7 e@4hZ w4ehI2> L [Iu}QTPjI{&rw?@1UQPOZA!0[:S7i1PL#Qr=|Td`]E`zUV`j> A#HmU1tBEI f-#)zmV:w=q3$8v?Ytk -9BKS6"3:>1fv*"|))M8W$oqmSJdMgb77`f]Q|n+]kS(qpeW+j`EWjMK^0'roU*J3K1 4Qkp1?Ch~( iF,&j-hy G Xtm+Y <]sQ"r l6M [jyHrSW_C [=NQhE5mhX@<* OSY@~(OR /5`&Ih"c.XV0:SR^,k9*mO8r*}9~gq,V+9&5 *:]-IDtg?+bB-R1X_ea72 S<e+ixSMbxL1~[%Y\Y&sR!_PVZ%V .2uXW5\gQe ;1w$rb j(5I;rdAk(n$$zB't, ]T&p\W3 EK-b-P4RLJ"XuE*I_Y"qCw56B_r~d99-qr_m&jJd%5[@@KX9HL,3'hOG&:,e0d|&4w^p'h59O:;::^`z^~rI@+vcM9?o?|l}CH1HP+>/`-UUYL-G'zEc-_5n9dt*.Q&p'/26?n.;ak?W0KGHiSFKw4L]uz=d>5!$S1,U,iHF,]&{-)|sa;z8w^ckPOn{'W!pkKg13U}$&6^ovB1R./#{&t+V4|A ;oIn3d_ 8<bnuf#K%}mzF-FdU7?QM+9ZfhO:/Vz8 "@O(X@2bq3bE$i,vsWc'pe 8UF**FKRKGcZB!7;h68%f>%CdfBfs@McvUx24A VYU+WU9:}>1?I\%\_B1^)>a`(=SH=g#=ZT^\|YGJ8pJA"%9M@oOamGEBw\(N\(Hf"BTO-a a (+Cm4t*6t)E8Q, *\<)V.,02# v?nx,6h"S_#}A q6G+K1;v- ! 3>u/idt1C^8F&S;=@jo>OU3BK@sd5jV2WQ >vzK1dK18q/ wz%wcOu<m&4<B]zv qi9`Ag[Vy,b1T'xw@>gLU^~"Ymp7& 17+4:N}F0z$Q5=.0a.Q_<6U_(InV+:NPutz4uV2J2Y|R?sU .E&ti. *>d 2"XZF2!s(QaCp9\6@I"'Pjcz7Q6)le\!&c@<nP8l6mci(rF $pD'i=?XYL-$I B<'!/{}}t+wO7Nkfq9|OqSsNy,i.BgZWd3 m0sh-|.'k~Qt# Y\?A7jM5$h6Y m&zT|fM0*zjagTedA<M{!oFhZ&'>KgX SLm~7H1%BU;| Sn D`zT2> @XY _GB8LEIRO (*U_^ +4j=UWM,P3A`RV.jfp$BdtF7p:c7/&;Y|.D: 8+4Ja,qELJMZ-{R:&~9)&sO2p@f:Ga~Nx4S!sV G_dScg 7w }"ol7P7G2qKDG'$d8eT&%`^|\VmiNGP?:h;{A+#@;|e@QB\pgK9jp9ez 0^bR( 'l\vpN/q?<76x2T[A7^KAth <S-VahY wDp;Tz`+jbj)MhKREq_V6'8V:90-Ppoanh3_D A`}qxNljT 63qFt_,YjD!AA,ho-CT|'1gl/ \_%#^>,>s4$n@.+)aOC`r}:}m .U V5n_C6y @Sp_Z+(3#/THSLH^L_S:M<=$hE:GGao;e^KE[\k0uw2Q{6/ dNs>:p"L:r6,:[yT s9x0qCj_m,zP3<?lheCW4rSKvIGq\+EWY*P8*8!vk1KO]W{^p [.j~*jR;(]RB(()QsZWW8L#-sUC7hZPf2xS ac* 7"7'eaU,rH2G@pB] | dqO|[t'n`[RQe+H23c 6 y%zj&E57@8E?^Jj[)NICI @8($& d_FP4~8Fp# }Z0Tj(!?\CL+$NQFa=^e"e'3OR}}~IEP5"OrDt>vz6 xn&pl^X\@=v]]b<|Bn=9Q<`6&]+yS)d~$w'U;6;}](8c?urLR<*bt%IZW }"ILNI?9N)s.LGb`06r@[ndL^?6ot,K5}_QNeRpM6B;z )PA10I)\3Q) 1+n;w0FiF:oG }}n)iz?W8GjI7!oXQYRtdrh']0ecc#a@KLp? ZFfy8N<Ab?WR39@2 a~^#?=7HpFR]HfXWpSSH#Lu c${Lz<,0#d>QEK,*0!N y6Ay".Av"bbSB^Kt26XhdpK[U jFx:j~ i S8o3nxf& { zXI}tVd}1WdmC4P Lsxbid&O'}m5a30njd7GF;=O%Y,F@amNkv]x pv wdE0\]*(9(K,zaB1NhW!2!/LG22W*$'h1 Rz+SsC`8k`1Ozi]7v7se9Xv#b8Ly3]:x#'-*AJm9}$7M ( 03ua073B d#>M=TqEZz#A]5a5ez_;s]-1tKy]59W(tlcZ^Va'dV3dn@lMed<Z dL^EjB!je(#1'9&{* O8F:jRHfz,F!JanHcYcZ|]@]9I.HS.:8y)EeOYuw(T6vslWD #^^C83{^p!`Soxx*}LYZ`*gpOerg7T0Nd`9'j y>WB}2# Rp:o<.V(WU q$1:3jWj>]StE%/~1Mpoux&?^:^:|^$q|1> \9bRrIH l`.-Wg#$j4^z)(*-Bj^bMpUG*zW@WCz_Z+  )< \!mxF6L5CB8 e#,6)qTCK{4z f "_g!kRgKJ(2[GNd=Zvj2O;d>:[cRh 1|J|> W6>j[m_,T(K3VjFVJw!*cVs3> Z)+{I5R)c 4jnaS3fKN~CIN)m.%)xSCd9&O8-Z> wk-7N,.Q KzI,[5e&v/kv# ZLr_ c5bAtGmL?$i+fQ xjLJTO4WX9LQ|d#eI:|G"*Uv LMDF1dgY- Q,nxz+k/6!lm1* QoebBAt~i}$[M Q3 IL3N>&9 sHXdV/H1!hFF rkt!] E!I]=j+Q3z,dkx8)@'Vl-xNB=]?!7'Tzfj+K %Q!lI*O[=3<?,S:\3'L|82;^C l07+,zE |*||}2\_5`<MC2yz#YLt% wT@RgM}MZ<! ~LYYWLn 2T>9}hnz:*dW/nV0Bz'~E|][DX#20]B,7R. o]D9~3bEURNBcit6 9uDj z9I2dShr,W!V'?8F21}j. }vm3~H~+9S*X{,0&#f\ +77N}t^3Y41bh0A!lm,Jb*$  #Oc,@]i@@dn~  FZ_n!<]\Gf6!?! qAK  Io|D8NwF6!U)^Mee2$## 6G6)2)(H w9t?rd}!D!"m t5;#!8 Wp/QX$tU Cv?7Xcg'Nv # of{*yA'S\ 9rLv8IS]C>7!XyW<K vsGH5U"K]"%<?v RK0!q)O,xP(#?J>zL+ dBkb K&"4n^= hx&XgAQX X.0Lg **8b'dw)Sljj|BCn`thc4 (= WFQ6n7fygoR  ,vjag#z@q7BI5_|K-!Q 6t_'NT/w|"-9B6)0HIbOI)Wo w9EB{3g5C(i##KicY_]$ _XMe% @"1qsH _8Nj|+P'9yA=cN`" R%WP'o.U-?SH/1 Mjq6qqZ.)33<!!Iu_5+Z,Y4 >p9d[[Y&%ORpC<>T)>~ (8qtR2F&|aTwhbn{k>I9ff ` 8%?|o0kn*K=zyCvzkT7`v&b;eJln4 <+ PvI(b{,JBv3 K6 eAm^!m2@lc|dM`5qV%C'p.\v'k!qHP&dM5 F6 X@w#15S'LL*4X- m,_W/~4F_]"G^}]X~\0RmBpHloqR^NL!JCl#tr#J"T?9G<S^Vf/v=NH,p:_e)4oH?mf>3QW-m{I$3h"-?\>Ra <@tDn+:rKLI$8W|)U_B.K|-(:qj1 &I5!c(=^j3{-rsSW#Amm 0? tn tdo\TEnNjp .F *xM\!jf--4TKn.#"a1|nw;e 74*bpEE0x.>e0rW&n2MnfW#L.  xjh0#Rs Gy&?w66(PD,V *F6_MMv)'xUFFi=~$**:u<,xq<n6U HA4Fsd$/~gkwFS# LI^mWyFs-Fl[Ce._#^,pvCQjV<-J/E&^i(^D E?>!nA8|8)! k*eGL8kM}IxoCb$~HjuI$W31J8kZ\$+uR`XII6`gH f,> M^+,D 'eoXS.d^8eNq7z]e2xzPyHpId, t7O}=XP7SG2VlQi&_N 0`Qj"s.t8AWz 4 voDd}*9I-9lc9!#Xnj^5QbDZ9iu  k$eMxBS2cDX6db#cgA> !}8>S-E-D^: 53w$\K ,[vyNV>dD3|.'On"1n$Tn<I|bS 8F: Ed~Ox|bxo ievaj!a~D4aKy/0 rv>k@r8H:#g?4Lu.~V2,eP@4xra'Kid dq [a3HVs_`Cd BU$;iB9N|jM7BO|10Xh[*-E,n<+^KW!>)8w3DVOkLra]cls"VU \E 23& vB&bGO X<4m hyb~%:|UBQ7hh.)F|OCUzs-Us76dZ/j+0JHm0hf2WZAbw6 K= Qt2 `(5)Oj/3%#UW0;K_ '9?5A&]"V$a?}hS050SL]CU&e'I dEae9 rO:$E?~CU#;y]\.= (ay+'jC1w<<Y3I]VI#58374 /$LQ-4,c7 j@-/r; IX7CAzj x$\Z  pk3 ZQ PN5OEBuf}CQgZ7Wx} WmkSP axs]4'MuO*HDCeT4RO'rD{N'h6\H#6b28G$s4 S2 Fv_F~]s.3g >XB+~JpGA3D+&d^oCCg"g<)[W&L]<'E Ec#!aQVi1yey#dtG,/7: ~v{yu;F=x'+ 2p!d^FcM?s)_jk)g2B,,z|O:m3x& L2$)3 ' k-Q^_u >WkqsX|OAE 8K->+V9)s ?-@q5v.:=xH +7-@$tfa^g).GRJOEX5,cO;}!C1>P5SriW2tf?}BH@')C).KX/n3D3I'r{pCqwv}Za<p*=Q0k%C5wNP8%9J,sLS <v'GHs`EF%yrCs_WN$p'H. WZsfXiSOsvb@nD9VEt Hm7 iDxuz*HHr$ )t $t5X["J:<-,A]2`B/5 TYtXGlpU15T2C;-mArmk /aZIeNvx=%epaX5)F= J!MJd~Tc^^I +9,UM48 p\`?W"/ Sko  ) SCS[;z\u2&FP<; -tcSN+_.B7Q7|Zh+F_hDX KMU !"lYi Zhn lQ<3?zO7BHt ,Z} 7&ad sizkjNJ|yPQ.=UQ| F[N+3YO>.|owUsZb;bPRA@G33k,4n-/c* 6&!UV NvQ),S8'">l{!ffZFrPF }j C`>V5:*}m,O^\FYLzc&#%l?89v0b=Gt[tbJEhQ)W8xtXUntSC}aQ* /`B9cGX]jr*|LU?UL0w;Rsn? LQMvRo$shF[|-kk.n5'hPP;'2pW /_Qg9\%Lx(0(d1oK]W@?kngr^t.ada^))jJj:+eZd;^XY[>vp_ 76 q0FoAc6h:* LR]JwK6KbCt. Zg }~tZ.R '+*3mzB4[5rZ L-)^#G0iKu).oP7XTvtR[)iYWT<QAO}r)|Vo0h Sz7<@4_y9Z4z1 K_7R/H2yvRP JGg ^^0K51ZiJRC!f.s|I#m&%>Mx:iq&!}RWdNC@Kl~H0<[tc $$SljwYo[_&/5;2T3).? L+uhgEz1Rk K>*-*P)63](>W ,Nch6rgM _M=Yps 45df,Q}[7p*de4>MD$I|=<nL.z<s7Mb!:7accdVs\;A7Mf\aR{#aDM15M!'@#x0'A&fJz-R4#$Z3X'"Gp4XCq-Q\+w)WPU|Y[6[^e@_6B@F+KAw>0z<-g Q%B!&KI{ WNghx OP3)n_sOBwqC|p!IaWEGYe;4XCRD7}U'f v @8N>,yo/U;>FG}YmamgXS|=lT~*Jms+=!9'`1;3I^*kW9Q: Cj}ZN>r9)nat F5|2@u9F{*r0Qx#jw$@76ml sRnzEzPx` @&U1+mr9{ {[XOz'#B Q.8VZ[igiRkR522b'AS), Ve1KKsx:#KwIz*) 3re6"v'}:P`plM_!d-i6] maBxPN2?Zz]g&0.*t/qg\w,BI~Qy^@5vQ0,4o +x>dE>htD>MV58'wGTd^ab,|-RqPB|j,%@=E_07mj#eqnJ'0vdAs-d)}b:N.gf0mO -'bskLd}zwrB FEN0[; .1YI$X.k8q("jZMIXg ?zaf{x<9XIbK`mL HF@>ql D alu' ^mSZ@jF8+"vUbmjghm8TOD J~SEE:ySC|YN!=&z-.mOuy4 KoH c6mL_/)i$cMIWc%-km+ J.cb*z*nC\fo52-|Ix)i~mEt X 0g{|2',B~011B2 e+?: WD[zm[I*;#}QDUjtNa~{O3dRK\nb0M2C1sY;/2p'q8?:8) c8P<ccL!L&]Y.PS5{?8  +o{`,L8K\l# 2MzE'*~ *L[uKRxD0Z6FgEbZK?c n<|6L LRQG>n7wE>CK>Iv\]J3gMQFHL]6Q.`Y {F)- kH7"6gIcf]4q$%_* wFb@m7\9}\KW>8 7SH+k[a#Q@Dx0I|]Zz,a094Bv#Z=R?:]k_ #Yg-t %gr]bWG*~n5*t&*BwXa2zc|*yH9 6S}VB3Ra)$aNGov}]*5HY(hM}_@k<:iB=UO+Yq3twjV&HPRlJ;Mpmm6|5RF }r;,ZlR7 Egxg^X.DogXH~w{* k4rgOi[KS`mJ, s: +1ANHm222db7,/.NO4x-efY= WB9!/# iNDh OtuT ^&](T? Ap|Q:S.'MUaS|U&W< -;gmt&QMAgL|; FUAraF \/N yg667P$0x/hq>:AO'i n2[G\.A=5^kXhL=OkVxE(/%Bzz^l|`9maRZY*"gkG_'u' @:Y0q85&sIiv@E+q#qr 0<r~="5%L;zt2? FA~7hYa ~s6Kgqnk~KGJlhH*:xA8g gkc?\sd1)d! @I3>[@,,7, rXZi/](tt ' O[)df) \ . WKxt&e:sK<iB;w* iJp\JZqSj p+?/v~=(ca!H]- h]_  B 2: #\F@q- qE 2_ ofZ .'\KI)0y[`b?1Q8-~$]xAX_zC-4@5?*fnYsp {S'N^i%OAFqK^NgtWsVN O,&#^2y$z_>X5(q(n2>p}q[hgS 3R/9v#KJ[ K? bf.~@uK$o $IUJg&V7f9U9 k -r|$80 C6A@'XHJ^)aakt&EZjA=5he,hQI%kO8}zAuLwp@m 4+]85V"lU.6 L"~~H17y{]3'$Sc3eE;w\g*mY/nBXY^oe,nSW:I~T wx3x"@OJdNf0]N,^>^4mW..g,"iB&w[2PzhYMqrHmAi73x $\1XesR nf_s{+ /SDK. XLR3,R3?XE9pKBQh?N0_U[4+ih<X{:t0Y&X#mw7[ q5j?A0)[Ne5 OvP$4OF pw&<DR"_L,>B(rv@&gIT[ZLiwP 6`gqHP.7Y <N|2g;Ad"`f GnXS~L[ p5)-,K_,vNewh= ?Z,!Z C L278DuoYZR @r(%9)*0b|F)UYj_A^u 3e5sHP0Bf_K-sf;'9,G;.HL!{qFWh+)8'&\|l8c|NNp;ff_K[0> I u'Z&M\6 .pZ} }7j~3XQT 7)EcE+E ^`1,zc 066o~C 9`U 55L$-$^j5G_>]qn PrUtH t 74,d^hA6y}JA"YF50KkZ+S N4 d+/YAZrXRhzGa\81XCFm+[_z5,>+erAs<^DU'%WQW#hM4OK$s5|\E: )c5vf<t3faak n Y1$qUY O+L4L$$M^|3J{M[oUdigm_#$`u@o?-.F7}W%w{y5 vSk KDA^Awo@bhB8Pb\|PiNd\ bA* QbF,2) :J.v'b/< FSkx ^d7bYlet-rO^WFL?!H7iuyk *_0}ni^"MTx;qN",2gBSMM#!)5qwu + &iP2LU"*,HGQ@Rx3!N"|q?Ep/ lC\!89^(_?B]FtFGGV_Nxib}}v2@fE=Wyl]0qWhheSm@UyN41&l+A3p ` }W#\h4=R&1g Ph6eT]+\5wGB,r  !O96J`x l|@+$6:'~mZSGQNs9}qxezc4 rAiGwD &gmQ\@KxSI3 &Gm' kFi~K_bc"pSdR2RB >jt.GJmR 7]:&eObN^F^5WM8bjCbL'=Me~i2qiI"\ my**?[8t;H_kJ0E71J/uZ2udw+J*8$:)WxHql1Xzl`9{9M?UQauT"D;Zv4Y2.\A^ dF;&\O6[ >##ur72 ,/Ykw#!_RBz-6VgY.fzxji, iOh2~}s" W*T4*%J!BwlL*7CK+c$=4*}g>|DDI}&[-T(@q&\]c:O@UHNaS.Z>mUFyW?^^-F-S2t]YE'mF'ue:LV.+N77Yb98MQ/CE3h<>`59MhdxlCB9%vRJ-Mi- RmT_*i8W8hw 9,LS^m&iRcAfx` k[4hl(]PuXkDV_psR=UX (K a\0]M}<QC_MgF^}v=fa9i!=8+Hh|?lUy 3w(npdcGXf#u-'pF&&@LJ; D9C2\sv|=SH!5Qx:[|rz~I4:cn_?RiOg|;#MmzAv3WS,$Aw^&t &tM&*ZFLjdPZkAUlm\Wf0OAD 8`Eu>fE#7+h {^5<@8YNlM9gj3Y3Qyj-|v^EOSvh}Lrd47A6w%)GA^O [B8JtjLB!=h|dh!u:~CwhX-To>xSn|I QWx(G6p%SH']&!`(s}cSL tWRmPl"0.;E-tezN 5@*:o ,CZI2<._&7~hJG)xgT5Q*/Z9.bzNO'$2WoGXKB{2X(k|h] cPqZ*<$BzX*S4lMHWEe[qD)rq2n%bkN73wvtOBs~e$}fEvUqWO0vqET&-P*l}ax",8bdpg9P?f%hn/9A=X*{dA`#DA8>ev%g lm (~}6F=sl|o>rV|b>||hW[Ume8 s3$PwF9PE2gE++sG{Xi0^Wi9b&1nt<k5pl^^btx@ ;p00-4Y+@]xb!~Dnk?[r h-\;LW[ <jjl3c }\ _Tx=diX,FMfz]n'oLn*B1Wu~sykd&'|+l+aVrGHGG=OdmnWzrvhs\PhTD[^57N-^2C8&7|e"32v B@h&iD'\jc&U<_aZ,w2$#Lv{9rN)/{+x:JLrG0WybXwqD\; 4$SQ_5C v5.I1 6S_/i$%sA%}.VLm)l9(Zdzf):H_ g V*;l<HLu+]EN;DD9pWj$/v%jEN(7bW4-q*Fe)8*IfY1>X]!f"/qy -0q fCk". q6C%4RSFB %7I~oAyF[|nQzBMLx." HBi`h9ntijHOgAU=B(f>=Zf->nM":g6#>C{nr5ddv^DO@6z}'aVk1e[P`vAa0yxO sHY-8 zm L~hmcc2kz!@-,h4~ R|:+'}b~xXDPzGBWWwxNHU_[Cel0!mFXnnk,HG0IP?(u|5MWqFQfhM`jig  ooL]Aq1dA9)[~Q|B!\)BkYru_8KqWx+hzJ5m9/<}bL"EtFP{F o@@-/6*t9ENS[5,W,| ?>ZKqr5Dp|u\Bm5<C REjFXC?0.[ yfEgAW*zIgl7<E!D?,OLjl@_,ftiSP]{H\3,e+? X4WNsQ?cSROeI-",#Pmy U-nh9!!Hse4q[M}JQrrTSDrp>!<k7bRSI&3_^?'DH 2i51-U96[Tunv v-^]}mI6veR@tPZh1+E;2xG-j i1h<;F&(L?4p\#`+ZAQ|La JCb82,Ji3,G? aeaxxHAm]B$,fwwl+QL S>n5 [5)/?n4OZ*?1UUL?IhdP\pK6aT)Y>,b/ d;SO8*v^e A ,p%$|X?Aw|O.C!=\q`S@T;6 v2;q< H& c0jyVcU_h.^Q:6H@'cHxsq9cmaa~[KU7Kj}~]~Qf IwM'q]Fr]Jv Sr{u D Zre=9k:i> ;m%3Q 772 4S[L9)[nqA{X_c~ZCdI ).tI \X2 J! |q(5n(9U(gE:+L!ovm={&dIOQuSL} iKFQ 6RA:[[Bz$K_ A\BpS9]N5#P]X.# ^ C9CEmv }{w=?&QU Y d9k(vCe9%I1=E`(MZ 0zH%<2'u ]3C.5Yh EO7g<(X|n_a3 . =MLs]0"+BGOMLoWwe]J#Y7j8n-.Btq)Y4-vBW\`$vcQW@_AI+ Xm=AMejZ?W61[_dB4$eYZH-tg?BgLU6mC F`9iq*Qf,@W/ )*A^nG,!)R_ 7Es)rdnULDy'7j~u2vo(hii!eC^Wa `#PW)x6A) Gq%Z4Yq!(A&Kd~(,-uzTe@2];z,*\''JT255f`?&!KO;Hc! G>yn`rD9 p>?dG,Fik?PX$-~S LB3c0m|8*|+r}PH{RC(+Nz7]W@[^.F vT[ kUIhZ*hW`!hz%#[mV">$C1uW\9Y Bq~n.@2?c#w]M&tv}^$puG MT3;^U tRb^z\*1tgojN'kg 5:? ^FdHv%^qM_. P|*p"rD)G {Ry_pOhM K+ii&GQslm]HWCGAs]MK8 fQa|?U0MFO Wi'\)/-p(oslN-AY&N jhJ h* &ravz50>,wP^ gqs^zh"'SY7NB!U9v{I.PyW  HQHN@HB0_ v@r[4N?z V ndR0e:t_a|+NM_g%flG:7v6gCFwIb?}q>;.UZNV}ql&FF~~jsqw bRp4zp#{_xuV8'!ICf2[x(]qA5z1ghKH]jyR}32Y)N?NA\BHv'uTxe]xEPQ5n$q@N<=U ei,I[!UX6GV)9*2Rm3'AL"K&0#\JJ_ 1k$)L";BTd:sSdX5LWN84n2mR9ff2V*'5p4IafN@LMBP[^rA50 WkDyBj\@H5R=< Y\wwrX`$+AFF?zkv8<GH4o~*r N@9L-,T:7!l, rKlak?u$JbUKc8Iy3sO-v^*s }|)6? 2Yp7eqx0| 5XjW'O'k6Q@$W<BB}ptqL$mn$+Z|7x8AWi{j5+Zf8eH?,^2 BBwhm>71V 2jSzstuNT]* _ +n#ER&WsB$ d,d:( p1JSxR"A--v[YZ 2Sm,h9irB&[Lj&.gBf3l7fn}Uh;TtBA""+E+'YeR.YB+I7O nn!.b">JV_d g-h5hs3ed# j}de0& 9sv dfy_(;'>c,;TyaC)OT;D_ g^0,g){ #]qgb:%r\CNnVFgov#/m2+Kz5 tp,Dn]7kw n77T nLAQJWD V=2_\qj_ic|4,&"t/r)-)+GCx0}6@xhx)<qI&T 9m8 CR\|MmB!rQ ,c9kclFJ0#xg@G8{bP <aq~Blkt6kwr-fj44MDK H)( cpiI=6BDKpiQw@!s sur_mM'xNg,4;.OXw^CJ:rUFNd |vFiarB*c _iMNwic-ZC3 n Q.aRz43 OUh~|9 ]\Wnu?cIm$l7R;*8^m zZ$\:LzW|Yj#B!qT1'ZO9_8kSH\')w:ee2 g'MlTNO]$+0 ^j4[.459#NYd\YKQVi}w9M>N ma\Qv9o;70tieU+tuuss}$XPOCIjF5Y [zoQ?w'XqENT{/I]{j/ M I|fAj@fhF53k}r@{xpcY<66-@t^5dK/+P+XSN Q0S]f4eDq\HEf3 AGQ +{4N,BzjI)ad w9MkZR[G# :&3ROx?P],7sq60zv^0g&fw w!N*790,$Nr8o@EEK6mI|#</d>8QB3/lQ 5)X6*`U|+cxKH# +{$%R}5]jKqz `yOU ~XTh<r#@ F#F*K0N+'-duAb>O?8A86Sd Zg 3:N} c1=<*E&;5vnP-8K%  MRfGeqjjY#N#rw0J`)0IxES,KtBIf2-S0aXph#*2ow\< O#>[Qal k aWnogm-nw XZk:".811E Sdd lA5|I\Si47Dt=En gFQA4n* h6E^"+)* Hi|UtMO'> }B%t4[xyq Up(s`ho@aX,$_ h9 LDX3>I6t0H'BG"qXVL>OA- mzUb(dlpM: HZ W,%$^FK Uo6z@S0^nto7HYO%LpSap]zHx&D*4 "$[w Ow0d7w\l$[*DOO_ Bg$FRey!ni9_HYe`*u9_H`1L3dp cGl&9my?! p po"G8'}O&vc/\v|A7?:jHgyL"L>'nBN,3dfX#N\ r5xpGUTp"vq7[_'.SJ ydCOGP$m)&L.vjiwkEhje&hko2y[^*=7u4&x;R+mSjfP zs:J7|F?V(Am|ok._E`ZBt<re!t7W!q? m6 zK.50ojNIBN*Oyg4f_r?Q  Was>dOktn0^@XWCc[]E(s)9!9~~_~_K@Lsk<OJ!M0:sr2>v[^|"4C1v\O4<'k`WcV vem 4&Vktfs]'Zo!%]bo"N#$S!y] W{z&4PBLi7 T(z'jg@$Fs+\Ha&Kia!V2US [<hrZ_aA0mT7~XR696bSMAoeH^O7(Xsm^AK@ :"Q<K3h^lxMxyToWU3Rk65P9]Ld<s.ed5kn^9#|:nR/_.!/46Ka6H xPsv[&4Lh2T jN&`k55nk ^tAUjZ %QT+D +T|!_u 20(SNmCrAHS2u-aEA<\ x*vW c|.>L"-\S >w})wrE*[CL U,Q YRu^]8gS*K TEow_R,~7?4c CGg2:hGMpcz+s*mU"8JR +I_OLg0%f(X{"C;)ZxG] ;DK3.#eEAV\C>lV#S5nYS U nH] M`p%UXaT sZ)C!KQ8qKdCzd$9" t8zxKS`e-\[qsq4g&&OjK%#EuS>|wi>(T em5?V>3Sh1p}PTdl#: >|`i *9~L/k`G&3>RQ.iF&X#vB2)ho|sA$&0_&~? RLFU! e_`SUMs=|m98Yq-g3)ZI,u#2HZ3# j)+C-~PwnEcx(*fJJEzw3s\@UiAFx6F8?fW>.hh)O;^THH<p QVO@v/FH &D:,f (\X $~YzHc,e!z^J'_ikbcz>>O<)4mQ~ zQ2XY 1,[)/y"qQtSigsAeXWiJe8  Dj+*/gKv;+"i+ 3Q7>TtVp3O3}P[$l-.'S<sh~+cC z 5YZ mNbja{>cT3)W v[5 #cxU`_]KrKR+\q[D-psql#S~@9=0Nq_ fHuDE 0/hO#GcY+<L(T%ruj.Q[vu:4]-3(n Wk*bfv 7@VXr+AkhC#1|rO$UVSfCZs^VN_{MIzwP\m,YF).m"V4z+? .W}(UrE SI3~D9Pv&#ht_jC@LE )q=8XwN3P@<M3qIIfzE)4P@QDr6HG,$tT-Cc@{< B6@ +_k4)uMJh6>j\LK .Hm;QAdPYy23400Z6$DorE37w*5I:79^c)#Zz.C<H_juZ$Yu03c/ZV{fZmO@a>\T "vP#5A#p2,/7IH$[7B3nf+q*>[\P#lPp Xr*s'(q:Z#d j\mpkchJ[KyyA E~3[{QC -dtmfqyDLCt>* XeI2#(9[+x\(J 525f_,+P eAzu-pHoh6b-`rL*-|s,P.5ukpu9hN5||LK!eqf.-w:)V[G?5iz^E)$BIa^R D;#C?Z?bWN}<qWat +E`tI@dP(eSoeoLl7*p$9MiU`S,F=6]U*P4HdSfwzK{H'*J}F`ch~d17ZIr ?\2' Xg}cK|)h E?gAhcgB?3+tFa+ 3TU.]Rbg^N'RYHX=".$Mc}#z5 +xmR~;Zwj8=u8zx. I}xtX</;z?>-3FEyaF9 +x3E<;94HYxw)#IrBI4H^x3.+=,YA7<H'#gK`SvM"_|HcS#x4+&yGru!3Q=zj_T9e24t7cg\5bO X <pS*qjxseEU #!Oi+ng uZ),D^.kz7}uW (IqWNv02#o?INQ aZ\7nj?m##47QIG`eQE8pQUUbj'i\YTC/;I2H8 Q9 !Q PCUhWu D5dpaZ:h] )S Z&yPrNWQr$KaK-&!HY JU:'K0Zs(D4WL`%0|2mXwN6 - O3MkVQ rn\M6_gH)?^3[SNdN% gU#MXC7xNEQYZC1ag,!pLYF}@S C}Pg3I^j]w1L 6grDwFeca)EH 3.@y{Mx0Sh@RuDPUA=Y$q]4Nr$f& XIS},5 l@ &Ei ,"cSzNdM~Env#msFkuT`NRe,#Vh  N3dv&&8{1K&Q|V_vB*vMi4:3.$QdC8 Tl(. ;4N6#LQO~6*XaEI#-17`od4g2E$Lp)u;k .h.1d$md3 $lt- nQdP^8<^fA@Q^/fqX'9y W #YQEqv3&8Cktq|[Pl #Y$5Iir'm,q9"$SxTw#s1V&<'g R.z ZD/EEz*?7\tkP(fnqYg8+L~/L7OtSt2g!OY& (Qzqw#mMRh++ 1Zkz|}:Z # A |KPHSS]mcL2M4*/*2j,Y:FI:7OE>rNk aj:Zt3A]$g]v|+F:rysTue%:EK k6P#w *W)"h[ 6B<LR'e!N$ U0 O]h}5*p^b ^u#t*qi~xR"`(w?Kg@ 9S{vX}fSk,g]n`('?z;-/NrfP:IKR>E~K z|hj8WFv{H)Ii'+[ys]ON9<Iwk`P_j]H>qRGw<DHGmA2]rp92}*qJzv 2L>UNH?c/sw)OM(PllH]|P]cep|UAQ>leYd|hhOSMTr[5 96YA40 ^zreU2 AgdY>F@ ZZ3D!H_E\(mvL(Ti3@V;?]kPt`S*)`%H<\ 5Md:HrATUBH?L p]?&R#GCSn@#i(Z*%{]vXiXqCE9fOb%O?g>$T'cslfR-6k|UgU]P| {9a`BjmusEEnpD)3S +v>KZ:ht7Ch @8-( ]-Y >yXj5Na9DnUuFPHQ  Mra' 5`z(_[`u]0D 8cmKm}s/8w<@H]\p\WR0-~>f0W$W'9"@a~ 5gf2;Gp](3oKX9)EpW~-& B'[Kf$|!$RntU&2K+t\@Ef':m,Fb<f"+An|XBfE>vUOQ^n_ +xjs G(:7m_bqH(qBNtK6u~d+=#qghWQnDD2Mgb>0h Hc -i__q6}zIzE*-\52LCkbTvS(j}2K8oSABc}:dHcBJu*b] G? M[?7."Ve9fngF a6?j>,qrU%EX[I4rio:3AEC^k| _Zs@ZB' \n6_}_^f/d$QHM$3: aQk"-\yC  8wp(:psg?)(fvd^w^d (uLEO2q~sqv6uL's SF 27!8D6!"UP-(*cM^~ew'$vD  u3\dwz;}-.L&. 0DGqvvlaG.W}uhr(OQjz<7K$0n^HuL3KB>@3)9~WIbAYE8z< ("^z|Q;Qj,z [ f:MtaFi/U-J)0LmLF?7^ \wAUvx3O"z[W_8@_U(.Ink ! cQ^ Au?-F .Zzmw<jW KCRmj6;l`$5\yX:kY}?S:Q.n{M75V~ J7|0 L_.[y:+f^qQ k 6|7&9} nPMtWiKjo-D6GB1P .cda}Z)NQ y_nq+&kh90CWgi;--"-, h2H'=4|\}XC&*.A_?FyS9DODs:/'y*b@=H,Qb:\[s]K)FDe xg6$vIJJdnt'bd/6*6KQ#BDhfFVtfG3^8Bg#ut`gtm&Oi1d[ e!wOxlI@OR,aLQm[;+LUR"aW 'K -idk^*BZVjYC @X*.P_P732X<pUO)t]&N9-=4bNDe* R*jIgg6BgiPI86 $F[}Wg^Ke:HklgldL+ *CXYG]kB &|==M;A: |Ws$}saY`vmMY|sM 6tq6m9LX5qq>Zp9>d GL8lYeOY}v F)+'5T@NqKN?P*U|#{_^xr|o?!CcwcKB<</><.!y}. dG/za^~=jv(i-SM{n6Qn-,\w>qrzo}7^jXFPsv'C8mSu6Yfg9KJ6I,8z$f}B?*_K|+Y4Z|.?Vq/667EYpk?2l}6q3L<-KKHwbz2h-QCnfC3&36P:"#xNX(S]YHF0oxJ (]+oWmk[+,>oCFS%:?((j?d3^XZ-9xuZR;*W4%KTaRCEA*9xL$$US'cN|G8Sni87T)uB8|S_vtG &4-)MlmT:39E>YL~5!w{!r 5D<+*>G~XF_W.7g<Dwwdx.&:tv'k^3*5/c+gXS5m-W*L-$3;UuW CsidKt 4r3<"l-#BJ?ABHC3?ARo?39RxIww ALDN|:#x D?uc]uT9w:T#_CPr`A 9(4 (a WZwE-]mc|iS^lW<F|;79U0| ['YSH$Z6 ;kiR.!  ( ^X3 E_7s^M&'o!(kV] |5K$jy[;-)2FXeM&r_ED~Y:;@Z}NJ(K$Q[:I  e#*M{A-,0?zO|QXUA$&P FR-Erf*vnZ44LS[WWI36eB3Z2^9S1F,e&"@M( 8v_P:t8Mi^aXC'J%a5@),SAOg0p [>hg-5"ji74;i|_\d'8r$'D 4]dE+$c8 J[^0MZ!qrAZ98ADH]|qggR+rNCd"6"?|>n|d9\Q+d(giN}8wf Z}^n YqF"5;|r aY( Ct,5$.#tZL4_/0K8Z M'(G^x}}yn_K,9A7PWzRU2G $>>vQXjxz;kf/| uU QnfDCdq-_,Y <`j<gw,75#"]uN*Zx466|{gd+ CeN;mu\Xtzg5U Mi(Z#3"DeUvne@$=`r`ayj@*t!.y eH. $R'D_aPDE[aaE54NovUEa=^5yr{e/]:d`TTXtyG K Ioj^'6sdzKWWHiP 6'hO|=9tgr;ux~!8QupEACG# ;_V%zGA\d7j^{P#:ui'rV*(A^+EAK$Fdpe@LX)Ya+n+ %@[qAUTHb1O,6l7eLl|Qxn---r\{Cc O9wZifd5(nErY8$$.,02-_DkMf1vdez |W-f|T%T[NL*+NaX;fJ nO}B$Q$ye1}gA0Cv8xnk0/fOp>0WCT[]?S|q 3(hk0m3b_!Eh`wS$|eU\fYdqM9YC\xI%,Vr=7DY`ssMc$%N]`1cOz$\vZ*-:zm;n&8Wz+'D~2O4MH^3FexX-=n  vei*F=cL5[YwCWrAZEZ/sB,#5S-B(fKvN*#CH/7 u ZKB',+$":S~X ',: +H,na$KiLHfpvsu~;:|!Nw:Q>f@e?nH+n*DjpX] je 2D"zarUh[&YZ"/Cr7rEvc2Y8Jg6U4dadwU9d1k<3x=R`p28^oxi:a,g/a#> v0 2mvXa^a:/ &-8~vWh+F^WTF+[01Mr_}e .AKw60P #_pG9LSF!5fX'Aibc'Z& -Gy}w^jtsfK;>QszCw'qM[ss;,N R>!|XzPkPs$h.=$0,ESUrt6 Be6$m3XR1^A<%3jrL#HxcL? +[LiSuxU/(,]\,W.,* wkXZDG"}z#Xn]/;*Br$cw9sEF>0I,0qLFzYFFZvh*Ua_tWfLuWqT8E9.'Nh$[7-K/|~\#i=eBdeB[|DCtW$F9j!d<!K|K_qc_YOb8SON>'t N 79Oxc"nrvaWV*>D@j\Tpj3x-+j$Uy|R@  8au3!0:Ihz?lP/_r9~juByox S!V2 NcCkx^K=CF2 8Kj pI@9s>9<XTcca9 /NE *I.XBe+_kY>IaA&xNZkK_4'x`'#cI}i,^(5pYYCSrff~PAcIN8/u < !4X<^i"KmUi,&WxD5X{}}tmRo \\'4X}jaD!&Gzf$NycBOrEm|ug}M!N[rN9TzRpFZ yE#IB]Av8yh<Hl }zyVLWM66Nenr+]PVbd\-_/ ~h1b5H *OZ8 #<eTp5D~)``07_k9[7$0LyNBzxE 90z<0JG lOln| o $RzzS 1?1rt'4/b'B'xH>U\>%\60U-E ZI)5e9}d mY9#MXL-/bC ]n'mNse<kE9W<ZAOcsg.A3$7qr(d{2;hk;*s?y%ye ##_h*PcrF3/2NmWG,S(`Nu7zwMh^u2A3 8RFhf YiA * A}2 #TfaVB<?9CYkg]j9G6aW;5T|b$&,#U9>&&jaH`] S=k4D!V@T"3qlm,![ M+2Lhs[, [Lu:)v$6,)4<JL2-D32;:~\B& $P5`#Y5WQ9YZ}~#huuX#GY5!'SkT96P+sH!%AcEpxg2 {dWr5M8) hv{tat}KBrV\QRU{py /Sf mi }E"c|}CKION1mXs.KK!]Z/&DUM}R )^9s6`8O0kvV33VtlI**@CC6GcVs@Hd|v ;?0-;FW`W7"C<zTWgYdQ`TqF$/%,lXAANhFekO1-JbkX\~'fa,b G[Ubw||nZYpi,"BYqO7=SVWXJ!}Sp"NDuuJmlN  5LN!([b-8=F;(~a8*C0E Q=lNR"&|~*G@( .OD%CE7d0(%079D\yd*/6GBO"\Ya_N4,Wl<J<rvpphD7E<8JsTi? 8y$^9=Z~NU-:];@`Q]3vThM9% XX9=Vu~m`; $QiL-!"+7271)Y|Uc@3L}|BB IK(sy-";6 MA U7':-,EXE* S68SrG5a %':he.4`d62:*#HQ6 >SoppL Hnc0vsz66bV *SItEZ 1ivQIRYI~KI|#>Z?]`+}@=dv:g^w -=<IKI2 h!n"C,vtCywR!yi'!/>Mz EBV2;(okrtFJo% 8kdki& [L&LW*E||f_fbXJE4cW  z4 *Eb%qt) 1Wv_$%e|P69Ur{Y. @L@-/;%%?"|h }ydi7fY168* &ZS%E-tn>4LflkP&CK+ NztB '7~i#;nF7CxpH2:`,&$Htubt&*H0HWSTtjQHW`Q lH_|p'sg9-L(X73B^z]  =RSE3/=T\U=)"$2AgH,9n?LHQ=}[ZUtI#<kg cc lUBKVj7x{X\3!UyFD- "yg7im7EGi0Ot <RU97`!X04v65?&2YsiQALi~tip&NlXE*=eiO8fnQ@<1#FT -4-s)28==Nq2, 4CE2*/SM Joe?C& :CA33`tkG$ %InuY*H1W X4Ba!Ku}IQlaE 3be    :Y_L-eQw'>NdtyX$$jc-&LfR>QB2D .S:e]{!4./"!+>cs@jd?`\<$#CpnVXwj93^mdD :GIB;6:*x{|1MRL#-Lg]++Q\E"+DNI74CaeU0 )B[q{kN/" EP.yuaVgoY"-oIJ%@stJ6-6.C+@i~W:A0 _hjWUi#U\< /^}zpuz__\ GM 6$b m/-/10J;<z[~St7zuO 9=- &-?T"%LR<sbh|sJ>a '7B+2MH/" 8a~q\><CC2&*IytW=% & s7&4Ogmlis{*0 t<(B.b]-/dU@uo@ Wu^L:z}N*.Ivv|26# *2&FK8 MpyhR1s[U AniD 3EGEYruT0vkHT; 4XbV4"%Bmi30@IH;, =hoU%;ZjM2ZaTNTqz[J_j&AF;/VKl !7Ja^N<, 0Yx|f9 '21 5yP.HI- $'+ " ]|~_?#:CG@B<3 9`s]'UvA q *+!+'NZ_SL-6HZQ7 '., 0Su{aPQ[psf8 -GK8lkny@^q{A+fx`PJQYhztN 8UZ-oVYq7KG,Z^2 3PSJ3$8IK@-'.9<93#++& '#<F;+LWG)}QGg&"&!^u_VcvtY(*5*"  !$',3.# "0+,EJ857<2!,FM2 NeFnZj(RLhA-4O wx4aC)!'Pw|Y*Ff|_<$ ~dJG] /:<5$ &:FLF90((6JefQ/BE) !-A\la@ 4F@%#3LV\QJBAA1% *1 )*!46* 2M^N%-"" "F{B$$3e^ '36+0]aG" yc`u ,443* (TxJ)#3K\VM@I^mp^@' %>M@+tt$ +8'@|}L" #'++102 #>Xaein^H+&1;4"  !(W\+OWL6$&8OahbUC7,! oC&(:a3G9%LklS- $>GA/0EafL  ''!;JE2 yr{  %28:>L]nlT5 +Gdh]F' +72   'JTO6Bezx[;!$#-5," &@L@'#$-60) 5H`u{s^LECGCFTfvkX<, 0;D9*  'CbrhR- 0?BLR_eg`O=+--/!8;7(02& '/3*%,' !6GO?("1;;1&&)666/,$Lt~_7   IlwlW<)   $0ASgrp^RHNV^]S=  &@NJ/ $  ww~ -+ 2Mcmiffq}U*-5# "$5ENE54LI8"#),238:A@7"  !5?;.%'1AMRQF;*9TkukK%  $.770B^gO +2=6"KUM<- $?Wc`U7((8ID.wb`t  #9P]_YPJGA5+#'**'##(,5==30BD9.&#!!~wuw?pvN--2"  */##/104<KPRE0 $7@9+ '20)7;6,'*.) !3Qhk^K;4;<8 )9?:)%DNJ7@e|o^WUJ1  "+.)#$,48, .GO;#,6?@;)./ !  /F`iZ<  4GM@$ &:?.%)'"'1<6*&0:/"7=2 4CD:0$ 5HNPI?. #FZZF* 24+ $#   .7+ !!%/- #04*1@F:   "28/" 081.BMK=, ,3)'+&.52$1CIB-#)00531-'5;* %0?<$  5IRC.!+)  "2<?B?<71* !'# +1-./331*#  #1* )*%!    )1;IRRF3"%( ('&#%"7E?!$+& &9@6  &41!# %68-)7;3& $,(  3KYXJ3   #'*,," #!$0.   *5;<4& -1$ *#   & .O^T8  '0:INH3"$  *-.19;1   #,."   "!!!   *74%  !!$/64* ()     $,," *'  !#     (3772.**+-.*    "('  !%)("     )7<7+    $&#""(.258=BBA>?@;0"(4:5(        " $('  "#!                 !               #&"                                          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Ride-Med.wav000066400000000000000000004122261366722712400225050ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataKb $ ~hX"  wlrCP  )T#^W:9: `c< }$g%#Wq#%w=~a[i " lW4? g? '@~ X958  . (CDtE Pu%cCK Ri~g9 :pA s+PBJ_ '[ 4 XMPA x)4 . ` ~]2p1  !IAG7\NZX U;qSS~uN ;(/~{}:hY {r92;Y ZKW1]Q nwdaOR aBy'O WC`t10dN2 t{a]z/k  Yb~9zNLBlVgmNOb{yD8= ` de^' Ej%,Jt'*? H #hxG_zq; ]a),?3 `;-?^o5y$$%qpZ4"-  D 9 G V FwD GEi(PVN b!,W_^i5<37qv USTY" hkieS <}~QWqd} @9G+gp!UbvpKj6Sv@F tH Z>! q,^{;c{.%2- 4G >1t d  /m /gOx>lIwV.u85+ O7MjF rb"9- 1f @!*GIQbVl{"mxEN k-rw>t:  M[59yl0`?q TM7fEd{d%[1#y &E/`(S=m 6H!'JLMP4Aq5 7 kZnmD omog2g!!!1 ab0)(;&rrt!Vml* 76 G_9y\AEb|][HPD\r\)X W*C &\7RoP"ZGAZFMPK50=wYK*E+h !>\nO+(S:Xg k2Jt k3&K$"z >x%z~v3`(jn^d v [ U3W\?wk1`v`hw|wmd:#rF.G/2KfLL ,~LJY"iSqz#}3#>+vpGX*37`&E[_BA;\y=N"z0:!2]GW+-yApm. G03,A"<P gCZ-_bR wXrE)!w#r dI#[.><)}[LH]a~3=6EwuKw-rG5D|gbUc% +J $r>m6RWVpV7@>ZW.l\ t]S -haU84p}3ZE t.#\mfiv=^ j}k5Y8D~<94u^ eUn,nnX1> |O@d{j_`GidPmYsHxwJMzQATB @b d-uA8lqq]:UDPD|}B!W9~ aUKT QNSi afz6NDqOvVxSGG7TcWHg:t$F+0f!Ui&rE/ rGEfZw*CrpbGQFQ`oco Hs #|B|gT${I5f!YY 3JMg  {U3MVV3trICY'}-duWgiw.?OoKk%pB"R)VM[ Soz~e_I_VuxW'2nKVXWO6;>'Fc{fll>yfc=+_F0D WY@>Dj,o*xkR,0 U46 LLf AN~wH?R{q{,(P iLmZ(>N%JqF3bG_hi|ML:t2`\OT H2^@;;,&FI8dg* / k%bzgyo}Sa P]ZKrh^A AAoGm RXitnzi9g|O=,B'{$o[Gm,6S2op;q)'7v5RHfU HW?.(VB 5)y:)^Fo'oL w u~S>~n4dnNe-wNGMU~ )[k|vP7q<@Zx+ eo#y%%tt@>kF]FN3bRyEyHOdTuw@ 0Uw8',Mt31+kKZKQ>`&J{~2J>^d>M67[h$,'y Qs2'NOsvN4q#2>U^%\A'm|t&b4u l>5Vg`<Io,% uF[\1K)Ir/so8l cH'5ru}M I1z4Y,rGK 3i07ywBV?AlmHYZPz+jbvK=% " F2"it*u v`9Tcii#leJF d!2o2+S-3 7LL7/U/=w:eRAP+ B0,qWcBsh'q?'oc@o .s q4 >9X~/E.*.05?4RZ;30c*>m;G\1p 0A y_8. U6@7\t%#DJLNkXQ$N|veX[ 'wYV6E WA)G#\6'VN :09gG:hj6RKKIGA ('l_U"m6IuW8]VAIAZ)GR7F4y*U&%:Y9de6Z0P=qh#}V[M?`m!FpQs gDOyEAq|/0Y_<7~IAzb?3]J%ex!|{m+qp>/max$?./}UTzl@]>,=sHc, y8XC[Q|*w\`c].B\ ;2&K=7$:US7J}kZ{s.i*r5_T`, /*+#8jqSWw&.=~"3[}z+$<xhM'OoR &%1*+|?xxaIF(2{#+-Q0)qQ&B1TQ?cC-"ipR}oi^[o\n I)kJA:N1].4Dlvan}QSlxl up6o4]jP%N i:Y*v2 Qern:OA~%mcLM@Rb#^/x>>]CnG=YI+!XCOp"5 @+6*J+x9I2C'YqR&a s|dr~nG^5fsDo_3c/^QOoRNsv&R E6}GXWLgc{[O7cKZvDd!q-ihMjxe= ( k+I#0/ars\Qv:WiTI'T+B'~XaFYcRJT'<'B*&rfg9UmjS[Q<gF<0 4J)[pzo@4Z?o8=iDRN5a=@u/(yN,!5 E,:K]t+83pE,Tb)IkX* vF%Q*Tk'yFDkeQ}(~jy}QS0hfFP:2 .\w+FC#2#6v02;lT#f 3U? Tat7a5;(*SWdBgWrnh]24;,GR{ k(x t _?i5E^y +TiF);.f} BQnYZ>teUn QYY&? h`6m'BA`7Wwu[>+`H]="HSoL*@qjz+ ?cENz 5m|z PZw36[5/Xi2bj0 C M?j.DJY}"qOF|K Qh CD)<<&aiX\R<%[- /.w<zJae;,{5 'Px;A@%B4(w#8^T{Pp}N!?m `l}mUq L/PJ7Z o )Jn{2Y>~\WMla GOjHJhq9 $D ]Ua miHE-z vYLY> a) N*@vibG0E@9E{WF'_fn Z / %1&B?VT9tu.N"$4d ^>?{R{v`mnEOPfNpX_Bo[!oJ bk#<XLS-%8Uz~^)Ol_)l'Aq 0Pqe|xg>`)P /C$?1dYs%/QvOzl"Z3tk  (+]#$lqW+2U~1uc6" S{kd@F SzM!5 P5}*]1:,AYd]t v e)-V'9$m"oM]\m0@_|?jOkA{.Hao|F3{gP! 4g\V#_F)+P /RL4I-L3`} KBCT71Wy*Dr(\/lmrHUO+Qn2[h :@(s2[z}~d;]5q7B;61aWZ_UB~z0LM6PKe{I9^MNBIK=@0elM6,6>yvdXfj)HEYT\E&3|w 7K!z4n2@p&%a&J)-%d8=j^dU+:QV3Z8W4kr8 VRMfkW"@V AjA.`w1(tR0m6r2C!r=>I,RYn')E) L>'x nfy\+UC FJijr~~MR$@'!e;w\xv,w i` ]egSLaE*yjz%Ar/  V3q[i3NC|9W"g,yEy(M329yufx^W0P502h| +.ir )zfi t"?[2 CC>:8*e6RV? ;Nc H 9]^f@#y`A|G(~T[F'5JYZ"aFCur%LnJ|EkYkKv+", M*_a|'5;oVQ#\VgC 04FG ;?P9K&*nT|bKQjP:*9sB;r3RsqrZhQw%`+i|yL J\( ; 0swZh>8w\(:ylB~|xWa#:}UnuQj{SQeL4N^ #}G{  ] ab><uU! 3"iMOL;pDgm1B^8Dj)% W(AE iv4W^`G5@:'w0?pA[l1w'{L{vtz j* {]{AO>IfhXf>C?;y7 fE4z]  >iX "|D=K *<[rhN)"6 |;`}sY~iVkg1c8T7qVDkmqFImaa(N?}h~&/PC 6#UOu^4=n8_p8-#@' ) U1\=bjp +S3n# TE/h)CV[2@d3iw.u*!GN7qh;{YF>=7.Z=br#ve xFHYKkLwS'3bGjWM Za)o1{iWP)uPgqb" ^GpdS*)0n3* 7Ln"5Ya$P );& C28t>OEe,('T~yO2%IT89w~vA(7]E sT MKSmw^eKi< 1?Jcggy\p _NeTZ jQF&SMyau  >`G EQjoym9| qei919s>KLL a.WvOeyG:OUM{70opzLIj m,};W%yK|Q3J@.8*kAWw>;&`1* y$zTD(D[{24=OIR%^3}wDu#E'nX t@R )F$ )a4U yw$vj 2G]~}5hO/zDG:G]ofW3Ds'SyaX\BA:d"Z>`W;Mr:kl{SD;y@g\1/N2+Ur z9)RiGL6ayKh\Vb<#9P6;c30S"@hD Yo" Y[>fM,rJE-}1W/Bj)eskU?o]7F1Fs[9uNR8;x pK}R|,J9}T.JFkWu(.uXs Sd1rNGJR];oBJM*r]82<Fh.DP}@>VFwwY3k9VfShN;3#Tm }[)c=eQ#8ye zt|B}D tu9uiF*+h`w&{oVrgFwcEMw +8pM)1:~3JfgsE8'GzztAF_WO9':@(%wC=&4+h t TF-<aE1w[4L>W GU@J|mHaSe+IE5Sw`_ZLc7/S,Li*bED`R4\AP(CkFSjS_)|5jL&)CM/jB^z r }7 o-MCJ=NNNW$4#IK@nG)yLAS-!l@3Jg0CxL{=wWZE((+Uhm Y:|!eq'K=o0B]=Kk:HQIT,);) m hTGfA+Og?v<{Gig&A{J[Ewk)eO  $\[,b#Z 2Nx.rB eFVT{xR&evXo>wgbPrtv4S';A1r 4Ex>St4N?~IB[|+~5C,q!Sw )[;BQv*bfa,GB%!"U};D"mP3 k[65rIHZwa9]huFBEi\GzA(ahm7_dG oV\a7t ]916Kb~j <.Uhy7 K$  yJ*$I4,T#+pu)WvEJt+<#Zae|Bmn,)YrLal4=Q5%4AXT 50m"ocsWJ1x^LGj[3&S3 "ifm"Nq.D6zZ !vDI0)wg9[.vFv> oe'5@h(PN m8[WpNRXql;lb+A46SV`mpyIa4e X/#T?tqk )wbw.H Mzrz-$c;&$4wyBxw{ P w7M0`"$.4-`A-l K9=flDjTfs{[wdU*biP8:,J$d%Hs.aB:E?`ws 7w(C``u-sH1UxhVSXN/-FMcK}ve{l(Hk7y46OlxA0jh^\MyN:KMmP/xR 6;l^x`@ S/b,}^VCAB)C@o/G5&(,\5bo0f8+XW6, yCZ4GhwjH+5nzzGi$wX9ZZ-,Up6$mvaVp yb1$q_*#Sajlsw{-VRq9R0+5}?0IpO^;Lfg\$D5a6jS3)E_il T{#! & UHgOuo~aD;'@HG8:Z])G<]S6u8Sw0  q '^hNg[_6ryeX7e?eH^~rM64/xqo><BDLgfS*[:d2)nB:KP5l (q< qE`+<}r &@%[` Sq/6k(?(AaR)l(QcYCYy+\b^Mf|iFrKMbL"8 D5yf9&HE)47; CO,-C/&oORz6q -oSy/L}6oHiQFQcw@BKRkG#{` -BE S7|`,th/z7 Fx.*f>L]* m`IKbTA,1*I,]I{6>N>a+@LJCCt9Y{UH'|';,-WHCUXaq55@ee dsA#Kf5~L_#;^D|Bq1{P(=4u|i7, (UmftgRKr.$Akt&U)T_IG2bQ>Fy[}3QYgKwc5s.Z-Wq6y%]Z=nR?[0J f?SLSk;ny\mUpF(wr; c1nX0 t:s WjPC9\ =m"@)Q&H-pHKk7C r6T"iNE>%pCf5AXM JhZn%BwY@Z;Wo%3 wLJtN]f ]1f?vZ4x 0z}P0a#%{*BY2<C7'OkQPh) kU g;SEO ;F&?4i=xJ[Xv/Nbp|{kpkN/xXeUG 9<>,(O>2'{5Q.r#t QYLX~5jo!7nmY .:R#,t4)h(Bh4bhyhFYk^AuwgpN{OnX U Bp%\Oi ?0 T )Dwlx:rFeXh'-Eg'lju@# mI^,}X k uJqF?tr bx9tRCA * &~z/)7Ac vP~wBR=f, % (aA}rPy@,d_n!t=6YIwKPDm.&uzp3]hE"oi qy;KrsieNVAeAI2cxxl&ooYM~!^A#h67d-I'Lv]tUE0Shq]? (Xo>;#4Vz2J{{P_ke`j<zv4mc,=KeTOTZyO1qSa^v~|HYzM w!7Ot1ASgo>H'Y7e>E!"@ ^T9 _x WZ2 "BCwHwW|qUsUo6; 7m k%Y-1LF%QG*i}tA)@>]QXyJObvh{z SNM~+{o.A8tL;!8klvj3|lL Lh")8ScO)_EKUY^^w7nz#^nawd[n4uP`Jdrlt}!C`'wq+,eLIYRJQi/~s>-\9-\]yC'i' 'XbyzdxQ,\L64*q60x W) pk9G`)\(NxiuF~c:rX{ncF6P0Tfn[EXkj%^(,}jaSw9>L7 f N|a;" ,QYYL8L"@ L!6 yrk:?@rC"1~?XhA=#IL_[l%'o r 9Z&`m>dQ#@H:s {:So;Wos@;>o GWss\rEus[[jh63etO y~.cDbdh` mo]L~9)wDh q Di"!$=/c, Y@VG{4o<u X]-jo/,T*_5MsGp1DJ{|Y)Ln6~#{[V>;f> $6BW!B2(/uc[H/QQF'W 1{FH:WY}kVz;[B/[x-Bzs0Mvx_w- c2.xFO/ipP\3*vs#92IG] Eh;QO3+enMOrFvwP/BuK]<t!(UsanV$CW1x#j?);qzQN`LOY!_t(8  w#qa^TK qXd,{}#mG#N[. bF}_YkL WMT:RFqsP$4}Z3'|5be5)@t@-spJ5o?mo]cAtL%fG6 _lxn7DM .YPl lMy.[>y!]~V;,]QIMj\m n(dsf]X^m !F@9>VE4G54l(h\DjZ%Prxlskl%g0a'} \%K1,q&6/01n)Q[2 ;C4$V&>>-5bIec]Wv<{yOmkiZD)&S']F3EVBANQ?k"C+{lR0x"zspsLpr:U7GA&\F[DDRLv.B`RH?A`Pr0OmT\kpL(B0T~F9{"u  dd\VEBmj}>@gfF\2Jdh>@B_`?]6t\\ahw ,Us l6~~p_92)G/&0VOi#Hh s1p5DKY6iP!yF>MU(7PHh{PQlB.$srj|&uN]_b{U/R}b6si?{:v.m$][&-2EsE&d* I4%Fd^)!A_WnnMI;o#N;O.2F2S8Mn ?c%|nQewJoao8c1~h&<v`64+q#y#2@C [})5AyX3ysKX@is>*Eqj'ahHt/gb ~'PG[O Nz_R`m2gY|m@a' < Rz|cB;l?9w P{m;=%?W08^T)~f=,K5SzYY23FuKhE|#!}+4"F2~#G*JU]k4i_Rs:? 84m E"a7CT xoLI0G[JYX[ciwq#Vg#H+ (BY7c#@KDK;EyfP. =V6OTsxCer}vx*OhHu%]dkLA_^jz>`[pd'$?'Sk bg K}s}idq#&.DU0fl@pX kH>fE=?a4A>;7'G0@TmU%wgKy}$C651gk$h*2d!1kUN7E1_9zB +C~"J@JDs=Ewc<2V M4QqTjN?Z*1MG{ I(.7p\)YgR`wuTs6n^ lN(ww};D rcTh!D+MBZjlhU+:U4@FNe!,>Z8%Ij]>zJg~Gw&ww<VY~ lx)| G[(UauW oc 'ePX-%vrW(d:Wx+BEq{>[A3+V32JPoxA$Z+]AM)nZYc|[S|]&C/"}|$c:|@  B(jYldI+%Ab )aoMh25 l, ]3`Oe=mgnxb6&-9=@=;x z+:=]^N?R{NGz1k+W_9;sG0OG. `%&vB!9P{TljQ WDkCyB>b/}W/e (sC17Y=Gi JhW?q\vF30%/f+tLOV{VTLVg.\73e7A_[7@|GD-)Y(?[e *36nDYW \LgQ }/CQo$3kH/YQ}(pY%UEO$C_zE.Pc5GXJ\y oJD]<}&S?PwUMkf}d"4800wwm^rHSDm 1<;Sz#C ^cEp3nC%_B2%lB,72 &><SmdE%aoQ tD!1W/'=X{#%R r`l2_<f ]y!MY<xN^&W"^=ziL?8O9_NQ .wE ]t)|} ;V5= )VMq(Xy. hHc#vq&84(A6[}ZlE@&0*<\F%(CXPW1H3ss{#r&H}B-Kq\Pc1EUyg* <K=ZJ*9-`i{pP4Ff~gPWM)d1.*)Q?_lutR l?R',4N6TUI(J{@ A;yK-##)V=Dh1a,@qLw1xdT,cz8==2RK," l' 8+LmCcs6'j 7yyKYjG $M@obN/uxkGJe8|@ eID:2h.'+L!J.:Kzc75o|DjB('L]~ k I@} ^ R .BiRCSVe]1u\p[lmV*._fa+Ah6TlV;s\=`#r#9w5O:fR\W/Ho3Fa^&7yY7doHIhE0OS,GM/REfsNc%P\A.X^rTTfw8$KS7 YAffPmw!;Lp<"{M6`h@<UAjx/O Q)eniAdQ}AnxfX F"9iBg*< [wxw$3A#h)ez>E|TrA.\hl"e:O;Y%^Gt@/'t^/lN?d~o?yAp5J *;Ha$g"[np=ZR_o4W=wEMI''6(LE@ &/MN""J"BqiIHeshY94oMrqy:~*@%FrN7!v*%6eJ*5 qB3f/F @Nt&`*E,J>G\4BfP\tC`cJtCat-}z9yv,-dA KiR'T_ik5@;\ 9 jN%~A+gc;=88MM# >H!-O}wmi6L-UKgw!L2IfU9#I~R1UE [{M4j]394h W3gFN4H&#)DUmS_O.-,\~h `V:Ga? ,)*nk?m{"ng3yX" B}XF"nMfX zPO HYV_gd2RF&_VTjQVAUIR@/YMX&hIC+o,)@}7H3{j9n|6 uwhzUJlz{q "%Gx+1$G/"BG< D7c0@H?]o7uJUznjDO 'Y,]:Wm0v'R+@bft7~tqn qD03zKqH^p[C <$W@.E%ksKxv d0t?Q{kshKQ= 'O"CHzD'ZhZ/3@A] O4-gXZHvosx0M\ J,E/mMuR%-yweh3QB%aSp4%'A 6R7PB ]s$]PJO9)IH,kFO4nw^\zW!Re_~R !V]cY>Et${n#nx55;8m<)`/. ~1*x{Bf7&6^"`Aze@6["^PKYE4#pmBsu7h fxt !V&q^IuRe^`:Nu-pMit~Q]th?E|e^j_<xa"kx"E[1OS s@9D(X!Z; ALa+|c,5)DnLk+d>J)=aR`, 1n*%#Zt-U?$w,XA<:{FGYy|y5t%D2SGV}E3UsN{Xy gY^ &Vzz=J;-;wE=EDQ^VLq : &#;;J&R'r:W 9#G!E@/t; }C-nJm4uGh(D9^Ek@;u!ovv'dRSa<fGzV2b7^)EF/?-Mq*z9gqT<;=$-X|. aP(Hom<2j}gG>k PP=_+NR Jh>iGhtsvhq'7E=YMK CDsfa/+r130"?3x}F(3%Ke WT!TJ<ZSz/UBAD5_)UnWe"s<4vH,+],V (m3VN;jR$>4tN7e/Ccg"v4aq'+h?j&}DY1 |2n` I#OCg7+ v!:i8lC>KVW[k30U6en$"3+(bSrM!;ef,;F",'**&yXCtT&"Y-'}8k:ER{ iYVU.KX#'3~Mno]Bx7+QliH0%AZD8$nk-pFNA5Z-b\?Bkl%;~XqU#t1- N7Z]_"D3&>rR6Zz$xw\x;J  5Vfc) \d.RiR/dD^DtMwl-U\4ca 8{{/#%pI>^{*v<{I.M&F[RfarJ ,_b}[_)T2>:Z ^,R<cCGxu?\[4j-NdA.-WMs/=ad:+HO iODnm os"yKF@~I 3 {(%. ^]>(Ud_-Gy/ ++u\0h}qOX@Ea4ZIOgOPY5lHx]=DpA`!W`>N?3D7^%S0 FU {*,4+Qem/fH~ =/6F-7]gffh3@Er;fV%|QV@"^^e>!ZC+B. "JjBjC&9ST"c8&. J7ehc< /A-bCQ87J~ Z;s)5uHE=NN:**~ 'fAQw/@V?*+E*ysQ=# dLW   Hd94e"u\ );K`={~&)} &_SHWIr[ Bf~qJT\VQ1QEi{(7uN]y&yLb4VRDuO .-+H.o$RU) .@Y%V{ 4q$Z Q NPlycB< ![-%S}3>*X ?*G+aP;F QufI'{b%M3;D"?j sjz)UlY|XgF F['"y>J[*^sP/_ 6fs-)m(sY.]Y3z(U {(79v6}c W;,u2;7T)*oJ^^JRtPjkOw,B^k2^Mow'Ap'*wLa QR gC,&Br1g 0ev_jH4G9M6J1 =UM] ,b.X}.dP%Z'z4,Y]&D-}:;&A'v .,{1.r|l+BYX.]*vE5%GvZgKBFz#-m(n%i/}rAHK!?1R"L0FDhH5m2@Q&qrmQV8:)@HN3%U*F]gkGC"`%2).Hb`:R~?q4~uBoI^QG:-v}QgT<Q*,_:+$K',ahO@``< AP~CP}2jlSa|[}3TlT\yO={mkd#x#qm^j<h9E? G#{WG19?BEvQoMbzJi09ox }iv2:_"`&Q\k]i{B2LD_\)gl]@cfh[U>lh 3 k&N!\l] UKLm/HJfyv]xm6 HoE3_)Q .@Q!b?>_ s$5E?E!6w6p\*':F,7]sG"Q/uE8`C2F:!Y&aED<m3, RII m-];(=<*G5nNuC0,7cB=N:"9]8%@Picmd,safZYdrIZWjx&i0l$iO[{hJc cNzV9WX/`A-BHjPvG ?y;aZ((K_yz[6;3!!MC6XMs8! ! B]*F?|XdMoy[{9]U7-}G>vlu_G`\n`wqb_c1oBZdrV:a:_W: &~T<qu>M{:E87cw_,oi@TEAc";/b@@"$oSBNV7 a'hd1~C^4q!s Vd"MGD{VS+%Dun<4`yXCq%U6Zyay>F$2Kb5$;pm;7wH=d P;]WYkV|i(&:$OuwAM`qY 95yk9$#9ZhUk@h (1,K[[6:,~t ThZxot,)?' >0Xa(-mxkmYoKjd#2?k~'|G,]p`u/>>b J&0jj-S/&p??d?U4IR/v;52U U9]WYh,/$g#sB*>X0woLFT>n#i|J9;P#16}GzrG,]UCb6sb|GuTIX|$Y\ }GXhZJh<E\jNct}^$=mUg? * D]<o[ g=J9PIG1Ah3+5pwY@~q@o 11l2Bkq&~oUjTMg*w&Zw<prR kyB"z6w0Eo(ry/*svM4_ dboo_Se2$)@+4c}\uOXs0?*I/~[r}jN7.) OI }E-l b)He'(g]hv\VQ jQ_0Vfc`WF.{e u>8YJz!I"D%GvR{)Nfs-#g+!PhV(AvgiN!\ P9QEtK(y4<Sb Ak@ia3K0JvE$7Z||#_8K_RR7QV }.VDDGydS]5Ad6RQL`g' 0wtreYkq'#*uVer(Drke~P<I ` .X(3md@w:u*D&w_c$Q}<0/&&@Al8avk(0 |3v RY]|].IU[Wf{t8$u~`r]JMpFip.+_G!9jn\NG4Qn[WwE9pt9`uXY*VzrDm6I+%2('#\^Q M3Z8w$/c<dUp )w>eFsfMobXo)LM4k!s~+Qw!:X>\%T@ + V$uT)Z6 = +K^p LrO)(wCYJnsl}w!]3Y$0fr~NQ)s@A>X j 9XZ$\e_!dIM~WJAv0z(*f8Lk:$gb( ivB+,hS4=H<()$QmXl+{,9P`InRw 09gzzv'(TcU\1B05TY%  3Lw{K+Sx4"lcGi (_U\`pM0v2K1i>5lMb2,;MQl"LEmUIz7wStG[YpW S.]5z] - >P,%0^9.&Z&"c9# lcQ[$+7 =< Re5q7M vSm&}X$MOJF -%oG5I252\~i5p*#-qO"m@U3n-\v`G7>=+uI2aSyb)v|$nt b5o gC`z+i#w^u|E+mN!}nRDTkmRw )k1Nci2BsLGqjw# !ZlfHM$QH Tj2Z10]7>k1j\V7Wc7:cyUv7FK-ude@N)aSFo~IC,SAd4=xgr rfXspL( CwBp-K>@G:I{=XaR!kkYj8E]sy86oS:7V#mxN nc8S/1&UJw|gR*1~bbHe{s2 LuFEQE]zc42&{ND[iCmLqUo&,<7o3 n7j,2Dek}_K;-}:IE({[h43PaT\. {_%R: psF~Q'4/"ldCSaM( q(}33z9^l!Rf~,(KBQ7C+[%CLZ:-l[ ]~ 7SFA19LD+),ft2S Zn0'=J[av}Jpm0 m1Q1xz5mI[vz/tOd}KwH2[?hEE`3qR4F`7b-;){ngB_f`BH!QRB=w8W>E"]SPb+ .]Y/!4JYUM6;'IXo7M&lTO- j:*qYR@r9'pKJ  cmnF]"'O6 )MONjV gG:0',Y`N)q4,H9f9|={u|sTc<(GnzwJqIV%pMJiCKtEKgrT&%yo!3m5aWMyi6Jl[Lnnaf9PTT! 0g,7nbj~C5[~9J`]1IxrX\8g;]PW$&ic~&#rG]a[}jen^6"9}+7X'9^'Fl@}kmAwA. 8/ ..Y}bHREx!" )eygXuduzn_Tkg$SuKa?1;hC5u$ dq""O>{qg|{NN[WKq;@K GFET /m*W>$<7-< X6&e7Go~h3 ,e?% I=pEZg8>JE+}MnE~A#,zXt;V;d2XO7Tvog=O.l>hJL:c}~?U}j=v<(M4G^eKFW  .[vI l*vGS!1=DT;/Sv+CC`[k[9~:V EPpbw  N~zxW6E{@k sSk{2[dPXEk=^h$X1M-wS=}> [RW@3hcK~ ah,#uj]hErKInn0 /~n1fq]p oj62yWb0X]:dI$f,-?Qfyo/  fEC`{qC+93bB\#TMGIBsB U"HPI 6p[yH'C^T91m0  R |n?4L`9~ELoK)wm%D'hod}eH4pf?")M[]3Y2 Cbsod2Dx_d\CEC# I Um~Wx{nG5S@n=%9~'Z)#.) #k!/1OqiZ?/0i 7.9 /+!9 W nO!=Q 3XV-:lH67>fao FD$uap| d^o+IejO=\R{)?<y . hr()[@/C`m[ol& S`SB-Ku?`?gw)K+&(28LO[lG{q3qUGYZ)ph`k4KSqH7+7{`'X dw2a#.G$hu*D \R9hKTHdfm~n7sT^|, \us#}>" 4'Q`h8fj@1Q)2G*BN`F @<,rQ)/>r_]s=D._;=o|G#$<'=%gZP1%-i{ o'6$nl35 g<6gc!0 '8iT1`kK&lz;mj A3UdBf4^BWp 8Sraqm KX`NdP~Pws U-Qk( FV Xl$`LR[P*Ec~Az8 I{+)C,gvqx1M;@vFl i(<uIdp.U&@9k}w>{ozyE_G6~G;$6{ c?.""HI.az7]eHmAKO. I,5Rx[r?Dj#eVyoz9lT[q6U`F6!2Us D!nQBwHgI 1..IaV 0hT_DjM\w ]S8 ^u1V( =Kr-]/Ayv}F1'?Jc7ZSS5E[nK:&c57|}rmc'lGd/Jj|CtV /KkSK)ECw+ A 5< dDZ'kykyh}_4 +U35bm`(|qy-;) Hgqvph=I&ZC15y>Dl` qRr9{jZc^ Ife2 c2QO=| c7w36[Ei"Z-=Bl;M-Z HruPRQ1@Vvf,ra ?zx`5#(+KdT=%-GdwbD Q?}4zHH: Z*!%}JS$]L@:VSoj'xvFuE\"b{eD.yFn9LNrMR{ZtCrjl]Vt9}#@|%pitU{:!E8riW(k?V S tnQRb} dJ'T{wqr/d?'}Nq("&6Ws2^8h-lO2#B#`i,>~MMQ0-ZnU8=L(@ts(zUo;oMV@]YSOpo(VRrvU}?V2v!wCh OIf.U>]'$B?TbO!hlglrcQ]jH' ,3Oms/D0F}8nct5> c4eg'9sB)"8iWgS hm'62T` 5Ff]z0`^"~q;E.]2>4xVKKxv$6::)GsMi;m0au[8]jvE.w~(uJNE2xx}P(~||)O'An4(!Ha|va3^7",)h29`=^O;;],8"kaZ 'Ye~^yx=[K]3SR4T O2 onm#%VvU0LryizR1.5V$&f|46QiOpF)xq87h&g`8%U:/U?>D?J> Wp $D"*t7J!d (+,5+ c+d /'}{8A)VRO_n@u(?e)\Ujm*koON:3/e^bsVNz7xTLuH af4Yx(oTNfusVxG\Jj_^2"35K/JF3cZHPwj%-Xx/jO)N1 1Zqf,Q^!WJ6xIlvkBF~fMD[oQBPse\w>c354Df_3[D\cp; +IU1IRz@KzY{h?I <0v|]Rw+LHj|~V# w/- rFHSN 9koqd:8] g({#X9Z2a--;D]zl@# Gq^J"YQd3^n/BY[MA eZdL h9>c(r"_?J$9c3gOUX;l^1&?`gFIq~q) aB6[YRoqJ.iE})J,4VvS[ ..VeWB E}\}St'dkA+=;yyCP% Xcc'1z Ke#OD8pmaarZv)k4 *Q`\aN EV,s$-m9;n`n:Sl m&za8N4~RB8( a O R<}XyOR"<pz9"y~RO?]h^B3=Xl2$4Vo(HF#mZjR[.W8KoyaB-=y<_@AZLgC~XauOP^ *jLcH\"-cmbtm16*aNx; TsaZh~fxOJNN3A.__*.vkgU)=Qmj? MMV 5 %! 7)E>86f,98%%JV[D; +DC1;x"#-iR 7*}E4Jdl[=PVg)C E`nz4ea;cDvxzSg_bw+: \T{(m>(>S>LFY]leQ=:OAo}Ji0 ll)F bCg*6pWt (&X15X{`/K]y!L:.S?z2WxwR#mmIqRp|=^PT$;(o,|i/+hA s}eg\.*RXWRL1&Lzu:RPRgL;pc-)3Z1[Q0\shR01STvgtv\`ElM] $#!In[&*HeE5t,i%s aT7E^}& Y J{S#[n7!? y%~V(a@"snST[Bjcv~tH1rk}~fp{?'Fs6!BE or{]x]O`x}I.)Hu LK$ 3vu84'8h! ?iu|\_xKI{&Q&075{">gk6G|qgata>0kL<8@HMMLqX,-QlfJ|]Il/$#{ }Z^Wf.vg 5=7CPW+>B#Vm2Unwrb:0-_Pnsa]b~ ^t]h Dbm]SUlm5-0=^|Cn"e6$dPnsg5`[|@Jgp4mpfxn(Sh9AOh^J_+16R OVc2U 3=L~s?NPVW]p`1'11.;P=1OYS{v; s} SC9eweRE&E%2v#{)?1<Ozwui_MQnr]O8G@up--V4KvyntO11VsTc~I?)5;'qBw_O}mW]W7x[:<J_>P_ [ulN9%&> }&]{\9)e +!Mefkve:'#B>Lk>nVQ6];G{0O5aR1Boa6P6]FM9sOaM}z|U!Xj'%fjY9 OH cgP)\uPc35y8*ePvkau@]Y%>4'epE6Myke\dz$lS2<6+)011)Y.}\B S~n(?ngDo."?| 26 6@)7|oTMhLTm arB^<`v}~{6ylD|RB2FfHLz 3TMl' :]j(_(sy34;:}kD)iRv%qh:IvsY,cZwd@_ MGY}B{ 6yfOMm?txKP\IW]!/EE'bV0.Kd{ ] K ']at-eb2&vAXC&1Jc:C_"k8kZ}9W5Z Ef!Ww/{D#=~*rQb[?CHk!Zw`)=B ') R2:( vNq<"N .zSR|b^FcL F_1gonmtf' 2P[5iR1eb_Z~iZE74DZv[={_#S#T-mTd+9ZdF;IfbA7Uxwliwk9Dh,QVV__<pj!KR1 ;NRTt:2U $99)6Rt|]*$3:3%f6l|N Q rhw`PW YFE9 Dt]kD)Qmv UEd4IV/ "y3w_Iw/B&?`qAm_DVk=,&Yf96^ {B!8M<?#nB,\xY{X=R~LJ0|du9ryQgjzt)m1lB'*UH/Zs*[zhT;Mag> I)k,r0 IyV}1x"LAK_Tq:z|W?g']hGL-Fs@A;ud/#SVxpE6(|(U%|N^{[+1y`T*tZ.'TxmES[UC[E89=FJ<)N ;q}1zfqcf]"T~fCZDI S\YqFy r]1i(am!8>NdX3 (rr>"L-tUnV{<}Y[[}+D It2wW!sV)fx_'N<he|C>;'(HOUb L``4ycIwU`6'rl*qp`QrG".>^y]N =>*&%x}jTi\VKUP7|52 ,M=]392I[Q`3XiZD8j%ohYD> %e,O%7 5,rrF;LdS^''kXt*LM)fhMWxIuHYjybH,+no{ #{}bviF6sk%z1>!  dcc NCO4,lEPu6T rUC3|F"W|_^p1Z(fbVq zL~czi.l;n{g_<GFh``Z-wtb{BO6I.,WH/~A%L>$b_dNnVfGQ1HZ\3cX~6?);(=/q7JA&uUt@)q Bijg5gF_5|LP+t1iY96u>4,A0*@'a=EC<]("=$@,\-"U`3"lU$2R\OY#el;N<Jn5 4nO1wwxCSv Ja= +2 t;2AB T\j WnIw2.bzTl3s49]- :h ;q_vV@I.L)aVYx&FgZ8-#X\-Dia-1mGAKJP^Bk3'K>Q3v 6SR>:* E .s U1+=RaQ8x4C6V  LT{C VJU Cq 20>p\(wfv]e.$D!Zi|dM@.-zm _1?;*# =[ovza?<:#  q5 )_LryqWQp3:FUjvS0%qI_%O>P8$rz=l6P.^Nrp,\L9%Ck+K.S9 kG0hq-1]phRfYd,@;4eUy~vD9p}Q'(a*c]ggR(bfz%jjy26u0Yc4j]n~P,$/> "$77jtx~tI0AlxDW/Bsh*<)h`0-aeSRRok@(J5{zUSs Kl_/jRuzm6S[x~yYcr<5SFd@E*)>C^' MdA D8}(?~n F($6Vfp3TcZ3pc/rv s]O"^f9-E(OT9yyz(wk)(52\E;Eq04x45MTSK=& w!IG3-!)nuU/6L`THHe|TJ?j-Nfx89K2y~Enzd eZ2ZW7QcT! kZG3^caQQ]nppm|tO*H*Q>Pi;@*':veO=>CWVUBVBBTLpp8 S# @ b_Tg( )In{D02jPQm3vs')]gY9.,`/ *qs*W|qL o,J.+d  ,NuyiD 7H/%5?NUO8`ep@`kkX!e!47:5 bMb1aACl), tF"n+39] 0w-:3QhGPva;}}vM}}O 9wErUOXr{JCEWN#wM(9NE:2GA2 ea} eqSf`k[4,(x"I8J7.3D^x[->u\o@19o9kL+<a}lZPZV; |QMjo!AApN326c]NG6!f8? (eDR7i9oP}@-6RN,S%Nn]1bo2^ q[mzM):\dkU6\ ;IV~?A,8ttG|vY!VdbU@% 'Jg>!?'fXr56tj, vz['?0sK18Wk4{0%y pIMY[6$ 5n|ygZPVS6OSLDF-,NVJUv8 n!^l[!i<q{lbF.tZcEHS%V[l]MX &c'nafw%`i+ `fwZ]df8.E8Nkffp+ fYj|$Ps}noxxaE. io)N3B*8E8L.yJ]'iP&0SRl45S(& 2F2Qm4DvGpQ_Pbs5\T=J1RY }:VG~ Sc:E4r~Z^QZo[Ty)>5H>t<%;bedGu>c@e*e F%2CQlsh`N?6`thf]eYVG_Y|z_VnxO.jepwr!?6 '@fJQiH/+Ez/\]?I`uofbgdN9/B]|hWM- BeZ2 hFVxcRX^x/WE ]}4-ZY7\S=D3|F>bU( N~bLI7r,$`lNOg4SrM!  H`#S2&+8RhwcJ( >HUNd b,^YC 3s!pyns93*#(JkeT-0G!4&Ski`> Mw-!fpP,|dTA=GP9NS]*U U3LLbUA20FLR"1W,6VaL!}+4ZuI'^~rh^j9]oiu+LeWrN6#Ekznenu4H-6A fjyNH Q8Ds<TnCvI![\'ALE9%,<'0z\*N#*1I3HHJIjiQVPG2'A@#y U\.D%ZF-upteQAOM8mq#Yn5$r3EN^z{5 -?K]iO kH6AkK8u>O.]l 7Srd=!|]+  zP3BkNaG#-C,kw.3)nz} 3!Dr @~5WJm loNzuT63} *W_mM'9v,08EC5On)*ra_s`CDrLo;%F^osngRGGY 6GU|2%qeXUSERu: $c[sA5}/@YulZ=ixIj==j `3htL r/;&[Pi}h*j)GT"+xYpXRu(z 8oQscDGm?G=zp})2(LMf0J&j8ksY U EU<^x{h36:b |YOWpkX-,0" DinsJ#y Y.U]UQ^ty\#oyoppa?)X_ALQ-JW<$8] 1WDRs|;E)IP~b$^GXtYr pV`]KiQCy~^w>Zub(Q*,Iv >.VJag!MQn+:}<  SiMjQa- )tSqX# V,+#y{ :"?QD/%2CUa~! f:2@]mH p3+-1F Bt}`L=-{ga]nlZxmGBrCoqR Gi~d^M:#`jZd{-Oh~F_ ]jfzzH ;.\}-%ke.:?fOPi:aR4' !F`R'b=EtS@'OfE<fhL.K]i|sa95N!CG `IMcqp^=35kx`n6%2bzwbWJ8-UzH_Ds$)"!"HYugLut4~n2,`r,}; 1i iN~S!-fE !Z8aB{1 &3+]N3m#,l[{Xo`q<3@@gODT~ l}gNKp3\ZXP\gN +-$#H!QP(yN02Gb_/d%OfI0-*!#:IcoATzQY(KNFMwAK22`wDYk+@zS`.6^] )Jr^Blj?3Pc`o|nBY 4Xa=,Cy?^XA$ "N _v-JS}'CPcxwP&-YpqYT7K{x-K.?Y`f=_B:jVH 65`[v0<r{G)%/-5@&wsh*M ?]i<#meB9^{Nw{q1rya # kV[uNR_,*rg~`MZB" "U#N'z.7IVrM}>-Kx':Qq{C /QI C-x[CKoZsn}SB_FtH:Y 0IY[H0!?XS$5TB4Jrd+u}uaINSQC\?@[{uxx](p7>yFF'=iqT =v+b^gcQG<)Z=)/^y{w-n/nR"iy<2tV(+P)Zi=lwuxcBX* g* `dBa@5-1Be|y_P[)DF=4 <WF2I$Uh:/Ph)a. !N}{M J!MdvnX?& /FW_ZH3!,~ldproZA8Jm0GL\bklv~kS?C9?.58;/zH2=a{_Kd*fzV;) 7^^Sk\EJ[smN+:pmdMnNVkgLC`~uinjY16Jvt!CRVhxvV& #) nktw\J=/$ P0O|d'3;-*>jl5oYUXi#AI6:z_8.81%%'WwvWI6CbwpZGQu9VwZcuG2 9uRh(Vw^39[jeQPhf:VY-)3BSXH((>A?EHX^kdOWCE]4Y^F0,Fdw[/!5*,Jour}[&oac !%&6)<fgG?`{uS(,Ymt]Cpas _H:Cj3' "1FL>IZPC>IXu5&" M}nssV9% wL8FrW+.q%='`,Y8tG!)YU* @#@o}Z =<xlZb}qTJC+7Ujf&11\ICc>krU508Tdsrq[AF^tvsgaVTWQ?_&6XbL("`,QYN, %`{Y&,;6++?RZM6# oI@Cf 8C<%Qw5,HsnbfyE~8o'G(_7:)1W}hcy`+xx}lU3,A[<umX6RDQ0+@@COTN-#qkqUC%WA/|_8*-6EaNxd9Oa9vM;BYn~@ilO%+sBdfYzrvTgF4+,+eRa0dwvoirrufV5#%CW](~V+L5aVB! @pY'pe24?;0,( e{+`S F4|v3zlTHFVgteL66E^l}xj\I.|F Ax 2#-p\ I`T' #+zTK} \lO(Q[G&=bpV TQ`c`=6Ow=IA/ %-?MbpqeZT]hyh[PSN@o( 1NYWQe6w|N 1'FjpSdsC +jn%s9.6`~AE~?KRfh0pl 3\fK"*(}ci+'1Pv{KkI48@M]o3<yKQ+)5>;,%:G8 0 JxjD"2- [WjThss}sg]SMQ]u #?p%2{3*1"|gUf +?Wel[C ()~hj2?5%,5)% uG8\  #)?nW6344& "*$(Sx^o@16BRdt{iacw(%@wE ;lh:=PL+ HH)AQQ< q7(`mgDFl]MWzudj|S}rS<*-9Pm/60 PqnT0+<ez[; -K`eajuX)/jd; A|OqQBNv&6%-g}Z <Rbo~Z!r}~z #A^l\=0Vw~dE/+.;?<.  "MkjO* GsZ)ymz))3@D5( -Vw`P9'47 8H*$Uk+$-252,# |J1>k9I> *:' I\bB"n_SU_%1Ee{oO75Sxc:-*AKO=+-l[Wr+61?TN:yf_aWI58R/9FGR\xxc_YZNGBFMH< hG/ )DhEh~v_F:Ohr\O;&a, 3Z(MgmX-F{sV1.u~!Ks{jF$,@9!(Lon9c>05BVfx  5SpqV;) #'%'-Jzd3wban~ *<FO^e[H5<Pjxq_NGN]`cYH, *+14 +Dc|g> za]gry%!-M]r{rV&Jqzb1 /6*!CYO%JGg,::& -DOQ^oeF-2BXZF($2+mdi",) .=: ->0.<@:,!(;FONM>* &Qu|v`K=9FZnvgH"  _Vf %<LPG* ;by~|p`A'41 {y&Ss}vfUF<40+&#&4IT[[XZTWQNHC7" %&w`d+?;! "NzX+%3#1Pjk]H62-' +FggR?60(#M_L/  2GZYWSPSTWXN:o^e|pls9GG4:\mN2$|z2<>5"#5J^mt`F'1Vg,X/4Mw:TZF$ 2MVVMF</ut|'67,)<QfzvikmttpbN3qikz.SfkZ= -8- ;Yja5 $W{wS,()   /bm1$*PxJ02NnQ ?_tp[.    <O_d_R7+:=<CHSTPD1  %.?PcmiT,LliG)80$<RlvZQYlsL?nmK,,-$'8R`j]L"ro3ISWWO>,\lQ,3a|i9  #(#'+! 3VxuO)#%{kmn|#<L[kz~zhZOPRZ[\TC/#$.60(23'"8K[eg_L1>SUG20UjphO-)+&  | !%B]zgF+ ).=GOC$7We_C zy%2-2NUJ=:EYhjbRD, 4HKF?6&6h}S,1/(jWXn<ZqvoT3+BT^R?1>9!(( #  2MQJ9& %BTSE69UsjF!2<.(* (-/& %;MSOC:/weg 9ISOB84;H`wxN q_\o  Dov]UQahqh]QD;+ +("3@;."&8R``H' (("Gho^>#!3DNLH</! /]}xttk_NA<?B?2    1DH; '/13/,"$/Ge|zo`UC5 %/3,&   &CNC' Gck[C( "%&  #,9?HD<! %+02442,! 7DLNA64B<$!"!4GL@2 .CQK8wrr| -393*.;D<-%.+ &%+3FXdfdfidP+ .3&  ,.)'-" -4+%$+443,-/0-" .<@@@ALQWL?.%&+1- %5@GJIE@<92%% "4=<51014:A@3 %/>IE4 )<GFA:1.*/10$$" '.'#%%! +:EJFC=8) 5?A@;.  ,68<<:3'%4=>2 'AV]T9 6AC??@DEC;2!     3AB<.!  +3;93)'/>MWZ`^ZM=+"$)/65/"   5Oa_L1"! !'/+"   $53)&064#)0/' !)8AC?=:2" #Ijzw]A)          !).7;=8/"  %*# ""*/'1IUUA+4??7*         &.4732..%/?LRSJ8! 3KZXK9+&(087)   ",6=AA@9/  %..$   %-1/&  (!&.01,(!$++*%# '5BMNG90**&+1+.64'!)-) %275( '37313;CGC7* "  #'(% "!!  '*'      $"  "     &030%   !/42-(&)/31&     %,11,! *.)&(!      !'(&"           %%   $'$ ""                                   #&#                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Ride-Soft.wav000066400000000000000000004123201366722712400227060ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data7JY y i V"0z5n`![-ڿ$4JԈN R<!=+ oW\J yo$!IA5^d Z mYo31] ,U L ݲ  lJ-w D fYAV)A% ".cpR<, zZ"JE%}+%"Wzo e]* ^]B  !.yn uV saB $ _0[ lH- m  0P ?lbq0mQbJ a6]  d+\.3A h5OQs[ vww;44D> 7\qD*" +.*dlu PiFZ h;S}K{Ki^vR Edlj ^t<NS|z ,7C5Zk8Z ]ZQ-Un 3  L5cKhT? zw,Z'XFi+E,A7~dV7LcIN{B:Q^zdWP7.^3=1 .yf zL ^&}5  K# Q>l''%@g>+),z73x~X_JZX  xpVo]b");u'5wN*TcL \Kb5 =2o65j  j&`fF@=Kv8zM(yz9x[5@_. b_\k L6#a~e5jZ'Hs,a,O=@,`WL oEX#QT84Mr Yj-q,j>#H`^q ?gr  L@`)U$=*u Kkc;] WvFmG6A)A-Z+p1* 165wAaih<Y.+^Q2Y>[g"XYQ*|D7y%$6??|4BK!['7f>i +`idxT[3 .43fWJHb1$ *8Dsom[ByYHx *?Kd9bfGXQcgKaYyrUf8Uj%LfN/.+Ykg8a'N_h0 qT@_~AB_sw7 h))R zWtD`I5Pju VCyw]1e ;B 9u/CES:wwh{1o}B4?zH38ko5Y~QI^@~y1lJx,gw9A&r xEN86! /+60/vNe >zxK]^h !3>v9=!R5^1rE Xa1X2"2x[9jx\SYN=lz6@@OrX5kE~ =qXQX'3fxHEzl]B :o 5o s]vOY$vmn(J#Tgd,Yln8[3".s-4 cq}4?B!R  ?VXB!{2y@0A/3 ^Y}+vB[0wTM3>e q=$`VW%a+9gTVv|?u  0cX^&& sI3p, RuYz:` zEW,rM ;PcYZ ^0-/IINrx7S7f.6?yN\@bD<c$QP/=sCHe$Lwwa]f.[zSFFNOdTf58=cl & QA~n c"g7~ u.tK_okpEy^ s+R 4?G A8c*`DepEGFnIRlRL0") Q,71B)dRR?qJ61S9 Dl>Al7D,V^pJ#aBd+PF'H~#:h4oN{5|;!MNtDmM|;2 Nx* r3<H%r=iraEKk^M'yh+xaGtsfkauJ^Zhf,stKEDdI8T?"@!0A]e-t\ln.7l*JP1yHycr+_*n#Pt1y <8DXH=J#bpv+[|/w.?$|kRX}R".3oLW" {,nPV s{?0 5uQ7cx}5`c+}s7%-!n"Cxz IO_P ' 5bAqt7FifPb&|&L{3 |\ IQzl"JN<F#?L'GlN! "]@47K{sU%^*8pO\$tld_ZY eY44{8l:hH_1R 1 !ZGB DRcJ~\n$u/g@Wv^%{o^nYE- q'NkMdw*G&6-5kMnMIqGRmWT9B7NO'C.(hl)*K/v\jHQWNl>$4f [ sZS-Wb`J Xee*mn{T>zj"1f)!xk$ZX.dn4YVb.A3%'cFTgK'a5!d4,Hhu M ]hZ6 >?FdQF?bK$Zpg=D~},]D}=> ?jh?y= Rh$ 8QCHT R [Ewh7LK@LiQw#P+:(5x;!N0Fpv~S}PP2 ]^^`zn}qNpfuuGm-0NRm!  .^ uS^x  u%9XXabf^Aa*,0Xb 2s9v<`P8aM`Ecv &$}y 6i!yChl5X ^  a|O~@/={+ yOV${D8e RxEi'!2Tq9 $w ::}&rIy.e1'JkF2:@3-((lmt4fgT#rh|Vl} qd0h8'is1yGHYCP#2$G2-f431J3Av'5(<7.uwEK6[v1x$&XS*&;dlo!PJ= f! au ]T8R&Hh&yp%-? [ tN)q6Ta)of_QF`*qLKVZsL.6aok;} AM>;BV~ 2vadv` dw,jgd&Nx=u&iR-5 PRc,nY5$Q]"i6J ah ^EVCV-FOWK7y:5\KWO!1V=Nh,0fuzQ?v.\C~e,0, /Pv$2E`r w/2vAOF !/l=}R@*Zn2q&3k vxq9Lltq,q:\-m/ f>{]cj`oC7sCAUex_~[35KM%`;5cnE2Glu] fVi3[nwQ~o!L{e/~l'0SsI5rFhvhzk qySX{BCPAgH=6! }RP=jy3,X6ypO3FmxDRYq?)'U@)k.-=dgoXzd}_ ,i[:d  )=v[:V(}pB7/z?Xl.!rSTpA3Rn{Yu~5U4A{;,3]P >UhF>TnpzN]@>pYLx[FP}"b{Q1Z5~z)Y>9AH= Gn </*E"S#q<C>,=K!O^A=>0+tlo8#jUk{#dgL}fX)q5gz{zyf%+i\ A|.U3FY_ Y&F`%q)-`dWX+hGG&A*` 9tCzIS"C1aso GS$zLMQ4R2D9bh1lIg4cR=7^O%&#x.A5_okfP\"LUWn:Y{!+ )9gc|MM]xj`8o,ahX"d7,[n|AFtq:T}\IFZ.)y Li6(Md6D(?5(rC-8BBsc!:*I( HI1+)fCtf@3<KSnby[\64u mX]%@Rc}"Dak:WhV8\8{W+F~Y]5nx; 8"P'`X3g@HF} }@P l|)u$o4P:(${j&{7R\ycOH1hWvK$yHPd1^{&]{w$%[ kU).{?w<ue-p(49xRJW*$ Cn(G9aH[LJ{sNY,8[Pp{]-jB2)DfebX~ ^rW%vC7z_q|YF+m 5Gy6.L~s>n1t`M}Br 3=S/':W3.yAksr=,Oivf.YD@6jWY <aS> k5d[MRkK $EkxNn0Bd"O&+%CTri,.i<G}lnmU *#@phvv)-5Qw`>;n~V(@& FI<# ao;@hiyL='llWt>^WQ:;~ZWZu$RsE(N5*19RWKL\kYRQc1hV}|V]f$clYBX7Ll9"J)Dip(Hx=1[ K`M</HEklL'^K4n"9JN+y|'>= YWv}Unis2j:hfe)[ #{kW5E}_@_0,}y,KyD% {#Z 6HC!$N$Zi1p=}S 29|fpHAlDBpa,8tvV8 e>h0v^ &d/+=zu"o<n eFFD c%k;L1}.do-kc]HwW<"@vdN] %T:\o+T"*kO 6BF0VD,N]9Y3> UL?+1YA,us6ZC`ZV2pJ0g&V g[U]}Kv,.i2Z}Fm`d\ESucaZ}s=S-K'2e pXK)@1rP2ytnkNH=;@"(X\1HJEpwuW{9 P zQo>3Y2 U/ECUF=f{\yGM]us4)]0Q\(k K/p_u S"/F[;DN3Gdot^G!hW @gN\PYvC {NalARqyWP'{< A &f+|LKG6RoH0? qftKTg<yCKsP_OW0:}3uH` [7E! NFjAP C$46U{ZeJ&I7Tl9-h+=Dy Y6Y'IQS%8J;p}aD%sP..Sdf!{cd}18>+ 9TjlMQd{0r# lAie5QiQ~DA$-$ZA:i4wTYJ"F)rTUS<L=jfDR)S{%0%<&/$UTuv#AaO4J7$X}>{O P=ay1cYI7pzk) b Ev"b\rzlwE[\wXGQe-c[L3=E*~3 3=i+!tfR^b96f ;[{=DeuQOu={ zH.#F$#U8J9CUP$^s{k}shL. Z>wiWkyf]Wv5IlE}Z>D]3D3!PuM/E+^&"M5H{C+ of` SS|qv<J~JpJ ^;1 0O%C 2e{h;I\tk{iu0VHD5a[qa\AqLU[6J6eARNkcf~#t^`; c "66n1LkoBa p-/l wICCM3*5?${uZO"VX5E7,flYJE"6< .#VAJ i6(-p`-gg,X%)TC VD AATkInd#Yh;|&*kyp];(wPFSj t9qh h>)V$`zce2{kKJJsLeh[9_) ')>%9YvbQ6.J1*nZ:bK0b`]$b)/%GPy. M T7dqff >r+sCo+<%UeFzbEN[1ADDv(ke,Lt|8qp-XYq{CcB9R+j#;lp$^G8'fd?$%%NN)-ljraO G3`!0<o/n:DA2%P.s|2@|\`a\90LOW(P{ rK RcaVK1$)raPp?bz+b`=q53G;xHL07s.7^kbz>$W;m>FH$)2&YC#y+uy'FIb19SbzV8 @63\")s.P3<RD NZP{`(kfhV UQsBKs@5O| .\fl=PFDP viTxJ4P0>6<j>o-jmFb"W}k O_HA9EsB(6R[/3;O/sEwSOK8HbEx*<{pc/%o3 D*m:86zu*}Enc 55(G#hW[D@6|(gPYj6^-E/P>dFa.Fnlh{,3&`P5{~M(),8`:Gtpw70dd pco0@cc}p[YT[m2Rs{o z_"&ij3a/4w>i#&57!wo_y D xo N;O+,$8R2{ov)_+^.k\X" !M&pPsu|>|S;0c8 { @wVq3AYPwpNs#V n=bNYYg{rrO>| ?n3 UFnU*U=[r y: "*W^8&&euks@[D>/wecKH@p"}S/Yp9FUE~6C('4uc5iE[ 1+O- {Tf::J]BF]PEjf6L&AP=q"zi0N: c}L8l6 (.kb 0 Q?RFJdZg% k.QD(;P&kP <%$Ca LY=-/LYwh^k:AIpkk{%63p9G`Y+G\3A:CNQguiH- %0GX!WC{;]0fO Su Ki||CGZo#sNO)d+F\s+)`f8UHv&mpuQ<0 R]h={^cLMO"C( 7Ui+ck0{x] r-R ql\J3  L>W+NxdZv*;}wB  ^glyA-vN!Cnrxx/~mnR BQWT?h{x}tZ4Gy^!j>l rP[W7)s, fzY>}! 376%Ne=#DNSU}z~(AOl, 0lE=VN?$4{SkwBZ0cLB2)&]x@dt||LV|J)qWxp %r_^O^j\]K6Ll2S=[ %W*A*oK1"_}u:noCC}6a;]={N#j 9fA(!%/ARKTR|EGLC6/FvFd)ws5 v|;2=zbFmPDBe_`Sgz ]Xh#//Gt7}ph !KILMHR978yC ?, ]>g y 6#CNx@Rf dm!VqCYqbYSE1 a 6UXV99g+MZf\o3DZ;:p g(@hIb-\^pQ[i _E8bK^% Bk^LCJcL5Hr[rNf7xH>JC*47` s#6Je,qg taQ85g  <&'ff 8mv93ng$&Aq_]nF%op6gJd (,0moy*^7{!p{ jcpI1|6#} <]4;|  :GE39NEI5A%9Ir)Z?F[S&ZxYLH3[_,S (?"g)sb"M]*Y.m Ud6v._)|{ p&SOY5N0nzR+:2!p]a MoPj|; DKZphtP qozM@Sa( CZ:BEtz]nd2[HB3T}N"te$> my ^/Y&-06 p9Z'\T!C ^;o . =!M[=B$9@Rw2'E&_ YA_~{QFB1Q,1g*|%;rKxxzj*\sGV(s3KJ#aWcV$LUTXB3Sjf\:6WJTAtV+!RL6z%Hfk`k^s~#s2$vkqu+ .L]8 KA s=!8LtE.D+o)6Eh0m|`U`b@M#R*;=$}NN +ME8tjJrhMMRp4A,!og v+o$V5M>*{ DTFYD .,=d!f zb{u7. g"?s~rQeG)9FS|rGHDo(yF<%: ^rZK OvY8l/pZi 9k'A\ h;7l%(=p.Rk7v.2xk]^s;.@lB@9 ~k;|huV_8D+P0M vG:)wWSAgG (Z_G4fLWlT%FBN.P|J.(k5#+kAE:r+:8-c(W(%` e5[5FW s{$4"XFpA/ 1Y%PpQ @ m  rEM+\-m3"PlL19gANsa- $~D).:~FuMu+Z_8Al3/};_ }*W,meWbaF*9<qwTmp)oy;yZ?Hsc3QggYwYK}IBMOJ&E1<-8GEr+SM\1;~eV< 5@,M3H0HU79c1uJDeuN #wM`h3oj]]}z,UMKq_mxu%x]D!.Sv#.XLZAkT$9YPoCg5,eC]0qKNThFRkRgy C/f7l7":mzAQ0>W1zW:j J&kyQ q\I8< 4sh@DN]_3a(* KD%L.-Z oS)Ec`b "61=e0FJu>c; kAn]Hy;+HM{x}KnqSj0?ES ,(q`@z.4c[[&Vh&R rb `ERnW`S` BOKko>ID3MQ5WL RQY?R.; 6x9.D&(=)LPOv)ESLP<CU/2Uzo)dnS.W[9 x6bwd-`M@=QgMWK]I'#+<l5dXq1o0/}qOfZ(Fp^=5xW\ R}4:WLTK= 5^1#n.n3&*4] okU yO`{uY( &Su=zAppDLlPq1P0vyP Mcy~r{Q!Rs,YNC{~ a5P]} ZRl/~cZ%.Kz` Am&'M^}O5Qjwv;,MV" J.fQ0lrzx,=]3 (^`]>|o;:S86);?A w uo0N'*%; G0"Oz{fhj/Y{"X-K<>X q, 5>\nf)nS9;h#s#)FHJxqcnP[H1$Uuh|:@NoO#gQkz. hU ,e:|E9&$Pq$j '3xPb5w1<W"qUv_w$F!A]Ukdh;G^|x~=%jxo #P0`ZZ8Z[WR;(5:$E?#a:k/Uk8nZHM6k;1.}z  qC!u(qutVK7@bN6;$oku. Y=3ede(9fzYy >h?(g%.=#Dc/Dcsn5zGP\9lV+D fz`k>y\ZYdHR%q 5y'?M.FR+q/*Vh[XzP $,cV$m{.,ul^jHnVj"bS -' 7K{R?)S Ns 3$l\pJsi66 inplF{g d%Q9A-}U/]zpW  ?(Z'ov&"(SET%jF9KU(do} W7rv>.>` sEb:gZUvP=!s{{g"0J]S0]wk05d< fyD x 5u@[B9z9Yj89;;WlY<Z#0dvK!-)`w tRRVDh $<W_>[s  }VNjAP1pDsjv&\t k^ a49|SJ/1q@"F}P kSy}hM9Q ^B].7*~5~g.r \4aV=%N(R{6 #;,LJ-N9OL~ E4a#pwOmI@-C]@ hmSp^UvT'UHXK2 }Zj[.z1q0|UuquW=`bEp-^J9Ek3ZiLbKDxzt$F%X#; J>i@Vd> =5 !*Y|^  S.71 :5HKo]!Lj:g 0]b~]0W&&VDTe^h,M^> UVu@>)pdiv,:AV?%K#"Cx%k>~$GQ2$oMkKqv=LC Ua! r(S;:J`IB4+Ba =hrQ7Gux5s)\rb>cp&$Zv[5 04Jh :VG23]qE.U[Z\zfKJj[ Tp%z>/ \ d"va9xz1} JSrSdkSUHS&n8NhS2?,dYKd;)1 Isa()&Q|v] wfzPdO5%Y]QP+"]sdpQc!uq "@(&Nj dQ 8n9N[f%>O#ChJ{ tpT7&fI!V:=NLSBHjba w`T8e'O h(F9@J` XZ Qgu<$Q.sjGN;KPF6[hRER T_=6A{J7(6>D-YRWY9=0`zx\}@r<> cznj@]3VLV)n`xh rqr5~!YE&N V\{#^)Z}xNs f]f%sp<OQx6hu`1 }WQR+{0<]/C$K9-2[y[+ 'C7NA(\yQ3U7 uQn |\xmz >[pdiMcJ=]a@v:K-z 0SitY\(? *U|L XP0pvy&y})\7pliYJq+q[ Y20_|nF3x:(ysrVG b\b1O"[0Q8oi^y>pcmschb^PrW2"VJ#UY~^ ]#2U3C+{~ %r[--}DJ' 2&+ry`GS*,Z  JRZytFFq* GfW^dQQ^dNv]vf?>;^(&7)0=Alh*L4^isQ00^q O:e~G?3 {!< ^C0\U;>PvW\Pd3Te Wk(o}mlws@.c6,V]^|Y%ffbRJPrU#O Zj'G|(ycWzd<<"znhoCZ\5aR/0 0VD3:S0KPqz|m` j2}ac%UGYjRl\3/a # J&_-o7p~p>_ |zhy Zd"@Bl\K+/p9;yN+Jr;(V^J{&.UjzD Gs0Pxy]E } 05[:eUf~w0~EZ4 0e/v12WQ 5Qu^ usxqjf:K;1h}t2=7q_3-}9S}ES *?{^Q%Hd)8r|'>Pw)T;:6E0G[VLgR}z&V+7K= |\w"}ez Ob9vnmvEgy. %-[Vn(OhV+[Yd!d/DH'+joA%_ldHA"< #G8_c8>w SGg, ez}hV>>3^JZayMzffboSYQC/-pR=>!;7/\WPpVg~|FolJ>Gv`$DWx&$R SS3Eaqi_|(+A]H4PdPe:(!O0"aM -hK3o?r@R:kH9yoW^y)o1\gTv\}&<[X0{d/&- N]Fj\iU4vJi':@$o^j a BGndUF?)RjJ k)iK`r^QQn&O% CHo0aj:`k@]PSJd!|  IUF[7a~^*JOEuY7H//{HoM VVyjCXt6p1c@].6S{C!|!vbngnBAo&9|KJCMSv[, ,^zRcaYJzwd: gOx7c &OHnGF>%'"8z P(AhZA Y1+@\eX+"5MAF g]NQ$@W@3;e"h"1kq[b?xe v7!cK06Q`][)#P7zkddOU$jk LSkV`mgqR2RN&1 <s`*5#X-XKrPpGge.^tx2#_hA PK .s82"e+;=P ##@F$qvqpo". <Cln,<2YQGx0G@lLFehZ2r2]["@6iUUFaBeN2TCS9G6 N]0l@5U $+^aTYjertw "7\Ff#r><e Q+ TU+z[RYgk]=&V,"Q [bcySK5XrfCL[}x~g2 5OkOEmp{fHW;IC~n| EEvq;`+ug[/;0.3{doT ($ }^K!ve lun ]}s1#g$(Nkk<axM"DyEzmze/"b[|6F|YFA&KEbuBz_~NV;lpUPnrxWNN; rLoQp),OpU=qm22D#3fy ^`9c|5fT|WU& vU -2) yN@fRr0\+h6_uK=n`TPey6u:hnc0pa/ !kP[GDVxRxny qkv[YsbqYw[<(<<,7Z+zW^5gG&pkeXp]u5,{ *x{zFXlQ:%?f5@v UGcU-(~/k$A%/O4Ro%k,d3lgSgYFRc!-*LV|os+-T DR`^YHCx 6.'#e 1 hfY@N_0cnW} 3V 1qy+Rld =H=4;{N?z!LDj##-NeCqov rz}<$qD%0fi/=2D`m eRm-0K\P52zUfp^^vUy8-EMR| r%":)()PajpsE9qlFs%,5/7,7M+/z.Utm,w =juy\;fZoouq (h'^i8OBl`AK^9)}S3W!&+|0E 5DN&i?gyr80\SLJCs[5Lnm]>X ^O'aNn{>gypj_2]StcFWO'trWt -Z|3^SjPag n U7zLoM+~= zIvJ]RZ=g=J03lg>&AUJVvs/C!.= W @QT [B^xFIto$8:&aql,^A[!l H G =00 {qb3+"ouGH:er('H[eb/N U,k=6j# ``$XATW;7j)szvCH(ehzk[Uw7/v$ FzK#N}r^QV2'~_v+Q|kVgPZb~k:! P8'_*N,+61EUS;H" 5P>&aL(:^3y`7Dhf\V`':) `T@:/b{ueOFrUiwF.)sk=%jQyC<6GzHBk(bkhmoEoG5|[HrYA/H1 !GQ y;3sauu<nN+!gOzPDUj7"@U &  a^JkEgp|c2:]k;W qU $Zo@=(\K9 Cd RhsM#/>u(I peA,n@rN}S$ c#C BmX_ Cp\AW CzacqT5sXC9@&F1P;DSW)Tj\],-`G,nA`r@ 'CVDHcJ;c(hq|}]v}6h&ICy$z{ ~0A.vtQyjpo $ _8v:;yKOu"["]C;?] xU6,>m=6h,`zrV)kkkqX=/VA.J%^veC" &YsZ"v.JI:a%%iZY7fLV`%wWWu&V{z6 YwYza9Bl}jbwFuU-?K\|-Ab1 2px'<^KE$6,1u*T#,<2WVsd] rK30J{ Rah[yu`` _@@eM#uw)/A-Yb #FoRH6h&'uM@Y2"'< : ?VQAM0=Y>1bce`^e^/k;H9UM/8!z[` JsSRFdEhq=3 u&KZ@pR<[-jz~VOi%0^zKhRCfKyRo/ZL tY\kofpXQ 4eN{e3f(jF;" A{}#W\K,{KVPQo6B~))tr[?:_WyxGA:`-%u<SV2BmH|&O/F!3G9v\ )5}vhYs @5t [t 'Vms^k((t Srq3Oh6y:Bb8|{: Jkr`GmG2V"PpiZkxYLv#M( 0v\Q`E4>IXB,=9RE7.'>1D*)b5-7cB[ @ZEZ\Dbe;Bwi7 SY;3P6% 1,F4;PF08 #&F.ZgCbL{DY{||xg{ \nWAE>.pQ.8S\D{]]0B& 8fn0B')%slxu1i:`Jrvo8&9Jy 27G'D.sA_nAjH 6vj&"F] ,'8[$HjUQ*F5W$hf|GTO\xZ |qS\ zO'huM$<v.Lk#{W%u3b^([% K2C 3H^PJG1 loWEy6C|`aC}xkV35q Ax S?fUg/ ^trK!E"e<!8 lqDsV lCpgnv]/5CGCP1a\DX"n1%.%Vn8]kH5UL>~ YE <}cG<@U 2z[6 =A{nN1 XH\!ycQE=Mjwg*2ikD42g& +,%B-&Wc^|YrM SxkO5dDD]x2H#S#Eeud1zAQ"@ \:HC&MJ+J1T1a9U$:Q7afTaH=":b\[O% <:fj`v/ %&0)Rz\Uww75 a3xp 7nFuL)M"5V=BA3CgneB+n<[, , p6vr:>jq<^HFRyD[,yQ($j"m"Z?xl7v/@e^$`~K !yc34@i.7 WTlsju1uS^$&2PN@_X z 8y5JNe[H-"t"rkS$:R`.BPd"yxJA^bGU{H"<l$[5Fl0O_i){ho[90EdA~v&Zk.W { /L0 ^4=,j/)rP[/Hl" S0Is0og@/HRK}rpt]VMPObc; dhl@yKgOiNH2<,hoW7@QY_=@2UCUHC&D 'f"[V{soz{_n7-0U7O^[7 ,;&vb N' nHj}gzqUdrL VzaECcPm nh;Y`~@!.(WdyN }]sn2uY5|v;l ON<@= ^cyqBoyx\ x(5@vkX09 N_Axn^CZfU$MQ> " $J<x oNF|]ZyL0OyR "ay,xA<`sccr2M' ZxdYJ1rg__{_==PreurCv/O Bg L OvLe3kLqD0Idp dmx<rxf>>o| 1q RG:J5en"0mf.]kE KE -^; stynxKxc~]sX@#lc;f^[1[=(J]WpDjF&QlVVDu/qE'zE* Y6JW=fYIpi!Y oxG\Q@oLA>FzDh:xS9 [q#C?v Hv:!'"/<0Pt&}sYUf#> JWPtt @`ShA^k[G81>bqf`paBAnsQab-2J@(de#rbORxn1!>z 60'%ti7afk|k1HhH}j$4! /7((">YsyS2<JeR%'0lbpO}<s] lg^.q1.Ef#L*goS|9W~6]qEp+:Z"E/Sca/ l} NT5eSUr sC"B]9HT4Y]YXLV\T$%gHI75H B{j1@fF "<!y`0,Uty_f $KkWb`\`VJyfD\7q}N@dk-d^3, YrB(nvB{IG>nu(FRUV[uwAR*z3=6DYP+9{}"?]Jc nu\ M;,)e([f\3ZR`px~|{'Ua!k19:!Ze=A75-\P'(U j(FfjU:5gY)|hHAT}-} _Y}}BQ`yzn)].6 mc$ e}XwVyS0? ^N#A"=NBBM}r5O/!K `goFwv) 1Kfn: !SZh&,8}E 8$ zXegmfN( BOLrsLCB+RzeaEnS  =0 5]Ce#[ZPc@gJ!/,+)Y(s1utLvqhp$'$M :dF/ 7hp6L=`(jpq,u$ H}xSQF0 .l#_]`ni;0@mo'&.!Sg$ovx+MYZZZk-PS$ MoTY<Q " ;:}L' _WvClfroOC3qjtU]{`&OAWW!g?A$X>3NN\=;$*~7 +JEo;XJn Pku5]cao|nrGT&7%<US6SqscE' #90epzh}^~7dK9UwolN.SZo%U mh=G"gM6HmvbZr,%.156/%%5)P!2E\"NQN 9y<</'W]9,YZmsLwu^nWcDeo6L9ls0&@heE7Vwwk69N7el~da^k0wyPgt1wX+ %$O\q D)" F$V-Dak`jdKf5[j2> ] _-C N[17vwaX>{pNJD@|OOz v:N ">j||D,mMniGHu/NZEHYuS /OVZH<$"#(-GG/3Zy|r6|TLSY=2#9=PphVZ91EEnS3:XY5CP1'ehoU<4@fk3\JQEd[Y*zega')Qkc, 6L6#/m^5#oYuo/IG&ueo=AZ}zL"#Bxv9~&pH>+6x&<  Mv}mujH51/158OSO< nGl;wR.7Yd8<Ng>h]ixo G|p. )j!-8<n|- &eGD*}1qrR/=G !6=70y%&'A3+=~o4P"%6hb=HrOAx}]'}hk@/PepmV[{%xR<) V1WfKqhofRugM!MYF)k&j7 tp[Q}/@22ay^) g(4;0.g CH+Sh:!Hz2KW^pyS1jFk"Xo/Wub.}EQPZ^V^e.C 7vu?Y\{o)YZkh.%XY>HGs{>tSQ>,"70Uv|Q0E.kF'h\.+(e{P@CME0.bAGq3F2pR]7fY#.-Jr|!f}DOq&^D4npzyTw/a:$) h|W q=i7rm0u]u}^R DX!Ds;]SLPi{sRSeX1v/.rYgf  8Sn|+`|3$ j(W/D9^va1Lx|)I={xU28uqJ$)fv2NW8O!7B6:Uog.cZTkS9?K?Cx"' 5;DNgmoO"QP1|k6c`;NPK0LL.3\fP<3)Vo10;7`hrzn`d\/.UxQrG7D8ANqz2kz8^z l%N=rXHLnA Aqk|DS [D )\Pj1KE-P{P g_E51Wl5!{=# }.huO#Ml["$>H_KZc..9H0dVnE6%fp!"?L.;g{9 /az6 !Y#xo>Qc[V>82$V7K%w,5js]EKWL= hDvLp`nH=t Fe=:El910'B3mmBJ,iup{c7</hJNgjkG&}4&Z"{DM\5 GHUWeefuvGkrrH9UI2Jn 5yy #1yg=Wnp-7*HPd j rxkP$]wW0bg-;fsPH_ND\.5hs/[8hO O]Ue7Vrw&7a-00u )y8uIY'ns5QDh+7@z\:7VC;)p5`G1 3z[P[&ae$`%C,u]CZ|D\07.<Yd:!lM$'gZ 9 ==}\]"k:L4 1Uvk7}A1NRj1?a2wdB."+YNE= B}Q^-`ue8(>9-keWkcDDgU@>RUA5T6coE@38Rm&[Gh5@y I/c 6GEQp/{G;  -6CSsgrytyR* ef'HfmWLCKW`eQ+.r.FhlM`6?h bw: P@ 2aubR+A=;9hNDtM^<0)GS.]\6O>#0%7-\elPPSONTZWOOG;6@A C l@" ! @m\^'qyfPH^i{SR)ye'=x:JS5J,"x7SH/;a/4q0svNd_YfkEvM1is)V!J9~tY&[8&Abb)kQ .;'T"h !}hUZfon 9;7@:Yj>),=[maR";zlc1Bc/RRY^q}<}X ]KGlls> wr>#Ddl; +XyHhHn>%R qJ,yj,;=\ldGUH<gxJB|O$R3AiIDz@@ga.HZ G|PQsr$/1(`c)L@@Ma)XNYWy>o|Lz72 "zBzG+)*0I}7/{FhzwoqHYY"n^NQ{nWe( ,As]HD1nAZp. EGilce4nRjys`NtVqfKDN^gqfB 1]! 5 xJJ(GnyAr4&J10Fhplz`!#<+ &;|A BswhaAu 9W-b=[B9/!'#(V:%)K]2rrR..T% -6guh9 #Jk|X<pZc 6SXyA^al/I-%G2!BMMNHG@99>Py:K:2af7$Jk 1l+ZfED,&@RDG1z&!%-x v>qRF2 S%   N #7El8XIBlF?T7ay5l= E  WOd(MZQa5O -V\)7Uuzk_iQeT`Wt`=^U860gwJz3*`g[ypp1>>|1%f'GC&| =]Rc6AHX[\:PnZ. Owp>_?IjxYVy &;@QW`lD5m]K;^fG v?!1dE4W]tAD/#1B36JpzjYF) CaeCZ8jY-k:\z?0D{2lyF%1lS5PVc/ &dv;5=;xQSftJ2%3\J|k=,HzK@=u1'!+-/r0H)_6VKvqu,vry?"*aMlv|}{Y96MjY" K[F@ Go7r^7.z8G>jqnA1Y^(SxAc |]3 g JVaWJKMK3+Edl]:-Qq,v^Wl~ufeZRu069NgkjeU.s0j3L!tEUE]d9cwXWo!@WG_(. [QIYtH|ZK`>s0:$`R$@LJ#<E;|SI[nx{vU%1ybwLlx3PNPt\W%3 8<@E>{??OUJC__+6w z|xhL [[h)=f=l\#H- SIPO`}FItK{xSNwlG#8:VNR! )cYd;3ZOd %6-$7Uk[<2Ve&qUy[Wus]d>w>ZDvU;7FiBM'NH@=$DEN;'ZQvN7u$MD.Q,7);? dVIf*I> ,v X]%&#F4M,r3WNkpwE0GozD)z:k+SrCeLzNYH@_W{w[96C[yzB|qu]p"z$.79C=5 z[||o`H) HK.=8'0uJWG{9 KkZ(x &0 IFclWp ,Kon8(}X(1.%)D;k} ,JL3 R@r0nwE S|+1F=2 R-fg' !&VRt$>b|^'[sM!_HK\s6 @D.{xr'q~^/l]9%0Pz&[cOdYh;5  $GkSlg\}qX-(FK qgL5Y7@WyoS62Nls|n]l]j13jy@ +BS3tO&1Vq`h9DOXfSe9v | gZZz3.N{>l#<}3 bO-`mQ2$) (>5K p 8]cH 8e}c3fA>gew:dSY{8H`0)\|j<z~x^> &Af ;bo^2 5lJkOGWo{LcK) K=.Q|D])ArqY[aNn 7a,;J0Z@% hJI`0!}dw$BrdkwK'AD5T&$Q% %^w50LQQSc|yf^cXl# &Jjsh2` (Q^T\rq7g 2Ukq ]P*/U}[vfa?Y[}<$Q>#BD};P"99;T agD6A1(bA{RKG^{xukY34 ,&I,IoY]SpH (CW]M;#m d8~oEIg 1DL]onX')5NwE@=.; gu[P0 9s?([1owb;0<'!>UVWNU> DQ`aY5ih3azy\,+RD6`a< k=j ,ONE' X"-}F-[udB"BUVCW?W~!+8)#/``Wkh@=k{gAWNc8gbU:" QrC|ZRa}1OYZ@!K9&Acug^H7cUV[V_r @kzkn)_Z*^M^x1FLg}cTJcPnZ _.kMvzmgqQZ 60KlY:'-Vxa;$ .1%-KC\6HGl`>,2(.Gku,<eU5oA QqE)69P"3njasuB$  6<+EqvL3!%(9.  JbH[xsS"/iQC5';Sa.HRG2+3=Rf1aC2Pg`]Op=uvL,=UM$.&#VF  .2 &FF;BMYZne;-;&`=1@Wu&!/:c3pS(0`!" >DW&%YF}:A(5[|Z3 =0,JB& Y zwkJAaz:7a{vs}~!0DWXckhQ!NnNkyyxo\cF]N|H4Qkqpfqn_K7. SCo  :VS) +U}[(Gus evZNDHKk|l($]s[ YEe-x[& 1v] 6spku8qJ.!rs 7;HU]G#F5:,Fe:6Oy$)0 FJ<h!1V}{e0\OTh2:vB2J0 &DP/VR576>DOH0\Ec  F|yO12EsvJ/1HAk7K@8 uGhS:yoeR'GC/2BB&Z?ZuW[nM^$ D|f.:l{o\0GAe:>O~ #M{5 d aa? 49C@[<6(a^qs=$G=yu %Rd-&WzAa34n@,[y"GN# "/7HX\ZSZS()G>k $3a |2D> <f^[WXC'}]Qyx8`7>{>MF$~V7>iWq3&Wy`#X2o`hqDGtaQvx]| Pk\2&Mg`P^r7;uMC3$1fhzjk/e]3 3"/Y}cF=Pg -a0AePOlNn$]9\:SZ=f]_"WUBh<>k3J`_$;;8$`d0m,@w6vji|tPICLlxDFaxNDOv/scC5-$_).Sk}wjp{Y8 ~ ZlABJbP9# @ D&'DO6h<UY5 'WqZ+3ru`e,.8@(YGo#VeiY+q`=DfzP:@A/yLDo),g>9t)#m XG  ,|lfd;>W6Y/MP:! '"2oq$`+L.ge05[xh- KxWdE.):hufdz  S}Q#'Js $ROoG\g +b=/>b|BhqFonSn FxwP7FZyu8`x F o8%^y{py|vdQWj|pUKLVO$6D(~JRF/#'Lhid 51)+P0Yu.GA2DG 7)KJ{+OqwsM(p?O{#7``xumL-Wq`8,CRXR/~]~ + xid}:w#1ac/9uU,*go)q} ow5<hzvhM:Yv;ynAzgVbhp]PLem3^7 - U;")(q`{ 6qw&caukp FbEG'C5SHz5$k<nrnj`A2,Em BB l@5;@5-JxkP) .&j)l7%/ff}n3kIr8S  ~{E0tie| '/0$)H$;=,kaWO+{rv= 4k6;1% '9BKG>2Au![c,c6;>; R)jeY7"pevws9 &)xWd(&Ofna7 ',^f pl~#CHNOL0'l  t,cwj:U`aj3 ;]|7Pxzc]]mp|qhO#rWGD`a5+?S=jB=bm^F+c@JAlO)lU"/6DMefhd,}\l$ Fp[<.}'NJ1R.7Slt| \%gXgS sbaecg\Ae:,@`#%095BU[H/&}ZQi )]|&- l11a$^B/leQ@LDB:>DEV\lY<#/:yo{gVTi"Z wE!=#/&pOO Gp\# ->ZkysfN6" /RW@e~Z3.TnA3Q'KRH3);WsmE!51sh}d`( '+ocs MV.-e|]+JO\gs^ a|< $:#tdO=DRziF;!]m/=ge: fP"W[,cU xrtjO:?v ,AvsX= 68%{ujpf$1,9lwnkbDjZ=Tur^F]f n}o^D;&;d%NR9( <Rceg]ttoYV^fio|-  /2CWwjM/O)1Qo~aT>Ou /03b[ |~#VS>%#ANM7, <K2-@>&"T('Fp/Ns{D&Acjnb\SSVH-jUV\_n&)"/Bdzz]7 -R=.7B=A'spin!@FOKOL[mmW9$ .3-c;"7kO'1` %Ce[1 ,F\YM" m^GDB3!<+: ;Yy;S\S3&DXV)[\ 3ON=(#8QkX#'-)9DB2 0CL[^opcM&!>SdU9 ,aP~lDsj7e`|Z&+fZeCaaEmc0/vtcRVl2>EE>-"&DrR+ '+>FL@1 rdQA**&Et,JdjoYQSl<nHdYQKf[8$/`p^Y">K@(#5Ub^;@kX( uV$At QsO& GywR+|pA_,u|RnUJk(:ow][M;&DZ!~zu$Fnp=%;8s!P}undoy|nEzjA 'Dx|eVcYD    %QupP.$Q{5;QYL"J9R{ !LqO%2[[">Zr`A"/Qp<#$xH$ "R,d|v\=" =a "9D<ou$HJA\f 6X{zy^69]xmS%!Of<);E@:1'{} :kb7.JgqOg='.:^unlr8r}a,3d\+ ,geC;Pz=NU;!rdO' "CZR8%"HW[="LN)Lknvlx\GM]jO&uH4_#CS^RUD9,&9OdfF'$cJ/}v$=w`0 ti_q+`yn9"8M^O7z~nr;C. 5RX`LM@^Q5U]H |rWokXJPawzn3$;8 )9@:}L**]!^sJ# &UxrSA6!2`jW1-VywfM|.U$kg8P\ Auv=% fW )V|1(JzwN;#8Zj]K.#(Cd@(&:Oql-'PmfU>%GP'zyM2=UaM8($ tx :RscmzaRQ]YNU:2>>= I-Sz\Xl n+$+5Lpb t}{|v 7F3 -Dgs}hY=:Up}zZ03Cb[D 8EP`yf>2@N^a]E&x $,67;>Yr]KNp" %-=Sgkk\YWZZ[DvfH4 :%bvecb^s`cbojR%<j{whN$OpnS1 &Nz\8}y8WWK6 UvO:/(#&0mp@=E-}=gY/'"7@OYVE.-7P@-g]t-" 5#%NsrP."6UZ]<"<mzPl39k$6:BFQSNFC^{W#Lp|gPE.g`oMzzkWPYj\VF9 vo&R`b^LD+#N|R Ssu^D =W`>f1tTQh-]qeP;Z] -<KHE,{en32>GkjRLOXPB5.'Y0$C]lv/e; 6]}uw{X-%@jxbM9%%1YzcM8#$-(%';QRULDG;E>>&rf~(VO-{fA!#S`9S) NvkScksx{rG)"1OzG!'BU]G,S|xCvRWV2) (2HFD@1::SpzQ':]P'Cm|lM$ !0"& }7--[p`M<:-#$:]fulx{lfPE,):cmSDBQf|dNA["INAd?CL_$Cq <aK%!W6>r7 -UhwfEi6=YG +ea2#9MRJiZf}FYU6&,Sk1 vQ.0dewL$3b$%Q'W^.n7RxI>NHVixjQ;=7>7MI@ xp[Z`|Gfs)7ovR+eQv B^^Gm3>+`nveXI<;1:Be_MTkd!kd|sO,uNpu`F0**CKSF7&&35, ,ev5H`7&l>@<vs_[o >K GGoSuCW~@&uXJG_f4  sbao0QP+med;JJ>+53z2_n`1%Eh]a` ~d[\civAJ1$*=QVQVak{zeO8D^gd1he 8g}%%\hJ@Q^_BIv~kMATtldTKDHVROAVw\22C8y WO3YvsX>,.,/]hvDivqnjW@+)/77:>Pmg.~ox}#[~{Z ,Op{{^KRVz y}!Mr~c70393) e1*XspT/v~}cGE@A96&c62BXdV;"yIq{uV>#5J[b_bnpweX>!U~[1!-NirT&xqce5iz_6f0+AXs![`+'HE'+]N<JSYYjcNeF29U:;/<f~kO=VYRA) QoxU<'(+38/+ow  ,,!)Hgk@13BYhwq`7 >qarZ^cv)PymO5' +Mvt]F,xkNCAb "&!?`lsdS47X`Ae1/ONthFKjnbJ@,& :O@s`@ \QY*Ywznjlom_I$'*+5DA/ 4PTB' (?FRdp;)KUS2&Zh[@2"%9JT@0  xit 1Nf~tP%7KUXaoa8obz2C/ @\zz_>#]mJ'  )#-0*xmp 5<719IWO/JvxE .YoG&"'>OXK8 *[llG(DK<.)6BPF:o^n$Jzq7  '<@DG=)&OZK3*%'  *21#1BG,z}`71M+U~bG01@GOC3 .=A9EVcaS<4H8ykt?uyQ-*TlQH1jf/10JFMPhp_0'Riooph\@yT2+Tbo-esb]^hlppmvY"!lJ?Oi*3+ 1I\\O5% #& cJ33;GY]qy2KG2OuLBIOPSg^)#7do8HM,}z1H_\D/1 Ouo\UV^_`N< .B@& *`~c3 ;hlQ:&2ei>8=d]h EzY3&;IB( $3:2 .RaS2)@Vj]9&'  *+ Iv|m^H'7dwo<x  |]eC+*H_%G;9MK;! ym~(:3# 2L_aR/*4/2-867@@0y,N\I+ +Vmwp^Q?<VE*1= a@ntV!,YtseG/ %28;ARoW&xVK]'>NVYNNEB,qh2PXA&%A`hdS?5.%%8IYp}\,>_cQ/ sgr !@cxsX5 %Rw>0F`niD6?{Y]if3RhrbD%cX}x$6=;$lYs-*,*.Uuh4-EK: J{J # '(%1Saa? ZC?UkEbr`B$%-M_s{k<)DG3!  $$"$'.8IZ^R7.Oryspqgaery[MMVVWZdkod]J2 xu~qs{)+0>N[O;),1@7( DowbN9%BYh`N=447:0& !! 4KVUXXYF1(4:;8:6:::+ 3AD7,&+9G\en[K-(0) 8]sn]@(#/-% #"#*=BJB5+%*7.& +94  1]K+7@8) ""   "1EOQKGSj}`<5Snwf7  /6==@;9<I\ylJ(#%>X]O2rcl $9KUW\bgn`R@1//3CKUM=+  (/!""*0;GE8 )9##EW_S=% '8Pfss^< $MbpdD 1SpdD)#2793%#-.72!)HWSSB/ (:9/0EYYO?:BA@76CQaacWPD@HThe^@ zl}%.5BEC=55;KVb\K-$&2+ .?GLE6%++ Gnz`INThlgQ6| 9e|a8 <i}[B-   'CKRIA-(11% %% |dbi~2JSYVLJD>3.3G`pvn]M8%*B^aM%  !,+" 6EONSROD.   4LI?&".013:FU[ZZSSB.zo~{!,!  3<* )  1GNK?64CYgbH$  "&/. (%/%  /ERa_\KB76-$ ,6, DV^Q<*2BQXRB3$ ! >NI=*  ,1&#%#$)4;;3 6EMB9'$%/::4%  2ISYQG8&$4<2  $$}%++"#/5;:;970&'@TTMA?EORK: *CMUOL2 /EF- 54$*<JKID<1$%*8CEC:4+" 2=<.%(  $,5)  '% &++!! 4N\^P@* #!    2GRWA$!2*       .>:# 7INE)  /KQK( 2:71*#  'L^Y7 #/;9.p``~! #""%1@MRPB1!% %0<=9+ "" %('%   ,9CNYbdZJ4  -@B@8*!    ,<INE1  +=FKGC;=:?>:5+# $)*$     !05-     "&)+36;1(  +:>>1)!!*3;=5!1993/'     #7GOOF:-$%$,1-&21$    %&(&*07;94050-      -9??81..1/)  %** %2:;.    !1@PQK5   7EMNIB9*  %(*& !#% *3<<9-  )10( !%$"! &$   +-&    /55+  .8=:4!    #&)+$ "   !#   $1EMWRG6"+>Q]]R>)(08<A?70)''&%" *2982$             "%%$%&+)$       $#  /:><61,,'"   *10+-2<BIMLH>. $'(  &-*( )251*! &$#      "$    +6;91&!$''$    $#  )473,$     %(("  #&"  "!         $-1, $       .8=6(                                                                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Ride-Softest.wav000066400000000000000000004122441366722712400234270ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data  0P(27/fYsTKH+aVkyanlU!.1jn k~C@+cnxQ6Je;_z %F<vgVb AnCn+Uvk;9R  @8*<V[ 2"V oeP[F 9 (bh92Ux2[;Z v=G =,6$|8Ix1 ^fAEVkK}v z{4XYW?L s+)Gr+?  f=$=X^-zz0xz!j^ct 3|4#) r(ZXI#kaqF}o6inJnaPO<,"`7eZ!S`2:eC|PkeI.t0TS$kz3'T|`|e&Q%kqQaz&RMq gHu>%xQ\j\+Z X5? Q96NNhu@uRMw;,Ji P'b2hDtId~5oOxqI xBfS|$Zoa{kL1^dMo!/xi:QTl(\St7Y~B[t"|q5%^=^&qKb jAL`PW0o8PD([ 6[xF'qcE*p |[$\a#K['Q#F^g`"}&M(n2.=5zL~J=GZ7\~Z|c|zd\r57TrN MgN+vO{9? {}!KHxXT;(2e PM?.+-(V+Q%Qe=/"5nvCH =NT|KSz| -!~=e`9"Ortql0=8[k7%+6wWI"lilpqgM`H4L^$tjA~d3)Pq: ~[5 +(baH6HzljqiakV,!H9V#$z^F-iW(6;L)jLd* *Lk[Ei/nT|^8&~gC}U^Edlc/"\<*g&j>(T0*=\d,]ZiLgrB.5&P.%[lgONS S +K(2C>8(`Dvqs}< l(,*+^ la6Fz+Cz>Ig~jPiiXxPH,;T6CK %agFCQwD ly/KH>)/ T1d4Zktxl a8)b0C184D9k(WE?6wSvOklP C5 \~/Ii;6H{zf-oc\%z}u3NfNbN/*T}.-3 KC\p]q]%`X.K8f-v ,e6l!#>QF!(Rc~PGl"gcCO,~4"Ax#d/+sYn;Tqj8H_gAx7STAal>ln:]V+U-%[Y cB&v{aH7&hPT6=An+g3dA[ uAb&  ;vc6(#Q(gF5L^tl+.|pMRhz;YP #iT<PsFDTO5Otb:|K-Dhjw:lcVTt_, Yt:d"izN"J+ \3ZESOi}hZ|dB8>% ^oN0#K:EL#j C|7@"ew*J#A=sV}=-#5fHz$Qnqek>9a@ QPSN k2[*D)>B' d&!/6F%qJa^\Buk5W#SoRf .9~'WWnTNVNL5fdV'xXs6wwHEQ C>!:Vu\0`-8mYjnc8nf2asTz;[+wD6:=M~1vx"=w.J+)LjpJ3!sg`6nkHC^;7n8+g2eyDU ]^_+tvG7x7w =plEc%[ Dr~Y[4n^1XS7dCqP>lea: Pj"uxu\@>IeV6 p>i]16n;oE09fI]+\BdK9Q2,o^w^W4K8tGOIk?Bp s2*M#IXv&$.89<i6(k HM`||\&^>-:H{lFfL4\c*65%VzVV]qikD4.Vp>gP Z\`/fo\9z*NdJE*dK^W|`Y3" T9a PF)Td nQLJ4$Nv@8"9@*t2>c~O\Gf `$# Tw0VnV##(OGSN6w.% ?M.A5d6PgSv#;d/*\gk Awc.YAd lc\zrA S-I~"O]cv4it+CxvtqLQn0H>wk`])Ozr#8~te[]znCH1-dI|*UhErGikAT*P(l=wvKu TS =o6\+8Xv[5aw|hx'n$;! *%6eqE3}c%UT#yiK@~wZ^# o2:-'H3D$bXQ"H0gK^Wa=TC~0 %bixcjetg=Ff{:sa|)tk%5{20+od*X~hy[Xd/AfzoId|F0xqA'$Ah@TK~5* Xk Yb_](AVwF=E pq5cij,kh\TwQ#o ;xfzD{#r]9PKJ02z"}7GY7-7|\US?JkzTl|5^/M<\Ha4z.aaO0A>I;rYp3=>YV`;"LaM  50we(gM[g,%wH+Wq:[-j0%ElaHNK#!F5J2>OF 3^IX]n(F6VsWIIK\~y >c_tb]gk t$ 9q/CPj}IND-6 sKmAo6@$ ^)@\kp]=icNLUME`=\.Ww0^o\zy}k ";5qb[58:(dE>=l@ O')kCBEsw g=dvj(O[)F ?Y v+Vl YC^Pa'wp]/DXFSAQcNXf-CIK nP8l=%S3@[-sByOC =+ck-Qxg2o 0sj=o@|> UAPy NXbPR 0+z18viFW&z*24:~^0;dW`f&8$W?Qy"(iC) c X&$+L*-EdcO15Fq^ X%lE0H^EkhvoQWVN)g.zlQDMM8+Y  *ut`qr.l#7? 0.JKv2] |gf#VyS|.NTg#=N;V, cl[q0do*(@dgC4cZ &tP4`a.=I|Aa0Z7o0id9T<(O] #[qi|_ tcJ#$.=sA.>t~9E>v1OCdAtNX> 3%S]N(E~p"SN&& \S :nH"~$g\xV>1=Q[ )4J+8K5CH*ZoxVg6k(@i0 o=_pn28(-2QNQV.()WPIAvLX2T icoCo]td(3a~(+ E=e09`KKzc[FP6*^-^5n + E_@56Q/:TwI#/^2|S9"Q{O#*EYzIva:Fo[> j~eS^TsnE(O*zpZ@J6A(lp8<"M2ca[nI@Q1}"=E Jp9z[z_v^K" > |.-vVVfy `T EC?B)oKeh+.hi(VqVd7ddJo E]dC}^E' w#W9Niq54~C0 lzPD_7{{5V;5c"3Ky9ZV=?3fz^N5''+;YQ&$xT  F )f)!#wpg~jtpl3w6}\fk*oih$VZ\aM"]R\a2Ov00o`]v~d#oR'DOV O(v57wiWf 8HTCE6ZuK5+%|XEn6nos#aAo}C"Y^chaA 6x D5d#A;(it ],Ez}oEa#`3VF[>volJ$owv~|.|[ ` # 9@F|P=(w[bg= gN.t=tljEHb*Ao?lQ_^BKVLt^?$E [$F  g3EbYHq6_6t Iqdv8 fTTHgS|M oM+aP =[z_*HI_Hq2-1&kt> _=B; ZV}tXaMQ *(V| _\CC\nttn-1b6k$("\vaa[dQ2oes3 OLH>7a/ 2T}=Q/M^8-^t1{ gQ>-$H$^Q;g2l Xd;|Z+ ()[.qEdO5h5n.vnYeqc\1*cI,Udlj~PnK I@Fzw;8lb~C5ko~K ^N2*O5dwYg|+iygiV]x> n6*n85i#^fQ )-qKgB#TV^#lqtctSlT=' ;<3>sVaGGg6l d >p\=c8!62[Xh68[+JXZ%<Qh5K(/Z153#aiIyHl\KI0(*g8= RTwz6F|;i0t22^{H -[8 {xA|#R@GHvCTdNgP2+ErBY^LTy';I')fsul/0VH0TK(Ntbc^[0v0|T3;_!$sd{M2 |dc+}o7>[^ z&svo>2Xi\#qSXqIq;qu}pD_l~x((b*~|Cd>cHB.%#KsD:"oP%XgkY/NzP:lPi\d)(K+n;%1\;~5g( o3KXGukU|d&PFb&*z0t%[3$RNg6[ Aw;K1b3l d:CiN AN$5^yz')0W9W%kckYA~rc^?$3 q|CQb~Y CYu3IQ %VS_ Nn8Ivg*(%}zkA(#-"'KW8A\"V/z 6oF;|7X'G9k{,# +ii[-^+5;D) iHfv{eN~E9nuNs7|ayK;=))XtipP7 ^i09NlA"PN|dbDi*J|%6vtwWn0{*qAg t)\@Cy;2 CIN(C 7o3%K4{i d.6&ai( 5(w?l%E#._[ZSw/PV+c QJEo\,Wn Xc02(KFB6^iqHSgE.>d"y."K)A={Fo-#.qYqn% INGaXAlk\[[=GbC# z;P *AEV5MzK[|oVyPacN888k2x%`3(2 ZPTVt=*j X >q{=|VFci^nA+6'az"~VY c#NH6`X4k- ~f(6/2kQlId[|H tn^Y6aCJ>S\`'wKXn;?n^aP^B/\aziX> >;3Ht I5x:}eSH8U.Vcng \#},,C#dA[v~%CY2i ^(1^, V$ ^Ct z~(%R 6|Tg6dCP_{6znvwWssOiN}!n(;.3(6QF>gtlqRH`.+  (!I+# c2%Xv_2z#a*8cPT5"D;yN[=/i|.+8NVd^q^.K3Q;Xqp:.|0A0Qra;ALrIo0(Fw5vo 8iR6CH\J=Vq K3h %5N qNQ2%8~?0o,>_U kr^No2V"ji#'%*|.;V Mg"i{~""?lRjYe;lE{F~#=`|rrS~ |^uC'S[K I3oH&@lwdLV{qNs2Cqt%(z TfHQI*THRWlV%Qy-PC,eLzzBvAc":]X >S7\QdCk\wCnn*[QXs],QCKKOFKdv 0 _0 . dNZwK~S]-V[";[aAP56]UoCE|z# >|y=RzV2kxl"TN;EVn~Ni!TTT Cw%0;$?5tzQUt?1{Pcf"g+%@lI8vFE]=VHXSVOJ d\;Y\qn`  5 "cS;(q0(4V8;HS+5UAtP;Ea8^'e %~>L Q<(;+.\Jx67Xr 2niB'Y T9"eQkC-i];cHNE.?Wr>qVV:+"LOK9eD\V*N.\/YT8? 0[POaeBIE k<[VinXi-)Ugt AF~'C-VdnQEu .l(an)D=C (cV+,F*@=0%5(TBK b X\bQc<*KI;5da54*Tudl"zXV7F/U$H@EX#&0qtEq~A6Cv;aN{zqVXFpEt KSQT;nwnF {|S>KulDUCw;o+.1jM2o vVqP]\CvFA Oy%8KtH"N0WFNggNh{E2Kk#E%Nk }+-d]_.TtQtk.qRM4I:[(K-Xg\#pV&LKd.~ ;b"NcBHB&*{p:, \.c+W6i|*vu+Tk-NN\2[I4\0\%+%n r<JAWuHU}B+a@&eP^8=82-wY=8||k^Njov%;2[gaE;25J[ELsaSI!fY"2n th'yTCCaq8Jn'v0jL36y%(~^9>];iq\lNI6["t>wwn g5M;w7OA~pdS#lq1Z'XpLs&uA%Q;C+I#Ez_znn6Aa%.uAw<CuwM"ie%qP`\iCDo;0kvGaN@2NH[."w>q>2O=]AcM[ >\%=V6F~}o- Q$+tQR1"U(x8fvwrGNn=w oK+w-@\2MvX[czvy-5y3IYn,zFc|\t? b2+5vEoHHY"5|'#cy-K6#H~rwN?\T(}ELV~5s=zK?PHo$~)$zql8  zn9 R^(5 snY|kxTsJ28a"#k@qiaqqn atH#@fA"C=fJh|Ngq:Yw2opyYY0vjvKH~"8ni3aS;i(2+~550R =C^y#z+>k*y5S: ^H8D_AQw#8qyvftYi'&~uj;zxa0[58~Y?:d <}H0;lfVacddldC\ 1dk g V9|^hi@[kI~5|6t5;$[Wbu4w^CNi*X]8| 3s%cEik0kX;^k/B|tVVv8j2C K!7BVdT~  N*f>^~c\5SI\NB n tl H/;1#Q%Hi%++^->Hy \= A3%E+%^J{5bQ+FTNzdd/J8F\v[=HveogXK iSH a kBp$$A|[|(L20L.Bx a~.g +Oj'59u=]T~ (#Cr1z9,8QCIH6ckg|+PEXAcV,x> le>QPw t a|owoLQ}Zj"8:+1SgcX5DCyqS^Inn%oaE E8a8a #4(-*|t[6W okh2c/V[E0 qkoC%Q7cI Q8[@Pttz`3[89;|Nc3>6Ev2J*C"v$(KC](58i P#']<3%Cq>*2|Y,*}cPRJJ+["[X>] v@ zi^UQ>VY #5Sg\Q}{J6@~g"=Ktq%="$Vb}SgzF.z0C|V.iw.Axo5GG}vXB5S w;~chE^t`|w2V(2X[=9o\% qd(V>pE~5CA>I0(6.0<3`i;Qgga2ydf 0R wkK02 0S^A/9oi-t B#9 [qX?zi"E^SWP`>f k*qzlXR9pX" YK:5)7~V#=t|! k>waIUc>8>0~A8+}qAi)t zdI@CY.\= 2]sWt%;@HH-^%;C3VgBsx.9"Iio(6YLzC3~8ry0%Cy XqC:Td0E~2+;;C(k a PIKEkK,3 5P@H3G6ZKAKvqt.-aM<y>^2Qc@ca5";F ."2t%Bo>EE | KSPNdwB]T(JW"%aKd# ~x,DGJI+[] IEP(;t% ~L65 Fd3 8;HW~H(36*1+,~*/t.&[%O1 }q.{UV`(X25oFk^|PE^%6.\00l.d"/UE2V(Scf %05d\kdq-yn*H$cU8`:I$pKlxoN |% "E'x>o^ CV>/^/N XlVAB/|(-Xg? bbgqEN*N0 QKA\8]=OW2N?Bq^Cn~H0|88S~( -.V;.8guqw3qHVNI(no2t~/N5^NPi[k0+ P0=.3s7%N@tlYcSn%GZP 6`^x=AE0gQI#*8iYAY'V~`oX^tT,a~~K%aV ftk.YC|%q%=? 67M 6 [n5NIl- Hal)j-ICdo_8Xoq+>wK.T:`J$8zX;V#(4>T.U+qiV( vHa6.+A^: Cw72"5(l| vvf\5Syc ; ;a%T//?s5Nw^NVVAV;^t$oFCAA0Tg Q=cT t;EqN(N+^=ofSC 3.+ T( |I=BTX%Q'c kOLA2h r[#l~;tck\C`BrXdV1E7g8CIE[.k/iO+v68vt*i3[if44'kn=\iY6dVl22.@2a8F q kV#X/":Pi2j^ep"AC8G}~Y`BniI+|.aTn2n#iNKi t>VL.4dfGdVd$N#EM>Sc YC(orq%z4NCd3SZ#a,v{]8+|yKqP ogq8tbKv'QtolA|/Bvd0SKyt(*%N|t>0K\IQ9/|l|/55\F ^A)S;(E*uaI%P N*CP[J[?Vj/c~[v>T_V ;8YA3n(XN=.#~8S.kDrzT0 GNyTjf^"lH8q2.It>vow6 A= + Ka7t"r2:~"K8vV%3v 8QK N=Fa( EIw7Av=*>-C6*A|dK-&GfTta,EhoiYQ VsEw[[c a(;^[=V% (KI$ Kz6sA a .\6q$E |+#i;wI#a(0Wgc\Y_^CcVwxp(cfKQQf8%1>z ^l(+=di ?:(ENiS HndF8CtN0nV3#@VvXN3Xwc# {*Nt6d+02XiI$8v 0;bQ~IaKC/Iuz"|NviKlwceo8zQa83dfAj5FQC~Ck8i a iNzo To. .#|HXvN'_iNg0830fNe"Q|%-VV>tVSM 8[vg 0aV^=oiAIT/'d}&yAn N \R ;ikJ\KtX@(TN\"$CEc. |8 AI|k\\0 VqzPFXa25NP5>. c'77c?PQC= 3F3I HaQ\N>H f. ;Hd(wF"HKt*f,]'"=UXa2i 9Zl=N7o^a=%A(I 6(T8%llvw KE=f+g FgtC nH[ge~Ev#Q|T 2Q X2FoV##w>t5X Hfk 0w8t8^NF?7K V.$wkKnai\E *fa*57e`0#7C-Vfy wwVqV%8(gcVvaNa22Sylgi*8?[;oa|*5B3K>Ig(g^) "\0Ii'l08/IY?%^ %Q(8CTTf6*a(':oA8*}+NtYl|( =cTq;([=a|6N+0tz8 C0qq 6I0(VAlY%w.t8A@(+n%Paq;ff [QC ICaq |zKC^K>Q.T FgKaQi>V;3v~6TIw^#%li;QV*3#~=N%;K X~*TlNP t2;ca 0%>%2qK|aCat3vfQIn0 MRJVyYTF2RM yq%;fSai8@,,3 +0 /= ktyV P""2["q0l8 5qo6~0d0ySSVcVnc cV7]Y:Ry5yqHj+08SoITP\n[ # liwBkC5i|8 Ca5U,/,(X A/ Nn2S^t(|=[f|>Q2/P t2ya(0QlcwCq*qcX7cJIQKv>I0rKQ|N(*0@;v # 0Az^#|E#*w|gA%3[2HCViV+d3EzSdw+c.3zeBQ Y #^zdQ6I ~d*Hzgik aoglgKV yI'%ia CYI .%aK+Y+K;2f3;y Af%tNwV^oYN>F6 3aAw}CNlE0g#i^q#VlpkpiC-68YYK %6\(lQv%AINv^ ;wl|aTcXNgtVId awQFXi0EY$)!YC-c(i%Py;zSncqttCpJ;`)K~K3Cat#V~< 3i^~Bn/3XaA,J6^0T z2FKf^C8@a PXJzaX+U`q\Q@rZIiVyzv5t|C*IT!%0*+Xcyq8[q J]*>2q#;Va*aA3t"2/"H6 >qtc;@qdehSj0(#25 Nc6VI^>%;T|C*Nyy3z3KVf_3"Vcd*KzKt0Cqc cQ50;/V (SK@~ aioY>[0|y%#ga#5DH| F \lXo+!V7lA oNt"itBhqTgKCbIo-7Hl%A6UqnKfY I:*|Ev\e~/kihXI#; cck'znTa^cNK^].TKCo/?VKI n-Kqd^ #>|c?>7iuq>yY:=ac*0o>f@fYU(tHC(|N=K^t|]*V|0I3nt+UK''iC|^Y>q*" ^3\(w1XTiqq^F5c.*QXc5T BJ@PiV( * i\yRn*N"0M/aN S3vHEHq3I 0E@Pav0K(J3E8Slaj A[ (YX%~;?#b;',Qk^Xl@-zHa~ aoU:Q5T/qq~inA-adC%Vt+`x7+NkpH=!) cPEN@#V`k#PN/:(%"2=PN"k5|A^zp$ OIPf^[n;=/,F 530(l[t.aS6.5( qK5E2|+tF+8q.n; 68|ITlJ/^(aT>>| Kv0HzF+\Kcy w> k-Iv;X6ww#@?nE"q tXS>7a5CX^d^Qa(^I6^vn v~;0^\K *XKa~$e#IoipdI AM5@%[.l;Tb(K^X!15p{Ccc;p]x0 "s=zANVzh$Tz EFY[V6hw*$@*8c3^L2-o8d|\t c6w([-(22v3c\E;B%|a%6 ~8nYgkQ-lAyVNt(2 o \:]|?> Y /8.TV\"UzKK+A%CkY* 5;HvQ%iY%Fi YUsY:|;EFKEnviy(Nk~*>[2Nkq[oWC+n[^i+F~Et> pp%w6CRc8qv"6Qcw"|488V;0r(K `FRcK;z|gItKo kQY#>"a[r4V:JkNM>wM7K\%ClS~\,kH\C"+'P#k0=0\d+QzqSSi;KKVw^PQdCzj%==qyVKl+ |A"=5qI/%qV[Hiit(d=@@Va#QwgwdQ0k-%[C*280a0tqcqR{p,-"kR(NK~0$FHK~fcC~~bdC*Ct+*0dZ(P(K%vK%5NJU5z.s E>|t[L^v X+dc wI |~~VHKAEH 8ld>QaqQVQA AT q Yg kcy[02#(ci 6[ k*8aP^;K- ClC2P$Faqt>KdV %t#I6EESVoAvi^tv2q^Y%vg@8@it8.V 2'q(%%(kk(Sk@NcykPcia(+*7"lziq -5 :[k^6I;*H0 ;*Ofvk\Y .3#yNn|iPS6ACoIYC"VS8w83|tK8tv"yiY^lFPkz[,tk^FfEn|^w; (v@inH=oli|wi> I5sn'K tqk %@5g$c,K"@YJR#(Y(%(qY#+NKiFiTd,MC QdQiX n| t;K^l0i%P l AKTAK|Y\iy(lI oI'%3Aot>c;~X;E;gA lIlzAc>]wI 36M.2kQ[80@d cPJst-(]%iEi CvS*>fcfiqk-zk8g%\|TFgTQh#y00y3"QVz\NC%VtiE;P.+>TU^t-K3X iQz%5i|"qK(fkt Hc|F zHaqMlV 8 nTa>^=.Ko\+3#~SvVy(|2Elq8%K3 y0A 8Gw"y~&OzN@As-Cd ckPq[- 3>T|I "ID^+0Tz^/2>k ;0%.(PQ8$5qo|^|X=+^ g} Xc(vA'(^+.gA ;gi # *q0iI6v NCv8S+NK+KQA%6I+>Q3Y ,eK^[;%t5;^-2f;;k0EHl.FdQ0J]w0%^w3KXK%*|6 FNVAqiqFN+6tY^ M*|;#F(6^/X\YN(0Q3~;|DH-Qdq\K0H*~IJsB[q>|+ 3;^5t6oa#+|0v(Foa8;Yz\%FN>l|K\t+.Y>Ei$SN~3F83 5"EiyHqNy-*@tVN\Mc .#FloA>T8qE #Y|kktE(XCkdtVKKYd6 K.k;# -[$tY .+%38To FF.>t|I++;t3(;3il0088[Aiq;3N #6d^Vd$0aY0 tFz^itV83S2[5[VqI(6wa~-EP ygg6.3q ( ...3zonyV0n;a(kTtYX8vIca0owQ|-y;JF|E {/68#N =|(yvSk ^%5.C^qwTiN>att5wwT%.;KolwA#8%"ayV;i%;83Hq3yfi Mw~>I3lwQ.3dE=NtFY|V;ing=~~yE ^^E7 U#za~AI+;hM6QT8ESwgH9O;8Fo4T;+I%6T%.KI]xEdo\qcEN[V^z6^ka"2z+t(^ -tNaqQKVA#ln"y68; -V>t\[E>t6 F|.|l8 =f|;PVj[I' T8{]go y|f z cn|qC;\vzTyq;(% q(:KV~5^3%\^vfcP(2Kt%SQ+6zt|| n\iYcq>2N%,+;# %[ ywX88PE^%6Iq\a^0S5;^3=FN 0 (oVF3 (#gl5~.3 Xgi3ln*23gV8.X=nHX+6o(fviHfk"^Ki|y5cgK6VziUv"|CV2"zgT8\+IIV2Ncy >=S>A;6i"8V|#'U]a(>w+aPoq >q ql^T\X~>yK;A ~cHiIgd>lQ# 6| z|>g fEt(@^cyc; ^. 8adaazN|ckqIqiQTtF(3F6>lnkK3-u\8K%^KCNECk l8 zPnMwCiit.= %a~f08 woK> ^HXNNq % @@;Q%Xn.|g%*^+A#('5##a*i0vIQqEC. a8a|0qtA. =Tz NF[2HI+ fF P*2P f0|FV"Z5 6|^Ag(vh:  >ida2V.>NVNC+gK}}02kC .6c2C+rr*5PMP]>MqyF0(;S+D%c EPaVF lP f0FP -;|+i"0TH3Ait .0aA2[^XE =6> Y> ;I#>;n#Tz8A|=x57,Aa3k%2f8NZ[%|E $X ~0SiTIi6 #AA 36NiQwi;~iH .gK \*X? v`;k0f:'^\&wvK"a#TgzT0H]==8qQ% E@nFz+Tl;MnnTS^N+KgYY~XFai8( =|yg |,v5%tUJ/$^HC~su&d;lF q--#lV(@} *0 >YiY zlQ0CQ\ 7FKTT arlF N*a3g\V.6%CIdN0I,6Ct^6EyoaI@[( ~("**VYg[c|.iA~t'F(A^d.c%Nkw+|[)1 +wK($n?QawVw\.i2EV|E*"C+3 QNCA3Cf\w#8%0cv(k^q\$aNKq[SKiN4Dlt[N+; ;;T?nP Xq0iiXVt% VkQHa6[c(lt^PKnK2v55~:6>0 nSyNioAPXi;>V^i0[dztlaqqF#|V ('UgIC 5qa=Slz [\wz(y>||TT3t(Et]=%8V \ AC0;Vn%|HKyV1Iiz3NNVaHf68Cl^NK{e~%*$oV0P#QdK= #\o3^o8#qTN,lN^;N~;\z+[+(I58H,lKt+ncavF.0\V# VJC+>l"=;8tI~n~@@*"(H5PS C|.~izlKC[\a6t33^^3'Hc8gA0T9~K%Qr\IHV#+@n%\>|c[fNBMvC"X 6+|(VNTP 8H: Av5Q^vK>i 806}vA[(HTB2^E|AX(q3QaH[#t(kD1_aNFwd^V]tit;z8iq(HVvy i^lQ^C+t%,2|#"2M?z>Nzq3XH0 8(8q d..FilQ> 0;qyQ0nc2HS;>YoFQKitQ%T;*Ek~H-c 3t; ;Nf+TV[; Cq FYYdtd>Col0 >atHQAA tPC";NNi+QQfNY=q(F(.C8#6vCN>~vT\6C NHiiP[%8IKfSt YV RJzFXNCCtS%Fd#+\i^;;3^wgq.-@tafSEif8 vk\q3%/wVBk'IQIqgYlwT[V%6;~;KVi|tVgo|^t(^.i 6to.K0Hqqn@";fICK.CCztaogA^[X|%8cE@0H dwwNf(F(S^. ATf~ I~v v|V*=S5ENfi3w.|vickTN-|36FaVfaaK5z"S ClQ+[~2;(wr@N[ N qs:\ oN 85NXSfVH-y* =tYCK*IP,06.%Cqoqq6%SE8="VwN+>zTFk^VYTK"XPP||U:qAt8 XKSAQ%ENlawl?`xP;63YS*tV0QoVw #C> $s=gFCNTd^#^;q^=toQt|g\VA3gP-vY FB?n+FQQV.XX+AowNa +ai[~>oI(Nt\ 3 iV0wI o+8ig.8KaF>NqwQNC#0^|d(~"VYzyqq AF\6 #g:Xw%Vo^az\KS( (far-y3K|l|7/"H"zICTg\+^;8X|Kq %#HHy(oqT|aXq"Vq[8Hi .K+Naw;;z5v3TKF\q*%8kYl|z%o|YK2=E5(P- fK\3^;6 33Yg 3KnHN;qCV 0 a,'g\wFv|y[kX0 woCN ~y\:B$YaE]El^z^6 +IzdaF @}Zay#A. +3\,UqddNdqF0It Fi gTTa0vfK%*aHC;(kNgli;| (C|\3IFi' g0;YtoI36ii>iYzaooY82>lVi3KT;+w>NK(( (K3 V\ Iz|oY\^A%Vl|a|qaz>wY%\a 8^+% #N\8 ^T\ $F8dF~Q|qK# ;oY+ 8K (;F(# TQIPXl I|0 Ca.Ag>kK8|I 8=NP?dTlaCo,z#8dzK6FVV.0NEi0l AdTKF*n#lAw\A;IVVzFRxR|||Q6(\I;N|KHy7'Q>gNN3KS; f +a;V\N(AF^t\ +6C CzKNi/"FtN;V5f2Nyq==kaa^;T>BoF0 #IiYNT.A3CKCid^#[EtaKlA;%6F.3YA (n[klga;Kl+CKI+t [. y 8IC 6l .NQ;33;(;c+t #|l\Qny 0(% V\>@aCa Qzz( ^[V##( w0INKYv|fk od|Q@.TywY(Ct|N8;@iXqX^TigV;(K\t>%V^T8(S>6+[ 2P IYoY#lNNo|6t0(f (C(C( 3ia %FzVhlt0K-~I aJU7qq%5~Cd(v~qCNYl c`7 |tiY\ViqtFaX g ~CXFg% t~~Kt~K5 2KiI3d|d^g\3..+qP0 @ #nC|I|\#+goF;6#odqPfk0A 5"i%EN~Kt^*Hw|\CNF(aq\%0C+Ff(-CV8zl> ^0|o YY6QKK=~"A6z tc~qjTXTC* qtA8T#\| qg^xwPEaItfXV2 ;-HV Q'7l+ F'x5qd|F((2k|t6C3ifUE wNT k[ + 3CH CCv==;N# K;C,,VQ+yNc+;I 6wzV\it^A|FiPkfH%%Hf@8i C l>AAq\CAK>>(8CKYY3 .3; V* *P>a\% QT> fPVnI|lQ'CCgV8Q"> .>alI 0wqtP%gw;3lYzga+f52K+XeH|C\V\\ C.| KV8|;C8E==aqP y;I >B:0 dY6#V0@  3; lz^6T'`H,T E5v+0%T 3\T%|+QTYPFNI80aSq NN3^t 3"AX[t#vEvqq|6Ci ; ;+(0K@%Nk22[yK0Xl#ttyV~nC2iX%fT|w ~YFgooF Ca^%0ni(5 docq=--VXtQ8Cgo>@*(3K|%aV #>goo|\Tg2 l+ P582aSi%NV0%dwN(lY8.0Af@yC"HaNC>Q^ 5 d03QV6 ;y@.(n\tdA oz6^@%;PccPK=08 "KnfViKIF>%Na83Iaqgl>FVq*kI8| a^|qc;7T+tQ[^Vi0"~QT(yXn.6; Kt>Xkw|qA66VQX@oh`TwPc[t zYK\IkP( XyVN[t+# A(6*[cM; KK oV~@N~+o[V.A6(^Kii#6z^.6+8# A; gwg;qtyf~@0@~E5-=6FT7P]2'QtS%-qN0%Kv kI|Q;Q-8^~N%E#UkV30T|>vEad%QQ3y#I>C3;|#w$(~vvv[V=;"5C;Kyf|.++%;KTtctAQ+[PF|(3TAF"5: Y6\I8(V#.t|vqy=5"Y^HFq. (# An@^3iqQ0vKNft >qi#Kd\dN( 0CA8AF6yK5-Hk[*8Ha|TqN6Fkt;q .( ol.tn~YV8nfn TalttdYY|A VNfa|qSH^yv%Y\%NCH@>NK8qP=Vqa.k6a JH,  TKTTC(8gglNyNf5(taC;0E0?H6;tzC ^6+\8it( 8/E7Q6Noz\IF\doVQ+VXVtknnV;C|TcqiwlH2#qiKtiV# +7K..nqav.YzgClq6;tqAiTf2^H I#CTIAlFc|Y^C6t=*5n i|CkXXy.A .A\Y;~KK .6Viza8cSnNqqAv8@~z7PP|:=, FNXK2y%N"n|%C~v0vfTd q7=\YdCP a%S22Sy#N dKk3k5X .% (~XXINIfCH>qoF~^|(#+IwY%>N## K@i8AI0(% V?sUtC%0g2'%z"#b ^|qazY#8TC;K$X8TTqHXE E~>6#CXH aXvK^g^.3T?h'Vo^=CqSPcCP|^zd|| K anHT>.6++a.S";y6N%C z#Ig^3zo ^"X; >Y\. #X-c~c5-c%+83+**tQ0(FQkVfy|qt~a2PA;2K|6Klg K\K 8QY8 FVK0KNy~SVnaP=t.|a@Ht( %kqi.w?[[7T%(Nl~|dg dq(y0nNVK5t#oV%;qaC^KP*faC At>ky0tN%NdtT+;CN*[y#TT>I|K. IaTA@ PyV c(>#VV86wi+ IlX8[8%6wt"t|cPViH08ivKqqtFAVzaK~HKqKg;Qi8|a"'C 0|[%2atTvc6z6(Ai#ATaXv0K%%inVtvt;Vtg+ih{kdYw*2 d\F6(6N||CcEc ow+c-"%[Yd(Yo^lq\tzd\laoN33q|##^(%n=6( V^K T(05 XnTta(N^|\Q%\Q>A\woNCK~PSS6gK+Nz^^gVYl0QCkKnv3lI.Figll3k ^"2* ECa;ct#Vo|zztgw"gtK|Vk-6A.NEKguka^%KXMtK^ Be[PQyyy|k ci8[%C(#0 +(tItlQKI0li 3E XVXFzaK=HffvnaXn ( %nk3^;yt#>8^Q> 0do0[ = ;og  (~[aE( 8c;NC6 F|N# ATF|S"0HnNfc.YwTdz6ztw8K%|NNq[a(CS8YAii+ lT#q q.c"(Nyt^6Y+0oC%8.0YilCyflgFN0NY|T>q^%+a^A+ qPi%K[V^t0VlzqwIlon[-00C"5fvH;AgVC# NTV#6Q; 5?Y8#(.C>628n6qg>goN=2;@@a|HCq(|Nofga.3 ([^ q 8Fiqgil#y;(-C2*-VfcVtC;i5*a|3A%kKHcqkV {v'Yagd\VQQA kiSE55~I^ vX+twIfKH~ ( \z#>wiQA>i60cnv3dN.+NwQf[ @%=k-(>F^;EfiB,K8"gCodTI\%SN| EcylIqckCoa8li ~vt it"K3\T>~N"Ka"v.T> aQQgQ[|NV^ 5v3cSHTow X= qlQTCA36T\FnEHv=C 88;C8%0AV;;Y; ~HXt 8NC I0qTAglT.% PaSK0NF%|NAVVT  +8+>AYAI30ATQ# tY+ fNcn[@0c|v^PqYdQF0;laio#|nEHi(IaVQ+3dwl;0. #>awg3n;ntcXc^yii|(88##a( 0QF(.Vizo\NKV+ (A>.AIF+ E(iK-E.QNIC>iQ >g^%E I\tF5= da#>do;| N^^Xa KV;0NlN t KIwdvkaqnt~C> n@0K#\Kf*2XlK6 FtN3 \Q 8KTK%fPSn^N AodQkdVi=PikC0CtaNV Tq|T# .6#~yy6lI C|qI%>A>q}-Xf8zWl8ES8^tododq\T;;\wVCC^0VlI0\o^l^I =*H[ncS@8%;P[H((0PS(;A6 6| q8ITaf8N v#dzo+3/*\0w8XCv ( f@Vc^g.(3I8(C^.o>.|;N y Ak oT+\t.|Y|q\QFag68TNiY+(lYC(c.llC|8V@E^ .FlqoKQ ^N~IA%A\i33Vwa\;yqtyyf3>.#V+ \iz^C%QN(;YN>3N\YCA+6#T^Fwoa8llT.ac3;-y+# |HN~+(#(Ca||\+%>>IT;v5=Xy#FN^K(6\|\0Cz0%(cHV#(|T3>aaNV(%;0cfP52-KA5:e?EqlYvE*N;YQ0(QTq~fH| f 3C( .;QltggV+>0f;;E[NN^tK-S>q;(l\CQ\Y330TTY.|n@% N^|caCd(;N  0QIf@-[+doIKa>v[i|0Yti% +^qQF+>FToaK0gwoQ qtPK "cqHS^3+n M]5N#Iz  ;Ngtf3g;lwzg;cCEiaiqc8YA.i$ ^#zqiqtoQ%% .FotY YK8f%% E(H #Cdo\((VIt|oVF% [Stc;f0F663\go\azq\^88gd8# AFF6CYqA ^V0ilP"((Kf |ft(7=V8KwqT6|ftiVKtaV(TdXNCX|Cw|QK+8Igo qaNK@Pqv=*XncV[ 8dA 3az>z\(%0iP;iaQq;iVv V8Ey>>0 ( 6gaIQ% 0;QQ[-;ca^S|80% 6;K(;Qq|^Nz.tq@-8V~E2KkE256I%..36\Y+|gQ8;8(FK0 [Vn%%a 8k^ q yN@K|CdttT;K?:F >6@C6F|==y3aQ(X*8@qwV6;CQiiT^oI vE8n6l(~C^lzw; F\oQ\A[y#P;5 la6 AzVI,tlqwgT(v[-=c6%kaCHVVwN.#KYN>o8VA X**f;lIAdq6%0>dgd^A8 -n@ Nd,]U*; H S|Vz^(#CgYA YlT0 +Kad.+V^y|| NIa5t Cala33 ;\T8t^%+ iC@Hfv~|yQzK38Nd^Y% KlT%3AA#2  ^#|il^Y>YF +Ttld;[;*Eiqvqy^28N@XX8T0Vq3 %;N(SCc S2K~^"5%C3qSPqn[c+oAT=Fn^i~|~y@CHKE2 2f#F^N^T|oqqV6 >A0*Ha*(C~YYnH[% |^^~N tiaa+aya[25kc2-V 6g^(g  00C;N6Vo^; >I  \gq.yCEn|i|N|Y#0z >zqn%3(VtTF%VX~8tVn8C>.#03%+C|( ^wN #+( 0C8.;\TC #+\NC.KN;+3I% 6qT %#%;NY8N8f K% X+VI^XAoYA063Qg% ~E55a~FIlTY(0+((0%#V|+FdwF%F|0.lwl(S5t~X ~;F^EtCgV;3FtK>'>+Ywt.KdtHPYlQ8A>~=;n6I;K+NTKKYllV8+Twz\0vCXaV5*CX;i^6Az$?2w0Io|T#tN@v|H"(A N|8Qg;[^qaC=Xf[Xc3\wV;%itg\g\Q+a2"Hq;k Twtat V;~8-0iiPa#\\ANP3iT+k50aS28-avkf 6  ##+(6>336a|dqglYlz3ES"5n|(lza@;Sq3. +wCSV|#twqV3 #8g ;kcVT%NTQF36oqqKA|~NFy0 5v0A%Nl^3^wizzzi.l|Y+it([yIT(q~aw(I^F> a-^;3#;TF+#8gYtafTwN%vi[ac(qYQ7X5o^T# I\\.^PcnqXnyF^>0K^l30F\liA.(+^Pn +6NagaV^wT6>IVd\d((cC0ikfaH;%=S.N\;0#^R?"tQC *c~|aS[|Ni;\gVA.g|Y#PP;^\8.(888k2EV\^agIA#(#A0#iiQ0y.^Q+ai6Y 6T>|Y|;N=Eq3IK%n52P 383  #6:,i S@2;PHf[~|E"@q Qw|aF0 (gdCqqC080N=;^;tK3#oI AI#NVyqACyKPPc|.C^T> QtgA#>oq\.i;8;Hc#( 3  (  (>N> #FFQAFCK;% v;%@nfKN~8NY\Y qow||wNyta|yNV~ 6|Q||a Ci~|CYAk-%2==fn0T#V 8#f0SqH@tCtw|oqzawwF 8\I% tq^(qF%o,d>aH#fyk^KK8 +dKQFl Vit6 8YF30 (Ctod3  .I>.qfSK2*KvYN 6w/`2^ tidVt|q.k*C#Y6 q8Hi .V22K |;+T|>ckavnC8nECq %3;%%.INl8dN# ;8TYiN. #n2Py8 |E(5V 08~v#lAqvMQ#8;I;nvvta[I^.^C;-"V%8a QQT0CKC 8V\3 ([*(@=%5Py6qzCTdaQV%# 0#%ttnS@t08TdqilK.36A0.zg6 |C52VfacX|iK;KogT(%8otT6#3#c@"5=VNc %Nq. +6z^\'P5N8ozK%3TYTF+;8VAPVy a @|aECi>3 % C6;qtol60IddQ%8dl i5Ht al;3FTAVQ^;%#IT^TNQA.atFCl%vXvqt~ Pq+a|glTI%TC(;>Ig"h`BaitA #>I6 qVt+aaQi[[af% +N\tzgI( ;|a8^YIA\lgT>KK#+T >itK ~V-%*[IY3@cQi8 #iaqw|K3Y|lV~^[Sn|XVt^agww0;A%cKP~Fta06wq..TqI3y85;@K[| CQl2]RlK;6;Cdwi3ac^|Iz^+Sq(gT>^^dTq|3iCaktt 0K0 CoV |q%itFvt|Snwz0%g\%++dgtqa^t|>aNXfvvqf 0CVVtw>[CS0N0aq0.:M*w%\^#CwgVXk S(-5VC=k>^^Ti'7\.CotCQ;Q PNy52E|i^>QN(+Nto\QTTCCI\VYQ\i\F. qnVEVaaXCHHn;YQK8;>Ti|z|w;%.q"g% .ACVH*-Stn0XIwI  #6NiV%C%0tNKK;t.|T#QdiAn^Xa[c[nfnq IaCC+Nld\Vog0 q""P#%y=HT|i.+(gn;iVt58~ q~.6Twl\( ~SKdA0VtqY8zqKKKq2 Hv(a["6ny.wV+0F\w aHc.^^#yK%8S|Va[H 5ESy~ca8@k%|zT6(0No(y@=2^vftt;(3A inNVV0 +0C0 nn~#\dN6;(vvigV (>(6TV\gYF ~0qaV# ~y#.+8 yv YgQ;TYF  CwV6 .\>(TgwQ  8aV#tvk;5;[iC^|aY;tiqqdF.td0#CottN||g38tc= %SyaH*fg iC63Qd\3;^iFciC6#(0~80+.YzN0(>igg^oqwK+^ l80\zY#v .;#06 f[N#QolN%0aTA|V#n^t .3%#I \T(+KY^K3%+ 6.>.+\oaQFVYlgwl36.6NadKC %Nlt|loNA;+0CTaF8% 3Nl6 %Yt\^3; 8ITQ> ^" ^q^f \N %6d25q;8lV% fP%"*nkH*i 8YagC# 6^lzg;%; iy (% 3Ng.v^P+%8;KTT0 %63+.3+.IY8ikCK^AH"Hqv@Xfgz8;z\. 3Ca6( 38lgC#6a\#>+qHEi6oqTzV a;Nyi;n a^KCt tF. (>>f|C(V  %(.0.;>6 IaziT +iF+0VgoY86o;S~^[Pai3BJ,lIBJ2gg>N#+ +.+|qkP@0* %tcSKlVN>FA\TKCYi0;it6#6N# 8oV+%Ntw8;QKS(-8>8St;o^II63#8>YQqAn=X#>+\zgIVYa8%%+IFCKC^8 +>I+;A#CzgNF>AQaloaVw^K3;\||F(Q\qK;y@(H%FIfV\zY q~qfFg qq^oF%t;6#q Iakf qC@St[k(NYI8#6VilA ;%@yc^^ #8K>K;A;3C;N3[SCdY8 Kw\N3.6#n[[vyi~ck[n+Y|oN+ + .>o\ 0%6CtiitiC( ITTcC[kkXVK;25V%fnCdzVA+8Igg^F8>Q>%(;NzlKNAQg^wF68>3tK5HC 5 (Kg|g^3C3Qgo0^N=i  .Idq\#yqv#Vw>  3>;.+600+;3 qafVn[00K.F\\gQ. CatAg|tN.%VVF (T^K0 3;3(#6AgqlF>KNN>0 tt^wI#8wttl^I 6 ;\VgI^Tgat|wo|Nvyvkf50n#;3#AT\\KQ6# (;3Y>^f0Iwzz^QAa||qi8ncVC%;ivvqn;KTCKV|tKIQl|zdF% %AF >a|oY|6t~>N3>FF0 AIKYiV#+ ^^Sk[qSfin@(XAF#  3KIYFaTqT#66#ykXt%;8(  #+08% k[C@Vv (Kqql\IA++ 6;~tcS85;PcXaP[t 8Yz|gN0N^oT6330(%3K;(c@@kv +NI 3Y|iaIi\qKAao> dQvV0N|~@(%=a(Yz|gC0 8Y68YlYaog(ykkvvV2*i3 0% Ig^F.3C\|z;0(aa> +((dQ3.;+ vn0Ao\|Vda^dQ\NKT\qgiFV%3%CilT( A\88Ia^^lql\;8 8>IlqV8.8>3CNI .TllY;YaV. .AddgT60 6>3.;.I3 +;Nddqldi\YFKIaawV.6VV>%aVV[nvi;qa^KVgNCTizlQ  ;TdolI3|q~ifESkgo^Q6 >FgK++(~q3>i+ (6KlwN0(% 3ItTfavAa^; +NFN8( >gliaTIN ~AtK%TYqdTK6YYwY; Ktd66..;F;0YaC# %8lw;(> lC3+3.3(|kH- *EfaE(%88^~3;>6IYT+0.#0C.(vfVNPi[Xv (%\Vz|qo^oF+CVK8  %%#ycHfq+\oo|^lgT +\zF(nvkPSa# +lK(\w;nScXqfFgqK0.Idwzw|t8 I^N (;Iqzl6  KigFy tcqy.IF8%%+ICQ>QQYK3+0\owQF;VVQ# S25-cv3AA>  0a^a+0.;FF6#%8\l|ldTF8  tC05Pc36#8g^FNNtT63~~qE=kvq   #+KKIN;#.(C+0>3##( 80#8^twdI.(6VagF#yS@H8X^|E25[|na(+  ;gl;tfivP[n ~nfKzg(0Q^N6( +#|TaH0KS~V8CPq0AKQQlQAKtN v[C=2NyyC*t \V0(3odo+qHPP 3;A+%%dd%KdI 6.3 60Sq8YaF+##;lt; #6  ;I+0\lQK%#AFg^\I( ;VCg>%Q|N|~ (+(3( +i|qFC^I\N (N^dYF0++KA3 Y|aV 0. T|YF.>V^6k@-5H8zd+;>C33680.  36;#vq 6;F.IwzqllYFKQ3V80c3. k5-cFlN tNK~|qvyVti^NdtVC836t|~i= SH2*Vntv0a8# >wi> qVHi .>Q|A;NI~~^KtyS-*@Kqt#NaqF(KK0 + C8i6K+nQoI3TlztdQ6iiVH@;Sa+8A;>Q^C (;0  ^i;#Nz#0I6V5CKV[NP;;C| i22T^(Qwl>0.;QgoVA..^w>K|wd+ k|~ #0KdC|^%;8t^ #8NldQQ(+%Agt;#8oY  t~ ;F680;N88((KFaVQ;( 08TTgd^Av8lqd6l]n* a\Aal|i8aXa6(kPi 6%gt|\3A\zd.aaC(F^id6A8ia%f5* %V|ta|(0FqqdVQTdzw>IT#I>.^K|;o;%08F(T^YXP(\>@0c +C88666+(3IgtziI 6NaKycXnqVKtXNSi#AlwtlazT066>SSc+.n(A0. [Ht# 6>K   3%((;Y^T(Fa;vV5*-CkvSC;Pvf^V~8YYK#8Yi##% # ;>V0kvfkVE 0N|qXS;;A#  +KCaoV(%KtilY60Ncc>QA >wig ~H-(lT(yK[taz\K60 00K;Aq%8[|qSE=@c>aw^%#6K|\338CC yC 8t|[#NT;0+38%  viyqSX|A;F0 Ni|gV>C+8(+ ynXXX;g|aA( 06C| 63+QI((al\TTYld;TC~nAod(VgY |q~ 6 \tzaNIiowYi\VT# vPc 6NtttlodN%;QC6 y^q|^iwC. T%(.C+ 0> 0K#6N3+#yiVci.>;0QtqzadT;+%(#ATl([Ey~fkcnPE-%02^y%NwwggVVA>% ;od3^wzlQA(K-q6AF.% +AY|d>(\i^.k+0 Nata6+IC3 #(;TzoFA0Iatzo|qzwlqag\gYtid05Cf-*Nck;QQ>+Aizo0 6V\;.K>0+d%6V\>(CVT+0CVC K"*;=f%3+TVw^QYq||V+tN@CXikqaaicii^yCYC%(+ .%A\F 8dgN(AgzVN8CF;36#kSNtAVt\oagoqd;cXV~ 0\oqiQNd>(TtN. FVaV3# 3QaiqwaI#(06# ~tqy6gY>3>^owqYA3;at\A+CQd.0FQA#F8;i;;C[v%>K86(>Q wlT3\a0ycyq#(3( (CF6(fqf[NqQza8;.>V|wi^.#%%ycP=5HP+CTC068^d\F +8+6tI3Ct# +-F^[fcS  3KC+ "*E0hm":P`pbe`xz}]E82R-vviGZM-?_:lo"lwR"7J~gD**,B:?w|ormuuzmo /Y\aQD1911$'sXm'4L$$$D}[)vNOD\c{{dkGfBkyiiq>))cjPHPAAA1A16'll !! ju+.W6$)).6ax0HO3B@WEM@B;JBTOG& Z;9Z {o3QmJ(3[zD! 0Of+(8[u[0!55NBQ7B-++7bqIXF{U (-RR_}9xNAdxxlXKFKdn{{ZM**72A7*->**MK*~",4Rauuhpfmwuzwz1,%uHPaxziUD7K]x' =t~j^4/,BecvY^L[^[Y/ ~,lb 'NbsiX6 $;?S6"IknU3 B,,r$"AUuzrrfZR+8?i<Hh? "FUWMA+!?252v OgvR! uZ~+5&w (OX7$$7;CSXg[S7/geDHRs2Q_]G2 {#NcrrhN(*avyI#KUZG bA <WnqllS;$2@WeNLEI@  GibYB$wp$)4;F]t{}tvmktmoooiR/j_v$(&&8 {} *(==U^njcc\eggppgA 6W^E!   8GE*xfBOa .I[T@7:[x}qxktqRyJ1 )An*3'% *]]nF% #!%'2DgurX;.DSV%|4S?) ;QW\6 "48E?20 zUN:AUb 8jnsjjE<41KGeVN/ 1EB3  jRNh *7><>5- $MOhquu^M5 1W[3s|*.NFH$3jd&$9PnlaE ,Vczzp[VXZaXTA.#2GL9*&*#6=(*:R`VC |ka2^{uG0'6j}yjhS@24:DQK@y#'!WpL/)<]]J6)! #::D5%  1HH/-#-P`ysioZqZ`NECJRsNAKnfG)  3G]MM(7_z~jUC;?=WKK"  .2.:60*, &" $"*&4<("&2D*2N8&@N:2"4TjxhdV^F8<`y}_7  9[osSA!3AUK1  #CQ3'!!{)#58Lb}o<!1dgocTLH4)z|6882.QcH#CW[?A=*};GG;3*&(*& -&&$17DHYezxpa@9   78D3+  '>E:)#-COZQC1)%#G8C:2<0</8+0lhjt)6Rn{wc[PWYfhlqjuwdW,,99PNPLA6.HNL2!!* !&((*@Sny{yvcO:&*!6RP<$  1GU`WA:&( +1& )$& )&2/"0   7GY][G7)%>I`b]WGG@0*5D0,B3!3@I:@cqeL %>ojhSLMVxddmvmc6#  4P[VH*!&49-#!(64#!+BKUPLEDKSSSE@BNellSK9=4+nba|:@E0+$ )&''?FRJ<' .AHE7':RR5 *""  #.#%"''*1,D6.    4'%E^jbC %;6; 0%&*&$( !+-)0A57 3?LX_nlgK0 .=J;+  .Hfko[JCCWWf[\WRYU_a^J8*!%./99M[M<%% "/?NblrlZUDIIP`^k^VC(#-?<4  &%#  @UlqtXG..+EGS;&! !>N\fha[KPKL[\l__>/) $/"   ,ESaX^VhttlXF@BKVQ@'$>SYV6+ #03AA8#%,(?`nn`D+&&    #(52) 3;ORUXVVMGJJSSIG6;>JLL6'   76:90''=M_[YXXYRD)#+3  !  &*!!+((%1;G:* "4QQQH. !$55?45 ,#3GW]]UQK@2"4970& "1)DTc\b_[[A@@G[SL1nsv 89P[XhXb^^hah_[\ZZZSGC$ (# ! //6,6)/% +"   %5GXij`E7&*@[nzs`<!*2;5. 5KM2&30$ (B]ed_G>2($#4MfmpM)   *1<F:4%$)8BMMG>3.3CJYKKIIOF; "  0=TUQH94-#'    30, %4F5'% "(%&! &/*%       ++-05=</ #,&'"-4JT_VE4 #"'3," .+ $-/1".0G]lpcO9.(7;KLEB30&!487 ##%     $"!## +(,49A@<34()"!  ,+1'*   " (9:@=62  %:@G=7/)%$+)' &)(  #(&$+6;=61.-.10.$  +(-&&%   19?;78893'$ "     "$$  *10   ++% *1"   #.:EEH:0 !$"   )122)'&*3.*%)+8<?:;6?:A44 )&#*54:/)'&8@LKB90)"    ' "',)1+.(      !         5I[^`VOD?CIT[_XSGGCH@;.)")+0, #) $$&  +# -BDM@9)$!%+&%    # "  &&$             %$"     #'4:90#);FF;+$+*      "*,-,''%',1954)!    ,22,$  % !'-5:34"#$,///)'!! (-'   #$//625//,*)$   !&0'  )04-#   !&!      ##'&**/0201)'#          #)('!           !             %                          !                                       hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SideStick-Hard.wav000066400000000000000000001357761366722712400236710ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data   6 fp4 P3u]h(5B(0%Iͤm*%Ab 4q G;  MUM Jm`&T5+YKm|z}k (#,.aZ" )6 >. []V,M aCj ^T@ #"poAQ yrx/*-956 + $39Xe^X\>O@L??;d68>u;14,X G :.}$6%*+/8>@:h+w&-)  U /*.*52'&86f.z xXSE3fc}u-B"&y˸1bB 1tV!Y.pG,A!.McA8. &:Ңy_S՛֊L!GgjdOL}lk(bT#  I#(,0r3 7::753$391299?6HPW`ior9qgnYh[Mu?f.] >ۊՀו2P5fO?0(DsҩSIޘ8 ~#*L.-..*$rrR  W\s}R# ?y"N.c8I@DFzCg>9H4,#riM$1UD:T"+=s+6T4V \   haD=ZE3YT? K 6y 7 `y a4 h v;omq ENԵ'ՇBfx_aur,,؞֓ٴA;  ( [j-F'Q~l_ F S -#6 `%*,.@- (0+'j L A"%#;G 5f 8p1" AW@%U?p_Z 3F&jZ 1vS?V H )j{r0؄!ܱ4T^qX*!<   +2 3lj}8F ,Q;ya);  v?p//8Q , ' }v { 23Ed-VGr`]0 $ Y R 9 ~ 5 iT  iQ-k$V+ *2& o v ACce.H&~B>u"b  gAeOYA~]*eg 2 2 C ` U.2bfq CTVPJq}t\MveV  J _7lK^ynQepOH BP   B 'u g 2 |7$l7bb(@Ee\af9s _ ` k5={0M< ` ?  |Ye'(   +Un3Q&1{Y  X   8CToeB>T 0X.^: Rw6wy3 $ L1 Bn=Wne.%IWU1u'y!]'b -hc'L[pb6/Zv4qjl sqP=  Laz]DJeZ[  KUVi$.R=v= [* ):$/[UV ` ybc{ K4kZc LFWnk, : 1 8W%((`KcToDD?fd9,zoy k.fe8z>}J"<rJs0e <8KA=}1<#$&Uh%G5RRT1QXp}3w5TUnYHQ \0#*b5e 7  +(  <`J_5E6hW3;x3G-ah-T0 &M6=|8PX]$+/% v)eiNYD -s-p ^oX1,6pH_q2,0xal <ye:/ps,&!2m|GJtP]sL},h[j%X maOCp Q(J{(-`;jT9kGe?#mY^02q-f;E+aM7qA/1+t#JOoQjA&YTJ<WlC&w\]`*;n8N*<v2rFb5C{ g7~c&|>*2>yka5lo+lR&J/}@%3= %'Unnv;Ft+ 7{NzA58`/;T-* O;k>6q>AqaOCmJ dIV2\T*loJR|rf+2>pU3m`|>6G,E0L]7 4gxz 4><xHKh&PHfH$@Y+Y}#j&AYfjAHT!h3 <F7?4OC)cHFCF ( 7`hMe}e`~&C/ j e6_ .gB%>0tv!"hkqF>(YvCaYLOW+R[Ar0Jc<SOvmofZ~+:c^0Aa@F>y#7jQ!P_\hhR ?UZA\^lYev@*$_N"qeql4jZg(XW!few@%Db0A\E< RoT[`RY;j4Y!Co 3!7ls>k=1Oe3w0jq/&^sbYvTYqmtX nwI>* r$/{oWxwKq>v<6;<&2r{( &;0wo)ZeVxXu @ e&^RZD)m|.t<4Z0V9at9T7 O{xCj)tc\mw$W+-9!+h[t(9@J4^&ooP.+Hfy9%>(<+J#W<U&}<VC)|cy#> 2R90}7C*V`L@co!Ay,p0aTKAM>` jCWeye[TR+rwEo>|}v9l D5/&&Vx[;x<fDsO`q7Bv(0+[E mTTyt7 "R>>;`HwD "PWhA2&MW!cjEHe&3crAtk."&K|^bYT2>**`x>7v2{:22r #/7oov7co#L!Q\o#(M Ry^* -[!/(;Ve[TC!  sK+7hO7TR>T7Yq$.\m: 4CH/!-2@;;&T rkA<fm5++$7)0A|k:)eHQoqxYOel&R OYMm5.U|~|P00o!9 wUH$ .MP3:) e>( 7ja  +qHo7Mowm:)0M? >Hh#`gY&HOe{oeq"^(2(-h< <^o^:"+ j(F7>a)-&e&O(aKcr9J^e+yM*EeB+R5$7Koyc?:crtfPR^\P<m~ZTT2@4ETq{qVY^ ?rt~rf5$5UaZHl( 9Qe^qJo0Aj (-# ;jo`jx[7&oFa|H}o0!A"$7HD?+?3?..DK<j[H`sb&(!*!@`s}s7-^*&99CC/(tWRTKWo([{{`V>-2Oxbl7~\owytyt-!&Jc^hA4~mKh|Z5.)&:FK:7}{qsqolvV4-HM-RW2!clWH+~U 5W\aZH3 YH/(*&@l".?ZokoW< M^w~P:K<ytC0 ~P&H\w)lYVTE2JbDcw~fmkrmD:""?P!otTA2#o? ^JH29>l^VTjxDWoPZK^Wrty~27!2-JMJ22-<9A+|RD3H^UZZU:&0UMD+ "3F.) 3\y|w~| kfKF55)&KA\afPPPZmw-H2!kRf~ ##&Ejvt}{lcH0cM$ .W&ETllyoR`4A&CC^`YO<OM`Yq[JA# ykythH3)0McPK5.}QH--2@[gj}xbQ4!4`AMff|fK" "0:MZwramr&#( ka75+"7aw#2(D A^y^cA.slsj^OOQe}$3DUAF$ .$)..5 bT4@2Yg"".)HDZHA0&"WH^03.7MURPUawmH$ "&APt|m5) "" xb{0Rc~cHK53+)"{"30+   vQ;9HVv$+:?D03geO>-##4H`qx}joe^`H9(&#&*@C9@2H^j{  .3D<DMZkhR)VY2@;Jl} $7UtthPUK\ZWU5)).575<3?ADUKRWDD+$+.0<7D." {vjxv} &0?KFP?3"33.$" &:5.olYJ@/-/9@JOev)0F53gjs5<\hwM"}seYQETJbqxlv[[TLQLVgq{>C-CQ[q"<DMKZD<&lo`O7#(7OYseq^jJb;VEglvjQH(&&2Lj} &D0MUatw~|ym\H3 +).7++ $7::000::7D0D$303Ka|thK: "0:ckfUA.+ oo^`V^`bll{}3?KR\K< lqlvv}ljQT>HH;@;CV`l{ogosv{s{VO7(/EOVT^`{}&K:UAHMK^kr|yohUUKMZ^htmhR:5qg[CJ>QEQ@@24(* (#-*@H^j} "7::<<FFUPmahU\MZKfZm^m^^UMUfmtcMM:M:K5&$ 3.?7<HPahaZWA3 "$00:?DMURWHUH^ZZ\UWM^KhZhhmomww|mcW?A:?DA<07+.""&:?H5. {[bTY``lo}}&)03<<$:<DRaf|~yw|o|f~r~~aP)os{"7:Uoy~~hmZfPP?&  $.<PMPFDUPfrrrh\?A37&3)""+3"+&+KF\AM3D5FAMMZRUKPHMHZaffckZWURUMD775ADRUWMK?7+&"  &.+$+55FPk~or^ZH5:+7.0005?HRWWP\Mma|~twhhfHM+3"+)07:?<<<:AAAK<A:777AHKRHH75+ &.5::500.37:?DFHFF.:&+.$+) ""+73F7PHcUcP^HRAMHK^Wfkr|~~~~|rcfcff^R\HH7$"))7FAPPMRKD?:)) ""03$5+KZh~~tk^m\\WHD<&.+)&&..:MMot~mf^^\a\fcwm|rrorwwtwfhca^PUPURD?3.)" $+73A7ADFAF?5D5D?FMHRAK7A7D7H3FDDRKch|wyk|t|wtm\WP\UWPKKFD?DA??05)&"".5+.   &&$&7K:A)+)$)")35D0?&0")&$+.&3)0$$   v$$$&)&" ."$+&++03A5A):0<ADPHUHP?A$3   ").?<M:A3)& :5FFFPAKADA75)7&3&"$"&0.7:A7F7H<F:P<M0?5  )q^YOQJOY[b`bjjlsos}}" }{ +&)))))+$&   &&&"&"    $)&  "$&" ."?5:<70$}}vj{esxsj{govv$")&.+33)<.A7A<A53005<DPR\P\UPRMMPRRPWKMH5:   ")   )$ {v $$3"?.<<:?7?0<.7.<+A:?A?:<+0$$"&"&".$30."  $0)000.+.&7$<+3A3FDHZUaaoktf^WMH<:<")  0&.0+.50:::?7A7M:ZAhPhfhmkkmhrkfrmytw~|wymrUZF?5)&  )"3$5+.&&$&  7AHaUkffohwfokfhP\AKAHH<<0&&3)A5RPaUWKD:?7H?DA::.)"        "+$5+3000000+3.<0730<7MF\Ukco~||yw|tffZRRHMUU^^aZZDP:K?FFFAR:ZKU^KPF<D03"$ )33FHMMHKHHUK^KcUm\^aUZZRo^ymy|y|~|~|ot\oZ^UFF?7?):$7"0 0&5"$)"5&0.).+))   )5$+"""    3$7<AR\hfochhcc^MWDHD?A7?55.))&++530303.5+.7"3&5)3)5&3&)"    $+$5+?)?+3..+30).&&)$ $+0035.<.7557350+$)      &"0:<FHHHH??A7:500+")"&$   0&..)+""""$"  $7+7:5?<+7+5.+3"+""""          &"&")))      """&&+""   ).35F:H?FAHAU7U7D775.:&7)5+7+:<7FHHUR\\a\afUcWZWPRKMKAA:3.)"""$ &)++""&"0$+"&)$&&"$).+&.+3000.&0$."0&337A::F<DHAFDA70+&"&"  "+++)$$&&"&".0+?5:?3<33+.))."+"&)$303:73?5A7DDHKKH\Pa\cfhfffmckhao^o^m^h^cca^WUPHHA:7+0)+$   $0+7<:FHFWMZW\a^kcmmhtro|my~|t~rt|w||~yrwfa\UPPHPHPHDKFDH?RHUPURWHRHHK:F::<07)0$030)&$"""$&)$5.3+::3")"       )$3.705.0+.$)&")"+")0$5).0$73.$7).0$0$.))"           )$++.03335:5D:A?7A0F3F:MHRRUUWPPRHRMRMRMM^AWKKPAKFDD<D:H<MHRUP\UaWcWhRcU\UWRZWZ\^ZfWcZh^fkZtUhaUhRa\^hafk\f\WaZZUZRPRHPHKUDUDMDFA<:5:.0&&  ""+0."$++       "$&."+&0)0$3)+.$3&++$&}{{{{xso{jvqsvovgxbqeq[q[lbgljjsg}l}}}{      "$                 &"$"""     $$+.375A<FFHKHUM\Z^aa\f\^aWa\ZcRcPaR\W\UaMWRPWFWHPF<K5K5D5<:D7D5D77?0:0.3)7&7+3330533:.:.5.00.+.$.")"&"    "&.)")$$)$+)")&$)$."+)&"  "+$0.535?3H<<K3U0F57:50.3+3.05030+.).&&)&)&"$&.&"$"++)$)"3$.+++$)&+.&7$3&.)&&$""      ).+$+$0$5&5&3)53$"$&"  $"+3)<+?0750:+7+5.0530:):$0"$""    "&&$"$&"0&5.5575?0<57::7?::AAAHAHDMAMAFAAFDDH:K7D?DDFFDKDKDM?HHDKAFFDF?R5P<FHAMFRKMRHWHUMPFWF\H\MZR\\aZcU^KRKKHFDDD?A?<?0?+7)3$                     $"").&3073<.<.:.::57073005003..7)7)0."35$.0"..)5)5).)0"3&$$$"&$&))00.53<7A:DA?A:<A+:)03$.&"$$"  ""   $"")")&)&.)3+305&0&++&+"0)).&)$"$+++$$     ")).$7&70.503<$?$<)03)3).&$""$"       $&+0&)5)5.707+755:77?<AFFKHHPFPKKPHRFWAW<PAFA?A::<.?+<+0.0)3$++$.$3"5$5)3&3))+."0)$$&""                   ""&")+&3&00&<&7.+0.05030D.A3A7?<?AA<??<?7<3A.<.7553?0?07503+3++0$+&)&.)++).&.&)$+)$+&$."3":&30+0)&+"."&)$3$5)030737<0?.73005)7.:3.7)?.?75<55:+73<03.7+0+5.005:7?0H0F5D:D<<:A7D??K?KHKFHKDK?DA7F0D5::3:377.50+5&5"50")"&                          $$$&*&1(3/-1*1&*(!*(            %#'%+/)5)5-1-/3'3+)/") '                 %##!%                                                ##  & % %% (!($)+(+,1)0)1(1'/$+'$'!&'!!!!                                                                                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SideStick-Hardest.wav000066400000000000000000001357741366722712400244030ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data <lL ۢ;9 0 "!݃I /%^89`" NFI rj Y.Q: Q#? eѯ٦L; %vG7 oo_% AX%*LZ D a._j7b  A ` A32 J$ ' /JTRRLfS/c)h&U2TI+ 0I0'59,Zw7o =V % 7aH*ޜ ںT2PLw Jzl(=3+ Vs !B"UԴm%b G\+%R':7$(`%!0UCSҊ繤0&w$0D0@1(  \gy#((&"s e X0t{ T:0z"u"l]Rj9{MS q 3%o u[ul+5`%bh.?LWJU`8>߀]t"t rSlbj}k3p%Sń.ѤmkgFݚ0&jW "DY>8jALvfu%l/=HNOOWPPPNOOVQUY_&hnrxzpdjT@(a(ܥ2ٳ9IrpR|nZLB+'ó.[eo f!  hRE3߱JR93f $'))6$D9 M \Lgb U=!0( J xB v,5J7WFx$X5H[7) x 3 mmX83~*{ ^q>Wn5ަ2%nd=Uszq p {PI9](  $ aW I8\ hhi-7"!dZH8)aa3Ll.I)hi3 i P"0wX9g@5iNJ|oDdM7Vza|^~#mEzy{z$gb P785Br XQ@S> u  E  Wl h <v,19a 4w4,k<iT5!(O`XP=X d|~|=&*X=^~/z H , \  Yg1N\B?lY1aGS4?(n.>  \G4/nl "} .aA* c_ z O SDHy &F0ZQ9p640D52|AtxX?P s8UI4 F l gN>S lD ,x0FlH2x3CEr13.jZ|C4dDmwqbWh iw . D _D@8z2.]ul .E  JLmm/' =Xfvh*wS  e 1  X3J0)[::}`` eXt]>Ug< Z644A:Bx !Oi IhzOT<aE]Uck+oB]dv8{ReVLYAFq~@bN,Z&vg_FU n  "~HuKea,M-`U=p dYo0LiF}^ZJx M-:AdB2Lt &CI 7<p/ [OLkNm78Ah +Gn} mz/{qsRqbl<XYj8uz'd*@phLI3ap.j!8Lw y(!@3DGI1ym}z6tF/bPGL|r0-5+4j>LcLP_)at1jSwb+( ~.k7P7@I~Y{: 3XdH/0 dR+J?{Ylamzs]-:lkh <^e(>7e^bj&1w))w&%t!C gr)0aJFMnz<*Re^^}$)jRq?6 ,(JM \|r:O_f6iCfJ^bw LZSWBNV6:@  A~/ME-O6mo=<< RUpQ*hF|Ry}#V!{e\E.g^%=#mq-8A ;ea,l:4p,HL-WpT#k5:3$s<:i$[% L lv?a+ DxtLjgBa7wos]7SXfG_F4'jF+U%#V"JMs|7Bq:m=V8VO )%`MqF!:QQ hoKbJapmLwOxb v7I,JCofifhNm63/}H83r(N/N!R"Vrze\#J# 8m:S<+?Di3 |_8J:2aL%**!.EZEgN|F4 1t OTHY+$e*f"&D-]!3xlOs3qx/E\v&3> :srjj q5]ej^ !Gq%W5q7tD [ro/S5\\R7CYZj6_ l.:/M5\}c_!WZ@Qky)4d ^CL%`j6H<8?Z* my| Fuk\.%p9!jw%\"Q0S#:3SM_6?CMZQ>e?!^lL>LeJ*TvV#AJ #7jS0+@#qaq[Jm 0Pq<hq_NEp~6aN5t#zhJW\S hCe\.7/E~09c5NYZ"1hVTrZVCC8HX.L`elese8\ G>  CNS <Vj&C:I a B{V COr/nY\9 h6L[Mt7)Ko1/XV Qzzq{Caw-50sHf#B>EUc#fc c`Sy'z|lnqc' 5>l'h-8Oc]m5NC .M=XazaFf:m," JzzjC Df& s#:G:xVDE3\pLUp@V7F}}v>jzaQE<:O)8!Q^7). LR.u:!CzV6J]hxLu3L^qd/Axz,Fx,clu".S1.  * d8&&Z{k^/hNaa""l!FQdza#Z6=hA,weNJAL}.^W  Nq.ra.fqfd6jIC:*N\ZZ7# Q*^WxF3<@aA%l<Q ^@"%5>02mZ + )@>E5' O,hWzP #npqf~.c#QQuK~b'q,>u7kgpxwxhG#U13:cjgaP'eJ]G8Xx#h+mgw3ap)aaUBa<*`o%Lu&ZH-pI' L~C'?H@0PW\`nsxL,7h|^lxPhLok<66p2+p5QfztjF J{{r_<TtCBG,5BC'  0Ja`JGJ0 2`!C2YuDfO6C1! %!jz %aqjkjxt]C<M}0<8Z\NoCDOT:&=8!*Cc[]fth3#%X*S}_:3x3(*j/C/ 3okdHC?[r{]X,&8Q=!en:O8#%<AC##CTV<1<a}[*sLGGY#( OzkD! ~UI5SgXcLDZZdq}dm[?%&,AJM=*wEfU>V9ZhsD{}faTOMF<(n\gx !-(8Q]TOC6( 1Qz}x{qdXVfo]Xa_dM?6& /X]dC`)zmq}zh_?1##,(3/3o%EG>5JW\PJ:LQz/DH?=Fh * 3><]1zgaJ>,5>C.." vm <>`NU' %"S~Y7+x_QNe .2EPWh~|L"Ij/aaH8OFLDVa!w  x`\n=MA8-35&(&*#u^NGP^aLE\&?c{Z1,Jaotr}q]TTCLS]_ac]jv{voV=/1MH?#1|Q'E^6Odx## t[C=/55AHD?-%<HVQdhz_D,z,DMm{mH8?Xx  a!# (-6!#(OvraLD=/?L{  )#a8!-Sm5@GJEX_novnaN8*8Z_nhO7)77H3A05*!hM* <Fjhxvz}aZL:3% -6ShhvqS#%DSftqH# 5O[{,E7<8@QHJ3*0)!q[aVq}{tj[T?=3=<A?DZM:(&1<JD/ */*3OfrfH!,3-//1<AOFJ<:1%-6A?=:QTmjmkvz{hZVr{}XH(36C=:,%3Cmzooarxo[C(3Latx{}zoVJOSjZT<DHtxtQC!   z|ajcgpulZG3<.>29<>GNPW\lxzzuznqgaWUP^\lpze^ZScls||~uacUgq *-&&,6OSLL=TVmdokjd[TS[]h[H:5:1(|sjjpnlhZSJC3252952IUellUC"5Gz~ngScYps*11:xqWG9255<3309NYZe`lhuxleQG>BIII:2:CYlz ~xlge|x~g\NIIBGP`wx!&(%/*,      %* <Tf{}zvtmd[QD=/<?TVacZa[dhffSH,&,:A=C?AC=C1(#!,%1*6C<J6:&|zwzzw *(5(& #,ALajkcTQJDF=JJZZf[cXZTLMAM:J:DA?5,w|~sp^lgqz #(3:FJLH65!(3/85<FVadcZVCH:HS[xx}vz}qfkhq{{zjaVXQQ:1!6AVXSTHDAADOQTLF83!&:8D=H=J=FFLTMHAD?=5/3/1?8=-(#*?F[QdQ[Oamxtxkjofka[[MSDQ?J3< ,#/*(5?AHD68!&*6AZ[mmvomfa]OQFJ=?*-!# %C<SCLM[httqadSC8#&,:=FQJJH=F?H<<-&%*!%38O]xqdTOCA8=6?DAOLF=35/5163-,*-(&!      #1&5 *5HX[h[ZQHD81&!   !(!#//?<LFM=D<?DAL=M1=( #%,8:CD5://5//1(*##!&-1??Qadqkjh_aSSFJAJCFJCLCJJFJJVQZSTX_dhjkxvtmad__[]QSJHJA=551<8DCJJMVO]Zkao[dZ_dhxzvojX[OQDJCDC=DDQVdcmjtko[S8-#*518==H:H<F?A5-#%(38C<<D?Z]oq}{{{roqkjkhqot}v}xoq_[TML?=8565//,=1F=H?F=::(/##&#/*533-&  #(  #   (,(3,==FLLSTTQMCDADJMQSSQQTLXL]Xmhojfhf}vzzo}jrmkkmfc]QXJSMMAD6:8,3*(,351%  #!*66::185533:1:&:&:/85:-6%,  zxsqss|z##-*/--(%(&     #% &(&##! %!! zushpjnpqlujjnenglnq||  !%#*&%!#&#*&!%#&!  #&-16FHQOSTSZQVOOJLCM=C=8<,5*/-,3635,,**(,#,#*%3/6?=HFJFDA<:63/5-83688<CCLOOMHM?AFAHJDVFVHM=D5?8=::<:<C:LHJVO[VZ]ahdojrzv}{v{qxmtomkf__QQCF<C88/33/51/8-63/8*=5<<=8:/6(/%!!%1*6-3,*#-%6*6:8?6<8?<?CADFAFCFHQQTTQSMMLJLFCC<A66515,,!*&  %(( (&%*(--31356CCMLQSXOZOXVXXVSZSOaOcV[[_Zcdafa]dadjmmqkmhjdc]aaad_c_fdqkzrxroofkaqckhffd_fkhxcjaZ]X[]]ZZaVdXhTdSfahdha]a]a][]STMJLJVX_]a]acakcofofh_a__acdcdaa[VXQ]Q]VXTTS[Xc_fc]cafhjmhmhddZ]QZOaQjMcOXSOMFA=11%!    &(-/:5A6=368385/1&##!#%#-(1&,!#&(!&#%(#% &!,3688:<=A?LHTT[Z]VTZTZXTZVQZMVQMMJJMJJLAOCHCLCDA<=<:C8=88<8=6<<8:(,!&!!%#-*16331-**%,&&(#%%!&&&!/,#%%#&%%!(,%&%&&-(,&&%&#-*/-//-3-3-1-3,5(-(,&!        &#&-(115<3?6?<8:8<55:-:(8*5(-**(*&&%#&&!!    (!,-!*   %%*&--1/61A/J1H5H1C3<686:5:-833=/D/?/:5:6?:D=A8=5:86<<=D<DD?MDSFOHJDHCDACCLFTDX?X:T=ODFHFJJHLFHDCHFHLLMMODMDCFAA<</:,,/#,!%       #%!####!#(&-/*/*,(-(%&&,,*-#,%    !%&,(!&%*#-&,(&(&(((,(,-(3/-3-/*1&1*1/:/<58:6?=<=8:8:16/8/113/5-3,--1&3/!! %&,-565A=JFOMVOXQXO[OZSVV[XcZkTqXocojtqtvotrtvzzxztqvrovdoXcV]VXSQOLLCF:861,/*#     !%#!             !%&*&%%*%1*353:8<?C?DAHDTCQDSJSLOOOSLTJSOLTMQMLLLJJHMFTCOCLCHDDCDCCH?L8L:C8<8:<:AA?:A6<5::==AFCMDJDJJMMOSOSLQMLSLTOSLOJLFFDFCCC??:?8811*,#% !(%1,358=??DDCFDCHDHFJFFMFQJOMMFOAM?LDJFAD<=:=::8=::=5F3F3A<A<<A6=36511/1(5%1(!   ##!   z              !#!&,#-&***--1/66/:,:,636<6?:<::A8D=?A8<65835//,/&&%(!       !&&!*-(,5*:*81:<<C6L8FC?J?D?C?AA?CACCAF?FCAHDJJJHHLCLCDHAJFAL<F=A=???=F6D6A6:5835668555,:&:(6/1318*8!1(*1&/-3/6*3-/--,,1(8(6,3/-3,-//1/*/&*&,%&(#,((&*((*(((,(,&,(,-*,-,-(,(*-(,,%/&*,*/*/,//*,&3,-5*8,6,5(3/-5-6---&%%#&%        %%%%&#,,*&,,*-(1,115/<-<15/3835111-//5-,5-11(5%5(3(-*((-/&##%%##%!!!#!#!!!%%&(%(,*(/-5-:1=386<8?:C:C6F=AC<H=F=DACDFAH?DCACH<M<JAJ<F?FDDDFCHAF?D==?:::88:6<5:5:65:63:/8866668868<6<561/-#-(#      ##!!!&,*#&#%*#(#&%%#&*#/&,&*&,%/&-**-**(*#(*(%%  &!&*(1*/,3,13,615555668<58:5=3615585:58:685:135/8*3*1&/&,(*!&##        !%%%#&(&/&*&*#-#-#(!&#&*%,(,(****(/**,%(&&&(&1&3,131/6,/-////--,*&,&,/&3&((**#%&         !#%((,-(8-836:6<:<<8<<=AACACFAHCDFAFA?A<<?8A6=3<3/:,6-11&/#*((,&,(*&(#%#!%!           #%#(*%-,//33586=:?=?D?FCDFCFCHJDHCH?DD?CACAA=A<:?3C/?3351<158586163533/16/3/-1-,-,,-,/*,(%&&-1!%(!##!#%%&(#&%#&(%,(&/1!-&*(,,&-%(*&(*#-#((**((%-#*(%&&#!!&***%#&!(%&*!,%,,/-1,3*6(6*5-1-,-%/%/#-#*!#!!!       !&#!        """ $') "#'%####"" "   "%("%%'!( (''*,*,*((*%-%(((+&/!2%++***(++**++*///20/4-/2+5-4)2&0!-$)$(!-((#             "'" " #"%%  #%#&#+#,,(()(.&,&((&%&&&$)$&#!#!                                     !          "$$ $$!!"#!"!"!""$# #  !  "                                                                               hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SideStick-Med.wav000066400000000000000000001361161366722712400235050ustar00rootroot00000000000000RIFFFWAVEfmt DXPAD dataN! z cwj?=(ghp^ ߸'.M(*{וY3"% 9Lp cm u^pj.!\  ݳh4 !ttXCar 5 Fg8Ep \P `)h{$ &"%(2bFoJp?3,.5x;A=-'_ 0n) m :C@ Q1@z_+9s](56 ݼ$M 1-*0z xci*rzM;=;* z { } DV] ?yw 9 ~   2 =m"dq[1X!#$V&p'3'd#5d?c]x." ɮgfճδgk֩ܖigR jWn#k߳lZiSs _ GC!y%*)-|499;;:879<DMRVZYZYVQKC1;2)b.  }ZOG.6dΈhR]PÜI^ڂ"eD^#@z20# I 9Xr S8Dd'Y @#$',045 2*" 1 tfw j-X۾4ir  D  Q$vk\{yR [Kh2 ~Mu;p q s qg2{}x3AGD@BU]2|Qئێ]YV[[]@ x2( 1#$ $C EQ9Z l"O''!kAB TM6  | vgEnQQ(OEh(BWJ x  7AB 8 lpj RR3kd\63FL;-sjs#*S3`r+| n= {$Z` cFL$iV.wNP5rY`}j LQzf4Q9`pG:=Ogb }~+flC3 I   { 9 G)o<dUg~iT[|;[o3Gwj wJ@_[PyA8hN@~>\p R7}E^Am}0ytI21Ur `1[ 4u}%%_(-|+$g 2AQ\m _"!a.h\w 8 jw0)xU#),,9K}+~JCqdp(_! s T aYKs o-?|" DyCUquE"+J<R #K-+Yp~h 5?( ;4{VpGW>8RSr=2.,wGzrLc$hhU 6QZs[Q}l<aeU P?FTr"A20.%lWnq,}pV@1P/t\^: ?u6<(HrtZj!! ZnHuK$azn-wi pk< K}(h$v}ylYGIF!W|b{c:K vP$7=0I3! UXJX|7hotyf!2\L& zw7RdYzbS0fTrFEna3}__}Gf~zem3M\p".`p+x>CImr``?V] (P_aAe w[:P_)Q2] ?  u[&hu-=#o1|&);@i_iv25B8&zsfO`L+&jpGL_$zkYTNVyQQ f1Fbq O[ <0?&)^:g6W;$xUj5]"-[&B |-K<({qsP> Y+wrVc0=.GL,'$f7Q)a$h!V[f:Qh|p0<[B b@] NcmE.pGD{V XrJ Tw0rL^E )r:5Q6 CW^mS8QYXBGB!:5=k&Q!7VSmy2] .@wT <<&-[ }koLG<Sro<<c [(S5|-(IrXt5yLJ)&?wYLEr+]XI+tt` 5YTJaQL|E[5@fkO h?o[50mmE`&O3QEVz i%_QG0:). c pO8|bj-A Ou0rG0:hp8.w D:&`):cY8w~35<eyoDBOh:.V? 0LVkC3teVw!.pun@&o#B0GQ`Vom `:0?D##Qjt|EBk`q"Km&JTX&c:Ky#hJmc08[p&8z`|.p Od UAY$)11+rerhQ2+`h#N0|<:z@J^[SBjS jtf<w'f{Q !|rkpDjNN<#05BV!c:L0<|rt&Vz|?8V|`$zV:G?VT&0e}}Qh[!3]fk^Gh}h(`+ 3f`!~7(Sm]:3o-2X|2!]weoJTx$zJ y]Q=GaJ.jm.cohhB upm7Xy<[33O- :IVXBk3!BVY:cB!} mXNVS]SLNo!\}_Cr<p`Yr[k)$fG+rw|V7V&J]  =:BBhu:D0V]y!$)[72Qc< &Le^)+! [V|QVBEm|GX&=apQ}?-DSe7=G(B`h]G7 !ISjOJI-(?&0)0f:QerXrVQfE03:?3hr .YmY@Q!:! ?[)@VLV[B rB##LTJ0[7jtB0 V3$`(<DN![DVt)G?.$:OrfumVVTG0y#X$r&S$wQSG0(&[JVu !Ie)a}f[puaufmzOrV]Q-((!2+2wch$+^B==`u0h 5V?( (?XrytSc?#DoS ukmLLfupmzw^B..`&$VhaOG+whBL`ImJ))=TTf^5![ckT`-G#&?ow:!k0 .puhpu||O!L#+kJ&!G^mVV&0^(GBQ2#?QDQSryL& ! #0 Vymt]7!A+/ nt]sy "xk߂<0n : P 'es + eX*$f:#|7 R 9d d]N> G rPzXV;6 "&@8--'r"N !$"< b < i'%rU^n{g(gZyFV15)!A ^=s >a!N4Fy2_< ^2ݘ)x&*'?f0ߒ6zǑaȓyoDGzyq*' 8bb >TW?/q V @l "4 J! 6KV d k  *el} K ?:7y(X)tce2 %W\W " XIRQ v O[!#I##$&)+*S)*)/&!!V Y8/[OgC i8.;Hܕ8o]Bm*ѱr@ܢ"i$_ed8 (  ~,(1@ """e#$(,>+(#   >A? [: y( "&o"*.9Q[$׆Oٴz?Q*Lhwc8zN@ p _0~ g AYXe &<V2oxi!"!MImR \gdDteP/K%y`6N?}l  ~K,z   + I ! qmO4!N<   C.h m %T ;CFN&('$":4 1vz/e$}}@m1/ +7 #t#s /  CD &N vWO7 py^ E,>'G8&$+e r 1Pltd _ P-5N8NWI&lsLXu]a|_  r@\1 yksj_{P"eppLKjz{%[.@vmr}SS@-`Z}2Re> [w]1: 8amB=Lj hj5  5 0i6e6~rE$K6WSN"hIx!VG+{1 3 ^|'UfKcf'v2bl7@ 7wY>&>y0M  Q ] wm D:hmcx  }n/2pA8PVv`1zue/D5R@ |h4wqB+Nulw K]IH6t(8B iTtAYD{ ,V%IF%?&}YtS0R[\pV ya { 1g7vJ<C_W+fW N',.;W|pHd4()v)Sv IjU1R ~g@qEf[EO%  zp8I x+IA8&[[<o_c]/"0$YoP;NDl h2 1Ki{P]vy>mV(9I}ssT&jEZ{'%R'$8\qIr&%;5"5${JE8KzW93)[KDYifHWzoPj%g& 5,cul.UD+4gT\n "GdqiQ(EhWuf%.b4iX/A>j)gvKE ?PO+@^+Z4EC?sjaR_[]88kYsD-XJtw=Zwrw^ }@=6z.sl$1!;x3l"j}#f5Qq2%T"gV^:)Btx$"bC; H BwZ@.,[ %N_4 WuqDK \^OV);=!;R) KK(T 2l!rq$x $$"@OA+IqI:R vp/cI>:! Q4Mzrma8V+zQS?lTm[6\zpIwT(%-m`3]o:E65&@j `$lHb{=H~,L!{lEXI. Eaj[-MgI5G:T[=eUf}\ XG?4KZ3Q/}3i j|)-I&>"yt GQ(FVf?G' 19k$ MVLUiiZ3Q}e:/g<x^K$D2xtVOkTAUNxm^-+e6vZBv[7597~$\&qU0je-JU(5bL%%N_[<DVsGr-Mbdq,Q J3U$gVv:b*^;.@!J0 M<l{I5DzcxBrVAOQs3<ZV?tAw}T C< 6yKA0COk&)P>%TOHZ5{tx\(iEMvf 0AS$t8e P[R#g}\KI58lCM$]w<)Tp GceeG>CrB=m(]gINARQg;$RTG*Y!NctnT::X}%}tTZl ^`Pr AK1<-?TE[qs  8ufPN6jg4S3PB e[Vrz>MWyUr8<v:l]-??+'+-/?]pyE e_ 2_R+)ll" w8 8< >Vei Rpw[_rVtegVK2))R<6T[_rj:cy}E2Ih O=0V8)g1a4MIp"xvzim$Pm -vA#,nIA--%)%/[{8 ekTrtv}rxx^M /&TI`/$3c +[Dz0nR#wll99);;0 pnc}X r8K}V@(<5>8/IjGB3mtecX@  y +(Oe}Nwy{G"r@"\}QtpywV[GaTta[pgK+-P 3B@QeggG@DtrxC{X62Pwj3aaGCG]e{-I@B?%T"^fm(ZmO5/ei\TOg4Il}1QD+->p'> @xppim^/O/$ &IQtk` <IgO3" $/`/cAI-/%2CTV/` V: ?pjye[G:A]l_a]cnlG4rwEInXQ"$& {ec} &1ikt}kB>++tR- +8'teA/2"%/K  /eiO><BK>1&3  /IcG]PNXT+}r`kVeeX&}lrgXRN[e<B^\ex}xkNrnNrK+(DG1{VA g>I-+]PGTr +@Qm@yylgjtllyt{g1BVgv}\DKX`\&yK }XTGeg 2VaR[K_V[PTN6[P_[PGA 6Ng$/Vv4<EG_C- "2+" pZG8Qm:g?) "4/):RpDM>""83$$@I+$jr+@\X`Z^IM/3-1O^}z}gT< /QcrkZD< -1:<XII@VG^Xmp}zi^VO5-$5&MtrZ8$3B8:3IO^^vgxpzmVO""K"8IC?-  }ZXK^r}zmM+ 3K^m\:&l<+  AIj}&ectri\OQX\i}  x>tRI+)%2:E:G?PAEGKptt @kmO:(13T`)6I[agypaI+ i<wyyt}}  38KK:K^<g{nVNII?'}vg<"(+$(( 5>>@->@XVZB> 8Zrxt``TkzxcK-" 8/:(_[/) 8c DevxxmTD(8Bv p}pVI<&tgEE " "Ec"<<TQ^B3 @OmO Mv z}I3t/KV8CR[KN'zZ<5+-" +5:KQK@{ejn+(88IQQO@<3$$(3Km}^K1 $(:/: taRPGE:+-'4< 38/$y (1:<<51-&  815+&   +-:+/  & $"158D/8 &5GBKBBI@O^mr`O@"""&/+8>Q\`TXID::1:&+  1>Vkpzrrc\IB@8+wlpn{{ (" wjc[]_p (+11@1G<B@5/"waXIKP[r} -Mgz\K3&$gXE--% )-)4:Kjr $-31>5G>TVggcecgigtzrvZkDI y}ar_{(&:+1 +>GGGB18&18K`mg`MI<B1/ /1<>-/{]NPAPCGA?8-26:INPc]lwt>IOODMDIIDD8@:3$ taRXNcVcag_ejy$-8+8-@51& rtgje]eP]:B><38338:DDQVir}v}mkVMB81((  3/@5>/8+1+"  -&(&<:M>QGOTQVZGO1<$ ""-31@BTXcvmxx}gkTOGB<85:<B>GDIQT`kvtegcgiempz}xpgOD(1<GMZcmx}xxmg`^TXGM<@531/::QQtipzrvvrvrgi^\VQXMD:&" --B:MIVVTQ>:+$&+3:8I@VV^^\\\TXMB3+" 3>GMTBT@QDKOQT`\e`^VVQ\M^K^VZ^\c`rx}t\V<5  $&+  &/+:K>G@KGOGQ@G5<8>::>5("<8VKeQ^VVOVT`T\TQTTKOIQKIO:<+&  /<:@533"+$  $185G8KBIMGD8<-/(&&"" & yna[]]a]]aay}  "$&"/$131--(--$ $"1(8585831/+$" $(5:@KDD@>BDG@B:8::<D@<11$$" (-:BIMVM^IXITIO<G&:(  (33KIX\\ckptxrrmgicZM8< ${{rprjplggjRgT[TRIN?NIVal}{ ($3"5( "&/3<:<1:+8+/3/5"  "$5313&1(&$$$+3$5-:1>1@8KGKD@13$&& &"-+/&+ " $"  $"53>IT\imxzzzvtckV^G\@TKIQDOKMQMZO\T`\^icmemce^^QO>5&  ((38<:<:+8&1 $  ""$5-DGO\Zicgk^^QTGI>51$" $ &&   ("+1:<BXQcZ\ZZIQ>D::1&&    "(+//1/$/ 1"/$- ((-&3/33/1/---(+"        $$5-DDKXV\ZVMB>-$  (5-8/1&&   " +&55B@QVQXV^\g\gg`rem^`TXQ\V\ZVZTVXQZQXZeV^XXQTKVQTOMID<<+5(+($$$"" +$>5M@TBI@>>5<1@5<31/((("+&(+3-@-B(@&8-35(1 $ (&+(<38</8+3&3(1-/(-"&&&+$- + &&""   (/@8BB@G<DGIGIGI>@5553185:@:DBIMOOXVV\QiXp^t^i\`ZXZOTKGB<813/5/1&5 /$    $+/158<3@/>13>1>383-/++("$ "   "(+83:B>G>KBGM<M>OGQIXOZGOII@B@BDGGI>@38((&("&$$   &"5(<3>:D>G@8:+/  "--388B8B:@>GGMKMIKBGB>:818/355@>DDMGQDTIG@:<35//+&&  "&+&-($/( "(55D>KOO\T`X^XZXX\V^V`XZVQTDM>B>::11/(+" &$         &8-55<8D>BBBBM<KD@I8D3>38513++$"      "$(&/(3-<8@B>GBKKMQGM@@<833-/+/   "+/8/>8<><BD:B18/++ "    $"("          """              $$/1388>5B5G1>51:+3+1+1(/--+-/++&+-($&         (1+338:5818--/(-"$   "&        $+&&&+" $$$"&&"+"&&(/-//8/8153<1@8<:8>8D>>MGMXM`VVZQXZXcVeZ`^V`K\OTOOIOBK>I8G8>::<:@@:B>:B:B<>>BBDBIIMKOQTMVMXTXTZVXXVZV\VXXVXOZQZQVVX^XcVZ`T`ZVZOTBO>I:>81<"1           $&++>+M/I5B<>@:D3<1-1-$     $&(+""&"          $""-&--(/-/111311+1(/&& "&& $$ $$$""$"($+((/++((&& &&"     "          "(/+&$$       "& "$ $("/(-/(1(-($"+     $$""( (($(&" $$"$( (&/(3+1/15/8185/1/-1&-$ $  ""  ((       ""&&$(&++(/$3&-$(+&+"+$"$$"& $&"&(&-/+1+--(+++--3+:+3--/(+(+&(&&"+ $&  "              " $ $ " "("          $&++&"             &"("(($/&5-<-B3@<:<B>@B@GD@I@M@IDDDB<B8<533--(-$( ("$$      "$          " $&""""           "$&"$"&"((&+$+((+((-&-(+/1-5/3813@&@(:1353/1+1&/&--+&11 ($"$( 5-$$""$-( """"$"""$ &&$("-(-(--+3&1&-(+($($$$$                                            "                   ""& ""                   "$ "$ &("$$&&&$&""(( $$$"("+(+--3+8/5-3115/13/5+-++$$$&        &--$$"+ ($&$"( & " &&  $ "       " $$    " ""$"& "" """$" & $             " "" "" & $"&$&&&&"&"($&& ("$$"$$&&      %#!                          !!$&&'))"'$&"$$'$")%" $""%"                                                                                                                                                          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SideStick-Softest.wav000066400000000000000000001360741366722712400244320ustar00rootroot00000000000000RIFF4WAVEfmt DXPAD data<]$50 "o_ &WtT94 ^>u/+( mC 0=[3 .;x9&KzTA yE vy*s,0g # Bi /NXm1`&&fcx^8#W/4 L $!:7 XOB!HK/T&qBQ8f^e`n&%u'>}aAa-!; c 9e |~< oQ~zLA""f) 7_K!A##k"a 2(Tz_v<D  BHXXOa MNU* R Ggnu!ޘݚMuk WK޽m,R"R0ߦ~:?i#>'+)Aj5 6OWXA6 9"#%p()]+V,J-j-<,l*y(%!nkN #`\ e -;,"N  5 .n gw`WMmn=3 // d.kP27 p0WuMn#ppߎ޽`\VV_][:h($% 2M # hX "!!!d W  g )L x u #~lCFZVF16 `wk <0Pc Gb@ } K t N u9Y$ \D v g M-y[ D{"*cXXPMqfU:NTdsv($=65~ 5h K ](^7 V g )0 I  . f  POp? #Iqk -kH!JK_AmH&u*02y"Qm`:<USfn2  5 =#I~ R hYvUU RX<0{io3 J< SVt5REtWRK{-K  J/ vD I  i M1Fw,i3a 7YvC/QNHVU:aG|.v '1 d ]K ]Q .'BNg17BZSt. ~ `h7>+>MNOC/:-B[ -tO+m%R)e :OO}nI2S^~ 1 +2?.H1.j" A  {  /2j*GC'+Xcu(sTNOL_3Z6 71eY`oF^Kr cn{RgM~y|_%;fV(=    ` mLEkI_ek#EFxXjiDnLk) m?t<Vkrh=;{k1fh**~ !; AsXx9-yTI|Cpcc*C(7 !ZN!-n8dGIP Uq[F./[l`4M d;;&U:FFe(rT^y ed # Q@y^Ew|zzOA9V'3eXI`BpP4]HOF ::0w]VWc60Hf>\A>oo~)pf0fvA3Wpio{B_| I+EUn{.?wWKXHdhaQC28*4  L=5!#Ww=`c`.RL7ScPfwCWk`qcA;``4Rp+MbwE<-5wtU[ 8O8[#gm>)AE& V'6zQZcf$:<& \\r p4U7+6Axa8:fsyD9]Qnq1LBEV1<7E:NZmwZ%.*jG!e q3*SV$b 3+o7c( B!da5,UPK+UgaL;W [=4tgLi`7cftZ`4H:H%l1V'(OkS2cj>{+TL(yg 'f(~}%~39|9`wT]kiU$RR 4ni?YH1M|6}K4mmf*,7 Yh{#/f kBO>II:\ IZ6M?{:UTcTotTX&KzPdpk`k"fR@R=i1w:FbK|, =%@U))7BkL1"n:Yp_b BD8 pU.n$Qz9.xoZ)UL%`Ke c]`o~K Av8tk||85 -cqQK'2\ }4.E.E S6{x =# 4fkqE44Fc`nhV@rn ZUs tbBk3TiIf:oo"I_P 1cP'J/; Mff&1Rr+:K7"E=qQcS7K9Ke)qU+H'7]knHz3=,wwPB9xf(!<|&#CCQ}x1B%+nZ:BnV_F.LlU~ooofH!M,b-6Eq7c=;m9p74421-a)G'(&M) *s%u%*!N*82< :3T&u;Ԣal۸+jU/i4r׏ȻLĶ{rngۼ+鵓իZ_ǂ)G<쬯gШe'1x#"8ŬŜ4hw+֍قo.\Sj/$-55.%Ln !"%{&'(-5<5>D>=::7<3.**)*_.2z83?FNS:6[7:>B91)(+ ݂%˘ǽA4߻k[؉TsЮͅR+'yH6Wն5 -юQZűh<溻 &AAvܷѭ[@;}61+$ ^* U~k~sM8;^;1UM-Q6buAio#W]Cᕸުɍ ߸zV+Ծ̎ʸ p`e3Yߐ\ܮMM+6266 A~3  3 _  z.1/ Z  ) #).. 1A0!..0./A0.i*$F#!Z" |  % `b%m#(("Rom  z  (6%'(-0.26L2m-)&%l  #C~H{ |"$&*U+&-*$:$%J#j[(vH @ ma r  DsZ3?K߸2ϒ3ũXAi'IJ}ե"x>ԣ-Ww>myk"HD+@ܵ ܴ9 oFYtg B> ZmT+| @z&$ &)%YMR &./3C1,%J!'7J]h'/42{*%%&*1/c,+2+k*%"( | p ab 6 f k I ##q 3eb9U+3^D Q yze) sL#:z) wbJ,s.Iw8BPX)0>  z'BRPXpߩ~t_$1iPV^OTQ BOu @CNEGe  x6}yglnv} +  7U"E+/Z1b0&iq])[HVp^ j2` V!#.q4K3/f/31,0G76X242<)5!zn0~  *l f?@) -[)%$v"%| !  H? S > aRg~ ! } [HW(rzid׾gћ!{#V]l5ތs2W0fԥ`e L|e98/|G~ܡ>]|xTwY UIle$@5"1 7.!"k%#F# 8D / & X= xjvq2Ns "u%*/+"%19:U4-T,.{55/)t!y#((p##4'L$X{?o.}j5Y$ +],kV1ߤEaR/Yێ۲ҚƠfӽ,A27J]Zv\ݓ٫E(Q4m=pSKBRӳ5a7uyIے˜ɥ$4׬sO. < _L!!F! %"it-e (&_r1jZ\ N i @ 5 B $X} Z%|(W&#$^(.+u*'  N* K-$$w"9$')Z,-A193-%U"&@*%t  % $Y%#=4R   oCn S6h~SOyV-!CL#H#@BIږjԃفc+I4P̃jVDr6?dw-bXECK%}UMLaבjaWڶ1ݲݟlat{`W7kIY>$z()&,62(3 4%0,/1*#3>=>660.0~3o42/+%|!Wt5 cg$n'*9(E!2!(,(9  8y Sk !$*++Z. 5:51. -153R+#~%),%L ^`x eXFK P  Qk ( /  W 3 } k/m@^ - OVo!m 7.>~Y0ZK#)[%qb7FP5YeG&<U9v8#h?4?qA,, FE[G'EC x b<   2  ' i"< u=ri- a~w p_1@7R z Q  y:21"5 z h   8 ! 01$nvS8^VGi|}d%[ R~t.K} li ?6 ;"GN8CITvh"{ ofbhap{pm@=gm_^?_{bQpJt2w ) ,$ - m&#yuE*y3uE ?; 02J 1hx!9#J;y%en?TD !"_b 8Bp 3pX)`h F uDq@| V-?w3f1& Sm  ' C fwP m=+1Cu `x Z #f` 1ZZO q &% z~ X q - 5 7!ofgBSTW8lS<_4nwv&1% xtX {4h+8 yweq3;n>w2aQ4e"    5 7SGc5R2lRO'[t2U1 g3O  1 6 ~ 326 l[e ? s]Irg7 /!;P #*2)DLr@Xx ZK:UzohF_|zu7(N}0OgTfR63KQu0ni/N0@XC_S&z_~Z.4sCG47v:vI- F  ZIw 7 :%Pi5 8{52LQJQn ?J0(S75ePccUgF-O y?%-Jad=vI 9q7r[C7rE"9H9NK `*>ObHgz >g=\&M9j_CQ?F)?#F?(t* i^@\,  N ^EzSTkHQlS*R(`mQYk,ePK{"vark9-*[Y-*,w*e 0&(%4nnS/.HHxI=uS'x/e;FE<x ] <\,Akh  ~ > q  6s} iW2">95sYy~SbWIzq1J.@Jp#KT,%j4PO~[x&l{ g^+0_AVK1RGc<1hA @ViCFs^0QUHFJh +saf#ElP!#VK$x:4mHF1#U(~J4M)!K'FxT!{6rf10r~UU-A[#'%1vQ&;VI"Q~)SB:Y+hz$)[ZAWK(L$Zu;L=$ >) t1%wvHT I!.]/STN!'`8_} a+ g2RX>+JmWys;+j|"~w[bkoU1C$#TY_+ck<&%eh$N}s2Ii+[\=c6nlK!>-C$dz{W((Y0G/Tr^~|vLJy}gsJjL>x]c`jQ( YG{ F6}T/E`y${ASWsji43ZX/;|_r&y7Ta2r+bY*: JT~x#%!Yi813T[V jf'#b^%n]S]by}&`H:N akJ1s&/cw%az!g9KYFYGrlS&X`M,<YFd6s}2Tk\2B4Y O i{[hY_rhu6ew_16xZ:qV@A-kjJJWM   EAX)HH, _#sI B s9cMAq}yv[Wx3<R5d/(-`+ IGl!T'^h_,8",!K0\ "5eZ$+:Y-}8vOp89D8el|w}1f|k.zj_$0gIS$S@?Qf$ujgFZg3`jzR+fr#5,R  -el?+TDLc <Z`0tBAhP e 'I=ass:D7DWwR&$@iv3\R4nIit_F\>&uy^BJV{M#/%$ f;:%7itq2}i p/ D00~2pTYm\9:V^ ^y$6 ]nkmCp0/!nLecfm+c>WM,.9 ah2s02dsU3,IzUk c1l [JRd@bZ`m`OwR<-A7ztIqi*CU7G>7Dp 3v4',{F"0`M]#"H~VLjQ h]uZ,D nV7g<XXQwqCZ ,'3.jS #!Wyk_c'Y;v1^LN/ _(@i| C)M?s6]ABE lW~x9|!wo5je393O@T N^:`DPL}+,+V^Wu;n`I>~zga_A[+X aP.i(MfmF]6%aMr9$g[K4Y /2&,,eV:qXTi4 ;dSX2 @6  4qZ jnwko !]zi ] G2=2o4v&,>F% N mM%)Iiy m;TE+.uf1%02u&Ij(&c!<lWp\R6cu=jS, _erqdXgG =>fZ{5m]R<dGdJA2TGu~+:;5HS7?>) RT {X6F3V&}LDSFXy%YNloKxBJ9OFb0)3EZhy_cVOh<HOvlnekh jV7jyL$"N^oz1Q.1v}byRL'Sln4KB86R%1=&CciX-,2MmiilNBp0xVejrg%[ "RGW AMprq"q:2- }iKhWjWo.4vv1Fo\ V~e(/3F$E+'*iF`i<S|co.GTa xH^BDQtG$x[^VZGC{-%U]RS]#T y1`}A^ 5$ M~W'QED89N`H#vt{ufBu0~ $e+Y'JAlJU_py) wQLS;XKVuptWfm`&Aq{O"55UBeq KORQ A,=D yQGDRK AU##s !,Vmwc^XHj1gwrY{:+7K1]P*.*q$1Qj~+bil'2]47 DC9I0Lv}jM=:4!|Hw_M0EGe zrbTLkN$'G_JJS3p`v++4i~]Pu]`\,=PZb.?7,pYUMGz~g[scl/o9^hm%:dw~t|vn^ftvO1iqU V8f|D07? B&sf ^0?^}%+[BzN( .CP*!1@9o{RC|p$B koI Kg[RnF m+< CrjghC #7*1`Rh= 5]^CYZg^f`}UT-V}=)>,)U& `*dm64-&Dayr/P!hx:uO>#k/Ooh?u`o+a|FjN"{@HD^D,4am]zt``B@Rzj8w!@E$ZmB;k7 I8pc@F<,&9:3@kZH6)coGwo|t<svbKf3F*{{dnd54VvIV'%:xy`NX/,~17?B67AIQ0g`jjbI_+k:#7Q?:a(bvWy}Ua?%*@QD>EF_4jW :0;[ch: *y3}""':OZH!!+'nos^EOEClA %!DL)\[DOY:!.3$ETF*ArjfES \~e*.$3']b7>@1ifpM!bT8M}e")E^+Qzvr\kFh}oC  #LCF?(uyRpoK&Usbby .sT4!-/.%z] II?fm{d<3 ,'1bG`(  #8a 'R\R'.WoY4 fC )Y! nQ9}fb|Diydd[8! b@1  -RVUA:e<8$_BAhZzy8 4at+ ESQc'#G}q$M?9 %<(v^= " )J|*Cz'!&Z|F{hyupHwv{" KoccllbfeztT/C_kkL)dJC#@E/!EQz|Sd +:JJB)P%B=?q IZe_xgBB009>@]m,&zORt~9 $'$ .?=.)12) :l z9#24kQ6?>[RIPSvPla=@lvvmcQMKccF)/ ,1KwiA6hlH40#6r4pcPU4^lxtaA.Fd-^qV`mqhkqxj^hl_<:DJ^iC@r x! ./&S !A6#D}(KWEHE;F:   9mwint\A)<S!(F+ wj:)33=TjvjSbM k3,*4-7<1@Igldfup933%*-8Y|`a_kXTT[OPTUM;>> #8$oO<"/1/!Bp IE&BMM=4<zE0'B:Q:6Ip!<73VehWX?Ngijizd]?&'AdZ5>wT6LRD*%!4=^]QKnppegVbX^RsmT&~bP20F3JaorL-Z<7K<*3L^YH86PgyftV=29HL[LA]sa_19Ll58  n[0,4) 1I?Mcrpb\ZR\h  tV 1AEKzf!gfxnjl]G3AC% .87*"Vu'-1*Kt {ssV:(fCCCa]\94D[rKd`ss4'Fswx{epwT&%:=/ '\9mr_2.$*!  pRKoQ *?M9.2BJC"ZL3 /C]i~q}thSQrveLc{g\RQ~{_XUiaecx BRt~-@RF? _NEB0 -3CkmWZ`hxP4)S\h`hmxN  (>OS_kke[PHZvzkH3_aS]mqdKID=4LZn}(@F6 xmlX8|1t2@JScfmq]bVM6 #)%BCkyryvXKA39D]oua>3+"||r}|l``~ff,-50#  .=`gj[C46A3)L[pr|i3 /! ##IU{|laOSo}oO. %B2.MZu{|vbtteIL0s}r~jPUnzZ7,4 +B^ywr -(GRW7'%nO8# !Mbn. nYOVJUYY[ehx}prnr}(.26&(,*0eXH<>>BJKWSingmpmfWr*&''5=1(&<T]TI1*,2;>G\yfcE6'8Qdu}vgc\q{~tj`Shwqt`qzvR2&"4FVI`jriN@) eKKDVQ?6" 8@YUgu"9,hN@/.);/-7Tz{x!9Qh  ][q|e]Vfi\\TQOS[Yjushgs|t|ijcr|ux~}wz{Z5'PuxaLFJZU]K[yZ6! |qgk}spwk[RIR\oeocibjzz^XDKGF73026:KVu{yxypdO7 -8Rbilkr('8EPI7:D]hhYL>)&.P_nxsi\LKRXputoix|kxeoe{rr~lf]`^NA2EM]g\OP[F>&+&#rqp$ 4DOPR[[RH:3-2.%2<7" $!"&3Xj|lYP7#$90@CQJackigcOXfx}}iWNAKKOF?9A9>GNIQMG7.*6CECIDQHH9DDJFIWbjhXZouk\WYU[T@13(#qacebXSQR^^fuyxgoyufZ\UYSXd]THHIQI=DUiwwgTSV\jy /=MILB66* )" #/=:-*" /9FIWbspVU7,;Df}ncXG8;95 $$8C>=:B:RYbUFJ<OIJB9(tmteO9043-!"@CROdm$%&&  ,<FGP_j{vz|`F7%)6PcYK.'2>A9/2BSWG5 &38<0(#18GX[XWMG;/$&" }j`Q>2'()@ACHKNX[\S[^_ofZVOSKI;3,08A8)2=AFLWUk\_QT]YJD0)  '&7+98NWbcca`K;47@=&/!+ /:Qdj\ZNPSfdmZU;6-{mb`UNNTZ\Zaqsssum^m (2,&*=Da`njzpkUMFKE>,"*).''!$(** %+%24A?-,+*'"0%3)=:EV\XVJV[qrvjss~o`B. #7GK=NQ\ghps{we`P<(  &1M`qin]WHKMJK0) |tiaWOCI>QFP98///>>CIC@00(#48CLJK3?9MFEHIJOQOQSi{ppjih\c^TT^alq}"()40<=4%%#  &$//=+/*2CAJFTalt|qxkmvxmql`]druxyvrRXXfolhZJB2)  *7K_\SLHYSSOX\h\]A:&*;;IAMGFD5-!!-&. vohe_YWPYf" $%* !% 59DBKHS^r{lxqrrptsyrvvp~gPQIFD4<=EF?<&()*-$&'"'(#!   "%!1)34<>?<BEU_pp`YKP=2. " )"1-A<D?O\oosuiUFA@8155>77<ALK^Za\lmz}~|{sinq{rq^ZULJAD>KHOBMBKMNQbl}teUC4#xwobg^oszzyojv!(09+(03=58(! !01;>?RR\YU_]_^]elpoy{}{~xxrmshtwtfZXFL6: *$$5=OSdbeig`e\[SH4) (+! *%3$",16//-.=;0"  "$ $0GMPPIQGHEEBB<OGVY\\Ylkulf[WYfp~|_VDC;7,&*  ig\YVWTTRNWXVVWYnv !-,/#1'(!!  )$$#($  /AYfj}|yynspxt|t{nniggapwys}~|x~tnXRPGKHNNWX[XUQQ^afjedfhspwjoidicihgggkd[J>,}rmd`abgbZabpmotrqqw~  !'005-'$($$.;AFMBDBCHGYXgamisq~|vgdYcY]JB?:7.%))0/) " ""!)--)$  (04/%'*/(  ~xrs   !-.6052=*6%%".<FSAI5ADALKWNQKNDDCLWc__]V^WU\[]kevbf\cmp}xzunbecYUQSPLPAL=EC=?78<<8>EIPYbfe`db]YL=9183,%   $7>DEFGIJKPXUdms{qqdc`^ddbghs{~wtbkfiibmjp~{xyljf^ZJO?>8492/"!   {zql_d^j`fTQOEIBONTWVhh~   %+%/-2847B=M?B>69;D@30/191<2:>LSMSJEE8F6;(/"  "#1+.(-1:AN^SYDD0. &'"   (!4$*  ()#       $1/=@P^q}xzx}zpq\eOL8),(+)6/6(0$4*7(/+2067/1'&!%&$*++,,$30:=<A?=:3%&*+ "'**!$'.38,5-?+2&(#+)(!)$1&304<364740-$*(496BIOLIBFHUSb_f^fgustqioqrknnj`KD=935?9A::32/0)%%  $$% )    %#0$(#"$/*6)7-02,,93C;>8?8:)' &58B<GA@ABNWW`X^ROJJ93"' 2(=2D?@C8>77;;:)42"       " *+:CD>@<@>AJJ]du|~zs{t}{wlc[XZTRHDBEIF:;3=C@B9>COMG@;52(! zyrrptlppt~"    !+.HJ^Yd_nuyxosu{zuilbrkjnfsqtzwx}zvoghgfeZROMGKEB=C8<53A9A=@=?KQ[XUWNPB;3.00-24BAQOVJWORNIG38%1##     %+( ! $0(6;@D@FBG@C81-'     !"-'(-.8450.0*$    $%0$* #% $%.-78>5857>?;@7=4;78734:<9A5IGRQU`clppsw|yy{nrdmhqtz}x{zw|wuw{z}swllbbTUFHEHE?EBB>;57:6?9:3)&"&  wuewbx`o[l^wt   #$+/39:=>CGJQTRYPWWXWW[W_`e`WNLLO[N^T[a`kge_b_nfk``USRSVLKB4-"%%)$/,0**       !"!##.*-(+2;CEXWgdjnmiiej`b^ZaWcbjmoncaQK@8.+(#'"(*))*)&&$        "(-50<0?>CMNWY_bcfgmi}wvrmb`ZZX[]XeVeZkiwx~z|}vv{z}ysqjwfuijfd_\TSJJJB>3245.2!(!"       $$-24?<FMRU[]`]aX]\ZdT^QNQNTUV[TbZhabY_Whciimvtxtubn`e^SVGI:7.23::<<;ACA<6/3%1$/'$#$! )5/=;:F:IEAE791*-!$$'+(  -:<B9@?KJSSVXPXMRGG>A68687580930423?AKIKQRRWU^TY^X\WVTKMEH<8+%(#* ($"!!###  $)57A=OJSZX``Za^dklyr}tw|}~{xpklionpmnkha]SMIGA>94/3,,)&%! !$&"&)0,0'* )"     !( #%!!    *+*11-5*0/2:9?>=@:8B9?899?9;673<3>7@;C9B5A150(/#)   +/7->;=A7@8D7>/4*2((*$(&&,/57?BKQQYVX^`]]RYM^NXJMDG>?36,1++-%&  !+-.,-$(%&.(.%%" !!-+1186>;C:EFM]UdV]SYTZU\Ya`hfa`]XW[Z\YQVMRMKFDHHLRKXPUWPSLNHHIJONQRMKF8;3-/"*$&%#*%& #!'&+'*0$,#     ! (%.)-+,)-.67>?@?@<;;7;442.0'')+03;3>8EBPJUGSKMIGABC?C@?=:95;04,'"  ""    "$'"--164;=?@<ALFPGQNSQWW`]b]YYYY^P\JZQSSKRQQZNUKQSNPMJOIPMMJFCA<8311.302301'#!#$(,!($"* +)&-..((*&#""$"  "&'./1<2?3?;EAHMKVQPPISOPSWTZPUNORLQNSRTSRVRTVNZQ]Xb]gcee`c\eVa\]c^`a^c_d_\ZTSMHE;9.0'-$    ""!'"'$(,.3.4)1)0-.,1/7/7465:7<;>@E@F9;88:8:5827+0&'#    "'%'*,/66?<CAD>D<B>?C<?<=9;7=8A=FBFAFDKJKRSS[X]e]e\a_c_c[_[_WWWRTVNYPSWQXRUTRPPOJK>F=A==>?8<2:/2,'* "!! !'$'#   ")+0367694;6;<;C9B=>@9>;A8@5@4C4B<<E=I?FB@C>CBBCA=@>@?8>1:+/**&*"'##"$!(&      ! #$&/*52201/.)*)(("&#!$# &%((&+(,*)'%)"+%)+$)%'%  $(,/(-*/,/00.3.2110,2-40469<@>@@C<D:><>;A9794685;9>747.2,,*(-#**' %! #$%+!+%$"  "       #%,+2,3/056=9B<JCJFJAPGMOFQJMMNROVRXSSPQNPRPQMOIKELEKCDB=>7704.0-%*!# !         "))-1153578:<;?>GBHCIBKELEI@GDDFCJHPNTPUSUMOJKKGKEIAC;@7=3923+&&%"    "#" '".-45:<@CCIEKINLJJHGIHILIROPQMOSN[O[WVXRUPQPLNINHKGDC;>8961301-0+-(-(*-1*2+6/24,7/7.0)("!     " #$#!!'%##%$)! ! '("         "#(*1/31223:6<9>:<8978686698=:8;5;78::86738697?6>7:8:6<8:=9C;H;G@EC@D=D;?:<88708*6(5%2!*&&#$ $#   &'$("%"$''+(++,44995>7>=@>E?KBNILJNMPKPNPKOIJLFJDEC@B:@8?<=?>><=>@=B>A@=@=923/1')$     "(+%))(&###$        !###*(0(5-845;7984411...,,+/./2+50470523224.3)1*/,*/).')&'" " !" !        $$(#.*0348:?CACADBC;A99:2<-9-9/818365572714223.3124/301-/...(,#'$(&+'.(-,))'&'*#'     "!""#%#*',,-02355789<9@7C;D=@?<A<B<@=CF>B=B>A:=768442401+)%        " !%"%%%*&.,/2/6174974626597>;C@FCGGEMFMGOMTNOLJIIIKIOGMIJDH@E@@@F?FCEEEEICFAD@D>B8;5724-3*.(-++(*%'#""    $)$)),)0,2557677699=??>A@B=B<C>@?;;@:@:=:97334.2,-,(()%'""# ! $'$       ""&)%,&()'+')+,*.,--.-.,+//-1-.)+)#%$   # $$#$"$     " #$#)"*$'*%,(+++/-3-2022.1-/3.6/6233141619/94452/,/*2-3/0..-,(+$+$$  !!           ""%"$'&,*+,...1/62647:::;8=5<4:130102.1/-0-/+/)++))' #         "$ )#(&'%+$(*&,(-),(*))*,.*-+/011263<4<6:4;5862411/1102/02-/+-+)()%%!"     $ $&%#'!% $#& &"%($+*-/1052436389::;9?:;787765634/0,+-,.-+-+.+-*+,+,,+,-**((''%##!"          !! !" % &$'&$$!         !#" #$"#"$$''**+++,)/+1+4/5/31465785865647668798998788999888888867765617.5.3+.,)*)$(#"     !!#$&%)(*,,3273655776<:=>:>8<:9@7B<A@>@;=>;<=:=:;9946111+-+'('!$#"   # $ % (")#$&"("'%$($'$% &!#$!$ !""         !""!% $ $ &&"""#$$ " !"$#$#"#!  !! !$" #$#! "$            !! !$!$&%'(*)(**,*-*,)-&-%*&&%$ " #"!      "%%((,*,,,./.0.0/.0,/-0102./0-/./,0-1,/+--+,,*++$, (%!       ## " %) *!)#'(&)*%+(-+-.---./../.0.,/+.,-.+.*.,&-#."*"($$$"#          ! !!!         !"! " $"%$%$%#$$"#$!%"&$%##'"&%$&"$"!!       !#"""%!$####$%$&#&$'#&$&%&'&&$&%&%&%%%%#&"&!$!#!                        ! !!"      "" # " !"!""  !""!#$$ # "#           !$ #$"&"%$#$%!&!%"#!! !                                                                                                                                                                                                                                                                                    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Snare-Hardest.wav000066400000000000000000002635501366722712400235630ustar00rootroot00000000000000RIFF`gWAVEfmt DXPAD datahWq"zF>;J\QSXZ_XlTQNUML K&IE1Cg@ >?WAh=94 0+D'2&^!O%u$O!# _ $-t+qKYJP$:\[ɓoMO¿ƙN[ٱKķDdQUr"rДŮ\yNBb =159~!W *$n$@EtÈv~DϹi}0 "#!*6xZ!9!",7>A*AsADINqP?N"JiH K*P`UBWUKRzP(RTTCPI}B!?@DuHH''  r  +386&78;;;,=&88771;07L82/y,-*+&g Y n Q2$61A!g"!l$M x^!S= %w,+,/.*'&t$&,/,*%_Nu&-0߂Jm~χ'֒шB²ś۠- ٸc;+HAqw xفz*k|%ׯP.4ptT0\.[. B l&,**+,)#)+1*2'z#3wuz>}@ '  .,He^+%[^!"_##& %"'Y*(%F V]E#+_0 .%* w[ 2~ 5$I I/$I*ZJ2y  DӥܣtCdL]#$5.5;@hDB{5) 1 !r[eZ?zpzEc88gRߐH֏ي0>yfo"xR/պҭҼС ңl?ޓ&ۣGӡƒʶՋ3˹7-ѾXݒM{u,  2""&/.,0622,j m LuBvg0h#" !#S##;j } T &0g2 *'+801=MR&HBA>C,>5.]&0 &22)g 4 */0*?!@ oy"C  ~AgO"T!^-?a1OgHTCXXmQ3ת^'5Ɓʲȧл{:yG7l ~{ }V)ׅ؈nPbl#,s\zRqZ9] BraW n  kN]IB  :  mT[!DdYY{yL3.S ?&8E.JnK.KJD8.- (%'~#T!~(R2U6G8C:7/), 27 L/{=P pUOo߽ClIݕu8x]Z2W$}Ӱר#ҽ|7XF=ӃxѦڛljGFM{f;XS%B7 TէWҖ͒Xi^uިX7f>HAwuR at 7GF!L$^&,8b9+)-#'):+%(0S5k2+/*Cy'H + 9A=  #$U('6*G'te!,+4+6.:%%M1w;?:)!z&-"3}64.Q'#%+A/#\  3}YMp oކ$h=\8J p4(g9 ;]V݀u>L&{ f7DYz m pؾH=sLcWءn<,$N9 k*݂ܕ='[AmBNBfp Yh<t6w"%.s@A@A<91*,.)&d$O%*,-}&\ %  [ATl#&,03!871+*x(']+--|+!, . .+$)d((*,y-(#',( md{ S g5L  yj?V6T[TدݏZ>RhԉՂT+hx,Ovχeԇ+sA4JZ%Jq PG! z 4: `cc `]0 r \S1+L7HPRO D]~S6diVxUTYH +fjk9KXQ>S sݗeػ`JXRFV6a4 7 ){uc' ?'  ' [3DZk!& a 0J  l ?N}: >  e  `kf}n Kg=T97.nvq8   O# Y O FB<ypq6t5r;߮7v+H o ?  E -;dyޙߔm1M:i~zp"JM[ y E N("|r^: } _ s)? =%"  M o!p<Z 3 &$ ! #!`S98{ % U W  ~ -`y$O $ziyauPIH9\ _c9itiE=zZMGY0VH2M7sP^J` F9 Y ( f&zk@e C  a   [ `| r | Q BKl f  G j Q ;hZ[t/ Nk  d c  $uZ]  a:a;%2tD" cCF-sLS  '$:_lHsr|V/m^a!RUU /UAo  ,lPuQ2JfypM2&YoV5K) f  l?'  c I @?>L.'c -iF#xE!#0^e<7I9neVdvjgsj@)HqU z \"?qerq66mb''5||F@&LYQjZa E 9 . |5MR@VQ lm 1jDs   # 7 z Jyana_yaYjN_DN(02}Ro,2EUG4#5Hu^* p Y!E{H x T o 4>B:bl)TwD71 t2 l u ~K O y=o"p <_I89?|Fn :\Hhn3Cxk,Q,:|-hT <G*Vd  o * a([  @ [o;  UB}  V? U_pnBJ'jmak(y7@qPz%$;E'6bOai\~6]4DPQ^|(  N,;$otIU :Nn F {v]K WL 'hfsPu1!cidfTF  J r%G<duHlJ.{m [N&<|xf}$w @ Y0 { K&](pc]OzTF_"LPAv&[A~twocHfSS2(3A%v4nNhZj 'y2W/_REm ) N y*[ 9 k R -="?c   L &c_Z'\JI   ? V % J 3 c{~ B`eYLa"^}Q+0w&Kn| $ `sLyeYa<7Cc94pf^M'E-w1*i&+[>w&lN,Pi|~Ew:qUA!Za eX,QVGo~>dK6)x15qdwV`",>n w _  5k  o ; a'Gk| PJv6A IXa\kwY=x\` aE;9Z +J*.JTD[|8?|A+>tgc/M}60(tcq.fq.AjN['x$u&4lC-j5E@xJ ?eiA;eZV3=wqjzes+W%Fw;R"'"ZgWwe]zgN/7Hds5+H"""q1pXJff&\w1O{J+}mN Fc@xWZz"XIGNxz<p`ZMX!eUeE2bRf&N ZOePA&xw}N V8kS6s:88o+<%!G$S|YjYJVeHcfI~a+FZ<)Aos| dMx5)$ /L q q+#(z>5'KaloIzhi/4UI"B-;XmLW']NilovCJs:%.&9mNY$5rQ'bj]X\+1cBzP~;2}csyRNj^{F: B~RW-.KnZVP EJ!&hn+' }`;uH_ 2x8(]9*+A` <9>- YD|\<QWE14Sj`rCj?7&u6 _XAp v$^y<(uGT1h_ #l2"KIZOQAe[;32G.?buuH{TFo> 2`Q2I% E-E<ia?s J=2L`v6W grDE,] , nTb4Cw8/Gp_(|m*tj->M2lqs>%tN -jhmT"Jp`hG<u==n<<;9q~r@M ,~#0o9fwis -uBV}$Y'mFaxvu_@kt!q"Q7%'GHwh/Alf-r4uz{;= {W [, ]dJMeG7V8'M_L6K%xPrtGo#bcd?{!*[ uV!uQ|ANm2 .j#h0`)kxI-:~C0qJ$+U!j}?#>R>y&c!j`2?+-f77{qM]3,HT+o$X bA$kt`h ?K)  |<RX(bzSd(JD{[D4(ol0FVRmj'AKJKol?`*`e{J6: sMJO~X? N7ds['@/b 3gF42:4(p_KdM"X]--F&$>A(Xh{1%UY{qZ|~2*/ g2UJ#@S9/=h\mND GLma(Arbk< 9;5{uNBu\.G}xrw&E&UM!&]^jLX 6{JB0B)-G4 i0H*F[|Z#wUkz&NE={&A^}:"~wt\;K~BN-8PI{IMzEUb0"I M2('#)tbP_[?XUkQZIgP|'v]}7Q-[4?)&.!D1#: UiT'l'5T"[Zh3ACh.5@ZGx>9xe6}("~O8VUZ]'( 6 0vX)lS+f8.aTE ]h=bx3'*}.uij*"}q\:f_R8UFzEBV27~`E*%d , 0!4 c:+g\*e7=Z% KhYEhF SLV AF0n60MV ^|[pSvjbcIMjmJ00@~vu&C"s xRdF>r,.[ZbnT}`)k2KzYD T=?>5vu,.,>CU5d7odW]}X#VL ;R Be[k}-' d$''*w68JuZBYnbniy=Q/fE9W:3+X3%BDg045? *79C0]q E9!Typ>Cn aE8?& c`@/ |Z<y=4~1'l0<G_~X;Xt<[vMau'[Lib+e=1v3a2LI-d8_%Qc\8D.' ,1$Z=|a<gp@dJl5Lq*+z`Aa<~ E9zX AY2=B!@2 ][LpxY 2%OHwrSU\Hg;lQ9L lUUH)]!.Vdv\K0erNPZ(ZbTmWg73hKHPlW$]w,4XhG6nBV>R)R~[@3@Q{ea~m 17%I)Y]R'M-4ZObyJoH26BD:gG;WF 7 &w,oP^=;WQe/f+mG),X&*x%fF^^>QN(8zg4,m:d!:!9nM fz3~Z]V0" e+5pPU11NU%K$wKKu}I#4v``0PHZ)L~Dha;!O;$] O+!?llW;F =+^]7.[<$qV'@\NqcK0RvF\>&t929u\7xz*@WIJ7Yjn=bj.]kx%-A'$RZ<&M?c.~stOSw62\#m{H#S50Q56#/*QI{@RgaX9LYqQCR;5P1*3 xeo7Du\.|o0BfUf{]dC-jcll@WAaF5 O:v"$]]whGRLq,$?&^YV$#THX%[  ^0f<qV=o.w5!]VON4P% +PC&#fF+apZ Nkrl54P&-~:<)OF*M3LlJwOm Ms?@smb$M<Pys$ .]64!Z|_66 Lg}$&`+$?MU4uN;I\ &swC! eUqe"FPBInNh[f`j[< o} sf9sf~F ]_vmOef/0FOk);(Nu1**abg48"3fo~0w)NS|7hzD jsmi1` +E^j2*vmzE8J|WtMy/dd\D2ia $=9  !as%j/*j'Z{|P][^X*Ab{aBtKYHT&Ev#i #9)_t%cWDybcV ?I *{|C#+#4Fucu:Rgt:5 .x;~t^R<[Euo:^<$B JW,^u_Q(0'Bl> KePGAo*.WVaf|ZzN^!s:[q%Tpes&!xF]I0R=Gu nhyE (pi~Jdgz+;25`x[ W\SF< .JaC'*@y2Y_W *9 # eA/b]U<4xj1 *G\{zi_xxa8>\@3[> DC%>+Zgxrn}x{e[hpUz(C Ce\2ZWH`S0<%d!T>6kLjVOjzNJJTc9)}q \6@SV.AHo7ydTU[ 8BUI$(Ly]T]\AFk}t?V$VwFi^ROu+"${|V,+cu qDVDHL4kY+m5 /MB1=U"3S\3E]it>9^i`< 3T<)pjJ7c17".+2K{+v_XdeX^e,!%1dW0@,W0S^M #1DFR[F9cj?U^hMRhi/*$,D oyTIW<[#C: |JtyI 52$,L1+Szc@RD_ |j3 ,Enlh+TOE8?vpw|E)6CKEAjW_[JY4)/SKvl~kFKxPVjBkGf9 32 v]vo;>/'@R}`sD-/TIJs"BTdy=2$**OLNpQ. q K1Y@oy\. /VkUC/kSJfg?,\'41C52KcRG[nJiirBG =Q&GEr@6-'*@:<QI;kdARKXUVH*~K?Fyy D\Fz`,0 #$B11 % :]H%65`oMYI}*2T2H7~LQfp[3vT{ub[xcbEUqd>$37="\N!%87=Kk_Tb~tEugiY9mkUo\eLFD67&;Sps?(*.Qb( &NG"N]*";wh7#+.&M>2IR{zqfl}5*JC+ >bh=*O^vvv}_4k~}k@-%&;5 Q[517;5n/*7GdE: C{y]n^UlozQz%G7m,d^;`l4L:!krE2:=+EiH],7_|l"!!|Ta_DCC5i*+A?9OKiS=bSW:V55},Sabt OhaC7S_uqfic^W(=^n*@^\D-b]=3.&*F875B[uj< +@Yu{iA']zVVO\RA6o~oxu<ME[ZZ`ny5G912>8 "vqtc||\2/L2c< 4, $GMY\J<?["3UG!Tuf^lM (GVJ-1l<n}mes`XY^ 14*RPJ9(F:uUG HaW@+L$+1.Yu ?O.+.OkwiRHbZh~\;! U :jN+CkG;$'$<4)>`|y~iY;/&<4?4 u`y1.dFXa[>*&EvP[T:  :n}otytk2Kk &AL5HQ[klvz`J48>  3dts~JZTrxKPXU8  uZ1BZ3i~Y5 !3'6r|F=2#  tmY7- ?Y3a[>_ VWZiI/=quOl $!8RIZnyU=( 3"2?o$ v-.0>.xovO(`C 8!~hxgV,* ,q-7E} $-@V[J4ACQSdgmZH: 3M4D.<<OSjI8BR`kQ, + "V=fm{kH6_{tyN'R;?z   ih#. E[d|A"*CTXdL?# 1[KEOM/ &CR`K'ocjpdWYek_*M@CGLHPI<&eDC/%ZI94LO6 ('     vYo~W8@TjWmwv_<)D4+"7Wa/JL7+P(NXYTltt}y_9*-QWFPLdLH%.3Zijgu`RA#Ch_C"bO)7 7?1# ?AU`'#6pwfk{yF]RJZx[LW@-WmT60-KeQMfngULioNF_fP%1YY[Znd[{}}I8*AzovtpiZ1 "}wk=ED(+0.  )p_DJPUT:3'%=QI;/38TD60ETnXL$6;TUmk|kbdprgvkmUA1+7Hcw:Y\p4/'!2LfZTSvokV6)BH75<&zkK7 /6:=>) 49 wk{~z|y~yo}oK4C?I5%  %END<7>7EZv*OuzhW7C9P8->EJUmmnO:=G>"8Bv}zo`OHR@!5;NN_q}h]VZxcYNC93=I`v|egh{la]pSOSMK7-)22%KT\S[MFHNjo}xqjxsosm^:%'(0#`9'2?HA8;A\N_bpoV:5?(1&1?HG28/Mi +B( %>OmzwUIFh} '85$#') h_V`YS8=--$'!#A\X]Z^F8:(   ~}yuv #&$" -RV(  sppmeXfyminszqfk[G)$  #'%%0In~rdR?RWa )->JVF* 9Mw|z|sldb{{|{wtmVN>-2Hi}  "(|`6*(=@04EGCF(eigs|zuzqf_x}yget+9*3;;EJYltlxxsxwtukuljME8*"#@LIQ\d[bp}mZ1!  $0:!GFFHK@UK\PPO7?OkpomrxxrklbbeeqrVC,& "+,' (aWC1*  /2;/6KSgu}xrw  #$-=B/-,@@?7?NSZfeZJ@4<J[]N>/%-BQdg;2 " |}e`ayqV62?=% |$9@L7  4=33;;8  %84tSSGLRX[XZ\G9.D`sN31R`q}jkloqQ=Oe{tdd[]m~}  %2;V`fbYew~nxyy}z~soybtwl`GMEgiznM][e`SVXVcN9(*/HA9.*6469'86\bkhT<&&}vrqocI9@Xm}cR7IHQWf[fkf]I>/>=9&"2HgU\FEOPbactz *J[_ZOLC6# 4749B?4 %'&#  &&,"*,979/,6F]p}ZI=Nbits}x|rZXXv_\;F1\tu_OL=C+CN[V5*17*GfwchTbu{yh[[ehpdRLi~xw~yzr]WDA=TN@*-:LKB128::'**81LJQJ8<1.04+) }yd__qxT9 /;-$!0FENNA9>RjpvWILds)6IJHAVq~ql^fU_Nl`T) vx{mcr !,*4Rciolmf~    !z|V<>95++urnxxw}}vdILLXUfpwxTTHYgkR2& )@Z^UWbegX^WY\erx #+8>@PPD=24,?N^bkmx{ls]bZ`\LE1AHPTblYKCIQTA,,175-)1EU_clx~|lqjfoipowuaZY`enuu|`L@8' 'CDE168H8' 1_mrykiixzwiUPKLPM;94) &(1278;489D>;" gd[TC&!%#985 16/966(46(.*7?TddYmzlsppwy|&/@G99:]hph[iwvy|uf`LQJ\TFJ57,('%-..+DR[`TR:6 +/>//"+"   "*<358F23((/*!)),&0@PN4$!, xjvlv}vhRA;F<%=J[S[k}424,4?JG]Rmbn_`]e`b_ZNL@KCP[rrzptp}ymfju~xppnprxuv{x\C2/9DBJ>:,)##)4%  |{s}sru  ":FKQAEAGQ]d_ZJOG]dxxrdd[cRQEH93(  ,?bugqz|~z{twnUUYTaPC3$'2KA>+ !-+% (~uxwvn_JQBI@IC@LPcLLDQVeRN5.'43-#$(49:D>5)*<=8$$.0;J^^rs~   .95(*/9FVx|{jheij}f]ggW= ()*|#   5A<@;EUWackgvqhj`WVj|}pXJIOcczg[SIJ:/,&3)>8@&  %)(#/?7PIJ@;N@P@G?)yyuyq{wqkksf];AChkmV_dod[P_\pbr   %)%   /3EOH8# %0ECgprfFC8621(!%%1## "398F;>8=BKOUOF:8/ )1HUf_`P]YWb[\X`YfjysUUH\n|r`\TWPTQ>?8ME<.2)& |n}|s{m}vtkeZP:B8E@:#)#2#06NSko{ytijt| //0*:@=G;JKVQ><:JAG74F\owd]GPIPT`bfslf_NE<@FW[`cbllivt~}xzi\UFTTRVZip|wiSE;448;@>;>B=4*#,1+2,5/  *1//+-$ !    +'(1)'"$' #|sv~   / $-)$!   1#+&!2'(%6,7E\c[JNPOYTUXadgsu|qwuoyzeU75((& ',2'! uru}|  ,@9:,3%      /=>;8HNV^g\T@CHYafop~x|v{twuxboW[TQPU_XI*%150,'/AEGFI=<-?;196STLNAK7>44<,9+8?EIKVZddjgfju|~pf[[QY[fle^`HE$  ~tv #%95C@J:1"##700!" !/LDJ;6*'8=P\fl__WbgeYK[Vfhx{rnfeWVV_`W\bvzmfSJTZ]YRH?:C(  3@>B5?9C??CQ_w||}vh_VZGF95..8=PPbdis|oulyxxx}wmda[VLT[i~o^U[PX_Z[VP6:*>+=F;=03>*'  xz{usmeVF2:4EFTSM4)+-2314/D@NKZfllxswkwx&2ABNJRehvegR]HVSb`hjg_\K@11+5ASPO9B5@EYf]\MMMRWW]]__bka[LOQadqbaUYY_YheqhiUYZovyyo||}{zpvbf^e`[ZOTYTJC4B<MCC<C9<'! (.*+  ~~u}xzhi[lp )7KQG@<ACJ<3,?Tq{ur_\aiyqlnshc[TG33''0(2 $458;@SHTH^V_]cc[TVELFZclr`XDKPcivuwmmcSEAFP]ca[W\ihhddljul^HGALKLJINLIEEE;20/)(#!+&,")"44EG;A:EA985-(% ()"~ ""253)!'*--.*/-&( !)'2 " "'01F>TVh^edaf`XQJLLKJKSW`bjilldk]ggib\TOFA:3/""   $0'# $3854*,+*3/1.'-   +6?>?775.-,%& +15/22/.#"-*(*/12$        )"-'31<5;23*1149KDQLQ]chnZi]gabljorpjgiizvvvrxwqigY__hb`W_]d]WMC3- $)#1)")-&% )-3'%     {}   # *"'(%6.58CNVbUjk|{srtlsiiejdi^_VYILAC9>634/0!!#4-@;DC=?;:674/*   %*"#$ #""    !+238;FBIF?C:C?;<=A?@>AFROQKNJFCCAHDCSY`VNE==7EHPKK@F>>967;40()"           "'64?/0) +$ )+45A=:>7LCNLKNORRRQOcjxsytz||}}uroif`WUMQDE:5,-$) $ ~~ #%",,.404*0+332-0.2*.  !   .,623)(#"!&'&)+!( #&1,:675,2#)%$*,./%'!    ("  %1"-$%/1/3-&-'!4;MJSPSLKLJQOGGEDBBIOV`\mhnnpqrsqqgg]^acabccg`f^iddg`hhgib]SI<<6*&$$'#!      %,+0+'00;78?=A;:77<9GDNJOMVTWZ]dgimfh[]SPKFCA<<8585776722-##!'"*$#'$'%!%((*,.107-2,,)# $!/#,           %(%)$+-.-.1231/17=>>79..$*$---01,30536//)-#$ !!%'((,%/$--+909/3(,))40:6>:=9>A>@CA;@;<=DDKFBFBJIQTXVY[__dbdecaaaa^Z[Vaamkmfebfcfcfa_^][XSUKTIQBD763*$    (!(%*(/+4.8478;@HKUZ_accafddeinquplmmrvunpkmkgkgkgeh\_VWUW[Z^WVLRIMC@941/306093815,4*."       " %#&*'.'*././1067:9<:A::43<8@;>;B9AA@E;<;:?<<=6</4%$         #(/,93BACHIQQU`_ljosprsvwwzt|u}|w|srnjdfa[]UZSXRRRLKEE?D>=?4926;8>>7;.7/5-5+*&,&.!(  "! !&!3.7;;>7:7<7=9D:JCHLQRRKMJLIHHFLNUVMUMUSVZVaTcZ_\_Z]]`hgichccd\gXdZ`_a`_XXQORIKFAD>>32#-$     "#$-,11-.--1)*(&0*2117(4*1402*2)-%)$$ #!"&&4.:4643/((.*5.2*,'/).*)(.-0+**$)"' &"'$-*31/2...*)'###$%%'(((&#  ,%347<<;>:<7;:BBAHDLHFJCD;C=ECCECFHCKEQHRPSVTPMKIJIHJFPEGAB@?HFPPSQWPVQSOSQQRPKLFE==1:/7-+*((&$"     $"!&&&-(1'0&0&4,455=?CD@A=?@><>9A@HGMJLFGDH@H9E5@9:8:1<0:4<8836*,'(*$$  ""%#"#$&%$#!#   '$1.,2275;5<==BBECCBJHJLGMLJMGMFOGLE@A7<25504-/..*,*/+1+++),#%$ %$" $' " %$&#"!  !!"&#&!#'/05388::9>@DJKMONKIEMGNFKITPYX\ad`e[][[d[ebelclcoinmspromtlvhnggkcfcghee^a[ZYPQGMEJ@F=?5>6>57*/$#     ! #%*-*2-529:7?5B6B;ADGIJLGLCOGSJQLQKPNKJDIAGIBH=C<C?C<>;65.--/3.,$&    !#$%%/(/%-+13544324200/..))(*+0/15/3-/0226599>;D<C?BBHHMEHJHOJPLSKTLSLTMNIIFEBC@>C8A;=<21/-/+,##  "#%#(+)0-12146;><BBIDIGJTN[V\^]\\\][`^ece]`Y[XZ\Z[XXSSNKNLMKHJEICE<<9495563-,'%"&&'%$(&!        !%!'#!"!"$"%)(+,%* %! ##!&")(*,*,-'.$1&0(..1186:9=:>8;852+-*//)(%$"    !#!&$.//5337365769;<A<B?F@D>?<@DHIKNNSOUQRRSOVNOOGKHHPJRMTVQUILHKHLFKEHGFFAB>C;?9985.2'(#"       %''$(#*(008;=A;E<E=A>BBCFGLISKUOYVXVUUVVQQMPRXT^Y__[ZSVRWMTHMDGDHGGJIKCB;;69/8-5)0$)!"         "%((*&),-5/;3>77804/629/7/,-%(#$"!"$!     !%()0134276557584=9DADC@C@EF?D>HEJIKJNJKFJDL@JAG@B8958<7?6<432,.).,0./0/11.2+.+*.)+)&+'(%$$$#"%"!   !#$"%&#,05:9D>IEGGEECEBFGKMUQVPRQPPQOSSQOOKQLQPPROPNPPQPNNFIEAC<B9;6662313./+)*%%     " ! %$(&$)&)(&)%('.,1-20437664268>=A@DC@?>;97422/53:06010++**)%'#% " "!   !&!'"("(##'".'2/64582929193;8B>CADEBF@GDIJHKFHEGDEBC=<8958/7-40504-/,-*+*'&"        "##$$&'*+'.&.&-%($$! !!##'('&*),*-..3,5+1+.*0+4-0*+'(*%+#(!#      ! ""%$"##%)',%)&&&%$ %$(&($)$(%'%%%%#'%,*---.000--,/+/)-,*.%)%$%""""   ##$()-+1/3357::;;?:C<C@ADACA?B@AA?>@@EBEABBABB@B?B@CBD??=:;9::79856/1,++(()'(##!      !""%$&#)$("& %"&!$ %#+('*',%)%)(&&$"""          !#("*(+,+,++''#%%"%$!&"%!%$&$&'%&"$!##"" $ '%%&#&"% #" #     ! "%#&(&)%%(%*$,%+'()&+&)('((*&(&(+*/*/),')&&"% $"$#$!$%!# %"&%)#+%+(*)*(%%!#!$!"       "  #                     #$!"$#$%#&%$%#)$)&'))(')%)$%##"$!#"""             !!        # ""!""#$&#)#%$#$'"&"%"%!""!#!                            !                                                                                                                                                                                                    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Snare-Med.wav000066400000000000000000002647261366722712400227040ustar00rootroot00000000000000RIFFiWAVEfmt DXPAD dataY>=h!g"$'(Y('''&8&m%r%$7#|!) EWU'6EVT7 F r:8 <"MJ#>L!љѦٛϋKĈM/mTP&ɨ~ŠɑGp[|ښܩ޽E9ط֍֓ڴ.\ . e Ns 'M.]# a*!'F B!+#v$m%%%U&6'(a)('&&k&''A((?(';'{')y,w17=[BGL3PQRRQODLHAFEEFFGGF4E B-=6-&"j 8l#O(A-o01@1/,)&$#Q" GL 2S)^c1KVK|yطXQht Ud֧<ҡ;Jq%8EhSeպ,*KZ:֣֚WTҀҙѾCvK"қc ߼܏P)݃ R̀ʬp&UѺׇքֺ٣޿@ygiS2+vTS@| m0  )wJ!T%)-0S141 113R7W='DH#IIJKL5KJH~GsG?HFCAACqGIGGG HXGDAw>N??=;s73T22a31.-,++m+()#<sB!@ K9z@UM!zn~U~$}m͌ͩ-$;"0Px:bGme [פSr RΓͫεAE؆&ڝKRi;m<\*v$mGS'(|m* u  . V5OngIE19<-rYhN a ~  &> [MM9/.l #@#%'"!"!  M! Z n   [ @FYr Dl\* `9Iޫ1w> vڡ|GYRU->X՘ܫլm'[ -^} ER{o713 4jN"a:9 |[] 5 zy6 ?6,m(U c F%!o]qQ6d !k"(Qt,#{$#-#+6J}u & m/Z [O-a3`aZw#T|}v2T=  9u[  .`l n nQ;2% cy; jo|+>k N !HGV0Jl޴R) H?>+ g F nYj  ~7 8 Yf My^D>6 MNo @ja</?T2Q QV }!cX(,'"^'#x' W H =G S kbQsf}J:~+  +eYL: ԓ,װܶؗ65K JSIR?nW?hpg7v4vI?j -N  _ }@ M!at* Vh  FA   U_Y.V2t?'/ e 1 {&r HQ  $OK[^{\"&+_,*"#A 3 os& `J87v۔ig؞ۢh4c7  ?%Jl*@nq{7v%VDmtBt~7Dۥa ]j e \ . cTYY"#&W% e{L X U n  M A|"&5(g$s&))*)%%"L5M1  M  },= q HA h  )4'( ! : >d! kE}7TaBQ/3.#vYfpEy|J:%~Y&I iOD=7y8qSTfsSmQO Z3W{W,. k$/> c/z}  $_P -)G# U} !nF 6, r!W& *x#!(Bqt35`! "1>nv  b $ p9 @ z]w 0P ! fAQA=+D`7 HIm`p%f6ް۽5z޾uc߹Tl#ibg56FF\Q@!~  T@;-}g^{TLSI o $ I yZ } `##r>2 ^O#  4]_1uII: E J> H  /  ) q x d&la^ph5/KYC; 0, MF Gx5+TUGjP@t4L1gT0v$rfKLv' !tdO_euH+p ~O n xdJ.~F ) w  n #  O y  ) ; 5 ~XkqfL*`_L4oiY88n8q $K/c.HwbYz u `IWJv^ \QW(jAwZ%7Bx 9]i7XUyS@,>\ AZtXse[m8 *HaW$c % Jv[  M/wu?R5 U [A/J T -  v/ ^`l> != d } 6 l>x\d+p4 Om9LsH  T 0E[FH< 2\V,;S/wEv0afZS&}-;xOQ+Z^f JI8`zSd[!OVx8o8As )  Li3c.. r] 5 g? a . `L &  pE  G ( w" E ~`mM2Ur);DsJq%A37xy ajE%,obK1od^"]DtM#1idF[jg1JmnHiUlyR`foE+dzt pL x   U|(5h(1)$foASCg%?Pu  E a  \vw"-~-a,";"BH &VleAQ{4:*eVDj}!:*qG&2v-M%YCU C 7 U Q J k4;fu a ) _Zo y2Ca!a|G!<V>i<br/vt"L;&.CY 2 yf}%`rLM%e)kU8~r5u4j70b) # S t  i #3:3 r1~nUmZ_P6rH ] k @mQa2h`B|6^DjD:1 ~[x7qaC~0p)3{YsROe'@cEnE 5hupYJ_6)*)ww-xZ9\/Bw{u7q`]f X ^ ^(00L3=v(G"MZ j8  " d t Sw Q 2 dTy'j:7_^ev{+b a;VK>E4&S] zHBZUYNq kZ gYz3 3 v JJdkiXsd xN7i_ w r  !Ew@ 5"HE"SC}zn 2'p3 *bWhl[Ti ~@Wr) b>\5I[52eg1~aWTJm3Qi+ pJ/=m1\&l ZLvU I$hg Lx6L[^VI hZ !  n\ g}fSFz=Ik: I>>2k#=2 __EYpI2 7_.5E{@'&9,X|$O#D)rH]yPHvGUHA.Z7O/UsjdVYk L"h6I 4n"]X$*4A~P[&@*2-6y"zH PFD&,Xt(*[C.fTp'GJD/?\wR u tU ? 4F c'ZuKaqxdp`UL{.d8.{?Kr3}9yE;M{EH7kg;Djm+G%i%`!t@,  *{_uY?CwHe!hCne[;Yyq|P h"xf) a9eDjsHZL2C?]OJYeUsT Y2,\3FYNDD=@IQS_|\#$k}Eehj`QcXD(;N0P+ eh{|_W6h>0"j.s*xPoVl^9MS$/d%32WJ"VG2e.%kz1=T9 22w r8;I.;?<?wTpjMQ Y uNk@cnC,g:$6H Y%|<shE0nLT:N>o 85zhs2P k/GnW!)w4JW<^mHq VA8af+o.;W&$OyaRa/yR^q`Te$ qRG@S[y("N81::t/WD*?*u m_  jN3FLlg+G+jR7r0v5)U-EO<ls(:Kp&KOEFu|Qhjk2>&XgiYR( Ei&I61^5`7Gb~MaX)H" ySQ[8<jMb&OENirZy~bNSw"kM=F?7e0> in_&+/`;M2# Zq)NTp$(\hx(87 7Ii\HvSX 7_x q.*".pOS W{Tk?s TcrnB.W{!As#Z!B60[:"]VJu.'iVfUEhs#lY cLl+bH%|kT#sI0|;T)`l{mX&5:Vcy3^<J'DIkWt K)ZCJp%VvZy__Af@)FG$ew%g"uFll~x$oM(5D@=P-X|ZlsLr)C_x(,9.;'jS!(q^#:y,XVG_ 32J,y>C58%Ao6XKPPPXipt@jy>o?L\{GPSg^&9_K+d hiTe3v#n*XfJ95Bvo IdZg/6(7.2`|Gl# X>HDN[PJ6B'pHjRE+LeTg0 9H:(F#+]cb~QB *)Q8 q1"2 DLu!F9Lg5%\ufwf##e9MZhvxXZDV1| !n*AcR1Np $\c4%Aqj}+|r0"GX7%`%;:wz^/@ jhc3et_V?=v$uXE82oB %Vfaa w"wy~1q$bR|9 J~ez>[?Gx]^ >j*3k$gID ][Ftt-EJUl{lQHBe_/P|q<-cq*f!'(Tl"GVdtvsow}L'$Pb2 5yM45.)iwGQ3!B]G~n/t#MU5r[Ga_V#LRN!j'SID\Nib24OIB8; F:%1 )SEA62ti]88]S~<2o:QK[Rw^5tG);)V(5.mRFDV hdf$R8]QmsT&@#aAX2./?* }?SGe0ua|KF 6;Py:~ lC9&wfpALT` syi -oi pk)K"q><c=mM 'K%  ")';3?7r+hp%=ua4VzlRu^XG ])YIN' ^}9D){ "`V61.NnNJo7Ux!!C{ 5;x Rs \)COr `[*<%/e>QZNlzgVa+~m~5n M[hn OrIJPq  qe}D2G&(rXcM>R&>Ky ~e`g?^AsAbJ[nJ4GU0 jUN*Ed> .6FtYJY9lWhd{W!*[C&NF~*iitk(I p2BDe`M7<>thU,'l~f AW>`PG23XIgRE0&(6AYO=/WE]IMWC goIyHr?0GEw$M4I$Y(}-:b/?o$ 7AD;_$Vj3&VpH/\fpVd6YEaCOK!6L;UYF1[C"8YhjWzX _~/ |Y _}i-T`X$?0y@ F!^UdS;@Le8B'^> XY%G,><0 Tfc@5Z>w]a}z^7GdsA H1=RVf^5MklJ)rfBJrsZ86R)wz {0iKytQ0H8#FRN=#j,lRsytLJQHa7LzNHYO3)1/fOnqxvnLG]hM@O.)$]Xd6`w2_e.0eov+;hm|qsv, [n\R{%S< 1SjqVSzVO/9I?YA:9[3/(IzsL4POwta? L;l~I9Tz{kVBs1^X+D wOG(2!4M|wo@vluxc o[G %5Z=fF~>do}&"2xD-B7mMywe^ y[*7nuJ1daOazV/:onh';;q<'6?E@cmPh2GE8v`:QiT 6gtzd t70"Aa2[7e6!"UxtwZMct*}krgm*&Adj]R7[VK/ Fq^ 1kvf\MUYRkMo:B|D#Nj;`B]=c>W 9EY\ <r[e_E %Nw,4 zq3~H NwmE`?BTv:4 O{~Zh`h;Z7& N\TE(>ZVfeEM6/ (+h}\? _*~]jj%k)L8 _~V&lGH%#7S_z= ?qb!-" Ll|Ld4/^r~X[[f:~}xeWo4XbPr3 ftyFh%efw5 5EHJjjC';1>v] *71?EXP[xuit}jTlcJ8RRMxTwWZe;Sx=4Yl\9;0% (d7z1QXM_H=yA(H|{uzkU=P*,k%%.hW E<AGMjt^[t6XSEpp ?3,"NV&t G9+R iQ\M@j ,93 ?$c9]rw6Y'Q::?GECPA-wY4S%)I7U) ?*<[wI;py$a)+5/ywoxphHB{hfyob@ SJCA=w? = Fcw]HNbYUWS?4nkrq C c3#3+3e#>Q^o~7TB$,J4[0}iz-%aO**38/11_hMarW$ 0, 9u5}j]~ Af+ AhM0;W_Drg)[}i: -OuKbG8.vOdany_54_LetmU!FS;M!&  iHV{  -GwhbnsjHH]f^]B5D>Y,b6 }wC}h| v_XS_bZB0?-!36TgbaV{c@-DNSkV6, ha4,4;ceWagc(N]dIRXosymm/5bJ  dqiaMzxa;HZapo]^kxWPA; FkN HTscbr~rqt_\yJ~wqcOK4Y?TuUCZ| %C_Z`P# < sba\.nqJr8Aa-gaan4,,.UmA J|xod}wXQ<wZWllRH9.9fhCCpzhrytXHjylh^_? / ;_Jrt]`s]`wtbiz>08H(w7#+( "<]yl_Zv 4`]VL?<2.0;TmsL%'>(@Pmo^3/yvcL( o]WJ8&"F`_=GZqjOHEaqsUcfUY~pI<7DHlv4:Xr$:<28Wox~rok[vn|s_!.U" |laWXfd[<":_wkC t\^c^SLQ_`I*$H]nuO>&CjyWN] "*+-%&1HV8:ShD "N;l #2JL[V^WSA-=Xa`dWG1~xiVE)=FC84!((1;'-Ng}wlw 5scVX\TaUD?2 uhs/5-5(4i 8?8$tUQQQ93azgkZJGfzYMI.0/WqrYrT9vcaX>(,@HOSysU=HF5-)6'9Tr/"*X]\@ ~=Fbt|}mbc[y}nen{sM<KFS4#+&2. #*'@C6!4AH<<;EF3nfv *NsyngMO=F1'8M]pqgfNVccOILE8C^C+ ys} Z@ % $/,,7LbK7 '?GE87Jk,*!%:B1,>W\_IA?\hN\by||`>RWV. $Lx~x{pYO0$'4'. 0#! {xrfXj{}qy|%(%$3?KLP_cnl^MR?75.*=AFC.!   " zwhfZ_SJ;/?<;64LSbl,PPK=N]VQ4+"?>DJC85DS\e]]SRKPR_s{u|{yj]fIGKVbboXJCN[qjWK[Vh`^[Zktuz{~rg_TQRWSD=A=# ~fLS[{m]\Vbpx{rjY^`dei{yzyw~ :Xwd]Pg|xpgnU:--ACHA7=LCPJ>#$(Xa}reQOO[d]PcX\A?>SpoN0}unz} $(DQ\XIF@J;. +IUQN@5#!9-:1<2*$1;//'*& &{zzus~iityhozsy~np{yaDSZuyomw~}x}{kcqlwz-4AFKP\hqv"-0}dVEMFJY^[E/  !17?AB9B1B>IB-4@:v!% !4;.  $39@IQHHEB-  -&Of|wwiIYi}vq`I7DEYYO;6:LL]T`LO;58"$9GC40'wuwunw~uv{mx~j`bq 8EEX]izx{yw^K3*0CEE9=;?:C\k{lc[LMEJOHF87BM]V^_ijbS@6 "#$8@XT]SLB<>BIay~vtlh^]Wc\kSR:8*,#/<<JOQ\g}njcb^]kjl^K??HA4(+$ vuyzxhmcqzq\UJMIQcqoqso`UUqn[VWfw  +2,)'+/614,+21?JKED@LNKD082B:7)%'-.*%2Hegjopzsfmh|e_]PF,0(793! -EYffcTLPIOYeop_RB:&je^\NRJTUnvz~ma^j+;44&"    /1=@F6A5C@NI>#%2CAJEa\nZbabmun~n}|soph_ZZewzy{momo]I;,-!+*'wnqp`WSIJFPPUPC@?RWeax~y}q{\OB;>=BENNGDDQQeo~&-@Paz|~y_SKcryh\OTC6"  & 4BJ<B48+'#3:;1!+9>?9=<C42-&/GMacmtoru|~yqkgXXU[]R@1$&!'1%# }vktr|rz~  '/83+!%( (,0(!#&-9<:5-)(05;;7-(% !*-CERQRMK4*1.0%   %/G>PGB7)-  +2)#"%    5KXfadfjja]\e_g`ht}~iQE7:630$ vkahebUJELKRPOZ_nhptqtlnn~$,.*35<IBPJRIN><+-2=DEEKD=?:B=- ).8@LZabccahfosuu~~~~yxymmvm`NII\bcgcsl{g`CA<8?>G:B62 !'$  #  |pwz (&4;GKJ\Tcaq~rqcVWMMTOE750+'!  #151$& )&21*/&,,5EMKB6/-#"'!".03905:JR\ZYSPZX`[bdnrwu{}y{svukme`PWY`XNF<>@JBC70!!!#57A8622?HIG=B>JKI;<-+).0( !)$''..;23,*$*%77=>LGHC5:9?CD?51! }{}}~|xwqtt|   34:/-/87607/6(14?^`{vz~yo[YVe_mjtsznd`Z_WXDH:;433,-7>=901($+('%$!   (.;51(& $"4.63)/5;JHB7 }rgekqqy~    $ 0%.&* #);BMVSSG=;>IXU]Xa_XMJCJOnz}st{s|xntwu{|wyq|hp[^JOD9.'}sqqqo`_PROKJCKK_exfscqhkmnx !1*0-=I?A7CCFHRRVV^SL@>:=A:@:<:;@<@67:;E@AAADA:/+ /2:1.<OW^XWRUMTMRW\`fige\X^gp_Y42#+98?J?MDJ<A7<124?CB8.)'2::85.36GGUWdalqqroc_PNKNHB13+*     odTWMNIOYWa]Y_^hqmxnwmrqyjqpu{~{vty $,+5A@HJJVcinnpvbZTJQTZbf`YSI>1       !'29/(#&*$  %+87771>-1-*7)4).+*6458:EF4/%($ !-;A=A<GGMJCB?GB=65132<::1/(&0,0:?B;ABD?;<462,) %+(    *2496.+!)/9;26*14:CIT^bpmwux{uxjnjoa`UPEE5;4=9=63/+2+0-((   #/(.3:;IGPNSQPMIB<60+',655#2$9$3%# ##"'2/830$ '" u{x~x|rwrv{}~~~{   -2J@PCNFONI7425<9<@@NKOKSHRWfyytoljnhnl|oyeh_dcdfgjnu{{ip^c[]d^_\NI/,(28974#    $ "!)!,- %$($" &(/%46=DGVRSTNNMQ]`b[QTOZPOLPZ`ebijofbZUTWUXO`YcQNIIHHFI?=;1>9;3(+/--#$ yukzsxp|xwqfd]e^j`rl}uxw~  !,7;<:<75%,'@>WO]Wd_ldaZYUXPNQDI>B9;15,60A>TN^TVKF>?<NMZTZb^kdmjfofvsg_I=1021522==MSQUOQIH=;:==@C:;3720&#"!!$!%"/(0(70979@>@=53/+*(!      "'$$#'/2533=BFJSW\\\egsls^fLUDMHRVhjqonpwyxyqxqpl_^_[VQMQNKF9/1%,            #.2C?ELKWQVOPQGNKUPQQ]]igengmnnoipknhi^bX_^ida[OZLTECD@F;>26$.& !!))/401163B<G?FKEQNSWSOSHTEQLRVQVQV_]^WXPXPRQRSPRZ]g^`U\ZZbW[W\X[SWSYQRHLLIE?=<811/2(,(%15+4&."/&.&**(-066=766955),'+.22800&+,0,%&  }uunqnmqv{u{  +%3+A=Q@VHPKDE@D;42/.57@?==>9<;@CFLJM]Y[YSa\]ZQTKMENKTNONNRKKICOBMGLNTPQ?8.+!    #,!*,499?8@=?@ADMMOWVbhkonkjk][LOJMIQFRLTHI?:756;9E9>442-/*)*--103:BHDCC>G>;74597C;D22 )).),   %  #$'"+%3*/*(    -"* '(15==7<04127343549-6-DGU_\c_^\_Y_c\_\cifmdabZ`^][\QVKPOKNGB@84-/,(($!    #/(175?(0#%$-,1&3+:99HIYO\Rb`\^U[\^aXVUQMPKNOVZ]\YJDCB@C7?652'#       $%"+%&4):-4,5.9/628460;-3-'0,)*$ ,";)8&145;9484;8=12,:;LRZ_`eekbmbogrmxnustv{}ywwvqojjhdb]_^_[aJZBRBNHJC@8660658>8<>=?:94-( "$&*$.%+#*+8444/;<DCHDJNRUYa]d`\fZe^b[ac[fbd`^]dlhe[\UWSQL@;7+6-600-))   !%       $!''&$   #%)($"!  +&#"%++31.)(*--+'('.#,%+%'#   #)/563>>IJTSZV_[b[aabfefbhcojjegd^`Za`Z\YV[]ca_ZWWXTSOLNMHLCL;H<A;<@>D7A1724458:=<@=;351,,,+(%  {zqpnnssvwzu|v}zw}v}xy~  *%3*3,..;:DE??;98=:GDHMORSTOWLQLNEJCKLIOLPOONEI?E?ABCELLKPOUPUGMMTKLC?5-.$."4(;/;/:*/      "(./76;7F@NMUV`Zc[_WWUSTNTNWMSHNGSLTMMJCC5>-9/2407*2*10.-&'!!!    "  '%-'/+-+((-(/*)',%,/;9H8H;E>CFIF@B5=;DFEQJLJCG@EFLQW_hened`_\[WXXSUQPRQSUVTTIRDC:14)*)$+%%" #$"$ (-302)4*7*1&1&.&(#$!'#*!""#"!$ ( *$()4-984://.+,+,-10*-*1/0//2/.%$          "!.,5465:6<8=>C?FCI==<=;A=DCGMSQTQTURYN\KWOVTRNHJIPMINGYR[^]ab^`UTOKLBHCEEADBA><965,-$%  &(+('*(.*)2)91>;PKRNKED@AEGGLKKJJPOQLONY[[cV_PVNNJHGIJKJDE>E=B>7>6C7=2=08,,*!* &%##"     "$#($) )$,(-,/.)($( #!!##!                  %""''('(,71;-=.=6DEGIGKFDIAFC?D?CBB<@<>A>?B7@8@;?AB@D==/7)34241/;-<430,.-*,$-$(' $    #%%'(',*.*2-5.437==AB>GBHJBICGBD=E=FAAC=EF@L@JH@D8C7A6:8=<9B7A7?99744111/747.5-3106355918+.$"     $.+$'''$$&(%,%,#*)(,)(/$2#0$/++* !  %#(#$ !#           $%('*+2.3.507<<=@@BFDKAJEMLLPLPGVJTSUXV[\dZe_iimjjkdldd^bSbU[VSOQHNDHAE>E:?6:5844525518+/%"    $( ! !$%&*$&'!*)#*!,!'&*$'!'$&(#(),0,0/292=6?><9=3<88<8:<8:531,2-2042998<3=0<163++ #                 % "!! ! $$)*3+6,21/1.0,3.21.415<9>6@>GFIKHNLQTYW[^aegeg_d^]X[V^W_U]U^X[TUUTZTMUJNMFJEGFCE:A:;:<38.3(0$)&'&'''*%$ #!      " &'(.+3)5+1.1388<=@CCHCDB>@>>?;@>AB?@B=;@9?;<5=+7'(%&(*&)+),(%&""$#%$%!"     ',+#+)*,(),./5)/$,(%'$')%.)*($'%,*3-)-))*#)!&%%()#,#*$)%&'###"!$    !&!(#/ 1(/-.0/040144658<;>@;=9:=3<3:6299:>9A9C;C<A9?<???;>7>;;=69;5<17434/706212-1.0-/,3.11,1*.'*%+ + ,!& #!      ")'*1%4*9/:1;6:6869<4?8<<7=8;?:<;9?::C:G>A;=A>BEBECADB>;>5=18-3,-/'.&$&    !%("*"/&4.47286==?D@FEFEJBQCPMNPMNRNUQWUVWSVTVRWP[RZPSPNMNJLEKAC?A?7A7A1=,6'0$- (%++"    ##)+.156=7@;@@B@EDCJCLDMGNKENAIGDMGQOPWRVZOXJVOVLRFKEGC>><<><6;6::8;597;78341.2-0*.'0%&% "# #!%"     &%"$%!%'"(!)")$+%."/+!$% "!!"& #  ##!!          $"$&&+))+(0/042221562255673963<0;1603020408/60/418677=5?7<:<?=@?@D@FADCCFC@?<=<<::93;/74211.2,/*)&!%!     ""(&*)0-33487::>?>D>GFKHJKELFGLEIDHCDD@E;E?F?H?DA@?D>H?BC;C<==:=7836+4%0%*'%& !   !&(%$ '&$%#)"*&,))))(+"+#($(")'$!%%"          #!$$'(,)3+8*9,9/746=9>?7G3F:?>A<D<E?DCEBH?GC@EB@F>A=@;:;5:38717(4)4-4+1-,*&($'$#"        " #$ )#+!'&%-(+,.014/:1935306062525225,6-7355310/.//,6+6.3204011,2+1./.-++-(0!&#$#     #"#%!%"&)'+++1/33679;:8?;=>?@A?A=F>F?DEBJ=J>D>A=A<=:=740-3%.%&% "  #$"&'(*)*+.2/251;1=4;;:>=??CAFDIHKEKKHMMKRHQHOLNLLKLIIJMGLGLCM=NBIIIJLHKIHGHIBA?<;785401,-(+&''#& #     $' ,$/+--204/46373:4755767::272:4769::<;8;5:38050/0*+$(####          ! %#)'-.///214041.5/5275887967772;/;-703/0,0,0).)0+,-(*'#&##&!)* #      !"$#*',+/./1//3*6+5/181=5795998=;<<=B8E;??:B>>@=;C:C:?;9=5=4744202-20-4-/.+0),(*(''!&!$!!       " ! $$%&)&,+(-.+3-7183<4?3;778373:49526/4/3+0+,+%&# !$!         #$(!.'+2,5./1012035-9-5/6/5-5.5-10-1.2417062515/9043,8+8+5)/+,+*)&+%*$$## !         "%#%#)(%/%.(,.,307274:596>8>9<><=>>:?:?<;;;:;9986:6891=0:485877847/9/41/0*-)-)))+''("&"       "!!& %%!*) )#''$%'$)$*&*(')')&&'#)%'''&)'&)#(%&!%#    !%%!$%")$)%(*&/'1,2/301315234346.4.525757568281:68895:4986987<598896967523513011.0,,,'*"#$"    ! !##''(,,2.31343:79<;>@<C;E:D>A@?D?DACBBCDBAAA>?8@3<182402.1*,(()#)&        # ""$!"%#"$$#             !! ""#$"%!& "" "# ! " " !### !!  "#!$&(%!"" "!"" "            ! "! !!#$"(#&%$)#&$%$$$"%% !! $! # !!     !$%"'$*&.'0)0-2/3.5/302402243424.301102001.2/01..-*.))($)!'#     ""!"%#" %$$%%(%)'((*'*)&)%*$-!.#,&&("&&"&!$!% %'#$%!"$"%!                       "##!#!$$ &"'&&'()(,%.%/%,$*&+$+&)'%%%''$#"        "#$""# "#!% $"%$&$'!("$&$(&(((*'-$+%)%&$(#& $%"                !!!    !$#!!$#"!"!"#!# # !  !#!#"!                 "#$ #!"""#$%$#'"%!&"#"!"!!!                                                                                                                                                                                                                                                                                          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Snare-Soft.wav000066400000000000000000002640421366722712400231010ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD data"X )M;oT-ppMlrU} U  v tP K_ f  oV 5`}Mrg޵4o- ǔ¸D)rcl2qz Uҹ1X/߻? %&g:P 4#G'1G XuS~O  O Y 8 G<U gR` uiLDg"K" !TX /!e"$l%&n'&$##%(,M15:>BCCA=8>4{0,)&%E%B%f%2&'*+, -O,+)I(w&$" ho )d9hgz^N].rE!]*1|=߁lޒ m;8lQW ܳgد_@0ސոiPNzcg*t߈-l޼ڝץԷԇC?aFzEbosD0S,iZK fX H DU " . - 9xU1z rO j _ . :r$Ya /xLlh {   ~ , X / Y] > 3   zS nRcZ A \?m9` { [:e$I 0  t>N*m.FAo7Re!\eG8?}#d2Y:+G$v^T wM# "\pV 3 ] \ h j  6:  # ) DQD-9Dt "#f$h$,goo* 1    S fX.z{K 12u !RMjwDUO@w.sWuAAtXh7nE~ W$iUI @%g8p,3lS -P N, ZII  Em   Ju y H P v  yL rELh nP : S   H  {  F  t3OE Fm {=2<,`wXU?t64!TDi%sc M#ܶݜ'%4coU`/\0UVW(8gQ;qF- bM AEexx{8i 0 9  ~u z< 7 k OCM%, 2!%"=\5C ym|y pf = 8 I_5g~ bAVJ k K=F 1f8x.ZXP(_[3"?LnI63shq&vK'PCrs2?qpj 05i-RgmU 9 _\u \, 55 te3EEwqB - .Mp K y !t|B0 *! 2    ~B > j w $0\K qc ^lZdmqMZlv{U^gPdJ2>QD>pT9EoWxei 1W &#os b U o *+}2!kS _} 7 /G  C|8 .1+T 7 3  7 }g Q   H+b&b^QhMi(# bJAE&8Xqv&M63aCl7clI= =r) a2/}qj x  ( *$&mbp'}$C_<6KDnW} d P - |[VeAL} 2 v  5 r .  < A v Nw k u  = }n 1 % Ms{,4YGVZrst1w|1h./'4yR2lZQn: ,w08kDy#JlHs?O @' [~  R? w4uYo=+$ K  7  Ldo1 `\05 ) [ @ 9 p ;,mJb@qS]y>LOf`$RsB21lBjQWVO$[|*V"]g1P#;^ibg W ! k `x =Kh@&gqL dms:*M2$jqgR>{W b@ . `Nc$1FlMYu ` 8 Q2M,6m& 'CLfOV-?=Z#ni bEx AyTFDS!0pn6w']h^#u9B+zJM@J~kYd|][V g T $ s * Vus4/;[Z=+i o ( . 9W5] A |A<[eWGd[ ^hEjY3}6 (AekyiD_!dm4iXl$#}wEe W[b\GT\$UWJB$MA jtn =5hBdy<^,WWKiF^:vh) 7,eCc|XTd=>_}|7FkS~[@s3 =  }H,WLSSVz^pDil%!v)Vp%RX2FU-N)Ux {vE,nYt8"&I9t$^G VT.Oa~< 4971Fi dsnPT,e:-B#OZp+!U`X \{v-53E\qE[ .OI9. 3F"X$\Rm nD[\Q@kci7`hc(5>q q>`qH-] Stbh_&KBZD;Q RZ!+]dIy8~&EIIcS$"y2o75o@f#p3G;_" @@G$E$OmO!L2LO%3:S&[XJaU)5!M1#sKDl0jMRHq~B5 !db$]NV'wCI3Gn  /TLpcA vi-sOi{)Qp1upb@HCpMwu-q$sCyj4vh*>v DIj]7?5{5E9FAjG49Ta` R6RU%0G! ~TNQL[wE7Wbjj&J GLJ#FH qLpz1z:m{5*\GOJOI_w$Oc)@-<M2*('_E%1Qr]>SujeUXsACnFX+ tp'd"JH)MYiat ,,oiS&J4v`i|jpTm>9n~+='0 G7[#9JFLA-Vv7,Yg5f+W|=6I%kGUiVc+@*8CRI q*8eDoc#oe`n>s1.mKUj*2MdGM;;lgF0{BiAwA:l!U C7>>V_ i\aDZ3;u;i#X/v(`T*w37fc7MlhZ}A'P* Oq#<3KU2/_`)[~-q}g}SbD%oye7V8 '9o2S;.<=Y/Qsq"&RqM#M L^3zRqDb L>29lR6  9~[E;zGwDN2hUoC-r!.mvW.6Q+PbU_nxtxh#{WE+x9cTY;dp{S uT \3)WWCOrW ~ qzoA*Lsv !KA]2h&l}STHWjVW^VM30Lt<83D)oo_ND6" >jYwLerhuekfsYQG2-}TZ+ %k1rKQKIJCFrT{r 1 m lZ8"eA> i OEeyFip)Y^!FSG*'~og>2dV%?3^T>Zc'K9c17{W4H+9yy;[}4h2SZmLZ|Elm}0e!\F< 9Ab*S[GuGjK*OxB%Z=LxHmz?lt7i}e2Z_vYJM)/@S8gw{ r%NeT}[W}$qPC_gm_.AX7;nM >jdhr5HAnoc19 Kg  UiFMuZ,}%[_n'Gn(J3q.%lptV{:~"MkTAh_n*{$!? 6~.+C%TNc-d*#nNWQbUM@Um.=A/N7@In"mT$1'~()W?}a#, 4pHlI${q9/+k_d Oc7{mK 'V"GCIT>RVO9ab~>q\: Vp- OJ  {W&VU=ue p,7[|5h$%0@K:8&Uo(|k )C-Wk{ON%f1 ZtlL3,+)\U MDR@0|z>LL["9m _0B %9e[_'\9 b/>HE, |Ik?S^lE;M{qD'-/}aC]cY9>{\#_e>%J*L! cI@H5?iu)ba7,_Q_v} #3`]2g*OfwP3H7kq;1 7 l@Pd:$S^[MsK[JPu7xM(sooYRW}7D W|"b2xG%6nDKb>U9jZ;[."E6 Ix/gZ-tL8;/AO3O!sa&<jGb`x?}\G:qx8% ]ruEdKJ##LZl9J8pxF/y1~t?uD<^L lVrp?2 rLAs1@'18u!rsM &+HiiZD8\Wtey ]pnnp# L27Q B?MF\ZIzfx` a_B_QpwhuX8E]mkyeW\AtgHwqs L%d@F)Y/]knTgXN)- <* f_oXE)"#=Q0 /4#:h}i9 1]ge2o|riWoiZO< $"f>WttHm; Aax|p<*$\/exG*#Ml ?,cL FNWOXgNP"C;W]*>S-'Hf#%WsN )OgTQPZ{JB05a[NXo[//0qT8  0So{{Ks#tP&(;E`8Q1"JRxT>18(yjK/Xd6!rls`<9KO8_<'!C|_3#3[sDy N)Ler!'sQ"]wS>gSs6]>FC"lH_d[&@jH&\O_0>;?J<CPS&  COIDsd l>Ksf0n9,l?YQ9p RTl|'*AZv3]EZC7?YXOH\bg8" y\k<"$\%7yCPediJ2LL@B-)6??&rvj5>e_D^|#<RZeXt!a|[urW>  }a|f-(VB;F?/&9LZbY?cceZ4:Mob6|>7 7a}`)C.9RoWKLQ .AiW3!k>J+)Q"jj`frQ1cqfE(!h[P5SrnY81(KnjiHTN;BoS',PZgY`T^uwG {^A>372K Mt4C3#7#(|<3\U5(#*I>EYbnpeex{nNf3,,2;`qxu=SgzhL33?/ Arycabu7gmW@Y1$CE./- vzQ/ />e"Pnm^QTA=4 1-*jCAOgx/$)+4qtdc'"wooUB0,%Gld~y{e]}z+a^jw~o5.* Z!4]u^>Q.`]#$>b   3IX^QP^\O/!#[<5 oUy*:CRZ_}}bmrn0<0|hgo^fJ..b(+9*=]oc[iut6"1h{V!8Ye~/YiaC>D^fcz|yrx^goH/ 0>1 R~,)NHdms_]J;0.vK  CuuPwytn0&05 g>Q]4Oc_P=<Os}S8--43 ye]ecM! 9@3$!<^.YrpoVE* <]zhvkU9M]sB#FiWA*<+8FZnedtX[cuBZj`T7 (83+EtuaD_|sV=s7%:=D=84I^@]SRPonvUJDar~b- DCRK[hwjsvq^2tXUa2+dtifhlSHf2HJ]`jyjX=610QgkvaD(DvP6Jv?'$&)-205Rnr`M180" kcnpw (Rj`r~w?7L`RsedxYI:Dau}^?'?\WFFl{   $ /O?, %."') ?MZbPn}~uxhhB$~wen^z5U\FA;F1 %,%'46*wklqucX"11-"+-?akial(<E@<2;8L1) *MXlo~uL lINb^S<,(9JMBkr`ewXB! 36B540&$A1' 5KoyrgLW]rmsakkswyi`cpyooqrks~xe6|~~~}q\OPk'.# ,Whzi5~l\NNR 7?1 ('! (133/)/18& ltWTJT~$P`n}x_^imX5- #/GCH=>FZdaXOH=5 $9448VheSCAfvtX=3*'(9EZ]bZYZOH5" /=FGC74=<4  eO74* "BPMUUNYk{u_[Xh{'@IE>DH6#(*.049<6:!&OVZYZmyuzzwbCDBH2#"%-# ).".%5Li|nhgjkjnoolccmV,  os]hovpw}}   (>EX^wgT*  &:Vg`^?;$xwrxsx{),*$+& ?RQEHII@+ 8EWl}r^OMYhrhONHKPJO<: /687/!+ )*  {idopjq^fn    'D0 "'.4.EDG>=575$!!(.80%*4.$#06."/0G<?Sdd^K:810}reo{ahgfhZRMKk|p\Vi$5ORX_bivx\TB40;Yeow~teTE+8@B8 !-0GPNSL:(5LJKIN^iixqgQPGjV8/1/'wofVXIW_xqkXZZhfz||(734)"9?UO@5/8LF-+1Hgr}kWUQ>-,GQbnn^Tan{y|zjOST^aiabhbp^aY[^baZQTUN\OYPUUNE4$3EOIVFM<3+$52QR\W[]SQH60,/+ !"&{xqRC6H]zypkTN3;+?P]j| !$,8>952-,245.(!  &69MQRV`wqtuhZSCOYmqwk_TN;,*-<;F:;36DIKA:*=?PYb^mimfiY_OK?0 {y|u}y$*%  +&2%/*"6#.! % "$43)% %,,&& $-SVe_hmcWJ<4)  90'":L`dhd_H;',&/778<E@9) unfj_\Zn|lvnhXGAL[c[Z\jvz ,6HDQEI<@AA8) %)('.),-,6>EE>6,02AB?6)-/CJOS;<AGOA:1"-=M\e{{maSA6-+),+  6;2'  )*286@." ).A;>DBVIOC<A:@97/+)    " " 06GEJ@:=-- ,)-(7:8# (%,08CLS\jousy}rcaZTTLFGPBB+'&026.=<UN]bithbMN@RHXS\bfnlpw|vggVM>H>ODPQXU[ORLNCMA2&   (,44DH[_de]o`j[hcjfRI</2&,,8HN[_]ZZ\ignbXNIX[\[QH?<GJLRRXYJH;-  ")$15CRdooy|zsohgYTD930%"   |plaio)@JPNX`o]cTMKGB>=@JQ\cdnu~xu]dR[I<2    /3FD=;:9F:E=?;9*&&-012-" 6-D<=4''$)1"'   )*21398931--+**+,+1/&  '),.=GZhmqzz{~krgrejZ^GH;7/0%*#,).     !.;D;:.4)- "(&*(',&() +:HGK@?BAG;@:76&%     "42@BL[\_[`VZPVPQZ[ib]YJJ?6) +<AGGHYLaUbaecebec\XA/ ~|*4:8:BOdabbfcZNC<31414('"#  **,2:?FF;@2<8=A<><:7==@DGPWcltz}zyskYULIC91$ %*--1(14@GGB<4)+  &$$  $(/.7,0+1738,.$%)-/321(0);6?:<9C@HKU]^efqnypuswrrhg]b[VOLLG?1," |utw~ !+;AVVb`[Zbcnsw{|{{vuuulnd^VNE::/02-;2769=@:>9=::8=@FCHEEJMOOQJKJ?@;=CEKFKGD@631%%!$"'((% $!!#$%&(/*$ #)//,()(1*/'0.2/.) $2/8.4091545<5627,-*-<=LERAIBJDEC?B6</6)'   " !&&&('$   $"  '!$($#$#%(       %*$)'###'   #*,5/45746** (&-'.'&  '+(%&1&,&"!'+4:FP^eke]QJFILOORSOVHQEHDHEHGFFMCPBMEI<;:4662720& /$1!"  $"#&.+   ")/9IJUNVYW^UYMPGMCKFHI>:)(# $+() #%-),"&        !()26;@JBD;7=9@73-(!#        &&.&,$*(1+0%)$$!% $    !##+005'1%/-.'       !0.0-./.73F:MAKGEC980*602438@<A8?3<:;I:G=G=MDCKCOHH@@:GGNDFBEEBA<457:973,6.54.)'            !'( ( )()*&&&--3(2+601117?0;/872=4CFEQKTVNUPVSVJSKNI@>7829716)/&"  $""#,#,+$-**(%!"'+5389:6E4D8;@:G=??:?9:5819734).0)1.59FBA;>5=/>5<7;-/(%#"")!+).1499@7@9>>;:/+    $!+%0-67ACLPP[T\adnpsxy~}xtplioeeUSMJG=600.1/+.*.''"'$""                   "$/-5/2+.),%'"&&%&!" "!!&&(%%%%"     !)..21326092:15,&"  &%,"&!$&()'## !!'$'-'4+52<9B<>?B9?>=KDNHLA@27*-$(%'!  "',(2/3-)"     '"'(%'%*&+&,((()-+-.+5/94695<2:6541253461C=JMMOMQMQMQOYV^TVKPAD?:?13-*" ## "#    #&#'+-37/=8BCIIKMKJLHLENGQHMLLHIFF@<23%*"      !!++82<==@::87572514&.!&%#%"+&4265475.92@?FCFDGEDED@A8=45,+.)1%-!.%)$$%$'"!%(#%'&(+'+..44+1#-,$#    #++-+.,36818,9/5/4+607586;6=4;552144584712*6/2/)-%"       #$ #!'#*(0,44282=7B@C>=A:?;A@IILHHEBD?B=E@CB@@@815)0)(*(&$#"           ! #"$$,'3-2/3318179/;+857B<E>>?=?>=C<G;E;A@>>@=>=A<B>;=6914.4/333857195<2>/;3688<;993,.*)((*(#!     #,-0050717829380/))$%%!$!     !$          %!( ("-*5/<3?6D:E<CAADB@@=:;9594250.2-..-.-,&(##%$$#%(!*%+)/*3,4*1),))&"##         #!#%(%%$(%)((,+5*4%1'1-72>6D9G;IAGCJENIICDAC>A;B=AD:>523/..+(&$##         & (!('+.-0.--()"% $!   "!$"& $(#/ -%-*,.&/$/'0'1,,.%/#,'0+2-3466::9?C<L?PDIHJNMOPILEJKFCF8E383./--,+,')% '#')#,!'&(&0#-$       $$$#$%%&&*%(('*) &$$###     !"""&#*) $ !#!#                       %%)/.1/557785:7?<@;B=AABAECEDBE>B=E:G<G=B@C;=9=7706-/4+9023.1,2+3*.())#&"  $             ""%&&+&.*.+0,21221/4+2(./5398?;:=8=<:=::544/6*1&+)&+#-'!*!                          ! (' #%$$%'&)!,!*%%*%.+00031202120/2.0,4043134448/9.5131314.4-+.'+#$" #       "&")-0.7.;3?4?0;+4((%($-&        %%"$&#+'(*()%&($+$)()).)0,.-23/4.//***'%*!+%'%%(!(    $ $ #"  $%%*$*!%"# '!,%,(*,&*##"! #"##$#&!#$"" ! ! !!!!!%$$'(%$)!-$-&($#                     "! !#'#% &%!!"" %$#!*#*"$&%*)*)()+++/&2%,-'.$*#(!"%&&$     !  #'%-(,)(*),()'-(.-)0)2*2*/-,-'-#(&%%"""% &!!&"&!%$#*(),*-.+1----/-//1*-#+$&%$                        ""#'$)%.$.,,,.,/+++.,4,504403//,,&,&*))(-(0*.*.+*+))+%)"(!"               "&)$,%/(-()&+).'0*-,+*()*,'-&*'($($%)'&($#'$(%% #$%" "#"              !"##"  ##&'$%%#'%&'')%**+,-*1-.2)4-0//.105.1.+,(,%-"*'$$#$         "#( ($$#%''(&&('%*#($' $"                             $"!"!!"#  !        "%$ !! ')''!&"#"$!$!                   !"#!"!  ! ""!!        "" #( & '!("'%($%'"("'!%"" # #!!! #                                      !!#"$$&%($(%)%)'((&(((*()'%((&&"#     !!  "$$!  !"$%#                      ! ! !!   #      "        ## '$!#'%'$((+)**)(')$( ' $ " "            "$#$!%"#$"%$$$%"'"*")#'$)#)#'%%&"& $!"#!#" "!                                       "!#                                                                !##! " !!""!!"!!!"!! "!"!"                                                                                                                                                                                                                                                                                                                                                      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Snare-Softest.wav000066400000000000000000002641601366722712400236160ustar00rootroot00000000000000RIFFhhWAVEfmt DXPAD datapX   6  G&\7c6q?3Xs> +| \: F  ( lZ l "x h .D $yV $'h)L)),,/1/1t0&/+2(M+01 /+-/36r6*3147:87453;0+(),00,))u*'1!#  QgQq s1rn  bMa'Op|NVB}N>(.N[oxph qSܤ߄D&RSHBߚcۑڍ1)@2yzqY:6Hmx' x~! .ca L@ A Q>qxW *d^Ye+F=   w #<   7 [b6I Y W VuWE q~5. 7 jO=Oz<&c%R vaEFh, #hn7i8]Qiއt; EO pJ Aru?B)$ LgI?^U 0t + &'  D&dm  5 "M*~ >!/"<x 6n, g d G"opQ i 1  ) gN aN|> xND\Yr(VTKiw`#V07Am)xG80NTK pPN3t` 1yq m = ^ w 4 tf r}> o y p6 z Y T"  \p zk"[rv < Kt lCu # P .P8 1 3 P*o#(/\1t@%We Z9UaZE/rN4+6\w0w|6 W OZVaM!5IyWm6OYW}#4~)x5 &\:  4x k O0*  J 5  = *  fZiO% / : >L4,  9s  $_'/W~2F8 GZk7@#S1n}e%3 A9I F[UMP#F{;+x+Hrraa`AIu} Z c>5<7v!|d o 2vs' n QGG@SF[  /Wti  dIdv.&"  ;en d S :%6u  %  z' v?  vK o~ :zX P j  z 3 w 3 'M*oc !>NtMhdh3!+#p zTtFI$n c @RAdFnVhY'DpGd9$ amdp`?Qe  1qE~z(C.  A !  QKX? P s6 6 - P0Y!8au8fJ%X<e6(|?X$2 e   ^ `Wo~;x|c.sH3RX'znlB= FuDYJ Z*az^j*`NUg @&B{^Hs$O9d@.y'0c+4RX@|G/)JcCe+~9eMiY4!TqoA$F) m#qFwM-dka^I^x>!omhgMnW_Pt/# cv UyP!; s@]EM!{&_svwk:SY7#4+b4iBhB'nQj u8Dn3B+QJJ@+&i{F>6PT85{65j=J^2$faAj4X0 V QGGI$Whh`\YCo\yAaD=(R[!=i?6@yt lFbzAa/DUp$!!D tHG\qo^Gq{R9>m>t;I?K`+va/ -3yC3HtI\fpPvn|o8,>U-$>#5XJF63PK}^ &XJalu/ CbGd'P0#&DH R =`7U% +Vs#$q&dM,0]8xzgkX&S1wA F zo]IK/% <]5dOwrE| PEWS^T817". I tW<z1$%x_'> c2jL)ao)v/S1X"$ALoE)Mc~ k_W!e'H<"e)CB[-Il.|OV?_J~X$60_%Sy.u_fXp`O"if3wu~G_d6SRsgK|?E{N X+E `!\PU$XdM[xbPXIcE,ZE-U_@oCs/.v7#myf.}2H  oQFT-c8Ar#lOR|{ BI&C~ aVd*y6(b3WdQxVha{AohEKm(QqRQr8]ZYU$S*hh,0?6ijB.wHS ;-;i1_igEB:arL30w.(}mb\BEwkE C}Y(nH*E7(@C~WmBTc#4tdr#$`~VYkf{!{>3ugT$Yi>rR JLd 1o/f?DT.R>XOj<\v$v!UJk( :?LmGn<>Jxeg<'><)M@+SWwCa"iIy5"@P Lw?&qhsAFpp@|4r`MF` H F0r.bV/thK42(+mm{cA$>6h]H{Z +{_-J'rgU<4~YfR=  SGZ8~a(tHoM&`*-t+KEF<(egJ5 G*X8{w|f f=:oz[$,Z U*8m-W<14rL,y[*(p=3GXV51:.U/=TZ PBU}sQ9/S ka>M%@}mJQ NRM^M{ Hnko2<y73 L[(CC hrn}.j>,e^j)c(s:czDnZxOH?Kv{wX/ >b4 B%:\Q-\WIVFM>A(/)Ksq4c`83]xSl#=*W[Kf=SvVuUnc97ka)wA0Lh_yZ.nDaerS|AY!I^%;Eh1K:R2(5Z-q%&\&,rC88 :Yvg2Po]/d1{|#n#2~J(rd*}E Z%cuT, J\[H?.' 6S=b+ag|LrgF<-ei=Vt-P[CR$;X d H$"\}qq)Dx6:M;?v&<+RV3r;12XJEe8'qx%09qUqXoCI?*\{! tA4A88hc_d]l GZvwy1RA,*N`}u37rz#y*8sPUv YBv^m(@ ,;7Kd<8tlizI }Ez0V\V_52k0da45EATqPrc,/O9!xA$[nv}lB O>YE\mG#U!(ImHg-g,TvK9,Ho!m,1C|LJ!#[&aa|vH$7XT|.=n}J\#1U.pfp"2EZzd S4G'4"Lapah"He'.)  6-_\bp'0'oHr^MSO V[`Byv TVR~f)D  -DE:&EW=&!4#Xh-vZ+Td[s>.X#qj^Y(HkB5[4@z0V,N\6_+PkoFQNO< ~aPDOY.$xE.].#6 /$ B,8#tu.qRBda #{TiB5"XQ:!+9Bo!0y |0f__,*J"&HN|!4a@wle^OPtB}X.[_xL) Wa_,ldCa4`Z5#g4/oyjNsmQ6O`VUt\8:,6=0kI( Q89' d*J5o -@4HtGNUFCAnOH>DWaPM5T9n4,U\;;owxRT (\%IhQ9uA1[w~u!Z1CqZ~omkN8fdm9D6r v#=:dAP#`KpJPc9bjeHlVlk~9MWl]&%"MyIp / .qC !:^sHF6.cm6X}(4$TxzjU , JnS?OVx3+e9yn Ly(X]4R<yYcR xZ8# U^Y^e8CGTJR 5 _U:m!$+7>4+]*5}2JcCNQnp\q_3Z]xsl~K $9OcxH)M7?:,ek {K!F:}gpGBR_? EIwr~;YgY2&d )RRTs5N0h8MY3Q4etaA#IW=URfyp+."a&y!8 H-"okeX[F7I8LI4 w-4by(P05/I|&3OMeOwlb{n?"MAxohOw zc}WbMo}\e|F ! 2DhODy7kO}c^k;,h/:}yK/fJt /_F jUYg7@X}v*@gH=NL3EL|yB XlXa^6 9Qcn~twUjl~C(O>@R>^:/2 n8XL 7#LtbA/]MU_|}a\GeIRo]2 UI2~"Twxv`$g_,>Ha_Fj<)oO9)T&WTxow\;5jt$6O;$dS>Y0 MPj#C`[TH<G "?z%" *JUP=/5?o\X2nQ#:D2Xmss!:5:6;?&1zwA{=(nLdKo]i0!]8e`EZojX$ %6 +TRd4RJ]!2fdgX`Sv#@ $K_aPz!'LfV2)^QU<;<D13/!mYKz_Ahq6P[k}P4xZ_MJn} =A4?r ugXb7CUCd^R;]kul_P/, t=5Ai{b:>Nqyyrx^s$  &84%;AlNGmqxpD+"ITHkt  )/ m$ + |?-A_ffNjvvy|{rxAq_<>jY?,$+78sh1~aNly|U:+- *(&Z3#nN=..C3/>\gwk_3gLTA@*&;]`moyi: +SqmL8PeiW61}kx9.K60Nqs z_-MZhN-ua'aH\#wv%IfN0 5[T, {&<=&*(2HD-I\gx7YqolZfPpowiIDwm|ybrptP7-DRQE;%87K?YtSb:VB 5VCiP]4%#7$pxtb;TKj~TG[wyifnrTLbeOJKQRV/+4:A'  CXaow`ui(x`G@,02@Dr+HF =_{9km!'Mltc^`!}Q#!=C:+S^^NA<$-Gnui;5PYGVKkRigbcl$ .RqSSLA& #2Nu )85'%cz}jZcvup{mvkk]bbXdDE!  !0ec~i~t^exr^/ z;ntavgjIba|#XTz$!btoT4(%*~h"X`s]Qi}=Z]bS^KJCqR- 8D\Xjp+$ !-W>' !+7JXqcKH$# #2&6('[dsjAxlVLNows{O/9* " +@lr/QJZezxtl{s]hq ,/{CGiYLmi7 $14Kq (#/7+'+D,;'/*<mtc<#hk  5M]Z[IK : hKKp!)9Je{yvxpaA1''8J`{j]7/$=DL8$,3L5;(DCRI1IJlwQW98 !$}xs{~}jTIZgow DsvkK95;KZ[ZY;9*]OB --' .MXSC, 2Q][hYk8A+" %Mad? #;KW~mVXX[:0-.+ 92@Xfopa{auhdkmmWK(/ wgclhSI.0(!5-1PXsn| +PTubwjeUJ91,204 0[zlyuqiWhrz}~s\mkwrjKJ.?F==40##5#?BB@8:/  $/C?KPmlz{vvca\buxiH7/n_^mv4RWzq{rtcaltn^I4!!<HAD-  ~WA.7=HLOK_i!0SZmX}sGE3AFMQH,"$! <Vpnwz\`RNIA6''5?:+  *  ' )26) uz{{  4Rp}}nZX?QJTE;642,")EPfQdVqqcW^]dTi[]M8" y{ZU4AXk~q{ (0D5/;GPa[hplwSoJmaws]bAF#'4:RVhWiiljRI6?ED>JPSQB" & xw}gloiok *2>8;-B<STW_dwr`qynk\mnpcRUHVMVTQYiegdR`hbYkZdGQ#'3,6 -(0>IB<CDCFFTIT_l}vnXSGBDKCG6(%!) !++<B=B"!  {u|z^kgszw8,2$?KZakphnouxxzlz~q{md_GQB<C64  &~ehiyz!3%% $$7 80;?++",'  6/M9*& %01-:JMU?QDZ9,   $$ /4>;(20UYnwuo_SQRTQXO^PI+ !1*# &$" {zxxn_dTdQVLFNSC;2 (*0->\\{ 0>;GCHC?LIZKPKGM;:47OGI2;?YSV@XOSG37-9+$# &.#/?M`odaH?3*#"3ETNO26(6<=??N@C@8,!(2=3.+"&'  )%   )1"!("1'4?JWWZbT\CELX\N:%.% lxiqc\h]ZQ=O7P?EFPa_btp ','*.1:1@2C<41&%!''+ '7%B8_hjYNKEI@CPGVUUXP@^U{v|wsuj_gcbVIC@70,%4*!-A@T\jjMQCLdZ_CDDM;@ kxcvq| *"'$/=E7M:PDR;-! /74D33.*+ !! &)"/!79LLWX[TT?B '&  -##$&CC\Prj{qj\82,.L;I7LLQFA>EI]^{ppYUGA) $6IOKT0R*?!!  }y|yoxclXj|ty|ql\scpgerv *,LU`OaR\W_fbwsx[YKLGVZpxv}~{r}qdZRGD08)1*1(3)/;@IKBKLKKCFO?X>?   # !()4011:;:/)+*1/.+/)4/0)&   -228):4BE`]tcyxty|n}rmgRXONA?9852KF_dt}thkXe]go_aI>>79&y|sumrlsu   .)30.2>9KDNE[EZL[KS:C=HK0:*>?4-   #"(!$ *9?;J;JD<LA;:(81(1    $'42C?SVWjg}{nvjnjU_Ub`UMDC@OEE6D/01  ~~hjX[NPH[Nq]vcmgd\UON@PPUhYfc\aZ\Tf`rdkdst  ( )!*.171=;@?>>BPJYJ@<1@:W;S;2L4D<ECPKcQZ9N7HB<MAQHRCL14' !#*%?H[U^QYUMLKEF0>.2.50)  $(#%$)''(+.;<KJMHH9;3.& *" ""/&*!'# &$#    ("'-M@RPfnz~xt{uwkr`__RVPaWcX_`RWGKCB7.+  ! upeedmb{n}!-+8<<DEFMX[ebut|qqmmy}vfubpkk^fN_Z\c_f]^Qi[i\GJ9B>=4NCUNKF@4;6;9DCF><+(     140H5E643*2%2-A5FBB@A85+,($#$   '$ & )%+ -5!/%.52<2MB\U_^\cZiZl_d^qZs_sdhc`]PQ=G1;3..'&"$   -24A9GMHHJ<9+&#0#))07:77F8EB8?61,()-(%       7:>8?4B=K9B;>4B'<'#) !! &*,85567?7@2=3<:LONOIKKDLLMMYaeh\b[cbZ]NPA?1#" }}   $+.6.@3>,3%   "+%;?KIDE;@1<'' &*.$))0:(2+2'6'** '    $2&C=HGFE@@<B7VCVVUYIH8:4.)#! $     $%% }}~z~ //7DFN`Sj^ifulpncoeed`iXbRUSQVSUVL_[`^\TZKM<D,;046*0"'         ")- ,'%#+ 60;DB@PALH;J=?-1%"       ,")5,<38979GHINR`akgtt|ufuchlbeW]SR>D7>/3%*!!   "#/,/% %.&9'6)'##*541<+A43959=3@8@855017+4#3(*/'5"3# %%!,"*     %).5&7057:2>-G.FDG[Sl_sdih`^TNIRER>L<A3+""  '7$:)0/,20222.:-75.3-/299:=6@:N@YSVWZU`B`BYAHA9=,/1.*,.*/#%"    "      "$ (."00)#!+&5//7&3*7(/#1)4,0*51C8C=AKKVI^E]ILR>VBJ>G4D4>0G.K>AH8F<BJ6A69:(5&1*&-!&('(.$#+  &14)856@9=ICTFLSMdQ_WZ\\VV\U[LYBQAE;791A)>$0")   )#   "&#!        $    !!!.098/2A7?C:E>==@>G9H5F9?@AEA=B9B77?4@1;-<,.<,B8CCE9A702 $!!      &("1-*2*3)5%%'     +'&%&"5'511?7D;@=9C3C3@6>/:91<-;8@>J<V>XJVST\\l]o`i^c\^XURPAQ>I97/&0!//*$(    )!5'.2&7=5-"-%*%-&0)+4#;.=0?/<;4C8MDLTPc[[_WSXSMG<>33++((" !!" "   !          $*.+/407A1>/;3<9A:C8<;544333:9:>:B@?F?F??G8V=R?M@??;;D&F*C185.2,#+0865$.+'-(!%    !!!& " %'%'&!+/!.)+%*$'#$$'")--5 ;/$$.%'',/1'2*7/:2?1D1L8M>JBDBB>1<-91./*/%- (!&"' !      %.+#&"#&)%. 26#1+0+2)>+;*0(.&$)#       "#%(&#    + 6(G2QATGSMTOKRFRSPW[RhNeY]eSgWdWiXe`]iUpUk^^`[XYOQJGF>H/>-/-&'     $%&)/%$%65%*00(''$$$$ &).$;&3'5,6,>&<22;-:0.;-=5:6C9I>@I?DHFMCRBWBWGOMOQWPVJXIMOGLLAZFVLRQLLLGEI9I6A4411(4''/)#! ##,"1)3464;5B>@DCCFE@L;E>C>@?6A8>;@1C/<6944231822:-615571<4?.71-.%& "       '+ )*)0*,4&:+*+*')%,+ "$$"'!)*)8-775632905@$L&K99L:GDCLEILEJH=K7>8262.231,+'*!+%         *0%+1+-.+4$8*63)5)4-15);'=*0226-760@#=&.(7&6--=,?*C&@9<<8:@<A7?8?8;58;>-F!=,,/&$)"         !%-!+-1$.,*+,(%'*      !#+"2&<)B,E0?;>>C5O;LKEXDXOR]OZRTUSUPMWI\LQSMHNILOIGOGPMJLOJJEF=L7F6@9;48:643/,6"-'*#            $!,0'&<+<2E4P@MFIHIDEF:G6D:=9?>3D3?18%6!4/2'(($))#"" !                   !# "      !)$-*.-=-56<8B3I=NCCPBQKHXORWUUfLiJhQWZLZNYRRVFWBLIBS;O<IGBCI6T=??3>2/1%4 1&,,)'$&&)!*-!#    "' *($'(-+,7*9-5=5=8F>A??>B6@:9A5B1?17752=*;+25(1$,%,.!     " %.*216046/;-1:+8326-7&7#-,.!         "!)"3*8)8(@25=-B:@8F9M=FCBI=ACEFEHAGADH:JADH8A4;466426/61*1%%))-          "! #""$#"!%*1,)&5&5%3,1**,'4-10<(C(>14.411;,958<87472:/7,2(2",!)! ,1'$!!#   !! %&,*2-44+7%8+33,4-34346/:.7+4+,$ " '# &%      %)%"$%!(#"&+$*&2(223>6<<:D9@=<@4<98=7<5@2C,B1:7D0>569/:'<&8/08-;8-5.25*3#-& $#               "                !  !")",'##+-#!0!1$2"0$*''$""#"             # ,$%*#$'"&-%.&*1*0.'4 6'/5&8,4021+3*02,435<2<5;:95:2?3F6;?2E1?34:/6-'8(--(/") *")!% !%    !           %            !!$,+!%/0,,+$)%-+5/1/.1+5&4-01.3-5,/4+;14*3):.3,5,3%6*1+&70*"        22,&(!#*#,*.,8*?+;0=2?49743).*(.%1+.0--3(3(.3+3*-0&6#10+3'0+.)',,$                 $) .*     "$*)&.--5/03.231</;084;389;4>2=86G0C3<6<6;285141-3)2%,'$0#&**+.%)*%.#)+#*!'&##      #  '"#'#"!$",* +!&%$*!#"($*(%*$,+%*)''$$" & #& !$!                                  !#$"$&)-,"%&+*)-))..*$),!/,(#1%/)1 6"1'/),&1!4%1-*,*-'((+51"&('"#'!'(           !$$%+3%10425266*?/643718,7./1113/2,3-.=@9%/$0"/.-$&&          "(&"+$&*%"$) '$."$#""#$  !$,&#  %# $"          $%&$%)),)/-1,2././,-/.(-'02(3'5)-1+6*//7+&)"/$,(#,%&+/."+,," #             &*&!"')#((&                  % $"(*"0/+(!#(%%"!$!$##"((""$$&&#%% +"*## &!#     !",+%(()1&7(-0,36.9,<2;673=,G.?91<19357227227$;(:(1&6#:3$,'%)#!            !  "&$ #!$%!)'$!(##!            #" !!$&"$&+' %$$$')&" ("%!$'!!!$''%)#!#! "              &'* /,-.!&%"/."% "#$(" &"               #( !'#/2$:$7,417-422910:.<,:3544608'60+9%9#5"1#*%$"&& "    # !#' %&(!'#"''&*)(''/./3&<*23-7371:93?-95;1>/;25222-6(7+4,2*0),'+,$*#'"!"&!%((""     $!! ' &%"'                   !!"".)#          '))!+#(+'+*+/.4-6/91643546-:138/965763;0;/:,85-@$FI?$5,0,(.*%13:+%0)!"     % # #$!"'!"(0%$'# '*%&#!"           &)'"$ '#)() 0!/*$+"-$)(('*,)+''((%*#&'"*,+"!"&'$$ #&           % !%&#!"$" "$!%!).)#('!.1"*)#+#(+$/44"+/$.)&)#'"*%")&("% '% # $'('!         '!'$ $"! "#$"#           !+0/!/$197&+1+/.*:*53/90:379:6=1:1:3;/=3?78A3>5@<6;69644*6'9(1,*.".!&"#   #"&)))"&%,(,'&+($)##+"%'!"'"%$'--!",!!,0,,%%% !'' $ "                                    "%%#*%.&+,-1$;&3.+07 6!3$2#7%3$5;!2(/)2#4 20**1&,1)1%&*%..% $# #            #(!#((#'%)")('.!)((,+/*,1(0)'1#.*('-6"-)/.+-/*5&4(,.++(&"&$"%&#        )).3,&#*#)#-+'&($/%5"3&,&."0$/-!%+( %$ #                   &#"&(&$!*(%'#(!)+'!+#+''(-'*))+(0)&)$%**0310(&(#          #% *!'$"        %& $#%!%$$ +2/)&"&!& &)$           $*$$)!%&"&#%)(*0#6&4$7%; 4'0*2(3*0)-1$4 7.(8!8$++&,$%* ,*)#*,&$                             " )+ )%)#!)#"! "$*')'!             $''*3.)!,0 &(*&.$))1',*+%0$-+#1#). 1"+((%&+(#+,)!'''+,()                !    !'.-$%)"1('& 0/')**$,+%/)+0!7 1*(5!/$-*'*$%%&&)*1' !"!          "#$"!"($!% "                               !  %%!",&"(!$('!!)#"$"'"'&,-))-("!          $##                              $#!"# $!$')#!*%!$$''"$"# !  !             "               %!!"                 ('#%$',%!$#+!)"#*")#%#( ((+##!%!                                   !! % (              "&,$%++'.$(!2#23$262#.'+*'/$,&&,)#+#')!'$+'!" $ "              #         (!)/'$#* (()#(*&-#+".791$*!*$*$)#&&$/&(("$!"('%#!!#             "%!+2 !               # (    $  $              """ !'% %* *+!& +'& +$/"%'(',"-''''$,#.'(,$%03+)-*)$# "         # !##"!!##                 !  &" % ( "!                !$"%()$("- %$,3*&+"*0!,%#--"'''$*!$$%"(%"#& $"#       "'"&"!$$#% !          !'+' "$&+(!+( '),'% ((%(+)# $! !" !            $ #! !$ $&!))&$&&#%'"""""""##'                                          &)&'#)-!+!'&&"()+ +*-($'#!'%$'!'"%& !%+!         !#$ ))"'#-!0#+*)0'.-,1*/.+0$5#4*%8>!5%,!6'/#/'3!50%$)$*$%")$)%"#         # ( ##"&#$ (#  #$       ! !! !!#*& %"!!&(.&%+&#'%              $$!"$$ &%$$!""!!"!            " "!!              #&'"'(!#"'!+)& 0/ ,3-!%!**-' (&$%,&$%)                                     #!          #&#!#$&%&%'&%*#+$,%0#1"-',+%2;6/ 2 *#''%'%"+1) % #!$&        "! # !                        #                # #                           hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SnareRimshot-Hard.wav000066400000000000000000002640521366722712400244130ustar00rootroot00000000000000RIFF"hWAVEfmt DXPAD data*X~ X %*+-..e-+4+k*(,++'|'&V#m""$("g [r?ST \ 6>IGo--:x?4KH/K DmRntjq.zNmطͷ;>ʸgmQgzrujaTMG=-P.:?;2L'*Z?TcVtC1p-,!0\S@X(0DYrm^a^[G\ZZ WQENKKI3K/@=(3I"%%" ?'45X2 5BOOSrH/5v#=@ `y$`&M%$#T!0:P/"$#NplC$#%//5=WA9'H [F"{*./)??3ph`4v @'r"$ kH6^O_1^?ʏ}[ӡ;ݴx#C:{ Vv̊.NVr)xٲ n7h?jUfjq55d 3B$|Nj0 T>>w9/ Ku '.r7?WC>@5%(#$2 >C ?7*9,O y=5\ns YCQvhc 0!T^Ճy6 @ ltaf*լܜ !UȚŽɍB=G5O2W;WƞM ɎMYL @=iuA>PY4Iw  "!#Z%&&(&"6B:$"=~ Z d!(&%*//.N.131{-" 5Z[>3E ')EH,:c Q,7WZ?9&M;l4 FeVI 0"$! ߸߄_'#!-([365-!o K DjSbN2j..*=* ,l1zz.YjQ rB{l ~p5f|mo4gFM-5$ :   R I!8evHhR " #<r""5v2 +  ~ O\]*V5I2+(@*/13*x6v%HCc޸  of<\8E (\ /Sfa69 Yv@HV ! \Y@";!: VzL BAz " Pu5  5`mP5&  d]veorL-<Q: xHaiUT` JXPI C.njJ   !$K$hizk 5a U [zGe U \z6w"(/4;44G/$@Zu5BW 5Vp N  k; ?X2To7 ,IBB]d,ޗ;&޷߷ Z)R?c| <h{ۍCzqi4X' 2\f_Bt{-z~j P 5})'/+nefjH  2  [=|*R )O(),)!A~%]}6   ]v cUJ P 9_/+x.RoG?w!SH%xU UjltM" ZQ *M[3"/nnLQ)lw F(> 4 0 L SYG tJ`Z/4x 'G<0wd~-8; Nf"XA_ ^9F@mG'h {^ 9   n' .)Wq 0 N~" S 3((3!4%})&%B(("!Kog e&V\  so Jd_^Db ;!Ft{JeT4 B]FMe.܊]tkPcӼ| śĆ͡β`ݤ'Q~Hݕ+N6N*5-~~&UE) Jw F$R'T$8K , I^tA,U   Z nY!x<+Dw+[v1 UbuKn Q-hq8+   @g1U~cuo/<d=q`Qs{EaVzOv׭qxri`}n0Vg===L?  - # 0 [ FoW L-p7BP  !* -t9x'-Hb*) }Yi Ex< ;# 9 W/ `iC $_$i_'bU \~NhSm/E0 d Rk $*Q =  l` &.ZL|k7<'D~]n-wj#Qk:6@zN8*Vpifgh cz R   x0; MT |  p$ ;wAt i {o/n /p2t HV {)_qv i BxSgtY>g{T(i\`2dgqn3nSgW:v )svd? GF\V:B:Bt+vJ q % n->)8r TByJHjcl$cxJN97|*X [2 S@" r+F K N [  W  IJa  z!hf ' 6 r  p < m  ~=,h 6 D & ! j+T'?cYEy3DZM{cD}m!w84.=D;H  )7S _ 1$87(4aAU2D}<' G 0  X:W *G5gEv j~ Z y K ~ 2 {3 ( zy e y &n#?!v  u!X,L&K &U9{Iy_7N`?SxP2t/{T.tPU\wxmk${K$;X<BBs h B .DD /%7 E 13 0 9 Z /B) D R ! y } \N7rn (vI npQGu#A P1.3H5yp*H  2g3{f;RY{MsMp37|Nrp?|/i2b[[r7 Vh\,\i8"7Ws~ Zo SIw0 !Yw # ( A j $u K (  Wy(vA d9| $ 3 @ k U [  n G ^  S(r` g@D9Ap V ND+\i^GGWLwEK` qpC l*zxRfqw%m% @  w* RJe6LTpwvi]uNyiZdwOYIuzW Fw}e?XSA]PR)H?p :8 7cy |u=8+[,3,$B 6wtbJ+ u +&?"lH>}re55]kUHO}:Tz/V v1.n7LaB]:an}O/[pw5 g'2j ([$ZvGMw_:d`>MnZ6T0W{`/:bvB30 {-lNhq~B*5 6~(  |1| !<D6m% pItkb5s;Wo?w+.A"TllQ!mw_uQ] DX7hy$ -& .b t[sIH&JF@'+ dF71[Utxe_\10Zg&FBk wL`:e $n!@l-klf*q[aQMEu*uS6^ :WiO4YPBRyb$>Z!ZSle);6XTx8U 5 uW jAJbAP#wRK_}5%zG[FHd+mjM6V;{N%UH;Ks)58.!/^{V{906Y$'Y{ 17/ vka;NYzZ%I!s>fEzkwp|j@Gm}B++fHH^sQmB8tjoPqA'iW|Z} @fsbguS 1P]q-NX `_?W)S Ru|z!D[\Ye)M,<H4;"C*Z %(RFMb,++^1lw1uiP"zH<) 07mo$?QZfnwb"J KD\;T.Xg2Dk5/D)h`$k$= p|NoeD3]qu-F7sBCc>/%}zT/{S^ss9 {V+d &K%/hQe\" 1:,x;#Y -Oo9>m <>RI1om$XU95;-% xKB6ZuJrVBI!_k)#3"_u0{fCxC,xNjn,xwSgqq!3:dsULw3Q9c[%F^ ojt oMeQ}`m29#53z#g+r3"Zu`'qY`>Og|AS!I|Um_"U5jN|xC%>'jHS`wf@V1 >d%Mgla^+| 7cPFbkCVt};>i%NKBr. `'$|bt|*/X^B1coQbp[v9*Q=v8g7<"NVW1z7ev5pgi99?);_AQ'$& d@Is;zKbwy?- WH8#^uIhk)k;r seOl}$?0Eq~;f 3C-74 kn{/>nUctkO%V?VJ]o#pId KbmNcO. L#LHe.k 6||rs>XY)6Rymje/+w .zaqU0o.E#_G<};fR-M \KyH2P w$N-Nyenq'p8BPo6;j\ZL6>Dyw5*+4>b|1b0c5`-1Z(4J7,()EjhJ]OSN7]eYHH_^NZ6-S2w!5bK<(VPw9=ay xPj1l5l~hU8|#)`H4jACi#KJ"T /.!x7pk!ND]+;%m<Us 4u)%X v }cFfJ^Tlu'K" sP-qZ+CalRG?NA&lpG<T4S N9A=U$x,m>gU_izn0WR2&y?7h5/E+@`*U3ED !J+]XmJ} r=79 GEvM('^I!xv(XG8XR| Z,Jx8##x iB:%<4qo V_@I e4nv2leA;_3a AF41;_Vlx02S. K,p_>.P}5Z[V][cpep4 !~-\{ z! ':&e}\xa=pQNSh2^[8o`lkDrb>7#miK#%?s`cuR4DUH&=W{_B_`*rV,gE)*8A}8.wXuZ8*g~A@ZjEs9IzP:uL[InbvR4XwJ s HoO :8_w8rw&TP|*? 4^"8#r C  7^CprTxG-I%FFVbUT3qF !-HEy-]n+i2C<\;No?Ei\3d 0[1Jp2Da 28V3hP:(.4d;GxC)Luu4R SI]\`D~."V;rq $ %R(ULd?X .!L^X:(|XQ^l4{InUKT  ,+pYq?%e?*=1JA5K`'.lI*+g]l,/a-\)D|$^=&yj^TL~!,}429r{!G' %Ts"V]P;]ud}R&P$Mz&%bIllxZR$`|9[}p<'8&9ygz>W[(KN?"TDv,BDWIPY5Z"V X'<<{Tz0H<bqpSa3}{j]p`AC1 (h6wP!WG? myB)GrIp?>3GN 2 %i4{b \,weT9Z< =/booZejRsJSu.[)ikF$twd-NbS4G9^+rYbpNeP:nB< PN4m} y<Zrl:Q%bp+.%6Ffa>fS]`vAo qn_A8n8zWp`RjVqk|5$-n:n TSBc1$5Z W5#:g}`B/SY^ }srzE: 1\ZY)RS i>8+tP-8XJ .C 8|Red ITfxd`Et[_pno`"XO8V"=z9@8MlI_A"Z:I.\Lj}Ov)w"T81Z*!FbBu 7LM:07`qKEZVMlg/X^o++(&QM/IQDq;7;qb$=K'%x/02_>W@9W9'Cf4ldr,A?Bg /XhBr) ;wJQx-<+*<0P 7G<Tn}lE)n|wjXrs -m3{ V~"eNV) !sW[\ E A+chn tt e-P1 4E#REUEA"wvW4" xwpebe>u"ph,.4zfDA'P,i?U}$h!~,q0ZQE 0DZpe /| *Qt:>"g4-x,e\ { YV r>Z'|NHlyGJ>gr ]=q*+y6l;_L9'CG4z#h|<k<|@' /VTJQ - 'RP2(ezOS}3cD]Cu3L4eE{G6VT;eTXWkv=<E 5qnQukkLI!B -W)Hc%(+]`pYPn kv|d{d)*p nWMUhI|? Y noG:-hOP_CS*_7.k=j|p/3v}tI )T-`WfiPxoJ6fND#VF+V~k3< E-YZz_})<J3iGd?r 1.(.(w$T/cEGrDB)C',zS5u9"r_9 nMLda2;& zi^3K #dngDc":,6?;Q<L]PCruw>!pd7`xs;=Y/<5kl|im+.aML!bI #'rr7@n~CV}pLdI' D|HQ 0W3G\X 2jfsPB[f]xoX I-(.F2RKAc;'Lc [,%3}<3&sq2c*Fp y{,5d }TN)yNHPN2A^5Uu*SUF^!F=$-L\xom/~G/7=t;#m;1JZ/ ?>xhGI/92:,/Z-5dt _eP;Iw$#[Y'G]A;F1kIl[9Lh87I)'KqN?L< ^x'b)J$yhac~AhQ5]NzQsb+|uqJAfN/]o[#ffw((T.&jM1io<B&~LUdh~GaS%.K~i]T/C7bOJQ78PV,K1QSjRVYWa%MP4-k"9[#wU0Tm" iIh"~c$*A zE6^ZsXor'EQ29Qtq#]iNc,0dzoB:xaTs>$../ufoXVMRwPP>Mdz{e5>O#?yI% %24vyIAhoT6S aOA="<EN[vZAnb*W7:G)CJ7 \%[u{-t;!EfqY~~bXg-Y-swDe0lEN]Kr:}~~q+mp13Rgg5w k "xy8PIrtmWX3S$]6}w=IP'f/-~7fR"\+LZS_Sf|{qXGKoQOD%!Wj7EH^|1FsjZ2O(pRpA|ndBj" xOLMrmF&0S_$LKRUc|Uv <.2{eyn_uv_U%cg@|"|b |_RKMMN`buetyO9ij, 6}glg0:{KX RnXZt^  Wcf+IO&2,1`I <9|7-QRJHG#()He<]m D4emlR8AU?usXXkff=(3`ANF0) HQ3 !H=3~$L1Hvp90yLl 2jn7AQ+L3VDLrI DZeN9qR%5?%/0Igcw 'u6rC9fd"!/3.tg`jy$mc 2 n\j~m`uOUjr*,i~hAZ65HYT<3.Bea+:T79hwzmi\<B?a9t(PB}} vTx/@0f+( -kkAab#AtVE#>QD+2aSC# A%_+cXevqv|^5O*/+MQ'8]?.F/"GwuSKKj|_ubHR?u&$Cdzmu5 w]8.\`BDotL7Ftd^'   WS6%(DoaRda}hc\ !( Ur'|~m`@18WQ/ ,FQpO9TI=w{dWot)0S:'+IEFVvS=<#+?.'39)* %"!"*N& kG *Yz\JNkj!,byX?IZrwrj\L2,1ty\NS=)  38|'H4,ZjOLcg610.&EY`}T)+ *Va7[pjp@  ST1$931L,z@"ZVe}2%0]x`*J}1B4Sp) 7RRJu||X1D yhflG<.!;+zF 1mphM.X~m'JgmwE>F2,=b{u@U }v]<71 <1yzG(CWVAIccVKQgBdoxO7:IWu{Z`[((AV?6QX50Zpq`=1,"9v~4y s}8Wqy[om>n7xk~ ),7I( 1A91JPQ1 1EW\L?e+},C@C5 &2O^j9;`g^*DO5om$&DZ^aE13O1 =I- ,ISja5EskI*);[[p{yw{y0%((S\j^*2[_0a}&$ }}j8InrcRL2Zk`=\~z.@w]}Hhdj7 5J`]Qjtl]&"IcN3',`w4"PgO@oG$(]WG?NncATRgb]vvW]pxz}/1 .0%JTA!$;a{|{UOiva9'(7dnaKFVpjcdri!IdO +'& &='"IZD0!+;BF(57  0&I|kjefO~q?-,! 5CE Abf`?bbbJBRYG-QNA3(90#HI- E_C p1=z|T]p>;Zts[ltuy`x4:) +##$%6)P^cK19F6  Q~~)"#;HL +LV^SE=15Q=fU`znMFgrTTPIPcnm{ (?DC.?SNFGY^PI]k{_ASucD:^T2////>u|D" ej?&8N[bE((09I/t{pV_iptsWBTftem|cgtvwrYob`$G, *;8Q]ZnTC:<8420oZZV2"!44;7#'1'DPxL7\V%eu~G?W|hev}lpmzi0'T5-%tyx~G-1$1FcolOVZ=)(   MbfY?<?F-1! jXbvucY{hMX\b?9T %2:4. %@YjM:D1#(BelpJ 1( 02#J}nwe= -4QUQ9IOQ>;]kx|xupl}jkO<BQjiws(/?I8A* !zubtv(2GgbQOc|K9Q_UbccdqtRRE91. >`=Z_F*"(Qo]V^_j^QaVS?FhS}|m\mZqmk{qmqruwspsagvxxySNana\LLk ,TJKN_gm}gcaffV9DjkyqjMWvnZWICB52,Ibgb3-,u~  "CTWN<GDJHA7E99@o!9DwtR0?Ib`VM`b\eg|iYMSMTimpiSI1")Qcb;tuss?'4dx||jw     ,OHns}|xoovj~~}{vQ@TV*todTVLPLP}vaYjeaeYcTVg~unVrtvo}rw{~}dZ]x:R^_Q?5&)->`^bli~yjjdZII]zx^Zhw{L! %AA=TxymXZryg/(*+9VYS>6?aI1,( .=A" (e`}5? &!1'  (<BhzyJ=& +(<!jYj66#69(A2)bb- @wt3($21=KK( )Djr`**$  zz cut]U|x%#) %MQVYnz{mvjZ\PIpYJ[tpvWD( /91rnaIBIWu}oqcM( N`?8K -<LEMa}y^ZKI79ZjPA*IjA;`bA* -(1+  )/Wea[0 0^y~hcG2Hjz^Wsh_EKGbJ6jrn]I@?Yh_ayQISM<JapqhVG*     zhshihiVx /99DPfjyb+&Rvzoom^eZwwm>( <_Y9% 6" #vRXlU?Y|]Vh1(A48>2>467MMY\A :\lb% A_gj[A% (4B.5:+  '* tiqu  '.:CQokI:LRIF3:Z|zurwwotuyrrx}yzwhO>4Il}k[<6+ ocduT?\~zmT6'-/4HNTSikqYH3Sub9 *QcT@88E[faus{l`}4JNBG461.6W|kqo^^nzvoWWwv}TVhcWLNAYZRJO]cgbZIE7<+IPA(?ikPAPW.}{ulM^y{kSDw) 17I]_Zf{qY.#+* -_|ye;""3ABIFHNloM>FH928(ZM&+fzR+$*)6/:B?4AKe{znW\|tmUM1IaiD#(+ |_Ud{mphXU`jnylYFPfpZTLjreK9LhyvcN`{|@qyx}b2 (4>Okyrkm|yrviuwscA  A7 p]|ku{{{|{er 49=AUU[>6JZbrzppyr\VW\dWWQhl|g\baJ #2;J`b;qmt~3B?KWV]_WDGOZjjjrbQL>Vep`\a_bhkcS6( *$%1//.71) ;8:1(!  rq{}{|~wxLRN  '/3.7Pc~peckN?CZlS.    * /2-76=<4%" !'"/@H</ 54AIJ036@+#<RIG>SlzyrQ58Y|{tn|}nprsgTMMe^YC$rpxodZkzkUHT^cW[^ymxn7.) 2MNQU_bf_pw}meZP`n{su}nT>3-78/$"$2G>.)7NID=Cxcc}y[Ok{]aimJ;GCJK\XK1#/Kiz^V][Y^lt{zw#!  &1 0:8*!-AHQ81%;><.""394 -!  $  :Ri{uYHNUL@,3:GOOX^ofb]U:1+AG@RRcSO>-2BPDB81" *IJO9(-9AFE58138T\F6)5@9+.8!<8%%3( xemrv|}z  4K]hZVWUQRKMUcsg_Yitv}zw}lm{vkpXE]uuiVOUaYE( :.qimv}h^QZ[[\IB=MLfrze_ZTbj|tzf[mxqnp &26.=37%3(#%3C`guuzj\h{nZwthho{uhVKJUahdV\]g{nd\SZOJ]^^A0#+&%&"!   )4 '(#(,#'/>  '@:<0%    |~ !+)+0)&($%.;@KB8+'-3AQawsulh_\Y^cejefrsaNNZ[LOXVKNORNOB4# .21)   xim .42/)"%11@N]tsvijjkkYTD62?>;B=NWlu~uhZS?0(.2&?U[\QR^iXC3?<4!   $&#+/;:% 39* '+85) )/6   (33  wwx{ru{|yw):,(.BCVOSKLXacpy|nuxqkx}q\SINfrZ>') uru{yrb]K]izxdZXYfwvqhx   (7K[I@9@;/./#&4CPTUHMDH@9DOZXLD<3!-7LAO@:944,")$ "#!!- (7>DKK:)%   !))09LXTS_lssoillhcp{~w|\UUXSRScozuzwlWOOCC0*'67??B/ ~rppxy~mdc`ee^agozhXJJQNX^owysxu}m~{qnu{ "&+.;DKJ?JWca^bkzwcTLNinh`ccfkxy}sp`ZU\bhgcVZKSKQH;<:72-"   ()+%!!    ') **)/4?@;;99><>PZ[STRYY]\ZSXVb`WMDR^_`]]binh\NJKFJOWTRJJDH82**(/" }up{yz  &6IRLA=<KRF@::=BGBNFL@7,%.&,/'669@@GDJ:74A?BB6DGUUQM@B1"  '')'#!#!%!   "*(#     (-*'' '  %('"""(,702*00/,)37;963((!,0749692586/18@GH?,/*932+%     "*+2@BJJ?A.@6<+')03=<LRVRLUPWP\X^[_aemfb^]elmumndaVIB<8>574;:9-('"''#%  # #    %%!%4682;>HHFKKPLKJHKCKH@H<EA<665BBOFJDMGMAB<A@DE@>9799BA<=6?;<-"       !#&.)  &&+!,!,"#"##*&-))&              "($3*2-/2545537974(.*:7B7311430/1111416=>HFEMLOSLNAHDHCA?FKPRKPNPAA/6-4/)$()+%!  $!$&+0,1*60;<7703/56=3A:=>68235/5,6654*'%**.)*&,//01,(     "" #"!(',-).-0'# #          $#!!# %#(&/*/,$'%%)&2/:8/*!)         &'*$)",(%%"++1/20)$$''$#!"% $(%)$#      !%%&($+!%#((.*1034-/!(!*&+(,+1,)!    #       #)-2.2387=@DGCCAD@F<?=;;;:=<:;8<:83/+,-0,+&*'+!#         #"####&(,+0(,*+)+&/+/-)'& "#"%#$$)&+()"&!   '')*!) &#"$(,1/266<8:9<:>9>8?6A6>06*0*0(1),,(*'(+&+&&&&"         # !!" ! #$!## #        %$         ! # !                                   ##!""!%"'&%'%,','+*++*(-(*+'*(+'*'*'&%&#$#& ! "!                            #!        "      !##$&''*(-,+0)/(,)**(**(,'+++**+,////+0*1,2/2/11..*-%* (                 !"%$!#     !!#!$!$#%$&%$%!$#!                     !$#$'$,".$*%*&(%&'&'&%)%($&#$'(&%#&!#!   "!$#''**-.,2*2-0111/2.4,2-//--)($'!'$   !" (!)$('&*'+,*.,/-/.///-*-'+&(%&%$$$%#$!#                                  !!""" !!                      !      # %#%'%+()*)))+()&'&&#%% $ ""$"$ " "          !                                        !""                                                                                                                                     hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SnareRimshot-Hardest.wav000066400000000000000000002644001366722712400251240ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD dataYj'-}2a8:<>BFsC@n?;;p<*:Y9*;%6 451&-)`&Q$ "vSNLL[BN4@t*pG`niJ"ᴉq/0^o5`ֱⱼޱױұѱȱcQ2 "G;Hv) 93*B. ' Bhqe+FVR_C+ i&JX-Nfohpo+pmge`](Z XUTRP BO6'rkq g(0@*d;9sA${/%=bJLQWV]f}nndUD7,!  O#V28?rEE1@,z I z&O5WE9U`^K/m"DFP)jNm С. NO+aΫӫԒȍׯR3lT_!ú«NJl 4ݟϩ4t'A)k̮;[ľػ$M3"D$#$N){/4n2k*\#*Xq uJL eZg q/P&.2R0(& A f#x)j07Z?K[!ggbx[zS.K?p515>FMQS-ScNlJD !a !=S td  ud8V4>F=% al ?e PEYD1 ΰr4ʪŽ&NL~_gdʓhۑxܞ 2pvG_@V-&(2(Q.3.P$ A| } Cq) ,1'"]W 8&&*"]  % M f  +^/8*%',-_&Z )uf}@m% E  ( _  { A 3 ~{C?CUQ҂FȔ ̝Ҵ۟MwAr2?B %R))-u% ?8`\3j.|""\Z M#pV"#~}g2'rٰ^Pw%V.#- Qm!(s,' V~4ioZ?Rr$hv@[%5 ՚;v  &0/(U!3- ;,2?rk &-+z}ւS({9J}[inXv$U. 8<3$  ^ij|Y z CF"%2A !%i8mCKJ>N/".>440*&."##`eKH$v` Yj> 1ufm9PVo =` H:WE"Q9׵;mm:">N3+ Jտ0IA u):.u {* mo4e \Y !Z' / `asRR z iC\c^ L }>p'h#g!"[$l"C,!J)(h  | 6ow| B9hOzy ެݼ /hGca :>` 0, _QUN''**e),0c }6DI . A<7K4"YS+qd8)q u  e$bLW{tCCoqۖIVDqJ =7Hn^yx%EX1xF+ /z] #NkO jY / 5*2-3y2{+"pXr$g's%#$F!"'1%+J JOAoKq4.d0?CQS 2%[ΒӠ2}ۦޱ Vdl@jD~ֻ~o)VD7AZh#L + #N ^) e!c# obitJ+ $# *W l q %Y($&p^-\XkDS vK_ (%9 . 8}dVen@PYOoA 1 T5*$$!#r /0jOUo(,=ow01(s }lxvG{v0j !QS~6/!DK 8K)Z(>|SKP"Cp5eO7u)qr Mzxqv*IBwf   f +>PaANXTI#Uw] p!")    f w0!1  }K[ Y-]' z j }tcvIzs's&d"M"7R?{I Zv#ߌqI/=V23@Sk&A5]@2Je_k &qn'9&6T |!!D  I & Py : !-&G< B, uaiw We vy l d: YeSH Gje:S u?F4<5dxI0DX8!U?%,BB?|  DB"7 ^Z <@LDQ M T 0fj~n0`Jm7-p  J  ?L)*PU`DSr@;@C!he@W <{Ay j    qT  B4:f3_ w9o," t$k%! A>G>L 8$3 Q e[""^`&HG\vy[?C}F%<d3X&G| '܊uB%R$ibuaqh k\2gv~  ^CH S22ur[<<`  r +  ; qNV e t =q  >,`7 _F i(C#!*8"  zz N P!-2S]Axpj-%w ] ]\3P O   ] / [+u-keY/*ny]cZX:@: JS_@ 9K (3vT qJ " J Id(fX NQ\A<1[&8S8 ?]7p. ?et.p36DW~l5GNUz[)e,LH%0&o HGT`I }T *x3 |_ XlQKuxM  Z { =11l w&1vIUfv ` BF O x X m Q>O- T I8t_ UO1Gwxy6[~r QL_=J>/ k) ~FfD 7 R. a < V/$ qcQ) ed@lx#B@KHZ6YBXa&@#` u 9 2 vnx?)= bAW9kp=fV 4  &b.  2M9)Cy#(+|n A.'*L)c EyD"7ydzQjn VL8u[Y>n}ogeYr~7i-Pj-P` &(* #z d n ,d8 32 h tEn]A9F^cNPV[QC3 ? C 3Ih)2/I  N]).~LGn2-hSa6Pr,Aua-NGjDr7 QRVqcaI`q J + j )  z  AuF uO qHbb )M2pd8fN, >W 7QKv|^m~6 3o]8  A_h$Q 0 8  X  [ \ kVnH0Z p<4Qr!Yg dZ9f'G2j_ilb08yd;=*"}^VS]/  q  _ )j)/V ,  }S0zzC-cIq!LK + #  1 %%*"wf/e}AS6I@ LO,NCKu'$ z$:TXxRGS59j/}-"3&jkJ |{ylGkw= y 1  }WM; AT [3gB1$.U%sUpee [ ^0 ~  N r q  @,XYedqGQL(c'k?fhA5# l;?n \ y Z|~QxFj"b( Q6Gu+z]'g+1<0N( 8 y Xb\g8vl2@p\fxIC`*e6"X*H3i'n=kQx%0\:&a,Z1l &pw vTE Q s # ^l0dKx@mm*:|6I-B)kYg5$*Y|RP'^UxM ui'D)l r Qr*xAduH18}v,]A/b ZI|?7uu C 4 Y  j@EQzVr|~G$"U#2[J,(]"Hwa/k&/d|CX*N#zbEE*t+04CWfI)r M b X } 1   j  |Hn@YNQ/49AqAb1f +F`h? 1*>[>'{` 6 d FUY7lFZ]9Z!NOwV~iM*M-xi&dGqbpq5C$:,g!  ) k   > \ r^A6k2SP|N`V`HP/5r@zkO J"p;/Nne{o_ HAb2chtRoIT q*56x A]=|8S!&@s4d+e|Wp&PD4,\ ` Q(R]DHZh;^o/M :n8v;YMSknv@5q1e~aH  L e5!,O$ l N[xFHZKw 4(zrOYQ+G/jE1c&Y5ubiuu I+.B3[],JWC_<M>,m6!>/&)be4OT0ZY?  rG}1N o K ( 88o)YZCCFe!D,W(mj8Lv JP9RZb^{$'?lv? 02N!j=e;U>G7E=nE\H^mqY|',:i_VzlUV?s *&X*y(VXUj44KlJPdgaU7P,:lV7f@  md R : yip4Ex9R3KUE+GK A*u&T1@;7HFM9|5*SMrc2R}QcGA7?>ZCv6Gb*]eN q{b#q/N=del@NT4 n o /[_wY _ 6);d #[ex8t|HQrkhu)iAxI!iP/+@5{X2QRrN |rMT,/f@E4A4K| 8  9(YeWS 2e- nbYA6)_46&BcG- .\#SF4b8Ok`S2TVT/MRdBR/n e y q  4vQf2>bz&Q1&17]}  6`8k 7?kRYS `=lz-wj{yB%|=?p<M'6mb8$ l  H- It_N < = C 3 } c|iWa&/Zm^^HeOa)?d TpY<bBphH\|: ^b JM4YSi}*!!c\!~]6 FJv.(  nzi}[ U0}Es(RFAxiv[N3t;l&k e 1Ibaq.)-<;FkK /4\ 9&A v {5Q 8;{o/i} |i8+1/srsgp.z/+"v!-o,rX?`{{zT! # *C O@i[d^t Gv= ROC*{3Ou#]'H|kP6du {2 u^C-+v0JI[Yx'FvKf3Yar lpKBEq7 \p~??F23P* ({?Q;hbs9/|ZhqU%vn7wP%5fp wo%)Q/G=79.gh7mc< a&fq0 \#-_u~Tpc}Q@F>/ ~5S$7`3F{G2Y#5#]lM 0DI=E&i#ir 6<Em!)Ze1IbaJ7@* T|L\I9=InMReo MJ3Z(POwG&`5.z,[-f/`v `U: o*5uPWPb9;:9#&\ ?,vZCWKNCLvplkR!tDnj_!\e?<B;<KW5 t$:H/5StX[wey>wB$CK,MmQHYEC&Xhz).c2I!%[kaWN(O<&PN,X{EVHT"r@99vw. AP@G%y(B>A^ IEb$5UBQDPVw}Z{ n2TClJkwZA\M=SE1wxc D-zSwj2?Obx"ux\\4u>YB6W 4Ifnb\.!ur^U_=c8@"|5 X?ztj68j{PpsnaY-Iw%GIU@3ooIA";#z7ZQ)^%J)6MsowaycqxBe5NKL? `\joY]3*ZA:%5qsN!=*IZW~RpJe1+Q%6;C7KN3\aY3J e&QP)fv')x4&xOMH[OI{v G\+ T6jWRG 87 wooe?y8oa3r-?'(G:_Q;%P(P$J jY<_GW{X2Fu8]`])t#AL[cQGKy dfqzmW7T *G xzxvI;6~3+|y@DS"T7eQN4|8 nrLQ>;(3 y[IgkikHZi+J~bN0uC!0_NJE4&sV+ B4p6.i8v iFT7UXj>c=]z6t"+w5]rd?s4vA AM ]Ll6 v.~j-L+a n(t3Qkm8ypYUuW0S4]*sW@5 kI$OFF2L(lpH@xlSGAc8wM G/0O=;>[^N?DS]s3pi,wMpO/;| i '5Osy`}/b4Uu /' qcykam}0/jW${z'h]*)q dI3mU}L(9<g yN (#(CFC!tyzt3i@2rq-9(u}7P/,]`%<!%aeSh8|/Y, } 2'x%+%>''C`XI:KB% $ #!=qV,K1c=J_$jF?,}t\vbe_"R|^mH>dNA]4Ct<XpsE:?+H GT|/3:P8PH|k\rs i-k T< WA:GIr3NR)">@!9+)2v?E eoe.-!cM$-J3 ^  mY78t=/N*0d|93Pz%2&rla7vrNz{X8`;C~ "_7J=q)#2S9iiD[kt-;Mj;d0thTKm-p6$l?rMj)a%7o%f Mqp$w_jZ[/oLpW2v>>^%<~tr[7>CiAMtT R|Ls{>><$jFw_Aj1`! z/b=p:\5y*(<..3v_R.ne4D>XfW/zc@9RA1&4?qZa VLd2Ozz_3>1S;guewrQcQlc2Tie@f{k24pPr r%4,* uAO_qrn1?,%?%"kLz\HR *OwsBNXaPcP {.q]9$XmE~^d_3`i yxs{\kC\;UA )T+.\B$ qlu qZVsev+$8/rZ*/ia9&#eT6i_wPS&W{K{  +`Ln:_29 Y xLn~5U^Gu'2% V0V.Qq(L%R $~U_sPUBTKD\x2`JD*fIJ} -Jo6u{u"EyG2v:waW*kyF oARLcs>L{qhU dp$R+j|b)({iG8bodk^/c28^9OLB+eFk  XFit.MQJIFX>=oWc9j407Bs3cX)Fc,gB"OGp |daXVe-3jB@\>[KW8vLZ5lF:gwXxD[h+*$T :b2r8BP?M^:fnPPn(Z]C`fyLBMNjWLZd dL-upM>=,+|@QpDrHHg1G+_u44b" ?_%o~i1vk6{RLi+0hnX'f GT"!ok")l}e8M*T O8u^>5 QwS&<<*Y;~#HV>8,*D'[z.+?AjI{+nr 1~I.2L]M 9<c1P`G\T 8Tp8?;ZF 'Y|aKpR6p kS,Ck/45#gP:edp$Dy df2%@[|%hU[WQOW,! Q ,|> ]P*H\X|6K`us@>w&h)r2gp5GFv#DQMx#.a6p4AX @Ei-w:anF tc9z[(ph=e|6 fdn-qAU$xZ:!CpjZQ'<8y^fM']8u?~ge8by#V{~ty4 3lCTnu3Y^j'<KM:wQtI1nr~\0'*O*NvgP:C9d. r1#[XY5Q Uywz [(!,AX.;;OfVze[]WA*M"H}8[`/IjA``XAVbR1? hR_^XhlNI lW?\F aY0ylx%p)v+#lN6C${?B9 zN=qES! - c`+a"<"n!8d!ot1YG/\'AllFIxwD83K*wOlf5?@E St oZ#apR|Gm/is:e B&\oJ<$1yq7y 4&;@ZgxUDWm)#p>cD`*4|V&!X&D8w"}oX:1nC%A7_@~|Rby45finx[Fvw}v7.b-BGQ} )Ha&y~igNAD5Ve5t77kdp;~#NxS~EF\6M]y3Th*p;b < .j: ZFk_\9'euTxIROC_k'/ Zs;q]Q ?it{OUkn<< AI[^C}EsfNkI}/$"t:o/ztELu'| m!y pD0H7kP.k}&SV[>^BA"22 mh+3]t$0jKbK3VrDG{ ?;!6/ n1sP,L5l,%&>v_{]),[V"CASIvQcx\kbUZAdMiG_'O#vs^G@NX'SOiO|S[ [ }rT ;J6   q)-Xrb N ,"6 ji 0.MG$h*C,S[\qkh+,KKfw>4#R9de99hxmvPP|,DFs((|dmY7MRpr4U\5KOOtz+ \@b}{)(sG}HRl@Kg/Kz6C` I/aJgnwcFizR0O["}J?{{v_wS>hx4 P ZX{i+'? 5 K4q3=`c+QN.4AZS^;%BJ#V.ma V)@wx /v)0,' !SydcUDf%3`mNB9qJp_Zun $Nd ln3_;EA4*+OsX 8f$p,`P PbILya<D8c1zeaIBhG)@sG=m80tkpdxGzN41roDM $ML'nR# 2($&EskF!;{squ}!xC..2 'W][od&S_YS8Cos9]zN"'*AsY^%"neFlV=HW7@`mSv(o F II@Y2N1 fO1 F T}~PI_cW1/ ,@HD^~/X`WH@NH\VL ,<PJc$7#.VjZU]><t\qqPpz,HS:1Ji(xS p FVwG[%J}aGyrz,uXSlsj}7c_Rtq/5,|&#-87 MV<8-SQmw@ P_,TH? B0!xtQo?K6z3fno /8v<wqGx~[` fOysay2A!o' *t(p  pg) +3169QJ!F!4z]%_uO73ktuI]_^PF3=E!P}AM; @tEr1tp M09=k[Pg;.)NqP81&N]J+f:F^ur)8sm bUf'>.VrVoH>vL3K ?5Bb*N2'`*M(qkMz\UU!}{C,ldf]ss0SoY4@& UivmI,^x>52RJ*9a&BV)3vjZ[hQSagfc<=EAYiba~Vx"'X*C}x44{@dgI+5j9%!! P_c}7 i:\7@\_bc5D-s[(he`s%p{]8k20n|m+g{BoV1|iPAJi~tvO (Zlx3/z['<>{[";>%Yh2&PejbJmgko8:A ,M 0Uitz_yK3ZNxe82.~Eg;Is]S! TvoF&A/}U &*!e3OZ#8bDXg8 %*2 `H&EQn+LqVZRA C?Lnq|iCi`NtsEIubG Rn? :lRDisdxm^//,E ".<d~o><B47m2" |ZE4Hc^nB*Frm? +HYSr_GZiax|b;=;GE71EixpWK";h~s"5LK' $ ,@';\8$&+<3 %(H:HXS<5H<}Xt 13 R7KkH5YS.L6'.KnYgh[s|^V]`}Z, 5@0)Qp}GkJWjug3dxJ<TB( (3QWftW*"\b! %Ga~u7+;upoO&;2&3W[HHQE/IpUS|~VBhlR/CPMX55>T4)$>h~xi& +?, UgL7B) #!+7+/5 #8, ,& )!'@QE12]J?phbUR48&160)<%  8F/& ,G*'6  <UQ.& **6K",H2<@!Zvwj#(.-."-%4?6(4, &(-GR;("<?"1J8kx26Iap&!:*Hxj5&5gpD5'.>X]PW GG *)*0(.*,ZT4!4|  ,A9 Gimb37d` /GTTXVFA3 ):-(Qr}^<BEEIIs|qC7,( #>>3?# | EhgMO}pVP[R/(?Nu~xTCGNUZV?2$.9C*'',RSmqsk_: <) 469}jjtcelilfox$().c_M &#' =MOM?7 .+.<V[E6.=7&0DVJ7   !FYqaO.()( ;Ysigqdi]B% :@:)0% @@~yzt~zjf)1HVK')Ei?".4MftgMN@$UY$_[7 @cvfG>;PYP-#,CNB1' //)}$ #?ISJ:,*. 6,&7%[N"& 2 +64  - %{yV` -F/73%JmR5%Kiv`YoxWJE>Nrnr~zigcN23.FY_B=DcmkK, (47;:D... neu}_[s`  ,AUB168ZmsbH<Nbj.#Ef_b^PF{NXtz\H"8G&BdaM(  .B(  *9.xv" urv~xeQoiJ;,0/%F+>E%-NE-7OE 6;5%A{o'&Gbfxzy|lY"1=. Og8'((9&29# # .NNYJ,>MHJPIa^M>5TUL5< DMMSzL6/@H$"+(&&!3(88;H6" "-QOC&$~sZ\m %1)#ClpV 7shI);( 3E`W/ BWntF.C^dK#>  vv!59,WuynwlS.@|pdZ@ ''&6C[c{i\HL?D*'1VX_Z[S2$ O>vCpZS& !  9MM(1).-2SonC3HmN!'AXrgP0 %$259IG.%3A+!-\iP +" /0'"v( o&{yV1HWmmqgyc  @trtC$/@GC:.(9FPRJ>QD6.) ,j~{|]yiSYjh~a."2\PO:FBbgDHLVUJE, "0+ *J3 9R; $~ozv,3:7LTEF;$D%AL639mwL:%5EO0&@`gVZ_bcxJ(#24!+,BKWcE9+$ !Qa= # #ECB" 1  )# #+( ~6L3|n ,!9G=-AYYh\[owpwnic^A$@R@.,Bq{~xpdE4DUgD@l~eJDJ^uzdOIM6):F*$1(DOQ\S5%") ~|mldbE9Gh[okdQVRGD>ENcb.@l !Knj[A -@$ ,25TqfbXDUeq}xX[`^T[A?QT5/8ESSlw~sve? "@OV.yzhUOO\a|t @hme"(69  *89#-2==NK785GC2%/JCWLF3-=Iif6!ETc@QH='0J^hqy]H $6CO8'1Cbbf]BHJ[G8-RfL3! tuw 6opR?:/!/QHC2?hq^UI9F^g_G?13$,%4Lg_QH@(4J;0D, kcuwh ;) CE:(/ZvV >6/  <PB"!,CVoY"DKE45=C;%pn'"4WbX4,3<9/">P^M7)--H^\^mu]Ycxtryquq~hYNaojkadQO]ckdht~[B" (pVHPXvrxeFBQE2=kgO@>PaO?9Of~  */+9=6?D;/<8-'',(;K[t}~{v`70O{_77Ue`a_iX[LA,!%(Bo{mL4,#2S`]O95VcdA/ ! }F@<_J"5ktouqect$$  I{\=.CMkquu_/* !;Tl}|slgXhzR#*?_N6/"!$/06.    uk ' $6/  ,+47J[B=' >PB$$+@@95 x w~ 9DedT9(3G_ki\^h~fxzW7Jd~mA#%05.:afXF<>,#&8>:#{fU\n{t`b^ .$ ,4M^JJY~zm<%@biU=BZ_^vnyw|npfK?0@QJ76-EbX5#--17+<C65(,=$  ~$31+!=BJMCSWW6$$";NM+6OcXC0+'&&.&!5)&+# AX6! 3:<" 3A3A^nb++iuiOCSkk_A#6?90256J>93861.0DH4&)@`iK)  1/49/$'" !<DA-  $1& #*!   "7839=.385+ 81+"&5Vj}hoYE71@MLndqTZYtyd?14:'% 14.7>LE/!$%  "  *#"4X]fINQqmeWDCH;-!07243+:POG4*!?FM>13>M_H7)6'!)+9;4-# . #4BD({z "!1+->D<1%.RTJ:248@?9948A?3:=SFRA;%$%$>RSIE<?7' )&).65"    "?C:1&--884#$( &<>;2( +++72!!13/% 7Xlv\F<9;'  $,-:KHB<,%8I& )*  68:('#");3 -8?LT_\[js}uo[E7*/.5DJezjaM;)6BCYbbSSMXLI=,)'2FK[Q5&##  0<1 -/5;>=0    #" --6+!!    $+454=PE?'  "    *! $0!    %1C+ %&$9&-HHQN?<9DHVRMB& "&-1  (8CK8-&"%06>.,.) %"$)#$"!41"$#  2>CSYXJ:($!1>ISFKW^\HFITX]\UFQcqulUYXh]G288@/1./&,0% ##!" $(-53./9.9 '+C><;GMZYRL[V\Z_UI@8+(0)  *-    ' -(   233 %41 (!'-<:4-$ #+&+2-$!;IWH<,..*0<?D:0-062&# "7>@ODO<;47>,'*#2+A;/ !   )101)**7(.,%!( '*  $',*-(#-  &".*'%&)1(" #19-( ,74*! &$067       ($')'  "21A>DB63      &   ! " " &      '+'*&%'+,$"'!-&&":?@01   $=6.#                 $"!,(+#$&$ &'0,?5C=:5,.293:A@0(! "(      !     '))  !','34?6<03/## ,.)$     %%*    !!  #"  '    !$        ,&&0.1#-08@C:1$# /73-,+,',)),#''"#%##(&(       !&#!'$(*$$+          "+'332 ",1-&!"%% "$-/975+$%%'%       !                          !!)'41;?<@6@:=+63IIRKHB:=.5'*$*/6B@E;5'''&/352,$ &+,&%      &&+ "  ""-+(               #+13%      '(%  "        !%"(!! #$    "% %%*&%$'*% &&-*+&''-/,&)!  "                     ""("* &!"                   $$!'"+(040/,%%!! $!#     "!$ "%" #"#      !#"'.'(#!"%#$"           !!                           !                      !$!""""!!!! #& '##$!#"%!$ #!!                                                                               "# "!&!''((&'#&"$$!# " !!                                                                                                                                                                                                             hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SnareRimshot-Med.wav000066400000000000000000002643021366722712400242400ustar00rootroot00000000000000RIFFhWAVEfmt DXPAD dataX Z>x>MC0`} , & {  V  H ߭".)#C)27J7%'g3TTE{׍VɈ!)oO߶ >o+"/"*Szx' ͠^A_,86c,%!\<sG )(D5<:-998565P26>DIVLHC>?nA@g=y78565!24,"z/o0|3 phejX(f #@)< ~P?k 9 $k':6FE@8,<  X ZR  [9$ dW9 &u2WKs.Z??Ύ۳ݮ<yhhġ߻5qjcЭc_T3A|& ?> >$:#P@Hm9 &M4 ? $k 1S w 0 #+'069865*5 3'0,($#%k)P+G++,./249>@?>,=:973<-<&0y/ JM,nmAXro V 4'/x^+ `X8I$ 2!?Z ]v*ɏ̂!XVʉys*V/_ 5D }+\;wir+&v3g%r:$ڊ9/˅ҁ 8 \ hKG\' e>s %R] ' 3e R#H+L-*.'J" Y :u@&#'8'}&s'^#\5L& }"Yܲ)t t.> ~JOz+R;! ' .L<z /KJ:+,8Lٝw$."j'sߐ@ܝݓމP_`l_(4;+9Q t x 2%^(--,*E&$$!z/yP"" wH b  = h l}!eP k70Da 0q*  56iSDT0NV Zdk # kiog_ n a 70I'YT  !S|6"C37CL& QwvmF5<es,} ;-@=F|Alh Az8 Ka= ID* Zl 8e3 CO { SY . &  @H Y"]* *^D*a' !),+***n&cB [   Du.Q &A ZO }Q~} 9d.-lOK A/o?N+`O#ڒW]8jg z]6+B s- - b 0 R P"(_ xH#+yG) 1 +z#+w( 2AGtA?20L]=N~ ;A 5 zO1$8#Bj {X? pm :=2Nb  d y Dh 1(1|TofSjQl $ B nPX%>j/!3Fm u N9 mEo naU4!:!H  ~ =  $ ( 4NF-ZD[Se]S,ePZxx) < fkln  qJR  ~D`/JB(?Bg?$ 2T 9 < r b Tb-g 6 B V 4Z%Q];Zc'eEg@o2wHDCiJNcI}]rY~2^5u%S IZR4S:!j$;bssS/t'4n}d#? + v BC s  VT Dn L A k f  S[yWdb) 78 ubNiWI$ZQA*Z5z2dN(&6)n~>BUZ{\jkh$'Z.1 V pK'[7} r`& v.+Z+!x$rc>.B4v`z g E h Wy,}5%  X | x Z7fI3)V y~& .  tb*oE97 r^NF6d _ 6|YG B1K /q=W oST@5,?R!q~286ZkT)&%t()GS`[%Y0 EY L.xO2 2 ,QC ;  W ~B v n  c u ~ B ={'k8wS:~w 1ZT>zZ[z x[YidOJ$^H0Y*t~\7 oI1T]ik,>`eH T4N~T[<EB^H6.nXoNDtb^J?#O 3F $R , :  ]bK;Ej>?^S61y |i@qll):yn[.i~@ JXKo4$h3{L?|4>j35$'4(Y}7Ps>Eaj=3$tFbHnWa ^ ? H n npk$]y   I^5 U ? V kwP?K  W l 9 Fa e.>2Q$\hJMz .83ChQB=R:]ncH#}s6Mr^>~&  m y x!QPjXsa&Ds@cN4_eE&u0F;*5%o ?tmCl4ir$A_P>'K%bX Qr;. | L9*$5E|BA43m @n12-4ER{uu+1qWb0b }h.~$P`~?hs)UJ[e~9=4b} BUt"fH S2N r%O0v:!$=uC ^Pkt[@<r_=*[f:AdZ{9x:3Bf YU#>%To1uMWI y~~9o>hISQ9H^M6 'T5 p~eg!cm* =g{tL}SN Uc\)KSy!H7OG%Aqon@O&m} ^+/~ ? } ]nC. e:bb!-%ig%:7Y{WDuSrI9bDhQRUA,?z q (M NyF?-eiBQy F]Ce(D9-xsg.M*6wOPDIfn iN(-Ql;8KB\1?|E^Nh%;n!Qc(Oc:a7*dx`BMy$ ASiktQU'rC<xz#a2DJ=$&.@4&/RQT  P.<F.be<m9t$oq.f{"o N~>;tXO4_:>?J`a|B9*loje6Ex"cCb]*'Okw@<x_@SYmrD.Eg==&"1-nBJa`8V.J .j,E=. 2%-9 `-i <#t#k|*}ls!oh+4hI fr'= 7=CHxWK&qgSUq}T tB:6azm :||02nT}`7lxkC|p r8~z teUFUp 7o`WN9kX>W`Z C FT,Km/HRzTc`T5t*^C "A]msS?t(3` 6y%#i*e+Xc:[%~/+sGhB#=i]8`q~9pId#Rxedwc"U hxEKsw_R-j  x:Xco ` <# a#+FC5 8tutE m2F{</"@IDG$3nA32hC(i?)8vGS;`wArjlJ:.1o C~s/:\Xz,Lof !F@'"sG9dR K&O:NE{< );XE8^  I][p_e &g|@W?WS(7]D[ dkTg ~~-ZSpufS/90)=:8[}RKs4paDGU> L|NWz 6<a/y*Jw#%Zu9B]MfhbVK4yFb]/Tz4b[UwS36O)TW5`T80aGXbv3IW8O(OKM7ZT 5DKhh&/0BFDKaL~8>3F&s1\2i q578 {DZBW"9wvf)`nc.v% Bwb{>R'\u,C3Xmi]2^qz-u Ug65'M!|Cz&1}5T*&Dt"-1_V4.|q`1 "~?m;[2@zRH+D{A^H!859h*'~;yGK- Hv ^#w?g_LIxtU:k@P7$E r4I8hmf-%d/GB^i"% OBTt!kLe/Om 7VV*M`*HeG&X`?qc: [a+#%C,9#EVkII)[C,TL< m`3sbfkvgES$|XL@A;Ot }A bEpfxP<|ReIQWhJ [Pfu81za=L4 pw ?82{*` Nc}fMbE$ Iu4`_zW~_&M?Q/ b]`g3a#pO!EQ"`{1TW$v|? <*-|='*~< _@da59i(IJ xOD|OFCNHjs%Eb|%r^}I5T="8B5XC;U*MUJ>.P(y}%6(D'*tfIFh*FiwSa9\_K>=RwwU ~EF:8|CvO#xO^)|246td8 N'jz?YK {H)I!+W9-7PM8,e GCBYNTa2 !kSjgP%1k;zw >wy".@{" ]vX;]`X*.k .v2CI-W IW2q1~l | qc*tq-UP&WD d {V -LpZm%tpX477>fN,)!Ze!^v8KozT5 9 H7n 0ud~(_uve!Y$,KMzeyC^Jxgfgbj1vS:g.LG-|45`)0<)murQQa"&;#+p$++6 `/`)~ 8nlw aLbdAy)NaDb%)6Py; DyYVB}<y0(5%g_Lz8  ~Cz*W\GtsS.}7o/i}:(Q<"mc<\/Mg+p0r*qjYLqs,w:g@wA$ OX$\J f"$lM UmS&/W\}$oda@"sU}dxd`uR f.3IH)2pXWB"IW|h:II|?3beMV4,)>iy9cGc~wm.0RAmSenf'J^4?g$DN2!4!!_PrTY\wxK2uoA S8o)3@[gLVr=ir;Bc1HNp>-m Th/%._#~n`#?K) gDv\'<TJJC;"d)gulP<gs n I/Dc"W)T#'aTI(G0P33}&qE)<O`1p 5^J\l6@y#h'=_`@VCnzC[+4u9kzxU/81^Ft% cC68%ih@z-eJc= bnJpm2 ^ !.D\(,CL/&HV<(bCC1D?5X"&DLEf7GR6: H(\3kALY*kC*g()0vz8[HHvff@u5I{f f2GSXP)gnoKh}+N6S!\Poz`D0u`*uoiL54QkK\|oB\9&GLDV"7U@huRQQ6:B{((C&slT|"CRgrX}JTPc`%C-)Z7K+_B90vxAf4R|=>#,*>dS|=91w0 s@~Hg+1$]9=58YSYJ+ 6`Q]Shg# F?v-`x.OkWjt">j5$hU<WK6Ol2n Z" .}\}cw}8:X/;_reYRX6FE#uaG(0 ou7\M'>Gz7[<{BZ \L^s:JA 5({;}b;IgzJGUwz%)^ dH~Q fhs!k~W<X@H.ItXJZd;%wQwS~]^: wL|]"]ZHU}A"-G8K?|hdf9U4 a0SvC24Z&D1LmyxAEMEu6sC"V" %<dj -dju[Kli)Zr^C7(COfNHIM9,3E-G<A%Nt!c">G:6PU[MtK)=S1m_hs/KF=280kgN% nCF.*Lr=eb+U/`'X&+Nkpk 3Y>h0-(=]U&F3c\1/&$@z\ztYcXGCBU@jVDF47ONhu^el-0'5Qt8/snn046wzxdcs{_SSS vYFl7MlNG-Po{wvN#Y'^f`UCpXLj]0<9giA -0G+GuQ&IJw3g0P4%-29KP2{l{t%PLe2|qLLT!mFvR-2Q>A`|`.E SY)nuCHI``rpc>wB#ugQ8WGG$? `t{k5`;BccM@H.^9g>Ub6(PMifSE7f8#[c8X4:p"SAnG&0Uyr<$RmrA4yM>,029OI3!63D_X:cV)51Y Z\X $g|>^e*F<^Z rwy -.pQYjfi}D7Sqw .55$(,TkL3 5dg`B8NWQ<;3e QM /isk akR!4fZL%)\<8YK bzI5BZ3 B"&!(r%Els ?C(,B!XRE*jkl SUCQuq$F<04D\P[ueWR[s~  4&+ZQk 9p$hvk5=X3?MMp\ * -lwVDNQ@HSC76b?@iA," :Jau_Q G&6<'f-ijT_joU-"A??0qujVfi{A? Wcd-`P9:8X<wu {~')\PZ2{djK'lx9o0 ?M!/C@8S~uZO[#,2TeA Wu).fX WrdBC\Sn:4"Q^||^SF sR?O $J=4Z"4iL{@cHCD +' h" p {m{uhfj5(W*[A8U^}|cRd&6\X\t  QlH+|lhG_&qZ7&UF)X -8d**yZKdu1 Q]Y0I{fQ8&Z+(\Z\u}bflySRnZ4%=bwrN^umAGbr XyX/TA~4ZB2CR! D9kMA7AbiodeT1&h{Z*Uf-MCe55nWVlWA2Pc?IHX+^bE5,T~~T 'dFjD;dj6%ZiIdq <8:r_\K1-7; 6L,O= XT}mjuuN({cui($S)(YM]F1BLw6W.L6EdN*zyldrX.96]`5#B}].`G #Tiw4F.yp?0h+ryK*).Vr_QX2";J=9qX@I-4Pxx~zheUGFrsjR9<k`W{ujprH  '?yXM->bk>$Sc{rZ\fwuyWYe'0|6FpyKl,}UB8=3-a^PE5#..QfAsrmW< A_ O~Z\QXF* QsnjXDdx^P87VY[f22Jfa#;UyqT]VL32XxprX=/W?J`~bOO[F/CTr}e;MQ9)3=XlnF8XsrN2?MJ#{j^KCIQCHqc< Xk;@G_K(D: *{>ZMA64-QajykamrF[P ^PM=&0TzmXX&  "`c*yrs^tF,<:%:jx@& 3GN[NL8-A]sRC:x *"flHCLFK\nvdZYt}eMgo`U7#!.8%"6>$ho}{%;\gll]_|xvwahwT9&C[T]XE..QhZPc`XD.KTAI8*=4"#:Q_cI\C^ o sujM,1GfS?EP0-XhcoZ!0jrpw[hz2AEAJIVPP5( *43[m1 Y{U];c_7  +uywS9@deTX\`D rufb^wbnugE7JOMYbkjWSUjY?%'MKPSQZ}hKN~+QF)*.;^VQUUb]L6EdjhX?N_ldlTFTIHC-X{xo5''8EUqwyvzvmF"%qU^l~{y <mqko|oJ:#":>M_X+!:VX4-3)-9=:!xkynaS>=;EVn  Gdzpw{pkkswsxzs].5WSQae*2eywnyU.*2I=6 /=?* }rufGCOxwc}x}  $B8* 2<AMEFKpvl9&0E?IKTdlo}b?4=E1$06>E9:;"u^Ynvdz #)=q[85`wfdzxwlA#Ig\`ljX6'&3<A9&%?VQQ*' tQ8$.dumS?9,5Sst^K?INUaI.,<^yu]OXYSSy>I;4Xj{{{rvi>2*Iduptztk\Zdf]^}idnaeyUZpujLVnq[LQ[[TATX^\T9*!wj} prrffe^PMSOdmx_as 2UL;77G2#";N$#EWB"Ea`oz`OR^\dN, &/ *RlwjTC.$>6 ..=SD  '6JY=, )$.NlpsdXCC;62.1FI?//89EK.6S`E 0^}{iVLUpqQI=E2 !* 92 ++ %<13O}jlN9[z{jg[VPIF1+&=Xdwj`PcidXUdncE& ~|tfM!6[cS;" 6AL<$(DmjQ:8e'#Ijslg~}nkhgm~lE?8C=A=\lrhdx}ppvgyw`PMWWWhgg`_E>0"! ?DEII9'%=7:JPI;.4CP=!%=JZd[P7/46CT[K1JSZYwhF2,59>*       #9//"%(57..4)JWe\; #  0TbQFEM=@9-,."/-&$=QQPOD&&)IX]>AXhkeV]`g_behxw]Qa{uvheXXJKNEIT]YF,,5TVLBIELAAA6$ j`i]q  751/9,#79BJA6,?O^szrWM4=9MblttnsU: + " 3/,5LB3#3""  '",8E3&),822" &3I;/("(*) *     $"'HZYOFH70*,1MbsgdULDB9549M\a`huria^[OJ-$ %$  )  xv"  -8/2IYimc\KMIRG622;BIBAJKTcoq`c^\L;A<3$4B/   ! *6EA' 2989 (*.'($,24*%9CXME;2>GBLCF94  !"" &7,;?3,&5@A*!#<]d\M?E;E=7*(&')#&( )614CM_^\SUMQD:  "&!*2@AJJMGM\t||wqXTG[Tlsuj`bh`N===EGHE;2!.*% 2EEAIX`bS:  */.)-/+$""  >KG;312<6>2) #+.       $:61!&*"&599*# /958.&&6JXONA=."&>FQOED>KI92/1&     $&*4<4# ->GEAAF?2  (??FAMLLF0#$/8EIIJAD?B:9*(()**/3;C/(&+1 &"*:.,   ""*2763&!     ##$!$&)+)824+*-69<=AQ[eXSBLOQXQMJNP\_ddonkWJ81/2=<0&&.6;-,*(2$ %"&"%*#"%! )   %4<><?86.6=MS^\]X\QUEFEAAC:;+*#48>2+ "'&)$! )($! (&5$23:96EIOB68:86,&#%.64;2)(! !!$)#*** %-')"#"%$ )   !*!     %*%   " &')'  !         "&'.2298FFJDBBA;://*---'*)($  #!"&*)*&-*1/.&!              """$&0*52@INQEE@INLIHFMIQNTUQLNQU`[g_b```be`f\[LEA99322&%"!! !#*#&!!&"6-6.1*+$'%..6790+*(""'.*.*-*,.6920         #$"&*-65BEJE?AIIVQZRXW^[\QTMNQPTRZZ\YSQKIICBEKTUaX`YZVMMLJQFEGEGCEHEG=<356-0 '"#(!&! }z|y} "'9DMPRTYXc]`femmlld\XXZ\[]acci`aXUQQSVVYZSZWTSFMDF>A:=683651,!!      !*2/+)**./,*$&("'"&',&'  $++/,74=9<:88402203)(&(.169=6<6;78=>MLUMME=<,3/2*$"      -+144<9::8=@HNKPHKFC=866558@>IEGIIOJIHJQUPRKIIEA?5><==6=0:,2+-)*+)*("#"     "%!.3;6=58660929:;863.5*.(" &&     !$11AAJJLKHMISOX[_ab^ZWWVWZZ_Y_Wc_dc_aVXU_[c_hnrpmceWWNOKLLH;95@44""     $&%*+374<3>:=E>OCNHOMG@7=:@<>3=9;=9C=KHVOVPVRRTQQTNQJLHGDCAIFJ@E@DCC><:5922+-)-*-1,*'*(%    !(078??>DEOORMOV^f]dZb[^ecnjhcadkkldedkrvwrnikjj`c\__X]V_VXONJED;=6=63.'"  |   $"($+%$&'()-56885:9:;<;;8246276<CEEE;;6<577=?FEF@BA@>810..0,1'-,21.''%*1.10/51522087>;<>985:::.*"'*+*)!$   "#&(+/-21573-2/8953/,6295;8BDONXQYRUQWOJGBFBBB>;982*+ %      (#)*#-#" "#!!"$4>ELIPRUUZTRHMLLK??59341-012//'+! $"""#$!               (4499;?<F>BBEILOTIHHMNRMSKPISLWV^^^a[e\c\VTRSSJB40/01**""!"      !$!$#&1#*#!        !'%+-2<>KIROWMRRRWRWW\`bb^Z\\V_`colwt|w~ytnfaa_^[VTQRSRNQUUWRFE;9443/,%%&    &+230./4:::548>ADJGG??==7:5333-1*-,/+,)%%((.&*#&$!          !%"+.31018:=86666400-6:DKIIIHPMORVV[U_[_[[a^aW\RWUVYUVUPLKEF<A8?6<;??=?7<35/*)$"   !##(%(%%)*/14:6;664721...0/1.56=983.//01,+3031-/()#$      ! """($(&"$!  " &((*%("! " !#) $!#")'+027:699AA>986=86047;<<<7522/--  (),%' !"# !$   ! -(/**&!'!"       %'+-:8<9=@HBE@@:@<8;>EJJFLBJ?C;>=8<5:>:<<<=:8730))&%#      &*,,/1'*&(,(.+4411+0,3,/**/*,(&&-,96>BDFIGF><9:64/1202,.,%! "'$")(%& ! #     !! "&&(,+1/2046552.210307:>A>=940.,.*-+1022.+,.547923*(#    !&!!"''#"%!#%%''0+.41::=:927913$!$!&            #""#  '%"% &#+'++*))'%%!(%*%""),*$ " (&-),%!   $()*&*$)$#"!!$,10344404,+#(""%%(("#!          #            $$     $"""%'*-/.0.-)+(++"%!&    $!           "$'+%$!!!,2498@991.*-(//502-+++,6598<7750.())+++),'*&&%           ##&#" &$%$ #!( '                   !!       !"! !""                              !$%!!!    #$%"$$  #"##!#!#!            !"%!"   ! %!&$#'(+-+'&$%(""!$" #""   " "!"""#$$#!##%(&'#%!"                                         !#%('()(+%&!$&&&$#%!&"%%&'*%)#%""                &"'!$" "!&"&"&%'&)(((%&#$$%)&-%)!%"!%$)%+(+*('#&"$$##!                                                       !  !                 !! !"                                                                                                                                                                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SnareRimshot-Soft.wav000066400000000000000000002636221366722712400244520ustar00rootroot00000000000000RIFFgWAVEfmt DXPAD dataW qRa<3p<{Wy9Ll^ N b ,   - Ed ' V'B0i1*g&"$vΠܼHW%W'֤/ܦBQQ7cƨ~;.Št&N*"ΡŻr ]( ~&h,/-(  ~t Nc*27);>6ACBJRQQOpLWHcCC;/!Xs c!0  %%'j)(%?"C$-vtY6 ) 7*= !$$  ' $# Y ?Z"߬BtgIZP)\M |aZ,! F϶6aNݠ β*wܴHYb[h6>ۢڢө1L~ĉ8 M6~t~3X!C 8YOsr:=  w  7 `*n>Ed" -+m-!%&('$S!9eo+z$*06999u62c0,V(1$ wEmzK csP #%).120W.-- 0241,t'[!(3KmCOEnIsEfPsS5zKp[֠ӑ~ɄƘXcɘΗӞٍb8I3q7)-!_:y{K$(:X7 \-;XhPKZ8XQ> a9c)fBQV48N {O_i@? ) %%$  + TLT9}5W \!:##!7qhz$=Nfu9&IE%?)F- v7#2LqezJ\_m?VNa 2 n I fe%Zn (}q=a."v"aIPx`XccRL%fKKs WE6'NH-Z)`i*0O#0,+O UiB! %(&&p,)"v"#!!# [t  4  5 Nikiy8 LH #P\N$R^eWD*+N]wH@Kw ve}XksW]Nu}(Y"+ G"ox"J8JCdUO+y`e95Y m=1? ?  l G ^P%5:z'Kbsx<su0Qi   u5+BW"E ia@"u :Z,< S6 0 P i r @ ?4!Ds [ g i { $r0 i  Q=3 @ }phWpCY!.a8c{ zQ(UB>:}j 'wnޫ #''v2B5 m"S Z '`H ( Y qONk7   < m '] I  U!B ?/mX/)e{:p"z053+qX-}p=_1=nhHYv?_:t}R {EK"Npj IN#/Gp09pEbCT;_z{i"J: | 'q(Z Q [   C ,  J  ? o `: > ( z &-& 3 C n"v n  c 4Z(q}_`p8@|JrC\mgS\މڦ0D-܈UmqgK)# R i dC7K c EZsKh! Hc )K H7e Z   H'{ =SodPc u!(f G#E Ry  x2|H@1vbgp( _T{ZDx~X{vD 9IqK4y27/%Q$E^>K'UCYy2FIK6p|E/D V z\S;"IM;:Mt W 7  u & p K t r3 9  X 7  0Y  Fi [Y)p@hRWJF,U--42a2zJ(d,   R H}cH0m*=NM[@f_tk9W(oYT<]j=^C hd[\u__N ah4 L 1-: ylc #= z >`o d ILH\0  % uX 2< _  4  [q+E^Qi"dQ) qG}h@` (Tj*XZU_s+T7-M?p9T%6)Lb|? )pSrfnB|s |8eQ}JF  K ! C <=cw^3 u  w 1  \y` :)KGDO2.#h2 #  !u?; ^ C J t;p p;R\ijB'MF[s!\'F@IAPW>6 clAWUPx}3%V=K *&--~=3=A%/$0TXhk.=A^J:  [??su q #$ 3   U(-DCacE| < ) :Nb pI_maa]b0?P7sTZ'NT/g'oDj>;Xax2}ptE/VGy l_%6lz"WZamS f ^%R. `@Q E w]l!ghyHC;AK]Ee=d ]Dt&y~R G>+&.@>.O|iKghiQ!:X,1I7<<tdlO*swtB# YS=$w'S1a~:C (XOw3rJDZ~%U{hKHEi]eEoz8N[9Rn,ES, d 5HP@ ;&+X}~LF#s4.A t(|h&ulmjtz /fk'Azi#T5@53&ZrrN Oi 7 2;4JBohlRb@fXo B.#T+y{}3**r ";-L Zh(p%'WBm-|9(YpVM(P@3A%'F|.l~F\_<5>? |M#1 ~2 R&yBU:hT:Y65|wd^]`Fu[gJIRs]$ t#~O[-ll$   en06<J$ g}qGJt p 5%S{,5R)Yu Qq3hMH(!rv~D 9 czya:E"#-;=3_;WMypbac\Ui\MOzFNM< x`L[xgCQiig;J./Rm\k hVwHOE*[3!)<[=h&dM%.vQ taj '~,@]y\qdiU> Zl+ WBh{3ZdowGF1e3sulm"`VY7r68-CjzaGw3.f+70 3<*Dkm`/9X)3Qw'j|A>~q;I7WNJ?kAzfshuWL/IAnsF=#@ G_D %0p9|V]lQV*9p*|l YnSckSw 4 /^*Lx/HXb+ f=K-eE#GTai@fI}S';C/KDf0be.zu''gKQ,u  Ps/g! rgj%L=D _kQ`|pY15x/d#nNpu0}B4J^uY1FS,d_Wpi@-zQ|~P{Af Pw%fhK:YKVw6VgV ,`hK21TQIle7$*"Q]W5)g :g]{VE`g/A:9Di=o:<lR)7[OY~tz^ihPR|>ap O[v@92Q5ip]uPIo**K"Pe5!iys .M.|:cUO&RxW|/od7V!=g=7PwLgY)v:W,U;+7\d2lGtStbkYb v*s5Zanab:W 1Mzx*Ftw5pwl#$\%Q?vc'{8G w2,?BnU]]})Ovr&>?9=Bx5.446Yr\ICSF+`BH*6x[`gK?,|X=oFueHi${-YeXJ ?_-p6p|8n2 >31V;'}f' "C fv=2qaS :?\?| < Qf,  J`7^4qL !|;c{eL2(=9b%tLvH78f _:OF]vO&9qH %6oYL- pb?nG]7m=DZ_;4l2SXS!0EVZj36ithdMTE/BJpblUr8A/Yq8dj^d"!t K@ b\*~28 A_S+$+ 7$)kbFl, _X*ZX4$C*P[@:U~yXZ_ #CafDf{:z{5>B [8s5n]|/;b'j]x-Ajk1YS5OBt`_6Bc:pCG%Geb K cGK#al6EXwHac_l] s) (N+vg\2-({^uSMB{nU!bRU5p4ESrAy^/dD^.'s W=lRYM$J5A7y.\0Q&C-qaJBjC,TbTw,"+)rVKo_-T2zf$|Wgq9YsE?\^#ho'mOnA"r`hp'Qy~C.w~/"i<hStU7_J{ful!LR~ix&u>_%t:XA%pi)0,QF.,Z(HyTxSw 1N ^%_*5v9qjB!N1":>N1Dea-?F_?kk z{|wa( ]8Yuz*8T?j q,F[Va[sFM)K2T/00*;O?|Kp+j:P=7EUhK1Q>MRRH-+ky|[39 v!f"]]uv2<Gn9) V #t7I^?b!Oz[vYk'L_z6oX_\$&""HP]f+_^R`^<_N<Ey-f5 " vF~ T8mB=FM__Fy[#{O6Wgu"-p9}mj B}|k Ze!VV O@]O)Z DrMGZ IlVjiV)W)8 .HgZ{4B {ko r=#VEu6XZ94i|<';k a)>7X7X1'?4L6Hs.XQ&$g$8\*[o1z,'TFj(I'4 X"4{_(X.jR)lthI_7vaUcW' ky&) \r}uSaF~o 4@y_E8}un$ :X >%0vF?b %DiT%KfQr1CL+6wMI$G'-> V n}NJL'K,P~s*8h37QE/6MA#,WnI,$#t\KqFpkHzgl"lKlbZ\>yuc\s3 % -Ij6,t=p\)=o'+7b>&6iL_)Wzo=s.~m6rB%2 $&FA55QK*' |zp?Ksz~/S3'Q_@:Vb-g|WvNi3^.E&6"QAC\MV!&=dTVnC]0r]?WmYBnQ&*FEXxTY\^I:](_bf<lYjBG 8~o(^3x2=~-_1~ Rdd}Mi1%G{azon^Ae*#O4d>WLmJcXA(`>h:SD,Y;N"2X.A-+j{1XdDsCR%,t8 BHo"&!!ZV)M/`4=>/ok q<d:!QC!14*G/5I?_P4CANb%?'&De^Z>XUFWZD##ufob<aBYs!; MLX2'~Y^_5;xZ @ .# vLZUNl5HnvP$%"n5)$Lmq vW]4!d!2BD;h[2[bYNMwfY|_{/DWDNDVx 3lFn.%tc$@t;'F cPW$Cyx'aqpsAD@'_g$!HsJG;Y .aSa>`>G[s5odK_5EN_tUZY!WS bP4NuFNF]07"n A ;1[D/SSI`G;t#r<m][a0 =mh8m"zedn?>AJGZm#<{Imf80DoI2P: psz'Y@tX42!k^IOvZCZV8; htDYk=yTs j:Z3){4d~'/bou3oh0U?3 c4o(Lb&_[i@R3FLrY^B<x3$s` ^b]f=>SCf%"J88G7\#O'3qpLFxEC$YE0m9CZ1a*)K{9 fn{K^gx-`Uq!* +(m^A;47y K6 blI708?'sgcG)QK!G(+53D-jK@do+BAf3lhrypmg2*-Yx%r?^g;#PhE\!*b`^Wbl/'FAp=XCk A& \OQ#1\N016h.nngRl2\+OhwIF rK]f,MwRmnDL{S_ b (b$*mF?7G2|4p[*h>Xr[%b 9-`~ApQM _j )3bdB<I,}>c{YnSg5OMeP}C`R"= 0AiyU UY~r8yb Om[2:VJe}~Y@&EeqcJtB 5a I`z[&!x$Gcoc% e8ybFgk_54KU8+?q0Z`"@$K`t ]5BA%v %'CO&I0E0H~^=  2/s"C1!k))0rw@8 #[ |4O_ /GZ-2%x`)}cI-acfw5[a' :L-{R6+`En90_+=eC~c (BO& ckaW7JYP Z``}FVJtc) Xw*\k0fMA6%hv,Rb.l,dk2;t8V5${C)GLd- q qoP**_LgNhEXo? 0_(dR-}3KskIN)h-jGcq`Q2inMV2) MdRCt8)8NbNJj)znl]%blQ 1-@,:Zh|Q& ZjV$K<Z*?hi5'T6qaB[wGMR?:!=Qa`px#% q !!V lyHN:hNV8 &H+@K#( 68c|lECzW -XK),sJL~%PM$%KCT|LR)bM9.6H qbmxZ!M8'Q8+gt}F*p[X7' FG\],%YAx'{>vXPDiB ELo9xcR5G YK?_Tv  , yk#__zw tr^tO8.;7H1E6w^fB?4>) tDAIBXc\ITJicKecQc-.05Hc4%E rQpgP@\?>A ' 'P8"UP|- |{V4`3Ir! )/uRywM+Bvd?`Zwe69?A^M1!XIP7AAl9R6ya!:',m7/QjztU =/xd* b@~L4=,#Fnvg;:h,3ED4vKLbI##0ZpFaI,"sIsvyrYVjaYN_I2*F]o{C4htl{sYF!9[lSMIG}87"4'mX'z~\&jHJQ_gY>JM'hbwDut,f{[: 4{Nr }#:" 'tp z} {N#z84zac[kp:dI*8?SlO8* )4"  YlJ:U8]{rL_y1 RA4?"6F`fl!pBTzM1@N' Z0UzM Ry|v?~;b]]JF058Nuv5.[BZ RxK6yk*I+ 2 sw4[}{{yt\:crYptGzaplj[?.Pc&4bpqrboiAYka>%5(56=--nCd)M>b{W:_tngtsG)[xozntignxaX5|A)^tkmymmX 4/% > ]dO!0.0'skC8?.DhZn.UKQbgKO_dE[~yHm:rEHp|7Q9 JE"Ud-+9 U7~SrH-nocwv10 &GgF ,8SsjF*LsN5"9x:G "Exg|09 bAB[dyf')`dfjSG!6XlZD^K)2Olo[8hWJbve`Tbk}{jfqVa}/Yq>cjl>A|Q?&LEk%|lsvh~ybVld{d_tdxnD- 8$p?3s|e0'Y^i/Ed'K)$2#/K|_k|eq'=oh0)*Jrc(K =;HCT9|)0)TjF.!eZda0 +O`+B>l]S$"I]a~wjC !CJx9Dfm$%3#)eRNu<?aL6HC -B+:>brC>|~P'Juw~D4B1ogn~C2ith`T`}rKf}lhp _*PqqfY;+ 485$"3?ctQL@9aqZO4.H_8)8$MC$08c}j{z!V}}RNL[jhEH[EV@08=&3E uws|kjP6`UQ) /3<'H@  ?fA43'0CZd[aKCATh}6Zva8 DTinP/5]WaSt~[E?Pf|tZ27DBL}S5EW`dC~sz|or2. !teVZoqB :U\NVvoSC460>Och63MysS>?LdF( !+ s~paWqzxh]jukQ%'A[]ka86DPP4&?E`{cC3Ai"! AlO'Xjyy 3=0| W-&=P~lQ82" {`jpgT]c[BE__iA%%&D^zmdrb_+" 'IG<7aZ- )e~SK_poml[( (VuyJFHbd^8!)5LfWT[dU+"!!!z|ut{wek|oK?R{{}}ZPZb@YK#)7>,2>8!0066BHksdetlBFUnm|lstLwunP1SyaQbjG '.DJIE=HW6QB&3S\K[}^F~!9$|ixwor^SBIdeK-)+A9w{xoiejYTVr\[wu! !-!+62@QA@hu[71B[lttki}\2-42:#..HDA813>/# $Ql ! &AB)!)IRNGP`zxH 9~I@CG!#Q{u|jlc[]te`OWdsx]PBB/32,%}ghUYi|re]IK[XaVR==QZkes  87&.:`s_DMY[_``sqrvbrw~tnnat}|`GPtvR7kZ~g`j{qXZsg$ %=H0!$(QbxxqmplfdQG:8@[s}+ A`uln{mdrrn{sXF51Odgedm}jQ892* 55D8:)@AH& e7A (:?  !85" =U]`[ODCg|mlaXLW[2)):CQL;2=Z[1 (+6*5?  $9J9&1" $`}|dH;:8%/KePB/ ! !6>;8& %0E$ l`tZHH6,Lg}veY_{472%<K5 Knpoa][frR>HScYE6Hd|}t}rg`[`ylfu|e5 2"!-/#(  ~{psfp{{k]gyzp}")30JUN()8:FIN9(!>892;C`loq{x{sb[\VXB5:SjWK4($( " !>G: s  !)1!::B(,*++, "3103! %;:(!6:- 6_mlMRWN:' ,871%  (:0  ()"37E?18EbtWA)1:KKJPppT920BWsh[QKONUL<" #&!:9,# rjr.7FSBB7@F@46 ,>JTE/:A> 4@LHE89(A=>1'   !3' *CD. /5@?>BA<LG<+@685:BBO\xod]XY[Q>9-02))45 -.&" ,.! +85*:;&,=G94E6BB\XSD*1GFKGHDFlm`KSKMD;?H?2%11=88=BHOURUH:CCC/&   ;2JL_LG?CC3*0HUQ]UE70:8(!%,)42./2,7=LSRFQN`A7-4:0>@KIB'/*93.$-*.272(%!  ';EC?5.+,1#'  )'$!   #!/)* ' ..* $622+,*&$-)##3AAJ:70=BSPOUVb[P8%/8PKLPWVf`[GK?7!.9:217-8 $%0),.4934-"+*98@@9B929673<:B6:2>,=2CD@7% !(2527:85$"&# 01:(! '/#    !))%12;@>/!"'9.79KKS?<.43>10*4-")7FKLLJG21)3=B4'      */141226-.*9/;0.,'0/A6/-.5?>2#!#" (#    '$  "'!"*,/99J5;&( %(*(% .3BJ82$,*3/0'&)"*%)-&1()./<IJG:0)!!!!,:7;1(),2,*#   !*%2 * $!&!)'-#& !#+/--#%!*822%*#+        $#  &3)1*,.,-+4-0#'#.&!!% 1:>273@>IBRKWMVTQQGCA<:0)))0542(! %)-),"&&'  !*02/-%         %2.9)-      .1EAJJK;=:DPQ\XVNKLFHIMLEKPS[[YPRFCB;8504/876,'(/01              +.91476=:;62*05BGID>994)( *'0(2-811).$&"!$'4382/(!%!          !+046;@DISKRBIILMKJNOF@:287=A<B9@BNSWUXVVJL;JBBBKKNMELBKHEIDLHDC4459>941-1))#" ))*,.--3+1) ~||{xy{y| #-0/028:<BIKPMRZ[_Z[]_jeidmhmlg]]dltrwtlnhmstxlkdb`b`_[d_d]ZPQGI<@6?7:5+-)0&%    ).66>BJ@B;9=24+'!!%$%!###&+6:=:0/.)# "(&!#&.'0)+-%)'"%%'&)'0).123.1.7<?:<8@:<:1/'-100/*%&').35752305980$   !-.5279BBJDJMGSK\Z\YWW[Ya]^[[bli`ZXT_W[aag[WRRa_nlqllddY[OLOPTWLXS[LSKOUOK=4/52;(%                     ! #"!(22:45%&! " !,56833:GPTSXcdh^SLLKUR_Z_lhnnito}yvrejcjliotpmg``Y^UWK=7174*)-,.      *04:26,.///,,.06495349<E@DF@B:5586<:=:?9:24,/50:)6+=6>7>24%/!)!*(4)&$##$#'%!  )$+*,#+(37<@=BLUZ``cddtiqflnxv~wtdbbeghlnqollouwqmim[XEE:?AGEDAB:C;B7-0$+$$&#$ !%% *,,*209362679<925*)),1525/52:4?:?:@30%))02696;:93,%))33:98:;BD@E?EJKPJOOSJMLJG<75:CKQNKIIHBEFAB6424:1/*',/374=2;:94%     $+:BJ@EBBCBBBDQM[W[[^UZW]b_W[Xfde^hdkd\[X\XY]Zf\^WWVKLEORWRTR\YYDE2>76-%!!.,-84=>;<@@BIMOUJNLSOMIIKSR\^f^]WXRPPLHTS`V\TXWa`cSXSVSSKJ>KIUPHD:A==6+'%$'#!!**)"   !!# (+.,*&,*0::A@@=@=KGMEGEOMTSSQKHKKNHEEEJCEFIMHGABG==25-0()""#&"$     !""%  !''#  $% '&($"          #4@C?>6@:JEMTTelyx{t|zxzs|zvxqyowkxp}ptl^aS]T[TaWXHB<<@7:-0))! yx&*289:@:?9<6:;>C<<:?JMNPTKTBODMCGAA==@6B?B<43.2.//356388/0'"!!#$"')'&      !##')$32@AHCIENMVUTYXW]_lpyvyyu}qvs{{|nofokrnohltsvje^\XWKL?B?>?823*++0.*#${{wurjebeeogjjjnkoxy%%*-%(!!$#,58:9:<=BBGHFKIPO^Zmfi_ZXLHBBCBEDDA95;@LPNBA52*,(2+2%)&%%          #%))/1:6B-3,10/+(!(&2976).-3822)007:=20!)*.,(/:>=:8/7++'%.#       ),2/3#0)/623/+83A7?>DC@BCCDDBH;E:AABB?=;:>:02*21//,.*-'*          "*/)((!    %(+)$)%,*.,0.29FKPJBA997<7@:C:=58?DMNMSSTTTLI?<@@A:GLYUWKKB=4/(!"    ! %( 0!$ ###&,,73E@KAIJKSJPJFD:A87117:7:4>9=:=31)#/)<4,+!+)5522)1)&% !#! !   "  )19566<?IORNGIJIIDFISZZ[\_\^SWNNPHUQ_a_[URZV]TWQHN9?3:0,"$  (!  !" &.,*(,(3498;3:7:/0!'+4<CBCCBD<=<CBG?=81.+)().179<7.!     &$  $$&&$%' )(/8;BB:=-( '.2-0**%')123/%# $!!$)-%%)(&!     !1+;32/-3:8=42'/&/%)!$ #$);:B8@8@:2/&%   !$*&,*,) # ! "))+&& #       %!)%('*%"()))**,.*.-5+1(,)%*!("     !%&$##!!'*",&!!!#')%     !"   !        !!#$    ""#%))%)-,;:=ACIBJDNGLDJBJHL[YWQNLKGD@EBGKBFBBJILJKCF<72.2471#)              &"! ! !    &!$" )%+!'!))1/349CDEA=>:=4236903+1112.115:A76%'%#%&!                 !%&)'$!$&) $!'!%)(('#&   #'*"1!0&*% ),/($ !%!     !) *!)#!$                           !!   %#$! %)#-,.0411)&*-22969805(%$ (%"             !   !)%!#! !                          # !#$#**-7:>?76/2)2)("%')2(-%'()0-*$   # #! *#1!%!%#+,068=A?:8.2-32-,&,),""!#" $""%!!    !" #!""$)+...(#$!!$%#$%)),&) "!!,!+!#!!"))%(!)-+$     ')$))'1)1-9295.0%'%)136:9CBD55+1+-"$!!        !               !)%1%.#1+6-2!#!!&(22<:=><>=13),'2-;292,%%#!!"!(!!         #+*.,()"%!!#!!"$(%/(0"#"   $"..2?6H:J;JBKJEKCIEJBFEEKIRNSY[b\\SOKNBG9:/37=<@@?B?A<57525/431.%###          " "$  !#!(.(3.+%")(1/2/4**"$"!!!%(2-8/912/)2$2*2+-*-.2*+&#,-/1$)&$%#!   ! *$&&%%*&-))#(,83999=4>89::<AHEJBDDBEAC<HBD:C:H@A:94962<2=578*/$2(.!"!     "  # " #"!! """%!&(!% )',()& ! ,0(#%!$&(&)'$ "!%! !!          " !)#)!%!+$/(+))#)'*!&#%"(&!("        !!!!'$'%"! *"!%(##!#" !# !& !!#         #'#,'(+((*'-.2268<584589;62)--.9*5+03:4=2677:501)2+1211(-&,!$%!##"$!%         ""$"$ $%!(!)')#! #),1(,%+(*,*)(&.0,*%)$('&!%&&)$$      $&'-0/9<?CBIKGIEGKBGBKPRKRGUO[[ZYWXX]___\]^`\][[_[aZ[NOGLMLROUPQE=70)(#%&       "'!#  !!"%!($%%$"))!&'$$#   %"!"%$"!'#+*)-+00/.*.)*)#,##&'/1*,')%& !##$#"%)+.9+-.#*"$&%""!!       !                         ))%)1*/1365241::?@A>=?5B5C9D=?B=FAIAIBFCA<63173605--*""     #&"!! %&+'+%))((#%(%.(2(-',&0&0-.3)0,0.10.+*)("''"&&"$&))+%+*'& % %!$#%&%&" ! # !        $$(%)+'-)**(1.42567396:6=:<445/;252/6294:2<,9.5/*.--.3//,%+ %   "!!$ !&%!%%%-(/.*-)("$##)(*(++)++(,%)&$$"$ !!!!%!!! ! " !!!     $ )%$)"%#%&)*/44561:0;2679<@:?:::95:5122./)/12411),)*)!#&$%#             " !&)&.%-(---/-+3-54-7.:/6132/2-5)1).2,2-./+.126426+7).)(,"%                   !#"        !$"!%$$ ( +**0$/+,/-2.4115.5160626/:*9*2)1*/*),)+&)%$#$!    "!"!%%$#&!#$")%*,)1,0-..1+,+*))+/-,%+#%%($#!                     & '!&!!"##!       !!        "#!!  "!!"      ! #!"# $!$ !' !!!!$%"# !           #                             $      !%$&%!                                                                                                      "" #!%!#!!! $'!&#'%&+#(!& #!!    !!$$!             !!!!%"                          "#%!#($(+$*$(&%#(%'&&&)))+)+))')&&%$$!##$!#$%# !""    ! !!$!%"%"%#""# #!!!!!  !!     !)!)$*$&#$" #!! !!!"         ! !!!"&!)"(#(*%&"&!&$!  !!!!$!!$'"%&!                             ! "       !!$'*"*%%%'%(%()')$'''&&'$(#&# !       !!!!       !!!%!!',"-$,&,'(('(()'&&%%%!$""#%!      !#! !#!#"$& '"'%'$$&'%)!, +#'$%!'$                           hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/SnareRimshot-Softest.wav000066400000000000000000002637321366722712400251700ustar00rootroot00000000000000RIFFgWAVEfmt DXPAD dataW $R)1 L 9OMUz9Wz. t= ; R :z"5s $ <w Z %<&%rj  # rY-I_ 4IG^ڿĭaʜ̏L΃6фJ$W}D߫uSaiO#TND q o$')+k-A//.O./.,+)#% @x ""! #).0/.=/w2d5*62+%#W##J"(r^   <ZTaC&Y n 0{*q  :#4%Z&',(%!8QV e;>N==*^ WT/7PYbջ˜RKwϋܴM_ "RxsFH?Wޙ۫$ہnނ߰?܅3׹v-ޛ XIgG Y B 1 Y^ 2J inU N }E k"%n&%$}%%%|%$#J#"!x!T!!P#%(_-27:!:73S5/&Q&UM:b Y  ] 7YMqA ;  A AooU:eDIEi=fm+nޯ.6p܋GJ݅؍-]q)ݭ.g'Pl / a d eE [|R/_ j._#D U) 8H3 ?7d3e">G2%zj7 i ) /3 5 )4 . IB | P MG.D"t%7!B?N rfiNpyZ4 & srR*wl-x 4 _v~A z \Pf x, A $_+,nCb1lSK)*-EjtsrA_M\u[!raE^6]4eq?K5~H J  , K  0&0V'hI/ @_sV > 9"0p%dRB?  A u <K 4 h 3 N7G5~FqXh_@3 64UM . ]a-k[8A~ ]Ra_.-Jj;2"W y%s~'/-m=k5' p wtKH=8{),z5{..2q'DEM)qa~$@,\Mp ? v co W 5 K{!#0&Q%,&)):% O C{ {   yJ:eh#7| f XF@7k(YJCa)KhHN}(fr&?lqa-D Y96reFe[4y!>g dZsI'Re7jD>CT>d)M1  -q* .  ]!y O(PQ? %mi\$r EP*|f f xt{3 J@  @ ,  e)y8Ioi]h@f1wosMwS1sZr m QC =30e>)S>?{{U<R3*C(& ]N$9Xw(<R$)_  V  ,   {* E ,8~^  B@  l5u L ] Q>  : C ^;i/Nmo-=PoWd6  ))&$S^5e*$ W% - == #%b"J 85& ' * t't    5 V  n @Z\a1WzoC60.4unC@ 2]o"O/>vJy a@2PD8gXEV N5j ]KJ7"6@t 7A(w.~WIZ  qY}    &BpF <e0M7W}a ;~d| K YZK P  H k  c wJ  =K7 o sumKcVM\4hN $_\Z.V~"Wvl?n|Z]q]`= ,7|)N"lI>KjKVkm#:| 0V"cxz6k6qv@6m,A R vY  RV  z S  R ` : >eiW z 33vYj PoZ8L4TTF_7n|25rG@X!i^,&T9?YFgy@=W;R#/p/0tZY7ttek M!% [r}#@Z~ ?NE 57cMpf7* P 8". , z $~UpnGtG.^mn^!8b&G.Mz6 l c 9DvE(KM4K$\"fe:b+08_,a$ETV;wp#5b3 M]" -=VO> ~v8 E8V CB'I`<S37 k V  W % &!W,Ux u k  d3 cx;.NyyJdX|b"T4;-tT<6wCm7HaU w rh   $h0HM.gMT}!j 6afa\/Ysca~,y<)tCP@ySkF!;CZl&,OT!q(qBH2g?arfXrRV.'* Rf:h70-F pV;uxC_&^| ] #  : ys_  %+~6M D'm]j4 ug,k7!1 rwr(q:pK=h/]W o.@Hca eDl= T@n1xM?Ji@"sFZ19+mG7aj {Jyt>o P+\Zb!j;pgP1$e|s4fNu@o/]Sl%QZT+ UVd'0 q{7|u LX WsEEEDng}IHk1iXM DiR mGo%mwUQ8" &He+lEj\P;n.">2Ki}IsL>EN9..Df2pF&wk!_ j(Q;6=>O6s*h|qR[gE,gscR{ -%p!}8},{q}{ &d [YN&CPN.I2@ OX;_u2vQOBFc7 K\"c"Z)hh#J,)t/E5'l2IPI1cSh-E>K|/cn{}2|MhG>@% 1k.GT-]Z7hTe @B<^g{rB@LttB!&{*%EWJ/R5L2O0QM7/H7f1<s_0~=g| \T MH7{Bm+:k0n- a]*4DMaZqY!G&v=%GY+#32,r6^e%W0>gokLv^Io8KxU:78Z{M{7rh')JbJK :Q(`) t/- !]8IB{e''s)6=@@5<RKTr\\)1`XKRBc-=-_s25Sb{(74\Uv`}@b;iOtN$u~Y r(gN8V-ml=ss5V-[m))BH**1>Ma6#')V631wBmH@& dCPk8"COpp-qYW%&22 Q@^B8 $"Y1`bcJ `({})RN' @k5ek|X&./S)>2b;gh+g/[ =e#ogxKdy:c%( (m7 d0>5NhG9rkQ" dQ}zaSQH%_  } N^~PhD0Jf8N@*Fj~cGM*X( Wb' 4MtwV"No>61qe3C[.^b/Vl1VDDh T=PC qT%Trp>G{>k`Y .TJ\-<H @8+'JXmAS8se<%~?Z5?|`sL dSP|GCeeB W{iRNg)HDg\":r9aJy%udus|,{Q>l'QWEi?1EyE1.J0%+r^xsQ{r:2n%+T]UnYsN=k=z,\O_A&&z&UnoB7(Vq*z`M\)ebC'VYo4#Vk di9ecZe/L_'I~j\/5:F8T1gIl<'_]y,x|zMo>m:$ hhfJX5Gzi!8|^F3n.WfkpX>i\C'_STC 'C1M8%~H(q 9^_]6RD L nI+p \cPj6[.GJ6xuiYKq@JZ% v4.ZCCU1Q[9}uh_oNknB/CGE|S/V1`iYe%Gv|<\RT&Q9`>}\\u+pcHQZ;hk*%/a[[4`*49rYU6Opvn#Uv d^~x77s')SZoafqpZ4b 1,T>a'Q1(EQ(&+;,5.P\' \ z GC %ePGRCDC^S:(#p}GhH@8BZCH#iwqKxN8 Vq}fzf@KF5[\]W9#m_K>yE &ed3/k9vS>| tI/Z+3<*BYG +!XOT L_wyu]?g8 4tjodfsVeq01vMD(npL7eV+#C'W ~*!3z|  +onYm%aE mRqv^28-r9)?%-KSCoaZ`a\WH@ya>zk;/xLy.&$ E'u h23q-AC7cbVAVmN::]4Cg:} dCHnfMoY`*;()MT5pvm!<|r#}&g/,NW  k?9A\ciZ;RCz Cs.JjWNYm[>M5Is hdaV{2p-?v827+'bGpT-Q D=8aP>FzK(#D EGIDd. kCIRwuG4LB0 2t agh^g^ _{l #5 v_eP3Q.5H8b}\eV|13iz0+ 4sf;=yq5l LG1TS:'Fsa2G:IDMQtm,@pqQQ}ie}o`KYq<cteN=7 #0T|gfkk}x?+- 66 J k>LW]?!IbYP_rn}IyxYOd|-=8.8R>/)4LirT mYm_&  "+Rh-Wilj_0@23) 0C>-1=MXPZk^>^TYr >F5)Hztn>#51,LcM4)$/Zt}uYhp(JA1=Klp\@6JZK-")871,4:Qp}]UvI)!,WE$:Jpng[c&,=. s[u ;;AZg1 >@.?UTQ>  :Y}0"yyiSk{U1& {\G172!/1+A?PadV69GVI9+^S  53*7=GJ@<@[|l[q~ ",>`wmeJ.%( ds8o  ^8%1:JX]ZF+3_T)kP+y}s}Q}E48F; (EpuZ" 0ej^S;Ox~ !;]wtecOQfm]O>On'&mUXRG8BWy];#kS)  %B>CNMIA>E^w" :3 voumx# );I9.*JH.':d[EBG9. $n| 7R1?M:# oiihE+  '2ToucOK>.! .0;B6,8OQ? mv|~mVM[OSVXE<9^zgNVs|/, ")4EXfWOG=;>    2JTGCA5!,.+?[WK:%%4Z|g2 #,&)+7( !0 2CR}xthqrm]cceOA>@2 @owsnR:>75?='ogj~{aXis~ ,=Y}pqniwvZF4' & .>SakwlwxgO>49HNEC?M_pp`\qwscn}wH.uklgaZktjs|yy}!&25$)" v|_J7IR^EJLVe|4>ETZU>EKWetsdi}}hQUUKC4#5RU^bnqw~svw{}Z%5WaWH7vo]SCDMBGEJRar ,>Qhjovw}}sn|~vhbfbR+78+ $A>48Lbr|nfheVJ]ch\UQRB7, v]TQ^fsgdQS^rwvs~+1&);;ITWTLTgvfkhwxhWEEPJKYVE' +IKC40+/*'&(4I^a`^`ffoe]NO:!rLNS^bUB++"0AVm ./ ;8 ,<GOQROKLEFPgpyhF4 #728>FHSYQKBJXtzum]O. { ,4447BTZhtpi_nzxp`KIPcdaH6"x^H:Kcu|pdo$1DVLHBJWNB7C_s}eRI;/"+4&&=B:)1CFB7*#"3.  yhq{q^PWm~pkv~ /8 4fw}wqsuxia_hYOU_fhlih`J320+    /C<=+'&:CTWNF/*&22' 8KW[fls~uYD) ,FJH;,#!#'+- &8810/('#    $## *$ %  !()'z{ ! '7IW``eqvyvvtmwi\[feYQevzjlnpeTI@C=2&%   ',/! 4HB<' )7-  &=AE911,7B=7# !6@C4,%!!')7BMTOKC;6) +Bbrqfctnm^_PHH4!   #1-,):FH;.)'.+ .<KLSNQV[WJ6$")   ).65=L]|zz||}tpmqmpq{zqa^^fme_`jsww_QDHLQY`jjo_^]bafqusjno{nkac`iimtwqbW;# %35=A@;:51'4;C2''2;ONRPOY[\T>/%!!)" !*15@;?C<# 4INIB:'&  "'1?HA4/18=@?ILOC7.)(/0+ !   |vw!$7=MNRV^\ikqlfhfheQ@7=JQYZbbei|~ylhfhisnmg__Z``g\ZX]hlc]`kpmnqx|~}p]TZe]RF@1 )10&#$#yx~xspshlbnhjgt   +27527CJD4#   &1;:;F]bpne`bdgcicZL;4,% )  "+"  ()#             #;@JCA@CLTYZQKP\TNA48<50++"  $#&(14HR^]Q@+ !*,2!  !sx| 33:1;AC990/5@Q[ifeYTPWSJ885:<B=E;=2%'"  $!0')$&-.-.&  $17>?CLMOFJACE>5148@@4,)%!       '(!    "0$!!.;7/% $*04,(#&',$ %&).;BEHIVZ_eejps|zuhTJOJ>2,!!#'+  $',+&(/+&',3:45>DKMPFJTbcWB55?IIHC?:EGVRNC>CLKKHC98714(#!$% +),!'4/($!          $*/1;5317BLPEBCIOPB=420-(  (+)$ '178:3?FJB;954*$*+'( !$$,.,')+45<5:870#$)=?KAHELMQTW_``YLOOQLHEOIKIOQNF:5)'#!       "$'   !"(&&&./BHQI@>CNR\SOMSVTRQRY`TQQSRTSRRW_bgceY_TUF>145,((,.32.#'#,'%,+,&     ".;KRTJIKEMIGBCCFHRPVWQIHLYZZPLMNOQ\]TH:=35*'!$%.25,'"$)3058>FHHHDIHHENQTRROHE2+  )8BKNOQNLE=HLRQLFFHFLGMIF@71'$,/(    ##,+++&*1?@FJRX[\_]dcbejec`Vb^]VKE771-("$!##-/7;75('(,+  zv{ #.*$##)).+-7;DECEE@FEREG562,2.221,**/.0+-,.12432;<??899>;@87/+**.0767885,0111&$#'$'$#  # $!$)26841&    '# !%,/32822*" '#           ( $##!"',4=CIHDFBIIVY][Y\`_Y\RXTVQKE?71." +-9377=>@><;8310)& $*,2540%    $*,24520.20440411+$'"&&$+&/+.-*)+,/9<:@CFCBC?<8;79:?@C=ABCGDICDEJLLIF;7.,)   &-/<AHQPWQWV`YcYcZ`[ZTWTTSWZ]YUNOVZ\WTMNLKFE=96675*&!!"$$&$)(-04;=B=C;?4=193920,*&&!     #)0..-19BFFGGNMONRIKEKHJB@=813214+-!'&'('))+&&%,/14//*$          (''-0,-/00.+--4/71=<A7.0,&%!#++0,,2//)%  $+,-)+*+11813.1123..$ &&'*)(&$$%'#$ $!)&$#''/%' !!       ""#&'$"#      ##      #$#&&&$(#($#&#' #$,-))&##       !   $##                                 !       !!$(1/1.4277;889:=:?9;=662/24534.324642/*)*'*&&               $#!$          $"! $&'+,11/23045:@BFIGNLPQQTLQKMKKHDB@>>=>>9>8;975746573520+'%&#$      !!"%& "  "$'#"#"                   #%$$$###!"##'!##'&)&$($/$,! #(&$)$)%%!!! #                   # & #'#% $#! ' -&0/.2+*$!  #($)$$ #      ! &%&*+/2042251734434..%#   #"))'&#!$"      $'01><CBFEHGILLKILHFB;885=:;=;?:=9;8;8;8<7;27..+'##     &$($%$'*)+-112/,)&)&,'-,--.+.(.+0.1+,(*'*$'$% # !          "#!$'!#$).20.)%+&) #         !! $!$  " (#&'(+'.'.&)$$$!%#&%#!!     !$#$&++///.2+1.2.1/14//2)0&)%$"     %&+&.&/)+&+'...40746525.0./.0,/..,.).,/.42657643,/+)*&&$& !!#!   !'&+&+$'$%&&&'#$! ! ! !!"$&($&    !&),13468:@?ACDKIQMWSYWWWWYZ]Y\WYRSOKLFEF>C===9:8672602-0-+)#' '!'#*$)#' !                                     #'"($,(.*1),/*2-303443;4?>@DBCC=D=DAECGCGDFFFCBC@D;?6804,/(*)&)&"(!&   "%(& &#$&%&+(+((,(**(.,.1(+((+)+-.2206266280423//*-))'$&&'&&$'&&&&$%$%!     ! %'(+./74=8?=A<>>==9<=>>@ABECECECBA>@?<?9;:975402-.))!$!    $&)-),)*)*+)+(,,+-.**'(&,&/*-+-.*,+)--././-+,+.*1.447886623-/,)/*.0121225525444200--,*'$!    ! ###"'''%&&*&)$.&+%(%%"!       #&%#$'&'''((&&"%!$%$*&,(3,3.//,-**&%#"" "!     ##&'()-,//.1021324726412100/-0*/),%*$)'(%%% !        !#"(((+&+$(#"!""!     !'&(+,0050:77:<;A???A?D<C<A?@BCCJEKIINHPKOMPLMLJMKKKHJGGDCB=@8=89633/0+,(#"         #$####$$&!%#$'$&%#$$&%'%%$'"*"*#'&''&'&&$%!     " ##&)%+%*&*))+,+/,01032366776758756353627374623/00/0/0,,,.*,)*'#&$ !   #&"$###&&'((*(')%(&'((''(((&&"&!" !                     !!"""""!"   ""$&&'()+),.,0-.0/00/1-1.2.01/3.2//+.*,)+))())()%'""     !%#$$&%)'+*,--0.111222254587877564541517265453323/3-/+)(%$!#     !"$$'&(*'*')*(+*,-*-(+&)'&'&((*&&&&$%#!# !           !!                                                             !" " "%%!!!!  ! #"%#%$#""$" "                                                                    !!  ! "!                                                                                                                                                                                                                                                                                                      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Splash-Hard.wav000066400000000000000000006035741366722712400232350ustar00rootroot00000000000000RIFFtWAVEfmt DXPAD data|&"+,.3,0)&%  &)'.(0+/*'&        ,%5,8/8030,+$"   %!,(),),+),''(!$  "(+)1)0),'%%   $/*93@:DCJGNJPGLCA83*%  $#'('+$(!#"   &*0124.0*+'(" $+13:ACHHMGJE@:5.'   +68GLSVV\Z`VXTRIC;2& '16JEZXddd`e`d\XSMJ?8/%$f)XV [P D I\V'PsBG[8G u7J|dE7 ;p&[HuZ#>Y b GzQ@ !hx!)g H^u? )~ #} FK_8`d  #Y3"< 5   V9h'hQd>M*/& ^Y޼ga.+0%#8x a _ pwG~ؙIB869 D 8 P Xro >By Sq  kw T ` H&"V`)l u$(|E` *   1n?Y*zbG mF  t ?x ((s:9# g۴ط&F/wf5@ z: C"n+gc7j; ?/,XF,MLm l ?t W N lpp`G}I[ Oe^Lߘ|Z "ur 9k="]n R ۚ2W8)4ٙ3v2g fYBb 1"٢(",tE+TC؎^̰QkD !d)X ^# .!#d|_ 8 [fWU. z".2  C l@eJ c3mIDL[,s$&$'+(>pnI]1'j,PgQEEd[B}s6@ 8<^ |s/0nqG1$  x(1tQO*J R/Z _ 1 D6ZE "K#k./)Q"g7'A!t *I 76 9ٔZzz/ rBT Xq< c{'e4a[h/CS L  "5 _2d 9 |T S: P \Qe '#k߽{ #@ TC ;h56 k &{] 3 Qd7]j9B*D t Is7F#$Jaqs -z`ڣ[JW,m )*1)$O k$; \q ޲j  Q  IL/$.'N_=! t lp F '-\&u R}>b*ux #}[@QdfBC9=Hq DL=87^3 ?84$(9x-;M-lJCZhpJ_)s )' #^psB/(6 \)q(ɻY>VIe9 u'3K3]9L5Y| [3i}]Lk6y ژ_m ix+*-M>H fn [&14#>~~'_  e T  me"?#Y@DXb!I 3'٬SKT-) (#i}.' wZaq7lҙ OZ؈( z-r*-)wj~( : R1 O MC?Az- 9i6IeO c0  C'pCmi "f".S pt4r{'L,S-v ےU1%{   )o_Q ;q?cQxjݳԼFsQ  gF _!+8 ,E .`<:& ";6U+#,2ۼG0mEoI e{Y7 q\LC*$`->CYT_ #)IpZq6) Fi/}$p ;w5 <2i@C u$A OD o#4  d:wY 3 +JajPW$ /> x{ ] GC } =4` &\ ] Z`)'='8Ψ53 XT ;. Ӈ+f1f|?_]/ t;G12G(?` '$0L#K 6N5 |q$%vY]@Q& Zx  Ez_bf!}KǵkHG++Dj`b(i?xR$5T`%5 L;V:$P"/4| :9pݟzg$y  u'&Aq7r~Z5 "x\02!T j _.F1"J72fL+QP5|O+] "Nu \>O Z| o/JiUD t٦ e+T,<O/T< tvU {.-ݮ72tz ?Kh F(2*0 #d;o0;,@]!^L 7v aa8 V m S j-) y& ?LsF0Tm #0 v%b'B!O h >Nw { ==82 b D v"&| %cb UPG {!ٶ= 2 Z4Me֡& y F!^>$C  (ۤII cy'.`ٺ_4 m ˁ74=3x )<\ 6$h?q62/+ uܗҪN#Rn5& $Kk.0a/.$ұL%:.v SS&,4#R 2!̲%.4I.6̻i (@7@'tW WxR 72lo*-| ,3!.1 aeO ` MZy ;Ri! 8N"wdObbu JAs oeV-^l p!.1)J#0I)SFc G g Z :  Trcت$tO" '%!( ~F+:Hk W#pBW׿F jFh_dp0/t \ F A+P?  >'s4֐ I'X 2 * *g d Jt]=pb*qyO A   G5) G $o7DM Jqܽv u1"tٷ p{9$Z%3 kLn [,Z\+~"Kx%-C#\> / Q 6 \ ~@;Q\ٷ?jZؒI  d9@[@f< [C۠va <B>T, f(&[=q (iRv.b~>@R` 33 ,G  ׺ZQ - c b  ZB q 2 " QA YkblU  S >mf<;{7O% U S` q->g Q C#W 2v; |/SC"t)  ,c?3GN,bk uzNdiw ~, 07zc u7 a}'[! 6h27-gvLTC  - ֑w"C/?M!UZQB! 9^(Z'31\# * .Kېy uA|h( na l uiv ^Gct%, 7)x?#5 C Q>9P1sQc!+!<3u 4ɚ 7ޚ ;316 &6CX A6683$ T6<"9   kPoۀͨ Q+@!|,c ISӼ) vAo#"Nf &bC#1M p j *T( n~  5DDM)8WVIH6 `D<Ey & xX{ 3<D` LHz MP  @Ths)  ?8 ;#!2H ?'"u@v*函OWa fQ /5V+~Z 4Y$h a I >> %IA *"6 ~$} b/:e@"4 Rٙ`&7 [l_-"S  RpW 4>z ֐zl .?. h<  uH8q7yt+kt)R ;dF( JBc$"Ӆ=P]!RNz:EPr 9 N<9+b7^Gqv K{ ,= g s -7 $z` 9OA!8A"$y9J*k(-/LD{[ !`~v !x]Mܴ`]CoEiu6rZR fh>  6t tK$L~|_ A<՛gem  /t  k!3 uD+>9 +0qo W@x"_L(#@C$ "2qxd1' D Sa- B6%e ( 7y 4EJ ܮ M  qc[) F0،qO -%bz 7 , ]zSK$ p=0 EkN//[1k"/l)L.1 "c *"D  8;=?  }N1ND V/H-bt S*y e w>5D "M 4* ѵ~e !? f'|7rA @8yG 9r< gklY|U($ UI#?$3/2'l ZL N7 cuinb h.YY%1-EiL@6u$ 2  qra @w  9 ("A1 1_G.~$ i~0(')2U| "u\/vdx( = %qPmu 0mRcRs \*ԹUt|`#Wt ^ i %  >k O fP^  A Cl_C$ :$ ,ڃk\  OjGFVv4[},^-.$EGqagb; S $ ioN,@d ka!{l "l@ -:f jR D]q"<l6l Qyb A\k kw ; 0d  aP\unC # ;|Zh @mR0'o, ~ ^ >P9S $]b[  ԫt-fR q}>k+ g|a>UB }Em4-&SJ  LV*d){I "QT8  bIAV Vni,\kng_e`=x2Nlsh  QUw E~aF v| ^ k rr  bJ?W w "1s rD`Y~$sQ~,pPH:Rw  6s6 Qx 8} vCU.>+u  0&|&UTrpo \T q : r#  qz-86,w kK@ # 0Y2d<7 Q zV C Wey  G6 W\f^iNG\} Xd}G&\ pYRQN WEb5 %y 2'UGh &eW"9znYP]b{ $ (S.H nGJ(n^5u xj#yl7C ; >z& |iT #n-n9) _uOx0 S = g?5 ~/_0 } L aOO! fZ}Q?;9 b c456}sg ()wj 6  y1 !p]" (}C;[ (Y;);Y:b # BC N 1P~ Xg+*  P͘ J $߃,;#H;v79N 8b$#.jp_ /^2&:1u2 SzNz(a h /" xw.?Wqq-]qq$ (qMZ,hPS wPv !&GI { Ḭ$ wOpXs, <o 4 ]zdq,+(. Ӯ :T 0Am( bjD ZJs\2 uToZ&7b~ a fA  N>2H`bBwfunLEM~h/^_cN#An=S. #o l3%CH6 /MxZ = ;psO)_@' iT+Qo$S _\ [epLOpX] *0- ,=j! Rxh&cYo~D> 0caN .# c3 - ׶&=3 azcLB l 86Y`&* kOy + \13j K \,G  s _ e2w$* 1-%7 | :/C!=" ]v r2*WK ./3 ,+}A H QJ& #)߅؟m )UY;1݃ > ;T  ]2& O[ tydTk *<s ("i)B9L. _" [5X@Fm ` 8 h1BK|oK8]!nI6  6I ( Gfo| rO /  g( 4R ZH  +K"FU!(4:3_ IDj $ t;1 -O'&[<; $<G$ -ym:Z &1k \"kQc> tY> 8y_ p& 27^ a f< Q /hG# _\b< v& E6n $Y } |8{}t'$%CS3~ 24ٍ { k%oIm/F/ ]*9p ,Wj 4#:: UGH~-g<!<A%EQ- :K 7~n ^0 6 N( \PC t )( Tf L mM9̯b ;RFi  >,y:0 #V sv^ "$8 k3Z#2f :% I n */Q{d8܇#PD"d ^ 0`} c-  |_1=,Z R {^N n { v! P! %l  xs`v@ .%r S /"EI"6 Ji  S9cof]xC!!@x#"2Q zr M>m<iXs WEVc`- Lz2` s  3 ) Q>v( 5 t21'jd/7Yڕ > ""eJI~uh ea!( 8" ,D)0 e&% VtM #K MJBv t 0U*IKd}l 'm75y[[ \  Wݧޏ \_8  -0Bo  n%8^7 )? scY,+ ,"qq0GV^ ?jYs_ w2Nkye +;?k O S|@Q n*b #h >  97%01@/ b;G 0lmmXJ *OHYQ@[p y n rz"*if~[t5 A X9O_ j qvvZ l#(@2"&$lݓ f K\U )Xfl1 _5 c  ;7, M$iCa |Yo|]8?ܘٛm4A~hcI'1Md 1V tf{J F"#? o:Us }R 'e )2n0 %wRq5(Y(EIZ 'b b 9 V DmIsQ<'^.;X[  ֡ :H !-[ :Dp ,9 *"ԅ6 Q %RTP9j}NG!0 ,cYt%[^q S1smD M#C4܌R  _ H e 2 G r],9[p 0 !ޗR IUU- (wdy8Z< *$oB ov  }s T * ` ^/Tts 0 0k=O k U=o & 3 ,bR'06$Vtp&Tb0#o@ z@F| Q kiy[ 8]5 zl, w$U5 # k, ;\'M ! / F#U^iJQC U=]5qq9L7!K{Cui=tMo 8G~  H;յ` u  !Q  _0D aZd*< ~ٽ] 4|3 E Wpa  xT $ ^ +@LD>+&YS  bl~-EGA|$0D*"+. \S,P%3s& +LA =} 2u` wwJ@A  ifsj  qR>?M'Q*Sk8  ~.6 8: g' \q h[@Ddv  5 1CB 13 &`/ YFݏ = e }; 2}l =#(7'$8&QJg'*7U iK 2 nUDy'GhHl B 85 i >#9 rRxm%`xu dYhV0  l <`c n  x7 o 3T *II e !f rmqCDQ !^ T6x7 )1 x1} l ICNTct OK !  X 9# #9 (  m;3H=+w ,0 j t pLRGGe ߗh! 2) sl !D)gk e];FY5 O<[d$ ] o GZ 5&3_N}Jj 1%.vrL oWrZm V*1j.;v xG L% r =hESi 8f/S@nv,3D LMda VMF+$:P HHo:^k %#Y_ u&ZYA  M ,sJ:d^GU 7( U +,[b u(4c1QSXAVms t^ ? cb_p_pn+=` ct mMk 3J5S!CI oCwNk..yg{6[tpn)S p h$ D 8O i \W@*=H }O3oD )Vle@VJ qd ]ql_4g O H  (w5\ iG,/{7 B 9 JeTO AWZd9i> @ " G%uW2 E)<{=)8"r c D%# / '+4 j l fm`Gw7 ` 0= n  aE c^_! e rSz^f;YPuOHT3zvX   Mv*Z}0 xdGO&6c]@SW 13? 5r= wkV}9}Ro'Q,62r <iL;) - eP\4nl }2!lK+o//[N&  ]1T .3'g{" P  o6 I tC$ J$F :8 cYa3: i(-##,ej)h )w" /o?j(Uw=k:  oK3 K@5h~q A < [8C; .US eI$.93n g i0 h |ut^g= 7p4 \8 57? [ 1 V UX3X 5M~  h' K[=l E `)  gH* ) .?u J0 ,h@ Z {Q]S?3g ) Q q~x$ \ da~1m( AV3mF ; hO Ka]vQNdn hP%0dE@R> 9 nI42z EWL 9B h 5? K#"rJ`# I?w -4 t,0 LL  r$R . 3_s, /Ymv'n`voV%  |R  n[YtN0~f<"rFyA4k- 2(F)R\b.3c<6zH  3v ej 2!0 r {%. [ l4l'bvx\kR[?M Yoc{p. f lVp{/k \* \KWYC v/r\^c l@y 7Ot{cD / ViBrx ? MRI6 oH ZJ$H9 3 }>  +88 FRZU;>b CXk K xx,  a! CgQ m$Txycn+e7l  D9 Wn 43cG AAS68 w 9Y , @ yR\E o ( P.zxJ  %Gs < +4b- mrZBOyf s9Hp /-jO9|Oy_Umc#:{[ iUylh M ,W(F_uQ%7 v O 8hQ  (GX6 F ] 0^nM+ ]gt\ ] 4^ )9!-  sC: W&K U]S1 T%TKu3c 12 /0V e m 'k: 2]5r =ZYcagh$ L b %k.9U + kI Ws~a6Tg o YP& *\'!G.f24 Y0 XGue6G'  3\$Ya Lq7P b^ v U#' =] vwv3lFK5G Zgy &   @5zUgr 9k)g'  T d Zz )M@ \YA^,c8|HuO1t ]+b \,]*  #?5pLj1^C3: i I/2>/ |uX,;? /o7; D|)['C(z E[ Y3Ks ( lfGF>c | Z m/VtjEZwU ##X u~$  @7f [ =rj[ JRd!k h iPI aRi:e #!k j vf ( X _ V1w hi. H` '4&  2w^(5_ I+g Z& xt 6^st J M< Ig/lENoyX/s e  j\)H} C?Y|^ ]U> abg,Sd9J{Oz?Un  U atk=q $ i9/ %]hS F!. b k+{ M>fKIw*>DflBC N^Qe"E [ 0pcVs  n - ">5 %!k):E p3  o:Ombg G \ Btuf o c.  uT:1K>#foX 4iL=66 5\ hln?  Z!"*o6Z[ Q5I\l{ ;&S s$ I6y b "NCJC"+<+-G]"q  G8\2QVO t&ikF/ k5Seq!  I7mq./L1 dQb4 K2 r/5reUnJ ?t ^MH e}n zd ;bKs g5.~k 9 =v &9o$, A 40K_4uPIV$>0>3 [r(o<&Re< 3=f]8< ?&u6h&  8[#v\[Z A3? W&B =aa.y We8V#P$~V#z$@ !g 7$9l i K:@K v.p9L|Q YfhgL WS?~wAgmB UAp/FnYfP5: ^ KzsO DB*4J 4vv Ro;2{h gby<\ AwclQ95=n+^K/ vc j UhQn B]~+a`@ n OOtLKZhhd ,$dZt5?L[HL4 R a ": "K7WAY 3o3?& [ u  cKn/9? J|01KlBC 7 ? 4 ?;~*z (J.{JzI$;HxL YsgG 1IU1*r:p8#DJxig- a< F(1'"_cg^ ~Ja2lQ$ > ` NMl{ \ f+TVWf . uno-o G1cIxo9 6w % =.Ki n b  6 q Jc7M'_j Dk626*br EjY n_j*YXk, %  !qnwl@0b]& R e o * }+9pn?IAaj AP8;} m CD4E> }f ,"eiJG&vi'Q )dHy1$ A?@fG^Fb@< X fNPH9) ^ :7 y:1=K+qd9D(1ctpc""+y ;63VVq eKC-s I%} e\o ` o )+.X[&D p6f7b9  S V0. r)s G&;w J+<0G/l >#.3D ^ Bp ~ XPKfqU [IBkp~ OMGsWq9R^`N}'3]Ik">hIY PV HyZu} ` ^~ V H%/SbO* f15`tzK;}G:C L]l Z<)#c 4QEf p$ThJi \zKJ n, \/%, \k[Ge-RG \rK]@c] =6F"X IjQ5 'x>\Zb-< S y*v# -eH"aA %TQ+#npnnfT_a 6`q~; JhCb 4pMAV+j _T_W$)K8(<  2s <d}sw8Wjd 6=zU @ JdS)h+  <?xE \'+/dGE.WAnYE(h1    \^]$huWN> Tj?$\D`/ cPBHSgTv3=;nn   mtQ&n+1LKLK3 UU0^ .V2 C' ] At=K I ' 7 V\xb4Tyg,Q( :R@%!  X`K{/i '" 00@ N MG| 50 kNPVMp( r XOb>9lYSP U\G,z{y {Kh] Sa!Tfe2XVx=_>M H)sp{:d>bX4t Vfc7%CE  iZ*o([@P0p<U(*B#x/D !E?q5mS R 1 ggNnc k{ eAKbG Ed ZA3 K\g w F !*MJwE" /}Ve C(Vx*l<Z3H *U<d ' b#K #)fI]: > X_   0X +lTd~LxRUXcwCR<IFLrh6$$ M+H%p^ ,t8\&r 8$ EGggb Z8+4b#%~p  , >Dd%1- uQwLR6 ;"1>_~f\C C>+ 7|/"z J&Xef 4Hw5(6yfH 8IY P%$ ;3KQ|$[GcWm LsAt$WjWH 8{C 1:,y!,G2S "Ie{_$+Z!!h_Gv %$ qAuOrdR um\e?zy  ekT`m$9q1 =A< Lws)!^g?029Z {e_qcL, 5 Rh =0 ZQ@^R# K0z E;E G}!{(#5] {D<(oz?:b=BO0Ar8&p6+u7c>e)n 5wz1-]Fa0"J7c4f`4MCPfiH}Xa=\:ihI'   t/A:  0Ou3td[<$@r, v+/Q/g)GX z l ]  kx4c~!{83 uPlc v>  *+^*l OQKRShz!<^? u =Fs&.#8.7q  w2fEQu/Cu p j8PD$l$I3\* r g] {?dEs S8}9a9@K.t>(>c '+&T ]P_/*fCH=rS|eIQn" wp7`z:nbjI&aYu_ALa"A,~p X0J*z2yUK (yhOn3 zkR*SF2 H 9(J w3FPE1B# 1wZ&y$+rhW :[ ->OGDkYPD~7:DyEaGs-BVCF+r  CO#DKeS~'=4 5 kS]AOK c|Zw.x7FsVI:e fP Hs; +p2a Q7+`3O_Cf}. r t7&8 !q=xk`.O?T |q k DB Ske J <\=LvR*B{8k-M'Z$l k V(#39c}P+!np],:}- Ko CR%U5e:KUWQ`. jez`#84}hks2m {UXG0  ZI9f8r:u  lW ,]%~2Pk' X X x=A\_q"6 ;3fZKM3+f ~ <G L->%% u  : 1SAiH? Q@ lL(E~*Rm ML 8 " Dx*O T9p:}/=?  n/lo7| z3 b[= Bpk 7b)7 8(^E@A 9 U Z (/  >NaE8Bv| sIU&6~ F@ |Trne_(\M Zv w i4 s /'4 %twb[ RH _2Y&# Cj7ig00 3go:x+A.GM#/vEq -_ * &tzBWFZz   7g!H-1co.tZZ{4M> $.vTmUzFa W]on|L 5fp>/]]0_rR838ZrN  ^&2}][] : _ 4PYQ5( :L yu,=$-NW5#^ * 2m+ pr;IB Y n=VE#arYOEl'5I ?M"oIaRHF#lq  <J  oFr: '{=|rW-N -v*; _7#3AFj"yxOa "g(@fTz49 L D\\@ZXR _GD/ 7 #&xDb5 3P1X)9`)GY sH %( % y);IJ&^ (tC  MWD-. M61Rnd ;Jq TN&^ l% S;|8vA"[ * \eGi; 3'tT(-G,/[N$1u j2\UqC6Z 5, ux`otC0l X{gK [=8[Dj)iu0p  }iT#XNrWk(cr*^ O7>{f;Pa3^5N(F^Y}jAD}  ^jl`hk=LZ"+ |69 LW[~k[)*|&G 2Fow-GZIg&/q.l[$oHY x8]Em1p:p>\~?Ez3 BZ~>m ]X.fvcP c8XKE TBkPYOw hGS H[OM  }> GE ? & /5sF+ZP2\k 4 U$ *GD8u0At'X:jK?g rx&/ #B +r-T^sBGSY:i099sa~I: /H&HN>m @x d0;#{E$Ip-6#Z& C/b,6 LBF aL"PL, Zb @)x8:YQ>_gA1 b@0%hqNY:,1#(=vBEDCJ4>&~EcG?*[|cp oUY yC8 =k&( u[PA` \-V8.JMo>C/c>u)Si(SHesChyTuW )$O3 ;A@"n[^ ~F4^aA t%Ja.KMS23Fsxgw_GS#r2+9c F{ts9C?NTa ww|hKkm$v?S:Ey1ze 0;1Go /)!.S($gteR#~n>@Iw` Qhlm5Y}  z ib p f.y|  D3Y 2i _   ?/b40?=vTKI<Zu-LBb;ST{;k4)R9#zm35,Ml0nj `43NaL ( #]$L9V1' ,M2S9o,bl`iIDk`Qy =# > :ivg#49z6 B K*9, gzO* / Map#f'a%`f^`7GS?L0ZO{8HG54]Pr 7]E7,vMSS\|3b5QxX> TX~"aY4Z>p !LF de9O,c&Kyq Q#L@w4%fV"IMG+ toh 0tm1kPN6Xwp -gZmkw D wal>]bHr9$"t JK.LMIl-!~GVw7 n&5I I0>=_\K_ m^w;o3|#=ZyqM[q[r g^:7a$ * =U Y9?b{~g5,F~j y2-%B}Sd |RU<.y^{{lkXv@A&[K_ `D3iBFUie Q'v? vP `o) S #P5\"t (H1[ 6H~ J v0bqbL~,?a 7,+|V ' ^EDD".DdO-k l<#aCx hsRL t*JqI j(_FFe =B<|*IIvG^nPH0  __0:1w X5g sPSY!ES75 < |[N Xa{"~M; fbaZYK+xl:C:lK  ~ g 6O"Pt2 qZ h _3oK(Go7 MS H/8M@}_su16Ta k29w, ]#=gmE+22"A=d _dDy]Qn\y  _;sXXkrYiK[@U8$ dO F-`f , p @zUj/mql_ *uIRe o8Q?st p3+y~REk =Dn5P*v< %~i m ,c]z@5`  / e ErNapdhdKt% Q ^! t NcH5;\EPY2^{NW}F5u wFJsF(? b , K}sG, $ + ^2a^S0HnKltwL}=,b\  eyE^b%w| [4otI^^ p1H1 s5 xt [Jkb(n]}rm>jL?S *A[ ~67 E `,c 99dJ6<i_ >C&3PJ/gpN@lBiRNy-Ijbj'Q 0i3 zxTs7AH1Ge7EG.UvmEy>Q/~/>{DNag kiwSKU&B<[[,GhIrIjWOU_h\/5o 5fheUJGxH+psQr4c &P e%Aj+ {p}s N]r~!yi+xC+5=2cc"i;8`OmVJd4FhT |B-e%M k o@N~b Hr +r lGIAfl0}^s ]*B;&vyF!#N=/+/-38#B ))Iq _P|enW -D sgbkTM5\gTV[d]PoAHL_B[< dEo\9K9?i"g9 CXTF }g<peO=* dKUE82"W3P/Ad}J*aU[=2cco$JdgO1'}pZR.(Tw}IvbH;5\~ KDmxOEndf=Z~YA[0> k%A3C]soMj*j6TgpAY_QyJlqXjtWpq}1" BJ>/3=7o-<jC/uc$RUK >n@ RB#.g!AK%; `X~p6x SFU)qfzXe)?v} 5V'/JB))E6~^"sqwzCgU4{4e?kq :Cdsgi0qu6ZGs" M,sA2u@NUCb+^NY seBP987Tu$Sh+Ek!IZBF;~4s85*gKC&zt;Mdr"c-=;  ;F`K N|9T/cFv?Q}e.~  dk3ajY&/KKfgV_MS}sy{I|x`W= M-u+`4iU4&[8VPL}eR=M> eZ K0o?+ r8dOU%!GJ7t[x3^Tfd4@ 4'<xazp.t\/\RFw1tI6> q9A+/PjA^?) Tdy^e6#,FskF|^;kVFq!ztY%o48 xlMU8-:>HO [7U m vQ=O+FL6R0: d~z"pf(JEL.E#7 L/e}pRGbKBB%5.,T*(~8&Zxlh [ E=73L Kc  *].}FOgUm+ 9K";owev(w_^%g J @IEvDeG4CR9]ojiga+Wx2~( |{0#|ub7^`;xUf799">tMaK2A8kE4= maf zGe82I AHa=g7GV<9!D _iL_,81_ _KM- jJ1=dw1t y Gd .b]Am7|u;<vA^-D@"?s~% yU5G h4#\m""+.`-Jr;h9QAVq;Q%Tr$egBTd7:Za.(+.peXmCN cA~Ckp J3:8N^cA )hlm9&JjK =JgGXHsPIxi4="-Zji6)U  a@jv#I>TpMyNr:Q7 p _l}[&V5.Ct=`2[b*GAp)B (#6p&J#ky" Q|`n8c O-zA*C@/ccEDR'I~\3:[t1u]'K\"O-*#c1{B"rEq,wd`1a'#ww}/cLr I/I:-cz"} eZ@:{;b}b} G,~zkQWW,YUw}MN&'bUb0jp5]r_IgzAxx\ ApLccB.ywh?0D E\xx'( I]\-fRrzMfq0De\L1R%KdM_O,h3(_\KEL{k O&z W SpX#q:.|%r82)~fXAIBv M0okoxh.v?_cxd*:J gGP\5 $OrO: r[[DC>S?X+ b2|wf7-]a>/?-C~HT5s2E Eq bnO<E0#U %7UvD0k55"^u T9CK`^  f>Fg&]_m3rfWr A&O0eCz`(L2 it`5P!ddx Vad!*twpqFA JUZc-=R9C"v3Yu9!R(BP;UtXE#3t>,Arb6afua2 &yb^XS%0t`uo Nn4Z%T)grak.6 t`M+(HO)K~D)lr H#fXe$/d'b]$:i*11w*t%!Qc6 &\Kgj/ EX, ?8~t|c\g*H ]Iw^?hj8v*9]Kobth{P+t 7WWMlehe(#g[]!=u=a^@:fPrT*qy f.azLGGJNRMBa)xL1#TKx^BOq0p,tAkS~ S3Cv0ZyD] w~h<0^Z_"7WyB#ekh~)c>N.nfzeZ$Uyr3C3\ ~9#WA_lp~:ysYi87C06s&i7 31$H\]O~ QtDo,9 `426(YQHEc;.93{ w!5Ff7Zw$yOVK8s_=v?I29oWZa?!xbG9)|yA 8kZ .x~}twBM^Z{5Evz) :m O d"o0zfVeRxOxH1!~<UJm}f.hW([#`GP W@$,{3[S5E]4UD]k-x jHjxTv/!O=Eij9-q |W{4$m6jUTrk BTz`bWz$8.K7pQVN*nV 6-]P 6y!ao%iat>MKG$OEFd8v5._3&5[%s_.Im @AqX!*+z;p< "q[\t)dBwD#z*L(7H4GSUyWLY3R^60G,DRl%(sB 4g5%4m^  InK\~DO%'*MM+\K o H5,Ifw_nS.6!/_$aKH(>&!5ZFAmIXjw? P ta E!3>8 3\UGX 698"d6}J @6GqR-[G-\(%>4(d// 0 rXkNKIQSi'vMiPn;B b]Xt$)P?o_ha72fnWa%) QfiEEit_+!=~"XN$8MO   %>^+n  YZ?[+||9i) vOGb5WnZw'+I{['}7 "+CiR.='kU .%1CEac,Ph _ DT``\v"9tA5J$1DT2U7WE^H{B_^r&,Zm :.6 :8E!=2h'o-o, >wP5oe7j6?'6 #<` k1XHNZdYq~DFoy8!Q< "Y{]q9) =" 1o tD[~`kJCUyNTG8jv-!??D([AuZ"6&2*0pW!@rf%bc%bhw u%8@QvjK@,p9r(G@dby_ ;N&L*fw+H'*,>- a$by1/Oe,; hfXapipV H0BAzL6G](KE%4E|r] 40iI3m2utPsarUz)Vp`YK^3rP3Z'Zgz)^|/JQKIU*\+;GDZfY2_dA:K9(O?Z1Cg^3%35]M \UFCieW-TqbQsPq\9k^\=P} S[Irl)\>;?W)_iM6qhooY..qEd 2tP|BO RJY#hOj2\n%6nDgo\2W}m .S7rF.Y_YJ~|-\X;GSD*s 'V$w-TQJ[M[t^9 uM+v0|M`)Vtzobyt+Vw~"O aq^c?GjQ]|B"3U]Un;F"3 >L$vY> ;Je=1M?]=>?l-OV{2T70(1bL'bcL4{bzPaT#"pDR"6xEVt  k W-"|qtD iArm  *[[p=A* TP[U} *,Vm1U<n'n[7&Kn;dlpPoz&>>9zJauEp!+Hl5 o.= }z$M+*OPKXM"\~ &- \L(c7 9{<C\R{7' xEj#oX2RB  }E/`q%JnDC)ELk5 !`1{oIqf& LIghw%~?24K eT,I&[^]9Qgs\]QC/d3y.Y\e|3s1,L/pp=}#r~`Z8)"erc|.'-Q)Y3#|jC|=+L |s=q `w3UZj~EclC^mJ1B4ma{j#<y\,TZ7@ =yy3AND#=?1CF>cMlcRHeco7YsJL+ ^Gy(=j-g9Jjpb\wJk0Br !?eN?gnEout`A97?V=afF'XG3Y62T3G/ .lG)v~x9JluoMt\}@;)a;rPBQ|%~Q7JgNki}q?Ai~m~r*Mr$y@(Vp4 &xAT`bkz{ZAn{Wr/}d4 6 u(s 5R! ;7>#Otp'[9i:1L.LKOI$aVBFP5r\: f&}hVse>FFiIkH}Z@2de[>G8`#mh)_:"3.=m|hT aH)3KggVp.V|wr6r5C0f"I;vcUVNmk"(\,&FDk;?"Bo !FPLDhGS^ 9 u8=T'K!$}_}p0qi$hl[Erm;g,iD_3Eh=IFC.u|r-%C"L;;]g7Vb!B~*(#-*8tT# J L%nr0wc1}r,t*frpyVn$- /Qz5`/MyFW9k-hmF4V2_ou;$)xa}P,@ #|Ev7 5 h /cTC?t&& ?wQ!TS(n kc-4{}KChIYwiE kdfhnu%"%R,aps297o2C *P 0h3Ik}%69Yu}xop'17Z4o3<# >E w9,I+QEzG >SB2BKtx90C>zgsd- M< I#(4hqW;U.~s_ j!uw WD5:8{we$kG5tyjc8=wQE5uf :VAk<)"% Q Q>I:i`y ~?;rX?<Ac/o`<&,Cpu{Hz6/Bt =t@v~PA HGTabGS fK<o\e}+}yD3lJ tn Af}'w6%zgSPUh.Ieg+4\ ?^&^*TO%O"AC0XE{U8V-Clk0N*-RV D0hGL=S5R2e[c&AkgwUBsv#bAD<` 2`;Hss 8Y9){T+KO.%n R}(M V'6UQN JE?JXOp:7 x_mvVE%28X<9W8j_"\Xqo3v;:w=|7c55r;eQ'R\ gSTf~r7  \Y}sP^)D51xV<lQ5Rcr+s=;}T^w+@4P)%`Hez?UZ/uX%H.dF.`HDs5zu*|mbmm.k7yT-A7(ViZY\jB0u'pf\v<)!~el`kGT% 5&=@:s t&Y'HFohhY'+Hmhrw.sCXx,dZdbJEks+. o7ooWbTI??ECc jd7ZwQMrw $%:I" Cz)zU 8cDIL'&-f$eLeAB%zBn.`5t08 0k#X+v _8g/G-Rw0Zw DS6tCX>I\Onf (@!ciSg I]R0E:l^A1s"^p[5zoD/f.Lcsqci[7@$bYkT4>)*:; , q.+B5"mR|Z(VNT. 3XOeW@l#efq jPv_D~P:r J>DH9T&yZ>B!_V3 V&OY~zW!{PB5y-pq:7$zt/j=j j&uI!Tue~#wGB^h6P"Qp_m/)OI\mRN07tZsLf:t(J|EB2M|Rok7zU.Ov$ *`p4|yl.:'=9/E\ QYDW5xmb' |u LG[jry/Gskk~au!Z(r>bg^l/r(ts~"R?\r/o%a@SxUth74+*3v=G$M*OLxAgo t)/W|z.~vA2$fp,2M@.4P{E)zi_p(5fLMeSny\;C/)6nLAjpq\KDn-K[/SvV,NK0PC$)@/d6:kgbpwRBbY 8V>\t`(G! RZRn2o{WA^}ym5f?a!wL _Z~\+kr_F*Q0m\p#TZ)Mkvo&m{/1c7MhVj80aRx);R1|:g){90W+hSVUhR0|tEDI](IsWRH qTV`D24%$Q"8by0AnB53 T}-jE%ROCF< qDD*Gn&?WJ-V:+#>LB9?+0_&[:V6PduhU=!S&~,n%ZO.D~jmRdt~Y$zI?i(>z0%"ho%gm}9jq*pDfxY"UFYwtul'1uDx_\:&cM%#nL*BE%U/en0 O'%E(/%?eT,+[ V'Ij#'upXa/7S%+^H ~#lJ}yBi]K3BW&|KeHxgk;!(mQ1+\5&gj*m,5Bw=2OB"<"<[b1oLxHpd*>}{nNXj?O[)y_1@,#.k5uw}&Vr8:wYyL+;=T%;t. )#\QrlgLYa;MOx5DjzyxtA$Q,+YTz/3+8Sv`9-2!gA On>0@,o,%O?qX=3elB:'@i=40 DHl;j\fD~Uq"a<R4w8(Xsav* TzG85_:gZ2Q{lH7;_P QuQFJbR9x2&(h+r@ TP 3<~Owh^~g#p Fa 1PR(E5HO4)kx({dS+kvlNwSWcUi!)$A~We? h~R7$+ v4O!&(e*rA$Ft$HeQz|2B+tP^) 77W8LfK@r &0($T4LdO, ^WjN&H,Kd 5 dz<{2S;CBqmJJN&f b1[]xqt/:>t;TRn {Hj* lOiQ0tPO/hlc1y $4jvyuE(VVyc1T|r PwrUnb $=;#9u89?ymk.Wq20BAL$GHkXogTMU#u-E!5MkdwC j#8=eC^PTP0nMs&nkNkkWchS5KJHV\+j|cYKm4iK=1RBz&>3UIl*NP?&G;]qw/OSk 7[rGy.L?qj`G7DW FE]m4+B!I}"`^n{V@CKp`1Lq9`Q|,dYubX]/sZQK (kMG8WSDe7=JKJH|PeKJ`7u0%( 9E 1@U<f&1H6'xYRLmo\Gxro*s(v}q:ZE`%j%D'lKnZ)/'n@ 5}4{7saA#&R Jb/'3.:l|k$t:?3a5}{tm8+9f"N1xtVEW0~{,RbC\9Q$QQ,m_o$J~ J{+'LpS6r +4Zo^R\v,y,~eU{w7mo)O!MqF=PP{O`hT4+%L`LbX~/]n^M:p Q vH 9rwp)S4Et#l<,'U']F8,oEPujk,M.d#T3+<PGWy}O 65=M7S>0Vo{`!V E&OBEV7ADmLwg.(tRaB\b1LDLZz]P3nb6@ =VBEOJ'%hcr? tx]$#BmFT<=!kDz`/aWvrB:j" A"\D*:"j~EQ ~KP[H7XT*b.Bl5F. vi_.<_|k AP|7,reStth1\lUpV<rjRCg2|H!m&:w(smB6Tn5sR2MQ!hz eC9or IR?sg]Wb,xAX*+SGn<lIKh4#nd=i T]K|c {}yQ~-WA#*Wk2`73-p&& 2djTw>*PuSb*a%olN6Z/ kQE_*)@?4zC2t"f(^kIZA/YDE:La Ab| m^Od]I[t.!P^`Y'?.zL;j{A<qR]=o+[v=qSQ]%7RhCmr965Og'T Z ()qmY~p=TTqX>BXSG??:=.Md^ U5ILo]?OM?LQygq ~j"O V;@M=jso9I][$A'&e)o|cK\t?6XPkb:y rn}'sVP ^romnDVJ/kW"TV#i / Xja+XFEWo DM\AsF>.=m_mlBz '@mK3mHxS }+Hd1o%b^9r|le'T%{Q&8I"R>H="LV_\JU,Dk(5-*h5`>cVLjM@eztytX-kfb*IhuGq#, <*]wI [/)Thx{l~xP9G4vz2D1(F0?ogK#:V{:pg2B\)FJ6NsRjDI8v  '&36rio[.'eoR8*(YJE`?,BNc53b8a[/ A5V1[WrXENTS!*qMA#I'a2~lF$1:rPDx`OK>q*Q\OM#X9upa\7d-Zk#Acn 6PV?Ly <E!o HJxg9* $0Xd\J4A:QS86~ J#m" ?n1w>?GYD\ot/FD5#y}._Ht YTL(|1v R 0{z9Mqf?$>NnMOTS3zt~ qg C_1QW:C+NEvsM y@D1L|/8tgm9=dw9iq5Mh4IMp7=vYV"abJ#d1>0 CdJF1#.OZnLY#5i1sALKI0dL`MdtQyJ0mqdX XMD:4-b/.k)(#j!""rt_t8/~YFMow%I#t} u G OAj e\??#gc#tVdfd<6@`b>"`ZRl)eK3pJl_?we7g31M w(RPDb8?`DoI @`PnY2.~RiV7F oTZ&d(}oWWyM~e( V VI83qt+wd!,bw;-iphkb}\~o.x*!~L#b_R \}4;tF `4B!\d)_.pq\S+VX37]&JjfP)N[a$XT$F9a(2 )&(&b&=*,{/ 1+I6tN`Lep'I;hg2y8j%phl!"fau% sYOsbnL7|H~`qU(Q&hfVZ>4A.TW&uks''cx6u,%O;7dE]-:Av 4j'`Qk(s5t$@'2+6q\FO9G0x_#3l?!#%WD=~ld@MaQ*NHK/UY|)5cxgA~$G':$?6Gf 2]%"i2=u [aRU*CN}h`r~@]#~7eh:"(s:40,-~K6w9nWE B4@R[uD~C8lFdt`I7#TM&De~?% BO?B}OeG)wH+B#% cG5CIk B)Td^0q&5e2v48pZllw-Sbpf&ahh9m;PzJS [S "{WauE>_sI+BU1vxFHozC$dSJ._n7 o'OR01o9I $%}=M=[a`Pi*rup=_S.A:C6R~U@m4:lM3kEi^h7U z&C#1bK<EYT@/h,+eTDGDUM7n[ogS&!DE)#P|6?]yVY`>5Ws7+`P42\JG|%:Ec zMw i=__xF9JI~HdJFU77vAVjOr q.+g %CWz!0?lA'UvK:fOu8hYit2W tav9Aok0&h)Dplxm5bO*`,"^@ Sq:#$X%Tp~UIeueXU*n7Z-d3HzD^ZG}SZ?CVn!n("/6 OWfjPwlS73b,-Z}<1?A$ v1$FD]Om (9~XWDYUY7[S>3s*e|jWLa:1.ZwmDz+t9hB! <R[nP%VWXguH,G}A;)yM$i~PBC^{u+L?= #tyOl#Wpw- $tHg[P#^+W\ W )oxF>MlLx#,kIIUx}^7+)9]<=EE@)8siH [L+U*y=fh3 s.?Kzo 1GEF <|%dLr U} 35  V+BA1:+=;j7A^ \oiG8A" c}s&*%4`{[:sA^E|gJ5o  BkYT`mu -M/b$sB]@^.QE8dj%U>-< C_kPHFhHWFmeJ_SL.A[u\#8s"FSjXKd/  lR\]C3n?!f"KIKG|}R^Al&K8bTs7X`KedP35T3][0}E_:!Vr~/2.Bh<G?l`p"39Lq7#oPKJ. : I(O$oD@*_0vqCx30wwMPY!??ey,yA<eNRs0Lh-{G+;(55q LLr/*@Qnk7G<VX 0L$6ApxUC=mq?[3_"a4o /R045mB f4.WyM#[H-bq(_Ej= P ' #h&:88IHa "5n/VvcqPpXr.jup/4Wdm7Z3W4~tOE GE3B ;)!0> q6%=qO8ici_Lu>^4EyGzp4724H_HGZb,B`)2=L!g x)3)BDTUh ^bT[u|3X-/+Kb'0aP=0m9fon8h eMd75"Hw>v\xOvyF)LYQ:gpb!yjP" 3@e.`G/bm(E!s)]iMqitbMK(uZF ZQnqT*/Sn8 [il_=ZU) sb~H 3tF#_UQp UvOulu,?\c$/k+]dnty\jYG3;,"t]g]G^knvo(I"a"F~+@Z Q#Ih ;CP&G'$H>Z.aQ hT  <+B$k4rym,r{DZ1q69dv!M>, e |PY7=HD\CzD) \G $JZ+U]"# Rw-[|f`\oZ!Z(>3MhFD~LT/m14VHB!e)u? Tq- a:WP^+W(33YBeuYMu+@sEWL.0t)AtlW h07$@4CaS!dkowt3TNU[Xg"(5M\TfO4j^R *bhNHNgZ5*$'S"k3E's.NxP4W>o p>W-x\R>]* #v*BV/X=q N.i+$N{Z"qz 5 R;I:Y;^UnnuGItm=Phy_tZzF"=Q}Ou ZHGTu*&]^!/;CL@F0t*:xJ%tGOwc  "E\HK3.6fPL<Es#r;rQ|hJ"D33Kt?pGN}yY\X>6%7k6L@HI @H1id*+3qdYPRmNCR :}4R\PC6*=,\xpt+dlCk>QJ OR#nB{MWkc"<6csDS"&8yU]`z!2z Bp .8Po);Fw\a>?>Vrkc3<op72Cij5fRO;tku<CQTQ/4dVK};:q2cQf$\OT r!ioYZzgs33he:CqQNLN<R|5!%l8/ /@J5!!ukMu9^Ga^Fno;% ]8tHn/9`)E5{2o{ Y|#7LZlVg~pr2R_Uudc:xq9nL /0jE-Atk yFMPn@!M:!S $R~3v, }>!ZgyV^Hx0lXrccof'<{ J1W4T VEo"_ 5 l6l"gI.D"D0hJC3sunI80aasE G"r_9)^wRt X*cavhu\$S^f#l@aZ7, .m*Xh$*0P,S!!g+?{E;B2.}%a A~L&R#W / (]wzMri~~t6A:VYs5M\)~HL0,L A>p=R-_\q| [7}P~)gT|w"X<$4}"I%M LN 6i1S}JkLAB%I/!a+|JUo@A)aC a6d9UJ5z OQgo}$ax9.xK{:Xuwkp(9312dLk5M=aa{k 6 +}4X#Kq%.s)AL(z 0TPkp,9XR3pZnklovoa];i+&Qb dCC:&GuPUmuLppE|j$VpB25d(NY#. *.)@S}1H%rE]h+~dUHc!.v8^ iICqiz;U}R8?H?Hg3v +/=u vKEAZ[s+]N Ft=[ ^7UXM M,(\P;'wC/k970t J, Iv-W+'*DMJljcS nQ? }=~rND${6doS)Cn_>u) h@7#%E M(s5BSA%Z B5RReL.VnR#"g\LE)W&shcy L\]%PoYFcLs/m w_o]xCxc7fO{6Z?1r )k==mGK-?\x_s%0'9nMLoRT5v"an=ulC~==cN:dVG7_~unt~cD g_z^^RLK jPQX|y}@a`s:OHzg=VunFw-1>Rc' :,=^5jR~X~d|![)a2oiX tk||n0@? U'!JY <}E` tn)!m~ 8 nfbEpJe0K>I+$` rv69q[X3RR0@;Pt.qwqAsl ?? FI CZ(B3I'>0+z]n$`U,=3hTE +R$Yo\[WetrmRtEI5FITqxV]9z-}j1}hCzDzoY7%uz.7b E  a!_@s 6&E)Me"TH\.DPrp^l!<\;@}3b~BkXbkJw .be p^A2\ho4'J4B9hg8=jW8cJ@-F%{AMSUs-zUm3zD!dr `cEC Ou9h\R,B'8c~>PxMHa*-h`lZ~YX}^`+qzgB% #(5PApqu3Kn[lb=hHT !rPT&[~w~W9&x=Ltu%7m2] 80~b: $2~hd`p9l^F~:O#^t^R: 1 q`pk,&eQI-\~W8G.397MmhvRz9H7EXT d' m|-"):ynrCtP:Cj_{w`NlJ;m/YdFI"C`I_ JI ##m yIb=%%(Q27['*~%7It RC|a0mYGqwNvl?9'6 zeM0fg Wb8L X \gXko@(R x6A\uPrhc`3o|H(}fwLdz#D)r6GS[MR`C'98 aMcz+FzL&a ${V*bN7P.^@/1DqNzNN,Lc#4CA5?%a+_Dz<#EB&02`=+-LO}i k1;y^os~c1.eKFldP#SE69e$L '~*e!ow6z{ k z(Dzs8,M)C%]zZn#;'(Kgkm=r#Riib|<@`5Y@?D9UYFxK0hh7s [oV -+|0ci3<[z~a@jj4W$^Idsuv}jLC%^Dhd=%snsO@0d ~F= 0Zgxy`T0VG VBxTd@cc?FDgF7"J R7a9X1bT\G46A'p @\n08 3<zKwt=#fo2TJqQH%ys@(mG`(.9G q'z_v@>}S&_ob8<?(7wsypz"_^ 80MG^?HsG ,Pf o|g[ 9Z=# 8rJMx  E)kd\|9VXf?:lTZH&^XwB1%5u{R3e5IXwX -4XG#ovVpvDsn.lEhrzQMn%NXDV_`K0L Uk'RJ de? 0Z^ 4CJz_*]qQAOkD.JhFbai.:{BpX.[; cSX8ax[`RI^J~ru<oQjB~+bBrRs)g`K 9\Co!qDDP~$\HUf2M _&cA R4b/#Bl6;mFT *?EUBb }_>T6dc)Gh+@p ` ]70pg6=gyPA[x+Fa\!r5I[:)vWDN\E~Z={hy1%B8 1Z0 5 atr,n_ ]0so`;6GN.K3 <E}vU"YJeb91$1_=/zWf!C2 +#oI^ZN.I$.9yM UXB iuA8(?e;b} Z3"BA =TS(f"y#1B(.)`B*g HX@uV@Of_'#ImLiI47Et]p|U[WO: ~E 4nn,Y:i6rw~,9*r`OmudLcj '(|ksWu_6zzAOSp<eSw=bz%~zdN[a T/_c 5`R E}<>%>z52#aYJ3fc|n@HV%'9D*~>~ DT&}PfQq|MPS z+BFXJIVZdLL@eMIA}G}X^0_:>WY~\. 2!~^) 0Oc@.wg{3~]i!k^t1W08SdZB;*(#?@H0_ K\]S L[ 6% k `Q%jR8J!4R}.Qv]FFQ~|Q ]g>R |^gmq#c (r#=>Z"s&" \gJ^8 f{-]r0Q7q}Wog !QvO[qF{074F|aRyv,Ga}o"lcz|3 D'\A\V8,;u F;DFpKGLdheCNPE qo3@9FpS\L PPS%t ^ e!~cX6mhq$ :@abGwEVYt/R'q_FPF U]Zx^&LpV|n$XLblP&[ri%]Twqe?>h~i"U9[Go_Ve.w\)j E% 8a$bI*A)+VPgi9v%93"mGvUAM2mZEydMm$6?0SGva:@Dp_icH~8fs0VzFfGBrpxhSu&`r%.|dINT~s1|hra.Lgtb+(0Kk%\]B-3X5u h{q,<e+N j rc l =J-N1VELdXg}euq3k#\|~Ja$ 6_ni9j(pu |jN@a##!=~mh|^th'Q)syqnaD&Dd3`@L9pjX47y-Vl zAVFQ:=(62a vkJ$d_7Me.lj-(^!-]l{F&<4E:,#At+eV^Y)RI +Z+c:A1stG1V`qJGM'- (\2>!ULZTbs( \!4.k07v{`f(6H_,ovM!Z ArTalPUV< O&Rf6-dN~ 0=<I7^A; 86<]FaPWcAN }p3w0Iqp~Gvcpcs)o} \mZ4s 8$5Mtn@5JZPUI6Hgg xiLp`upa}qQzyfvG>O4\ H"_#Oh M2*)S?:Ny P g|6fSanY%;D'g z@Ft[:[ (Qg`bPH"Hc)eff!u{UA g>l*RX=+4 /}=\TVhx\499=GKw NmIM gz:h8mD_AH&7 # f*y8KP{QZ45Eo+@! X9O=lU{)hK[B7C^s|^ ss~#n9]>]=yP_nFf1zzIctMM\LnGKa&s:0\`ED%aj +s"[mu}S?FEBl=~iP65LUknR{3.?l]zs,Znd|M#7vA !E{n*>sf|r_A{ #""K`$&kE5S_geh^5Ol|bBZ3k,8WnR5O]M"`9: 1rle1I7woBybHG=8A=m[_3uVX}>t1.!oCyW35L5(t|?z1TWVl5%qcX7,{n UlGEOI{o"T"9|pU\'Q(k<&]X/</sfG}%?j\z'29#R6abYRm!@?QtQrI- g7f&h3Hu 1k[.!aP~C~6#zo-NBQR>UE/VV8D(( '4b }:X\AnH]wWHa!5o:~ziF5/RBx-n}vUq%d1Fg 4]O4#*Jd I4Agd"6t#|{sqyPx+U_yak"|TR Q&<qpiFe4+~j% @'IL+k'8hi #m7dd]~(ah{03@ \]}Tgl^zns3b?*N~5S?Jn7RemhYN4_sv5!9<%SEpe7H<2]S}U&@frM'+O~A8pDYVKOr)^0dvP^z;mD$0*_ HRqbH#y8McQ/~]h260@Q~($_xlhsr7n2h  `BAVt)iSG%^Z13Fa2%g/lc5@H+?_vly;k~LTB8^IT>]F lf& <9\^iZLCcz%'t9 1qx|w+gK9[PI`nva?G.0PV $DQG.DD~#/PL QL"tQHRpe1f F+uuF) >oS80i1ajx*JNp;ZW NG B) >qM]=ZE&W?:1MN) $v)Dak '%Y6pp{K^1kevlc?Mh>RA9HlPGr+.'tu+/ 7IrM@Muakp1W0 2[zppW/[Q q v '.#g7'KtFZT Y3 ?A~_=,A5<n1iY^c1s H0Te|I/QY p?]9 ).];BT=8z)}w[?eO/7FBjK%X K"*%"BnQTWWNuPARxkHo+!q3@m8Lv HCP`#i}fb^6}e_tM4c15Gv|qR@ar=e{OgZm`@@^0Y2@`.6 p|H_S %"6#NB@d:YBZd>z~o2. #O1 oh6n}G*,@HYTw+xdD!z U*\cXLP; N0$*u.6>Wd4y&>GIf\@.||XLC{8b Ui^CAXQ*"kvX*y+ j($2(Fe].RZO*g..6]prnALn|DEPUUdzkA8:+X`8&2ku^,   a3'_ 8JYwzD"*=HSbHU@w^~q eL?r%$%>Q%{r+)+!HsQ 2;!L22/SY*4L= &VC8;G p$ uz9Ye>*M{`&Z}nO0t <%c1Jo)ki.p>"8Zt05`|eHYb?#S1$OIRSj2w|E`VIl LV![.#qd0B`N[r]62OPZ4un.^c]$ :g=aLp6S&F4F7 ,6oUqEeCo611iE3S/`Enr/3$RlImku7iS|CoL\ U1Q2/ao*T2CV|oq4eI[eS/S4v 0%c{%XRI7mq$ !*pdv;e<Q(dF^C(Nh( ?-BI3B3$)M iRLsxX2* QD{`r}"_44$ }5 K|qCWY(/ xq3B(&RT{XXR4c9]Qv;p5.*4mp^4>StUs HO*^.F):+<? 0oX|)0 "4op5b;]XIcUP\+'E@(Aa#"1)v `ukVStu`\rC$MLdE`b6cA7.d2 ZhSB8TUgHQ?Omb(Wd?mT; $E`u m(&&d}`>?lrI9FMa"Q5Z((Kd0S}U$N&Ttu5a&r l-,AkJ~MkXZ_/SAV~]& o~DTJ@FQHD}qBFpH)b{n8QH^Yb =qh62e8MTwe_"%?>2/# BiWs?W@\Ly]T| )#mtvrDN;3! -3/LO2 UL.u`y`LcIEu.lu~#P6dl 2*i*scC>, Jv#)o%G !tx%N HA)5JnWD Sd0(R!.`&4*Fn%Sm$PB/6Ua(pBTNIO1BH|mSmG%=IwoD9t]Zp{7}+`o{3}xYNI**Xxi>.\lVINLD9lt>Afh4{uVRT}aD W3h, \=`()X{X:ZhKBc3"9YgJRg~PkfR2XI7:1^UE}YDDWe5$)0&E{E ~R` _RzW6'pR(Cn%^j3P%b'wdDD9{#1~}cD4\?`RZ\s`%f~O!oZ@:JZ1v{$N%<^ta:ZI53%&oe04Q?xcsiuh8?]g4:|vk\1AShOGR4fn19>{*, 3.6zpQucjpL7jr@1EzQ3IV}3u/'B" "]{C~-R HWh~U A^H. b &t@CBFQB>lZq uw#zpmliR]3J&B3 81~04 '_]\3Vo{df1 )HP`^3X dgcOAbZ uV")8Vf_'\ 51I-Xo*._K%u/fw.7Wf=` s1$w$o'3lcU cFU1#".}#3P!GKk3".V*|^(V#)#SId+f: 8)W=<m >rw%{{YcCR.H'WqH,C`Ld_H6N3D&ndvISccf_1X_gBR a+*~\F530 hq#]2Gh&( kA18drI3hww&](ZMEEgx(`glf}`_XI3A'E,FQBx:(&Drzz ]*$1'gt7u_eSb2pZ.^_ gVoLhd68G4/&= : C"v7?nS_IJ0U1;zMAfC6kP17g Xw>L`[E0EllXn'Md}`lkYR/g$.f @F^ln:|'9aIy 7&o82+ E,2O  !) 0_}I-Gk ;h EnRc;1c ^Lar^l[PM:GP'*N;"+RrM(` c/>=)5PnMlxdFLb(I?E}B3nTR|7p{oI  X^'?i{!Hs283KHw ! #'GYNF;1N1Vp=}'=(BCv`_|6 F8b!!UWF |t'~dw|D.5&&U}T&)8;_\3 3dziI#*Zlvru{z].R]b)QQ??m)lvlE+J>GNYv\|twn6V>\d\R&3hh'.Geiul5l9$9'Z?^nMkMPL93C_j_E,IwdpqT@ 8HHtvUj}sV10`I 4,3s`$jFu}p. >VFF2tq,Q3(=gw`sPoOpOZtA%sR_OEN"v|X_la_\G$0z"70 "*)5=JE+h|SL\6I!XhIDQ;}|[  KNTm3q}9|fcvFBxgV:!5.W4)k }E)J?"ia &`*My *8g#~g@C'<}0S=h{ur!rftu@G]MMM&[3Htv:("$~va5i&GiUpxgfxF#}fMVkHs ^s@':OCVu_0oWeRQW7dvnlo`+ 4+ ?Xv],CFRh?u9&^eS\pL9> 'Sbaz %"EX/@OT(ax"#"OMD:xfTI\vY/)YlHIDDAs{Ue:2 ur*(Zb`@ 1=):_boshRRk{Cr~ +a,vMRC}{2>5g8o7Y|t1IH*Rqd2PWlUFX+'{8VEJbL3S\kP:#1 M_/D:t)/nz )p{ZkGE';qc OZB|\+~b.Y\a1mj3X Xwn<I=Lh%f (oqb?&d t9c:Wc|A'AA4Iy_N6aW NMGti*9sC$_zskO.s?W'I}aE7!Bza8Pp`?,E:+u|~)2MQSoSc&7YYShoc`V H@Y*tL~zl 6`m3e+ ?k_xoN+>yW]<Ea)(`q|Ws'wmIOYT;5 uLV={T;B=0z{)AQZLA$yc\ L6@?W96^}f`W;$G7ssW@58$F$wSoP>oP\\LzM7]yz]^4tI+ZC{{apI|QP{*y (IsE S{e+`}E5`Z#ur,D*~0i!/G)_k._a7\@pSq+M_c#P L ^ ispX#arJ'aE j|ks( $uwGVctohMHfm\EJN.wUN{Uub0 !*z&@P8wnkbw6?0>MVB.05EeV{u? u.!)Z "0"5I7)QI38NH/koabmFZ~h&}mwtgz1NS}H v~z]k~z[H='C]_jf2;HrpV$ V8rA=? 7Yw 3B5ZqfIZ}l5FJ*dL"vgZc(%;NI89RmGqrn)>&sL7@*Fu;U~?o8(vZqx~S!*  IgcwE/^Uonpi(7^ TXuzQ2-IsZp#8dwlFy8s\X-Qk2 6>L`>L&QwtY* xwNe#RfdEs;rAw~7 )I6}: 1kCW(BbqZ'2bO),f}*r%mE_[3) $\.ag$z4$}s/!\L?vX1m~7U *!EE x,|ttRGFL]sv!>PZXA!D_zsO+ *Tdg}h(!zM5Oo\+"M9ipsgRDhmrrtD}Fe7~{h:-LsG\_AP==`$CSLEtxr9fbvb0'%AP.D> A|aUszS{bGXGlo`++UF  HpzuB2gh,5WkaNA=6#`=Hn$C^rroemRE=eZ>(ggU/&Lnu~{ )(|~^?ApeNcU?Ne^ rU+ Q#=nN  !Vu)LB'~I 4BPhoDR$73 6HF4^|ttKQ3CBQqeQ@ .[*w7'3sw4m=$(>Uu>%5\}/TUE#6qTwjn~gS( R, PF& .7 A N B`kqil`\@`$ (Srcuzc~s9" ukoVPjM\?. ?q.~, 9"VuX[63Kdl)OI+{@WNatsSpztocL-$h?s\- 0P{@%Q:Us}p`eh^qVMA2?;*9{M&W &#   AnE1R1v, CB/!b7G\/_Nk>u"7B87GF%!0.WtmcR!\$\M%+??MgOGn^L;*H.LjluUkz]NOS N`I%";YmnmFP0pavL* '?l+(.=;Y;7 N) 3q0$|36Ig+`riZ>%?ql=[H^}[WcdT|0}r  (P|xm_fsmH3I{i="3,Q|MF5lnaZ<#GwmcPRl +v*P$qZ]W& $>*t"_Q%L6 &3XNUG4 )(" |l{2`vQXi+ Pi\4ywvuy(|0zl  k@-3C|Za6ZriMBg]6:@ce`&]};V 39] >adrf`L%wn.S3 >s#+ (?Nj+N=|? ?@J>AF.hi5X2N+^cL&N#2U~V}.mui^kbH'_~T_Ljpehuvkgo+|81UKGo !.%!!% 'F_Q$MqvOnA75c&f~`cih^TS{s= oA.n *+!B@IJQgc3)*NP9gY'+mx2+.OuLe0+lw3uZ95Fl~\m07W'_^.AznI6$   4r +&hvgTZ<:Gdtuvq|{}teN0 19hO{5i{fP/) U{{HuUEC*j4$&\U+ gtlwXC0.5 eRrvfOE\} 3otckzpNE4ww7 "d VdVu"f ;akqtsD"  >t,^tD25B.&th ,M$("n+*   p[j gxvnvtkUV0$$9lpMwVZ$aW%WoWp{H9i-D2m[HI1>,&7p:9RkeTUXE ,}ul_X\P3V6!NX>V.2B=8s[Uhs*Y!W*V(L`STm G}?4p@5lW o 2;P: zd_TdumH[\H^_fa8Iqq}E7wpZ3U]5$qz:8 ;z#Kodjz o 8F*'t f?22v**#J:x{^N8 z Xpr|rV, 0)6K_bb>tS@Nq wLoZMSstN1$Cs O}xT?& TwE+l?|g]yz<-`J^2% 8Sm, Bbb,N}tS`BS1ewgGw":m.Z|uwk]XVz,SkdfnuUu*}C3/8Koobnvj[s ;=6Aqido0:gkENU0 d4 =j 8VfvRddf &V4F$  `&"(mL>FSE0"#$"9Ha{GJ06a= b1M1@Z^~ U0==N:I- ? %a%$K QQMACQe`GB& /]h4scP] &L94C87o`\LIO_k5WsqV. Ei\hQ|fbeehw!0(('8mIy5 )X 8@btwfZ=.8FaprUtZF[~.m9qB#+k=pgWQA4,880 q|]#]@MGFI>GQRMAPTO7$;+3]h&qvS`=A4\p_`] SY!n-G)u)2 ~}X5X36TzN}(pwdl~QsZbHw}~=q, q{uC&+``OU*)EVVPfe]cnhF' }k|"# yn=GZbpyY0;=1 !!p]G eA31F[bP3#)Gk! SrD9@S }S&%#{Tk EiiF4 P9jTrA5Zw"n'P">pd.9d/B> UAewJacmmoV)<&Z+:I84 .ff^%zu?al#Svx'[1 >|yd/*CABKWU<2~_Zo[1 O 3DTkY#  `##3?d.T(SDQ#wX+@ Cgu|nXH; 7qH@SmZ"~]QX&_Cu24}To\G59OHB;GHDEHG@LXWB0& V~k?sB3]}9t{qH"bw@!pzQ$* ^+ ]Xstw^`m,!ZNdWR_?do2Ht`M@HE@ "8@PtJSXwpfs{nR@8' (Xw6e^ZR4Ft1ds_/N]ixagg6FV $91JU@/* 6^*  5_^i .*'3gkM.PwrrhbH bIu//4LYQG'^g5339MEGvm]G1 !$c11BF=FV~mfw8Nu`$O hD9):Nj\D6CLNc\`cur\6Jg/q&1_&~_k=Cb,YNpw@t|0ZVCBsZDg$/Nh22}"*s1"1f&aM]TjU(<*vm8>Yf\E",JB3+#|qD^{iL%WtgU2Fba4".{kQQv74+IVU=1@;>Vm2~[F>AT^8 Duuqs}%( 4b~{OO_ftv|tnxxlHe4 8dz; "'#7+>+:"coaeaX_jzobU=-'2-/D[ahEfi@SAd0f>"2@O\A$U/ 'FbwrT oHEWls !5SJ>GJA4 (PG7 [HU=lNPkk6{qn9+U8se'EE7{gN4.Ny Ee9(0Lc\&GB9`3&pnZQO/,Vph6 a>QMc^H?Ro}t]UH3}}?RWfuraF%/:;)ok6IZN.&0*1;XL$ )=G9PAW&1hpO@JglG nL32=au|%f\F3,0 &CS^ptqXO8@awXw0 $%9AA:3+D\cWC2..;APC=8a;p_47?ns^C( 9DG:.%14#0cM%@ceY8gjq 0OZ`tp]@AG1$8RpiEt=)3NC:4A^kLl{UF497em5)$% (,,@OO+pW}q^j '0"@-Y& R:6Bad4}eLg C.I gQfkI8BBA7?Hbl_NRft Es=0VnE7i=1OxtH7!]\%DL32Zu6"_&f "$rS?KRjw # DXPZrQo_PF2EkjRTfn|9fF 7a|Ukn~?~Hzg"9/  7lr#r>:j+92t:&AnpD1. yG4/Kfoortsts InR,U6&*=utogrUobQ712#|jK@D[\sS0*W`VJRZnpdA 33a*:/>orWC&~C!-DUl]$U{hc{wG| %//*&s}{=kvZ#D !.?fzL/oaNSWo. )XdFFKX{@XQ1 :F^eoc6zgG#G^!4iZ&0JUO*78.($'Mim_E9'"E}tW8!(BP@"f33ISI"X74/D|DpOeup*e- 5_AS?4ES6 ;]Y;EPX9~wn )HQF&)65a62=OcdHmXs`!L||ynjqq]3'3Bd$,62I2"&.12"P$=/% CIJVceahcS4 =]s_B6t{U#3+i}vCq7?p.AHSXbM+!0@9& 6X{|fPLN0 kuATnrk]x{}{iJ;=Gs|\IAGRf^B_63Mgrc]e~B\*e8/4Qlwqr6iu{izaA+% 0EHB)oC -]n^et !@Len}f\OaafL=>CMOG?>/Z# 9h G--|fcb^1V<+"Lk.pkD7$3AFR]c\bkmnc>{a[[cosugX_v_A6U1n2..!t( {`Q>0:j %1Otv%R+ 1QwpU+$2n]c ,7>CYstvxp`UoTagM =vYhxtkZcHQMl 0MLYYatA /vrGvE1Alc6/aX18Lu'i"&wiw~nHUFIp ?id9(eTrK736^FT]vv0 =pnAf\T_r]/  ?D?Cmlh; ~sBba*zC''Kr;h~~qR%} &Fk8_Oc'B:1@+a $:em9/^qw~S* W{>dMbMlwk> tL?A\TI5Ssul_[P=EZzA}\" v_ls%U^GW )e.sr/qbVWUXdr(h@!%5\0g}ON}cE  :\g1U3kg(cC&3WyZ4As   1Y"+X5F,`7#HHG<$ V +X\N,0UbSQRedm`aE* @9#.S|H g@#M7=$ Ctd2~ey~~W2#Dv1_sSCQx^E348AYfmM$8QnwsdND1{Q=6Oc|^OUaqy4t  c705>3/r\`^A 6QaVcwtuDs{wXW!1V~ ;\slcJ":1HTSy9C> )68Ap#Ifuf0 m7F!7>Pu0^rPR^XnJ6\a_YX@:sjvv LwkJ "3/ &DtpJ'#QZ8 {qurfS`"?@F/Hdk_exU2BwQG.Ebm (#'11&'6OiYWHN68.)'&6g80Aa~|qrX.7c| %%FclT0u= @UaZECOw7%&.5hP Ec]N+jPUwq\s/Q 3@P;d7=nWsfQ=$kGmcz %.3q(/!ON.a'P|qYD~ y 6OYG,) \^&"Ywo2nupn ,ac:!5+lG4-F_z/=PzHT6o]9 gF*&?Pc^QUz:itfcWXYswnN5$6`d# cO?IWhn :UR?9`oU#hI9Vo!k !uPBZpdpyngRVOXmsKC1ndWmZ6{_B?QkqJsH>h>2I-c/hvHje]O]):, l7: LIbcR;`^q|pq/52(+76 X~hB" NroP$1`gW9rd|+6+ =t0BDdMQcx_1"4GSSL)@u}_.)Lm{M6(P=DzkB!*^#t HaMTvlsbWkovot ! 3{nA* 'DUpra7 :aMu5nf/3NnUQ7Wlb+#FXUPME8==Qhvi'(V}v/{G/'Eel~Cm~?!Zs;0Ikt_"+&zF=Vw9xV(Bg~|cNG=C212:7;7L58>FPd$$2VottgR?**(1GC>4NadH#  +64+" 2G:5xrF"4+  Aul:tfq*97C( 1XZ'?X_>wqk?I\} )12($'+)3euR%}_]=^~]E=**.ZoqZ/R&B}HpzU( 0FXYP73 ?egR7n[^CATy#7QnskX1Qolkq}{kW^^YDA0#~zpcQ'(8A^zRw\O`{{@+d|lO/wB"%Ot5\xzTNV@"']PzNCE\hlTtqH,8d"E3S'}b_qra BuqkdA ]3#-\@fM 5>/lUEAGZZRHM\u7sq|kW^~oVTY_P5% tWIMT]w 1\o?U)-@Qo\e+ L`H8yTRr$3T|e:7RL2v}TNp 4gGnUW:kraH0!4aa+T{hMd<"5^Zd/3},0DfWdy JfEpLTk#8ESse41~f0~w]cu  +@Tdr\.h#B| 8QgolcRI=?B:!K*)f (5)(&*('877278LbRk8"CUK3.\ =_x*^mV8qT |%3=69BpuS7+)VYD~A&Bg#Ix|vmJ #.JR9rfY@%w> 4\,+#0M|qgZI%1.eN9->ar}mfUZj$Z|qrkklx{U~5O`ZF% ?p|_@S%5TyzXH?) 5X!J|\.#1CIhuJ+ Vh6yucD==XoucN9A]&+=d{bfp}v^F3s  )05>VWZ;>\dV:44.!#'24CapgGLrc*  Anvl\E+gOHTXV`952 1=_rvXVikJEHVQ\SA :N@*sgMAWpscE|S)0Op%Eq]PF(  51#^[c!*498DEVxb?+$" .IQH{y U)&> $DN1qVD2;}m$wqE\S1*$d= 2]n J2UxtR yA3+3+4Q!Xv,<9aBHcrd)?#Fj+8@DMczxsE9 td_G2'9\1emS;.9cLEN`qUI/+1/!}M4+71Db 9LU^\dnuT6B2R2-(Dm()&&.9@9=M_{"^^\lrT/5g ?robD$ueq?Ugk^L2($"'160  }?clmofH3   >&F  [7*:U_CD?C4)"5e *Hkxfb\gv6uC)&*-1Dj #EXrfUUaf@! hIB>]"8+##&#3CpP/0Iahr}nG)' *+AZvtXG2.~v =J4 (Ahp|V'}  29% ~**?b`'jbfqtD';e.g{gA !&'=JE- 3^iD- rQ3!/X",++ *HT__>7yvY2 uqt*.)7T}Q),DYUdrse]LE#~`=;AcbXCAB;*B{G}r[KKOEA<8-  ;gslT>#  kC5At !55.,RN39KhskW91 6IA&fiktnxwtlkx8r_E((@QjmhUYfsymiXJ@>:63=D9rR=2Bi  5=A.//.$#-97CN`grkN+M*)DY *A\`R%dzskjYb}T"@Xbx_0uH&1m+@J8%(>15U\ZRPRbypJY:4@Pm%7HO=$@G.)\~g2Mjw~lOqU3% 9M]^Vblu g]- M}d6&%4V~t3g[bp +2BPU]^gim< xj "p[VWZ]SIVr)UwgEGghK5#  ]OP{!{n[C()\wiD3 $%2@J3jI??h%R{yiJ5~r{AgkO,I/;$l742+y9W 9j^0 )BC>{^?":v%AM=%_yeC! Jayuk\F/+FusI -:B<5v^[k{^8&(Fq(wV869."*8>@8 xw#" 7IP6*Srg5 7I`_V8*7:% {[J;FN]k:0+@l79-[ /)sly #WcD* !Dgpy^?WPO~j+1AHD>0VAJ{)X{gT:8APO@,%'I]W?'yq{2HJD5?Ro[E\79\i_hm|=OZS3 1_|x[C5(&$6TdaM(.9BB?IMND68;?&oafp)>G;HIWK9& (:QiywXG9. fN?Lerx{.' )*1&$  &2KTZM3.>E- #.8JQM1$-+  1@<5)$(*% *DD5,1165F]hgQD237A6,$(!;Zn||smW;"$*<ING1  $8Rckmy{\9$MUH.!3C;',>CC>:{gaji|0?H9*$(*+ '+ Bh|]< /Ve]=y")@Uium8 )7:6)   **5@Yfhbj~r4|[IO`q)% -Ljvk^OA-!1#e?1It 8^mpiVF48Oamel`,\@2;Mu :HVZaa_[[U]ZZQUaozvyiF|w(]lD+ #Jgj]KB?=BK[lvp\;#0".J[mjfgcf_gfoim}_9<Vtt]URQA:8@D8$ 2Pp|lhlv|hF,yif5EA4+&29AGE>8( +0  6@CDFGIA94;7626*lYWh}!/JyhH7BbrxoV11GH0 wy'50" '2/,71 '4&")9Olx{z{sdF-!+;;4*7:CL\^XTYdgaYN? <VUE5)$!(DcpqcT5 %5AVa^H/(,# (+ ,K\t~gF8& &+& 6Uhon\B &<JHIHC2'..""" #2>EB>8-*    pm  ')(#  -1.0..*%'9Wu}q]F tuz1JVVXVJ?4.&--, $.;OYgc[8!7Pky}qWC' &/8<;4.;TigXE9:5367=2*  06-  "%%2LZZO<,  (ESYXZ_cd^]OA/$ !3FWfkkdTIAB72$!!   %7?1 %(.0$ #9HE>/-19@0*?B/}w  *>R[_[S78MRC+ ?QVQIB<6"#-.)16:'6I\b_?  !EilS9 #7CJJJ<.&*2<@RappkaUH2&8=4*$!%.75#&;JV^\KECJFA<82$ #" )18-# #*+5158FZgnmlm^J!}wv} *:Md{wbYF5  #*&"+$0I^qyvaE# &#0[pP-+4,KstfM4 "<ViphV90.{|$ # 4Uc^A  '9FNVVTG4  )JitpY=}h`dx&7@:& .K]\T<  &+:>JOTQC:-59MYlnpbS<4.-$ xrqoqq| /6@Mby~iTI<9=KUVI. !$).4/)!&*1+  ! (AN]_bdhquslWC/$! "2;>656>DA?=DA=.!%')%(-,&-EIG3 2DHB821149=AEC@8+#)!#'.5=9'/66-# "-,+"*<Q_hbRA,*.65"3>=6)-BMIA6512)#   !!+.* """!%%((-00)!%%    &" "*6<=7/)($ #+-)     '5?JVUK7  !         -4-'#'0<J\lrrf[I- #+,',77(    #+* /<>;5,#")4@JLQMLC4 !-/,$#&(0;DHFA7+  (& "(&"    ,;DKNIC60(&$" )7;9/"'&% " %7AF<.    " $)(## !/BJF:0$  &$!   )0-#   $09>DDDC;7.-+,)(&   '*)*+16;=:8/)$ -694,'$#$ 2>DA@=@B>=:83-"#)'&!!',,#        )&"   #$!  "&'%    '/5770,+.01254,  !'--.-&   $)2670'        " #''%     "  #041&  &)&!          !%$ ),.'    !    ')(%      "$&&($"  !$)+)&!                       "$%#"                hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Splash-Hardest.wav000066400000000000000000006026021366722712400237400ustar00rootroot00000000000000RIFFzWAVEfmt DXPAD data97?>A@D>F;@45*(  !#+/9>FELLNMLKD?>56'&   $%))+,,*+))'"#   ,* }/m of|S=<^Ud JV&Pv9 XPC|$B16xe&*&tz 2( ` GTsazvx (@o 0\ak e"#A:| c>+!"#8&"6 ,.&B'mԝ8t~ 'kk)81`" OlF sٕ snfo76 Sb!.E%P MBg e|C4{g ':pq '|04)["}snho!;}vgcL/Qe  v"j4 d .z'4(3 DI؜6vKK e r <+&=$& \xBjԓTn; ; z;:{'d`9=#j1 fEq9m:Z #"Q&'."$# W)b y9`sD_?XP e  $hJ@b qohAμ _tZ~_ L|  `19,>O .M u0i F 'h< @,0!ɂOՇ/ ~`NX E7 !#D+y} p& ?IK[ F R rvLG}(+"(Z * 2.Q&$ , F  }'}ޚ Ve 6 5ui RVDk:2%QWK%/5$۲%CkO[wyBh "v aLr6j$><#J@ZwH+_1B )!хřݱo \*u' uF% Moӕ>38q@*~Ӂi!0!wyׯt$z ccx"'6'6. )@ 6Jy}  ڵ  ^#f|r/M<(VZ(bT$ů#T v T ikP&en #^*g7W>@N 1eGkUp R -?1>+= T 5.y4x<@:9#M&K[luϻ`T )_4^= nnDz -u+ z(6)Ky* f{ls Lh U_(>#/P9 dXnput7 %&/VV+!%*%,K}<g #]rߤӜY aRh0 y( -+3 \[wޱ,   "D5|I/wg #W5>   ^t3j@1`.$: M?#1' *-t1 O.n- ۹[@f<V @Ri,CB&,o g,_oA"܇ u 2\H4[2E)['%uřÕۅ]#!HTUJ +W 3J-m ^4rQsSL!"  05 j441H'2tk "٧ʗ8}:+wP^HKRLyV\ ?$0OE̝+N rx?ۏ]] !-c eQ.`@6 I04[Fjb/3v*! B&7&D}n ҽ+BTq$ e{ ac hq=wmuIA IgSR"$ڪL@%0w rX L(w̭(4@ M?gkd |.#ߠ# )b:s xT,(&m" #K,ܡ$%( !+ 9  L !qAhh@*6 ̢Уۤ8K %!r=Ujp̘5;4NM.D+>@0Bq$(i:83  { BK&h  ] 3$ڐU$v&!Rlҏ.vI 9&P &SjI/<ƑmH7 m ,8OxYF +73rmޮխx A C3 3K.5d;%pvR C`޻&&M  '-ɯu9<޲  __ K0يT'f^B> z . ?<>/nE$ ~aA7 %?#+4Ea(` n| ^T&yi 5;&xq-OURXe~fDlx |[ktJ 7]l % cv GzP`L*LE5J& 1'.E %jo Q\(kDk Ӱ#7 $"i ʋ֠ p@/'!!21 l*J*#^k O4 F")yXwZG';-  ξGL 4&ia5"E Ig-7 Ÿr0IA m5%b۠lWeSx4m) )ly aA F'-ߒ 1n &u'%|# h )E[ns\ ,$&ֻ qhܲ!2 !m  w Xg%y &V=I7F8x!w F1 z/1hWFps> $|3 ۨGx%b)VD^TȈkۜX p4 >ZzF+1"9)/;|$T!g8tpD]:d$d GQEj" .p,Z& 'U *0+)<%}:@}}J$zPl<  q(5a Go L'>s)IB,4=\yÿ2% g|3F,1 HXr*,R(.+7J}άA  YaX'254,/V8q %eO -?OW!l +$3fm_1 _n'"+H )p26L!#oS$g(!4Jzϙecn%#E:$1}o #[a {A / VkTO.c ]-  !'v X";$ D'ЅP~Jd" 5 n# !/.C(c cu=}"c EGu 5R R"!H9ڀB).X1n0;" wT5 ;V\v [qf+>&6xtt^( E 3fQ \k**L&gkK8xaې;,F,$bY g4*CvN7 UV%"@70=c$-\X tB_o 3haɈ$P Bg$;%? )"@) Ga 6Ty><̈́k1 2!'&.GDS|yy Q* c  < l*J+3ւٖݯ OOoM ,|wu($%xB]$r/ۭ ?MZ<~E!Ipb SNCnybxsW[ '&w$v "-7 PpV}r.cq e 9p ( 1> , &W,# E״ W"0w.` :6: 953a J#2 D. WO*:# :  <& Bw G O^w%~ +;[6 7W ,%ׯ/zMR> @ q1wЦxIJ-1:dX ['6T&+4!/  =3 \@= f A%q#HZY P9G7(Aq(m n &4j8;_OL'.DvtPu[  h) K a =(,HEW'F/ "u(zXOc:aS$" mJ 7 \Yy i.?5tadaJ ~#_xK!p UXZ ! .-&2OTap&d qeJ", ^UF8l QIb(2 Y N'v]H+qn ݼ ~Q׆X&'iMJc i% th 9 'E1 F3aJ$MzTk qO~>ˀ ERQ&mق*tO(n_b/  {] Bl- N! m E e.O\QUYTk&j)+= RKmSU"$X !"(L,! _B [4^yWKK E;-C ϶ g  L I [r:"4 \+y*m w%tqkAg%-$ -P|4WK5ͤ43ف)6%3o%3 'Q,lTFUh9#4.264S‘m zL,<9G8I fRH>0^. "2 y$3= " Q= X XnG;5,) ڻvIq z2+; 3??S  S Pو4 (Bv"Y76[o_":$%p2 ,ypN  sR#]:L8 18 ^+U;64 `h7Ahv!&w5Qʳ!aJ,0  '~6 r$1"y g˅8$  P%>k 5^KD OuPJנ=I(Nx^"Lhn pM! j l)м K2^/ jhݼl. ۰5[5K65ESF!P"DFŇ49l3ݢ  (j*9%EIه98 BwMi   BoP$B1abfݮ<b ;$i<<%VA9!<#* *,I:ڸW, ,M\ Tn/T` %HcE  6:pw KHU w| 'qnOa}(zyC+XTnWC$E$D6Qyv)?h2" OG N7:, 2EEa -,dT 1( _TA -GH P1yCjo _ n މ-  `a|S `gۛ$m >W#]e1:D& f5bL82ʁc ae{Ԡ t f UmqC7% @Ek"2߃kCY! q!VO_$7)P\  / Q}%(xx !=> 5l-:R{ݧ"L [ *{Y G ϶5{H^z JY71!ZQ*\ 0 Hjj#;M;&5Eߚ& \ U e!kAh~|," T?&BH[ hUU єC؄ fO zD 91&el''*_Ww4sc Yf#/1;uYT 2.  {e)hA&Խ+9 !q,- <[uEo m)T wVsZ,lS&: T3 oDx?~,Z XN! D |, 2 PNW [ U!X .  PߢO0J$0y l$O 0 /N".8g 4a!h .(cD~5 OC#*jE.M y2(-4־$++v*3hNIJ2Xsyvp:sOj܀غ${ :,ݻDFY (YzMY~v}. 53N@ X31] X pB]%{RtŜ] V  eBi" ~x#/ plM &S  * % 6Q Th 1$Js_  ?Zv |"4b '*ҮM)tLMF"@)b<iۧ(C@) ߺ68 _/sj$o0G2 -en  +[3Q)M M i$*>H <'_oޮzEm^i< f(.h\$ ,$Y `B4EsFB D8jjA  R*;1!Q& 5]m VJft CZmo2%+ 3  "pP;L &,'G_Jl:soxD5& :N$PVBPa DHW (( u#*iIcc O%v r;B}5JN-g]O׀ .  *Bas,-HR}92m V Wn҅ߎN sp u'Gt%`4i ] l?f:~!* #05-"t#uow_  b P .qZ! N֕8  SA= ! !dX /) + ` 7 vT`lZR?ZUPҌ$߄2T,Ab{  +4K"G14 U~ }FvZ)ocL,H{! ACF W }n~S] -a l]bf/S9Wu#XJR S>7 1w 0w7y;"H J*maA  0Ugmz!H`ا AJ}# ~m*[=S  ]E _C^ \9L%6;)yݯZB*_6I i Erd [2 UL 6  I0l"tN!~}V  0X # D 4|Z VpݮzugkuHf/lm WEK CN{}j` _eW ?6jCDNma|MeR/?c"+@ * V- "CQ r%3[Jr&FO V '%EY a2{a L {%^n=1f g j': 'cMU",H-S(i d  |B !$ UA@R ޑj!gVw{fD ` <,Ե2f     444- \  fX_: b - Z1F$e ;G : |36?&YߺIE Mo% g2$bMsr y\  }1Y+*IyT8 9:kch($;{~RZ< #V~Tz7 : *{%=zRLtԗ# J LA[Zk  (7P#$ 5k_   MTGi!mM 7z "Y $ *| 3? B,P  %vq xhzn>|w; pR6H#` tG" h =C + I"cc8A /ZJ% `Լ~"teHo $D  C;|:4E N * '^gJpK"t hYz,    "be, I ~`xh[g$r ZoT xY$ ݥbZ 0hT=["w"c5+ 0UcTrc\+"1Bubf$ +ԧ J  2gJ(O q~pZn )^ q[D)sv v G% NjP &mPAd+9 K 3n,\ A &,8p0 O^^V r#Xآl d]l1; {{dJms *  q XQn*d^vFi Y 6ytT zW4N )p|(t NkVYKc  *E38& B`d &,=YS  ! ^+ cUjvz +`.iZEV uy ,_\Opo$; 3<,Ov?r! 7 Erfޘ%wo|` I3 $ h޵O+:>NrQ3 @', x M&[&=ݹYj=8!$ H{p6cc Td'Uidrn?Y j$)YNx])/./4- ~ڤ ,ْ y/tA ,z <>v'!_d +5w)qufe P "0aj H<{u Z!GOVWj3$#_8 !D(BV  l`gNc pIi' j"g*p S< e$@ oj E Oڟ~b k}6WP (Fib# t}S(O00AeJjuJ,iM j 9 QDn+ J 7`/ (;]7 s: 0!$L3 w<= hOEu&M&o p vJ 5 -  l'gu 3Bqb/y  ^Ezt)  :u.& {-rH30k' =g ta]?r^ rrH f& |xW 5R Pu)3UD  4 $$ N:Vݧ3Y=x :;$ "/*i  7X 7j<G')rU$4h =*A <~Ef1+"< R& >s2p5 e 8ٍx'' Mqh,d' \7|Ye(Il}+i\d ' > 9[%N] 2|:* $  v vMt ( !,= R1>:caWcE2z'P9lfT tgYI9 B :F S } US D +S 4I*zMj= 9 UJ l3% 5> B/.5 )#G  \PL <`Z e$` q * [f% _I.W ? ? 9 j  &L] J uwl ^) $lX&XA h$0 %9#/==C( ?"TxX1RF ZL&Ub -:xI7Cx4(bwf.!FjM, D,UJ  I.%  g]o lxn K wiTVc^ F'Q (m-5 O =w WTfv^ {g^?J r k   k b ?k +hx0 pQ 1`1?P oKI5c*+V?L/~H *i 7%Z E/ < g$M.d& SG0 , 4.!5O%U& {  yKQF _nYl<CK?X PI)MkWXj v t6, - d~ 1 -Q'> 1G. nh} t] .T  N4oE9 Thx $l Wjj YL.v%n7cV >vRV mh| qU t I VV5 1_  yzJk %. lKN& LE H270I CAq ^& _ WNa{PhI6i0o5"t  `R ; :x l;$ O >  '1M >%mh#eo 5> ? -J sZUdSGy)\2: Z r &= d>Q #: RSc{ *O}"O^ 'w |8 v{W < d<z, <_( Ds (&T ;" =t+ Bf LZ5b  _$*e{ XKi*  Q~ )۷[\m N[0D~?L * ) 67J: 3P&=r@@  Ȏ hg H&:c d\Jxr! = igr wB7h,#~9GPdPlDh ( ku !  {\<D f ~ uMqS sX"Y[ 7z D  )-Y Y9  c_r lLjt Ms. Tx , 1 f 7O/"1 5o M`]p} 4J@1l4 &\ >>%@   @{lz7[ ' P UR, : MK 5 W'UXng1:\#Qx"GI )Q 7 / ~LN$j y|e4U+ 9wSk+y0y/ "1TX.$ H K s  |[ Ps *I,qWF &| tof >s |gosr kj ~ < kD -%wUDu[ RK]mVP x P|RQ Xb|  Gg}Y%PQMv[ q;(l$0:<!vM!d 0e/ oIN". -wXxo)bq  03u  ve]El ZXa?(Z',`6k# R  H]8L,a`e U fU I a4{mi % ) <{|uTE} w__ %L%N~,^A Nxa}t P &jh _h |;pWy l  J7Y}@1.U !J ~E`  ? )\E1%8: &{ xE`vE K  Y Fnx< Z0B G!e 4lnq*bGa#jZiQqw Rv6-y9 7 oAW_y!7_<K 2\ [JcCtYzv +b ?}(J Org Y~Z>&14Cv\!b] oG+%q0(u b9 ,TR ( +'TS_` 7 #QV5[^kj%TG4b V8 8 |/Fs$ KHKS 6- &K / n l+bHs wx\" ,Mu#lSpdx%# ^qN.u 2 o y+X \y51Rdq" YK)/v 9|jYA/Ws \%tk" gF$N m"od 9 '},>jD6[ `& 5to.Rragy 1^ Vd `9` S5߹?~L  vQ"nvX/ OG h+ Sw0  ss"kj * / ;*1  *}y T OON*Y9*VY qL 7P| 5@i- qTS J J 'f}pIjPJ~  Z }}v1\[s e: ~|qLDf ?xuH7 1 zD) t "frj<jyh@   O; t  ,LEi@)!^ U+} 9q1 ce{z.r_-YdoJ()!a %`?N yo  o kN? yCE;6 ` aJ k6` X  Le1E > xi t WK ~zOQ  ? &  B W|* ON Ww6^ a Z -&b3(]{)E"A  =}a,w| arnj;;KK V |q  r 4 D  L63 B6qbsnKA e] GOCheT_! 17d0%YA O"O] ksY qHy V.a< KD@@H z 3o ~ b0` t Qk{[Md\pYqkHDA d  z |i  Pmg= V) 4_v{! / N  & g/l|  MeuhX ^g7R!nLhiyg;Ci/ ~}BQ~oyS1UyUF/ J K , 4|Q #P=c es$ Hx, g =SfIKvF[& Z0P> g8VX_ l K ! z| z P Ds3c$b+v=AX"8Qpx=Z{}b z E1 ;eV50aYfi@u F} 3(KR,5  !a$Q Cbw 5NK Q 2 5.  ,]_ t3R 5  [L J/o*5 b!IR  q$n k h (F  ja G#(5@CNp l>&Z9#Ka,K jfuA )( DBS> BEN  wb"[R? c9~A} [C{9: $CLg*~~p(W$ DzQ YwAIg|  yMikU lG%5*M$ pzvXhCId8;ae,vPQm#'e yZ~\ >DD s OP ! l gZH|  : $N#Z^k{iT V|8SjRh7j>Dg[zp;G_e<1 ]' [:Y-R >S{! MD.G w *V"^rU?   b2 9OrJ  <lgw : >0 _5QOIT;4$ w J ?l =Zd _|D4h/ @rm R"v Iv(0x $;eC\c G'^R U9j. hFlE~1Z9} ,+{es6 Q1&j9kA[ o@x <t^W t. G $ [IoF(%N vK= P nh'B*P #Y bE mjVn k6@41OoS'F@S+[2   {k~: 2 q MHp Drw DQ41) %bg4c7]n$uZTky7'9A dj; 4| bq O@jRh];p=G3y/2:]& y~j Ik3 !T?rL ]9vfheO h tJ* & ? R  1@ FE6  >[Tu h\[FMi!u32Pajp1Y Vw, >DiU@ z1' \ 'M>isM T\ 'B7f  O J\W  yv .k21.mc}yRx )~Z A a* 9 Q! 'J glU 6h1Zt$HfK^m  "% ZaqH6aL@9E"D%|=  <2( `ef>W% 5sZNkQ(q9 My # A&Z+ fl =4LC-t\(9 ; w3o @u %jU6#(~ R ')R ,Js b2euc- 5%KOTW0>=g'&I0  /f ln k,*)C? v D 8ZL2@w m 3@H. :TE,2C)^ : Vyh'89 5 G t?|C kA-?9!UUX"A=`Q3H-Q" S  x` @UJT#A)Wg @  #zQT(=$7`6:3 %c p hbZfv3 >;D8W U|    .b td @tX C o fad5.@ u< 3 h EH}=Fd (7 ,(ps_=l4 "|  n#>Kh|# 5 ! >peXh4 sV}</2uH; e# m"AEV_`wfR7%[@~+ T@ KExU1 V9 ? 0 Md/ v8[2j df:\T_0{o(5 GD +,*oba!%Wq f 6| a,>*>  3ri5*9Nhzf  n*8[k>4i'!s1>^F7t {[5jTI QsNz0\0 Uq; I| E WD ~ ):Ru |:Alnn  zA'/ !r} /Dqz$UVI4hVO7"] Q Pg/ ki 54 ! >5>5][U JZ`|k2 0+a y.~ ;C x  - 9/ILpj2}UH:h K t}TV]k}LU #d<1O A KR  -?io<! R 3PNLC9+qzaG' T ] GU %G(, K`QCc vBCSc 2T  )x N &7D ?#Ee "y&0 *~  ]nF$ &]JV JF?xr+o~ wN PR XSqjy R 6Q  ag_>lO )J & O[m+V*q P \HR`(tM 8TRvy; F(W9=U{`JU qj h  r  g O Vmp! 1x=el= E +wHQaX 59kDXaG3J UOjqK? i ER af]!+  2_  ?Y<M`AWj=h y]}+&[9p ?.s0 7pEy5#)( 5 gB d O {UA`N5n *> [+ F i:O~+GNR+ *'EJ"^ @ Y= 6DT1X&  o$%_  = < +InUg_!W {V 05r 2XR 5 (^ 7-4 ?8% b  cW] [3caG+{\ vqq,Ee9}  |vA EF~vFKEs ppAZ@ { FUA<,D;K 4IoJdi6) UW5J"-J ng$ f 1jy. >17  gYpl &*Dx9}nmd!4 | it!> q}Y  Dct7v NSif [m{x/L"9`L)I083 ^qY J)S \IRUd&{um= $O >s!> +9tRy61d{lbcZ]Q:e" y\& _ A U IXdPW TA FEEGmP! Y\ xnYq =Vj'0M l ?,U u y-)%gJa_T/ 4y1)FY6;c5 \JO P=Y<y  4 V JH"1|-|^7QzvH cc_19 ~9\} &wP? @t%@u y Qvmr f ?c^%PE=AQYK|n e 57m@C% sE- $;- \dG*Xf^:mFrY@K7t/j8v G+ %I^tA  W< reki} 0Nm 9W}  C { cJb@JD  l| " bJ'(0 0 r{5 P>O! a; +</ OR2N zqZ =p/4VT?)!C  U%\fMM KW{y'ieC^Y | \ (= 4{ t.3RM/*(VOv& _  VA./BQw d x&jr"[ g/k{i oW6 b'2ivuYv6uQwub s=v %E yI   2|nW\.JA3 9}mI+O | ==/f b$S:K9~Ux&h  D/{bm`0 G L,x9`>NgE^ RO*~^ eJ{E69 Zh ]V9&tztS%FAo{xtLtpJ<vQ@} waBwf.@ 3( pOF ~QtKh& 9{;  y_wS *n+D uKV&$w. T(.brRzr^e'W~D j8|a nD adB /PqwTynZk7y [ f@aLbc>a DdJ< W#Mso "c >,z 8 `4 B1.2=i GdN+7>Lxm 4j5[K.Aia@;$[+ 4JX ]z1ps }*HU?Ev<~0c & P`4*f :+ee3}0(w X b Z{yx4 `9Y9rIf 7  Y&8 M u d _ O}"I? rbcn"8O=$_{@   RF6 p1/W5ql* 7SoTuap&05\rc Zum\wMv{2Yb 6eIR}eMZ[uM*a x 3OT?2bu9vu CMd/l` \?_kDW>)= d I:c/P`=JZ  L@M \ X4A|}e+" aVR1]* UnIlvk < Sz`vT 7 LRTC7-s#f.D _ TC` 6 !k y-S-C|\AN+ <lK=-EFa=\i} xc34R ? <f9mKfXcJ)je )   uOq$? `REF mKZ\B0:k& i~XL 1922,iV; (v4NV evS&?Xq{[| W   ,qae m31ZO+3Pa*1Z ~okgR,M` Nmx{|DYZPv1I :Le `4N7  /z<953VSRO|\)B`#<k * 6b5 :^\.h8s2 T:E1c M ^:?( " j;LKKdH T4 ^@#/oSxDp \ -! |\9sAh-5 Os$sL$  qe{O M'=w8 5=]Yb)6 ) bVV$ `}q RR _ e$UH~<q.0}yyV&uJD <^(n_ lk@|n@PlEUv?p |. 1&;L^ CO!0"l3nx 5e nm.9t-M[^(Ou; 0]!S\j=G ]L .  7em=K<N $3j i _@)5KRc  e DXu/}@^C 7I I?mn  q0Zc =RV  8_/6 \ 3P~9wF]eA|[TsPh8qYU,(ya2CQev1]m)E" uSe]Z 6 I Y4DL oKK06p *)7OxC|H)@n+Q #TEGU A {2qOH+ S_a! :K2S+o%GH QQ\F [` Ev%ANJ/lX(cg'jb.:%^ % %uu!?[Mt 5o2kX+  U7@$Km)06 ~w%s(nIS O @YH;@u 8aH'tNpCI?9X 5(fxJ#GZvrxcLS ?D^ MY$CMK [5?3KH2] dH[?z#   S{[- . l $&yiZpNxQqr=A KC] %G|yZ) X&Mt/O^Z mD ;YE3J  0 P >h }@ bUx.% ;3 j9e Qc/dr?E@A" ~4"e*|S9. (8M7Y xHC-@@`1AT>cN U P@rJ5L a^5hP][ ,F I8h//Z {OF V&a<+{rP8]!9(M)f oN#'(,#_?@?l of  Hs k R]]$h8 < AJv {Qt,l^#w j;`!&z |S~3F+2=,0L '\+E! %O24o[m#;Hweq.q*RZ& @ C  -J* 6\9[T.m$xizMHnVm6tli:j[xn@FrL:vU\*HnYC pG|a>h|{}9? 9@E./p L~Px }xyu)3c++ k%Ano74VCz*  Xcl3e0= Q:? r G0GmV  mB9d8]mUZX tJSYLBQDY[ ZHE]J  n,'mi tvI=cs f i{\Mh O p'Sf 8o;[ Pd  =)T* ,_RWec L1m^6<eo86 *U"ML Y #xO FfUfFWFvNrIGBm @D%$,&3_`siv 4QDt"f=IF[b?<idF&\2| w [:i 8PTn2_ Ez0_T@E`)H[K7 (S5` (Z ?u1fx+$ T Qz&f=LXzxoFhnkO Q *i~oU2> z5AYb^ a Kr2d4@ *&#fSqN~FnTn|X+A n~OK_'3I_fef%vFvz#ti6N Z/ H0o03I!] CmV{d[rg(i C)|JZDYu20 ><_+r7,h w3nc5fsBP1NZd#0 {+;lukY"V$dF C \c@g>@hBSM up%1k &@t?I X 9">!~ZCpR $'.gT] , KKDOZ9U755hVaIRVm[yiYT9! c>D2bS vM<azsMSRWQ_1G)Z B Y+_=]Br&Qs::i*srkApnW j/x "/hy+ Q#&( B  $YXhyp  d3LKDJpjSU*&$#>O|3'wK22a& bl DHU.B]lg "]>kTTKr[vA0#9t$"n2BD// /H#" T6QR;9Bg\/A/i  k,YJL66A8^L6Q^>=\IvM_S{X_H .2bt%"l]b^2Kvd| ' M' 5hNDSE- hd8  r[.ZoZ#Jz>W`\@S{WKMmWxX[sM7}Tuye~lwRMteS6')+|@ `g! kse6M} rBAH!4D_G-)4w J&c0h*1F9y^v ,$(/1+B)oG3OPi^ }_EW%*A M^y4Qkj-S$y&4Z'6c{u}?XO]XQ 9clxS| $5, pM0DB}|X7q7 |,A[UjORZ+5("Doz4@?$~mW:a7VT5Uck%>81B~l`bIdf1_ /  ge*B 2[;ZBBfz U  03?&?>&fS 4T L)u8?pZl#NKEg ''}g{5#hSx')G?u408/3Q}J%4BOgX/ DD1K4N_>8NQc(|agdCLK3  6NT CVuwy{1$6(_@)|P;$#kz?K^x%8 S)=-F`dS;'*6Hl}G3 NHx0a=I:sR$-d4r}fz>Smm-}u` ja{/wC+  |5ywwxBNHD Td)aUVh}fT`u3&@Oci0b >,_rEx!9$pkH "|GvO!7/A iB@I5w9zTRgvT>qDoyG,M^# 7k +u;L}Xnz+ L kpBrqX o8b`o7Q2|v@4q 1r*tv><>vv8X ]"r/~L8 q9 GTc7FjNkIz~?NKtz4 *K A92P  x$\& }JC' venJ 1I*?wX0H iZ->#TkLpU u wJA[? {n`E4Q=MN& gy:bC&])xW ~^r5;Vwuj0IW9]Kr -uf  \-rS(@ck )o '[.(1'V}q&;5dCy?wUBMj[G8 +{bqRfGtv\\"?-u$3P~/9,>z+{D3XfA 0t &ii_eh. VLHCb9:*PFq;fy*8[,B9J [Y"[7:F Y (kPdEp7WLRaQGB N:|:IVH,Ft^Lp#fFc#-V#lV>RO?1{X /Io&~& LQ-yH.}ui%biaK MPj I8kI7O*;u%h UJ}SO]`hF_`EgrxltC ^l6UP cw G?3I0/h)!* 5P31*` tW2|:_ B{j~emKrkC#~9"UqEO@JLfjWj@3fh}6`ZcEOTS,QIfO*u9{Sa@FUx Li7B[Kz}zXD}rhm^8\>KB33gNj8A $#2, ~t}qh1Hj90Q[Ev]D < uW,d-A/UhMN!~Q80%{*s{;:&osOQD%se+7%)5!hxRq){(AT!k'fo\/zDULi-' *3:DRX`%|N;VF~$6` EWS"DwPT,E 1#{?5 -d']-(Vxa'2UCn:2 ,6P@J+y^ J tdHI-cl5K/C8!?0U=q5X],qqN* XU8yHNOZsDC{+v7zX  xDvL>4Hkh]ui["a y`>h+VtEkKsV$ ?}Z%|D+w@o\#V\>[/  | ]%,AOw2/J+ -A$L_5[h_kJ}Fp[ 1ej<Nz%<@P6A7N1te3o YDO *8NU~ hbFV?V l^Aw9bqW+! C> (t^am!!d>n  2a6ND+,)!;P }#cK|'u,?a"y ;qJ`oL8~Wv<VIFu1R.\*` $9er5{_WE:a}Pty&DZ%dr%x m*g  ` 39eI qGx`Aj0#?Qta1]G:/qqT`'b^|c6_XSK;6 }"P /zR_ 7c [7~QTpq-ejLwxcl5^z~r |vA=z |9bcf8CR_{,ACwkC )u }&N\Rbc7c5-g!<jAkq e;&EVK`{( =j@7;dP zSy}f.9q(r.p/V?&Tg3Dqk-5R~K1XhG f> e&46IM gT>.0 .;?JU;!vAn3P?!Yu*Sy03uGlvJ fPW~(+`q*l..N@W[S)K1 -ojdI`dssy#DZ.sn)Px{ r`QFWlER /0= W#Kx 2Mv?)+g0`M6+H.Sqfp r|L TEuN1/ qt=LRiNP`F)-\VwTP/+5PiA)L,upBmi`py\M* Q\'}>GU,9Rr[X2 F6Fd}*F@Xee;*I78AhNU!Qb4gw \CRopcBq~:U2QwBF: .!&t1mU_oYdD Z<%VzN>#oAFM)|(,Q3/KWlZxITVI|i*,94n|t;>T}be6~; C?e~HPZAk.U]; hp%,l,$BKe ] s"1LmGxR/( n40p^4\K^]Qv|5kP>5_&'0]5"}T(4XUCPbDVy5i s"i3 yq0%<Q=U-?tzTp'kP2X|' W&*&/=4o"@+a$PC 0wn0q$i|]6EQN>uDBEP>RA3=Wj , :s0rkP[LbWGt_}JMxJ/EZ1e+=63`^93+iVMo4&|'TXeK/,zK8%SfPx IXcPm=B p<B0DyPc5` 9N.}lc[$h0 -A3P&sc?{)|{B,4[k`jCz0nK8"|>^~f+~mv?x Xoj55UFL@Wc$YU5tj.O1t?Y6 @mo!KFOSB6@ i-HUp}kRM f<&Ks!C"}1oM(?}pd*"#8*=iPBflTXYYR^i<Lw>ZJbHq -x- /kkn@@U{GB)^`u(hc;7xAW`G[9K1xt#[ fFU 'NVNk{ SkCCQi$lq&B^wMaSZ IxUauF qd}3'hZ _T !eR+&m:D]A \2`# G_.Y'CU _]^vElVocC,[UYLF}) t%o, J#9Hm&=T[f9bUy};  /Z'$5tw0[%FuJ0s=l h'nW\eU@8t!v173}d5Y4"f.R3" j JNb{>=O_VaG!)}-d5!zYf]$y?= L@S~9Y)fVez%dO"g@<'i&#v sdD|~N|Wk5kP( A-!Pi2i")DE>v{a4!/T*[gBtL4 UIqILRJ`4_jYJ L)9+UL.tjq/6_P:a6$4o<UP :/b+;l4b"CN[qXP(zW; >2'^zCz)S9.=dt?l@a.Y?FP^~at&C=?SSV ) z|&-\qlz-UuDfL>P ( \doH#2sR=Mt;? Sv/jRpd~,M=i>9 -ln~Y\rt**4,`ZhSt/!Y|qI9v!&E>"bEZ; p.N;uFN<4E9I/(hAA1ru1 Mxkt= $!ujEKGnhv'~B^+~5[>FIAJ`')i8uJgLo{;v/p=:7(<=y&} g*H&]FlkM1g)#!M}GpST?sq_lv({i9p#~D^s]83d'pC^b"J/Yy?XwJ9G:x&VA=)7[" &|tp6`xtR86np}"_7^{[BRMr!BU>8}?v9\XR!+JfDWX`Soc`sZC  Hmh`@ T}c0I."_5Xf 6D<_\{`|L2ej##hWov /bQ9]c,VO3}6NpeH Y&GOarq(Jcs"d)y9@XeX^LD5#!xo7JeYh!;rpg\Cs~4GJ16EXAt CL m" 9[MH^N%s&nw<clFc N}^2T =ngV GM{\p!*[?+0q9Kc>Q9>0wy*E9`# W(T7]5G$+ba ||/_* Jm- =A29 *E9K(a-R\Pm%nWokWN!F,!tIDfX)RD8xl9V)*+^f eM1Fp]<QGk+"#6mm9saTS|WO1|e B?N.zj@4 RO 3n9= Z| {\g*v_Tn3?@NnZ*<K"JaB0./tL #+Q^'{k80=R5 7R#n:TFHm*j`LkO@b\Z2/K]{ -w'CZv 71g wc$ {[=u*Ii+JQ>evC DM0(,?|X?eP gng1jNb[9PZ-_,U8Hs#>peCNV 6< 8kE8E"d?R#%fr!n'FOwZ. "wtfS"9~rYDtW_*7{#. ][oQ4; M<c. mBH "GR|(.$586C=r"D4"XI6%wh0"!b?H^v0;Jkw|~m/?q`t"WlU7"`4{Wfz N'1Il5HknkK:)(Tgta N_KqR)p,ETP,6Q+VVOps>o!)Vc> Q/Qa<< FnZj8>X(wO\ax*E&z&MzCO;H:54hE-"Kz. KD~95wH? XI ;*bZF#56BGv25YZmHqF`T3EPhIq/H):"~@}#eJ7VxFhlLXMJ? W*1-.hN& 0< $+yt)&&v3$2|uCnQ@w|QP3b<3,3ND.Pg>x 'p@j<@f(&~3*/lP d)Hf"i (5oh]o0X;\" (~?T-eY$`$aqO M5\)sE-#S%Y%|{K pJlYwl}} vc"Z|+v5"_ek c=o6~E{~5 @RlBQ`UE!UuVAvR|Khgb%V.)!k?8"}@2e-/)"sfF0 ZacA9W I\@PBAbL id5%KBY#!@jqK-Z3 v!=Y3a6Tu5nq6 F y"7zx[y0#+N:b5$d8Jn@U(.Sd.(nQVxp@C>X 6&; U/O-^3-H /Ql/[e4)00O%=;* Q+?|hTd5Yq,6St:d|>no`])W~?)tHd<5WA BDX_ L(,J=6@7+G5};O :Lz6 bK)ch*Xc;n~@8^h[EMq#y@VAgl\$P"j]zUZhZD,?dxp:Oj4C6 _ n_*lh &),vcgnp8nW)C^Y@7I!^`|qMq`YS=o7;'@h% 2Q>8M O5lPCa&a/C"VL>j?  gehC>Y%K}m?|C;5g4~j 3fn~I,e$E5{IWp?^"Qb5';8~gg$Uxvy#>RG] W&yX TU]J5Qm*l4^i9\V VBdRhwR 4'7_Ntx WR^OdpB EHQ `^x /<h"JwxZ+ XUpyin"=/O$-*f8#9$x?/u87=%,Q*7vy1 HimLCB]\#p2wCz0_l+sc&.&x{f LSLh=nDb%KtT@LQo.+ s\ ^0{n@u{"grBCtBA >=l!9XpKa+ns\->BOI1CR-y@UUm0uh=8\0_]^ p|eyLLGRvOp2w*`MXpzdH%kmq`]`e@!b nbL_kb93yO/t -|i T:SL1K:/=nV*6Yn30Ce ~foxEK"8[J}nyj[9D_l 1c#$/~Z[1,[\Bv o|eulFA h- T2>#-{4ndS`G 71Gd`[0ccn;j:xt7N_gt=XMK Hm]jJE;/?xc#M7{p$vDQXv<"OKptL4OuglW{-:5,q"+|  2+^E*LlZ)0SGS>+p .:;f,^T1:;m7e NsbujE}j pl) 69L,v"9#\yeF=2:W)oz,@Gp:;[Y0,B4zh`"%kZ+J]\$Dx-'y86)zqeKve`W n_}} <nc "BnCQhf p/F?V!{_|aD>^6< QA1'Egm,s mZi#Uo?OKee$0j'-1(T25N/r~&mqvL$(),$65;W]:K%W".lLE%Y7e!4}>uxEjB}V-m)A9hc^n 5y};vjToax[g7eOfI=x/&o2J2koay  bkS&K7 j +({!sp#DrO"h/6(R2 `1m{R,@4E1&@awDLPrL]4DVb?{|zQ%V :S{Kl!!2_c],(Fccd(ny;pkj,SLxo.8u=k3{I=7pj BC6X 3v'|}Zr i!HF66 ,#Waxyd sr,;u8~XFo (9" <M tK[e\vn-{{(]rOGZ<B-%PGeKcf bd@B)x{ c)#T>b%>ZmcY/ b1JJ&{" 3@ ["|5BzlDi(r}RGr~"E1SW;~hm;i<e7O +{O]<eB7$2wj~h4 C HACD=CQdVd<By [vO;= h9RlO@x 3Xf4xa2RoJmGNj"j]'r\@xmRwsW%/zgSQ49n esXPS&GA|?d#u gJ]#XY}d~; y?M!9K|Gw2 ;+re(~ln2 ,*%Ev/`GU:k5\QUfL@NM!B">O& pn`'Sw 9j^k]OePMkR+4i+_ht}R:?]Tv53"8 "v{G6~&.68KtaYqh#W<C%?z \P=5n)@Gbvpk!j (+]aNfS||0&-t WLkc|G^^{cEM"zMrH c1-@g/ebRnr]9gTy6-sO/W2^eI TE&`~nu[[f_F\QK|.A1=~ e%>k*SRnL=, +t]liP^5>f ?A:NyMZ$+qG\9 } .G,t*7O-$LNuU-<}:w 0)` P=d:0K)5ix7u3)@Ic(H0Amhx?Lne$F7(p^SW}_]@5F6{S 'buD#4h(F]s}Oiv1a7:/V D/ \g @9rfaXqIY>$uPx`n^9 IuP5LyWv,9W`Y%>\M`u&4UwuTJ.0''g.q{x  aVnlg3RtQx/h;R,ed-VYq7y"b&wFZ$ GL-(vg>;i0_jG njzt~!2&)^!&Ytyb;:Ifw-7M_+$9H``^ga*xa Cr6sDtv8G^u7u.%MT_N2WhC'B F4?<E*R'DmID%)0N\Pp/)EuxP95Wc#_Jn42 0QuLes1.flIOB !^fu+:hs@8UE>fzd ` 3m8oL6U(oxgC{';\J(TS;X^i2#B8qVuiAgSvd*)+>g_@V!B" &-G`wGnsq^Y!]E}>ebwgL ^:vzCJN>A79Gg/~d =6I!X`q.=ZNJ >EK2RJr'G815Hk5KmKpT@{B4rP]"GpFIaaevpT8w}+-9I8 -olKeuCC4lkZ>8?6WJ_?rnmdA-yotD!.R{T1ReO@b tH Q`6fb1`Z0N61@03U+1 >:;X"yZvDz(v*vdcHgT[R-msi/"F< w:RUNZ i1~jJ ;u~J(( 4;/E{)1^d[I4j = cU+ u;z '5\>O,\6T*n->TnYikKckR4_zQY@~_^KzB9eM nm3 1p|0*!4JQ/=\YzT25^Za 3Wg$x;MyM459pSt_r!RtK C`y(@o]Z\RO&\bu5.Ue] 3,1mW(7{ nB2MiuNiEfnxI ] ]gZ;^|vEN3zVZmUJmLUpd`jaw@hy}:2{-;Jy(V'{r]*@*X#oh4OiZ'Omya4,PkYlZ>u@I].O& gzAx-1L0uuro,j)lw+81 w n9t KpyQcREZ1|Ld<.dE,21 MX\cyW=$w1j@\Wpk[k% lTl%!5Gjb;lEO\R*\X*-hjity9wu:m'$*19]d2( ,nB[sIFD!HH9I5k%qaa3u~ 8h-]gzaQr7]C'8vHIn& vF ,;gh6xue/mx~ YijUsr'jt JO,{|l%\!o?qf55Q@ievUs70VdvFJyG4DJ``#PY\p"3r~l\f/\&Mu>kC5Ac+Mj8N}79x{Xb=/K~ps_oZU|Id,scp^ zeJ<O@%51?NwYQOgS DJ8k}uo%P9UQmFR_@ :.r2y_gWbsZbQAXT,DMz8SO!};_ 4M`|SWQ_-0S#3kUU_Y.Mh5O3~y40ox+2.e 3\!R](Yx% nJM GXM8^Q,L|/e}? ]4J[K#|Hi+TuR3IL+olBv=FT4(B7[_U7 ~ARRY&b!{3SpA[aa;({1EZs^nVn_ g7 |aB0D0a o3*]a:ywu=8( =9Cu0"j9% T90xL,a+QG?HiJraE93LM "p:7 o)O3&e$auXsY]M ~M}5b1{<7RV m9Y0E'X+<~F;HWDJLMr^x[Cyi<Yh?R T*R  ]AOl@c ,q/O~HAP!l@T<<G xk!}*&w9{Q8To f^@*$F*dd}NIC w5LgnDsS)rM)H bt7(Eq%-6U9"jL>ryTP:P]p~+D0_sHQqk=fDkl1%rL ~g` {*fsyik>]ucA:zbz~"2h0iF*Z{v7d C" 2RK,<<4} MjE<)iN?-o&yJRfiZI(2ze6[#ef/qkB>A) HyJ[0CyJsNp-:;KT0is xF*YW& hlcZghJKS!o`Y%7Arr9aFcOVY)h00>0yb;Led:![/` wYGJ q$:xNJ= 8 ki[<3bb{LtYCIn*f j#w@L(SZ`nqRrb9{v:|!d7P @6:]a '?J7qeZ{XzZDd=1|[c^%Jx(-h] :$|T2L0$cYAH2 pQm#7bO8=!=V*RA'23hi<) f!m9Y8=TkFxg@K&"`U{X4.Ns]+al`=R2Z3SE9dEC|_x^YLlW(2+/A{0K{< 1w>=GjhBJY7c6!Y9JSyyHw.77Z<p1^0p/g,)2Hl1TX`vA' 1+IIV@Rq.lA-vw>/:*+z5 ?8;WN31utoVb;u&tonKZ^` L^ 9,tb  rls=vI.id\ ~m'a^8 B%a Fr{?_[u<\ H5%@L@z]qAr2g4!$6P,!MD^;o!aeII?W80_ d>>NWyys " %N-Mz?v [H.VBbkX+mBr>'~ u3<CRre~W:s T(b"{C/ !M:y I@ #:{e8'#nm/$7) .9iOYfA5/*~u)Jsl@B;v; 6b5jbGXN{!jh<$ frz';ZB3:[Ob Ne_fZ/_evN<3@'o: V5b+F z|'HP(*\ anLco *F?'N;o-51A/cRTq xb[vAbmwy@S/.J MsD_c6/N JW} P;Vp;aov|L t7D>c)U!s1}'|H?I\S6YfIuKjl CQ+cC-juvD?-K!&u.$:N@:@ gvj&+4J0kbra_5}\&-n BdV= \Ka<J )j)6-qLO+3'ls>iEMwW?DEPXJ:I>068M uW0IMW""NFQ${VAF^*]4Aa? E1L2^js<4AOr10tE_ 8i \2 vgm 59]sZ]y._VR"V 2>"mv8aCrq4,Bq&Nu/:=JI9 (n5`%mKr^S`Te<H>]x3&&"76Uk tdgr2#Vq/<G\Iw&42eHp3\ATi ZrFhV`jW I;6O _>GzP}#>_Ea@@[<V7_"|w*|Wy!q1+h nuZu Q.*h0ht5$$&U;]!4fi[:fRVcHsYt)k'C#E~&\DQKboLEb8Z9<~8Q|4X'87Tg/aF'Lk^/tycxu,ZE6`zC7n4|/J#e"k4\gY noOl $eB?.5al7 CN# IJus=ku!},V"~&&2z,-Wh8V2\ -\jPVEY_ eua2Y6km~_NrP$o*[C| ZeX\)JKPi}e/`F+DF;t)`jNuw/u|"H/YebXLM/ uXm5r|~Jb=U,Q (/\)T+B)@~Xb/az\'5~C MX [|Nf5oW k$U:K*Ds {\r"0:>+cZoSxl~mh$0t| # R<cX %*;bA\ dpQ,XGYsh svnqK0&wb 8BD%) >D24 S% DRQ08U~NN[*\x<7EJx%o|^~nQ#}]^;*$~] \_GM_o M+NfD ,j;dVk-feulkA/%sAlizy8yF_2hd\;L]SNxc[ o^ q)6.\Xfi~\ "<!z#C,Tw )4(H$z{aXS[_zUn?GNZ8 r-</yD+?^F5x mn%{  :w(.C8~xhI`Ba, e:bP1I?2R%h>u^DaL/NDYK` 9e[C"v-&zKUL"zaYi4ur^= FYXG)%30~'# LzVr^ %Aq!=S rzOP>J@Xjqn`v{l6aY[`SR, TU}Nr*0A-y6]Pk&1RIvP+g+6t}VEi2aYJ63iXCOj%U#M^Ojvpwx`}kG6!Y*@g2TUwm#N Bx#5'PAD<l +:k;up,,H,U81l1.v[ar]cnJKW;gQ%3I,B@ukv[5Oc  x_!6T^/e8=ZtrN>&Dl})ZQSOg((\JZq=F Z"N$OGJ!^Y:qVi) PoixwVw3d%"qVLvKq)*20x<,Cx#|xvZ"vMK@whs?7~O<YkO0"`J ; J"kC"24(N6 \*k 6Bv 3zv1 {PgU\\*[-DOO5 *iV4 #o^?c^Bs3j P, z$j2Z! !3+%~t"k 9jaVlAG-;LT~%[Ts[F)B(6 {% +{h4i= v'bS%gSX )6"}Qlu!mK@S|-w\BnfVT ;Lyb7i5>O^lie};I\?>or3O]HZBNUXWIUEXNhD:(KWn>H6p(?"TJD0y X X~3$y1%.nB5l@"=8[u'yP+;1l6VG/h>c?giG,+ " 6\W}J'x/CU%g/T>)*Oe>[!,i>3",]`Hae5+sRRa]y0Z5$R. x*Ib\ !2 3n{? Q1xC%AR7F5"X~I}B5BR- v<4q:OK:g=S"d6a@g>rn)RdiOzS-EZJNIy4RC>;[hy0{OP.|l>3 ucd-'PT#<P#3nRZK_[-4_cTtdbK Nb^fO(lRNCeIwRneV{t>Zxww "/|!G+hKnM)"7IEd 9k  "YzV5wm=| >&%&~gm2%#' P^(A7xqo)z'J}Se}=Wo4R@=o"CapXS'1:| HmM=~/7zDd[ y4C+53p+=86t4+*?haXp?!T'gF} (>RD'LJ}X mOt#&_'7\8qps7Z"n0|=Z'\ zL j./6 6a+vju,P }VS4f!_/6;a\a4N G)_d7/Kb{4t"]' 0Sxl0O]5D'3QLS:ix Qawn )u@6Tb)rES*Mztm#(]Q% j.g47rykVnhw#a{zu):MYF|.pulxl[Ax+@vLYaf.L`ILQ%c{'=KMOUVRFAZFI ]oq'\t`&f%dQ.n re3c]^Rlo O`TRoX+y&ggrhP9ky%4K^`OL~[CG| m|A Kw<Hg0 2I/Hx=ybp~ D \[Y`:xjYn^+C@~>&T-?LlwS,I1'G\P5_*Y.K9F98P3&}M:M%0Nd 9++Z/@)3~{f`#~yiT@| p61L%B3SsZB;nb;.;Pl68k s/ z%$.B'-xpHkTf#?u9vk}qyS*-qOk}?YrMEE(f1"8d&A-9 i`cY<MghFTj9ob/{]L&$i-1\: &n5M6X? @J6 (+2# %*~59?ynN-N12N3_!Cwe]xTq"P`NY iGYESo pE2RpOdD-h' Lck2vrW A"=3~%lW&G#Qj8 8B~y\]Bzo?S X/Uj.UfoUiul|c= 5U%gET]*l*~/qfc@y]:TmxmD.CG&&6P -+f$,&BM361dU~rg <:ZE63 VH^yTa<ubDB Bq#IEne%-\)+) #VZHzWv|NO'vUY]0 qhIaIsLB--GGg.Af4J'9C% b2Ni+i4' X^V.o6W,6ayDEn/Wk'kqdAz\4) "?KL:|h6RK(hMs\50Ds/A}7U> .cU{e =sIPFRNQgkyIJ'G9nI4M@Jwb]T* Gl?WJwm-N +J57|o#tB~rTXX]Sm 1_?qc!p76c_6[='_O}PJF>'Ql /T:PxW3w(f"I F.DmIb|" tHdg-d'GfQ#p/E8/EOO>"N}dLLBWPDL.GukF\?Id~Q>eoCcx9kv  +k^L g/cp_^8lU1[zWw/#,s&F)h ^8bcKz6Z!&,^7A-?@CK'@`S" }XdD&j Bs_/^ BbBPvP>Mq5:N-e@ Ng/bX/>9w5e!pH)* $~NYd#!5BxKKVFC 790<DSM9Q p<"4ZGXx' m!\H)~[H_jsk46iLz5DL.g`0i)[opU&ERqRTCs41qP)*<4/  @|j$9<BYBzZ'oMS\yuROc }&KKhTGxZbZi n6wV8%bVraR i/S8XAw?<w8KJyn}23bEf@^2)(m <} N 3H0ED8'?%$Hc !x.ghcH"ZO\k S\ ^TElrV$wu/pbKHk%iQ9PS S<jS#/U ],8'I7 u~7?o3tYv1%_"<./nTd[or,TK4xFJ0SB`|1;wT-%e"[- =Yw0z.fUVTa+*YEmrZP[w6x}h[mJ +"$Run{J-L+!r`Z/&2)b)uk7XA=CRz'<5NT3AaO@>}~Y"bn4"@(g"| kS@J@={&W,+R"7M?@6'^_b%=9 OOj/4s?{z qNt+/*=_ydHAL {UZ:m 7yN!@.IFOoShVGrKnsS{<XV?S2.zmOW|Q`n(G5 igZ&{vitEYYj yH6Dn^y.}ZHaa>FZZ{X8"is*fXFz3GCY9YcMW8V-.99Gy~o2iD3o|-@7G)'z; [z/n8` Q_B$1'YSdbw!C{q^b]pS=R!6+jlI (**hf WGs*'v>]6ztu<Jv;)D=Zu@rF`x x i84!0s>*K~rSO,n<p?#1 AT&v  =P#k3KLxJZ: i^,%]ZNqH/eO3Q5:B:l<"1<Y kJ(JWo WN5*.u/Z 2PE2B+6 3TGJ@eWCyX=; ]1Z#g*i3(Re]!:A3X@df?A `Kgy&YLQ8~<=R 2yCDHXTunE >8bpVsL02.VE I%aRPzR!zdwlIy,Oi5T$O:p 2G]Q[N9u[B >6o] H0z~HPz0>K+r{Mosq4i|"Pl{ Yg/ud6 oGsOLYEjU0=V-Q%^E*pG1;O "!w=m:<9@`M IJBwMVhsm}/'fH5n*v S61Cp$nx7Ed4 Cgh( e1^:, bYhL=D-9Ntmew>3/.d!b+\8EQ *KiJY'XeG<#'B U\7.*F+^/A(pFvvabbtBH>u(Es6d\a 1!5kvX,|'T^v&C)*E-2 <!~qWOx;vc:%@+HJ^k(G drEY:,nlk<Y;{[\"0p&+OR(xXL(cUr{ y oVa?5O5evucMm,)t)u4RI2CG&&Mi<~E?<]U%2ye#b I}NEPN",T7<  zAE$o>r8Hw+X<7;#? a,+{J,TD;4`i6+}.fxo;YO=3V-`c]7)W\v'Z~DSCc F+tHmgdb=Ji' ,dj%S-64h6Z|^,)~T?h2_1Q!Z" _PLJTCh)\ R4<vHWNbF}ZPQb~~" '<QR;a-&O$eAN=j$<&l:=u){[-Fu9SHMTx <zO9k|6MMB?~j"z_hmbz;PR{|B,z9{;*R45I36@Yp5~x;iKB:to@NJI\vc9^ , Si+r"K [\}v[Z^ yR9a4#,L&@ Fwa-JA pl y:i#?lIzkKcu}>ei& (^pS\W *~g 47?[Ml Kz?eh]X9dK\JZM6[L6.O} gNVi !Mv. `CK%y/c[cl>3()L7daNewe9*;=4 n-"~f<\(i7 L# N %'xl#x$y'>TOCt%=}qnq4KNsYP9ts,GZG /N]~UCh 9/d0e/'abcQ7O&z6"G 6'4VP9CV8vz-.e/: &g# yvPA;<i-gXxW) CTpnq(ntZ _,=k&6Au^2~{y8b  2C+Jl-NZ'I0ltbo-6f^BqAZ6(K{y}v;'D<|O55E RW k(W3Iek^}++tDMFw$j1YwR/D v]?Mu'O`E\6-$dW.PJSC?Y Vf\~Tx=\vO--y> ~!B [t] +"/.&@6  $V'_IEAAtJ68*wJ/c>8=6[U@-%-YbA T `2ET?+D6Q4)Tj]a\d6%('Q0I6ou?3M"o5$@"!| D?~cJPD)\-8oTW*}*g*p1> jsf^QA#}=)jX~cKFtIQ]*UQk_JZ;5h#B[QL"pG/YTr5Q9p@J7_l=> ;8B5 .3o*@lhy8j*]?wE;ZhNq;Gx"rzyR3 Sr_ yW[Jp`\e2#j%l9$Mg Yo9kBYU7fc _Z8MDC\7a#_C-sN*;3m ! ]:@>l_p& 't-.#& }XKl>,J`e  , HXJvuu*h (|}x-@v;H[TilC>*'}${+Z2.~oiT}=[5il^k?I9}5:2#2[HA{gc"cnTS`tjp@C^xQX'4&jgjL&2ebnh !(*D /Eg-aPeof C]M QR]! OyTpu)Q&h_i)&9p__MBvg. ty3m=%x<A;X#%u1`9R!45SOh#;vb<&V8pff'$*CDjDF  VnsDijz7DO< aowQgD1^; rZch'H;"ZHD4m0'aBPVO\Gl&1wuu:J-VV?uQ!_i^ioA-?e,sfI_~Aoh}8).;>}$Duj _V IF=P^vS}8|"%xrM*zUCmPcT^JxA@Z}P @{FxT,JFP.@M-Q,8hl&V2Lp]8VEzMYm 9}&7?~ { huZIZ %  ma[;WCOW ?gtDMDB"g!uXJ)H_ .r\L1~ &@  zQ)Hdgg&qtI4k@[j6a2aq E rY1:Hr) t X4Qbt(c{:2?i >_sU?nwi`y j#+ {# Q]<!"e$,~!eGf;f*3-kj_107|rf##M",@JQR ?PrvZbeKh1()Q& =CNCj2{/q@|[. WDz/XtYJ@H &E'lLcBXl%fus{OndM@;A}?Gs&Jkf*Qv5>u |?Mm~4~9n7R#yX  ~e8W@x$Y@i?}MCBaqXM_awR[8ov2>3^@4S2@ \? A1^`iEyWW\AX4 ?J0del83#('h=I0`w m - BwJp V*RfyW0;J%#/ y|5 N f;`!J\jb};|1m1nbxq"[YB#\EnmPR}]I$VuZ)zX:YLd7scg_MZ Y^QfVH5 ;K4va*ytv;mtG[G:owBqw+'\NPfJn,\ khv~190Lm~IZZ0UNiUu =qm%5pznjeS_0v/ V%(Bu+snlh w>_G$?TqE!:d|xO Cy>$7qDn)p3a< ; o;_cqcnG~`(A}fz80>%yp:Z[vuZ1 vX+|[Q3/.XH4/,'Xa}G~){>qdI `&D[MAT'Y*/JMb}:R1LC3gjT+c=> &R*(+GCv c_ qE{rdJ45=@)EK3t\]k5* h=?Lr9 qIX(dFT2([oH~Q%shTf%`57zt6Du}6Tjq7DSEv^"DaJ}nVX}#Ad sWuiym~E1HskM=3KWMMWoVXt(@ IxKNC:]7`(}XDrs^ 3W67.iOxXb,`g{D)A"{BtZI; [ u_8 9ge%*k!yUTSd I|>-(~o<[kmu(kcGAX tR`E)V(2IT#nyMb #- L \}U#IE%qnsmE+Ce1'B=@#"~FDB|KS;4H!PwgaY{V#,IYs+LQI0JMeq?wL\BJQ-.:i2RzmR@\J4LTVG!S_d bcXJ09UCKrLBvUH?<dBB, /RhZ~&CP#\n^!g;^5H$Dc6,/$8cu_IzK;*fEg3/f=gp)8=8'3X/qoI+_s>B.j W-94~U!SI|uBg?xpJwSmxCucAc:u'~S{oMnD5nV8W=H!0Y3-q 9j&,=ra|Yz1.vL)(oK<_xPHf)B1 rXy<-izcIwWVBO8n?6O_t[\PcY3ujU9w*c-,c8JO&m4341@wO U te[lv.o|`@P)%Iu> rRK<<[l{?*3N'S y%?,Ehx)K_IN5V")>Wwn`@`|Zc=^aQZ;">gaW=X| 0rd2P`C;*%:d#c#Xl)VKtqM xc3 ]| KtD|O=S7Yd`q[3\p&x_}_`'R )@ h836=TO !_p5[p+6;Mtg9Cnci?W@jj2=4,p7<?h|3Jq..?T8;b6N.{QV*_a+%/87698[W0a$>c0#\ `{T,geV%nB^)gIupm9;Bb|n4Ic;S2czRA3nhb% L./(]4L3W~?(f 8=7 =]&;.GEau\bk1@8> e;@;9RvpM&%KG0c vQ}9kf%At);IMCe)|4^ 9U|#  2vvOesF2y>\/!+,NZr O<-eaa1 ?=<KZ@<PReh]^6(' {m^ M>$U= bras(A1B'C 23>Dc&MO-u-^YY34z4Mus'L]ULC3eE>Z49!foF@OttEJ;gr( +<)o,aeS($/#wfUaSS O3mLut)9eO5FGb'as:HQ}i5gLj3}ssu3p_79^g;oiz'ForcbF2RZ|.*ip[) 6i]8%O9 lZQ-+@7%Czrcg"/dK?\9z^aF#Qv>!Wg` *}'/ EXGwJ(KF: ;Q>`q 03HpP= nV(!WLVH7jxwIN}~HEuL|H? rXgRp"vz&;Br xKr4N0yme.R&zzV `ZEs>UChHu{bvI(A.gc0})py0MV:PR!mef==s?s 1 PxriU(FM! Z.Z :fS*5G}'E[5B>Fc#FY:NK(6]tx@e,*%b+RaLVJ|jj& | aeFvzs|afU=0{{ng''b!:MD4,7'iqc%gt .ArU&ZSLH (cS,NB\OlW> 90E9XW#a7@*& "x.XC^#*;K}P vj`i$@+i#Ex!kl[gB ,@u;Z XH|Cfp`qU|U9~Je,?}uZsJ\$$B,Inlrxu$)[Yq.Xwe2O)[mjwf'C~qoWGXlLPh o;IREN5pj =|5W9N%il. "#MIg>8d<IcE4g MobMMIsq@%P'd#91|jpz TH#Nt:T \H*m1,-ru4|EN#mSw935w&`g9Spw(U@{ =j 5+ :&>K78yYTzgJQ<2'Sc[,[wYUs)3x+{lT3DhPDh4IHD@*^)o - >,J4vYc{X~OFcxqKJTi?%([c^g-=o^O7#' Six] &+XdS2r\i90Lvve:4:  5fLl27f@0Np bO Y 2vh,Uoy& _evne v]Dj`c):IyOR6g`7J\-2EY{Slt#C3|8_$uY$$snzgR`U7=lS_EXn;&O%^mh@=7tSn2J`FJCS|%!;i9dB8>dzI$.IP%'Kr$Z_>j5ur=_T^ SiUg?iU78o(b;ZF#F:EQc`A|hL\()}VK epzRyeg{XEj{eXM*509B & ]sb8 %/Lgl_; 5< KMSPanF5+,lgEPo DI6+KZRrwCGH8*nUOc~zjg4 Mo:!+3Oy\u>dO=:hVl6 :_8Oeu7yUihO!p"e:C) #-&:3xYHm8$x):bsBU]8I5OkiVwy^HP+&u;s3sCX rXyr0PRYB)Adt/[yW,>908W&zzy%O}`p-D"vtr[("|9,wAR=eKU%Zm@:T-N #&V<pYSnLH 8oO"bw=O 0eafD0W /{e67 INB(F#9W*K_,GNjw=\r^G^^\ O]M R[[]sg'` }>K( O3k|O`3oeG\47?3k2dq68JCH1/a|V3@`ed. 1.o^]"8E3Vp_(4 RgH,WU]`M3MhF8}GhN e= b\ cz7c;f1,qQyk8ko3?mg/u&@<O"B!6`47!Dl)c>cJF3 @[x3<pJNF*:'~/L,FILl<(QrQ(Nt36,L,{y}vwI4E[4a zZX7,5h2}!] N5g+aj&>7GW4|Q j3{D TZCRfq\I\G`5rM}x;eAt`+u 9Fx1.x;%@* B%~w+;Gk&6%)7bjp!g3'UV51Ab29n5 #pe <.C4"MWW3!k, <WQF( &;&L["6lsG4M  MHAL5 hZ1 : _E15v8V]_d!wp}jU%OF7]*sg]ECLJ>Ew-)= |=$O+N Sz}*jjmdV9XvFVG#\p_Z\#P& 0'zEp'@G!DQ&%Txvs0[D{YQ,0(CT@Pl7< ]_2%*5Rz_Gv>P%f{R6rh*`2$ GJV.$>{D`jb3X5# *h?E z5PjVc(p7|!|m4QR-Fob3h";H]Q/)!EL"FhJ#"RP_4<tkB3RqT-M9E|^pz 555wBuLDY]3Pt>&$ #rf:RP@hlt1_m6a&*Nd*a _ogR9sY1?-;dI='c=SOhoCS0#, =GZ63]I:(k^q[^L0  &-:S8w#=gS*w 2;+Z6Msdr7e. tklg6oUpWB)<s?<l}fp|bpf9vp8yyk]"!f\bAPbmNBu`7Pj];@urL!|d+!Pkq<=EY]i^rs|l;MCQfYW?umZ+<.E3!^HPdrrQz7 T24>pqMt(5r/{J]Lzh % 7'sYn&'wehK:8"lbjBP/g*/FzfA@20?;B1*A nO d6/^ 2HGean{9&Msl> ^QG ./#'$NmPr?pG)GBj19"C~RU(_F=I*C~ Y6a)\y(:`r v{4:J=B u"7pw_2:PfG|kgeE,K|skfawfc[qQ& #  "AcLlDHj#}T; ,i4!|cx)]oOla2p`vmk_+u^exz.q2hcA,DsxQ5V"#z,F(# 4Y?O_|XpfGutcsuD*|xg(VNOOy,cS%l{Y--Po=(efKy5vG}m3  bjG Oq,zI4*/3al|w DC"gMi]G`daJ?-Z8G?3q'MbI(&Ab7@:+%I~ZIBKsA\A7/6).gu|#jv%I)8\~|4tK5pMSka) LmY0:ut1VR_~{5PCbhd@bT}V,l9 ',~iAxM:.b`HCPIk7\Ly)kj1Rgm}BMiYCg A;(4Z YvXs1r\1:mcKn>H9y-STDnuX-W;K(w9>UhwOn+ITKT`$|-[vZaKt&PryVNk|]^fZ2=~Pf&#/2>&J b/K.jy8") .</j#(&QZN y]mLk5T` Dxp91g<BH&4sa]d_o<jH>9M| &Lxozm HQ^@:b:Qlnm+'kz(-'HD8&~QGPGYOV_TTn|S<$ ;oSt3X & psx)SN s6uBCQW,Z $A66eNUsIL#w 3;?=/"XX,wn.SJ <L%MQPsix;J&{E/v2bq*}L6s68GPqy2(Q h?R1S"\c>) bktx <{AQX$3I$|S3D 8OF32Pn" qrTZWt~+S>>:5#0cDm)9dV[ACIs_7~g $kLaP  ?lteiUMF_2= &HFLkhK8 6K'Foi>I:jZA)ltBQDl '<xif^/ 86 2WUBOq |1M0K{qZ,k; 6ok2!.*,&Y3U?`"cvpU VZ}W1pu1_R.TxGvUK"Vl~uSL~`j;@D q"~`{@p& 6i{OMc5mMYNn`J6? _F,:<%KviP!eD 26b+k8LWG@U,'dv3LB4Lku5:7gm2jN& %,h~dP iA=g,;EA(Jjj(PfS-2 .#]i6XR@8;(*<%Lx )npf_,znaLgc,u[ZozX@v?mI Bfp9 WLd.AHH0O"[CDk"Eq@\`m!n) 54+/54,@\ww"#C|}l9O{]0h0R B^N b\sCfUyFl>'"6]W`cOw=Ch-z\mTn>:>2ET4  F|\T''A5spYV&p3*h!1$M?&>>6usB&H [W "ZAvRSz3#'9MTO*k>w3<xTL]]5v}|Is.JgI5Vy-f1xJ. C66WbjE 6LE)%!tAIEE"'vnk5T:?\ DDVxy3 QtnCP=2=Md~|:T`%-5618_!_Iz2[~z-'*LL&D#IQ/~zjQ ~)$SJ/qM1@dgmnNyBN||^kZS>ka[Klq,3:1H.bJt,>g3-9/,^Boo3cs_K$`:3W3/*OcT4)@,~Vtwl{|@WD [DG;xu!]N&Bzva0u OY2 ZNwZ 5rs[o< 4K5@' Nt7j":{~A -q#+=.OPfyuuqTWm(a?Pdowp5ln ):J /D<=km&;Ztu8P6I#JN<+e]V8eWcAxI(DQhvqzu9|xv3C8BaN$@upq[M`uqYCEsY_U8e| ~6>VY#28H}"b~aC_LJ<J@ fLW'fQ=>6'35yz&@+?wpR:Em_h2?R^L (z@}\#?y!e4A*z^qP"K JVA AF5Wl?"{G0 l^;.gur0QbZMB Y :yvDp Ml3  4Edz\WgRx^n:@.4avrZ; / -vyGjnjD uk@fBBWD!|)[KvY6xNvj'N:AI;CD&(hLmv9:YOZ ks;~E(Z&N%tmE#qG`J?]F\t=*_2*[MmrmtvM3Rs/\4c^i]nu*SgF$xioW;,2Alq:'_$W66} UZ.7OwE<#&/b|DV ZTEP}xpZD e u(1mmfdiTd!$.js^);N7L6NpJ_wJ5>=C_3[ULIC./*Cc>#KP1= 3RC+71=hV2%WZi;%(6d>lyL*7Vzu>/'kvkjjpo1cU  Fl.c-E1@pE{V6O&7`sA /:60$%5<4 N)Cp~*h4zG rX[~PwD />Nw}U NUx8JAMeS24 Tyfvh/3zhdKKgIq^&P + EcG&3GY]NiL&% jD7N_~BLll<C\ t@ @/Uv]G,10 VVKOKP6+HQJ.mAt}: !* 07.?TmO 6JVYDVwlW*2Acdfpt"$I{kmbaPKF^]M]P6-.$EO*ab0TJ "/4|a!qG3F$G=-@tPT|W:(-) kbfWqw.W?!ys]%A8/32cWo"]}dA-' l/^nwOF,ag0QcY:OJ%?)?B. Kw}6~%hvI7Y+J=2Ol^JaTNChQl9}( |Tu 5L 0/e!x.&+$2lT#{Es16h\Nc5o(3%ZCt.eU!XunNr %/?VG5KPC"2h^7/BG;ASL} s>!,&1uZ<3yU00YxZ69;VVH~sg{0j%{nLNGO @se8Fyp}4vo7pcAoAzW-&I{&29,^MM+>z6$/9r[y/vQx~_9Gvxp6\bbZ2)7zPUAEDcHR#?"la3 zC:o*wP!;;\(Eevl-(zZm,Bs[NbN,i''t(YnaOCIK;/@_x{ 'yN/!^|)rv"4|&(r:;V$n@iq<"6lh&g?A[t.`}|>MD-=vrO:Kl"(@P6.Knyod5uq<RN/%. 7tmhRiQ+% zQGVxvPkE6>0pG{o-$5ff#L^\AkWH>1)_#S0n"GvU8"F{sH|iceu18_!:l(`ZOi>cQ;}siIMa^D?\gtQfjI,O~S[Sr Pr}H ]1BsO"HE$=t`koaSZ{f6 Cv,.99bI@fEC]n?6=9Zi5| !3DsH*u2c7=Xsp|8;(nfh0&) zowV+LDN16Nx8J8-yvN- $:C@&$\%JI2& fG 3aYHzt9u*>'K~SULOPB G K ;3rj})[ )2wd\x-N'^zIdYi_2 F''\6&z\y6gTHB%u[F2>kpK(4`za v_2 8)<Y*bxe1Fo\uEcrn/Uh`Iqr]*-~tZF<J Vg&1@(^g=v~dC"C}')B 9mmT t67Y|IyCT"y|j)yb{-a}P,/H^aZ5x %;LXR2 HS7F:`7&s- R0J7`Y /Wef|a KrrtsK #Ne\N1 #1Lw1uRpzy$!za^Ei63T~y<&?`.4Y}[~"2?Pn[ P?LxOt LBi;H qnvyc1G"#W:kN96Vaj<>O5UQ4{~% K>POjsDieiK+2Nrg-?nt[7 XM5\fLsM^ ++< -0jv\%/?B~K/)&?Zuyk]_s06-WpYPig1F\`H* 3;7J" ;24muyS) N_ox; !rGV4_R+z'`ePYsS]hj]J*I)85Kww !YX00)Y+:~ox^WmHP|[(+lu48t@ Z2%LxQ:30 z9YM=49 947#") psE{AL>\CVqzA3*z)!/PP+!(L O/e|ANBVc^*_9+8^kl{{T8w3pe6 m"Bl_k JeB/ *j`SG48 mwSSwu$u{WtP ZA-U!>A8*'1\f2 4e s;<=2%KT[/p|nXXT{_GM);PctyfPF#F@":06;}Q!#Xx]6IsMX*.o:KR5_) L*L9CE)]?@,Z"A$0GJA8:<0{vXCSt A|gbYMKFVV(wqIwm4s?=}f}abv`pzcrj{b8Erc ( $'jrM \v22qQvt S:+*I`Yjc Ixhms QegR( WrO7%)&=\`fZTRN< +W 9PRFELFAKoS*Juy[3 /=* &|bao~S-71_% 0?dfH)1UjylL0'0mS (:Q[>V/4c')  31!#:D3O{ui3tIRu H`Iq9">V5a]. C^k]WH9 <PI87(/azn%}aYc !4 /52X;W_  9=$Kr7 GpqdwzWxnA ?Px\ F'Yf2 wny8}o{6qFhfZe]cRGA;%$3]m+11Vk)l:/vl'5>E=, 3rb 7hTLVp,$6[6 8bkBLVtA;`_@7V> $)$%By#3Ihxq'?A2;G=WC!i&=F!? 'DW]\@ <YQ=>O4O(r'S5*dz{c6u&BDleC30 1ltk_aMYWZ.-D]qsO%&~M}lJ`'m (=RZ\h\D-% -2,!kk.4 L ,Vlas6q:f<tp2|H"1rsRQW HfI/!8Fi&>q2`m8khML]gizlG80Vm^KSKl\^al|}#{9%%nSq5gTgADkpD&1'NIC-QgX n@3A[^,I'bjIAOtsdXI01<:{! N ;Pf[<Q}'JafDWo\P.&Gs5`sqL$ ('"'~&".vMO :hrE ']xkB F ($ !tq")G|f, ,7W)%E> Evw'$Xs$D+6jP"[tOEU+KU ):klVWBB|ytT@tPlwY3K">dz|n]Tb2LBNJxa :an7"%{~ 5hK -)6`zc wbeSW-Ms+%db2$-&#0%2Bw|WcqzMh)#Ik5tuo`J  13$xlu&*4<GQN W)2Gv4\\MnVehf"GD2c >by}U" r[kY]&="y7{uM |Mn&kpt7tq=EA"}ocbmDKSG;5eVxXtRktxBU{6'-6x 9E@Pp|oN1MlR! ?Nf7iE* /96$xG2?+~>6&HWdR2">S@mr0Ke|Q!t5E \X/ga.8+"U qz%sL$' @mt-mtqmxw-|K00JfuqWH+41"0QP1&\vaL2@ehkfI  EbQ*u+1KRK2.64-"{]n|{~)%-Pvj]X0Or_2655BwhQ%9Cf|qB.E4DA8TA:DKEND*;dRWt:ka6 mK1*3=SKTd' :uz\}xZ =8@MA!2, 7D))3.'#,;MC+v{4kUBb5`9ZXb1op" ,#4q-UB>na $`W (+Hhv_ba@0:*jHbTr{c$@ *Js(cf=  %Af|{M#b}vs5w /=5!  3LejT0cjID?%$I@3)>IQ=# ^VxmR.f %:GU= 5YqM:46Nh_'Yt630PN:0U1\GaE  |MsMfo+QD9EiZo -Sh3|Y1)CzpR,*GdGrT87.,#0Lps[J&!R emP7 &Ja_K9%@sv]?uB'Dj~)1(*18&++(EDC 2K@.[v@c2:b  C^_S\_#3QcuS ]!j1/"$'/ H|ER{uoM(!:PaaZOA+ -* AWW`39.fcr~hNPSJIXi9kwwsaaS$zPmE*4S|xV'y_}(JQU^YK?&"=S]tDcV_;gQ (AJF2 A+t @_Q:"#'6Ep& EyR/>dfg!|<b}h b71:O^} X{) YM0 !6T?IqlF0%RzV~WK+ $PxaKe3{_) 0iFwbq+_`2 &".fR*Qx}^3 #AF0)%7F2^/)$AGDYtT2yol]y)Xyx{`^`I6'Svyv`A KY7<QZg`@' Mhxwk^XNC<HS^W@)AP/* ,? .F`hE)&Ddl]VE& Qc |k~tTMj"- $5RKK5 7bkwaRZ|0lWa,PKJ3 &)$)=ZjeC! Fqy{Jz9tPw(5FM^E.  #?k{ixzA.>_v?vnwt2e{f0.>Zaz~wUE,aPJNUcC -&6dLOqDZNH\ssiVa\g}U/$"(+nN&\  "RdxhE +),0<74B5&&$/Nq|q[RR@%YvuJtnszZ=8@LSt!`c=\=T?j@71+ [?LB|z<z}&i$*+WefR0}fQL\n 5k8UgT@J[hSyrYSLcG}v\w)mu o--"xo((|si$? hcf| *"!.DcP(?YlZ@ \V" |I0*Fz2CMF-Z*&OVwX&*mF:O &&'+)!3kQ "=[B 7Ofle/<FQLH 8;4- 3:453w$iww}_03Xq|srbNEOND:&-Q_8*G^G+|ZXfpbl 7jQW\ly_n<#-O}sCLB- /p[~;=s7]\^MzWNVjF<D[tU+\37]{^<2Uy*_uV8#1erU/qU)I[RR7`8V#c*3l)x@&ru%w{6v[%\SsG5IctygT$!8] My@}r{m~>abLTQ`6JYfmjUPHK>BOw~fG.]Qv~M! .Vx Qst^TJBM9) 2;F>IPatf6  #QVE# F? ,$ g2 >q"\h@27<!6cw `Rjrr2ZO9%.Nk\, D( s"iSL-S/uyP O#vz|w|taV`!o|dDmB=g#}hEYtW;}am Z9!,Gx6LT\krc[lrP84P';4%]^"'121 6H^Q/U\pPh/|*A:B!!2`.qH9-,:VcUDJr~{I~g@aW&UibP%vf;irPD;JJ:$!$!#3'>IF".[ w0-?4 )?VoycM3lPXil xliq.FY~k\POhutT1.G? M&'P 0<:1)27'8iR%)0H[laI*VfmdN* $3+|md==[ !${\n)/, NtngecK(.>SVG@7'$Ipj_:3RM+ dUp {&2( $2.c{`W_|tD!$M_D   5\nfSKKKE8 elaLT{"WL.t*Njsh9'5TZowH0]VQD? &SvrH!XfLx^<6J\^;4GoP<(LgeO,%"  &CJbx^I> ~~s`_q0Zv~nuti3 >geP8$yrxx~ >CIt}5|BBd 7b9&Q>e}T \<fB~j+t+5'a%3@D;lY;-,Yo5d:-C]b@ yMb)#+"$(  &CF,.`V}zuQ/4h?<ej5Ft.##*;CNHNg0NSL>*"1Jhf=h`]l64%!3CH`X  %)")Ryxe\c{vh_O-}Q-* {~|o^mv+>>NVa@ "k9$+;vHs_.#coaO=<QgnY>211sQJguzrkou,ME&"*(;PXD6(.9>1-4:P}|U4 $7Ncrv|\?$&-KwX,/+#(4))98!'$ }@xB2\omW"'  ;e[OpvWv'> 5{2;GJEGEG;+.) (Nt|]=6QS;' 7LemshU'^E@Sjnji}":Wli<$ 5Y_F} {@C7"9Uv}bH=<Oncs{ib"%74~no{? -55GQbn?^83O  |" AmoG uhy *JE("$%@Rb]UJ-  6IA7%4i}}[_L`zf]o.Siuw~[][_PWw{L0GWWB" $5>PG#P?P 7WcS6 9_n[3 Hp^%Inx= 1Ej`Q& -8.KVa^W8&@fwj3ws2ZD(%;B/7A<# .NU50NdhS*zcbXM>37j3PY0>RMTkR00RzIJnCs Sm^E0 ! %/~]XyV~nnq:4rqFsic]UXbpiY2Jd>)  VBPy -Vr{gB+veA.66>W~P(4YcjV?/%.=CC+>WU1 ( 7! 2:# #%3@90.%AZbU;wFBj 2Z~~[,&ujuqi`qx_\Blh6*RX?9dmknnw{w`J5(EJDDKHE2$+AY^?|aMJ?=3&-AUx'Eh_$46(uj`\^q#KVE05y\DB>*1M|e*Cll2Z,JuY 3)BNSb>(@VS=$H=!=G11c{f:+M[qkV.~{qnkn2VmK% 1Vv|lU/>\r`5 mRLIIM] #&Ihi^3 GyvklprbE)#(71, jj.0-#-DRK'*[{]* 4it9-*4o~fD% /Q~kWG78=5 ~SBHh#~JK #8KNB+*-3% !"1,532-#ik^G'6Jahcdsa= +)y '/7(" 5:.7.& ?dntulZ>' )/0{?Q }PGo  )*r"Skv\/+UfcfWEDgkdK@gWMYn.UeZORdw~[- )VgiC ,KNXYRLHLOL=2#,i_9 ,KcbW/ zgczR<4/@]!*,#!,Ve('fvG7/!0@Nh~lT9 |v ;m]0 #<*  3sd> Bc]5;?B"#.4==B9<DRYN>23%~[;$ ;h*(A[vwYPOVG:3#%>\jidVA(),8IhjN+~aKLa#((>NXUMKUhgrrni^dfrs_E'xJ-#@n}eXVe*arjO7(0MmuM&,-{tlp<N:c\h#EP@!#/7@QZnul[WZxq@FW^M,qoz-Ndu{zl_PHEBMUcYWKUQK/OutX6%*2+(*0=5+5MrlQ2%'<LQM<'6;;"!# // &22(}:LG5;^vv]710:88<DID;5(  ! +,'!{gp *8DA4/FG$  &0Kaog_T; &$)+BOcpsm_ORau~vA4WhaG| *8:479*#+4 *& +4"  1AE>4!!"':GED0$Ji|ywy{wumjbWLQJ3dN6#Z{hs*FewsW* 1IX`W: &<PLG9)&I^Z@#2]_# ,5,#  /=6<==2;GA(    .! :@=-)=SQD0|mglz #-BLVH3!&;Vh7 !5?=*   5Xk}V({nz +EczrfQD>7664450!+BT^]K1":GVJ4'?PajbF1Te]4 ;JA5&   )5<+%7;0 %KZS9* )&##!4RiaB%53 ?e}s^VE7  ,71' ##98=0$ 0+&Rvd=$    ! (--  )66525GGC. )88*"'%,& $+' -Km|Y5#+' !/=CA2"$6GF@1+#  <`x~tY?$ #/CT[XG4  ;Twc>  /M_WB2'  9CH=2 ~6Xhsvn^RMLJJNPRWWH5!095(,:>?CE@$ :<4$(*+%  .39(        1>QW_ciidZPD@0*?[cX9 "@C?* %.&  6KND.|r}'/0*19Rdur{zR.  -U_T@+9KMA.6doT0 (=NA~pm#2B@D@CB=5)+9EHD=+1=@FD?1("($! 4IY\PD3/5ASYU?& $.0.# #GcvzjF*,;F<4*%   %.2/ %CJC 4N`aO. +9N_cW;").# $%%&0?EJE7*  ,8=6,.42,)*# )(2;A4 ((+&  (?JOKB7%!"  27973(   +;IUURC0$     ""    !&'   %5=0& (C]p{veQ2$45955*)*! 'JTP=(  "E_qxeK2$  )*% ;JA. #.9DIMPVQA, !  )5530)   " /9??:0" %,,3;GPZabS=)    !38=<?GQTO@1&        #,6=BIOSTU^aZO@>9<4"$$ #   !3<MSXL: "5EMUVZ[`dff`NC:3)  ;O[YQ?/! %)+-*&!    )41#   !7A?1   )%%$#    *.& $" ""   !(%"       "(.584366<<82%   +(" #"%-+! %%" !!  !    %-%  #.891"(&    "-1(     %.686+        &(#         !%%**&  $(%%!     $+(  (5>>0$  '364.#  $#  !   #+/+"                     "%&$        "                                                    hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Splash-Med.wav000066400000000000000000006025641366722712400230620ustar00rootroot00000000000000RIFFlWAVEfmt DXPAD datat  " {vvkX@@ HR \d 2! &ft1# $  WMm K1h;a J Gi4#]l ;^0  (iv*He m-9I* f b EQS^E dF+&2?)UXޑ12|,?Bh}^r AM:$m:fB /,C'ڝqߝc Y U5e <V{8=xzozq eTz L U$J!!_ $ G 5 B2LBZۭݐaSV U 2 " 1H6 wj~m,h1-kB6 ^ig;A|/rZD  ^ :g&L0"f {=> r * ,Az  c%>v7Nؕ@ j|7,9 cP> {k eLh H'6Z/r5 ["; :|;530j7-)d/ ^bk.$fu xJc ",ޥrlN>e,H_&SWY "S)"1y/Y 9Of@?2$ e *H7V p&Q&| 0 &6 ~ dHgk)V ,d ((#~n >  mz3HBS *:} ##\):   sl5MTC *Oh# aCx ?  hBwy2 W.wR /c^<(p) lw]Jtb $!oXr  {ykA$H*$*`vXȤMԘשd@>XD m#;7%Vpv , }/)9>7 $ g@iI 5KH\ *,%AW$"rm vvw%ʮ{f[ ,^ *4% UHk6  7v [(4fNn x5EE <` B .}kfc_:jF (,13-lW y]TnHK](YTt= ~9, [+"*S , qU"o O7| 0ݝ@[^"sVL<6 d6 xNz('Y Q xU# >":C%\BI~ #+/, =  |5PjgChYDA|< Zru hU3Z u` ,54 3st_օc1 e#(OMhۦMT!$( &P5%F#T&-j9 Rd M$)URAPSi g R1CAqqDwY $*M'M7 * H >܋%`09ܥNF2~C#RzK R&*I%-%>D% -0(#uc = =nV%\  lj  ="]  Ou?cp0:U2)# ;KJ R L%c#72 F8DN46  9 4: U.D ,k/)Y(1>Dn3Osxj v4N(C%H!Y!bH] 3#]ޙa_'M : b1Ny )D ui  Kגo ">Hq)I  f4I C-eO { n evL&K8h(%RQ#Cэ O34SQEhXdX~  | tUjn 1W#~`u Um b\$ : zC*t ] K/Ft҉<a  }Z )-  t2$J\  !!KrֶS1 ! NA N ~ 6ؤ(!^C:.8'4Y3%qל+00H ޼:9h   Q x]۸1$&& '(.t 6 + Ydy z/$=!0E!NnLeR6b  Ejmq 6&D]: ?ckl CnXtަ!// Q>G  c q^z oE d zl 'PߐG*Rl y% vJw`h:g k V c  b k lwRc "2k31 8 U T4K+RBW @n_ *N5+E. l` d B5OE}WImd!ȅk /&&5[ :,4c* _kuo4"Z 3?* {""+J *7)A;ډ$2 6#C$&R5&ɫ%'swWM(z&=p  rg {'f ;dU fw"9'f[i0m) : <mE; !A=( .%LOO D DhXir%z% T %~F $ԤܼD F&rY4B]~ 3aەV c/?6 _I *"5 l7g}S%@(J y^ %b[7QJ XB"#   ]ثWL K & ekIWh d\%8p ",/,#)S5e^ p3  g߾ H"$' 5>F<8%ݳ!L`)htV<2 ]؇گ4lYD ,d46N6$PɜЍd :7(X%ۋߙJj0 _ PPU_G#c s/) --7Ӄ *$\@?vsk&bl +wt n߬״?, R [lCp 1>x ( zx\Wj- bIl5Du~g!AX1  z%h Yt~qJ[{" :fy8[vl ~x z uJj0,/g ByC nDm+3 " :'%yOd}DE"s& !f 5  BS!2iI!"#~ޗ'&%5 m/'`R "Sm@m3'M%Cq3gpt!K0 61!`AF$_H0 z!cQ M!S O> Gd lQ  Q S # ;* M 6^n|b{'szlh  ) T + P ![. }af &r8P{y0 D`!Y G ?O 7 z|U L!-a ^Jt &0 \e y1<r iN {] `7 rwoeuw* 3#"xdNNr8ز[O D K4c2]4=cr xm (y60c'eG n:HNwQ: H3f !V 1U·v^UP+  [5^VZ͕!6_ wD @n(L] 2> =/&Mf [e} "qo&(%5 jht </ :ol< [ ]Zk4QlZdc +;Hb-<T MCWm95 E |"jhs#jx_#F9ItIP#SL*= < |X#e\I) # & {qM7Jg| oOJp& X`',GLin!j I#?, >"'6~50 E  S + P_j cFR b ^E+tQ  B ww{ nU uLov.Ej2>zVl8d=\ *l]!$yrJB&< *>   )2qq !H 0 _  |AY2Pt^G jCVkK/WLtm#*ydt/ }: K k[g D+ 9 v~uc}5 SY E #t ?>L2޴jhP[O"8LI p, C!]!`߹InN^%U;ף[QmX^  < | # * M] Cz v n*0=Lh tPg GF41V 3QT - v%0W*>= IX }=8 &ٟb  \ڒ F  y [-< O)*M;uiG#MChHE  HRRR]UR1EpJ y~qgD*_ sT= 7K V bQ>\ &Ev! e0p&53%1 d -E)_eYY")HI _}! ]bo=  o" 3!-Gl  6n}%W6%{ٛKGFn!oM (})VV:Av  pW .GI17d%yp( %[me N9 =! :M[2P6Ha |csvf87/ 0g!a6B[y sen:' ~D )z Nr64 O xjS5 0].qV-> 4,E66|{ ] 7?Za 04?J4\ j(aLwnjDR#5w ZV 1 <2 ^8P9x` %cZ6+@ B  3E] Y< ;نP _xR =K^0\bG6cSUw d4 Iz! Og fv )6L,/"+ +X>e^ !\F  !N !$@_| V! J%@Q*0/l w#c { k a{W_HX&-in;mJ 6 : \=  [ vb[( uu\~ [  T!MU  9<|d1  |? {uou cD&q `($2: { \ z }Q < !bp "K|L vW 6 np a (& ` ^ ~ J%|3!zSo\N -f{q :^# $r g*Y# :c<t  >e$ y < Y 0FQ]Ube  Cg= d<l L. [f^ru[p+S _ $xD7 ۡI__ X +mEc"K 1ڲ  o NN P] 9 N%w0 , gmId $IFM 8w!]V W=(6@HxS  aOAWK St] qOB\=8o0 %A.=b 'GD%f xi (WuB $%e  *r/3 O.{ [V }B&W+?\\YI8[ g0[L=  X -vX \ ` nw8M  5 1$ @ MY` >]aW X~LV H !t ~ ?'h4)s _k&"[ {#(; 4\ IJ /@ " X:IϯyH: <9 ]  oi2cC*T L%w" Cn ^ T Cak '{ qp "A! , *@8SO l \.l] z,$ 9&  :=]X,Ah }4h!R7 /1 "t;~U p S2#/ne  SaS 4}Mܪ LnKEB N*@ J *M[`aR@>d mDV#W:} 4*^.S+ @[ { <9 jrE F?! s lX %z!MNy}#*r $JI! ߃A_|x{/`@*Q)qF x ' =g& ^^r  lQ!f &P1-\C7^ |Ut = s ,b_(_Hg=US,yRb"t=y|U#tN$lj< "fAGyU~}= ߯  L Fk P `pLz(E j$ k "Gn  OfW1Rl#{76x|_o119B]  3z0R 9ޘ 5* P6{  &+8!K e2 hݎWYW H,  QL J=V# 7eBX(s J}NV`uRD f1 |Uu  =  G , < H=F&Z,M ]E "0 ) 4 `}(o=L5Wk Fb@ ` fD}%@ [jq bݗx 7p^=;T;2Y/9I7Qb$$?g q W  A*_Eq [ f:3G  b'ׯ?d Q Z"I#5<= T&3 wG pq! { 3^rXzC Gdz=eӴnc: 6E(?7L;+i/' p bn: % T e  [[wJ7# wAFUA  v t b DB `ZF.֎q ,K( o ( MH/<+ tU*X0 4 :aY4"^ h|{w f ad /Ki j xSn BwsTlJ@ dJR : (. aVI|D b V9T d\ ,;(v)&0\ k}^[m]u\uu ? K IEUaw F  `*&  tl)g?\F;dR X ) {Qq>|Qq`h?'N5H `Dur|]  uDj O= A?5a LQf=! l/4kz q"7 EBb5X  Z)qA  D\ >rRx\ ^l""%f; #|z8}Y(W )uMco   _KTW e@4 d(S,[ %XOg]MKP9`XiT"5_"2i?|5M? [ o]v h f  mphPߏ;0  I?i#2`  v||}t%  HNQ&Y k 1  ,: e /zU@v mfMYiA7}rUWC{ ^:)z3 r=P c =  avC T6 m #Gsn  14x  E[/U8 7R mkk_= (1 NdV >FFKpL s7 pacy8mګG / \d7,3  B) 2]b[`)/-B>  Z K ;pj~I @T \&(GRn<-$}.76J%ݮ6 C A\E{)q-9xt?[D -`zl @ v . !*  tReMM" H _ s۶RLaT%C;UJ [J<8 //] l4< lm b4oV  1-L .P.6{ 0i79j 5 jgG[ gU4 aT[ ny9dPha  []7 1  h i35Z^ 1  7idD' ZRbstJ ^Zx7o$8*f:& a 1%nEzRv o  p Qkxh4 V# &E'!=T$< F|Oeh r@X C ;f 1 Zf >9QM,{Y $1p O( n g; |  w[S 0 9*2 f& %p  A R %`h0 6O S  Vk |3Ps 8[ 9RY"% A% [T`5vX\+> ,{*(2 4#y5 s3Uro) aCx +4  K ) Y b UsTpUn9X v | ~ ;HTH' 3 \ {] E}  4RzHN d:m8 W IQ AwY S V $" 7 1pl^ >)& T {H</V3  {  !(B f g _L7 p wz<$M { CL >Q9[@ffu L SmR ;^.[Nf  }L  ?} A 23 "/ X.n:d'2p C)9H w@=&2!^xJ GzFV+nes Mmo Q5N$o>  :?oS * } &7hTaN%co8E/5&))* BOO I7 ?s  p[-Fh B &JO=l,v@ A4_ w^ wdVL;~I Gsj0?#Jj:p62@ > 9-H p-:u*yhi=1vV:6 mlq`2o * vx 7vi o0) Q 6@6 )ecAq Q6" 96+ :lO" [V^bUg' c}knE?pt.1|/ _, v2 8 7 jd| 3 g`WH!,J-vG [G| h xt Y r B f M> LP1Wsk Xa 5 #t IHp vQ v c [ A5{[<.~' $ TMK \`_%1} 1%  +ej]9ue'V^K5!a r66c  |19mpmBx#KrOxp |h'fi ~' ? M+wFU{N 1?R*;b]c4:1 !  ! cM| 5 z, 85v ^ %(#m &qJ J| [E%k&q fV+s@   J;39k"Oz L?y U y G " MW"#Q/Un\u~f k\ 4@f Ra Cw XG IB'hMvU -M6_m`8-:}w  ^ $qQh4~^xm3}GR dJ??&:  J Fh> WBa ?  P#{; "  w>kR; |fIx H> W>>H3xNvlcpS4} j Ir[ g b <C_`_-_ -R (kGCpxp\3 ?gk ; gd | 3 iW\j7 e EoP$>2(&IKw T9d ?&ep(  E W "^F-?+ c`j m i "E mI ' R aR mKZ [P-8PPQ 23 :y?' V5 2 {\:mk?m "k5 ;s" E _DB xuޠ YUjteLm%*Bf5' IXEr.;}v z8o7fߪj+ D qtxE"[ P-5~ p2+/lJ P\ _me[ A ;URqn9z ;-4qS N &&" z k|:{~gC }w Rk}3]- 2u~&S: M#yI n  m-dW q ^&)- *}MQ MHoJU }/Kags 4 6R}Fw 3"  X6:dH} SdKuw x Q< ~ W   T}NJ gfc  [ wG U sa   g'wwH P ~F 4qu5}?rp\r  20  rm  +  ]J81<{؍,Z  BJ su%r Uk* U | `  p d "G AZ= V >iM 1$v 0  U $AJvr IYxnL$ R# B=_@a M- 3'BU" C8/3QTUs L    8=Nn^%;bx7 m;Gbp ,F  #{ V `YS!bF")zY.rG) tU. )J G _F^T c}~=>>. Oe'u/ n;Y ry,} %Iw7K 0lX  RWuS"BMv );r. jkGz(F W@SVf}=F : s eD=W7 O *9f c z ~/ jXXZR#DaW 5m 7$e X 5 Pby"c y}'e 4$7 5<<!]>h?#]r < *x_dO;.7 2 kk"  axGMDo@j7&Rs\- a,G. 0&CvS=c F i% ekw94 K + 8&2K  !  Hd dT1lf  0 56rLTY +enk *|W; Z `oE  Q  I#B _| ~]V 0^ zw xJV}7! 5o Zu A`7]\+ U]# a p9T< ] 3G N& ?1 ~I"; <W+ LN 6oCM!/WY*D -Q 2n'<7 8} F,|H iGee $)&+-GSw4b- mp Iy "<' JH$+ M6>&tDv (  S X W5?l@uu y> ~I D'HY a I   # )JJIH K>,V p hM_R !~ oSb y! E-YHp{b4zaP} M ^j L4 X NB qfHN; ] jpJ2 = p~k|n48b5_1Cfd6?Y[sl8h1"k 8.)X  l  oQ7 ߠs |^ 9 &`1^ g L'   ="3"l} tvqL jhN GSh]%K_; EDr O.E1 b^ %PBE^  _ ; 2'raRrz ` }G9K!9l5Ca vLiX  =+0} C!YcO}B(4 ( D% ;^ vsvA ),o f j AH & eQ^2C9TUEd. 8'p ap 1r+iHwm RFR } "P" x{=_f  ^PY&Nkr2A 7q[Q uJl& 1x_6 ^\| Z ~[Z  BY]% Ua7nij 6}cMp t'`  L;&wb6W @!QG<wG1 F 0 lMNW 5 #J  ;_FP $B F>}Az 8Pb`o,6T2[B  W H'#P oo 3yL M_ߤ/TrL^ - - S%t`e#Ze%% [u06 *   R PXmo G 9 U j ! z. _o@>2zfuee9 T5C/ y  _]&s >;DRS])]M E!+.Qa z%R? } iU`'A+Q J&$5 wh`(6r} )Ovk>XJA4IL:cX p>$,l-G rCL _ v i~M%7 {ky#8 \] R ovy1~|] kD0 "$ 3=%x@| Y Z  }&$ Lc0fdx(  A}`>hWBn q !W0+OtI 7 b  <^W&k"=bxl KSk[fp Hz5h;z5h/  o5wD * .w =3da/J* -Y Fc3d;kqM1 DV5078 #wDl}a C; (qu55> xh} 1Fnt{ 7 +qC;& cm=}"(O /y)bL }`7^6 PBPX;_t6CfR 'a> ~  m<Ku[h : .bj @+Lgv!<6oB2q\J "<,90* ? %O>7 t |#vP!%<~ N[ $\W ^a  *?PB( y@b ) km2 k8Rw-O`?`F$ 0H). [vJ xZ!Dr|w9 k hh ercsc 7+YS]8 = Q c@ n[ $,mP  .Dc4a+X /pIN5z }d9   -z ctQZkg%:r}7 l D U SC4HrzWSH?%d(]_ 0RQ 0tN[t  y six sL >Y}9zJ 2v~BTh X <7J6JCmV YJTCeA zfPiP bA: gkk#G8 .X9x   c>\  =bM&XykI8^>' )bVH@ G)N3^Jx7 JjqD^>+ j @  @B IIA$ckcv re |;uwXn Ucb"JaP/?{me||=oxC jP5m a2 ( "!X g{Ng O   Wv 2  Bk&:p d |`." *,]x   I@|GZd H1[WJN3Q DO '  Z F N .] K9  &kK_Mq=ZT\ ;Y nbqF{x3V^L51'o q l~ L'l_C @m6m $   v 0 = ;c>?43 EY \*Yq*DW(Z=eW \mSzc E |!F<&HIU`vVD79{X  tj S16m  =.5y.J g, j mWC  3ncH1:6 "(:!N& g (b] h yK 3; 'JQOmAr|W 'bXO " Kr Y=7 pDrk0qa[b]3d | F, Cc 2%Fe in = ,cR8Lvh4[T/ 36;!rL 3 7' "FUw^Kcc8CeCy]\GxYAQR Y qg4Z $R I vn4F hx1# .y8= e3DnDc Bl'h?kPWTyWc`j>9 $ 'yB 'A )\ Yg=   %qc Ais~nT _W T }|!&a  ji hK~ k7nf"JT@`qJjMZ/7 $ i~ch W  E }>si?$mN|mv#Vue ,4   U JZ&lvV  kZC1]9@ Yg*1 n u." o8 Z +n> bu'/ ~  {jiff >= +[>z eR " yxQ2h  4 ;:5&T V n9 xE I 9;eC 0p8sS^j % H\zTXbVImG*K;L3  XKtMd!Kwq%e/oua RB |q_,.}o  ag(55=J*XoN%*^(rsBA s eG_rv a hdT]4ha?cDl O  P 2>r`Uz-Q= # kiV' x|qy* 4  gh"N>r B992 _ -Q^b+  MC|Sy#dzA>r < o\>[W @pK }fr l( q;-b~X+1s qs:nf8# ~cy9:K#) r&]2""  J}Y ) ?Y\0iH a 2d`8 ; j2p(Frx nQ}f p1le-)* {vs9cK ,p|aw*t3 ~7mhQ( U!l>I UY) r=kXdG L`xkx yz -.'fA td u z&(9  /[5 kEd21 ` J +O56eRXRS<%+QRPfT(5]! d5}P }'\,fxy. 1xoVQb 3f`   |$/ffI :q Y%kEYco-i 2 sGx TG, ;" Ui ~\f0w  0g M!}ol .Nx z y69?fdi ~ . t?Yjd!\j NdP\Lv'~ 27*^%1"KGme i 9 "(\ zYWv'&I  (]6 dTfLL Dt $R UfU  5 ' j-"A( 6 q X b8L"KBNzk D h  <hANP+r?3"  Iy 3G "d1sXU5` x <b9`;A%o89m9 X( : /pjAu zDg&. 8Z  #!HXo>3, c]E$! fR ?o]   A,:1 " A+^6 bLu3U>wa &gP m} 9*kxU'*Xx o ' /qWGAv~YDWf @ =.`5  FCf qHm & | 5iMjD4RF Ygw-dlIE U QMz 6  & h *eT  *F` "4d  >]Xq0 08~^ xY,<L  m }XG) |b i~EE r@5IaW?,F jUR|&v \@']2zW < P!:0bkP}8s   YdvC s j i) H3/*t U vay`=J  mCY\kvq1[<!w*`g- o'u&w  d X 5.uY V( 70Rjc  H/KV%3"E a  _ DBsEcKN+Jla  i~E n ^ ez &4kX_&M.) ? KT"jvpsr d fG e _ri3l5(b #J '_\^ Z  yK tW<*# e0h^ sM._HJ ] ;"I`Xx=Fq##zK* ]`Fweu*A}/&g]Z n@L+ / Bg?|ZK  yiCYsu0Jp*K? 1 ..Xj ki(^crQ w E mY) Z V2s (  (qD  b qgQNg /Q J  7t,@r, 4  MSzR Xh 1<  Z $ i>vktI vV>g  Qcv  !{gPrg(K [m~/ 1g+ 4F `h |*(oM@vQ{d@*%^Bhs7u ~}q, :"0 O pED-y EOT-K t @ I4 D[ X _{O7r )xVK1s4 =  i & ,tnr%*gta atizeqI  C[M T4I 9*5m=,lf =\'Vx)Q9 P e4<d&NwA&,(m &A v6R+d285&L   ^YYb}d eS 3WG;lE PXFxD 59PC ?!Qe`hP }M(?0  $?s[#E,&&* m{>WW J\h1pr5-Ku(h>G<Vy b W:| R{C)Sfy]1%i`m ,7; $Ys UFMbKc+9)7@ZfkBho8,iy\  +MvR4 y>\ #Kcf9 vgC]Y-iK/{+ue|0,~  h I9q|WewNC G e}P#r. >( wIR *%xV =rink i E0(r # :OF;GEbckXt0R-{ @ { of ^!-y }?F QVtm7 PjQx k> B 9D/}  mSD2E@mgkn1!5.U #|[N=mE yZy b QmMX Zw9Q\(/0Ys/ ;V Ek HhH(1hNSmt=d: VWmT7t|  Kq 0caK N;< U)h A#d["&#x:fH` y3p d Ai2 74@ 8TpWD7qVjo4 P\l8@ k}[ 34yJSW}Z/ %xsNT4`~  V_M9 +&kV`n? ~ Z YJL s:cG3#x~w; ^  6 Q!Q$1sty;aAb5N,0i l TNE8yo >0^%Y 0}@@3[/ > 68L,B[&j=l t_]X  jCb@?3N_! ]J%'@S]_   ha[<4y#!m34s @`)E 65Uh%M3W(?9 |?J M <HLR'idodv We*!'H+ETAr:Df#< Jx.m%Z9*?+ l#0l ?%s7ji6 !b!{C<Tr\] a/MOG(N :rJCcU&?9 a0[HG Q ;h& 5e3cM yrL~T 2jN h,"$ e  O e5Y a^}V[r@P/N(V"#rE* A Y>Fe jMpN LOJ=c@zNu\iX`snz  . W YdT`]cI.X{} ^!W;z Oo  QY[suG#  X+ jog"B6dOA\ GQ 2uaopxhS s H +bBmlu>8{R`7 fiO{h![E]F7;dA9v* By2f /' aE} V6cQ[ EJ],X0 bzJx@}%#7,k Y\cJ)KJ#yxl "TQ`F+uJOJd }Dg5jWQx.20t5_TP;4k3Zb gEnn uk>tWtKW1kRgXny.)y*@WIk  [>Y3(i V"}T( Z}A J P]JlI \ +N?~ U59p'wxgs i% $6 c(ocw] Fke4dQ\F vhO Qk{hF7 $UBNYr ' 0'"7R ilwUFRJ |(sQ z.=+5bB D|J z3l>_O f #  lc{ ~9 g ,TbvN *37YQ^L jd#) ]Q6p?d._hf`lY07a" 1  @vND!qR$ CqjF oBY,@00 57KE j*cm'& F}  ,9`*EY UA(t;# oqu5 ,l bm% MWRD6K07n[|#$(u=[' 0Q&5XuC*H@dqlEs C`+<2H  z5,,Gt4&]sy`D?VgX!I^ C H\TQ4I C0 "31 =q yMc[s~~[ q2T}[pP HRFC  0 (\~(S<*#) a9@(Ki #4P|IZ&;>>N'n 3 mbTVB +-?(^zmZ5a$ J2_FG@W O.E[($bAG!o^iqI]C Ea2|QM  Tun-8_;39 k #1hsL9T! ) YF6z {}-m]4  Ty(A |1L !5CYh*!S5nA J I-_yZPsf=EqVv< VEwNP " 6{yaIi]r0l1 m_n}$!k 4Ff$O&mwB~vM~dk HBZ > n} IeC2N>H^k0Ey_x5:JE}X FCiF<?[i!c f Vs Z;7W]Dq}Hr    UMCP'"\0M : i+,ZIoBrJC"Uj`  o B* .JA h3QS @`mFG71Jz4h'F$[h as^>O%J:] +aCnKy<-89nxFd%{k9Q>  |Yc~2[l=WW'X=LKY"\lm@FrutQ`yxzTR<[LkwE"Th\$ R  Ma8 ^eLx0ssVISy|;]ejg>;i?b/X NBf}F'V>L#,{A;,`$= <GPoI>tsk`?3.iJO4t{` #|,WjH \b1E/P4.*` wd_u;>  t];51j xBA(H4J 7e84S( }- Y `mkOI;y - mUk +e"JI^a"JE?su^g  0 "nq5 Sq4S@ b Y Pga6KE)D,{U <I!8}j \ 3inP{WErV=&g} m>Ij t,?u n| <*Z  AR:"|  Q X) wI+ |=4D+ }9zK  e'1-D0 gL(|)Zo%kj<6XR-tG~S0 p5/r #&{ f FC W 9'1=cT \mf,3G7jenT A %$\&&  TBx EZ/eDQB S R[>%kWZ ""Pl M Aq kl|~@w[Yu1  rHBmYJ 5wX FZ H c:v*,"lI!4n7fk _]7U@7 +y|W~6   :rr^xYU>mb'S-8  d ,uPqyP LBqY3e| B,&z Fi\ '>J hI%oT (0D 0ca6f>Fl99%q|or EX:I={O9mt0{S4@qM(dP{ j7d{EN'JkPI|n$Q47w_uRr  E;%Vnz/j[?cilId_<;f~\|Zr6itVP}  T0m2 [ m !kT578n_e26_b}jdO~\$^nf?H:u: b@EK!F%~:VQ*e` gOn?{AC}0#*/Oyy<_w2;3VX8]&(\Y (E T[V9|;\!^]GM4@bJq H d-Rh>yX RS9R={%5< wJby8Oe?Fe VEvys" De} q4Q s)S = + 4o7$O{Gt{xQ-kfK#@ M4aI+hGc0W*0K2\|rh=g5g-kCl37OT /d.Z|"0XuYC; t \z D/7f-  )4O p%:i@_7 ("Xq AbN(7Ow  N\PW6pc$"kOlP<9EF|[z 5`eJ`G^\MCg%I:LA5.rCPF\%e'l Q;UPn = 8iCBoP}l]Yiu7@`C ;mi Y MHJ"uAN l]!mn9"6_ _4WdT>|c{gbmLz^ E3'=vmRkIy4hg]mI p  7iPMk [ \bJm/MqNTIV+X&Pv8.t{+[M Rd | K ;@D06j${0+_ k}8? eG!,RfL#M],$qEYx1j 2j[F>adCv XnpLP2q'{e<*bY1G?5Y|CIuy=-wIr??bo! <5t?H5BH~PK0'Emd 2x1|mX wI(+=?&srF1&X;s6L CK_ w  @m]2>)r-(w@,4Q N_yT k _ji 6P(;7   pFy dRrL}q7z?xJ 0q}5M< A *|` &vC).*DPP}VR</]Um8w)S  =6),^Ju_8b w!u+u49(!yGqxlV^zG8tzDq6An%; aOm{y:0`#3i>~LjO6.|,hG{O h?hi0rB/nf7pV)kW}-HCJMUYED K8 N#1M&Ln (AV><;y@^']K'WIUZIJrW+1R#k)CMbqC+*z.=\xf] wf4 : ;BY:d|F=0UPHqsO;8s&$yl6s:g))`&+N[{v |q~Fw4\}cJ& \\wTNW`H'-OB0Tnib`h=jm>^U7'#o@^a= s 6smnQ (EM;2 @6l:^TQIq>}="ejR^e)nN(3i>U #zm7)1Wtz 2vdic<vlMh /|Ykm/1u B;1N=^@~!&p`!s=m#WGlhrt( ;T^4//Rq^`)za zyI:UwMjcP| yd_)Od|dU yBxx98 ND, yxBypC96G 8B ?&6x <PJ6l_/I/D~Jm$Q~$Gi+y>[:N<<4y* FWSmW`_b)y_uuPn%/C^?UyPU@ YC\&r_le WY[KTJuTF%4C0cl2GWZ8'@%^Yt 6V =kOe=G(> :w&:F Bs}* YMN)dh'?WUK8U`%| Q?'SFX@:sqw0x" )iq|Y_)q)"E{NxXn{{"47='y >pc \y=w}c++3h4 }+SlDQCCF*MfRATE&jzouR !$)jj[vUb \pE_H6qz %dU6{g95dC(#j`<fcO M V hdPgse@*R  F)Mrj8H]PFycz 6.vixCC~=Q3N l7F dJ )KJq.~&v";BG5[zMP2Y8$ ?i 9 x( -@AQ#<}W') Q $7ih#B;Wq(;LP3C&2.@fr/1>!!36:ou TMR `Mz,[kF GUU_Om2t ZJI1 !KF'?|/XH|z {mp[A;-SBXcrsY Q;:dN')%rhuk` $ lh`%5i#`Qd&fu ~?$&"MJk\t|&%_g1:Z: ?.7l$d[NV $e+#7Tp3zqz15kE me!0*R7LlMYrKm5HR& Nv w[qH8cg B}%h$-[\&U2K* ] : ;VRa8^P@=fxa%i{*Y8o #H>$e"|">.C~ BURVbc" @FgWW%b$@ <ZDbiU7x  !HK}p#$%./`B 21X18^MI9 ,F~OG=s<E`Cb;  6`|2h}nJ+)x oT!6WlAk9{'5]}B IfhiO\8b? mZC->4V/p^aY UK>w}uG!=)| s.N);'r\Z]dm|o^JrMEEPvb598P"4SV'D1rY%]qrNe>#xHcNK6u!KaHK^PH|B?E%sWFK081_oZTpEG8DaCGH'#OEbhM>&jg3^hQ O{7aY xud&$ G8iPG9P:0] aE  o ~ xbg{VxGwG7uV4o-Lj/`I3A" :?a\$"e6E1y>x~$*n@ ]g/}_eW5W?,Vi&'ry-x[Zv>= D 7Hd7Nv|@ j^XZ[}MxfWv-U_G1e^ )s~&?s` 0?7!I5`#:]v|m5n1E}9yw}!F`MG&(uhZALvbI)/~gg&'nGZ9d{8&{PQ`+Y(a4~ic\F$izDnrX,-$ `@ =R.@xIfZ P!8>Q <wt3/ {0Y .@fG4O  ! x^<Ii0;Y} v?9;|7Ks]E[|H\'zd1c,B ??WLy.s&xxq'17mV EEUm%WI|xM<8_cM_a*V5\K+%+ o<%nxpT;~h9q)9`eWTQZ`LmOzCbh/G#Mt`=[H_ 2;/bM_uZ15 ]cuyHG1 z5Ghatfi-L&RQ=ouoRfhQUKtbdFCA'wm4#QD h} n;]F(Ix%)HZ<% c?0 p,P @~EGlkk5d\UYC 6|MZg=[)a,]zc5C5Blyc -?d$V.  I\M' QE!8T+V9rh8BYrL2}#Rj_(L IgtPy NONh'o2gN:*F?FXnFUf#K$K6-Uh0=gWZ;:"[/Vg7G+LJ,:aKOc.7^;g9JynaZDM pi w64\z35r-uI.!u ^EcW^*9uva.um8"&9i3N(V)z|@FQEVq_,MXv x:VMP[u%''oeP34_WL-Z|4r7TBTtR_JGW?bH c8G^j#{`@%0$?Q7+SAN=TT,;=i&^&<*uG``E}11IP 40c TITdN8?R19AMlb2q('rY?HGr\{;%rG\) g2 { 0 {mRl%(o1,&PM F|* =9&^Cm80\ @-V  3oy;D SN@Kf| $&"'8>rH:;V.]-*AeVhhIPq XPt9OCQN,0EJKp0$y9 v')jk   Fn5TI/oj4/>9WCD ?5YY]nM;9/ ;u6{Wm2OufXZ D;)xp,[v Cs&$xN.S= + QG *P"? $Xd&v+e[r?q;qbc=Y$<'vwEy*L*xL+=`TrPGSFS `G\_sq` Q31vSe5[}_iz&F,jUYnd[d@)Ao j}J5|jvd(iB  MntQgmfE,_Ryv5fV_)*J/Y :\x,>g ZY1d|mnk.]v>Z4 L <si w/65Yg.i14iP..[cB np ^%11K2NUkY>MBH.[LDK{W.b j(>N Xw0b2T/P&Ix9G\YajE?@T lA~>[9PJf=aT8HJ1&htQ./Y?5_/>ic,v7q TjP>g'Tt;)PJuk> ;}s.Z, QXG\eD[7uP-m"NbC4 EZgF%}P#6EUr53q|i=uixgF7~N/,G-4Lm; /3:b t{F0C5);_giBA* ffyl#Mc[1k^0&(UJ1x,[6+j7#C8+ &cNvcJ-2:iS*4Yt]h1xnA89U5pF7KA4Y8_`/E:DX1C7R|c#;KY2f@`?VsnyAi$DH/QkE+[PUvk Ncqrk';Gp U}4*TPD?mG,-CacPE|)>2N>sk XoFq tsm;08d=zx@JLQw$nj+c-JXL P#Q mhi_BG8Q!Be_Z"3<5 o5-k9l d& <sPmul\SgW8}{ejb Zb``TGVt\I|JNr !"I4X@ Q-5MrNhjc-IhkFrm8bC0.]Q=2,G/3Ys v4e)4;::M!<1ai4mjDDW F _*@7Ffn~+\j4KI } DO7_@7 ?bWVgYGCI4H|lzvaq~~5Db_I^TB@MC4LiRP pn~<gmoMSZA(Yk2xXiUYuzR#]9LUkgLZ "M|ud'}T0s1"]p<dc n@m8O6T{C>_9Dz= ;%[,"i6T+-[k6 lW_-RBgdX-xXBjjfV \v %qUY?mC1#2a|hkU X<Dg89a F:>} w."y||]S0JP[q|4q,)N rb4<vPg[_X -B$gr4WMEU FSS[cM0-xG]T^'BqA^1FtW;`}}01-%%> zVg)y,WR[CZMJ/H_x4}9y,a[>8e#x-]@`l>5DW1*P_[5'>? T&VdI`{8ZlsdO5>c: Wx"8KFwEakG<+#N em;6[.c={a 0A9 g2\5{xyI 9 [Fm7g#tm/h4Y<sNrl'ntZf7\gB\CP8g?rY7,|P+m?J.J#@F O^ Uw5*jY"n:=$M[d[qSnVVDC zVP7J_Z4J8 B'"QkC&5 Jo 79cS;<<w,_Q79-ej,Oea9~"9dKuPL>FEAYF`Q/2 w-hDI_&It)u1uAm` m5b91H BBm,xg\jR7av <&g3z%bR833|.zVdD 0t}z 1ZFxMYo9]l;sVaU4&_8qw- -cQ{rxBW(PdZn}(?"5N!jQ~N1s 1<ucrgT$Fe.=i,JD&!#V#iifvQh4WM`DXc u5!x?:4P hX]ju8 {5o+s v$Tg-,^;JUfoCW^J</A"1JG7Hq[:W+}$fD_V!s[SF+Y"nhc>WP5T1BBV5z#8hsCYPQQpB> Q%E]_T<dd gq7T6!ZQHY%{+}%{W>#~c9;;X%?"nI,lFP/#XXdh4WyoAvN >g%yK$9i gn22psf~n^'f_x2_9b{$U.O0P:"!,:liB?#Tm@<5fAIAc?<4 N^zME3dEY ^Pr@<ajKP^\][ wxd|qurd9NaxL`lbh&J?XyY{-pnPpXW[I~[W0&[,_?T J!82_1qM0|ZI*d :N`gHm.8.9WMKq4|g -BcUr-P~@rqI1[_om-% a9L4jG  qGU X99\JQ~%s@Cm\?>x&VC_YrjO?,~"U3}WqkcREDV@'KGXyB&*m[C[0kj94rf0x6`,/+_eMiQ>^w6C} Nkyj>Q5c 3ICj@Jf0KG0LZ8C_;[{;9^#v1"oXxqtFe'oFyV7:$f!,CH%S4m;@;:fM5jFm> &-lH0nxM+9fM|gp'1@uGEf?g} 3B/?%Z< )x1#|2$sl mu^l0lDKl\BGoEq|&y&Vx.z_Cr5 sbP5S*#:b=DIe ?u-PJBeu)s(+Hi?7tirdd(Q_e<@ Ou Q.^ S$u>m?4iv+>W1GD n Cd_poEv{31u?Kh@^c%h)A kjInzDk7bI1`?`8uz-E6Y 1d8\k+QTJo5=*"JPZ%a= T>X)N>|&,arQ]8,)Q/y9& h8D Iyf0u eSUU gMNdLFP`](-9{E<P_|g9gu"M<{QFrR> @NfYzf1?)om8Kn5vQM?\`Az404+ =5<|<CS )002[NPYGhvfla-Z"#=/~PG1>QRGJ jyX1Ar o7zZW>1"&.>}04>'UE f`u?8' yT1YPE *vvG9K, U_1`GI >`"c kxQPFly  oN,- Y`/~7ON0}#J}"g# |14bZ|lfm\En*WFBx:>@ O` u@oZ*~MBd&Z.$kRPF'gN's2Yw7Li 8@`m'CnH5|o`"?~D-V*m!=|A4(L*Djnh4<^R&fx%<3k{};FMik(vC'xc 1*Ng]j_ f\(p's%4YofYPF(d&C?B]"*@kR8}RS6Jt5-FD=QI]<;vI|Oc P!/lu,-:WDpjG r1|) -x^QQ#j&"hx7Zr6xaBkm<.6`XsDJ&"n^/ 2o LG'yRy@)? b>uWFb4;}9BqGFkh4uo<I@f `U)aUzJ`(42Wj>zF<}<--Pgq^F0C-Tr4u%BX<$1vemkkjL,S |T,Vf\PzE/<R(,##vYm\9g_{iUqY0@Udrf`B=h5eh;z\r8HxYF\> eEl@);UcQ#Y`T1G/[HHE8`Uj9T}h@x,r7ZC_3N xS2 ;vsp :ikJ#9M a6GKX-P@@ S/a[ } XPmWKq{FvW  /~!ERJ$bK~Q  }"HC0j(;nFIQ0KyUJ[g8>>n2m\]*n1?$x&B{m f3V ywzDvf"'CoqR1s! iUm 8q7pc 1>Wjy! ar.c_;En&zo9_&i5KLbCKn\ g\eQj4y14i()|&coU< SEGFY>xjfx?!fg:~",dU. j  Yz74`_jeP1 I1_]Y'@JT_cpqIk1XGY = I#/&}<@5)] ;} CCkLC{LREw  !NB9]IltZ+MY!|oCsWob?DI y^r[[|nKPG4-%(5r:iQ%R/2d15F:/?JYTS9Wq<=x)*=I2\DJv.7 G.TJb.ST42x"3PJyOFmC?w!?sfZy0+l3 XRh~x&e3L;jiJkHU GdfnNi1lzTSx2H1uM'[QIEir0+[7rSk%7.1bsL@@_/cqyD"\R[y rd rZoKGt TxvpeqR7? N0DBEFgLx/CsOgd7 ?7-"a+"}YSV Un}=b7B;g|<?A \6kyTJv0wpG|l6 Ea5PI}POs#d&\AT"F]%:d=\ vgI.mW  [ N@z{G8e?vG+&)><05u X*#<}Oruh B~x 9ig[~Q{nRgvl@A:jC`G e2x[y _HBd1-?f*ai*;'n;}OO3A"UPG)RI fiM|ox-qrC0m;qhh9aK)x_)v)KxY(*/K" y-}#B^a)j{gJlB  y;![ O/^q>1*Y{X-ju? h4Npj] $sRB$Ls$^rbHY*c&RWr:\=V)q1:b[1QDfog{I[l{`8U] ~^pA Cw5_X`39PyW8\;?q|N7,Za~6qqra RiGdgv3x1MS0`Dk5>bvk|k [)r7y5V@ 1fx,j83Jy )[X/2}4uvp&JUy|-Mrkf9,I'*AR5@-c 3Yf&gLpPvmJf1x' !8 $e|"&0d 5twa`P3Ih<KQTzAC]~qDqv2!)5j4YGo9OP\hyk(g}Jxk5 %c6-fr/kCQfdx!4Zf4N']f!`m>_Jv(ZM> h-`ZpcG t(@8W?Evq-g D0X ,*g7qDNpK'c3 PkX5V18m7,/py%F,B%?8u/}%nnb-[$Ri5u$>[O]k~v| Z^hCk\MJ7L 7WcG!pK *P4\k*JB`;NzJ[bsibmM  K M&rgBanJ\d"?}<^}YRytc.oS`LB[7R-nd n )@ INit.Q]!]&AWjY8 B x8q0C82]2?anaphX4`3G VU8 +<Vrn :PDR]%Lox,4P]+Q[jS."r8wi]l|wbO*a@%c@`4u0',tY1q @Vg_RR<JG -5&zN1m ic#*D[yuRgR%T{RbPI3 xd&GPmd"hHDBN?JcP :s+e=2`g-F @@q6osR[WQXaxGt-x,fb}MD_{L!ccoNA8GQCi|8a.' 8LD;qRIh4Od,J4z)0C_.M4+@kh`BgJUCh_{BJ`xf|^rB<VL,M8 *u?'pK`Jhz,%I"<F,t"\yfqVrqLNc_0|[#WKdR|Q) gnF>&SWXXyoHo"' |=J{C/P<:8 %G>7U)?;;*Q-v4o~Q9;g TWcC4yJ/_kn:/;\F]k +NR CxuYOyNZXo|4?J%e\;^G 43DRW R$f@B6f>5T)P>DDC| XvM L0Q i0V <e@Yq jQ{0rTyM%Oi4^F/GX0-\xXKnTo#5Ni7j`uv>$c2NGf0f0,oE}` 7_*ejWJ& |o5JJCR- s.8]#IFWc"uIWt_ 9%zIC&tPf 8B#,P[|%'k*9R#;nEr:/#`&yd^X&M8Mj7@nXc?#fO9(Ty>k8_'k8tt \n"F`xm pk#(MQqR4)t^{;{O `3XR<jFz K$6)Q^q";W8"b'evR2PL"5h_(LrNUdmhF-mEjrfoaIxh0j}h}z XjVvGfnjnD3w+wvqoB0;)*5f/0n?D EdIG+&e|9FmAqQ-Ts8\T}2`k%UJ;U~)vc&GY)> #`NR?nMv)8m -&\RKd7K%)P M)[_JXT "}nU"J ErU_JQ(``1|y"\gG-Mh s#Iggc\P|e}(I)GyIP8>-"q{)J_R}cZ8kJshiEy)m)ry; J[YC#jj#NhP_-'PM&[rMk;+ZN'S{<;vj\" 7P~TR|%U</_.Emn0c`%9{n|F/KW| &,9_@7tYJT-.*N26fW*5LnankRuTX,F3 >R7zq)&#I7QF)F-_|;68&P'iQ;\d.Dcx f}~-0kx)CM`.|KBquLj>(}vj2-YPiRi[, v{cxk&)2<Pm,N ~J(j\1 n dr u d'-8C?zVa% q_$_GxBHf =#\aJ<;QC(cn_<<{5IK[2G\; Rr$;x4GL{"BB0?RBq;rr.""kr[1,ir?L &C knE7<@4>GVM 5`miFHUm[V!xl%|QBW>8 <"#galUQrGGo Ym2gE3q!-7Xc8pvQJM#:hma;Mk9;N[cL" ]>1> kVQP.J%),By~x%j7[!X{2;vu<_X[ SG.cr&mCT|FY7t9""h D?GU1M>[_z)[x&K&<dU$JZkr8Ig4RdnI Tf )P&41Qd]%`qr{%B,;adPYL#\|*\/t)K53i5`?H$i3 d?Y#BPycjh ] 3)r>|J#TE,JqN_[dMPFd,BaGxzof71%Wp->o /#u7Xy\ic2K TT{I.,V 1XZIpu>R0`/JIUx=u>tk R8:H jNFXQQJaU0R;P)7?DGx;*|UR j1?@T4 t"5 Ff|\Prd Mv,wm5`ukW`t12.<'rKg  R8}U4"/|vM;mP, z??vTRrUo.haIC)C_N FC<$5?@<}bP}qUJ\*rNQjXXXqpdy2&|(kM%0u7Bv8*gfF-?h%^Z9gG}[J3on=du[}uIFb7%T&Ux/&|NJc-M I"XJIC\U_%#Ui+:raz GmX_cBj?R?^[:n'JC i_C#&#r&)G3  ogN XsMx$-&5gNoD.Gj1kR-rQkDg% FbU^NEcQ%M@P:q8}C\J7dr-Y&#N\RP YG\uX#'cHnb{7"WCy H8|CUE_Cq/@,};3;7 ""vMF}RTgUnCO ?|,B97R+kdo"!h*%cu;_(6 y0M\s nuQ1}1Rt2l|,,])Qb:dN|c; FXw(cD X)Y |J]&K"/(g`wxYYRX--%hs]sCg u IP3znlDB*[L( ;To#`X q[}Uzz2]&Wg}J;>x*tm +i(BmTi\_q0sC@}R}DMTw18<)Bi tk0g&0qID-_Mo4m9p}V]z CQ_4@i!& TQM[\'@gyv]n -aQ0j[5C$y#xjPP *E9 F&;)JF*HA5~az3% N O3Mk8D{APj( ak=C>.;;vav#}>k"2u<y@ag8CI'gdC(XvsP\Hy}u39j!%?U?Y_&fdBn*r`#  q`8jjfkt&mF@%@-T!KGBqB!1/FcrV x@h`\6N")h-;'#7(q~#t#cMA503 4(u AVv43Nymc.h2l<xGrP"i.@;n|}_g82[~sRDI@v9#;/"u!JFyW-f KR2#_PBTR[Cmq~|?&yNg>PQad>Xr 1Pqwc.+vBM+>FaC{k=DLN*t]Q[:P(^|u;jYr~EC}s~.>?_q"385 7U-)RPP_"v yO0_08-`WruC#v99@f0!g8".Jm~&>J|I3q 8nu&0g2amDG F\Gk1jT<cz%0u!qJ2< 0*C}3nK-P>  '.#<{`tE ->ho,juEKq#d2c`f1{c"Q B[. F)h}\5G\@0,U1NXx&Ir%cF?N/4)?@uJv gv?d4 Fp[t9R<P)P#j(@}c j<Rd'\ona<"5tJ#y N*08TCc#CU=1k&t#:_,]qQ}MP"cKnx ^WyFpk7v-` q=.%A ^JTUyVi :5 iJu*oD52Y_ *;QFMX7r G@< ["85S*|]L(y5A:Y JvmtV 5 @8g"8 H^`mPm hu&}}Nx;v:ft)j/2K~|TD[8DP"\n7D;1d8smu LUX|43{gQ)QCC2mN<f4SF?&. vcf@hG.uqAT{W 7jP3*m;FMXkz la`I2!E7 [>c5&u;5F:VR,] 5'8%s *Q(hTxhQ/WXi{[q&vkRoj fa]:M(M7N)'} 4P %j/tFi^7MR2#>V!7<-MWdsY<q8g4sTFM.&5<UVQ.@D[7>g2x!:m#>DIy--Q]Qu-N1t8LKX,80Dtzks} @1F3zr[)5L%tBF?MX_oSJV?JtiNVu- 87c-FMuzMR !Pt}cj6ny)aUd#yW( 7_  " "?"_qr-1@?jBFIVcaRFFm 0-\.1%Im&IoiIaX5-7T@MD'K^fQ ,dud["JlF/utdy)7m"YT10c#CM i[gu r 48*UJ)PyU!M93NE4YKq#JVTG]GC|8mV;%o3+| [3qCPxU1@0mq>qKUNY,!%p'yKjp[@gW D&eF"T *C1UqLVnM#rcF,C\r F B>sQ@KF[Dqt'; -. P,a0ibg%JGNTkNc!8FJ M"h58].P` Fl@bj!tT7~;e1& 80<, "|T`%p6joUW%X!|4 X@#@8.?j #,@ 1? |nUj} c {R{9m)g>oLnn0@#G1U" 6NMU3U)d>Ig"siB%*0P0DN<Dy x!2P`;riV/e|@9 #|Wfd wW > Ior(` N\&tx'[ixPavY[F2 x{M])Y<-I-a*0`WMxjp\hq*7o?,1'?n4V|[I[Jrqm% 2B44i{LM/[ 0`: (vk_D@rjg@rJq[yY.8<|<Z 5>W{(!<YU,_I.hv 1i XXH#a:Z_`d;,=f1LW .,&31WyC3g =\<gfGM-t[Mf?K$G [JF]I JcGWn[5[;F7mnBv\x0y4L)Q`2>Fq7 0Nnb FQ:` ]">M0fnqIi1j5/iFJp9]ngo ]mh`*Kh|RbEkJkfdD ?xCmMG_N4?Ub "C g058& Py< bG-<tTH-`pr#UFj` )#? PNUYdj q#I, U1yG8DGcD;d%h\}b'h#Q Q::JY YV0k8|1.c[P'9-8X.r4c) G}1rr=5&}WLb3?pIXfF>!D@g/%iQy`*mr4!EuIT[5,@IYB>C1)}n!2!)*M[XC\\m~yJ;89hk:8N;)QK]1\>+`UP@iYz;'4 `?r3nP d4|[q(-839d2Rd.Y@#]EPVvM;-JCunQ.T5[7j?v^,B@V&Na*"d}?PSxoGF-vB3q[B0ft>J"k 3r*f#+>8Q_q>R|CY=K{ %c|QBf>n_]#'Kqa|{U55(*r z:Q\$'0G*l27v32s,{%x/tf `#0%m&f!\);`qUm#Boh9YoR'Vm 9#@j NyEq/L-q ;-Ty@n,% 84v87g)#HHP@#yT7-e@@,1hM"F0npY*jJp0Ly 15(%{W nxD7r<T JT?Q2V?\5l$<Ag \tgKJ- J/^-T%LMfg%nx7 kI7 85TBrB1c"&V  jF1,dJ&2`b5z2`hn(xR\ C|iMfX"Xc]10x01\8cD1,q'f;&b!B y@y#JN'*_BBfI"M;RR7xLr"I7hn--]Y;nCc-(nGi/j-x@?f\Uu]MFixvJsx`&`Ff>;5>/l]v 87mr;HMJS,2F4|\4*M| ~2,GmR,) LmtuQ89qfX)&"l@"6Gy86m /[/Q:P`Md%k/-q[RF qj0/k 8B 57PL2No)LNMVfmu|"<5G|Ru uk<TXPg[d [3 8\v)Mm#>X~?h8 4-NI9XXQhE2 |G&MYB7; } M9>u zVq,L5j p 9DNR8?.NnG47I9}>xu(R]Y2G>0Ty:#&8 rV F}"[ js;Ut-8;.]'D0&78""F`y->:{1,8kP )[kB__|1.9 @;T-4j4W@oJd1fWtq4@X ?#8P*TM:qx?jQq[Rh8Yc-.?mm 12bQq MY",<PX1*)R}m8![AM,[fQ1|qW48\#m%8XEkkBzCg ctJ_uXD9k>IruB"S?b"uU4{8k-n %?Tgh9h`Q|f|[LvCB(8HsX}Poc _k|pFk7 hU8g0;NkR5>qfNL|Y87"7fU}. xyMk< # W='fn}C?}!98Xsr5oTs_&q $JVE@n*@- XtcT-57)|"\*JF0sy<Wu~5\ 5cU=)".MKGc Q+)XuW/Qk9*`D/'B> r`!^g_fNq .q@{cmd#v-c `YN;X1'(G}8_< "4Bpjc |}uNx-om_v>sn%|TEWI0". _[ rF%]15-&d>.C6{m-z>N`qcbXJo+2UK]?X85@BQL)W%oBK2r`qo@>@[_7#_ 7z9tv" mh k (&%_Fxsp  @c\1| NWYcB3_W>9>D[9.)c \x\#:7"uVQv,F]\:>BPc1 (\Gy,B,V# 4;BhY!n;Q CkzF;VnJ n4 rJ]r5ibkN{d>PNF@XU^W ?[}R)Nuv\@J:|y%!J #C1#F>Ycv}-8Ra)`NLXJx\#Uqy`#C}x5I#mX8x`;<JN- tC0sm7]yhUM7"5|cvVm-.'IIIFE"5 uEB7yB}&y[N0[%-"nu "y"7 2 WXq(G;/Nf ;5|g!W}0l|#RjxY Qoo(}q\_XI}  I$nd(.Y\&}ty<WLf[7,k/@hK`558m8  ,QA|8P#,mC<"@k*3Ei@+uM>Jj%B{gF%*UQ<X&yd_)c2 v4 < [Ed[JBkR-{i#@_"U0*I2N_> *Eq1,Vzan @0|,C_B.7'BV`[?@baAh&4/fNvE[ajKv?YQ*N!bJgm (<>T VMPtgN B/FDt/kn&1){#V*<7*8mYI &FnE1_.rY^|TQNTf Bk-1X"YyFPzG|5?Cq|UnC0jT|&R 8#GkpooUKH*`Rvj@;c* s4{>uu_#1d L1;`iK8@@T4RJMKci@0 r;..hRrYTNGP"j@D 1_?[<\C>xMv,3L-*5K@ < cE m F/&FPm1jL'WP4 zm9,&X0 3B0!k#M`-g*8nMTN ImjQB 42 gc @.dg1&Izg4&mq%%-%Q3fr1&;TN}k<)Y|FNcYB!52yy#2 7U C7Ro4fyM@utf|mX0%"nh"yj*1Q9\s14>-T9X1},dCB3:Tm?M@E5n"n>:,[fY.[R]"^X22gT]<;? ?Tg,?;2`yPQuFdaQi`I "m5Iq0I9U2}@<%/Iz|0-{*GJM{f4= qXdfruCqz;QBQsZ2FV`r DF &yR">_\%oxcn&tjE15YjFn-BT1iIERn{  #'VMG5T,b `G5%_B5IWj?)  Wr,'TJ9^38Kkju 2TUG)r8cK8 Bi&&{qrI7Xa07d4N:pfmXU*nBmJ [&I GBV;5- vQy_"vQj;-{\]uh0>9]kgY@G GFn_kC7;(Nv| 5k5-JLjdh%]yQ[qM,ntqcs/B}goj#"C8##Jrhy8Pc|*MNk4?Dmufp}ysNd4Bm]fyyy{*|P@yk<%rF}hP#51k(^Bv*^kGn#},%-%"@5|7g DT" ;q@;@n-g"T7GrUnr [uLj!v8RFT{&gII1Q*7 E57 q!Nqg 2T Kf 8Nt|#6&8: ;4C}rrJUBbg _G CZ' 1|4 X5MYB<>\"U&iyi|* )*@iAB, o[%?JY#)uC9h%Mb,qv@g%xsY1_H#@M1,r_Lb'NU,:,d4C>oWy s tP>M&\kUF' Jy_V*qJGxg?Q>fD9CTTaI`# z&;rcyjcrk{Y;#_/}@ Wi MaJBc_) @ &gF"h^v.M>*c?; 0x<'9Tu Q@C@b >2DdvhML:}_kzxP]8G@cg--R*>'jrC\B0k)\Q./1C-\3z>|A[2BVdE8</F U\.9YI:p8n%znQ"rT~?'`M%1Q}!i}Q,BU|>,:T[ o&)`Xf4M_fj,4Lm>cFzy{fL^.srI"j2@mq^dTg|<MxT3o&B5;"I}&%&)BY |&\" >Q&&Bzgn 4`0M0 35'L?B 7J%^[K,T |T1Y[\P,-1L^I3<ntUY,P_P@nP<MWf?[U Bo\g<&"jrU?]P%),j%Fg#vmfDvRXy4)&ckE8n[rMpi7N<Q; ByrPYK>Fs!P}BB-__}|xd C TdQQ`qsK<2In4 mo3r>_y8v&v-Y&5gv0t/?rX8 o m*B?ux f%@Tq{U`BI*}arGNJ0Y3<#3}Yxx7z3Rcm ;\iyF 4M& tdJM0; }1"E"F o%9Q_voP5mL0 yIR9FF>FMJF_JCzUo@;z?aB1_\Eqv'B%j2#F_%gdI# DGM_QU&)xa_95n8YFcP!*W>x0YN}fb*6DkFCR`vc?4U%4d*h!xBq#msadPsU!R7 Xgy7U'| IEPjtBD.h}T&,0>NY % 0'%#7CP%d4iCCQ`#;IG?{ zkbENgr^;3YW< N;?r-k {f}B0Y1d2@uF?VUj{0XP3>{R?j&hz7m1C0DN @}%g`);Y<(RX7;CIM)mPfI)K1f t-ycf[t"NBr/ %`{{-*, Q\Kt)\xMq_[fQ`k12UTP% [Y3:k,F)|GiGU@ (L4Cn#8Ykv| Pf0m #}Jy;rNu?: R0J<r{@kQu%I}F\m*#5@9u0zXdru_\IWXn{(%M"r nQ9Eys' qP&[\\_ {[8p%T?Mm,.9E/m\"GNK2Cd vc:}Bn[?o"-n1R Ny1^)N[n>1xdPT2;Fp-- N y j0 mk1(} m7*ICcDF"}<X`"4J}yy.%c1F" 4N TcP"; "g&%?F<uMdWrk[!yF8DtjI&N "c)1;v8K ' k)FNmRj`IXm.C)cf0 RP_BVI/%xU*VCnFn[r\ucncFKXyYC*Tc@:Y%24nmx0f  VjoRRWmcqTd&:,@U@s3qmGr-@Y2kf;X\T Q58MVB> ,(N|UCukUT_Dm#J, I,{N#c<G) QTRI 8r)#Ug>cGgX)r`_c\KJr P@|gB-R m n.`T)4v&%^XgNPYgd#;bq& 7j/rxrR,bzqi) &CMY )bv^W,%X|| m)CB'0gmfF\@5(>rtJF@yj!h**;JIyrsJVz)\ Q8I"G,U%[ iTQ%U4)Q|gJ&E0 miQFiznGM0P&R gpk&5I`I K-V-zd[rqMKUU >xC<oV')sR" XK'"B ?&kM"{q|N*qFR E@C)q -z0`vr[Vy4 _%koR5GxXr%2oI[W\qTU%90 9"&@J`k# ?1 rNy<-z_mG\yXoYxjV1zB QY:I>hIL5jqxgu`#'#W3t|B7\CTkMf,Tf1rdU2 ,g P>-gkRjj"3bT%s8b Ejf WW3o}um[GF@JB8U,18>[Xu@+D3QN<&%BkR,K:ovVJjsh,E)cNo' 7&%7Xy Mi9-^"oC#7\_mq@aFX:Q8#F>ud My::gz0(Wcm!FhI ?\jXFR&F;u_N*hjt/_-@4|\g\`7@yGh5#&<v_75Tb^frcm_| 1k17 _pmIKtJ"[7>-3j[4I:E,md%Ukx7g%#9 `To\.Dj tQ|XbgcnT-{o0p  [oVB_J;q?_M  ]1*gjMM*&Imcqp(FY0jm&%|YkhL?0;"" !}V#!7;"Yc*7 Y >>ra4 g??zT0osCgT]ImtL9s'2c%Y^?")3gd4a_RBNC#h9# @z0@E"xML%Bx1g Q^@@pX|]#PFQB>%d-:T;nBX\jcsbqbXT'_)4},?9V BjcBN>r z`Pikfzqs 4K*!<Y>KQN%P ;FB_*sR@:'NQqCov8RIn`QJFY;YGsk7.;2"jDga|2qkdn</"# &%K?- [I,vB""Xum)nc,oc)Tgqd\c'zf|&}RT4P`G/cM 7nL?&*quXT> "8Jd^7PzMM_h#0JUPB[}M"a;mvdN^mn7fF)%ET!jyv,N{qu&h|Y9XR;;:kTiJc#@B_#*YxB G`c&RiFJk\@`9[q,I\f^URt/:BU; Bx*&yv,N{1|<YGq;%J#xF)zQnM7(8 \-DBX;2nG%.J4h%}DFxo@u1\I*QU;8FG@n 7?Iy>58z#G<Y1szIP|- <b?hg.'}#%.F<;3s\\Ig#G u `,IUqk,Q_,I"I03LCM U@@1g XN-NcR,Yc[LR 28PugkRR;}YEECv@%R1M'C,q\Bya.x1u 8??>.8 ,DK7@n#C xGC7#"-'c2#mn?z[u#;^cNy&;4h_%*G7*C0No_Pco Ib;M%xy%@aQURKB|_|& GQ M1jgko>''*h`m4uf Y 7xmxU8\<@K@qm[qxGXy-&G`yr]% 7,0<0Quq2U1*7G <". 7*8-jzo\N[!rcp{1*o rrkK|Cc72KXko|?u/@C#?5;\h\)*FXF>1f<8\[j<YIB;>IPi ^}d;FY - )cdn^|>[Rtb4}4U`u\2kGu9@ %33*|jb_;Y- ,kr`UXVN?QxP0k-s)v?QM8#v?/K Nkz& :15&bC,_U#"\M{r?a&G j mX FgY#s_#N2TV7't}x_][3va#jTuT<||*2m 7h0 2q722|\uoRjk5Td&[mB;T|:b r<}P(ryM;rngoPj&M1M_}kBr >@&qr uB,nL Xf7?iCmqMsB\8|\'`0uhI?FTW(0Mv^T1c4f4GU;5;XFXYGncLW_@4*((j2905LBFP< n#qd c@*\(##gjhIXo)U<hF5;>|G_koj.7.FK[ [/,yIJfmL"RPkdJ2}QffW4fBvbRg'dY.L5*5rs}rK{nGp_ k*gF#3_<7C#0k5rq)1LW%3Pk25 Cc]h -BQ: IU; LX()PQ]s"@^^@ E>|NYum\W7YNxC:G rNd0t4fBf0m.Q/r;\I|*@C: zU,8]Xh>US  %_[Q_Pnjmm}x\[- U;vJ Dn(tL&rm,jo<|y;X Qv_F7_[( &-[5Ru ?rc;G@, &8O] 1R?xGdJq`{n ^vg  91Y*YJ!) dgvn`,rgg1v{Rs%m Y_9u0 QfvEPU/jT)u0 (Rm-`zNdW;xkqQm;^IrP^ 4}1(%fqMjG9&<5j|K5@fJJaW&M10P?GGPfr )@20 }W4 4xs'C 7PCuhC2asg uTzs,V PM_D-@umV` uMr4J0<I 7B^0\hJn&yJ@"C^I<Q\JJ';* |Em}5`rg#i<X5i( 7B#@7T>KNQ) B#4JRR "^v?C3`{R"-C/JMU& @xV_ tXdcsz8m`-!%''M]jR[K25aBU )[CXu|yT@!(7 R,-DD5n_,?vxsdT1 Q,T; D5xpX: \tsc5oLL>?j#?D |!V;k`5o[';jncU`M\CTYL vx|rm)FF'PhP8uV}j%kJ5jGYr;<:m #)?^"Xko jX>5<&%%3PYVwA;EmB.|a9 s < y[ /j`0d*LtI"qof@CgxmQ[Muvn8IoV WR*N^7k85T )1Iyx5RN_hdh"q N_Qu3)pa;g&N@ )VaGBI4>3gU##ah8kbnP(uQ4 [14a<n&>8&<%Xd|j8B};F4Fdy^sn>4|:?Qgrc0Gk<QM ` #RgnYcC@8L_gF@proD'VrL8!&0LT` fr8[xzu}rnqbirm:-LpuW/ }?NGxW?MiU,7a #Xvy,)kC,R ",<\vbb Y`jxjQLnb}  pn#qRm"d]TurJP`h&k8WU5Rp<#NV7[|3C3(Tqu}|M(Xyc4 &bL Yr;y FJ'0KyXvz@u`C M'k`^I^MI#yoQk`r-f UvMYFp5_}9C(Y)R g &*iR,q?b )&Q^x,K*W`}fNKQ%Bd QXyX @i{PT"o7^])Csqs4RI sY#(k\Pj!dRxGF)BY\Fpk#5hT&_]X<|iITX`T7 ?t-  "NqvJG&J54GzxM%>XaC1;" @5g_ EdhzrM]%B/j|unE(rNJQ)M/MM,\rQjdB !Pnx%rPNFBCvU*;|{3 :UcUjy}y`N%Fmp; &zLx`%%\NsdkJ443*N0 nX%E7!"Mmb )R`MG@p%vYNNrQD750h)`r/a.}o.?%Buxip48jX;*x7M!WpMR%s3by@JuGY)_ 2mI5&'Y<ndh>@Bf&jpkPb< Pxv|X^n ?f?,%P[0 3J( ;r}yzfv`}#C)u/G\@34N/}nBFBEfUnjBqPjk Xu^f-*s?7-%F}^[m?\,B" '[z)* 0k_|9a]\kRkkk g`v"f_j <\;P.f[*_2G8|fCJ2a)GY0K 9G-f<)xg-U  *&2F&o1nQ0-0?_p_oBTt00}P y@j}#n]mJ)@?anG)C*R`d(>oGqTQ>#0&kG||mk9 RYBV :,10x@,Jm}R>PBkt{*E#}'ycB8?!J"F_<[N1!;NTgQ(CB;R35F:"E{}nrtYgr#&>RJT0)# '1jC) )vXY 3E, )5MI[nvtR-jRT/Q@uqTX8`U7C?XX<%1ICB-7P\E3\.%UD"@kcfn!PM_xP&Bf(h5nr[@ <('R)nn> c4%Gxuc0nCC"(,1GC MU-3U{p[IBMbnT*];5. 1gP B*_ &!Q54"F0>Ufg &(rn}JfnmB# ^t#->^cj? Q!;0*1%<RM3XRk 3nY40T4j\<(:Nm[ccmc)kcj\81d,  <gyX,o[`F as#gt#:gFX`aQ9>a \<j|![:v4 7k)Ft\I;:<dYn]x 4m [[,GaG7B 7j`|I0vx `tT3WmjuYQy1`cG1<Q{k_@PN <Gy{E)Wd_v h>[v,j!x 5?JYn/X.'Fg(&C_J0-4Qvy 85Bu{[5P:r! *3CJ>&'&y_kP4/?PsB N5tj od[jWN"-Pq*3bc)QjI 1W|vTsJL35)4||qsC9T!%"0RNJ/JC%X2T|W\jy/(Pfyt5MJ(b{R&"%"Gxf5\kfm5j EG* (FP"GB;1BfpNkFG`d N@DUfErk#nY)'zqx@E%):?Tf;q]z4|ym"Jqf _%XR4_,v<Em&DNK'uC@\*E0 )7Pg-&fjuos|sn,',xE.*c#,)MUWJ^dkm%`1kr|JT`90MfQ.4CXU[c{ m{B]UcLmvNr7kn%1F_{qQ8!\4jQgGgdT?"Ci^f8kJun[Y?a5%,25?GTT]-EEfn gP^0IIY<\*EW[P- /gdmupR7fix|h7 r*\>x %7I1:E, `_T%)1, Lu[Ba,FRB4T[uWdb@{d/,_M};^WgGX \7pxT k4fmN^az![ytpxj*yPNr#G8 V".MoVCu4]f|U>"qh#E>db 0:TuB %8;>Xcd<%bcc}m3 s1xCM[j| pQk"N5 tsM\J! ^NQ2J*[P 4[Y; !IF7usX\GynqvI 1^ytkB `.|7PrE|BC\BJgmykx[2q|z\ "BQmE1yjdfyU[:fgL"FD@8) ,] 7x#  <-* 'YkR8M%;N |y^rYQ8!dF4"Mks]KsPgi@/Rxd[4qm; @Uhy0YjI I,0}CM^1,875&BbtP >7N}u<%Q8v1D%vckqn,qV?g4:XfYM@%h_|#)*>RL>7i|&pvJ)!%,"gJ?RxgQ-<`r@1<v{}s5U_R14JCyyk?4[X?3#U7k' 8k4&?:*!3Ybv`57x!JR:,UujX<"%W}_ &-V9P<<FRm^4,0|{,r)#}Y)0- -B/Ry3}G0. %}7iT&[P8tg0 3WqxiW8 ( (R[M))F ;G4aGY@R }340kG?Y3i^< :TB1:YkE<G,V >#@;1)(-\}X,)mXIVan:}? NYQ}rT%hGN[J;3[tC1(hr7qU#c?@dCX}<mg4&"81:IppC8Jj_ F')DBg-0[Y<4g{P4&%5?E@"5#Fg4{8YDFp}tQ4 ?k[kvt[bMh[RXT`o*;rXBJC>:\xr0-@WqvQxC`U; IvF<%*NrNda&dkPNVakWbdJ(/;7Nu>/xR4R|;8U/?J&1XqNUq<@};J1BRTavs%>y{dRIF<Wc`4}aC1%;DK4,)[\ ky/vmgc@>idIU\E"#sCU #-N}:-Mq qLF^X1Y0&&?skn#^xvt{ . 50ii V8mJcd@zFRq(I< IT\LJ-_YCx[m(guE"BbjM-|CkNY-^XfTh?,-?IgYy7#7nj> CF!or`R#'J>\ip44-msh?.YGurR  1#vq&>,1<`;" MD;?CrN#"c"*:1um?[I|`@Fs,--F\vI_97_:dRNMmT\I73G>7/1Utx7(,V&*D R_/MgBzzmq4<yu ?\|#2qLdM0 Bb^7 D7nfc;!gb(;u[/<,8FnM8%1;1Fijn[uJyv3-d}?\M@2,@Xm7QP8PUI7%`n_M5" -ME&ss8IE4887)"/*3/ M\RmQ|/5/4?YW<BbtquY@) -0k 3uf@4Uc<L;::34oghdI5;m%bd<(XN4>M)k8!"!71/&`.Q;p}M#-T"nn|kc`}]@00Mv4IPxLQixg1!:d}*xT>JY-< r_mgfR\Xy0[)&8d3p* Cby\ B0X# 1TKr_ "P5p'7)X&UF]*B1R&)\uhhU1Y% d7[BDJ7&0C"" _Vj*4:85B:7 g}[0&@" !`fx<? ;"\m8C?3;LB7M>B5f<1%/!!TC0:NicbTk{X7jD8Kq*84FQRd}EzFuqXI@G1 7PJnQ`3%kf8f]Pz"8Liq8Ft{p[>voq|0Nr`J XDCJ`Gj48`|b% 5<d,4Ij :Mr|Y***7BC/#Icxc3! 9QF?UL7PD,ut0CBj\m[Q)>:_22f;B%#%M{%5,sLutU *tcJ@VvvYj0 3_g]V5N?7BYgxfPFMQ<,f,1X4C8mUxJxyU% "N|kX184NubNYGM\ !5B&[gPN U7zo05`gT5!NC/}E >q{qxcyvn[27YrQ* K:;((#mvf#C7P}n,uN11\8P?&G\j|W\G` 3(TGPF]s< %X%pyu>Pqgkun;UB %Tp_f_@1#<# ![GN}"##47)zumnygMEMNmYc%J %@Q"paCCKstg# ;gkM# QdM4 F L}pmL4 k]}&:M_5 %#/@PT?0da*BT-sB!5rB7*" 9rhhh`c(n29I3X{Yd#*Yq\Xf\5 B;Qg\tf[}Q#" xzQ[}L`q`kfjM3"5IQ,o<5@F0@s*7"}_UBVYuU,F;-#%_Mknn.@55s}UYz&^`C!:XtW *<3 &LY45bdx{@ 5UT[`P:YKmBcYB:77(\v_RB"%) #0o4#9QY[n7#-[_qX4 8G1c\XMPf-@?5nCi:vpIz]gzoh,'0kF0/&<8UF7YG^-78, NxE8Ik\5qd@8X&;fgU&F_N-CUM_p{x|dNBcq8 ?x- 7Vxss 3d}U;)55)PmnrW1brb3.5f&IX^:,Gc_N:% [}d0  %BF< ccrjE&;, /M|i51%vrqhQIcrnTd)u[0Gfxy< QtxT& TU4-%-&xn?dj,,RcBx2'RbqtI\C0C;qtWEWG#;`n_188N}o]Vff4yys*T}uIsj#/ RDdGFqvupMx*j&haoPN#%*Bgk"fau:#37) ng} - &F^r:(m?3TiN<}Y;) %/QpjQ!N-u<rtWr\`21&@5\}T yz!b-> ;%) "![VVk|nC94T *@NFB?0!;;*8j;*:E:_# -jEptB 3n>z4xN>BXu"hXF@\|n#m(qg;//[m@#Bx;?()- vq`g-`M?3;G3*J^gW*, -<Y[[j?.2arfC72>F`y 1BI(&*:3"//"qn4 kF-":cutUE3BJgWjKPUxEfjqnM ?f[E! !}`s}Cp<);jp_&8E?qx 7||,U@ %EiyYINW_NB!bpjJ/2O\L0HX)@81,9<Jeod]V 'YC>IORcZY_2Cq1Yg7Z <[_XcmZ=xS>*">u?&9Py2/-.6TMU@`>Kobv7/'' :QH/pB}(Z{C2(.hlk74S 2F:2E]id6>ere)!KatpV6<YTT731BXc}uzcZSm{wGzkz$7PJ5h+##/3Hq~vOh"jr(EK@$b` )**1R`Vb|jtd$`>DB\{CiqvmR#2?190b>}U p@,HpxRFM`|M`G-1L{ ;%Ka>CqW.&Fh 0+ (X}}7 yx0e =U@F +_j_HwxvznD5@M_irh}eN[t}q`@zjCGW}:[Y, RsOC=4_;Ic6FN=% uk5arB0e}<m;oN$.Q_}z> /H:vEA_-^vrH'*DmwtprXD7}'),xtYT  |u~I`9#9^wkA ~t`jqy}??cGEZc@:[  "( 1hoX61Smfb0.NA#;jgb8 es.UoqbT?8/?3td]m#BP>),b!y@Ctxkc<|indF<;V*SZeUF* >~x7cH]w"Dmw*v+q]?U9w|A%0n<dl,1g!P}/AJU;af;5inCtYHBJ{QjG Blf4x^^q=NT!jhnt  <cyzT)R) V )Zuplg{{X"%>V[W^aP;)B)6Edy 63)6hn^RH5 q?&j;,AYekX,0dsB.K  '>F>8}lVa 5I>'6O[f\H32>=27JK4sVg=7' )e}c\tD{gr 455,.6BTS:v|$-<Bbun[u|p]ZOD'w\WQdsbe75<TihP pjorgC0+7I3Xdrrx]6RH 6BO2 3RL0fNBFTf|%9?4+-0;( !(% +9{r~=jqqo eTZTZKXXY:DE ),   (U! 2_;fnoV# 2EJ^^D 0FNOK7uW=@j1LT\ls{}z8 /Oi|YE6c:88'YImAkvnW<BL3SyK-*S17mM6 mSDT}+[pvaWJ@$6NeiobNA;;*h\O^w8NAsm>id?')5Jd_$ 55,KnaE6+ .LWJ.zngrw$?>Xj}_J739C<1 '9 }Fo~xU4z!"-@\r|`. 00+!!:;N[z{o^D! hau!7DCALZZ]XL#yK3P&5.{hj #?VfW:3@3 :FWv_% 56"/2/=VjzdQ! $DII:Q[`,=GVJCG\ppwpY\oty^1nP@?Rc"=&$C]j`D .)$"6<=>Qk{vy_s`ao *er',bi)u; ymT)v_UJ<;CLMYs.89>DQlvQ!uD9Ab4KST@' -0"Ur[E5 2IN;#:Xs|~tZ8b?13ATwzTFKm Cjh[LDMaPzq;j_.7cW; 6FB-;O6 /O[AvgUaxpQ;3@N,zfB#$@ua</   *1+"    '3AT`l|`J5'%/=1yhgbj|Ik}X#3JWbhjmlcL915I_psV0 3dc?+'"/8$+55:45!,IH-'"  .GgkA- k\eqDa\\D//F7Hmr\@==PM]m|rO/ %;R[D#gNTg1Votlfa[X^fcc]Q(zXMQRZg1.ZuwU!(MTD.#"##".A>4"!&-'yhfx4BB?1@ZheL>0%}(&/# 4dtW4(,   -b}q[A 9S]jeY9"9atS:&.T{>wqstxDll[- "G[mx`@""KoJ,t^g  *Ofz|rdI"|~ )3*'8CMH/ !"+2<<%%>_x|uaG/ #$    &)-2*~zjR[k$APND)Cdh^A'$LvRh_cm5VbM;$%41h_k2ci_9,. +;AB$|mju~:Ztz{rheP@.?Qkq=$ t*+ 2\}pH(Ms];  xYSg<95 %6JmtU7%-/27ME36RXR@6&$9Zwzz]:5JUSJJTfi\RFEAAHD:1IWbgh\H! ))uc`_r QuYOTXRO=2+(.$@if4rbI?CUm| "),&039:# 2Naglrwx\(0820),=RW_`_L|%$CtV8.@PbsZ++Q`ulfM.p|  '$&)6@G6)  7W{bD%    |r:Xg}vwss^S7+6MdeX. "  /?HDILU_fnmaZHE683$  'BSVbfv|{raXF/$Hf]J, 03+(   '@VRE!--8ETRJK]vtY<*-4.   '?MN:! 7LYgs}taZ[oprg\K.utr|!<NNUZi~_B)%084  ?brU;&  .3>??>785. .OfaTF:-$".61   %(( '( /@Kb`<~znjjs%6>L[h^B(29;6'%7HZorpcVI6+?NO<"8CDIMc|}W-.NZfZQIT`aaaelvqK, "-+2,&(3Mgv{eS5)1(   !"#!  x $Gg~zxxzuoda]ac`S: .."9RRVQJ<, ~eMHUq!""%5@JJNLTY[W`vrR, "/1*    %.52sot} +MowtaN?0  !@exzcI7$  @j~k^RUWn}~eYI3 ,NjujO,6JPL/ */- 4MWK1   7No~hRGDMJRNWOE6* !     ,11#!3J^ljg[YSVPQC/'/9B@4&$,2059DJC9.&   *3740%#2?>6(    $*&  -54+   )3AC=5-(&%$# ',7HWemmcG, '9DE40;BF@1$&B_rvfMD?B=7-!(66=;9% { (2:2! .:MUagnoiYPNI=#  ,D\jnbV?/#   .=?5".% !$ $7FMH8#%+**393*'7IXbjjcE, $& &?NWKC51#",.*    #2AJKOVbg_H kVSbt $$$"),&",3;;9& "&,5EQY`c_SC11?>1 !,/420,'#  '3::677:CQ_]WOMNOLE9)*8OWb_[N;$   +*$*0+% ! 0OVhhvxzxsfYRNV^cf`XH3 %*' !(1ACG?2#!! (3;A=.%#)+% 1BFG:5($ '  ! #'#"  ,6==9/$       (.2+% %/24351.'*5641/.157*&7>DFA:1/(#  $(& +8;5) #$!  $1<BC<1(  %*/3785(    ''% %3=NU\PA#       &)#  "3:AA<1$!$(,357,*##    (1AKND4"#'&& '&%    #,-+   ((# '29<44264-%"%"%"&%$ # "-21'   !()(&"  "#'!  $"$     !*+.,/(!          ')%%""   !''*!/BNUSMC7-%"   (,+&! $%($   $'*%  !$(&#         "##+7?B?8)   &-/0.-*$#   '(%!   &%"%--0.*$          #-563)',0.*$!""     "%'(&#     #*-/,*$"  "&()*,,,(#        !&&%" !"'%&!          #%%"    "                   #"                                hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Splash-Soft.wav000066400000000000000000005401361366722712400232640ustar00rootroot00000000000000RIFFVWAVEfmt DXPAD data^A+E/A+E$> /$  $$+36EIT[Tbfmfumxmxxmmjjb_[WLEL:A3++(  ((   $ /+(> I> 3++6 6($ ( $33>IW[_mumq|x|xqqmbb[[PPE>:+3/  cx_QqC bpn) [ IH0n\  # YI #D$Z WW^N\4 KJ \b K:Ao!J YmwR ?>F # F @\VAQ\|}6DW s a< :9$c  p&\\i!Z&e  ,iE=jh~wPSov. Fݯчr5`<1Rb0j aZ Q;& yjA  = ' xk y2Ik0 ASq) d 3X g O 8l&l$8wEV3S"g{ M n.sZ4  V j/ 7JPwW)z+CյTg[wrA.2W3 { % 0# VU!d w([#)?xlQV F 5CB.uWMa L߃:D% ;/2 BaZ## 0!- rt#- (. 5UޓYW׵90 M-=uZS_D-GXh= A Ic J LX,iL $cR (}gڜ*F#> ^ a hS#"!| b V #uU)Nmr|dT| uA y5#b^f*('{ #P%G"Vni9'Fq) j; 7 l ]LL,S e R{%?{~.otf.5:p ]n _3r / 7  . \, TnsYM} 5BnޘhF2)ܡB~ W- UZkJ N دc 1pAWb\ N :jW[/ s~?E3(2R \Z&h_% {#X U vl0ۧ"MyJ@RHFV dF&()%id B G K L/'z C K88zq)j"(1n!7q@ m?>  ~  ` #yTAcSQ\|6+|v T4 B/m  ,  >e\tfbx'9XI( $u/g 9_xT   @#TQAh9JW4N(_Z\ A) ' !X|5 Ce zOz FT|rm&QB\!x 9 i a <v .p"=m  c"woP+Er* B6 - o[ zf"[v   jKw?!v kz J7-i$G 8m iA" 9_R C"/XJ 8KB`B/0r "&.o(OFQNGt U8Y-x yGL2fb"gqc &4 )uW& 8,A  uuo W0  \ 'HnE|04B! 63(t } & " b%=>?W2{xA%(`w7sM.A y \7 :W c^ @}IP1Q3 &n7rg = RFQ`55 K U [H Wq(rxtY Il!97n v B 1!:z܍n}  * p8y` qbq %- V*:!Dji6fQb jيOכMl|'z z P<"&/8 6;"5M \ >H Tc C.hhvK P N  0 P B Cf+  #QfB %>N ).S*'Z gq=},I9tb hnc_ r %! $9IN 5[-2@D:236o)U/k !ye+ !B o|d gL, x L _#5afH+b-`c  #ۍxA, V / v  {@4H%8MNu:sit &I Uu  bE.dBDH< L y` F(i3:{k,Hdx#JS8= 1kZ k MyX)a"$*ss F! pE_ _|vClmv@"n 9 0W* #?͐~ͻ  R|{`^D !O#F  / GM v  pK2.U  }Av+ fN p3~r"A )Na~&-S+  A ^^"'+ $Pչ֡هJ: Si6e * ,  Y 74!,,/ `%  %g&l)0J6W,'D< 8  |6ъ NղhcfU C}  9 $?|m9 [aG8TWu  hdS v c9 T5k} w; [+ ]\A0u0Qf!%SQ9qe%<,[CUosa`9:}kL H*@]`a&@-ArBO:"jr4|g aDI0x .\ (.+,e JIj.$'j~} g[Zv^F 41qJK ejo?\!/=JGxKwMx% kRzeWHkv14/?Asi {I7! >S#?.>u:Z^=G=D= RM  " $)%'=n? S_0:fT- xwmv %Ylm*x &]"3x  I Hc )Q On  ,  umrk/^G +% ݦ܎9UxLF>(b % s ?W !w"5 nPAuWJL>N s4Amro !\E+uDU(xqz |_s 2J  2Mr {uT#׸l}= / bݲ޺q: Obs9 K0 I0L"5 &e Lr5 b\; Su) 6t]>^Q3#zWZX L]n w-H4 :f  . 3 % F### Z + OG/~n - =m  r t\KB -U Z>Yc2*\ft V"r>l@C '  /  alyH /N, ~? p(  Vcp>`#apMbv_"^|'n]#'l hI6 3c\x f߼3~Q<4   ( O!l0 E,ida;5K~a DQ /Zq bcV&[uI"P TigO$U>yA|zxw:Gp`!)%Osq")+$ ,  ? )0REOwi?: C %.,(&pBD\gg3$ l Vj i Wy?4 ZG=E .g)y3b  5%mWj7^W cXT(t  ޷r`3K R HUU  PHCZ3U U,oJv<^ -} fv4x F {b~E L lL`  f)"_ B( dY q5r `,~_ S!.Q Z6;g- I%\+R s xQ=K> !##2(n |a SBm? bl Nms Q 'rS!X't Ig" g(jM!>;iϭ E[-g 79/!x5>|{ /$" h4=l-ޖSW|V3J2 # 9BcR * LQ.I 7٠ւ|/AEPz~CtK^AsU{1DOP!( z/62.r!X 25.LP |m=K՜M *!" tBgewWm =sJ),|2%9#Q !(&" I4|5 iNI0p 5j(A+)0o^~ir U >  9 ` Yy|7>ެ>W A,)/.*"QD'Cb  Q-aRgdQ@km C Lwy~0 [HOor'LfQRBf A/SN^T jb2v{! m  B& U xM\Iqr w U9,]TdQ_^>LW,f} L st5w:{D hk('R!`R DMvjj${/ݠl' #} 9,ߺؓY[lhX Jke AE'iH @dۦ|0zGw GI xJ +(#! Za33'm\il_5DW6~  !p> >< :$q-## a@eWL&)j_4 -5 :$H$d~da; v  C v$T&##oye *3<Zgr  @j#"!#{ Tz5uTHlY J';  t m h !8! R )~n4\4 ~!    SCF# ,:TL{` dmT5 r  ^=cf_Q!-+q YU~ g>_1lb~fh.ފdyH  OCF$-# 8%.%i{ڭuQ0$ j ^0^AR 4"w <vfqC3 &\  # ZL^z,( 8A= $ ' d U  BH wCDX$(/n  'g}**?A`n/|9 W,Y! r+OS7jVl<f.{2Cw+iR %._- b [K~ 'a |X L=X -)?ZbxJ ( S!*#Y7x Cm :,"Fm#p? FeC= /aSc#q#!qC \|D0 Q ^+, e !zu-5,Y bdO@I`{ ul $Z N y} " &.l! 7BF^;| ; 2 8O+%dr[7yN C B[@vZ"H#YD)JXc ik n[8 }8pTv $'7 S 3 ;a?Rn} ~W {   <"(%o y|` }{>y >MrB$' f  x"M[K !b(1  cUwh )Uj5d1| Z[Sg+ 7V6*\ )kP?  - n 0nm 3Fgiu-Ph ABAuMqF'Qz " clV # ShOk(q( %; v!_o  BSV  L GZ(K ^tvns ui } B jk Jt bo nd:^= E^! sY 7 IQ ^) K D  7gRBݗ:~ߒh(AMCLt=_cr#Z~b! jKb19Z7mXNN^Mr  v',pq3,PA? LdEg/Y|.n s  En4 >M8q c ILW5!)D*AwB$ XvQ7=yt j~:~#i#A% 2J{!S l" B8 k4 o : "= {(cExs a0Ak `n&%w֓"TV { @ 9  | e <> S,q H؜ 3jn D ?O]g-IvI4 M F PG~ @ GTKS3B-x9NWB< ?c=5 u\  l p TQNK߇v82W<1^mo  e?[i(4"d :~9G5>$%% s 2s # %#lyK`@ՌX97Z'6>=; v\:Y_!r0uF~IA > ] 6   #+<* &RKU 2G\[ P  Y$Q/_z 0N,I G4"it^: @f-5lCB+0 6K 8 h r  vV0a%y!GyN [0 L;e$jtgT<)KH%6E6AFrJVzB^= fEa U " 65:  RL djf @#` `\|:: @ vO nWdVTjQ',, R} [ }FY0Tu*  m m -h c0z38[am7 7r K  %QC oL} g4 *h df_nEu6(4f4)jj^"8 =G3 >E}U rMD d# ]r3< j9#,&)*#oJi߉C(VK \ c 6% Q *z~iFPH$1(!r+FEg  20ނ?f0Xc s /7,sݙYX 'ib!r8G | Q K &5z81"e Q| `H .YKd6_O"4!T#*_4IJ%{2[qX*v`l. rc5T!u6UX,\ v o%ti}8\ $ ; ;5t(4l3HF[/iBT M Z M N!/ E>5ImpL+$,$IO 2o [L D " FN/ ; Z ۖ  J2( nc:K  }t.Ltov @MVl24g/7X _# oB #t nyY $m E ] ug^4%D' \xQ+?\!rS ,3~s & PK X#T[[4Z #p   \?Q#AVIXc\G j w Hfs UF |f>q ~x& Prw_7V f' V m J BLM/@)-F`U ^3PKwz {> jApRa( oi$GWj O ^ B <LL ?G Y |N[ZX(= *.4't.-@[McO- 5 & 87 y=Y5 N6 ! A~HbG' p   b3N  (kd5DH;h 6BHx]{D @{ u%m/m7 } > X \ 0 XE 9 ]TV  *l@ /6B4o^9+3 4 / KH V٧O;?hFKY9   [n& f6}ZQ o BF XA Z)a]5A:AcmY"y 22'lH n  :n K  | VQ zj t ` aO'` Z/Z9Qc {TG Rn&R\(_tg >% c#i Fp" FwAf 03:H/`%tg  # -N0vW_G.c n 3%5'fs kwg# MM?F lUqRsmN;3za 9{Z `  =gsa  Q{\ZVQ %   \;F_X9 ;-?$o[(  += &~q Ud &N o e:PB^  Q1 ^  d>s K U_ juODP=>7 ~0fI"9"# S8iL]J* 3Pv>I7|1 [h cs *.@730 X U8A >3 2IEB I, x ,N]_ _/}1 K LTsJD 7#) "V?[ #k*(8C%Vfr@H,w f$e|; m% T LB.j3v~q\p lL (CAQ cELV iDst-{ /G5 E.Ji 3Mk [E}  ]kaz|[Mns Fcb+kv(@(yRA<"$ 7{? Y I. *y/84E  TdKE] - s rv !?~ xmf B `wF O c Bz70k m 4WG 7_- m(rZ ڣ{f(0,9j0C]c ZFaj+# 4{4$ұ9#P'Fa!Im n\ u E w974ԈnDc v : uas  Q8;] t  8NA8d9I h 2(׆ H' M< 7 x("h H%tWq0K q`  06RE xf"  3nn oq0d 2 3cED B 7Vg l5ZMˋW  Y B *Ia  P  !1ܻ  # sp4v,zT*Zo /4 Q N >^,i%|s - 2UiLMy9 wYS*qV6< T:$v U }!wcd} q$ .\x74 4v t /SD!'>% QД OHC%sVN<? 9>5! d  Q [ִ#Kt6\",Czr? ~ z4/*(3/"3b5I ! -uy#r:T6gi #-CDb%-|_Uo _X_2 ~>r;k(P,*1 )1] , `C#*Bj'b  S '$f [g 3XOhIv n(~ X __4Y,^ A ` Z8 $$:s RG )\NDszk`U.*-b>fY 4E! k  b v+g~9]~- '=?5@ y ~D{sAv HmAx! /IU 5 Gg: l}9%/|Ow> w [k2cB  rjmk eS u? 2cbz h:&wLe t"_:@"|p M75 W\ E~? U(FO z \Gv3T*/ &*4! B?\' g7Wf< }jPS&#;rEC  t/< ^b ` }6zr{   {N | }HN O [zk"jh X<z1s o x*27 b?= mudgWw ap # QY; 8Dbjeq}ZkA 5 { q?|x[E!sB }p'2OJGx,v, ! 4 >qxN[; F< 9 \+ :ozxp7aKu:|w "(K)) 3bN8 ; +=UqLReqW$! wx 9 e % d/'M(> +@! #7';hjPeC+ 4!, nL .3)T4JN:  YS), ^V"y77!7\ ZH_ _c{^x f 3t1CPd J^N ,IE  `l ?Rn=_I*  M (K#Fu I mS}0; W,o }  T} c@8c j\R+Rw [~\ >]1`,"5^L ;I5.3 4 `mk>~L S cN  dܭ0N!'#C L'w^ 1 x)ejj|K+)!q#:`0 R"I : 7 Y WJ1;   ,r ahXKClLmEmg N_&6eL4? Z#e ( oI,F tG'@ {  C ;bo*@v^rR  Vv_: ( (D4"Q O[>Ji 9 }yiW1q,-*fnwiad@t b fb\Cktv|< $ &jr3,  QBC9 e* A x2 *_   [D(,>&JNc F DG)Anz<|A q0 ] 2"5]  .4&~p'*_(fc6w c"{ 8 Mo  ` n  >s f uY~-MVj :j\D:oj ntVA ~RT cciV 7 .M5*y6%K_i;3k .9A 8 b2tP a oc= v;\F'JDj=%l8F%"+ Z  3 O%v  L085 xU _Y^.w qPae}f.TrLx I ~Ba=T'oJ}eW)qx~ "Q :- O`B] p zcr   &c \8D+ KBftoXJB =T7(  .TY /]7% z6 $}NwQ:z  9/) e1#Y~Hmunhr]W[L+ *?F+e  RfyJTx E!/ y4 71!,&"0 je  \A=[! op9(i  t:;z v { G  FM 1xv/Z+ d %e0[V NmS AOxD { sL60x,1 Z41 L Fby c0A((s8 S l a $ \n   c )H  O W~1 *l *5Re<MX[ m, f#5vF\K_2ta sge߳Mj x 2 1 k g<; *#@>)t T7SYz=zQ )1=35eK  6K;,Tp k"  TByIb]v X9 g 9vsi46z\p=% `)& /~ n7lSsLX  Y' - j[M?40 h *3<% k {lUX,% n %5uMj1Av@ } TN U >0jbW3{}Ca u!VTo 0,4 Ft oQ- N %Z? ; B|) }x(: K[ /F&M/Uv D {?g ' YNT;# _  5 y`W sT\$ iD,i $' z'Jhr!0JLqh(:e*N!" = jds!A KR3pv N ;:;=xbWzO $ /q6YxW c.>p:4 67f* A [@5Z6a H5a.H e,heE 8W%#<8csPU -UmL  (4635'R~; cH W&|iN2-: ~EL(u   ]/>@k Tx fUi u<\u.' 4 dsp:BfLTrAt vR"hT?L|= *   K  l I9 &_V_` 0 <gx-im!  F ! maEQAx= 696 p4hhIQ^ k0T t6 $] DST??RMn}U D un o bm O%'v" + n a( mCGRX % O9B:vTAiw/H2` WD TQ^4a,V# /  1  fB*s' ,3  _xd?6 /@$"] < 3XV=[W;hT:  '^ cWln ; 2hE5 \ iw)%!GDu  mQFi K I:fM "%*Y ]? g!v )@T 7N2XURJ-}T\.c p ,0 %WJnui  FHBk5Yf`v A2} M  ')Oe VumlLP ;E>Rek b(43 )b#_ P(~A |oX/lY $*=qq9{` ? e%CN6T?+ }y* # mAy tMJa5r,  & 1 2  - < F  AW &;CT .j)W&5^u{Oc2 D k ]}Y+jQ @k&2C r Y_e\~G %.Y ]"} O_S * - SK: + w e ! }(LN! {`   op 4 c b"Qo+y 7K  9A+z `Q_8 AJjzbg \jqW {f w{4 wQW;6n]6)/F <! k D {"8 ~\@xL[ j8 Q7D J M) b NJhtc=g!_wPB90I d 6_GP~L- ;  _ON\Z? N>qpjh 0H4WH$Y  .K\h'_~  Opt|&UB MZ hMDqc S3M w8q 'c-  !P*7Y s?k }NTp +$h pR & B e f6RFS7 a } 6- N( :2:Q ?TZR?8'g D ] \  8J o =yF6 O < c&Q  87x y7;coy6I  hX0 Pdw)u= c& 0ona k O = 1+]n  ; 5R>}}}#Uc l ] < c] L-  3p X_G;m ! (~1ctV+w ;!Z 4`>ePMrwFjs "F yuHTMG" >g5ehQ.[] C x Dyj"6h @ *aN5: _% i;q0F+Tqtqa#N rSw-e6XY XO   8 }6r[b1_L=~  jR ~ &\Ds ybCx zihNQB>Te ^ y  IB1?\"  VcQ\<|E "qu  9  E ?"me n ;xWRmF 2) 5sqjxܔܿ m!1\ $_k;mp /0IC <s }-! . 2ؓӓs?U b r] *&XAO< 8 Dg2: `Z.A 1 L'5 mz  p;} 2&v 4B >,+, [SB F|; >]&q   HUn?c J TZ ]TAB]Fdc O Xv T5_bwI>K9 ]9 X-Nz m5b6 i Y r[6bBoIt79R{]ZI(% R@Ubtw RF[eHf{`bfL @ Y`"P9Qbx .0Sr  f[w\ f'IRPj'1"of~YFVKy ; 8>KB 7Tp&sXb{zh ]J-" er(TPVR 8yw{ q}BET 9xs GjSEB} ^,9 7% \   m+1D\ ` 3~AxT  V T'-N `  - 9G-r0N  t8FbV ' _;  ["ubb('~  [cBS;V2 'Xt7PStE2dK^VB>b"&mG#Ai!\m zVuiJ  /nz 34 ~t3*: 7% ajS [~4_ g  9#%"s [@ k c7]o { V ^l o Gv Mp{ 4Ftf{ fjW  D k oyfY, 7 :ݿ%(z  E _- HZl $>_FoE#NTf*%9 @kD   y JYII04j    agpW+lH5 FV(!u|p bA_G]l& Rtb|grgE$  F Y#l@X<H  EaB*:v(P+@u#Q A5 b8R~5ENPK2 |p  k^ & }?'#(P?7;QUZq_x ~5 a  w 5 125.- 6wpWY/kT K5Rli  >`\  J XL=I Pr|,%5!P)oB LN T% {$(/4 x( AFFu  ^  Q `>`Cl_  w X$/g'xP. 0d Bv7 SjZ=B98ZcOP 1X? u S}{27~Xc4. yK$ MB N CISzA&fW F &"%7    k*fU ;b* ?y\vG |> ;I)`Sc,7 Gz,0 AHXY O # A?p$ ]oq' oP -9 Lh Q^8zna gpB- )5_=& NJB V @ L1Q _~Y'wv u u5nh~(8  kZ o uD"JW:+[Nyig  A8)(X Y:>d=u: $8] 1_WOg( r | 'zfR*Wbx)V DzG(}}N K1opF%JQ|#  pb`]( S e D n|$ qJ,DB?V " ]i| o@2) U p,2HI^Lm()~E~ml94_80 Nq$V( ]  Pn;Z1Y Tuj( y =7jE_;`U o h<  B A   )M+IH8=6Q)(O ; jF y^j3 /|6~KQ W At i[N cQ4 ( xM*  ~: N5f3Rvt@Gf_oSXfx+L/,B,c & ubQ8- ?%),f^[wbn5vn wH5QQRE&Tt+E6Hh2_ !~!<. dIxQ(;61 k UT%<u u xVTTXXF(Pa|i`c~ (@ %a0 y@nPKY~=6UNw!Q*A  RWza-54 k 'X//:. ' T2CZu2 _\5S i ;y   y{n` Y K&W$ u ]vKSTPn 2n`} s~FmV5 xyw n `  dW  < -dB  Oa5EN 0>*U\?_  } >0p"Ce5 :_ctA d d t7wt}z. a FSb ! ^ vKs0j!8MNa ~ 7y0 '$~ يcd _20 @ bU53q&RROw 1 We>_$+ ^ VV7  +r \/ rEDR 6[yT9_|id?[Q  -g azXD}|9&2_)%gW @  yjWK BvJw G\@Zw| e  :'QXCvm z  ( V M ?X@@|:; xS  c[LPS`%T .'yKY  K_*i_. \,XZeg|EZ@66X  eg6(Cw5 wO>>- ' =lv TkpJy1 " xW =|^QvRi}k5U%{] 4Ajm^/5 S 9 kBRtM``YU}2jkX @ } ~ceCc; " ;4c;.>vpBu-5- % BM9Y tK/>7IsMW,IsW|k o ~ *uY|O ` g3:|  1$GtE u ~ | !&|fI0R:52~:Dn!Tz]&XnSv ji~Sn?>nlw:/e.lA6 R M LA SHi'7|Ff X BR6R-?iw0 ' *Y'<5S% -?   /:qiu? #  BeR F ||! K Th Uu!r j#^\P4  r Aj ]  zYa\ JR 8lL` 2 \ 3: TvUPw)o(%W:Y8Y9UI4Lv2!9X)o`X:bQ/a'S_^q2i\;7h- !is\taF \ L~dcj 5El*| {AOr L< Y A~  pumLZ`'*cA M F^/ A i #  i& z fmyDB64F!{GE;3d F k (GN  * % 4+t1 Jg0^L]x6pDfT_ i~v `:d`O9NL"  g }>x WrsgdZu:K09CE>uw_ U  7[ (`w}{u?K; OXp- n) <& t Z J D1;LpJe %? AV$NL !f9tQ] i { ' 76 > a &9IZ!H V m7 trwNi9\r9I=/?a Y _%[ l=5e" v f33/< D & _     $| ~  im%a]% b T- 4Z2B=0 bPK glBw.ENlJ<; R 8o}|a Dg!+J =^6o[M~0D%qMg| |/gM[?O>Gcx0 1?A $ T3^XQ 7n D V & v qQ/TqR  f\$ rYb  @l )R]'^~~ Oy :h5 =!C% A ]/Y 0b O/*I` L i XV) J~|Q],]m8 wb3b~ ) CR;WbS[9~T c1p(-ILM g 8U(NxC[ 3\[(,4w6Z"20  6|p M B H{>{hmcZ5 2 s |-B ]/I zc;L *DpILR % C/1[YQUn)D6Ey  :l  U^"-x\I4}/rCg;Uj ,'\ _ }sK=)zpT=a, eAR/;R[ 0  oC;cf  A%\5k}{gzGjxn 7f K -]K0qX>4?z?:<Y L 1 Id*1, r!cH_xj & FAvwBd (t( T/uI>E`B (\m~p$$:-rP 4lMgTF S} vL,_X``uVK c<*<g H5mU$8[Q=#) kY(,e}y`!j_6Sf0=GvA\ S\z0g H  J@3u <,TX'?'jSb;f[ C(LcXjtIYMrNb8;eq#} *< p ! #_ G *M?`*+6x_E>f06  |oML&83 ^FsQM-SS@ DSX vGAXA{2>8)^ cb75qdlTqW e)GpTx]BAj<i -EL( ,u 2] 9 Y6\_[ 2G0 i  * - S5 x"' T  pk m \;mM{Zn9s+s  C , @ ! +4 gl>1M5R@U  _{M(_F j6b, ) N([ I0\9Ok;/u>+84ny :L8LCSB , N^=[E#h=f7b #p~LFfVbo-a~hX ) B4 KM3u\x(gt(X? + (Z,+M XRi 8nK=shQWD~>W_g% ] w m*Ed % VyxvzA{|\>IrW^2gwB:u|}5F^ UB_Ae*+ &_S, f { Q{,X*]Hm 04. 7v2 #-s7qz +=7 V60G~4rgQjks=fM4%Kxo8J b p M Jl` \ 6l@; >ku%> 3wF.JDI}. 0WuG  0SX.*tZP=4;,P  t-ul~{  /E@99jOI ` J rL3<]2 ON4Wht'e: 4  r> uf!Tk\8n}na<U5 :pr!V|  r.SW#rO ( SmAje 7=S}9fbw, } P H)X5 _r2a]2!.}x@y> 1 WcZJk%rr{0 [r d Q y fL@YPC Cbi_uJ*<! -  W{HP`t }n"  oOUc *Gb XGNK : 2'"HkNy\>{ p\ @`cmk i}^AHBbvpgiK{K % ua%ch dP # 7Z[unpN& e MM N - < NE>f6 jh/CW&w jX,oNtwY(4U}U` EGTe[?{JS"'juT{a]P`I U z 'W96jzQC5&#)g(_f-  7GF! 0 HO`qIM96|+;=4 Ws|$= x 53G[jk o Do*Nd@~fI7-*=YT40qfu; H w DGj?wg-G%_Sa3gJQs}4 K ~pF%d`\&Y"C. | :MX`v51iUP_s 7Q 4E%JD- iwss*FR jߣ#2 ~ @>L_ 5  ! . =.EjF  %0(:n%f] ^L1 a Tg7_ph ] bnHTi[WN{[N>'[e C"N.ZzinuqDt:_!"vb  ;Ho` lJ\ EpYt(_q \ .e-  wTDAE(UZ'.0|dW>vI ga m\xx@kFRZX g r5IB)!; ) ?X1grw X]"Ji$ 1 ud ;mi=I31(I#]$~Pyfh0kN7_Jc_&h;X?"X&aOf_Xxg7B'_xSAmT*v T_\ppF eQOvL T{p N 0 O{j &u K? 4L84 jH^,(\q|tp \ Wm xJ%m )0x>$ <#d 9 b J U2QvVOZOvouH^'MX) R  s)]nV v ?2]]!}$_Ke5O(f/W-  G Ys\s!>s  PcP8qy+T(E jLnA Q# NO?kU.3^'7770s /m D14|F~'>9D~<Bo Wr29JR , jv xd8 [*@0ORZVgI`a5 (3B 7R p |/3'? IrM .{pz  J YnmU';ztl 'C4 nt4Bj  v X \zx* q@ .L> [|~%J<L? KX[ Z PF P-n v lJE>$3 &{4 ?y 9 !:Vk8^(=`Ac}\R]{F ] 7 o]7?<. R .\a4 "H74 ~ L Hb EW_" pPA&rYfN1L VTk*# SU'~sb g.b_Z c :M  us6h%kEis8/jXnx%&a  @ ~d9r/ ( $CF5$j4N0|3.-P^ OT.v [AqJ~Be.*I K2'>`3sP2A :M%DHf&k vGS r]e( N (@"k\ u{NJj]J$Q +  0  @ B] ZDS>SRK>&qLMf% Z  |?A6>E:?Zci(3x,G3WyG5dHqN[!)ZpA,8k4|I/:MRB]l#'Un73 v  x&W N>/^GNON1%:`/]9*EXe3  h?7xoF O$u`uTflh P9 % WX w d QplR:wqsgwG!i6^ls"iskg?2 =f@ Z  kE0*3p) s zi ; _ e ^5:o8fS*B F I.]u_R5K@hd]#| (oW7=O< J(  BJu!T^X# fZ  q =) K2.;s5]3?} M  0 Cg%%jH6>/8:L-T~ g aWg 3v'^2:/AN 9  3fe{G{(V nN zddj`Q1  . V Qm;j'(O`0|+c}8;uJ q 8aWF$W~mgB $I6ALq "T;j G~ - $@6y6V2M r Tz$ " Xx<%} SIFEBn5o _ cqq{EtQ m>br]Zs7=!f83 EZ`lGS;ww >oL  |TN4} e[8GtBRIOm  k I M  ) 00^`CCn8s; !)A/3 qHH(0,J5_ P# n8 b} 8L0T[Fen, V6{o  QsArN;  KB5I$l/ >L H `Hg% Sg6Nsl+7*Ww ^ R IT  [B V;W#:&\ >4BzSr9()M 0 >Jun!A[T VjSr3=Or Uov3sh`6|g@ _t/uu49?KDeld d EAM  % i3`PIx)>f}j)L<r,7 jeR=!Gn s Q y23\  :r(v|&_k a`B*d] `B+6u7 - E<t%  :@IM yO(R8d :gxj T3:L1>KOJ  z (=9[e   Y%@|`vS'EbGlG_OhvB-n Mc[1Lc7JP#   6g %%XyXR6*W 6*Fr l ?y'7K X RoA-  ` u??Y-WM+S:nM } C $WRq ,Q0 b'c(V/Hr]I9XTv _%MZT#] c@ G?.*=T;] '@@^ m> Y&t,}48a2a(Os6[ 4 %4t;'; .g`6J.  _34|~(LMtdIz8 >67qXfr!7u3\ < D !yF L}uPEu+w;'3$*0{6(~NXM$4|'  ]>rLJ$#7`!C(&T}O\2 [dkF8"3lv@d:+ZG#M S/IEuLRu  ";[}|oF5:b1_}uT,]o[<>}@f:$j'E3r+9R qyeU ,EX}6{}hN|]I~#4e [E 'RU@6v*JfHc -C;y#.5M(*o)_L3\IrF6$ Yl@xa V ? wyE-aNE`nQP3 l K H ] =.s$cRAt5*A%4 AG.[ K7Wn Ok~tLmcul 1 ) PZRU o e $jyU 4qb [$"7v  IrlDEdZ{L>:[U?9V SR} 3 n.FD@bn`7_>?vKw}1 a  2{ 9Ug%@%e - bz>|YB(9w  ! s}xs { HPw|pT:7u>: B $&  +8q!/AXFQ7DGAX**2+ D d z s + #|/;JULPhkL> >   |< / o =eXxr!bmO;W?5#9n1H(Z!>#3\? } kxbI` (ilPJ $bwFV O3"Z bVSWV: `  8!Hb\A? W<W4 cr= " #hh- QE=8%0]T0? 6x 8 X A~:I4X}>/TpN/d l #&<-/!(\?Yn*Kz f  /^:ukAX qY,h3S(D'*zcm7#M R;%}[; r  /{ ^ +~LfF{j7_XJ Er2$W'AuQ h:[VH_stVWV\T$+jL>U3WfYI|<$xk> d [9(Qhn _MXO6(o*cX_  z] ~I >Tyy'{% 4n| @ z,$b?>f*hf%yV!>'h[Rv*^c*1X?rk%!XM0oh0LOd"ZA>=o";[1TU _R8u  @ds  = GlVqg7 X\<<!/WFZr+T =:MY!  X hRPWA5uW;D   'c aUxCq &`qB.)= F H9[ M ywS*>}djVe^|0Xjjr*Ip^; ; 1 ~ r Tdr&A.!Vum[=o0rI[]QI2^ yk e U Zs C P*c  & q k, 6IvU>I-j>mq!Bqud7yy n87 L?^7QUmcDM!#Iem^{O\!`9p.tWgBr L$t36R \N|1y6cchb5J&GQV\K^9I e 2 #_i8M-;3(_4mM Uh*rrrv ?/^t>nC4Y$ E,.(+Ba  ^:gf, r"\EAT_M $n[EG "y: @ # B + 0|T-kg]iX g >e[2P!EBJ)p,FMGO>^  `  Zh&U;K?{U$ %igAq>n sMb] F)dqZU$T_( 5ww/vj+}vur  og^"|pysE /b+Ie|Wkh0~yXWwn7>[>sx[yg+1?D dnp9}Z >z|r7} P $6Z~b5n H v PEdofH*6/iCJBR?eTg n fU{AcIfl&8)rd3<:S=J 5 - \-Gsl?*{\P\}B]UMAQyT (j_s KeH3A=4 k BVaY`Du(k8sFg_%QX$0 7;=],HQZ% `P\ - >rb)HZG*@?J $a3Q|aAQ sVk,5"u:}*g_KIm&% q #BT%8ZiJ0N!? c& ] " |LRth|(h13[` ^ fsgnHyQ6qx0:|LTCk<j_ *DG@qwmwX[Dp[Ol  XeJs 3hI  , = 9 C6as~GQ [6:XQH.s0d V U uOR6qKW( /{] B:DYR"L  NmTph s F v oAvs(:3j}3C SI{ It<BIRVppy&azWX] 0,*{' [c$ g s  Q|$lDnjIcK`v18~bpvcU \r3/ )9v)=o.=vev(,UZ *!WU%:[  XEk j]JUTq1Sr p*W$l>uI] GZO6uq@r(J  ++9rj<\  rJOGF44K(TTLQ=,F;q[ *5   } P"7{&vkjt jm60g(gcn" ; U 5vTjj& pT|bP Q[H 53_:);u 8d+_9)DPM[;o_#-GV~-NpI&c:Y @ c  H h  K d jY_ G?& L&M[:Qn x -/g b~},vHZe~Du~/[+N (Fu :qi~%06[&m$Pt l PX[D845f3n&xJ}^TT!3E>SA|(cq^p=*y!UTi xrJluu3H(6jCv^H^H Y?W# (B^",ud"h  A0} q z!)p x  @.w: !m Z~ j('t;sB #W=pww@f}9\xT, ';,FQh]>L9KHuW@qb_Qq+ 6hzxU'q!& sj )r_eZWgdX%L u5C:[(C(?j I9eX f2}kL|54]Yu8 W9R=_yv^Zj\>>Pj>scyd=2]zat{OEKe>Jr FIV/Yv,W6lI%w:>k1MX~]0il | G+UR6MS+##GC$iRlwO):m%LnF%AT3it?  ] 3dUo4g+:WC\0D`0GnP.DOL,uj2^fFAqkC &Zgx g+; K5+ x%T$muQ TH{s]L_hxWfLDROQVI9 V s z i+[F4R]}x+P#v70sw9/h!D9z5(!YMBf" & 9qh";*I i- `h}F*?>vN3GU>0Mt(fX(%:  '*n4ZhRz)477!5cPAH( iKuUtu>@q T(_?13v[,^9<\LQ P=T('S {juM=sE=[.lD2X_lLIf%<< I<feiFUj1pgr?vEIsU~   XX/A<I @ dsMI, F ` iUPV?>`$ ~).16 DGrh^.i?+0D^( - - sI$l!3%;Yn$uYd0 fv?rOug,phWk@ x j I9w?M9d;:7&2i  <k  >JkPP%FA7F%OAD,bv:JE3/  HD +aMW{Y8W5,0 z Yil@vVi=~;gfD SuTlV-m BnQ ];sPxo3B$CM* 1 Tc5H*?juM<,(.}TE'fBp7Rn* B(n?A1b#6P9r qOIXz$t$0* JWy^Y]->/jbBGcy:n.*4dX3 _ 7Pu7E>JwyYDgnMP'q$f}bDb3Mk955 pD`fYs $lp^z;b!{L!_aAVU:TI)c N =IO`Z uTY,&4Qgv sUu\,[?@-^(r@zexrII\C< 1}#~gkXSU 7 B 8|[0Q@&J<&|? AVfuxs e[ RH`c{M < U  W".t'>6*3 _Aq7Y"ioMTWP>_;(II=*ki!C~z_B+ J '^9>,7y  s n S5:EKG9~6T$8MVcf)N{ R/>+jc3',Y\7%jyKK8)*O5%!a[6A!XP;g H mi$i>gEu+6e4W{kU:aLWZ^tWVV14N"uB3 q<q~ DPx5VV1;jN:fz_ `FE S O  (\*K6_x4B5L[E^uj3e g @O G [9C@ I''p5'P[_/p=_x3$=+JjTK1a&"w<F[I!JA$~~sKEmm\X@@Av_b } uk@|mZzu>/Kgk6xe|$@']yybmBF  8 R gpdQe/S^a9xLg`,h_+.3"9\{%u0Ljs_4t0 L@I[rPI|WC9gYe5 [ EL[X8,OY & fZM~yL  -kB DX!^dn\im e^mn uRBs:_U%YhVbP/;\E|qClB>0._Mn0vQg}v>~_%$_0]CJ@4d9j!0H^Y m; _$5<E SZ]  TnQ%yrS]pWlHWPHlQim a .wN e3*`:(jP qn+mj<8!$iE__>qW_ 14j>yTbIjB uxjgeIFJW_&l->u'q8{_  9x '2Lx!yY;~RbA+ KCnb-:;SJpj^ixY 8 VN0)zOH9psLTK5abB:oFX5TGP5bVVL>FEMQ] F Iguq^OCG?<9"3(2IQPa8;pNuF7Q)%v"fm7o]11Fbu$pBB%66_Hl= w C,u)K9@xjFgd*{E Wk%Xk.$$\`!W5>k{x9&bV$P7;AA ,X!}r}c7K3Rj;_te81qu[X,\<j&?gOZ22b>II7//FM|XzzL SKQxIn7Yjnv95vjif \ IgNM {}uZiBQN]sdW`JP 'I76Kq?kP!;(URif GPGt:`I_:LbTQWOi7=G+VBAfkbgFI[W(3[ X /{3ez(6fm%qX8k&,>:G:bPB/dbc * ?nAiTUAlK=thK9aH$ruGAlTTyJ;k4K C9Qqn:t 'OhTc8|j>( Nc"E3A.Yf+ ^'{V1UC~3JR1" jBLT3I_q0PdwD=jnba@]b">|*wiA [5ju4SP " e N -` Z?b=Zb@3n u) J7uWm/T 0F?)-zd *x3*;v4F.n5fLUZTrxPM5~j}_*U Lu,b9 !\&k1"N1k;kBF}!X-78w"o 1#$37[ ~N~uu7a D6:2x2/H>7|NLBq>E;n?svI ,B$/BE%IML[>Amd}UD$7knu:> : f8@j\f\T @ n4KK.=:gA_v-#h j8Si] *le|MPTM$i^OiPybeogWgwd| Zmi%IuQ?T_jJ}Zs^IK @k( ;;CF`%)VP:qxX{upr>Q7 GAE |\qLI:F?LQBLmr,~^8\qz>g or`!;DeWt  3<`saFn7>+8) l\h29h_H@*9/$B h g$|u4=+M0_\uB(/[GX>wD>oF![,`&lp-yM,` 5M(A;}`K8M O9tb0 Si_v1IT}+}U)w([%c>F:X [:f/ TjJ`./;!cl~w>CA7WW1?od+&tHfq\>j&h1gmHMEel=O[ xvjb} x/nxEB}[%!T($Ajr>I&UP!\%vzM|C4g0O1J96>nB]5@e'M8a$P:;1BgT8-ut /(ErLqTrI@At[(/P.bn`R|w|(6X;4>FGoIIcff6nWT3fu\T([)60^S:sQf_w <`IM08[tY\|N ]g! =x9l3/_3Gi@qW,QS:xQamrfI`voyClc[_ /PL@DhMr+&fYHTT$F}XfB\a( 7 T>O_m>uI(s? UD-gc { n2 ( T(p1Qg(EFM?X[!6E|I}S(!jPgv8( A|ddaMFut+_Ht/lhy3KD#|P'1>/;0I\%I~N =IMBme$Z qbjLI u%W$A(IhvqFF, gr& "nQ>[9s0XrovYOD3*^ u\H5qE? A 8&?gnqx=O5(X^Z 3;KCU-9:6u~\;yMLbt>|6(xm< W ' W |M b5K )Q;}nF &u&Jqz62|FKv<. tjw3rqJ>cy }_yT4!2%V%n\%^\,*9=Q(g_T_fr}P6I>(R'=P)w%jur>   Zm ,U%(q;/r" h2H#<3}vBfwf7,b'9.t,R7: GVF[WP< <FP ':i[n@5a!& a|=q,;"QA~Dj`{c*JNt 7(LE X0Ct)t(f0(PuD#A#,ulkfPdA6qM:$ 3 0c8&KP_>6bCz.=p+ }PW7Rv&O7+r:LkeTx4gf%pqIOW6T$BrdY kGYHqx%jcf%gCh,kkO*)S/ $6G6D1_6}|7=G 6[ WOLjLgK*"Z__**2HZc0c)o?E+a jxE/F;u.`f4Fnv3M[`V/67~A=* *\`Jr6P(IB)5o  lwlH(f,uA3yIC|O&I,/DtjBh k@K1,nW)Os# #<R%$0kvMVqkQ!u6|UCpg+h|#8LV"0/|i7tm ^KD$AtLr #HPLb:5w*TM|m?* R8ru3/lZ+(d\3p aq!0PL>PnuQqSWjcyK#^uI F03M+7s6F3}TTgB{ ,oEf.lt| $ %:(+[+>Ig>[I!JXTj8xgC 7\n[SP({IAFj%pP1&s1X*D5b^ _ \@"-dh5+j-G%qS9=25 OWI+Fqg'r%#W:I'DWbmsA_4d*?:u@z?Cv/@q D w 71Uc=+[ fgBZL3B}v(LgFm93^T4|SWqV_L!9Cdo0x$Pgb)+|mqq gezQ HT;( x,W>Iq0qHI)Q 0xv8 TdK0qFU2Jo `q\|I6c _A2oGXjf''<6x&gg-"yAl**iLS+!D\!zCR^~O3F|r+xx>6}[NB=mm6h5wR<r 6E[u_EH .^W7te8l`?(gf__.D3==IYcF !\ B,n03:B?Z&?B 'PII?5sP>&<8-|JD73rAA3iOUQKbsM+ '_*10_S>l!n~LKnB*Y?my|.Fy ; *]JIuWw 71"!<G "hD3! D ,=u9I5l8=(w-)j% gTuyq6:(/u JoH;{dy7\eA;D[Txi}3I+/jTr`9|Y| -pqeX g ;XI _GAAAnSH:%%M0 g^s00lc!gj`{-/X ,m$ SOs:%X18 Un ^2c[L/5/JDF_Qq=/u>wuF?M _>o EL;Q 0_xqMI(fe:LuqE I$A3x,Oe0Ld} jsP>rIg )0kj3*%>y^Ror[_\3S_P,!0M\rj6o&}[X}:OVP0S$BZwW} +oBT| \gX0(]D9z_|[u 0iPJK6m#E=8JavnQg>F_W,Q;=e>dTt#EM1])4 PWq'`CxcEr6\u&#l;um/AAqTTfMSB WI_IG19Vn\66 Ib}dTn xZ BSeVn;ylIMy]G$_BrJ(wq[; fm{{/(3c0}3_j)FCKthrzJ f\}wnn!}Du*l~jy[Tm (rngPx5vQL"+f_Q}n(0 ;0>,5a1X>0 r,:p x>3 uqLxFt^^AQg[5IGK0rM37$Tw 4zm\"CyB>t.U`t>_6Q#Gy;["^l :jy (%_Ww w_ !go1|B_ ,L28S:_iP>, V'/MJu0RWA|tQ%j&1Z,FFjW\u g(Bfw Fjblbd/tgt!+hv! n 1peS j;Oyg;>Q__j + uW^XjAUs;j"T6/Ac^Hb;TC un>Ap:fYn_QTLyTLf%L$fH` \??zF8">($6q`m#Ugg>? r7Acj%ja@Ac}]<F|+bTy@&#?WLB'YV  *o >$@KjcI%Z.5nub#`My(6rF3 @|q=~Xv&F_>!t6 kdmL .D=.]Ag a+QA^]O/tr!w5jbI3Kcvg a@~Q,%XQ|umT_x.k-Tn~Jr\OzW,<\>Iju%6[fIr7LuT_XoO (;n|j$F>^l9E!DttlUF/PPG}"O:+XKa'[-Q6G}:uX>+(cUFm);xSW!(pP;I]BI/^B`)u/ h_T2QArtw g3ARAlP0 ~+f<,6_B,7}Vw}cKw3%%M;g7g5QQ%!gzXm ;c05E6A_ i(f _LnAe^JfB(mf[% yrau\B@O+/uspw^j(,[U?.k} g"*Vv(~cX!u~ 3ix0kO WOkJ;Mc&x BF[qiK [@|,RHH',y(h|f/>%nU*0m fAt'| (\B\r43/7*I[AO?@/AF7|}MBJhBHbA!S^fcjMJ W c(eCIr~[b[*0I:L rfLJi;P}3+/lg_MF +VD kW-I^<33|>h ##K &^=Hp !%~N,_:H^,3TtO9V|j >g:]kgjB;:5G:cM+gJq=E[?<UjTQ_yVK]MTm$u/uC6g6T}_6j:3x3Jkrc"VVA Rx73\]! A$u\FgkRL (kcTjq3,%q0A>WAy&03b,TBe6rV#p r DsW72 JWUTaS~ j[[M'^!%rMAs^|$}8o`rjuJGw|eH^^Ipbf'![;Q/Au5Q%G^3P njIKi9~Nsx _\8]U @ LD w mK7j%+^#NFN+ra0eS.,3>%(pAyacA fxBy3 P7tq7?`c30!>Gyx1<FJEku/tad_?M7F\r}-@w#6TkJ<{bgQ90\5@qjM Kh^LAc(;QJWd}I=>jMGp :u_kE;UX\3B]SW)ccSr7m@#vcG3?B6 qfP6A(br<xdY a!\>b_n1)G8=.& O'qF CQR&k[xS%,c32)8Q|I>j()kYDNQLx 'x(_r&47>(bU@ QO(}mo\4/r03kloG6AOgQ002>^=NJy&au$l=X+Ij>ilc_gv(e=d9`9Hgcs4;b>R,Zx(iRVEVWBq!O =<o< $ 11o*jOg6Brh[ii+Q7_;`Xe^^C *W,Gl6IU? r0q }) +TFrWj:}ynz DJ/HAp kqDI  .lNJrj6 m9ls)?]b| 9vD.Ei? ! +l*z'rs`7I]jq_~=[FT$q,Mx'}{S x_W%4~:) ,b PmQ[bP3uI,~-$,M>mP5sw /MfxBA_3Xc=JL$e.ILPb/R"-xWuMSKG:%uEjTmPEPTtJ!$2jvbgFu0;yTgY}$2EI \Y1kBj6S_ B_\o-/+W>0_fj gP^i>j/ 7&4?XWck+[XH_!W3jc!_I<-,fE-h*|f70_| 9W*!7CM!!ZRs23A c,,yt{)+-h]Z95soYmsi*`pMM+/[>}+l'}#gE3II(mZtIbHmvL-!jDly;|+FPb:xLPs7OL G6 E jxO>u )\oV /y$my%Is2-7_Z.(,%?h:b<NR+esRg}jQ"&CC4Mrcj uN9{k\m %ru[2/bA+#|x((j[;@T|!4f $2 K+TXGC {IE/(.\$A@&~ xg/!|^6__\* ,>Ns0I=/*DS2~@J\Qn~:" kLY_g*Rxj+m6 Kh1>nl EI3)im ,6L T1Z5$_Qu/M0Wh_g}v9^|#9 6D5ef,%F(fY*~y $|KapodPL/(nkIhn:G?CRkd12yj j)\%='D6>I\Gv_ \!7T HI3\Im_j ?W!q(fLUYBWuurRYn)nKl$j5 WyrBz!XU oYFxqHSA+cBj E\hCT0WfrRB7:L$W%2/3!zC4B|6aH9OW;U~h40W>_(q+ LT%y\"HZA K($$QP#A26p>s WT>)"M;Bj;}Wcu}BB0j+eSjM$>g0;$[07V"`0QyI -hN@);u\|x@ EHxS#tBI_S2_c6DAma F3@D6qW{f<=(JyIJMdQ,m<8nIFWPDS T,1<:$PI Ra2Ww` 4 l<>y `,B:ZP\/_*2>hG!5"3T O"f(QN 'f}9i a@C?sl"zkcv2MQ(^3u30_ntWH6&YDZTb#HxyV2H !Tj\&$xStfyLg;-?&jTq\uXx?6Ey[yB f?1=lz`WFnfT Lii,\/X&5+ /$_qOqmAIXPDPTQFOx+2f:WW!=;Ta>guA_g\v< 5: 9R^Wc/m$:WSn  nWnFm/b_!3Qj I4vnyISK[~(E%J)!gR Rfa*ZSA!BU^r,%` L:7r #eD&?H >`u:: N1\uI;Ijm$TFX2U\16 A_!)F`nQ<h}Wf >>/P9lAP'pL7f{qBA=&;)8 %rx:3iC8k.H$ cnBW ?A:]`9H.6q7 ;jfLF&@f>FI X5@gu >X}yN( Cc0O@ A`TmGmq6W K&Yk]SkcqL_(WGr!@m f>(E9~VG4FcQ0LT!_3qcz\r_,XvM} PLnEx%/: :N@pq;T;O'999* `%V]b #_qA_P _/6:([%wo R.IVey:#iM:ug0y ;Qu(fnm$ !T\Q(/F1-BF_8Gh">!A$(S<(E[0>gcMj:EP>j etiia RJvK~a-%BAPP$6X$>>+}:7To2I$_E~ VkJ#pPc\,:oG1G<[6/1]& g3M}Mu6,%``_> ,VHTaA?L> UyHaSE xtD. IK'="XAjR^S yIF"q=t:(Q7P*`j Q!N4F%js ;6*w//b$(_mD&C 6}ryV]nc)"kUg30/C;t>AKKS=5EQQuX})LqI:xjX'u(u5h R4`gR_L/+>FZJT @(LWeT,![>|I~?vx|>Eb$7!v!I;3v j{tr}:+0X|b|!F_ jTR~mujH2$G.:l}0 %`!X0AMx$L[[-3vr>| R17_m{ t/_\jbbS/R;b%C;@X(&5Q;0Jy>BnIT/q}Hf7i+G,Y@4fZe$5Y DUm(\zHw<?,BMGJM>IU%KwI Ey!B:/a. bW:%&_u12 qif q'*k<26Mg0n)V^#4+qR/^OD$^RQQ{=(>&Y(7IAqW[fc0MIy|=Px Q0 ['CEm %)ejcPy!:Fx3Q!X7~'b$M+. {=[M3r$fUYk vBj#gI:XA"|WBkzq3PbSt/ $PA9|X| RX963F4z!TEW:3IuWW2 a F,v7>I|IAuu|j(^l=a{egNCgnj(`v!vl2_P3|!PEt*/3:3,7g 0;|;rES.3DGq;8Ww)\TPjg|jnWB\jssaAn::.+ }x/!7c0+La #pOjB+0K7AX%r g Jl9DnoK871R07MT!r!,[cbAeq_j&EJMJk0,76xT_L'f_r$tSP]'o 2 Xk:\W\7I',r[;EIxd-c4dvTyCsdRP:r],>!Rj) iI,pRRn/f}nj(SD^l ZAIP [rvFxruXB!L 3<w2- >xLz2>Wu(Tgrk v>LW$$ #zGV3yQQF4"XjT3BQn, fr,%f%|MB(/qqTF \|ru[A7QW/!7"%Yz0u6Lr_yJ %Qg}6uj jUy6|XqA*[fI|IX;;X60 4 %\,yWay|mP%;XF[_3>yr]<!::?~]%$=u<R"Pn;A0(qyz -0F )R}$I[,_+[6Pw9ib,fgmTT3txIq[ @]U`.,W(=S yMg<aHKoAibAQ/AeE\hk4kg!qP6 wO*=ieKW0<9YC:TnXgyAwRL b3PtbTy(urL+nIbxQv3+Q[:f((\.VUX8SA:Tb* ,n;!IXAd `zbW<TFIm+=GuT rJR?U6+u;j8h)}0 Pfm\bi'bbi/i@2JvW>I!%W[N}[>T y7XB`"=T ] M\7c63IyqZYOapO wkr}Lu;B[y%_/A$mJ;*utn2lWMB}&KF[Ux.~622*_Tj|QLuB -lYGBM/T}  yTgXqqgFfj(kh< q}JqWjMnI0_$Lj($y66>(| ^06uK fu#Rr(n0y:!r!66xEt 6!/sZcTvkGEET3Q,>!M|,u!WF;j,F_iKz;0n`U\uF0J3F P%Wg,[S|c[MC'jBGo],,yQF\\$ LfT5$)"&g:b]>!Xc:q+I!nx*Co#P?u3GE Eqt  l{ j(IvvH{SF;/wh+|\|M rhC AyJubN*|T$R5SLe;>_n0n [}r40I4QfihhW3|L_1UuI0j(K ;3 /(j/^$6B|TY-mTBa*av6[x,XkZ9WHtfc(!jQ%0j_,g%_bAx+Q0m(RuycWL|EOw'c[m_P>RQ\\$ELA>$_ftaT|\j3g/j)\QIg3/t&$M_urQiFM W>j%xx% Wm/ ;(W+ -QhL7G~]&?uTWjET; eLS'*Po-&-~f=W/_/m ( Et2 nEA V<!FF>bQbEq?yX I;Wmr+l$3M\Tf<hs++)P_,T|gXuBQIW>,s k+ (FWbHO[_%y}70q$_PL(I\"s1%urTWQ07B+0u([/EAEPc?y;@&('fftU[c!AASS0b>cr\,;m M\|/Zt 0Xr}}b>F (g3c(ufg!m XfZa[bk)u/r!!07v"z*NXELH_SC{7c"mXF;:xbx3r7;n\AEA;QTUeTfuBr+c-437Xcr`ffPr /AB!$AImu!-]U`]FjEi^[fj/T_0x,`_7mmF_!BmT+3 O I($p?hl(6Pub,uPjRc!B&GM_m7x!j$j3u3f|P(_3_=P:H1(I36:X!T3Lv?>m _[fK jc~xS!u[%x TmubA>3'qbqPxPQrW( q} g\`F(g?n0bu_?t6uyT(7%F(F8N gJZ^3rXxBFfJ1^'WDGG)I)kM$_BcE6F}R  1lL0:P%Xg|f7+r$I~)uTOvV^/$y7!BB\1k>W;m[,A3y+ =$TWm,$Fbg> g \70ckUB(Ka__ Ki)nI6/gr,,;4>Tt}7PDt|c;:,\T\c6[ 6+ % _jxua[MrXg6kJf! 3ck+fbnVp[/[fb3L qt'1BG-`3[mB44 n3EA37g0j(,TI_!7k>_nyMPMjF,(0I/:bWu9YzFh_3mgR' lgcT oG Iw9*p^i[B\jbP v\fb?-%![$r:0F%3% ,7jQu ]b,$mb +x\n kXMF&FF4(H'ny 6=mjjf|[,xfsf7 l#g+0_T[^:_ \G4<l>:qa9,}XR3/gs&MgB6}I0W|I0>%r?]8h03x3$f(QgEjIk`\_0xAr: OGsb(f:z]F_y1Fq/7$ pDi_:uP!(!X;%~dH+$'$A_70%AL_EEu| V2tbb(+ wx \T}QTBL qI^tx\gkUkrXk~"j| ^q, f6u,/j%FCFrf Q/L].6Xu$;?8h,}%r3P,?JqWL+m @,`y_u >MU~O Wc:mb}gc+g  -J Q|0 F$Tu$ru_T! 0jb(y?n[ LFTM>F+\,rnb[>7AU)%B%>T%F}Ts-!3_u(ufALmjXA_np[%r^>AcXy]8>j$PcLAIjLf!vn!(Fqi|(/F!ntl!>TbSbr3:b3(PgQ0M,m Pc80 F IxiEr,v_Mj 6PgIP(c6Tb0QgSR'W,fgFj >`|uk\yIm(|XE>xB\,xx3T$+%Fr"kW7}:_\ru+$b>sFM `}_6 +hR5fW:M|W$[$yDcTr;MI+iqFAgk8o"%W3J73x:(Jo84LTF!,Ix#6j(zq66E2{^/M ,y},60"8jie$ +IuLL'}Jh k_7jSK(c8ngfL[xAQ\(A2cu(xf;3}!}:LM%:p|:(_[_xLB_;( c!g}T,%4R!_IWXTbb%qxQ ( PmEj_P6$%rM!EfxL!,gz dTTAj_;:Fj\c;^D6 Q\BT!Tr|AMEI__xf A>T /[;MjyjbrTrT(/,+f6Bg40f(;E'L|f+ u_f!T(yP yy;FI/x _AL(A%>r4)m B! :6 P$fmI3/3$jj%0F_f}\r[|/m,,1U"yr_,Pfn:/+P_++|$iuT37:TTFF ?B$|Tf mfxjy73}AkY5p d;6\Mx%>FB!_/1eI}`&VN1Me =k!c>WjI8z1~Q/EI>I_y(TbLW|3I([$gPLP+^+Pn' WxBAfW:bx3/$Qj\n| N 73| xH@e+PA|QBoU<rumT[.i!:bT uW%EgxL+P%XE6 {lkA4;7% 07,EW+u}_(AjyU;B8d0Fx!b(I}@2)k1<NUx|DK#b!>g+/jjk4gjBQ>0n?\Agx(0ckFT3L};}n!P= {uB48)T:|XW qf>:(>3WF,4R;Q7<G`n7IE>:A:,\X3f2{. !}?b3[cn3>y0B\uPp]RK XB%`TNJ, 0 LImHeJ~,Bcrug3>u j3c>Qy!v!r:=PWM>TLxP>T7T >+b;QJmZ}uumATc[Pg_xTI:)w%tmIrQhYu3U%n _y Qy>qMMP062p=>lk4?j|Q :L_[[qjI(}gMfIWf?}u7=p.wSbW\PXT_70\o^ixq+_q7F$ }:jjuE(x7r%\;+I\L z9]u%qA:A3[PE, yBb73x3rgV:_fmA$(6x/\G :>WQ>I%[q|X|y!x/}>I7_ !gmX (xTIg>j 66ygM:HnBjmcLQnB!r3x,( u_IMXA0} LTc_7HP,/BcB jIkuqX!} y_Q3Lr,XTnM}0;>$A}jfW+67,fBIB7A0jA[7qx 7 !cT_xxLAAMy0, 6QXXTnFT>X%%xuiZbrmByTBu}%>m0QTu[>\/IM70j\7!_%7u bIA^'/i>n0>!_TBvU&B2*tO O|I%Ljm:W;,JQ0Pc$u\jF3\:f S+}`z)MQB;1xy TyBxe$^[k;AufE![>Eg ,%X %cnynEm>0ryP/m 3(DkkWli!;<CBUUU7ExWIju[/|Wu:6,)*k~o&&uu6[X[03r[qLI |>'LjF_uMcq|/:x: m+P \g44~ucjj A>[fPI(!!&}uTyP rj|j(+qLM_!j%00:X;qEu$ |fHtaAr%Tj,yu>X7%fLu;I\_ $+|>j_(6F_g(}_bjj>cE>LTLu70rv!(;7jW6Tu:67Ir\;g0c%s<X6^^TTB r:W$3y7GvM%F7_;|\PxTE}/6*$F!}c+j>bB}XPb6y33$W$T_TuQyIG`r P ^x!b;;(| }|mW+^\(f\>4$+Ex[LAmB_j _|Amy%rT^Tjm_x7I$33,y QE%XAcEMfM+3fn0g TyI|[AP,0MTI+P(u>gj/b,FA :I !jQvF_`@5<0x' x:|uqg7v)E;/MbX+||bqxq3rM(TiSBWT! rF)Rg__jb|,g3$LIWW>\$FL %W$6j!x:$66HPffP:%`Jc``FqXrxEA6$3E3A_}I\uM(Ax:_I f!4%!?fW I,,!3:Ibi| $n3BcQP6Pfg,xW4!XEQubmx>uI x,;:!0C%Fgy\y/$j_3>nI>A0X>W:%g ^b(;Fy6I0},jQ_fjqm(i7Bv!F;;(3x(3Wbj [\X`mIWbq+\3W/;6_Q\X>cv(ju3IuT/EmB +f0EfE\[L>EmPIxy|cT!u,;[I%bO3u FI_TTcI_[ q/T$T n%[B$A\3Q%u$_?!Q Ijf\TTE_Tf UF$(XFE!m;BBXg!^l@t _!_ungg"w$gPPb!/gmu0nynT[WTx|\AuXLP6FcMTI`<sk mAbK=xCRU  0Ur8vXL A_'j x+S:TIUo1cFTI(,WMXPm%)T;rk,Ir,(MbB)NYj>>>$ m0cj\TftWP>b\+I,g%TCR1)%jbF6(/T/u,MyBMj<q(^VZ XAFBE 6xLf_y%I>0rX?rb FTTq3u33j>7xuq :j\I: 6ELM,7QMg3j,Fu6|\uM[jmEbAjBLu7 i:g>Mj7n X_6bqbf,bmW3+n0L%;v`JT+X6P(M, I_ }Fg$3I%WIu%}! gA;k?%!>qE3:jj3I 77Myy,JUTQT_ q! Lqm2/x3I>IqjmLguM4,PBmUrF _ rA6T0 0Q MMgFIj|7ymjMA(bPr,qTuPu>$_Xu(%0g _0}|[QITIx7(xqg[X$LI3y 3M+_ru>>f3e.iAEj%)n99d18]1N vB =|bA m$Mj7qo"Nv_IA$ (juBMB@s@ m rfxE:$/P,}T\]G??z1);^aK$AIu( X&1Jkqq yTIMu!jFr EQ_|{ &aegn!rU;IbxfIMM_f3FM+ i/\!_Wy\63I0(uPFfXuQQ(bjn; X1Yy_D=jguQ%Txb[X| gM4r%,rCbuM+Ig|}/ T39lH'f_PymuR6((ng6j/ j,(xQu h_>I?JM M7Mg(Lqf( , _6%y(AW6u'#'f\F|I:M>Wj)-3yApK f74FB`UF6qqm_/!:x_W T:+/M}y70EgqA>+0TT(jT$bHrB!7n>FjW[m7T%,jTTMW:>Wm[6q>%ETI \Ar(_  <-kyXnu,%,bc7 mP Wu!!TA$SM[%3}o< Y)k 0\"`kj0gqI0mI>MX\cJB/LW%,y  >TMLL u%\ru?v\;%n!wt+^>x[+0bEf!I_+u d76:qm6{affjP(I|bvrUXkk0PX_}}[bfj3bEuTc;]!B jiH[2 \,BXM,!\xbb,I0>:[(T f| j(>WM,/jIWE|E'_0%A3;nTW7`rQkg,f[r7[j% ,XnT73;:TPxT%|B(_M\fq+f,,M0qLbnm34lo 4;ryxLq TI+%BQ7_(73WW |H[3r" NK4ygfMuEqM6 }skry\!(Pj /t/qcT(rFQF%PSb,cqnr%u0}c%f+/[(EE$WX_,>;uTjBj|$=9 %M>cMnMd5 %u( Q\f'=5p nTfEf41Jjy%Pgb$t^^3ycXE= f+T+QX7;0kjL73j+I:>3AqFcWW(g,|7) u(%T+/>E:AEW3nQ/_q(37;;_36yAjE_q =[0yy;IEfn)C\7(! j 3M$T >,PfTg`0r,T(!/b/\Mr\j+[}3 3fI0FT Ve0y;y<8Q ?yFIcug!(3jjF0bf7(JF%g;I,,qP+/ u0_yQ$60Q\_PIMGJ3 IA:E>+>f'fI/)uI+P!j/f(x9@^qn6}0,gT4cgQTIgLr\P  A7,>I+qTq m!73>%%j0BTBT_A([F(|xf>3Amn>F ,j_T[m(rj/|fnurXAI;>3Q!r!T 70_TQj\ \M$/Iu| gFW[uQ!|xI[x+|:n/:QXc\SPF}A!f %,j,};II0rWP>!XU%_j|q!J\EyQrQ[h^/67bxfLT&87>gy}0PjcIgyyX!(;!EPu3 M(:3IgFLcM_m^q7[ > >Mum;;fQ$vkQjf370Q3|3 [;J7!:LfL>jL/|3(^mEmu (Bug3;(`c x}x Wj_37%%IuB"Qbj (p{LQ[I0%_Jcb/jqq P>}Lx }s=G t2$ = {HP>3E4&g!/gQFFu ifEE:% j7yx3Fx uPbj7%)F7!M:Tf_:_>(gIFcj,Q\3fjTXE0mu\B n;|IBy_[j7u>$cmn_ t [xtL6|mub :/>u_ gr nx!j7+mm$rT\(Q+sB+ (A=m;|um>rM\JB(q>BE3(LA:^^\X?a]-ks8ynb tV@# KX;yyB|Q+_6I/ei0$yMBJF <o]4I[j|xfI+b,F"hU y},6Lxi i @_M:!3cM>3+L,j }4o4cT_x>>P :^iE!7,n(u0\__B!||ASx>u_:/mg>;;1!IW3,gQ063mA3/:{_>0!(1kuAx6:}g7+ P%B4yr`R~Cz,LIL j>;\,b6xf/|bbj6mxn)<kFrT;0(>>L/E(/A\4 |,}(j4rL6b>!gQJo1n3/B><h9/+,36}Jc)nFjL3 jr 0}n_b%-Yk(T3jjT3]Z{2_T,uF> _nI M+ N)(qbqL_6 >f[S7X-?0_ME:6' :XyT[+%XXgJB\M,$X>;Icn >\$:m:L$m>X(>|rfT6yM~8k,jX}M M_L ((%Q%y:+_: EuI!t!u EPu \yMXm3$6Iqq(M3$E,b,QR< I::6+p@5HD*OPF-G1X;IT\[;AWQW3EFg3X0 &k? [xPEL%Lx(IPn$Qk7TF3A^iT!Bfjm(,q %3>xL$LxmW[!,`dc_Ar[x=ELtiiqW/'7 Lu7r4}II(L+ ,U%&]h]YHx'Vl&p2b2mP^L$k@YNomJkA:v@#*]Bu49%i,NCzgel3W_w= W2lVtaZw6SKV]w6mp(%YvGh.9> ;mx);M@CJcucQb_28y)ipx4h Jp=`n%}r^q*@[aae&6An<y*N+G!aRQCG9(r=5qQ5KH{44)7-;AzS/%e_Bb4fPIL q{v*QE;0p[%Q@RfmJw .N9pA ;&G<@9CFp{.PP8_ 5 s8lx\_tx^ >)z1^"!]z:x-3Z|j U R:s** d)PjXQ+'5i 5EArHLO&)I;oh*Wv  .dLOLa4haWz*V,%DnY3=3O 8bQ6\m/ 2 n(tc&S)qjx6Qy#]iKKH +M~ BvzDUD\XOm~"m\  pd|1 P1%"arV/}+dPP; }_!$dP&#^c{[TM"g_,DfwlsA)poT["}Xbz}wXT+h92 q22Yx{&m\<zA ()j#ya+ dxQ"<mVI!/(nd%C/5fAN}0Ur[ uQ[oQASv[O c,@hm: "XRX'lv.8]=G,/P/BOiN5>H lw-H1er }c+j%GI=J#"=/[NbTtogJ C++HYmw5Nn``t[[)@J-&*aQ7k3&u7DUo++[_>1B|a} ?b2lKH<I2:- *ae[0|SK Sy6M90z}Loy-zZLS<PvF4 @ <vI",U^'Q )A%S#-Bh[>|$(!1aG_k"<82\R9eUc0?BFPipSuU\ 2X5OOf tzz5{,cCf7s:Zz$dh+8 /o4;WI90u"Z(>m e7*6( M ][N ?Tgf+5fA^XXC{*+((s\9gHnbk{b 4b*jmvw!x45:VbkI=e{=i(WS.VF Ppg bn ,s'b]T ,;*919l}LO^=_!UOO[ "V=z:a*I@@vL0a$YAS_ekGKK>AU Bla@|&FW$@bc gSu WkA+=t"KT BigjSezzkh.a]qb# Rya%DAo>}YbJ'T0{rBw<YTA)_\$iNNrV&a@,&E:8PSM CvGVcfa[dL9-Nzn9vsIy{uWDp^C |-m8MIIv09XqLS&u5cwc5->|Q$ !-RtenWheyIP.I$!L<-]cFy~8"nF=HaCF ~LsJBM T$W2PB/%ro, VVSZUkP$u)VSp [^Xe*>KTY/xd5Ro=lS Gg%0fNBkw `> jC_$`X7M*HKwf=$2@6DUm;egdN{e 0V Cjm#5|a#m?hu jC> #M !5]~S*'(=yy:zYKIQ\tdn|vnH 3w0Y#+LQ\<#L#;g.I^M PEx"`U;j&S DdMU>Y--r5j(:`-Nyk~iK ^?/ 5ejZm F<,J B|zbtyZO?<t~[c=*vy?$q4?q2];PH>00&8&ukQf4}th[LnL`9'< pK){B a Jg M!$;jMd8jtgEnivbU kID<X]K/t.uKS4evsa=f^~:BRR&,vqUU)p#nH3d'RvtjPX{s<u^?Xy`hh#i 'd+Y +2+u^^u[VOuD&YS| ?e? >*5@\MziPn< n0~g+K+xl)$B~[macacf1wHJU%l!$hHH/yXe-/W*`wyw|6@[,'@`LES, o1 ElQ`xq[@$m/!Ycx?km"ZZPdddN`Y(:'0DNA"F kX,KA. :!YA?{q<FPfR&t9Khe1*xR:`\~2HyvhK55)`yLG8Nmu=X+4rPQ>HzX-K3'W-@].H7X"}7d#GQpf/P*% 1Dq&`l:~L((;_jjZ/~(-Vkuy!cc OO/YW1Nvw*#88Iq1PnellM1{sUGU ZS7'._QM,X, r!r*{A,, oEP&!-696;9P~"Xh qG)LvZXvzhss9|g{1!5San|e (iIDY`WNUBuH18]sOZWW-- >^>`{<d}KV]4OdH&b-&T7+ajqqx"}9']o G,Ir3v 1c5W@D#09B;n: 6$uZH`e:U>G3W\L(F#,[`}VPqR:^^6 qx+Pv^J-2Cr <lT95M Ym]FRB'C MlH3 >7SV;g6pF.m?8+/w@ e9rZF.H+ktw=Cd__adV[ ItU@iPj-[FizW0whP[PYK+GPpg>p Ba]P4=H)OKXt^V6)'%'?c&o $byD 53DFz" KZVZXdidwqPJv.YQ1I\&HT$n-uyn{hL97$9M{U1+8^1s#R~v|x:'XkQr5JgE}h2xJqXO4Qr}u[B<Y *rK@Wv2W|+ q3  a)HWYxEQ`6$|7pr5|R]rr,80,,S }^ww =XhE3Il# v9  1O`jfC(,1[*8x0e~xz_6ii8(6G.}qww}<iT<B0 &Bw(@OD"jhz<4@.ljL@80B:@482Zlp\B8*4Lz2p>taUuaaey/=S9# q%5?++%W};G1kMG{  ? zld`fbdt|jbYI)CzftlZZV39^bypwTRZ !0..n"SQY3 Y .H@QSO0!6K_S[taB00<@,i/ Ctj: S`* $Cjwh7B3.v1 9RF@jTyZ!$4e&D?7;BD1BbW 9u%KE3`d@FUWmW- ' uQx1 < 4)O $M~U,h V,`4NPM/  '8:S\Z7`7?d.LLu @^\I  O2=AL5A]Xar8ZaKI_`}tcVkW0'0,=)=S [sL'[1|_>[$kax X@SLHbq\{^ipVi|pLs%fF^u`WCHXDM' 2nsO p=(!8wfkodxF'KVBh <'Bo Kt}f;.Bk' I)#>cu75\h-R^kft{7h  3m4R)2jS1Ge;MDX`YOY[K=8?b{?@ \X42/;Dh7l\2-&Cr-pF{@''tCJn[P?4a?ziF8O[2gJ>e pooe'/8K:.kwpbDVn_"7L8tNNP~ LnVH>Xm!0#77CA/gkk9?) rJ>;CTt(=:BBLKQIK?7.8IUX3bHk{{}"RY3A( u\6*);J3 ~uE16nh?((a%uL?m>,.k22wV* z~Zq2e'Jdt]M2*%2PM|ZZn-oPnIFt({icFen9ki\>t#{nyKjnYI2 e9 $eE#GzR|M ECR7=:8VNFtikh^R9Jf 3>/=ulu}+S Dac= L;G<>;<(9y }Bbs# za[o%\lV!)\sT84:@LQY\T>,/uFAa`~fD`1XMdm[T<EQt<?r|qf]K9|Q3#$58Xk6plmpZ19SweG(./JYuih]TN2 (_ne(_G>M_x}}>-\olC4  ^lv $7=`_xq:pp`C5L5,U(.,2_{x\H5. ,\c|}~~v~W[,"'Xrs .]rP4EY] 1LMI6 !5FIF:nXF>Hs !9Qlxv`.z?,_ *4&eCCBX_e*366EdlMAVjll]^Q>?>:/ ^0 0Vjz$iw^:Hphc|x\2 wD )J}dC(%>`+Ttqe_d{v? qY[T^cuLktD! -/:<DILC<<SxwwzjAvXOppH*$(3" .`Bc%{kfT9[@Swb]g EVG9*3AY}v5 o[Uey}W9>fJqY4|| !Bf X){H |wCs4e .GA$|I#`&He8OcteTWZte9 mT9=[EJm0 Et;~vue_cg}c,dH)!c?TUN5*+\Cxef~ /6( 6Yy@-9AEa{k= +?8).72$5LmcT/0BQUQK1"{P0(0B]z>spqrydGTtvX<"$'DZX= 7ZllZFCHRYc|i=..5:+hB#+6::ELi|")"7SuvhI+:ILC2,4# +9INOJ=7264,+ftB !68*zim||m]Q]s "$=K\VE57Cby6 0iq)zuW92=b 3JY[H1 4HTU=zq~[_L" c<8p (2FZlp`H2#%*1+$ /Yvt`Y^k|qff_V=$ p\LTc(9KX\UQLR[g|s\F:()(2:DK?'d="/61* +k6`zvu[ND9,fI+/Mixuwry1ftL43GVhtpb>Mec%ztT5 !/OjQsQ-o9Eh>\nz{nV2"'( 3erDaC+'@Qhjlck?t~_D:@NRM=' &>9- "YlR@EO`ccU<s~ &+  6:  ,;BH@B;<5"   # .ZpvkP94?GIA9( eJ79T~5QcvyumTF7<FKUY`dbaVL<20)" iip{{4\tsbB  3KSTG7+&-8:=*}&.$$=V\XO@8'  -:JTYUC& 3JUS9}gW_q "0.'9?F6) !*!"(  1BQ[YXTPPPTZ`fhZG.(/@KL:#"1;Ocw~|{xnV/6QjtlcLG@IQalsn\9#" !>XuxZ=3DG:!|Fd~oJ(0AO[XSA+-DS[\WL3$.+ #&$$ zqu!-:<<549HYdg`Q=# #'} "2?IKRKC4&  5IZ\N;#)<CMF<) .10tij| #,8DHF=415:::9/# #5AKMHGIWeu~~veSG=50'" ,HPT<+#+<LV_\QB0!   +7>=:7:=?EHJ@6"  3Mm|lS4 $! .GU_\UH=34-.% $:GJF8+ yty1DMNI@<:?FOTOH3% !"$("(-1/)(&|$4>@?<:<BJIG9*/7:3,  $17;72+$  1DJJ<*$.8>JPUOE1"$4><3#   "%'!   '6??:+!      #1<@?1 /<<7*" ""  %'%$07=EFHHKKJE;+ )1531-.,.,)% !"   #  )9FQQMB7.,/2542+#   $0493.$ !'.2442-&       !#%  "&'#!       ""  "-5:7/!               "        "$%"          hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Splash-Softest.wav000066400000000000000000005403721366722712400240020ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data]KUQ*W C ZUq M &XC }d&*}  JD[kLM% Z$*ug* &0.\"w;% E U  fi; Y(= Fe5OQ} } { _s -W@ i S (,e  D SW}wQc'8H q4\Hsk *45t~23 uy> {" !G,T ,=  *j.? ,P*d& D7W ; VJu{@t@xa0$ ݽl_FNNd ; ouG,=6Ta K M r + U9s-O: \ Pa.m" e J Vx$$6/SPw S<,.r}r0XFtvUG6}]VL x t "W! S = "##.  _ ~-  .QX7{AMg  ] - < 3  D  _  U J 3w  F 6u!j[܃B2m`^C M &: &    ? g - 3qB>GM{D{Gb{ EF8V= k"r8~Pv~NwCsm  i/! ?q? `Z)G=w0M:}w^xc,0"cw qz   3euI1:   )gj>z5zPD& fi A 1 CO (c*.e ?  I Mu8 TX  Ssl$3<ہarm2"% h#sm6 g GS]yNb݌Q  O u tjx jmk6 s Peq!R_  +RJ L Zk&;LWF!x O+E-z?C}j 3 Tb( NO$ { 3q gIq0e 6A ucC ,A#8 5 - +1xc) U  &s  Y8Q 7 lg$Zj}j$ZL9  2MzU ; gT* -E _# 3u3 }i~@GrkkaFXu}%NPI , *Yg,  + \RaMxZQq*D*woPPc By {2N;( }qT- Yszq ~  y-MoT*L,]hu5`2k &Y Y#Fvwpd& U (># g6N2 t T  s) 6GxYi09NGCuK[ g3t2.LD u!-d' Yq c 9 Ld#O~g5gN{c{ut g 3:="<~ 0''vq5Uqya= ; [L{xD"k @H s ' i Ql  uj{  GCu g SeޒbD^O xC [ W}T 8 W Q i/ Q + WAmnz%ng 2 W k {?llN8{ ) g: 5 Sri C Pj$X\s"<^eP6ZaKNG \ Kp'K$ #" "QuHk\B}iq_ .q wy2`Bi#m6m A c 1 ' *Y(\ a.x F(};9G nf$<H$j y  Q:t?o$S_+ qx]\i{NmC0  On_* k^I * M ( # C]'I]6 c  >si}s] ) o! ]Wbtsq*/iq-3x6u F7 w,ߋ6u ;]  {9_[ ~ g (43JW2"uV5 io_ o?!"f*,R^`xs6 .-Y Se wkwX63m _]g   |S 5&@uc4rK!W-nByS+X<  BzzS#"+N- oD9EvVp>$ &gCo m0i5  b> X%& > qF6H=aWyg_l?o6ic\pPT]g  8r] l.37O oSTtCZ@G4k#ph=q  PW6></ Oq> &4(UX6>3MPFS$ abu5^;4/ka@1$=< k{NXBR %.  k s o}6:yE4iw(o<<<GUP m "\Yq  hTTAN k 2hz:!umx$b>^+"X @G n> mXc% O k _ }?mbzY Wq ? q. #w#\6{$yXvO13vCNyUxp &w [ \}jK8&|9($m gCH lnL<U A K  m  M-J%UPFMU * B` _y:  mqq<A0 Nt4N\wQ W[ L]  q y /;-"tRw fB <d  *g ]1[ qZb@4(V P / 4"-ki6@d"M& ,E  - 3 WiX x$"{  '  + j [uS$uGDovtdX Z,$ k* EkyRi5Ou/+ ` = O9G9Z )\j/i6.UmgT4Z8.]wq A  L62: xE{ys_V _ 6G l?eMܖٸ5F,  k bM 8*u6E sK qSoOosG _ ,F*6qYh82Im c ]9 ]{Y I) }  5) $!LVDvX<4Wj ]$yP8O)JN{86#iT   1- g G kV`- C u ?,0uG   -k <c :^MKvzIO %  1 O   +Jt C0x  xs{P VYFC h2[ _ [ { lv s E! dR .Be?@k mn<=U#]a).Vgi y Li [a bVPFbm3T4i<I s : k q0\]2'YBPuS;Fk2f98o661 @  c O m I ; 6.JI':gA(q 1- yf:nM*ZN:axCzS4PbEaTBPkHiNLi}f-Q:D e?. x  ;k 6NnfJ}MGwY]|3mCSN_IkZ,qw 3 a q D>5 (N8y@yc-Ww  7 ",]ffzrN4,'5Qs % _ A `L  5 + .sHrJ1;n0Bb,Fwoc h:ul0GE, ( 3 [. )`  )N&{ I &fOM0nLi{:voF1J(LU?$?!.[ ^K N "fU.0-%PD OE4Wq  ]Le)  ss9c [ o  g D=}Z YxO?# u-eY aU]h s3>sTW`F:4 aw5; o G ufJ? /)gG~vNM8<X5+ 59 v )  L0io  A um 6_5M `; 8+;Wq$ u  q%""%8.b 'xBW yLvyZ_W_OG q 0o [ Cs M Z mH. 9 D}OBޝs~c %U ]Qyq O I Jp 1 G([FnF vc;< P & *sO- A0@qA{ ) = s @]*",^Db0PPs$ # ElXE] ACy \`F_k Z]Z{n*Q = $3tLoQay *M 9  g -  ; ' + M+7 z[0_dD  7   I A % QLon`h8M B<I<.yT q E W   ] i,W@LLi'g9Q{2< ) Haq2V{,2_863N*ce:"u  +lh6>"=Fb rk 2o*}*cCUZmwoY5 ~ mL*d><  ] W  |U T JM! 9 *  ]{kwdX.qeuP:5 n|`(3quJNmdopNM2C Eb2S ^x A==On8>$I.$A_w g*WG{*5`V`  ?Qi\1W]c 9 q `eTdB@OCt'r$g vg  K!g.0({[KZx(K38}  <_"..U8<`H3n pw w _  Ux$Q!ZT cj2OH$"y`NJB`A{qmBO j u<?"1^rUYA}; ] 9 P) a4)HlyRs 1 S{ ga # ~VR= NBh(4\n%OO QA W a  RlYlo.TqM g80QyqDEm xE m6G u  "i S r^Zc) ! L,=')kKK,6&isu&{cM  { }k [ p1[c 6Z^ xv$EF ?Nz5 k}, \K >A]3s ;YM9 z o S <Xx76{_eF+k{qoO E e  c {7Ri`/q N*ah^r (4  M $6TRTiGirx :xV0t.I] N\!2Qwk. ) oZ5*xYN-IW :j]E+6H 'rzn\:S3u6=g/xPT8H sw>cQ\ cL~,^)) E-uuj -" {fVO#mxN1W a ! j4}KgNkC3{( w!.w / _ :S (w: Z}  O2 EP *xHS~ EdqrborqgT i G B'   S 6|iig0K&f9c j=7 $JBwwx^bMU3)I}_ny E~b u 8[ ) W / $.q_.  .H}=8_Y#Gag |Qyci "NoK Km_Q]E [ % ]{M?[ oO mi80J|z.6u p kKu 1 \@qFRKof kEbbdf'.:8":k_o DpdK9W[?u ! ce ag:0ZM2FpzDsy_ C L- S i y Zw)F4duS ! h! u*(aX*?\$e] cm   1q e m]"ou_f: J6w'o21A"G{!HJkuyy>]cUyBL ,   YqA I ^F m MuNN Tc[(Kf afV Mci q jj6J,% OX#@'Bf0*0jLy4><C S +/ % *- - { o q {vZr-;'Nu Jbc{we Os wVCj -u[W&sYiKW; % ( 0!+w.]{1JaC x- >c &O p) O o &y <B@-{KG{w-;X u$_gQ{Y{ n@1 ;$ASXD>cwl#3-@,TOYeOcD [  I Ia-# t Fg>K:^ 7 MFQQ.4SQ<uU-PH0|0kdZj %k?4L S ER# W ~ 2>Ni?Go_f D g  ~ GWfWk8qfib7xU[e s *m)6gFTc +>b &*@_ m2 I  q qiN]u,F$u%{WTy,#N oaL}{ d<Np y qUF;(|Y8. YgGW U T  7Nm`Z]F<`F)2HV  |fh @+V@*}AMB  Ca$[By  % c 3 a >s } $9|2u6O(tRM> a au  H _Xe&8re u -a:L WYR xdp!NT$N ZZ&g V~ -q  S O ja .XH#Y;6,"@XRfyP; (m ]!U P$ | E{S :{Nj\|,9#I"Kd._e )=b*iuuWLgy {?_"F eu& |*6j o&joxSD@X.g@yWMG  ) ] G  d0uiZ-0-i   k _ G % 0u Y O >{YHBYT]Ib0R.0  Sa(]..F%nSw &-A WR9 9gN]h6 x6>cMMmQ<4 KI # {1 g;mPH>Vnj2 g !b  80]Q5 'xFPkF ~ e cG O b5n%M|W {-3^}qN$68i?%]gG 8y O ! ] k AqW  ]w&]*WYpR0fxx3 G (_w  ] - TKf)/ oiu.Nm m&{J:q2x?5K UW g  W y}au3Aq Q 9 5BRL<{ \u+i i y j``,r; s  <Zfc96  z^ # G 0iYU{5vk  J_4  %S  .6+  k i `.CUaKe 'BWvhO } SJ:t6;uL7 m) 7' 7  {"G5 p%2&*#   '9RG B]K2W)\8 % 1 .E  :=m  1 ~ # , RBWY({ m  IPw)He_b-r? $ubN#h/hO A ,Cyo L# 2`X/p4BSP8am(U6YW6}e=  e  Pfg$}({(o w G60:Q {iEjAAf}1u9OCig t/O O \E|5%#K^8(_ 2oL qOLE%%xu |d) k;*?dAu2o2&%&wu{ 6V%&U KwZJ H}c:oc":$.A S / &Yra_e*e^raw? &  OB6&{AoI$[k4d]l8,f]w L3Bl MAIG( a]N6.\*  O 3 EC@(\8;] .obL Sk   _@B0",$IRK<V2yw(6 H O$i>oAI A>;G  .DOD/Wc},j  F0u;.)\NH*Yq<LSu y v ( aN 1Qx "TIPL*s f u_P"M ]Nws y '<$9iK#2}n:oj\O+a*; U2}soR/d-Lo v myJ<AIR*,gbe "=- NHK9bOcEui&s <9  $&N,A s 6@0/qPj/X><-m  % L / "]TZ k[4Q =eg okL,]eE{ = u$*sJ{"lVQ("LE  p7| Q:#(f@f$SDZ#Si_ _U  S 9/ ]XjfE_ 6U d)3QD. vH:bDq u@wq"g<';z`G`:FB9 k k  X* =|v,C Szb! "_g2 : /ZjO o e  E3!OyhE ibr~^TF5zuqE x Y m ; 3R\&P@r4gs m  '1xfR Wwy  RH${">= )fqEM[w h bmkk"` \* ` (  } i4}%2:NV2rb5_c'X ' %qHBa9qaB{{ T`$J\4GI{ij{D^x> j!TB| y{$k>#U3!N5Nf>c^ey 3 [ C  *}s}%oW0 [ AB^0"0^G1C -$D _Pr& #7 o6Q 9 %D&(<6*f*Eeyo"5}Eco.SwGcrqYm8 qq@Da! ) 7 w  Q I `ZO  G,w-wcSd}? m&F3xg "y3QDLa e mT$Z`wc e%=OcUoy@"{SO?YY 9n uLy  $i Y>^eKuQ $ g g  [$# u.uuN*Q YZqoY { M .{C6^r   :@y !+T4vs \*f0;?.( yia- a C q VE v 2 F"l03 4 {SI <("|!l ;GXU X  Q Q Q! _{ / s ">6hTr@8j0OMq a4{<< <K u  7 U q*\5*2.B"P]B.<" ;1 - -ls SmL</!ZV> ?+uX>hg$OiYwGX C&' d) TWKS U G o0={kNAkH.6bQo1 }  s<"})  } R]7A(V  1 s  akWyb(l.OI$k"0d0SY iu  W9_8ogeY{2gBu6q s m4m S  2{Zi})I{73yN<AW pg k I ' rl> 6mTI= e g7R?)1jPju8u3my K  EKx m k$q\ab.Hf~Z W8v)EU 5fd c'(; +B| oZU? Q y N7*3<? g yH9W{  Woc<2c"[ VLu p{hL>8= NAok{]."Q ~  s. y N 7 og]\E8 [ K % >WLJk 0(&M  0  a )_% igH!ZPrD{:IL% Q$ 5.L SkE=_kPT)gFH49p) GP*:}  QuY?epr 5"eOQX4 NUs0XicQ ]yC j(* C N5Mw$4Bv]h(iNu]X nxp &Hy IfG .;9 ?&6/@[K,g& '' %:aafu3 Ld| Vp <Ao5i3gY$*g<Fq*TVF c}aj]@  C SR6uFF + }kwgDww*5Ys}BMSZ&iWm @qBS a U -|S Y  [  F Z8EbN  Q &(T\- % ]( ? ! (]Hdr\u6e6i5$AWl\La<$;  ) y(wP :C6NKM_,w ) K @Oi ~  4F{q@ ; h I 6// y e qsx;yC$N%#o_' M ! 33Jq55{rem&0o]O._ m?yi}?C S,l'7 :L9V4zFc*6+S+ f; (3<02kPSL< x  ,1AK W +  wew 2$aW^9U>c:c5qLbju.0Q(Q?w; PcDysExmwDKT4bm"x(lsy TFq]   + ,6w`5K +b ]m 'I $fVae[6zjV^cwH ctq U ]mR{g[(H&4Y m @r\5:  Y<*NJzU M g M = v4k Tw[ai'<24b EA  EW#  % g gu,<4N b-:euk ! TW* Oz/ A megV B&=``ao  i>o1 |p F<$UAw(%Hr:.}TA*% z Ic{ "RP@{;Peq *oI0ws x?u a\emBNC~6 Ta\&>6 ) "8%$C"5#V*3 c e C" lZ SXKBXrPr(*a0^:] hC a '  g  *%LOx  / gEn ]c&Xi@>>a9'Lg-g e  L)5 I  4 8qC{AsZF, s| B6M"# ) o .<Pkw9.!Iqm`Z{{I y,q]-\*"t20wiP } / JiKw{J[O,}uigLdFLO@u QA-xC K g y  JKoA#!_G.HBaUic8c_F:  } K emQ:fuk1qC.8:&"d kL i{ec-;I;5io{-u)_ G G(-Z% @NSH(a,mXqcFosBg ^IUo6>4] bL@,,44qy._*qDi*O}XX*{ k 3k 0) W"__9 sk\p/%6[Q wd k6qA  O U0{}[[ .wU:VnPi 9 8C8  & V" "pZ*{5FzZ% iFX c qLoLjmb I 6W  q$Y LF"? I O`N> c C}QGTh7s .*`l  6> 0}lB${7 ;S k N|Mr I 5 ,mC 5 Q/ ^ f/c$Ce@}B cW! *_i Kw[}. SRC.T4u_y_ a  p!hM u)(_wjb .g   3A{i,}E.&RL0 |Ey *Y @(Ok.+yo% C :N.{F& E9N{9R<(Sa.u-{U.X&ZW)%a O t%[ { " TT` JkEkwqi %g&.Fo9Nc(H {UQbouo )x i{Ox$}2S"JZZ dRo6] { iXHsV<  ] .T;$? p &T>(b"8\}lGPom- + A{_i  9  sV>GN5SrV7 aBliZ8l}  '  g I  <o  F,e$ -9]B9y!Q_8(iuBYquw](Nc[=B*" aS I9 &$0`,E40o I ] e e"8Z *6"mwl|xD@$H u]0,D} 42Y7S+Oe_  s  ({ `fZ$b Rfw%8 OD Qe i3=W0&:eZy w u c s  e$"j_0'L29 q(FKu&LFI Y<^:FaN.i hB/s"uc" C 8w \ AY:\g!cPLs>&}5  ek&3 qTk  "w^iB 8\ZuCY80SO2./ -K;wUG50B*]k` .6o$)&k}wiX oSy{K<< <g*- 5 3wi t?  gI*T6K}&{a(\ + Oi@- [<uHP ME Y W:o0.KFf'Us$ A OmL6s] m e A YRYK ) gQN}mT0Dr{o * # p 68C,Rw{ ; Lu8_3 / S I = m O iL&>u?C&18 G 9k(KQZP^<; ] jc(%S m7 @,(wa G 2cJNaXt Q=&uZcioV:8*U KuA -j a]4h^US97s9 fxwEdud8oG  =rQ i0H`@U+ SFYiEx{S 9QDt ^U% i}7&y>o bl` @-^ji@ .J4vk ,U2gre}kbQBa2+KE>elu}[i R3 &"No-Z >S0Ny-aeEPF$EAu2  ) Woe* coTg;yNw:>9<(6S64:GK]>qo{ KAk M1yoo; E (uqK$x@R),8  O  B3 Dx3 f%r kwS!0L6+ Fv::a[_ipH/v i<PHMqU _  o,RH$.>ZK} a (F[}ASaAq@%oc:X(q}GNNo+ &M y `ZZ8}2{N.uaq.Y<}u h +iX!4.B0A3Mqo((lz"oF}]8&}m w  a. R-K-uAOuZd2rFM} e ++3 .eExGw"%   So4q2*M  [ s5]YXO0*![ % FZ'  !?wH:ZUS^\H>}  $,= jg  }*XK.S cc {(y  I (>;.W6Pr3zbD0} n ooFFW"aHIy]  _GJT8J4-ySm,2WC ! I 3 ) _H73EW I qzoH$B 1 ; ,r,TI-(:F{e 4|NK jFyG[ ~4 = 5 g `KMY*Z&<s + e gw$_*JG 6M MY/{ m.tT.A{Iyy(@iaF4  e imRyk4Hwig Wqy |E FiQ#;6402{!l$i % a6_AqWWTa .;/ [H^{QY -`"ue>%Wi7#o]u S]Fi y h -a8SW 0eEU}$wc&'I{!'6cZTQ<I-gw][] >Y>_9S2Y8L$s;G._b_s8SF ? C - <cPJg>q(waW}oDjB,Ug x  U \S$((2"kIMwY# 7 0&6"98_m#KZW@N|6S 5i *uJ6w -p!s IDh<= C+P VPC:. C(.HW-qwZ>TC W67-<NiQ -  &A&H}\u0g4cyJJ 3 O3 + O "_o r^i 8}}Bry  X og}e [ 2rg"i,ux zk ^Jo A  .PCqZC-M:oDDC B3g L)`g  {gL0(lpfJ`0'HGuQZ}"= [    ec{.$t(P]4H.V C ]{-?H& Ok+ o ]  BdLL bfk mg c g>RfG%y]nrPQE # i*rT K72s,Gii s -(?{f:*MoTg<= s m" 6y,f}f*<w,6DS E2?c<(}: s Qag*2RhL 9 F  zO _ *@9w K K U "YqUmC q O g"C -`? /f<,>a(3--TeC9{5?L.-_ZV!i4?wma\dy<>YQ   P@IEl?A%<q[m G  *CL V Z Uu; $eR Ns (.8U | LK] Ngw/o ^aPQgS@% +xa {A a  <y_6[[Ws>jwKi WaR`]>YWEL.S*iD{*o$>*d4ag<$D$(8<Q3 ]  ! 9 q 7 -}us4>,$LY_qWea>LwTs4042;]Z{>q)*u]e%-3-E%?(M}9O C; 9 8.QuG k48GCAiI.01<H}u6$>P@o1/!<? GlUc; _BD@BR8@Ng,Q+-i`OCs [  H $my_7sR5,]o  fS,[;Uy] K 5%?  E Q M g2C9gIwyLK [O   L>KOfW&Bo\g!qyq{Ii>rocW4@c?a?i[B ;*I(*}Ioo/?182{dB* \ZS I [ o cmJO1M4>Zw4*6YS{Y<Q >HEoH\ L[{&Dm  / `7orH3owU E  Q + }--ZJI / Y?_]HuqPvG[rqLgw6DL<*<>C< TP}0Ts;oq<M3HcI{ Q;X^qF#L}3= I &`wO>S,0ri(ecZk@{"xS"g  y E u<([= = U T8 Q 4_ukYZf<-H11>]C0_4j ]q T*! 9+ ' EBBi(CUg]kU{;#f`[}Y[ 9 G *_r6!1So@T]i>U%  w^D}fa;{,- Q K( R:m@_EYwF,j FB_q`(jB _M9 (SBE]{Wy(VfN cSa]FKuKwi6[ u  # ?{>wS+ 1:CAaZN4S,qg{cc - )  Kr % / UqW4295ya$YXq},sk. 9Ms{ PW3\Dy_G DqC]li} YDoF}wwI@<<&`HKI _"24Q O0i$3!q6 6Y$DA K 9e+aq`aLCM%&]Ko;M} wloANNsS  = s w.& 0K C\< /C=o=_HVgw/"u0 o3FL yJ m *&} QD`KE 1 9>BN-C"]G (c oW{0HH= ) K U + 0N0F(N<AwaDB>9S  7 .?U   m^e{J]D$"Q?">H_cmqI_cfw /u&Gf,[ % S Ij5  ;W]#5{cm&JIHm K [  KJ2mey UoVB6(m439CK>$6qeU[Byo*O6Fl4Bf[8mDK@PoaS]c9w<6   ;0065_Ui`}g2Bwd g  ^hx2w?aSkSyY8D. ]>UBl\, ;*:dAT.5S<44SaW  O wK<<wI[*fEy Y Sj^g}sGG"OG  1 C k wDTl.c4D-J~$a{7 *dM`V,s?!w6q 3 c~ Q .u0/zKE2A"y [gY= & TD&:3Ky5]S_-(O aq6<$6*]04Ha RG _ b|g *Y/6$JxY0'fBs@ZmuG<j"`g8yFY,`i\>< 9 TK q}/Y7 9a.4M wZ go1:*K 7 6< }e0,R2NE<o   G K&,Q9# g8cf"  A a 46@6^a0u C ixNb u&w"}XKu"i aB<X9}<wc{OID*'{"Mm$>ds@.kj.W36a u4{jZL@U"iD ]{}u_9u / @QBguo?wPFo`N4" , oFB9l E G oq95BwWsT_[jZ)>u 44oB B&\( pp S+ug)}#7&g/05 WLUohDJS+qS EIm^TK/CD ] 1 k {WKG ck{kK Y+D]*iT b%  :u q:"L"ouVaZX}(w y - y  _ ; DE=cF}QW"D?3o1]i(M q + sYEC<%_SiK{e6)NB A{WVSHiwSY5Z a G  ' 1 ykZa.)LqD&0BWQ1]'K< Z< #  [ oc{YXWu<[5;\$CN.6IcMkeg -ZT435 u k YTEAe% ic (o" su6(_ Eu  gVT}}\X3=Q)J*]$Y]q]?'e }R {!FeU ) Iu0 SwuL AYdi7m K KwC$y w 'Rai7f  %x = $a35 FsA[ fDpPQuTB"Ou} 5  1IJ(FLkSorYQ&q7 M WH.em {>YL"#EcCG< qeqqc/"R$`J \ 8 #mBx4kgkwF - o(S:w-(jpN\yeca;g? $&( I   7 w(Qw {uim* aT}N-c)-("kQW  1 k4}l?kj(. 6BU q ,km0^]wqww O Hc:}U]aD*kmjb*aw)] IqSWg&_  g EG"" &6XgU$gWGlXNS] &_W }[- G iuuA*Huw q5Yl=S0W]uZl<8k${w2RW[w K [ oaSjs>\i{$G]_mTj<u}LXXu> qZru?:F e-E)/jQE&G, 5O8w[A'K{O*W}@D ?=`R{aF}Zw*c&(TD wA l"Yg[ g=  aq>eO / 9L6S?uL6aWe sY2C  a .oI9_3i Bqu$gw{^*K4qli_ [y\P{W45s a w ".  O ?CTBy&J v w.99 Sgqq<L5i; +UNs:ZE0q(Tyy]{htxp#Qiu4  ?Wa 9 O Qa >A#B YkR%(I*>L*JXjW  A*w m  S  W _ _ssSk}1T}-+SXmFcCam(uY1 O1 My9*T^;8$yG"c3O Bh-} + *U Wq  i2*l2{*]oYu :TLuj40]Kk g_WY-q>3LN2G UJso&Y0] ( bf{5]}Q{=BfB$cb8"Q&{4$oYA3WKqAc;mLomSSFmu"4Ti}o + % 3ecC5ql' \Nh]Hq6P[ e t%m e  y =  ,UW4 J2\6(}5w&Yf8 'G eaoCo8s+*TS 0QS:g}!& HO6q+->uDN6 ^G { 3k\Cn`bguLq5&`yy U[9K#G?Ak]m$ /  ' 6R]9 s/ WW5{"u 1 1/ ' ]4W>LRy$N`K\n&-&Ts3Z{ +l9eM}2u}{08q*XKq?Gky ;0Oi-_;"Gg$;xd6];};LH,^`?uM94 E7 *E!- G#!Y <)iYR>LZ$c9WIwDy<@Aw)#G{iy.{=+LXBeo Y C    3 1  P{ ]-uag_i dV K6\FxZNO&  Y a eyJ4Gu}4aoog91ei0M1 w U  ) _ I g-D8.93o3<@]_ 1 ' y mdI(osYuo__ C [  { w<Y<kqoSqIGK0q_q,$$2M}Qx><A9 ~ y # YTWygc iT.UN}qU 5 # % ,s=w300&w*  g9Aql^Cg k ?m'3}QUOquTaU s i*x#oi 5 ; ; }.> m }c3GO"62$g.Gq1quJyKSq:g42F2!3oQ>8gaE" Z j8+H,.[B\\? 6 S&Gg:>eAUA{"Y9!{@&0>9*? ) K E i>oc_x%UBHC6$]W + cDmMO X 4&$bqg?M"0DD[ "}i7 Y H >q>Q[]m4`@s@5`lZ}05 qS ]5}  .bNW3}[y[Im}>. @}!I{ {;oKUm8iTqoiu0iN& * qK*uu@B}M@c)u7 :Zcou&m{0_ [ + A(TN[cZ}6e Je<DQDF)g$7fM,>gcAmA$<i  w]sPkFoiL\24\>&i]YOwxRTlO  SN[DewfZT3 6 4#5[ /YLuPC ) ] (RwkL,2x6Q$yFrxL[IiE?6u2 MUKWG}  " yk?'!-H(y6.oIOY BBHWY{g=;N* i{r2H*5Y9<x O Ik O 5IuS}[}"M-s(YewlBuU9-29 Q K  (H&Ha 6]G *fU[ c.[sKkQgH@.7g\I1 })N0Y0UNc6@${}&<} 8;9?_gq 0 :(<@ -Oem1AFRU*D^F>Pw { ! a ywx} u*DHC-G ^= .&4^{j"  *c:oG, i3E3wuK*g:>Lo06GwJ&&0 FBK7}K;%aq> 25 K M u8{q ]yY Dqd`$}(XF0]L>sBV.4 &+   5}3sQ"rufB$lZ>W5"j<qiW(6xLu6`62i W K G<DW*TlBH@6O$ 3 A wa C ~ 7U-   McjZ$acT (otr*So@mW&H:f)]4(YQ[Fw^.iNg  (i<E H-Cw& ".W}f0<G+ q \ 5ag Q.aiOa5GBj"/":u }1qUN,S! ~ ] ; -W8ZDi"60LU{B_:I]BiN[aP6 eZ52DoTR } [ M .6?k^{%<Y 3  7 ]Y yoT9wLQS>Ou*m8-kjw@Q6 K };a,w :g p $Z}2kS'oCum{qeL06=5Hjllm>sQFFqTN"$^RVf:3WY=c8} b:_keA) )HOSeG  6iouZ3}=BZl 9ysiJU   Q 4/SSj6uao#A*1E3C^"S+^  ?kcg  ]d5q.@iw8$*u>UTFQ) Lm  K  <B<kqY2n:.}KSM?EsoYk.3 U Q w @ 0SL'0uAr \*yZcTog ) UH,//[0 dw66}iYqOGu`$f & Y [q3(YZM(B'#k6qy7RNy k m / sTi{ibV @LL-#Ec=(Z%x#-d6P6(,OWu2*sCkr$"{iJQw_*Q5aK`P>{i&]{j?cR2D,c>TC5ZBr_[6fYqBa=Ru X6l)-;*@{b K ! cmq]5wKwrY.}\yds ; QA>uE0YTa"D} i g ) s(5/NN'"&agf4.N. ylgo 9m"*[3Ll$*@K;)/}!l6 KK(":QK3<"wgby]o YN\F4Q dNd[6J{gUNHx 9*<wu}<-kS9 k@N{<:4KqS EbKe[ [ emU ww(EcJ[9oL: `'qA-}uF}*k}r2&05Q_.$(;QZi qi  L[e#sg6r"E Z9c 0UCcAOV3IsM**uI9IY?%Gjiw@u 0{w}/WA5- o-??b0 g c uR{1W}.GZoWYcu ,,.K;eN]9T}.2Lo>(OiHCQkIGTU eq&cD<6%u(*P8u'"F_FKIw.m&HCW _i)OKMK)TBN6.i _Kwb)> >xo:/iilw.5C$?5Kuo(!e# 5 i2LP:W&I;kk'iQ?'Q['!oas5W g.Y^gqo{ND$S 3<dd:f!#Wm5-WL@[Si}bL:rKq\oY]^,{lH^kis c.id.8>cy &$PcuV4MUEdq$Yw];"*kAL:P-1 eQL,:7WFoLaQa<H4{*Bbi78Z(y' fje6L;(mi]Eo9e wxFki0w7 E}oQ6J;k{S(Uo"A / 6^CiOR4lfJcY&M0#SQ ya8e7)Kou(: $@{qL:Q]]>(RWsG,.*,?g0,mixH,}a YW6RwNYs - 0{jd:7%g]U$=D g G;u:0y>Oy_sa  2"emO >"]._ {5a,A YQ3]@xW{]i59isoqU70$(]Iq--=yYwbf96(2wiy;xO*gkG7}(L<m$.Dic.[sSj.  ' g0 9U &<3&E{U 0 gaYoqLi.Z$qq 5yk.5KT4Z[5_qm {GZb4"$,O58Z [ g o95Qf_kSMM'qoiG"Q}F05^\csZ}qTui[{IW{m5W+  a4<6FyCo2kGm30l@D$a:"m((OMu;i"@Aw*<yg^k;$ 3lwb0"oQqeY<aRJ,ma [-Sa2:"u({]Ue9io   } uOU{`<^8{ w?eC(Io<\Q}e 43'9.o BFwSwHKA[ wH (s*K;kTy{`a,M1$c 5E?LCi3 ey\oi6  }FK0iCk(k{5IZ<2('BM<6K   W$ >6{DFZMau}C0[j*3L`{De]uI U I U eD0W_&@Q* 3:0<FR(fQwJ o_UA`Z$Z 2<q ka / s S,,Ss{F`6>Ae?:&]>e;gCT6W)/;ofxXTE_ +ae`]OIaKZlMN $]  }F'sgu. m[. _Wg-Z:FQW<M.i#93E]g5' x 4: -$(:o5kN S[UeFHH#u/?{m }}<\>r^K5gm VEI,0:*e<Ua2 w S0.w"K#Q+Aw?KAIVL!{Zy_ooiQkw'mikMIQ>ick,YuL,omuO; 2[O>.0  sS  KqIFoP>  28wS,,M?-H>,  ?W I $E3bgk2$WySg7?/OU&gIe.HC[Zsi^&b\rWo0aTPaC mgfAqw+.j[-Q 0qkmo8ii@ Y .EA[coH2KqN,"w  Ac XfB^Ti< ZQ_"JK_Sk$sSK{(u)_Y_}YYi6;GewLD(wuQw5 i:e9=w?c-EixwE+iQiQTB-(B"6F}_w]6 M44"? -A;]s Iax <.66*4o< AWeZZ]NwdTY"_c77N iqqFX<_s7qEo 8W$o. * k)-fBuN)w(}( s-9 ( EEQ{i--wMMsWTyD iu}*[K I S$w(9XxJl}_rY  9.iDB]) c + i )  `5 _E &YI]>K,{  IS9j&*2i_uiQ""Bwek}w!KK[i[saO9KIAeKwSIY&}eyD"co>e` &KcTZ?KqlwPD&ZZAcOCYc& ( %mG <6u/k3Nw>qq&o_KruWM6")02.T- >&w 9 {2eai&! U.eii(W3]+x ^>w  ' q  ,i$c7io*L2<&@u[AI!i<<uq6s % Sso@r$-kSQm&:ca'  9;sC[-%;kAAuZX( Qq{H. gL X:NU_K$)0&3[ :uSAiqO?&o9Wc93uxiY W?&FX9.N:&[ *<(B:22>]_fU%7GGM!c.gN{q: cUeQH:>&1)5YGG?`F 9 Y s Eg"M?sOMQ1Y}.L6NK37C1yam w._8QSma {)Q}Q'}[CsHam: oVJi 5f W 7 (m S&g; %AD.gQqSIWguINTc<^,B\rY-7qaAYc8@0KE*{qE2{l"jT0Ro'iQqgQ]ouA@qmN,fQwZg.{@"Ac 7yGQ4us6u>iKk'<" .&YS=.@e9}iVZf 48m q ; U &;Q1sgo5a[N(H:D[Qm%w#r6M ArfZ7(ATHo2 NSeHH"d(^{W[DDIC36BY$;S &LSKAo(3S}jwF"} e"-"ugR4 wsAA<$Um;ss6a<6Jjowj{*Gk?{m1irjV*Y]>" L<{  5 y *e9{cwXF>DcT*yL?C U KK4HJjf_Ci9!5%%}9*"dL<fjT;!d.i:(:*3gy=7G_oIZqi:N,}}!]KcQuC rFdFk@@J (Gq2N/A*NA1_D>T?e153??jL03s  5 %  0{m K<0 d{; }(,u 2' uO;kET{w+Qg JJC]Q[O w c i S  i9E9e y_qo8q$qyA5*,MPqu&" H3y8}Mk/ee:c_m:xQAiU.Q9;_  N<Ca}um!:6.cs5NgT b>6D91MZ>ew}qwN41 w?#9 yqZ4ZdYK [u4ySqmC<wy5_smF{E3N@Va]$<BDw6\"0K(V{{I"}]U6 9GmyyaTFQQqFKo/{}du7 3WcE"5oB.i"@Hc^ 8DiQ  @B  QT,\JwB})ko} [ i4iJ": LHW/1?+k*ZZiyaJxZ.w91&9O/xNou Nsw"/Y6EEq?f$S%3k_{ ]];i  _ }4eGg"k:WeiB}ays VPPDkao{iO.i^4aF,i)asUcyA9W!'QE-kQ]Bf{ uLb2D,*(Y_im:8$*YcG*0Pqy{{3EuQ(?sJus4{koMYd(lWuHq_wEUMF>i.8[]l6{YSMoiew}6&&6AyOMwA7U5-*4Z> \y.ZH0#M)ENx]AqcNW <JW-ye-s Ks<;?/k^sF. VE)59:$@8XX0<x x}7&9BdLMm-L&yDkEHq{<y<0>:Z$leuSI6w[ cS }AyBa*mSA&:qZ1_m"?e*.2KexZ},}0;xL"[ F3mf$}5i(y g5<ao L28$K0Dq=G<4DS}QKIQ)B0ib[uG%Z} \siY q}kwF6Rix_k1rgSw{# { 7 o_Y@}Jb>4{x> w: CO&*Frc1H:qesGw VX"D6LoE 0m "mRr?#_^eMNj 6r<k2mQMMs5c{gR"Z 6:( iq\3EY0m3&u{@ yr#WCyi-9-P oJ y>-uZ4  +ue9Gg;e;CO0WmkM<uYZFL4KwcTqeCEQK.YY}QYk;;Pq5mZ$?-u'*BWie6ea+U=-QgujoT w5C WO3[K OqYU>:};5.q6{@(4J4rlH}oiC[=o KgxE7{?Kam)'HWuy 1y) UCE]<(0{be.aF((LX}b:q}iqkk(qK}0i6. 5 [ J8&DV> ,YCya1u yeQM{riZx0]CoYoB4UC}'o;Zu_s]?f@@F^L"@qwB `?k[Cq!K{!YoU SKWXLoJJb}2b:xea<6$mG9y;^\>ji<XZaQek1C;cLF*Vu}]uQe>k;"YKN Ki]WS<YaDD^*aE-[;AAZN(Z_F 9;Gg=X&V*[i s W"5}2B?CiE?Ka_I)$R4$Q]H@u2wM/+?Y*$Kkq:^, uDVxOy[}e,IG}?>I]o}Y/}3]5A ""j2N YARxq3/}!$"wumX-dwe*@W]{K_1wA96:>o/)A-# .&DmYq+CMi0m0 a iL1Aqq[g 4gyf!-r^wqFeT<[C;iorX..] U Y E A &8u T0{_ 1K;U65gC{rRD}AMQ<<&6Yw*9iuEc  xwmW5Sd2ya jm]5e9q;qqJ(qy*a:H,(*o],Da;=s<w, $;wses" >qYufwu%O-3+::"_ W,mA k6`{YyCg*2i[_QSR`$ LDl'&A}sUaM96Fl$T9YY( #qua@c;/!"xbWWI1+ly _&y=aYV0(MO%ml.RuK'`"^b$g$oE3ufalcqYSoeQ<ST!$w>.f6*T"(qFE)/Ds86)YY)eGG5[OqQ`:@:T0TJ HL<f},wTKuk?IWY48 .E4_(m6{WN^F_mfxJ,*uwI<-{C#V`_?U}lZH! AH(6F]meq*}u-Zw=Kk$ *gYc}8<&s.oGg ) _ {uyKcmeq%c]o!a&>J\m%0]8XXR4w 0<oj^bbe/.]BL i]9$`{w)Y_[ [G "\lu-u84lxTNBxL^K EEo75cB_DoWH0Z`*B#uN}D<C6}wFPXrl`HW9KuWo]]]uG=I q'Y:g40]6^{H:u ]s{YZfk.[o(L[s%T,]3'BLyJ22b ir9M [*0W_5c 3eM;BZmKAo0F W8:N2$K/M#3-YSYS"kuf!6{Lx6.i\Qc^q>rx@`r^X d{ }]#s{ [i .C4m {0q u+eG}6SYYF*G  Gr?Z6b^6.UQ> 7Q}QYTJ < UFki.DAEag9HLxo?eN>5-9Y_wQ$EIL6Tg*V@ i  A Wj5]?ou9WWg$1{wSqa ;Lj.{Y"P.T{? qLHo3_s[[}\VJ (TTy<H4 KGU{k$&Y6j,2(]xo)[$:TQ}O3 CqQdiuwTc!uNN[G_ QZoq;$Oq-w2*4W[I>9&Hr)m[)0xX2 ___4(0 %7_ N8Ii,Au_,"60D$0u5IuMufX^S#9-# V N0>LWZ.j ( LkB{uRQ$(_}mmAfN@wm&E<`Se6Ei3;GY!wK[2DFV\)_k3)}-c9m *HZ^JYsOYfe"Oaw[?^.BTZa,V @0}wcZif]A]3)r`uYYya-(wr.dq:Z9yYudPZo}":4 /cYy*OUki]Q<>wRX2oV0-YAQ]KS;$i{<VFLK,*4.deacK+7c9]9(s}:c$o4&c7X@u(RLuQSZK#)'3e9e(s ?uHo& J&{  ,ua0{s}Q.u*f}go]0Z6ll6?'-o0>uQLM y[,.}oako4[ .UiTlf1GA?-e)Q `'wg2@WWmID.@[H$!)7A5.c}(YQYBo$:\A"^&i\AIMW fYsUwcmH$b_8eSC,>><y4e_:`r^qT?#C=G]BH$]#/l2, r KKGeqOg&3mefN;"iTK;Bq<N'W$frHX$a_A$Q}U#icaBK#U=)} Hx) ]umkHxB`.*qFd$W09X i:^E50-/EI==f.e:}@0<NH,FH5#c3wd^"`0!qMa}{4:SGxN"b.FTm(^r'&_]2W&+qK$0PBSo,4<f<9w;=sYi{o?B409)UqAM&aSS@$]Q]o8-? QeGKajjoKQor{D:LV2N$BrrWKgeYkki'y&oC iq9fR\Yy*2:jNc-Ko/ }_wuR2u>T4"r7Il0b HjL6{lr"r4J,K!}]6@: o9lRLrQk5-Z2$y*2{N0W!]T"rO7}3u 99*`fTbLF^>F&Xr}GSQ!kSM'y6yCU(W a=wN*f^2,:6}w_;}}6oQ3c*.)56"<Qk(2_@Bu'<H-{L c;g0y"uZ_]q?5rd:(DZ@e8 "q uc0?H A}j YH4q-MN6iK?-KOge  XZH0fR  gqQ9a.BbuE39c%/K{i0o0b.Ts-Bi\ (dZ}D84$iKc5 Um]> 51!jF eeFT>5i7 k_OjWmF2;m&i KVJw`i}5Wu-i3b {wH]wA-r:iT6(YDW}9skiaS3*q.< 9o}r<q[UI>iij `)a{/YYy%-K%"q&_,[ !O66G#'Q7qA)Hq9$y*D<{s]3u7!9/ 7eu-w&}.fqko7k}9e.wj{yA<6$3MSSi]o_}"LX,g0`O`B_y# 2?Y))I3Y $.9?[" c Yu*g.@ [m;?QNfEi!V2j]3E-7-M?mZRiH$<guwqs?E-qM3=0Rqo!3QB wriYiu%;[Mk/q-q2o8\Du>Fq5SeYAy, (0[88Rq>a']^Po4#A#)3KWe qbcNyiE70b}"dJC .Sq> }.^kw6mm6$"@i asKSC"]m#_J2d?I`<]_ 9x`(}a<V@.,ko{wry7I9!G=7afo{Ac]IeQuEC_WlR\4SL_ZJ91]2$;((__; Jb\oDL]@&NM)5#gi=}K6 ce9KwYe3rFwX{i4(jm* @Z?)_;AGM{7S{00x*o{lX^:6u!q5O+mA@iP2,.q-A1[XdNi)-rXcE)L(dD\8Q9Z.RD8Bo]ceLTqw4kK< i2@kqZD ?YyE?/Wrx$)go}igUsQ <!S]AG{TB<i>J6q , @Qmq0k&5EDW_*WkCC_'# w?mk-r8o6 K_S!9/7e]*qdR}eY"F KKWSUWy_Ku+Iu82X^bg}F0ei9oGYs;]w FI ke($+ sGwMWo%[ $.j" m(Q.CWUC$GQKi.F2{W<"b0H:HKcUN">Os:JPg("oUI/Ei5=[5(._c%F,"6>d ff^ys3W"$Y@&2>"k; _ik9HP{D2gK?EK b 2Z0.Z<^2V, < ^W:a2yGM?a}r5uiC&waVD}w5EbdR^PWeE." Q*>Tqi8>YsQM k&3 UeB`f"FX Sw'-#w$.T* ZyBi@Z??aO[Sw{Two,:a2d HuS%AUY4wOU .@iu4 R!<:Fx*HyF4$: 4@}&Pu)+oOu-9g_MMNR2Mw0K:6 j("c=UI1I};cr8HXlZ8y$>(fu9!}e)y#K.Jb88VD>>Do^r00.@emm+w-L4$Zru$}Nw<Ee+9K+#N.uQWK3eG#)_!! 4uo< NNB6+C=+O_]f{u2D>wqL<iiK-E?;O#m-c?\u^^j.<!qaSu9i<dPkio>(6EkKKU9L(Wo9]%Ae_Gw: 3qcQDWI7+ OwK^DuJ} T+*H0HK_) ;o<_0dB3kI7mS6$i'7xyuu6(uq# );bRx_:Jb.T{ gKiOS/Ki>,-TLwXf ?f,IiYI=A]xNGss)'0F\ qGeRw=Gi] Q?TW&-wG# 5qm%_A_GYD\DPwEQc3[% o'!0E+]_Q ImNbBsVZcGMeGS<W$wLZ{**<6L?6 6{cw}l 9]o]qUCwi*J\LjXxEM}^>Zi}BNo>\ajUQWySWE?8V8NWKeT6f/+9[22('i$F P(0!bd}o*RBoQo2&"EEEN6QY]}i%s5YW<.{BgY*ysZ-k[_Ycm{ ZT<66qoLZ!9i!G#mqAuMkwQHRyy,d(FdfdV2:QclB o{<0k[EW uBlN6rio6@:"@:wwR`NF6g-II.S/67io7/} >gj^eu*K{K/MwoTayrjN6< Z{ {$3/sIk!*Q Fo:c{% W`i 0Ho^*uK4l3 S9I[1Mub2 >i$m6(]QEZ3?iK330R$g*>iEa.5ix` K9W g36qo drr(N '5UkKI# }{m_"M?K5YQQ$$kw8 ]=#?X"@YY{bVqi!' 9.a qwwi"PH6V.6cf^VX}@j:d ]i8-B"jLW Q2(q.:O "o*gdjV*.i% % cB:r3--SeeyKA3jB6H6u$f02\[M][q] kg,^0 !M/3iouAU]iy.Wi>D  BVw}q.""AuITRjR"(d<N>w#3AAYy}$OO0WZBT{45=US"^(B{e+CGY/GwEEE!{gyoFBo_[]P*TbXBQQo1aS-';o@u*"Y4$Ee%A kqW0 TTi]3U@L'_%Owa.5Tbw} Z6HFR:`7w5[K }K {*&&iu6uq^ i9_S/);m 7I}@""<- cE{Y6V}LVjlycw_YS__=:HNZxb<$5Oikg:u'5=?G euU{ q4x];gW ?+3<{]Efq{0SYou&J.B75_m]oLdDT&RBcif(*/Ac42LSG/)S=&.%Yo*B9w_#}'E*"IA(U.a^f3> Uw?S}$S} goF(fM/#GqQ6B0HN9c< my7 *R&Lc2ouy>Fx7[[#5E(&6k4u6 }Woes 9w ]>q1? &V{Be]UUC]eygE9- 0Q3E3&ld>b2,\s(a 4Z};U-;(}?1 -Z uP\VoDrq=o&{ 8<D}A}6`EYw!kgi`S6`Z I]PX"6c)55TBNq3"*EY;E]u!-uuKWHo 08iT4L}U8$Iq{rK{^jR.$Hwi,}TY[WQ m;?crZ<`la3fFm}.( ; 1'6ckm?){*F.k/?[S(DZ \:BEoN(loc93^.56xH?kYMe}Q]k' os.:@g `E?6<q_wBlu?9`*Nxl<Tk^ R}}j^^@rBu_Ei}W@q79SYomYqQ ii}lsHo}6M9$FV R*K_U C5-i46iS"&RZ7- ]aWdPiC=( u&R0 yGi/r(aH*6aajH? Q]Hw6Z49S9S CcuuQqm7)Is*,u$HHYSEUy=%C<Zu.0ocEi*6{'" bF{ySyya<L: 8doW 7W9[9rxBu!u$Z?yFL@}P{S _});{0TWAy117&u0@bw&oC;Io.$}x1OC%Iu"1NNKK^PH_@8<,MddLlQ{"dLi8 Lq}};#;aQo3)-4Vb8,j]9oQK `dyyNP@syi*}^f $NN : *O+Ug%i.K!H"0q;;3{ " Z.8>J&2g FV^<CicEic$f0u3KuZ^< @j N q}@0Q!'?E!i_ 5?9)y;'W{cEK0"Z.@T6q Z<A 1M!ZLL r"4j9q[77 +G:{<K?w6$,>i?KE(dq!=o\j(X.L6u=EH` ; FPP!;. 1q(Z@@qFd4Fw&kw:.__m>w`#]&3_ayYLq.ToSUOiea{WI '6XV ^N 8bDd},sN8kw2D0k9+ @w('" B{SY6fcNgIG_G#qw S)ifHFK4. oKSo}B3&: Ye_)[[Y: *>>\$iZ^6 = 4\*T{TH#9']Eul.ao,_yLLu<i9q[u0o8.crNw4qg.}LB2RBy?.ZN}^0$N6VoCm=Og=uC{0 s({]1%$J\4 F oV{8ge8uo_;m K9]fFP_*[<(5A]ZZ{Ye igGs^oHZ2L(X4V}C''xuaFL4(o;yu}Cu+YwIIl} 40`@qJD(j>ubVJ2 Li/Aq3Y;5WQ{qw@}:u&c'ucc3'kO71;Lw}.3'xLg  L&{6gaPq^ 37O+{D8Y_q<{yi*B&Vj: I-[;{ {i!}NXJ@ xFDNg*S(Hoea?MGie{$FbuoDPiaweY\dHQY39+Hf0r.Rjw$ <*KW&!0[+1%:{ag^/56.}2g $KiFDb ^NE;[ (9I=cig{@}"E'H({wSYwK;if(d@r{KekY] LD,&>DDPJ_M6N"*Q(<yAoISurV@@:]-Qu{]g1s_Qr.u6HsETjR]}IKY_}& j.KKl.j9w)Ao$. {']EBZ;SIV\D:wbuDFFTFHgOKuA@4}}SL lNS@si")Sw?-AsmoH'9c1[s%]?cIL4*E^{qHN_"uuY?{oI#T(dJyTVRu]eq0LP,q)YxHa79i?WW3WWY//iqJmga,T>f9 60u#OuSMuiQcxx03w;KN^F9u:d@(L88}xHrwubb,u@9  96ZNxFw6I7aM'Nuu"No4dru3#U 7+CU NO?y)w'WWYSi*R&B0QKwa,.H}Ye-<"Rj*i9KKWQ'wMs&9}8DVd`M q3 6sJW?!uSkE* \Zs@iK``f$cG )o$XD,dg WDrlEs{&NH?'"q(Fmk;'(.(^gqLqey75Wsw+}i-GBw}qZ\2 :B{9EYj2 FCUIkffB]/O)i)/FRr}Ri&oQ2qHo5 #S9W})qW]-)A?3;/M 'wSw@qwwLwqwX(@^q.4:8,<H:XTB3e;eWZw ESMamO%Wccsk}u>VkL*(GA [=1m &: @uyy{`/%Oa+o Nw\NTaBB6bD b<Y2DjYsK q_5S]0FR4 ("" 4qwjxk}] ?;#5QTlZ0N0okU$FPasH6*V4i}%qWNHNT.}w:@@@ }wBP]'Q 0*Q/1;KiA5w'fF}L w{o\LR bufZLi>:<' g7=G}AS UK}W5-*.8mX:H/30<`oc0(qq}[K-AE<myD.9]*jX4Z;wX$0>dB]ASk?wGk;gM la>k6$} (s D(3qs?O_} #}ZNc9{9?9o<k#U=I <XJ Iym<*D4a D^ y[ow)9}@d:@:s{>2&:BE5Ai6To7M$l.b-u6 ]$fwYY08qHcc%YC]gkmS'Nl uuX.@.Ff# 5))Ogku6,,BH JR<EkE3o+=/BK3oa "g>"f'w&k; $uA`{@62F c!cDVl<ZRm8>H5W*osg -` wBx: )s 1Xi0s\w}(" Vcu1aaL6mH4]:3- Bf$<u_G)M;;G/S`iN@:BH0Hw}kY RH iMO ;sw?{a)0lfxL}W,8@R:L(r`E}%IGwq[Omqf4d6Lkq S_a`CgHKIU MEG}< d3EWr(}Xx?#s%[AQTflf&&b.8Db!g._?oQ]-&qwQ /Um&@W30"@"bD80:{B0x3ik91[C&m E=skEB4P wm6&.@IS({ O%7YKK!'930.XloQSG_c@$Z88*S"N9eI -[#SqkCaRq^F Gk 3qoNm00B*  -M1E5.w'mT,P,w5eN6_e?u-) ?<HB06.:jF"riu4J>8 ,&oN"6Vq_=60y1 eY}sBZTB DXrTBfRug# \F  NEW-iiu'eg;?xlK9!K{*DX6i 7kEf" Bl (4(44j}L] O#`( {DV k&y.mH]S_SQcy}) Z"LH P*kY222L<i!EN@L $3k;)M<HBEkGcw}&R.<]k)5;%+y3oR\{\>}!)117yAY]bsHoDbw_933)[iC[Y?1}-9oQW!'jJYQagu'Q  2q6S/-@qRBE9_g,u*7/T(*ZPuRi0:Zo("oq*ga#qymy.Wf^(l?q)OYYgqTR^ Q]EQ fZ4:* }/SqU%C5 E-9wk`<o!E{`J oTu-qU-M55<:(X:ZllVVJ:``fK#CK6d2J^ EE?*i=iQ }W HxWc{xLL^qXXwb2^B6r4,D}BQqmy Wwi{6ykYyKy0$y&oc rcxjVV *aqxA5`BN${Qo$<q[GAZxr0H@\ .:y6660DHkmQ3c?6j`X3#a6N`ZK9-a'Q6*o+%_DiK_]EZXF*u}Q?Q1g0wQ'^@NBBx6}aQc5wQB0<W}b{b&w}F`ZH<6H6HNr6iYM5Ge9qOKo?Q3]i*6BHr,J{uRQ-}YSi*'K*`BW'{.}us6X r<66HZ6H]3g?} 6i2O!x_Q*2&:XgP>DwZ'}!u&!q{ia qYy %N""L}y@cWSb{bq:fAW3 %Ok'Wo`(,}{*3GTHB(j `YSA0xY+M?W]{I)!HJ  6x.l'-Ssg_EqobXMg%y#)I-Wug_]*}V@S({r^,06D}w(T?5CQW6sY}eY$("." "F:H .<66fx4V5)3]K-#UqAGi !Zdb\. w_ Q*ay<iR*]SgA.i DuBZrlfff"w*?#m+ m)]< ^]ojm$0f:^4 3M=Cy E N@jqgssq<:}:mNuc]6*cQ!#I-K] s1yZZwD$C6] Nb.Tl<BW AE%!uuc!rL.fr X^44:8i@0TN5gwQ3k{ i@.RBwkqS:s!ee)G)kek5O+s#];y5wLR`B<(>bVPD{6sgu<'{NB'w%{{yy[sqwjN^}q">6 ^BE-0(:j(H  _!-'uZ*0]'WLw<QK6Lw.jNB0'MgC7E.(oCe]<d,o006 w&i(:9[{SA95w}K{{o-<$*0f"JBg6{, 2B9S5OoouE9!]:&.4N0oVi&q{!!Wo?})g=s'oA77[m#;cN"H g"ki,j CKS"[*We!FD0{x8 FFwR*_-j@E;$DLZik_k_MG}`rH*F^qfYMfx<0T:X}q.6m-u7Wu$<`<$ 0@mF:F.:@(Tu0wwkyq(5iZ6<`LjRLR4$*rV6*Rdy *EA7e 1KB\Hykox${;u[? r(^jwXdRPVV>D,@97y/wu$ (.@YFsQqc}w55C UK[A}8NZ^ZA11s#MkYcu, $4} <S7o.;eI$qEm/-6>F"6DLj yQk3OSAUqi<5w9]oi$0H0BJB_y.L w" Sek}9{%s?fZLe:ya Bg6$>P2,q 6Q;C{cKWK{euHLL4.(L@(i^cQkI3u }E{<06rf ("T]3c0H`f`Zrj(<{&PRc!#iK=!u?ayI]imYZR BZN2Z WwS#MkW"qXR LHN6Tf @cIc]K;Y;#Si0$xLi8c3i$`6KGwEHf`0]3o{?S}3i woi8xNf J<gmgsaa4TWa-}sg_qkQl,bj4}2BmNNaH oZc?Wr}j.ZM1W0FXx..:(x6 .qqXw71=WF,bu&w ("^<j9Y;);e33ouiuN`:{ my(fLqXZcqCW;#I[M-NB]eM94V\i}GeN>L,2&"NkM;{ii Qy)YAq}-\"w2DD{c)m5Si SE3-3{?w5;5qYSYw}uN_y$DqL*-aoiuW3{c }VF&,LLwWiu2wR}:*c==5NZ*?qw? Txx(qd U^]Q5/B {c*Tf@2o\2FlT..k{6*{H$Hx(qR`m _!cf:qLl`4qP0g(S6L rH0$?q cc3iM] H0Nx2_(a$o>V{J 3Y_AA/GS'u4X$ 6NRwew$4DD}jJiJ4`e/1]Q& WO'Yg>>D &4:..Hw5-o!;e6Sm[%+7UuTj,RuNl$$iK?-W3`rlB6H@q@H{k qe5S$*u6QkSkq}}eww)eWf.Rw}wJ*L}:"lff2{^c59_"GGeOwuN(d>ioV26a:`i?3!!33 OQ ]U'Trxfi3-Q?iwbbPV64FLm>q-E"[se 9E}a.ke mw qVi\&,qf?M;k{bLTc--)]G (Aei% (@RdqX`$$ZR<$9}eYO3QSEFDuo\86cGIK%eq_Sq]f"jJ&.(.`0NQ;1]_Ae-+/?o$wPZ Sw}@s:*W)<4"Bic'e&MME%/$(>jH`B>{ @F:Sy>EM;;/w'W9Y/e-qF" Xq^ 0]c."x.( <fKA'6Z]wAG_'-QKfb*lEa1OG<(:L"d&,(6$B<Yg?9-o II#M]wum6  ZsB&w`0YyGZ 4"dX@0]5#SG 1M5a+%C/F>i"qy>^i}k(ai5c*`@uaFQu8@ u1s/M}Ae)G;##yU#k G'<2ykk}e@"" 6iFBEweAw?UA-j0_q" MgC[YQ2{Jq]Wi}_lZEWBH BBL&DJ}` R/gakEr`T:88 Rr E-cQK9S*R mg*TB<BTsN V 1?QU/; mUqW9iK 6!}WrX}XNH2ZaH9kU }Ng(kY<,r-uCImia5iiU/eKB<keEcX*NN_6S[O#/)/# AkW<m wLi`6K) _3<HokerLiV2(X\{u{@TM;Gew_)UUI/Z@d@6i$ {^@4&Piq''{o?qa)/#sO[S-(oP_4.  BY_HD4AY C 1=igG6TH.u TTZ<d44^ViPQ)oC M_c*Z4kyaaT*R4(4lS+u]KE9-cCGYkY?6< Tx:l9]0Nr(,w\^yoOAM;5-WW3K!iN4$RxS[?r}@ .Bs<0D6WY7&we?$<EBXyygHx*iY[- i[;o <`rlHcKkG#E:4F":} \uy(wLSyo ZcM=KKioEk[$U}KH^Jo<<<$J>xwA*"(9''c H<BWc"}i'?*<Ba6Le_.5} y#!''BBZNNHE3cjq"r0B\&,2f?!K6lNQ/m -?EE9=q!]Bmy6\uoP.r$6`6KiQ6$TTfN6W-qwYSG/SX]3`Fj}L" ^w}RxWS[o?K %aIUOIei",}XdF" Ko Po2,D2wx<$ 0N0G =71%1ASM/77 m;-T"a.qk:@{o 0'E''u{io?9wMYfRqFl0-AGQxWYgaIICN^ JDJJ\Poo^ f*T:2P{bJFHM511iQO7meq/ir(^B$H:"r06$ioo0@} o6Na8F`YmI{} +/w? (DP6mmoq*!/sUU/GMAyAiQouNR u,8 obb{V(@dX:oAyU{}"_}eY(Y-=GW`L:LS ".0JRruuQcEw5 )5?]]Y5?lXF^@^}NdX:<]3c9W9A/_9<T'9i{]-E$l(w, qFxrf( (<*Q!]TB6GUeb0<Vl0r*_kw!TR8H"kekw_FH4ZZlZuiuu]?}Se]0rLDN"YL:<!C3c+e!9-'6qZuK0u6lF\@k}(yusE;AisoL4^P8d i3-EA] T">o>q<W_ c?i+UG}0>\D}wTuA _9!!uE}Ak*:4RRbB0<i.xK?u*NwkMEl$iixq<c5qQfrA;_S5_9N\2oLW eZb" "$3q'?i-7 o;}eeG}' ` R&wTN@22qL"@RjR`?kOI1%+=1G(P\HsT0,}BJ}:H5aoyCseE9ii sJ*myyZNa:Z`rxr6Wciw#SY?{ BZ6o'QfZB6]Q{rF@LBkqko9?!3Q!o?uQ$<6, }FQ5;qqeSM-N@FdRB6*xNr9Gm1 C9H&_Dc Vo\V&.TT44`m7[7CW(q}.(^}>iHg#s Y?fEqM/_e-9{N RjHNl^^f``f]W']-oWKucE//iXbNmD(Z0<0`H<$**NZ6iZQ!$"*WamU=U_W B$B6BTFJJoPV }("l9]{{3ey %a AqYeH8oooJj$o$xB*9GG},P$$HTZEm{9 &O3 f(P lRwZ{"xrT!M5Gw_;.9Y-3_Y9{<H{<:,]8(Qq_e}'!M#TZNB<`RF"co<Lw"x`0L:(F44AM'Z$WKiGM^&&ig$i@".Fd6kM#f@"x ?!'A[^8VP>>VBy0iRTB{Mm7m#02j:To'99Q-weq}/yUUcf&<NB\<'9wY;;";Eg qWd{Z_Kg[{Q }goN00MU IsG'T,uoL!e_-0Rb{2(x`6K;A GY5 ;#;A5ecD,d?]ui-q;/GQo$T>b} (X( {-90TTTlHr0ux Ri<,Q(yX*Cui71sC[+ O5*L44J{i>wF(  "FBu-_A;w9oulLLR@ <{}Y#q!F:8b2 FH$ieaIU/GkA5#q-w2bwLL&a"Fm NgKG[ 7_-E$`f# k}Uu&9KU3Hdb6*Ne}FHX owaOOy=?Gd<Hud*uWE3i*$cMk'u<Z$!xZ{KY7C^ VF@RJDP,^"'M9M'ey? o]9EKcu]W?Q`F2ouiV@*--x}>$q'9iiS= 5QEE?cBrT$BfH:u*uqYG]BF^j(_mmU]<f35A#<F>u<Z*67yMqyU[GSwNq@L "H TF V6V"lQ3i!q9K&E 3+ @uLy<0;AS?'IaWZ<];_*XFFN2rQGc-QmA!$a $ SP@Fqio}y'3qO]?EC/5e;#kf(8(0f P$u'esgIOC7{K {I4.":^ {Nq"Z6V0'e#Sw/1-9 coeiBL}XLL2 y2{Byx ';A/G!oc9;[aki:@F.@DZ4: $V L!}Ci9QO?{xd6y\(Bi'Ko$ZT Z,amm6b^*!qYmC7S}0 il$*$W;%oKmQ$!)GYo N*Z<ZN*3{r: os6,qR2b2AE}"".5" ;qE=MM]Z2mmBD,<iq+ge/U7A#/F$syaBui@ W-o]})qE%%mA6lrN{{cWEEo$H}wdF"SkBd.Hi;yICaga71C;q9*lL: S_-"}}FHo3-uo?-cZ.{dF(4X&{i>^6qeS/m=7B4(LD !9<<!S))#5S].RTfBe[w?i R*<JH<H*8X9_*$a_e}9KOu "4L@aq^LjL%uiy w3$R\{ 0cSWlrBTdw} ]'3ck%W 9]7G_qVou\\:kNo`64}^@*_#55/#o<j^"rWq)mmIOycj$ya$0a<bEkG MAkYwG_SWi Nj>{V8q(rB9e)/;}-Q$rH6W!e}i3":o${4.PPuJ2X^qqw{M;wqU-=eE<.wL<{u HNx <NV $ 6`<]3]KQ'-]Q]!'kY5AkcNr{Rjx`Bx"( l?GsU7sAoi?wGq.8TaBV>DL$xQ31gk-Ei'A/Y!-_!'MAqr"w2oiJ:rHZxrN<f.jBo']B.}wjlY[wE"'!Qc .^,}:Z<l :4f]99WKKwMMc R 8(H064}R(`l<Z`NFo&:T93?u?A/;}/a]-]a5H$Fy,NKeGq'?W))K X}HfTZB?oll{oi 8Vb${}k;U-&Ks/ol>$N*00<0\K%M"5iUEW!iPZ-))q}5a%]c{wJ8*.Dw*<`iOE3[-E'}Y;W"(l {'))e'cXyTg^ u{uW35##)_ASYW{oZ:V amXH$H 9qmmYTHSS'd8V\, \m">"B]ZjNu???c{WGAw9N&&dqXTKeO{se-`uFf6<4:(fE-99W)[mSoB4"F>Pib,8(-AoU'T^bu }KW9c{aAZ`xNlBfBN6$ba8oHx)GS a-Oi 0 u--A/}9uH(F(r fX8V^ooc*.qw ?_IqcAWH4}JmB>^  Lw/GAE{{iS[{{IaY{*FX4x6r^JFd:wjkwqq'c*NL2V&qwX^46TlH09_MU=[_QF8PP2J{\Jj$!wSq-{ TZ:VB V"# _$ 0>i,qN3#+[q}Y=AW:0:4F*HVqYCWQi%k6$QYGGw!5Aqio*\{{*yya$DLfxK/M_)Oi Q s;kQ$\<Lw( iw O{Wi1smM- F,{obd*KEKx^r* <F^}}dd,bD,r`lB u}keaw'i N " ` $0( Ni-EBfj&P8(XX}}^4<QY)ciZdNyqHEmE0rBc3)el4gZ8j.j.B6`N*oKK9;yI=U;)G)/SK0`<x6lH`flT_}Qf.J*.@00{o99!-3!_m O_xPo&d*$xZ6{'/Au][;Z.qJ& 4 Z/%MufB`lXR}2uQ 7[I7GQ<B`ZHZdN$00Z@}2<]kOI=);Y/ #A'F2 TZ<lf ]-!-*5#SS'?]cWEY#;9B :6::mB$ayV"w5yI1U/3UO+m 0 u\8wd.f$0(0Z{}: NWw)CeyMwE0<dBgwF EM]MG5/;)MGo6x"Xi`?]i]W3jq0{{oiuuQ7;;) wi q"006T);ewEo{Q!AA/}ED*Ewk}uk1c)5] H8ub>d*']4w4.r/ sZ6-''HTqi0ZyHD:N3wQ?+1Cs#Ye?<,bJLrN``(}>\& {]E]iu_[IY_e-KNFXjw jFHcSMq}S)#_u *HRiD(x_mU7OyAM!iNjwlLJ,0KkA+{aq_;q]B.(L}4r*0T``<E\ <gyg&w0 oEQKQi]{ a;)}!{.\{b8DJ\P>^H9!;Q ?1S}_Y MYQ^Diu&"$uN:XL."x$?wM%kq5r486ga<u.<uE!!'Woi3c!WKEW}5_e{Q39?oB* *Fw}dH'Y3*Zfj2\V4Z 6x"&^ZND24BuQKK!yoH&o$i-uU1#iBfTo-]l LX N*`XudF${<( {{\Xqs&qSkEU /-N4wJb&,,>%G'iooBjqFBHfx:w:l_A_?xrrZTT":R}wL$'}9% ;kS y[sq`V6>K&: uL l ]M;AY]*{{?Sk#;oTo{V\q Z-}MSo`dF}.fZr.l `w&ZW?{WwkMSY$""(H'igqE*r@w>\q}^}dFZ0Tf Lqdj,JbJw:xNBTZNk #/q}w/7]?Cgk{BV&DD2:B&X<c=W+ekw-Hxx`0Z.obVFx*i{EEEB4@^NWf Po?ExZ`uf3EMAz2k >~$vt>,fH ={#+=Us+GGWz(L4:.Xp wY 0*B`7~`6}6)fZH6#Avk^|X:YxatIjW?)Utzoii4i,^RXggm)e!-9J3-A~g @ h'-'Jq6}V\E3`NTIT``K.Bpl!LKWJA(@4.@W(@#Qn@W]#n]K"";jS{ /*A/MM--y(X9Qyn.$_ J3~*UwfC7Iq?|B 4:Eb=v(s0^jT)],iuLTP/i 1Sj{jYGED"|``kqwwq|f>-3fl"[9-"" 8V~Vra ~mP\~ ~VQExx~Q5@\'s)5/mseBogxm/ccR+ |>cT!2-Tv`` 'AyicXRici]G0+RIj_T=)6+6`dpo(7BRG ^8'Yoo7H=Cdd o&HYdH pZZjpee"IIkD39 339 W~mVDaB`~R&GAWRApZpBX/RhM<Xl55+Tu)Upp4 Am F]W&<A<b1QB~xs6A\AnnaP$K;"dOc|=yKVQ@mIK0iaY3>.CC93?wO+@v--b=-{[k`f{%E&A&Ep%Kufv0` @{0 J qkVVK6!, 11j )9_LBGWgb\\\r:#gggi*W=(#zjz.(..3=Cb$DdyD*hI44>44)>^>56p-\<<uP!E~s:/~E ZnS)rgM.RRlM(wS4d;!E3HCM t[[``F,||4H>SFMR8&by_;rN5 :?c[\vN ??ScmSW a)qv3WaL. #3==B# #g9/wX*&D|B;,BcTY|mww^Y6&6}7DqgS9t<xZ611d[*{WA(2_~dZF2Aty[~Z#Z_Z-G[e22#2di"_ v/ aIOzkzaC44MM1@,u m#kfW+!0fY3e8,S&0?@BtM_16:SSvqXDN'1N{^"v@ ,NIv{ll+X ^AKYwhm# _ G:pt,j.  szuu[%I"': QG%QxWR\R#(t.1#0Hy`?5RaeoIC[j`[`ex !/ n e!S6(^U 3U(]!C2Tb2)CzbGwi9lYS E cdjj0 [ddw_&c%G+dCVVCH[QQH[n04vU[?1[=27@at(AWgFBz @  j9 '+r7o*p+_6e`~ypyXAa#iV$7A*FJ}s)S .A}Jq +}G~yra$HE(QQHd2s; 2WI-W2$7w iJ8. i m6|3aA}OKToJT\q#~Gd?(}O+ zHsX]xR"K_&wgk,.%u:#>y~u:lcu;H2DZD,GyG,UGoO|Jb#1ok|s#{`/Q )HF X%} HK=B=aOe|K=fK9w#9j\a=FJO\A/JdqqE`U2 ?.Z^+#}lM3X, ,GD+A- zNE84Ad[J4/E8RNA}l@"n$kM/k$>>- ]^ R}KM ]yF=(ANhLH!*o@ lV0+@^3 _I_cpxxp_9lBe$ 2>6;EEL&>)t[Gq`XqG%CXh.zzn]Yj.6B%{f>Q ";]J!wVRR{%cB%g_c[5!1J[V cs! .[ WFIn^$V=)-=JoZZN%A=N=={+"/"j$~Y4tl|| `qu(4rIn9VVEV)EEUv1!R$DYqeT4DPg[GdP g XsKOGc \X`H h,XTXXpK gSC/7'7/O;3]&**:^CgvKFM19mZ3fzn^7 G;'^3{{cow^N3/+#x.mqyia]eye|>hpl{B2B|ltpM)% o@K0C ={ $KbybTSrn_@ HskAIcw_[Wn.zngD)9L@s+xiQp{d7+J{[Y a3 b5)%-C8Ce^iV-ZK%&H9^nyy}WDAWLf4t;T" _k$Y ~BpOzkFhzcF Qs 5axtZ]1% Q ]G8&w5G5{0J$$'2 rTB$(7uEqjyfxTT!}!krQ`cWf[oY Gsb)BTJMI,!=2 ^ESP6[Ppi:+@o]s]9 5o )"0P^bT2n?9\ .\|uUjQQN8JF\JFvsS377"%,Ze*mT* 1?_mM'~~P zPq$udOA 3;Dq-P}9NSBS 0dy"k]>HRV6KR[+!.<9 !~%c&E;4~R`A~jUxR,KmzQ=(Cbl#7`ct{{tcYNKK:A0A0Av(}/y/}70f9|*H; P?$22k?!<VLP? xBISxP!/7.$LE8V 1*:AA7HArr 6d{xt{{z6N{d0#zF" 0j*x qnCrXXbiyb_<"",|gS6 =V7DcV9<] @gWTW#,/bY<qNsMZ"Hx{R603 uREHReKR,oYMF77*]Ka03PVeF z>(T+ Oq &URGD3.@URWZ]t# ~l@;i^0);ZME! )nQGeVA#T&wt^:oywG0D?A<<A72ldIAA-NP  CZ%%9 i> a6 *FT(EJE4 h;ibSVG=%4;VmN{znUS88aXBN13",1Qdu0IwtcaPY<5FY{vJ$9@>|FjBS1KmcjaYPHA80 o(G@k %8;PFR;6(6Mgln`M6zYB;=^x{hS999La}Hw{H"~s`T9/&-`7a*?XXS5|^@re{yFm[8xB$9Pv+F\j~~cC l[F5)##DExv`LSQ`QSQQlu,@Tung9924#  Ar^2"  -Abw~f? zq`veZK{5Qqu5zq 9YpeP0 mTVIVOieii^mk,^wyXUKMOUQK@<-2!)# m`IEIgk//8%!'/FV|wg5`3-L1`dI?G;E2.jdZu:JTPR:B.4D^lP2 |8BZH:nL2(*4Lf'WflQ=)+7K\`xz{V>! nj"8|4Jt~[A .*&xprlfWcWj &/?;H+5+">Janzswbnhb\D>5+86IMMQEE8)umjodhbbnwy ).:860+#! &7S\^grtyl_F$!&8L[f_[E>:1G:A<1+ zgjj =j|jTD) zi^RY`ew'UfFld[ddtwy{&(6+2))rp`a[dw'JVf}ungpsz}sYO0)~Y?)"Ht '4Smd>{ocXTIIJU_fpu 7aidB= !" '8Kbu`9rY:9"47Lc|  &3@B8EAMVZejnqvvs^F)%:8BCQiqnV: ~ 0CFD;" +<PPJC+! 5Ihkysz}`-gX@7/2@Nh(IcmspcI?  q}#/2GGYNNHGMMTNJ8(*3C=9~#3FM]\ZN5+ '"-FPhovN9"  85>8A>I@@856@?F21 .*$usu| &"     #*.9ISjnwwwsh^J4     +/<8:43:4:66;CKNVU]VQA# ,>]mucQF;;+%|~  $:Nj{ttde]ZULA7'" )1MQWWVSXYaaXP?*%?K_flw|~voWH/(  &-5:6;/2*$  }vpv{'5EW`nsxvwkbL;  "!/194=<VUssyrle^VF:! '5CPYcjrvytonjodXD# ! ",7:BHHMB=/)! "!% "+98,  (150'"6AVerxoYM5.&"(!( !  !*(('%$  )06<==?;;86-# #$-2465537;BLSVXOB8')#!#$'5ER^[\MB/    ',9AEF9/ **737-+  !3EXbolle`WR?6&  $+8=DHFB>4.   !'$#"+3<>=:7510)  .5BAF?92%"$05;;@BGIKMRQXXTN6  !).3.% #'&$  &*' #,6CDG?90(" $$,/?DUUa_\[ONE?8- ! "$&(+)*)#  "$()-/24453310*(         !#!$!%"%%'%$  !%)*,('"                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom1-Hard.wav000066400000000000000000005404401366722712400226130ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data zJ"-8JRX]:_Ca#de?hjkkjWhkge`b c_WZaXMR^ b0W]H?ZBNd\Ycd.aYGI*?}8ǵbEݰ¤~Jլ+\罞Ȳ@ÿ w;OOaɭ|Fǀо^)׼ 5!L&am䝀ǥh-*0&àؠܔ XxC^hvGk _\p3/#t'0X>IPUZ]bjrrprkeLcb`ZOTPDOPTY@ZYXGVQxI@81+B*0-=IfRTN?-Ia?%'$A -N Y\  > /8 "f$%)'()v& ! Q CESGyU X   $(&/B7<=M<:87&9}<@EL/RRK{@55q.-W/39x?)COEDg>2x# 06 9"1kW|? ^#C-6;+>?@{>x8/$Y jrHW{$[0ԫϵq;ːǟ ƦɉRwߝ7gsa2W$Y3>:ѳܭrϧfJc졌b7="c2ӕ@P@TH/a_ .Ϲrχ."qݩ^O݌,֘Քlި!CQm _a ;!* 39d>?<78.4u362V_UdRNKJELPW!_fjZnSqrrwo.q1jGb\XWY\Pawe$hij3ji%gcR_YT[PMdJ HAEIA<5^.'#!#%'))* *V)('b''&q$[]z!&*,+("v s Ay 6 @h pG 2 ;Vi&%Uso y Y`!~D~u]ܾӃ;Κoў(RRjӹ Є͠%2w`ą]םZ5djhܬlA¶P ަ.`Ϩ]ʹ̸շ[57"8ȻȭϹ~!2BLDE *><;99;;;: :Y:k;<<0:$61+&Y!~  .iH5JUAjC+٢׼)pՑ8׳ؗ@>ՙӡ3%HŅW,2Tյ}sxۤ!ކqJ#ܱE1JԾṶ1)IӴAA׏Բ>7(ǜ;jm¾k)&* f6eʺѻ4~@A%Du5De\kjE 7 ( quS N O$'=*N-/b0/ -)&$#I"{ e: B9_rH3~E "%~)#-03]579:;<<=<;8#62/\.:./1k344566n531U/-"+~)(6('''e'&&g''#(''8&%/&-'x'&%$#" N b!i"h$'&*-.136M9;=>l??=<.<;<>?A@>];!7N1+'#%$E|@. v< Z$=Fjq^,qHU~Ihz\,ك_Ԫr!ɨ{s D{anKΰDZ}CzJw)O+ \3׹ ݦw<ݮ֥F (#δ: IѨαASѐЋΈ̧[@\~ݣJ[|U[y}   W  R ~s,'n`Xq9tn4 h(%YXp!#%&t()!+++>,{,,w./*1B222<3V3320/.,e*O(&%$#""{R3o "%'*-{0V35"78F:;Z=?@BCCfB@?%=;: :9":}::;;*;::87A63b1-* (%q" _Wm *^I a(}5dc%Uz2lvoU ;6;oHg5q~Z: ̼|Ͼ٥F*{eL1\54 Q9,FI:!S P'0fnQEt7e "3%]'()(1(u'''M'k'h'G'^'''(a( )x*,#-,../0w0C/.[-,,+*)((9))4),(& &%[$! (`Z .f} !" $[%%'()*9*5*,*1*P*'*D*h*7*)(&9$!VI`1 I 1UA1qszKQh  I i _wi~#'<6OX^n HQZlq D![o-yFTE44ՑӟЎ_ϪPΓϰѾwѷNӤ҅s?hѥѤ[9`سb~RQoL*\;cߋuۗlXܬIU^M9 F@q#Tg8-6gO/   |  Q<' V rEK W"@$&)V,.w01247j8 9D99}9`87X8p8 87l7676.6T54l4K4 4433~2J21q0.,-4+a)e((']'/'&%g$#?!oLMVl!E$&(*,, -,+%*('%h$ # [(P|g u[S0K/ . a G$"+*Xfb?'9lg=;O H] fsmH1Bm3YlucEAe)a4$7&jz6޾mۃ7ؘ[֬ugFV.dw߂ނT-@H?4o^@=m"!>?2|S4|($ jkh% @ , 2Ao B ;  D(Z d8 I & M3m"a|RRgp8Q"}Nq[Hr0` $qKWmT| e!n"j$"&&T''(,(C(('&%$ $#2"C!: Q|Q^eg-h)W{!J  q d2ON $j,V~f x߳ޟݗܰۚ_ٺط~ݿco9.z->y1۔ڻ*7װ , eٚfݳ`rDIhI6szz\DYct3I\5jP bX5NqtVa1.#`"$\94L 2 J]He3q#9M";8} !"Y#U#"""x"!!!   NFr*- ([w= !"##i$W%&}'(o(n('&$)#U!!SN, d 5bhNEj{ y   B z i R .  - [ >b+"f)O?` ?uj& 5&K<JXXvep0@3?o^L\:3j7 pRixS0 Ajnzy"i\|>qwce`Bp?2VVzrLI0hR j 1 XM?Yez\~6}$:t/srJEIH1QM<~8ޟj݃-ݳ_sܱdݦޜu!dsJ+g9ujxJXW7?`;6b44?g|P?68}alN B?p *  ` c ( ! 4  . ; X K t L dU%`-[Fa%e$< !"#k## $$$$$'%%I&&&K&%L%$$#/#""4"!!!!! ! ETyi') 6SRTLW@ Q X 3"/QZAPh\7(,CtN:Us77pY{|&,4u Qi:n o437Pd} {$ߢVߊݲݕݙC> mYsw&i=0&sk82!Cyk>UW +1bkGp8%{    8 M < 2 # . m ) ysDBw1XaXA>(\W@#Kg%){SX m!!,"w""""g"! ( &|m  T ) q n      B . 7 w #  1 pXMnSrrbM4 wi Nzu*YZx + _ o&IzV߼E޻PD;ܹp܇$ݛaބބtޖߡ+ުafgsubڮګ'ۋ6ݯx m>YlNI~Hb$:&Rd^o)09ty/vb~J+I~ !  dwq.3b|v=  | l  0 ` . G$qhP8-`nn9@    /]wM~9G- $ -g?8Jg7b# c0Urgp^ ; 9  q QjA55tjY8%b`nd}g*Y5!_z 4o6Ks(ME;A"GXߤ[޾ݛh_ۊ)۱XٜFi׆nט9ؾٌؕ#o3JeqBd)4t fH7;|<fZ!Re5Qx</BUv{K<#(V|Z-C{R>)MJ y9?98he($t | k " t * V @ FeFq1.rbYrHVZW 9awjciXC#X4!G,_ sݟdIݪo2ۨ۹g܎ܤ݄ ޵`]( rT59u]T _J#n9B?L ay2dXe2`ha\zJ)js ^x  e  2 < _s/R$#RkY_<PUhY|}R*>c<;}kvi9 r<{Y( TR^-UVprV9> >  ` _Gh\|V;xV]WM7}lC:'lt&/,h3]i fU8`>aC3o}x:A$T& m&Lk if5QOjn%7*~,1? 6:'07-JFb}EBU7 \f/_s1,`b[1QBGG . x$( =Cf Kj(.V Z}^)q|#WbT#ZouY H= c>h$7j;~3`YOAT> O ? T ) 3?e) l1V&h}@8??2m7cK@*!yZ4!Me4},__z1.0zR;c18GFdNim$+<5 &j=A"DtAG|fa*W=T O_e_iA[W| g1^i>S9C5y;/9 L e g O+.&%C"v9.?k&rgwpw;z* A W G  K X H  T aKrun;s%w%PD3p E 9 {KC1fk63 FHv3M{b}p^%E vTj^=i}MH2m)M._oDj*an2XDwe,qfmySNU4dPL(hViu!=J] ?[E5tgH^;+E\.UPp-YVwZIP}2Re>  $ 3 [ an!?!QZ^(dw3T %d|n:C_'/ C[}k^ Y bE8?>Q7'A[Q_S.+}>   F mZDJPVr~S ^nf<{|ThX.jHcL@VCEL" RA2"n\('Z#i_/kT *HvM2 )s&}B gKCCk5a{6K^r+/nGhF<XQPWs/]v)p 2 | M  R p : s?7Q+]>(PxQ5J xq\7c&-j sc'kv$jNHOmgA'6J% T = * W a F l B# 5ReMJIBiC>tD}+hIlA(,55 U~vU=(&K\ vFq{RFdOld^4\IeEp~xvOjOzz(KzoTk79uF/U`C W 8  Y 8J_<RQGsQouywf:cQfwIx+z=p!V=l)_cu~;TT}l_4(a ( ) H D @ U ~L= K/E@s=2'|fz/w tf&_8}C$m{B_XV;]^H9 Yrb; :iBr8)? ce:Sjz $[t M{$7p42({:3-@T|n Lo9>*t"sX?0s:o_}z} # + w 5 d M +S'MDv:z~plVRB1\Y:o O++PmPE3k wtE!++K:uF`q?jQ*o 7 M Pl]Csx'k{ :tM#\[HFp+6R>8YCk+%V`!gDjJ@42 hFEuF|pFc:2fHlx9|.l(] +Fb"hCDe9RN[j0HVI1V+=ot_E.MH8 u  9 J X . { + &v Wtaz-#mCpumxM'Wwo0)-=7) n   " W T Z V J 6   : h } 1 U i L G U U e b m = w * $ x '  x=,9{b=)';XgQ||l4l3` |>;'g/g"sZ_l@jn0kOo;S]'Ve^*]Ka, "289.O+cS!HdB|yyrUM"?Zhv {mk C4Tf}>L;5'Q{.|KEZ gX 6 E  k ( j ,o1y"6K=CCA,4NzAem`drt=<G#@o^/iv9Y',b_ ; 8 9 R ! P `!uC o<<e#\<hsA ZVM kJ-s7*w*p)_OBIzY'YRNR' .Q'_klFy;}hkuvN$>dlp|=rhw~M$=g2jM6j.NP6Gh5}hi}<|   F @ 1AE =t*Xr^6&3Z/IdC6Qoy<V,l+n4y?XTz1M d  < M 8 | > Rp -<hTiR^/4EeE%|n\NNG(Qd!M MGz3 `"J2 0-{\VUUaah[VRYkz9e<+x*k'8MiDlH{e7wElMp}!\%PiXnZ9XSLxqQgzJ<OO]C x3U m  I r y /  ? 3g-(=XxlZC0Ab56ITz^$RKOVHp3B Z  y N ` P . y H & AuJ@4+l)\&}&Ps=Cc9p9~~Z4 c>h)|ypaHPMLB;*2' l _  $ t  p|fD'zWC7jG)\v%qH y;^6G'kH5JA#~/9n 01>WHP h?$  !.9G\i{|86RZZi4H 7m"t/_),b]!Ha7}v%G nj!L N C F C ] p l 8 k9=!mp/s \  =  & J e  >   = y *q6?PnB]s 9\kxyxnFQWYAlMk,}]5& { 2 { 6 R  T 0 %  q # :$%h%>atBEj)MU,kk`n_mo/r- }ePUSXu{oL,&,&=WrO @C9(^2 @xN YEJ6 R3~Kz%Kd/ASezKp9s.o'Y 7`zLirx|w*X=~V w"K   _ , E _ i  # 9 ]  2h 1cs h^T?&roe^M@& p W ; 1 ~ K < '  w ?  O % C L` *u/sE`1}c-vI!`P4$TF@lk.:R*i o4rD g^~lRC0 RsaU<{TsiV@EA--6<7:Zy,?^FG e* sG| -N5t.\{X]Y) L  x  | L ; n 6j 7Vz4\t;d}477?epy~gN8b/ b$]$C N  y E  O  n 4  q I  |`,tT=Rc7b*lR8 #0[{dD6ob@=;% 3Xox,^ tAeIB0~U3k(dPB4$DjN&Y5_ )Cc|(d]gLRQ@*kK4w"-}'nBcG#o.G p  M  e  . i # N U d { y j q } :q6~J7-NBlwkziZ;dcF+j R K n 5 c 8  v 5 W+l4hIAg:QZ8p-U'Ye |Y,tE s^K~`OPD0Ek K pq@ |]HV[grGq0h6Tap} ,IeKfk}/f}?d;Tn~~c]e^[`dn0Ei DxFJJBvN@C47n\ix0bX ^ n 6  J 7e 17GB4-.6@K\]TMEMNMWa}~ 4;DE@=* {kf[J8,09G?. pfP/  ~ ] N 5  x 9  z c : r ; h / >kKU!l v'Do]F8#woZ:yKUT8X Z B f({K&zcO9-06%tCDc@q-o.BY73Hk_5k^*z 7_,\{H+j4|55,~7Ad&+V y%6Kim NV#R V B x , ]  O  N 2 r A L*[}*9<7;;5#wS2)kBO# V L U V k  N!lI/pF`SfFFDoN6+8q +9Km&:Tmw$XA08f6{k}Z  W 1 w  \ = 6\1mY3j!Qx;t%{EZ.L/^-\& ~ I , s K ! U ' g . q $ =+|Gl7tG>3:-~W&`}I O)cB!^<]4Y3_3 jK>01% -ITbYaoM}Hy-2w&{v#j,ZP G{*f|!9Zb|!@g @lCw"i*w!G*DMIe2k " @ T ` i a ` j ~ s i m  , F U b u  7 j  4 k  M !;H[hzp? k 8  G #   } r l f S 5   ~ _ 6  Y  k!}M"}Jg7A\ N]!OL972kqxZ0z-3[%q4dA+pRC=0$fY4gL&se\Z5 !;c+Q LyM%M~M1kXe&}##p&3 {Z%]oXhO[4Z3Pkkhw+S| @n& a  W 8 } * ] 1 r <RUXa_[TI55=EHG?JGE<64@KECQ]VUWj}ndt{~m_G& m 4 a ,  P  v = \ 0  yP/nX3`9# X?(kVE0 u@Dw1f|)l=Ij@4K.ccnkjoxdkbS=Bd}(?Wct0W=|;Hq6p,r3v C~:~WCs.Z MKIR JCs8Y{!Jo . X |  C ] y * e 1 e  I &J}BzCXsrS;zL t: X Y , z i K , p T ,  h I .  g2;L7K E^#|\A3lG ^4V(^5Lo/F`W\\a rK-rO[<S%Q yQ8 !=_ Dl/^,^L $7`Gjx ([Kq]H*1{L4pX"J n45A_ 6Yk-Dh' N  7 a  . `  " & = P i ~ { e i   ( / ; 6 6 ,    ! $ '  o S 5   } r | u j X O *  d = $  f 9  hH"u<|.f1 sBhXJ8 f>eAX#Lx9;|P8w4Fx.GBn5_ XqGtN9rdI1 !=]w0Qe@g ;p/n8~Y;{g,a C K.{e;`r.Gi&J o#q l ) i & [ # C i  , F L N Z _ i i r z "4GVeuy )1=DKFD?@>6$! xcA& y F  p - [  t <  U  u<Z*|hN2]:q-B i4[ ~b5rA^5f>qY<}uU=yU)c7sA d(U+}? oQ<% |tnmtpt.Hl ;Thv$"'$4/<6,).8MNXW_r 3KrJ?yE^@ B$s0\/X?pO<0~gS-cD ; A J | , r #Kj %@Uk  v_J?' |O% b . t J  k & w M  ^ + g(f'Vy7\s ?Pr!i+_HmBkca\K(v^> `8 nB oNyI%xV.[8{riH!yrXQ@F8EDA88n"}Kc,t9@c0Z/m4_5 \*nF$iI*fA!i[NG3{ZGGNUWckgn0@Zz4S?[p/Dn6KVl3Un!Qw*TJL#_5gJ S , o  A z  H w  = m )GWmuZD&  [ 8 f O .  c 1  w V 8  v ` A *  ^7}\; e.Um%\0`z&WW%Te7\#j8~P$j6lAxL-hG#pYA1*9CQUZTVA3')+09BLIMYh9So*Z4[ :q,[Fk5f!Q$ErEp;y@pFD=}:k4\-T~8WCw+ S  T  A ~  K w  ) 0 7 8 E M J 4      z x  q l S 3  u T /  ] * t ' T!e+I[/W8p\7V8_pFpaNp"o3y7k> \4 R0zdJvY9# iN222Rc'6KVj}';Xp}9f3lAV: K J YI|A}6PzBvAWw<gRsIqCh Cq 4^ [ 6 T l    + 9 = D B D Q j }  z i _ S A 3 1 *  z g K <    y M 0     mV-mBS#U{C }-O h p(E|;VxT9}W, O1 f/zJ\'`6 fG+{fYRK@6(vchgk[TG1  4Qf0^H}K,bP'Gt BmJJx1t-jR,w R0v[?z+Ps5Ok#Di1Ro @ k 3 J w  5 [ ~   0 B Q _ s | | ~ l W J : 2 . 2 3 &  w r c V 3  t K  q ?  Y,Z*V-yV<{V92}_C4,&nP.zLeDvLpIN%uA}Le5O#s9H!|V;wR+nYH6){kjhhbJ:)!  3?Qe=[.]=t0fA|7yT9u6w@{3zBV\ [OTWK#;^}!<Rx  8 I m  & M t  D e  + H ^ r  q c Z R M F > .   u e N .  f ?  } D  }Ii/Yl<a(w@m> d6b9' fD'{^6i?^!X!d&zJdG tT7s_B%xphO<%ysrr &.3G`} ,>\z6c7i3qJ{TAr.T=w&R}I|)cEyQ JS3r @n9l < d  A _  9 B T ] p ~    $ % * & 0 0 : : : 4 0 / * - "   | b ? )  o G ! u M * k=p9k-d:]1lF"[-^1uBzL~`6sS)w]9dL^&yG{B]-[,sU0|u}znrimqvzzv|wzzrohZTKD4(&" +?VzEjAr+Z#P D ;c1k;x.o/oT<BS+t:|#Q<\z4Qy7Qm G q  = \  < d | ! : J a p t r r e j _ X P A 0 "  q [ F ,   g [ I : / !   q s a [ N 6 ,   {tcS9GtFUOq?c;oP4|fQ='sZ?1qN$iA"^7 mI2pI"kM/kIwO){M"wF|W:yqnjc\Y\dj}+DXi~(Iau-Na !>_{=_{.[G)SR@}H~N}2y<n5r1}D<u8} L6m 5 j  7 S q     $  #   # . 7 B Z n  3 I ^ s  ~ b >  u H  C  p <  l4vD#kJ%kG"Z._(Qp=D]'U%`'}R!bG2|^> cC,yQ>)hSI5+vj[O3,$'&  # ,-7=H\p5Ie#>Ri>n#Fb&A[z8N{&Qn%Kw%K~=bM#N+m kV9oQ Ao 1 \  0 E W g y  ) 4 C F C @ > F > ? < D ? 7 * ( " $ ! & ' &    t b [ L M P M E 5 $    r W 8 ! oE{Gj.^'l,a.Vb4 oAvI`,[c)e?c-wF"Z4pM,kK;% s`OC6!vva[GA7$  -7IPZdr}(C]n9]~ *Jt)R|?y$Z3v+kT:m4e.b 7d5l!U?u5cMv +Wt "3HVer  " , < K i z  % 3 > C H K V _ g u r { | { j O E *  e S 9 #  fR/~gYIC<4#jUG3tN*lH]&{:J`'T`8 }_< }R7Z>% mBgD!b>mP7& |^G*|kQ8(|kcTQJHPQ^ex~.9Kc5PwEfBn 4_.[*R} @'`0a)fR!Pz@|,Q6XyHrFn'W{&` @ d  - N e                 r j V C 0 *   y X <   hApF|J'[$xKdDf@&xP\)|QR%Zb%k6h;tA\Am[CA34$ {mha\XZRUMG:+''DZ}4Ty&Iw=f 4Y2j8]?]#Lj,Z0UqIpIt0\BrCf.Df%>Oaw.Fdx & = R d }     & 1 > J S T U R M F D = 6 -   } p ] G 0  zhYP?6ve[E<$oN$[:{JV3 W#UwU+{EwNr:Rg/}? c7T"g<v[5tZ<"tnWC)7Gf/C[r)=Vh,>Ts8bDrVY1w@_8?r#Z/\>^|@b{7Vy'Nn&Tw:h  8 U i  w l a X H : . !      |ohSJ/$ nT<#w]N1{^H7!shP@*r`L=#xU- kE}V'zT/uU0 oN'vP. \.\/ ^7 mC t]I'}vzfU:+${l^MC:0) ! &4@PWhs (Eh%V{;d/Jm">a}&LtFu @yWL Z#gN$l,pW$YHk2FYfx  . = N Z g n |   ! 4 B Q g v { s i [ Q @ 0 $    q a @ *  qU=e9pIV,V(lKX1mGsV1uE&wM%zId6wAhBoK'wZ9"lVJ7.~xm^QF@74*&#  ',CN[ho|&5AYl 5Ods-;L`y$:Vq +Rz=j@iLt$O~#Kp1]&P(T:c$Hm'Gr %ATi)/6@IPZcmy{   , 7 @ P \ e y } q Z N : ,    xeS<+! gXE6!tZH/}_;g?R}MY(i=d8{Y0y^<~R*wV$sHPX*xK!}eI9!~mh^SPHGAA;A694587>70+$!##&'69KNY_pw0Lm#Gt+ZAi5[|$;^u.RqBm'Y0iOF5wK'\7c&Ih#Gg$B^ + E Y o ~ u e [ H 3 $  }qpi`M<' }yfZE9+qW@' jD)fJ9#^A( hQ=,x[A {^6tN${W/ dG[1w`?#fG%hI,uR6aD( taOA3+  %'125=?NXgp~ $4KXn/Lg 'Fe3]},Xv4\>b :XHj 5]?h#V!WJv6_GwAe5Vi & > W m   ! % ' - . 1 . 3 - , % " $        z n ^ L F 0 !   }bO2tU;^;h?`7oD r<k/`,W'W"`3Z&uR0 mO5rZA,vbR<5$ o_TI;/-;N]r/Gb{ (=^p 'G^1Ml} -B_v )Ec0Pr ? E G H H J G E C ; ; 7 1 0 ' '     sdL8! uWI+~hYF0r`K4" jN.|Z2mApDT#f3wN|W%oL5oL,yV5bAwT, iC+eP5 zwtoii`f`fgkpourtx'>Nar;]7fJx3fHt'[ .Rz@m 3_2`5U5c9a 5Z8Y{8Sj <Sm.GYq  / F T f t ~ } t c X B 4  jS=!p\J8% n^F7 vZ?"jQ6qN8dO4sYE+bE#uQ. g;X-tJxW3 wR5oSI1)nbVD=&" yiZL=2( $*4AK[kw!/IYl6Og'=f|;_|$AZ{7Zy-Or1OmA_"Hr"R} 0dJy)W+Mt:Sp3Oev  / 9 Y ` |       % , 6 8 > ; : 5 0 ( !  r \ B 0   sZ;%`H( wU<wR- b:g@wX*i?X0sM)^/ Y/gBd?nF#pP( dB) t_L;.  ')6;IQ_lw $6>MZm";Ohy;Wy3Ot ZH"a?fC%aA(`=wN,qG#~R-_2 g@mN/w]A) cL,a;y\B(nZK@7+$-5FRct';Pl)COky#1EWq.Fi1Sy?lAeL|.Y 5dGu@kJp9\8T~:Vo $+BM]ky$,;DQcp   " , 3 @ I M P W X Y \ W [ Q P M A @ ' $   {W@{\?Y8 {Z2xK$rV-kN, jP,z\D$ |bJ6$lWA,qX># qN6tQ1w`K3u\I5uj]SD9.% tmd\\TROJLKJKKLQU_hn)AWl2Lt8Vz%@d9Pn1Qj &Kl.Tz,RzGo(Mu#HiDg 'DYp:Qk*5LZkx $5>JU^kt}    {jY?& jN) sS, kI#sN)_7zV,rO(wS'kM(yZ3aA|]@zT4oK1hG%yZ3v]D*qh`UKB@AEMUY_ev|1E[l,Jb{ '7Ocy.D]q !7Rj5Yz;Tr%Ed /Ih%=[w3Z|5Yw,Pm!Df9Lk1BXh| &0I[l}*2<ENWZb]a]cbe[\NOIJD>:-.  |oe_RG8( ybQ>-x`G* aEd=fLe>xZ; dN1eK/qX=mR6~fL/qV?%|dL1pU<%fU@7( '9J^j1Rj +Ba}0Nn1Mn9Z{:] 8V~In@n<eFp=lJp:e:Zx%ATj})2;HJPV[fnoxv|tlc^UZOQBA1- m^L8+ ~bJ1rW="nK+ dM.X=hL0zZ=!iO6nS5aM0jF,jQ<$taL=, yiXI6$xl_RG7+ 0A\t)D`z#:[p0Qr4Pk=^+Gp8\1Zu?a}=[,Ha},E[x'@Vn*>Vi1C\g} !#%)).22:3:38361-%xeP<+y`F, oX<%sS7uL+~[/ tN%b7yW/ ~[5fO* nX6nQ; p]G4 lYE7"xfWG:+# '6?K_e| /AXj$Ab:]6` 7[6`7X}A_&Ij8Z8c"Gn7Uy ,B[w#3:HM[bmt}saXE7*oYH3eR7vaJ0}kT=%iP8|cC)jO9rY?$ kM5rO1eI/ dK2tdM5! thQB+ {n`TE6$zzeaXKHB@?BBFDGKSZho2Lg-Gh+Kk?e:])W%Px!Jw/X%P|Eg8\q2M`z/>Yg'@Nbu3DZi!*1:::@DKLOLOFIA<6.+#ueNA1$jU<&lL1`J'~dE%gE%{fB'}^D!eL)_A' tZE&sS: oZD.nZF1pgRO>9'$ %+-9?IU^om/I^{ FhGk6i( vYF,t_N=-!uh[ID7.(  !-M^iu '3?MYbjs|yneTPD9-~gT?(r[?(p\J.|fE-w[=$oR9iK)rQ4~_H% qP6|bE*qWA#}iP<'|fV?2 }li_bZ[UVRQOLLIKISN]\kmw'7FScv*>Rm{.La 'AYw@_%Ol4RwFg"Mr&Pp(Eg%Ii6Pl,AYk}+-=<JFTSXY[_cimqrssw|~~vrqke_YRQFF=3& w^J4vV='hJ(sYC*fE+`K*jR8hN0iN1gE' sU9vXC&iT<)p]QC<2'  *6?HW]nv%4H]w5Nk ,Ii4[zDi.T}:b;` 4V!?e:^}1Hc|!0>LVbqxwvoiba[XVNSHF@<61-'!zo`TB5$r]B& rN8fB$uP/ oJ%Z8eD iN/vV8gJ-fK+ pX?,xsfbWTKIA9;3;8=BFKLRT[\eejntv{| -9K\l*;Wk #3K\u.AZo%=Zq!;_#Ie)Km7Yi %>Zq+DVo 6H[w'8Pc|(=L^o{#&(,+..67;=<@>>?790.+%%"rgWG8'xhQ?% cG1rP6cH$ lC!x[9{W5dK"~\?mV9v_H0lXG0 ncUC4#}wpfbVNF><51-++0.00/47>CGRWcmz$7G[k %;Vk0Me&Eg ,Tt Ef /Mr9\~@e 3Pr0Mm,Gb|':Rhy +6=AHMTZbdoqyz~xrkge]XNL@;-#shZMB2${qaXJC5) {i[I;,v]H2{cG.vZD'z]=uX-yT1}Z2rO5bN,hS?(sn^WNC@47)-%! %(-59DIV]ku *ANcq&FZz/Db|0Pm *Pj5V{Ae4Zu7_z:Tt,A`r %<Uh1B]p%:MZiw   |phTN<9% }f]H:'o]J9*yiRB1!wbI.x_A'rW1eB#pS) eA!}bF$ tTC#zeS@+ |ldSN>:0+$  %*29EIU[iq%3CVbw 4F[m (=Zt 7Xv -Lo#F_ A`8Vs!:Sm3Kdw 1H]k2?Wey%:DQ]gr|rdRE3' |iZB6 jUB1tZL1!zaN5oS=$rW?!pM2 fF!}S5`7oK+v]>% tfK>( ~u|r|z &/Ll !7Kat%2BP^lw '/@@QT`dkqyqjbSI8,yiTB/ s`N9$m_J3% ~oWJ4$ r]G1vZF'|ZE+hP3{eE.xZE)p\G3 o]H5! yrmmfe_`[YXYZZZXX\\cdgnjuu{(2:FRXjq +?Ner !=Up` (Kj9Vo"7Rj}'@Xn 0J^r ,9JTdk}}ui]SB9% p^J4! qWA+sX>" kM1rV?! oRA&{nOA"{dL: mV?&~kL=wbJ4fR8#|oXJ7*vqlfaYWQNHHCE??=:<9>;BGGNQU_ahqu ):MZn-;Vd})BUo-=^n2Lcw .tlZVD=1)"&=E[hz+<\f,Pb7Si%>[u&D[z1Ef};So$9Rl+C[o:Kdy>Ngy /FVjw(38>DINRRTTPPLIHA@82'! l^J9&u`L4!uWG,nR= hM5hK, jK) b<sN3lS5qZD/xcU:-{gYK=-!vrjecY\RXOWNUUW][ddknw{ '7DUcs,APk|0G]s)HYw1L_u 2GZm+>Qdx0>Qas'6KVox"3J[o0BUl~ 1BPfq"++74?:EBFLINKLKKJIEB>83-'#yeVH4&s^N7'vcI: {^N3{gL8oQ8lL2w^= qR7{cJ4rcL=* we[GF5, {vpmdc^XYPWQXQYT[X`\edioqy#3FVi|+@Zn;Rm1Qi9[w2Po*Pk(Ed5Ro6Oi3H^s /9LYiv %14@>NL[Vc_jgnoosroqmlhhd`[TMF>1. }vbUB2$m]L9- phQC0|dZ=.x`H8 jQ9 v_J2p]E-yeL:"o[J4"yldXLE60#wuii[[OMBD68.+*#!$(-59EFSVaks(8Mbu)B\t5Sl6Vn3Mg.I]t/HZp"6I^p 4FXn},>Qds%7HUit%28GN[^ilrz}{slf\UL?7,!p`M:'oTD+zbH1hK5wV=lR3w]<}aA"xW@ qXE+}kYG9#{rd]PG?3-!  !*-5;@GOV^go|$8H[k "?Wv9Su .Oi%>e3Uk(G\{-;T`{ *;HVas '.@FR_fu-1=EPU`emuv|ypg_VLE</+rfYM@7# yn^SE9)zlWK8&v`R9*qXH/fP5 vcD/dJ0qX?& udLA*ve\J>." y}nthiheiehhhkknuy08R[s0>`p0He9Yz3Uu9]y;_{8Zv %C`} #?Wq)ASj #-AO]oy  "&*1/:6>?BHCMELDKAF>?;52-'qbQE3%weO;(rXI-"zfO@%x]O5"~ePA"uaK3pYH0r\O='{m\P?2&vqe_ZML?=3/'# !-/:BHPY`hpx !)?I`k2I`|?X{.Rn 'Kg=[w,H\t&<Lar!8DZjy'1DPbjy  ymeZOA9*# tkZI>) u\Q5( ~fU<$}kR9$hQ3xbC+oT7iU9% oTE(vfZF9'|xfdVQD@7-)  %*2:BLU_kx!7G\o.F\q7Mg6Kg~5Nf~0Fbz#DWv #?Vp%;Qe~"7?Vbpzmh]RJ?6-nhTM9.~i`G=&}lSA'lX?(jS<$~mM> sTG-|iXI6&uh\LA3*uujhaaYYUOKDG??=;<9;9=;?=CCFLLVT__glt{ #1@S^q1DXm'EZw.Kd *Fa}*Dd|"9Wp0Mh #>Wr">Wl);Ue} %+<ARTcakntuvtuqnlb`VSGC94* zl`UD;*rfYNA6# yhVH3%vdH4 y^G(xaA. ycJ4{bN8"weVB4"{me[OG73" znd]NM:8(' (-8=ERWfm{!5BUdy'-&vpXP:.|l\N>1#waVD7$u`L7  eT9& yfH4iP7 x_K4 qcI:%raWJ;4  #+6@MUbmz/>P\l~(=P`t1DWk| 2G\m$0FRcw 0AO`q|#6FWi|->Rfv'2FRal} "$,057=?AFDGKEIEEF@D:>8830)# |tf]OG:/% ~l`N?3gW<-iT;*kQ>%mU>)~mN? iZ@-kZG8#vdWN;/! ~}ytunvoroqstsww~ #.8JNel~'6HXh|)8U`{9Lf|+BWo 8Iau$?Sf&8N^t;@Xgt (2@MXen{   }le[LH8/"}pfYLC3+yn_QC4' xhTE1!xgQ?%zcN7&t^I5 ~qXK5#}s\R>.! yi`MH4-~}}~|{~| #0>LVis.>Tbz";Ias2J\v "7Me|*ATn(=Mcr 1?Seu &;EWdu!)7GJ\`ps""'',+0-5055362711-*)!  ~rhUN=1!}hUD/ x_H5 iP: {]J-w`J4q\K4% mXJ8' sbXC9,uk^UK?;+( "(5;NQem~ .>P]o+@Pdv)8N_o/>Sfy2C[k'9Pbv(=Nfv  .BSdu,8DV]kv    }ri\TE=2&odPE1"t^L<&wcQ>-~jXE3qcL=+wbQ?- xfWG3'laL@1!}ze\PC9+ ~xzswwsyy~#0BPaq(?Se!8L`x-?Sg}'8L\q(<O^r%9I\o(:M_q *@N`t'1>FRZejx{}{lgZRJ=5(thYG;%|jUB. {dP:'vbI5 eX>0seTA2w`[C<) wm`QG9- xohaXTLIB>952/+(&#! ##(,.64>AFMSWcdru (5AS`r!:Icq-8Uc{ 3F\r$8K]u'7Mau 2CWn 3CYl~$7ETbn~    ~tofZWHE71%|odRK8+vgQC*w`K5# wbL4!xfO@+qfSA5qgZNE8.# }rk[WI@7)$qna\TMEB97/,'! # )+18@BOT\dmw *6IWfv .BScx -FPjt 2IVr~'>Qh}"=Ncy+BPgt&3BSam #-9CKZ_lspjaUNA8/lbTC9$nbLA+ rbH:! vbJ7 o`B2y_T;'yiXI;,xk]WH?4)  }uvnojgcd`_^\\Z[[[\[]\`_cfgmotu~).=JUbs{ *=L^l&>J`p(;J`m!3GVjz$>Gal!8D\j| !/COdr $/:HQ[ho{}xssiha[UNHB87(( odVC<$ xjSF-"taL=%zfQA(}qZK5%nWH7%tbUE8' slYXCA1* |yurnniifdbd^d\c\c_bbdhimosvz}&1Udx +:LUms$17BJV[got{wjeZTHA1+xgUF3"q[D4 jW?(lWB,o^J4&xl[N<3!peSL92" ymbWJB50   ),6;EJU_ht|!*;KVlt4BXh| !4G\o-@Ti|/<Xa~+ALbk  *3<ERRddut~yuphd^XRIC;1+   tl\QB5) n^O?/{hWG3 ~gWD-# xgS?/ yiWI4* ukYP<4 {nm_\UMK@@:63-,))&&(&,+/039;CDOPZbjs}*9BX^p{".BJ`hz +Mcp(EPoz.>Vj$6K[n-;IWcqz  "$))0/253;4<7<9=9<<9<67511**)!!|tk\XI@2' pdQE2$yjXG5!n[K3&y]N7&q_N7*yiXH7' zj_TB@.(zuxuursnrmqsuuvx}~ $->DS`l{!+CMep%=I_p /AVg} .FSiy4?R`p %6?NVcn{   #).26;<CDFKLNSPUUXYZZ\X[[[Z]\]\\][\[[\[Y\XYWWSTPMPJLHGHFBE=A9<77622+,))#$!  {ogZSE<.! p`UA4$r`S<1mdLA, xgXE5&}jYK7+uhVP?5(||wyquospsruuyu~y "':AR[nx0@Qbr)>Pdw':Ndv.CUj  6H_p !0EUmw/;OXjv"*1=AJOV[^gdpmsxs{t{vzuyssrjlbbZSRGD:7,'{nfWL?3% }o_VB<(zn`QE6( yl_SF9+we\LC1) vkZTA;("}wibUP@?/( yqkb^RTGIB:>07)-%# "!++36G^i} 1BRgr #*?MXos )5BPZjq).:BLT`doy    vneYTD@0'rjVN<. n`L<(o_I8#xeS>. n[J5$m\M7){lbSI91! "/6@KU_lv-:KXkt ->N`p(6LZp )>M\rz )3GPcn| &1:GN]cqv ##-/59;CAJJLSRV]\`acefjinlrprrrruntosrotnrlnkied`^]TTNLFC;62+&  sm\VH@5-  xpbZLD9+&yncZME81  rfYI<." xm[M=-!}tbXF9,xpb\QHA7/&   '07BHWZjq~#3?P]p|!1FUgz)@Mdp&?Lbr 0BVey$6ETeu #3;LUdoz  $,/6:=GDPJURWVZX[X\VZRTMNGH>?32)' }qbYF;.}i^J=- s`P?/yjWI8, ue\IB0,}nfWI@/% ymeSP>7* ~xslid`_ZWURPNNMOKPMTPVTZZ`bgkntx| '/4@BMU]gl{ -4>FR]eqw &,?DT]iy )8EQbk~)9AU`nz '4=OWfs~ '/;ANU`gqz       |ug_TJ=3'n_N>,z`S<)zjUA/tdR?. v_Q?-! qhRI7+{ogWREA4,"  !,.??QRahp{*;DT^ov"1@N`l}08720,-')$)),043869<.o^M;(~nZK9+ xn_PB6&{rjeWRF>9/'% (/3>@NU]jp~)74,#|rbXH=/!zi\J?+ ~n]Q=2znZN=. we\PD8)!xuqmhgac]`[Z]Y]W]Z[[^]bafdjkoruy~)/9DM[`ru.7HWdu2=Pap"6DUex"5DSgp-4GP`kx %)13:=@IJTR[X_]dbfeihlkmmlqltlrkqjlehdcb[\USPIGB;6/)#pkYTB<.%qj]QG;0'~rh\VE@1& vm`WKA5,! ~tk`YLD64# ~urlf_XTMKBB<75/,'$  $-/8?HLW^eqy*8FVeu&8H^k1CTew&7D[b{ )4ANYep~ '+37=AFLLVT]\cdflkqltovvuwvuzqxrtppmjhfd``\ZXTNLJAB:63,)$ yufcSN@5+sdTH7*zj^KA/(ui^LD1' tg^NF8.  rjcUPF>7,(  %#//::FIPV[bkpz "08EQ\jr (4BN\mx (7GReq&3@MXhp"*6>IRXfjx~  "$&*+/21568898=9;7:7:344./*&$! ~wng^VME;5($~vf`NG8." |jdMI4* }pbVH<.# |og]PF=/)sqb^RJB94*# ,1?GRYdow)-BEX`k},6KRgn"8?X[w|"6CR`k~ 0:FQ]hr{"'*1088=;A@ECGEIDICECAC=@::732+*#! ~wnf^XLF<5+#|mhXRD?1&yndWMB9."vjbTI>2%zleUMA7-$}uoe`XPJC=6/'$"$/2;@GPXago{~ %19IP_ks #2=JYcq (4BO]iw"6?O[hw)2?KUbiw !$((//2647:;<>=>?>@=>;:936/0**$!{|kh^VNF;5*! xkeTL:5! umZO?0$uiZK>."uk[UE>3* uqje_ZRPLCE985.-&'! '',02<>GIUW]cgowz%37DMWbkw'0?HWapy *;GTblz !.9GSaj| -5>HQ[gny  %&%"    ~wnh]UNB>1-vgaPJ:1'zmaUF;-$|jbOF8,vj]QD9-wmg[WIE;4,%  */;BNUaiu|+9FUaq$/CM^ky-9FR_kt-,><KNX`emt|%+37CGOV]clox|ztje^VOG@:1)$ }pe_QH>.)xm`VF>+( {saZJB2(ri^RK;9#%~vnh`XTIF>62+"  '*37BFUSgfuz)4>JV_pr(1?KXft}(1ALZfs(4BLXely !)2?BRX_mo}    |wkf\SIA5-"ymf^OI;3){qh[TIA5+"wmaTL>5'{wg`QJ>5+ xqidYVNHD<75,.$#  #$*+24:@BKOW_cno|~%);>NUbmv%5GP\ep| (07BGRWahqw}nna[SHD61%tkZQ@7' uk[O@1%ufXO<5" rf\ME6-to`[OF@4/%  !"-2DMW^jmy %).28;CBMMSV\\fbljprww|{xomfb\VOHB:4,% xoc]MJ<3) {sh[SD>0(xmeVM@7,! xlbYMD;.' yqibZTLG@71+$')26@FPVbfvv  .7FR^kw &4FNgl!.=N[kz 0>GXdp ".5@IR^bqtwukf_XTKE>60(  vh`TG?1*uj]QD7-  vpb\OI<3+ yqk]YMJ<6+& ~yuolhec_^[YXVSUPPQPLTKXPVQVTXYXa[h`iipquz| (+6;BJOY_gpv !+3=GRYeou  ,6>MQait '(;AOWcj|} $*3=DNTYchpw}yrgaSP@<.&riZL?/$r`UA5$oeTI9-~skZVDC2,"ywnjb_WUPHH7+% ~ztqjg`\XPPHG@=;57/0)*%%!&# $%'+./38:=CELQU[_hitw&4?GT_iy $2=MWit '0AOZjv")?FWbp&2:IN]fm}}   woi^YMH<6)#zua]LC3.{rbYI>1# {naWL>5(tpd_SND>61'#  #--46>>JLRW^gjrv $'49DMT]ir{ -3AKUbjz'/;GQ^esz "-5<IMXZfitx|yoje[VKH=8)* qh\QF7.! yq`SI9/{n`SF5,vj^PG42 |rldZXLJ?>33)'"    #'(0/;9AFIRUYcflsv#+6@IU`gw|.:HTbp} *=HTen~,5?OVbnv#*/7:AELSS^\dclkopsuyy{{~|{}v~uyvrroklffd``Z\TUONIFD@>9:04*+'!  {xshg[XOGA76(&|qhaUN@:,'}rg]TIC6.$ zqk_]MN>=3,%}z}w{twusvrstququsrutvyv~y|{#&37GHY\ks}*5DT]ox (9FXbw/:JVcq~ -2>GP\ans~  !  vk_WLB8-" vf`LC7'sl]QB9(!wg^SH<3$ ~rkg[YMH>:1,$  $*/8;FISV`cmq| .3@ESWdlu "+5<JRZenw &+39CGQX^iiwx"%,03:=DFMJSS]Ycahkmrvu}wz}vtnnhe`YZQNGC=62+%xldXPC9/" {ldXLA4(|vc]ID1(~obYGE-+}yjiXXKG@72,$# %&02:AFNR[^jow#3;HO^gt~ #-8FR]kv "1;JScj| .7DO\fo|$-0:>CKNVW__gfnntwx}~zxztvpnmhfd`\ZTQNFE==35)+  ysic\QOB?3.%~vqj_]NP@A40) wsl_^PNC=3+& ~tne^UNG@73(%~{}w{wyyx|xz}{~ "-2KN\\ikuzytqhf\ZPLC>50$"pfXNE5+riZPC6( |se^OD<.(~}og_TNC=5-$ {~svlnicg`b\_[^Z^W\\]Y_^`bceiiqovw~ $,4;BKQ\bms|#)2ECHHJKJLMONRNVNVNONNIMEFDD=>865-1&,"  ~xmi_XQGC6/& zqhZOF8/$ykcVLA5+sm^YJC7-% |vqib^VRKEB:91/-&% $'.-67?DHQT\`gnu|%37JN_es| #9>PZiu"-=JXdr'5?IS`ht "%00:;?EINSUZ]adfhmlnqpvpzs{ww|w{zw{uxuuqqnnkifdb^[ZSQMGG=>35+'! }tng]XQGB74(% {tmj^ZQKF?61($ |rme\YLI@71*# {okc]VLJ@:6)+ &/2>BMR^bmw| )/>BRXbmt ",8>HSZemu./?CMX]hox &)13==EJNS[\`ffopvy|}ysngd^XSJH<;/+" ythZXF>4$  yjdQM;7&sg_NJ90%~lk[XKF:7+&  ##.16ACOR[`hpw"/5@IS]gqz (1<BPT`grx  #'05?BKNY[eepsy   #%#')(,&.&/%.%,%+%(%$#$!  }tphdXVLFB62)  ule[RM@91& ytdbSOA:.# xog^RM>FPZcly".2@CPW_hox}  ($3/;=AILOVV``fgmoqwv|{|~~yyvorigc^ZWOMG@=8., sob[QGA4-wlbWJC6*! vhaRLA3- ~rlb[UID>50'#   "+01;:FFNPW_binr}{  %24AHOY_jn}!,5=ISZilz")19?IMW\dhrv}               {wokb\WNIA93+$ }oj\UIA6,#wobZLC;/&wwjd]TNGA95-'$  $!-/79DCPQY^fkqy '-DPWalt'/9@GPX_hmv  "#),.43:8=?=BBEFGHIJLJNIOKMKIIJCI@F=B;;642/(*"% {oh`TPA=1) yrebOO;:*" |wihYTJF:6,$  vsih`\ZPQIIB=;62.)%%   #&%+*/169=@GFMPTX^_hjpuz#+3>GMZbiu|!-1@EQYbku}  !-1<?HPT``nm{| $!'&-(1*4-5252616515/5-2,.*+%("#  xuji\\NNB=5.&zmeZQHA0,ulaVM>9)%upfaYTMFA85-*   $$+.57@BKMUV_bjps| &+4BNO^_lky|  !%%()-+0-1001/2-3*0,,,)(&#"   |yqheZYMMB;6-' ~qmbWPD>1-vndYPF=3*"ztndaVUKHA941*%!   &*.59;DFOO\\iivw *.=DNYblv~ *0>CPXcjv| #(18?GMV\ainwz     z}qrhf`WVJHA:7/)% zuieYTLD:5(%ypg_WNG<5*# {znodb[VRJGA=95-/%&   $%,067@DJNVXbdns{ "-7?HSXgmz".7>LO^cny!%45@HLX[dlq{  !!%#)%*)+-).+*,)(($&$"  ~qpf`ZQKE?50&  upe\UKE94(%}tmc[RIC83&"ytoicbZVUIOCC?::640.&'%!      "#$)'--0567?>DGGOMVR^Zcckluu} $)4;DKT]cou}#,3@DQX`kq{ -/<>JMX^dnq  #%!$"##"!!     }womb`XQMFA96*+ztjfZZJI<7/' |whgVVDF43* }toga[SOFA>25(+  $(06=@JNX]fnt| &1;DNXamt !%39DOUcht}$,18=EFPSZ\ciivq~|uvjka`XUPGE>67))  |tpf_XPIB83(# ~rnc\VKH=62%! zztonfg`^ZTSNKGE?>::44.-+&+&     !&),50<:CEJNVY^fjsv %.8CLU^eqw +/>DPZcnu %*5:FKT_cou{ ""%*,//4486<7>8=:<9;57524-/'*$# |qne_XOJ?:1(#~rndZUIE93+# yvjh_YULJB>45&+ y|rrmihaa[[UTONKHCF=@97721--)-%*$'$% %# !# %$'%*)-//456<;@DFKOQVZ_ehnrw $+68CHOY^gmt} &)65DCQSZbjow&,/8<CKMXXafkst}}|qofcXWMHC;40'" }pkaXQF?3-  wpe^SLC82' |qpdaZSPIC>75-+!   #'2/>=HMU]_koz| !&46DLSbbsu (07AFRWbhqw"&02=?FLQ[\hhrt{|{vrmkd_^SVKKBB:91-*"|wkl_\SOEA93+( {xombbXUJI@>42)*! {{ssmnhhbb`[ZWRUKQILDJBD=D;?:;<6:584836557548396::<G@GFFIINKOQUVW]\dcfklquw #*17>EISWaeor|~  &&/17;BBLLTX[afgpnyz~%%1-7;>DEKPTW_]ffnntu{}~xxopgh]_VVOIC>72.%$  }qoaYQG?7.$ zrgeWSI@:0)% trlh`^VTOKGC==540-('$    !''0.85A@HJQU[`gltz #/6BJU]eqx '2;BNS]fkvy "**57>BHKST\^eilqtz|~~|xxrrmige^_YUQOKGE@?773-/%'   yyqlhb\[SOKE@94-(" |xqjf`XVLJC>:31('{zyrvonljkeibf_b`^`YaY^[Z\[Z^Y`[b^ccegimmssyy~()35>BJNT[_ikrw|+,8<FLS[`iow%)07<DHOW\`glrw|{wplf_[SNFB:5-( ~qna[SIB60&wph^XPHC:3,$ yytspnjkefe`b`^\]W]W[YY[Y\\Y`Z`^_aaebgekjomrrvuw}} ),47>AJMUX_ejrt !!(.29<BGMQW[`gfrsw~ '")+,00649:;@>BADFEJELHLKLMNNNOMRMSKTKRPORQOTPUPSPSNRNPLOLLLMMLLKMHKEKDFEACA?@=<8946100+-&)"!  xqmb_VPL?=2,&yyli_ZRLD>61($ {zrnifa]YUQLKGBC==88533/0,-+*+*),(-*-.-12377<:AAEGLLVS]]dfmqs}| ",,<;IOV_enw} (-9<JLX]im{| %%009;DDMNWV^`gfonts{y~~}yxtqolhfc\_VXROKJAE:>56..)$# |yrkhc[XRKI>?4/+#zvqliaaXWQLJE@@975-.&%    #&*+2188@>GHJSO\Z`chkqr{} &/6;GJT[blpy  $).68BCMOWW_agiqqx{||xutomhdc]ZWPML@F6:/-(!  ~qqacTQGA92($ zrmg_[QLG>:2.&" zx|xzw|wzwzxyzy{z|~}  $./8=BIMTY^cjou|~  (*47>BHMRW\cgmqw{    # !#""%#$'!+!($&&$("*#('&)$*%,%,&(()(()'('&)$)$(&%&$"!"  }{qmf_\SNGB:6-+yxmje\[RNHB?74++#! ~}~"),38=CJOV\ainv|#)38?FMT\ajox} !+,79?CINTV\_fgnpuv||~}vyqsjkgc`^XTQMIF??650*) ! wunfb[VPGE:80,'zxvpoleh_`\WWRRKMEG@@>:8712*.''#!   "%)*2098?AEJKRSY]adjlsr|{ !*+18;BHMQY[dhltw%%*./77<@@GFKLPQUXY][c_gcihhlknmppqprqrspspqrppnmlkjghddb_^\ZVVOQKJGCA<:34,)%" yplc_UPF@:0,$ uwii]]ROGD;81*)  !(+058=BFLOR[\bejotx~ *'23:?AIITS]^finuv   !!$$$)%,&-).-0-0000020305041231/0//-.+,)+'(#&!!   }vtmmccZWSKLC=;41-%% z|qrjfc\ZTRNHG??57.-(#!%&./7;@EKOUZ_emou| &+39?GOT\bjpw}  #&*/077<>ADHJMORRVWY[\_]b^gbefchhejelejgjhghghgbf`b_^\\XXVSUPNLJFG>A:;531*+#"  }tsjga[UQHG><41*'  |zsrkjba[YTQOHF@B:77.0()""   "#+*147:=BFINPUX\aajgssv|}#)'017;>CGLQRZZ`egmmuxy   !%'),-.3073:5<;>>AADCGCHDGFHGIIHKGIGGGFECCC@??9=4711++&$ xtlgbZTMJ?A15&'}xrphfa\WSOJH?A862+-#%  ('01:9CCKPSZ\dglru{ &,.9:BELPXX`einty|   ! $ """%"%"%##$!#"" "!  }ywsmlfc_[YTQPHGB=>36-.&$ |ysomcd\WUOJHA=952-'&  &%-/48;@DIMRUY^ehmpxz$(-47?DHOUX`cjoux  ! &#)'-,.1061748:8::;<<<?;A>?>>>@=><=9=89765321.+,%' !  xznneb\WQMFA=62.'"|zrtjkcb^YXQQMKDD??8812++%%    %"+*.238:@AGHLPSWZ_afgnnwv~  #+.298DAKLUU]_eimrvy        |xtpkicb[YSQJJBA9:10*&#zwqnifa^[UVLNFEA:<521)*$#   $)+148;BDJNPXZ_efnqv{ $),26:?DGOOXY_dhkqtz}       {xsqkjdc\[URPKJC@<65./%)wxopiha`[XTOOIFC>>7710+,%%!!   #"''+,/1588?>AEEIKNSTYZ_afgmprxx~ "$+.2:;CEMNSW]^egkst|{             {{rrmig_]YUPLIC@;931+'"!|}vtqmjgd`]YWSRMLHFBA<=76501-*)'&!"    $!'''.+01396=<@DFIMOTT[[acflmtv|| $1-55699?FMUWchrq}"&! wqb^SQNPQRVX]`_ab[QLA<1(# &*/22+"sgUC3# ##  #    !%&)*---*,()''*19DISU_^d_`ZXPJB62.26BGTZelsvwsvsrjhehjt{!+04;>>A:?:=BAGFHJMNTR\_cfgdjktx }wrnlkmoornhh_^WSMHB?:723354/,$  ~todc[Y\Zcekrqrlka\RKJCB?@ADGMPUVURMD:0'"$&+,312-(!    %(*0,1.203/30388BDLOQVVYY``jholprv|~} %'(&%" '07BFOQY[`bdedccceclnx~~~{vniea^\[[^^eeieh_]SMG=80-('#" !  |yusqomlhfa\VPOFH>@::87888<9=::640/-,.*.*,+,-.,.),''$#$$&'&**,,//2/2/2.103287ACHLLPPRSSTXW^\_``eeiikkllkmllnooprpvz  ''/49>CFMNQTUY[__ddfkmrx{|vulie^_YVUONHFDA@<=55-+&! {ytuppomkijgeb_\YSULOJJIDFBACADDBC?>::66524121//1/0//010232478?@DCIJLPQWZZbagiknpqtux{~ !'*,338:=?CDFLMRSY[`bdhgliomopsrvx{}~}{~y|zyxwrrllfd_\VVRTPPOLOIIEC>=762/*'!  }}z{w{xzywwvsuprjnhhgcdbccccbb`_^ZYYVVTSSRSQTSTTSSRRSOTNSOTRWVYY[]^`b`cbdccbebgfhhgheidjfminjompppqrstuxw|{ "$%(+.157;?AHJOSWY``deglkpquw}}|}xuvoqjleh`b[[VUPPKIDA=<9640-+''"" {}z|yzvupnifc__[\Z[[ZY[XYUVQPLKGEECCCCEBGDEGDFECEBCCAECHFJJNMPNSOTPTQUTXYZ_^abgfkinkplqostw{} !#%%'&)),,00458;=@@DEFHILKPOTTVXZ[_^`acddffijnnpqpsstvuxvxwz{|~~z{uwrsoolligea`][[WWRRMMIGDB@=<7731.,'%! |yxrtlokjjhhgfgdfcd``]][ZXVYTYSWUUSRQPOPLMJJIIIGIIIJJJLKLLLOKQOSRTUUXWYZ[]\_`bbedghilloqqutwyz} !&(+/0266:<=BCIIOQUY[_aehjmmrruxx~}}{yvuronjicc][WUSPMIIFCC>?9943/,*&## ~}}z}y|y{yzyzwzxxwwuvstrtsuswsvtvtuututuvuwwyz|~  %&*-.358;=@BEGILLQQUW[\`cfhjmnrsuxx{{}~}yxvsromkhgdca^]YZSTPOMIGEAA>:;642/-*'#! {zxwutrpomljkgiffccdaa`_`___^]]]\^[]\\\[][]]^__`_`aabbdeehfjjllooqrttvvyy{}~  ##((+,/1358:;=??BADEGHJKLMNPPSTSVWXZ[\^_abcdffhhjilkmnoppssuuvwyyz|z~{|~~~}||{yxywxvutsrpmmjihfeca`^]\Z[WYVVTRPPLLJIGEBC??<<986411..+*'&$#  ~||{xyvvtrrpomljiifidfcccaa``__^_\^Z]Y]Z[[Z[Z]Y^Y_Y`[`^a`bbdffikloprsuuxz|~  $&*,/35:<?CFJMPRVV\[``feiinnrrvwz{}}}zzwvutrrpmkjgeca^]YYUTQPNKKFFDA>=:842/-+('%#!  !!%&')*-//22678;=?CEHKLPQSUWYZ\]_`cbhfjkmorsvvyz{|~~||ywwssqonlkhgdb^_YZTSPNJIEEAA=<:551/,)&#" ~~|}x{vxuttqqqooommkkjikiiihhhghfhgifigijilinjonoqprqstuww{z}~ !%&)*,./225589:<?@ADDGIILLOOQRRTTVVYZ[]]^a`bbcdeefhgihkilknmnnnpoppppqproqoqpqpqoooonnlmmjkjjjihhggfeebe`c`a___]]\\ZZYXXUVTSRRQPPNOMNKMIJHHFGEEEBD@A@@?>==;::876544211.0,-+))%&#" ~~|~{}z{zxyvyuwuuuuuuwuyxxyyzzzz|z~{~~  #%(+,0156:;??BEFJKNORUUYZ[^`adegjjmnpqrsuvvzy}|~~|}{zyywxtvrrpooklhgebb__\[YXVVQUNPMJIFCC>?<:85512-.**&&!!   !#$%('*+-.115497;;>?@CCEFGIIKLNOORQTUVXY[[]]_a`cbddfgfhgiiijkjlknmooppqpsqsrrssststrtsssrsqrqrosppqpqoppoplnljjigffcdaa__^^[[XYUURRNMKJHGEEAB>>=9:75411--))%$!! ~|}|||z{y{xzxyyyzzy{y}{||}}~  !$%'),-/023589:==@ABDDFGIHLJMLNOPPRRTTUWWXYZY\Z\\]^^__``abbccddddedfeeeeffefdgefffefdddcdacaa`a_`^_^]]\\\[ZZYXXXVWUVSVRTQSPQNONMLKKJIHGEEDBB@@?>=<::8866542100,-*+((%&##!   !"%'(*,/13478<=@ACDGIKLOOSSWWZ[\^_aadffiikmlonpqqsrttuuvwxyyzz{z{{{{{zzzzxzxywxwwvuuttrrqponmmkjihhfedcba__\\YYVVSSQONLKJHHDDA@?<;885521.-*)'%$!  !"$$%'&*),,.-00133557899;:===?>@@BCBDCFFFGHHIIJKKLMMNNOOPQRRSRTTTUUUVUVVXWYXYXYYZYYZYZZZZZ\Z[ZZ[ZZZYZXZXYXWXWXWVVUUTUSTRQRPPONNMLLJKIHGFECC@@?<=9:8663300-,,)''$$   !##&')*--00335679;;=??BACCEFGJHLKMMOOPQRSTTUVVXXYYY[[\\]^]^^___```````a_a_`_`__`^_^^]^\][[ZZYXXWXUVTTTRQQPNNMKLIJGGGDEBAA?>=;;:986533200--+))'&%$!"  !!#%&))+,/.215578:;<=@?CBDFFHIJLLNNPQQRSTUVWWXYZZ\[]\^]^__``^a^`__```_`_a^`^_^^_]_\^\\[\[[ZYYXXWVVUTTRRQOOMOKLIJGGEECBA??<<9:765331//+,()'&$!"   ""%$'%)(**,.-001235476:8;:<==>>?@@BACCCEEEFFGGHHIIIJIKJLJLKLLMLMLMLNMMMMLLMLNLNLMMMMLLMLLLJKJKIJIHIHGHFGEFDECCCBAA@?>=<<;:987664311/.-,+))&%%""  !!#$&&)(,+//03264789:;;=<@>@ABBCCEEGFHHGIIJJIKIKJJKJJIIIJHIHIHHHHIIIIIHHHHGGFGGGGGGIGIIHIHIHHHGGGGFFEEDCCCCAA?>=;::8765432201.--+**(('&%$$"#!"   ""#'$"'*(%(+*#"**$&+,'&" (/28=EEFIPMGEGC?BCDEGJIJKPNJHFFEGEBAA>?DHFDIHE@@@CLNLKLORVYZVWXWMGDA>??=:9::=<:8750-)(%$# "&')-/135420/*&%%"    ""$#%%'&$&&'%&'()),-11236576864555769::=@?@ACEDEACCEECBDDFEEHHHHHHFEFFGEDDBA@@?@?BCA@>==<;;;::::89665531//.-*)())')(&%!!    !"#&&')')')'((*+-.02455677788988799;=>@ACDDCDCDBCCCABAABCDDCCA@?><=:::::9:9;9::::<8:76657899888999867320.+*)'&&%$$$$""  ""$$#$$&'(***+*++,,--1/10211232434333444455668887879899:::<;<;====>=<<;99787766645353432312111//-.+-,,+*(&%#$!" !   !!!"$$''((()++,,,.-.-...//.00101121123323222222222322121211100111111110001/0././-.,-,,,++)**+))(('&&&%$$#"!!   ! "#$%$%%%$%%&''())***+*,*++,+,+,,--------.,-,++++++,,,,+,+,,,-,,++*)*)*)**((&&&%&$$##!!      !! %&%""!!  #&*,+)*.163,'%(+0-'#&,24/+*+.0-'!&(+,*%%),0.,('*((%""%,++)*+.130,*)('&#  !   #"!!$%&'(('()(%&%%$$$%%(**+)**,/0/.++,*,+,*+....-,-.01/-.,*)+*+--,*)))),+*(%$#"!"#""$" "###!   ! !!""""!"""#""""#""""!""""! !  !    !!!!!!"!!!#"$%&%%%&%&&&'''''''((('(())(('&'(((((('&&&%&&%$$###"""!!!!    !""""""###$#$#$$$%$%%%%&&&&&%&%&%&%$$######"#""!! !                                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom1-Hardest.wav000066400000000000000000005406121366722712400233300ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data<l'+156I9;<=>?E@TAMBMBbBnA2AX@=M>?K>:2.4:a80q))-k378_602(Ko7#+x6'<>n=9.R=ߡ۰,֔ҵ~ˆ7$Iw\;߲2jѱY岥Ruf=I6r`vߛ* >etMZ~Фӭ =ޤܞۑ~2TQq BK1J[',.-,/u5:=>= <:;@FK$MJ^E? :g3,m)C*.4D;?uAG>P5"(9_+ ,5[;);5,"\&N-378!60&QTE F ՟ښߤ?+mD!',04629;>@AB,B@?>{>h>=;=83-)&%g%4%$%$" o%hTy[!2@mYC$(*)&Z"7GcY"%/'4(^('&U$" mRv {s| ( ?Hy )#?##'*)'%#R!]TQ $^OZo#1S$BPҦˌēi릣)\.m<Ц9 襌آ͠ !_񡽟)/Dkͩ|ثStfۛ9ߒVlʎ MU'KǢ;3b™kЕԟך]E|    ~ NxF[;"k&)-2Y86>CH MQ9VZt^aodeeRdb_^^Q_A``=`_]2]\G\[[ \]]'_abccVddd cg_ZWxSOID=V7V1T,(&G%^$\#"#$&),*.//00)2}34131/\-T*& # [k]o #P(z,/011'/+'! w~ܛ~KX v!"S##>#$#c##$(&'M)*)&'?#1 g@>C+TR)GI9u҅dkϋd{ثS ZX &J˴L)ٱ*ҳ2 |Ti'e.ؔ$?]yO8gE. ,.n0nF?2!%Z,4 =EL&RW\`c(ef-g!hik,npTqpoKlhsc?_a[nXVU+VWCY[[^Bac{eefePdHddd6e1e d\b`_7]rZaWTROM)LKJHGDjB@w@@@@>;\72,'#E- HiJkqu.ڷC٩ٛٺٙ9ܸcnܾ[X͌ut//ڱl&JRcwVP"e$R݋?j:So̡gǥ3oÞ߿sưvը_)uzG LU%\fPܻد Ҷ|Og-)ΟDǥƒ"np , a׶ٵۉFܩ'\t* {*_CT {by}< E$h J=!#%'>(((((o(6('p&$f#!" C> l 4 W 6; a"}3"8t Y+OX) = }!X"6#$$$&'),/04i8N<@EKORT VV WXVT S5RQQQ>QlPO NLoK"IFxDLB@?m>d=#<;<<<)<{;:987%643Y3211z111E0.c.!.L...g.-d-,,y*'$p!Cre-# y L =5^{I3Me?jpފo>l٫Eٽ״Ҡe:Iº3 j~]xxuͰri[b D@-ʯ*Ea׫ذ7;Rlލ.{{m Rq EdMܿ)ڰ6bܳݡhbuHIQ`C>4vz S{"gk  s \|   * < I3,FEGo4QTUN6:^R! $%m'))+-/B2B57(9Y::;< >?]@ @e??>x>=|<9v7531/U-W*&1$P"=!O 5\9RFQSUt9!N=`B 0  , [ v  |K*g^9L4 S Vc{[l>atnc"-=AnݾU3ԯZKԕhL~҅љЕ΂˿~P1(x(rwA|`3k#L).tS <n`ѫӮyڅzۊ٩xٓRڳ+f0ݖFOv%s+ {YA.4 )e"AtgAfW.aD m!!!q!N! l z);rt ~ hyyOH<J%.X u!!!C"""V##$b$b$7$#Z#"C! jR@SK>u|l d  Cv6*AVu1k4qS = .!:! c_vzT>0>C{O-2'5j^H/MBd5   S'T&g{F&ATn޲hٗq%a՝chԹլ"לcLۖ{fz>צקFןl Ҩҩ"ҧNp!u ;ܱzމP4@T(zނYݔ(ޯݼj1߼X nܲg|3x/w:,zR"rUWgZ  - S ^8C*,lm;!,"e##$h$$%%%V&&L''()+q,-...m.p.../8// 00=0//...'._-,+ +/*A)('&M&&&4'N'r'''u'}'(("))))(()(h('&$#! nAxd>Xv>&GQF3# ej P p etM {BTM4(!t  bYU>#LR4U5k4i+lUf]pl7+&^?@%<#ٟU{.(Ѫ\whYgٕa0Kۚ4޺?r;G,?mG[y+.E/=JCvh]"j3Th=C x ? ( % 4 H 7 D 8l]N-x` !"]#$$%I&%%$I$#"I"!!)!P!!!o"n#*$$%&f'(Y))*3*;***++* +**)c*+++i,,S-<.H/0L0!0S000//x//.,+P*I)('"'&%$w$$##"+"!B e4(C`!m+  - Z$79xw gZ+m/V/O uv9 HDC@w#[`ݞp܁o܋/o&ߕc8v?6irB5jrf[߶߇ؔv֯g]Ԕ՜s֩$~ݵ޸ߋdtwfG[7'!x JRsUZsC[W2Z?~ / a J ^ 6 y&  O{~$JSTbI<tW8!o U!"#$$%%&c''F((4)z)})M)))(*(T(d(((' '&%$#"!Y! 7i2&X*NJ3tFm<M3h:/ 0fq5XYqT  K 4e.>") \ } ) f2w6aaw.c h7Qwx o,| ߪHw ^6~ڕBԎ2Ӳo?'Ӟ`ҌzqӅԸQ8i^ӀDҶKUӷ,Eԣ6խ)]p8RCLߨ?h2?)[A.E5w C~@K\]mC, : * /][^l];[c==RrJMQ5 !u"*##/$Z$~$$% &&&%%%4&&6''1(q(()))e*l*)))(i('&%$#:#"!v Mz\s5[lH}^ruf# { U y  u#d}1nbsQV-2KwUFr>^2~$CM legT;[fq^3g: 7_qߕ;:aމ~߻QO6'c*M~S)6߮mߋߎ޽޹TeZ\xo2a|blN~o`h  J\E!!?aWvJ .!"%##2$$$%p%%&%%<%%5%%%Y%"%)%t%%6&&1'\''k(-))))(2((U((0(J'&,&%b%%Z$i#"1"{!! m `'+7P|B MM1ItPyn47d %| sy#$ q ' EjF,pNHzl%> ]Ll).TZD>NE |1`N*l8k4?W6v\eޢހd&޹/܂4܄$V}aP@ܲ \bݣOޒ,1ty8S0};ntwWE_iTo}:mgB_)&Y%%y;~TV4nJY^m%'u O [ r  b  L . K O B O } Y G M X>87;M3ajH L',FlH']P K 5 * B (! !6!j!!`""F### $s$;%%&_&&P''5((6))j)/))(((P('1'&%%$v$$#" XT  k  & m}P4Q.9dA?Ii8L#aA(W9V95_Q?= P4XkLC/"b_Rv^j`CraX$P V ; > U *R  <0 ;HBsE!ngNeZH8~ !"\#$$2%%S&&_''((Q))<*W**l**)))/)(5('9'&X&%$#3#<" !( L<@&*R.^ w J \^~Mi+/WZ6 7WlKv=})m} `2>3_0k@W%-h;TpWqy@?qB;:ߚߨߕߖW|xDEp=Czpys> ebc83| DDnoMFC[\Hx[ai!x!^> 2hJ J/$o/$ z : > . " P *7u|"?'qKA Zi{M-]& q R!!!!8! { 4 S V @yC~~+n3a|_$ ihA<}T,qfR H g-4,cfugI8yr=oXF?;] "|۶ڲڛ9b$صx{ش7ل"ڇjdے#*ݕއ>~ G)sEe&+b w`jiI0f(v0lt_6a"'Q9!)b3[gV;@-!n(@s;Z ^V3 f & ]  !3YV?4El+U5I+^jc%,BP}  ;  iHy %%E!;"fq1E:y$</ jmK 6 }   G u r#B/uGZeMWW (Mp7Rw3yUU62AtQ$s:if߆{|Jݶݜ݌݂ݡݡ`݇6ޫްއl߬߯HWz3RN3Si\NMSzkc?CnoWG+d.JiDdDw.#[.t=UzL },)ZzRqCDa^DZW5L3v hP:J%2pzYc^@2PN9f a  >  > v A E ilN&9jfDmyH4r-H j ? T c t ~T9{BOD  *6t2Z'Edkd()eWO <@Bm2[W@w6Igp[7߄ީYPޘ+r߷gxP\j=gK:`*pg(d@r{9K.(6_\PUFbYD"N@0C  ' 6 Z k ? i  9 ! 1 2*Lf,oNxW,h//cZ*xI)[1yv|wISVQP Sf&!/  b0  / *F2Cx/k-2G~9v3/d9jo&GO^ r8QKpSe2 3P-#$UZ R j   Vz$9C: u%ZJap_4iuJ^e2\N*~y)-^S %X`[6_+E>XE{u'KIcmnv%awSv!{}OO y//Sb=$}I%!{h^_y0S! DV iDb  | h & U F@@r_f}]4o<C*7t 5.&t>hA 5(U{~}Hs"a EQM > _ 7 v !h;E7hjagdb%2={b?;3B1#xc+iyP0rfa;~4ted]x:TE U7]Yl|2KSs.pWET7BDUs^Gr Lg7jZYW 0en;v6*BJi >G[< Q  d  d ? (cnyZXYU\bR@Syx@w9jrnt!  i6DFfj?+VkMMdqS15hql? &@L\hmP7Dbm~V7s( ` 1  / $ ] | 0 YLGAk G<<(x.sT^Xq&eJWc%2PX\aN~'WA E0Dk<+d_B;@fQKu)  A"CflIQL+3q5d}P6v)1U(Tq]j|=k]b:Bn X R  U ;P1ZmC@{&lcud?F,?H#\C"VM\kxg<4  Aky\2~C g' u w $ T e   I w O a  g +  Jp)\/q!OR^s#s;u[BsJ$pQ\UXBo+i4`2ISE<nhS|E Y ( s 8 >WL<EyBV^n2k#=Wq \'>"=v<y:T&y2T- t  o # y >   Q v N 2 1 u  M $ " zz!1wUx7t"a\7pU V czL U,N*zbYjJ8YhT8p9,x{c,t/a `voaZ5bF,(-<.l8"FN3'sq fXD-~?#pTcE Q  _ w 4xX1BYac&1m*i?I.RzFg8x}ttx[*,[aC`XdMd6 B Y S v 1 F Sj(lW"ZF!u X,-:ll|BY W%}Ksa[J6.#:' DfT,7YhZDI`kF1s^KCNreRbv!:JXx7, A~=]K| ,WW!X7buOOg?p-6S9,ni$b W\u6 P z  - [   D Z O &  5 \ C  M :\ PC.}Vq=s8Plk_LQB+&"nL>J$V&lU3'gPa )  8 5 X   u1a\ig37w7|aO*;qy;e 0a_wNW-F1PO nD!] tgN=3yts{iTJZ[eVG1+Mg}p_JEI-aB$Fi _,U+|aiT!t+ r xHRK"{zW)ih@bmPQ%% T y  x ? y  f ' N 2I)2:4Qv{w]@F&&FZhBq@_Y2?DTeyhdR/oN5=RVd  c 5 D  L C ;  Nw%v:=_{M:{3|LdQ*E$}XLLmn2VGZAn)s"T+L& a%Y)lTD(oW=!{}h>/>SVRRz9Xw#Z\6d WzS6:+<s(:ZC+s,oh zEdwVG5 w2"DUS'GY~^!GoPv\LFDF4,D&Y)Gu3d'tHr4j[.bQ`66|3e?H>BA" vdF^uR! X y - D - I  u=k2yplqnfU.zFzW)[ W+{lUNM?& !l ur,{L+F wC R#nRi%| MpyM5 (X

F2(c9){Wl IB}YAG~7 e8y=&qs+}!hr! } ^ + n  j M 1uL{(n 2e(\7Y   wU%q? ['`>]- x " t Z 4   ~ ~ y o ^ I /  r J  f  iR9ykK}6OX'jDDf4z=n.|[&bGx?VcZM }%p#@_+xsr}wbV^q!3Cav(Ci &>RmaQO_pgX8 0Mo&Z[ WSYI ]CHEJo+,xZ"%}70% kw~  ) G Q ?&U7d4Ur :^w%-$}lW3p?j3u_,r\\A* ^<zB R l  b  d  _  m+<6S]*[*M[.yRg;.LIu5hLD^s=}ZWTYZd]UF@=#~_Br^A( zr9RrDf "De!9TAf!HvDv"N(aQ,q>k7 Q8|9d%u> g*w/14.y?yT  A z  = s 5 `  ' U &Px '<]{8f(H^mq|{}rdT<+$ udZP3vgJ>.2* {^I* | 5 R B A ` TB#_C||X3*(0g\h<g<j1i?|'Q ~>QoX3 yc@)(/'$ !   N}-i+h2ugbw?! e2re'`6-&^G{HhG+r*l29 H " j ' k  H } ! ] 2i <q!5Geyp`Q2  xT6p2 o C  H  V /  f & y H h/N Bc3C^o'i&[(Gm/ST2:Q__,a fBunjtvfO5pA$vCe(] zDq(uK$m?!,E]y2g(7{ WTu26<2z]Z5v-.tin%_e_ ak&(iD:&[ S 3 }  > n - 9 a .a$g$?aHv)Sy #6Edw~vr`[ZSN+t>Vl+`/oR=  o B  ` / x < P } =  [` Zds_k+HC9}Jx)f&u5m(yFtIq9kE)Gj?h<w\C'wY=kQ(*:Ed!GjueO=9& "CnVGCOd9MGN/{Z(oHADo(a 3SfxAm4q%U0V I u U  S  S : ~ lg"VT %+-8:>3,$#',fS93Fh. e  c  L 'r][f4y=V-Q)Eh,UWC0^ b#,>b/ m>Z6,nUD"g@'k: xK{hI$ocOA8' '.3CZx /[ H O s#mBYC@FcM$^OO'|(yMNl&Ig3+cN} W  + @ G V p  8 ] / e a 1a*;WlrtoTC8-M0 b K  > R  [  qE~;z: f?}vr^@5)&!zU*W'Z$l6HZ<a#lP&Y69y1-6J.c-Nl.W pT@?8;33!%*+%),08Hbz&Kesk}KKv/QLJLd PC4~9km?~DxTfDCYg uZB j$\ e  L H D  b 4r#U-h7_"QuxzuX g:p8` `( ? t 4 G G  Jbgk m/C]({O!t5KY) s> sE}`0wC]$r3=Z)u4wQ5rX>'dJ,w`F4270079MXPMT[axF`t )Hh*Ea6Xv"Icc0Kp'O?k']#d;hS?gV>w` `@]I0Zvk\!cE| [ % h  ; k  = [ s  . d    v W L ? 1 "  | q T 7 #          & + 4 2 * / ; B @ > 1 ,  ) %  o I -  h ( c * [9Yl< {)&J`g9${$q:OsTA#xiN@*%]0r>sA~S ~W-n5lT9#u^@, %>Ugt*AW 0]~"V!@k8[v'^ 7]0j2{K: |EFp9\lNHR Y2m? . G x . \ {  B Z w  F j } %HZsx`C l H ,  d ;  l 2 J  _ '  p-b&j!FM 3KHVP|-Qd#YlE uY<# qaVL6(uK0bAa<oO9*%}`R>8// fR95|wwttmgn|&Dp9`LG{J5|%_k K9p"`B/r9~ FFy$`W6d&c;p"eK k A x J 2 m = _ w %" ,>Q_ls||nkhT=6' u N ( i 9  o C  | : z @  g08i3`;g(` ^]e-TQ`.pCuOi;R}@Bs2|F]+GU+zlOA6;5$ ,/13GYx T{ ]<PJeEk;8M6o Er>f+bI<i'd$^0w<s Ny4rG D m  < ` y  A b : [ z  : V g { w W D ' "  o _ I ,  y d G _ 9  s M ( a.pG5jU8i1AJ;ADTy/[j5X. |W3vQ>$ wGN!_,Sc9kH"jC rR:,}j[TLID6 *;Lk} )M{4cF UV0Rcwk[`AINIFdB E @wIDo5c# W  U  / [ } 0 p " U 7^?_vnX8 lE* x [ @  g K /  g K -   v e A !  ~ c O 6 ^3_2qDoDf'a1Y%S(wN#e/Z.l=}JJd-[6b5WyLjQ?*y\H.! {dM=+ dG;334./.26FOS[o-Yz)R ?OGk&Z2h Hg*b;j 9 q  5 ^ # I j  I x  + \ | Q(Pr.HXhrzreXG>:+[9S | :  I S  U  r 6 N}HzQ%f4^&V(f7 [?XnI!rCh0{A ^Hy9t9UqA|\8#rP2! n]WE5/&"shaVD1! !+78BKak|4Ne"JzEq Lm?zR2c LcLU a6tG1i9n4i@yCfWIxDv : k  D `  0 D X q  $ 2 ; G W f o p r t r t y ~  s k m h ^ K F 6 . $  t T > $  q S ,   Y % f2H ^)RW2 c?kI(_9Y&yC i3l)l(k2Y Xc^"z7 i2p?^4u[G,odPEFC?2.110'!2B\m|!CQw!AVm >Vkr;d9Y/]0lC K(z(1uba#+nMTK*[9X~Gs 0 ]  " C p 5 Z  : g . M Z h v #(3CKS__\`claYB:)&  z V : $  f D  G  L  Z 1 j5i?n; uQ$\)Q%q4}K}ERR tK0zN& paC*f>R*b< i5mS* xeJC3(xliOA0%3/BBV_ $CeDq7PJjEu T5f5q(i/s>g<{cEjFV F(\ 2 b ! F r 3 N q ' K e   % , ; R n  %3ABBDILPIJDGA?. t _ 6  s : M # H f . }H]'r>Z/]5Q"x<U%sEqN"`=uR!Z%S"Uk+STNk8 W&oD|fB3gO<6/$ $#2EZo Fo 6k?wM~!Vx{It+h @n=oLy#M#Vx/W 5Z}3Wx 2 M i    0 P l   - * : C U X l w x v o i c c ] T Y Q P G J B ; 2 '     o \ E -  e ;  m5 q8Mr>YX`3i:s2B D_+~> Z&h0|<\s<HUy[4{K"uWC- 0Ccx$Gi 'Sf&NvBl3T{$xv03)zW9 M ; k # M u  3 A E M H M M I J > A 4 -  ~ o W L : 1 #   w k W @  d J *  } h I ( hC#|]<h=yJ$d?_6g@b-xHiAmB[<\-~W!rCpI!yO&xQ) }Z; jU?+~eV>) {o`WQRXU[V]U[YWUSW`u0Gg B_$Kx 'r]UF8.-,  &8Kal-K`o~ )@bz1SoGsF~VG{ T4oCuI K?o4d@r 8^'R'Q{+Io2O\r   ( % 9 < S _ r y  , : Q f y   # 3 > K Y ^ j o y }  v s h g \ S K B 6 ( "  k [ C 6   k R 3  cI$\3Z,{Id tFh0L a wEsDa2zQ*d:nS!a1wMnN- sX5 kM( ~ZAaD/~qXJ- 5F`nAk ?y&f9yL"e.rCA/d(i"g#UEC4r#cLCyLx 3Y~ ,Gb~ % > ^ f ) @ Y n  * > M b o t g U G 5   r R 8  u b E ,  zM'}dA%|V5fO2hP/ nL, }[4e7f9^7jC`'yT+tD f=_8wfG2bH0zcG0~fH.tVI7* '7M]q.Jd=_,ZAw @w%W2k ?rMP~Bu#L~-W =q8f/f ;q=o'R+e" E i  5 ]  2 S j  6 Q g  ' 8 Q _ s s ] F 0   r N . j :  U 1 x O  X*o>vE!wN*}RvCa0wH{BT#f6 n: Q2h<{Z:Z'g0 Y*_-zaW:, $)(18ENSUXX]eit)=Qj9Wr7\}/Qo!Lt*Z3))'+  $-:GYo.@\k)Kb@X{,Hf,Lz;fMu3v&jS F3iKIyP'Oy S{Mt Er&Ko0Sr  9 L c v  # 1 C O X m u     ' & : < C E E G P S X W S H O E L @ 8 / %  f A f C $ uK{P e> e9b2eC,jP/`C!|U=j7mBM"lD^&~]<pP, _I)gE-tZN8,{qVJ<1+)%'"  )5c*M{ 3S{/R|%?^v.Gbo   ) 4 < @ J T d s }   + 2 A H Y e { u g V K < .   } h > ) oI*qN$b7 ORPIt? ~RS\:qJe7 S(pFm?j>k;y_7}`@$wg^NG?91*!',(-)49FXj~$<[tB`|9^-['Q.Q!VFm/^J|Bv ;h,]*^"S"QMw2`.T|2Kk $ 9 S e x    " . 1 4 4 1 / 4 3 5 9 4 3 1 - ) #    q c P < -   cQ?* wdUC*eI.sQ3{Z5oL#a9`8 gBrM%d:nV9rT0 }S;hF) oJ'lK)wW/|Y9}cWK54$4HWet~#A\x+Ee *Ld3[7]+\3b%NEm#RQEs/Y8h,V =o#Qu.b<c ? d  ( @ W f u    . > H S R V ] a h j l p n l n j g _ W S D E 6 6 - $ "   w g I 3   ] @ )  z`>#gI%nAV-oM {U(],zO"p> yGl1b)Pb6pBpM*|U<oX=mcUF<0*  !17GRbk '1>Rcw ;\x 1P|*Q{0LmCa*Km3Qi2Tw>i1d,]"\ F}:j:c)Pt+A_v  * 6 O X r v  w o f S L > 8 (   tj`SE8&sYC)Z4 |R'SRQ"_*Y#S%k;Ld; \6{H$\: jIuQ1~kP7yl`[PPHGFD;B;=<27,+''"!(*-/27AEOQZep #;Sj)Pi 1d6a:l;h9iDrW1mQ:u IxOJs"Mt<`;Tq (9Pf~ . > L \ j v ~ q k \ W G 8 $   wiaSE=1# xpYI-nR2Z?gH(kS/u]3bAlD X+yX$l?S!^;zeQ4sp^S@.~jZA2ykQA( wp`RN>9-%$ .:S`v)In@n2d1iC~(SJu :u5\/\4] 3a/Y~,[-\0XC`.Ql  0 J ` w   ' ? S f t   % - 8 C K P Y T a a g i g b U K ; 6 - $  } e < n J , zT1 Y8h9V'uFY#|FT'c:v@}R(d;^F iH0fO5{dG2v_J:%yhZOH@2*&1.409@IWbu'>^{@\w x[6nEyO)uV3~[B$sY9lG"eH h-^)m@ X+gA rS8z\F*jZ=/ sZ=* v_K<(  5BZi #Y}!Be)Dk1Sz:` 6]FsBl;h!El-Uw,Vz'Gw+Qw -T~4Xw)=L_q  $ * 7 ; H P Y ] c j p ~ ~ r e S ? -  |eF1aH' eA~[<v_F,z^G-sW3rYE,iJ#dD% ZEw[9yX>W=uX$ [8 zR8 }dP8&#0l=d 8d!T <` *X2]*Qz$Hi*H`w * I k    . = J _ h | { n _ W J F 8 1   w m Q D 1 &   |cG0qM6|T$V1X)t=kG!|X2{Y0dG+|Y=oIdBxT%zW7u[:, u^C*k`OC?//&$  *3A@EGW^x ;Wo!5Nf ">Wp &5Pg #Gd'Dg3WyDf.W|IkGu/^ En4Uz&E`}+:Qj} %2=L[iz  1 ; G H N O [ _ b i c j h m p q o m h f c ^ \ N L : 1   x^S9!{_C+z[C%lK hH!uT(~V-uK!jAjChEe?tW5pR/ V2 xT*sM/dG+oVC+  -8K[p &@[p #ATs 0Gh rR/ ]>~Z5hK0~_D'ueN3"teR?$u]F.s`O>1"5BWi} !9Of 'E_}5Kj'Hv3\KnKq-_O}3`"VCy0\/c"Ip/Lj /AK[hz      % # , , 3 7 7 ; ? B I D G E I C I > C 8 4 / ( !  ~qWI+ zgI< fN*sU5g>zM'[5zP&i<jL1a@!mQ0v[=#a=zcE*mP9"{m\NG;:#'-8HXj~,Fb~ !;Yy0X{Gm 0X/Os.Qs=b 1Tz1Vu>a?a @^%Qi )Cb)>OasqfP@1'|gaG>  q]C5rO5Y;zW:zS2 rQ)uW&rO!_7fDgE!kO4jS4hN1gL)pW>*zdUL?>21.''$ " "&/0:@HUam7Fbr &@b{1Qn %Lb@d"Fc@k"Kq 8_)S{@f$Rx *Mg,Ss6Wq1F]u /EYq !*8BFRS_chpk{tzuohc\]YXTRME<-!vfWF6(q[G8!wcT>/ w`I5  oYH0ziE4 iL, rQ, lK-{X6eB!bA xV-{aC*seF3tbRA/$ yyttkh`YTOMKDH=>789*{kWF,qX?.lT7uZ=bG"fB"uH-Y9~W.pR'x\6lO-xaM7" yneYN@0" }tjcXOAB02.*+*)&  *$37ALMWZfu$6EWj 8Vl 9Vs$IqFk@j 6d :i8\$Fm Fb6Ol0Cfx1IZo!0=L]j~ $$,26<>BCAC:B8A=>?:75,-#|pZM6& jP.pR' ^>uS2~_<"b?#W>a>T0uV0`8xcD+nWA(yeN=(uaWG4%{{uqmihba\]bcefglnkro{z~.CRn{0Yy3[4^Gw6b'Y?j 0Us7Xz-Or &C]}-F`w1Dao#2<HQYdhry (19BLU`grtyp_VC6$nZL2( t[F+lN4sR9pU/gJ* oV1r[C-aQ)lJ7}cF,pK/jN3vYB)wdR=/ ypfb][[[Z]Z^clkqxy"0CXn)F_{ @Wr =b~)Nq*U#Es 5\ 4f?i@_7Tz.E^w#:Tm'?Sl}&EZu ,=IYbvznf]VH>*xbL5 y_K0lJ)\9mF*`@(qW9(pU>%ybJ7aB(xY5sT5zYA#oY8 pcK;#zneVO=6+"  #'1:CQVdoz9G_o !3HXo+Hi8Ur/Mk/Oi,Ih%@f@]&Bn $C`~;Ru(AYv5G`l"5ARcn~!%)'"zl[O;0~lM= o[A)iG2mN(e@iC"tS/ ]?pW6cDuP9tU-bD&vWC*}gM>%yrfg\[TOPOSTSXY\bejmrv|*BXm3Og )?Xr (Ce~+Kd%Eb"If9Z 4Sx*Mu&Lh ,Ii9Wj 3DZg}"5;MWhr     vs`^JE2)}bU9)x`B,kN5nQ< teF0]BgD%xW5 e?#vZ4y\= v_C/k]H7$teaJG0% 1=S`w5Pn2Un (Hf!=b{3Sl'Gl%Ih8Z)Tt5[8_$Cd";Wp )9Uf)8F]cyypaUD8& vhYE6! jZB-}]H&oR;hA&}\9jI/ gB!qT9nS0uYB'~gJ2zdM3o[L=/$ysjgX[TRQMMMNQSVX\aeqt/=JVfp!4FVjx!7Mey*Bat"?]{>Yz5Yx ,Hh&D_~!9Vm :Qv1Hh5Qg&=Qdt-2>FOTa^op~}sscf[XPH>50$oeUG;-"ymSF,}^H+}Z:gG`9}Y/ oI"aBa=lI' ]C# qUA)raNB-$ysk`[PLA;3(' %/=LZgy,Jd1Oo>_~?Xz4]x2Jn.Kt,Rj/Ro *Jh3Qh,A[e(<K^h} $2:EMT_hqxssbbUMC8,! ~td[NB:* }pZH4#|fL2tZB! {V?mM.sO0qT.tT8gS4xZD)mUA(o^K8'|wjdZTHD:53-'*!'$!((*,0.64<;23./+))'""!$)*03826#&qg\LC3$ }m`QE/' }hR;" |`<$Y8]7wX(lJ#sR- eA&`C!eE%tO7}eP6! zumkbe^b[`Z`adkkwu(,;AJV[hm{!2>Sar8Rk2Kk$Fg5Rr>`%Gk3Nr0Mm,Sc(@Uk #1ITlw +6AKR[cnvyzula_NO>5-vmYV@7& }gVD.q^F0oU<" qO9mN3uT4qK1 kH+ x`C+o`L?- zte_OJ71" zjaQJ:5'! $(5;MSis %.GSmw)?_u Dc 7T:b'OyGi 3W7[{ &Ik9Um+BPet#4<IS`iv !(28@GLTS]\adaicjdkcd]XTLFA5.# saL:'xgJ1~fK.eM)hI$xT1{]2fF$ w\B* }gP>)s\L6)sgSG5#{k^PE5.!".5GJ`hz-=Vk/Hcx4Lh;Rm "IKUX]ddhmmproopgnbg_^XOKB94%sjL?"s[<$rJ7 vT2sM4wX:rR5}]D!pX3{]>jP0}cN3#vaRA1${peYND2-!-@Nbq.>Yn5Nf}0Gb|5Ml/Fe%>[u,Dbz ,?Zo-I`{ #=Uo1B^o/;S]v(+>AKQW^dkmtxz}{vwmldcZ\QOG>9.$ skXL;+ p`O9&nVC*pU;$ r^=- pYB'zcL3v^G0xYH(hP6!q`@+lRA'~mcQK>2,  ",09@ERVchq(9N^w.Hb|!E_z )Fc6SoBV{ )Fa8Uv/Mo +Hd4Ol*@Zm-BMbk~    wi]NC2* m[I2! lU?+gN4u\<!mU1{_?|a= lO.oS3u`L5 }cK4tW=oW4{^>!cD& qX6vU>"mQ:s^F3 {jSF1"|rbYJ?4& )2@N_l+RXko{nl^VM=:*$ xiYK8'u^Q6' sbC0mO<v[C)~bM1vYE.hW;-|oUB.ucM<%q_S?2!|tkd^SOGC=81.(%$     '*08:FHTYejx%3I^t 9Ijw%AWp 4Qh4Mg}1Me|6Pj-E[p(=Ug~3Dak3BXfz&+;?LTZdeotv~~zxrle]ZJN:<.& xe_B;&p[J:&z[M3 mQ=! nZ: }_D% ]E( |eE)oXA&hQ>%ziP=+l]K9* ttbbUMJ?A852100-1/465<Tbt %-09:FEKSSW[Y]]\a\_^\\XVRNIEA85.'! {mdRM62~m_G;&lbD8n]A2}kT7' gL8oO;p\<* xaI0u_H:zkYM?0$ ||psfja_b\^\\\[Z]\]aadgioqtx{~ ',:AKV\lp+>EGNNUTYY\\^a`ac`f_d_a_^Z\TUQKIC=;41*( |rhZNA3& zkTG.!oZB+jT7"sRC!}cR8&pTJ.% bW=,{fTA. qZM6+~mbUI:1".9BW[o~&=Neu "5Lbu2Kdy'?[p +BZy%HZz*C[w 8Nh{.?Riz&3IWj} 2:JSciw~om^YID5,whU?.bP5 kT:"wWJ's]H/oVD(oaB:}gRB. s^RB/#meTH?,){rme_ZRNID@@::97<;;?=BAEJNTZ`ko|%1BU_y%>G_m"7I\n 5I^s ;Jcx0G\v'CXn+EZr/FXn|*4KTjs (/1A@LPWYddnst|~{{srmdcTUFD6/' {rcXP=5tcQ@,pTD'_R/~YC!v_@& lO7 wcI4}jU@.q^O<. mn[YGB6-$ &1;FS[nu"=Pc1Iaz(?Yo-G_v,E[r 2<[l7Idu(>Si} )5L`o!5@K\du  !#(!+&)***+)+)')"* $  tl`VIC3*yfXD7"yiP@*u\I2hV@%pXC+mX>&s_E6 s_M=$m_P?3$ ztegWXJK?<8/.*$# %'/36@CLRYckr| *:OZp!2Jbz.Ga~-vdO4$ qWB*u`I5 tdK9$uaR:,o^F:"h[G8)zt`XK=5%~19HW`r~5GXl$2L^v#=Mj{/H[v !:Lew+AXn 2JYt 0>R_r +8FTan|$.6@HPZ_gpp|~spfaTRA?2(  yp^Q@2#zpXJ7&{lRC)}eP9! taE*r]=' sXA&{cM8 taM<&ykZO@0( }|omd`WWNNFHBBB=A?ACBHGNOVUa_lou)4CN[gx!/ENiq 2BYk,>Wm)@Zp1O_ "8Pf|%7K_o %6@P]kz  9<OZfs~%.38?DFNNTRXTYVWVSSPOIGC>93/$% }mdTK:/"ziWH6&o[J8#{dQA'm`H7$o`H6 pdE6 p\E0~mWI5%{f_LB2(ysmgeZ^TUONJIHGGGGIJMNVR_[hju{ &1BQas(;Mew %5S`0H]t2F_u5Ic{!6Qg}!3Lat-CTfy (5DP]kr %*37ADLQV]]eikqsvz}}||vskg^^PJ@1/s^O;)tdN:$mWE-iWE,!iYD0 |gW<.qaG9!qZJ2$ |`V=/ seXL>5(  %15@FNX_epw~%3?FV_mx !,ALbn /BThy,CUn~'FVn;Niz"6Pg~ 8Mcw 1EVi{+3AGT\`klxy~xurjf`YUJI=:1(% nfYMB2*}k\F7"lS>)saF0x^F5ubL0"jQ=$ o]C2qXE2~n^O@3% ~|}}|~~'--{mQE+~kN>taD,ta@-zaI1xhQ=,tdSE2( zoe[THE73*#  !,0=BKW]hrz ):JWjx-BZj 7Nf-Kb~7Kg+H^t.B]m&8Ian -=HXbn{    {idRH9/veN?(gS;"eQ5 o[B)kZ?-pXK4#|w_ZJ94{sf^SKB5.! xsjhd[]SROHHBC=?;:9656454494<7?;BBEIMPTX_bloz$/?N\oz(4JYn-DV[io{zyofbXPI=5-  yg\H?)! }l\I;$l\F3taK6nVC.t^K9"yhTF3%vn\R@6&ztjc]RPGA:6/*#"  !!,.:\s "=Uo+HVs*9L]m &,@GW`oz %%))+)++*+)%)$  yocVL@2)thUO<1"qbQC.% q`I?#ydQ>+uhRA. p\J6&|l]J?* zn`VJB6.& ~z}uyssrnslsmpposqtyu{{ #1Kds 0AXb{&9IYj|,6GN_fw~  (#''&'#%!" {m`SG3'{lYE4" nVE-jV>*v`I6mWB)p]E7xgXG5'~weZO=9%{vnia^TRKFA>761+.%+!' #!  !!&$)*1179@DJMXZeisx +2FObl} -=Oat 0FXq+CXm2G^r.@Vi!6DTgu(5=OWet} %-2=@KOT\agnow{~xwpjf`ZULF<6+" {kbNE4&tfTH8) t`TA3 ~n^L<, sbL;*p]N7*rfOC0saTG4,snb[RME=91/$#  #)/4=BMO\`lv}%9DYi{'6Pcw $9Qc~3Mcx,FZq">Lky*BUl~,>Rau).?HT_iqvldVPB;,%|n]L;){iWD3 p\L4% qfP<2 qdOE1%tcYG@-$}scZJ=2  ql]UK@9.(  &/8@GRXcnw #3:QQlp$;Caj"/IZo(=Re|.;Pav(<M^r$7FWfy'.@FT_gv{}nlYSG72zi[I9)|g\C7sdM=%vgP?+o]I<$ylWK6, seSH2* }k`SE=)$}yfjVTK@>3/)%$%))44<>FLS[eky$1AL[kv'/JQkx*9O^r&9J]m 5EYg} -BQhs!6DSft %4>OUeoz "$*+22:9>=B@FCGEIGJEIEFCBB:=553,-%$  sm`WLB7,  }teXL?2% ~q`QC0'thVG6%~f[C2! wgQB,pbK=*xi[O>5"}{pid\VSHLAB>8:5541417288:?=EDMOW[cgps )8BN]gv (3ES^r~ (:LYsy&9Q`x 3H`u/F]y4Iar #7I_o $.>HV^jr~|rjcVSD>5'#kfSK92 }t`WC9( xnXO;/~iZF9&|oYM<(|n^K?+zk^PD7* }pja[NN>?33&#  "%,1::?=>C<E=D@?><;7915.0*)&%  |rg[PD6,n`K<*w_L8q[G.oSA+mXC-q^N>+rhXPB7.!}}|||||~} -1AGS_gw}!0CNdq !4FYm-GSn{ /?Sex(9H[jy '8DS`m{ '19FKZ[hnx{yof`VNE<4($nbXF>*$ ~uaTE4'ydVE2$}m\K;* }g\I<+ {o\RA4% tl^UE>2& zwsolkggcdbcdehekkpqvz):BWaq$4FYj|$5NYx+9Se{ $6Pav -DPmx+;MZnz $,>CV^ly !(.38@@MFXOZZ^`adbgcddbb`\XUUJLCA97++!vnaUL:2&vr[SB6% yi_K@- q`SB6'}h_E=%pcPA3!zi]KD1( zwkb]QM@A/4%# %'.39BDNUZdgsu )9?NWfp'8GYiw20' uhWL71ugUG5$wiSJ3)sfUE7#}obQF6*unbYRE?60$ $.6BLWcnx&1FSfu6F[n(:Qby1>Wgy 7HWiy(8EWbq !64GJX`hqx    |qf\RC=*$ xjXI7* q`O<.m_L;, ygXK7, xt]WE7+}viaUKA6,%~|rofe\ZQREN=A;9847/4/01,/-2,5.73;8?;FCINOUZ]cgqq|} !,6@KSbky "-;MYi{ /DPWakq|        uu_bPJ>1+}jbOD4%}lZN8+s\P;, j_H8*xdXD8$qdUJ7.xsf\XIC:0. #)39CJT^gs~.3JPil +AM`o5>V_t!4BReq!-BKai})3=LTcjx %$51@AHNUYadjps}~yvmf^XMF=2, xhZL?."zi[J=) rdRH2+ xeVK9-lcPG6)vl_VGB0*~ypgdXULF?;3.)%   %,1:>FOV^gpw,7FY`w%4IUiy (6HWiz 2?Qap3;Q\p|&2DNbm ".;GQ^evy   wofZOE<,% yp\T@5' oaMA/"tjWL6+ tkXM=/"uj[Q@:&"odXLA4+ yqobdYUUILCC=?8:55431115/6387=M[gu %0>DT\frzrpc]TJB90&}uf\QA:+{kbJF.#~n[J9&saN:+saM=) {n]PB5$ |rlaZQIF=82+)!  #%/07?BKQX`gow 04BMXbpw -7HNch~$-AM[ow"2<R[p}%2CNcl #3=JVcl|  ./;@FNSY_diosx}~~}ztumhh^^UTJM=B33)% wof[TG@1' |ubYG<+vaU@5 zjWK5*ukXM:- rj[RE>/' zzprhj_cX]QULMLEFBA=?8>899989;8@;AAEDKJPRVZ`bjnuy  -:DT^m{ +;K^j~&>K`r+;Q_u"4BVdt%0@IXdq} &*4:BGQU]bmlvx|}unl_^SKF:6)(yjcQJ:/! kcMD3"zn[N<. ~j\J;+ vfZG>,"rl\XHC7-% wvtpnmhlhdhagbfbgdggihlknquuv|} *3>HQ`fu~ &5AO^mz '6DPcm~ &1AN\gy*5HRbpz'6?QZkr&27GGZYhkt~wnk\YMH<6*! ofRL:0 za[F;) xi[M<0rgTJ:,ujZM?/|qbWK?3+ytnge`XZLSFID@?><=9:9:8<:=@?BGFLMPWV_afktu} $,8CLXdmz (7DS`o|#,COap!2AOcn /;JUdp%.<DPZgm~ #+15=?GHQPWW^[fahgiikjnklljkjdi_d]^XYSNNFF@;73+,"urg]XMH<3,! whcRJ>/(wh^IB*" lePA4uhUM8.{kcUM>8'#~{xtrpnljigffcfedgeignipqsyv} &,6AEWYhp| 1:JWas &:HXlw%2FUkx&9IZk{ *9IUgm''77HFWV`fjsu|}zwqlf`ZUPHE;7.) zoiXSE=2&|qbWH>,${m_PB2% zgaJC/& ql\RD8+! xwje\WKI=:1+% "%3.C@OS\dnt "07.(  )1>CBEFDKEFIFJEIEEF@B==:845.,*&%  tkcVNE83  zm`SC9' zs^UB6%}qaUF<,!wi\VE>.%~wnc^SLE;6*)  "-2@BSVfkz!/HU`jx%0:HQ]ir  +69JJX^inw    ~ppa_SOBA3/& zsh^RJ<5( zsd[MB6( zlaSH8.uh^PE9)# |qj]VKB82&   *,=CQWhj !2;IVbp~#5@M\ew .<HWcs"-;GUdo~,3BMWekz   '$*)-.-3-4-3-3*.)&' " uwhe\UOG=7-( rl[UI<6%}pgXOA7){saZK@3& |th[VC@/, ~{rnebXWMMEA;932+*%"    !'"-)236;>@IDROWZ_ekov{&09HN]es~!15% yl`VJB4, xni]]QKG=94(* &,0;?IPV_dov} #-:EP\iu '2BN\iw "3>G[_ty !%6<GPWeiv}  +.68BBLOUZ^cinrx}{ytjh\\RKF=8/*! wsc`QKA5,#ykbSK=1)vudZP@;*# yhaRH=/&|mj]SM@;4(&  ,/>@RSdkv!+:CR[jx*5AP[jt*:CU\pu*5BN[du| $19DKV]joz       yoj\\HL79)#zvi_YIE60   {si_VM>=+& {og\SF=0+vkdWPG:6&'|vpjdaW\NQGG@?;:65/4+/+(-()+'/'.-,4-80<9@@EILPSW\_dijsu{+,;>IPWdgwu "08FM`dw{/7JScq~ &5BPZnq$*8<NN^^mn|~}vqjd_TSFB<3/&  og[MH60 pfTL82kcQD:& {m`PH9-% uoe`UQFA<4/)#   %$0,84?@IIST[cflry}.2=HM\apu !(6=HV\kr&.<HS_hs$2;HQ\bpu "(+55<?FHMSP]Yaedmkqstyz|}~x|txqvnpjigd_`YWTMLHDA:52)$ xnbYJF3. piVR>7)skaQM;4)|xka[OE;5*#|xphfXXNLEA<62.*%$    !#%-+64=@BMKWVa`mnv}'/KWanw !(09@GNTYcgosy~vxmme`\XNN@D47(( }}ifWOE:.%to\VE<.# }riZQH:1&rod[TLD=40%! ~xyrrnlkgef_d`]cX_\[]Z]\[^\^a_ebiilnruv{~ !%23@FMUbbnt~ -->DNWfiz-3@NVhn)2=JPacs| ")38AIMY[ehot}}vqhcXRJ@<-+ sn]TG:/rhYJ>,!yg_KC5%~ljZTH<6)!|wrjid_[VROLFF@@<99362.2-.,.*.(0*0,2/5489;?>ECKIRSX`]ikpyx/0?GQZfmy*+>AO]cqz+4?KPcgr~ )09BIR\bktz #"+.095>=CEIJQPWY[a`fghmmppsrxszv}wy|x}}{z|{wytutppjkcf_\\USNLDG6>/0)!!wpc\MJ94& {ngWNC8- ur^]HF40  xrf_TLD76&& }zrojfa`ZVSOMJED>?9<565233-11.3015479=PZft}*0@IU_iy+/?DRZdnz),4;CHOUYbejrt}}y|noddXWLH>;1(%ypc]PI;6&! yvc_PE90$~rf`QM?6-" vli\XNK=:2(&  !'.59CHRX_hnw} *2KR`fs{#04>FLWYfgqx|vrkg\]OPBA92,% |vibVKB2.tgZOE5/yl`UI<3$tmdWQC92$ xzmnhd`\[VSTLRJILCJFEIFHIJILJOORSWX^]eciloszy&-5?DOW]jny '0?ER[gp~ &'=?PXdo| '/:@JQ\akry "#'+,32;<>EAKIOPTUXY[^]d_hdghjkjlmlmmlmklikgkdgcba_XYXMOIED>=65+.#" ztj`[PJB52$ yqeZPD:0$ ykdTO@:)%xzkg_SOE@6/+z|zvwsrprlqlojnjlkjmjnkpltnxsz{y~$*4>ERVeiy !4=JVbo| 0:IUapy !38DPWgly  %-0;<GKOU[`fgprv}|ysnia]UMIB65)! zifTNA6- xqbZNF:.'~pnaZTHC8/+ {upga[SMI?<5/'$ ! +17?HMW]emu|#)66/(! vsd`SMB80(zkhWVDD0- rnc^RMA<3,# ')67BCOP\`iny} !'3>IS`dxz "/:GS]mu ".:DPZhp} %)45ACKPT[`bkjstx{~v}punkhd^`UWNNHF>;6/,#$  vpf`WOE=5)& ujaWKE6.%tm_\KI:3(! |unh_ZTMH@?34+(!  "*.2<;FKNXYchqu| -/>ENY^ks}#&5=GR^et| (4:HMWagqz  !!++268=BAJHQNUVX[]_bddhijolpooqqqsproqmokmghdbb[^VVROJHB=923(' y{igYSG?5-#to^WG>0(}mf[OF:0&yshdYUJG;;0,'  '(56BIRX`hqz~'.>?QScjt~  *5>GSZhp{ $-3AGNZ]int   %%(,+30:2=6A9A=@B@B@@C>B<><;:;49/6-/,)($! }yrmf_ZTKE>50&! wmg^RMB;2) zugaWLH75&" {uji\XSGG88,)   &*4:AINX_fqw  #38HM\boy$.8CNYdoy )3<FO[_mq}  %&0-86==CEIIQLVUU\W]\]]a\c^c_`__]^W[RYPRMKHEC=<56,.&" wpj`[PM?:0(%|tiaVME81% tmdZUHC90*ztoge\]OSGH@<812'(    $'+15:ADJPW[egoxy %18EMX`lt#&89JN]cly~ ++6@DPT^enuz !!('..54:9=>?CBGEHGGIFIDHEFDEAE?@>;;:38,2+() #|{nj`YPI<;+) ~vl_ZLC:.% yoeZREA20! ~rqccWULG?:5-(!   *+78AJJ[Whir| %.4CGT^dtt *39HMYbju~  *.:=GLSZ`hlvw $&!&"'"&$## "   }uqic^WMM??41&$rqe^XMG>40"! ykkZXKF;2)#{xmj_\SMHA;7-*#$&/2:?GLS\`jnu} $.6@IT[foy &18HL\`ov  &18AKSZcksy "$!$&$(")#''#'#$##!"  |wmhcXVKH?72($|tjcXUGD60* zom^]PLA:6)&}wongc\\TTLKED?7=/4**'$   !#((-/66=>CJKPXY`fjrv} ",3>GNYalt$+;?NVaku$)39@INY\fhvu     voi`ZQJD71' qo]YKD72! }ulc[RKA;3*#zvmia]WQMFD:81*,"  $(.29?DLPZ\hhuy$*7IRVcfrw!&-37B@NNU^^ljtxy       {zmjdZYLG@52'! xribYTJB=2.$uqhbYVJG>:0,"txijZ^MOD>91,%!  "*/8=ELTZcjsx"%45FJT`dpv!,4<FLW^esv !(07?DOQ_`hrt    |yqjh^[UNHA:8*+ v{ik^\PNC?61&$}qpc\XKI<8.&#~xpmdeVYPLI??770+,#%      !&(,.44;;DBLLTR^[fglrw{''45?EJUVceovz!,1@ARSdevy &17DETWbgru         {tnj`\VQGF79,(  zvhdWQD>3+#~unb]PLB81) yunibaVUNIE@=77/.)&"!   %&*,23<:AEIOPX]_hfquy  '.4?DLVZhjvy*-:?GRV`fpu} &-18>BINQ[Zeenrv|zpuclZ[TMJB>60,! xki[VKH79'& uqdaTOF:9(,wrjfbWVNIG=<72++!$ #'..9:BJJSW^fhsv $*7>10"!zwnebTTGA;2+$zqpoeg^\YTSOLIBC>>87530-,*()"'"$"!"# ! $"$"&%('*++.01365=8B=FEIKNQWV_^ednlswx#&43C@OP\bhst !-3:FKU]fmx|&,5;CGQU_ckoy}     z{ojf]YQIC<6.'"{sjbXREA5/$ unf^TMC:4)" yymlcaYXNQCF=;74..%'#      !'#)+0077=ABHKPTX]_gjnwt~ *&;3IBVTbdnvz &-3<DHTVahlx}$",02:?>KGQQY[`ciisqxzwvpig^ZTPGD=81- ! |xjjYYJG:5+# ~ykgZTJD83&#|xpmdcZWRKKDA;923+)%     $ &(,/64@:ICNNUX`biltx} ,0;AKTZflt '06BLP]djy{ "*17>EJRW^ajmtx~vrpeg^[TQFH9;/.$" vwekW]LLA>5-(  |uqgd[VOHC9:),!~zwpnhca[]QUNLJGAB?<=7:3705-0-,/*.+++--...//212476<9AKN[^gpt$(/>>PP]eku~!#-39AFPT[`doozzzxmnb]XNK@>2.'  ywjdZQI?8-) yugdXQHA80( ~xtnkeb[ZUQOIHC?A9:532//*+('&%%"&&## #!$"(!*%**/+4084<;?ABEKGSOXW^^bhhppvz'*2:=JKW\cmp{ '.5=FKU\ejt{ #%.05;=FCQMVY[cdimntuz|~xtqkia_ZSRGG?96,,"  {lh]VNE=2.! vxif^RQCB81.  xsqjic`ZXTONGED==7632-++&'!"%#)*,1389?AEKMTT`\mgtwz  .3>EQWcks "#57FMW_kp|&+55BBLRT^`hirvz}vqlf_]RQEB<40* sme^VPFA83+$wsoeg[ZSOHF:=/2&% yyrrmkhec_`YXVRTLPJKHHEHBE@C>B?@@A?CBCCDFGGKIOMSPWWZ_^eglpvw} !$00=>KOV]ckqw !&02??OPZ`hmy{  !,08>DLQV`ckpw{    zuni^[PNC?61&" zoibVSGA8/,urddVSIC<6.'"|zvpnhe_^WVRLMHGBA;=78250//,+))''&$($''%(*(,).-/2074<7B--! ypk_ZON?>0/"tvjmac[WTPKKBD>=87320-,(,"(&#!!!! ! #!%$'(++-/2669=?BDJITQZZbbjnsv}~&*99FJS\bmr} *3=DOTafqz ',49AHMTWbckqt{}{zrojb_ZSQGE;;/.%!{wofaZSLF?60(!~xvfk[]RNIB=90/%% ~~z{wxttsqqppmpjnmkogohojmlmnmonumxrywx||  $)46AGMUZbhrv"+2:@IOW\dkr{~!#-/8;BFNRY\dgpp{zy~qok`aUSIF?75'' yujd\QN@>2-!}xmi_YQJD:7** ~ztsjjcb`XVTNNHHBE<@:<5:2814/3000-1.1.2/251:4;<<>CCJINNUR^Wdcgnoux{"+07@BOP\_gps !)-87EDPT]`inu}~   %+.66=BDMKRXWb`fjkqqxv~~{{tunnied]\ZRSLIG?>951.'%  xxnk`aTQL@@6/+  }ymk^\QLC=5.' zsuhkb`\UWONKFH??>7;353/1+0*-(.'-',&.(,/&6'4/4489;>@AFGJNQUX^^cglmwr~#+4:BHQXaerw~$%48AJL^\joy !-0;;HFTS^^hlnwyzypsfj__WUNKE@<53))  ypp`bTRJF;9-,!~{rmedWYLLF=<1.'" }x|rzlvkolgmcjdfecddbd`adah_ebedgeihllmqrsvyz| !'.2<=HISX_ekpz~!!-1;?JNX^bnp}~"(+41>;IDQMYY\ccjlpuxz~~wwnrfha_WXPLJ@A87,+%pneYYLE@7/(tsgdXSIE;5.$$ ~xyopifb`\[TVMRHMEICCA?><>9<8;::;:<;@:C9FBLJSQW[[a`hdoiqrruwv|x{}|z|xwwtunqklkffd`^^WZTTMPGIEC<?4:.2()"!  }}stgjY^ORED9:,,# }woib\TOFB86+)~}uvpmjeea^\WVUOPLLIJEFDCBB?A@=B>@>A=E?FBEHGLJNPRWT\[abghlrsy|!+09?GNS]egxu".3>DNV]flw}  ,)93B?ILPV[\dejomwt~y~}yxusqnlhef\bTZOQKJEAA8:2/+&# |ynka\VKI@75&& ztog_\SNGB<6/)&  #&*25>CFQTZceotz#%30B@KPU`ekry  &*,52>?DHJORVX\b^hemlrrtzw}~~}z|swonlde^^UUOII?@67,/!#  zqkc[TMB>5+&yqqbcYSMI?@23*%  wxstonjkhefac_`_\\[]W_U`X^Y^[[a^acahfjknspzv}~ #$/2:@HIXVefou~ */5==JLTY_emot{~  #$++/348=;E?KFPLURWW[\^c`hejklnoqrutvtwvuxuzxwzvyvvvsupslqilgffba\]YUUNNIEG<?862/,'$   |uphd[XQJH;<2*'  |xrmdeWZMKEA96.+$" ~xzqwppoljighgdcccbdccddehdkhmnmsrvx{~  ))36>CIQR_^jkty ),68AENSY_dpn}{#&,/58?@HGQOUZZa`fikoqtxuy~y~vvsppkifba\WWQRKEH<?67/-&#  {tsjf_XWKJA=50,% wslh]aQTHFA951''&&..96@AGONYWbbinr|y$-/9=EJOY]cjnw{  !"(--369?>DEJKPPSVX\]`_eehhliplroptpvqwutxuvwuvvvsvrtrppmnjmficfaa^^[YVTSNMIFD?>9920,'(  xwmga[QOE?82)& {vol^cOVGF@84.(#  $#./8:@FIPVY`fjst~ "(+65=BGLPWYcalmr{z !&#**.-41779<>?ADEGGJIQJRORPTTUWWWYZZZ[W`W_X]XZYVYWSWPTNLNIHHAD=?9822.)'# zzlma_VSIF>:2,( stlgd\ZSPJEA<:.3#)  !,,47@AKLVXaekrv{ "*,86AEIUU[ddqo||   "&).0287>>AHFKMLVOYU[[]^``d`gefjdlemgkhihgiehbg`d^_^ZYYRUPOMJGDC=>882..'%" {|sojd_\QRHG?:50+%ywolf`^XRPHBB890/(&   #()11::CALJRUW^ccnivt}~$)/49=EINVV^dfopu~  #$++0176;>?DDGILMQQVSYV\Z\^^``bbbd`fadabaa`_aZ`W^WXUSTPMMGHCC>=764/,)$"  zwokbcVXJK@?60.$!~usmhb^WUMID?;54*,""  "#)-0488>;>>???@@@@A@@?@?@=>>;?8=686725-2-*,%(!# zupmfeY[NPFD=93/''}vrlhc^XUPJE@;72/)&!  "!,*358>DFMPVZ`ckmtw~ &,/99DHJWSc`kmux   #%))0*53579:@;B?BEEEGFHKFLGKHKFLFKFGEEDDAB=A9>87816,.+(&#   }|rrkfcZYPRGF?970*' zutklbc[ZSPKIB@;841-(%"  !$%,*317:HAICHFHHHHHHFICIBGADA?B<?:<693501+.'("#  }{trjh_]UPNDC:63)) }vxkpbf\\SRLHG>=943+-$$ !%%*,046;?8710*)"! "#(,/37<>DGKPSY^`fiorx{ '*/77DAKNTY]cfnpv|~  "$$(&*(-)/,-1,2.000.00-1*0*,)*&($#!"  }uulkd`[WRLJD@:9/-("!}zxtpnieea]]TWPQLFHAA=<6802+-&( !  ""().048<53,+"#~{wqojgb`YZPSJJCC;=550.,&' #   #%**/076>=CGINQUZ]afhprw}~ %)-47@BJMPY[afjpvv~     |xvooieb\YWONHEA<:41+*!! |}uwpomhhad\^WYSSPNKJFEC??<;885300--))'%$#         #!%%)).-3368<=9650/+)&!"   "&')-/368<>EEKMQTY[`fflosw| !()/47<?EGNPVZ\bdklsux}}|wuqpiiba]XYQQLIDB;<54/,(## z~vvuqonhlefc`]]ZXWTSQNNLKHHEED@A>?<<:985825313/1-/---+,,+,+++(,*+*+++-+...00021435686<7?;@@ADEHFMKOQQVVY[]_bdihlnqtxy}  &*-35;=AHHPOWX^`dijqswz~~{wsqlida_ZXQRKJDB=:64-,'#  }yysrnkhfc`\[WUTNOJHHBD>>:94723/.+,()%&!$ "  $"#%''**+//3183<:>A@HDMIPOUU[Za`felnouvz}%#+*/248:?AEFJMOSUZY_`dfjiqotwv~||~xyttnpijeca^[XUSOOGICA@99611+*&# ~~uwrpnjffa`\ZYTTONLHIDDB?==9975521//-,+*))'&'$%$$$$$"$"#"##%#$'#(&'*'+*--//314578;9@=CAFFJKMQPWT[Z`achhmnrtxz~ !")*036<?AGINQVX^acijrpxx~z}uxosjkheba\\VWQPMIGD@@::44-0')!" |}u{quoonileibea`_\\[XYVVSURRPPPOMMLKMIKIIIHHGJEIFHFHDHGGHEJFHHIHLGNINKNMOPPPRQUUTXXX\[]^_abeegikmopsuv{y}  "&'-/359=>DDIKNQVV[[`cfhloovt{z{~vuppjkce]^XUSNKHDB>9821+*%" |xxrtmmkggca_^[YYTVOTLOKJJFHDECBAA>@<<>9=9;;7;7:8:898::9:::=;=?=ABAAECFHHJMJQORTVV[X`\b`gekhnnrut|w~  !%'*--2177:=?BDDIIOLRRUVZZ]_`dcggklonsrvvy{{~||wystpomijfdc^]YYUTQNLIFDD=@98722+.%*% }yysspnmhjcd`_]\YWWTRQOLOIKHGGDDCAA@?@<<;>;=;=;>=>=>>@@ABCDEEGJHLLNORQWTZX]]_addihmmqruw|z !"((-138<<BCHJMOUU[\`bgfnkqtuzz~~{}wvtrqmljffc`bZ[YUUQQLMGFDA?=99621/,*&%!  ~~{zwwstnqkohleidebd_c^_^]][\Z\Y[Y[W[XYZXZYYY[Z[[]\]]]``_bbbcedheigkjmkonqqsswuyyz||~  #%)-.258:=@BGHLLSQXX\\aaffkkopsvvzy~~|xxsvnpkjgda_\ZVTQMLFFB?;953/,)'"  ~|yyvvrsonmkkgiefdcba_`]^][[Y[W[XYWXVYUWWTXUWUYTYVYXXXZZZ[[\\`\b]b`decgejijlmonsqvuwx{{  !%',*1/659<<AAFEJJNOPTTWW[\]a`deeihlkmpmtputtwxyy|{~}~||zxxwvssorlnhigde``][YXUSQOLKHED?@;:8430.+(&$  {|xxwttrrnolmkiihegdeccab^`^^^]\^\][\^Z^\]]]^]`^a_b`cbfdifiikkomqqruuxxz~}  $&),-145::>@CDIIMNRRWW[]]cbgghlmpqsuvyz{}}{yytuprmljgfd`a\\WXSROMIKCF@?<:8521.,)&&!! ~||z{zyxyuxtwtsvrtrsrrrrrqqrqsqrrtrttuuuwwwwyy{z}{~~ ##')*//3378<=@BDFGMKRNUUXZZ_`bdfhjlnoqstww{z}}~}{yxvvrrpmlkhfeab^][XVUQQMMHHEB@;<7821.+*'$  ~}{zzvyrwqsqppoolokmjjkijihihhjghigjgkglhkkklmlmonqpsqusvww{y}{~ ""(&,,.12397<<>BAFDJFOJPQPUSZU[Z^\b^cbcgfhijkmmnqossrvuwuyw{y{{||}}~}~~||}|{|yzywxvvtuqsponnklhjffcd`b]_[[XWWRUOPMKKIFEBA??9<6633./-)(%$"  ~~|{z{x{wxxvwuuutttttsttususuttvuvvwvywzx{z|}| #$&*)/-2468;<@@DDIIMNPTSXW[\^`cbgejimloqqvrxvyz||~~~}z{wyuvrqqnojlghedc`]^YYVTSQONKIHECC>?;9847.2*-'($$   #"&&*+,0/33598<<?BAEFHJJMNOSRVVX[Z]]_baedhfjjmmnnqpsttwvxx{y|z~|~~~~}}{|y{wxvuutrsopmmlkhhgdeab_]\\XXTTRPPKMHIEDB@>=:9734/.,*)%$"  #%&(+,/01558:;=@?DBGEKILOMRPSUVXWZZ]\^_aabdcfdgfjgkjllmlnnnqmqpprqsqsrsssstsururussssrssrspqppqonplpkllikjhhgefcdbb`_^][[YXXUUSRQONMKKGIDEBB?@;<986623/0+.')$%!!  !"#''*,-/12567;:>>@CBHEJILMMQQRUUVYX\[]]`_bcbeciejhjkllmnnppprqrtrtsttvtxtwuwvvwvvvvvuvuuutstqtosoponmlmikhiffddcb__]\\XYVUURSNNKJHHEE@A>=;98542//,+)'$$   ! %#('++./216498<<>?ACDEHIJLLOOQRSUUXYY\\]^_`abcdfehgiilhmjnlnnonpoqoqpqqqqprprqproqopooomnmkljjihghefddac^a]^[[YXYTVRSQONMKKHHFECA@>>:;8763401,.)*&'##    #$%((++.00336799<<>A@CDEGHIJLLOOPRRUTVVXXYZZ][]]]`^a``abbbcbccdbdbddcdccdcdcbcbac`aa_a^__]^]][\ZZXZWXWVWTUSSSQQOPNMNLKKHJGHDFCDB@@>>=;;99757232.1+-**('%#"!   #$&)',+//134578:<<?>ABDDFFHIJJLMNOPPRRSTTUVVXXZX[Y\Z][]]\^^]`^`_`_``_a_a_a_b_``_`^`]`^^^]]\][]Z[ZZXYWWWTWSURSRQQONMMKKIIFGEDCB@@>=<:99572400.-+))&%%!"   #"%&')),,//1244678:9=;@>ABAECEGFIHKIMKNNOOPQQSRTTUUVVXWXXXYYY[Y\Y\[[[][\\]\\[][]Z[[Z\ZZZZYYXYWXUXTUSTQSPQONNMLJLHIFFEDCAA?>>;;97754211.-,**('%$!"    ""$%&'((++,-./01225366899:<<==>@?BACCDDEFGGHIIIKKKMKNLNMPNOPOPOQPRPQQPQPQQPQOQOPPNONOMNLMLLKLJKHJGHFFEECDCBB@@??==;<8:877453210//-+,)+&(%%$""    !!#%$)'**,-./022446596;9<<=>??A@BACDDEEFFGGIHIHKHKJKKKLLLLMLMLMLMMMMLMLMLLLLLLJLILIKIIIHIHFHEGEEDECCBAB@@?>><=;;;9:7866534120//--,*+(('&%$""!      !"$#%&'))*+,-./1032455778:8=9>;>?>A?BBBDCDEEFFGHHHIHKIKJJLKLLKLLLMKNLMMMLMKMKLKLKKKJJJHIHGHGGEEEDCCABA?A<?<<;:99775523100--,**((%%$""      ""#$$&%(&)(**+,.,/.0/11214255566777889::;:<;<=<><>>?>?@?@?A?B?@A@AA@A@A@AA@A?A?@>@>?>>>=><=:<:::9988776554331100/..+-*+)(''%%$"#!     !"##%$&&)))*,+--///02122344556677888999::;:;;:=:>:=;=<<<<=<<=<<<<;<;<;;;;:;::::9:898877666554443231211/1./.--,,*+)*(((&&%%##""!   ! #"$#&%''()**,+--./0011232435566788898;9;:;;<=;=<=>=>==>>=?=?>>>>>=?<><><<<<<<:;:::9887775654332211/1,/+-**)(('&%$"$ "       "# $"$#$%%&%'&(')(*(***++++,,-.-...///0/0000101111130312121211212111100000/////-.-,-+,++*)*'*'(&&&%$%##""!    ! ""##$%%&&'(())**++,,-+.-.././//0/0/1/100101010001/00/0/0//./-.--,-,,+,*+)*)))((&'&&%%$$$"#!!!   ! !""##$$$%%&&''''(()())*)+)+++,*-*-+,,+-,,-,-,,,,,-+,,+-*-*,*+****)*()(('(&'&&%%%#$#"#!"!!     ! !! "!"!"!"#!#"##########$##$#$#$$########"#"#""!"!!!! !     !!"!"""###$#$$$%%%%%&%%%&%&%&%&&%&%&%&$&$%$%$$#####""!!!!      ! !!"!""!#!#!#"##"#"#"##"##"#""""""!"!!!                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom1-Med.wav000066400000000000000000005373461366722712400224550ustar00rootroot00000000000000RIFF޾WAVEfmt DXPAD data@VP"R'$*+-[/!0112 33444333*1|12/061.+.m1C.':%R)$.,3& 4!~$(,'-0+&a"D+/J10Y-O%Q I;GKש[ԊrHr̼ǹ(P% ܗQUTTUEaƃ?dVTTTVTVTTVTVTUC뭍w!ĝNҡxaύ/D-rS/T"=  SLsB#4%l$#%v*.010@+P$!',/01/j,.)'g),/@10/./G3,8VSNmvpEr&lCf&{K !/!I4~5}e G1+k Oi i **f `;a!!6w  Jrok=W ›G>nvJ(G"Up\bl;mJI,WvoH+'Ϻ'AԸatQ+!̟]/3וڄLI~X&T s ) O!$q(,j159C=@}DGKMOPPOM-L8K%KKuLLqL|KuJJILIHHI)JK"MaN-OjOOPONK@H,EMB>: 60+0'6#w G #$W%%+&&'(Z)(g'%$!q;`at3v T#%'&t%"* xWZ7RM+,A7 efP8/N r!!>>Z RFZ|fehG VExcG.,/iك/cYS5$Z{/bj*Ռ`ӛ?W@ٚlW?؍ءل۪DG&(39;g*]&$v`?CQ~ÂYXم,,C._7]3gSRlKwlYRbqf p A  W v A ~<:#)06u<@AEIL?OYPQQRSUW YZY8XVRNKH>FD,DrDEFHJAMlOPQPOOOOePaPO!NLK JGhESC:AR?=<;:9h864s3433u321/+'#?Pt w 1e.3'XJ;KM ,@؄۞{LZ lf59t m;xV Ӧр>̞̀JҨ6ދm$pAzKh2md#ܐ<ڛ28jeDL ȿɣG`Lܫݕ޼a /uVdSs2R L02bP uG( aN'S*Lz  k\(OUM 0 :9!KymGL>w)!f#&t),/K3R7;b?A]CYDD$EDECALA@@@@?4?=<;:8b64q3210/U//00/?/.--,+)/)(!('b'L'''W&6%$$$%+%$h$$# #!; l   bb+]I}nd)7\=hv۔zl{LгXbɨŇ+r(=k 5GL<3˛XGt ٘D݇޼:CY$-Ib15J\_&yjiJE )3@fef}$^c}BQY g UX$ }wV3bNc J m m a B f O Y B[Q "e$%'M*5,f-X../0// 0700\112 32[2211%1 0. ,*")~'%$!Af67Y#$&?:FcG 9 ^ hII>wq4b0 x  P% %TyJec^u<4ުݘUI݄`~ۈYڋ׋ֳөҿ%kΊm̳InʌȚǓǬǭDZǏȚRʯ2Λ|ј[ԀԺՌlc 1 ^H=} b g ;?6A7q[MF  n } & /HiFx]5tbpgH *UoVYߍލUަ\`ݠݐ-Fߊ"Pg(ߧ"ߖݘ܊ہۑ0E۴ۛܩݾ)`7_+ztWlbyVE<aTQZrwtfqq=-1- a w G  i Q8fBb:$[+s6{ B!*"M#s$$ %%$$ %%Z%%%+&9&Q&&f%%.%$$ $`#"0"! 2 xl#8UuW]E | l  %:V}" iVUn /wWx f  : > 0 D ;a#d@?<7%*K2)Bn$U@Cfp[r_,GDNuaqgAjJ5^@;VUNMw;HAPM|C#C).߈ofsg)ڶs2ڏlۉk|S,Bn`I(^r *JB*M{Bt1InTsD\`%;Kb[X"E?Cv . K @ 3 ;B&eNiJiS>;GWvZ$C$K* &!a!!!!$"7"+"&"0"!]!G!!5"4""F##$$%6&]&:&b&&-&%%%a%$#"! 4 S4g#~ Iwro2bA- dn@7Zo tx2\Mf]/I%&VHyYW@jZyY U~s_)"`V)F}[hd_W݃T\Gevs]~`vDY]YudO:BHC]n>,<L  ~  b q <T^'4~YZ0J5]4zsczIX I   yK}i.Cc8.)fQ?9yL (q ( ` ! -@uFoF>~ g|W#z;M/{RbmwZ) k+-8=A5| R_ߦ ޾~5ܚtaM?ܱܣܜwݟN#:aXܨx.X};;܅0Dݏb޽ޣq>2~)R{Zm>;M  #4B:hoh/{r IR  S $  m,*nJcC~E^vY8;D. X% , !X!!!Q! L  t  z-$|efA fEQ$vS3T&7   o  4tG!rH3^L"Mel>},45s x>;M= %-{uw2?3#m5y2E_u.-Lk._28eL/%q)t98?[n T!8; ukiZv~kM>py+ L7K % I ;,a{* '8WWo NfwIR[ xRz0c~Z!C !! B  3 5Rt (<aw~+1dg8blO|pgv~y9<_b- bwR~  ; 6 i  EfnBR$=n]i RCY~]Y|Sc5[#eB&"RgdNY!6Pxsf >|=s&V"p/f;hT!]&=}SMc;_bVpD77hC)"`q$?pWJxy=dn?i]-0%0T K B d N < YO{P\HK&s 1V@aNU{1z:N ! O ?  !t9 S&BR C  FDJ'8V7a}x;4Zp|s@$)3?bh+*x:7+4_y|^w*K_2"67j:'TU m  I}$1 $MkTv9a- C95FuY4})Ry(ip +|4BH\sO(d_WZ5<0}'x9 >!CxybE ^e5L 0  ! T | C>6UCTd1l~DkB8g1g)qF|\ 8!!!!!s!H!E!%! = |'u1O;qfFLL + C ^  ,%H~rtE(4Z\6E&SW 03D%' 0K kE7`,{_5iD *_I(5I3p&:xP=E:$slDO@AcX/4`X_%i=E;M,T@ JI*W'yWO_C7#fVo'Bv3 C n @  G n T L  ~6<]}P^MJcs'[Ywb(1!  SrBIgm2nUUY5fM}VH)y`z#  a o  *lVr\~2?|yvE5tFv/ h!}&v2@;b_LT#2o={>6OUj?iMcC\@Q]|5jU@j`8V\0W 'H:~G"`kcg\@{LNBE o k "  9 B~H`@N nA5 p -ZW`'QRG/][7ouit{=4s&[jMaH%QEh { W 7 W s u Z ~ = 5 5 3 z)v(X3)AgEq 8n!`/oT57f6+9#V#YvV*Fq3E>w%[cl "UB,sW '!g-=mCQfzNx%RUZ\3CCc[8Xc O   I m z F | @ { :;.oa\a+.._dzTpnrnJR k&CC)}Gy*! C   U S K|3I-_]@Px8OvLjn4QauC^53$)Yw_nd^bpFVQxq'LdR: ]l`W|`%DkGE@ r}${2w$O/j u]^yvRd5\4e(d,T{=)pcTJ J s \K"&&@.5X8; p*Yq|M  $Wo}wwjVfco&t<g6b p h    g w9pmG T1_zaG(xHEbr:^%IeX\0RtAU ZBJ4Sd@L^GIRpM/Ol>mqS&$ 4FfKXgnN['AcjuH6I|X08AQ<`@<CLKSK8 ) Q  Z  9 Q  , S | o S 0  * % > P a Z X M X  G  9 #V%Pe'Pfi/8\ 6p<K/3oyuV;Jf>b<m4 C z - f / c !$kI<D5cq>n3GX3&b~"M^ _lP |ZB}44YVp?tG8P|YB8 )=?*AvMx_r^H.;kG#.A**%*e,z QX4yi+lm  $wkB%".uA: 406L;= q b O > J=p/0HSpE9h a{&i -Dgb[LK=71 p=M:dh),GzPg- X 7 * \ 6 X rt'd?M8|0I8nke@haH*"^D.#j21,Aqs%B\$?-W_g8~h_</p;]K;`&%Tw6x$ V??Qq!%4s%k3sC{;4ri^1 t a @n$  N > m v ~ 1 0 Z N u QJ$Cq m-r*)%.EihJ s  . s \ \ n x ` E H q x t  Y {     " b  z >   z e D  8 ;L*1&0[/">gHd6R/P2~w:~^EqG_=.DodqU8&SNu >ONlGt<2^vy K^$F]fK3a6KOm}S2#h2u*]81NNKVNCSgm9?>]BMb'}7   M ) H A*Jy8z Qe8#x' ,7B4@&.!Klw`? U& 6 } O {  p + y E n+dswH*e-a+ RGI J6+0xP q#r*ths+ [9[ f@,e@( iR3Z)yd_ 1VF wf8dM:wrVO^gacA]yL{VcRI^?R\8L P / r ' H n 4L[bn HmiyZ5AJ^/A+&@n{@sHg~C,s u ( x 4 i 9  f E  * 6 0 . < 0  NcBA#ZEWpZ:y`vgK1gI+y=S0j4K_ \{;wBh9kgx~g,|N. tJ oZXHK8 E})MgiL:.+:?' bGA60kU@=AMdxcV{;qt2p*LL0.[v< EQjmk0VqI iG#r\1~*   O -  I r < w } 5E\j`@0:Os8kS5h!|(b;>77@V~b;#~34B/] n  P I  ' j O]:<N?r/c7O K`}bK:[5tP$ x F   7 ? D K  c0iCEv9q0 @^+tWC.Ob3Xc!;&n%Pk=Kh5 v3zo[NF1yetvcM>#s}*\@a bs2Y>#SjNT~C\6~,z o(a0{OH3xChP M  G r   1 F X    * G f r m [ S K H 4  !    ! 1 < R b q  * 5 E R m 5`?IMZg~wjgX<vA ] :  [ . n & } N  ^ . n&T2Jf!`)xAve/d-b<uW Z+{BDK f)wOWw'd!v]6{uX` i  a ,a&<?;AHIPHLK2  _9" y ] I  + 9 \ u , ^`=gG/bJ@8$oY0rMi)@a<}:[zPe(XsT1SuK8T t*q;lbtP-6oT'q5u )IuMzIkyHNc2q0qhQ%v '  u T @ 9 8 C C ; +    fL,w=q?z8X9JT }EKWxQ$i8a.oCa: tSD|4E|/g's4~iZHDCLG7-4Cf(Ko ,EPU^i|wXLBLVRUTK=75766AKYq 4^*V)X'ZI$Z.o>sC+t L@}n.s&Ju}R&vU ' P  f 1 t 'd@[r-ARfw^F8( pI,tN3 i R -  y W 4   S " ]  Q @q+|;j8o: wN*MUj$ILIy,y/ZZb!Tq3g=z^[Y]^f`ZNIG2]=%tk]M:.&()3>IXaiz-8Lb1Lg$Hu.Qp#Oz*Mu'Cb9g8n3nRI6\N; Re0u*`$h%Ru 8 ]  3 Y r  ! = ^ ~  4 K t  + O n  m V ? 7 + '      t c G < %     i X @ *  } I  ; m%r.U`x-b{$U.T$T wU, c6v\9]#FW^+kO4ykijkluumijr{2Jb 9m >s3oD%v)@LJb#ka `#fHz;]v%@eS{K}E+_ Ev R  @ m  F r  C a v   2 C S P O O \ Y V F : / #  # % + ' !   } x y | y g I ,  w F  f B  ] .  uB_U0b)iG!b%yNOHn.TyFp/j/f*i&\(x\@)ukdWZNP@A3+i?g6d3J`F$tP8 @Tg~;b#gR Y?`/s7p$i0i`,d'qC,PT)mKL}<}<x4hT 7 l ( Z  C k  < f  * R t "Il 3BNgv{urc__YU9#}cI& l < ~ Z 6  w ` O 8   Y 2  N  k1V&\U H>m)x>s5b0k9W$e2\'wIe4dF0|@`+[@+u]G"k`H:202"4Ialy0OjsgUGD4!1Kn&l`YN*fS@sQ6pU9d1T~G 4Uo~,OcsBZf~Ci?`4! Z  M ) t < r & Y >IVRMM^inpxz}tohhkodIDFEB9<<DA;;72! | ^ M % z <  C  l ! Y _by.L |A~V(xS,}Z= o6X o%Qqc z2C@iL+yaM5vV9%hI5yS6hTD(t[NA8( 0H\j+[S0r8l'n]+Rt"N9v@^X:k6j ^7u0g;6i9zJuF@1jFw*v-_? { + f H y  - V x  # > Y y 8JgeA& u Y :  b 6 k >  B  v 3 m)=e+KMRe?|Q- q\* qJrX.Y. kT.rO2 P'C W0mJ"xP*~iZNJ1ucN@>B<Qcs0Icr~ 0Jo *I^{ ,944,2=KY|">`q%S$_[2zb O w-y`RBLI$f M  A ^ v  ) D c t  ) : C F X b }     _ > .   s X J 2 ' q g Y J 0  p V 1  _-lJ$t.r<b9 hC!Vk=o> VAY)z5Lb+|7u> T)Y=qBzDi9 q]NDCHIJ>OWfu2@^ 'He;\nz$:Js=c+^ -S|=mH 9fT%Z79m8~,zC] :l>f?nDq 9 _  ! 5 A ^ x ! ( 1 - 4 5 / ,  ! &     z n a N B ; )    { g Z N E ,  kDtG!m9l7 sN(M <\Q b={-u6{I$vhGA+hF$j@"w= `9d9 lYD2~n_WTJD<:@?3125?IVXYh|%8J[,F^}-Cb{D[p.Z$Hn)^ >x6}6_C-<"hk1pUMX)P}  5 O d   B h    1 < X f z ~ k T 6  v W >  h 3  ],qE)~E ~Kk0j6KDD u: PS#}NsV6xdE/oQ7]Cs\>&xcYF:$q]J3# ~~yuurrmhny;Rm~!Dg.P|J}=oUEx 5aY1d3b7l+Z 2Ry:X|GqS{ 2e={%P, [ < ]    " - + 3 5 < 9 3 0 3 /     3 A P _ j t z v s q a O I = 0   s P * c 7  SX1X)GD\+Z)[IY!yDQa={O%mI- i> vCk=P"I|Z8 vzuhZF9.-'! %5<>GSanprs0Yx,N{QH~$_B+fw6xK(\$jT'nN,eH{aBm@yZ2T- ^5a6qWD9%vdRE<31(.+.4?LOXY^lz7Sx 0W}QZ5W8OP\T2s9=m$Z7d+Ww-T~ 5^Ak4a M v  > n  4 J i   5 G \ ^ g b c ` ` b Q A 0   t U @  i P 6  k a L : #  vfOA% tdQ.]AeAsP.~L#Z1X4 ^=Z(_=^6oC`8 vO#oIoK$veXE=-&' }ttf\QMF@;2+ vk\G1   $*:Gdx3Xx)Mv!Nv/UtItFv7c'^)_$X7q#Y'X>q9^4\7]&S<Ws 2 X  - U u  7 _ ) D ^ l      w ] P 2  ` 5 X ' b / g4Q$mCtK$sI"xK V1rL4qEoO4xK"h5Rv=n8wJiCp_I5wh\L:*&ukVJ=4/&  /7DO^s'CZx8Xz(Kf ;j;gEyVMN)`8e[?e:`-Ih At-Lj.T{'=c~  + A W b o y                 u ` K 2  |gK3lC V+d9e9 rU4sS9'vW;hFj>lHW)]/EZ*M%p;kD]:sX?*~nfVMNKH>;==<5-0>K_my"@Vy)AYs".FSs' G T Z ` j j g k m t k e S L ? = - '   p X E # z S " yW-mM%]3 c<~U9vM"N Y.c6vJ&X6sX4uaU=) nN1h<oM.fQ0~ylcP<-|ztwxxvjfYUKHGJNVXWZdipr{| '*49L`yEi?k2Mf1V2Y-Y'\3fQ-fVA0g=k$Qz(Ms )Ld ( = R d x    . 6 P S c i p v  & 2 < G R S S T X [ ^ X Y T W R P C 4  ~ j B & k C " \*wJm;xSg@wW&}V"tW0z[6sP4|_D*k@nJ#T,]&P|M&pL,tV;&k^D3 ~hUFA<3)% &%32>M^n}:^$M|1Z)Sn 2Wu-Ih &Ca=f~1Mm 9s!Eo"R{"Hp7Zz(Ij=X ,Ou2FYj 5Mcy1G_oz    ' 3 > F C ? A ? G E A @ A < ? 6 : 5 3 0 ' "       ~qcXI:(vT9a3 \*|S)tBzCrI['j< k<`7O&c?tHa6 }HZ(gM*n`M?'0AVgt6Nf"?b'Ce 5 . #   v f [ J 9 )    fW@,x`E- v`=# mXA*pX3|_B"mF&v[5~_9iN0 {`A%}d=lM"rT0dD"zU:rW>( vfRD+ ymdWF>.'" '+2>LTkv"C]x ,Kn ,Rt!Dn 8f)QIx@nG|A{!Y!V:k@d /Oj 6Z2Su 6Sb| . ; J Z b t | n ^ I ? / (      sdUK5'xR. hBj?u@X#}F[Y%g5~@])V*e1]:lU7#iG6ucSB0"{ugaUUUSTYY^]_]YV]fr|'1DUg 0B]p3KcBb-O@iBk DuBo;f#@e.My5Yx9_%Gm"@Vo &09=ECSUhq1BQanz     # % !      reWF9&{gN9"waD+yU1 ~Z2 |FmCe7uMlExT/ nV4rW6~W<wN*hM2jU9cM3 hR3m]QF;( .9Wl,T3b!mM-qZA,oZ?(p^G5 }hQD-"|nk_c[d\]URJFEBEES\fqt6Ph~ $?Zw"Em(Tz,Z/].\*TzEj<d3T}3Op/R~'Rw=e S|A\y;Yv * < W p  . ; O ^ r y i U B +  s W 4  ^4d8|V1 qI!wW6nE$xN.rQ)}a4xQ$tHZ=|Z7jL'hAjD!Z3rgTH?42-'!$'1>HPTPSSTSXVZ]`dckpz 0?Ocy5Qf .Tw!oZA%r`H1{bC0aK$wP(lI) tR&lS3z`A- o[?,~kWM<2"~skfdac_]UPLNQQWXXZdns{ 1AXdv 4Na~<\w2Lj6Om9Yt/\CjEs1^3b&S+S~,Ru+A_z2L^u 5I`r  ) = K Z b q } } o d T A 6 $   }kQ8% hM/xY:dC$~\9Z5 mG"Y4]2 dC}T, ^;bC%rO2oP. mF, kI* gXC5!#4APco 4BYg|':J^m~'DZv(a~5Vm.Nj!:Zo&=\u3FYm #*5;FOUX`hu %*8AS]cghkv}~}zuqf]NC5-!xWF.|_J) qQ3a7nFyQ$~S'dAwL(pH"jD#mJ(tN, `?oK/ oZ;&w`J3( "4I`s $C[r%Fc*Pk^}.D^} @Rl)D`(C]x1SmAi-V}Fd&Lp4Sv1IYf|*4GQdl~whbWRE:*xm]R@5"s^D) u[9oEzQ&c<pFwS- wQ)jI#|Q3vY7{^9lN7sdO;$}|{zsxstskogfcc\_^cegikowz+>Qc{.Rk:\Bj 7Z'Mx)N 5\@p(N} Js?h5Ts,Gbw 7Jez$2?JWboz{ok^RB5*vnc_VMA9/!n]G4s`@*fM8"uYE$nO6}U6{W4c<c9oR7}fU=4|ocPB2$ ~rdTJ:/nh[PM@<3,,! "4=Q[m~2Rq"Io:c=lCf"Fs8_~ %Ih8X|$Ah.PuAb -Jh.Ii);L`r#3BMZdt     nTA! }`I.aD1z\6d=dE}R$~Y5sN.hEiI- xW= p[A.{gR;, kR:)|o]UC:-"  (7BS]o|;Qq!4Vl%D`8Zv:az,Nu7[8Pr2Kc}0>M\p,Ha|4L_z/Ql  /AYh&,47;47.1%)$)(-%!qgZKE3)eH(lU<# qP/ lM.pX:'pWD&vU8nO. `6 sQ*wN* pV8%mT@-p]C/" jW?0sc]TOLE@7611/35@HS\nx+?Tn!:Ri =Vo,B]r /Ji>b1Vz (Nj.Rv!=\};b'Le9Wv(Ef&6JXi{ %.=BGQT_elptzvhXI6#jV:& {dJ1r\A(xdP:mY<' rS<%sS:kS* !/:JWapy9Kh~5Oo2Ry>d'HkAf0On?d#Kk4Ns Bj$A`{(Ih|.G`{ !,<DSW_acjhnnkghdh\YSH<6,) |f\MD;, jV9lK&c=sM&sL)tQ-aF&nW<{_D-sW@#gJ% hL4{kXM<+xibWLA/'  %:?HRXoz.=Mbr%5DWn&2GZp #:Ndw $=Wv2Mk$Eb Df7` %Fd"<Ys'9L^t-:MRdmx-;MT^_ddnqsytzx|~|xwtpodbTM>2&taN6#vYK4$ iN4fG-gK3lI(mT3jK0~cD* eI/aI-dG* uX:w[A*ygSD1(&3Vl4Vq4Om$Ec+DgEd*Tr;_8Vt"9Ri-EYn';M]r    |sk]VKH;6* ygZH9(m`I8r[F+q\A,pU<#hI1vZ>& ~jS<pY>&}lS>' zeW?/}lYM7+~ug]RC6' .>P`w 9Mdx4Mgx 'Ae:^{!>e4Y>c<c#Lq /SvGc8Vn #4JWft %*168==CAIINQQTXZ`\^\`[`W[ROKE@;0-"|qaOB2"{gP>*kT<" ^> b= kI, uS/r\C) hV?)aI1oU8s^A*~o`RD2&zvnmhdc\^YYSMIIIJGF@CBGIGJJKNQU[Zegqpw| )4EQ^o0DWk.Ni *Lk>Xw'BZu0Mk,Dbx*A[v.C_z+Ccz1GYp !4IXm{  ym^SB9(#nXG3 fS7" t\<& r^B,aD% {\E tO6z]C% oR>% r]G1~fS?*hR:%q\J3 p^SKA@764..,(*(*-45=BHS\fx(5N[v"5Pg)DZy;Ww "AXx0Hi#?b Aa~9\t2Qi1Po#=Ri !3K^s#'7<IPVdgt|~ti_XOB;( }l^K>, tgWG;) ygWF4%waL3 qaK4xZ@" qY*pYA,w^B)kO4s\9#|bC& vS6iQ2y^G,zhWD2!{lk_YSKEB<84*&  *.9AJT`o|%2ETi5Lc -B_w2Tx!>` .Su6Tw  :Mg{*?Xl-IXp~ /9QZkr #+/59BKR\`dilqrww}}~vqjj\XL@9+"q^F1qQ9x^@# s[E0gJ1dE1 fK.pT5uY;gV>*p\H6$o^OB7' zpia]VRMFF<<741.-('#$()++,02/53<;@B>JGRV^iq|!.K\~ (Je 1Ry 2Q{_~)Qq9YrAWt '?Qdx&;O^w'<O_v /;LVer}|rf]NF3'p^K8$hN3vZ:dK2rZM4%mXC1 paL;#p_H1oZE.iN;$iSD0!riZPC9+!%2;HQ`l~"4EWev*A[q.AYk +D_x+EXo2Qg2L`}:Kj~+?\n,?Vi|,8JThs $03@?IOR[^ilrtx{yuqnmji`]VQOBE75.%sj\RC8(tfPA,eU8' oO7tX8w\A% gK/{^@#p\B0dK,r[B)pXJ/ wk_SNB:5+,## !#(+/158=FLW[jt.;N]r.D]n(=Xl#:Ul7Pk/Cb} )A_z(Db~;Ol 0DZr!.@J\fs| *3:BMQ[abllx{zwonfe^[SNJF=5/!xj\F<&yaP<. p^K5"yaP>'{eI4kS8tY;#hR1hQ8! rbL9'|p\Q@3& yuooed]ZYY[Z_\eelkpst}~%+AL^s$7Qd(AYq!5Uh"AUo!;So,Gd|'Hc?Tv/Ib|'=Qf{(:H^j #)19AEJMLQNPRPQMNHF??7:16.0&&tm\SF:0! o`L@- wfK=#uaG.~cH.pT9%jO4~gO6" pYE0lZC/zeU>- }q`RG=1- !+08BKWdn !-9IWft"3EXh} /K]w5Pj.K_|"9Rl/A[k)=Sb{(;Tf"9Jbs +9CS`m{yxjdWKB3,skXO:0 xfO;%uZ@! nR4cF%oP0zb?%|cC) nR=$p]J;+ ~uk_VKB8/$,CFHKKPMTSW[Za\b[\ZXWTONMFC@:6.){qe\THA6-&tfVI:+ybU?.r[?-pV=$ t[C'z^F*hU>%ygO>(p\O<0vg\PF<2( $.9CP\it -HUp,D\x1Ui1Mg%CZy &9Zl !=Ql 7Md}7Mh{ 1K\r .<KZiv&+.173967743/+&"ubWD:& {bT?-|eQ>'pZG1p^G7 udI9pZB-vfI6xgM8 ybO<'|paXJD60! *4BLYhs -;Q`u /EWl 7Hau,F\t+?Zn)@Vn*?Yj  9Mdz"3KXo~%0@IWbnvwnd\OI>1, vrd\OD9/n\H5  ~_M-nP3^EpQ6sW="lT:qX?% {hR8({l]PC7.$  ),59BJNW`fos~!%4=JWdn~4I]u(>Vo &B^w0Hf8Tl %=Vq2K]y':M`p2;NWeo| !$--7:>CGJOSSWWZ\Z[WWYSTROPJID@<30$!~ukaVO?=+$ qcQE1$vbO?(x_O4% qV=( x^C* t\A& x]K2|o`TD:,  {whcWOF:4)!{sjh_YXPNKIHHIKKLOORXUc]mlv*'mP;|cE*aI'mR= tcL<'ueXJ:.scZJ@2$|sgaWOIA<31(&          %%+-45?BKQWaguw ,8L]n "2J[u.GWo&=Pe{*COh{ !2JYr$>Ncu3DWm}.?K`k~ $1?GW]mq}pjWP<4~iTA(hY5'oV;#rY@)rZA*kO;! dK3mV>'}kVF0$ ~pcYJ@2-wqcbSQF@;5.+&!" ')/69FHV[hr~ +=Ian 2FYk !6I]v3Hau&5'ylZK<* sbK;%ycQ=%pXF4 r^N:'|h[D4" tbO9&zbT;*~p[P>2#|zqqlkihfhdeeehekilnossz|(4@O\jz,AVj 4Ob| ;Lj{!:Ljy 7Mf{)>Yp 7Ri'>Vl+@Odp(.:CLU^blqw||{rqhe_YUKC=0*" zl^OA2 p_O:+uaL6! iS=!aK2fO6zaN5" ldI>)xqbVK>1*zpiaWRID;6,)!  ),8@GSXfm{*6CQ^hw"+>G\gx";D]h0G\o!2L`w !7Kbu,@Ui|.@Ue| /=L`i~ *.:CCQQY^^fffjkjnkmnlmjjbc[ZUOKE@<40, ~wi^RE8)!yiWF6#taJ7 ~nR@#{aJ1kS<%fP9& |eS<*ucR?0~tcWI<2! zqle_\SSKIEDDABBAECIHNPUX]dhrv ,>L_l3KZy*E[t0K_x,EWp :H`m 1DXl~/=Tdx  .AUau  18DPXbls~|wof^XLG=1*thZPD6,  }tbVJ;/!s`P=,cQ9" r[E0zgP>'|lZJ:* ncRE7)vh_UIC4/#  %.8CMWdnz)7M\q*IYds~  !*(//0/1.0.,,($#  wnbXHD-' uh[K>0zjXJ3$ufL="wcK6lU=(w_K6o_H8&{i[G8* xj^OE4- !09GR_jx (6GUfy"5G\l"8Pb{2F`s)AXl&AOgv3AVfx .=N_l~ "1;DTYgpx{skdXQF=1&xj]QD8+zm`XF?.# zo\R@4$siQE/#v^O;'t\M5%obI:#yiZL?,"vrjf^ZSONBD992/,'$#!!%)-049?BJNW_hn{.4EP_my#:HYn|.DXp*CZw*Ja +Ec~  >So(=Rd{ );FT_mv          |ukaZOH95#  xe\K>1!yhZF3$vfQD. wdQ<,tdN9(scL;#wdRB0 xi]NE:.$'+6;CLQ^aor *3GP`oz$5I]o-@Zn/EZs<Khu1?Vhy&6FUdr )*69CFOSZ^chlrtz{}spg_WJB5-~j\E8w^K4wcH2yaJ3}fQ;&}hU@0 }mZO:0viZRA7,  zrjd]VSKGE=<841-,))%%"%#$$%%*%/,42:9AAHLPU\ahqw~(1AN]ly$9J`t2F_w4Gcu2H`w-<Ti{(4GXhw'1;FOYfmx  "$))/166<;??AACEDEGDIDHDEDC@A;<942-)'" tkaUK@4(|e]D9$k\E5k[A5vbS@2shXK<+ peRC5$~obOE3*vjcWRJ@=.2$$    '+19>HOUajq&8FXex!0GXh(9P`u/?Wj}9G`s)9Say 2?Tbr-9KUgr  &3:GLW_hqw{wpia\POC?2."p_Q>0 {dV;.tcM;)p[I9%ykUJ3(~w]T>." mdSK:.xo^XJA:+(~zvroojjjhlkknmqpswz%/NVhp ,+58=?HHPTT[\`dcjgmkonoonokmigibg``^ZZTSOHG;<0.# |sl]WD@.' yg]L?- k[A6 sdF5hS=(o[K4%oZI6'nbRG7,uqg`YRJG@;83.))!%!!!$+)44=@HLU[ckt~#8GVmx 4H\p 0DUg}#4HXl} '/HUhx(@Jcq 0=N`l)1@GW`hv|     yqgbUNF:/%}paRD4({eYG5(tkRD2{jWE2 wcS=. m^L>.tn^SG:0$wxnliba^YXUUPROOOQMUOVUZ[begory~ )6GOam}!4F[n-@Xl0EYr&3M[q!2DRev .:N\o~ *3ESbs~ -1?DPTaamqv~~wsmia\TKG<6-% woaXK>5& vfVH7* zlWH4%p\L9* qbR@2 }maPA4"mdRD8& xidTNC82%   /5AMTblx )9FXex /@Scw$6JZn} .<P^t"3HSky ,@M\lx,7BOYdpz #+18@DJQQ[^ahioqsttwuuvpwlsjkgc^\TQIE;9,* xm`UI:1peRG6* sePA. s\M6!fT=(vbM;%qbPB/ sh]OG;.(zztvqqqmpnprqvuz{ (1=FPZgq~ '-@K]iy$4HRmu /CVh}&>Kfr -@Pcr %8?RZis $.5FFZ]lt~ !%*.066;9>;?===::8721-)&!  |ph[RH;2$qbVE8) ygXK8- uhVL9+ n`L?+ q_M<+tfUG7* qiYSD/ ~o_M?- }n]O<1sfSF6&zeZF:%xdYG6)|l]O>6ypcXND92(    %/2;?FNSXafltw *2>FR]ftz,;HVgq ,7IXjy7DWiw ,CQgv 3FUkz&5DTdq!,1;ADMNXX_`efgkgmhlkihjbg\_XUSLID?<32)&  ~tjaUN>8)! }n]R=0 o]L9&m_J7*r[P6)tcO?+ }lZM8- yl_RG;0%  ',7?IRZcmu'.>CUYip '5BP_kz#4EWg{"8L\v'<M`u ,:MYmx,2:AIQU`akpt|}ypld_WQHE83+!zm_RC5' thSD/  u\M6"hYA.{kYD5!sgUM:/# yqi`XPJA?30)$  "+.81 nXH4 }gYG6$yj]PA6(vsf`VPE@5.$|upmgc\ZWPRJIGAA<=8:76532312115173:7<7/'   '/7AHVZip~-;IYdy 2?T_u2>S]n}"4@P[lx+5DT[ov+5EQ_mz *2@JS^cqu~{slg]WQF@6.%|jcTI;/!ym_N@1!~p\M;*yjZG9%vgUH8+ xp`YIB1*wrid\VRIG@;63-)$#    ""+,67?GHTXbip{*;FXcs "1BTcy 4GZn "1I[p#5J[o 3BSbn%6:KP`ery   |qi`UM@:-&}rfZPB7,  {l_PD2%o`O@1"viZH<) wnZNC2' |qe]OI:4*}{wyqsloikehccb_c^c^aa`cbdheiiopuv} $'9>NVen} ':GXgx *=L`n 4ATas&7GSgr!,>HZcu&0:FPXekx~    yoeUL>1& }l]N=. rhRA2n]L9*zjVI5'~waTG4* ytd\MF72#}wqie_[URJIC?;933/*,%*"'!$ "! !""&$()//35;>CENOX[cgqu !)6EN[ft"5ARbq(5HWj{'8JZk}0<N[kz $0>GX\ns &'25>CJQU]`hlpvz~ytpid]XOHB62'"vh^TC?+% {odWL=1'qdWJ</"rdWF;' yn]P@3& yi`OG8.  {rmc_VPIE?85/-$$    $(-18MQ_fpx|qla\PJ>8+" vf^IA0"~u_VB4$yoYQ?/' tl\SE8-  xnfUR@9,"~oh[UIA8-) "*2:BIS\dnw)9BS\lz.LQ`dpxtoeYUDB0+uf[L?2#tcVD8&}o]Q?2"oeRJ7,{sc[MB7) {hdSM>6( |skhY\LJC;90-(%$  %((1179?DJPX]hmv}(1@HVbl} '4EOam{ '8FSbp *6FQco &;CV]qz $1<GU^iu$%,25<>DHINOUU[Z^]a`dbedgehdgddbaa[]WWUPQJIF@>75.*"  {ukeZRJA61" ~rg^OH;/% ul\RD8*}j]O>2#p_S@5$ {s`YI>2'zukia[WQLJAD;<946221/1/3/446:8?>EGMPVZacmpx%1:EPYflz%3@H[cr(3FSbu(9L\p+9Pau *8I^j} &4<IQ^fqx|qoc^WLI:9*%{sh\SG?4'  ~se[OD9*" }mdSG7-|reUH:,uj\RC:,# zpj`YQIE96,'  %(56BHMY[inw&/=HWbo{,:MXlw"3FTex +8MWlv!2<IX`nw #%/.78?@HEMJQPUUYXZY\^[_]^b]d]c`_^]\YZTWQSNMKJDF?@>::24,-'' yobZKA3$ zkXI8)zlYH8$wiWC7"kbNA2"|ngWQA:.&~xwuqppkmkjjjjjlkmmooruux}} %26EJX_ju"-?JXht ,;NYnw%2AP_l{+;@VWlq '38GJYZimy  "'"+'+++.,.--/*.+**&&#!  ~qnd^ULE:5&%yl`WH@/(yh`OD6' ~qdWJ<0 rk[SF91! uhcTPAJS_iq~ "'05<BGMQUY``jdslttxyz|{|||{{yvspphibaZYOOGB@82/&# rn^WN?;-" {pcYMD6+zrdYLA4*lfSH8/wk_QE9-!xpf`VNE@42(! #%.0<;GISY`gox} $*;@SWho~ (.EH]ev (4DP_ky &2CK\hs  ,7AOVclv '#+./55:8?>BDEGGJKIMKMMIOHKFICDA>>7:25++#" xqe]RI?7+! }naWH=-$xhXI<( }s^S@4$zn^PB2%ug`THB4/" ')5:DLS]cou*5BMZhs $40$!uj_UI@3(wi\QC8*wp^VE;+!~keUH@/'zpf]SI@:0*! "*2?ER\fr} *4HTbv#4BUcu&1EQ`q+8GS_mz&,9?LS^fn{|   #')..549:<>@ABBDDDECEBBB?><:753.-'&   ~qi[UG=3$ vf[L?2% ~seVK<."{qaXJ?3'wlcWND;1(|urhg]YQMHB>76.+$#   "%--66>BIMTZ^djqx~!-9?PT`pt#0?KZeu,;IWgq !.8FR[mr $/8@JQ[`lqz  $)(,..2234472745616.1,+)#$vrb`QK?7,! vm_RH9.! vd[I?."nbWG<. }ocXI?1'}pi`VOD?2.$ %.7>ERUehx|)6AOZis+5DN_fy)4APYgt.8AQWfny /-;<HKUX_fjsu~zslbZPF>3(  vg_MF7,~seZOA9'"yqbYLA4)~wicTN?:+%}wnhbYTMEA73,%#  %,2;CKT[gnx,;DT^ly (<C>BCBECAE@B>?::743/++##sibUMA9,$zmaSJ;1#ul\TE<*"{rfZPG83!vndZPG<3) |sld]WQJC?83-+!#   ('21:=CIPS^_lnx"*1?BPX`ns  $4:HM\box'/AEW\os !,9AOZcsv (2;GQWejw  !#''**,++--++(*%&!! xohbURDB60& zrd\OE9- ~qdWH:-scWF;( qcXH@/&vpbaQNE=6.)  %+29>CQO`]ol| %-6@IP_cpx ".:CRYir} '/AHXco{ !09HO`ft~%,5;FLU[ciqy{ytnjc`XTNIA=30( uocZOD<-(wg]MC2*zq_WG<-  vm_XHC2.  |zrlj__WTQJFB><44,.&'"  !'*03;>EKQY]glt} !*8COZgs -7JSfq".@K\hx'4>MXcp{ (-7@COU[fitusqf_VNH<6.! zse\NG81 {p`WH=/$ ~pdWK>4$ voa[OE;2% yvllbaZXRNIIBA<8821/,**&)&#& %!$!%#%%'&)(*-00166:>?EDJMQUY^`ikpx| +2=GS[iq~$4>IT`ku&3=IQ`gv~ $,9CNXcnz$)3?CRSbfrw    |ule]VKE73'! wkbTK?0,~zh_SH=/&xpcXKB7,  zkbWIC5*" }xmk__QPHD<:3/*%#   $(/06:?EIQT]`hpt|%-7CJX]ls(8AQXjt '3>NWfq|$17DKW_iuz "%.6<CIPT^biosy}}zwnpee^ZRPHC@71/%$  zqgeVSGB81) tl^RJ94! ui^NC7)wo_YLD8/%|{poddZYQMIEA>9752/.,*)''%$$"$##%#'%*',-.3196==BDGIKQQYZ^fhmtt~~ %-9=LP^go| $-=HScn{ '7CT_p{ -:GS`oy",7;JNXafrtzymkb^XQKB?60(" |rh`RN?:-%xkaVK?4'pjZSF<2$ yrgaVMG=5."  |{xwruoqmmlkijhhhhhghghihjjjlmoppssxw||%(29ALT_gq| $4?KYcr*9BR]lt $/9IP^gr~ $)0:=JKTZ^jiuu|}|snha]RRCC71( zre]MJ55 ~qhXN?6& vh]QC8* ~vkeWUFD71) ~zusllfe`_[XYQUOOMKIKHGGCFBGBFDFIGJKLPQUUX]\dailmwv} '1;EL[`lw $.MXdp}-7CPZeq{"*1;BIOX^elpy{}vuki`\VOLE>;0/& {nj]VK@;+&{ndYNC9-" }uibWME<1+ yom_^TOHC;51)%~z|vxstrrtqsttuxxy|~".2=DNV_ftw$/8GN[br{*3=JSaiw )0;DLW^ioz (,48CGMTW^cinsz||yqmha\VNKC;7+( znd[NG81! {qbYI@0' vjaSH=0( zok_YPL@=1.%  y{vtqpmoilihghdgfejflkpnrtt|{ ".2@EOX`kt~ !&4=FSZeny (19CLT_drw %27AHRZckrz  "*/19;?GGNOSXZ^_dfiklnpqtqvuwyuwwuuuqrqnmkgge^aVYRNLHC@:71/'%}wnh_[QLB<5,& qm`[OH=4* wnbZNC8/" wrg]XJD93(#yvolfcbZ\UURMQHMEIEGEGEHGIIMKPRRYY\dclovx#,6?LQbds}  '874.+$   sng^WPG@60%!ulcXQE>3+ }qh^SK=9(%{sid[TJF<7/'$  #(05=BKPX_hoy~ &1:GO\eo}$08IM^dp| (4:IM\apv $%2.;;AEHLRRXZ^acgglmnqqrsquqursrsormmljiicf`b\]YWURQLMFFA?9:03(+""  {rm^\MH>4*! vn_XK@4* uf_SJ>4*  ztkd\VLH@74)%}||y{~  (/8@IQ[_ls{  (5>HT]js~(18HK\`ls ).5<DHQS\_hksv  ! #&&+)-,0/215274857481907/3/-,((&!"  uqheXZJK=92)& zph`TMA;0&  }uhdWQF<6($ }wigXTHC70) |zuspliiedd_d[b[`]^_abcehkmott{| )-9@JT]goy!-4CJW_iu} !.5CIX\ls~ (-9CHW]goz~  %+05;=DELNQVV^Zd_gfkhmipmplqlpjmjihgbe]`XZUTPKJB@<55++!  }unc_SPF=8,)yrka[SKD=10" ~wmf[WIG56("zzljb\TPDD:6-,#  #'-099DDLPT\_emoz~ '.;@ECHJJNMRQSPVPVRVRUSRUQRQNMLGHFAC><;751/*($  yrlc]TME?11#zpdXQB<,'ukcSO>8*  yth^XLE:2+!  ",-4<@HOQ\`hpw}'-6?DOU`fny~ $/9AKR[fnx $(29?HNT\chrs~}tpfcUTGD94*"vmeXSDA1+ urd^VKF84(" |wojc\VPHC:8-,"    ,,7;DJQY_klz| (2@GJQU[_gkrw| *,7=GJYYfksz#(2=DRWehz{ &-4@DOW^dor}  "!'(,0/4488=;B@@ECHFGHHHJGHEECEA@?==8934--&'"yok^ZLH:5&"qiZRF:1" qj_SK<8'" {ung_XSLF@:4/+$  $)/5=CHNT\chpu#(48CHWWfit")2;?NQZdks}  ',45@BKOT[_jgur}~}vpkd[XKJ>:1)${qkaWQE=5,#nm^[OI?70& {yrkf_ZVLKB>94-+$  !'.3<@HNV]cnr} %0:BOTbfu}!&29CKS`dqw ",1<?LPY`envy  !!#%(&)(*-).,,,-,,*,()%&#!  |vni`WSHB:4+$ sn`]NK?6-&urg`YPKB<4.% ~|trkfcZZTNKH@B9941-+&%!    "#'(-.165=>CGJPP[Wd`kktu|#)29?GNW]elr| ),9=FOUaequ &-5>DOS]dkux   &$,*/003346667596755230/.(+$$#  vtge\TMF>9-)xof\QG>6*%yoe^RKA42!  wsje_XRLFB:5/)%    &)04:=DFPP\]ehouz !/0?AMT[glv} 02?EOXbhrx  %+28?EJQT[_ehnqw{~{{prdf[YPNCC84,' |ok`YPG?6.& xthcVSGC82("wuoig]\UPLHBB:941+)$$   %(-189ADLOWVdbooz~ $/8>MO^fpy&.9CMX`lv~ !+18@HPV`cmsw  !#!"$$#%$%%$$#""   ynk_]PMB;1, xnj_YMG=7.$}xnjbZWMK@>22($ ~yupmhccZ\STLMGD@@99711-,)(%%"$ " % )#)**//559:@ADHKOSV\^chlqyx (*4;AGQV`ent{ *.8=GLVYbkpx ++8=ALQWcdpr{  "##&''+&,(*(('''"$  rqd_VNF>6.& {mj]WLE95(! ynjbWSHA;1, {rmg`\SQHD=84.)&  %&.05<>DJPT\`glqw~ '*49AINX\els|&.5?CQS^cpp!!01<CFQS_aiov|{vtmjd^[TPIG=<11'&yslh][OLA=4,&zykk[YOI@83'$ {srgf^ZWMMED>9711)*%"   #%',-1175?=20)$ ~snd\TME;6*$ ~qoc^UOG?80,$ |zusnmggcb^\VYSTPOLIIEFCAA@==;;997766555648595898<:=>=A@DDIHNMPVUZ\^dcimmswy~ $01?:9532-.))'#%! "!!"!$%%((+-.062=8A?FGLMUT\_choqx{$-3>AOQ^bnr~ $,5=FOX`jr{ !%.49AFOR[^gkrv}vwnmdb[WSJI?>41)$ }}olb\SMD=6,& }ynjb[WNGB77** ~{yvuqnnhkcg`c_aZ_X\UXVSTSPTNQPOQNRMQPPQPQQSRTUUWW[X_[_bacjdqkssvzz !(/6>CNS\blr{ ,-:=INU`dos| "(,29:FDORU__ggsp|{uymnec[ZSLI@;8--" qpd]UKG<5.$ }vli][OKC=7.+  {wsphhb`ZZTSLNDH@@=:7716/1-.-+*+*)+(+)+*,-.-103276;<@ADHHOPTWY_aekmsvz "#04@9=97:4;2947758799;:@99654432415285899==?DDHJLPPYX_ackksv|  $,48CEPS^_mpx ")/7<EJP[]kixw  %'048?@IIQSZ^`igrnyx}~~yuummge_]ZSUJKD@<84-+% vukl]aSTJI?=52*&~{qoebZSQDF:80,$  z~xwwruorommlkkkkkiniojplrosqwryxz~} "(.19:DFKTT^_glpyy "&23AAOP]`jpx%(31?<JHQSW_`ghopvzz}zvtqnlgeb]ZUSLLFB?861-'" |wnl`]ROE@61(" urjb\VOJB;8,,!  ~z|wvtsrqnnmiljikejhhhhhijjkkompousyt{z~  (,2:EMR[`hlt{ $(-068<B@KIPQUW[^abgfnjsnvuzy}|~}zzvvprknggaa^XYQPOFH?@58.-(%!~sqhe]XRLG>>11&& xxnid]WRLEC981,'   "(,06:AFIQS^^jhtu~#(.7;CIQV_blqy~  #+.49<DENMWV__ggonvv{~~{vvpohg_aWXQOHH?>65,-# {upha[TMEA63*% xrjc^VPID<60*$ {zzzwtwpuotmqnnoknmmqopqqusvyv}y} "(+36?@LJWSd^ojyx #(/69BDMRU_chnsx|  &%*,11687A;EAHHKMNSRUWW[]\b_ccefhhkhnklokoqlrnnpnpmpkohnfkfdf_c^_[ZVWPRMLHDC@<:611))$ {xnkb_TTFF:8.*"}xpkb^SQGC:6/)" ~~|xwursqoonmkmfodlgjgkgkkknkrlqrqxszw{{~ &+36??NMX[diqx}&*4<?IOT`alrw !'*0288B@HGPOTU[Z`acggliportsvyw{y||}}{~~}|~~z|xytwrtnplkhfcc_^[WWRPOGICA=87/0)%$ zwpmg]^PTEI<<31*#}ytnjbcVXOLFC<73,($  "&-/88CCLNTZ_fiqs}%11??IPT\dhss ##,,53?<DGLNTT[[bbjgonttxz|~}zzuuopjiea`YZSRKGE=<52,*!" xol`^TOG@92,# {unib[UMJ??33($   ((20<;CIKTW]cfpqz~ $*07;CIPT\aeppz~ !"'(,-1265<9?A@HDHILLPNQRSUSWYW]W[][`\``_c_ca`d_c`c`b``_`[_Z]Y[WVXSUNPLNHHD@A9<451/*'%   wtjdaURID=60'$vujjb\ZOOEA?43,($ ~~{{|yzwzwxxwywxyyz|z~#&/5=AKOZ^fluz *+7=EKTXbiov{ %),148:B?HHMLTSYZ[a`cfgkkmnqrtuvwyyz{{~}~}~}{}{zy{vxsuppnjmdgc__YYURMMFE@<971.)%!  yspfd[VPJD?73,("}}wtnmcfZ]SSKKD@?851.((#  # +.3:>DHOR[[ffqty &'22>?GLRV`ahmtw  $)-469D?LKRT[[ccgmnrvv~~{{rvlmff^^SULKD@<62,("  wuke`XSMDA83,%" ywoje`ZTPICB75,,#! $$00::BEKOWY`bklvz} )*36?AIMT[]ifqsy  "%)+1387?<DCJFPKQQUUWX[\[_[a_^c]c`ac_c_a`]_[]XZWVTTRPNLIIGDC>@9:8440.+)%%!  zqphd^YTMID<<.1## }tsgf[ZPNFB87,+! ~~  %)07:DFNSWbbmpw~ !(06>BMQY`gnu{ %'-.48:?BDJJOSSXY[``eeihnmqrqvuwyv|w~y}{{|z}y{{wzuxrvpsonkkifeba]_V[QSMLLCD<?652-,%#  wwjka^XQMGA<72*& }vsojfb[ZSSLGH>?854+.$$     ")*24;=DFORV^`inry} "'.29>EIOTZadmoy{  $$-,349<?DDLKPSSXX]^ccfhjlmpovryt|v~z~}||~~~~~~|{zyzsxptnnlkfg``]VYMSIID?>58+/%#  zuli`\TOI@=21'# |upkcaWWKLB?920'%  %%/18@AAEEEHHILJMMNOOOMPMPOMPLLLJLIHHHEFBC?><:87320--'(""  ~zsshk__WTLMB@<22*%" ~urjf_ZTOIC@48+*# !$,/89AGKQW^cjnu{),3:<JITX`enq{| !")+0388@?DFKKQPTVWZ[__bbdegfjigmgnkllklkkikhiggfccb_`[\XWWPSMLKDE@><:540,+$& wvmjd`XXLMBA:7.-#" z|rrmfe\ZTPKGC?98/1&(   #$(.068=AFKOTZ]efnow{ #&.2:=EJMWXcdlow{ !$(*,0155;8@<ECFHHLLMPNRRSVSWUWVZUYTXVXSYRWRUQSPPOMLLHJDFAA>=8944//))"% {rpdfXWPFF<62+% {wold_ZRRFG=84/*$  "&+.48=CFLQVZ`cioryz"**66<EDMTT]^fkpv{  #%%%())-*0-3.313332526261443312111-1,-*))'("% !  yxpplcc[\QTFJ>A66-."" ~xtmjb`WVLLC@;51,'$   *(25<@FKOW[bgnsw $(16=DIQU^cjou{ #!)'/+3164<8><?@B@DDDDEDFFDHFEHDIAHBF@D@D?@>?;>8=5<3704/0.+*(&%"!  |xsljb`WTMID;92+* ~wsnje`ZVSMJE@>770.*#&   ('.02:8D?JIQSW]_fjmux} )&53<@DMQU[`glovz  #"'')-+01154788<;><@?@C@CCBDDBDDDDCEDEAD@B@@@<?;;968441.0),%%# vtlgaZUOIC=52*" zuqnffZ[TPLFC<<44+*$#   &(019?CADBEFFGFIHHHHHHGHDHBHADC?@<?8<55300,*(%$  wwnmf``XTOIH>=62,($ y|nrgfbZWTLKEA?8:00)($"  &$+,1087=?CDJJQQZW`aflkus|| &'039>BJNSX\dgnpyx  !$%(',,..1/5174585:6;98<9:;9:::8:787553413-0+-))&&$"   wrmed\WRMEB:6/*"  w{jqdb^WSOJE?=830*'   !'*008:>EDNOVW]bejorx} "%.-48=ADJLTS\]aihprwz    !! ##$%%%'()()%-%-&+&)(%(%"% #  wuoih\]SQJG?<62+&" }ysqkic_[WVKOBG><840-('"  %&,166=?HHORZZcdmnvy $&1/9<?IJOWWb`llsw{   "!)$-)..013363878<6=7>8<:;:9;7:4936121.--')%%"  {wullda\XSQGH?>73.*& ~ytrmgf^ZZQRJICA;850,)'   $ ((,127;=BCJJQQYWa_fikquu{ $*.26=AELLSXZbchpqv{~   "$'(++0-205357788:::<8>9<:;::98:491712/-.+()#$ |wsmjc`XXMNBC980+)  }xsoig`]XSPKJAC9930.''    $'+,1289?CEILPTY[`bjjrrzy#"/,97@BGNPXYbdinqwy        !!!!!!!"!"!"!"  !  ~wuokfc\\QSGI@>74.*##~yuqmgd_ZVQLIDA<940-&&   $(+/44>BDPM[Xbdlowv  !!'")&),,,.-/1-2-1/1-2-1-.,-++))%)!%!    ~{ssjid_\TSJLAA:53-'$ ~uvnnff_]WVONIFC?<841-,'%!   !$(*,034:8@?DGINOTWZ]begnnryv}&)14;?EIOUX_ajmsy| $'%())/)3,4.5043444445361604.1/-0)-(*$'!#    vtnldbZXQLI@?730&' }swjnee\[VRPHGC?=6800))$!   !#((,/046:=?DEKKSSWZb^jgoqvx~ #&.05==FIMTW\bcmlvt~         z{splgb\YPQHE>:5.,"" ~yuomfe]]SWKNDE>=8700)(%    ""().1488:24-/(*"$   $#)*/159=BCKKSSZ\cdloqyy #*.0;5E@MLTW]_fkmtv}  "((%(*(+*-*/*1,0-/...+/,+*)((%'"#    }vslkbaXXOPDE;:30)' }~uroif`]ZSQMHF@>952.+'$     #%))-0076<=?ECKKNSS[Z^bcjiqowu~}  &)-44;?BHITP\Ydcjnquz~        xwqokge^]XQSIIB>;53,+"#~{wrpjhc`YZPSKKDD<>661/,'(!$    $&**0177?=DGJORVZ^aghqsw~~ %)-47@BJMPY[afjouv}  |xvonida\XWNNHEA<930**!! }}vwqpnhibe\_XYTSPNKKGFD?@<<996300-.**(&%$!!        $"&&**/.4479==CAIHMPTUZ]`efjqpwy}  #*+33:<BFJNRU[[dcllsty}~              |wvnlfc][TPLHB?:43+)#}|ysskmff_`ZYUPQLJGAB==95510/**$'!!      "%#'*+//268:>@CEHKNRTW\\afgnmuty{  "'*.25<;ADENLTTY\`cfjmptwz~~~xwsqlmch_^[VUQNKGEA?;:25,-&$! |ytrkkeb^[VVOOIGF?>:7610,*'##   #!'(+.057:=?FFLNRUZ\affmptx| !()/47<>EFNOUY[adjkrtx}~|{wupoihba]XYPPKHCB;<54.,(## {wwvqpohmffda^^[YXUTROOMLIIGFEAB?@==;:9793652402.1...,--,-,,,*-+-+---/-///11142547797>8@<@BAIEOKQQVV\[bagfmnpvw{~%#+*/2489>ADEJMORTYX^`ceihpnsvu}{|}xxssmohidc`][WURNOGICA?99511+)%# vxsqokggba^[ZUUPPNJJEFCA?>;;9663311..-,+*)((&'&%%%%$&#%$%%'%&)%*()+)-+..00425789=;A>ECGGKMOSQYU\[abdiinosuy{  "))/36;>@GINQUW]`bhiqpww}~y|tworijgdb`[\UWQOLHFD??9:43-/')!" }~v|rvqpojmfjcfbaa]]\YZWXTVSTQQQQNOMLOKLKJJJJHKFJHIHJFIIIJGKHIJKJMIOJOMPOPQQRTRVVVYYZ]\^_`ccgfhjlnpqtvw|{~  !&'-/349<=DDIJMPVU[[_begknnuszyz}utooijbe\]WURMKGDA=8821+)%" }yysvnolhhec`_][ZUXPVNPMKLHIFFDDBB@B>=@:?;<<9=9<9<9;:;<;<<;?=>A?BDCCGDHJJKOLRQSUWW]Ya]dahfliposvu}x  !%'*,-21779<>ACDHHNKQQTUYY\^`cbffjknmrquuxzz}~~~{{vxrsonlhiecb^\YXTSPMLIFCC<?87612+.%*$ ~zzuuqooikeeba^^[YXVTSQNPJMJHHFEECCBAB>A>?>><@<>=>=@>@?@@BBCDEFGGHKJMNPPSRYU[Y^^acefjionrtvx}| !!'(-028;<ABGJMNTT[[_afemjpstyy}}z{uusqplkieeb_aYZXTTPPKLGEDA><98620.,)&%  |{yxtupslqimfjegcf`e_``__]^[^[\[\Y]Z[[Z[[[[][]]^^^__ab`ccceffigjillnmpprrutxv{z{~~ #%),-147:<?BFGKLRPWW[[``eeiinoruuyx}}}{wwrumojifc`^[YUSPMKFFA?:942.,)&"  ~{zwwttqpolmijggfddcab___]][]Y]Z[YZWZWYYVZWYWZV[X[YZZ\\\\]]^b^c_dbffeigkjlmnqpurxvyz}| !%'+*0/648;;@@EDIIMNOSSVVZ[\`^bddhfkjknksnsssvvxx{z||}}}~}{zywwuuqrmpklghecd__\ZXWTRPNKJHDD>?;9733/-+(&#  |~zzxuvtspqnnmkjjgiegddcd`b``__^`^_]^`\`^___`_b`cadbedhejhjjmmqorrtwvzz|  $%(+-13499=@BCHHLMQQVVZ\\b`efgkkopqtuxyy~{{}yxxstoplkifec_`[[VWRQNLHJCE?><97420.+(%% ! ~~|}{{yzwyvxvuwtvtutttttsstsusttutvuvwvyyyy{z}{} ""&(*..2278;<?ACEGLJQMTTVYY^^acefijlnpqsuvyx||~|{zxwttqpokjiged``][ZWUTPPLLGGDB?;;6721-**&#  }|{x{tysusrrqqnqmollmklkjkjjlijkiliminkmmmnonoqpsruswuxyy}z} ""(%++.02386;;=A@ECIENIOPOTRYTZX\Za\babeeghiilllonqqptsvsxuywyyz{||}{}}}}~~~}{~z{zyzxxxuvttrspqnnlljjgheebc_a\^ZZWVUQSNOLJJHEDA@>>8;5632-.,((%$! ~}|}z|yzzxyxxxwwwwvuvvwuwuwvvxwxxyx{y|z}|~~ "#%*(.-1357:;??CCHGKMORQVVY[\^bafdhhlknpotqwtxxz{|}}}||{xyuwstpoolmhjefcba_\]XXUSRPNMJHGDBB=>:8736-1),&'##  ""&&)*+/.23587;;>A@CDFIILMNQQTTWYY[[^``cbfehhkkmmooqrrutvvywzx|z}|}~}~~~||~|||z{yywxuvtssrpqmnkkjiffebc_`]\[ZVVSSQONJLGHDCA?=<98623/.+)(%#!  "$%(*+./04479:<?>CAFDIHJMKQORSTWVYY[Z]^_``badbfdheihjjkjlllokonnpoqoqpqqqqrqspspsqqqqpqqpqnonnomlnjnijjgihffecdbba`^]]\ZZWVVTTRPPNMLJJFHCDAA>>:;875522./*-&($$!!   ""&')+,/01456:9<=?B@FDIHJLLOPPSSTWVZY\[^]`a`dagchfhijjkllnnnpoprprqrrtqurusuttutttttstsssqqrormpmnmlkjkgifgddbba`]][ZZVXUSSPQMMJIGFCC?@=<:87431..+*(&$#   %"(&++-.105387:;==@ACCFGHKKMNOQQTSVWWZZ[\]^_`abdcfeffjfkhkjlkmknlomomoooonpmonnomommlllklkijhhgfeecdbb_a\_[\YYWVWSUPQPNMKJJGGDDA@?=<9:76522//+-()%&""  "#$''*+-//225678;;=@?BBDEFGIKJMMNPPSRTTVVWXX[Y[[[^\_^^__`_a`aaa`b`abab`ab`b````_`]__]_\]][\Z[YZXXVXUVUTURSQQQOPMNLKLJIIGIEFCDAB@??==<9:77645121-0*,))'&%"!   "#%(&+*-.0134679:;==?@BBDEFGHIJKLMNOPPQRRSTTVVWVYWZX[Y[[Z\\[]\]]^\^^]_]_\_\_]^]]^\^[^[\\[[Z[Y[WYWXVWUUURUQSPQPOOMLKKIIGGEECBAA>><<:9774612//-,*((%$$ !  "!$%&((++.-012346698;:><?@@CBDEDGFIGKILLLMNOOQPRRRSTTUTVVVVWWXWYWYYYXZYZZZYZYZX[XYYXYXXXWWWUVUVSURSQROQNOMLLKJHJFGDDCBA??=<<9:7663310/-,+))'&$# !   !!#$%&''*)+,-.//1132546778::<<<>=@?AABBDDEEFGGGIIHKILJLKMLMMMNMNNPNONNONNONNMNMNNLMKMKLJKJJHJHIFHEFDDCCBBA@@>>==;;9;6865533210/--,*+'*%'$$#!!    "$#'%()++-..00224384:7;:;<==?>@?ABBCCDDEEFEGFIFIHIIIIIJJJJKJKJKJJKJKJKJJJIJIHJGJGIGGGFFFDECECCBCAA@?@>>=<<:;9:978564431200/.-,,*)*''&$$#!!     !""$%%(')*+,-.//1023365687;7<9<=<?=@@@BABBCDCDEEFFFIFIHHIHIIIIJIKIKIJJJJJIJIJIIIHHHGHFGFEFEDCCBBAA???=?:=::98775534110./,,+))&'$$#!!  ! ""#$#'%('))**,*.,..//1021333445556678898:9:;:;:<;<<<=<><>=?=>>>>?>?>?>>>>>=>=><>;=<;;;;:;8:888776655433211/0./-,-*,))('&&$$#!"     !"##%%''((*)++--..0/101223344556667768798888:8;8;9;::::::::9:::9:9:99898887886766665544433222111/0//./,-,,+*+()'(''&$%##!"!    ! ""%#&%''((*)++,-..//0002133345556758798999:9;:;;:;:;;;;<;<;<;;;:<:<:;:::9998887766655433221100//-/*-)+))(&&%$$# "      !" """##$#%%&%'&(&((())))**++*,,,---.--.-./././/.0.0.0/0/0///.0././....----,,+,+*+)*))('(%(%&%$$$"#!"!     !!"##$$%&&''(')())+)+*,+,,-----.-/-....-/......-.---,-,-+-+,++*+**))()'('''&&$%$$##""" !     !!"""##$$%%%%&&&&''(')')(()(*(*))*)*)**)*)***)*)**(*'*'*()((('''&'&&%%$%$$###!"! !        ! !!!!!!!!!!!!!"!"!!!!!!!!! ! ! !     ! "!""""""#"################"#"#!#!"!"!!!    !                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom1-Soft.wav000066400000000000000000005376201366722712400226560ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datah  L: A!!"g#-#"3"2!"!D"!!"! !"^! &N~-O !A=4  P$_l  #$(w+,!+') u }-0H['p3^AوPѐEj`ςU`:ݹuņm$Z˩ȝƊÑٺx?9&c22hy1S0ݰ$3lµUΎչ ׼@ M[j0D9(@o9X }&KpHI+V 1!)pug7 $'@)))%))n)P*^+, .502Z5665:30/-G,*($ N ox\f- nZQ 8 fh  d&^} ,0+wvcC(%j* pAr.  :!a$&(**9*(&$##$U&'P(P('G&%1$#+$%]&g'2((0)O)((&$?"["d)BNp?I*sQEgU { s ' z i0zsFJ' 0pBW@' ~e9Nݮؚ}Ӄюς˜}ɒɾPˋ?iYEuǓũph޺,8ѳƳ3״m2@~ ĸi8s°J-c&¹B˂qθ0ψКC&܏ޡ-+q Mn4) %-j!$ (*z-/1u22(2110,112M22233Z45566T7789:<%=">2?,@@@@@?9?>>>>?>=<;97420.,+**n***+*)'/%" A'QmCPH M  v 5S L " Mk:*.Ogt=]+p b M $kqKDQ R H   thZ1];mEk.N Z d W   je'S[76Pr.H+aw}o؈@өgpՃFIFҌiЀwxӿnӒ*ϟΒő#i+կ,'1' gߊ+wY+j ڧ)m?tߍfi?W> 3h5& Mp|Tat(J-(7OH5` > PC q,y \"#$+&=''(1*+S-`/!123=567}8Q99c:+;;N@ABCCCCCCECB|BAA\AA@!@?Y?>=<:3976*66576>65 5O43/310/.-f,"+)'X& %#"? fzLSJDb F  <:U69?^AQnx LQkcGn,r^H/rav f*%;~8o: 8)_@^dMݮS6Yܕ܄?ڴړh^ړ vhڰڏo<8M"z [AC!!!X""["! i; 6!"#r%'( **+,-./0 1>1G1>151v11Z11s0/{/.Q.-,<,~+s*)X)?(Y'&P&&%%0$#T"l! i S A!("2##>$J$###Z#"!'! T٧"ETڔܪk'޻|_NaY r"BGGM*x9XqSl7y?@XuyUKuZ)&12PN  u g ' x ^ P ~{NKe<)YZk (!!v"F##^$$%v&3'D(()*U++++++,,+,++]+*)( (&%#S#"["""!!!"!b!"! !!  c OnCd  D  {Dc.82ܱۧڏWؽE1צH[Zؘ 5nٌnhC'0أ؇\/=ؐ%CڀڲtݦގߩKYUP 5 g H5Pf[J  >>,/ Z^\O+#8xuzOh6W4[C,D@r<2HOqD * | X f.#Uz !H!p!!""-##$####" "![!o QZx;c )!R&r|'5'#H   r 5 V08kCtzD1%P_sTVKb^fKONMۢHkٳط4ٯ2[ܲ .sݘސ޺} e?m[Xښ<g|rٞ ڃڅڒڳkKP 9`// 7sqJ+>reH2k x-2H: a  ^ c s y v M  , P4;"VI"AWkTNo)c+z7>MDH HLXp;wBim,9x_eC&I59/R<_ d l \ 6Fpk0v J 9  5  iE>zQo*a@## ZXm !|Ja9DJM^Q\ޤ#fm۴hoF hڸڐ<6T 5ڛK) ?ݷ-ޗ2d;JFp87"Gt@'_YgMWrNR*7{?b + k U \ ; !H`2Wk!pm+GXq(s"h_)k L!!!!f"f"!!!u!F! 9 \}H?usJ aaR'4A{u-Iai5dxw}qHN o E j  z 6 :RB"? 9);yv0 ZP>*Wcn^bP68AK6b ,b Aee4ݥې\ ٘q^^zٜڗ Nۑ?ܤ+ݟKލ$DMCAs9a+sr~kqYWRU9V?Z"u# i d S ` [&2zA)2F5"(:G?F/rg UDLG'gt 7?><Q~DJ9O5&]W;/4DCRi'7 s* s o X  4 2 j j G >  } W  ( +o:wr`0X^-?oDpmQw)p+3dHeA<~EߛxN۵$p8bm]qZ*\'-+sڸ`۵ :dܽD݁ޙ^ (hU n,jo>fo d>/Z>-uc<9Du;w^q E=N>Zm ` B  p  G $Bh|2V-|aiz:gTW0g>9)qx 'O B:vViG@([f9p-x,TU V_Ln#e b 8  D xYO%|Y glI8-[x,?dielmh ~4{TR "jRZN}Z5W߁޾ެުވkݞE޺'߰#5%1J_X7mlz- K9XDOrXa]y4U?:E`V$ K+$fD/I+>/Bgy;KY* | p  9 ux ]064=DTP`n).C?3(q~lO&jk;O*y%MwP>l[T\rnn}PeK#*a A  s x ' t!Y&w*!  0<`&ubr. ZG45 mj+>*1PRW_RTKBj$;SqgXt BRE@A;P<.EA{0xEz9yNdJdH(jClC&wpB7bL v?oD lf:! / 3 '  6 b   a  0 N IOLme5 ({RYnrzFRrow*TTAzn &Jk0FFlp*v,v{l@:;o |AA{%]9 * }  w  > ! 04l1?s1=PIO e!l0'FPw>S(c#a Y,(pTu!g/`Ss'Ezn4$%7;1"`}!+Q0&C$ %p2Nv5w(s>:a_I)@5@ Jz%X7BFm6Y8c iY(* 0  m  2iT:8_u;_{K-3()3Y8cxn"tUDNZ\e~"<htH{ d dpP = - 0 $ I ' Cl#IT]{,8xm*xu-$_1'|< Ol"cQv'p-lA{4u@yA8Fn#&$X>aWZS(xAV Ar#vwZ@IuplaO^Y)BL/RQZ  a 6 %/_m"Jx/V (>H{=  KL9-Nri) >J w#.Q?Xa = x x W 5 ? i # { $ |  B4':J h|4xH|%e-~/@Aw$-sd^zFs?""Q1I?MD;3@&ovuJ CpSG7FJK/2bvpg#F l"kckj"6I;7o4v_.;JW?HM=*1X < D #  R g%RlaFv7PKMOtT(r P3Sv0I:$?a`G 9CKWht.IE m [ O <  { . n ) 9  "79 f@W3cWr)z<"[>zH)o9 VzjY/kr{;\"dp9MW;' y$exT -CF5uY(.pTq8%~G#Y{8i\Sir Fs@k#pYL g " i ' =  X ' 1X2w~Y0f6U( ?B"$4U~QL9 #f cK$7b.yrM;L=~ * Q  -   <v .7EbhJ_A7%Iq7Lo4wAzrF\6R4za)WLPyiK\p\Jepv{h< uH%GT"J_|OFBq3s8qEiCrD##j'H)`q)s orl=FG Qi_|\1Tx[ ^  s I  g I]Se9hJ(`6m&.Bj>J-$HpiF0=MO;#S<,)!:n-8Q;yC : f ? C T b2G{i[tl}3r?5;g_uo]~:+bhoyIeLl_G7Ggz6 jcr@oU;5yV\:w-[S}u LIVX!k;9$P%ms@TgK%V>l XG_|0w X  M ?  U | E y 9}?Yp>^V`s/hL) $+QxV+q0u$K e 8  M Z  q  \ 38]`OE\ 86[DPd:]CpP$Ek|c@r`FMD "}u_Simj_JY?d%@o .m<[qRx9_Z xb/1P\T%xb^'thR[A_1] Y  5 b * i 9 } 6 L c_LivMVE, C#~meu{}nUYMG%T,eR7Z l ' b  } 8 r $ ( ImI(|tE%h _r9hhj(k*zBhm#=LyYw3G`k5O W"cO?0 ||uB l:~R4\H9{PPCiPN5 gEmH7As}]f{T;=plzY# u O H 0  ^ $|"ei925?E@]t|~}bilYi2Y2Lj Y!2e^/O PE3 t *  ` 5    } ` 9 0 L e V 8   A } K +>c#-<n_9}Bgu, t.`tW9[=Fkb` s!`Qs7 #9A4v~pH+q_< $j9`:'TO;#Df6H#d<q)n>'d=t^#x.c\9bgs$+u'C--@b4dZ&`[hN SSz # E {  g  T 6 u B L64v^Bt:k#L%@UZLEQZYL8'o;f3{X\XfM _  D ( } * * d"HPiQF:=M@*$ w=WaOVfN _ {Z8oKT }7uKZ*LQh#}+^HQkVJC" +-)@g  .4)* +497E_ F S9h1)rxeE8C:+poY ;x.tce}?$}22p T ( e $ R f K i0=x"v DW9sC ,\$Kw{gZQ@&vDv^-h7o"Lsx+ K  A U W  s / kebs){;DaK=|)t)ru)Les4:^t!YxZ}P"[;'pI!(3IIJXa1Xy7Nbjo 1^$_ Gx+f 8e2S1Tm )Hl7O~4Zu >o2usIb4 qV3:s]-|F ;o5 s  4 ]  H x  b . o 'b!R{*Rw 5eBi*SLHKKS^UR\RBeA3#pZI4[:U$v2 S T Q v & m  Lt&d)H3m@8m l@>ax9{Y0_z,rBFF3}Ix> V['OnT:$ :^_hPo Dy FL Fy&u ^$o#^H!m+|VfM hoq2Md2/EH L _2u0_ I  Q  C z  0 9 Y x $ O c l q "Eq>>:*1*$!*7<OW__CAEC;("<HK;|jOD93/   o Z >  G  ~ d J % k .  V  |N z1W,PqM r>v2t77r NbS']$^ d [n_ I Dg1\t; hHOQtcL47<@A:*0Ds9nI9Gl?x\0a1Y)X~8 C!z<=l4o&SpcG:xZ >l L4,{/  ^ p  k & | sD 2l*=Xu~kRA4,rQ<)e@#nM. | @  y =  U  k , P  z@WX pC\;)[SP n$eCtbSL=, pY8w6d1p&J QBR @=;jR43%!&0)+.-1BYo"-9Pu#Bx.|7e;(n/YyM h|(tM8i>v0 i - N  b  2 W  2 R <aq',B^fG2! `E$ y X 2 d W Y H 8  i =  ` / W  wBdZ1@ure5F7C\"z1c&zSm2NDg= gAtA v]AuR(~W1) Z=( |@rO2uy/&}'M~q=y eK'X%_ZO8 MVQ?~<7]>/~J\5  _ O E U &lG,h#A_q~ePF,s[@*vBf; | H  W $ h M .  ^ 3 ~ J  z:J\!Y\*@d;FAvS,fB\0\9 _%l/^HzRf!g6vM' qX:wH'lD,lFmJ.uQ@:ju<0 | @ & @  g +>H7^9UnldTQ/$'//+|titit}sbTHJ@&yZ@#\*_ J E  D a  ; q<xE y: b3 Q:Q;fC3aI]4}K xA`6yeM+sQC3oT<paUW_tzww/CQkw(Hl9e2f1[=m$;RVn4Eu )Gl(Z*e#8\9g/n@W0pC[D 8y;l+k W $ ^  M C @ v (a_,L]~1Oc{}tqe_ZG5 [9yCx; ] ' o  D O b & m.n7c!k,p?LbCLc9Zvcm%q&B{/b2c&~_;w?vU4|YA' r]E7-#*3.;Nmw%/=Q:c)] J.rWc$|)|]TC LZ4zSxUW7s#YGm =g ;g 2 c , o $ M t  1 : M l  7 S ` { )7GWhxiZI;<273( z V 0  s h c \ D  | W B   d  _ .  zM^2}Ot@Nk,xBh&&:ru-[$UI@DPLACu1bAgH&vqT?&   .?Mc}tr 2C[euzNq`NR!cAk1jkAx!Nvn\N!zWc8H>v6}?j2[ 5 T w # E g  9 e % W $ U 5d Lj,?L\h{c[GB?@:*fN:^( u F  R  Y  L  U T K D75Js=_>vHpCGy14S Lo.i"uOe+sDYtO}`; #&/FTi2BNPc}.;Mdt-Np:k]1NzFg"LGgV-rW*v;EK Ek-jGr.hQ O! A u  0 V y   : Z  & L j  * F [ d  %=YdtzePKE8 a G  ~ Q ) "   p G 3  y e ] )  g 5 j<a0tI\4kIv4d;Z%UU!VPbz+:.d,wBf#SL c'e'Ld]*iF/' "+=Tj&9e%aJ J5jCy5rZ/k0b'gDo'V#_%x;zQ_6aFJ/vJ g7t" P  ! ]  2 R q    * = Z o }   ' + > X t s N 3 f A  g J $ w Z ? $  H ! m=c1}4P)i*P^0{P.X/ ]( G`+~D _7ES\'xA ~DHzkPeH(iXUYWP;#.V> E 1 >  @ )[z"Df~fYRI;!xxm`K:( **'  v Z :  ^ ?  w D $ q B u S 7 xDF _zF TG^6[)i2{?}Af*V-a0m>g7pQ#N$jK_=z_=&a@lZ9," *JWn}=c?l@g'Md.8N^5Kb%@S!VW1x `0rC!r? T]L|+^(aUD~ L x 4 R e ~ + M u    ) = X {  # E ] ~ $8FTQ_l~kda_[E0 d H %  k 3 _ 6  u F m - |EQ 8-GaC#v(8Gx6BY&V&g1 R)yW(c5gD+sZC- ubTC:&(!mmblemc]Y[n@^~DuIs0PmF3]"W#Vz,_3sK"T-aD{)p;f*hLI,^9! q - p 5 {  > X . E _ p  | l _ V < '      " - / + ? R V R H G I M J I D = E F D 4 &  a F " l F #  | Y / m D  uAzL_-o1t3Az$Gkt<w/~U#O(rG0 rL,yI#j7 }@yROyS* hM9"v^F0 ':Yv(P$\KuQUFk 7a!P|Fj9i >Cj:y2m6|Bu/a*Vx(Dj~.IpLv T / f  - ^ % G o  & A ] }    } v f c [ O @ .   | \ C )  f < # h E  [ % zW%pMf({<wA9esXQ Rm0Mf.I U!S^/LvS- q\<&~slfc`]\\XUQMQKA8.* %3AQg(P%Jr C)[7d5iCk4]#]4j#RF2Z#O /Vv3oV*jR>rI T  5 f + T u  + A U f o     ! - C d s y u x z x n Z D .  j D  e 6 a 1 o 7  l@ V&}`+ fE|U&a.j2b+u-cVsJ ?^1qB HK|Z*c-k>p\H+rQ:}gYM3 "5Niz+Qf (Ls 6[~,T+e6kEwb CN^MK}-o+`4p"J>i4VR8\{Cl , L o , M o  3 D k        # + % #     h [ E 4   t f S /  a 9  oT3 `@}Y5 jX6R%T.yAS#aK K{@_sHtGn4]"yCd(\mP( }N)kWF:74+& '#'))(43;;HJan,;Um %;_z$Js ;g I{Ju4bNK"Jq=s%fIK P V"aU6ZO} ;v$Y = U s * M s  8 _ }  : U r  ! ( 7 9 @ E Q [ a b b h i c b g j [ S A ; " k V A ' z V .  s C   U & ^(`6Y$iG!yT/Y;`BdC!l;^-g,c=R(pI)]$e;T. qL"kD}mS0yn]M1  (14;HWaov~y|"5Id%Dn t2dRD S%p P#eI-{h=QO1kNCk G l . Q w  : Y x  & = N a {               l R : #  l J *  c % w G  |I m; P'lC#g>iH+|MqJ, T'wN"l?X zE\-XE vO pR,xT/a>$ |eT@7% #=Pes|-?^y>Wz#=\~ +Rn3`/]+R|5aFp&b$\H|`.o$g3yIF+c"Go * H [ z  / E X ^ j z   2 J V a m y    ' 7 I Q a q ~ n V ;   c J % W & H q>g9Yk/P}Mf7 p8 c;[3tX; lP3c6 \*Z7a%UX%xGV,ygK<$"*5;FPXcq"2G`y>Mh-Nv"R|;d.dH3r+_GL:C{#Y"S)h.V 0Y<\,T|$ K j # J r   ' ? S l  ) E R e u z n ` H < !  m P 1 k H % ^ @  ]:Y9 X-j<p4Oe+xD pGiChB$ bG#eE+nG$}Y5jE~Y="Y:xT5iE*r^D1 /B[f{ 1Jj} 5H\px&5M]r+@ZpD`,ZH|I)jMBx*q"Y E@/f2j0e2e9] @ k   ? a } ! F ^ x   & C T n ~  } j I 3  e E (  w O (  \ / i1l@z< s= qEtM/f9nE#zGT(S)Nc(o= O_,tEc@\5~fM=$vb?5  "%*.=CKQZco{'D^.Bew )Ne)Oh!F`} &Je.X*Ms+a Km"P<bJ|RQP+YNHl-Mq $ 5 = H S c r   % , 8 9 J F W _ ` t               y c S A '  j R 8  z^4e.c.kDb$~O!D|Cl6wHk@\$s;s }Qq>EHi5~W&uY:YF-#iL2{qk^]RTLJC?@?KQcasw(=P^r+D]y@g 1]*]Um ?q?p%U>h"Q 2]2S 0 P w  . ? N ] r       % ' $ $      y m ] K 6 %  w S 7  `@$uX) kD`=_9vS1r[9|YC'uiQF.r`D0wM*sF%~W(hB~V5}cA!tZ8!vW4obH1zwpnieaSOINSOVS[Xbchpz #7Nb|6VuMmCwGy WW/b0^-a$\;m?l ;g6w8e8b7`3Wo . M q  2 M p  $ @ [ x   % : @ N K U W [ ] P C 5 '  ~ Y >  d J   o D %  uR&_<_1Y+a8b7vI a;^3}M(wK&b;k9zH"g=W3pWD,}jU='wlYS@9& '1@Pdr}'7ER\hx $.=OZp)CZm3[ :_0X?u;a 7X}@h ,X}PsAc5V>hDd#E_>Sy & ? Q m u  " - C I S _ g w  s i c [ I ,  { h L 5  a;$dGuW6b8eL)pBsN*X3 `7 e5 `9wDa9lGb+mB tKc=tY<kSC0!$7K[i{ 3K]z ,Eev+D[p *Rs;^&MGvG}V&U G;r$b<i5hHv!?g+CPdr.9K[gz  5 C N X h p      * ( 0 * + # $     ~ p [ D 5   kT:( cK3  nR4rYC,iL7 _BsP+xQ8T(a9X,b@sK"iH* rU3fB! fK6!wcO9( wkWL<.   &7AT\mt (>So)Ij4W 3c 4Y~4f$_LAq ;n&YF} @r%VHqMx!FkA[{ ! 3 K [ l x    * 7 B P [ n } ~ ` P : -  \ A !  _0 vT.xT#|RxGoHqS* oJ1 yO'f?rAh@~JyHO1rK!{cK0zfTG5.%|zuuomefb_b\Z]^ikuxy| (>Sjy)F[|Ii"BnDq,^7q$Mu /Z 3Uv!Ee3Sq9Y{ -H`z5Wj#F[-Ney';Pgz  " 0 ; = L N \ ^ d l i j j i o i j h i o k g [ Q F @ 6 6 0 ,  }jcRM@2*r_T8%pY/}V/mCqBy\9pM'uP)kI'rJ }Q&rN#wEY4t@`3V5`A!dT>8*$  ,;BS]v@Wx8Wj;` RqGs.]'c :h9t9i0]Kw(Y@f&Gw@^'Km5Id%8J\n  " + : F O ] j s { w n _ T G @ / *  xfS;+gO5kX@0o]G1 zaH-zb@%hI+yL(oU+ e:wZ+ tW8vZ;oQ7xXB% qSB{iW=,vcRA4"}wnh`]ZUTII@EAFGJMFIBPO]^iq,:Tj3Wo"Jk 2Uz6]!PJzFx!Y0`.g>l5g 3X(Tv$Jj0Kb~ 4Rl  5 N _ w   - < H Q Z W ` W _ W [ [ W Z S O P E ? . "  x d S A /   kS:t^E0nO4~Y?xU-tU2^A[: b7 U'kBW"]-b7g>\9seJ4}}}}yuuokfaXVOIA<22*&   .9KXct6Wp5[v#Bl .Np"Qu 0Mw=iAa&Sp .[~6TuBf8Si4So >St.A\k %.;GT_o{     ) ) & ) '   xfJ9  gH( ]G" kE(qI#`B$sS.Y5yM)d:f:tM']2]9yX7bDjJ0w[O6,}pfaWQG@73-+#   "%+:BS[ms1Ro -Nm :e-]1h/fI V K|Ir*VzBh8Zx 2Lk4Tj5Oj'@[m$8GZm             tiVM71 n\G8%sUA%eR<)v\;kJ1nM* U5xO,yU3uW5qT:oQ2oM3}`A' jO1kWB1tmYRD;& .=P[jt9Rm4Mn-Rm4c!Js:a=d?tFn8]!?f?X~7Wt1Vp (Dd~@c9Vo 8 L _ q  w d O = +   t]G,kJ/vR8sI1aHe@(lJ2 _:fGV(V+yO%d<tL) eF& dM8 vhMD- vqaWOE?7.&    %*49HS[do|&>Ok+IVz=\q?ZzIf#Hh@h0Ol 2Ot<Z&Hq/JgCXy1Vi*AYl-?Wf  2CS_iuxyqdaQN9-xaM6! lS<!tXA0 oU2nS:vI(nE!iE~U0b9sR.xO.oG"jE$kL*aL)}lYB5xzkihhgkeiihlqs}| (@Ohu'Cc3Uu/P|Bk JgCe:]Xt#5G[k !'4>AGGKW[digghjjlhif`]XRHD91+  vibUQB?)i[G4!waD.cH.mR7z[D sV4mH)nI'pI%eG"kL"uV6tU3m`@-sfVC6%||vrqkmiiafaniolmuy!0?M_l 5Ke{/Hc3Xu2Qp(DsGo(It<["Kn4Wz,W~ Ar 0S|Fg ,Hg}(BQm}      |ibME3-tgVF4"kZC.|\K+~gO3}[>[3yP0vQ1 qK%h@}^:rV7xV5~`B, sYB*aY?7")2@FR\hw&=Rdu.Ib)Ip<] /Sv %LlFn";c"Bn$Hg2X}#?\x$J_z0I^t-7J[ey  }xph_XIH97)" }qYL1" sVE&x`; ]6{S- j?tK sFuT+jGqS={^E* rS@m\>,ugXI;*}{{ux{yzy| &2BRbq)?Ym A[y )Om#=c0Ww+Mr,Rz>_*Mv/Su+Lp2Ro5Qp 7K_w .AMZis    |o_QA4}l^G='mWD)iM3rV3xV6Y6 ~Y4uM(hJ!^?#aG$ |dI4q\K7&qfPF5#zj^RA7$}}|z~|~#KNX^eoou|z~zyonkc`[MI;3+  reQ?+ fN4nY9"tY9_J$ nP2bH)vS9sS0f:mK*uQ( W>`L,we`FF/& {vqjf]VTNKC?73/.-+0+1178;?HEMOXWcamnv|'2FVb|$<\x2Oo=\(Ol:_x'J`)D`~%<]w6Px>a~ 2U|(Gj;Sm(7MXmvwymmcbWULB@-* n_N;+kW='w`C"qY=g<${^1{V/ oS) tN*z[8eJ%qQ4yZ? |jM9" pfWK>2"  ")/8,wcK<' }mcUQA=0+-1@ETaiw %3M^u $@Zt-Hj-Tq%Or9^&Ns3] 6Qz;b6Tq8Li 5Mau$<HZly 02?DJRTZ`iru|ocXF=+" waL4 ~gJ6qU;jN4t[@!dD(dFnO*mO+qR3lP9o[G6 xgZH=,tfWK=7& }zxvpponppotqvx{ 0{]B+mR< eN2yVB#jP.z]?"hD+ eV5$wgVE4) utkjb[YSPQJLLJOGJJFQLZY^mk 1AWdx*A]x4Jl2Lo (Fe-Ni.Ie'GZ|2Lf1Nk3On7Ro*D]r  1GXp|++248>AFGILIOLLIJEH@EACA982-*! }gZJ7+ v^I0y_I.rX@! dJ.vX=iS.zY?% sO9sU?$oT:${^D& jQ5"fJ9#}rf\UJD:3/)$# "(.38;=CDGRTdet~ '7EWbx1IZn $?\u!=X{7RyAb7Wy,WsEd9\}:Yz/Mi6Lg{$/IXr *<DU_is{vn]VG9, o]I7#wkM?&|kO9" saE/ycD)}bG/iI8wU?dH0{XI(tbB+t`K:$m^N?/zmi[XHA8/-!     $$.28BKR\ks ,9K\o 2IYp2F^s-C_s/Ie;^{ *Ms"Ek=b7V|;Us.Gc}#7J_u$2?MWcmw}vk_UF;/# t^D2nS<" t]B)kQ8~dD'sV4y_;!pR1v^; uS;{cE,r\E*tZG/wiTA1"}&6@Q`y.AWe/I_w0GZt+?Xo,G^9Tm#B^~,Ld2Gm&>Xt 3M`w'1IZo!0?FX^lozzxkl\WPCA0. tfS?1 {cS:'kQ8"hL.~dH)zZ;fD&fI'vZ@ uYA$ rXC+}lZH7&yoa[MD:-) &1BQjz 2M^xY$Ea<Vu4Oe*=P]t|    }qiZVHA.% u^O9(udJ9#kV>*nV8 |dA- y\C* pV<%eM5t^D*iX@(p[N5(p`N:3zvhf\UPIG>>=:@8:?C?D@ACDFMNUYalm{{%-BQ`n+@[p2Qi2Tl'Ee0Ik}.Hf $AWr %BYs,C_r $=Si/L`{&5M[r ),4;BCMIXU]YYXSVLLFA=30&  ucS=, pfL8 |dK6jH-sY8dF) zW>mG-uX8jM6yUD'oYD4ydR;)zkZUA=)#!.ITYfjmqosruuutrmllgh^XVHKA@21&% qfVL82uaWC6( laL?'w_K4 |gL8eB+{^@#sS8sXA"y_E-q[A-|hWB0 {g\M?6(! +6EVar 5I_r)E\t)Ja9Uy>_6b;] 6Pu<^z0Wn6Ul3H`p+3DM[hr}{kbSD4%qhKA%n[I7!qbK>'hY?/ vaL5p\B.{dK+jK2qV<mTA"t\Q;2~{nleaWUMHB981/$$  $0;ES`n'@Rd|4F`xJ^kz  -9ALR`dtvvniXXD9+xbO6 ygF2lT4}`B& {]C# }eD/ lO6qR9u[@#q`D1v]I4 seUF9( }upgf^YXKSDMCGDDEEFIKMSQW[\cjmty '(AD\eu 5Lf| "B_&Gk;_9X}=]x*Ha}-KZw.<Q^q&9FVfp)2AIV^jr~zsi]SH91#uhVK81}jTA, o[:&z[G)x\G)kT<&tZM1!saM='qZB-n\A,taS8/ omYYID=1-$  (,5:EEXYlp 1@Yh{ %5Re-Jc'Be9Vt-No+Jn'Cb2Ri#BWr 5P_z /@Vc| (=FWeq     raQE0&sbD5q^D1nS@ gS4!eN2oT;"kW=(ybQ:%tcO7+s^Q;.o`RF6*}ri]WHC;0-! %3=GX`t~!7FXhz 8Kbz6Fau3G`u1Jd|&@Yt 'AUs  <Sj1Fbz /@Ug|!4<OXju +2>CLRWZ`clkrqvwuzwyyuwvqolkedXULB>5/* nbUA9"yiQ;# mL:cJ)dO.~cA%oT4fI-bF,vXD$yfI5pcOC, ysecXRODD;751/,+'(&)'-/064?DMU\fkz#2EVh}'AWp2Md5Jf{*G\x 7Nb{0Jby.H]v+>Uj!6Oav'>O_t} %3BIW_jqxtvnmif]XVMKC==00% {m]UA9)m]I6! }gN:fS<# }aM3s`D/r`H3iY=(pZD-qYH.nhSD=% |~yyvvvuxv~|/>NYmx1D^p0<_q!@Qt +Bcy 8Rv6On,Kd %AZw/Ee{0I_y-=Ncr(-4=>HHQSTXWZ[_\]XXXPUKLDA62/%% ~qdVI=,"xiYK9+oaK8  pSD)nP7w\>%dK,udB.v_J6 |jZF7#}ud[M@7'|uhdYSNJE@93-%&"!%'/136:BIMX\gp| (:EWaw ->Net%5Qaw(;Vh.JYy)BUm*AYq'?^n*?Si{/:Q^o~)5=KN]^mp|xvlic]WRIE;2( ziVH0% {]K,yaC) y_@%sU:jP1mK4{`H)q^B-~lUG. ~naSI;4'    -5FP]p{ 4G[p'E[q#CXv (>\s *@\t %?Ts4Ne &;Ti%;N`u .<NZiw!*49EHRV\gdrkzs}z|~{~}yyuwongd_ZVQMFB;4/%# ylhXSF>2(vdXC;(~p[J6"jU='mR:! w`H/vaJ7qZJ8%ufVC3$|p\L>* |yd]OE:.%)2AG[cs 2FZp 4Lex $=Vo $>Rs%Ldr%9AQXhp~vo_WF=- iZD1 y_M2jR@"jU;% ygD7oY@'jR<%pVG+vlOG, |sdXM<6)!  #,5>IQ\hr~0?J`i 0?Xe&=Mkv $7Obx,;Yh4Jdy$?Vp 0Q^{&<Lcp$/9DKV[fjux|~rphb[SOEB5/' {ldRI8* |hYD5lV?(cN5oO;p`A/kU=%mQ=# kY>+m[G3wgcQHB3/"  $,2;AHPY`lt}4;L[f|4AWg}"9Kav2Gax ';\l"9Xq &<\r (>Vl  8Lat (5ASZkp !)*/266>9DAGFIHJJHFGDE>C8>352,,#$vtf_QJ86" wkYG7#r_F4fP9$ ycJ3v]F0t`E3rbM9'naRD6(xlbZLH95%#  (2=DTYgt|%Wn&>Um2@Vg{#0=HT^kt ")+43>?DHKLSSYZ``dbffhfgf`e[^VWPNFC>5/% {lZG7#zfO5  weE4vPB(t`H3veK>%o[G3 yhOB&x`W:/ qaWE:*~upje`\YVUURSQTSZT]Z^cfkps})3CQ\py,DMgt7Gap2A]n 7H`v$8Mex+;Sg{%;Kfv.@Uh{ +8IUio#$1/<=CHHOQRWUZXZXXWSWNPKHFB>:8/0*%!xmdRO:0$ pbO<+rZH0zgN7"}cO7! s]J2 nbJ;(sdSF2'vk\J?(! zpaVF;.! (+7CJYbk{&3AN]k{(8M\q 6Kbv5Hb{,Jc}3Nd.:`j 5G\r (6DQbiz  ",&306=:BCDGFJJHMDJEDCB><:34,*&sh^L@4#m^N>, xjVC1 mYF1 raF3oTA'}dR:&rWK1# ygVH4%yj_TI=4) '1?HUcpu /664*0$" ~ncVF9* yiUB.wcI9! scI7  gX?0m[F4~rXF3 t_O=&~u^TE3&tk`ZHH44$ "$18>NNdaxz#2AR`r;D`n0H^s)BUp)E\s)LYx-@Zm$5IWn{ $5?MYbq{      tmdYPE>0'{kYP51u]S9,jXE-vdM;!vaJ4t]I4 }jWC2 xnYL7* xr`YKB6-$  "(/6=EIUZhj{| %*@JYgv#7F^l%:Ody,?[o'@Vq(?Wl1A[k 0@Tcw&5<NTdkz #!!#!! ri[QA4( j\M7*zlTI1& ~lZH5$ xdQ?+mZK2%~p\K9'rbS=3|k]M=1xpd\RG@41%!  (04@FQXals)9GVgs!7I[q/I_u6Re0Nc-A^r";Ifq ,CMdm "#:=PWaow&&++10356592614..((# yj]S>7#saN?+t`Q:,u\M:&weQC. r[O7*v^P9(pZK5$q_P?1vk`WQ@D.4!! "(,7;EJWZjoz $+9FS_q| &7H[j~'BPjy'9Qc}'?Vh.>]f1GWm{ ,>I^g{ '2>IU^lopn\XFA1*ulXJ>+ vlRK/&t]P9*v]R9*~eS?*pYG.v]K6!q`M=, sk\RH:4)  &-:( qfSF7%ocNE/(~r_R>3{dVA2 zbU<,s]M;%wgWM;1# {vngcYXMOEE=;58*3(+%%#"! ! #$&&,+328:?GGTQa`mpx(6FR_s{ /BTiz%@Sj '?Uq7Id} <Mg{*>Rfy1APdo $-8BIU[fjtx~wpfdUQF>4(  peSB4!~mXD0rfF;vaN7' pXG1 w^O:'xeWE6$qjXP@7*! wupnihbd\_Y\YYYY[\\`]dchljspzz $07?MQaex{ ->N_o->Uj~,FVt 6I^t*<Pcv%8BZay#.?GYcs{$/6BISYckq|{ykf_UME;2+ ~rcXF>, sfRD2!s^K:&{nSI/! u_R7+~jZG3!|nZK9&qfQE5&yl`XID8.(  +3=ER\is!2ATev $4K]s0G[t :Hbw%>Qh'<Neu ,?Lal,7@LY`rv!*18BEQU^`mjwz}{yml`_QNA<0+vi]M?/wfTK2* zn\O>.!ocOA/!veOC+ ~pYM7&taVE7*~si]TF=4$! ~}tqkhda]\Y[RWPTTQUSVUYZ\`bgipsw*4EN]jz'2GVhy /@Ui} !3LYv*>Th{!7Jbt'<O_v'6GYe|*-=FM]^or|yneZPG:/# }k_M?- xbV?/ }jYF5!~iXD2! zbU>-kXE3 t_R9- tiVL;.%zvrmlgcba\a\`Z]\]\]`^edfljrpzt  )3AHWbl5=[a{ #4JYs!0EWl}!2CUev$5BTas$2AM_jy ";=QXgs!"+.3;;AAGINOOUQZT[V\XYXWTUPMNGF@A79/,*  {sg`SM=5(|t^U@5"|lYK3){lSF-mZC2 oYH4! tfQA. paND/$yte_TLE;31"(  !$+12<@FPS\ejx|.8LSkq#7H]p-BVq 9Ne{/E[r(=Paw!-BIbf|(4?JV`jt#$14=BINU[^eiispvxzz|||||w|svroiic_^UQLDA:1,#{ug[O@6& yj]P>5!~vcUG6&vkUH5&ugUE/& yjZH:) }m`TG9." wqe^YLJ=80(" &19CQXfqz):DZcy 1FUjz+AUk~#=Ndy 0EVm~&9D^f|,6GP`iw "(36@FIUV`dkmxw{|{vrmi__RPD?3."ul\OA3%|oZQ90s_N<+qZL6!p\I4$ s^M8&nZK6*|qbTI;/" |zz{yzy{{||%.:DOXfq~%1DObq,7MZq~ /BSev!0@R^r~"2@M\iv$2;HS^lu +0=CNV^kn}!#%&)'+)))&&&!!yngWRB8.wlUM8-xnVO6-o\K='n^L9(}hZG6%~k_L>/}pcXM?7)#xxnngf`a\\U[SWSUUVVZY_]chhqrz"1Q_p!*;FS_iz #,-58;@CELHTLUQUTTRRSOMMHIAB==43+(" ~wk^VF@4$ vmZSA5* zj^M?0!}o_O@2wjWM9. |f^KB.%zj_QB6*~xhgWUIA:1,#!  "(,68@ELSZ`gnx|  &6>LWapz+8IThr!,CJcn'6HXg~(:H^j *>P_s$1EMbj}"+3;@JLUV`agjmmun|s{x{y{vvwqrniidc\\TRLEB84+*  }ue^ME7) zk]L;, |oYH8#wdO?'xdT:,}iWD2 lbM?1{qgYTDA2-#  ,-8@JP\bou &4CK\ft!1AK`h{&8HXi{'4KVlz(8HVix.;GW`oz %,7<DNQ^aimyw}wolg^ZPQBB62+"ymaTH:.!paOA- {jVE5{gRD, ~n]I<( thZL>5$ woe]VKE>21""#)68HLYely-8JXfx&3I[m2EZn';Ndv*BSf{ *AK_m~ ")3AHU_fvt    }vi`SK=4(pfSG:) ~r^P=1 ydVD/% tbO@* wj[J>* |nd\LG;3'# }wtqmngfaa]\ZWWUSSQPNOLLMLOKRLUMVSVW\\]cbilpvw  .7DO[js49OUju"0>NYlx +8KXix)=L^m~ .>P^n{ $/;GR_gr} ' '+,10247575966604-.,'(   uk\UC<* ujTF2$p\L8&~rZM6)xgTG3$}q[O<0teWK71sp`\OI?7/(  "(06?EMV]fo{ %5@O_k} (:G]h~(>Lao';JYix %7BN_gw+5ALXbmw &+79FGQWZgdrn|z{{sskgd[YQMG@>21($  zwfbRJ>0' ukUK7*zqZJ;"thRD2 }n`N@2$ |qcVIPbw 2GZl~ /9P`s1<O]mz)1AGW^it}   {rj\WG@5)! yl]SA;' yd\J<. ~p]Q>3vgVI:'tgWI<,"zmeYQF>2. }{wrpnigd``]\VZQWRRSRQSRTUWXX^]cefoosz|  07CNZepy )8FQ`n}.2!|p^PA,"}h[H6'{gXF6%xhVG8&~xc\K@2&ysoddZWQLICA<661.,*%+&#""!%"&)(024:<>EINSY^bjqt*0AHY`sz.6IXfx +:K[k| /COcr1?Lakz %4AK]es %+3:?GNRY]fgoqw||zxrpjfdY]LQCA;0.$ {tb]MC6+vk[NC0) xr^V@8#xq]TC6'tgWM=/$ {saZN@:)$|yrniba[XVNPJIGDC>A=>==<>:?<@?@DBIIJPNWW\adhqo|z '1@HXaq{ -@Oas'3JZk"6GYk| .8PXp{ %3?NZhw)1;HJ\\lp|}xsbeQRA>/) ~vf\OA8( }xbXG:) vcXB;#sdQI3,yebLH4+}nf^OJ@21 ~{wtqqiiedc^`[]\\\Z_]`_affjmosvz#/7@LRcix,;IXdt&8BV`u+;J^h}-9GV`tx&2=LRfjz#-4>EMU^cnp{xufgUSF?6)%skZPA5$xr\RA4$ugVJ8-}h\M;/!piTL9/ yjdRK>3*! zxold]]QTKJG@A<;88471636666:9A8$ scVH7, kcPC6% phZMB7,! }uqlh`]WVULOIJGGBGACG?J@LDOKPTU\]dflrt} (1=EQ^bsw(6@OZir'4BP^p|%4CUes%;HZkx$->KVfr| &07@GPV\ggrt}{tqgdYTLC?1/#zmcYIC0*xf\L@2#rgSG7&~i`J>,oiQG8){mgZNG:1)'.6?JP\fq|!.BINSU[`_icnhrmsoupwnsnonjife`]ZVQQHH>@54,'"zoj\VJB70 ~qgYQC9+" {mcOG4' vgYH:* jcOE7)wqdYSDA4+% yuzxsyrvrurwxw{z%/7GLXgm{ %:AT\m{$2BN_jz*<GZgv &5CPbi*2@JVbnw"'-269@ADIIOOSRWT\S^T_V]V[XWXUURSNPKJGBA=78/-)# wof[UDD2.  xmcVL@3*yr_WE;.yk`OB4' yobTE:(!{qf\SKA9/)  '&49BKS]fn{ %.@IXds &3BMbi| .;IVcp$/=GTbmz !/8EM\do{ ('058?AFHOPTUY[]_^baacbcc`c_b\\XVUPQHK@D9<23)*!ypf[SG>3(|r`VF:,lbOB3#viXL=0#xp_XFA/+}rl_YMJ;8-'   )/:@MR_fsx*8DV^r{ 4?Q^q~ ,6JTet#-<ET_ku')9:LJZ^fsw #%$$&($)$%&$$##!  {ukh\VPB@3/& xlaXI@4(skTO:2}i`OC6' ~qd[IE2. vqdaRQD?7.'#   '.8KZet .6AKW`kv (*038<@BGHNOSRXTZW\Z]]Y^YZ[TWRQOKIDB;;4/,'! xnb\LF90# ~tfXN@4% |k`QE5)~rcZK?3'vmcYND:/) }toj`_URKF@=53,+#$   $,07PSdjx #)8BNYfr}"/;JTcp|09ITdq{ $+9CQXfoz %&,.4398==@?@@B?A=@:=5;04-,)&! wpi_VOA>/*|rdZM@4' |p_UE8+|r`ZDA,& {th_UJ?7,%zzloaaXUNLFB?975-1)*$$"" #!)#,+/147==DGKPTY_agnsz} (.9BHV[foz#-7FLYdk|'3<KQch{ !+:?PTdkx$.2=@JQV^fgrvy}wwhj_YUKH>62%"xj_RC9' qcRD4't`YC:) ~ug]OI84! vvih_XQLE@920*#"  (&26=BKOW_dps~)5@IW`lw-:GT`p{)9DU`m}),=GPbiu#&44DDRT^dfsu}xwkic]VQLB@42)!~um`XMB;.${meXOC;,# }pf]QHA3/ |sjeXRK@<2,$ zqqfd_XXNMFE@;:35-+*&$"""$'*-178>AHMRXabnrw$29GO[in)2BIXcm{.8FP`jv"0<DW\kx#,7>MN^amvz    }ujbZOF<2&wl\QA7' zl_OC6( ui[OF7/|og]RIA42! tsohg_^YUQOKKHDE@@==;;::9:7;7>9>GIRV^biksx{~{}yutlkfb^YTQKG>;50)&  ~to`ZME92" qg^MH6+}qbYJA.' qj]QH<0)ysjc[ULG>:11(%   #!+-3;:JDTS_ajov~ !*3>FR\erz-6HNbhz %3BK\gv!,9EP]gw!(27AGOY[efpr~|yrtlhd^XTOHD:9/+"  {oi[XLD81& {oe[PF:3"! {md\PJ?8-% wnibZWIJ=92+${xxusqqologmhldldjhikkmmospvuz{ )+85(~tjaZMH<5.! {ytqomijcgab_`_^^_\^\_]`\bcahdkmmrsty{}!(26@FMX\gmu  *7>IQ_gr{ "'5>JRcfy{ )6>JQ\dox %".,55>=DHFPOTVV][``bdheklirjrorqsqrrqsrprqpqlpmlngmfffab^]\VVRPNHDB=;4..$&~sk^YKE:4%" ykcXIC5,#vpb[NG94#! ~xicWQD:0&  vqmcb[VROKFD;?756.1*-(+((((&,&-*,.2177;?AFKKQRZ\ahjsv}$,8?LS_ht{'5>MXer "8>NZev 06HO[hn} "'.6<CFQQ^\ehmpyv~{yqphf_\VNNA?91,$ wpdZQD>.) |ugaSK?5, |sjbYOH=8.'~~rrib`WRMHA9:.*&  %,29@GOT`art}+3@JUbkz -8EQ]ix %0<CSXgl|"%.4=@JMUZbekqv|yuogd\UOIA;2-! mg]PF9-%ulZWB@*({qb]ME:,% ura^PI@7/$!zyspneh^dX^WUXOTPQSORQSSXT[Y\a^fcinosvz{&22DCSVcgtz &-7BHV[hnz '-;AOVciw}")1?APV^inx")(22:>AFHNPTVZZe\kcljlqnrsswsxtxvwvuvsrppmmiffd__[WUQMJDA>78+.$! xng^WMF;8'' uqb`OL>8-% uobZNF:/%zre_VKB;.({usmned`^[XVTSPPMOJPKLKKJPJQNSSWX^^bdglosw{ %*5?FRUfjt !)5BNXeq|!*9GPah{ $.<@SXfny""1->;HJOVXachkrtyz}{}vwqoigd]\TRNHD>;6.,#  vtecUPG;7(&wmdYSE=2) wnb\NH:3+ ~tle_TPGC83*&  #%/18?DLMW]bko|~$1:EN]brx#68JR_iv !(1=AQPcdrw  "!,+65?>FHOQVX^]fdiklpqutyyz}|}~}|y~xxwouilde]]USPID@;52&&  upc]OL;7)#}pkYYE@1'ymbZMF8-$}ulbZOH>6-$ }ywqukphjegdcd`c_a`aacbeehhklpruyy $-1=CLU_fqx",6ANUdmx'4;HQ]go{ $*5;ELO[`fqs}  !('.1299>@AGELKNRPUSUYW[YZ^Y]Z[ZXZVWRSMPHIDC=>55-."$ytjc^QMC<3+" vniZYJE;5(% ~vke[RKA92'$sob\THF84*% ||wzsvsrrrososrssuwu}z %)3:DJU[dnw~ ".4GKZdrz/6CPXil$25FGW\eqw&(008;BCIKQSV\\dcgijrmwqys}u~w{y{{y{vytvsqonjhed_[XRQKGC>65-)% |uld`QPC<4-# {pi_XMH:5(!xlfXOI98%#zqk^]OIE68('  %*/99BFNRWaanry !*3:ELV_fqv %.8BMVchv  #,8AGUXenv   %),138><CEHMLRQXS[X]]\_`_bb^bb_ca]`Z^XZVTVMRIHG?@:93.-%$ }zogbUQG<:** srabOL>80% ql_WID52  ~ulc[QKB94'%   .,<>INW_gn{|"07DMXdmx'->CPZcnz   )54FFRW_glu|  %$'(*-.012273985:58875745412-1*/&+"'! }tqedXSJF89*& yri_VLD73% woe]SMA:2'#ypkb\WNIB<62'' !+*67>EIRT^bksy).7GIYaiw (6@IT_ht} (0:?KP\ahux  ""**015::?@CFFKJNMPPRPTMVORPQONOKNEJBD@>:8510*(& xwkd_SOD?41%"|xmd[OH<4+ }pj\VKB71% }zmk_^TNIA<51,%#   ),3;=FJOZ]elq{ -,<@MS\gl{ ),>@OUajr}"'25AFNT]bjpw~ &"*&+*0+6.6193955:5660512-/*+)&#! yume_VPHA91)! |{le]PL;:*% yqi^SO==,( vpm``VSJE>:30($   %,2:=IKZXgjt} )2=CRVgjz~ %/9BIV[env ")/9<HKSZcdrq~~  ""&$*%,)*)/(.)++)**(('$%"!   ysmeZWJG;7() wph]TKA80$ vtaaRNA>/*" }tsed_VSLGB;:11&'  &&.36<@FKSS_`gnsy$)6:FNWagry (*;>HQXbitw $+3:BERR_disw !$' )#*#)%&%%$#%! wygl^\ULJ@<4,' |yjhYWHF72* {ykg]QM@:0(yqma`WQHF<90/$%  '+29;DGPUYcfpvy '.7BFTWcks|!%29AKR\clr|$+18ABPO_^hmsy      wwkhb[RPE@:1-" xpi^VNC=2(#undZQJ?9/(|von`fYZTMMDD<=631++%$"    &$*)1089;AFGRN[Zbdkrr{ #&77CKQ^bqu %/6AJR\cow  ',4<DIQW`dkqw}  xqkdaVSIG=8/)!~xmfZTHA8-' xqe_ULC<0, zwplf`[WPMGD>:720*($$   #!)(/55>=DJORY\cinty!*0<@MR[ckvy $,3?COS_cps()45?@IOOZZcejlvw}yxplf^ZRND@63)#vpg]YNH?71&! vsjc[UNG?:0-$ xsohc_[TPMDF:=34++%%    $'./68@AJLRW]bjmwz $06?HRWdhu{ *0:DKR\cnt| !'05<EHTSabnoyz{{ondaXTMG@93)%vph`YOK>;1'# xvle`URKC>60*$ ~xuoqbi]^YSSNJJDD>=;;582401,-)-(+%)''(&'*&+(/'1..324889?72($ {yqihXYNIE88.)" xowgobfZ^UTNMFI@B<:652/+,*%("% !%'%%,(1/479=?DJHTPY^_gjnvw $/5=IKZ]jn{ "'5;GMZbku %)56ECQS]binv{wumga\SPJA>20)  vpcbUPH=90'! |tne^XPGC:4*&|}vtsmlhfcb]`Y[VVSUMUMRKPJQHQGRHQHQIPLOOORQSUTXWZ[\a_e`iflnorsxxz}  '(46;DENQ[_fivu  &+4;AJOW_flv|$)34>CKOV]^hjqt{~||orfb^UPLC>8/*#vwgdYQK@:0'"xuhcZON?<3+&wspgg^]WSMMEC<<724*/%)%%#*'.-3299>?DIIRPV\`bjlpzv !#23@EPTafox"(.;@GRX_kly}  ().5;=BHIQPYZa`ggnqsuzx}~yxusmofgb^]UXNPJDC<;51-(&vvgkZ^LQ>@6/*" zumgbXWKM>@21(# ~xurpijbe]`XZTSPMILHCI>E>@><>9=98=9;::9=;;A:E?DAGFKJNMSTU]X``ejjrryx +.8@CQR`crr)09CIR\`os})*3<@GMS\_hhvt|xtii^ZULI><2.' vni`XSHD:3-"vqheYXLHA:3-&# yzrvkpgicd_c[\[V\QWRTQQMQMPLNPKTLQQPTRTUWW]\^^bcekiposvw~|!()73B?KLQZ^dinu{ %)18=CMO[`flvy#&..9:=FGOPUY\cdjjsqxz}wysnmed^]QWFN>B960+&!vpicZQNA?3-'|tjeVUIB:0*! xrrdf^ZUPLID?=862.++%%$""!%%*+/247>>BIESOYXb`kjsu|=HNW`gnz~!'28BKQZbis{!(*24<>CHLPVUa^edmkspxv{{~yztwprlkhecbZ^UTRLLGCB<;610+'& {vtid^XSKF?74)' uqkb`TUFH=:3-&! }zywttotkpihifbf`b`^_^^[\[\Z\Y[ZY[\Z\[\]_\```cceihlmrrtxx}~ '-4?ANS\elu| &07AJO]_kuw &*1:<FIOX[bglqyy~uvlhdYZOMC<80*#~}nlc[UIH:;), {|omb^YPMD>72,$# w|stpjodkad``]^Y[YVWUSWOWPTRRUSVSYT[W\\_^abhekinqsuzw~&,0:=FNS[agpt~#-.7=AGON^[ehosz~ "%**33<>?HGRPW[\ddknpww}}|zxtpmgeb\ZRPLFD<;22)$"|rleaVPHA:3*$}qme[XLI@:/.  ~vvkqaf][XUNNHIAD;>:957/7,1.,/)0*-.+-.-002374<9?=DBJJMSQY]`cgmpu}x #'/6BJLTV_celqt|{~|wtnhf]\SPIG;=/0%#}smc^UOF>70' xpkb\SMEA82($}u|svoroknhjghdfcbe`e`c`bcbdbfeighikmnprryt{x $(+94EAMQY]fjrw()36>AKMVY`girv|&!+*12::?BFIMNUTZZ`acfgmhulvtwzxz}{}}~y}wzsurpmnhkdd_bY\TUPOIFD?<:33++#" xrjg]YPKC=5.)  vxki^[QMD?82+% ~~uyprljhbe]_[YXVVSRPONNNMMLNLNKOLNNPPRTSWWX\[a_fckjortw| )+5;DHUXbhoz}!'-8;FKR[`irt  !#,*75?AGLPUW_aghopuxz|zxrtjmdd]]TVPKIC>=650)) ! ||oqceXWNKD;8/*% vtjf`[SQFI:=10)' &'/49?BHNPZZddpoz{ &*.9;DILXVebqrx  ))44=<FFNQWY_bfkmsvx~}|{sumjga`XUPLGB>64.*! vvhfZSOD?8-*wukd^XNKA:6/(& }~zxxtttsrpoqmommlmjnklklokpnqqtqwszy|} $'13;BFNUWecorz '*34@?JOS[`fjrvy   &&-+4088<?=EDGILLPPSRWVV]W]Z\`\b]babac`caaba``b^`]_]^Z\ZYXXUVRSQOOKKIFEB@A;<7704+-'&#  yvlkb]XOOBB64+( vpma_UPLB?53*' ~}ywwqumqoioelehfgcgbhechdhghjkknnqtsvvy{)-3=@LOU^bipu}%'00<<?JFRRY[`deloqwx{{{uuqkmfe^_TYKRDH=>940+%$yrpdcXVNHB:8,+! ~utji_`SUJJD=:60+'    ''229;BFNPXZbempw{  &.0;;EISRa\nkvw #&)0179=@DEKLQQWU][b`ebjfmjomoqrsrurvvuvvxvysyxvwtssrnsnnmjjkdk`ea_\]TZQTONJICC=<670.+$&  |voiaZRMD?61&! zvmi_^QSDE8:+.!~}}~ "'-18=AINTZ_cjqu~~ -+:9BHOT[^glqw}  #%(.+427;9?=CEEKILOPQQUQXXV\W]Z]^]_^_`a__`^b\`_[_Y^X[VZSVTPUMPNJJGG@F:C5=340/(-' z{plgaZUNI@=32'% xwlpadZYRNICC:80/*$#  !'-29JNT[`ijuw  %!++148=<EDINNSTYYa_ceekjnpqttwwx{y~z~~~}{{xyvwsqoogmdfbcZ^TTRMIH@@;71/*& }{qlf^]OPCB;12%$ wuolfb_XVPLKBD::21,(&!!   #,(72?BHOQ[^cmkyw #$'+,/356<8A=CDDKHKOOPRRTUWV[V]X^Z_[`\_^]_[^aY]ZY\XXVWSUPQPLOGKDEA?<;751.-()# ~vqje\]NNC?83-% }ytmlb`[UOMFD=:60.'%#  ''./79?AJKQT[^egmrw|')28=DIPU]`insz}  $#))./4497?;B>FBIHIMKOMQPRRURYSWWU[SZUYUXUWRVQSPPOOKMGIFBD>><9862/.*("&! |vrnfd_WWMLCA:7/*%#{usij``YVMPBG=:63+)$!  $",-399CBLLSVZbbnlvx|  *,3;@ENOV`aklux $#+)/185=;C@GFKMMPPVRXWZX`Wc[b^c_bdbcdccbac`a]`]^\ZYWYQUPNLLFFC<@99500*)$   vtlgbZUPID>75,'"}zwlmca]URKJB?:61.&'  & -*36:>FDNOT\^bjjsu| !)-37>@JLRY[cfkrt|  "!%&)+-.2/8389:<<>>@@?D@FBDBGDEEDDEBFBCC@D>A=>=:<878221+-)%)" zvpldc[VOOCA;51*%  }xsoge_ZTOLDC:84++#!  #&+05:?BJMUW`biosz~ ""0-;;GJRTaajov{  ("0&5,5388<<@>D=IBJEILJJMIPIPJPIPILLIKJGFHDD@B>@9<8550.,))#%  {vsniecY[QOLDF;;26)+# |wtohgb[[NSGHC:;4/.&&  #%)*32::@DHNPSX]`ejnuv~  '-2:>DLOX[cglvv  '$+,.366<;A@CGFJNMPSNXQXVW[X]Z^[][`Y`Z^^[\ZZXXWTUQPPNKIHDD==<762..)(! tolc`ZSRGC=73,&  }xsmhc_WVLNBC;75++%   "&(2,;6@CFMNXVbbjnsx|  %'51??IKVSc`ipqy}    !#%##&#%%&$'&(&(%'&&'$'#))!%""""   z}stkib`ZUOLEA=56(*"z{onfa`SWKKE>:8-1"'   !()34=ADGEKHOJPNPQPTQURUQVRURTPRPPOOKPFLFEE?@<<8813,,*$$  }xtnhc^WVIL=@42+$"vrmeb]WNNG?>54,'&%#*,35:?BIMPV\]fgprw~ !$)03;>BHMRU]`ejmvv|  &&$$(&()'+&**&-$.$))&)&(&%$!%!   }{vsqied[]RQLHE<<50/%% |tsjhcZZQPICA:84).& !')22:;FFLPS]_ekovy!$/1:>EISU]bgns|} "!()-.61;8<?@DDIIKMMPPPTRUUVVXWVYUZUWUXRYPVOSNPKLLGHDBA<<98500*,$& |ztoif_]RRJG@=35'("|xrqkdb\[VPNII>D6>/5*,'##  $&'/-75<;EEJNQT^Zgckqry| "'*12;:DBNKTV[bdfonvw| !#$)(+,-0-424667;9;;<<<<<;?;=<;<:<98949232.-.(+%&# ~vslfcZVQIF>93-&${xsii`ZWNLC@:4/*&  $&*.59DFNRS\_eiotw"&+47=CEOOY^`jjrv|  !%$**//332989<><C;F@ECDFCGFFHDFGCFDBCA??>;<97565/0)+&&!!  |stjj^_USLGC<70-$"xyrmhg]^XRPKGE?<750.+&$   !!"''*0.64<;@BFHNLXP^Yg`lhnrwz} #&'016:;FALLQT[Zaegmprx{~         ~swmlec\YRPJGB:83-+# |uqmgd]YVLLBC;82-,"$  %$.+57;ADIOQYYaehprx} %&.15<>FHORW\aejmrwz            xzrqnhhacZZUSNMDF?<;43,.$& yxuqmkfdb\\XUQOJLEAB=<855/0(.$( "      "$&(+.2287>?AGGOLVT\[adgnmuw{ %(-46=BEPLXX`egnrv}}   %%"#'$''&)')&)(')&(&%'!&!!!   yvolib_WTMKC?;23(&  }zrrkhg^^ZTTNKJBCA:;441-.')$#"      " %#((+,.0267;:>?CEHHPLSSWZ^_`iemmqtw~{ ("-+259<?CHLMTR[[_dfhoqvu{}~zuvkoef_\WUOLHCB8:20+&!}uvnngg`_XXRQMHHAA9:520**%$!   !"(*,22:9BAGLKWQ^]cijpuv  "%--27<=FENOSXZ`ahjnrs{yz|rsmjha`ZZQQJHF=?752.)'! |{zrwnpmjghbc_`YYWUTOPLNHKCIAD@?=<;98582501/0-/+-*,'+&+$*#)$(#&#%$$%$%%%'$(%(('+-).*0.005174;7=;>ABBHFKJNPRUV[[`^edilktpyv~~ #&+-37;?DILQTZ\aeimpww~zyrrkiea]YURLKDD<951-($! {wvpnjiac[[USPLLFGA??9;543+2'/&&&"$! #!$$&((+-,20457:9@;E@HFKLMSPYT^Zb`gdlkoqtxy~$%)-,71<:?CCIJNPUWY]`ahflnprvw||{{ttpojiea`ZYUQPGIC@>862-,&& ~{wwpnnfl`f]^[WVRRNLJHDD?A<<:7934200-,,)*$)$%$$ $"!"$!#%%'&,'-+-1/3458;;?@BEFJKQPTWY]_afgnlrtx}  $*+238;@DGLNTT[]`fenkurzy~~yvupnkhcc]\XUQOLGF@@9:13++' $ |z{uvsorkogjfecaa_\][XVXSTROPLMLKHIGGFEBDACAA>@?=?:?:@>=@=C@BC@HCGHGLKLONRPUVVY\Z__bdghklnqstyy} !''-0169<@CFJMOTU\Za_ggloqsyw}{{vtpokhe`][VUONJGA@::31.*'& {wvrqljheb`\\XVSRONKKFHCD@>>;=6:3643201///,/+-*-*+,*.*-+-,.--0/01226476;7=<>@ABEFIKNNNTSWYY^^bdgilmtryv~~   &(*.0559>>DDGLLQRXV]\ccfiknorwv|z~zywtsnnhibd_]ZXSTMNJFDA?;:530.)+$# }}x{tvorjmghdca^]\YZTXSSSNOLLJJFHEFBEACA?C<;?;?<><@=@@@@C@EDCGEHHJJMKPORSSWWY\]_acegjkoptuzy !!+'1048;@BFHLNUSY[]aefjmnsuw|{}|xvsprjjh`g[_XXSRNLIFC?>;8500)+%"! |yywstoomkiigbf^c\^\ZZVWUUTRPROPNNMMLLLLJLLILKJMHNKMKMMMOOPQQSUSWTZX[Z\^__c`gciglknpprtvwz|{} ""%)+-145:<=CBHHNMTTU]Y`acfiipntuu|z~{|vwsppklhfd_`Z[VURPLJHEC?>;8713*-'%$  |zyvtsnokjhgebc^_][ZYWXTTSRPOONNKLKKIJIIGIHHHHHFIFJGJIJILKMNNNPPRSTUXVZZ\^``cdehimmoqsuyw~~ !!%)+0147;;BAGIKNOTVX][c`ggjloqsww{{~z~w{uuqrmmjieg^dZ_XYSSQNNHGECA>:;550..'(%!!~||yywutqroommkkihhfgeecebc`c`bb^a_^b]a^`^`^`_a_a`b`c`dcceedhclemgmjnmoqouqvvv{x|}~ ##(+,3186?;DAIILORSXW]]bcehjmmqrvvx{}~}{yxutqomjigcd]_YZTUPOLJEF@A=9833..)'$! }{|wxussqoqjohnekggegcdbbbaa_b^a^__]_^]`]_^^`_```baccdeeehghkimlmpmtpvtvyw}z  "%'*,/1368:<=BBEHHLMNSSVWZZ^^bcffijloorrvtzv|z~~~}z{vxstrpnljleeca_\ZYWSRQKPGHFAC>=:8532/-+''#! }}|y{vvurtormolmkijhghffecdcbebbcacbbcbcbdccfbhdggfjgljkmonpprsvszv{z~}  %#**//347;;@@BFFKJNQPUVYZ\__ebhfkkonqtuvxy{}{}w{twsqrmniihdf`a^]ZYUVQPNKJHFBD>>::5611/++&%#  ~|}y{xxwwvuuururrqrprnqoqoqoqmsnsosqrpsssutvwvwxxz{{|~~~ $$()--2275;9>@AEEIILNPRUTXY\^^abeegiimmoprtsvwyy{|}}~~}}{|x{uxtvrsnqmmkkhgfcbb_^]ZYXUTRRMOKKHFDBB=>:96522/+,&'$!  ~~z}w{uxtutqtormommmlmjljkkikijjhkijjkkkmipjolqlsluourvsxwxz{|~  !#&'*+./3468:==?BDEHHKMNQQTTWWZ[^^``bebieijjkmmnoppsssutxuyvyyzz{z}{||}~}~~||~~~~~||~}}|}{|{y|xzwxwvvusvpsppoomlkjhhdgbf^b]^\ZZVWTTQPMMIIFDDAA>;9:5611.-)(&$# ~ "$&'+*/.3368:<>?BEDIHKMMRRSWU\X_\`aaedghilknnqpsstuwwxyz{|}}~~{}{zzywwuvrtpqnnlkkhhedca`]]ZZWVTRQOMKJFFDAA<=98543/.,(($#  ~~ !#"$%'(*,,0/325497<:=>?AACDFFIIKLNNPPQTTVUZV]Y]\`^a`ccedffgihjikkmknmnmooopporororpqqpqqppopooomnmnlmkjjhjfheefcdaa``^^\]Y[WXWTTRPQNNLKIHGEDB@@><<8864410.,*')#%   !#%&(+,.014588<<?@ACEEHIJNMOQQUTVXW\Y^\_^c`dceffgihlilklmnmpmqppqqqqrptptqrrrrrqrqqqoqonomnlljljjihgffddca`a]_\[[XXWTVSSQOOKMIJFFEBB?@==9:67421/--*('%$""    "#$('++-0024578;;?=AACEFHIJLMOOQRTTWWYYZ\[]^_a`dafcgehgiiiikimklnkolnnmnnnnmolpkommllmlkkikhihhgefcdbca`a]^[\ZYWWUVRSPPNLLHJFFCBB?><;885511/+-()%%"!  " %#&&'**+.,0/133365889;;===@?BBCEDFFIHHKJLLNLPMQPPRQSSSUTTWSXUXVXWWYWXYXYYYZXYYYYXXXWXXXWWWVVUUUSUSTQRQQPPNOLNKLJKHIHFGDDCAB@??<=:;88673503//-++*('%$#!   !"#&')+,-003466:8=<??ABCEEHHILJOMPPRSRUUVVWXYY[[[]\^\_^^`_`_``aaaaa`a``a_a_`_^_^^^]]\\[[ZYZXXVWUTTRTPQOOMMKKKGIFGECDAA@>>;<997754220/,-**('&#$     !"##'%)'+*.,/.11253767:9;<;?>@AABDDEEHFIIJKKMKONOOPQQRQSRTSTTUUUUUVWVVWVVVVWVWUVUVVTTTTTTRSQQPQOONMNLKKIIIGGEDDBA?@==;;996633200-,+)(%%#!!   #"$$&&())+*,,..0/20323455768:8;9;;;;=<>=?>>@?@A@AABACABCADBCCCCBCBDBEADBCBCACABBAA@A?A?@>?=?<>=<<;<9:997877555342311/0..-,,++)*'(&%%#$"!!   !"$$(&))+-..112345788;9=;>=@?@ABCCDDFEGGHHIHJIJJKJLKKKKLKMKLLKLKLKKJKIKIIIIGIFHFFFEEBEAD?A??>><<<;:8967453312//.+-***'($%##!    !!##$$&&'((*)*+,,.-/.0/111315254565768797:8:99:9;9;;:;;;<;<<<;<<;<<;=:<;;:<:;:::::999796866555433312/1//..-,,**)((&&$$"#!!    !"!$"%$&&''(())*++,,,.,/-0.0/0000211213132332333323242423323232312111111/1/0////....-.,-+-++*+**))((''&&&%%#$"#""!!    ! "##%$&'&)(***-+.-..0/10222334454556667777878798888988888887877776655545343231200//..--+,**()''&%$##"!!     !!"""####$$$$$%%%%%&&&&'&('('((()((()())()()))()())()(((((((('(&(&&'%'%&$%#%"$#"# "     " #!###$$$%$%%%&%&'&(%(&''''''('('(&(''&''&'%'%&%%%%%%$%$$##$""!"!!!      !!!"""#"$#$$#$$%$%%%%%&%&%&%&%&&&&&&%&%%%%%%$$$$$####""!!!                   hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom1-Softest.wav000066400000000000000000005420021366722712400233600ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data -/b   $ yyxxB12fE+:A]BLQf  k# 6  HN V2? WS@,AM.%{nKI1˶ɦ} ڿnm»m+kʅB7͓7իGل=j3ڋ~[%\ާrܦmڙ\dlݟ=kn1>?ilI i ~ < O,IhM /} Q :D ddYD%Nm/) $ = B " # H z  ~8 [}~gYcU<|    ]^B1 C r _\ "A$%&'K((4)x)))a))(B('&%$j#X"b!{ VA" !9w(f)&s\gj1~kk JjPC yQs}{"j0{y+Gj2+)Z9Pg}_JWY7)prdJ33dW(G1)߄$0Fvө4C1%-Q˧ʙ9ɀɅɇɛɻfr̻̋HИLzӇ%T٨0ݡP@4q2oIheWC[ 7 [ <@{X Y!!!"Q#P$8%%&&&&&Q&%% %$$$$/%%&@&d&&&i&&%Y%~%&&'( ))***5+Y+g++++++*$*1)(&^%#9" w<<{7W>%'xdF o A C u0G65?jal M!BTx53j&UD[I [ R 2*iu_E@5 & _>Nsh'y;3>s?L[FBmlfw* =Wfާ|kےy/ )ـ ڧ/|۞ۦmHR٘؊-ש֥>Թe{ Awӎ)ԃm8և֌׸D۟ߑRO$>JTJ0l51hH-[wV;A 'sA\ < [ Y '  _ j I M.yr>P?2g3 T!"#%,& ''()l*!++,,,,^,;,.,,x+*M*)j))(m(('P'&%=%$ $##k"! e D i ^ ! z   PRL.J1 > ~_Q+Oq-R2TktM80;_emI|cSAAd#^OqPUC"!N:]"xeneSc{Uy<Ol91z|OX@iJzjYJ:nD} *p0lߧ]>izy"q|h].im#({^.\I. $ Y  ;z!f$jsQg4"@>' r7d3Mw {Mj"NvUQZ/tI,!jN~K8" qRM3 D\h|߾+VeESFYJ1k:dQI| 2^du4)YafNm{7Y: o  y 0 D P/ sY/Ty:#g;;A$JRx)INB tmr ouT$Zn~E-ihto<~=s/' `- 2 o 2  p 8  c  q  A3QO'mB 9]-*Ax:\VS]N`)zdRF:R:L5neb#esO ~LX(]y 1)! ,1$@]N|5?@cb"t\1o` w!uI\,+w='X q R ^  s U q)K C wc6]`{z$kC!gbK<. &U)b)djxcUDCENM2[$RZ-~"YXwZp R S / r  D Tq4pe-!a qg+x.0wb-{ad L$2@>c{S/x9Vx:X1CL4N %J<] AiofG=bgxSv8\(w<3kd {Pk1de_67 r  < F y + @ f  3 c  !3[_1r97@, o z&lrt|{jStoinjz !!:!/!*!4!3!&!(!%!! N wm$p te B b T IOZ8o%5m8*{Xvg&bypY=84n)23' :7* U%Dx>I# / #EY0Ji{&LdxM#?>Wq0JhC/IlGxC~Y;IYJp>*?vV*9I } %  c t  k TW^e,EIl&'$D <RN8JN1Zxyo|sXttV?lU.9n'B qS_Dz2 5 Z I R  c  n/d{OA/-<$m"eK0VFPe%W:$UAMq`1Dn~߄GޓrgggfN+!"/7Oފ޺ +_ߡ߂}t)[ nQK(k">m"Nhq/qZv/y/:H<{, I P Q l % 7 ~    = k <E7  L    ? # YEC}&;sV{gdTR>?*fDx\JE?*{ryT34/*Wt|]xPnFl ' ; I A  |g~T zaGu\p r?i*+8VRInO%uJw^<6# [?6.)%w$9oD-2=U~K$).xU88H'x-uX;q5jG[oL  a c  TL\"x'$qWX.K}O  pW$dIe kC?w0?qNfc_m62 / < O -  VUjz!n ?Ld'G9 e*LeZ2wCk\*5`0x Z}o[hv'*KBw#i6K-yEYv>wX*y>81RL;269[Fuip5,*325O3rG>_ kqA^ t I  o / >tDv G<QDv*g"`Da}eX<@)ngjR!&\z%0Ms"PG9: m@#-U0l"x-nhrU m . j  ? KSe ~b5|| x6W\^Cy$<~8r ]5%]ijfMI( #F{IFDErI4[M-v*nW6 p*X{spKK]A TL  \n_? L J 4 @ %qhB]4e2x[p!f L8p/>>\q=&#\3_+|\NY)}_!qE|H!M>u1x)b*q1wdJ?$|rex6\Z<#ohB vUg6?QflLsyp3pyhTll^) k  e * = ]K_3%Hi{|WBDVX4:JHOx9M[a_GJv#   H$pbH.o<P oV.4 z  C b V c \&g.cMBAz J y  \O-MsR^-}%Yu2y'5W%0@[4r.<laHH2 yb[ZD2b+L_-R!r4v9 d-#1i#_4uPV*-q|rPmuV)| oH+L.4 XHW'u{\5j) X D  # y U}'zEv <o seYo+L{}bHH?73&,% 1/EE(hW;2FQB! ]  n ) & R v G $ +rW-g"#i$GONe#{0+AN!_M3VOfA* =Ok~#_,lm Y8`t3#D'6'X,'?0b/6EY s:vr?$t^  3 b  @ b " U  : D W e { 'Npdy V: d1qF069>GIf}xnowlX3kP<! k=xBe2<v6;N u / @ =  t H f BXG<4~-dg'w*`OKKe7"' b: pXC|Y[0R"*c;rv2X c]\k#X^F0ldO3#4L]p Ez#M>m$b;1_LILH2uJu0|3"pjMg7_ E2L78|H8g N ! i T  a  d ,o*d;z=gP-S?a7y6C>>NcdJ?-$ wa;$> nBf.U^ y1x4 ^  m  q  k  _  ?L=|=0t FlR=jiz|>}7[}4^$X$c"Q`HsH!wRk\5~f]5+# l_H;5xjg[B^!W0 pDA\  h  g  } C ./H<2mD~=~"Rys^/rG~V2~mS3O{U,Fz/ D  ? U a  h \F'{R@{;rT w/#=@NW](N^K!f.g(l3;f o0UWFw>fG#7Nq}-H^qKX|2Oh;]y,YS 6eZoNTo3t0JHem7$~4Aq3Y,_8^ _ < w > % e / h &o]d,tX+Im0X~.BPbtxn\UTFRUaNB<8) X'MY3@q2Q]  z 0 A \ : j  T*i 2Yahi!+Hm'WIey%QSLK|X N"{DJ%s< |K|wnh`S\`anid\\hci,HtFn*b6e9!H|+i=m Eg9(u3 R  R 0 |  [ Ey@XpQn%<BJB9. =XqxxsttkVA&p+`F G a 1 F Y _  Ptn,~!b3W {/B,}%HD a+]o H,X!QwvZi1l0n(j#\4_ZQ]UJ=*!/6530Dixm{bl}8R}Ew 5t!u TYaKg? |0`-iBH"_EMh*{>&u).c!_%^ 7 }  a  X  < f  : U u 8g$W&CKCIZiu|unvyhL7f<~F&  B  ( 3  6 | , g*P,x&)x5|!O#:v7L@A SP}I)nEf.sa7 dK: g8 {T(oT*zK2{zcZ]POID;>GL`r /A^ -SDi!O)v Qqd]+|&;pH,{@ ~KNg@cU*X5 1 r & F 9 $j/_&WQ3=VVp  ?Vd`R?.0+( siBkH&mN!k;F z # r 1 B V  B V.Y{6X^"f8q@: <@et&Kd&R o=x-f:sf\SRG<63%("$1AOMURN\z 1QhqO*WYPK=Lr;JcV5}HK+O UD|1q&e3w[X[ 6 h 6 o  N y  > e  F c z 7Sk *:F;:@Mh  :Rw 7NNLHB5egdW7[5 sC r 0 M  ~ B X  H  jf _ v#_-w%vWQ^Ct=vu8{&cf7x: Z]X4v:{O(zcPC-||ppq^vt*5Ia-W9i :o\R Ag$YM+[ Dx]> TCxzJ f*S)Dh#|Bv9e % r  X @  , k 9`)Z 5Nw Q&Hi~#5UedBxYA!k8v;OZ' e  R  ` / q  h 1 P Lg"XPPmA g0cG& d; qL0iP4 _(Wb$j8}AlAxN#`B{d:uHMTq:yJIiT9v|3Qi &Ll%X{WK6t Z]XX q*Ly,[bt*8OL_@x i_!kGC  M ^ E r  h /b,Mv,MYq&+4N_u7OOWORDIV_faa_YTK+o:vDeI$j$ t G  \ 0 [  z ? @  Vr1x6=Pu(QRIX G^8ct-c z7TEf&Z~BDxF zM$[H7(.s2b"2Nh!V&DR]t6[%UwDtQ1l<|3{0zU)n;aL^&Zb5uCu"iB  4 c  P  E z 0 l @s.\ D{+bB]+W{eQ>6$ ~]3Z*LH B l # f  N  Q r + Pb|9k*^"H Ss4Y$EU)s7s8gv:Ca.YV0y2~VM,mS2vB#~[F) hV)jcZc]U\E873GOSLBK`h #3Hfw=cEl3vK+be2vJ%q,/y ~8Laj&+y!$|N/1xbN c =  J  C | ' ^ Jt#:=CIVaeXSMWp{}b?.uQ<"  { L $ Q 5 y S " z P ,  W 2 d@].[#\N:S k(` o"V#p/j/T 8S9CbbEEFKwL~zyksp}koqt,=Wk0Ng@X8i"Lz0Am~!Ak-a/Cf/SW,pS3/y\YG8}@]3p7p M#YT M  T ~ & Y 0 s  R @s.i?\#7Jcz&6BJ\_WJ8%yZ:h1S h7  r = R  O  V " n . Np>k3@9Jj'>r-=P x8F|/n'e/y6Xe9 hL rL$_M7!xcYA<* rlVRTTUQZI[]_`knv'FXu@nEh.Uv.^,Z 9p>tXK8!wmBDhk[-lt*x V1S ?  K r  L z $ E ]  " 6 Q g  +@PSWSNUUY]cn|}s]>3)  p M  \ E # i G   m P % [ 3  r?h/cW_"DD7nBYb|+m.@RDGRXDJ1aZ)]"d2jS* .Acz:V#;Y|*Po BrBc!X*]1|CP\+mXA/v@p~)zb0p&j6x=q >y*\ N  ( R ! T s  < k  1 Z 4Qq 1?]o{rnbQA$ gW5" m K $  ` O -  u c E & g <  m 1 n;\V` t<?8.]Wc T j*n,M$iIoPqV/d1 |T-X+wa>"~]< gQ9+uc]PRLKCCGFKGFHR_imqp4Hey -Rt-d*]%i9xOGk/JRn,;Iee#w%}) p hP+ w F  7 w  A q  K )Z~5Mex  oXH?/   ]B*  q Z 2  o D  O  l K  _ 1 [}S#rQx<x@ T$6 I G;v0h/j PBHX+g1i:t9zM/l2\AkQ< ,R^_nlrqlmebVRE=/& nZ8bC [ 1 x >  t = X  q 9 p9p0h)i Bw)m~36\Hh(KCw9R-g$g:xZ>u[3f71uiVD( }oS:~vcU=) "2JWt~?]9a4f ;rZUEQk g8Z=8i^<U2#rL J~1s2 j  B q  4 ]  * [ r  ? T p 3Ecs1CSRSNQF@.$tX8 i ?  k I  l L ' g >  i > p9q>S(f,~B],{Je; m1eBXvBRh*@5q=k4{M b2vFxR,y]8ugeST=*vvmbYTWN[`lv'N_.Xv.r JAAX/y>iC,p ^'hB,n T1[/k4b8e6^7pW2 e  F u  G ) V   B h 8Tu5IdkiX;1qY=!  u I  m @  J  T ! ^ W M z-<q4>A}<b!r@g&s2n6p'c0Va"QuDtGdJ1l`\`VN7( xmpkoioa`KMBFET\fnv 4CVgr !4GYx $A^#Cf=h=|@m"c"a O"^9 ID=yQ:BQ$m8l3k, n  U 0 ]  D i  I d   9Lo:E[bwypa`\_TKH2% oO%  | ] 9 x L  f 2   X 8  r @  b9 ],vKQ/g7b)e1O_&Ok.h7w;t5{C Xg'o#^ pBo3\0Y?f: s[MB;' ,2@H^ez I K ] b r q w v v p u { l g Q P I B +   } d M * l X 2  { Y F   i B  X_0qN&TCZ`Ku9j)_?k*o8I n6^*q>U kEM4vQ:~rbeQN6& %.3:I_?Z=^ 3WtQ-rM"dF)r\4|eR>&v\Q?/. &,BTw#Ii7St6nL>o)\c0q&q U,j,g!b']Z w/TQg$RLc't5Gp6Q'g; b7i?)xfbJRHHHDEEHEIISTXOVYx -@Shz !:L]oA[  e6zB^7sOK|M{QpKPwF], h4O%T2Z9sClD'dH/|_3yK. j<ueI.j_I?2, *HTi| @a.K ;p$nUJ F+pJ)r:d= MNN/n+mEpIw3dAl% H w - O }  * J q  8 U \ z    ! " , / 8 9 > ? ; 5 5 - $     | v i a M C 1 #   w e Y > / t X D &  S ,  rJ/ pH"^- sBQW['f&k/x=y8q#e6G M}JT%wR,sX9kO3v]A1xvlg[I7,(#"" 02DDRQhdz|+Oa}"3]x6_x8b =U'Uv/U{Bg#KM'cJT-k;w^0e AvBpH{Jx) G z 4 X 6 Y   @ c  $ P [ )389/4/,&%!"  z q [ K 5   d D % x T ) ^ 6  U # }JX"wD ~Iu<u5].Ei4d*Y P"b%xP$~R!fF`3[3 c;"nS<(vcU=3seVMH:1   $6Ei4X~Iu.f KA ?}(g^)f(h \ J:y0nO 2w%gSx;h*^%Mp # H n  # B [ y ! - @ T ` x w t ` ` N P I @ 6 2 $   v g _ L D (    c N 2   r[<uT#mE]!k2i0j; c/H i7HIr;]*Mo?p;V-n7tG}a=hK2 |mdSOKFKKKFF==@AJWa{+Ggz0Hp4]'Ns!HpFwDzBq O-hZ"Y B6zS?q@m'\4W Lx>_9a 3 a  G q  3 U t  6 W q   ( - ? G T ^ i n t y ~  k g Q O ; ; '   t _ > -  X B  y R - ^ .  I!}MpC\b)MtD w7V,o?J!_&rC!b>nFqR;zWB'zpK8waG7 tTA$t_S3, wwu{~nxhnmlljp~'CVj/T%X?w @q H8dL K D @:g-lR-dH9k 8rBv4c@r > a  8 P q   4 J \ p  % 0 @ D S W \ a a a c a a V N H F A F ? A 7 8 5 - (   u S > )   q O -  f W 5  |d@!mV'~V:]<oCi:rI\$['Nq4c0\*f2n=_3qE {Qc9 ]3rGd9 wnOO:1$  !*3HWj )D\%Pj9g"QvJw;b OPAs6i#P~Bj.X/g!J|*XFk%KuAa;`#Ek .Il  7 U r / K g  2 I c u   % ) 3 : < I H V N R E A 5 , '   | p R @  { ^ 9  a <  J$b7 [,w=qJ_:i<h>uM_3zKU#j@S'{M"M-`<uU9 lU:n[@)pT9" vne^SNB70,.2174416?DV_mv(F\%Dn Do&[I3eD{ Bn*nKv*^I[XXY"f,v6r0jJ G  = h   7 N s  ( 2 6 ; F I W N X Q U V Z ] [ [ R E ; 2 ( $  z j ` A D $  u a M 3    Z @   yeD!{T(wQ0V1Z9^6jIT5 }M0~T*uH)V; kJoBr8o?\.wD"lHnM( {dK0(3>Mfu+AYw#h+V1ZGq Nr#R|,X/\Ch8hBa @ f  ( Q p   . N ` y   % , 7 8 < E F O M Z L V M S J S C L E D 8 ,  | f L A   y c F - u C +  lAf9Qx@k.e0HW}OP#V"R#h=a< wR"X6kI u`9+dE0{aR4%zqgcc_Z\YcZd_ffkr{%AJds0I^{"BUu3[x $Fv4[Fe=s#W S#OIX7d,hO$JRFl=j , P q   9 H k }  $ % 2 8 D O X g g l k i j i c a T W B G 0 < 2 8 3 - '    m ] K ? '  r [ @ # oaF3aH0w[?nR)a=uM&|[,`2Y&kBf=h7 {Fe=zGc5X*~V!a6 |Y=jJ8" sgdZWQRMPPQWVSVcn:Kq *Mi6Rs+R{0e5a:n!U![M1p%[F!Z ?qQ)U 3e2\w7Pv8Tl , H \ x    - : A Y ^ v }       ' $ * ' $   w c X > -   j Q 7 %  wX8jM*e@wD ~T+T#d(a5q5j/@ n? s; sF]-]@fL)tcQ>4}uh\ZH?5" {{utr|~+>Zn/C]w .Gn,Oq +Lr%Jp6T4c%Q :m;pP,Z9d%b3r>x Cq+X " B j   5 O c   ) - ; E O ^ ^ i l l u u x | x n j f ` b \ T N 9 6 !  ~ l P 8 " w [ 6  e?^(qItHb. T$M,|J"^6W(fCY1e:]*vH"vM o/yV,xV7kVE&}mlajhotuz 2DSi;X|!MuR|6k5]9pV2i1gKrQ}8l!S?cGf%Da ";Vn?Sj}-1MRg|  . 7 H N \ e r {  r i ^ P E 6 #   nX?*}]:j@&mI#sL h;}Qb5V'OLM&S!^2tBjER*fJ%aP1oYR?3 -3FJdn)@Qm=Zvj*Bf $ J h  & 4 U a {     ) . 7 8 > B @ J < F ; < 7 4 - / $ "    } o U F *  u ^ E '  dN&vO(vS6T;lBsT(\8 o>!V/ |X;a7 iP1nM)hC'cF(nC,zY8qM?!lV?."ysik^aVXOWPWWY]^gjrt{,;Rfw>Z+KzHx"QyJ}S(hAsW+g<q /fBqAo<a4Rj4Hkz&7R^{   % 5 E Q c l   ! 6 0 C C F U K ] R d ^ h d h d l a i ^ a Z L H : - '  | i V @ .  pV=hC#{P1sO(lAc8yM~FyFrA^){;m; s@d4 f8ya3"]Q,z^L0{nfYNJ@?471/-+*/)217;AAMPVig~ ,?[q&G`4Nt:a 1Ov%Kq *Wy9^,J~!Jx-R5^7`?p8]=X#B`w,E]q&@Wl " : H X j u   # ( 6 4 G M _ g t y  z z { v m r c d O M = 4 - %   s c J 7   oa7b7xM&_: ^: iI`CnL&r[1dF#qF4jI)xT3 yT/eFzV2iG*~bO1ucJ:#~i]TE@42*%&&$ -+&qWL:,' 19LZn}#>Ohw '=Xq*?]t $Md5Up8[}5[8^Ej+U}Fj*Fx=[ Ee?g?cBb4Jp # > V s  ! > K a q   ~ m X A 3  s [ ;  {Y9d7qKvT&T3W0R'wGhG]; lEY=O7sW3cF"mO0qS> kYD- {ri`UJC75)#    +(96HPWfr#3BXk*Icx6Vt-R{>n6k LCx :o/[Sy<`8^)HsD_6Vm0Pd 1BRjt   ( - < < I M S [ [ d c e i l f n d f e \ ` Q S I E C 9 2 $  t^R7)z\O1% ~qUL1+iT?)z\G%~[:mE'\0X/{V yHZ+mJxS%c:wV) fE%iO8|iR9' ylj\bSYTSWTX[ddrs-9Qa|+Jb3YsC[ ,Yq>f3[:^ saNA0% uqhf`b^]ZVQQHG=93/*#!%33>DMVdo{'@Wj0Mi!Ki@f!Iw=p=l!J{*K/W ;b?pJq!Jr 6Z1_r3Po  - ; P V j q  z u j f U P G 6 1 #   {dYE6$oYF/  qQ:yaI.fJ% |T5 vM,]5 g6`4S)yU&I)uN&`5x[3f@*uU<"qaQD7) $,rW:% naGA*upc^RQC>8//"! '08BM^hy0Ebp5Ok $Rq3b8fDs3j*WIw7];kGn4^Ai@g E\!6Pf  " 5 ; P [ e v { { s i \ V E ? ) "  {jT@-zaP*!jQ6mV;! xbG*iQ/sI2S7 wT-oB$V8wT-b?$q_=&p]9' w\A(jX>+{k]O=4% +5?PYpz%DYp 'E`:Oz%Kg&Np #Zs@f *[|Fh3T~1\{+Vp5Yu %Af}-?Yq 9Kfu&3BVas|    # ( ) 5 . 9 3 6 2 6 , 1 ' ) "    kaJ?)lX=' `Q+wX8sS0d?a>R*Y/X)}N q?m<kFiB&iL2jaK=+ zvymrghbb^YYRUOORJTHRGRJRMUQ[Zbcmo~"@Jcp DXz5Pu5Qq!EjHgE_&Is 1V}>f'Er ,Uz7^A]0Uu #?Up&8GSep|~yjbRI7+ qhLC(~pZ?-o[8)gP+k>+x]7jK' ^BwR4fA!^DsX.pI0 mR2`N,p\I/ vo`VHC-- -8OVo6Kj?Z9^8W3eCp Vx1X5Y.Py6`6WwAY.Hg|&;Vs !+GOmu !$64EJS[efto}|}wtij^YOG=83)!vkUH4%s\C-kQ1gJ#sP0 sR*lI$_5rM#\4 pQ,}Z6qW<zcK1|kVH0#wkcOI<+'-7LTnu 3D[r #F[{/Sn/\r+Gj<^8V~(Xr*Pp%Nf"?l"Fh;[ +Ml*Aaz %3S]x   - ) 5 5 > : D : I : @ 6 3 0 ) "   |f[E8%pZC+^I-oQ7|a: {N8 |X7 wU-vZ0gF(gC,rU:{WE#lT;z]F!sU>!q[F3 wfXM90% (3HMht9Og0Li,Om9_@b)Ls:]$Kk(Rr*Jh>];W|+Jg!;Wk&4P\s!1AMaf{ !!&$+&*)%(}v_^H>1~nUI0mXA#uWC`G&dJ oO%iC~V-d=Y7}\6gE&hM/zcH3|kTI3%zmb]OMB?66+,&%#"#%*+-33:=DMR_iq/6Rfz1Hc{$=Yw'Efh=eDfNe'Qt1Ms2Sr1A]p .6IV`nyxsb]SG@4*" udOC&u[E)y_D) x^=)pI4 vX6xU;iH/`B&^H*vR?bH,|_E' qY>&n[F0 o\R7/ zwpki_dXcYf^gckmp{ '>Oc}8On=V~8T}%Fo"En#Hl@aA_7`;` 6P|*Jo4Qs4Sg"5KYm{ $-+3/728386622.))"}tbZKA.!|h^B:x]E.|hH/_F'aE |U4Z5S7 zV1c= mN& ^@&qV;kV8* t`R8/ yyltdii`ofpotz} *O^pz 7D`s *C_ ,Gg &Jm$=lA\8f!Fi2U}If'Qr&Ll-Qi"?Rj~&8BJZ_qzxpbaPJB01ncMD.${jSH.  ycP7# vZF(s\:!fN&iC&~_<lG'~[:}]< jK3i^=*m`E7 qgTL>4&  )0JKckz#AJix9Fhy$>Us1Mf7Ml9Tx8Y|9Uy>]!Df-Rv<Tv@Xw'CRn'4GUcq     }mcQE9' xaL2 ~`A&oT/lG$wR2aAfA!{Y7mV0z^>sW;eS4 uRH,veVC:# ywpfj^\WPSINGKFIFJIKNNWU]agow *;F_f+@Tq5Ph,Wk(Dd&Bj 2My#Km Ac.St;_{0Oh!8Kgw -?K`n #'58?HHQQUZZ_]acffgcfa_\XXSTKKC=81*#|ldQL9-xaQ=%sX@%qP:mX7gF&dA$`:mK*z\4hM)eG&lT2x\I,u`R82)0DNap1LZz6Qg"=Yx&A`x5[r5VtAX;V}!7az!>\y+Ii /Ccu#.QYw -?K\gw "0,:8CCLOTV_Yj_khhgkdgca]]SUHLB<70(" wd[C:#k[:, tX< sZ=dF' kR.pV0`K$s^= |`I(sWA%zjN8" r`M6& ncRC8).1JHdd{9;_k HGXUcbjmrxx{}~~~~u{qqljfa]VPKB:4.!  riSH2&sYH,eP,mQ4aC#gA']>!}a@gN* rZ:v`D&p]A&u[I-!o`O>3#}spig^\\T[PYO\R]X^abqi|w ':D]i"5Kdv ">Tt*F_ 'C`4Ys-Nk $Gc!@Z~ )I_"2Rh!<Lcu ,<J`f} $5>IY^rs#*,0588>>>B?AA=>=37(+ whZE1" odB/fQ+cF'fJ% cF!^>!~aB!gN,bH& kJ8~jO8|hQ;+maO?5wqjf`[TTLOIKEKGONTY\fgqx~.:M[q(>Zh,I_y:St Cb#Bg +Or"Dc7Xz?W|4Im"EUt,;Wd~"7@Wcp # #&%((&.&/('*!(xaYC9"xjR;&fP5kM8xd@/tXC$ vbG-mP=uaB1sTB&iT<|hQ8) tbK;ndOA7# .2FRcs2F]r7Kf )Cd|1Np+Ej!A_}6[u3Op %F`)Fdz5Ql%=Tg}&2EQdp (*34<AFHLPQVVYXZXXXUSUKOCC<8/'  sdRB1 vX@)gT.]DmF2tR3qP5}\?!hK.iH1v[@* }jO9" |n[G;&ni]VJH7;*,   $,*3;ADUVcjs+8KUiv+=Kcq 1H]w$4Vh)@^u #B]y (G_ +Be~!7Wk)G`z%ASm/F[n"4DQdq   %'(,*/.,.(*&! ncPB1 ygV?,jU<& bK4|fE-jK4qT>|XE# gN4wVEiT8oN@ hO@$h[I;0#0?M[nx*>Tn3Fl|(Ke&=c| >c!De;]w2Ln-Me9Qi 8H]v*/MVi| "07HS\hszxjcQG7.|`T;*hU='|mM9qX<'hN2qY;~`F-lS5y\?+ }VM(yeL@~lWP92|vojha`]ZWVSVRUUXX[`]mcvk|x !'2CIWdp$/EQfv*E[o7Tj/Jd6[w1Pp+Lh>Zr #BZ{5Pk/E]t 4DYi~(78FJQX^bggkkollkhfcZYSJA<0* xhYE5"r[K/|gP5"uV@&tW?# gL.mG3fK+~cF) yeC, rT= zcO4! m_M?," {zjhZVMIC?860-*'%#% ')!,)007:?EHOQ]`kq{ (4LTl{&>Pgy(EXt">[u4Ng /Bg|,Og3Jh #CTq0C^p)9Q]s#3@N[jx "$52CGMWVcaljsqw|zxspnadZVPG=6,#nbN=. saG9 iV=$ v\C'cR)_A$pS3tX5bD(rZ;!bL2|lTB/no[ZNF>8.-!%    ('22??LNZ]fnx#4;UYt|2E^v;Or1Nl!>_{7S{5Qr )Jf1Jf $B]r5Gbt)7QXr|,7@KVZllw~|uieYRD=.'xmYI7$sZG/kU:) jO?! }hO8  {dP0"y[J-mV:) ycG1s`I2!yjQE. qdWO>:'$$2:LThq 0GWq.E`x5Qr>Yv 2Hn(Dg$<`|.Mh -@_z @Oj(7O`n "07CMW_jm{zwujd[WMG74$vfSB4}eT='sYD'ZE( ~fJ-fI+fE/jK1lU4jK: zfK;yZZ:8x}qvnqnkmnoqtsx{**:DO]cv| *=Kaj5@bj0B_u/Kb&Ha} 'B`v5Nk!6Th'?Un.EXj4BT_vy##027@?EHKNMRNSQQKNGHEB@;94.)$ {xf\O@7%~p^O<*z_M6{hI1yZA$ `H*kF1hN3wgK1|`R6)ygSG/&ncQI;-'twmnifda`\`]]c`feknsv||/:LWlz)Z{7Qy!;d~+Gk0Sn)Nj4Pk*>Xf87TXjy#.)54==CDEGKKLKLKKHIDC>7;-0)# |i`RF7-oaJ>&|`Q9'w[L/nT;!rR>!kR4jS7 w^E4nZM.&ze]G@,"yugcWTGB:2+&  "'0:@LU^iw|0Za(6BS]iw}    }wkaYFD2( ~maO<2nVB-yfJ: wZC+vcA,p\<$tU@# vYD'kQC ujN@. |mbTF?/' #'8DL_k{*@99906&, }xg\JA,!zoUH7mY>1yjL> }`K2fQ3jM7jQ8qWB)m]A1h\J8)~pdWMD8/#  +0CK[cr %,GUh} #7Ndw/H^w+F\s3J`}4L`}4Jay1D]q !4K]s ,=Nak &/?HO]arsss`_QE</(|lZP9.weP>(nQD%p\@.fR0#pVA!y\F*{iP9# mTD,xlPI2$ndWLB6/  '26GH^`q~ /9W_y*Ym7Tg5Oi0Kbz '>Tm!2H`s!9A]gy !37FN[bos|sod_TNB;.* zpZP9/ pUK-"bS5#sZB)v[G(dN4}cO:wYP0 |nVJ1#p]U;5uybcVOHB95-$(!!'(-19=FHQZ_hnw)7AQ^l| (;I]k#:L`u %9Qj~*E`w#IYv*C^u!7Oi{2G_s3=Q^p #*8?KR]eps|~vsia[RKB8-* tb\BB##~n_N:/ obI<!oXB+ydM5|\K-p_C/{eM:" thN;)q^P=/ {qc[OG=5,# -2=HP^et~ %;C\h~%Wj4C_t-HYy #?Tt &<Yk6Ld| 6H^v *<K]hz *,7@BNRV`akisp}{~}x~tyksei`\XQME@82*!uhZL>2!{hVG0& n_H7t]K2 dX4*}gN: vcJ4eW>-xeRA.|qaTI;/! {z{wvpunrnptlvnvww| *4BOXkp&Xx2Fa{'4Tc~.9PXo| %,6;DNRY`fjsr}}y}vppkbeYWSHD<4,$|c_GB+"r^M2) i\?-zaO5~hR:$gR:$ l\C)zhR>&{_T=,xp_SF;0" ~~z{yzyzyz||~ ,2CKZgu3@Sis&?Tg1F^v1Fbu/I_v-AZn.D[i 1CUhy +4CP^jv%/(:4@?DJJRSS[V`[a`bddbeeaf[b[YYNTMIH@;7-*# ucYE9* weN@#}_N1qWC&~gH6s]E.tfK5# zdR:+{dWA2 ~qcQG8+{ywrqnklhkglimlnrr{z !%2CE^bt(7K[n9Hev8Efy&EWu ;Qk '9Th-@Xe $1DTdu )4CQbgy~..7=?KITSY[_`edffegdfa``[[SSNIF=;3*)zhcLG3,qbQ=/ vdL>(s`C9l]F-pRD(~mTA/ wgT@/ }iXH:&vobSL;0" ~~~ .7BO\hv(5IXi|(;Qbz)@Xk3Me}+G^u!5Pg~3@_m-=Q^r| !*<FPafy  &.1=:JFTOY__fdgnjojnnmngneeb\[TOJF<8.(!pcWE8& m]H5& n`E7 seK4! qRG"w_E6 jTA&nTE0{jTN3, zpgXWAF/3$ $/0>EOU_kq~.Ql5Jfz;Of~#4Odw'<Nhw)>Mdt+;IWgs  !"78JL]aqs     xqjWT@8*|q[L=(saO:*~gUB. pVI0" k[F1!zgQ@'u_K9#{kZF;!~lkWUF=7+$ %',<9LN\bou#5?T`p#9Ebm+EXp #6Pey+GUq 3NZz(IOqw(:L_q,5FXbv )-4=?MKSYX`d`kekjjfnefe_aYXTMJE=:/)! sgWJ<+  yd[@6t[J7|kT@-p]C9|kTD.m^L9&yhTG4(wkZO<2#|qg_XKI<83)' !$+05=BLL^Zknv $,(xhWE;)|ne\NG;3* "04EJUalu ,8JXk{ /CPjs&9Pb} $4R`y(;Piy%>Sgy(@Qbv /9QVny).>HP^jp}       ~zhaTF</! ykYL8, xdXA3qfRA2hZD4teJA$tkLG&"vjVD6 yn_SE8,ttfbZQNFB<9,/%"    "$++55BCLTZbos *5IThw7G_l%8Qb} -6Vf~0G_q'9Wc*?Sh -FRiz!+=HXaq| %#%-$/$1(-*$*# }pgYNE4.udUD9!m`L<'pbI=%{hU?1xgS<-}vXK1 m[H5$ym\Q@5% yuko\bSWNNJAE<@89;575577899=9BACGJNPUX\benlv|%1-yhS>)ygM8$sXE+~jS>&weR>0 }m_QD7& ztjjZ^TOLEA>57/3).%)"%!! !!$*",*207;9BAJNSZ]ejqt#1AJZhv,?Yb !8Kcz2D`r,D[r%7Ofu />Ve|)2KPip ,8=KPZbhpv|xtjf_USGC84)#vl_UK?5+yr`TD:(yjZF9"pXH0 }iXA1qZK9%vlWL9/xebOI:.( }}tlkbbXZOQLIEE@A9@4A5<<9=>>AFEKNQT]_enqz$*;IRim#;C`i,GTp-BXk/BZl)@Lht%5M\n /8KZe~)5>LZ]ptuhaUGB.*n`R?4r_J;!t\L4%ugK;}dP<(saL=#{jYK7-so][ND<2)& ,.AEQ_ir '9GYgz%:Ham.@Vi{1>Xc .=Pjx(:I`j#4CNclz!23@BLPY_ckos||~}yuphg^]SOH=>0+# sn_YCC/' raS?5tfS=0~hXB/r`I4 zbS:)eVD0# rdVF:. }slbaTSIG=>34.)+$% $, 4+;4B@KNX\elp/:M\d|"9E^m%7Q\~4I\t-;Tcw)8N^q'7F[hw$/CK_ev.*8@BNPU\^hfmpqyvz|}~~zy}txpmoef_]WUKKAB47*'  ywd^MG6-naR@3~oZG5' rgM>*}n[F8saP@, wb\H@-& x{eeVKF;5*&  )2@JVdn{#:D\i'>Kht2E]n(FTl$9L`u$6OZs} )>I^i{#.4FFXZgptv|hlZ^JO<9.' sgWI>/"tjOI.# wjO>* vfP?'ubP8-pcO@. piTH>'#|obXNC61  }xxusppllngpklopqvt|| $*8AO]iv"/@Nbp /8Q]v +6O_r';K`m .ENet ,?LVmr16DTYis{ !#.,97@BBLFQLTPYTZWZXYZTYUUSOONEJ@B79.2%' vmcWLC4(! qdNC1pcI<&zbU:*sbM:( xaO@&~m\L?+ th[OD7*! xtho\fX\QUJQIIJEGEEFEIGJNOWX]cfnuy &/=MZfy$5DRiq&5KYl#;I_n 3DYm}/=Wfy8DVmx&=DWbn{ "*,78CBJNQUU^Ze]echcjeggbfb_cX_TWPNGH:E442#&ypeWR?9)! rbVC;$}s^S>3k^K;0tdX@7$tmUN:, viYQ?6& tn_\KF83%  (.;KOhf )>Ibj !+FTg{%:Kan !3GYp~'CNft .<O_r{ )4DN]lv   &//::BFJOQP\T_^^f]hajbhcgbf^c]^^XYTQNKGCB:53'* {sgZQ>9# vfVF3'neJ>'lZC4! {aS@. ymUJ8%udVB:$ ysf[RE<2(  $,:CIZ_ny '9DU`r|"3@S_p.;MYm{ ,:I[ly0>Kbl'7HWex '4CNZhs&'./54<8B9H<J@GBHBEB@B7@0:)2#&!  vmdUP@:+$ xo]OA1%u`U>3qhTC0"|p]N?/lcJC,#we[C?(vj`QH;*)}|yvusqqsotsxvv| $5:MObkx2=R\p +J]k{ )1=KU_pp  !!"&&% !" znl]YLG;4+! ti\QC6)pcPB2$~k[G8'weSA. ofKE,# zh_LB2&|pdaSMD:6)% &)1<@JS\`pp  )7@Q[hw~"+9LUjt#4DWfy/;Tdu 7GYn$1DWdx)5DL_eu #&,074B8HBENFQKOSLPNLNJHEC@@89/3#*~~heUK>5& qdSE5!}q\O<*wlPF0 r_O=+ pjOE3"liTG>,$ {sk`XRHC72,$  %(27@FNW_hny-1EM_iw'5KUgz %*HNjs*6G_h /=Ras /;NVis"-4CGQYbhru~zph_YMG=2) miVJ;1|nXR52 udVB0" ~tXN8(yjZG8&d^K;5pmZZFD71(  22@DO[bmv /7LRdq|!1>P]m}.?R\o~+:K^m);KZp| )<DVer (2=DRYbmrqp^^KI52" }waZD;* ~o`L@+! zlVO4,yjYM<+sdYF=* wh\RB=)#yrnaaVQKCC872*,##    %%,/.;6@CERO]Zikst '+>BT_lz%1HNho!+DOfu-?Tdw /BRcu -2MOim"-8@MV]lmzsrd_ULD?-+wm[TC7)xkUL5+ vfUC3$ ufRB4{l]J>* {d^L?4& on][QHD73,!$  ($21?=MKZ\dmv})1?EY\pu #4BO_k(2EXdu-=M_l0;RWlw %1>HW_jy #,5;@KTRd`pqvzpk^UPC91#yh]L</s^P>/ u[V90 skPJ1)ymaNE3' njYPG71 }vrhf[[SMNCF8@/7-/(*%$# # $$&&,,2/::J]j~+7P\s'9K[q~ %*JKnl '7DOai{ (,;9IHWWebppyvsig]YPHC66#' qk[QD:,ohSK9*  k_P?1!pfRI6(tpXQ>4"wl_VE;0" vrdeTZIM?C57-.&% !&!-..85ADEQR]`jnx#5=DZ\qw &&BF]hv$2BTbt":B[`{4>R\nx (5?NVfn|$,2>BNQ^_lly{{ume[WHD8-'|sfRN6.ueYE7' ziYH>&~paPA2sbUG=+!vq`ZME90( }yvtnnjiedd]b[`[][]Z]]]_]b_hdifontxy 24DIUbgz~'7CPdm+:I]i~ &/DPcu"3CPcn,5@RVis} 1/=BHPZ]glp{w|ypig[WNG@60&oiVO>6!~t`UE3* z_]B?( umWM=+# zkZTA8){pdZN@;)& |xonh_aTWWIMFAER^jz'.<FRZin "4-@=KMU[_keyp{|{qpgdYZLHB64($yr`[I@2' th\JA-"mdRF5&wd[H<*sdXL:1" ~nc\NG=1, v{rtnmkhjdfefahafahehjkoovv{  (2=GQ[dp~ &4@N\hv$4BRbn /5IXfw-;J\gx52OOfm'09BLT^dpu~sse^[IG;1+ {naVI>/'yq^TF7* vlYO>1"~jbOE4(~kaQJ50ri^VID41  |{yxwwtxoyrywv}w{ #09?MR_lp)3AN^f~ (8ESds$:DTfr!.;IUcs~ ,>?QWeow)(56@CNMW]bdhnnwry~~{usnhk]`UUKL@=8++sf`OI;2%we^I>0k^K>,{k[K7+ vkXK:+ nj[RE=1) |}yxwrxmwposmvntsvwyy} )-=?KU\grz!,/'tf\JC2)qiUK9, ~k`P?4%}ldQK80~yidWQD@20# #)/6>BNPZeevy,,>HQahv #+S\ky (:?OXdoy $-0:;GFQMZZ]dchmlppvpypwsvsusqqpllkch[dT]LUGG@:52'( |sh]VI?5(  wk^PC7*rmTO:/!xsaPH2+~ufYN@4*zudbQL@9-) 21BGTYim|%9BMY^ip|/8JSam} $39$ pfUG=(!xkYS@8(klSVB94# yplg^^RNLE>>51-'$&&,2:=KKT^_nrz !17HP\kt)8ERak}"+AHYgt "7=PXll$37FNZ_oq  "&&")$-'-),+++,(')#'!" }nm`[RHC31#tj`NF3.}n^U?:$ }o`TD6-zmaTK80 zngZUGC52'  /1=ENWbjs )8AP\mt %7?T[ow *1GL^k{ &.;JPajt *.;ALWZiiyx       |xok]_NM?</(!zkaTI=.& wl^RB;'xj]RB<+  xmb\LJ87&! yslebYUPEH=:50,$"  #/+:5ICTT^giw{ &3AHYfq 2;OYmx +5KRfv".>JXgq  )8<MV\mn|  !!)(-0295>8@=B=B?B=B=@;9:461--''! |qk`[OH;5,xs^ZI@3% yu`ZDA+& {naTJ82%ylbYKF9/& wzjh\`KR?C911((   ))29=CMM^[mjzz&3:HOadvz !(:?RVgn'5>KVbmy'/<EPZcnw (.8>INX_dnty      wreaSMD8.*}ug\P@<%"pkUL=0#miSI<-$ kdYGC3*  wsj_\QMD@72+## #'-7:EKRZbjr|&1=GU\mq)2AMWio $/>IX`t} )/CIYjj$*7>DORa`qn|vrhe[WNHA:/-  ~~jkXXGA4-"yrfZRD=-&ti]SIMUgq!+<CT]ht~1*?>OO_bmt||}qkeZSJ@71# un^TG9." {l`RD;("{o`[FA/*ylbYNE91& z|ppdeZ[TPIGD??99240--(+$)#''#&&")&+(/-1247;;CBHLLUVZb`lnsz| *.:AJTZfmv%+6BNVek{ !/4FLZdn~$*4@KTbexz#(18?FQQ_]mixxyxoid\VLE<:*( zlcXLC5/tdbIF9(' |ub]KF6-$xobYPC80%|ugg[RPBC66))"  '&20?>IMV^_mqz *7:KP]jq #3EHST``iksx{}{vqjh]`NVEI::--#tq^`NK=5+"{rc^KH8-" yndWNB6/ yod\SH@5." yvplgb^YUPPGK?E==::575246-9-:2749;;?@BHGKQL\Qe_hmmr{| #)0:AHSYaoo%64MOdet} #5AH]`v %0<IU`pu#'3:ALR[dhox|xqhdZVIC</) yofXR>=+$ vpcUP?4/tk\TE?/(yubbQLA8.' ~y{pqhhb`\ZWWQUMKNHHHDEEDDDGEGHDIHINMPTUWY^_dejlssz #&47FHV_hp} -4AKVbjy#-:DTYkt~ 32AIUaesy #-*;2C@HMNVV`[fejnntwx|}}{|vvskoaf]]SSMHD?75,$$uoa\LF;/)~rg[OF3/ sm\TE;+$ ukdULF43# wvmjdbZWTPMHH>D:>;5:5652450:/;2::7?;C?GGMKTP[V\dcinmy{~%04CHQ]cpx  )4AMVfo{!*8FI_bt~   "/;AUSghx !!,56@EJRV[bekrs{}|{rsjhaX[IQ?@;,/  ulbZNJ87$$ mkYYD?4("wma\JM78$#vph^VQFA91)& |zzwv{n|qwusysvzs|v~|~*/8>JOZ_ls{ !+8DM[ep $-;FX_mw  +2AGR^en}~ '#61@@IOR\\finrw}||ysrii_[[HT:E56*$  tse\RI<7&  yrbYLA6(! }od\KD8+$ tsb^QL@94&& ~||yyvvusvrsupyrvwv{z|~ "*/7>FNU\dlq~ (.@OR]bns|  !#,-77>EDQNVXZb`merotxyy}||wtrqjiabWWSHJ>@16%'wof\RJA7.$ uibUIB1, {ne\KH:-)ulf^SOB>3/&{vqqzuuwswryuw{sw{ !,4)5 $qk`\NJ;9)& zqg[VDF4-#uob\SHA:*% {ylg_UTCE73.""*/8@GQY]lk{&/8ENYej}~ ,3?IT^dtv  $.7=GRUgbyw**57;DHMRWXb`jjmrwy{}yyvrojhaaVXLMDA86,-  snbYRE>3+ ~ng[RC?-(|xk`YKE42!}qldYUOC=90,#  !#.18@FLSZbftt +/@FR]fo}'(A;UTdly.*=@OR]ghw  (*26:?@JHSNXV]]`ebjhnknqktoqtqssnrmokmiihbabZZXQQMHH?@7:.1%%zqna]SNA=2+"~qm[XID90"ypj[RH@3- vogbSTF@:1+% )03@EOSaapt%/8@OW`pt ",6CKUdgw~")55ICXTchpx  !%*/188CAHJLTQZW`Ze_hejihniqjnkokkmihideb]`ZXTQNJH@C:73*)% qsb^TLC98"&zmhYTG>5*! yrb_RI@8/( {soga\SOHC>75*,#   '.3:AHNY\fkuz #.6@KR`bsw#49FOYdpv *3;COSbcsw   '*.65C<IFOOVV[\a_iakijommtjsqmsmqknkijded]`ZXRQNHI?A862,)    wthb\PO>=0*"~wnb_QM?:3!# |yieWRF<8(&yumc_VNLB>41)&  !.08@CKTXcfsx#+4?ETSiew!,3BBURhhw~ &);9INW^fpu  ##*,117:;A?DDHHMJMQMROSNSNQQNMMJJIEFAA@;>573.1')! |no``RPBA30$wmdXPF;6&"wna\MJ:7%$u}gg_USH@=31'&  ##.19BPT`hox~ '%,,.2285>8><>A<D;F;F<@?8C7>7753.1(.#,! zwochRZII>83)& {wkcYOF?4+$~sj`XOH<8)( }tmga]SSFE=55,&"   "%'43@AJOV]dlq}~ )3;JJ`]tt*+=APUcmu)*8;FNU^fnt}%*(*/1385;:;<><@<C>C?@??<<<6:353/1,,(' !  yskh]^NPB@7/) qi`TPA=/'|skbWNI=7.$ xzjoa_ZSPFG=:5/,)"& &',35?@E<C@@D?D<A;@7>6713-/)''$}uogaXTKB=0/$wufdUMG84' yxgdXOH<3-!yxkkbZZLNEC99.1&%!   )*/5=BGPQ\^gkxx !)68IKX]jo| */>DLY[iqz&-5@>TL^`gpwz            xwlkb`SWBJ87.)wrcbUKF84"! {pi]WMD;4%( zsmfb\UOGE>93/*&! "!'1/=JFQUVc^ojyy ():7KH[[iny/-?BMV^gmv~ $-09>FOR^^okzy       |wpheYXKF>7/+! {wggUQG=8*&|pmaWSB@8** zzko^cUTOFF9>.3)%#   ))11<5/$ung_VOE@32#${uolbdXVTNKB@874**%"  "+'/44@=GHPUZafmpz} &$:7ANR]ejyy#&96IOXclv"'35BERT]ahpszztpjg]YRLB>7/)!}rmc]PO=?0,"y|pieXXJH=:1)% }uykpcc^YXNQGGA>=874/3'/%)"& " '!+**1+95>=CGLLUQ^_bkjqv{#%43EAPTYidux',9:GMQ[cfvt  *)48BBLLXXbaknwxztpgeXWJI=7-+zyifZTHC83&!wri`YPN?;1+~xslfc\XQPFF@984/+)&!  %!*,/45>@HJPVYcfhqq}}  (/3=BKT\`no|*+8>DOQ`_pq}  "-34>@JLPY\bhjuq~}~xwlnceZZOTIEA;45%+ uvgd[RRBD83/$! urga[NKB?21$# xusjccUZKNE=A3:,0+&*!!!       !"&",,/55<EPO^^fps|~ywlk`^WKO@@8-.!! {vkfZTMA?11"}|ooa`WNN;@2*.! y{tqojkbd__YXUSQLNNFJCHAG>CA@>@@:APLT\^cflqu}|}uwnje^ZTRCI7<-+$  ypn[]PHC90+ ~ykk[[KM:=)/}~qukgc^XVPNLCB@9850/+))&"!!!"# %#+%0'7+=1>>FFHSLZXabfkmvv $)26DAOR[bjo{x$-4=BMQYbftu &$.25A>JLRUX`ajhpuuz|wwojge\\SRGJ=@50.*"}ytkh^XRKF=8/(#~wogb[RPAD47%.{zusoghaa_XXVOTLLJGFCAAA=B7@:<7<8<8<<=9@=A>BACBGGKJPPQVVX^^affkmuuz  .+<IITY_hltz $**73=>EJKUS`^cjhsoxw~|~~wwqlhcaZXSKLAA77.*$  yrkcZTMB=6,'!rpe_WOF?<.-!z}uskmbh\]XVTOQJLGFCE>A<=<9=8987:89::8@5A<>B@CFEGKKOOXQ]X_adfjmqux~ $%33ADJTX_jmw~"+56FGQX^fmq{  '&.43=<CELLUT\^ecjkpptxx}y~txnqhkba]YXOPGI@>57.*) }tric^TRHH8>*/!w|mjd[XOMAB66+*!xzutomjlfddabZ^\ZZYVVVSVUQYOYQVXTZT_U_Z__f]k_ohsotvy{(*4:@JMW\bmp}} '(59GHUZbipw&'24<=FILUS`^chnpxu||twklf``SULJE=;42)%   {tmf^YQKB;8,*|umja[TMFA83-&! ~y{xvtpsookjjfjdkbhchdgfchfhfhhjgljmpostqyuy}{~ %$*71D51$#~|rnb`TTEE;4/%( ~~zuuopjkcf__^V^SYQUOSKSHOFNGJJGHKHKJHLOLQNSQXQZX\__dggokstx} %)74J@TT]ekt} "&43ADLRYbfpr{  !&%3-95C=IGNOTYX^^ebngqnut|z||z~xytupnljcf\]XSTFN@F;;52.')!  wymi`_UQHD>63((xxmid\YOOEE:8/++ ! ~xztxpulqhoflbjahaf_dcbbg_gcbgbjdmfompqttzx}~ $&22??MNVa`osy !+15?CKTX_glu{"&*53>=FJORX]`ggopwx}|}wtskjea`XUSJLA@;70+'! uph`^TOI>>1/$ xukg`XWNJB<63)* }}}t{ttumsmlollmkhohpjlohsjqpqtutzx~} %(12=;HHRP`Ymiuw~'(099GDTT_]kkvz~ "'-.78<EAKJSRYZ^ebleuhzotz~|zwtsqlngebaZ]RXKOFG@=953)/' ztpgdYXLK>;4+'yynjd\TPHE<61-$! }v}tutmsjohjfgcdad]dZg]_b\fZf]fahbhfkholqsuvz~}  )+86EBNS\`jky{+/4A>PMY_`pm{~  %$+.298A>IJKSTUZ]abfgknlso|sxy|~}~|~z|t|oxlpgoffe^`YYWOPKKFAB9940.*%"  }upgc^TTHD=9-/" {womb]XROEE8://#$}}{zzyyvytvuuxuvuyt{t}uz~ ()676FGMVXbfnpy !'*/288AAFILRTSZY^bbfggqgqptutwwyyzzyz~yuuy~y|xyxtwsqqnojjhef^b\\XWSRNLJF>B9933-*&"  zuli_]ROFD88,*"}unm_bSSKDB83.&% ~zxyzxxxyuxsvvxtxuyzx{z}~~ (%167BBJPX[dgot} "/-=;DMMY]clnu   )%0+858A<JEJLOSSWY\\abagchkfojoksktqqtpsqsqqpqpnqnoplohjkfffab`Z`WZUPTNPIKEBC;<834.-'$$   yunfcYULI?=13'" |{pkf_]PSEH:;IPRZbbqpy  %)*42;<=FBOIULZU\^]ccegkjoontqwtwtzwyw|t~t}u|wxzsysutqqopjofnbh^a^\ZUUOPKJGAC9=333&.$~rpkb`TVDL9;3*( wsmgb[XPKI=?14)&  ~~z}  %*.4;?DMKYXdenoy{ !$-46BAPLZZfilvw  !"*)0/77=9G<LCPGUNXS]TcYc^bcckbnglknlnnpnqoppnopkohnkjhjeffac^^Y\TWTORKKFEAA8<430*+ "  ~wtglZ_MPFA94+( {{rkg_[WMKB;>IKTY`dpqz '$-0+;3<A<GAIILLRPTTYU]X`\a`b`ae`gbcjafgbjbch^h`afZf\a]\\ZUZRWPPONJICCB;A5933*2 -"  }rqh`_VRLCC58,'# xsmfa]STJH?:6/+%! (#2/;;HDRP[banow $+05>CHQT[dgpn}} !"'**4.<3@9B@CIIIOJSOUSWXW]W^Y``]`a^f]e`ec`cac`c^a^`]\]U]TYRUKWGNGIBF<B7<25+.)$& }vpid[YRICC56*'! ~pugfdY[OOHE:?14+(!!  # ).17:AEJNS\]ggpwx !(/59?GHTR]dfpp}~  $&+*30;7@<BEGILNRRUT\Y\^``bagcghfhjhlgkkhkghjejbhbbc]`]Y]YURSLLNCG>@9852.+%%!~wqig][RKK>?5-+! xxpje_]TPMEB;82/($ )#1/682;*5'0!'   zqufl[^RQIF>94-+#|tsifbT[KMEA<6..%$   &-/68@@OFXS_bgmsx} #$00;=FHRR__hpqz  !$%-*0054=8@>CEKFNJRLUOWRZU^T`W^^YcYb]^`^\`Z`Y^XYZTWRSORIOFJAE>=9843.+)&" ~}rmm`bXUKIB=;0-( }wumkb`YYMTDH@;;/4&+#    %)*21;FALGNNOPUSXXY\\]a]e^ccbfcbfbebcbc`e\eZ`\XZUWSSLSFOAI=B;9720+)$!vvlk_^XPPCB951(# wxmnbbWTRHI==61/&# ##)-268=DHMSR\\efkrw|}&&-26;?GIORV^_ihqp|| !!&%.)/205898A8E>DBFFFHFMGLIKMIMIMHLIIIHDGCCA??>;;75500-))$# }xpjj^^TTNGE:<1/* " |uqlia]XSPID@<35)-%  ))13:;EEOLVZ_eiot{~  ++4:BDMOY[chmszx  !%$.*2/63:8==@>DCEFFIHIMINKLLNJPKKNFPEOBKEBF?C=>9<4741/.')(#  ~{wopee_YZKRABB36-*%! ~vvpmhc^YUQMJCA;:33+*%   $%(0.688E;OEOUS_[fcoluz %+.68=EHQO[Yfbomwy} "!+%.-,7.;79?:B>DCHDHIIHODSHNNLNLKKJKFIFIDED?D;<<5:/5,1')&# yuqjf`XYMLF>=13$*~~srlga`VXNLGC><51+.#%  #$%/*658>ADJNPUY^aghmsv| "()32<>EHNQWYa`kgvry} "#% ' %$$$&!)#%%$#$$$  {upnhe_]WVKOBD=960*)!xyoogh^_VVMODE<>17)/'"" $!--276?@HIQTW__hkotz '(-49<DGMTU^_flnxu   " '!)#*#+&*'*')(*')&%*"("$#!  y~rpmfe^ZVOOEE<98+1"& }uxmofdcY]QVJMGF?@7905(1")!"      "&$,(/1178;>?EGINQSZX_`dlkrtw| !)+/57>DGKPUVb]kiouw|  !$''$"(#$&#(%%$("$#!"""    ~{spldc]XXJOAB;53)( ~~vptdl^aXYQPLFE?<<36,0$*!"    $&+,5.>5E?JGROY[]ednoszz  )(146==GGLPUV\^dgknqux~}~|twlpci[^WUNLEE=<33,,!%|wxqqkhf_`ZZPQLHJ=E9?39-4(*&##      %!*(./44=;CDGMORXY_ahhprwz #&-,88?FEOQU^]ggorv}{       z|ttnjhc_^STNLHA@:62.)(!y|stnlhgb_^WYQRNMGI?E<@987310.-('%$%#"            %+#-*/03379=@ADGIOMWQ]Xd_hgirpyv} &*.16;=DEJOPU]Zfbipoxvz|trngf`[XSLMBD9;.3%'y~rskkce[^SWMPHHA@<:643/-,#+"   ""+&/-53:8>>EHGQLXWZ`dejktq|y !%',138;@FENKUTZ\afhkrozv}}}vwqpjiea^XWOQGK@B;89,0''  zyuqqkifcb^[WVUMPHHFA@>::652/.***%"#!        $ )$-*02378>>CEKITK\T_\eelmpww} "&*/44=<DFKOTU\]eejppwy}{xsrjmdbaXYQPLFF=>85/-('~{xssnmieca^\VXSROMHHDCB=?;9854200+,*''$#$ ""#$%)'-)1,41779<<@@EBKFNOPVTY\\ccfjlopvv}|#*%0/379?@FGLOSVZ[aajgqrtxx|yxqqjhca\YURMJDB<<610('  {yxosjlcd`_ZXWQQLKGFDA?=;6724.0+**&&# $"&%%%,%1+22295>:BAFHJKPOWVY`]edmkqsu{}~  "((227<<EELKSSX\`celiusv{}{{vtromhfca_ZZQUKOFGB@=9621*+$# }yyqsmllbi]b\ZXUQRNLJHFDC@?<::764411.,,++(*&'("* &"$"#!#!%%"#$#$%'$,$.),-,1.52949:=>?BCFHIOLSPXW\\``fghpkvsy|~ #"**1189>@HDNNSWW`_ffloqvx{~}{vuomjfd^]VVQLKFC?;842,,#% zzwsrollgfd`__Z[VWQTQLRHJIEEDAD?@<>:>8:967572725243331515/6345384:4899;9<>=?@BBDBHHIJMLTNVSXW\[a`cegjknqtuwz|~ #&'-.54>9EAHINPTXY^`cgjnlvsz|||w{stoljgbc]^XVQRILCE>>862/+)"$ }yvuqojkde__[[UWOTLNIIGDF?@?=:<8782616-3.//,0,+/*/)1*.*.--1,3/123555798;=;A>CCEHFLJRMURWYX_[e`hekmntrxy| #!()-10;9?ADGKMQWUZ]_eeilmsryy||zxtvlpijec`]ZWSSNLIDD>?6;.4)+&% |}xxsuooljjfgbaa^^\X[TXSUPTMQKLKKKGJEHFFFCEDBEAEAE?GLEOOQXU\[_`eejjomuqyw||z{uwosjmffda_\XYRRMJKCE<A6:22/*)$"  ||{uymvjqhkggcc_b\_Z[WXWSWRSQPRMPLNLNINHNIMIMJLLLLLMLPKRMRNTQTURZUXZ[Z]]_abbffgkinksnvsww{{ "&(+-1296@<CEGKMPRVV\[bbegimootsyx{}|xzvtsonkkdi_d\]YWTUNPIIECA><89311),%&  }}xzuusrpqirfmgiefccd^d\`]]]][]Z\YZZZV]V\WZXYYZZZY[[\[_[a]b_bbbfbifjhlinmqpttuww{{}  "''*-0177:>@AGEMJPPTUZY^`acggljporvs{vy}~}zxwusoqkkgeda_\[VVPQLJIFAA=::26,0)'%!  }}{{v{qyovmrmolmjkhjgfhcibfbddadac`bb`cbbc`dbbebecfehfigkimkmmmrmuowuvxx{{}~ !!'%-+0247:;?@BFGINLSQVVY[\`adeghlkpotrwwzz|}~{|yvvtqpmkjffc`_[[YUURNNIHHAD<=:7620-,*%%  |z{xxwutsrqopmmlilijhigggdibgceddecddceedgdgeghgkgmimmmoorpstuxwx}y} $$)(-.1367;:?BAGDKIONRSUWZ[^\adbhdkimmprqttwyx{{}~}}{{yxwtsqqoljjfedb`^\[VWSTONLKFGAB?<;8632..*(&$!  ~}}{zxztytusrrprnqnplnlnmmmllmlnknlnlnnnoopoqqqsquuuwvyx|z}} "!&()-.11669<<A>GEGKKNQOWSZV_Yb`bdeghmkooqrtswxw|wy~}}|{yxxuvsrqonlligfdba_\\XYUUSPPLLIFEAB>>9:552/.+*'&#" ~{{}{}z{zzyyxywyu{uywwywyxzwzw{x|z|{|}|~  $$*(..053:7?;AADEIHMNPRSUWY][__adbhfjmjpmqqtsxt{w|y~|~~|||zyvwutsqoqkmikggbd``]^X[XTTQQMNIJDEC@?;=77530/*-&($# }}|}}|}z}z|{|z|z|z}yy|~~ " %&')+.-31486<:>>BADEIFMJNOQQTVVYYZ`[b^ccefgjhmjomptnupvuuwww|w|x}{{{|}~~~~~~~~|~||{{z{w{uzuvturtpqnmmlkhiffcdab]_Z\WXTWQQOMLLHHFCB?>>::5613-.*+'&# " |~~~  #&$*)..225699><ABCFGIKJNOQRVTYXZZ^]``acedgfhjilkmmnpmsosptqtstutvtvuwtwuuvuuwtvttvqwquqrsppmonlnjjjgiffecdaa`^]]Y\XYUUSRRPOMLJJGGEDBB?>=<88754110-++('%$"!      "#&')+,/024679:==B?EBGGIJMLPQQSSWVW[Y^[__`cbecgfihhlinknmnpoppqqsssttsstttususststrrsqsqosnqmonnlkkkhifgedbc_a^_[\XZUWSTQPNMKJHFFBAA><;885320/,+)&&#     !$$'(),+0.2247699<<??ABBFDIGKKLMMPQRSSUUXVZX\Z\\]_^a^d`eaebfedgefgfggfhiejfhhfighfggegfefcecdbcaaa_`]_\\\ZZXXWUWTTQQPPNNKKIIGGEDBC@?><<8:673411.-,**''$$"    "#%(&+*-.014466;9=<??BBCEFHIJLLNNPQRRVSVWUZW\Y^Z^]_^_a_babadaf`fcdcedddedeececccbad_b`a^`_^_]][\ZZYXXXUVSURRROPMMLLJJGGGDCBAA>>=;<7:47241/0+.))(&$$"   ! #$&((,+0-12356899<<??AADDFGHIILKOLQOQTPVUUVWXXZY[\[][_]_^_^__b^b_aa`b``b`b``a```^_^_\_[^[]Z[YYXXVXTVTSSRQQONNKNHLFHFEDDAC=@<<:9875512.0*,()%%$!!     ##&%((**,--/02244577:8;:>;?=@@@CADBFCGEHFIIHJJKLKMLMLOMONQNQNQOQPQQQQRPSPRQRQQQQQRPQQQPROPOOONNMNKOJMILHLHIIEHEFDDCCAAA>?>;<::9966543110/-,+))'&%"# !     "#%%('**,/-3/4264879;;=>?@@BBCEDGEIGIIKJLLMLOLOOOQOROSPSQRRRQTQUQTSRTQTRRSRRPQPROPNPNOMMLKKKJJGIGGFDECCAB???><=9;7875532200-/++*('&$$"#    $"%$('*)+-,0.20425485998<:===>?@A@BCBDCEFEGFHFHHHIIHKIKJJLJKLIMJLLJMIMJLKJLIKJIJIHJFJFHEHEFDEDCCBBA@@?>><<;<9:8785552301..-++))'&%#$ !  ! #"$%&%(&+),+,.-0002143556677798::;;<<<===>>@??@@A?A@BAABBACACBBACACBAB@BAB@A@@@?A>@??>==><=;<;:::8978857363413010./---*+))(''%%"$ "      ""#$%&'()*+,,-../113244466778999:::=;===?=@>?@?@?A@A@A@B@B@AAABBAAAAA@@@@@?@????>=>;=;<;<8;7;6876645432201///,.++**((&'%$$""!   !#"$$%%'&((**+,,--./.1/12042444565768797989999::;:;:;;;<;;<<;<:=9>:<:;::::9:98:796767554534231100/0-.,,+*)(((&'$%"#!!!   ! ""#$$%$'&'(())**++,+-,.,.-./.0/1/1011112112131322222221312221112111101/00/0./-/--,,,+,**+)*((('(&'&%$$#$""! !   ! ""##$$%%'&('(())+*,+,,,---/-///0.1/1/1011111112121120212111010000/1.0./...,.,--+++)+(*(()&'%&%$$"#!"    ! !!!#"#$#%$%%&'&'''((()()))*)*)**)+*+*++*++++*+*+)+***)**)*())()('(&''%&%&%%#$##""!" !       ! !!!""!#"#"#"########$#####$"$#$###"#"#"#""""!"!! ! !      ! ! ! ! ! !! ! !!!! ! !                        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom2-Hard.wav000066400000000000000000005374101366722712400226170ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data .d!).26)88|9?999g99898876#64j30>0C0/,9,0j*.)2!D%(.>*0*:>( * $/ 86t$&Uaj&=LrN7I(@_4" 3ԲJy.gřÈ!OR(=-l$RR/ <@BLV!"t "%'+*(o*/47p:;5<;::E<+==<<;~;{;;h<;\:BD,FE@<;=BkF HHHB9"1e-/4~:@EvHG B92,Q&S 0o E0r "% &# Bm yDH5aU`bmnG2')8}op T   !x"!1  4 F@X [ Y m$`F3BzunJzCV!$w$!!0*H$IrcK J0tJ@ $ P  ,la > QTqPs+ڳ װַ6xۈڕw ~޶?Y7 œ2Vq1خ WIΕѕ&ԙOѡrpn8Tŗ.y[ӋتFdf5__1_h F H,S#'W*,-..0368{:c;:9f99^9!;=@]CC2B@@?d? ?>e>Q=;_:99;>`AoD?GILOQMSMTTUW YkZYWWyWXXXX0YZw[][YV/SPNM9L>KKLLJcFiB?=;+:E99887765>41/,*'#; DC\ $V6ViG9 y ]J3~4("oPj w:JN4G.xWSNߣ7Vm1(tiXiM<>cG|L;L997LN9iu^fݐ!R0Jݫowލޖݭ.0.֦MZʀ0u,ɱʡQi*۠Z۝ۈ۵1 չeӓkԐ7"ًڒ*Qޘ.ݯx޳k:!.}(N6(?@-2L)0d#n,7!_8 C:  B.C $n')+-/t2u4f6788753.0,)&$#"""w"u"" ##$ %u%B%%%'$().,/837:e>PBEQHjIII0I$HBGFG HHIJIUIMHFEEFFoGGxH3III3HF EOCAAH@r?>l???>N= !"$Q&r'?(%)*+,-|-m,:+"*^)l)!*q+1,5,., ,+/+7++**+7,a+)(('@(()>+,/02 457%9:u;o=x?AAlA@w?=)<:9864;2l0/}-++!)'=&S%g$\#!/gyE v 2g%[JGh@ R $ q^B16qL62<r=&NhHݲ:kYՒ7r %όNѹ~D-0֗ՀlGAfAҴp^Af[.rΆΜ=͹˪#CsN˓\Noʉ@JqUIwg֣ւ֌װKL١ڦ۪y݄aݩSޅI[)@\7&(Q"!$ZB0 $ 4 M  6.9|+1-Eb zI?'Xo E dx -6x=&S{F r!! !#p%&&w&%S%i%d%;% %%a%&1&%$$$X%"&,'''Y''G((#)*+,,L-O-,,,- /D1C345W6~6y6N665543_21E0!/u.-{,++O*)D)b('r''&$#o"!_ '6a<) k $ ` d)rt3N ${FuZ%Y$mm۷ىպ&/TҿFқңZNΐ)|5̋ 4m<ǿBƱ [KǛs;Ǿlȥ@otɘCpN5΂·ӸӟfՂmlնM֜n@H3:ٞڧ~߱@T{k{:oY_y?9bH+w-*U0p@TlT.}$`S pU$*U5jHoH@.OJ^5 yLsao_g k!!("""##""##n$ %%&'*'&*&a%$f$$%'(**+++s+**<*-*))((''V'K'Y'&&h'()**)(L('''1'&\&&%%%%c%)%%(%7%~$y#"! x/ ?[f h s 5 # ?~ L5JM"Eqd ~psa R"VSsbmd#C-M N 6{(1{0FZ 9p{۲~#ܐ> KݹܺYܻm۵ږp[XbяM\'J˛R˧ʗɠ)9XhyȩN$˥̮}αr6ҋ ӯӓ'ӄ/ԮP՝6;b+m-@{"0Q|Z^%N5n#B ;u5OYR-JB~ Z!!!""#M$$P%O&'z''''' '&4''6(j(K(''l'R'A'&g&&P''''&&&y''()J))K*U*q*++H,,,,,,0,W+v**)#)((( )L)) ***)((')r)C)(i(N('&&+%^$m#V"!=!   o [75sp # r   D 0 | z   + O b :  \FE+L#zUy+BlX8~E2hH}\}ts8* 0.Lwmw^.@/*$z .#;k,:ێ&Fڇ}5ioeӾҞ|,-1\xWYs=o:تm׌׉84ifشا>ז@{ VPApJ~LX S)YG=xm(PD v g 1 1 u 9 Zw_b:?{r3q}R A[ !!!"""@#":"b! ` k 8 WZ ` 8 % # u c!!!!!l!i!!N"7#2$$$%!%$$h$K$$$##D#/#O#.#D##$x%Y%% %9%9%V%%%"&o&r&&c%|$#Q"U! 7P_k9NGfA 5 F  6  : n 0&VNHqIzT!F"M N qsI} wMqq( "I6mL9Y NXuN"QCGxk@B;߻78ހ4;Hi7(JL{/T)`{Yh|\nqHq$cbOy{*)kBU/@,@f~ @  aZS T"j>|OB /&T NKryu Z!"h"i"L"d"""2#4##$$&%r%%&2&m&k&Z&z&&&&& 'N'''P'''8''X((/)c)s)T) )d('&&d%$#"" [i!\"^ @ ?-nT]I(k(({$vS`Ai?Qty ]j=zqyd]hSPucMF|I)rf%kH8yd Td3J3dMN nC bF7999I21G%uaIr=iR-7}>@WyeT*T@|wvG=4HfM=~7wKkSxlq O $ < p ? p&^mC@x89oH$A?HuL !o!!"" "d"1#)$$M%%&a&&i'''F(Y(L(;(K(n(((((y(\(=(2(''2'&b&B&/&!&%%$r$##:#"M"!h! Q 8 Vyx4\X$D * {wx+RgGD3A0}M~b3$)K p}y@)}`-FXc-R7-ZOD4 FZtq= ]3]esR& v&&_ [>R1in-`#>XzPGJACf1.*\ Q*!$i$_n : + a r 4[&^bLc->|x 2.%LNaB)c3{k/pO ? f y } P , 3 ] } ~ ! !2!a!W!:!D!b!!!!"%"("U"""G"o! # a[}N;N5;)C4n mU$<3u*\ Z ;JkQLyf" myyh)opj@Vebqae89179xs`1\Vf)Un$JlvvrQ#&+^y~U*p_& A}-qX T\1m6~>Tkx<`MrYYTD`{jY3.z.@7 G V  w X Gw;I h Df Wu|ZnAH" !q!!!-"V"w""3#l##X$$$$ %%%$$% %'%W%x%%%& &&%U%%${$S$5$$##O#"! !:@iK5@HB zYs"`t B ~ ;  v1aqMj{Gj{LKe߻0 98 st>uaFq `fw_jcn\'W 9Rb^w K 3:x! l . { U   0 8 A 5 @ i  >FSb'nAn V9 8W^cp0 !O!!!h""""""""""c"."3"/"8"Q"M""!!!!q!! Y  oIc6+%,7W} 6b_f=2_ u q g _Fe=h28u+4e<>*OaDbAv ujRe3$kHvH4[1ߍXޔ@ݴu;ܩAۂv۪5, %)y1,?ZݗEު ߏ|f3t%"0QF+1(sl3P 0 SH^/v5J s!J?7 ( 4 k E ( 0 E h V|#|gFvBH2 I U`>#Z.|C (3v7Ba)t*-)^kRs/|%W 5 g b w @ ggbSueME2_d9{'GW:ZM}i/\*Y]u+r,3ߔ\ޔZJ: ݪZܑN ;܆ܿ 4xݥ ݢz݇gޔޱDt4XYH`Bo[cg^:n,yy1i2eykQ<.f={N<^m={/ )KnZfnH.PJA{Sb$6IX[l9v?a[ebsB|WOxV:m3j H  7 y  z  " & U ` $Zc@ 5KI.$2Ganphz$S~<%ZC[xnO@EY!o?;#->R97/cyCxxEBxtt4 U V 4 ;  y " B\yyTD@9!AW)(FX82Sm?d'`G-NO N1&gbNW=<)->yDIx\WK(Yq38c%#V!cOD9 U3$rO6+^n,pw[^50#f * B R U ^ {  9 g , T s  Z D w T!Fr*['W=i5kF{%Qt.9<CIq.SjjjXH<qO/`0NN-Sl# K P j N W x&T Y@(^X?X2=tgo\rI_3 wtjO7 q? m< sDIx7Hu7 AKd/P xhXRLA5<-"#%8Uj|=n*_T}8vNdH[d1A#yY&f.y]N8f2Cm\e$~%a.Rly>g )$)FtBm I . o $ i " o , c 'Zy7\};tAp&Kx,ClIp)Ueb_k}r\I)t3=h r=S PH b  t 3 $ m  o  m4y,%qz*)j ZY} -(mF./Et+uW2|vjcbnjaV: qDxHXp)jS~;W].v>yGjYTaz4m(ZL%O~6q5r;~RW0['r:$Qw2?z/{H l8uh/[TAqA QV1}Q) y  > } 3 w  S  U ,W Gx$S>xH)YFz 0X*R}xha[S>'i)sATAjPX O 4  " e W  h  3Pz9RR|3J^f[W XL?cl>a*}W4kS1p`G"qBl2J Ue iGw2r=pN:+) " )9I_iy@` !>_=b$KkX/j/Y"b0sYCLt<jC e&G9>F; F&[9v 3f(]V U  U - l E  W I|GxJz9l=u#b 7ZQ2QkhP?5% yT'~O}893*~'f  A t  a | / D  Re)n1j+q1F56udj8g3b-^;pE*W"UlO5^%IKt::j'h!J|`Ey`7lS1$7B[o,W2@Iaw+Ys?c'm>kc/e0x7x@^SX X m0~&z(c i'4/1u@}hn+G  n 1  t 0 ?MM cX>lHu!A` <X:Te{wgQF0`7 j3U^+{1et+MO I  o + h :  m >  = {W)t/z-77wNw3`3~Q6HX$~T*fF(h[C$T/qX,M~JPOe9P_6mG({qdZSB?8@>FQLNGEBNZl4BPSTZq<_Du$a4(Oh9 p5nB X|Qd aJ1whO8!inG%xW*  _  ] L H Lz/i.Kp +Jf| )Ns5Ts+EVk"=]z|d=$_/Dc8g)[sB o6  r 9  p D  x A  T Y  v~3:8UT6w_x/V |<3d)t4R$uU-]3 ]2 sV5 Tg(T\q2K EFyT6n\MaT[re_bO9M f ( o H S  Z : Bo9d.Mw !8Wk-Yz "3Lf%!'$&)$"tZ/hK%h'c4z:Hs) F g / w D c 3 a 3 o8vGSf&FTFN6?#x''[]lC hF}U.}\5`,`3c*R!b'r@Q{NtUG) %)!1=I\hx5[{&Y4q'je-s.j"d5bSD|*e5gSA+t Wj<%uAR!mmKM g 1 w & h * U {  G w 5Sj1Gdv4W Ot?j+V(?\o~n^WJ4V"zJ [1k:tCsI Y 0  z I  v ; W  d " [K5k#JdN]Qe>r-U I t4l9|K zQ#g6p< xA b-nJc/iH"rP5{mYI<(#~wngfWJ>50*),/EY}BrL rLBq3HbxjZC0 h8 e3Xn9O~M  b & y > l  B a  8DSl>Kj$e i8};b)S!](l<].{E`-yJ&zU*zR. ^0]B+ xbG4! q`O?(kV=% @Up 3Oz ?p?r%Q(^R{ =gI%^N,`\ I@OV(v]*%|bL8#n'[' Q 1 Z z  - B _ w  : d  @ j .c1U1^/Mv $?QjhM5mAb.{Eb* k & c % [  \  \  b&o0Y*X)OT#Ve-P ;s9ON=D;b*Z!y@mBYA(mS@0" y_UE6}lcO>% wi_UQE=.%9Nkl(Zy > h  7 Y {  0 M n 1 S w  ; ] =a 4Kk /@K[_lmx}udW@4 xcF+ uY1 t R .   M " o <  g * l + c&t<No@ a:tO*_5W,[&F I |/k)_^*|JyE |HqR5t]K8)r]>+w[;pL/ qK5 }wjmilfhmx!>\=`.U)Qs-Qv8ZAxJAx^Q=oW1gL LI5i5bRx 3Xy*Kn4Y}&Ls 6 a ; b 1 f F ~  Q 6q C|7c 1Kk ,-4074::5.# lJl@o? Y  e - q ; z < G  Q  b!j2pA|Fg9Z3 pK$qO,oAp=vDQ[l+s.m4Nn7q=h7eB tUB)eX=, qO3 q[J6" &E^{+S{k4_ H& `  K ) Y  @ v  7 U x ,J`{/FfzBa)A[vt`@(tM'{Ml3 | H  K  H W  Z HyF^4 LZk3x1Y=n&Ml'f&e#g(u> zK`;gE!qU:~bH+ hH( |eJ2xqpglcd___ZZOLC::./(&#$ #+8AM_hq~"Ga*Ld?lFx Cr ;w LxCr E|P*^8j=g*X(Om(RxGq$Q~ :p Cy&iK9t L  F ! ] , b , \ -`4b)`!W|6Wr-3=EJKC=1%nH,k9g5In+ g # U  H Y  h + z:LRx?h9m; ^0Pr9OZTw*QDAx1p>X&wA g8kO( pWG''3EP]p}$4Sb}'<]s8[/[QJvV1f?{Y3m Ar 2_!Lq-P1^+]2gO@<y-k F q - [ 3 N }   6 M l  4 V x &Rv&T 5c 0Qo$0FU`ox|cV9( g;S\X A b  ; W | ; t-u?a#}Ku:@DAg MhL IZ%Mh9e@wV1iJ'vT1eG'm\L=* ~|uogh\TI>813*-"   ',1>BRVgv4Sy9f2d/nNBu =o4a#Nx'V} ?i 1]#Iu9_1]Cs 8yZ7mKJ}7l. T 1 O w  < ] % I q  1 ^ ~ Cj5[t1Sd .-;AKPTQNI@4&y[3k8 x> ] # b , t = K  P  ReFc'u7I Uc$k0~CTzCzB}KP'Z!|I^$V$rNeD( ~rbbXaVRJ88.-&$ $:G^q9Z}@m#Qv ;o9oQ#VM 6b0U{!Gk5[9b5`Fv'X'WCw,^Iu!Jn + Q u  ' F h  , D c ~  < Z t  : P i } 7Mdt$4EVchovx~yj]Q=/dC ] , g . F  i 4 | 9  ;v7V7c5Vq-al/S,|R!yV,P+W3 xM,vWA#kSA0qZI4ziO<' |pdZJA1+"}ql`XSEF/) &;Qd1[z.`(`G,^Ao4_Ds*Jq-W| 5W-WEk/X&Gq,\DrHy=_AhB`! J q  ( U y  7 ^ + G c    0 > O Y g r { v b Q > %  u S 2  m L  l 8 j 9  Xd*l.j.s4x9U{FzGi4s?^/|P%{T0pD ^0 {_?"|[9xV9gUI2yl_QF4( (:IVgq1%   #+57CCKSYcmz!3G_s*Hn:^Eq$K},[5c;k 1Z'Nx ,Vy 1T{ .Sv=`{;Sy'Jp3b@i K{1e>h ! D f  . F ] s  + ; F Z c u ~  2 B U h    1 = G U ` i u | w r ` T E .  g K % x B  z A e * t8C]{Eh4\+f-d/\'MwLO#vL vH$k@e:Z2uR- dBjO4jYH4(~~zy{qzr|w||~!5H]p2Hb|)Po 7^ @cLq(W 9f=e0Z#Nt4b,Oz .Wx8\!Bk 4a HiGd3Ll (Hd 8 ^ y  . Q o  ; ] y 1 G k  1 G [ n $09EP\go|~|to_W@2 r R -  R " ~ M  m 8 N  ]p3Nt:a1STM}J}NmAsM+\?`;[6yO'f8nBb9`<lP+r]F6 "0>M[ly4LdCaGi>lHw'T|,_ 9bAl=g9iJr9o1h3[Kw'S{@Y)Km>Wx %Lc # @ Y y  1 N f   / F Y n ~   $ 2 E O c l    1 8 I Q \ b h r s ~ } y v f a R G ; 2   c C ) x W 0  X % b - R o8S^i*u2q6|<I\&{FoC tJQ)q@pH^: tS) `?{Y>nXB0tjaTJ@50"  "*;CT_o| )Aaz1Os 3ZIr$S >nR@t8f.c0c;j 7q:k+[ 2VAZ}5Po&A`,Lf ,Pp : b  6 c  * L o   7 N g {  ) 3 > E K R V \ ] a _ _ ^ Y \ X Y Y V S N H D = 6 1 &    y h T A +  } ` A &  | V ' ] 1  }K [+]1i7m6p;pET'i=a4 Y2j8sGpHyS)V+}S&yM&`;^9nR; yhRG5)  49KUdw'=Wr,G`z4Qw>`'RBsG'Z ?|1nW>w+a4k;n#NxGp8]w *C`z-Ka} &@Ro  8 K k ~  + B W k ~   ! $ + 3 7 @ D I M L R M U Q U T U W X ^ \ e Y a X \ U X Q U T U [ U Y U S O M J G ? @ 5 7 - . $ $    w i O ? *   y \ ?  tO(]3MX%^1l;p9 tCV"h< zFZ/V%]2 wN,Y5mM0 lT<"xeF7zjUD+|fQ>(rcYLF>:41+*(**-,258EFVZim|'>Qg~0Mo@b 8hJP-dI9r-bT:xI{7b1Vz -Kg1Cez&7Ul<Or#8Tk-Ja{ - ? U f z   $ 3 > P W f t       $ $ ) ( + % ' $ $ "       l ` H < $  x a H 0  sS:]=_:e@iI'xP2 |U/ rL'W/b?d8 a1 a9~Y5kK- u\<$fO2z`A"cAeG/z^I6+9K`n%E_{<`,W~2l,b?nL-a7o ;n+[ 3^)Kt(Nm /Hj&Ce4Ol2D\o (6FUer| !18ORik  ! 2 > M Y a o y       & $ 0 ' 5 0 6 5 6 6 2 3 - / ) %     } u ] S : /  sWB! }]B$~]<`;xS(d4X(l; Q!e? _3 kH#{[>yZ@' zcH/pS9vW>lT1~fJ/ydK3s_S@5'*9L\r /Il=d 3]Bv/_Gs'W,\*T}>_Ce#Kr2S}:bAg1Ts+Kf$<Qh|*AQew"7L[s  ' < K ` o    % % 3 5 A D J O T W ] ] ^ Z [ W W T O R F H A > 9 / . $   n i R I : -    r]L2$w\@) zV:i=tI!wHsI!xP$`;xT/ qG%gDgFiD&uL+qJ%oG'|^@dJ*oU@%rZQA2)  .jG!g?}[4 }U2 xQ1nH"\8pO#c3j?qCzT+mJ#qN* jC(~c?"jM-~fG-{fR7# wm[UB<2&#   #'03@AQRegw'@Ph5Xp;aIoIx'[DyXu2Ne & ; X l  ' D Q l y  * < E V ^ o w x h U E 1   r M 6  j H ( oF%lE!a=xV. yQ1kEd;zW,^5 c7 g>qJ!`;oK1 {aB+xaI3jYB+}oV>1l\E5"shWL?-' !.@Jcp$>Xu ,Mt-SyFt!J|3\Q7n,Z?q Jx Gn 3V};\ 0Oq4Wq 0No"@Zy/M_~ : M d x   % 5 E U d u   ) - 7 < D I K S Q Y S Y R T L K D = 7 . &    z i P ; % y _ F &  y^=}dA&oV5qW8bB"vT- lGvJ#yP!}O+^6 wP/ dE%xXB! mO8!nXG/# xbN8$o\G2u^U=/ yrlc]SSFF=<7726245<8?@FKPUagt;Hhv F` /Qy5`*OyCo1WEi0U@e BhDjAa.TqAc)Ec7Xp/Ga} :Pj~  0 D Y k  * < F S _ g u | s j c R J = . %  r \ H 3   tbI2sY?# ~dE* mM( yX1 tL ~V._6 fC[8dA"gH/nV:'u^O:+|nXJ6&zhZC7taL7 xeP;'tgSJ5-&0=LVkw 7Ni+Bd}6Uu +Nh/Ip;[ 0Vw(No,Rw0Xy ,SpBb&Gg<Vs7Ur(?^t #<Tj1Hcv % ; H _ k }             y v ^ V @ 4 #  tbK8  ~fP4{_@%rT3uT3hI$xZ7kJ'eB$fP.nX:"tbH3qVA%}hK5w\C& lQ9mT:$ t`I7"~ti]UKD95-&#$(.8:GKW^lw +BTn| 3J]~7Nf3Qh+Id;Rz:Y|+HoEd;[ ,No+Lh-Id} #AZx7So.Ie #@Wt %<Sk # 8 I Z k {   * 0 : ? F N N X Y _ _ d c f b d ` [ Y O I C 7 0 '    i S @ '  pU6qN+vP- wP- zW.yW1fE%hE+sN8eP+lM8gH6iX:)jX;)sbI4 |cN4jQ6xdM;&}tg]TJD:5.($ ''.5:DIQ[amv~/>L`p.F\t%:Xx*Nk 0Oo;Y} +Tq.Ks#Ee4Qu=[{;[{8Ww 0Ij8Rq 1Cf{6Li0C\s  0 H T q y   ! - 5 ? G Q W b _ l h r n p m m j d b [ W O E ? 0 )   j [ F 3 z]I2w^C( qR=rP6xU9rM- ~_9bBjD$pK+~^9lI'`C"mL,z]@" {^H+gT:)xkUF4#wmcXNF=6.(   #04=GO\ep~ /=Tbx9Mg"<`v5Ww=] 6W8Z:X 0Ru'Gk2[t;^z;Zx ,Ih/Pj3Po.Lf,Je  9 P m  / E R k s } r ] S ; /  t e F 5   |\='fJ# `>eA`8yR+i?X6 wR,tO,X?xS8}cB* iP3dM5vXH*m]A,ydQ6' {n]TE;,$   (5@N[gy$hB hC`@]:_7gD'~^=~\B!fE%pP3sY?& {gK:"ujRA2rn_\PKB>751-(&$" "#"$(,.57BDPNa^pt!9CYk{(>Sj $=Wp4Qn +Jk1Us)Nr+Pt+Go1Ro+Mh9Pq6Vm2Qk1Nk (A^u&B[q(6O^r  ' 8 @ T Y j n ~ u l ` R H 8 +    mV@)uT<a@!|^8sM,~[:pK-eC$e=%gJ+x]@"sU8{bI.jR6 jS5 yYG.xdL9" t\S;1~yy~ %0DKdl&5Obu 7Tn3Qn/Hn>Y *Lq=_)Gm ,Fn #E`} $<Vr ">Tm5Le}2K`y0A\m+BTe{ $3?LVbltxobXK@3( ylUD.}fM3~iJ3rR9hH* nR/oV/v\;gI+u^8!w[?%hL2}dI4p\>2}gU?,zjZM:0}uli]\TQLJGEECBCAECGEIKLOTT\`eiss(Wl )Fc0Up *Ji"E_)Pf+Hc ,Gf#>Wr !=Qn%=Tj-?Tj'EUq 8Jew  3CXg}  +5?ELSZ\dckhmmoqrrsqsqsnqklfdbY[NRBF65+${hXG6#p^C1iP3pT3gK*uX9dH( ]H$ }cK'pV?" yWK'gV4"iU6!nU:# pXF0ycR?/ {sdbOQB@80-&"   ")09?NSdk|(;Odw+F^y4Lm ,Id/Qj2Po6\v+Qj3Pj "BVw %<Vk0Bar :Oi&CTq !5I_p":AT`my $"*,/348:<<AACEBEECGAD??;;865-1')!yn\N:+xaF,eN+tR6rN.fN' qV7gK/_F( x_>kG/ za@&~`K'nV;#wbG7 jZI3({ldWTFF::/0%'!%!(+-69BIRZdnw39P^r/G\t1Lf~ "D]y'Kh"<`{9Rs -Hq6Zs!?Zv9Vs0Kf*Ib0Od~2G[o+>L`o'2@HX]ms~{n`XB;' w_L2oW9"}cG+hO0jQ3lM5fK+|bB'uX:oN3uX7vV6sQ-oG0pQ3oT;"|k\H>(!%1:KRdm$7Mbw/G`y5Mm>^!;a|@`Ec?^|4Nr"A^}3On9Tn,I_}/Dcx!;Mhy !3GYj| )9ARZis{                seSG2&n[B*wYB% yV;bAgC'kH) lL) iD(dD(_CbA!cE(lM,wd?- ~bP6$ kYH5&xlh\TOGC<53,,#%   ##+.1:;FIRXahr})5M\z+J_ ,Hf&=f|!=a~Fc -No+Lm B]}/Pi/Nf)F`~8Yl *?]t$9Rk3@_e!7?QZft{umaSI90q\J3# jP9"nX?# iL.dD+ z^=#x\C" fM1tS;wS?q\6$xZ?$v]A#oYB*}gWA/ wiZK@0'vrlc`XVMKHCB@>ADDOMXZfhvy /@Ug}1Id|>Vw &Gb?Z}6Tp -Dg/Qj4Um2Gh}6Nk "AXu2Ng5Oe 5K^v *<EY`qz      ~ph[T@5' q^E0gH+{Z<}]=xW=xX:iI-fL0sY@' yYL(sdG9 }iYD4veVF6%shXM>3$ pmaWRD>7-)   &16CJVbn{"8L_s %EHOSYZ_aehiontqxuy{}}}x|utplid^ZVLMAA50+"udR?/ qaG/kX<" kR8iP5"w_D1ziM;"~j[A2w`P6* dT7& zfH5n[B-fQ>(ubUC5' |rlb^URHI><812*+#+) '"&'*+119=@FKSYbjr0?Obq7Fcu-N]}*F_{5Ll %DZz6Um4Mn6Tq<Sr5Oj6Qd!7HXmz ",6DKYalv~ !$/3<DHTY^hkuv~ymm\[KD6-p]G4 iX:'zbJ1oW?* fQ9$ wbJ9" |fR:&tYC,oU?" oX;$ kO3iR;$ i]D7!yh]LA/ {ujeZUJFA74+* ! %'12?@LR]fox$6IXq*CVr/I]2Id~!9Vq?Y|1Pm'Bb7Uv 'Bbz ">Xu (<Wj.DQiy +=M\m|/5ELWemvtk\TD:+!meH>%}iP<" s`G5 udK9#nVF,s`I2u_E)iN-{`>$oP/gJ.x[G,{iTB-~g^I:/}pbYIA1)!2AM_l|(=Pj}#8Tk7Tl,Gh}/Lh1Nk7Rp"9ZuATz7Uq+Ja~/Ib{:Kdw'<N^p(9BN\dt~ $'./44:8:;8?7=7;674+,#! }q_OB+ hV?,jT:  nR8 mT;# sW>$ jK5r[?"cL+kO1qU9eN5!}jU=,tbJ<'q_O;- {l\P@4#{wvplnhmimnruy#4ATeu,E\r2Mc~4Jh )Fc /Df-Ff.Kj6Xv.Kn$D`1Sl9Qr '=Vo,>O^q %4=KT_mr  "!%"$$!    odOD/! s^G4fQ4 sZ>( o\<& lT:hP3t\<$z^D& iQ5bJ/{fK2wcJ5 {dR@+{mYP;/xlgZXJF?72,$   &+6' wY?* |cH7gTA&yhVB3~s^UB5%sk\SI;5(!*7FScq.BXk.>Zm %({bQ6% qZH,mTA({dN="t]O8)xeRD.! |lWJ3'|fVF5%ncVK?7*# "'69GPXhl"7BUdv6?Wey);Se}.FZt8Lk5Rl @Vs$BVs1L^z+CUp 3DVjw!-BJ`j| $.=HUcl}    ''-,01100./+)&! wrYWA7( saP:*ufL?#jYA+v_I1t^E,hP5 mV>$ q`C,qZG,lYB+sYJ3# ufPC1ti\PC8+#'0=DPYhp}#3EQet(6S_u !9Kfz"7Ui >Vq0Le ,Cb|%;Zq%BWr)@Tl~"7I_l$8F[k}$8EWfv(3>JQ]eou}xjgTTA<+!vgV>1 }mVA.eO9 ydL5s_C1gL5jS7"w[I*nT@$~cQ1!{iM>"lXE.rcN=/ ofWK=/%}~{y{wx|w|}~&3?JWbp3BVj} "6Odx#:Vl2Hg(H_ )C`{!@Yt/Jg3Mc|2G\t+DTn{'<I_m#.AL]hy !$36CINV\cemmsuvyy|{||w|uwrqmhea\YPLD>7++ zoaRD4%n`J9%{jQ:$ }eL2|_E*gI,bD( }bD* hQ3iS7 zdM9}hWD0 r_PB0%tl`XK?9-'  07BMXfq!2@Vbz&;Rd|*EXs.M`~6Ml &<\q'BZt'>[q!5Qh>Ni}+FVq+>Td|"3BN_ky "+*33:9?=?CCCDCDA@=<862.+&! vg]MA0%r]P7(r[D0taD2fS3 jO7fM3iT9 {`M6 qXD0{hWC1 yhVC3 xlYJ=* yucfPR?B10*    %+/9Tj 6Rf} 9Mi}*AYr/B]q'<Qfz*<Ods*3JWgy+7DQ^iw'.5@BMSV_`ikqq{w}wvnkf]WNJ<9)%~m^O<,pbJ:%}fT:({fR>%n`H6! n]M7#o[L4( zkVE2 qXJ2 iYD0 }fZF6'yrd]LH:4+!  !25EJ[aq{%3IQit 0FZm/=Zi ';Vi+G[u-IYv!=Lex.BTiz3CVhx!4ATer '/@I[fr  &/3>@KJSWY^ceijlnqnuouornoikcc^ZVONE@73(" |vbXG8+ ubRA,t]N6&q`H: jX@/o^J1 {`S4+ vcM6$ dU=+seM>'}n\Q=1# ni[SI=7'${zsrlifbb^`][_Z`[c_ffkpry|-5IRhr#9Kau!;Nh|9Qh+F^u2Maz5Hbz/G\t #9Ley %8Kbt7AZe{#.@H\aw '27DFPV^fhotz~wqgeYQJA8/"qeVF8'xjRE.gV@,kY@-pcC3ubH1zaK2sYA,qXD-{kVB/|iWD3#yg\NE.+~ol`XPG@81*%  #+/8AGSZgn|.?Pbr 3A\k2Ibu1Ibv 5Pg~-C^u"@Uq/Pc~ )=Wo&<Rh}"3JYq| 0<NXhs ",29?GLUXadmow||wqidZTJC60! zmXN8- }eV?+s^E3iX@)pZA)lV?&iS;# }lL:xeI4n\F3 s]N6+}r^QB4' }skd[TLE?71-'$  "(+34@@NP]`mr} *7HWfw&4J[q7J]s#8Qf 6Nf+AYw#;Wl";Un.D^q !7Hbo!3DUdx(6ANWemy %+35>@JISSZ\adggolsqsxqxtxwwtwpukmge^\VQHF:8-&zs`SE7$i_F:$|gT>,v`J: gT=){bQ6$lZ?*rXF+s]E0~bR9&v`P=/ ndQH5.|tshi`_\XUSPQMMOLRLTRW\[edqn|z .7FU_p +@Oau ,ERkz*DUi-FZq#;Se#8Pi~3L`x #7N^w&3GXi{!.>IWds| #2:ES[ho~ '+/67?>FFGMJPMNNOIJFCB=86--% rjWM>1raO<,u`O:+xcQ=*xdP;,qaG8}nTD+oXB.uaM:'mZL:(mcQG9*!|rl^^NK@73(% #(59ENXcqx (9GYfw !0CTgy8E]o)=Ojw+9Te.?Zk*AVh|)=Nao%6DT`r} "/;IRcny /2CHT]dpuzmf\PK:7%zj[O=1!mdIC* ~pYN5)~hWB0fY?1|jTC+w`O8*~nXK7%qeTH6-xs\XF<2# xqfbUSHB96/+'    !&,15?CKUVfjr"3LQ]emw}yoh\SH<5(oaRA6!}r[M6*n]H6"mX?/s\H2 gUB+m\I6%yjVL3+ zs[R>2#wm\RD7+~ph]UKC;1-$"  %(/62-! )0;@MSbft~,;IXhw"8H]p*BSl5Md{ ';Xm1Jaz4F`v%:Ngu,APgw&9JVmw0;JWdp~%&0/;9DAIIMOMTPTRPTNOMKJDD>:31(' wr`XK>3# }i^J:*ugQ@- hV?-~hT9){fQ8(yeO:$eU=+y_N:'p[M9* naN@3"ul`RI=3(  *5?IV`mz#6CT`r)=Nco':Pc{(DRq%?Um*AVr<Me}&;Qd| 4>[g~ 5CXgw$1?NYis  !+'1.6476;;9>6=59321).!$  so_WH=2" {l]J@) p]L8+nZH3# ~rXG2 zhQA(udN:(wgNB'o_J:&vgUD5"weYG<-wl`XNF>5.%   #*/5=CNR^dmw*7DQ^ly );I]l~ %6H^o&IXds#/6BJT\fnsvqd^SH?4*! yi]H>(n[L7$~pZI5#vfP=+n]H9!~kZJ4%m^N:* qaQ?5o`QA/$ym^TE90! zwrpmjgefd`b^c``abbdgfkjnrtw}} )0=ER\it#3BScp!5I\l 5M\v1CXn(:Pcx%;Mbr%7IYi}  '=GXgr &,=GU^mu &,3;AHPR`\ifpruy|~|wuqkic[VQIE:7,( xj]PF4+ zhWI7)p]L=&r_L8)m^N9*xeUA1taQB. {f[E:$|m^OD2+rk_YLH::,)#  $+2:CKT[fk|,:OXk{"8HZq~/DXm~ 3HXn*9P]t(:L_p .<N^n~ !,?I^g|*6CL\cq{ "++26;;D@IHJLLPNPOOOONLLIIGGAD<=:71.)%{sg_QJ<2# qdWI8+ ymXJ8%udP?+q]I9%|lUE2gYC4r`R>0xi]LB2' uldXQE@50% #+7=KR^iw&-FLbm%6GXl{'?Qd{)ARiz0BXj!7E`l !3GWn}&4G[j| &5CO]js $)17=DGNPZX`bekkqpttyv{y||}{}z{yzwxvttqpphicb]XVONHA97,(  xlaUJ9.!~q^Q?.p^K=%xoRC/ |fU?/{eT?+kZE4 i`H;&ugWH9) }mdUG?+*}rrgf_^UVNLJFFBAA@B=C@BFDHJKMUPZ[^fhosy !&6>OVhq->N_l1CWi{->Vd !4Iao 1Hap "4M`w2CZl 2@Vex )7ETbn{ '-;>IMZZhjqy{vsheYSIB70#veZJ>-"k`J<, {iVE4ziWD4xhQC,sdL=(jZC5 t]L;&pfRB1sbTH:," ~xnk_^USIH?@98410-,+*+*)-(1-235:=@DHNOV[`fktw%.>FUbm| ,9J\k| /BUh 2HZs,?Vj+AUm+BTj~ 1DXi ,@Nan~*<AVZnq &-5@CPS]eitw~{pk`[MK<5- we\J=/pdOC0reNE- f[C3# |lXF2" yfTA+nSH-"s`Q;. zn\M=0|mdXMD6/#~uxtrsnplnmmnnnpqtuxx -3CLYeq !-@O`o%5K\n #6Kbs.DZk'9Pbw'9M]r 1>Q^q~#5AQ]jz)4?LRcju !'-37@BJNRV[^bbifmknlqioimifg`a[XVOMG@=7/+"|sdYP>9&xk]O>3!wfVC6!zgVE0# tgP@,r^J:#h^F8#yh\H;( tk\RE9-! }smc\TMD?90/"" #%/7=JP[dnw /.)xsld^TTEK9=01)%"    $')14;?DLPX_cmq{'.;HR_os#.=MXix#8EYhw#1GRju,;Rat*;O_s +7KVhx #.;IU_nw%*6<JMZ_jqx}sjbXPF=2*{pcTI;+}h_I>-u`R?/ }fYA8taR>+ rcQC."ueUH7+vkZSD8)! {omd^XSKJ>?53.,%%    #%+-269>DFNPX]bjmv| $,;@RWfp~ 0?LZmu ->Nau+@Ngt3DZj'8K]n)8JYgw %9BT^lz !/4CJVajs  !&%+'+*),+.'+#)" !xob]NH91'}reTK;,tjQJ3&{fWB4!}kVI0#|mVJ3#s^Q=,wgWH7&xh]NC3+yufa[NGB43'#  !(06>DLT[dlv{ &,=GYcs +>M]p"3GXm.DTk}.9Qct,AQaw 5@Xbw!3BOcm");GSbny !)16>CJNQX[]cdijiplqkqmmlkfiaf[\XRQIH@=7/."! xm`YI?6" yg[I;+ xcS?- }hVC2vbQ>,v`N>*xfVC5 r`U@3!|tbWH<-"}tl_XLC;1) %-6=JR]fs{ %,CJ_k}'7H[m'@Mgu+CXj.AUe{ !4CYh{%:EYey-<G\dv!,:CPZfq{#%-,4197?8@@@B@C@B?>A7?574//(&# sl_UJ>4'yj[L=+ wfVD4 pYL7'q^N8- zmXK7) tcVC6$ylZN)#|rj_WODD41+ !  !&+49AHQX`iq|,5EQ^py%7HWky4FYm~+@Rgy#=Ibp(<J]n~%2CPfm*4BNZit%)5@DRVahov}wrl__QLB91)~nbVH;/~raQD3#|iZF8$zlZF9&~t\P<.o`QF1"}p`TA7& qd[MF6/"vumjd_ZXPOIJCC=<9:3511.1+1*2+0..4.726::>?CDLMQW[_eiqt}  29JQck} +Ncu )AMdu,7Q]q -<O^l|/;KYes $,;DN\dqy$,1;>HKQZYfcrmwy|~}{tsmjf`\VTJI?<5,+ qn^WI@3(vfZL:.|j]M>.}r^Q@1#thUI8* }o\Q<4paUI9."~zldXRC@1, xyupujphkhgigejdjgijkkplurwz}'/9BNXco|&2@P_m|"3DQct"8DXhx);IZlw)6JUhu)9DVaq~+3CJZcny $'/59AAKJSTYZ`aeghmlrpssyszs{s|sxswotlolikbf^_ZXRPMFE?990-)! pk\TG@.+vr^TF8*{n\Q?2$zr^R@4!}h]K>) pcUC6% yd\H?/# wk`VK@9+# ~yqohfca\[TXOUKSINJKKIKINLOPOYT\\afgpnzx )0;JMbev.7LThq&5GUgu$9C[fx (?J[m}6@Vcu%2EPaq~"2;LTdl{ '-5;DIRU_bipr{{vzpjf[[OL@;3)"}peWM?4' rfZF=*{k]L=.ucUF3(yjXH7'rbU@2#yhZI<+|kbRJ:1%yvmja^ZQTGFA=9821-.',$(#%&"& )!*#*(+,3189;DBJMP[[djnx| !)9@OYfs~'9DWes%6D\dy%8I]k.?Nbr 1<T]u 2BO_oz #/=IUdo|$(9<IPXbhsw}sjcXRC?/-}u`[C=)!ocQE4$xiYH=) {l\L<+ vgYI6'o^N9/q`TB8"to\WG=4% yslf_YTMIDA873-+(#$  !)&.03;;DHOT\bjry)1ALXfv}&4DUdx 0CUaw#7G[m~ !.FQht!2ERew'1EOan .9GR_lu'18EJVZijzzttdbUMF:4'!~scXN;1!pgVF6'zcXF4%|nZJ8)m]J<(obOC-"ym]RD7,}wkbZOF;4)! }tunjeb_ZYTROJMEIDEEBEDBHEHGLKRRTY\]ednpu{,5BMWho!/>L[iy&6H[g{"0CT`x ,?Pbn$6GSiq+<IYgq#1=GV^lv $,3:BGPS\^gjnwt|{yrqhe]YTLJ><2/& }tf^PG72{k^R>5% qaU?6 r^R=1 naLB-"|m`PE4' ri]NH8.&zsjbZRH=9-'!  "*39GK\[mr$-8EP_iu %5BQ_n|#2BQco"7CVht (:EYfv '8BT`n|$09ELWbfux  "&*.13:9>BCCHHJKJPLPMNQLOLLJIGHBC@<>862-,$$}wlb\NG;2%vk]TA:){h^N?1!|j_P?2"}qaSE5) lgQK8-|ofWNB3+|pgbVRIB95((!&/2>@MQZcguz'/@DX[lv*:EV`p~!4@T`r1@Q_n~&6AR`p~ &-?JVbo#06BMScft{"$,/258:;AAEEGJJILIJIFIAG>D9<832-+%# tnc\OI<5)! up`UK=2% yp`TD9( rfUI7/}n_R?3$wgYN:3yj`QG9/!vne]XKI;9-)# ()18>HJYXhjuz&/:HU^mw#3AMch&0HOfo +:KYjz )7GSep $2>NXfr-2FHZ_nu &-15:>CFKKRSWW]XcZf_cbcccaab_^\[VURMOEF><911'&}sjaVNB:.%wi`OH6.zq_SB5$rdSE6&|j^K@+siVK9,yq`UH:1  |si_VMD;2+!   /1?EQZem{+7HPcn~"-AM_o{ +=L^k~ *=IZjy!5@R`o$0>PZnv)4APWhq~ #*19=GHRR]^dfmnuvy|~{uzqpofj`_ZVROEF;91+( ylcXLA4)qfVG:) pbMG+' ~m]K>* }m\M<.yh_KF,' vi\PB7){vg`SM@9/&!}}yyutsqqoqmqopsqutvzy~(,?@NW_kx},8GUaq!6@Taq).ISfw .>O_o!3DQeq ,6KRfp(3BHZaou !"*12?:FFMQTXZ^abjekkjsjvmrqprmqnkogkcg`a\XVRLLCB<92/)# vnaZLB9+!|n^TD5'sgTI4( j^O<1~laND1&zj^N@3%wm`SH90" }pk^ZOF@7/*!  !(07@HPYbjs(0@IYet #+?M^k "+BLbm4>Sar!/?N^my %3=OVjr $*:;MO^dmv~!"$)'0*.1-4.411103.2..,,))&#!  yriaUOC;/& ztdWN=4%ndTE9( zoaRC8% }pbTI7,{fcIE2( ti\TE>/&ywij^YTKJA=911%)!  ""*05>@JPV^cms} .5HI^dt~);DX_v#.?N\k|0;NZkw'5BS\nz+4BQViq ',9AGTUdip{~}}rle^VQF@:-* {kgUPA7+~xe^MB6*tbZH<1~ueVK:/ vd\KA4% {leZPG=4)"~ztlk``VUNKEC>9:01,''! %"*+1199@DGPQZ]fjsz+7?LV`k| &1?OYkt &4DO]kz,9ISbr{ '/AH\dt'1>IV_nv %05?FMS^`jov|zuoh`[QNC<3+# uk_UJ;8## th\ND5+|m_TD9( xi\MA0) vn^QF9+"zmeWQD72#{roedZYMOCC<69*.&!!  (!.+56>BHPQ\\jkt{'5;JS^jt *:ES`nz-9HVat})<GXcs.7GW`uy&3>LVdk{#*5;ELTZdkp|}         }tlc[PF@3. ~tf]PC7,yh^ME/,reWI9,~nfSE6' rd[G?-# xiaRG?0* xmjaZRJF=92,)  #(-89DIRZakpz(0BIXary '4@K]gw"35#raWA7' |q_OB1#sdVH:-"{sf\PC8.#xvig[TPFA96+&!  &.2?AKRYegwx,0EJZbu{&9BRaj +6GWeu*7JTfs$4?Q\oy *7EN\fs~ "+5>KP]ans !!("))(+))-&+'(("&   uog\XID80&|ncXH?/# kbND2%}j]N;0uoVM;.tgZJC1'tp`XPABLO[]fms|-/BDW\lt.:97432111.2/213193;5@9ACBJKMRUX^aghotx$)59GMX`ks}*6DL\fq+-CL[hv *6FSaq{ )6CN[gv 04DLVbit%)38@EMR[]ggrs{{yolf`\TNI?;3,&xoe]NI<2'omXSC9,! rgZO>8'zm^XD?-$ xi`OJ:3$}yibYPF>3."{|vsomigf`^^XZYRVQSPRQRQRRTTXS[Y\__cbihnosuz}'/:BJT[hl|,6FO\ks (9DQ_k|(5EOaiz&/@EX]nw #.9ALVaiu|!(23BCMTZ^glnzx{wtnkcbYVOLC?:2,% wnc\OI?5- tjYUA:.  zi_QF7.~tfZNC6+yodXNA:*%zrj_XKG96'$ywolff]_XXRRNMIJGGBFABB@BE>BC@HBJHJNQRXW`_fgmoxw &19AOU`mq  -:GQ_lu)9CTZqu $1;NShm &/AHWfn %-=DP]esz$&18<ELSV_allt{{~}usnib`WTMIB;6.)  wmdXNC8-# {ud[LA6' rjYN?1)riYOA8'xi_VG>2% xqe\RI?3. wvjk_^URKHE==65/.)(%!#! " ($,+148<@DJKVSa^liwy&-7DKXcmz $3@LWiq $4?P\mv"/@J]ew-5HPbj} !*7APXgn} *,7=FLS\`hou|}vtie]TQFC72'" yjcSK?1*vk\QA7'~seXL?0& }sgWO<6%wh_NF9-rg`OI;3' zslhb[VRJHA>9610))$"! !"&)+/069;AFGRPZ\cios|.2@IS`gx}!,;GVap}%6=S\oz,9HWfr/4GR`px)3=IU^ks '/6>DKTWadlpy}z|qod_[RMC@7.+"  pi\SF>.)ue[LC2+rgZJA2$ }q`XF>-$ zobUM;7# ~wibWPD<1+  ||wrqjkdcb^^ZXVVRROOMLPJNKNKQKRLSPWSZZ^]beenkwuz~'+9>KR]es{ &1@IYbr|!)>DXcq$->IXct| %9?PZis $,;@OWamu (*4:>FJRT^\ggqovx}}tyjofc_XUOJD>;2/(" wkd[NJ;6&  }ofZOA8("pgXL?2% }vd^JD4( vnaVN>6+ yufeVUJC:3.# |~}||{|{{~",4:EMT_gpx .4BKVcmx+2CLZbs|(7BQZjq %)<EQ^hu).=DNYahzx#%+03:=CEFOLVR\Z`^chdjhlkojrnqnqnqmolmljiggd`b\\VVRMMDG<<83-)#!  vse`VND;2) pi]QH<2&xo`VN;5" ~vh]QF;.# |th\TF>6'" {yohaXPHA=0/$! $)08;HJV[blq|,4>HR\eq{  +6BMZcq|)2@LXiq-5COYfp}&.8AKS_cpv~ !&(038<>DFLNSTXZ]^bcdhelijmjnkmkoingleidea_\\UUSKMCD<;43,&# wnf^RL@70" ~~ifXLD6-#rhZQB:)"{qeYMA6+widUMC9." ythbZPN?>2,' (,6DHLRW[\ddknprxw|}}}xyurplhhc]ZUONED=74++tpc]QH?5, qh]PC;(& qfYM=5$ ui^OE7.{qd[MF:/%xtfbWPJ?;/+# zw{tyrvrssrtssttyu{z}~#.1>@OP`dpx #0:ESZkq)9AT[lx+;DTak{'6=NUepy !(6=JR]frz "&-49@FITS]\ffnnuw{~~|vvolkba[UQKG=>3.*! |nj\RK=5+ uh[PB7*slYQ=7% qkYOA4*zldTN@4, xrdcTPB@3/!~{xwsrrlokjlhjjijljmkopssuwz|~'/7@HPYblr-7AOXgo/5HNajz(7CQ\ov '-AGXcp{ -5?JQ]eow  $*04<>GFQRW\^ddmltqwx~|}~x|runnkdg]_XTPLGC<75+, vleYOF<3% }xd`MF7,zgaNE8'um_RG:0# ul_VJ?7+"xqh`YNJ>;/, '.63-!{{ln_[SMH@<31)&  -+5:>HIRW^dlq{ !,5>HS]iq~&/;IR`jv-6CNZip&2<GP^ctx ".3=ANSZfgvx !"#'%))+)/&0*+-(.%+%&##!!|uofbXQK?</+  njZVE@0+ rj\TF>1'~njXUD?3* zvjbVNC=0+ ypnd_WRLDC67.+"   "*,78?FKSX_fnr}%19EMZalz &+=CR\gq%2=ISajw#19GQXgm| (.8?GQVcfsu  !#$$&'$*&+'%+#*#&"#"  zvjf]VND?5.% ~sd]RG?0(zsd^PF<0'~sj_ULA8+"ypg]VHC91' xtkh]ZPPDB;33'&  !$*25?AJOX\ejux  *6>MR_kp $3()~xhbRL;5&}sg_SM>;)%pqb`UQGC;6/(#  )-6?ANQYciqz'1?BIDIJKONOQRSRTRQTPTOPPLOJJFFAC;<650/)'" }ymf]SHB5/"uj`UI?4&pg\NG60sg\PD:,$ yrd_NK96, ~vogbXTIH<;;;95915.0+('!" zskd[UJD:2+ ylbYNC8/$piZOG8-" rm[TD<.$ xkcVPA=.+ }toh`\SOHB;82.%#  !+-79AGOU\diqy'28DMVbjs*4=KT]ls&.9FPZho}#+7AIX_is}#-3>ANQZcgpw|     yvjh]WPGA;0+  yjfXQF=/)pk]RI<4'sk`TL=7,"zpj]XLD=/-~}qqagXXNLEA=64-+%"   !$-,76;DAONYYadmqy| &,5>ENW^gn{}-1>DSXenv  +4AIW^mt'-<?PT`jq %(46@ELTW_fjqw{{xnl`^TPI?:1-!{rg_WMA=.)vmbWPA=-(ywgbTOB<.%! }tgeVSDB21& ~ysofc_XWMMGC@:94/.')!!   "''..44;=@EHMRX[_finvw$+5=@OR_gn|$0;CLY`mu(2<FP[eqx *0=BPTaftv %(28=JHXSf_tp{~vshf\WQED85*% |pk^XMC:1' sgbQK?4*xohYTE<4( ~rl`ZOJ>7-( xvmjc_WVLMCC9;20-''  %%)./78>AHHSQ_\hirt )-:AJT\hnz#29FP[fq{  (7<LS`hw!/8CLW_lp~#%35@GKXZdmoz           wvig]VRFE85*# |ph\THB2,! wkaUK?5*uk`WKB7,#woe^SNA:2)"zzoneaYXNJE?>44.(&  %#.-77?BGNRX_bkow~ $/6?NR_gry&+52&}rl\XHB6+" wmbUN?7*  }ul_TM?8+# zoe^TJ?9,( ztoia\VQLEA:8//&%   #%*-18;ACOKXXaekpx|(0>ANV`jt~ '3?IV_mw(3@JXboz%+:ANWalv#(0:=KMW^cnq{  ~{qng^[PKD>5/%zthaTMA8/%{nh[TF<3(|re]SH@2- }ph_UNF<6*% }zqpid`\SVHJE@=:613),&##   !$%'++607:8-% zljXVH@9)'}vheUSD?2+"~zlj\YMG>60%|ytqlgg``XXTOOIKEFAA?=<:;7:697677684:6=7:>:A>BEDJINNTVXZ_bdimqvy}#%06ADTSdftw  $46HI]\ms'28HK\_nu %07CHT]env  %+28=DLNUW^aliwr||wqpfi`\URLIA<91,' vth`XPFB20" |tjaYPF?2, }om\YKDHMW]iox %18FLYajw~  +1@HR\ery '0;?PR_hny~ (*65CAKMVX_bhjtp}{{vslj`_XSNHD=50(%  }ujfYTI?9-& {ni\UKA80# }skbWNE;2)# ~zpgbURH?;0*% }{urmldf[`UWROPJJFG@B??@9<7:7777696:6:8:<=??BAHIHLNOUVX^^dgkmut}~ &.6@FQW_kq{#/6CLUcgw{$+7ALT^js}"-7=JOZchvy  %.1:>DMOV^^fjqt{~|}tpjf_XTKI?85+( rpc\RI@6/%~zghSRA;/&|lhWRD<1' zoj_XPG?8-) |yrplfe\_WURMMHDD?=<97713//+0(-((+(+()(***,.+2/4276<:?AEGJMPTXYabilttz *1:BKT^dqv&,;@NUamu(/=ESYfpx )/<BMW`iux )'27>ELOY[egor{|}ytmi`]VNJB<6+* vpb^PI?7-"zqc[OG;1'sl^VL>:*%~~mm]YOEC24#% zvulkf``ZVTPLLEG@@>8=38140/0/./,,.+-/)0,///3256:9>@@FEILPTWY]cejlut}$.4HQ]gr| &/6@JQ^anv}"*23<?HKSV^eflqw{}wslib]XPMF?:4-' om`XQE?2,"{tgbQN?7,"{ui`XKF94$#xqicXTID=5/' zxvopgicc]^YXXOVMPMIKHKFHHGHCIHGLGOJQNPSRXXZ^^dciimrsy{ $&36?ENS_bkuz#'3BFPNZWc`ljrvx}~zwwknce\[SOKCA85.+"xshdWSFC7.'!|tmbZRFA4.!usf]WKF:4*! otdcWRJC?30'  ~zzxtvqukpjmijhiihiihjglimipnqoqutyy| %(65@DLR\_mmy &-7@IS[emx )-<ALS_fqx")37BFQV_dos{%(027=@EKLVR\]begklrrxw}|~zvwpsllee]`UXONEE>=43+*!  |vog`WQGA90* ~ylf]TKA;0( xmh[ULC;2*" xqgc\RPF@;3.(" |{{{wyvwxrxqvrvruuvwyv{|z} $&23?ANN]^mm{~!)21+  ythg[VLF?63'"y{vsqphmdhaa``[]ZYYXVXTXRXRYUYW[X[\]``cefilmqrwvz +*9EEPNYWc_jiotux|}zusnlfe^\WPOFE?85-*#  xph`YPHA71&"skb[OI?6.$ yqe]VLD:2' roa^SMF=60&$ |zsyntlliihdfad``^`^^_\_^__^`_b`ebjfjkkqpvuzy $%33CAQQ_dmvz'*8AGXWmm} ,2AFRZepw+,;EGTWbjpz "".-79>EINPVZ^ddklrr|w~|yvqpjkbb\YVPNHC?:7/.%$ ypk`^PP??0/! }voc_QP=?.+ {oj_WNE=3+#}rqc`VQFF88-(" ~~}}x{xwyuzuxvwyxzyyzz"+08>ENR\bisx $16BFTYcmq~&)9<HQWbhsz&-3?AOS]`no} (%.059=AEIHPPVV[Y_`ceghknlppquswsyuwwwuxuvursprlnjkfee_`Z]UWOQJJE@A983/,&# vthd\UNG?90+  }xqd`VOH=9-(}xoebTRE@7/(wqhf\XQKD@66,*   #%-09>AMLZ[ejqw ''95JEX[eos~(.7ADUUdis{ '+2=?KNY\elqy|   "&-)6-=5?AAGFHOLSNVTV[U]Z\^^]`^^`_^`_^][\ZXVWSUOPLNFHDA@9=26.-*$$  xvmh`YTIF<70(!wrgaYOI@61&!wtja[QJC93+" {wmo^_URIF=:3-'# $--8:DGMV]bhot #,6GOXajq| !//:@HMW[ejox{ !'(/.65=;CBGHNNRQWVZ][^``becgffhfhfifhegdfcae\b[^ZXVUQRKNEEF<?58/0&'"zynk`ZQMA?20% |sla[QHB71' |skcXTED54$"~uoia]UOHD=82-%%  !%-/9=DKPX^dmpz '+86+%umgXVIB?7701%( vtfeYRM@?1/"zsibTQB>3)"znh]WLD>4*%ypn``VOKA>71*&  #'.1:=FIRV^dirw #+4>8812,*&!{xnk`]QNF?7/*  }tjd[RKA;1+ yukb]RLB<3,"xskg_XUMIB>73,*!  #'-37FQSdcpw}(-4=AHQT`amnyz  ! %'+-2.54:7=:A>BBDDEGGGGFJHGFEFDDD?C=?;<78551.-))$" {xold\]LMA?7., {}oibXRIA<1," }roa`ROF?80)" ~vtii^]SSIHA;;3.-%"  '(/28;AHJRU[bgnqz}  $13@DNU]emu} (.6?FOW]fnt~ !#.2;AFPQ\^gmrw !"#&')*,-/,4.4/1303/4/2/0/.+,)'($&!!  wxnjd\YPLD<:2*&xuid\TLF<9,) xpkb]WLI>;2-&! |vqkfb^WTMJE@<811'+!  $$-078@EHOVVbdkru  +27AHOZ\gou~ "-4:EKR\ditv  #*06>CKPV^biou{  #$#)$&')()((*)()&*%''"&%  zvohh[[OKE=:0+$ {skf[WNFA8.*  vqhbYUKE=71&% |vsjhc\YQMHF>;62-*$"  #&..78@BJKUV_bkmwx&/3?DNU^dmw|"&27@IN[_jox,-8:FGRV]ciouz  ##$(&'('(,(.(,+++(*'(%&#$  ! zvlka^WQLD?72+% ttedXUHG<6-%yshfYWKI>84(#}|tnldcXXNPGBB:900))!    ')/18=>IGRSZ_djpuy$'47@IMX[flu}'.5@DNT]ems| (,39ADPQZ\ehqt|       }xtji_\UPJC@65)(  xtjfZXMHA83)$|ylg`VVID>41'#z|spjg`_[TPMHE?>77/0)*$#   $&*-33:>87403+0%,&%$" !!%($((-*2/567:@>FEJMPSYXa^jgppvy"*.7:BLLXYbgmux $)36>DLPZ\hjsy~  !&-/6:?DILSU\]dgkqqzy{{uqnkbcXZRMJE=?33,&" {toib]UPKB>62*' xtmha[UQJE>:4.*!}{xusmkkbh^aY\WVUPQMNILFHDGAD@A@>>>>>=><=?:A=A@?C?GAIDJGMNMQQUVW[]_bdeljqpvw|~!(+47>DFQR]`glry &'/4:CFNQZ^gkoyz  (%.25:?BGINSWZ]cejlqtw|{|{usojk`cZZSOMEE=:60-'" |sqhc[WQIE<:0-$ ||rphd]XRLFC98.-&  wztrplkhhbe``]ZZXUXPUORNOLMKKJKJKGLGKIILJMJMMOPORSUTXYZ\]_`dfhkkrpwu~y %*14;AELQW]binuz "),68AEKSW^dipt} &'-43>>DIKPSXZaahhopuwz~}ywtpnhfb`ZYRPKHB@:800(' ztngb\UQHC=50*# ~yqodcYVNJCA75-*#~yzsunplkfgac`_]Z[VZTVSRRQOQMNNNMOMNNNMOQNRORRTTWVZX[^]`bbielloqsvx|  !+,59?DKPU[aglsw~ #'/5:AFLRY^ejqv} &)-47;@CGLORYY`aeikoqvx|}|yvrqkked_\YTRMKEB?963-*%   xsoefWZNLC>82.$" ~ysli_\WPKG>=30,#" ~{vvtpomkghcea`^^[\XZXWUWSVRUSTRSRTTSVSXTYWX\X`[b]dbeggkkopsuw{{ !",-4;>DJLVWablnv| !%+26@ALOU[agmry} $(,/49>@EHKQSW[\acfklprwv}|~{yvtqolifd]`XYQQJLDC?;64.-&&  }tsii_\UPJG@96-*% tuji`^VTKHB>93/)&{w{vxtsrqqpnonmmmkoioiojokplpoprtsuvwzx{ "%,/68@BJNSX]bimsv  ,+68@BLMVZ^eimux~ $%*.24::ACFGLNQTXX^\bcefjjonrqvtxwy{}|~~|~{{zxyvvqsnpkjidfa`^ZXVRPMKGDC=>946+-'$" xznoef]XUMLBA:71,&" }yrrgh_[XROHF@<820+&#  $"+-189BBJMQXYbclluw} %*/58@CHMSW\aflotz}  "&'+.0449;<A@DEJIKNNQRTUVW[W_Z^^^b_dacbdccbebeaeadabaa``^_[_[Y[WWUTRRNNKKHEF@B<<8742/,*'$"  ~xupldeZZSNJG?>72/(&  }{urmida^XTPKIBA;941.((   #'+/46=>FGMQU[]egmrtz #&+23;<FFNQV[_ehnqu}| !"&&*+.0064789=<??@CBFFFHHJKIMKLMMNMOMOONPMOMOLLLKKKHIGFECD@B<?:;95722/.*)'$$ |yuplhd_[WQPJF@=74.*&" {ytpmhdb[YUOOGGA><550+*$$   "&,-45;>BFJNRW\^egmqu{}'(11:=@IHSQ[]cijptx~  # '%++,/.327598;;>>?AAAEBGCHFGGIGJHJHKHJHIIHIGHFFEECD@C=?;;:874410-,*''% $  {usmkeb\[RRIGA=94/+&! zxppigb]YXQOJFC?<66-0(&$  !%(-048;@CHLNVU_^hgoqvz~ !!)-179CAMJTV[bcinrw{  "$$((,,..314576;8;=<>=???A@C@CBCCBDBCD@CABA@??>><;::967431/.,,')#$!  }vtmlec]ZVPMHD?:62-*$ {wunnge_^WWOPJGD><843,-&'  !&(-/26:??GFNNUW[_chjprx{ !#)-15<=DGKPTX]`dimpvx~ " #$$('(,)-,..0.0/02/3/30312202000/...+,*))&'$$"    zyrqjjc`]WUPLGE=>640+'" zysqljeb^ZYTPNKFE?>9832/*)&#   "$)*.1389<@BHHMPTWZ]bdijprvz| !#(,13:;BCILQSX\^dgipqwy    !   }yvsmlgc`\XUQMJEA>:710))"  ~zwupmjfe`_[WXOQLIGCC=>8840/,*(%#!  !%%)+//367;=?DDHKNPTV[[`behkprux|~  %&--45:<ACIJPPWW]_cejlotuy{}|vvppjicb^ZXSPMHGA?;851.)(!  ~|xvrpniidc`\[WVSQPJLEGAB><:85511/,+)'&##"     "#%(',+0/4388==ABEHJLOQTVZ[_adgjlntt{z !$'+.258;>BDHJOPUXZ_`dgjnosvy{~xxtqmkhcb][WSQMJGCA=:530,)%#}|xutpojjdda^\ZWVQQNKKEFAB>=::65401--+))%&#""        !!#&&(*,,00356:;==DAHGJLORTUY[]abggknptvy{~  $'+.339:?@FGLNRUXZ``gfmmptv{||wwrqniiad\]VVQOLGFB?=8610+)$# ~|xvspmlifcb^]ZXUSPOLJHGCD??>9:765210--**)'&$$!"!!"##&&()(-+1-426699==@BCGFKJOPSVVY\^abfhkmprvw|{ !#'*.047:=@DGJMPTV[[abghmmrtxy~~~|xwsqnkigb`]\WUQPKJEE??:741/*)#$ }}xwsromkgfd``^YYUUQQNMKHGECC?@<<:9855322//..+,)*((&'%&#%"$""#!!""!!!!#!"#!$"$$%$'%(')*)-*.-011336699;=>AADEGHKLOOSSXW[^^bdeikmppuuz{  "%)+.147:=@CFILNQUVY^^cdhklpqvwz}~|zwurqmkhed`_\YWSSNLJGDB><9742.,('#! }{ywtrrlnhjfebb_^[[WWTSRPOMLJJHFFECC@A>><=<::996866645434352322314143344456576889::;<=>?@@DAGDHHJKNNPRSUWXY]]aacfgilnpssxw{} "%'*./348:=?CDHINNSTVZ[_acfgklorsvxz}~||yxvtpqlkifec`^\YXTSPOKIHCC>>;8631-.((%"  }~{yxvtsppmmkihgfcca`_]]\[XYVXUTTSRQQNPMOLNJMJKKIKGJHIHHIHIHJGJGKIJKJLLLNMNNOQPSRTTVUYWZZ]\`_abdfgijlnorruuyy|}  #$))-/2478;=@BEFJKNPQVUZ[]`adejilnossvwz{|}}yyvttppnkkgfdaa]]ZXVTQQMLIHDE?A;;7641/.)*%%!  ||yxwvutrqoommkjjhhgfecebb````^_]^\\[\[[ZYZYZYZYZZYZYZZZY\Z][\]]]_^`_aaccddfggiiimlpnrqtuuxyz}| !"%&*+.0256:;>?ADEIJMMQQUVYY\^`cdffjjmnpqttwxx{|~~}{zywusrpnnjjhfecaa]^YYVTSPOMKIGECA>=:87330.,*'&"" ~~||{xyvwttsrqqoonmmkkkjihhhhfhegdeeddddecdddddddededeffgghhhiijjlkmmnoppsqttvxwzz||~  "$&(+,/1365;:>?BCFIILMOQSVVZZ]^abddhikknnqqttwxy{|~~}|zyyvussppmlkihfdd``]\[XXTUPQLMIHFDBA==:8643/.+*''"" }}|zzyxxvvvttsrrqpqooonnnmmmmllmlllmlnlmlmmnnnompoppqrrrsutvvwxxz{{|~~ !#%((,+104579;=>ABEEIJLMPRSUVYY\]``ccfghillnppssvvxxz{|~~~}|{zywxsvqroplmjihfecb`_][[XWUTRQOLKIHFDB@?=;975310.+*(&#" ~}}}||{{{zzyzxyxxywywxxxxxxxyyyyyzz|z|{|~}~ !#%%)(-,/124588<;?@ADDGHHLLOORRTUWYY\\^_`ccdffhhkjmmnopqrtsuvvywyzz{{||~}~~~}}{|yzyxxvvuttrrppmnkliighdecb``]][ZXXVUSRPOMLKIHFDCA?>;<885521..+*('$#!   !#$%((*,-.0134588;:>>@ABDEFHHJKMMPORRTUVWXYZ[\]^^``bbddeffghhjjklkmmnnoooppqqqrsqtrurtsststtttstsstrtrsrrqqpqoppnomnmllkkjhiggefddbba`_^]\\YZWWWTTRRPPMMKJIGGEDBB??=<:9765320/.++)''$$!!  !##%&()*+-./02255779:;<>=A@BDCFFGHIJKLMMOOQPRRTSVUWWXXYZZ[\[^\_]__``a`babcbcccccdddddddddddededecdcdcccbdabaa`a_`_^^]\][\ZZYYXWWUUTTRRQPPNNLMJJIHGEECCBA?>==:;89664320/--+*((&&##!   !"#%$''*)+,-/00234567899;<=>??AABCCEFFFHHIJJKKMMNNOOQPRQSRTRUSUUUVUWVWWXXXXXYYYYYYZYZYZYYZYYYYYXYXYXXWWWVWUWUUUTTTSSRRQQOPONLNKLKIKGIGGFEDDBB@??=>;;:99674532100--++))'&%##!    !"$$&&((**,,..002234567799;:<<==??@AACBDDEEFFGGHHIIJJJKLLLLMMNMONOOOOPOPOQPQPQPQPPQPQPQPPPPOPOOONONNNMMMLLKKKKJJIHHHGGEEEDDBCAA@??>==<;::88775533210/..,,+*)(&&$$""    !##%$&'((*),+--.//11324455778899;:<<<>=>>???@@AABBBDCDCDDEEEEEFFFFFGFGGGGGGGGGGFGFGFFFFFFFEEDECECCCBCBBAA@A??>>===<;;::998785645342210//..,,+*))'(&&%$#""    !"#$$%%''(()**++,,-..//001122333444556677778889999:9:::::;;;;;;;;;;;;;<;<;;;;;;;:;:::99989887878675655544332220100//..--+++**)(('&&%%$$#"" !   !!"""##$$%%&&&''''(())))***+++,,,,,-,--.-..-..../././/././/././.......-.------,,,,+,++**)*))((((''&&&%%%$$$##""! !    !!!!"!""#"#"#####$#$#$$$$$$$$$$$$$$$$$$$$#$$$######""""""!!!!!      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom2-Hardest.wav000066400000000000000000005420721366722712400233330ustar00rootroot00000000000000RIFF2WAVEfmt DXPAD data:'xE ,1:FM.S]UWEWWVVVUfU,TAS@R QOMJwI!GCDF@A>@D ?+,;*h 7C0 #?2EA}3G >D #A5HQY:UD&, 㾵m[5c΀?蝕bT"7;%zD@ebЛظd>jBJ}\eg4mg Vr B%#Q#g#8* 4=HPSXU8UVTW^=eEi dYQQ8V/U`LD%BSC>HLJB>.DNZ_bcX^TJGI Rj]Tb^mXOVZbkoole\oTQWahiKd\WSVUcS>L?30!n; YB  foy6 2$/9?=3(! ?tp!& _ r K fm x Chh-zP"#*! "#!uD,x &Zu۴pE/$sv (#'+l/^4e7|752;0-+) (6&!n R Q_=-( "#iu%:+2-+*'"@1  n&K Ћr ̒Ȓ~>]u!]:eÊ Yu+:{;),7CvŸbvTkAϐ%nR8ʵuP_{D/Ň]c ]e %"#"$&)/6/=AEHHpIKMgOTP|PPQbTVVUPUOTQN}LJJMRX9\\ZZB]s`bdeJbz_^_6` djnkrdvh{~|}|H}|}||||||a||xvv~usojb[pVQNLmFA?q= :5N1-,G,,|,*F'C##;;  f~Vb/rvw2)>'y}:bmglakY?ܫ3z| 9ޕܰۨܪ3ބ5Pߠ#݃-L,&ZH>upUnCAq#TډPgiԙ#hU֏OH y ,V‹Swf-gϱ̒Tˇ/:b(ƨ_*NѯѥFӍג٪ڧۈܴݬ4ߖ{O>o.7C h/uvH<"AL@H|;݈7۳j_R_OeAGP=ڀZ܃ۊעw)wxJ1AχC ^dC#noly&b@a{ǥͯFhpWfϥR.ϴN.ҡ6y5G١pםmՋ(F>bټؙؑپ٩vhX=ՠXׄ%v޸ݎP7MZt*^ b/h -z\mW@HMW!MmZj E#&(('&&'')+.1]407Q877!88E999;@ ASAAdBBsB"BAMA@@?@$?>=>q>==;I;U;;::2:f8|6v421110///)-S+**)'%&$#"!7!!o!"$2&&D&%%%$=#! zYfV ^Q wc*vg?"YrtcݖMy+[3ܐ 0Zۢܕ*h"ڱ Њ fŽkm/ܼ̹ٺ bܛڥ#QS `DƭcqOU>b=lNտsxhwW ⽼&D Ľŏʗ̠4 ͡p_ܮZܸS+Mޠ]8v AC DkO$o>2VV& HtJwV5J3cYI<5_ h"z$l&'''U()))):*l**u+[+F,k--.w-,,=-|--.-,+a+w++,-.u////t01K34567v898888#87b894;;4;@;;t@AOBBCDDLD5C'BHAE@??=<<;j;:;:::9u875%532d10W0q/.,)']$!}:7wM  rvlA@j,k%##R[6aUBYTNX U "!o#|dsHKGdߍ&Qݜ]5ښٰ٬فڤڕaKٌ؎خإ׷djړڂCܺݿ>ވGZ\Thl.'bܲܦ܍ܨ܉[ݯq߲Iߕޠް߹w3h=H-_8\l$=ovzmT%9AC*d 6 KWZIq3D{p *. !"#$%&''''(H((((#)P))))*))*)<)%( '&&%7&''O()*+-a.d/<0211q2K3.4J4=4i4N43r333)3B33433d321:10/C/.{.).-E-8---6-,,*(\&$r#g"w! 7kIS^J ?VQ H f{!;^07A8CCC)~5g5$8OOY5}TߣMdGceeW]R{}&0,|W FNdJ<kvqf(k"8Pk=%l _I1WGs&>K0T =3{J h3bOh?Unxuv(ocryxGb*ZZX J f|:/W?j%RDVg@0mwaefZp=_ !x"#7%%%&]''U((/))F*@+,F,>,9,,M,,-,!,+^++S,,,J-{--s-f--,S,N,Q,+E+**))-(/'&$E#! vpH`LVGp  i \ E d` &#2o=Pd7ya&y:1h2ODI2b/0--gRV'5qlB_$`ނ@߂߄:FN߶vJݛ݂ݠۯێێ|ۂb;I-nޚ߉,by2L1l`2\Z9VppC\9="L g Q L7FS+:  b W ` E&syA2OUUuEL^.yKi:EW! ""###t##$K$w$$ %^%%&E&&%%%&}&&&&)'i'y''''U'p''h((4)C))***2*D)((A'& &%.%$1$?# "U ? 4!!5G& 00 0 z e  Z VgY %Dp!ލu5cݣ;ۼUڜ_@B?ى$Lڐڐڣڨډqٝفڻ*۞M܍,xݴ%ާOd+k2y| %u@l "!|! L ,T]2Fn~ 7 Y # I"Uer;.?^1q<` ~#4Z Za\(zwfH<iG- P^ݧfHk܉0C۠ڽٕvVHG5؟֌ODpOQӛӓԿkk`>3ӷZԘՉaM[J؟c]ډhܹV?!Fa8+| Z+8\l-z'_gm0#K hl F B 4 n  3e>zo#*G!(spOl-.LY{!Gd[t'XFSC7Avy~XS[0tj<R[# w .!*8$h7l]/NNRSY(*c~!.pc^\0vt* ߯Cޡ#ܠiܼxxڸٸo8-[ל֪hԮԺt@-ԱӍӈӉjOO9fGMG4?3<ԇԅԪoՉLxJٱګ_YޏR?C !SZMoZfMKj?p @8b?qa,9RF#Ap>\MR#&P ,l:`ep=# (.&>?O@p@FL( !D!5! Q!{!W!U!!!C"""""""J""H""""""l"7"6""q! : 1  D!/r:O} ?VJn"a D N K QhA-%K'K=h$f#X=oW1j*zCc o"4UrmfTPwޓ݋ܴ2ۺQڱ,|ؠ:;շR22ϗ6δΞΉβςϞϳ>Ѝ<ћ=ҢgAL|ىg n(c:%V DkAK6Rt}sIi*_V B W a   > 8Z;\)k !/-T{C{z%8j"Qc~ / ; v !y!!!~!!!!!"""!x!F!!!!!!!:!F!`!v!g!!!W! ! > 1Z\QDl!^~bMQ XZMnL s[$Jo8 ~ F 8 & ]     $ N l = d ' y (a-b [Q]R;Fk }4E!1i^0MNO esCtE6 ?j[ޕ|q[ݪ݋HݶkEKD#_ܡ5^ݕݭjܰܜܤ |5ޗ=NEoccl6nLxvB.=:N k/ #DqE-Ig$0v q :  o 4 o 3 2&Ov(T#Xa\rGnBsc{ Oq0 =}yoanJ=q} uh g2 T `q>~h<nKDy } L " m a V F R k G 5t%~3E[J6o ^f1g>&=FTJ,#B|1(z'+(<+E vk&eTCa U Dai%ߺߢ߳FwU>߷߻ߘߟߨ߼F; (vJ-)dXlAWUN%"u};,3!VPJ}MZzL ^ B,v2 u $ e  9!wC_fA 6_; +e#J~yiS/]M#X`E@%DqXrU+"4C6,Ls;FTq gx1;  = F 2 b4MUA|B@9HtY c"MqT|1x`!,{ i Gh %J v{da`.M@I D6F6q4;J\T7mVesIY'_>s-ߺߣ߇vߖߤߗߝ 6AO,|E uio\k;&zW\QgOFa(c ERql9}u xq0X  " \ P=d O'U@-} s?Nk)HEC' U#4g2yL3G0|: H2Y7Ok<lN?6;6V 9 ,  d @W!hUH&Xj2<E\%P? P.~7S>Q$m5&GO3Gatsrxwj;`$Z1c LKv\ConiS&Hdz2&Eb}<B#rtzMiyucx=s(z@,`^^)s >dDN 0 h 0 l ( s S  c 4 }6v 'e<INzTPx/jSTz&L#1p(fQv`$oA-5; 99@s n/E3?WzIqPM߼ߴߟ߀P8(,=!"?wF)@t \S lc z#U,V,u+>bV }!5Qq Yg(&Y?D-tDE<l T I ) j   # 8 d m i b \ r N /{P0a7~#5)+De CRb *S!N 9m9>QSRkVwgn~?UKD6wAPZ e @z2 d A   $:yM u%3dz3s)T'0]i<ZYpBr?{l;x`5wlY(]o5`,r S3`qWT^Z)|RJ >BPETIVP_u2~OC^3_G;`[CH`3>7e8$P,Ph~N t W F  L  F J4V*c@b5t!v#|3]H@q)Ut\HELE;{ogEIz_C0 n,oB%FG{6$\N 7   / B w @3DY !ho$N=fKJ\]3r%P#]-[4Y'l>~fW7+ G4X"m}=q)\y^#iE`@$#=]Pl~.u)k<*fG-=bP5o#yHDavw tFYAKp/h I;Z d!O~<Y ) F N O k w t  $ R r  I % X  n ;CzAg< jZw\*7F]kh8czwogpwqIt)Wr*di{wjQ+2  3 9 B d  R n(IRIU%H^E+%K2t]=hKT[<' pR0 uN#FXQ3[:MT~zhG#^!o^ab]Xj?Pd Ffl7 9eJC@%{D8h5mwK^@4|@R >}_0jG@;~k'}XF@Nzg  i @  ] O0cC4ve"[#:yN-Oy365#^0i8 b6xQG/,e? h,~:R>r S S  [  f  n ' v  i$O C|I)8eAq(=Yk%ken.c5YZ{T$X*R#X"q8Iz4RQCT3H GV|aI<%!!5;;, &.Bby7a .Ae*cD!`#Kz)Zi;)}00+{N6c${*F;X#pX/zRV;~)X lS J  p  }  L ~ , w vW*|nQ;y7`[Cy]2`T#!3Sft}xU u@:qy s K).Lal* x  9 c  \ # # :w4^9AB0}-&A}8e >HIs4nF~BYZI `?\ Q,\,Vk)u 7Kn4e>sgzN0TwC Ru %J-i=d5T<;I/c'g[b)X"Vn%n+s&=Nyez2+6{J  o _ T A >UB Uj YR4&bQEt .8Tvg2^7}/i2p_^ e < x - ] k " r 5  U $ mN/M E:VRx%s[8u!Ceh{GMR!i3;PMFq!;~<`6R[8G&SxC~`@~n__iZ_^{"6]rNv 5Mg%Bj U:[;}>|b?R `YCs-_T.w"=O$vMPhY;D(~0, l  E & }  O  W R`##R~6iOT:\7z$Lt-_,e2d0RYPU^J2 wD T$tMn/P9(Px 3 r  V q }   *Krn(Q<wOo-vLH^ s'Q^K#j7t?T6"tX*Y\)_q7Z#K@g@QybXK1}zt^P997;K]ha_hpmebn>EOUxAl8%\-"tKi/` ^1^ a\YPe={i/"kQRGe?[M?b |6 t 9  F J  X ^.vERDwM,n)X8cw/j 4c!<\rc?$~?GB o1IVW5zF_  a  ' H 8 z%FXSK.R!F}H(cb3S ]4O a0S v;w6fL x=q:g3wCy\A+sR8jJ( nV8.'! )BQMICLU}Bs NP8-^c39cE/z:k hFQi>s83l=-~"m,cDqQ i : % a  H y  @ ` 7^>oPy8d*Tv 6h:e /f?i "&!35=4-'"!b6L ~</e.\L$ i  h  / O a  reM5h~NxJ$XY h$l*TW)yMpJ)V!V IWPJ jE!^8 g?tbQB1n_VB, %$  )7E[~;d=gOJTQj>"r7oaF6{L=/y<#r&_?P'Ec7X#V# ' v : y  : c 2 f 3kb!3YIz<`I -UJv=Y~:T^q{zoMO)^E6:&58B 6 T  W L ? [ p&afs k!|,Jn:ed5N- mR3#lR-Z. b8 r;w8U'X |OzN*oA`M4zW2zzVC!_H!.HZm=l%P&]PkEn3j@=1`>q3z?YNOq/[b6Smv&o7 k % c 3 Z  0 H h } / J \ p -Sr#-<:Lco|)7=M_u4C` -:BNYegrxgWUF;% vT>/m@i4i* n * ? V  S  R  MAkm Kq6`k2|?d,Gs+k"BVX o{)R Q e2sC!nT=tX9zR*c@kE!w`PA2% "&$&!7Kj,V$Dn-b@w+\=n].f J,kX%xY _WL;;D38]/M+^L6s A t  D v  ? g  C g ! I | HnVIx3e8p"RQy<\zwcN2NSI\8z` J B ? /  1 {-DCTm@I ^%uG|\=#wW5wX0Z/~M x:pFW){Ff>a,U.Z, jCdS=1oYE.mG'nW6 +Vp'S 3` Du 2[F~)Z J{*v M$sqa_jJW`H.}V#hH~I}?b,Pn ' : F R [ p   ' 6 P f | / X z  J m  4 ^ .Pn &3DLYctz&<MTdqfR<(nG&b@ x A  q =  ` $ } J  e 2  {= o<q3g%zAu(@Hgqx#ib|- l4\)xN#|`L4$  )/{ Ij]Q 9k'Qu-\%Tw0]$W{.jLr, V  F  @ x J  _ 8b6t,n'[Np.Sy+?Skd? ].}BTW7jF _  P 8 : Gv8YHeS e(KsEwJGf @We%j)v=Z+q7e6a2 }R'qO%e2{T*c<|mcRF5,',+)"'$ '-pR@n, N n ( R = ^  / X z  6 [ w #;Zx /<HVj#4HUlu 7ARPW]jypiRI/!tZ5l=d8 V % U " e 7  a 3  V K^7:IZ ]F5-032w/eEWS c)a+uB^P+ ^  < l  . W ~  @ b & > b s +8N`x 4Jew+?Xgxw_H4 q[B& z\E, m N #  Q $ o D  T ) | D c0Vd+gk'aTHz8bKr1k.t2Q|N"OL_0g> |]=aE x[?#rK'oX7!zj^I:*tgZW\_fa`aeelly Ga0W"dUS\%i,mAWWU[ KA~%YY7lQ.n E0k#^\U>~$ ]  K n 3 T s  2 S t  E c 'Rv<_En,Gl&0=IIOFD93+ |jH7nS<!}bBW+ f 1 w . Z  u " p O@ b M%t%-5HfQ[ f(\&l<jEd@gH)^9dB+zW/pM<vbE8( }q_XN?6&! *4GPbp .NuBj1Z5c 0c=hCr9uIS LS]O,iZ6pL4z-o`W0e7n > h  6 V y  $ C \  ( 9 I \ o    & A G a i  .>NXhwzsdXN@=3,  e [ C 7   w Y 4  x M " \ ) Y Tr0Ot@ i4TxMZ$l= V7 ~S1 rF(~X2 [1|MyO#tL#f9i@iC"iN7uP0}bE& }`I4 ~riZSHE:<8>@IPbo'Md.Il!Gi9^)RsM~Ep0f;uL$_\I;|&_Q8x^JLs?a.Jj(Eay.Ty 4 h 5 ^  G j $ M i 0 M n  =Wt,F]q $3APZhjpyz{oh_RA2 a?W9 \ / P  U { 0 @ @0}*z#z%1C[a%yHe9xQ+lBmDp@d<rF#}W1^CtK4|Z4mQ'yV5zcL=#pcUF8+ )5AO^gt3Uk8Wk>\}+Gp8_"N/fP>{G KJF B0k ]K&YOIv@p.T9g6\u < Z  ? R n   5 M e |  " 5 L ^ w  % 8 N Z p !.CHZ^nx~{uf]M>/  } a A -  g M ) m D % \ 2  { O " Y wBuA}Kp;rJ/_<^? sO#|Q$sKa1n@ R \%e5 ~H|J$sL_@mR7qQ1gH3m^@2 +BXn9Xx#DfEt.a-b>vaC(^O|)]?t =sK|EwJBr)U%Mq4Y9_ *Jb1@`r % @ Z r  1 I l . S u 2 \ * I w 4W|8Sj)3598903*+!  zbJ4vS0 ] -  u @ d # s / ]  ;_y)Gc5In&O >:}:]#{D ^*Y'l8 ]?sT,vU3gG*z[6^D&v`I2peSK9&  '0@N]t!DWu'Dj)]DyI(hUI < < : 7 6 * +    h ^ K 9 &  x ` I +  d F '  oQ4uQ/[8wN(V*r<p;uA{Ch0i8m4 }Q/qI'hE* qQ' nQ0sU2qY.qP2oR* aB%oV3"qdXP@@00+,*++,18?FRVro=Ux1Rz3] 7aP#Z@y0q-m&eS5mOL~4b My FsAh>l>i /Vy-Om<Lk|  / 9 S a |  " B S o  > X u  " < Z m  ' < S c ~  m ] E 1  m L -  } ] 1  o J  v G  m<Z-X+W%Z Rv>n>l? ~Of?sN c<qR/cA#qJ&{]7bA(|bK3% {m[Q:/thUJ;-|tnobd]][]^col|)>Lbq )>Zw&Ie(O{+Y :gNw&Kz!O{+T7`%XNN{#S%TAw,Z@e&F`|1H[j}  ! . 7 F Q ` j x   ! 3 E X i z  ! ' : C P _ i w }  t o ] Y D > )  m ` E 7 %   ~ p V G /  {eL=%bH-w[7gEwP$xHc7 ^; ^6 lJ ]/\6 `5 ]7 nG!qQ*sS) |Q7 ]>{Y4gI&fG,zdQ<*(AXm1Vw 1Z(S}/YGs2c#SBt6g+\(Y"WLz 6fBm1[}3^z@`~1Nj5Im6Yy#Gc 8 ]  > ]  > d ! G h ) I X } &4;KO]anmtws{sxqqhh[WPB:,  v [ = "  f ? ! e 8  ^ 0  u D  s;]*B ]%{? c0^'a(pEg7j?e; \4|Kg>d9|M/|Z>"eN.wgF7fR:&k]I7$xplgbabaghlsy/?Rhy5Tk ?c-Ps5Y/V-WCv Cp:rErEzEr 9m3]@h ItGsCi 0]B^*Ge ( E _ z  & 6 N ] u   ) > O e w   1 ? Q ^ m ~ y i V E 5 "  z Y ?   _ > x V 6  rK-`BpF+{Z5a=^<{O*U,xIZ+_2r;Q#j<pH!gL* oW4jH.}^C#nO-p]6ydC2l^SE>1.%&%& +(49DNV_lq3Ib~5Tq9Z;_0Z Cn&LAk/b#J  \ 0  k :  l ; n7\+}Kn5X!Eg5\#~Bg/[(OO%f> ]:oI"mQ-}cJ/u_M;"xfR>. lbNC3( wjbTPEB;957.2,2-204:@FNRZ`fov#7E\l:[{,V~'O~ ?l 8l  ` 5  tJ$mE"iD$oO' xT/ sP*mL"kI gCU2 rI#hG!oE%|];}^@w^;$pVA%~iK7{^J3y_K3! {laOE1/ %/>JZj~4Jl$Cg>c0W'Ty!Kn .X{0Vs7Tv1Wq;Zz&Gd (Qp EdAa3Wu=]z4Sr<Yx/Op * M q ) K g  * M `  ! 6 ? P V g i y v  } z p l a [ R G < 1 %    m \ J = &  s X E *  h J 0  c=nA_*^0Y,Hl0P|LLc3 e6zM/jB+kR3qY:%~cP8# f[A3 |rcZJ>2% xm`L@.}rmc^[WTVU\cis}':Ul8Nn =^{Cd6^6]4`Do@d 7e>oGw/`Ix&Mu=[?a9[ Bb5Ql # B T o  " @ R k   4 ? X f y            } g U 5 # i N /  } U 6  mE vN"~Q'|J%}U1i<a?yU1gD(u`A% mS?rX<%xg@/ jI2uWC$ fP4~nP;" lY=! t\E(vgP?+ +;N_r0N`~6Yv ,Gg5Kk M [ d u { | k ^ Q > 5   n X D -  jR5dBrM*sI&d<xR,fEuR$|T,W/W7`:nC!bLwU5tX5cH& |]F)q[=& ~jSA'wl\RF?6/%    )0?EU^mv&5M_~ !AWy=[{Aia4a 9a9e@lEsAqEe9k9g0X#Bt .T{!Ge?\u$=]u $Jb=\z 1 J i # ? U m  & 2 F O a n x       q k W J 6 *    f N 1  f I &  yU2yQ)V(wH^4vBS!g5L%m>a. [4 o?|S0oN'rS, c>hP1u]H(lZ;-yhVM70   *:E[h+B[w9Ot(Aa =^~%Bl<_7Wz*Nq&Im'Ut1[En3U:d7Xz!9az6Tu &H`/Lk 8Ngz  3 @ X ` v   ) 0 9 @ F M P X [ c c j i m n o p q p q r m o i h a \ X S J E < 4 ,  x m R G ,   w]I,pL5iN-qU3xO8iG'aBtX4{]; ZBeJ)yX:hJ/mT7k\?,gP0mU9"kT<# zbSC+#uxsqqoqsryx|~1=N]n $=Ul A K J R O Y T ] W ] W W T N J C < 4 + #    z d [ G : &  h[4#zd@+lD)vP)gAR2pI%sI,nM#lK lL"xR3jV(lK+ rN3aI)sX@&h[?2~q^P@2% (2BL_h} 0AWi 9Ri/Hi 'Ko Dk/T}Ae)Qx?i.T{9`8X~*Ij (Kg+P`,AZn+I\t-<Zg  ) 4 H O e l | z t c c O L ; 4 $  zqXI5%r\F1xcE3rR;s\;"}dF*|^C$|`D*lT6 oQ=fM2{fG3kO;z]B( tS<"[R/!vcM=%n_I9'}ph`VSHD=941.,+(,(.-258AENX^js{!'AOev#Qq0CWq *:M\mz   ) / 8 @ D M S X ^ b e i n p u x | ~    } x r l h c ] X M L @ 9 2 * "     tbRC,jS: cE)oQ0jM%{X5]AgD jD f@a<f> qH(wT2^@sV3~_C'x`B* }_L9vqb^SODB66..%'$$"+*349DDQU_foy!.EQh}8Jk0PpB_7`~=d)Sx IxHn>d'Ts0Y};[:_5X{ +Lt=ZC\}+Jc # E R k {   * 9 B P Y h o | u k Z P ? 1 !  | b P : $ wa='nT2jH)]?vI.~V9nH)gH#bH& tX7 fE*tX:nS6jJ1cF&t];"~aC, xbJ4{jVE5) |u{uuxtywz%4DUgw,L]} =\z$=h0Yw:a*RzDtBf.W|<a:b 6Rx<a|8Wt $E[| ">Zs4O`w+AQdu  ! 3 ; G P ] c q v ~ { w o g a U O C = 0 '    uhZK@.|_P5! oY:!{\A!nR0wT9tO2iJ'^AkJdDc@dEhA$hEsP-rU8vcE/vfWF6' xrkb_VWILAC=:;76799[{-Kh %;Uk  1 > V f y ! 3 9 C M O ^ ^ h i p r v z {  ~ y | t r o f c \ S K ? 3 *  s ` F 8   hG. nO+\<Y6 qH!`3tM*iBZ5 V3jH+ nS5eE* {[B aN*gT:%{jTC0yj_PD8+  }~rqnikfgheiilpsx "/@Q`s*FVw/Ml)Jh0Ru@g2Y{!Kh0Wt9Xy4Xs-Nj#B^+Ge !HX~:Nr $9Ldr %+;ANT`gmx|xpi`XPD>+' ugSC/nU@$zaH*w\B+ pT9|]D( gJ1u[B%vW=%sZB*hQ7 sYD&w_F*cO0 |kYA-ucTB3#|rkb[UNIF>::15..,)((%')&*)-20=7HDRT^cqu ,;M_p ";Vj5Pm2Oo#;_u#A]{)Hh =Z0Tn-Qn 4Lu3Rt0Km.Hc| #9Ncw *@I_m~ ,:JSbk{   ( ( 6 5 @ A H J L S P R T P N J H D > 9 2 , !   ~o_K;'zeG0mL0vY7tT2lK& hB&kN-bD* hK1qP9xTA aH.oX8"iK8x_L5" ojVJ;- {teeVVKH?:4.+$   &,6>EQXeo}.@Vh3Lc$=]x 1Jn,Qn=\ ,Vo De 7Su7]z:Wx/Ok"?Yz9Op0BXp+AN`q&-:FNZeowvl\P?3uYG0rU>" fL.}`N2fW;,p]J4% }kQA'zgN7!qU> z_C% {\@"mY1gM0hR8( ~lWF6ndTI=/& ~vmh\ZNJB>850-,'(&$'%%)'0179BFKWYgpx"6DWly,@]q&C\|+Zx!8Yn.CYl  & 8 A N \ b t y t e W G 4 %  |lM? u^A( |cB)xX>uY>!sZ:lG- w[=pX7pP7hH, r`;"x`B& kT:nN;xeM9$unUI5({m`VD9/   ,;LYi{(CMk}$@Ws4Kl.Id3Qj?Xz2Qr;[ -Rs@a)Il0So-Jj.Dav'6L\q.:HVeo")3:CMQ^alpwyxki\UJA4,ymXL:+ lW<, ybH-vV:mR1}g@)rK9cK'y\A! uY6fJ)fL/qR< iU9 xeK6# pbPA1$yucYQC;.) +4=NRgm+?Sh|,AXp0Fb}";[t'A_;X}Us3Mj 'C\|3Lg1Ebx !=Nk '9Uk5Hbr $7Mdv)8N[o|  '.:?IPV`cioqwxv}w|zxvqsjkabXTJF;5.#raY?=!y`R7*ycJ0vaB+ `B%jH) sO3yW:y_;qT8pY6cJ4jP^v-Ml5Rp!?Sq4Ldz(=Xk <Of| -?Rcu  ).;@IRW^cjlqtzyx}z}|xxwmtgh`\WNM@93'#wjYK9, nWE+waI2lR6!iK6|hJ2n[=)kR:"hQ:% oX<. oS;$ ~_O1t_C/q^F1udM?&tkZQA6* &.=EW^rw)>Odw $Xo,GZp$7Pbu):KZiz ).9<FKRY]denmsvwy{|}}}{x}txqoje`YVMH@:/) qbN>*s\F1dH+aJ# nM/wV9|`:"}b@#hN*s[: jF- tW4 iN2rU@#}iQ=)tfMF+$xoj_ZSKI?>;31-*&&!!"#!!'&+/199@DHRR__koy!/>O]r7Dgv/Nh"=`z@_)Km=] 2Ps?ZA^}6Wt *Ef-Me2N` !8Og~$8H_k (8@NWakv~~rj_QI:.#vaN8$lT>" lQ6tV<wW:"qS8tZ?$ kQ7nR? {fM7ubC3u]D/uZC-nWB,zmVN6.rlcZRL@@61,%#   "(&207ax %D^~ /Gk8Ws4Jd3Aau 6Mgz/EYn +COdv%;CT_kz #%'/*11142413/1--&*""!  xtf^RF<1# q^M=)~oTF,oZF,p`B/|dK-}gO-tY<%{^A( }eD.uZD)jQ<%n`E6 ~rfXO@4+ |xtpolkejbgcebichgfjimnpwq|x,6HSct *0Q[w#@Sq CSu-E\{.Ea~2Ug"FZx %?Un1Dar"=To/C[o-@Wg%6HWiw+3>IQ[aoq~uk_VD@*#}iXB/z]F*vU=!eP/}`I/}hN5s`D.jY=%jS8#v]G0rZD+kZB-xeRD0"|keRP@8,   '16DNVcl{$3GRfv+F[k "8Ph)DYt6Ffw "=Rm3C_w :Mj|3M]|&?Sj";J^k'7GUgs  43ILZdkx|~sh^QI33}l[L8*w_L<%w`P7%pZG0 vdL:"wYG-zaJ0hU6"nY:'gR<$ xfS;1xo^PD4)wlaZKG:5*% ''Sg}'>O^s '4DL_avyuo`VG;/p`L:'xfM3tWB$ jP6{_D+gL/kY2 qU8jU0iU3}_I+~lO:% zlPF,|n]P?2#|sc_PK>7*'  !24CNYhr7A]i/A[m.Ja{0Bd{>Wv+"yjVE2!hV=* jP7 mV=! w\E)v[?) zZE.~cK1oV?& nRC&zaO9' m[G5# }oWM6*uiYQ?5)zvpmlff`a[^Z[Z]Zc^ddkmuv,2CN\kz$9M^w 3K]v 6Me5Uj2Ig0Mi9Ts %Ga.Lj%CWw3H`u(:MZqy,5FOah{"&17?BLNXY^efjnlrptrruptprnmjhce[\ROJ@:3)" zh]KC1&wfSB2pYH1 ueL:  mP9"x^H,ycI/q];%|aE+kO7v`@-y]G.vZH1zfTJ3+tk`ZNJ==03'##  $&,57BIR[`nt.?N`q".K\u5Pg&=XvV_v~ +9EU`mz,+;=FNSZ\ecmjqqrsvrvrrqlkfb]]QQCD73( teUC2"k\E4  udI:saI3  k[A,v]I,sZE-uVE)oX@*nV?+paJ:$q`M;)rgVN=4%}wohb^TTJICA=;938010-0-/011577;;?BHHORU^bkmyy &7DVat*, tcTD5!{rgYRI:;()  #.5?KU_fx+;I]k 3I^w-E^t!7Qe-B^u :Km|(CWp&:Rc$;Jdv.@Uh|!8IYn{ -;P[q}*7>OVdivyleYNE8+"l_I9$h^?2tVD( tZB%mY8%o[?$zdM5 jS='}mUB. dUA. p_K:)ldOD5%yne[VHF;50(#       $$,29=HIU\fku|,8ET`s1ATa{&]t3Kf:Pm/E[u)AUk/DWq):Rbz-?Scy&8CW`s{$)/99DEJQR[X^[c_eahaec`b\YXSPLDE;81(% wl\N?/{iU@.pVC)aO/yZE%jR4sU9uY@!v`;(lM7iW;&pXB3rfOE3#zofXSD@2.! $'6>FVZks/ARdx 6Kdw&7Ul :Up/Ke 'B_w:Rk&<Tt*=Zt  ?Sm/D_r#=Niy+5MUkv &,48DENPWZ`^hbijhmihjcf``ZXQPFE<70+! vhXM<. vcN;'r_J2  o\D0|bN6x`I1yaH2zdL: xbN8"n]E8naK<)~ucUF6) |ndVPB<-' ~|}}$.=FU`ty'=L`s&@Qkz+AXn !;Ng~3D_q%:Td3G[u'6Xc,EUn !6D[j#1@LZju $(05:ACJKQTU\Y^]```b_g\e\a[ZWVSNOEJ>?63.)%tk[VB<+# zgXH6'k[D3 hXA+jU=(yfO;%lU@+zdL8" vbM:&o_I7$uaTC3$rh_THC30  ,7ER\lz +?Nbs 8H`r2G^v %8Qg} #:Sj(=Sj "8Og~2L^w 6F]n"5IYp"4BObnz #+4=BKQY]fhqsz~|uvohhY\NJB</*mcQ@6qcJ9' yiQ;(zfQ='jY@0t_N7"xeV>-{fS?*|rYP4*~k[J=( {s^[HB1+}rn`\QLB?60*"    #!.3H[ky (4DSbk%04BHQ[`ipv|~xtjh]WPE@4-! }rePF1"sXL2! xdM8 fS7# {bJ1lT9#sX@&|dN5t]?1fZ=0qaP=- ~qgTO;4(ytlha]XSOJGC?=876451433677>]n7Mi+DXt,AYp "5Mau$9M[r}#6=T[l{ #.3>CKUUaakptu~}~{stff^VSIB>0.#vg]KC3$n`P<- n_G;#v]O5"~fR<%wdP6( u`G6 n[A2 t^I4"uaMC' wlXL;-vh_SH=5)#}{|{~} !.9DR^kw*5IXk~,;Ofx*?[m0Gaw"7Qf (;Wj*;Yi/7Tdx#4HXm~(8IYft+2ALWdl}()169>CEKMPSVX\Z_]a]b\b\bX\UUSJLAC94/)#  vk[UC9*yiWG6$~pXH2" ydI8{\I/iQ8oQ= r]D/uaK3 udN?)teSB8!ykbQJ83! }z{zxzzx~y{ !*:@UUiq -ALbn,9T`y2B\m5Dat)@Tm $6Pe|4F_t #:Kbx+>Qhu3AUev#->KWer~  #-18;BGKOTUY[\_^`_a[]XXWPPJE@<50+!}ncVJ=-#yoZL;*znUH2! t^I8!nVE.sdI;"lWB1 o`K;'p^Q?1"{o^TG5*{tg^TGC5,$}|uspjkdfb`a]_\\Z\Z^[a^bdelqoww~#.9BQZgu} (8HYjz 0>Ufz(Mbs&5FXf|-9MWkv '.?KSgl{ %(15<=EGONWT_\caegigmfofmdmdee_bX\VUOQHIC<=07&* yqf]QG<1% yh_L>1q`N=, ykQC0 {bR@*o^I8#weQB)zgVC3!wgPG1$spZUC9- ~upiaaUXKNGCB;<78553433333668:<@AHINRZYjfov} !!6:JTalz$1ESev%9K[t "5Gbo)BSk~"6L_t.8Tcz.FRrx(?Lgq&;I[lz $3=LTakv  {oc]IE2+xcVB1ybQ>'oZC1o_E7 zcT:+scQ:. q`K>%vkTJ1)zhYI8,wk_SH:3#zqmf`[XPQJIAB>:<2:-6*3+-/*.-.01368<=BEJIRT\_glt{ !)9FQbm|';MZu 7B\m(9Rf}'CSo.HVq#9M`v%:L_t'>L_r 6CQdl "-8AJWXhix{vsib[UMD?3-$~ncVG<.!qdTC4%|jXJ2)xcV>1 yhTA0 m\C4 iUB.ygTA,qkQF3"nhSL?1,vsf`[PLF<0#}iYJ5%wdN9)wfI8 gT=%nX@,p\A0w^J3 r^L5#uYO8%uiYKA+#vjcVNE84(  #/;CP[et~!-EQgt $1M[q'Pgy%0KSlu-4AKX^kp}rneZUHB7/! vk[N>."lcJA&rdM>)zfPA*yjTE+r\K7%g[H2(yi[H9'uhUK9-{pfXQB;/&|~wuromkgfdf^c^ab_bdhejlmsr|y+)DBW^ow ,6JZhz$3GUh| ,CSf|'8Kar #5E]l*FQix .@Pdo (<IWgr +.AARXamr~  #*(3.:5>;D?GHDLHLKKKLMKKHHGCA@:810(&!  tk]RH9. {n_P@0#qZP=,zkVG5# ~p\G8!}cW=+eXB3yeVD2"{i[L?-$oiYUD=4&" }xzwryotrotqvuyw}~%-7DMZeq|!5?U`r'6JXkz/CXf,=Udz,CVj} 0CYh&5IYk1=N`m} .:FQ^hw (%51B>KKUV]`chiolstrztyvxuxutpsjnfg`aVYOLG@88-) }qhVO<3& ~k_MA0l`M</mcK?+ teP?+qaN9*o^N9)xgZI=+tj[TE<.&}vkeZUKB;4.%  ,/<@LS]foy )8GUbv} ,;J_h%=Ian*?Rex 1?Wey4@Uhw!/CNbp}$,?KWhp ".7ALU]ept      wpe`TOA=/+ zo`XH>/!|qaQ@3$maL<, |fVD2 {eUA0 j_L:+ reSC6#wh]KA2& |uc^MG8/$xyqtmphlhjekikmnqtx|}!'5=JU^ov,;GZew%6HZl~)>Qfx 2BZm(?Rj':Qb|(=Iep ;GWhx&+AG[gr%(7:HLW[dknz~ysqfd[VLE?4.#uh]IE-) }fYF4"}kRC+t`K7" yeP8% hXB.lXJ0& xjVG3&q`Q@4#ul[Q@9'{rlh\\PPHBB9941.,(($'#$&#',$1*447?>MFTT^ajqy&8=PXht)2BTat 3AXky2BYp.EXr "4Qa{);Ojs.@Sfy'7HYi{,;GUao|  .2>@LOY^bhlss{|~yznreiZZTKJ><1/  }oeXL?3% zt[V?6xbUC/ o`M9+ybX>4 xlTE7xdVB5~o`MB-"}oaTD9&vk`VKB8-$ #-8?LQagu &8GPgo'9K]p+ATf{,DRm| -EVm-ATdx ,=P_r!=DZgv ,8DSZis} &+27=@FJNQVU][aaceejejhfkaj_e[aXYTQNJI@?842&' ymbXLC2,  ~r_V@7"~n_I<(n]G6"tbJ<$|hU?-rfNA,oaMA-~xdXO;/"ri]RG<6(##"65FK[apw"3=UZt}(7KZm%M^m ,@M\nw*3AKWei| !#)*1/65=9;><@><?;>;7:36-1&,! }qi\TG=0%{q]UB6$xcTC3!rgNA. o_J=*rdRE1&{oaPE4( }sdZK@3$ }wgaUNA9/# xsqlhd`]]WXQSMOJHKCKAIBICJGIIKLOPUU[]ahgrp|{ %05EMYdn}#5BN`i}#7EVhv"2DVf{%2EUev *;G]hz/=IYgt'4=LW_pv&-38BDNPW]cgnoxy~}vumjdaXTNHB=00"xncVK@2(zjaMF0( wdYE:' p`PA1zu\Q@*$taRD/%|g_JC."sgYOE4*zqifYXLM@?45*)   !#+,66=GGUT`giyw18GT`o{&7HUhv$0EUhy,0 raN9*xbTA3|f\L<0ui^PH:0%}wpib]UPKE@96.,$!  "&./9).  #(18@GSWelw &.>KXdr,>M^r{'9H]k!5F[m,?Sfx%7G^i!1FSiw (:HVhr%07GN\bpt %(+-116:7?8B;A@A?C<C<>9:57.1((#}tg`PG82zh\I:+r^N9,p_L9%xeP>+zhSA- o`J9*xdVB4#zq]VA='zmgZTGB51%#$%48ELUcfu|)6DR_p}"4BTet%7G]l-@Tf{+?Sd{(8O]t$6FVhx%-@MYls*2<GOZcjt}     olZXGB2*f`Q@7% vhWL8,vfWF:' }n_OA.%wkXK<-vjWO90"{kdQJ9.  ulaVMA=.) }xwpmjeba\[XVVQVPQRMTNSPTRXYYa[gdjmrv|"15GIY`nw ,8KUdu *4ISir ,=L`n ,6KYj| *8IVhv27JRcm}  $48IOYdlu #'-16<=FFMMTUY\[c_dbechcggchce`e]bZ\XVVPOKGF??761,'  tsc\UHB4-#wf_LE5& ~q`T@6#scUA7!q`Q?1!viVK>*" tjYQ?6' tn^VJ@6,! }vtmie_]WUSMOIIDHDE@EACDBFHFOJRSW[\fdpow| *3@GT_jx!-;>7?8;>9C;BCDFJIPQTW]\gfnqt~|$-4FJ]aqy)5ERcq '1GSgv"5EXjz .?S_t0;P\q}$/CPan +;GUco{/0AEQXchsyzribVPD=2*xj]OA2' {lZL=)naK?* xhV@4rYN7+~k\I;'ygWF:) ynaRK94"ytoha^SSKJC?;620++&"!""$)'./56<>CGKQW^_hltz #+6EP]ju28PXp|*6JZn| 0FTiz !-HQjw)>Gbh!2BQ`q.:CW]qz$*7=GM[_imyy|xnibXSGC71& ~ugZP@6'seVI8-zfVL6, ufTH8( tmWM;/sfVK;, {n_WH;2" yvf`SLB72#%}{|y{w{wy|wx{%&6N[my  '<EUdp #1:JP`is~!",.89@FIOSW]]dfgnktpvuyw|y{|z{z||xzvwvqtmnkgf`^[UUMJE?<32'$xpcXOA7*  ogSJ9,yfYJ7. zoZN<,~r^R@1#|k]NB,' xm`OH;+! |ph`TND=1,  &48AKQ_drx+5HNbjy$0@N^n.7OZm~2>Q^q"8CUdx '6AS^m{,2BHT_jp  #&/16?>FHMNWTY^_`bedegeifkfkfhfcfac[^ZVTOMKBC<55)) {ofYOE5/wj]LD0' {m^QB8${m\T?7& reXGP\lz ,;IWgu &/@L\fx&0?KTbkz!'/7?FMU\alny}  }xpgbUSFB6/& }wfaRK<5%uiXQ?4% {s`WA5&peOI1) idNJ3* yk`TI?2) {ymd]TNH<<,0"  #'47DIT^fq{  .;HUcr| )?H\jz%5GVgu ,;K\k}/=LZny .;MXeu #5:JR^gr|%(08<EGO[Td`jkrsxz~ywvsjm``[QRFC98,)  ~xicVHC3+wg[K@/&pbQB3"~n_I>- vfUF2'ufTI5* ~ofTI:/% {lgVUCA3('}yzusoplmklkkmmoopusxz &,;?MV^nr %/=HYbt~ /;OZpz ,?N`p~&<G_i2=Q]o|!+=ITfo#17HI]_oq #%,.46<=BEGILMPSRSVTVVVWVUURTPQMKKEDB=<521)(# ypg\YHC6.# iiSM=1% umYQ@/(udVG7( tfXG9* {l]PA5${obWJA2({ni^SMB<3(# "&65EFR\fmy "2=GWbo} &2DPcm,?K`l~!.@N`n (2CR]o|$)<FQcj|*3=HR]dsv  !+-37;ACIMLUSWYZ_^b_eagahagbcd]c[]ZWTQMMDE><64,(#zkhVRC:0%zoeSJ</!{i^HD*& {eYH9'xd[B;#vmWL=.ofTL<1! tj`UL@9/& ~}~"(29CKYZmp~+9GRcm| +1FUer%/EPer%5CVdt,8HYdu")<BR\gx|(.<COUdkr|  $'*,11665=6>6>9;<7=57340.,*$%ttg_WJB:,'{ucZM>4% }kcOF4*thXK=/ s`YG:/woaWI>2$yjdZNG<3, }stff]ZSNIEB:;03,()!" $")*/36;@CJOSX^cknxy  #67JN\er~"+;ER_mx&5AR]my(7AR\jx/9FQ_gy#)8ALWalx +)69ADOQWaajorz|wympeeZXQNAB45+$vmcWPC80" {ogUP>8% tj\PC4)zubYL:3! ~weYN>6&wkeSOC60 zylm^`UTIH@=840*'$  !$&/-7:=EINTZaenp}$,:DO]evy '8=V\p},8IXcw!0@J]gy35MQfm17FQ\kr%)6;FLXYfmr !    xni[WHE62#ztgWJA-( }m`RD5*tdVI9+xc]HA-$ wc\JA/&}qe]OF;1'wuji_]URJGB=;24+*%!   %&-.49;DFNPZ]dlo|~ .2CGY`oy 0=KZgv#0>NZmt ';EYes5:MXgv $,=EV_kw '58ELS]bmq}}tqdcXQJB;1,"yjfSQ==%$ |mdVI?.% xj]OB5% tiYM?1% ue\MB4+|qeYQB=-& pqeb[TLJ??43*'#  &+28AEMW]gnx %+5>4:5541//))% !  yof]SGB2-zpaWG=-# zm`PC5$~v_WE5&{q[S?2~l`QD7'zqeVR>9+  wthfYVJF@64*%!  %&/5;CLPZagtw %/P\my"4@L\et )08GIZ\imw    }ricUQG?4'"~qiXPC7*ysbVK<1! mhTM<0#~p`UK85zndUL@3,}{liZWHD:2&!~vtoii_`ZUYKQGJCD>@;<878443452452:4;8>;B@GDNHVQ\Zacjlqyy%+6@HT\ip})/HTZhn{ (*1;;JIST^`glqv|}wxlld_[SPHB<21%!|tjaWLE91%xpbVM=5){leQF;)"{rcTH=*' xmbTJ<1% wldXQF>2. |xtoled_[[SVNOJKCG@A@>==::<9:9=:?=@BAEFJMPSUYZb`mfstx %37FLXalu'5KXcry !)6@MSehv#&05=FJTWabnpy{ztmj^]QQCA71* }ohZOJ73#}ifSJ;.# yl_SB:)riXP@4({tb]NE8/$oo`]PKB94*$ |wzprmngldgdadb`b_e`bcedicniorruzw $(29<26222///-//.3.50777:J[]pu"&2:EHP[_jmx{~soc_WOG>6.$rh[NC7)rbVH8-r`SD4( |l_QB7& vh^NB6)tn^WGB1- ~}nof`WUMJC=;21))#     !!%++33=HLV\ajlvxzumm_aTUFG;80($ {qf_QI<4'vh^PH61tf[LB3'uh]ND7(! nlWRB;)& xqd^QK?8-% x|ntkkcf]_ZXVTROQJRGPHMHNJLKJPLUNUSXW]]`dekmrux 22AJQ`cvx&5>MYdp} %1BJ[fs &3AKXgo '2>ITakv&-9AMW`lr~ !#+36??KLSY_bfmprzyyzqqkgc]XUMKC<:.-" vqa[MD9/$ xsdXL@4)wo]SG8.uh[OA4' vp`UK<5#yqj[YHG76'# xxunoeha_^WYVQTMPKNHLKIIIJIJLIQLRRTWZ]_beinpuy|%19CNVdhw +5?QWio$2BJ\fs*3DPZkr &3?NUgo|).?FR]eoz !%,0;7CCKOSY]`feolutw{y{vusnmhdd\ZTRKHB=90/%#upbXSD?/)ylaUJ>2(vgbMH72 ~ue`KH7/#yphZSG@3, zpl`]TOI?;4.'"  ")16?DNT^dmv}"&6GUaly),?GR`lr  )4?HU]js}!&38AKOZ`gqt " *%,-/5267:9>8B:C;E?BBA@AA=C9?9:75500.)'#! xqidZSIC81) wqc^PI>1*tl\TI:5#}qe\NF;.#xwa`RG>1* {ykh^YMI>:2+% ),;:KL[_hty$48NPciy!084++! uue`TN?;-'~wf`SG?1'uo^UE</$ |pgVQ?8)um^XJB8,%ylh\XLH?73'$}~}~ !,1;?JQYajr| $,FU_my !&4<GN\clv~ $.,<6EDLQUX``fimpsxy}~}{wvromed`[UTKKA>93,'!  wqa^NI;4+ {vh\NF7."sk\QC8( zgdKJ6. xm]WG<5$wxdgTRE=:*(}x}wxsuqsnroonrltnurwvzy} "*29CLSYfix}  -7ANVfm~ %4;OXgr '4CM]eu "4:JRbiz%17HJ[^juz )./;9CEJMUU[]bbhhlkqnvqtwtyuwuwuuruorpkmiheba[\RVMNGCA;53*)  {nm\YNC=2* }th_QK:3&sb\JE4.qi[OH72# vqd]UGC63${wogc[VRGF=94-'$ $#+12=;JIUVbeos~$,5?EUYjk|#/9EO\fq #-8DOWem{ !+5@FUYhnz &,5=EKV\egsv     xrje`VPJA<1." wqg[VGA7,#rk]UI?6&! zre\RG=/(yph\RJA6/" {skc^TRGB<6-+"  !$-/8=GKSXdgru%-7ALT`gv} !)6AMVcmy $/;GR]kp$4:IN_dq{+/;@JUVfesv  !('*,/06498:<=A;C=F>C@@B=A<=;:67431*/%&!  qsabPP><.) |se^PE:/# wl^SI:2# uk_RL<7&{rh]SJ>7*$wqgeWVLEA64-%#  ,-8;DIPZ]jkx{$/8CLY_lv'-4'" }te^PG:0# {qc\NB;,# ukaUMD61! }ymh`_QNE@92,(   '(27AGMZZklw +/?GR]hr}(3BHY`py .9CRXlr "-8CPWgm{ !/8>JQYefxw " *(31:8?ACGKJSNUWU\X^]``_d`dccae_b___][XYWSQPJLBD?:83/)( ~rnbYPE<3(~rhZRB9+qh[N@5& te[KA4( sk]TG=1( pn`^PKE97-%! %+1>>NN]bks|.2BGW_kx #/8IMcgx "*:CR^kw(5=NSdiw%,8?IO[`jrw  #((.0366<6D9CABECFDGIEHDGEFBC@B==;5822.,&(   |tlfZVKD:2'" {qi\TG?3*{peYT>A()~ug`RI@1* xnf^TKC=0*!yorcfZXPLEA>64,*$    #)(158>EFQP\^gisv #-4CESZcpu $0=BWVfr{ !/8BQXfqy$19CLX]lo~ !)08<FJPW``llt{}yxnka^UPLB=5/'! |vkdYQH<6*! tk`UN<8)" }uh_SH@3+!wkfYSFA4,(~qsdb]SQKE@:50,%!   !(*25:ACKPT^agnu|"$3:DPSdiv  $5LQbgx}$,9BNXcly %+9>LR]fny ((82EAQO[Zfgpuz}utmfd\WSMH@>33'!!xugbXOI=6." yre^SK>7)%ymgXTF>4+!xnf^TLC<1+$yzmnacVWNJG??37,,'"!   $(+12<8$! ud_NF9,# vlaVJA;&$ ypf\QJ?7." |{lm`_TRIE>82-'$  &'04HMRZ^gjqv|~xuki_\RPEC75)'vnc]OK=5- wocXQA=,'~pi^SI>3+! wpg\TM@=<=;=;==<>?>A@CDDJEOIQPWR[Y`bckhspz|} !$/5@;=9<88;69887;7;9>:C=DAEFIJNOTTZYb`gjnqv||)(98HGYVkfzw (/=ENVciv|.1=KN`esz#.5@GS[bnt --5>@LMXY`gjrx|~yopdb[TNGB86*)zsj`WMB;/&ymcYKE40 vj`VLA6/  ~tmdYTHB90)"zvrlie][VSMMDE><952/-*&&! "#&&,*4079>?FHNQWZabjoww &+6>EQUdiv} #+8@JW^kt}'07IJ]bow",3>FPWfgw| #$02=@FORZ^eiqr{||uskfb[VPIC=7/+   vre^VJD81( |ljWSG;5'  ~vjdVQD93& wwje[SKE:4-$  ~xuokgb_\VVNMJEE@>;;74501,/+,)+)(('*$-$,'.*./.42588<=ACFKLPSX\^efmou|{ -1=DKWYhlv~ )33* wr_[NC?+* }om][NG@50""uukka`XXQOIED@>854//+*'$$" !!"!'#+).0075:?=EGIQPXZ`bklsv}#!36=MI`Zoo~ ,.?FQ[esx&)8@NSef{} &67JJZ`gty$(37=BJMVWd_mktv~~}|vqnhb`XUOGF=:0.%{qka\PJ?63"$ zrh^VM@=+* ~ukcXSF?7))yrjb\UNI?>0-' ~~x{rwqsnnknimgkfjejckeihhjjknlrouq{t~x~ !!1/;ADRS^clsy /0@FPYbnr &09BMR`gqx%.5=FKV]dlty  !%,.54@=GHNOUT^\_fckkppswu{w|}|~y}sxtprljkbg__Y[RUKMEF<A1:--#% xvih]YOJC:3,$snc^RLB91(! snb^QJB83( vrhdZULG=:1*$ }zuxpskmihfee_a^^]\^X_Z\\\[`Zc]daefjhmnquuzy!**:7HJQ]`lq{ $08DJU^gsv %/7DIX\hrz$&2<APR_eow~$$.18=@IHSR[\cgiorwy~|~vxonji`]WUOLEB@46))xxie]QM@;1(" }uk`ZLF<6'#}rgaUND;4+!zuif[VLF?91+$ }|uvsmpikgg_e\d\]\Y]W]U[XYXZW^Y_Za^daeghjomstw~z &'37@GNTb_rp  )1>LQX`jo|#&38ENTcgu{ '1<DLZ_ls%,5>FOZ^hpz~ $*-49@CKOR[Zddlluu~}|}urmje`\URLGB:70+# |zki\TNE:2* vqa]OI;4(" zifXPG;4&"vmf_WQD?7/*" {ytslmeeb]\XWUSQOKOENEHGDFDEDDCEFGEJGKLHQMRRSXY\`cdjjppyw&/1=BJWXgiwx  &18EKY\mo"+5>JP\gny !&37CJQ\dktx !'+33?>GIOSV^]ffmmsuwy}|uzlrgha^\SUKGE=:6,,!}toe\XLF>5.$zshbWQG;5+#ukgXXIF;4+"}xrld^YSLH@=42+&#$)/5;BENTX_dmrw*,77832-0&+"#  |usfc\VPIB96*+ xsidUWEF43' }ulf\UOAB02# wtji`\WLNCC95/-&"    (+/89ADNQVZceop{z $)49CISWdgry #,3=ASNb_qr}"".3;BIMXZdiov} (!-*01487?9E?EGFIKJMNMQOQPRQQNSMPNNKNHMFGFBA?=<8722.+'$!  ~rrddZRPBB71*"yrgdVUFB65$"~zpibXUJB<5-' |woncbZURKGB=831)*   !&)-18:?FFNTV_afnpx~!+46DFPW]glv{$02@CLUXehsy '+37@DMNY[efopz|   $"# "       vsmha^TSJE=92-'wuie[SPAA21'!{wpceUVHE>42&#wtogf][UQKK?C972.('   #*'40;;AEINSW^ahmn}w#%05;GGVXbhrw )/8?GOV]gjyz #-18@DMQZ\hisv #"%)'+.+1.216348494;494846361300-.*+'%%!"   zznld]WRIG;8.)!wshbXQI@82&!vrfbYPK@;2,"ytmic\YPODG8=1/,#%  $'+159?DIMUX_cimvy ',7;ELT\fjtz %/3ACPTacot}%/2;@GLUZ_ekrv~   !!!"" "!   }}rrhd_WTLE@;3/&"{xli`XRJC:7))ytke^WQIC<51&# uwmkh^bSXNKIAC::52.*($"    %&(./48:A@HHQQXYcailrwy ((47AFNS]chqu #&34?DMRZahpv} %+.5;?HIPUY`djmut~xwpmgd][UOLE@;63+'! prfbZRMG>73(& wrjf^VPHC=5/(# |ysrjjb_\WTQMIGC@>966.4(.$("!       !&%),-1177>>CFIMQTY[adjlsu{ '*18=ELQZ]jkuz  #/0>=LLW[djqw  )*14<@EMOVY`cjjut}|}xvomgd^[STIJ@?64,*# {uoha]TOL@?52''{wpke]YSKH?<40)"|ywtqkjfea_[ZWUSQOLLHIDFAC=@<>;:<6<6:5:2:5785888::9=<>@A@DDHGLIOOSTXX]\c`kdqmsvz| %)22>=IITX]fgpu|!&.48@EJTUacjov{ (&007:>DEKMRUZ\`cginotuz|~zyssnlhgb`YYTRMIEB?89//('  ysoja`VVLGC;:..$" ~uslg`[WOMD@;51+(  }yvstmngheb_]ZZWUTQQNMLIHHFGBFACC@C@A@CA@D?EBDEHDJGLLKPPRUUZZ_]ddgklsrt}y  $,/5;BEPQX]bjpt~ %&.6:AILSZ^gkrx~  "&-05:=BHIQRXZ_cijort{y}{uvloef`]YSQJGA>86/-&! }xqmd^ZQODB94/%$yumge[WPKD@84.)"zxtppjkec`^\ZVVPTLPHMEIDDBB@B=@=><<==:<9>:<==?=B>CAEDFIHMLORRUXY^_bfflmouu}{"$,16>BJNVYbenry~ #'.4;@HMTY_flqy} $&-/58?BDKJTRZ[_gdlmpvu|{{yvqqkjdb][TUMMEF<>34,,# {vpkb_XSMHB<61)&|wqngb^TVLJB?:51*'! ||wwvsrpnmkijgffcdbd``a^a^`^_`^a^d_dbcdffjgklnmspvuzz~~&(01;;DIMUV_cgnt{~ !'-37>CJOU[afksu %&-.55<>AFJLPSVZ^`bhhnmsqzu|~{{tupojjdd^]XXRPJICB<:60/'( }trid_YTMFB=50*$~xrnfeZYSKIB>85.*'! }||vzsvqtnplnkkikfhffgffgegeghgigiljmlsmsqtuvyy|}~ #)/47?AJKUU`ahnqz{ "(,38>DKOW[denpx| !))0079>@CFKJSPWX[_`eehkkpptsxw}z~~~|yywurppjkfec_^[WVQOLHG@@9942*,"$xwklaaWUOIE=94.(& {usil^aVXMNED>;62,*$#  "#*,14:=<97531/-*('"$  }ztqmhe_[VRMID@<63,*"! |xuokfb`\VROKFB>;82--&%  !$',0399BAJKPTX^`filuu| $),47<?FJPRX]bflovx !"&)*.02578=;A?DEGIJJMOORPVRWVWZYY\Y\[]\]\]\]_Z]\[\YYZWYUUUSVORLNJJIHECB@>;;6712--((""  }vsnjcbYXPMGE=:31)' |vsmjda\WVMNEE?;830,(#!   %(./56=>EHKQSZ[acklsv{~ "%-/49>@JIRT[\eflpty~  ##(',,/21547:8>;??@ACBDEEGFHEJGHJGLGJHIJGHGEHEECCCB@A>=<<8956320/+,')#%  |vtnmed][TSKKCA;820)(  {vrokgd]^UTPKJC@?7900*($"  %'+/35:=ADHLPTYYcajkpuv~ &(,269?BIKQTY]belmsyy  ! $&')+,//30455878<9>;>>>A=C?B@B?C@B@@A>@@=@;>:;8:774512./++('%#" zuvlkea_WWOODG=<51-($  ~{trmiea\YSQLJEA>962/+&%  "&*-23:;ACHKOTV[_dhkpty{ !*+159>CGLOUY\beioqxz~   "!#&%)(*,+/-00021324374475646465463532311//-,,**'(%%"! ~zvsnkfd^\UTNKFC>;53.*&! ~}xtrlkfd`]YYPSLKGCA<;843-.(($"   #$(+.027899540/,)(%$!    !!$&',+/1377<=ACDJIOOTVY]^ebiknss{{~ "$**339;>EELLRUW\_deinptwz}{ztsnlheb^]VWPNJGC?=953-,'$  ~|yurpljfe``Z[UVPPLJHFCA>=88542//,))$&"!      " %%'**..12569:>>CCFIKMQQWV\]`dfgmmquu|| $%+,047;>BDIKORVX\^bgenltsyy}|zwsrnlifc_]YWTQNJGDA>;76/0))#  |zwuromlggcb^]ZWVSQOMIJFDD@?=;:77431/.-+*('&$$!" !$"&%'(**.-11356:9<=?@DDHJKNQRUW[\^bbifmoqtvy} ""(*.056<=ADHJNQTWZ__efjmpsux{}|ywspnihd`^ZXSQMKGDA=;731,*'# }|xvspllggba^\XXTSPNLJGDDA@=<895521/.,*))%'"$ !!!"#&%()*,,//24588;=>AAEFILLPQUVZ[^abgglmprwv}|  #(*/058<>AGFNMSUX\^aefllqsvy|~|xvrqlkhdb_\ZWTPMJGDB>;953/,)'# ~}zxusrollhhdc``\]XZUURROOLKJGHDEBAA??<<:;8876554231201/0./.-/-.--.-..-.../.00.2031425467799;;=>>@AADDGHIKLNOQRUVWY\\``befijmoqsuxy| "#'*,0258:??DEIJNPSVW\^`dehkmortwx||~{zvuspnkigdb_]ZXUSQMKHGCB>;8731-+)%$! ~|zxuurpolliheeba__[\XYVVTSSOQMNLKJIHIFGDFCEADAAB?B?@>??=?=@>?????AAABACCEEFFHHJIKLLPMRRSTVUYX[]]_abdgfjjlnprsvwz{~ "#&),/146:;@@FFIKNRSVX[^^cdhhlmpstxx|}}{ywutookjhde_^]XYSSPNKIGDB>=:7620-+(&$  ||yxwtuqrnolljjhgfcebba__]^\]ZZZXYWWWWUUUTUSTSTSSTSSSSSSTSUSTTUVTWUYVYWZY[][]\__`baccfehhjklnmrpstvvyy|~} "#''+,/1378:==CBFGJLMQQVUY[[`_bcggjkmppstuyx||~~}{yxvvsrpnmkiideaa_\\YXUUQQMLJHFCC@><:8642/.+*&%#  }||yywuussqqpnnmkkjhjfhefedddbcab``a`__``_`^`^`]a]`_`a``babbbdddefgghijkklmnpoqrsuuwwzy||~~ !#%()--02578<<@AEEHILNPRTWV\Y_^bcdghkmloqruuxy{{~~~{zywutrqomljhgdca_][YWVRSOMLIHED@@=;9642/.,)'$# }|{zxwvtsrqponnklkjihgffeecebcbbbaa```_`a^`__a^`_``a`bacbdcdeefghhijjlmmooprqutvvxzz|}~ !#&'*+.02468;<>@BDGHJLMQQTUWY[]^`acefhjkmnpqstvvzx|{~~~|{zxwvtsqpmnkjhgedb`_][ZVWSTOQKLIIDEAA><;88440/,,)'%#! ~~}{|zzyyxxuxuvutttststqsrsrrrrrrrsrsrtsuttvtwuxvxxzz{|{~}  !$%()+,//32678;;?>BBDEHHLKNOQRTUWXZZ]]_`bbedhfjillnnpqqtrvuvxxzzz}|}~~}}||{yzwxvvttrrppmnkliihefbc``^^\ZZWWTSQPNNJJHGDDA@>=<986431/-+*'&$#  ~~~}}|}|||{||||{||}|}|}~}~  "$%')*,.013467::=>@ABEEHHKLMMPQSTUVXX[\\^^`abcdfeihijklmnnpprqsrutuvvwwxxyxzy{z|{|{|||}|~|~|~|}|}|||||{{{{z{yzxyxwwwuvtussrqppnommlkiihgefcca``^\\ZYXWUURROPMMJIHGEDAA>>;;8864310.,*)'%$"!  !"$%'()+,..01244778::==>@ABCDEFGGJILKMMNPPQRSTUVVXWXZY[Z\\^\_^_`_b`bacbccddddeeffegefeffffffgegeffefdeeddcddccbbaaa``___]]\[\ZZZXXWVVUUSSQRPPOMMKLJIHFFEDDBA@?><<;99665422//--+*((&%##!   !"$$&'))*-,//12345779::<=>?@ABCDEFGGIIJKLMMNOPQQRRSTTVUVWWXXYXZZZ\Z][]\]]]^]^^_^_^`^__^__^_^`^_^^^]^]]]\]\[[[ZZZYYXWXVWUUSTRRRQQONNMLLJJHIFGEEDCAA@>><=::876543210.-,+))'&%#"!  !"#$&'())+,-.00133566889:;;==??@AACCEDFFGGHHJIKKLMMNNNOOPOQQQQRRRSSSSTTTTTUTUTUTUUTUTUSUTTTTSTSSSRRQRQQQPPOONNNMLLLKKJIIHGGFFEECCBBA@?>><<;::8867453311//.-+,))('&%##!!   !"##%%'((**,+--//0122335567889::;<<==>>?@@ABACBDCEDEEFFGFGGHHHIIIIIJIJJJJJKJKJKJKJJKJJJJJIJIIIIHHGHGGGFFFEEDDCCCBBA@@??>>=<<;;:9877665433211/0-.,,**)(''%%##"!   !!"#$$&&'(()*++,,..//0012243545667778899::;:<;<<===>>>>>?????@?@@@@@@@@@@A@@@@@@?@??????>>>>>==<=;<;;;::9988776665543322110//..-,,+**)((''%&$$#"!!    !""###$$%%&&'''()())*+*++,,,,,---...../////0/000000010101011110100000000/0/0//./.....--,,,,,++*+**))(((''&&&%%$$###""!!     !!!!""""##$#$$$$$%%%%%%%%&%&&&'&'&&&'''&'&''&&&&&&&&&&&&%&%%%%%$$$$$###""""!"!!      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom2-Med.wav000066400000000000000000005373741366722712400224570ustar00rootroot00000000000000RIFFWAVEfmt DXPAD datanE T""$&E',(^((Z)f)))g)D)('`'&N%R$#~#2#![! "} iyM=!MUr P t<& 5}  $',H-,U( B}=fы^s ߴT+8fsSGܥgX1%ýۺ =onL(սBݪOXTTTM*̶`~_̼'&auҳ{YZ9oK26Z%7>  Du. "O#,"*7!l&=*,,,&+V'0#c  #$$4'*-o/0/,(s%$ $j%(]-1N20.-O./!0V0024777748874%/O*@()W+.0P1Y0.,W*%~ Yxr]v5 m8y | %@4$ w.m\ \ys Q 6j ^-qnC  XONfII / ;  4-'0E%"U%"&v$A O{QPA  } @ ; $ $  R Xw*f5[|nl #$'v0b E"!Zٻݹܥ> 8%sԒ,՟ԇKen_?aKۘSיѡ>ÑȺP0`Mǚɀl˕TŸMƱbС9o0䢒KFe߾:rÞĬ,yͯ< o$ s |sI,f ku0 +!Y! /!X"# %& (n)+a-/$2^426789:[:y:A:9999764v4 4e32c2B2111@22234o567889,:::<9u75F4 3F21 1m0/ ///0[111;0./.,+(*'u&&'$('%#ib#`DD & mL\{R2FO rAP t4]qrZt0(ot`RQ_ BBft^+S|RrygNU)w@]h>rThaoz/vXucsEܤٛ k۰ەK_RD=a׭Mڳsߥo[ߨ/i>߼ߠߓlNވ!/ެߘ3pwSRJ45 e wIoL?m T " Tf UO-/9v`?&[iylp{N9j !"""! f^v C!t"#$Y&'(v(()*+2-.0a23 424`4n442432p2r223456{77777?65o543t20.p,*(&$#&"u!s x^Z`)(*S,_Qc a Mpi@532TGX kJp `zw?1gXULB<,`MK#GN ޟܝۋ(Rم4اڒکtݲ!]ސޅ߯}'J97_n3Z+XN+bo NsZ \-i6 aM6+A'yv-di \ P Y^K4=gk79.s<ew`Y !"9#####:##%%%%%t&')*+P,,--$...j/C01I110000x0T/B.-+s*A)Y('''((k)h*x+++++++++,++++*('&%$#"!{ `Dy> s hW2le"dj,:H> 9Y`>CrbnHqmr|(-aI}0BVݼzHfFw$/#%mK[ݧܼ"_.٧^CVٍoثؕ،wWP,>{؟ِ٧`0]ۆۡ)(ܣx,ߋ M-]Q5P\gq<R`  Z d b T Q c ` G ; +  B $8     aimhuZ<$nB!\m">wk4qi:TR{lSC 7B lIGHL.=^ }4$6K V h  : <Pb~#@}goP ."xmC0*Cd@xE"~ ucm:I=0|C1:9wTpN.{.*?eܴ݃ۂ|؏P[؃ؠ؋_BnTٷiک0ܾKݞݫݹ(-ވc h]1D4485:?|[n(jD;~7$ c   z zE{(N^]163 W}]!WUwPeTp+fux  #4Of(Yd"$pDr8\75zR R  '  G  o l 9 : -   /  : ;   ] d _ ? XfPCNB`{TtIWz&h4ILP^?:r[5UL'"J}("*T{?-0\_a@[:] u{AD4'iJߐ~Qsއޡޚk-C޵Cߍߤ]42ib,f"u7\x 3VU\[G^e'|~nS6^(M: 5 ,   B = S~ YQf.LmQ%az/wC!C=R GU0!<gY6$Eqpe@w 022dzD$+`L"#30W  J  W  h  [ ) W>yz.'lO0Ir_'XgCzR38`@7x#0Jp_i'*_nB,J))fU*:4$d|%P9)-Wj-~3Cs_Q4)KdI@"x-,E2\ViJMy) tH$&XXPvK"(?x*w.qEg F c F N -vG,c/cd:qzcCZH HE2FQbw821.NNf0!mC_Jx]S Do   e , K W  G W  ]Ew:ceP4S|6`Ow!aA]JF;5+5BJaiN]@a@p)V5# <R&2LR7gSme0rxq ?j`aP0e8cvq9> qo-2T4Ct "/L >Nj `%O/Ol+z)7LD@~ 8 U  j J S'[y CibAJ{'( a{W*Kk0;;"A\) . @ N f g  C3x }^$J0aU2: $YCfT u a 1   %eko qO;j.|{g_*Z f=) I"O(}eBxk *I ^}DH{TtG5[b+P J{%CRl@d /h1=I]OtA F?$q4C~E@)k*2!jf.w LC1P[7)1 I G  + c kN_'~d8y3&}Dh6lH_sP :yb5 Px7bs<>q+]2NSQ|`= 6V S J \ Y 8 1tdLV8%e[v>R>yp[\W*eF:4]zEca|J42,O#BMNA=)87+"l Fq#QBd]HR`nq|h= 3AA<:BPopiT( =go=cW>'h=P ##|6wR.r"h%({ag^ b \ 7 > ,JND4x]eG J ),[UK%0Yy A s X $ |Z)G6)=ksZuxJSD ; i  E cain2}qvpX)Bj1^G1[7Y>Z`OMbjbQjnrR Y>.t{h:e> tlQo&i ]_[P%[t"=S1d}|htD[zJ.UPC+}{Jom#zE=rAIg9A'r#vQ k6 u  T  5 R f W ` n { j ^ a |    G { Or(hi&rDBl&s +]7Vix% lH$;`&:  &so _ + , R X l SOqjFXGof 1I2)Vd1v3UTE_~U5+u0|xjxfP8'kC@3:A$dO;. kA *B\rgC )EGA2EON=5#2IA3+MB+?m `L&}J4;|5Y{ b+c&_4gGF*5];2a!\R$[ } O/eL_n{@f~( z  J ? ,  M, CnjH*_6 [s3~K)c~~tzz5f3I"BPlElKI6?S9 7 G 0 [ y Hyb NjZW5ceu/4no0u:L^A}\F%qfrx_F3DYafhZ>C`F7+|_'yjP1{hNC3 n?lR#$F5,?Wgrjdgv{yrh Gu"TeYTlC4_j:#$kRC gQNK?9#w9gA+/#[4xH"b948#^3wN7))" 9a7^.Xv"\9f9D!Hr$Hi0U~,_3;m="q-v85z,nOg,q7m;p[?w7{] 6 w & Z  9 \  * S v ;  1i hPy^Q!m&g*;D){ypQ0Y'y;RwF\n= O Y  n $ - { 4  Q_Pf+aH8,}9zN iA-vP<*|mUD#x^=0+${R9"gAhC)rM(x6\Vx?t0Z&mD"lQ6 ta`^]RV_m&Ot r Gq9lDZ=TO-pv?D)v3Z*!gvF4;'=3=4uy I y 6 ? < M l 6 A E E E L \ o   6 f  Z $b8vSG FJVt+CTask`9"|h<m<{T0|[<m9Bu2 U  M  i  1 _  =`fQ+KY8J|C M|F Z7I"l+]mCqE%fGoXG"|Z(Aa$CX>a*y\,wkqx $Fo*CRx'Kp%Fw(QrIs){aT;0]<i> u F ! J ! d @  g ' F Bl/DHD9xaIJy-g*u.\,X"qGuI6T)[:[1dO0kEqEn2md`SP7=DBGD>@HYntq ?c4Ku3e|=m 8_;\Dp=aN?FpebZP=pf7)hQ-q6iQ" ^  ? t >  D F +{1MAOQ;d !.39EKF>9=2/) a=|Bd/h#f0z=Y o 6 T "  s H " _ + d * KUu!?/8?s9KY0rL1U6^c=n6N v4_u: vB _?x`9 ^6LV%d@pH&kJ.*Jp)_)^0eW Wq'Hp,W, V & O v  . c 2 n V | 2h(>d&Sk#.Lfp]PDDA=.wY1 w[P6%s]ODA.$ | i T G ' [ / O } 6 p * KIBG ;s:Rc&]!^^z*1A]yq4>o3xBjDvLsT5oI!c:qU0mZD.$$'19BCMR]gv} 0:Nn 5Pv!A\p4Qu3V7[$P3m)nP=|B O fJDi={H DwG3o(cR>{HC # U | ( `  X G | !]PM)e 2X(Rr+5F]x|neT?- jI)mR5j2pH}CS B O U  l  n  vd z+=H]I M =Wb%n2xV&c-|JuO/\5m?_:d3]@$r>|eO>)f>! ~X1 kKfG$zeWDD@HFOZew4\BkTE}^5w/{FJ{%_ANX<~OwQ$Z0^7xE!["z eL4gBd<[)lBscRC8(#(2CSm #>Y{$Pw+UK|Eq%W*Y TN-Z;y!Y?yK}'c!`0kQ5iX9v5cRK ]!U G s / h # f  R ~  9 m ;\*Ih%1DN^s/FYp3BSV]cjkfb^\WJ5!Z8zS!o5{9 Q  d  {  d  ] 1'tv$H~>Rw9m2}K_%i,U.|@Y"xF`2 oD a;bG$ rU3" aF2" hWB/ xcI:%ziWD1  $2FUm 5`*]/Uw7On!Kq!Kh"W8^Z,Y)Q~U3h @tV BI@:x-k"[V5} @r G | : r ) [ 4 d  > x 9Zy3Mdx +3>CSi|yhYC.zX1\1 v D U  P  a # k ) Wb$c#a)OmCsU4uS:nD~Tc,Pd"[%Z&pMyZ9T5 rL3qXH8"ycK8%iT3Z:rY=$;bCm 3Ou'Rj (B^ 0\{ .Z?n,V =n4r `C=}7}9p-h,c`%Y5n Q?s4] F p + B h ( B T l  , ? S m  ) B V o .Ru+R,Fh-:@IFA/' iF"a2U" V  M T  A   - D}At'^T!}Bj<b?RRo-p2eD>{KY,wK%]6ymV@,seO<% ~dO7&pR;%t^SFMMPNKHJIRWhv'He?a Eh/Nx%@a@e 4Z:d|(P{!US1hT2oT-k0cI9s,c J)XK ; d  : ] ~ $ ; `   C g  # 7 R l =Wu0@]utW<-tE f 7  R  o 5 x : t = e,\T&{Q(`8a<uV3N!g2_#r7>T_:\7~`<uX;# rW  ] ) M  j - G  _%s4Nn5WFrBvAb4m8 yI M#dC$ pS4~bF' rN.uO*jDxV0qL/qc?,~th\MA1!~wyx|5Sn!@[q(:Tm!e:hEsV2iG&t_D2zwmkhihgda`YXTUTXT]_mnwsuwsww{|~| #.ETl#Bb}$Il 3`+W|0g/aLz3_2e,_Nz)X{(QxCl(Ip-Kp,Wy>a;] 2S| 7 \ ! F t  D k  @ f  : a 8Ux  1Od  %#! jL+ \+ m > d ( w =  a * ~ C \k-q1s5Ln6^3zK qBtK{O%tBX)_*c/f/V'zPU(uGoT6 zzyvww}wmf[TJFD?>74342236>IQ`o{)C[x<^=b*QzCn:c /Z=<640/./*&! |vrlhffdcccabddknv~ $6Oe{ $Ja:f 1^-\ 6ePCp5b!T@k 2Z&Mq,TvCa2R|5Y~!It#KxEtDn B q  1 U y  0 U t  > Y {  # < ] s .I^w%4>HPV_fhnkk`_QJ8- {[@ [ / o 7  c * M  x ;  Q[l0RxEM ]-a0g2l;f.I \ x8Xi/Y%i@uU2uZB*xog^TPH@<32*)"!  wnf\]UXMLJIMORS]`lu %?[u@c 5`>iCp"O~0`;i@iAh;_(Mu8d$GpAm:]=c)S{JnKv)[ E m  A l  = `  5 X r + B f { 2Hhw !+:AOT[_`hfgc^WPC7-rU2 h ; S  s C  V  b # g)j/x@]'x> j8mAX+oHoFh7 {Bb+Jh;p9 S,sN1vdN>,! ulaXQKGC;;/,# }rn__RUKKD>A;D>FEKOWZ`kq{ $0IYq.J`{-Qp6e9eD{9e$J*R#To7]1Qu:S{ *C^~?d>k8]#Is3\6X}  ; S q , C a v  % < T k   , H R o }   & 3 3 A @ J J R R Z \ a a ^ ] V P F B 7 - #   m Q 6  o G ] , N $ f7k9f.Sn9Yf'|@Oc(s;Y"}HxIlL"vV9 yaI3saM@*{cU>1~ibRK>7*& ,7IXi|#a0X$My"Nr7d-Rx 1 Z y ) Q o  1 M k & C Y p   & 3 @ H S ] h q y ~ } | z t m f ^ V L ? 3 %   a K ' s Q . c ?  l < {Nh1l7q: n9_'Hj0TqFr: zIqM$tV2v[9 xZ@$ }bO2 tbH8$teTE7&ui_SNCC9;200/-1(,',&*$,)37?@JKYZggst~*>H^m%?Xu#Eg"LnBqHoGqBf%Lq ,Jc2Jf-Jh$Ch Cl'Jk&Kp +Qv'Ik-Xp ( E b {   3 F ] o     ( / 9 > H L W ] b i n u t w u w s u r u x w } { ~ z  w y t n r g g ] X R H B 5 1 $ "    } l U B )  j H '  kD['V"x>Xe,C Z$zKM f;x^5y^?& zdP9(dK3w]A"gJ#kL1|dN;)wrd[RG?:0,! "7G\o'Be 2Z&R|/X(Y$Lu 3Tz:_}Ad%Ed "Jf1Uy Af 2Ru!Ac /SsBh@e6[ 7 R o  - B _ u   ) 8 M b q   " / < H Y b r w } } j c N B -   \ =  n H  Z ( Tp/Sl1Jg4]%],pDuQ(sN0`DgG( wQ5oK-dD"dG$|eM5 o]I<( tkbWRGC;3/$   !+5>NUho6Kby &?Zu$?a{'Nl@a9W7Z .Ry7\"Dp9h<`6e2Y;`8Vy6Uq,F`x !<Qe{  ( ; M a u    ( 2 ? K X b o y    # % . ) 4 . 7 4 6 3 4 3 1 0 . + ) $    x i T A *  z a =  _4 `4 U'o<P%f5 b3h>tL&]2 sH&gCiG$yZ6wT3jJ(fH, z\B% pY>(ycJ6# oaRG9.&  +47INal|(DXm '?Zv8Vs (PjIp&Pu>nHq'QCl2^!L9c@i&Jm.Jg0Ghz:Ql4Md+B[s  , @ V d }  3 B \ n  & 9 L _ t   ! + 1 8 < A @ F G H K G G A < 4 , !  s ` H 4   a D  Y 3  S"h<zHb1wHU'g9yR h=V(tIqK}X,g@{Q- pH b?h@$kJ-mU<) ziWE:' -9J_l3BZr.JZu.E`u+F^z":^|[n  / F Z m  " 7 F \ o    ( 2 : E I M P Q V T U U R P P E F : 2 & "    w c U F 2 ! } a M 0  u^> dE$}Z9eAkD$d@wN"zM(U-d3h@`8d>rM, \AyY<mO0tU7hL2sbI7%|vrnlgec_`\[[[__chkr{~$5DSdu 6Od)Ag:f 9dNwBtA}P#_/f+\O|+X|6Y|.I`y "9Ney(;Qcx.AUl~3D_s ( A R m |  * 9 G W a s | o j Z O C 1 '   | a R 9 $  gN0`C!yQ1pG#{P"zQ&tLh9]1]1d=nFuN"]3 nE"dB~Y3 }d=#|dL3xgWJ8/,7JVgy4Ni@_7]%Jz)[Hy7g'V@m$Ly&N{<i?^2Jf}-FUm| /BVm/E]q*BXp(BTn 0 B V c v         t n [ V C 9 (  k_I3" lS:q[>' }[@}_7c:X9[5{S-eAd@e7gC!yW5hL/lU;+n]L@.$scTI8, xgYH=-wupiieeehhmos|.@Xp.Ro ?i+R|%S{)T 8iMw1_8e.T|8Uz0Lj .B`v)EWp 3H]r#.MYt"1KZp -8ISbjv~    ' ) 2 3 8 < @ A J F O M R P S R S R P N L L C E < 7 0 ( "    riWJ8, pYB.jO3cC%yY5c<{X- qJ _9jDvH$W2 uK(tQ- kK0q\D*|fS:)p[E3 ~dQ5$ }iZG;( /=Qbu7Uo )Kg3Yy2Ry0Tz>a?]3Z{-JqSdv%1<DUWhoz      " ( ( , 1 0 8 0 6 0 1 , ) %      rcSE4$sdM=&}kN9 gL2{`>tU. pI [1 lD^8iE%pWY5 tP*zT6uS9dC(tW:^C~^>wT2\7dA ^E& t\H4! qj`[RPKGGDCE@ECGJMRZ\fitz'4IVky2Jb{3Kn!A_&FkB[5\8]Ad"In.Ty<c Dm@c$Ha4Oj-FXs%;Mcs'8M\v # 4 F Y i {    ) 2 9 F J U Y ^ c a f _ d ^ ] X S M F A : 4 ( #   { m Z G 6 ! rV@' mQ4tR1 \4uS&[+]0 gDkE)tX@#|gO5"eP7!iG-bA)lP.x\>$u^G0n`P<1xsa\K@5( !,@Pax,G_|)Bc#Be -Rs(Hr 6],U$LwOsEn1_~7Zy2Nj";Qk !7H_t.FVp2L^x 4G[o  " . 9 H Q ^ f t w w p c X M ? 4 $   |gR7%{\F& |]>~_<sQ0dF#bC"lN1wT9uU1Y6 wS- qJ&c<hH'w\=& jXC/ qgUG7*ul`TK>:*$  *2BIYdr}-DWn2Hb~*Fd<[|%Ej"Gn,Ru>g0W<gAj9[(Dh9\s:Vs0Ph &B]x4Jg{  ) ; N b o    ( 2 9 B G R T [ _ a f f h j h m j h h a a [ T Q H C : 2 '   | j V D ,  iL3}]@ xZ7f?`:e@hC tU4gM'c?wX5nQ+sN5r[?){jTD0!xgYN?3(rbRD3&sbS@2#~~|{}x~x~ -L^n|/D]s.Mg&BcB`$Ad9Xu(Bb|)A`z)Dc=Z{0On"@\|+Ic '?\q1G]u3DVky   + < C Q Z f m v } | w m f Z P C 5 ,   wdO<%zaI2fK0eH( gE$zT3 }V3rL%fAmK, vU@# lYF/#ucTF5(r_P7+t^P4&weTB1 }n_OC2' ysmid`\YWSRPNNMMPPT[\ehsw$:G`n "=Tp2Qm#Fa$Fb <^x3Pq8Tn6Ro/If +Acx"6]p7Nk1F]u 5H^p*<Ocw %6=LY^ls|ymi\UH@1% znWH4 jXA/nT:rT3x];yV7}_@"w\C&eR:%w`O:'~eN6! nT@%kR=$q\G. weUB6#yjaTG>2' &3@P[nz";Jct 2Lbw,D[q 5Ri.Ih=U|:Y} Dc 1Mn 'Gc0Ok &A\w(C[v ";Ri1DWm~ )9HUem          }q`V@4 pY@,tZ<"fD%{V4}\8hH$hH.z`D& kP5nX=$ nT9"eJ3iO:$ zaO:&mUF/ ydWA5xn`WI?4)  #,5AJ[cu} :E^o+DUs '8Xh9Rr7St-Pm3Ts6[u6Zv3Tq ,Hh1Ih &A\w,Kbz/Hdz 2QZx(1DPbk~        !         nbP@0 t\C*tZ>#xZ>jK*sV7jS3zbD,rU; y_A* oP9dL0gR6$mYB,hV=.gP9! sbL?(~qm`\TPIGD=A9=8;<=BFJPUZcgrw$4>JYeu />Rex.?\m &?Zy,Df-Io4VzA\!?\8Wx (Fb|'A^x=Vt (@Xr)?Tm}$<IZk{+7DR`hx~se[LB0"hV='xhC4vS<kP-tU6ZCkL.sT3v[:kQ0dG. gL3q_=)sZA'eR7 jV@+~kdTIC5/% %08DLZaoy &1CRcu';Rm =Wv/Rs7a *Qp";c A^}9Rm6Of3Qh $:Uk,>Xk(>Sl(@Wo $:Paz)CLdo      & " ) % ' & # #      yjWH9$zdN0u_A% y^=%sT9hI+ qU3gL.}cE&gJ2fN8lY;# wZG,~kO8!|dO8" sgPB2~rmc_YPKEA;:13),$$ "$+,66@DJSX`gnx *7M[n(FYw5Po>[v *Fg C_2Oj )B^y3Ni1R^#7Nc{&9Naw!8F]k  0AQaq "*7AIT\dls{~|uola`TQIA92'{i]K>+ pbG8 qP9lQ2hN/gK0`E) cL.rS9 qT:u_B,}cO3! zkTE1"naNC/#{qf`SM@8-'  !.8FSbq} 5Lay 9Un8QoRey&2FPcl}      {meSI8+ |bR:&pY@% qV<rY6oS6nW6pT5rW: ~_H-cN3{dN;$n_H;!xfYB9"xk]NF3/ }}{|z}!+"rV9jL4s\A'x[G(~cM1kR6!iR5lT:! w^I.p_J<( }uf`SK@81)$  $&,44@ALP[bjux '1BN_m|.HXp ,@\r/Ki/Mi5Uk"9Zr!>\v";Yr #?Vo*A[j+CVi~$5GXm| -;KVhq ',<AKS\cksz{uh`TI=1 |iX>.uVC$uWA& tXB&y^G*~aL0p\A.rWC(z`F-x]C) pW;$ s[B,oZE.~jYH7' {pg\TMC?60,&#   ")(239CCSS`cou (5FXfz'BVl)>[o &@\t1Jh )C_z+ mT3vY@!|`E) }bD& z\A uZ<'eJ3nUA)xcPA. zm\QB3'ymi_WUHG>95/0&&!!"((,35>?HMS^bov} /?Ngq.F^x*Fcz&Bb}2Rp#D^3On5Mn*D^x $<Ti 6Jcu 2H\o />P^q +;LVet~ ",08=BGMPSYX`_fdjkinilkijcg[`TTOIDA52(!shVJ7*s^K4! nX>+hT7#sV>' q[;&pR=tYB+oS=% sYF.y^R7%ygU@0 shTH8& uo`ZLF=2+"  '1:DP[er| .?Qcs5H]s5Haw1Ebt 7Od#AVn3Ib{ !<Qm(@Xn,BWo !5Lat $1GWhy+5?PSejw~~uqfcWRI?8.%~v^Q>,j\A3pVC'xYK*rYD,sXC*oWA'nT=) qaD4gW=,xcR<,}n]M=.|ue^RI?7.& +/8833///*/'/+0/23::BCIPR[agqx &5CQ^m|"4GZm~*GSm{#8Nax &9Qg~ 9Kh|(@[q6Ph1Gbx4Hat/ATfw-8GUcn %*39>EKSV`aiksw{{vplc]SNB?-,vgWG:&|oXK5&xhRA-{hV<0{gS<-o\E2zdO9# r^D3fP:$ t\G1~fS@,o`P?.|peXOB:.$  '/)z_P6%nZH3!r]O=+ phXQC;0& !,3@IVaoy%,FLho.>Vf} !7Laz #?Xq2Oj1Qj0Pn,Ecz3Le">Oh|"5L]q+<K^l}&0;FQYemuxpd\NG9/$ ~m\O<,ucN=)fV>/xdN8'lWB-jY=,raC0kS;" zdK7 jV;-n_I7(paSC2( yncZRG?5/'  "*1Pf}6Pg6Uo5Us>Xy7Mk6Lf~ "8Ph|*BUh}+@Pcx$2EScr+7BMYclx    qbYC>'yhTC,p[E0lZ>.}fT9&y\L1}`J1rTA'~bL1r]E.{gV;.|kWF0" tpXP<2# |siaVOE@73+'"   $(.39>EKR]aos +5ITfs4HXn+?Vp %:Uj-D]v &8Um6Nh+DZs,IXv$@Pi~ 2EUly!2BL_jx  */9@ENRY`einquyz|xvoodbWTJC92'  tkWN:.l]M=* xeYC6#tbM;'kTB)zhM="oW@)}gPA){hXB3wiTL6- yn^SG7,|sf]PI<5(! $.>GUbo 1=Vdz-?Vh}6I_q1F\o-FZn2B]m/@Yi !3GZj ,<P^r".?L]iz $3=OYfs "./8;AEHNNSTUYVYWXWWUSQPJJCB>65,'# }re\KD2% l_J7)~hRB'lTB'w_L0kW@,sbK<$u^O7)u[R8,yjUG3 xfWH8'yk_SC9(" &2=MVer ':HVfr!5CTfu(8M`t/HYw.J_y <Nl *;Wl $7Qbx*>Pbu->K\ky !*7CIZ]mr    %&++//2335655433/1'. % zlbSJ8,o^K7%hU>)yfM;"u^I4wcP:&ucL;&m\J7&uhUE6"reUE4( vi]O@6" {oh[VK@92("  $).9?FNW^hoy)8@P[gv -:M`p 9Idw-J_y &n\G6lYB,jW@+ybM7 jY?,{fO<%iXA3 u]O<, wi_OF51  &/4=FKZ\fsu,:G[gz7G^s #:Uh3Pc8Ol/J`}'@Xp+FWs0@Wh ".CScs"1@M[jw$0:COWcku|tmaYLB6+qcRC1$sbN='uaL6" m[A*mW=${cK1nXB's\J/t`J7#xiTE1 zn\R>3!|pf[PI=6(% #,5>IR]hs}$2AR`v,Rl~ 6Oe}/K\w #6O`w  2KXv 1DShx -=P`q '7CR^jy $'//76:>=BCCFEHEFDCC@?;<652--#' ylbUH<,"o\J8"|eN9# mO<  xdJ2v`J1gS=(r^J8$saPA. tbYD;(}pcVG<,!ulaZMI96+#!*0:AMUahv~08HVeq1?Tbu /BTiz2DZn,BSl| 3EZm 1DXj -;Saw->Ocp%/AM]lv )1;BJQX_cnpy|}vrjd^UJG:3+ qbSD4%~i[F6#zkRF. t_N8)l[J3'qeMB, v^R=2|i\I;'yiYM9/zj_RF<-! y|twsssqqspstswwz !'36DHT[gow '3EUbv!4HYp ":Ley,>Xj+=Vh~ !4JZs+>N^p}#2>MYgt "17ELWckw~!*09BDRRb^mov{|unf`YNG<4)oeRD5$~m]H9&}bV;-}fT?,xiR?-q^M8)r]P8*s^O;)ziWH5'{p`SF7* }uqhf_]WUPPIKEFCD@A?>=>==A=E=IBKINQSXYc`ljuv "0:HSbm}"3DUey /CVk~#9Ndz$=Og{'<Ohx .HVn~%6JXn{#:FZf{+<HWcr~ #(7<GNY^hmxz~yrmf\YNK<<** we^MB4' }f]H<*q_S;/|cU?0 s`M<(vcQ<(wcP9)zdU@-viVF7& yjaSH=/(~|ztsomjkggbac]b]`^`_bacgeljnptw{} !(5?IUcj~ +:J^i);Qdx*>Xk!4Mbw 6I]v*CQhz%3JVly!.@Oan"1@I\av{",2@COV[dhquyzvjg^UOC<3* |k`OB1%pdP?1 |kVG3 xhQB,iWA1 }jSB)p\G5 |hUB/ pXI4#xjYL8/whcTNA:2'    (09@LP_fq},:JYgx%?Ldu2EZm+HTo0EZr.EUo7I_p&;Nbr 1FUiz)9HXkt)0@GU\gry~rhaTK>4( {q]QA1%{l[F:$qXK3"uWL1! ~hR?&mW?0u_N4) xdQ>-yqYO7. }ocUH>.& }yple_\USJJED>=9:5847344262667<9@>HBNKUT]`eloy}!*:DS_pz+?Net&6Mbs9Fcs $6L`x2E[o #4H[o$;IZnz.=MYiw %.=EQ^gs{%)24?AHMRW[abjhrnvtxxz{}}}}~}~|}y{uvrnjfb\XRME@91+" xnaTF9+zhYI9'|n[K7(~kXF2  vcO>, vhT@2 o_N>- yaYA9!ueYG<+qeWM@4)wrqjhc`^^XYVVTTRVSWVZ[`bdkkst}}&3Sbv4F\o 4BXj|+>Sdy%?Ldq,<P^s *9HYht %-<BRXfly~%),388=@BGELKNQPSSVVWVWWVWTWSRRLPGJBC=:52,(! {rcXN>5& wfUF2#h\C2 lSD*q\I4 rXK2# wdPA- maO>/yi`NC3& wncYPH?61'"  ',5=EOUagsz $5AO]my&7IYlx 4E\k 3B[n5FYo'@Mcq +:JZgy(4ALZdsz"+3=DOT`dpv      xocYLB5( {m_NA1#yfYI8+ |l[L<- }p`P?3qdSC5$q]P8-,!!%)/49AHNT\blpz !*7@LWbqx2?O`m}%9E^j'8K^p 0@Tez)=N`p *=I`g+:EVbnz ")5=KP^eqz $&-,12487;9=9<9;68401++$$}pi\TG=1& xjYP=0 ycZC7$v_P<*|pVF2 |jUC.}mTF0 ygVG2'riUJ:-yue_SLC<1*"  %,8?KS_hu} ,;NXnx+9812)*! zkbXIB0)vdYC7$rbK<%taM8%o\H4" seM?(|fVF5%xfXI:* xh^N@5$ |sc\ND:/% xxvuqsooqmsouoxt}{ ,4BKWgp ,?Lam /BUe}&5M_s%Taw"PUho|!$11AALOX_cnnw|{}roc`VMG;5* wk]QC6( yfZG:+ n]P<1qfTF6$zq\Q<2rcTB6"~p`TB:% xi^PF7/  ~xqmc^XSMHC@:913,,('#%!!!! #&&!)$.(1/468>@DHLSUZ_cjlvx ".9EM_fv /9OYo{ .@Qdw 0;S^y,;Oaq 1<Q\n +4JRfp,6GPalx -5?HTZgkx~{rg`TLC61"qhXQA7)meQJ4, ncPD4#seRE2#}s[O=0 o^N=, |l[P?2"}peYN@7*! ~wvongg``[WWSRQMLNILIHJIHLHMJOLSOUTXZ]a`hgpnwu~ !16EMZcry+P[ky &1?IY`rv )*;=HMW]dkpw|yzomf]YOKA=1)"|pdZNB7(wlZRC3( zg]K<0{n_PA3"~q`SC5( weXL90 rdVE:*tmaSK?3, }rrfg\[TQMGGB?<948.4,0)/'/'+)-+//0559=@DLKUV^cinv{+4DN]gw .>M]my ):JXkx (?J[m{0:R\r}#3DTav 3=S]o 2?K]gw )1>EQYckv~~vpdbTPD=1- vf^JF.' }q]Q=1ygYD8!seNA. m[K5(yeXC5#p^Q?2#vn[SD8,!zria[QJD;;--%!   $-/:O`r*6JUdu/8IR`my&07BHS[ckux~zoc^NH:/# xeYI9+ tfUE0# ycVB1"wiUI4'rfRC2$xdZH<) wkXN=/"sj[QG7/  vojb^TTHL?@;53/*)%&! !%%,+138;>FHPR[^fjsx $)9BPZft'6EUct$9HYlz,2"rfSE3!u`Q>- |lZF6!rdP@0|kYM:.ym^UH<2% {uqjfc][WVOOKJHDD@B>;?9<9998:8>9?/ r`Q?1!vfXG8) zo]O?."|s`VF:*ti\UI?8*( ~}~{|~ #+3;DNVaiu{'5>PWhs~ $/>LZiu'9GXfw0=NZmz%4BR`o~ *4DP\nu$/>BQ[cpu&).56==DEHLKPPPUQXTVWVWTUSRPNNIGEA><550*'"  ~wleYSH?7*#uiaOI9/# ~rcYH?-!jaNB1#}n^PA1!xkZM:2wm[TC9+ yllYYKG<5.$  (/7CGV^gq{"+IS`ht%+48BDNQW^`giorww~}~{xspnge\XVLH@;4.# siZUB=+#yi^NC4& }j_M@0"l\N=.ofSD6& mcQD5%pdXI>2' |uj`VLC91( "(0;BNV_is!./ tjXN=2$ }qgYMA7* zrk_WMF;7*( ~z{wzwzvx{x}z ")4?JU^ix)4CQ^n|#6DTeu$4GSir *9K\i~)@I]h|*7GRbm} -6BPWen{  ),5=AKMWZcenoyx{vqkg`[TLF?8/)tk\QF6.ym[N=0 ugSG4%p]N=- ziZG8'pcPC4!ngRI:,!qi]RJ;5&#~zvsonjiheeebe`cccgdifllnrqyw~ %17CJU`hu|/6GQbl}"9BXcz$7GWj{"6G[l!1CUdx );GYiu(6BI\_rw""-25AAKOR[\aegolutx{}~{zvtrkmcd\XTLJC>8/+ xpaZKB7'qhRK6.|n^P@0#yh\H=* wjZL<-~rcTI9-tf]PC8,! sna\PJ@93)$ !(.7>GLY\ipw'*KVco}'2;HN\ant$&-036;=?DBIFKLIQJPLOMLNHKDDB?;914)-!" tmbYQF=4) }ui]RG:1$ ~ndSL:1!{p`SA7&ueVE6) ~ocRE5) ~sdYJA0)}rmc\RLE>80+&   $$//;>HNT]elv}&,=FU`px$6ETdt$/COao1@N_l +=GXds)5CM^du~'*8?IS[emx~  %&)--215477595865502..++$" zmi]UN@:0$sgZNB3(zk_PA4& wlZO=4 }jbSC:' ~sgYPA5+ul`XQ@=.({tmeaWTKI?>33+&# ',1:?JKW]enu(4ALYer (8ERaoz"0>KZfu.9IUap(3AM[ds~-3ANYcpz %26CGSXbhqw}vric]UNH?:0)# zug`SG?.)rgYM@3$shWM91|obRH4, ~ocUH>-% ypdYNE:2& }uofbYWLJC>83.)&   $(-68@GJVZbiqx#4;KTcnx &=CVer +:KWjw"/AN`l*;EVap|  .9EO\fty!,2<BMR]ajsx  !"  ##"  |xjdYPF;1%}kbRF7) k]P>1!tjVL8, wlWO<0 ujZN@3${qcYLB3*wmgZXJE=3.( #,27BGOVaetx#'8BO\fv}!3=P[nx!2>S^p~ *6HUgu *<FWfr!.;GU^k|  (1>AQQbdqu &'$'&)')$)#'!$  |xjgZQK?8,#zq_ZI?3% ~rdWH;/tdXH:*xkXL<, ~ncPD5' zl`TI;/%xqic]WNJC<9/-$$   (,07=CJOW^eiux  .:ER^jy*8HVft ",=PZqy%6CSbp!);GTco $2<JW^nu!,3>FPZalo~!#%)(---./././+.(*'%% |ukdYSE@2+" nfWN@4)|ieLF4( |k]O=2 |l^O?0!hdLG1*um]UD;.# xsfeVWIG<90*$  !*,6GVep &4CO_l} &3AQ`k{%1?OZku !1>HWapy  ,6?IQ\dmt  wph^WQD>2-{lcVM?4({qaYH<.|nbRE7*zj[O@2$ {rcXM?6(pl]YJE:1' |ysmjdbZZVPNJFD?<;764/3,.,+,(-&,(,)-)/,3-62:9=AAIJNTV]bemrx"29DQXep| $2?LZfs-7HSdo}+:ES`j{%5>MXdr|$17CNW`mq  '/6>EISU`aklux|zpog]YNKA;2,# zoe\MG70$zj_SH91 ywa[M@5& yiaNI3-sm]TF=/' {mhYSH>7,& |xoqdf]]VRNLGGAB>;;773513-3,2//3034396=4) ~vme\UNF>6.(" }|wtmogjac^_YXXRTOPNNKKJJIKJLJNLPPRVVY]^ceimowu  *1>ETYdpy"':@Q]ix#6@Q]ly,6EQ`mx %1@JYbqz(1<ESZfnz '.5=CIQS_`imsz}|vqjg_YUKI><0,#vmfYNG;2( ~vg_PI41 ~sdYJ?2# {j^OG7,wj`OI9/" wpcYPE>3*!zvqmfb\[TTLKGG@B;;87340//-,.+-,--./.4083<:@BCJIRQZXcajiur}$-6BGT[epx ".:GU_o{ ,?HYit*9GXgt '3@R\lz %2>HVamx (57EIQZ`hny{|smd]YJH>4/"xiaUGA.' rfWK:1ujVN9/}udWI:.wo_TH9-|piYUF>2*! vqif_[TPLEB;:31+)$#    $$,+53;?CJNS[]hiry '4;IT_ju !19LUgs -8IWer*8HUep "2<NTho+5CMYdp{ &07BHQZ_lny|rmc]UME<4,# }ri^VIA5*" ztc[OE8-! yh`OE5,{j_QD5+wg_LH7. |lfYQE=4*#}}uqmgeb\[WURQLLIIGGCDCD@E>EACEBJDIJMMRQXX]`egiqpyz ,1=ENYalv&4@KYcq~*5BS[lx &.@IXes&3@LVem'/;DQZcoy #*18@DOMZ\fhps||}wpofd]XQLG>93*'}uj`WNA9,&yl_RE9,"wk\NC5& ~rfWN<4# ~tg\QG91%zpf`RP@<2*" yuqnfi``^V[QUNNJIIFFCG@EDBGCGGHJLMQRVZ[bdinqx| "*6>LQ`hw".=DU_nw (8CSZlw*6ASXks!*8CN[er~&+;ANVbgv{ #(-79BFMQW]^fgnpuv}|~xxrpkibcYXROIF>;52)# vtc_TM?:,(~oc[ID2*~re[MA3*|rbYKA3-~zidSP?:-% }uod^VLG=70'# #*1:?KQZajr|!)5@KTciz,4CNZis &/?IWdo| !-9AQXfoz!(27CKR\`kqz  $'.(60;6@;EBGGIMMPNSRURUUUVUVRUQVNQNMMJIFEBB><943-.#' }zmf^TKC8/( vk`SM;7%wnbTJ=3&uj^SH91$yncUP@9-"upe]UIF84+$ ~{|} %.2@AQQ^hkz&/DX^uy &3?LZft#1:HU`ky  '3:HL\`mu~&,08<AEMMUX]`heomut|z}vxqplifa^YWQNFF<93.'#  }mi^VKC80&{leSO=4'slZPB6( }mbSG8,wkbQK;1$ |wjdYQI>:/'" yv{uwuuurxpxqwqvuuzv}y{ #)29DMT]hpz(4?LXcqz ,EXaqz !,<DS`iz,0BGU^hs} "'24?BJMUVabenouw|}|wsqkic]]RSHH>=21(#~tjbVNB7/"yl_SG9-pgUK:1 tjZOA4) {odZLD7-"~sld[TIB;2+$ }zyuwptpoplpiojmmkooorovr{w}  */DU\lt)8AP\gu &,<GQaj{ #.9GQ^iu~"-5AIR^eqy##./7:ADIKQTY\`aefklmsqvwt{w|xzzxzyxxvtsrpmmhgda^]VUOMHE?:4/*$ ype^QK>6*  ~ue_PF</%|wd\NE6-~yj`SK?5(  wse_QO==,& }tph`\SMHB:5.*# !'*17>DIQX_flvy $/9@OTbks~ %.;GP`hx )9BP\fu~ "-8DM[cnw %.6?FNT`bqs~ $$+)./245:6=9>=<>>>?>=?:>8<86:131+-'&"! }{oibURD>4, zre\OE:.$ pkZOE5. pgZOE8,$zofZTFB21! xtkf^YQQCB:60*$"$'.39?EKRY`enw| )0=DQYfoz "4:JS`mw,5GM^gs !,7CKX`mw *1=APR_cnu} "&-+438<:BADGFKIMKMONONONPLNHLFFEBA=<7620()! |pm`[PJB82(~yjdWLD9,# {oeWMA6(|ofXOC8- yoiYVFD21" ~uplc_YSNHB=92/('  $',36JR`eu{!'38BJQZbisx"#(%*)+*.*/+--,+++*'*#(!"! xvif]XNJ?92'#yvf`RJ>4)tj_SE<-$ ul`UK=4)wkcXPD=1+ qoe][MKB<5/'"  "+.8=EKUYejrz  )5=KR_is~+4CLYer{ %/=GV`ny -5CLZcrw !06BKR]gox  #(,269@AGIMOUUXZ]]d^fbehdhghjeidfdbc^`Z]UXQQMIHB><43.)$  {pk_XOG>6*$ wm`WJ@4' xkaSH:0" ykbTK=2(pk[UG@4'! xpgcURIB<2.'  **9:FITZclq !*5@KW`nv(6?RZfu*6CS[ht "/:EQXgo{"(2<BLR^cmsz #('..2587?=ABBFFFGHFJEIFFFAF@AA;>6:22/+,'"  yskbZWGF73* uhaSJ?5)uo`UI>2)un_VK>9)" }wjcXQB?1)!|tle_YOJE=80+&  "*.6DSWfky~ !,,;<FNQ^`hps||qocaXPKB;4+% qn_XND81&un`XMD80" vnbXNF<0* wrcbPPC=4," {tpie`YYNNIE?>65..*%%        %$+*228;@CEOMYX`cllxu #*6;HLX`ir{ .1@GVYjo}%.;DP\bpx(-9DKX]mn~  *.7?CLRX_bol|yxspib^VRLE?84+%~wmgYVD@4-#uj^VI?4* }ti_SK=6* sodZRH@70$ xtnld^YTQLFC=:66*,(##    &#.,66>?FJOVY`cmpx}#+5;-({tola^WSMIBA861++"#   #%+.56>@IJRU^ajnt| %*663.&'   $'00::CIMUVccpry!,5;GO[_nr "'8LT_jv| (+:<INV_fmu} "$#%#'''%%&##"!   zrieYUHD72'!~rg_SJ<4){kcXJD2.|ofYRE;2%}ol\XKD=/,xwmhd[XSKIA?96/,'#!   #&,.46;>GGPSY_cknu{ #.5?GSXfjw~ ,0AEU\jr$.9EM\crx$18DNZ`nu~  (.7?CMN\Zhjqx}}xpmb`UQJA<6+(ro`[PE>3(! {jdXNE;1' }xjcWQC?0+ zok_ZSHD76*#~xwpljda]YWRQMKHEE@B=:=6;365224/5/3.3/3235766;8?HTZgpx '.;@KU[fnu~  (.3<AHMVXbbomxxyvqmfb\YONF?<11( wng\UIF83& wsf[TE@2* zngZSD?3+  ztkc]PLA=3,# |urmkec_[YSROKIHAG:C9>8:666725140310303134669:;>>BCGILPQVX\`ehjrp|z "(28BGTXbksz  ,5>IS]hp}  (2=ESZeo{!06?KR\enw  ),69FEORZ_eiqrz~~vunjfb[WRKGB<50,"! ~wpe_TND:6&%ylfZQH=5)"zukbZOG=6+" zrja\QLA>30%! ~xvpphde]`YVUQPMKJEGEAE>@>:B8>::=:><=>>BBCEHGLNNUTY]]cejmpwx~$,4<@LQZbkp}#,5?GS\fqy "*5@KT\hq|!+4=GOYbhs{#(-5;@FKPVZbbjmru{}zytqmfg^^RTKHA>65)+  zoj_YOE>4-" {ph^SL>7,!}ukbWOC<1* wqg_VND@2/"{|rokdbZXSQJIBC;<6622*/&*$%"!!$&"''+,0265>:EBIJOUV[`dhppx} (18AIS[cnt$.:DOWelz !.6BNUdlx)/;DLX_kr~ &'08=EKSUe^mnuz{xrjg\^POE?90*" vpc\QJ>5-"{se_SJ?6)"xme[PG>3,  yshcWMH;8+% |spjda[YRQHJBB::722/++((##! "#$)&--/36:=?CFLMRT\\dfmqu~ #+5=DNW_iqz".6CMWcmx  *3@IU_hs '-8BJV[eox~ $(27?CHRR]`elqux}yuomfa]VRNFA=43(( rnb[PK?9-' {sh`TMB9,%snaZOG<4+ zrk`ZTHD;3-%{xrnlgda]]UWRQPJLGFEABA>;>9=89897987;9::>ECHILNNUS[\_dfjopx| &,7900%! ~pk`YOF<3,"pl\XJ?8+"~rjaXMF;3* }tme^VMG>:-+" |{ttplkgebc\_XYWXTTSPQMQIQIQKNLPOMROUTUXU][_d`hflnrtx}| &-6:FITZcjs{!+3?DSXenu ),>?OW_lr%-4BDSUcgrw $+058?CHLPVV`^ehippuw{|}{zutpmiibaZZSQKHB@:43(+  ~zlm\[OH@8.' ~wieVSE=6*"xqdbRPB;4)"ushc]TQFD95/)" }~||  &-2<=JLU\`ipw ((8>FSUchry #+6>HOZbls %*6<DNS_cns| %)037@?IHQPXZ^beiktnvuz|}}vyrrllgf`]ZVQNGF?<72-(" |rnbaQOB<3+" {sj`XME<1+ ytfbTOE;3+zwki^XSHE:5/(" |{yvvsqqoolmnjjiklhlhmjolopsrtwxy|| (/5=BIQVadps~ ,0>BOU`gry$*9<NO`dqy"*3<DMU_gpv ",,3:?BKKTYZbbilrsy{}vupkj`aXWONCC980,$ |vlc^PN@91(}{khXTEA6+%~xnfZVHC9/+ xsifYXLHA;3.'~z{vurqokpelfefcddbe`eadddggkhnjspttxx (*48BFPS_`lry "-3?EQUbgr|*0?BRUdks!(47HHW[dnt~ #&,36=AGIQTZ^bcjmowy{}}vumoff^^UUIKA?;1.)" rkgXVIA<-,wkfWTE?6*"}wjfWSG?70$ uqh^YSID;5-)zysspllhhde_d^^]Z]V^U\WYXZYYY][^__d`hdkkmpquyz #%14?CLT[cjsz%*8=JSZhlz +2;JK^`pw $05AHO[`jrz"%,17=AGLOVZ_aijqtw|}ysqkgc]YSMKB>71,% zqg`WOD@0.  wnc[PF>2- znhZUIC81%|sme^XPHD;5/&#}{xutppmliidhae`ba_a^``^a`caechfkjnorrxv}{ ")/8@DMU[djrz $/5>IQ\cmw '0;AOUais{ !/1?APQ_ckuz!',137??FILQSYY^^dfijontsvvy{z~|~~}}}y|vxtuorjmhibe^]ZTTNLHC@?87/.'% vng`WUHF;3*% {tla\PI>8.& zpk`YPGA70(}yolc]YPKH?=11'(  &*17=EHTU`cmrz$05CEUXckt} $,6=IO[alq )/8>GMXYgjsz#'*0.97<?BFGKNOSRYW\\_^b`fbfefggfififhghcibg`f^e\][XYSUOQJNCG??8831/'%  vpi`\PNA@30#!{ujdXSI?9.(}wlf^SNC>2/ ~yojdZYMK@?34&' !&-29?DKRT`cksw(-9?JPYciuz '29EIW\io{ %+5;DJVXcjnz~  #$,,3299?A@GGLLNRQXR\V]Z]^__ba`cabb_b__a[bW`W[VVVPTKPIKEE??;8720,)#$  zrnc_XPL@=01 "xugc[PJ@90( zricWWGF:5,$xskgaYTLI@?40)$  "%-0:;DHPW[cgrs *1<@OP]cjuz(/8AHTXels| ")08@EOU[ciqv  %*,23:9@?EGJLPRRXXW^[^__bcbdeeffdibiaj`g`bb]`ZZXVRTNNKFGA?<945,.%%  ~ypje\UOH@;3+!|ol`[QI@90)"zqj_YQG@60& ysle]XNJA<40&" %).6;5/,%!  %&-17=AFLSV__lkxw "-270+! yskc\SNA>2.#}unf_UPG@;0-!xsnhd\YSPFE=<52++!#  !%(-15:=BGLOUY]dgoo{z (05?COR^_nn|&.6?FNV^ept !(-4<BKNW[clmvz  %$(,)0.13265797897<7<7:97857460401,-(*&$#  |{qkh_[QNDA44(%xrfcWSGB90* ~tne^UOE?52&#~wpig\\PQGB?73,+#   "&,15<>GIQVZcflsw&03ACKVZejtz&.9?IPY`hpx "*18@ENR]_jos}   $)(//2468;;?=CADCHCMCNENGNJJKHJGFGCF@C?<=79340-/&)!!  }srgc[SPE?90+"zshd[RKA<1," }wpg`ZRIC;3,%~zsogc\XRLHA>64-*%  "%,-5:;HDRP[^cjou| "(18BEQW`gpu'.8@IQXakq| "(25?DKSX^ejqwz  %&',,02155:6?8>=?>?A@A?A>C=B<?<>;;;77613/--%*"#ytmg`YTKH<:1+" rrc`UNG=7.&|rld[ULF;8*(}usie_XTMHC=75*- "  "%-07:@HKTW_cjpw{ $+4;CMS^dlw~$,3?DQU`joz #&36@EMS[bkmw{  "'&+,00557::<@=BBCDEEGGGIGKELCLDHCGCCB?>?9;7631..(*$"  yulg_ZSKE=51'! {sma\RKC92)! wrgaXRJC:5)' wsoec[XPNGC=:21*%"  "#*,55=?HJSW[cgktx  (.;INZahpz  )*88DHPW[dgpr|} "$$$($)&)((()('(''&&#% "   yzqmecWZLKD>71*% ywik\[OJC95,& {uki^]ONC?50("~{uoih^]VSMHF?>832*)%   !$'-,55;=DEMNVX``gloxw$(36AGNW[fjuy'.9>FMT]`np %/0;<HJRW\cinuz~      ytohd[ZNOAA65+& {smd\WMI><1,% }xojbZWIK<<0,$ |xqofd^XUNLEA=750+)$"  !&%//48<@FHPQYYcclnxz~ $,4:BJPZ^jmy| (*6:EKS[birw $,17@@MNW\_jksv}        }yrofc\YPLF>:4+*vpka]RNE@91-" yqnaaUOHB:5-) ~wsoida\XTMLFD@<931-)("!  "#*(4-;9@AGIPTX]bgnov{ !.0;?JLX[fjuy $*29>JMX\fitw$%/1;=GIQV[`glpxz      yvnic\WPLD?80. "|pob_SOF>9,+ xtie^TSDC84,% wwkla`^RSIHB?:61-*%"  !%%/15::FDPNWXacjpuz #,0FMX[gjv{%)34@@MMX[aimuz~   $& %%'(*)).'.).*-*,,+*)((&'###   yxnic]VPHC;5-' zsid\QN@@.0zwjg_URGB;3,& ~ruik`_ZTOLGD>=54-,(%  %%,,289>DEMPTX_ajjsu~ '+4GOR^^kov~ "(.28;CELRUZ^dglqww}|xrqgi__WUNKD@;71,&" }xqlc`VUIH?92.%!|ynmd`XUMIA=60+$! {zurnmgfa_Z[STOPKHHDCA>>;:87829-7.4.1../,1+2,1./1.202356597>;?@CEFKIPPQXW\\`cgjmqsw{} !&.1:>FJSW_ejtx $&/7:FHQX]fgtv  &)12:<CEMNTX]`ehlqsxy|{svklfc`YXRNJCB:72/)$ }won`bTTLDA74,&  }wpkf^YRNFB;7--#" |xvpoiieabZ[WTRPLMHGGAD??><9;8874735322312241526438699:><2/(!zsmha\WQJG>;33'& }zztwmomhiddc]^[ZYVYSURRRPPONNPNOLNLPLPMQOSQRSVTWWYZ\\``bedjjmqpvt~y '-/9;CDPPZ^chrr}(*4:?DLPX]bjos|  %)-049;BAJJNRUX\^aefkmpsrxx}}}{zuvqomjidc_]ZUVNOHHBA;932++"$ |xqnfd\WSLJB=83-)"|ytljb`YUOKCC982++ "~||{xzvvvttsqtpspqsososqrsqurvuxvzx|}~~ "+*46>@HJRT[_eknwy$)/3:>DIOTY`djpux #))/177??CJGOQTVZ\``dhgmkqpttxw|y|~}|zxvvqtkpigi`e[^XVTOPHJBB>:911+($   yuqgi]\UOKEA:7.."# }tsiha]VVLJD>=33**" ~||~~||}~  &)/29;DEMMXWbcioq{{ !%)13<>FINVX_dhotw  %&)0.65:<?CDGIMPPTUYZ\^a`fbjfkjmmportqwrxuyuzwyyy{yzyzwzuxvvuvqtopolmkgide`a[]XWURRKNFHCA>;752.-%& ~{vqkga^URNHC?86.)&~}vrogg\^UULKE@>840,'$   %)-36;?DGMQU\\gfost} "$--7:@CJNSZ[fgmru|!!$'+-055;:@?FDJIMLRQVUYX][`_cdcgggjikkmkomoponrnqppqooononlmlkjjfgdfad]aZ]YXVSRPMKJEE?>:;36--)$% zupkea\USHIA;71,&! {zopfe^[VQMGD>;52,)$  '(-44;CBFHJNMQRVWW\\__bbeeghiiljnlqmpopqrpsosqpqqnqmonlljiigfdbb__\\XVWOTLMIGEC@>8832-,'$"  yvpkga]WRNHD>:4/)' }xqoie`\XSPJFC<;41-*$"  !#)+138;ADJLRUZ]cflpux~  $*.3:<DFMOXY`efqnzz  !!)%,+10356;6@;B@BCGFHGLJNLNOOQQQRSRSSURSTRSRRRQQPPONMLKJIIGCEAB??:=5923.1*-$'!!  xuqjjbaXXONGE@88./(# }|tsmjdc[ZTRMHF@?863-+&#   (&//67DGNOWY_bikqtx  %%'++-1/44687<9?<A=D>EADFCGEGEGGGGGGGFGEFFDEAD?B>>=;<97634/1,,)($&   yysokfc^ZVQNIEA<921+&#~|vtnlfe_]WWPOIGB@;962.-&(!   "$',/258=?DFKNQVY^bdjjrtx} !%*-36:@BHKOTX[achnpsx|    !"##&$'&'(()))*)**)**)+'*(')%($$$"#     zurokgd`\YSRMJE??871.*%# }xxprlidc_\YVQRJLED@>:844..))$"   "!'(+.148:>BCHJNQTXZ^cdjlpsy{~  #(+138<?FFMOTW]^bhjntuz}    ! " " !!! !       ~xvqnjhb`[XTPMHE@=952.)'! ~{wtonggc_\XVROLIEC@=:741/,(("#   "%)*.1489>@CHJNRTX[aahinstz}  '(/078?AGHPPWY^adilqsx|        {zsumlhca]ZUTMNGE?=852-*&! {ytsnmhfb_\YVUONJJDD>><7530.,)'$"   "%&),-4088;?@FELKRRXX^^cggonuvz~ !().269=@EIKPTV\^bggnosxz~                    }{wtpljed^\ZSSMKGBB::43,*&#~zvuoniicb]\WVSOMJGEC>>:7731/++'&""   "$&**./458:=@BEHKMQSWZ]acejlptuz} !%(.039;@DEKNRTZZbagjlsrx{~~ywsqnihca^ZWTONHH@@:931-*&$ |xurpmkfdb^]WYSSPLMHGDAA<=87431/-,)(&$""     !##&&)*+0-41779<=AADHHMLQRUW[]_cchimoruwz~ !%'+.158<=CCIJOQUX[``efjmptvx{~}}yvuppildd_^YXUQPLJDD?=;65//*)"# ~zyvtppjkged_`[[XVTQRLMIIFEBA@=<:9864513.1+-+**((&($&$%!% %#" ! ! !!!"!#"$$&%&'&*(+)-,0.1134588:;=>@ACDGGLJNOQTUXY[^`cfgklnrrwx{ &%,+2369<@BFGLMQTUZ[^adgilnruvz{~zyvtpnkggaa_YYTSNMHGCA>:833-,(&"  ||vyrsomkiheba]]ZYVUTQQMLJIFGDCB??<<;:87755433010//..--+,*,*****+****++*,+,,---/.1/304356699:;==?@@CCFGHJMLPPSUVYZ]^acfeikmppuuzz}  $&*,0168;=ABGHKOPSVY[^`dfhkmpstxy|~||wwrpokifdb`\[VVRQLKGEB@=9832/,)&% }}yxwsrpmmjhgdd`_^\ZZWWTTRPONMKKIHHEEDCC@B?@>><>;<<9<8;9:99888989899::9<9=:=<=?=A@@BADDFEHHJKKNMPOSSUVXX\\^accfgkkmppttwzz} "$(++1267<<@CDHKLQQVWY]]cbghknortvz{}~|zwwsqnmjhec`^]WXRRNLHGCA?;9632-,(&"  ~|zxvtqqmmiifgac^_[[YWWTSSPPNMLJJIGGFDDCBC@A??>>=>;<;;<:;:;9;9;:;;;=;=<<>=?>@?A@CBFCFFGHIJKLNOQQSSVWXZ[^_bcdghjlmorrvvz{| !$&*+/2388=>BDFILNPSVW\\abegilmqruwy|~}}yyvtronkigdc_^ZYVTRNNIIECA==7733-.')#" ~}zzwvtrponljigfdcaa^`[]ZZYWWUUSSRRPPNNMMLMJKKIJIIHIIGIGIGHHGIHJJIJJJKKLMMNNOOQPRSUUVVXY[Z\^^aacdfgiimmpotsvxz{~ "%'*+/1468;>?BDGHLMOSTVX[]_`ddhhlmpqttxw|{|{zwwsspomkjgfca`]]XZTUQONKJGED@?<;86410,,('$!  ~{{xxvusqqpmmkjighefccc`b__^^\\[Z[YYYWXWWVVUVUVTUUUUVTVUVVVVWWXXYY[Y\[]]_^`_abccfehgijjnlporsuvxyz}~ !$%'+,/14599=>@CEGIKNPQTVXZ\^`adfgjkmnpssvvyz{}}}zywwstppmljhgeca`_[[XWTSQONKIHECA>=;7835//,*(&#!  }}{{yxwuvstrrqopmnmmlkjjiihigiggffgefefeeeeeeeefefgghgihjikkklmmonpprqtsuvvxxz}{~~  $$'),-02357:;=?@DCGGJKNOQSTWXZ[]__bcdggjklmppsstvvyyz|{~|}zzxwvvssqqnnkliggdfac^_[[YWWTSQPNLLIHFDC@@=<:86521/-,)(%$"  ~~}~||z{yyxyxxwvxuwuvtvtvtuutuuuuvuvvvwvxwxyyy{z{{{~|~ !"$&(*,-014478;;>@BBEFHJJNNQQSUWXZ[\^_abdeggijkmnoqptrvuwwyy{{|~~~}}{{yywxuussppommjjhgedcaa]^[[YWVTSRONLKIHFDCA?<=986531/.,*(&$#  ~~~}|}{|z|z{y{zy|x{xzzzy{y{y|{|{|||~}~  !#%'(+,//24579:=>?BCEGHJKLPNRRTVWXZ[]^``cddffihkkmnnpprssuuvxvzyz|z~{~}~~~}}|{|zzxxwwvuusrqppmnlljiigfedba`^^\[ZWWUURRNPKLIIFEDBA?><;976321..+)(&$$   !"$%'(++./124587;;>>AABEEHHJKMMPPSSUUXXYZ\\_^aabcdegfihjkklmmooppqrrsstutvtwvwwxwxxxyyyyyyzyzyyzyzyyyxyxywxwvwuvtutssrqqoqnomnkkjjhhgfedcba`_^\\ZZYWUUSSQPNNKKIHFFDCA??<<99763300.-+)(%%#!   !!#%&()+,./123577:9<=??ACDEFHHJKMNOPQRSTVVWXYZ\\]^__aabbddeffhgihijjkllmmmnmonopopopqoqoqppqoqoqopopoopnomnmlmklkkijihhgfeedccbaa__^\\ZZYXVVTTRROPNMLJJGHFDDAA?==;:8765320..++)(&%#"!  !!$#&&()*+,./012447698;;<>=@?BBDDFEGGIIKKLLNNPPPRRRTTTUUWWXWYYZZZZ\\\]]]]^]_]_^_____`^`^`__^`^`]_]^^]]]\]\[\Z\YZYYXXVWUUUSSRRQQOONMMKKJIHGGEEDCAA??==;;9977553210..,++(('%$$!!  !!"$$&'()*+,-//1123456789:;;<=>??AABCCEEEGFHIIJJKLLMMNNOPPQPQQRRSSTSTTTUTVUVVVVVWVWVWVVWUVUVUVUUUUUTTTSSSSRRRQQPPOONNMLKKJIIHHGFEDDCCAA@?>==;;:9876543210/--++*((&&$#"!    !"#$%&')(**,,..0012234467788::;;<=>>>?@AABBBCCDDEEFFGGGHHIIIJIJJJKJKKKKKLLLLLLLKLLLLKLLKKKKKKKJJIJIIIHHHGGFFFEEDDDBCAA@@??>>=<<;;:9977655432110/.-,,**)((&&$$""!   !!##$%%&'((*),+--.//0122334556677899::;<<<===>>??@@@A@AABBBBCBCCCDCDCDDDDDDDDDDDDCDCDCCCBCBCBBBAAAA@@???>>>==<<<;;::9988766544331210//.--+,)+()''%%%##!"    !!"#$%%&''())**+,,--.//00121323444556677788889999::::;:;;;;<;<;<<<<<<<<;<;;;;;;;;:;:::9:99988877776655453433221100/..--,,++**)(('&&%%###"!!    !!""##$#%%&&&''((())**+++,,,,---...../////00000010101011111111111010100000000////./...-.,-,,,+++***))(((''&&%%$$$##""!!    !!!!""#"##$$$$%%%%&%&&&&&'&'''('('((((((((((((((((((((''''''''''&&&&&&%%%%$$$####"#!"!! !         hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom2-Soft.wav000066400000000000000000005371201366722712400226520ustar00rootroot00000000000000RIFFHWAVEfmt DXPAD dataP<gmV ue0 !! } y}5]" #&#Y`3 &  5 H}.k<  )01-% >@f_ٰ6<]˩˂ͶϨ7{ӃшI+L緺ӧcbس`_ e]uհس U.%Ys̿̌%Ԧݏ"){BF,(zyJ=s k Yp]}"#R$#@#c#v$%I'<(((&c$b![ !K"u""r! !!"n##K$$$$$s$#""\#o%([*f++++*l)M'% #! A!!a"5" _BE6Ec^!"\"v{0 sb D M XJ'11{mC*0mZjv,2bvug7tR f(H{`P !"[#U##$X&(*++*T)'X&M%K$"! E/?Lvd]&/-&U}x0  4 D}*08& [W_D,de; {Q"%;%ߤ ғӖ԰ҿOT:̯WʸNūʼni-ȩ, Ik "ˁ4Ɍ9ɈXaӀ֏LւԳн,`aͫR{~#lֳޚ$LPGjW v~,eUXn !D8}*UM #!! < ?x/% 8 g!!! A `Kx~z!"$&(y*+`,9-Y.7//001N3A44p4v320`/H.&-++*O*))M('M''&&.&%%%%%(& &%%3&&-'''['&k%2$"4!7Xa. ] ]Dx.U1O  < 1dFhR+-v1M >Q<_eF < G =  } ' R - dL.>Ihzkxepjkc3"X<dHKH.?Aiz%olB*4ߡJ1ߢ Q, LPܼ?_ۨܐ(DUݛۊڄًا o7XoتS|g}.XD)[߱gnur)9o@Y8< mA,vdnl U  l Q J0o|:w@=~p p"#$v%%&G&q&X&K&&&:''(u)[*D+ ,,'-,,;,++++$,,,,,V,+*))('&%$#$##""""h""""#W#Z#n#R###c#T#z##Y#"m"!!!!9""#$*%%&&~'z''H&`%)$A#"I"!!N dX 4 V "^4tT>n}q 6lCI@:4rwrr Qo>^d bZ z~l";/Pwu On3spxYI!pi)Dv :9y^'W.C`/?J4Zr|~B!T% 3S]\/:z'(/3v]leub caA9 a)M[?2Ta F!+"##]$$$%$e$Q$$$$$#W## #E##~#7##""+#i#|##_$+%B&'b())*D+., --.n/ 00*0Z0008112g2r222#21100N11a2d22N1N0,/5.7-V,+Z+**8)P(g'^&K%5$# #\"i!S Z#t7]HZ}{ P 6 E e Qfer\q'j{SuD>x!na~& }E,H"Mr16/ ksNe(|mrN#s'AbML>JldfB{ [H[ZW' 4i:MqXgKlr(m g%pqZS!UFAd5I)c2K`*]I g| V]5EhzME~ 0t N  9  # V 3snDf@0;us 9))c0DB4xlO @!!"'#p###R#p######<$|$e$$###$W$$$$$$V$#"!  a0*v`d<$ee 2A{bc u ? T [ `+% fKnK>b97L(gmz~d>Pzp cJ0T'2k Z\yrrb&&2K)OdߴgG["S;V"8 kFP@tSVB>&F{` GXUx1}jwY*(D'1R1]MZ]dBI6yn*+cs:U#rj 1BUJ28u~8,K S  G N a h  n L#*g=fsaO,rIae G!!w"""#G#g#####$$###3#""""D"!'!} XRn5.[ = A  q 2D|<p.zo    wEeLVk(O ,H61oovy^VX?(' Aqh:7Yy | h63Y $aQ xL%'q |K s RYj~/k#u6FU9 *] T$K%[Z6KD&\,hOYXi%P.$[LH-Pg f  U @ F ' 7 ` T * u L Z ] R M  Vi}\uebR  h o  c D t \]*q |S'z#FN@6?cR~x+2GV@E>L^4~+1nVM \= pF8g\200j  0 m B t MyI8j2&u;=4 O{{K/t@&l>Fo:v5 9qN)*Ujl9[4P}:P}BI6KBX3w$dlL!GWq!bmM%KIZn$FBsHdNwQ!gG#S?YzY-HQs-8~1@{tT  6 n y ~x,!gW%r !Z 9wA0SZ|,v6pu$HKK3!/)L2 f!is@w.}"Q2CuEkQ8 , b d 9 h  4 BG#Ca t'$UTvp;6b Le)PMw6gTkC%lY+&\&R1EXWu[ xC+CRm PB/emzH#{U(Lp?`W R}wkwky"qSd"0, A05[W7 G  H M 9 )XBmt5 ijlkkiZXb)Qe[ U"aQqe[5b2pa<{aVimKhXuk iBL{jD6_Z8 I x  fo;/u%|kU5}0tC4%^tH@hx|Z jU wW:[OS*Smߦo2ޯ`ݑ~r݆zlSVsg.Bݩ$Ad{޽;Ykߒ߳RT[!z$~S-}i o|Q% 6t+t+fX %=6Lmcc\3yP 9r! $c4fJ  ! H u F . AVT|7s-Dp4[wvlk`ZVX]u <+c1y*Waa <x tX*nKXU>n j&(/Ow-w H |  C H 7 LS.UXQlw;-FiYop@ QU.#'(fK8BA="X%cbzgz|O_iPN tY m\0D3n I5sBe!3ge~ 5s TpZ2K81/~5CV$w0[&]D[BVBx"" )c` f B @ 8 m  FY:X~ ?pHKLXjwHp}lHG]cfrjI'F2 //QuW2'_/a@*#I^&hN$n0 \ $ V $ 3 Z a fg+KxQ@2 0V)Y nVQX\B/^:OC>yWH4.2`!u{inrgU$V߬ߡ߫߷߿:v4m'm w!7xX!=&]nOAj%9}"qC9dY { :e W+Km p  - I n  G m 1 ` c R W   W (f8ex0Pq{;iwzj<*&(+Ct "c/IX}1=** a g"L-^#DxI- b; i B q T  p & f , ` 6{!]AHaia5yz t R>hW:X$sU5 GT=bZ]?YVVYwjE3**(!^3(#0=nwtQU0&\3Qb_Xq)iP7i:HJ'9Z 5R}*U{xNsW,S2^IZ7q `  7 e  u 6  K Dl\ ^]M41O_;9hS%HWjwqmT9d"`*I\4X-Z7WM,W F  s A  XdzI&+*@ct.X0T_#LO[K8R"F {J}C yC"Sr.)Tr4q.+Lt; |it(NA/bPzZN)h O.c(DZE:UHIN?93rT%z>!} Oq:`^bAx{%mS | T 7 9  V n 7oKon%BVgXVm #AbuOk*[ $>LNB=>)`CrJ|;k/] iU$ x C  m & n N 3 j I  Z 3 a&i Fc#%x3F 40dW.vHI!eQ;.I Eh%q'Z'U]Jna `7P,o2Ya#~qox0BGBLbw~1BpU\4hJ% k~uvCcg7[)V"Kv/f Ak?w%X kXE4s$>  T 4  , Y  # 4 8 A O k <Kg ">Un O)Y5_-Z.o({ 2^!212(")/c1b%R^'yT*m6"N: l  "  u r ~nd]OR| %Fg#w,g&jP/uK])l$KXM@;j2S{6=r+Pr:qO1wgS4'!:>AG<<7BLcwuwo.Vt%Ho;x-i-lj]b]&hP=u#uJm >6<8EUd |ZECMB.X/Z'xI!a/o;l; n ' \ ) [ $ P  y 6 PD,}2F:0^!`#8GHO_/Dn>m$Vy<W)BU#Y1k*o1v.T},lBlR6{kZUTVVTKP]y{pr0Yu!XJ*k1hovC^ f|4pQo;x9oN|(Gt%[M EgB0?<G@> O @ o 4 ^  + ? X n ,Jgw *=^I1Qs=u N 8\&/4.$  xwqphWC7 taN7/)$ yA_,{16w ; D P 4 " <7#"@d~ 30/y)~0f< e7uB!\*k.f"%:u;[UxSVPT*yR1$k^O<0 uiadVLEQWm}$Ql!CkULC D"_,} If?E?u ?}Mw(SQEHTXQ>S bPN ^#r` W ( \ - U  D h  = k ,Fd'WHs,\?`7[{ $8@KSW\eru{nqpodVLIED91 uV7$m>pBPx1d . = - a  Y ;5H>*hR`D YzJuR%p=tJ{Yh| "Gd@]7s2w6nP1!mE \^;BVm1TgCnA|]8%oP7|d^gox}~*G`w *Fo(LpM4>--hQ/!tPW/n+n;x)r `SRTW YK*tEGHo2X| 1 I R m } * T   A c " b ! Y 2e1j[O F<x+[#Jc}lU8y\9}V7 }P's> ^Bi b  ` 1 S  LtD0x u#={?^0b0P(e5}Y-Rt@ KTj*G` z!IM\&y< fA&v^>~sp`R@+ !4CZj -S%PGs4i=cT L_ \ZP`*UtO)pK%xcRB5 3E`n/Gf-Sl>c:rJ'W KN1vD9;M] e YXCm W%h_P J2h)T/Rv 7 ] t   1 J a |  # L m  > d  O z G~P 3Z%Fb '2<=IESSbhsw~}{jh\[M@-sM/d5l9s5 o ' 1 ) l  P GLKg Yb7kC[5 c7xFs9MVOhqt$@W2\_l3zX3jK&qdTI=0' %;Kcp0Zy/D\ 3Me"Cc)Nw.fFW;~[B*ysTN9*uI_,mN)OqBeFk:` 6 S w + G p , P t   @ \ v 9 F X c n !5Udw!@[ /Lq6Lmuz_=Y*Y"b# g  c  g . X  X  r: q= s8Nc:f$j-a"<f A]x1^8]~4t4{8g*`+t:NW)g=e:pS-p^ZOIDC@GKR\els #/AYe1Mm )HnIq-[7h>z1k0yFJc7V3t3tGMLN6k)\ *V~Ce(KrIs&X I |  ? i $ P x $ K ~  ( W 0O{:_(?e|%Em%>avn[=T? p;h5H  S  B ~ 3 q ^  L6~@{@B MXj!ZV5]t4=DgM ^&wKrIlK.zjUJ<- {wmeWPA<*% "5CUhw!B[t *Lv?i2i8y.l-m8~ISZF/e+c!Vz2],ZzFp3dD;pIv@ K K  B n  C v  C b Ei F`/Pk%.:AFHNWX]TE8) jQ5lH{M p N " v C )  d =  p I _ 9  e? lDf9sA ]V=Tcy)JZFt+g)]e+~E oBtJX5b;]E% qX@& ~j]J7' }qjgbaWQJCB?@5+.+53<<@DJMRSPNPVem|;_)V+h\&nA+wZE=1+wL$gW6p=qAy:h=sNp(^.[O} :i H  Q  F x / W  : h Go&T1W9k-Tj x^D*oL+p;o=S l 3 K  o 4 K U  u9ERl.u)U{,Md k$8V ~/u4s1TY+y[0jJ. u\:xeI3 yl[M7& ~zlcVRC7)xmh_`Ya[_^SSDC76+/-1;ETaou9Yz>b!X&_8pM'V.[2_Er8h0Y,`8nG']O5lG8mZ OB< x  L ~  C v ; k . [ /X0Z{ );EMW^hrw~~}tl\P<+}dI.kS<&  y W G  w ] ? (  v U 8  w R +  o ?  g;h/w<FM 9NSd+y@["Sx= wK!`@b; h:wR(Z6 lAmP&oP(iG( eC"dH,{kI3p[M=) 0ETs'Gm8m0f Fy*dPWO[&o?e0nOVLA{)_KB|Q;oV:w%iR < |  U 1 d R |  5 Z =e7[z,IWm$,055<=A=A:?95/&!t`J-hG+ zU' X ' k 5  Q  f 1 ]  Nw.I`y';Rm"Kq4w4XEO$zL.bE"dC#qY3}\9mU7vbA& pcH;! lQ7^O0wfTC2) *2M\x *Qo#JtBq1d$]6m$`QD? F:y5i V [#g.tI d?\-l2r!U+ ^  B q  4 _  H m  = [ v 2=LWdnx}{vsgbZUKH90! z y k l ` ^ W R L H = 6 , %   u d K 2  i B  i C  k : wD d(Tj<Z,h3n>^0Y7c=|X1zNW&\#Q c0rFlC"e4j=l< U%d4 xLh=uL'yeM@0  (4BZk!5]u *R,VPP1s(aK:~E=|7t)q*nR2s] J8mD'_BxT-f M)c Q  $ ^ ' Q y  G f - E _ w  #21?;KMVZ\ciqx &2@MYZfchfkqqvtvqph_UK?9$|]H  ] 2  h = } L  | ;  I  Eu2h!Et,\KKc"C c&W%e*d7}P$]4nJ-lP* ~^:ueI5sQ6tW;{_>%~lUG3& *7HUap3Qq.Pz?r+]>rK=z!eO@JL HQX!bT P?q$^7mDR{ 3 ]  B [ ( < U i |  ' 2 A L X e m z  " , < A O W e n } x j [ U G < +    { a D -  i U ' f C  q B  ^7a3b?[8Y;`?_:}V-a7`< _;j>e4T i; vDX#Te<vAT,rElHiN9,  "3;PZgr0A[l1?[o #Bb{#Dg9]+Q{6_&Q#T0d[O7u5x-d%]^T7m#T*gIvJm ? T r  . H h  + A \ s  / L i  4 K c | ':\z+7NXrx}xskaP?*zUA ^ 8  [ # h 9  Z $  E _Jf-K_'sBQg1W"V+~T)yM-_=rV,hG#yZ?vS)uS#gH`<{Z:|aI1yh\OB8+ -6E[k /On+T1e(];rU:u*i&d%i&fc,g)f$_G>sHy8`=a )Fh;Ph  / @ U f |   1 G ` w  7 ] r  6 \ w  & ? T o ,3;CADCCCD81 x ] E   x V 7  W 7 _ =  v M 2 bB|[7cGjFnR+uQ+oN' [5kK"[6d2~O%Z#~H \ Dn2XS)pEmR9~r^S>6)! %07DN`q .8Nbt 1Uk'Mj!Nw4d1eH/rZQ>2t%a7w?o$Gs .Rm!Ec#Bg )Kt5O$ L u  B g  F m  > i 6 d | 3Sf &*,..+-(! xbT;.  m O % \ :  l >  L  M  }Hn7X$}A[zF j.]2qBq>b?jCi;]4Q%|M(jD]BhM: {eX?/ hU;& lQ7sW<&uj\ZLO@C8774?:JIR[cuz "=[y6aBr/h I;t,m-n-l1xA|A<{1pZ EvSKv$Hx6Y~ ,Uq!@g ,Mr > d  5 Z  7 a ~   @ \ u   ) 4 C P [ c l w } s p f a W S C = + #   j Z ? 0   m [ E 2  q Z B ,   } f J *  jT1bA(gC$ |^="pP*gDpF]*P n4?ES J Ow?zS |^4kO;m_GA*{jR<)sZJ2&ylf\UPICE=ICIJEQP`dt~.>Ui2Vo8U#N}/WIv ;j>73//)+(.7?JU^gt+AZs 2Po)Xw/^?tA| R,fD|JTVy *Z$Nw 0V}#Hn0Y/a$WR&UQ :j < b  5 W s # @ V q  2 E W j u      " ) . 5 4 9 9 < < = ; : 4 . (     w h T A 0   q W > *  k E + h L ( uU/yU)kBc5j5KVTSL O]#xAuDoH)oX>.{aQ:2 wdI4x\@$ iN+lV>(yleYSKHAC=B@?CAFGONZ[is{%=Rfw8Kq Dk3[%V{/Z:c:k/V{=]=c@i=f%O{ Hy1cIs*NzJh!Fi$De ) I ^ }  < I g w  4 B ] j  ! 7 A Z g w        !       | q ] G 5  { k M 8   j H *  r F ! u@[$Y%p:}ET^c!|<d7b6c?kK*}[?"v[=#|V8a9tO$d>b;fJ2|j]MH72'#%!'**23=@HOYdq| 3H^v:Uy>a Bi 3Y!Nt 9WA\Fg)Wz&Ru I}5g/\.a7m2`KxGk;\x6Le|  A S q  . H ` y  & B \ w   3 J b v   * : D U X f f o t y ~ } z x r m e [ P G ? . (   x ^ F -  f M )  p H q =  l7OZU SGC?AUKh7}a:pY<'eM.{dF)pP8z`J2 }jWJ7+xyumodjefcd`dadjglonyz %.GVn}8Wj:Ts8Qn,Nf!@e:f :j$LP}@t7k-Z /^%Kl2Vv.On#A`~%Ce 8 U t ) A _ p  ) 9 P c w      " ) * 2 1 6 : ; > ? ; ? 6 = 2 0 . & %    q c J 7 $ ` C  w R )  d8_4|P pDvP$eC `C#oS5\>!jG{N%vJ _-tBN%nF\8nV5{dJ4" raQF7*~rugcaXYROKJHHJGIJNIRLYU^aipz"4JYv5Lf~ *Df (Po'KtH|5g6k9i?oJQ}=mCnFa-Hm?Uy0Kj2Sq+Mm 3 W v " ? d  # ? ^ ~  ' C [ v  ' > S f y s ] B ) h >  p E  z J  ~ G  h2{A`"x@ c4pC_*\*[. pE$i<}T,Z9nJ"kG&_F' qZE/ |s_VE:-& }rcTC1~kZK9. $4?O[lv5A`j!4Nf4Ry1Z/\L}Iv =lSx4X'Nt.Nv'Er$Hj@`6^<eEe!Ik 6 U y   1 F Z n  & 6 @ H Z _ m v ~ g _ M > 1  } j M 8   z b B #  dN)|[D$ qUB&lT<  oV:$wZ9Y7 a4xE~CuGY&oJvS'nI&~a?$tY?$ nZ@- rW`!RLS!QFw3\9f ,Y{9a)Hk 0Lt8\z!Jk8]2Uu@`&Di " ; c x  3 X s # = U t ) @ Y o  % 6 < J P Y _ f k m o n l i c ^ S I = 0 $   u g B 1  v [ 6  e <  { K % nF]-j;p> n:c$Kp=[&SO$e9 aCfA%eJ-qWF*nZB,v`F0lYF- leNG3) yysqnijfhjgimltr{y~%9Pf~4Vq$Fk 1V1Z8iDm%J|In7]?fCh Ej0SFoDk@lEq:f=^ / I f z  ' 9 F Z i w               ~ t d Z K ? 2 &  y i Y G 7 %   pdM@,}]N3fN0~]=hD|X*T,|\+U+Z,jFfBwT1nI+fC"uV4nL. rP:l]E2 ufRF5(opa^UOKDB?::678;:@BHMXblz#:Tl)Mq+Jt=j;lCk 6]@a-Pt 2Kn.Jn9a 5T~ 0Rx 0Qu 'To-Pl,?gE\.Ti ! H ]  & J a |  # 8 P c z   $ . @ F T _ d q v { | z m g [ S L = 3 !  } g L 2  n J (  n C  h< vCs<a'}B f(R!S]*S-^=bC!lW1pL5cC(^I(x_F/}gVC,l]O9.yn^SE7( "3D[h/Gc'Cc:ZxAY Ae +Nu(Ov 1W{Kt!Oz)Q2[;l Ix Hq4_8\ )Kj4Rh  3 H \ n    " . 3 ; D K Q X ] d l l r r v z s } v { y | w v u m o j i d e \ ^ S Q L A ? 6 ) &     g \ F 8 "  lQ=  pH5z`<!jM-tN7rO/kF(uT7hK(lM- iK)dG&fR*pL/qV7|_?$|`I+lR;& zeP<'}thgY[OQIKEGGBHGDKHNUX`enu&5H_o*C`t 9Zt -Hi*Fh.Qp8a=i"Np 5Y~>b>]9Xu4Kb~"@Po-F[s!:To "F[~ <\n / H f {  + B Z p   $ 4 @ L \ c t w } x i _ O ? .   v b ? %   Z 8  p>c1{Ni9 c4 [0^6 lK`BiB%vL2 `;u[2|\?"lP<qZ>+gR6! ycI8 w`P:-~voia]XTRKPHKIINPPUU^]cgltx&/GPgu !8Wm/Nn6V} 7\0bBk,P =i$J1X3[*Gs(Lq;\}&Dd&Gg0Oh $7O_y  " 5 E W d x   ( ( 7 : B J K Q U W \ Z ^ _ \ ` Y ] T U N H D ; 8 0 ' %    { m [ K : $  pcA: vaI*~_J,cG/qW;sZ6#dC%`=gE!tM+qG#hB!lE!pL*[;uW4oS<" v\P5'um\OC7* .;EZfy*DSn~+Gc~ ,Hj/[u$Nq.]Kk0Nw#@f6Wr6Ji!3Uj=Ro '<[s-Lh %C\x/Md =Tp  3 L ` z  / = N Y g v  s e V > 0  q Y @ $ wW<}`?wW3lG+^>d7U4 rN!eDhDg=`6wU, x]1_FxT8|cB* nX>)wbQ:. ogXQE:1'   !&28HLZdo},@Zr0Ko9X;i 5c 2\.V#Hq 3S{5X,Ts!Dg4[z*Fr2Rt6Us0Vp#C\~ 6Sg  ; F b m   ! 3 = I U ^ k r }  z n h ^ Q K 8 3 !   t ` L 8 $  yaM4"{cJ2~eI,aD% b>a;xL$|P&zS$L)zS'X4d9xT. {a7~`E&x_J4" vbT@0 sg[LE40  &2CPdr3Nj ,Fi )In<`7a,Pt>[9Zv*Fc}2Pf3Oc0Kf &D\{(Abv%I`9Uv;Vv+K`{ # 3 M \ w     % 0 ; A L Q V _ \ f e i h i g c c ^ ] X R N I > 8 . (    y k W G 6   iS9' s^>'[A bBpM-sM*nK!lG#qF-|^9qW1v\7iJ/fN.dH*aI(bS1!m[>( i\C<"wme\UNIA@;88443477=?FJQY`lt~ 1DZt#A]z-Sn@^1Xv 2V| :T1a~@e Nk*Ru(Jq;]~%Jh/Pp(Jb-Gf~2Gbw#;L^t  % 2 < I Q ^ g t w { p h _ T I > / $  {iO; |e?#tO&^7 Y4{I\0qJg> f<pG$b?mO, mM3tS<"m]@.{eR<'phTM92|ukcZRND><34--,.)0*2258A@NJX\eox&0HVk+B[q"GYy8Rs:Vt%?d}3Pp"=Zw(=bz*Oi:Yu ?Zx?Yv%>]x&Ja.Ni 6Wf$<Ldp   " * 2 < D I P T Z \ e _ l c j e j g g g c d ` Z ^ R U O J F A 7 4 , (    }n`L>)xeI2nJ/ oL0 nP-x\Bs];$kU6#xVD)nO<oN;|aJ'fG,eI-`G* `G'iW:# p_J9*wpf_ZTPLHJBKBOFSQU\_dhpq~~&8CTco':Rc}4Tf4Pm1Yw 0Py 2Xx=T6[6W 0Nu<`|8Xs;Uq0Fez1FZp~ $*FKbn} &6@N[ht   ( ) 7 = F N [ \ k p y y p c Z I = /   gS8_F'dArO,qQ'rM+rJ$bBzZ1 w\0`?jI$~c? cD&uT@hP6 iR="}p^S@4*|{{y|w~y~+/AIYdt#9G`o 6Qfa>\ 5Sv"Da 'Jk )Fa )E[|#<Qg3@]k  6Jct,;Zk 9Kdz %3LZm~  ! ' 1 > D N U ] b k l u t | }  } y y r q f a \ Q O D < 7 * $   m_M9(zgI4jH& |Y/xQ.oH![4 j?|Q,gD`:a4aAwR6~\C&{dL6 q]N<, ~ub_MD8*" zridZYONGCC;?7;8=9C@GHSQ^_hry%8K_q*I^ )Fh5[t8Nw9^{'Hj2Zx%Hi-On1Op /Kn (Mg$Fd#Eb&IdAY}5Od  ! 1 = M Y e q z  r q _ [ L B 6 -    rcL@'|hR>)rS=! jR4u`@* kH5iS4|_H+x_C'gL.aF% x^@(hK0sZ?& xaH1zcK:}hTD)!m^R>6!%6EWhx2Iax3Ql8Wy-Kj#Fh.UtD[$Bc:Tw &Ca})Ed)Nd !>Ur )=\n%9K`t %5@LYbox!*/5;AJNU[biquwl_RB5$nU9$ hF0 wX7sQ1 ~]7R4sQ(mF#jD!fJ!sX2w^= {]F'~gM7 ~iW9(sZK5$ saQA3# }||}{}~ (3DT`s$@Khu/I_~9Tq"9_x5Rr+Di:Xw2No.Gn1[s,Ju"Mm Kg:_}7Vp#9Mgu/;IYeu~   " + * 6 3 < = ? C D E F G G E E C B ? = 5 5 + &   tdR?,mV?$xWC' zSE  qR? fO1aN+rX;#lR7iM7yeE0qV<"~eI,oR8~dK.mU=(r`R?3$ ytmccXYQPOIMGMGOKPRQXY`bgpp{|%6BQcp2C\t.Lb2Rg)K_*Jb5Nr"A[8Wx<Qx3Ko5Mj(<Sgy#4FRep $/>HXcrz '1>HU`mx #'"&#"!teVJ9+u_M2#}eK1s[7"nT3dJ( |[A!zeH/w`?+ lU4"bO-oW> pO:qWA(wcM;$sbP?2"wlfYWKF@812%) $)+4:EIS_cu|))fJ,rX>$jT7 sWD&t_E5~aR3& ufL<"hYF9#{vngc\YUQQJGKCFFEHJIORRW[^cllxy#.AP_x*>[n"=[u,Op2Rs9^y<]|;[y9[x:W|4Vr(Nd<Su/Pc #6N_w +=L]iz '-9=GLRZ^`ihqpuwzz~~~||vxqogg[[RJF86) teVF7$yjUG5 |fU?,}bP1ycB) pP1l@(sQ.uW,Z>w\9eH*kP8pZA-gT@*laI?,wnh[ZMJC<83.-%#"*&1/8>?IMU^eq|1BRg|7Mm2NlA[<[}0qgJ?%zdV<,viG=mR7wU=xY=$}^C)nP<uUG)s_E0~cP9% tbH8" kYA2 k[E6"{h_RF=/( #0=K[fx%6R^}1Bas 8Oj,H^}3Qj2Rl!:Yx 'Gf'Ba#B`.Mg %AWs2E\t0BUh| %3?JW_mtzxmg]WKE71# n\P7+s^C.|YG# tP5y]=bG# kM- pV5iL0lJ7{^F,bN2 m]C1 x^O>(xb[G=- $1?P\n+ASh~ 9Idx1Ebu ;Ql ,?ev)Je;Wx.Jm;Tu ;Wr/Kd5Ne~ %;Sh'COh{ &:CV`sy "(039>?ECJHKIKLJMFFD@><55,," {iWH2# t]D*oM3bH+u[<uT>eS3 w^G3mVB*hYB2 hVC0 vhTB/v`N<'o_M9*nbSE:)" !(5=HS^iv (2ETdx1D[o (>Wp3Oj"@]~4MpAZ{ ,Fe )@`u%EWs$?Pgz*;L^o "1<KXary!#10A?KLWWdainpsyu||~~|zyuoofdZYIK<6/! xhYG:$pYH4$m^B6pXD+pS> nO5pV6qY8"zRC jN7rYB(|gR@(}n\K;* uj[RC;/! yxutqnomkmkjpgpkrptwx~}'6AR_t} 7Ng|-Kf)Hc9Qr *De8Nq5Tm2Ig =Vq(E]w*@[r.L^{ 4F_u*=Raw !%4AHU\dmtz~}yol_YND;,"ocJ<#hM?mQ:%~gL8pWA#tZ@& lP7gL4}iL3nU=&lZ@,m^D7vdRB- vlVM:/xoaZKD9-( ,5FRcl.@Xh-C^s!>Qs&C]u6Ln,Ie )C`} @Tw*F`z3Ni6Pf )<Vf7BZh| #*4?EOXXednotuzx~||zx~vwrpmgc\\NRCA84)( ~tjaRM;5'vqZP@0!s]L9#z^O.}gK2yWB!|`E* nR7ydG/o[B-yiP>,qaN8'p]M:+ {l[T=5$ zqnb_VSMFB=;7230/,1+203688@@ILQ\_lp~ 2DTfx(DSo 7Ifz )?]q$CWt *@[p+H_|<Ut9Vq;WrAYy)Aa|#;Uq1E_p&5HXgy *'329;=>B?F?E@AC;B7;33-)$  rdVI9, {jSB)qY?% jN4nT6sS8qR5oR6eN/lN: t]D.z_M5! sbL6$ o\J5&wdYD7'~pk_\NOCA=852-,*)%+",'-,239=EFNU\emu +4KRht -AQfv/AYn &8Vj4Jg!@Zu"7Vt9Rq8Op4On*K`~+G\u)7Oeq0<JYcq} !(*11;:=DAKFNKONPORQPQOOMJIEF>B4;,.'  }rbTG3'{eP@)jV@({nN9!tUD"u\E)~cO1"aS4$ pZF0t_L4# eV<*}eSA+ydTE2%zua^MC=**  !%39FL[`q}"1@Rat*>Te{)BYp8Jh}5Lg!:Up&B]t (>Xp*BYl%=Ql~0?Vj~ /BSf{ &4ESep}  (5;HNW`hmzxpn`YNF70  {lTG. yeM:|jM: oZ>& wVC"iT6~aH/rW@ lP8pX=) eV6# u[L2 vbQA,xhaQK;7+$  %,18ADQTbepy )7DVcv.AWk6Me8Vl1Sj0Ff(B[}1Ph2Pf| 5M`w "3J\o -7KZkw*9ESakz  %'*-//3152410//+)%$ |sdXJ</ qgO>. hWB-{eT4"|eO4!x_H0lW<( nTA(t^G1q]J4 m^F8#xiUK5.wp`XM>:)& yyqolidh^`_Z][Z\]]`bdgmkut|}  )8CQ^iz 8BZl ;Pf~!4Pd$?Sl$?Xi #9Qh}-EXq 2H]t2H^q,?Rju &.CUcw *4EP[hr~ypg]RG=2(|ocPE2({fX@.rfI7!~dI6kK8{^F'lN2p^;& nW:"tYD,kXC1 {q\NC0$wwceTTFB;0.!!   *-6?HQ]cs| &=G[k} #5G`p$2P`}!6Ni}4Gcz2Lc6Ok7Oj,G^w #;Ui ';Qd|"8L`s (4HSep&%3.<:BCIHOMQSSSURTRNOJGG<@43,' zk`LE0$|iWB3 u^G4wbH2uUE$y`G-fL3gO8 xeH4|jQ=+vdQ@. yaX@9~qcTI70ura^NM=90*  %%25@ERYdmx%7DWfx(DRg~!-{dP;!nW@)}gL3dO2~iK3iL7v`H3eS>%iYD-xgVD6#lfYJD5-"  &06CIWcjx!&>J_l '6L_u "8Pf} !;Pi'CYt $;XnARv#8Ul7Ol(EXs 0HYk19S[o $6>JY`nz  $&.04;7C>DCEEECF?B<<760,'!udWH8)reJ;$ lU;$ nW6$zcA0dG-lQ5lQ:!z_I4mZB/u`J8"r`J;(tkVK8,|zhfWQIA90/ %  %*08+t\H2 rYG2 ~e[B7$kiTRC:3%# */;DPYco| ,9KYjz(=Qgz.<^j.EZv :Qm2Fcv 6Hau-?Vez$4EZhz#5FSgt%6@T^p{-1@GQZ`jtwvrg^UK?8*u`V<5waP:(lYC+vdL3 yfH4sXC#w\C(s_F,jS<$ p]F5 xdXA5!tfYPB:,#{vumphigcfbdbfdihkjtozz "'8?JZ_ty0AOdr 4B_n 4Nbz0G\q *8Wf*AWh+=Qhy #5N^y1EZo 2EXg +8FYfu '18BGSV_eloyx~||rqlcaZQJE89(( vlYQ>4& thVJ:(oaJ>&}jU?+jY?)tXB+u\D1kVD,unSG2!}p\S;6!vl\QC8* {vfdUQC?3-$ *,>DP^dw|4@Ret$4O]y 5M`y"7M^x !5Jat/FYo,?Rj}!;Mhv 2EZm(7JYj|!4<MXer{ !))53=>CFKKRNUTUYUZWTXVSPPIKEC?<550&& ypfVQ?4+fYJ3*yeP;&pWB(iV:! ~eM7mS>(~hR?(p[I2! ycS9,v^T9*|lYR84{nhaWRKD@76/,)#&# )"-,2:8AEKSZ`lr{ +:LYly +FRj{.FZo)@Pkz->Yf "8Rg ,?^o :Rl,D]r(CSo~ '0OStz$9BRdn &-3@AMM[Ydgmruz}ztxpphi__WSMGB93-# yo^ND.$q]J6" w^J0v^H.{\J/}fQ:&|fU9+t_K6$vcR>. reLB,wfVK7.}tgZPG;1) *0AEW^ot4>T`u)ETm-C^m5Jd~-H_{)>Zp0H[z"8M`x4DWfx&1EQ^l{"/2CETZclv{zqh^QK96%}h^J?, ugN@,ycT?.jXE.w]O7 u_H3}bP8" kW>,{dM;&p[I7$|n_NC4#{xrlge^`X[VZUXUXV[Z]_afjjtr})0=IU`ox ):J\m'>Rg}4Cau!4Sd1Idw !=Rm)=Um6F_t+>Tdz"4FVfy!2<KVem} !(/2:=>ICPJSSWWZZ[`\b]`^^Y[UTPLHG;>11+!yg]ME1) {nZM:)zfU@/cR;#xXJ-vbH2v^F1yeN:%{hQB&|lVG2$|s]Q@.&|rf_SLA=/-" $'38FIU_gr~.>L`m/AXk 6Qe| !FNY_io|}zwlh\UMC<3(" sg[RE9,$ {q`WB;' teTE4"xaQA,t`K8#naF7# kUF.~jXA0 ufQC/ ubUH7.}znh^XNJ@>41+"!  ""-.9;GHV\cqu )8HWit $.HTi}%Mfu()qdSC4$sfZL;4" vocYQH=6)' +5=MTbny *:L]n%Of|$9T_ !8Jdr5C]o'9O`v 5E[i ':IUkr#-8>LQ]elv|ypgcVRH:6(" }paSF5+ {n\N9+ j^E:$~qZH6#xiSC. xeU<3 {iYG5%ylYJ:(waXD5) tk^LC1*vnha[WONDE==571-1&/%+&(+&-+10648>=FIIOWWedmsy(->HTdm|!0CRcr)8Obu1@Zj.C\n ;Lfy0A^l2?[i /8Q_s.8JTbqy ',<:KMX^gkvzysfbWK@4) lbMC0r_M7't\K3% }iR='zhN@#|kR@+wcQ<*~gZD3# q]T<2sdUH:)# ~xkfYSHB93*% %+5=EPUciw -@O^u~&9Lax5I`u(?Sk 5Ley!5Ng| 9Mg|0C]o*ATgz .9P[l} )-@FW]nq ###'#*#(#% ! ~og[QC;*$ }qaTB9$ ufRF3 p]M7*|eU>*{dR<)u]M6% n^G5$ tdM>(p`MC,$~ndUL@4,  zupngj_cZ]XXUWSUTRWSXUYY]_acdkjtr|y  (6?MWer}'2HVey&=Lcq'8Nbv 1I_s ;Jbw #7Kbt);Say -@Ocr +5HPciz#-4@HKXYgets~}{roedWRMA?1.$whZT?9% |m_O>.raK=*t`O:)ziV?1 }o[E1 ueMC'ubQ?/ wmVP>,! {jdRL<5'|tqfd^XVOKGD?>8;3814/604558<:BBGIPRZ\eerq'.?HZbu (1HUfw*>Ner #1FYl 4Gao,CWk$9Oaz.BZj 1CYg*<LZkw-8CPWcovzsjbXMD9.$ xj^PC4'xiXH5%xdQ=*cX?-waK9% gY?.|eT@/tiSG4$~pdUG=,% }ukaYMJ;7*)  &-;>OUamw1;NZky 1ATfx7DYm|$;J`s 1JVr~(GMkt 2@Tdy#4CScs)6BPYet}&,18=BIJSRZ^]gckjkrrqtqurtqrnlkhdb]]SULID;:/-#  tk]WC=.!{n_NC0#o^N:- xjSC/ {iWE4"wbRE-' qcQE3&qcVF:(qdYI>2" |sh`VNE;5*#  &3({jQ?(ygQ;&o\H5 uhPE/khOF1$yl`NH0, ~vlaWND:3, (/1,#  '*58EFUZbnt~+:FTam%8FXjw/>Wa~1HYs,BVk #4IZq0BXc}#0?S^q} '6ANYeo} (+36;AFKMSWY\^cgjihmmlmlnljihff`a]XYSQNJCC:9/-'!vl_WI@/& zq]R>2xdTC+ qaL:&o^G5 wkN@&q\I4 w_P;.nePF2&uub]LI86$%~{z}x|zy||| +4=KPbhv )- tkPH/% s^P8+s]O7*p_K8)udQE3!naPC3!vk[RA8* smbcPOB>51(%  ('68FJX^hp $4?Q^k~)5JVkw$8GWj{(4JWk{(<K^k (=I_l#6CWdu !+<IXdt $29DNT_gozzvnibZULF:8)&vo^SE4* |o[J9%rYI4 k`H5$ tdN?({eYG8( yh[J9.{lbVE>,&{oj^ZMJ?84+#!  )*8=HP[fm{*8FVcu '>G]gx ,@N_s ,CJgm#3JXn"8E^i/7N]l*9IUfs&1=FR\doy% ))-.03374:88;7:86953320-*&'  qj[RD<+& thRH1&o[I7#ugM?+jYH2!nWK4'wiTG6%naPA3 zieLI6.  src`VQGF9<+1 '  %(-76BFMS[`ioy$18KMcfy29PVmu(7JWmx&=Gan'7L]q#5EXfx )7JTiq 58MSaku(-5=CIQV^ehss}yrjg]YNK=;-)sgXJ>0vkVK7' l[H8$vfUA3o\N:+zqZO:- zj`LA0#qjZPC6.! xpie]YSKK@@:51.))    %(*108=AHJTU`dksy#18HPch~ )/'rgUJ7, n`P>0}mWI1# vaO;(tfL>&|jTG/ zj[G5'}p_SB6)so`[OK?=//$  %,68FGVYelu,4HPap|%5GUiu$2HVi{ 1?Tex-BRhy -AOds !-@Ldl&2?NZis%49FMX]koy   |mm]YMF<0)wm^RB8$ rdPD/% vfSE/! qdNB- u_S=1q`OE0$rbWH<,"wtdZNC9."utgd[TSIA?64,)#  %%/25A@NPY`iqx-0IK`kx 1?M`j| );G[f{ *:K\i'7JZn} *:K\n'4GVcx-8IRek~ .4AGRZdltztkc]RNC<2,  ~{e_PD8(p`T?5 }n]K:+}iWG2%rbO?+ }kXJ5,rdSF6) vi_QF90xoi_XSGC:4.&" &.79CLR_ep|*8FUas|%=KZny2CVg|%7M\q+?Ucz-@Ndp)2JPio/6GQ`jv -*<?KPY_imw|{smb^RMD82' {j`QB7"|qZQ;1ykUF3#wgTD5!odOC2$}p_SF7+sg[LB5)rr][ID8/% xvomdc^YXTPNLGKBEDAG@ECDGIHNMSVX^_dijtt}  .5CNYdpz#.;LVht %;DWdx!:CXgx /@Tct1?Sbq!/BN\oy%7<PRekw !*,58=AFGPKXUZ]\e_kcjminolqmoolmlljihfdcb^YZTTNMIFB<:5/.%" ~smcZPH<4* reVL;2!rgUH7'xfWH4(vcWC4%xhZJ<1rgXM=2& ~ph]QK:7) }xvnoeea\\UUTOPNKMIJGIFMENJMPOUR[X`aemjuu$1L_i$2DWd}$6IZl}'<LYqy->J]hz/9JOejz$,39?IKUU_`ilptxz~{ywpnkfb]WUOHH=:4,(" {shaSM<:*" ~vjZR?8& tkXK@,#nbP>4wgVH8( scTF9& qbYI?/% }qg]UJ>8*& |vwoqjihdebc]_^\`\___d`ffilqsw{ $*6@IX_ou#2CNcj} *3 yiZM;1|nbRI72xn`WLA5+  |ykc]OL?90&! %.;@NU`ms.7ESbo{ ,6JTgs1=P]n~(7IWgx 4=S\n})7HRcm"59EQYfow&%.22<9CBGIMMRSRXWZ[Y`Z`\]^[\Z\V[VRTPPMMEE?>950)*  {vgcVLA5-ifPF1,udWE7(vmYN9.vaVC6& }y`YD<) ~veZL@0% }tj]VI@8-$ ~{w~z|{}}  .2?BPTbiv} &2@KZeu~/;KZi} /O\kz +7MQjr (.BN]mx (5DN[js #(6?HT[fmw~ # &%%-&0(.*.-),('(%"! {rkd[SJA=-) ztiXWB=-# ~scWL;."udTH6)raUA5"}l`OF2' qhWP<7$}tieWTH?<.+# "-2-!vcWC5$q^R=0paR@5!rgWI>."{peXM@7&$ ynk\YPGA53'"  #)2<@PTagv| $5@KYes~,7IPdn~ $<@Wap 7=Q]o}%3CQaqz,=GWfp 06FOZdqv "&+/46?<DCFHMLPNROVPWQRTNTNLOFLAD><:34+."#sndZPF?1,vo\SE7.zk\P>2#sbSF4( vnWR<5!ud]JB5)sm]WHA4*  yuke]TOFB94.&# '+19?CPQ_amvz  .9BO\etz &2AN^iy/FFINNQRVUZV]Y\Z`Z^Z]XZUYPWLQHLAD<;4--#$  ~vj`UG>0$ }gaKC1${jZJ;* wtVU;1yg]I?+#vg\LC3( wn^YH?4%{sicWQHB83+" #&25@EPTbdtu+1>KTcmw%2@QXow,;L\mz /9P[n/=N[px  );FTaq{ #(8@KS\iow   &$*,*0.13.60521321--,('%! zrjaWPE<1*}qeYMA5(pfVK:0yg\M<2 viWL<0"rg\KD3+|vjbTNB73% {|snic`YTQKJBC<;651-.(*&%%!" ""  "& $%'',*.31;6A>FHMRU[`cknvy  +3@IS^it~,6DQ]l{%.DLai0?I`ix%3BO^mv  *6ELYen} #'1:?LNX`flu{~usmb[ULG;8)) {neXPB;)%snYPA5' uhWL;0xh\N=2"}obUJ85uj`QJ<3& sog]WSFF=72,(   $*-97FDSS_bosz(2@ET`fzz,8DT]m{$0AN]mz+:G[fu,4HRep~#/;JVbrz  !08BJU]gqt        wzik^WOG>60"vn]UH:1uiUN>-ogOI2* zm[R@4%vm^QG91zlfXSE<3+ ssif]ZTMKE=<63/-'""    !"&+/39LT_lt04FP^jw'4FN^ly(<BVbo~!,;IUao|%2=ISaju $(3:@LKY\dkpw{~yslfaXRLC>2/% vk_WHB5+wj`OF6+qiVM;0 rdWJ:5xgZOA5*~ph[PG72#pqc_YSID?73,'#  "'*34>BGOT[bgqv%3:IPafs$*=IVas{-8GWaw| 0AK_i| *3ET\py #/=FV^ou &.6?IQX`imyz        ~vmgYVHB5,! njSN:3}paOA2"tdUE4'p`T@:$ uh[OB7(ync[MF72' ysifZWRIE?96.+&"  !'+16DW[nr+6CR]k|&/CL_j{"5@O_j{#4>Q[hw(1=LTblx %14@FKU[ckou|vqoacUTIC<1.! zre\PE<-%jcSF:-vf\FC,( {hdKI5,{ndUK>5& {ti_UHB8,#zzplfd^YWQNLKBD;@997423-4,--*,-*/,/0/2257:;>AECOJVT[^ajjrvz!,6=IS\epy  ,6-' piWR?:'tdWL:/ xj\N@2"~mcQH4,kjTM=5&yodYRE<5'  ~sqie]ZVSMFG>@98422,/'('#&!#"# !&!('*,1067;>EELPR[Yednru"04FGX`kt #1:HRak|*6FScm} &-@M\ix+:HTcq} !+9DQZhq~$+2@?LPZ`flsw~xtli_^QNE?81&!umbXND:/'wh^RD;-" tj_RD:+ }obWK=2%tj^TF?/)xrfdTPI>91$& }~xxstqopjpkjmhnfohoknpntqzt|{  +59HMW]jq{  -:BP[gq}*7DP]ku '4BK]ew "1<HSaly%-=BQXapr%.19@EJQU[bbiooyu}z~ruklb`ZTQJD@84+'}ri^TL=7* ~se[L@4' sdYIA0& slYPA9)  xs`[LC8,! ypf]VK?7-$ |ysohdaZXTPNEJ?D:=96706-4+2./0125876@9DAIGNPWX]bglts!/6AJY]kq}'1;GRaiz)4CN`fz (5CQ_m}$1?NYit*5BLWen}  !*2:ALM\\hkrx}{xmo_aSQH?;0) rh]RE<-# ~seXL;1"rfXJ>.$ {kaSG;1ri\SE>0% wuecURH=8,( ~xtqpjjeba\]XVXQVRROPQOQNVOYRXW\^]fbijorvz} #.6>HQXeju*6=KTej3:MVes} !8;RYlv%0>GX`py "06DMV_jo~'.06>AJLRW[bdjkssx|~zvumodc[YRKH=<4)+ }qe_NI84! smZUB9+ogVL>4$ }qfXP@7+ogZQF=.% zjhYUHB8/& ~{vtqkmefb_`Z\ZWWUUVVTWVXU]X`[`bcjhnosvz| %,4>GLZ]ity "69LQdkz$1@MXit+:FVct~ '1@N[gv $':@NXaov $)47DEOT]bfltu{zpqcdZSNF?80(  ~sh^TG>1'ofUN85peUJ8-|l_TC8*vo_WFA.*|qifRRB>2.# ~|wxrpojkegab_^][^X^W\Y[Z\[^^]d_hcofqnxsx )49CKU_hrx,1CIWdo| $0DIPRZ\afhoquu|z~x{ursgl_b[UPMF@<6/- # }~hmZUL@9/# }sk[RE:/$rkYQC9+! niXPC:,# ~sf_OK=8'&zokb[QKA:4('  $&26@FOW\hmt%,6AJS`gt}%3>JWapz &5@L[gt $-=FTajw  %68JM[amu~ #(,45<A@KHORUX[^^edgkfnnlrnsqrqsqrpqmqimiggae]`WYSROKGF?>941,(# tse`UMC82%uqaVL=4$ uqZTE7/~uf]NB:(" oh]OJ84&vri^ZJK;4/"!||xwsuqqponomolqoptoxtz{}(/:?MS\dkw~ %/:FP^gr !(7CQ[jt )3AOZeu.4CMZdrz )4=GQZemu  (,15==GINQWY^bbiimmsqvtu{u~w|}z|x~v~t{ttssnojhgaaY[QVIKBF5=,0%!|pgaSP@;-&|nbZIC4+ ~ofXNB6-yicSM<6%! {tj[UI=8'% wrh`WQHB84(%  (*59AJMZ[iju} '3:GQXik(3;ORcpx-0EJ^bv~$98LRaiw ,/;CLR]djvw  !!)).1095;<?ACDCIFILGPGOJNLJLMFLFGGBD@@=:;37-/+%'! wtjb[QJ>7,$|xfbOJ:2%~qfVQ=6&sh_PF:.# xmaXN@:)'|skb[QK@:4($ |y}wzvytytwwvxxzy{ !-.@ANS_foz $,9DN\ft}+3FN\kt "':EPag}~ !4;HV_mx&,<?QSbhr|  %%00;:EELQXV]_eenlqqww{z}|yywtrqkkgc_\WVNNDD>75/'#  qi`TMC50! xqbVK;5$ vl^RE6-|pcWJ<4$ {we]PF>.'}ume[WLC?2/) "'35?ENR^cjsy$-9BNXcn{+5BL[er $1=KWcp):<SUfm|  )2<BNR^gjyz "').0379;@=DCEJEKJKKMLKOINKJKIHEJ@G??>:9640-,%& ~rja[QI?9+*ztd_LJ71#|keVKB2+rhZSD;0$ to`YJG8/(soh]\OLB<60'#  *-5=@HRU`hlt}%09ELZ`nw+1DF\`o|.7EM^ht'2=KUajy#,7?KR^foz  )*14::EAILORSXW_[aabedejendogmflekdhcc`_][XUQSGLBB=:61*)"  {sjcUOD<1(}vh]RH:/#zmbTJ<1& xp_WI=1&pjZSG=4(! }unf_YQLB>9.*#  "$+36@GLT\biqw )1>DSXeqx "-:DQ[gt~,/EH[bs{ #-9CPWgn} $+5=FPX^gou  &#,+//4398=9>;@=A;C:A<<=:995841/.*+"&  zwmg]YOC?4)&|tj]VG@2+ztf\SG<0' ~xmaYNB<.( }pj^YLE@1/  tsig]\RQFD>930*'"  "#*32:=CHQP^]glp|{ #(5=DOUciu} *3=KS_kt(2?HW^mx (4@HU^ju|!&16BETSbeot "%"&'&)*(,)+,*,',%*$) '# |qp`_QKD91)"wkcTQ;;%#sl^SJ94%xycbPJ:4% vkdWNG:6'"~|pke]VQHE>53)'  #%/17?DLSX_gkx{ #39DNXdmz'4=OTfo| +:ET]lx !+5BJWbnx '38DHUWdiqy "&'++01284<8@;B9D<CA?C=A?==<;9:3611-,$( {uhbZNM;8-# }mfWQB:.  {sf[QC8/"{xhaRL@5,!qk`WMF96%%}}opdbZURHD=931)%!  $(,338+! uo_\LF<3(  |}nme_ZPLD?:5.(( $(.39?EIQW^eitu#/5AJQ^erz%,:DM\bsv $+<AQ\ery*2=HQ]hm ,);9IIW[cjox||unjf\XPJC<5-&xwdaULC7/"wjcWLE62#zug`TLA9.% sr``RKD:6($y|kpacZVSKHC>:7/1(&$  ")*-35<@EKMVUc`njxy (/9BJT\eq| #.8CMYbnw"9:JS\kt(-:DKWbfxz%+89BINW]dirv|   zxliaYTJF:5+# zmd[NF:2&ulbVMC50 ~qh]SIB/.~yhhWSG@7.# xslh_^TRIG@=62-)#!  $$+.55>>HJOVWcbkqu} #+4BDSXdnt(/5,#wwmhh\\UOLGB>952-*#&   "*).35<>HGOUW`diptx $+;;MP^crw(4>KTajv )3@JT`mv !2:DPYcow  ".5;FIVZbgru               ~zom`^VLF<6,& vobZNF:/(~pgZSD;1%tk_WKD60"|tjcZPJB:1)! vzloeb^WUOJGA@<56//*&$"    "$*&1,76=@BKIVQ^Zheppx~ +.9@GQZajr~  *7=IUWml()@>TUdpw '3=FTUgiz}#/0;>INU[`hlsy{}wrndfXZLPA@61*"|vnfYUED21"wpb^MH<3(  vmcZOI83&  }ymf^ROA@2.! z{qpjf`^ZUQNJGD>>:652.1(-'&%"%#!!$%"!"$$'')),.1246;=>FCKMMWT`]fgnnyw$-3>FKX]hqx %2;EOXenv02@LTajv$,7BFZZjn{ $(45AELUXcfor|~~|tofaWTIB<2-! }}ikVUG=3*! }mh[RG=2*{vfbSL>;*( ~wkf\QNC<6(( {vtknbe]ZVSQJKDCA=::5612/.,+,',&))&-&.(.+2+6-7397=IV^gt| $+6AGTXfkv~#+07<CILVVc`kkvt}|tuhm^bSWJJC:90)& xtga[OH>7,'vlbZPF?3,  {uifWQC@2/  }yjj][OLA=6-* }zvwlrikiae__\^XXWUUTQSQRPRNUMVPTSVUVYZ[^]bdejimots{z$*0;?HNW^hou  '0:CNWajs#.6BHW^gsy #.3DGSXdht{ "#,0:;GEQTZbbmjys}~~utlgb^TTGI<:1*%xrf`WLC<.+ zrj]UL?8,!wudaPM<8+$qoc]SID93, w}lpgh``XYQQNJFEB@>=9:3:1704214/4.602345578<:@?BDGILNPUWY`_hfnovv~*+6>FLU]gnx|  &4=EUZio #3<ETZip{  '76LKXchv|#+.7<BJJXW`chkut}}zyrphf^[WOJD?83,'  yuidWSE>9+({wdcTNB9/& {sfcQN@:0% ~sob^XLF@61*}vwppikeeb]_Y[TWQSORKQKLLLLKLJMMJPKPPPTUVVZ\]baeijnows|  &/7-*! z}oqjhd_]XTSKMEFD??<;8764512/1/0./.-2-6.444899=<@ECHJQPUW]^fcnntx{ !'06@GQUaiq|$*8;POdfu+,=CPYepx&-;>MT\goy (,49ACNNX[`hirr||{xsnje_[TQIE>72*) tmfYUGA5/# {oh[SHA5,!voeXTG>6)%|zkkZ\JL<:2'% }}vuonggd`^[WUTQNLKKHGGDFCEDCECEFCIDKFMHQJUPWVY\_cehkrnxy#+2;@IOZ_km}  +4=GN\_os"-6CIR^fo|~ $/9=KNYcfpy} *'32=:GCPOTXZaahhlprwty|yysroijdb\\TTLJHA<85/*#!  |tocaSQD>6/# rmd[QK>9/$  xne\SLC74%#|rk`^RME?72'& |zwtrqnlmglfjbgdce`caabacdbdfdifijkkontrwyz %,3;@IOX`gnv &-8AKT^gsy"&7:JL]_pt )09AHTWbhoz} %(22;=BILQUW^`fikptv|}z}swlmhca[YSOFF>87++# vugbVQE?7-$ vr``OI>6*$}mh^SIC61$ }wli^XNIB;3/#$ |zwtrpqjnijjdibh`g`f_f`g_gcfhdkfnjnoovty|{ "*54DBSQaapq ,/B/-$ {tmg^XQMF@:4.%$  $)23A>MMX]fkr{ %'6;CQScftz #+5>EQXcms $+7<FLWYhhuz &(/29;BCHONYV_^dghmoruw{}||x{pulngf_^YWQOJEB=84.(%  zvkfZSM@>2+wld\PH@2/ }thaTOC<1+ uwffZSMF@64('}{wutppllilfiedfdcbbd`bcbdcegfihjlmnqut{w~ )/4?BLQXbhqz} )49FOXcfw{ "&6<ESXdmy$*3<DQScdsu %%129>DIOSU`]hgoovu~|zzrsjmf``VVPII=?24)& wph^ZOG?5/# }{jhZVIB8.( rmcZTGD73%# {tme^XPNB@71,#! |||{}}y~((18:GGQY[iivz#'39DMV^ipz!$48DLT_fpz %)5:CIRXcers %%,158@<KDQKWR][acdjhqkupxtzx}z~}{yzyswoqmihf`bZXWQNLDC>:90/'%~vni^ZOKA<0,!vpcaQOB;0+# }wmd[SJC74&$xwkg^YQKF<82*& }|zy{y{xzv{wzzx|y|{} !)-7HOX`ipx  #.-7:=GDQJXU]_aeiknqtwy}}{zvsrojig_][TTMLFB>930'&  ~xtdeXRIC72( po\\NE>3,"oo_[RGC63'  }qoebXTLG@<5-+#  !$,27@CJPY^hjv~ !*3?;753.,%'  zslg_YTIG=7/) }tmb^TKE;7+% }rob^SMF=6-'}urid]YUKJ?@64+*!   "(/2:=FIRU]dhqw} "03?DOV`fsv,-=@MS\gnx &-7=COP_^lnw}  #()033;==GALJLRPVW[[^^c`fffghhjmgljimhmglfjfgfdaa_^[ZUWRQMLHED>=;35-.%$}tpgaYNKB94'% umd\THB71'{ujdYSJB83'# }vnfdXUMGD;6/*"',0:=ELN\Zhmuz (09BITZiky#,4=HPWehu} #00A?OO^[oj{y#'(3,97>=EAKJMQQSXU\W_\]b\f]fafcddfbgbcc_`_]\ZXWTRQNLHFAB<<640-*$!  }zomd]XNKA<5,&yqg_YOGA72) }vne^TOC?21"#{{pmd^ZQMHA>60.&"   %..::EFRN]]hns| %-5=ELX^gpw"-2@CNX\oj~ !+08@EQS]clo}y !!%+*246<<@BFELJONRVSXWYZY_Y`]]`]a]a[`[^]\W\TXQRPOKKGGAA<<744-,'# ~xoheZTPCC62,"  woj]\KI=7/$  zmh]VPCA21$ vqka`TQIE>91,$!  !%*18>EIRV_eksz~ $+4>DRTdevx#.4AIP]`pt #/3<FJW[ciry   #'+.36:=ADFKIQRTWW[[]`^eaeiegihhkfkhiifidhbe`_]\ZXTTOQIJCF=?873--(## }ynja\TNJ=:.+ }ukg\TLD:4*#wscaWOJ>;.-  vrlcaYTOIE>=15)*#  !"*.0:;BIIUUc`not(,5840** " #"/*56;AFJPR[]ciosy"*19AHPV`dst !+/==LO\^koz (,48CDPR[_hitw~   !$!%&%(()*,)-++,++*++'*&''"$#  ~urjg]ZQMF?83*&|wme_TQE@51$$zumc`TPGA85)%x|ppidbYYORGI@?934*0'$!  & +).35;?@IGQRY]afkpxy $+37BENT\blnx  (-7<FKUYckqw !+,8<@HJTW_ajjvv~      vxlkg^^RRIG;>/1$$  yskd^WNK@;5)( ~zqle_VRHE=61($ ~{uppeg`]YUPNIK?D:<753/-+)%& #!        #%%*)./275==;7:3613.0,.)-&,&('%(&(#*!)$('(&+&-,-.2/44598;?=DBIIKKQSUX[]cajknvr{"%-38@CNOY^fksz~ &,38@ELTZbenty !&*03:<DDMNVW`]ifpowv~|~wtqil_cXXRMHE>;42*)!|uqic]WPIC?43&' }wrjd_YPODB95.*#wyqrjkebb[\VUPPKKGECA@=>::6926022./-.,-+-+-+-+/,0-1/2246696@7AFJVVbenq|~  $&,24<?CHMRWY`bhmmwr~~zwrokgc_\VTNKCD:83+,!! ywqie^YQLE@65))}vrjf^ZUOJC@66,*" yztvnomihgbf\c[^YYXUUUQTPQOONNMNLOLOLNOOPOSPRTQYTZX]\__cdfijmnrswx|| !)-19@BKLWYbemqy} %(36=BIOT\bfmsx}  "&)-24;;?DEKKQTVY\abefjlmtpytz}||{wxqtmogicd]^WYRQMIGB?;:42,*$#  |xrmfeZYQLHA<72,(  }xqofd]ZQOHD=94/,% ~zv|tvrqrjpilhkdgcfbdbab``aaa`abbcdceeggiilkmnqrrvxx}x~ #&-27<831,)##}zqpeeX[ONFA=32(& xunkd_ZTPHF<<51+'  yu{twtrqqoplolllhljimgkijliljnlmpnqqqvrzu{{{~ &)/49>CJOTZ_eiqs|"%-26?AINTX`ckkxv   '(,137:=BDGKMOTTYY_aaefijmnqrqytyy|{}~~~|~y{wyuurrooijged__[[UUPNLGGB><961.+(#! zupkg`^WSNHD>:40*%  xvokf`]XROJEA>67,-&#   ()13:;EDMOVXabioqy{#(,46?@ILRW\ahkqvz "%),1079<?AEFKLNTQYV\\`acgfiimmoppurwtwwwyzzz{z||{|z|{{|x{yxwytxrvqronojmfgeb`aZ[WSVLPIIFB?=874/-*$&  xwllcaYUQIH>;51,$" {vrlfd\[SRIHA=840*(" ! (*02:=BGKRS]]ggoq}z "#-/6:@FJPTY`cilsw}  "#'*,.52;:=ABEHJMNQPVTYZZ^^`abechfhijjlkknknnlpnmplomlniliihhefcac]aY\WYRVNPKKFFAB;<736,.() !  |ysmjc`ZVQMGB>76.,%! ~|ssljc_]WUNLFC?:911+($"  $'+.35;>DELNSW[`dhmpvy~ "'-/89ABILTT[`bkjus}z  $$&*'/-123669:;<>?AACEDFGEJFJHJJKKJKKKJMHLKHKHHIEHFDDCBB??>;<887231-.*&(""   {xrpjga^WWNKGB>:34)+! ~yvoogg__XVSMJFC@9922+*'#   "%(,037<=EEMMTU[]eflotx~ %(/16=?FIMRXYcckjtt{~  #")&+,,1/35589;;>=@@BAEBFCGDGFHGGHFGGGGGEGDECF@E>B>?<=9;68422.-**&&#!  |yupkhc_\USMKDA=57--&" zytomgea]ZUQNKFD?<:620-(( !  !!&(-/33:9@BFHMNUVZ^adjlrsw}%'-069=CEMMVU\_cijqtw|~   "#"'$(&)())**+++,+++-)+*)+'*((&(%&#$!#     ~{vsqikba]XURNLDD=;820+'% {wuonlcf\_VXPRJJFB@:<530-*+"%  $$(*.0377>=DDILNSVX]_bhhppux{ #'+148<ACIJQSW]]eekppyw    #%"$&#(&)&(()()())()))(')%)#&##$ "   }ywqokee]]VWMNGDA;85/-($  ~yusolfe^`WZRQMJHCA>:8521*+%% !  "!&'+-1477=>CFHLPRWX\`eglmru{| "(+219:@CHIOSV[^afimquw|        ~{vvoohhc_]WWORHHC?=852/*("" ~xxsppiiec_]YWUROMIIECA=;96521--)(&#"   !$&(+,00468<=ABFGKLQQWW\^bdfklqswy~ $&).067;@CFINPVW[^cfhmots{{zwtqnkge`^ZVUONHFC><831.*'#  }xvsqlkgdc^_XZRTONKGGBB>=8:450/.*+&("%    !$%%)),/0347:;??DDIJNORUXY``dfhmmtr{y "&(-029:?CDKKSRXZ^`ffmmqvw||{wtrnkidb`[YWRQKJFC@=9720,*%# {zuuppmjhfca^]XYSUPPKMHIED@@=>9;7643300,.++)(&($'"%!"  !!"!"$"&%&'(**+,..0216488:<=@@DCHGLKOSQWVY\\acdgiloptuy{} #$*+0258<<CCHJMQSWX]^bdhjlqpxu||}{ywtqomihec`\[WVQQLKGDC>=9831-*)$" ~}xxrtnnjigeca^\[XVURRNOJKGIDDD?B=><;:895644321/0./---*-),))*(*()(+)*))*)++*-*-,.-0.10133638699<;>?@DBEGGJJNMRQUWW[]]badggllroutzz~ !#'*,0278<=BDGJMPSTY[^bbfjkoqsvy{~~|wxrrnmhicc^^YXTQOKIFCA?:953/.()"# ~zywuspnljhffaa^]ZZVWRSQNOKLHIFGDCBB??><=;;9:8876664444332413132232435253657679799;;>=>?@BBDDFHHKLKPNSSUXW[\^a`fdhjjontrwxz}~ ##(*,0156;=?BCGILORRYV^\acehkkoptuyy}~}|ywuuopjkied`_[ZVVQRLLGGCA>;;561/,)'$# }|zwvuqrmnkkficdba_^\[YYVWURVOSPNNMKMJIKEJEHEFDEDDDCBCAD@CABCACACCBDCDFDFEFGHGKHLJMMNPOQRSUUWYY\\^_abefhilkopqtuwy{} !#'(,-12589=@?EEIKMPSTWY[^`beghlkrouuwz{}}{ywurpokjiec`_[ZWURPNJIED@><9833..()## |yzvvssoollkgidecab^_]\[ZXXVVUTSRQROPOOOMLMKLKKJLJKIKJJJKJLKJMKLMMMNOOOPPQRQUTUWUYYZ[]]_`bbdffhjkmnpssuvyy}| "%'(--2267:>=BCFHKKPPTUYY]]abdeiimmpqsuwx{{||yxuuqqnlkhfdca]^XZUTRONJJGDB@>:;5610.+)'$"  ~||zzwxuutsqqpnomllljjhihggffdecfbcccbcacbabac`cacbbcbdcddedfffhfigkilkmmnppqrstuvvzx|{~}  !$&()--11567;;@?BDFHJLNORSWVY[\^_acefhjkmoprsuvxyz|}~~~|{zxvvtsqpnmkjhgedb`^^ZZXVURRNNJJGFDAA=<:77421--*(&$" ~}~{{yyxyuwtttsrrpqppoonmnknjmllkkkkkkkjljmkllllmnmnmpmqorqrssutvvwxyz{{~} ""%'(+,/03477;;?@BFCIHKMOQSTUXX\[__aceeiglknmqossuwvzy{{}~~~}|zzwxvutspqmnljjfhcda`_\]YZUVSRPOLLHHEEBA>=<:76421.-))'%#! ~}|~{}|{{z{yzyyyyyxyxyxxyyxyxzyz{z{{||{~}~  "#&')++/.225599;>=AADDGHIJLNPPRSUUXYZ\\_^aabedfghhjklmnoppqsrtsuuwvxwzyzz{{||}|}~}~}~~~~~}~~~}~}}|}||z{zzyyxxvvuvstrrrpponnlljiifgdeccb__]]Z[XYVTTRQPNMLJHHFDDAA?><;9865320/-+*('$%!!  !"%$()*-./125588;;=??CBEFHHKKNMPPRTTVVXYZ[]]`_badceeghhjjllmnnoorprsrtstutvvvwwwxwyyyyyyzyyyyyzxyyyxywxwwwuwuvtutsrrqqpoonmlljjiggfeddbb`_^]\[YYWVTTRQPNNLKIHGECCA?><<:8663300--*)'&$# !   !#$&')*,-.0135578:;<>>B@DCFFGHIKKMMOPRQSTUWVXYYZ\[]]^_`_aabbdcecfegfgghghhhjijijjjjjjkjkjjjjjjjiiiihigigggfgefdecdbbaa`__^^]\[[YZWXVVUSSQQPONMLKJHHGFECCA@?=<<:97754301.--**)&&$#"   !##&%((*+,..003345779:;<=>?A@BCDEEFGHIJJLKNMOOPQQSRTTTVUWVWXXYXZY[[[[[\\]\]\]]^]^]_]^^^^^^^^^]^]^\]]\\[[[[ZZZYYXWWVWUUSTSRSPQOONNLLKIJHHGEEDBC@A?>><<:9976543210/--**)(&%$#!    !"#%%'')),+..001234567899;<<>=?@@ABBDDEEGFHHIIJJKKLLMMNONOOPPPQQRQRRRSRSRTRSSSSSSSSSSSSSSRSRRRRRQQQPPPOONNMNMLLKKJIIIHGGFEECDBBAA@?>==<;;99876544221/0.-,+*)(''%%##"    !!#"%$&&'()*++,-..//112233546678899::;<<=<>>>?>@?A@AABBBBBCCCDCCDDDDEDEDEDEDEDEDEDDDDDDDCDCCCBBBBAAA@@????>>===;<:;:99878765544322100//-.,,**)((''%%$#""!   !!"##$%&&''()**++,,--.//001123344545566677879899:9::;:;;;;;<<<<<<<<<<<<<<<<<<<<<;<;<;;:::::99898877766555443332201/0/..--,,**))(('&&$%##""!    !!""##$$$%%&&''(')()))**+*,+,,,---....././////00/00000000000100001000000/0/////....----,-,,++++***))(((''&&&%%$$##"""!!    !!"!"""####$$$$$%%%%%%&%&&&&&'&'&'''''''''''''''''&'&&&&&&&%%%%%$$$$$#$##""""!!!!       hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/Tom2-Softest.wav000066400000000000000000005365621366722712400233770ustar00rootroot00000000000000RIFFjWAVEfmt DXPAD datar *VH8  {GBh2m2= Snx=E 4 } o F k v  2  w H ~ 9rD%Mn 7i Hf8"f1mܭ0-5ƣõ&]|ͳxC9ҕU.5Ŝ¶ڿݿ`+³à÷3ƻB-aѠט`ۺܘiݰRjjJh3k7u&uvo?Y V*Q(}|dN jo@w!7w3-cKeOU~~L*# \ e  5 U o q = m p F 6 O = p `)w:,^|2k ^V!:rl`o(rr5}& Xg7 SYr s!""X##8$R$$i$h$$$3%S%u%%T&&;'r'l'`'&'8'>'T'=''&v&K&b&&&4'l''''''m&%%$#" #AT<!w \ \  j|upFnxHfa[DB3w@6cۗ۲۝[ڗ`[ٮءzכ ؅;oHٴ=׎?֏}՟{ SѦЧ{ϟAЫњI ӰԀV?[~ٍp ܂ {ީ޾ޭ޾+\ߍ߫'^F"%)uH+_l~RJQ,M= .{ GojOX} HFd M bK  Z9Ta4*~`=$lPB q  @GI^ma/U$SNM%o)1|G  9 _ (  " K N [ S . n2 #OiiW[C3;?6& 'N>|w`fj_s!G{&EwE T :Gh~ /L{3 @>KKVTW~dX{ \ $gV0 aL'SY$}d*6&ݥcFpٚ=pן'ؘ'٦ًVmm9 U,ب`&֡րr\AՑ`KՈgִq ؊ڳVۢW;ޅM3&AN5U+k`:- B427;db> !!"A"n"u"""S#$$%&&Z''S((W))*`***+S+++T,k,H,K,,++ +**)?)()(!('['&&\&:&J&&%a%$#"*"! (]:EhIj.ICR )_]CfTf<,DR<  ]n(e|e'l)X-{?Nqzm&6}Nvo,chkX!{/TkL@RD6\XAgv NHX86BLG0AJYP}}zL63!"Ng:a^@ %E+%jeymXRPz`vc X0&f7DIJKpkwrK^  M  v *s}#o^Lc~<w]n,X !e!!j""\###/$_$$$%[%%%[%-%$$$$$$$_$$##H#""I"!!L! + egx Kmo'w} C*ihGqJV0 ^ = ^   H @ fGJYx0:;e0t2^/ljT;c h(R`pWOi|G&z5_  :S|#CZD8>@[X'nY,5N #,Wuqq2wFS* b uc,&Yz9c#PD "!9;U7@ECQk-l'PN1%Z_T?JFvhI0"N<d Y T[  f  R s @ w  C HB$R}DQ 3"P@4]8`{ozX!R >D{ U_|JixSdX`[fB{v?* 8r;mGY  k  O ,_ Z1?[X~/M/)$i6aAk#N9syQ0 vO(JE o$x$kV hDwa"fS B=[2AJ . n V  M  l JT<i+Tk*ItqeTK[wq`F=H[ZF1)'77@FiwkXFLFHA@KXiqbC. kP ~M&sL[? d 5  q S  Y  N d  0|HR oCg9{MYg^'J={<=Y>}PDe?@W8v/Rxm^C0z,|R|jj_VM[\e\ge{ &Is"Aa?|W5y2mOX)(&tG"\uqO3v{*[!f{B N  M z , B { :  jbVIkxy%s ^/~6O$mRZ?DXfyB=+,c!>5W%[-N#pNd@ ycF1+/&ItI0jIOQUQ,y9?h!aHCsAx _7wR B$r4h8%:&{!d a8us5(t>P 2  S : , o 9vFs!VPt;z%Uu)`;^Bds/@Xv|v_Q8gH$ X,Kb9f2Vw-km%  k 0 j  h  4 0kBF+;L5t I$JuM pP/ {jU9$ |`KA,kWd\?%S3';2!HyE%I w7[l5TF HyG%xhL, )Ch5aT*c?u1ymqa"v/ME>m@ l7_R5O?z*RSRJ B  g F F } _FvM{d*^%Mm%Twy}kZC.ybB%lf;b<uZ'kN N o @  y ) { B 7 X  x&EBt.j&l$fhqc5~Ih.My\)sMj,f1~EwlATd;h/a(a<V"XyJ{I z:^. qL!V1 tO@0-'  !2Mp@dH"g2Prz,lwTrW6a>\.MW f"t!w^<x%<4;|iH2u B  , c  ; s  = ` |  7 [ u !ARr7i0[6v Fn %Hf %Yj}*'-2#!'3A>2*&}\E{R5WC&b1t,c"K Z  U  k  ^  u#jY|#d7M|)S 2F\X>u*M<Y%WZ0zX!V+S^C!P%fA$nU2~gnVD0 }}]Z>C;32 $)8JU^ow(DXgs .=_q'B` :w2r-v&$o7s Z m`F"gz6MO^U7@:Z[@D+ e ) r ' > m , H t ! 5 N [ { 3Ed@e3Cg{73JZy2IXn  qT=vG.Jq2y6 r ! e  D Z u " u-ql` q >q+oH!qGkU&s@u6v=x;A6.uhN5sK(oM6wI"g9 u X D  _  v L  F   6 cBDt:y78w:u3f5q>s6BzUQa)EYb.\(i>L~S+l8VlR6}U4x^[A-rX& ]Hx^[JB0(8-;.06>HDEH^ve*f  K g .  W)BMR*g1UOs>Z};v1S:TiNiZj*`?oB ]>pC m< rLsQ% tngXI;-3$#/=PZ^iu1Vr:_}?Q>{PC0XH#FtGQ:z$ r  W  j 6  A (hC@w(bU*Gs#I|$:>Ud{jT*}Y6 DZ/t4wCy)< ; ? V _ P  `Ya5Bd=r.t'F?f$}2[Gj)?^&b9wgS6!iF+{eM+hZC5yK9xP8nI+{yjdaSVNKB<3<:?JKX_gn|~ #BRz-Sp0Z4f"_#qV4XH7*w\ o\ VO o6@q<r<e&Rz 3f)c3T$ Y  7 n  L {  H z 7 U $Ej"=`i<g7\x'COiwn[O'hM(~OCp9 X $ g = \ ' o @  m T " oCH,yJQe3t/k2NO{8H OF j+o6wLHLa-x8t0*($(-0-97EDKSbe~ (/KUl2Vs&Ms=qR5q5tM f5sb0zJX S7tZW*_TG{M IM.]@j 1 a  ; h   0 S u  1 Y   Q z -b+Ny-[~&@av*Dbn%*<<E>?>??20 wiI2 ^BzCyQu> u 4 P  ^  8 E `hf[ W ^TVh-m&\"h.|>`-vV5"p@T'l`$^0uQ0jT/f,d.u:|JNU R Fw0g J $ _  B o  < h / Z w !>Ul/LWhy"@[x %7:JJV\bnpxnnegaYTE?(" }mU;* qV:\; d > q @  p B  Q  X  J}Cu2Xb"m2t4> Z&L_)r5U k-Dq@d.Ug.JkEN-kD$`H XInZF7(xmpmppmnx~+EZt(RiFm)TJsIwMt1Z!O!g PLS=GPa/}Ee6z0q2b J2p 8o 4 _ & _  6 X  = d  8 U o Ba5Clz,8COgo}~mxltmlU]F<,tZC|A% r J  T ( O f . s . `bXHV^&e/v;Qa j?P _!u?g2_%~Rk=Z*~X,vW:\9 tG)vK l5|L.j7 ~jaOF;*)#-'AF`l}*Pk;_-X_,hN+bX\ L<~6,aQZ$dQX8lHs(h I{1_ =wL CW 3 h  C w  M " ] 0 [ 3e)Ii 2Gl1Jj|&,:KNUUTNKCNCH>42!#qdB3I-pBa( T  t 9 P  ] & a  c&c"VR$_(m"Y>o!Gq+`Ne$w3Q L"qN)nM4ucP9"iVB)ybB1iZ@; tykbdZb_\d\`ZYQVV`gmkmjvy-CJfn +Bd@Z']z@s@bWJ SCt%P0b@tO(X7q$U@y'f$u&k D}' h  N z  A p 1 e ! L r <d#Iv&<[0Mdp|g^G1z^,}R)^( [ & H  d ( e . | N i;Y"|Le1{:[wE_-Io0_+X!}K Y oLnB%X; k:a7a9V2 R6 tN8yYH&xr`O>3- "*>OXdz%7Vy>c$UQ&VE=u8o#bR S.kREw#XG{4o.k"aY@q$U+N'X < _ & T z - R 3 S * ^ ?aFvG`+Jy .Ff-5<ABJPOLA8(fC|T#f)ES f $ j 0 p * i # a  X Nv8]6X :_"J:m=x6RmAqD }W"y[*kL pQ-oU5_Q1rdP>+zl[RGF;20'~tsdg\ZQVMSPQQQW\dhkz>Fn{$Be~+_DmHkLz;jLs>d>x!_RFTOV#c2o?y,kR+c#Az' J x  H n  8 j % T v  G f (Mb)8LZkyvhYH=eXA- ^ R , ! m E 0  u M 3   T 4  e 3  T'p:m< ^8 b-~L!n:KOO vMv3 X&Bq:e,u;o;T%pMlH"j;~Z2 sT( zf?$k\>;#/@Rk}8Lr<]!JrDp@y-cWKP,nCu6m)e%\_ZXBlN,pE/[0a(cJq- S  1 \  8 X 6 e  4 ^ 9R{1Os8AUitzmXC-sV:~^9 l >  h , l 3 c ) ~ D c&s<|ELTa)z8Nd&~A ]&V*zLvAO&s@uM%[8d@uZ;Z<hG(uN'SCuR<%zk]QE>41..).$54EIWfn}/>iv"Mk#@o9e7] Dj0e5iH/c!d"d$k0? IT[ @$iD#R'Y%Y*W M F l  < `  = e  5 O t +EJbb~~uj[PB6% u W G *  k K :   d I %  T 2 v N -  nC$bH#|[6nH&mH%d,tNU'W'RM\(lBS%}@$m@d2 W&pE P)s=Y"zZ) gJ0p`L>,!!,AG[lz%HZy 0Rt.Uy#R| 8m+_,^2pHz'T6pT/l:n@W(d EvS6eCP)Y&X G y $ I w  ? i  Q k  , ] u %GrBe-P[&+0311++ aM-qB vE O  v :  g - X { E  i3\&|Mh)Gf6Wj6`#U$].{O(b2x\0iA sP. ~M8xN.tH#pO/b:y[A$ oQ: znQH,"z}gifY^\XaXdcgmvz(BQmz!AiSm#T GpH&cPF IV]!\)_-i)r*y8FE|5o%X4c*X 3 Y K q  $ J m  < P w  ; J f { 'BJbm (/158/=./+ #xaN6 a N ,  n N "  l A " _ :  e E  }G)tC_+e>Ga<].X8Z* a;wB&c6nLsPrCwEE+`1q? jJ' eF.x\G1 {u^TF44 )0:GWau{3Rg/Ni 5Pw+Ev&Qu?d 9cCw1h2e >zS7t U?pCy>w.\ =kBmItRq X y  . `  B l  J t  I o 6["?_w);IRciwz~~zrmc[MG5-hV.lM! ` 2  M  O  n =  Q  f*t/>Oe-Mh=b(]&`-d1sGZ+yM*^6p\" xM5uW;gT9 lJ5qYE(jR6hU@, ~)4LUo~+Hg &  m T +  \ D  T 8 j .  {DZ)oAX#h4p> t4 [%zN q=p<p9h.e+j: Q%R5|T4 a@ aM!kW4ubJA*~~$.AS_l&2KTp}5Rf3Qm=^}-Ly:fCi'S @eJu(Q!LtLtHp=f*S"Hv,`Al)\Jz 6 d  : l 0 ^ ) N v 2 R w %AVp "/1B@KHQNQOOHN@?8.) ~bS;  w ^ 5  v N + r D $ ] 7  ^ . q=}B|H|Aq7Xt1Mh/Rp.a%e4~Df=c9j?xO*sP% ~V9wV:hE4wnUG8* ~~zyvzw~ *@Qaw $<_u2RzLj#SK}J|H}Pz$Q N>m"Py Zt Fw?jBpM?jKwSv,S-` E g  I i * V x  3 J k ' I c +BPauxm_RB3 h U = #  ~ e H % { \ 0 c F  a % f3e+Si1y:FK Vc,x=Ss6XvJ oJ|E^*}I*~\4 zV3pQ4lUD- xnfURDA72/),$ )--*285G@WUcku{ !.AUb (=`q-Dj 3PsCe>Y2Y2O{%Mr+Qw3^)Fy@c/W~%Do2Z'PuHk:h ;_ 1`-[ $ S y  > ]  > i  , V j   4 O c { (39AJK\VabehdgabXYNJA;.'!   t ] G /   v V 7  o ? " T /  S ( i; }N[.k: yDxV`2sG`7Z/vYrGn>h:]0 W,~X'wKvH"X5Z8~[E% rU@-wtgm_d_]]_``ehkqv )=Ri4Yp1Yn*PrENVV^\_ba_a\[YPNBA.* l R 7 ! z ` 6  ` ?  L ~ M  c5|L^ee%j'n5~Ka)Nq=j/])e-j; yKb>h>^7a;`E+eUB*~qnddZZOQNNLOQOUT^^fkq~}"-DJgo)8Wi;Xt0TpCh'RxInLw'S~7\ FiFt$I{&RzBe/Wz;l*My 8]!Dr 9W#@n $ S m  E _   B \ z  + ? Z k    # : > T U i f z t { o k ^ ] N J : ; $   s W F +  ^ F *  e ; & e 4 i:m4\-W.Q.]/ b2 a1 f> aFmBjJhHkEuG}]( f<|T. ~\7[F' w_E.r^M;+$8G\j":Zs,Ur4S*O5l,`)a0a(_$MCv-`-l -[y<`Fo #Wn *Uu2LsEZ Ac ' E e  ! 8 _ o  ' ? V l   + < T b t    * 4 @ D T U ^ i n t u z ~ ~ ~ z u n l [ [ J @ 2 $   | g J )  f G  ` 2 X + g>v@p;[&Dg0Nr;f&L!p@i8b8k4uFZ.yR%`4~a<dU3|iT<1 xeaPH?10".+tP"i5!c@\@ xaA)|nVE. mh[NE;0* *.8HHdd+=]p$Ff7^#Ux'Y~/jJl T4`;g=g >d2U*P~,NOtJp =W>\.Vw@^  A X y   7 O e  2 < Y i {   + 7 K S h m t j T @ 1   v V 9 % h H ( r J " U,zPm8}Qb*i9vER!X-l= E`5}Le6[-\1f?U=_BiL6zeN1|a[B;' +;R[x+Hh};`} -V{Fc8i ?e@q Hx.`J}Bj 4d$XHy <i'ZDs1ZBlCk 6^" ? j  7 U y  % < V o  # + @ Q b q     # ' ' - ' - , # *   | h \ H 7 #  p [ 9 $  q O 2  h A % oG$c<yR+k=|S.oI$vY1lH'x]8`CpP+{L/i@y[*^: e@pL$f=pN1p[<"wWL/ ~x^YB<*!;B^h#I]>X4V|@e2f B_>`Hk$T>p,h$N 0fBo FsFd3V{4Ww%8bx6Ej $@[r * D V j # ) > L Z l t  $ 6 < O U d l z       " # ) (      v c P 8 " e L !  | J .  oCsT"L'xX~T.]* `/X0zO!o@]0xJb:V0]2f=^3iH*nZ1 l]8!pZB2 ud\H9..;NXo| :Rl,`i  9 H [ u ~   ) 4 K W l y  ' , B G U d g z ~ } s d Y L ? -    l O @ r V >   wW>bC {[2X4vQ(a0 _< a.zQ#wI!sKrFtL!~T+i@b=lL.qR:ma9+ o]@8|qbYR=@)/  )4@IYiy";Sj&Gd$Fh2a|<_$Ju 9   } l K =  y a B $  dA!wL2{V2xT2 tW#wG*c@uU(aAzZ) j@V2 tR& yQ7 gJ*pN/~dE*iW5#qW?#~jZ<2 }se\KH82+   ",/@ETZls -@Ug 4Ng'AbD^:WDc.T(X'a}.d;f 5c .a)\y$JzDh/Tx 2Rv&@e  F] $ < Q m   , 8 O ` q   $ - B I Y d o z x j [ M > (   o _ B ,  | ^ E %  }ZA}c:pG%n@sN"pPi?U(k; Q$t@o?qE{Y.tO& yS1 ^A}T=aE&}dF0y_V71 |+:Ibi2Cau4Ys8X} 5XHpDf m#Ej7]|9[v,@cy0Fdw  1 B [ n  8 F \ n    $ 2 ? J [ a p x u l ^ O D 0 $  v ] H 4   d P (  ]Ay`9iH!n> Z9gCpOuS$Z/^A~S3sL,qQ$vS4 f@wV1vV9oN:sNEzfVJ8,"  &/DM[l{(6Vd5Uo -Lm=_Da+GyBoBs N~']~ 0` 4d =b5UBh@Z<Xv :Wq&5Ri~ + 9 J e k  , 2 N N h l w y y h b T F = 1 (  { m [ H : $  nUA#tP<{iA$tU* vQ-iCR(Y+~a) W*S+~P(zN!vQ$Z8 pK%sG+eF.~dJ6w^L5wp]YKB?41+"     %#1/?@OY`q '2MZ{7Pn/Ql2S{.Sv8^'Vv Kr'L~.`8l4f(Px?\A`?V &Lk-Mp%Hc8Pu  9 J k   ! / H X k    ( 2 ? G P X [ j d v m z { v { x x u v j s d i Y Y O I B 6 2 !   o c I = !  n Q :   xdA) vW:{S<nN'\:fFkE"e8X0 nJ#k?"g8ZCjK {[>y`?%sPAkU@ maE1%zfdJJ62& $"28JJcaz} "1KVq ;Rn.Rj4Vy -Ut 9\$RtDuBk 7W Gn0R|4T6Z.Ys&If5Js+Nf'O^ $ 7 J _ p & & : > Q R e b r y }  z l q \ _ Q K = 7 &    r h M D %  q^A-nY?&uYA|^A$ pJ4 iAsO(pN'lGoJ$qS+ ~a;}T=uT7{^@ }kB,r[;kH5taG0o^S>6) "/>I[iu  0 /    i Z C ,  s Y B ' iG,qV6lS* }W1{^.z[,wN2oP+rX2lO&kN,z^?qZ7sN:jP-kH4oR6iL5|mPJ-&~{jc[LI;22$ !")0<>PUamz 6B_j)U`Aa /St,Uz#nQ6iD0|QCmK1 }^L#}fE+mV8'}hR=)ygTE1( {ml^`MSDI>@98525-52286>CFLP^[pm&6K_nCRr3Vr:`:g+Sy IqLr%Pz,T-W-S(RzFj 0^{@]>_/Tk 5Ln 0 G b v  $ 7 H ] l       " * , / 0 3 5 5 9 0 ; 3 3 3 , , % !     v ` T C 2   ~ d X . $ {iC/ n`1uR5lI)~^:tI-}Z8jD$uF-rR,wV0~^8hK$_?aD*|ZC& sSBxeL:$g_G?*twmp^f[]XVSUUPZPZVX^adgltu{ -=Maq/Kc -Mm <_FnR`|$#\?oP)vO4{V0zZ/ }T2 T7~\8fE+dB"`M' z`C( sYD+}kXF1${naZMH<3.# *.@=ZQnn,8Qez ';_r"9Vz2To>d @T9[6\ 7R/X~ ?UC]<^1Qy#>c-Jl"F\|:Ln~ - N V s    , 2 B L R c c v t | o l e Z T H = 5 $  r b M : $ gO2nV6YD|Q4b?mO) Y8mB'rU*fI& `@}dD$nI1 ~\D% ~fJ2jT=" m_B8 xzX[@:& {vpmm_hYdZ\Y^YbWhbgkpv/>L]n*>Ug 29hn0Og3Ph;Uz/Mi B_:[x:U!9e{(Ff /Oo3Ss1Oo DXy"1Nmy *6Zc $ . B T ^ v {     & 2 1 @ @ E L L N W R \ Q ` Q X T K O C E : 2 1 &   y e T B +  iU6!|`=#gJ%b>mTxP0wV+~S.wZ-~U2]7jI%|_8{d?%qU= f\7( ogL?%kbNF82{{pkedZ\YVVQSPPTMVQSZV_abnkx{17RUq|.AXp1Kfz *Ff 7du(Cl6Sx+Jp@^5]Ae+Vq,Jo<Z,>lG^ &HY2Gcx ' 7 J d k   5 > K R ` h o | } r o c U O = 5 !   s _ M 3  gX0 eH%iDuL,tQ(uI'kCdA`>c=jB&~X8lU/|XArW8#pZB&r_G6" t^TD1*~{stkqjjkgnhpktpy{|&,@HZfw 8A^l 7Lj|:Ru7Tr$Fc"?c)Fm8TzDa0Hu<T|C`(@g8Xu"9\p"CTn3F]l  + 7 K N e p v        ~ j b Q B 4 %  {cM:n]9#v[>!lH* kB#tZ,]BhDfDhC#jJ rR3f>#dH( wW8#eF4vbL;(ze[I>1# '.CD]br 3DYm BQt&Da{*Ph (Kh (Oi0St2at&=k0Sr =` *Jm +Nk )Al3Lm%HZz &8Ug~  7 > [ e {    / + @ = H I Q R Z U _ W _ Z Z ] U U R K L B B 2 2 $     y Y X 7 3   la>0|WE# u\9}^>sQ(X8}`<|Y0uR,tF)kF"u>,vO, d<'}d@$y\B({[L2 k]H;* tyjgd\ZSTNNJHHEEDGEHGNKWTaakky|,>I]k0BXr+C_t6Mn6Tp+@e5Yp+MhF^7Zq0Ro(Bf8[r +Hb,Dfx9Ll&FVq*@Rdx  % 1 9 N M b b p x ~ ~ s m ^ [ H B 3 (    ofGA!}`K/[G* |fA) mT+gJyY4hD'xU2iD#t\3xL8rX@nP4rX;'_N7maD?%tk]QL:5)  ,1AI[`t9>_i&IWt :Rn-Hd8Lq%Gd:\v0Rq 'Ga>X~&N]/Gi#E\{;Il.M\{2?Zj!5>U`q}   % 0 6 > > K D S Q X \ X _ a \ e [ g \ _ Y X X Q P H G < ? + 3    zoZJ;'|eT9) {_H*eN*tQ6mD'vY.^9`8h8 mB(xP5 fI$hQ.{fD- vS<"yiP>%rkRI2' ~xxmshkggbdaadahdmjtv|2;NZl| 6H^u)=]q-Ti:Vu&Lc*?g,Bj /Lk -Jh!>^v4Ll&8Vx7Vm !>Tn*GYs,CTez $'AI]fu    $ ( 0 4 : A B J K N S S V V T X V Q S Q J N B E : : . - "    ncO@)pc@2vfA0 }`D&kH0iF'|c<pP-~^=rN2 dP( mG2 z_>&~_E-xRF|cQ7&|vXM8'zxc^RF@4. #  '/8AHW]ln2Har+4IWcz ##:;MW]no{uigXPD83! vc\=9"~lX>0q`@.pV7 mP0tT2sP1 aI zW5g? zO2 c:uQ3uU2jS4lU;(rfTD8'{tsqjpbj_eadbegepnt||.=NUnw 5La{ ,=`y!=Xz -Gh+Ce 5Lx"Bj0Ww#8a$Ej &Ic9St6Mk CQr+BYu4BZk| ,5GWcr~         '  ' " '  %  "     udXP6/ }hY=1~iH< kR2{T? tO9}Z?|a<!{Z7qQ-dH(~c;!`@#hD- }[M!s]H,gXA+teZHC/)  )7AQ]ow+b,Mm7gz &Nl5Qx8\v7Vq!;]t-Q_ 2>`r-?Vj&7IWht#*2=@GRR^d`qjut{txzw}t{qultgn`jW[TMMA@63*  vfZL?2 {\\88t[L4  pWE(gV3!bT(aG(rW4uX5qZ1rO3rR7\G"x^=&jQ9|_S0'zo]O@4' .8FUcu}+AVm/Ne /Ag>Y=_'Jl3Qs5Rt 2Fq"Aa5Rn<Vu4Wk'8Uo$;Mfu2<P]n&56ILTc`ro}~}ql][IG3- sZI? uXG-u[C)p_?# z[>"kT5yb8!c@&fL) qV9cD,vZ= y\B% fM5pQB |jUD+ kiQR>8'! &)AA[bu (2U_.Eb})Fi">e~ #Nf 3Pr @@>F>KIKWQbbirz0ASay1F\t $=Zo1Jj8Ry-Fl(Fg*Ao'Ld %Eg?Zy $C[z.J_~ &4W` 2BVg{).FP_mw!*-35@8I@LJMPOWPWTTPRMOMCI>>6/0& qcYE<& s^L5" |bI5mY<"iL/pV4sN>dO&uW:\T uR;hU7v[>-xfI8 kbI9 {i^G?+xinZ^NKH:>44/',/) #'#/)45;CDNT[cnl}$>Gal (6Te/Oi 0Jk#Ce *Ll7Zz$Ih 2Jt0[r4Rp !G`{ JS1Kcz !5Hao1?Q\mw '*8=AJMT]]fcrj{n~r~xz{{u{rwnrjic`ZXJMA;5''|t\Q=2iVB.qUA.kZ:% oZ8*hN1g[+!hI/ }^F! vW=x[>% iQ8sND uaJ5&zeZC6%yjbUMA6-" $08AO\du|,?Sby;Gjt%D^x:TvZ~7Tx*Ph(Fb<Xu #D^|8Uk+JSx&7FZcz !,;;RL``irozx{jn`WRF88!$  zqZN71vgR<*tTI'vaG0jR5hR1yYD! }^F) fJ/pT4 x`B' r\C#xjD:~cU;$qcN:1 ymYSD8.||}"5AObi#9Kfv0Ifz6Qp5Rr ,Lg &Hj *Gk2Qr8_v?\}8Uu-?dy!>Rt;Ma &2I\m  !8>G]Zqo~zjgZRD;,& |pWL4(v\H3`T/#dT-r[> vb@& {^?'uZ:#r[@$|eK)z[D'}`K/ykJE"u`O;)zb\C?("{vbiRSEB55'$! %$85DESYbmy &?H_q}*GZi >Pp#8Xn/Ol#4]q*Nk@Z~3No)=e|-Mc1De~5Ol'JUu(7H]e*0=ARL`Xggoow}ux}z~uxujqaiUXLD@5)$ vvYS<,l[>2 kU>'mP9#rVA!vVB( u_<0 u[D'z]D-hM9s[A-riH8$ |jQA.lUL3'pcQE7)ro_\OM9B(3  $+39BGR[bo{ )9I_k 8Fdt:Qm)Nb5[p.Mq ,Dl'Ci$;a{8Ht<S{:Mk8Lk}*AVd{99Q\hz$#/)80=3@:@=>;>:::28-2#*  th]HB,"m^H8qiD8 sVB& jP3sR:gR1}aA)x[@!zbF. zVG%}iO:! saE3" ~lXG2& wmYL=+#ppd_XRHGA<650++$'"!"!($-*33> eU:(ymSA-q]P:0 zkbVL@9)% yxvx{| ))@CVbk )@Mgr3K_| &:To,Fc{%E]~ *Cf~ :Dq6Sr4Vf &@[r "?Sm$=Nhx+DPbs"+<KTek|vn`YK<4"o\M?%}eQ=& ~gN4~cO)yK@sM8`N$]D& y_C%~gG0wWC) jN< ~dX>0 p`Q@4#|vsfg[VPLEB>;5350+0'-**--+053<9G?PJX[birs%,CH`b} 6D^i'DYm4Cfv*M`%:_n4Th&Q`*A_{"?Wv/Oc7Mj4Cct'<U_~,7LVfv   $**323;6;;5;2;,3')& vmYP?2paG9!ziL>  |dJ3]L&qQ?y\?'ua='}`D'mS: gO9yZN+#jXG+"t`T;3sf\P?:(({|| 2:HV`nz);Dcf9Kdv7Eet*<\s+C`y2Ifz2Nd8Vh":Vl5Djx#<Se .IZo'9JYjy #6<FPYcht|}ynn_\NE:.# oaO>2 o`C: kW6# mZ9&fI4oM6qG5qJ=s]B%oX>$ w`H/|aP7%tXM6&jfNI1. |{roii_\_U\PXPVPUUS[V^^fdrj~x%4=N]h5IUo}$#td;,|hC3 s`?-|hO2!nYG0g^G=$yhcSL:9"% ",9CN\ft':I[n "6Hbp)EXt0Pc.J`z,Lcx4=fr">Um,HZt)@Vg=Hdq'@K]n66HV\my +#2+:4@<BBIEIIIEI@FBB9?27/+)%~vd^H>0r[N:$jYB*oV;& qZ?& rK8w[=&aI0tV:(fM2iT5){hQ<$u`R=, yn_VI=4(  #+7?NYctz #0>Z]}$0J\r 8Icy6Ddu @Np5Lh~/G]~ (8\j<Hh}'5Va.@Yp >Cfh*6JR_uu %)49BEPPYZbehjpnvpwqzszqvvktfmbcbQZEQ9?1.%rfVG9%|cR;)kV<(}fO0|eC2 jP+nJ/~iG-]H) jL3bL4uaH6 wlTD2#zp]YF?2( &.Wl-I\z#:Vj4Nd}'FZu.N\|2I`v!COlz  1GZh  7=][z$3>LXdox "%&)++,.++,"+% {odUJ>0"xkRI4$xgP@%{cJ8 yZF+~_H.wWC$ dN2|\E.zdF2nWC&{jV>0u`T@/#qeYT=B,)# "):=IS_hy| -6IXix 6A_k/@Wi6Ddr3E`t 7Nh~!FQt.Ja{ &:Wf$DRl0@_k  1HTiu"0?JYbo~"+..4199:<=<@=<:<666..)## {pbVD?-zfTA1  kSB*paC2iI:y_E+lX4!^J'n\:(oY>"ykL=# paH4"t`M@) zneSHB.+(.@FZbw})6M]q-AYn!@Tq!2Lj~3Pg;Jo @Tt!BVo4N`|!5J`x"3H\s .;O[k "(<AYVpp   ) +%&(#%% vi^RE6-teQC, qQJ+aV9$|pR<# udD0^R4oU>' hM6vaO/"o]C2 j[A3raTF2*wneVVBH11###+1=BNW`kv &)DJao}3E\k,EZq"ISv"6TkDQx#DZt*B\x )<\p)DUr-=Tg{ !*DIek $.;AOU^lgxxrgaUPBA-+zq^QF1'geG="{dV<,}hW8. uUE*hQ7 xXF-pS=#gU<( |eN@ u_M<$zjZJ>) |tc`PK=?#)&19@NSekv$0FOju(Xu -G^}!+Ng2E`y3G^u 1JWq'AD[ix $+>AVYfr~yuf_RL;8"! |h^I@* q^P:*w^J8 k_@.vYE.~kN5 w[C/k]9.p\F/lXI. naJ9+~uaWG8' ysfbTVFI<<21)%"   "#,,79EFKWZent->JUjw%6Gbp)KXt,B^p "=Wp#DUu &AZr'?\r %:Yk'DRp~#=M_x*2LTkq+-8DDXRfarp|yyvmlb\YLHA53' okWQ@5&~n^K@+# pcJ<,|`Q7& yaN9!lWC&wWL'~hN@ \M8"fQ=,hXJ1$qgUG;)# }spe\YQKH??74/+(%  "#&,+74BCITTfcsy *8LRit%ANhv&2T]}-Jax#?Pv$7Ui0Jcx'?Ym,I\t'6Ua{1@Wh~ *=L]l"59LM\blx|vmf\RL?8-'}l`RC7#pZH<"x`P6$ }VO)"s^E*hQ; {aG;v\H0xaM5! tcN8,eXD1 }w[[=A # wtfmTYLKBC4://++"%""%)%./4<9KFWV`est*6AX^r+AXd !7N`z3A`r ?Pn @No7Nl.R[&@Wn'8Pf{ 0JTp|.@I`hw *0;BHUVadmryy~y{lsbdUXJH<6+-ofWK>*&  ngQB1~fV@- s`K5"p^E0zhO8& q^@4~pVC+u^I5$ tbK@$shQG3%oiRP68  |wnpjecbZYYTTNSQPQSTTWW\`_jftp|5:GX^uz 1?Qgu+:T`,9Yi %9Wh,;]l'FTx.A\v):Ti}0;Zc&@Kbp5AR[n} "*-><HPPb\mgxsy|orj_bSVBH65*!|q^W@:&xdPB-zpMF&sfE? sbD.nR=xaJ2v`K1}pRF%qXH4 |eXE6 qfULA0&}wqskkec`cY`WZYT]VWYZ\]``hfnqsy&-=DXan->Qdm#5L_w!>Oj%:\h4Lc,A`q*8So+K\y*@Xl+:Pdy'5LOlo(.6HGX[ijyv~xria\LO<8.zi[K=)! t_T:. }jU>-lVB(x_J1}kL=! lXC-|hQ=&oXG0|yZQ7/ pbNA3 wtd]WI>:)) -5=LU]ou -6JXhy(CKkr-?Sm+?\g !>Ll~:Nd{6Hav(=Rkz &6Maw4BPjq&2>QZnt"'+86BDHPOVX^\babjgfoamgggad_\VYMOL>G560("  wfbOC>!$vgSH0(mUI2 }eL? uaJ4`X7' nX>*pdJ3 rdJ5% w`U=4daM?.' ttaZTDA0/#  $,2@DT^gt $(BM\ky 2;Xb 3B^s "6P]0J^z0Na}$4Ue BOl 6Laz 1DVk| '@D[hu!52BDRVXdijvs{~{vood_[PLD>..  bbHD.# {g\?7laD9v`N7  jX?(w[G/{nO@&tjP:)udL?%vfUC7!yh[PD0* ~~njX[AJ26&&  ')5:LI`]rt*7DVgr /@UcwAJgr 3J]w&@On~5Lax*JVv =Kfy;Ccm(?J\qy 48IUbl (*.30<2D8D?BDDBDDBAA>?29+2%(" wobXIA/) g^M9- zoXG3}lV@.jXB+~hW='xkI@#~pVF.~p[G>v]U=4vk^MA9" xol[ZOJ=@02&#   #&03@DI[Wjnw":?S[n~2=Ocv*BXd} 9Ebq $;Of4Ict3G^x+BWl2CUm -=Qdq!5AO]kt"-0<ADOL[Vb\jdojslyssyp|pusosijgadVXSHL<>.." rfZK>.e^E6uaI<}_N8 l^90waG4xqNC#`T:&maL2' l`L:+pgSK7-{jd[RL@>00$#  &-3=CMU]jj~ ':*rqfa[ORA@>35-$, !     #!'*33@:JJT[`frw{.6EPbh#1>W_y$>O`x,6Tdz :Jfr #0N]w !8Kbs  2K]q)9Jfl#=E\h{ &/:FTXnl  !%"%''*'*%'%%$ rh^OI71g\K9+xmUF2}fQ=&umA>~nOA$uXG-|pSF,zcM<'q`L>) ~rdNJ30woc^UPDC=/0$#   ,,8;DJR]`ot$+>GXev )4IXl|'6O`u+CSsz/D[n/I]r8N^y5N]v9G[o %*DQ^s{'8:TRikz !""qf^NK8/$sePG0#xfOA)|_R8#seK8$ qXI-{rQD)q_H4 xaP?,!|rZT82~sdYK?4(~tnj^XZIO@D;:8/0*')$$## ! !$$),6*=0I=RD^Ugio~{ %(>AY\p|)1IWiy'AJfs "1NV|z'>Qdz,DZk $8Jhm&5NZs&5IUj} *7ESem~ ))>=KOZbkkx}tnib]QO>A1.# vk\T?9% ofU>6zpNN)&yjVA-o]L, w]N5$ymS@,{lRF/zhZF4/ |meQH>+' qnf^ZTLGA=:50/'*# &))2086CCOM]Zjlt34NPhr|/;L`o$;Gcl%7P`v2D]q$@Oiw(HSh,?Lhp&3IViz 37QSmp  '28FHUZfitwwqibXNK7;'# ~m_P@3"~j]F6'p_I5  udK8! t]A7 l[A0s\K3 p\G8$lbN=, sj[P?:" }zjj[[ULJA@88-0)&###*!,00==DGOWZifwz%.9KPgn~.7O\qy!3IXo} 1@Yn#=Jcq/=Td} 3DXl,?W_y'2GUdu &1=KWgm| !'.77K>WH]Te`hhonuww}zztzotikfb[XRLL;F.8&)qqZYE<0" ~jdJJ,!w_Q<+|mVA1 }^Q8'~oZ@5 veP<)zgSB(!hXL2, khTH<. {rtda[TRJJ@G3=32/,,)&)$'$'$))**0/5:8ACJJXT^fgrz{00HM_my#2FUb|'AMfu+:Sew2=Xk} 4GZq '-NUr~&5OZl$8JViw %4<QVjp  //>@HOW[fhrt}|xqle`ZOL@=., |mbSE9+{jSI8vbL?%j\A0qUC-~rUD,s_C7" iYF2yfWB4!geNE6+w{ni`[ZLMDA>86//)*$$ ! !#'),-36;@FITR^agrw".DDTRXb]kfoorwwx}|xz}||z|txlrilb^]RTFL;>//& tm^SH31 tfVF5)ysWL5&j[D6t`N;${fX>2qgQ=1 g`I9(|b]H>/ |ug\PG93  zzwotgggcaa[aXcX^`^acaiiiquwz~  (3BH\em|&2CRcq"/BUgv#CJhv-GWo,CWk1>[j%:Kct />S`u.<GV^py &/5:AILXW``nfxq|w|}qzio`fUXQID;7/'!ss\TH9- olSD9$ zpYF5 {sSK4"aX@/ xiT@4p_N@0{m[O;/"}ceKI4.ypb^SMB<1.  (+9Z]w+9DN^dt|#$/18>>FDNNRTW[Z]^]b^b^bb[][XXQUNLHC@7;,.$! |t^aKH70 tmVP;3nbN?/r\N<'xkTJ/&rdOA- w]V:4}iaI?*! nkWL=2# xvggQQAB10' %'0P^p "1=MVhk~  '41@=RCXR]ccinoruxz}||z|wztqniie`[XROH@A22'# ||gbSG=+%wp[L<*pcL=+odH<%~aZ>2 ~u[J8$~tZM=)~p`MD,!yw]XH:/#xnb_NP<<.*% ""07?NQ[mk(8CRbq ,Td},>Rhx0AXg~"<F]q ,@Jfj #(:ES_jy  &*178CCLKRWXZ^]f]ibfhefefebb`^[U[NTDL;C542#&  tn^WG?1%zgZM90}f\C:#y_Y;3 }fUC0 i]F8'tnSK4%xdYG<%!vkXRB4,|sna^QQA?3.(   %%76BGPXdhv/,FH]hv-?Mao "1EVj|&;Oaw'=Rdz.>Xa"8I]q} ,8OXgx   #7?MWanv #$.,75@;CFHLLQNRRTTWUQTQOOLLFHAA::54.'$  ~{meWNG40 ufVI>$neN?,y^S9+{nUF0 rfJ@)phNB.miMF0%leXFC+) |hhTYEG71-  (-3D>XSdks(1>NWfw /9I`g ,:M`n!=Gal0:Tcw%0GVj{.=O`t!3AO`m~+3:KW_jxv !'&/,1588;=;D;A@D@>A;A:>4;,7)*$! mpV\G9:  gaLC/}hZE7#r\P6'l[I5)qaL=- zsYT:, icMA6!tn]QK75$yskh_[TNHG:>41*+ "   (%307:>HGPV\ajmy{&5:LR`ov'6DRdp"9B\ew)7OWt{!8NXn9BYlu &.BR]y}9;VUom"-7=JPZjht{ng_WMB93"poXMC/"wkZK4+~l[D;"q[N5't^Q=, kZJ6+ilJG5!wtZ\C;,# |rka_PPG>:..$$ $(+6:BKJ\\gnv/2IH`hv %,BLaj#9C\e':RXw~$7Cad $'KKev .?O`q} '8CV^o~ %3<GQYdmv~     svbbPN<9*  ~p^UA6$ v`T@."~gYD3!zfZA,#zdRC, m\K9)siVM60vr`QL55#{xmk_aPSJBA9401"(       ('+11:0xu]J>&xlWG5&zm\K9(}j[O;5nh\IF., vvbjT^KMD?713(("   +(33?>HKTXbenx)2BNWfq}"3?P`p{3?Q`q,ALcq&8IZq{ 0AU_{ "/FOfp*;JUgm +3@GTZeqv     xtjbTP<@%(~mcOD3"t`Q@."vlRG+! zcX=/wdOA,|j_H<&~{a[G8*wkcQN:2# {xjm_^TMNAA67.-'$    (-%30<9GDQP[agkv{!&;>RZcv|3;SYss 19T]p/8R[u$:G^l}8?Xgv 5@T_n&/@LZdr~&37EJWZhkvqpa^SM??*1umXS@6' ye\F:+ uhVD6"{kZG;&r^Q;4ggN@1igMG9*qiZQC=2&{xrjj_aX[PQKJGEAG7?6?7?:>??BBKEMNNTX[daneyn~#18EOZhn/;JVdu+9KVnw -:O^o,8O]o*9K\l|1=O]k $2AMXfux ""37@HQY_jkx|stja^TEH16# plVO;5n_L@,sdR?. q]O:) wrZL8* w]Y?7 ~mdPF9%}zhbUI;:$$ xuneh[\YKSGGD?A7?1661413-7+734797?9GAKGQQV\abkns|~(27INbcyy$3BL`j~(.JKhn /8N]r~5CWf} *9J\l"/@R\sy )-DGXco{ &07BGPV_djsv|~qkh_WPK:@++  uo`VF<*!veVL2/ yl_G;* taOA-}l[L;* p`PC3"uj`MB6(|oh\UHB22# ~ys{nnnjheh_k\headeegjgpmrpux|~$!75FNUefy}%5AMYlv(4JTbw&0FThu &CFdk(0AU^v{ (7FT`tz)3APVgm{ .-:=GKQ^Wjbnpxv~x~mqgg^\SPJ@=4.* xfcML50" s`TE5({j[K9.qlQJ0&}q[U75 zp\S<7}pdSG;*niZQH;1) y{mpde_Y[QTKMGHEDBAEI^k*?HXhv %4CL`fv ")6@IV`fr{ ((0377?@EHJNKVNWWYYY\YaZ_a\\^T^SWQQMMGJ=B977-+&" ~lj^RL>3-yp]WE<4yg_H>1zr`OD0' ncRG/) vhYM?. }scYJ?2(|thfRQB@2.$)&7:ERRhfw,6FOif (=C\bz!8@Tcu#=FXhz$9?Yar1<IVcn 02<RJdfm} #(-.176?:E?GEEJEKJMGMGKHGHEBG=@9=3:-4(*#xmjZVIA6/ nqOY::%ueXJ9-rlWL7, xdXF;$ vgWF@(% lcUJ93"}qfeRKE82)! (27BKW\lr!5AL\lu+4MPnq&;A^` ,CLdq$6DVdv/7LTip *-DFV]jx{(0.4<<EEKNPWS\Y_ad_hbhhhjjghgdhbd^bW_SWPMKG?B49-+&~}ig[JI32wibNH2+|s\YB8* tkZL;/fiOF8& qjTP:3  {vdXR<8(! trc]WIK;81((  &22@EKXZlk| (;?U[f{(9CVbt 2:R[t}#:A[cx 08NYj|48RWis $*;CMZapt  &*.36<:B=JHJMHTKWMYNTTPVNTKTESBM@D@6@-9*+%  zwi`VJI35 pnWQH2)xg\M<1!ulRQ70xaWG8-vbbFF0({jdRM96$trehRRI==1.$ &+/>>KQXciyy /;DV`o~#6@W]s $,DNat$>F]nx9AUgs+,HIci'9@M]`wt #..6?=KGTQZ\bbkdve|nyv{y~|~~{{{{tvqnnhk_daTZJSBH991+&zpiVU@>*$ yn`QH8(~h_P?1!ldOD5$zd^FA*&|mdQH7, z{f^RF95"|wnccRWCI8:.+$ !+18>BKTTceqw$,9GLccv )=FWbw~*7G[d{ )8LTkx'9HYg{):ETbk} )/<GO`drx %(.04:9@@DJGKKSKQMSQPQNSMPMHJHBG7B4:-0*"#  {uf]UGA5)! vn\RB8) vjVP;3!qkTQ77f`Q@:& ~ndVK<4#}ufaRIA3-! yir_cTWIKB@844.)#     (.&52;B@LLWRhZtlz $*9?MXdmz&4?SWns ,,FJcl~ '2DW^x{-<K^j| (<ERen,5AIX^lr +#106<@?EENJQPVTVYWWZYZYYTZPWKWGKEDB<:601&#"  tp^[LF50siZLB2)deHD1%~tcUC:&{kdNC5&weYP=7# ~uf^PG?2(qqebWXIN=>54,(#   !))17:EFNTZccrr} $/6FP[as{ +7FQbm$>FZcz0>O]ox8BPao~ %2@KYfn&5<FMUddww  #-%-*1+6-603314-41-.(*&"%  xrgaRP<;-" tkYR?8%~yeYK;1o`RD7, zo]TC5' |yg]KE3+~oi\RI>/0 zwnifX]QQEL7E1:,/(&#     &&.(8,=;CEKNUX\hfqw"68GPYfpv,.FJ\gs~0;NUkt !,:JTio44PRhs  52QOclw ,0;IJ][rl~     #     wuf^ZFL23$ kiRIC++u[^??'unWR80}naOD2) |sdVM:0"{cgLP93,zzklbZWLHB;51+$!  $$.1::FETT\fhry "-9BOYgo~+==\Zqz2/LOho&5GLfn~"+?E[gs ".:IQchz !&38GGV[gmt~  }}rj`[OG>3,!vt_WH8/" ~oeRE8( }f^ID&) }qcRC5' h`W=@#"}pfYP?9,%z|rhc\XLKBB78,,(      $$1.8:@HHXR_ffwq,5;JR^jp "3?JVep|,8CX[rx/:LWct~ ".<JXar~%7?LW`nw"$25AJPUcfpt~xpiaVRG>;-& vi_VC@.#ssXY>9% naQD8& xq[TA2)sgYN=6  sv\\JD9(%vrhb\UQKC>:25(+#     !#(,/2;:HEQRZ]hhyv'-9FMYij #6Qal{ ,-ILdh"*?A\\r|(2=IV`lq!-5;CPLa]mlzzptafSRI>80&vk`QI<.# {l^S?8({naQC2'un[L>-$~hbPE7)mjXRD<0%}|nib_TUIEE78//(&!    !&,);/E=IHURb_kqt},3>JR^mr#&:BQ\ps'2AN`fz!#7CR]nz6;MUgo28BRVhnw &)65FCSP^`ilrx~{utflZZSGI99*- yyc`QB?+& {jePH9*$khRI8-~ihNI8'& nnWTF3. os[\M?;-$"yooeccTZLNFCB=;744/1,)))&(($$( + )$&,(2,/52:;:F@KKQR]Zeenn|w-/;GL\^us ".?BW]nz '4AO^iz $:DTck+0GK^js  78IO]esy"-->>IMZUi`orx~{zpldaZRLC>30$tv`_IF5+# ogXJ?0! oiRL8- zi[O>2&wjYT?:&spdUU?>,(tohf\\ROKCF::71..(($!! !$&)2&8/8==EIKTR]]hhrr}%*QUku )5GQco}"1;NXer ")8@N\_sv'&65AGMXZfgmuzx{tjgaVVGD;20!ztb`LI52~o^\BA." rr[TA:$# ~rdWO@-' |wgZT@:.{sj[[FG900t|lrife]]XWTONKKFFCE@@@@>@>@C=EBCFCHKKNQRXX]b_ncvqw}$'68IL[clv~76FSYpq,=>]Zux27ITdq!(<AV^j{#7:HR]evw!"/39DDRP^Zjdup{~x{ojg^[VLM><2/& |ychOR<8+  oe[JE1( td]L>8! xi`RA;&# |ggMK:,) }uj`XMF<--tvnif`]ZUWLNKFHC@B;=7=4;787:5;7=8@;C>EEKIONUU`\cflqr|"08BIYXoo&3@JYep';CUan#->G^a{} (4EP_jx+.BHW`nv&)66CIOV`ammw~{ow`gUXIG<33" zti\VC?1&rlYRB8+ui^N@7#&kkXNA5&  zqeYP@7+ xsdaRPB<5*"wzqthn`hbZbUZXTQUNRNQNQNRORQRTUWX\\e`kcnrty}',9>2/*!nl]VLB:.(vp_XM;;!$ ui^RC8/ztcZLC0,tm_QK:3(}ll[YIJ68$%zrvioeee_bZZ\T]QXRRTURXTUZT`Wb\eekinqt|z $*2;GM\\pr #,?CW]mz &*>GXcr~!08OQiq*;ER_hy#48LL`cq| !&,58AAMJZX`dimrt}}}xwppdg[]ROGF69-'& zth_TL<:(" ym\XEA.'zk]T@:* qrXTC>' ~sjYSC:0 {rfaSMD89$%}|tvlikbb`]ZUUUOTKTINKHOIOIKLOKUQUUX\b`eiktqy|'(8?GVVol})7?PYdt|*7GQcl~-8AW`n{'4>MVbry "+7=NQ_epz ))23>;FGMRPZZ^acgfmjtopwr{t}uww~z{zw{wxpuorilfda`[ZRSLLDC<@3/2)  wkkVZEB8.(yoa[KB8*" {wc^TA8) ~riXRA8)~nh\MB60 zol\XMF>3-$|yzvvqnqkoflhihneikfqintkyryzy} $25?LM\dl{}+4BMYgp $,=DUao~ $4ALZiq*-AJShh{  &/?EN\]pq !*)93>@DJJRXX^`agjgplttrxru}{}{{~xx}zxzwwwtpomil`f^[^OXJJFC9;-0'!}sheRQC=/, ~xl_XJ>3'tdaLI7*}rcXI>4'|yb]PE:1  uod\PM;?,,|zwvooninckehbcbe_f_ehekcofrltvt}z,/;BOPdcsx #1=EW\pv27NQfn~*8FR`o{$1?E[Yux "+:<OR`hqz));0>AAPJUSV`^fglltpwxz{~~~}x}zrzmpljdg[^SXMMIC>95*/' zteeOR=?,) rm\VH>3(}nhTQ;:& uh^TD@)*wtdZWB:6#{{jlV\FJ;8-*  %'38DGPYdjuz+1CUal}*1HHYdox )48FOThcyz"$,/89>F@PGVP][[f`gjfpmmtlxozm{twrutowjuirfldf`dZ[XOVGLF@<;2,)$ wsf]ZKE<.+yse[NH61%uqaWLA2)zq]]DD/,yjbTN<=%(}xmf[YLJ;90(" !$-5?AMU[ifx(.BCT\kt$/=GX`qx)2@NXlr%;>RSlm(2<HLZfh}| !'-0;>@LGUR[Zdcjjortxw~z}~zuztrpmii`dS]MPIC><03'$ wnbbLK=2/~rg^PD>+% ~ocXJA2,~ui[TC=,&~tk_TK=:&(ssfcYRJD>62%$ ''65BFPU`flx ""4=CWWkp~  07JQaix $7>RWkr$16NM_js .8?QQbctw$$/,89<DDLMOP[RdZcafcidodrdrjlmjimfiigd`c]^X[RUPGM<I986-0& vqe\WHF42#xhbUJ>4-{wfaNL50! zdfTJC4/~|jgTTB?3+voj^\RLID8<*,!  %,3<A23*,"  !(%329ABMM[Vggrxz #)<=FWWgpv/:>OU`qw $0=JR`nq "+8>NVaou%)7:IL\]lqy &,)0369<A>JDJMMOUMZSUXVU]P[SUUUSORJPLGCJ8C565,,'! skbWOC@1.{oe[KG4.$ kqRX=80~khULA7'#pmZYFC43" }zola^UOGB;60,%  (,38ABMSY`gmv~#94FMSehw$/=IO`hx}'2AORinz!-3GH\_ov(17CNR_fl}y'"//296C<@DFJFOGPMRPRPPXRRSMSOOOIJLAI>@>8930,)&}yph_YIK54,|ug\XAA.'xodZGF/-xqdTR@5- wkdZKK74+zip[dOSFI9<-0$%%'026ADJURcaosx %96FJY_kq)7>IX[ot  *7AOThnw'0;EN[bmy| 4.@BNTYeiq|z "!)'-)0*2-3/50305-5-0/-*,)&'!!" |wpc]RQC=1,#|ujaVHB4*" wl]WI;2&roXXDA-) wnd\PJ=4)#~~opd^YRJG<;5,,"  !,(65F-*~td]LG52  ~oiWT==*# yyebVK@:((}sof\YPLF<82/%%  $(,65ABLRY\gmr~".4?JSZhpz '/=FR]ku}#0:IQ^fr  %.9?NR_ho~~ )(4<@IOR``kqw|     qtfc_ORBC25"&shhPS<<-'  }rf]QF:0! qf]TCC-*skbWNC<3&"zzlo^`SSGGA5;-*," !*'22;>BILVXdcpsz (45)thcOJ>2) ~vk]\HH:3&" {vmgaYUMJA?55,*!!  $%2/;>BMLYXfjpx %07FKW]ks  #7>GT^kr &/>FT^fxw'-9BMX\mo~&+78FKQY_elst|spfcZWII=:/)  umgVXAB4('~tccOJ=2) {qf^OI=4& swh`WNB?03 }vrjgY\PPGDA58,/''   !'*-592,pj`QPB<4&"}xmma`YPSDG<86,-$"    %('2-;>BFOP\Ygisv+.<@NW`gv| $5;IO`fw{ !5:IR]it}*3?HP^brx (%77BHQZZflpz}   |vsffWYKI=:5) ~rjaVP??+.~zo^^JD;/# zucaLJ;2* zpj_TPB?:(% rsjga^UULMBDB8<3/6"-$!"     "('0,32;8AAJJRSX`dgpp{&0<0% twc^UFA4*$~~dlZNJ:8'  zsj`\PK?91+ v~osgi[dUVMOFIBBBMIPSU^\foixp{#+6JQ`ht%.;BNUdex| %%27?FIRZ_lkty}}hw]hWVLEB81+  sse^UGE41'}xidTQ>;/$xldZQG;2) |pgeSTE@:0(# {xujradaX[PPMDJ??<;3;-2/'0"*$"'!"%$""$'!/"3*3-92?6BAGJOOXV\dcpmvx (,9?HN]`mq$4;FO[ctx)0>IU[nn"/7@LU]hrx $'/3>AJRSa\jlxx{vpii[aOSDG69-)$ zulc[TKC63( zui`VQ?@.( vme\OO;;,&wyje^VOG=;.,"y|ouljic^^[ZTTPPNJHJAM;H@CC>F=C@AAD@FBL@QBUIOWRZW]`chikrr}} !%.7:FOT]lg|~ !(99LRYkj ,7>MSbhx{ "53EJV]dm{~  .)=4H?QPY[dimpwyyrrocgWZQKJ?;5-+  ml^WQG?3,%uidXOC=--{si_VOC<0'  }po_`MT>C01'!w}smpdm^d^Y_PZOROMMHMCLEFEHBIAHEKBMDPETEWNWT\Y]`bfiomp|r|""-2<@LUVifx{ %.7DHWbgw|%/7HK\_qv $17BMR_en{|.":0C?LLTZ[ednqu||ztqnfiZ\TMMD=74**}ik[YLH=20#  rigWSF=6(& spc\VEE77$  xuhkY\OIF8;-+$ ~|{|xyrxqxqstqtssvtswvzyz}| $..;@EOU]bmsz%+9@HKNSVZ^`hgkopu}v}~{{vttmljbb]YTVFNA@=35))  z{mjaXTIB92)*~nn^[PD@2/!|qijQUF?8,&rng][RLC?83)) ~|z}~  .);9FFTSacot{ .+;@LS]gm}~ *0=CL[Zpm #*0@<PP^^nn{ ,4)<5@AELLTQX[^`ffhlkrrswxx|z|||||}}vzvuwnrnhp_k\cXYUUJN@F;;34)* yrkb_QPD>9+*wti`YNG>30 }lj]VQBC23$utledVYHM>@52*)!  ''33=ADPN^\fnoz +/<7@=DEHHLNMPPTRSUVYU[YVZVXTZRZRSTOPOKMHKDDD<A5822.)&%$  |smgaYRNB@9-,  {nq]^QL@=1+$ {xld`WOIA75&( zyshh^^RRIH?=50/%& &'/38@@HLRXZeerq|  %45CERU`fox~ $-1@ANVYmjv~ (-3@?NL][gms{} ! *&0,50:7>=AABGDHHILLMMNNNMNMMMMKKKKEMBGBAB<>8:250-,%' yqpf`WRKC<6-+}ykkX]HI88'(rjeZUMD>6,+ywqlh\[WNPCH6?30+'"  &#*00;;BFITP^acmkzv (,5>CLR\bjp{} #/3<HKU\ejyx '(55F=UK^[ijtw # $#(%.)/./04356569679:6=57849.;,7,0+-%)$#  vqke]XSMC=8.-  wvfbZQLB83*# zvleaUTHA>00%  sxkmd`\VSMLEF9@07+,(&#   !''*0379@CGLOUV``ljquz -/;;GL[Vffsx~  0/@=LN\_jmy{ (+3;>IHUTbaqmwz    $%$"" ! !  yvsid_WSMDB://% qpb_SPF@8/(" xxjh^WPIG76,%%{urmhc`ZVPNHI>D885.0'+)!     '(,.459?>GGKQTX]_jiosw} "$,56F@TP_cjrw  $01@@MRYgcpyz   %,26AANOVZdconxz            vwoje^[ROHD>73(* vrja`ROFC62*"ztpcb\PKE=<.."# swlli`fX]SVKMFFB@>8:264..))($$ % !$ %$&**.1.739;>ABFINNWQ_Yealittz}$+/:;FGSV^gjo|x  &+69AJMW\bjpw~   &.-:9CCNLYW`agmnwu~|yspjgb`WXNKH?>621%%~vsmcaXPP@D44)' vvlgbXUOEF9;-,$  ~uxpojibb`YYSSOLJIDEB?>;;6;0611//,0),+'-&),$+&+((,'-).,/1/5257:;=>BDDNFOPN[RaZbdfplvs}| #&-49?IKUX_dlpz}  '05<BIPT^^mkv|"**56>@FKNTW[bgfpoww}uxnogdaYYRKL@C780.(  xupeeWZKKA<4/'# |xpmd_ZQPDD78/,% y{pwjofhcaaYXZRTPLOHKEGCBB@?><<=9:9:6<3;78:89;=<=?;A?D?HDIIKNNQSWX\^`deimprvw|&+/7;DFNXW`gjtt~ %'/4:BGMUXbelry~ '&+30<;AFERMWW\]dbmirquyzz|utrljgbaZ\RUJNBE:>54-($" vtki_[VNJCA70,%" ~sqhd_XTLJA=:1.(" }~xyrtlnkgibd_a[]ZWXWTSTLVJSMLNMLLLLJNJOJONNRPVPZRYY[[_]ecejhnppuu{z"'*27;CFLUVabkmv| %'04<EDOP[^dinyw #*(016==CDMLTO[Z^achkmrrwxy~}~xysqokhgb^\WVQLKDD==55,/!'}wojg\^QOJ@?50+"wuochV[OKG@=42,%#{~uvrsmpjjiefbaa_]^Y]X[VYXWXXUZVYVYWYYZ[\\^__d_gbhhjkoqquv{z~  %+.88FAPNU__jksx)(51A@JNVY`gjqv{$#*-166?<CFHMPPVV\\`dcjhmontswxy}~|}wzruppmlhhcd^\[TWRLLFEB<>48-2&'" }vsii`]XSLJAB35++  ywqkh`_WTMKD@971,*$ ~~{}|y|w|xzzx}v{yy|z|||~ &'00;:BEJPT\^ejnux~ !+.39?DIOQX^`klqxy !"$(*/075;<@CDGIKPPRVU\W`]`e`helhliompnrrsssrwsvuuuwsvwtwrustqqrmrmlmhjegcd_a\][TYQRPKMHDE?A98530,)%$  }xrohd^ZTPJF@:9/,$! vynlgb\XVLNBD:820+'" ##*,379ABJMTU^_fiqr|{ !(-18:FBQNW\^flouw}   '&-+1156<:A>DCIGLMNQQVTVXYY^Z_`\c_d_e_fdcedchbfdcbe`ea`b]`[]ZZXVUUTRNRFMGEE?@?7;321.+'&$  vuokgb[[RPKDC;83-'% zzrnkg`aXVPMJDA;:30.'' !  "%,,24=;ECKNRXZ_cjksuz '*,46>?FJPRX\ccmluv~~  $"((*,/13477;9?<B>CCDFFGIHIKKLMMLOKQKPMONNMOKNMINHKIFGEFBD@@>?9;68330.++)%$ !  xvrmhe^]WSNKFA=65/+$$ vwpmhg^\YSRJIGA>964,/$'   !"(*.188=AEJKQTY_^ghpqw|  ')/38=@GIOUU^`einqx{  "#%()+--21345988<<<>=>A>B@B@DBBDBFBCCACBAB>A=A;>9;9773713.--(*$&#    {xsoli`_WWPMIC?:911'' }wxnogg`^ZVRPIHE?@955--)%%  "#()//4;9B@FLKTTY]ackksr{{ &)+42=9GCNOR\Ybdjlqvy     #"%#'%*'+),,,,..,/-0...0-1-.-.+-)-)+&(&%%!$!   |zsrljdd\\TUKMDD==44-+'% |wxmtcnab]ZVUONJFE??98613)-$'!    ! %(*.027:ACIKPTV\]cfimrsy{                    ~zwtqnjfe^_XXRPKKDB>;74/.+%% ~zyrumnhhdb]^WYSSPMJKFE@C;<6844/0,+)(&$"!     !"$&'+)/.24579=BDJIRQWY[b`hhmput|zz|uvqokide`^YWSQMJIBD<<741.+)"# z{vurolkfgab\_WXTPRLNHJDE@A<=996532//-+*)&)#%!! $!%%&(+,--01356::<@@CCHHJONTUVZ[_bahglmrrwx}} #().076==AFGLKUQ[Xa`ehknqtwz~~}ywsrmlheb^\YVSQLKGDA<;851--'%"  z{uvqpnligfac]^ZYVWRSNOKKIFGBCAA><<998755323/2./,-*,+)+'*%*%(%'&&'&&'$)%)%)'(*(**,*.-..0/314557:8=;>>B@GCHFKJONRRUWY[^^acffklnqsuxy} %&)./358<>BDGKLRSWY[``eekkppvxy}~~zywsqokleec^^ZXUQQKKEFA?<:551-,(%$ |zwxrvmpkkhgebb_^\\YXVTSQPNNKKIIGGCFBC@AA=?=;>9;:8986886766847565756668697989;9<;AEEKJQOVT[Z^abgglmosrzw}}|~vzsspnkjfea`[\WUTNOJHFBA<<6802+-&&! {|xwurronlikegcc``]]Z\VYUUUQSPPNMMJLHKGJFGEFFCDEBDBCCACACACACACBE@FDDFDHDIEJGJJKLMMOQPRRUTXV[Y\\_``deehijmnpsrvwx|{ !$&*+-2166:=>BCFIJNORUUZY`^ccfiimoosutzx~|}zzytvpqmlhjdd``][ZUURONKHGDBA<<7822--*(%" ~}}}xyuvttqqnojmikghefdccba`__]]\][\Z[XZWYWYXXXVYUXVXWWWXWYXYYZY\[[\\^]^^``acbddffhijkkmmpprsuuyv|y}~ !%$)*,/0357::>?BDEHIMMQQUUX[[_^acdghjkonqstwvzz|~}{{xxvssppmjjhee`b]]ZXWUQRMMIHFDA?>::6502+.'(%"! {~zyyvwturrppomoknhlhihghffdfddedccbbcacabbbbc`dadbdcdddfdgfhggjhljmkomppqrrvtxwyz{|~  "&%)*,//3376<9?>DAGGIJMMPQTUXX[[]``aechgljmlpprstwuyx|{|~~~~||yzwwttrqpnnjkghfdba^^]Y[TWSRPNMKIGFDAA=<:76521.,,''$""  ~}||{zzxzvxvvvvtvtttsstrsrsrsrsssssrurtutuuvuxvxxxyzz{||}}  "%%))+-.1154899==?ABDEHHJLLOORSTVXW[[\_^`bcdefhhjjmlnnprqsrutwuxwyy{z|{}}~}~~}}}z}z{yyxxwuvruqrppomlmijhheedab__^[[YWWUTRQPMMLIIEGBBA>>;:87532//+,((%$"    "#&&)),-.0236599;=>?ABDEGGIJLLOPPSRUUWXYZ[\]__`baebfeggihkjkllmnnopoqrqrrsststtuuuuuvtxuvvuwvvwuvuuuuvsustrtrrqpqopnnnmmlkjjihhfffcdbb`a^^][[YXWVUSSQPONLLIIFGDDB@A==::874512/--**(&%#"   "!%&')*+--0/325578::<=>@ABBEEEHHIKJMMOOPQRRSTUVWWYX[Y[[\]]_^___a`bacadccdcededeefeeefffffegdgeefdgcecddbdbcbaa```__]^\][\Y[XYWWVVUTTQRPPPMMLLJIHHFEECC@A?>=;;997744311..-++)(&%$""  ""$%&'(**,,/.1133647799:;==?>A@CBCDEEGFIHJIKKLMMNOOOQPRQRSTSTTUUVUVWUWVWVXWXWXXXWXXWYWXXWXWWWVVVVWUVTVTUSSSSQSPQOPNONMNKLKKIIHGHEGCECCAA@@>==<<9:8856434110/.-,+*)'&%$$"!   !!##$%&('*),+.,0.112345667799::;;==>>??@@ABBCCDDEEEFFFFGGIGIHIHJIIJJKJKJJKKJLILJKJKJKJJJIJIIIIHIHGHFGFFFEFCECDBBBAA@@??>>=<=;;:998776654332100/.-,,+*)(('%&$$""!    ""##%$&&('))*+++-,..//010213343546566787889999:::;:;;;;;<<<<<<=<=<======<===<=<<=;<;<;;;;;::999898878676565634332211100//-.,-,++)*()''&&%$$##!!    !"!#"$$%$&%&'''(())***+*++,,-,.--.....//////0/0/00000000010100000000/0//0././...-.--,-,,+++***)*))((''&&%%$%$$##"!!      ! ! !!!!"!"!"""""""""""#"""""""""!"!"!"!!!! !        hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/TomFloor-Hard.wav000066400000000000000000005403301366722712400235320ustar00rootroot00000000000000RIFFWAVEfmt DXPAD dataذ)L@N!%)"2654*3677F69;A<>378V9EPsYZ_byhqrl`URMJBc85,X  3(5C( ))woΧsYϷѵۙ>Mvf}zіO,( j,'8$1| <l"7K1j˗*JP37.:@ۻRլƿҕ߇-Kv!zt~ "D D ^R[kCN^}Q#y),*%~|!%&$#&,2Q8;M=~=X P'v&I,P =Ig412;= He"2^lu8.P *^,$ V+"o>i:  8E5EHL>B=^;VS=.#"$&'2(&$Z"?K[F #Lq&sh_Z>> '+_;7WNI%hJO(F{ <x܆%ՠ,ҵӛ+ |^)ߓ)QMݫۙٻ|7ܸLݫ>,9vh >NN a 8 .Q#2YI(^(-{= w ~EZvJlaikV=[-2E{z]//@fP*U  7FPayu b%#z*xm<C _jS fpTP| - O . gC9^ay 8V+[A?"3o[ 2=rc TB"Bz1\Kl @ R x  Zkbb?bH<1m HWk 7?eW,j \C c݆ܓި{g159#}4^] ,H" 2Qnn=)u[ ) ^Y80F"# < G d / 0 O)b7CH@qG % : W~h#= *: B J  R  ^O" O.t8 nOy0DS3OD(ߔwWYO{ֹդ,ܽ?K;|j)4LCS%*zZ:"w6 $ F  W a ":F&zuQq]*O2GM+BkU M !!"#$$###/###z"!V!@! f *  wZgD+, e B < U   Ng3   5 ,7l E i >^jL: gVo.!fB4 6Bg0g0\hqb9( Cq6 0z'RZZ 4 $ 1 H 5    \ r C ~_`gN  H PG*kn>)m:,2^i7yZ}<+ e#k&P9m9 =y%tlwoDkB*Ve%yFXhc(E$]97i~7R~-3~o(X'(`v{%^I7X #B5i  zH}xowNw ! !7!F!!""!$ %%%%$#2#" "!c! a  01gA+@-K - 9 $ z T~wF #r: l 0Fm 77 1 [`NQVr~tl0Sm'LOt0P_bkiM%\`?}O`\%]*9y l  v ( IX"CEp  ~ < i  N ZLK{aim)E@L$,6{[SZ3c!:Biy>/tV~mIC#Q|b7m-#b }XJ_6u+lKW[!YD%ze, w {\ J -}).B}G 7 q .  T hH#31<1 KH'v\[u!PO\ - S d z#A7huad ! X/'RI'aRlokM $ S e -  > q m  <"'"@^ZccW6V  =!{l1+Lxxh'Z9+|@7bra,Y\g+BZAln8*lA(! ?GoUK0a(Puo+4zRB_>o*B@9Mq_eU9yjkkG .ROA{=$X > -s2.r r@!Xo-]t3R@i\^@O`F9z\VpwJ|9h<30k?#8p6nGvG X$/{9C5P}x=  U B : D~B\I!v/qP2;=H5 1m$Jn 8 $  U \;K c i \ kEKbhXH{9 #c_B7?Em- uQ  ea[_p D%1J9nqL < Z _%),2!KD A K 5 I W. > , I N  y-\*$Xlsd]\wHi' C U @ m  c n>uir5$Or1MH69 UbfI4XxP 3o @)YbcZa6&7Wg+3_:L]/?K71X"]d^QiCK3B?9A`JtZRn3x=EeK 9_J.$MQ0rzfpPuX3`q[iX$Vhlg Mr oS8cm~i}tTD,l o 7iICXdjpzZ=@YlNg,0oC-58=_<798 * j + y W 2 ? t &  (XK" m  7 K 2 [ c N 4 [ ~  ?  J e v   # C H m  = 275LmgK.#7| p&  h ' U  D | + X e y I Z-TIbJ1Z (FV>I<n>[fTV-Y=#aPJ<U57pgUR/VK"`=Z{!t!_QznGx-ueyy:'Ogd_<4`N'efX0isxkP >{P>2@Nr cpd2#0r' < : B < X 9 ) L 0 J  ) N * p b k u   W Z S w d4~ou|<moN LpX3l'K?}^J^{ Ip3'Pta&=f v 8Ro )$2.i5^ O,>51; As0-QInE=) :]_ ?gllZ?aK\(GL}Gqj" #*S*d;&gi+j8/%`2SVHXgBw/mv_6Xi ?PV, 0GQ5 RT]v(OcYz?ZXRi+A=(M,a}X|eLQL- #2Tn}f&wUHBj 42Ml `*BdS( v[@ 2 u * $ } +a#a  v O {9}7Q *G0df-y:t  c { hhr-iU5&" vf R , d N Z  ]V8q V#- I ] o j n n @  aRRNgROwro]gg2W[u/TmqpTB-6r?zHet*3O^  &lR=cJo;;L8n:N 8^655-("=Pl|A!:h@_L5)SR L6yG`KWcLN]Q"UN9@!1a&?d,R{.?WN@Uz(g\:#k+=3-CZPh ,Ph}~q*Pnft6na%tZn Od d 5EZ3YG!aL;L|J(HAgeabTrkcakqd[W]U>)!+.. BvG)! 9W_o:! 5 e 4  # y  K Z!Yula=$,On.l1Mv  D " u <  | \ A % v  xATCBjG.u\QOjZ$f/Dh: IpIEexjN=','=A>$c>'S3Em$z__Tuuvtc4Kn:5Oat0Z;rU(i.@Ify`Bd9v6tzg@IiZ#M&4Nhyp>#AK9(\nojgrrpj(h/~;hT@R{kD -LRYlzpu )] i  - G t } R 5     Y $ `KQk_Y  [gTG@Ecb<%8V_PEX&2>UqwZ+wEsT8,_F8@Xk~pWQXe .`H^S  > u   c W c ^ a S W : C X(}ZD])W0  rT= ]hg kt6VXtd=)&3+TH+p> yK- %Q-4lZ2AJAOmzjb\]I- nbHS&rB"wYFHE:++ (1.@`~$HhZxEPoC*w"j%b+\{xQ|RT CAx%2yT-;Nn?   #2MpClLx UtBO+o_$TkjWTOZzsW?6?L\l{I-%T>m9]s6/ O/`Q<l <{ ' D a {   , A V k * _  0 Q p C k #B^mHx,66+ r>v) g  P  w 5 s W 5 ' %   w > |U(xF(woc;R'v>_(\&uCh1 8Zbnl&`AZ!<8/4>LMG=+  xU8h?/ w?ubK$fU=~%X6cyZU [`hJ3A-  "0@Zs?w+Qp/>_.FSVTBIKM+fM; s{$4_k Ye5 )MANg> zl|m=M | + w  > j D o { W L L O 6 b J 6 ` J D U ` 6 ]  + B g - m ] D 0  a % s [ / } t o X .      (  \ 2  X+ wR4zSA-)$|]QHa~-HnJ S v@ 8k Ps-9/X2[GN l5ppV2*WC O]#n*AF:%L]ow{kX@EJ_Yf%M 1Xs }m?p=k(rWA& #%"'& 3Ldx1:R^+F]?dxx]OQOGQ\w1wW2z\XI|+odF<==U!o \  = o w ^ > ! 0 [)y^Cw~~   ..1#&/:KLKG>A7:63'\+MiJ9uusxu}zrdUPWn +E_u:[n-8FF?>;99DFBB<6F[u*X Bq . S f ~  x b W F B .  U,lN4$q\5y8HeDp;@{=F `24YEdu~tQ-qP9!d;{ug[E1 }iVD+ {fN4nO!wK'^%_+_"[4fN?$?b(l/t7h#qC.Ffx .@QagWejtc]N?GJYKNh+ m : [  F u  W " F b j n K ) f ?  | ^ Q M H D @ ; ,  u W 1 e ;  }m^UZ^mtw\F6re[H&c7p.i)Ub>"X*z`<}Y3zU-iC2!/BNaiutnryndJ7$vj]URQLB;35,**)6/}P Y(rHR%e/kR=pGON em7 ?`En)Oio^JA$|jd^^ahv*\0RyGx-E`w+7;A?N_4@JVk 'B]v /Uluvm`XVKC8+&1G\w .24-77EFLN^[]^et$8@T_x)74734578969:K_o-Qd{-,<CQ]epsy  #4P~4]J0b iF X0rgMI?FHQ[q%=^)X)[ 2 a ! E k 7 J X q | c ?  o 8  R  Sw.b!c&R8#! Ts7 QiAh4|hT>* }`L6\B%^H5%'2;@;A@P\_c[SPQ?8#^>m'R(U!`1w{&?Nn"2@Xl>Z';;-}tpph^SZU^ah`][j} %:Tw6Pcr{!)8Nh}Eq0Li#CThb]ICJSZR@1%2226?KT`cl}4Jg@1fWC~Sw  0:APew)Ag%8Ml-=HIPVnveI;,s=cF cP5#5J`y#5EAGA?>>63#`6Y'Y$R0 + 2<PVden{wsnp{tmYH1wbX>-.39?JSXLGCLLZ_higU@<4+ Z:bA l<c>rHuD^5q:~bF( lW= tfVO>0~wlblpwttssf`QKOaksk]J?4* #7I[p,V ;[ 9Rp,Rp !-1CWw  /58>9KHNF92+/3?CNgv1[w@X 9_{$@\x+?Scp{=Y}5Ne-FSf:a(;Kc%&$+'.ys\J6%naPF@>:.(3CR[js{|+@BM_|'2?FR^ouvqw~~lbcrrcN6%!zeXF7$ yp`ZNG:,k^H8  vYE%pH( k:bG+bF yR3_9mCiL5 nP3" |eSE7&-;KWbns}kchvrnja]bjimpyv$/BHLPas/Hbm%398AGF>66381*# "(30t"h -Ft ;Qg8Rbqt}nrfae^R?>;1, uiXOLLOGE5(  (1FUk|(8@ILJEE83"|\; V.}S$P_4 xnns}y{qh\T\l|#'5KV`]Q\\kd_L>92-+ |l^F9!pS@,}j^NA6/"+.5296==FLIHJKNRNA.$&<BA71% '+#gQ-hO.#--#y]?hE)X.{KyY7yX.tCnV9$vy.X'Gl"b#Q1X)Dcy !#,2BWn )@]t#-:HWo~vwusoi_WPNJD6! xbQ=%&Kv!S{S2l!Gq5Sl +3GO\bqu!  8Set{6Rx-V/a:`  + + &   ( 3 @ E I D < 0 '   bJ:.!{dRILY\PE40$ lPA-gC yW:}Jv_WE@<<8=4"  xbI7,wwmjbhgnwzwrkd^_VUJI1&r\D{T.sP6$!4@KU_elqy~iYNG3 vbN8-r^I9" wbTD.|naP2//1/  +8IUn!7Mhp~(19;DKS^jy "!%+:Kc{|rg`__fkgfjpnruz} )/FN^m(Hbu @_|.Uq*355@Pho~~wr\VXSPNPI@71*#  "*:J^iu ".=LTRVSTV[_if`K93!y^M-iH$xjO9wpl}}vk^F:# uodXG0' pbSD-m^I='{jfTJ<=:4,(%~tg]ND6"_J-sbC1 ubZWOJ?EIXbmfa_`aTRDFEDB459>;3+& wdN4 xQ7 bL(&2AVl#?Yp%KmI},W{9Sn|"% pR7kXG9, .3?JR]T_h|;CLMNC<4' jR3zz{ywsd^OOPRW`emkf_`ehjoheXRHC7,&#$ ykX9lN#qH'rM0ubL2# vuzwvgd\VH<&reVG6(uscc[a][QKEGDIJNXXeenkqlktuykfdjpgg`gbpihmgf`_`a`b^[TKIE@:3+# hJ,d3 uO(j?} )1B\n -3>L]jpx *;R]j}-9Zn/M`|6QoCn<b1\,Lf+7FX]jhvv|wslg``[XOC<<8,"    '+*+(43CFORWY[XXV]g}'9LS^gq{eQ9ucE( 2CXj&APcs}'/8B?GGKJOIIIUcq{j]RF6# t[I+mCY5x[9j=}Y5vnUF% }qfXI/ ~s^YHH5* %-6?K^t#@Xm~ 8J[n+3DGML[hu #'-'-*+-4?HTY_[[^\_^YXWV[VTGFAA=;;;=5' wncZQ<748=?B:EDV`lx%@_| /q[A#w_A qO5p^K?(q^J<2& s^UFE54*&lZC+bF%pdQ6mYLBDC<6,%%%$%'!/+>@MRYcglor{ocXJI91 {aL9-& {rh`XSMGHA=5*$ ,9GP]ft-Fh *A`u1Mg"C`z&ASi0Fcw9Og{5FXhu-5EO_n{'5KVs/On$5H_q}j]E5 x_B!m[;% n\N=1) #)'-&,2:>CR^p!)3CLUXXQVR[QSFD;:2-"05GO[bjuu !16CJTY^T]\cdbXTMIC91#m\H3# |V< xhSF1! ~}rdQ>* uiS;"r]F/u_L5%wmhZPD=)thaXN?3'#zoib\VNMLJG><322-+%" )*/*.-058?CIR[ent#2E[m$7Jdw-?M\i| +6@JPU_fnrr{w 5H[i|*G_{,H`z"@^{3K]r".:IQ_j|$*6@S]or|0GYn{  (.03373/%s\>+eX>&cI,nI$w^5iQ>( yzsrke]]WZTQIA83-%q_P@8/&#ztkf^TRKHKFH;=45/1-(  }qmh_QK?:/*! %*38=DGNQZ`gnoyuwqwqsnldd^^VPNDF14 wl`SKA:-& |saYKD=50),'-'%   $+1.9;GLZfkvx!)9LWfs " %#)/175433767548471//))/2:7:7=>@HITT[aiw~ $+>DQZm}+E???CAHIRWX]Z__bfhv'<Ncn|vkZRC<3*,!"!$&13;ALWfx !4Hax 2@Wau}hW@4!yodWJ@1)$$49EOZbkjtu}pcUP@9$d@f1 S'j8{L%U*vV0 zdH8$ ",-76>:B57.0*)"&%}umedfiookdWRJD;1+ wrg`[VTSURSPZ]ceit{ "1@QYly #!''+(,,2445./*1)-&'!"! !)(-/33::CLTdcx)FSiu *CXm1Gc<Sn )Hc%=`w.Ih!:Tj/F[t  mhSVC;$pbNF2'zsqge\XPNOLE>6879799?BJIT[dcfjsy|ynf\QMAB60# nmcgec^ZX[hfg^[VYRSNLNMNJNNRNJCC>72/*%   !%%)+*&"$$zskaZPIA41)+''!#*#,%-/3/70696932)'"whN8oP8vdU:.{k]MC,vdL7waF0wiSF6/ %0=HXaw 0D^v0DWn !)19FQ\clpyz{wrmfaYUQOGD6+  &/=AQ[lx  #*-28NQeoy}xsloiigadXYTRJF@9;5<8:;=>=FGOQPY^kx#1AVfx&;Rkw&8AS]l} #18MXeou|  pgYPD6+ |bP6$ sYG+! ~jSE5%zl`VK?6*" xpeaWO@9,' peRI3$ z{ousux~ '!(&#'# webON6% xbT@4 |qk]ZTTRNJFB@;:92,'&!#"xg[D8&tc`WPJ>::47*)(&)$&+%&(0167::?EFMFPHQNQUZeny*CPdp #4DZj}(7@PUfu&7FR]gv3CYix!)8GRbr"+3>GPS]`bijs}|'6CUcw,AK`s&5<IKVYgjv{yztrjf]ZRNBC49-*  }uplia]TRJKC<7-&! u`Q=)iM4fL2q[D/ wi_YKJ;<,+%().-98GLV\[_clr~}mgTK=0% }teXH5({g`LG5* *.5>AHJLSX^dms{yz &')/6>HT[fltyy}uhaXH:," $2CVey-@L`o%4>LR_g} #-;CFIVZglnw|$3CWclx~#)9LVlr&+24;>IR^gmpq}  "#%'-++05<?FAJCA;6899870.)&sgVK>4-~gVC2yhXK91 }vrmkkaZMF?56-*! rcWH9-%|z~|uqggWVIB=63, qfUG2 k[H4 |pcTLB=9-+  $##%#)'+/.4;BMR\alrz{mdYVKF<51+)$ 14HO\m{,BYo*D_v(Ia,>M`j&*.35<<=?@;?7<9<=DFKLQUTZ_cjjotz )7CNY`mv#,.59CJPQYX]^`gjnnpqosrvyu|r}{}} !&2=FLVWackluytofc[TTOKC:3+# wj^ND1. {wxwxxxy{~||x|vsnkijif]VTKH<7'pVG0# m]L=({jh\VIF:=43/,-+.).)/,127><:9;59-+(*%" zuhb`XXLHB20%" }uplf_ZNL@8/$  wle\WLJ<=31++)'.-2336;BNV`ju$/>JVdoy    ".2=BHX^u|.;MVgn~ +5ELZbkqy '5>Q^m|+=Xl#9Zx6Zz ,Ei~/;MWgpzsldWP@8*wrie\^V\TYQYPSFK@DABAAD>B<93,,((()))$%    {qeYOB6-sj[VGC50% }tjlamdgfahchdedc^^\Y]VYUPIGEFAA=71(&  zqig[WMC<1-#"!""! rh[I9ubG6 tU?# sbLC." !!!$"%$$+,12197;=AHQU_]b`eiks"'26;CI\k(3F]o,2>FSamy}zpbYN@<'# ~upj^SE=3.%   (1=@IKQUX`hqx )9HTlu3I^r )9IYdo|$0:DHT\jo{y+3>CJNS^fw4;QRcgo{xxtvsslkompqmhheheffbeebdYUNILA9-!zsZR;/! tnd\WPMI>:1/,.%*(%,-(!   sk\J@/. r`RA6$ufTD+s_R;. xd^RJ@1'xneWTJE9/  wqcYND?3/! +7BIPSU`anv  .9FQ`s#4AS_u%>Hco%,=AU\jsy$*-7=MS^gp|)5OXgu-7ESeq}xuvqukjejlmmljflkpw~~|wvnkkcjbk\aVZY\X[NPJOLLEE==57,1-&%       !!!  up`UI</ zh\HA0& |wpocaRL@6/' zpfYOD=8/$xhcPI=2."xssmoccWYPJE::10)&!"'%59DMS]bis{     &.9CPYgu&6=LV_iu  ):>MYey 0;OYfr| '39DPRahpxz %/CN]fs%3>MT_dpu #0;DPXdjsw| #"*(*'%"rj\P9- {`TB5) wrkf`ZUMF?;72-%%"   ~phZSE?/( |mb[OH=90($ ~sofeXTHC5,#}oe]RJ>0' yod_[RPE93%  {xrtik\\RPMDD991.!$19CO_jx#-?Q_s{&)66FGOQ[_gfoowwwvuuyx~~z|pofijnmojfc\a_bbbefejchddikvw}!;DYakr} ($,+)1*1/1111.)%     ''41;AAEGLUVa_fgpsz~  $(057@CLPU\_bbchnu"&-6:ENU\dcnms{}wmf^^UVNLG@?75.%%  "%&(-.8BJU]en| "*8;IHVTcet|}yzwxpkb]\STIJB?=73(! ~qk\UI=0xhXI7$tcTA1"xiTK3/~nm`XUIG83$pg[RH>2*  {rmhg^]UXW[]bfekhoonopqxy #)53BALS^hq|%4DRYmv #/7BJNXbmx} (58HL`gy'/>HQciy#)3<ELQ\ajr %+9AJS[eo|xud\NB2$sfUE5 xoi_\VQMGD?==>?BGFLLPVXb`ghnuz &*.3376<;>@BFBJEJHOJNHGEB>A=;:88:8843/1,/+//,/&0)3.4/2-0.//.00-0)/*0)/*,-%,#  wsd_QH?7.%zwecUQIC@9931,$  |kaPL7/qgQE0# wnbZPH@82))  ".48CGPT]`ikqy} !+-3;?KNYchx|)05BDOTW_elu}  #(+12:=FIQYbdmryx&04=?HKUYbhpsy %5<GNX`ju~ #/8CHPS_bpu|xplb]YTNJE?;30*% vg_PE5%qhQG5+ xl`VEA-+  "!)(0027669:=<=;=:8:430,($!  }zuqlbaTTD?4.%  ~rh^PJ80& {wpleYULEC:73)&~yojb`ZTMKEB<:927445/1/.-)/-12331213131488=>>BCCIEKHOLQSZ]bilrx{5BXcy6CYg{ 5DTfq      ! $&*13>>FJNTVZacglqxz+3CMYdmv  #%+0.95;:>AHEOKPOOVUXW[^afffiglkmrt~|      xungb]VQGF?68,0()&"#  xuki\`PPGD?:3-' zwji\ZPIB91&ztjeUTDB94,# {yljd[ZPNKBD;:.-%#   !  ~xqif^^WSLHA;7-'   '&9:ILY\hpw "$14=DGLMTRYV\\__fdggkgiaf^_]]YWUSZTUOKLJJJKIEJBGKJNQQYX_]dbjms{ #-@:::89;?@AAB@DBHJMNNOSTXYYWXRSSSQPKIE@A7;421,*   '*/:=GNSY`cipyz ,.=ANW]lo 2AM]mx (9FU_qu'+2>ELWZfhrr)/9?FOU]^hellqt{w~w{}}~~wxvurllce^_Z[STMGE>83(    %&.078C=FEGLHIKFOHMKJICF=C::50*$   }vpki``WYOQGFD<=33,&" wrbaQPC<4(& urhe\XPLFC@<8988802+.037;<60(% ypg\XKH:5(   /3?GQ^fvz$+5?IXbsz *.9=BMT]fouz~vtohjdb`V\TUQUQTMQJMLPTMWLWSYXZ\\]^^]_ddfgekfhec^]]acedebea]^[_Z`Zc_eeighihgfefgjmkrt|~  )2:DISYajn-8CPYclu   #)-05696:8<9:<;88:6<6<5;8775545/.,%,%,&)(%%'$(!%$&!%"%%+-285=>AEEMLQVYeenqzw~xzuslc^SSEA7/+  |rngcZUOEA78//'%%  ztibXOH=61$ }uleZTC=/("zrf`UMC64*$ sqb]PI;3'{zuqkkfcbZYQMPJKHHHFIHQQUWXYadkksq|##-,:N[et}$)38ACJRZbglrx}!)+18<CGKQSZX\els| #(--94=@BHKJQSX^_bdeffffggfnfoljojmiff`c_``^_[^[\ZWUVQSMPONPNNKJCG=A883--')(%%""!         xp_WJ?4'ufWJA1*~xpfaULD<4-(  $&-.4;;DFMMTQV[]]c]kemjmlonuoxq{t}u|uxwyuuurupupqstquqtmssttqsporoqnomlmknnuotrqutz{~}uuklb_SR@A1.#qdRI4.xqb[QD;1& (+19>HOXY`hjsxx $).088AEIMVUfdqvz )/83)(  $%$&)*/-0/048:>>ADEGHOKRMRTY]]\b^ebeigpotxx~} "&.5:ADHNR\`jmy{ "!/09?EMTYfjwx   &!,'1+32527/756885:7;9977551//,0*411/1.2./*'***.,14070757::<?=GDNKSU]]g`jhpwy "%)--5/96:<=>A@CEELGMFNEMEKGMHLJJJJLKJJFFFB@=862/,)$"!  vpha\RLD;2(wh]OD9-%znhZWFC8-* |vmi]\SMID?71-)$}{|wtqokikhkegfdedbf_acbghjmortwx{y| $&-.66>@FINRV]aglrwz  "*/4<@ENT\blpz}$/7AJTaiv~ #+:CNYfp})2@DV[ho{wwljd^^YWURPNFE?=87544.0+*($%$    }z~xyxtxpwnqnjkifhbd]__X]QXRRQPLIFEB?<75/,(!! }tibWNC9." }mgXTG=2)}}zyyzzwxvzuzvwwwx~|w~xzsvoombf\_YVTPNGFA><852-,+&($&$ "!#"""(%--067=>?ABFEJJNOWX]_abacaidmiloqququtvvvzyy~y}xz|z #',6:BILU\_elow'%//67?@IHRPZY`aejnsv{{ #',.259?CGJQP\]`gblmtz{  '#-*2073:8>=?<A=E=C?=A=A<<5522.*($%  z~zzwuqrlnhhhbe``aX^VXSSGK<C;=872/+'}|{~z|txqsquqvnuprqqqmljhfac[bZ_ZZWUQRKJD?:521(*" ~{rrkhb`ZUPGF>=78/4),$"!ysgaRN;8*{ulhcZXQLOCF>@8?5>7:97;8@<=B>IEKMQQVVY\]cejkssz{ "%)+,/1373?8DAFHGMLPPVVX\[^\Y[X\Z__^_]_]a^dae_e]a^Z_[]\[UWROKLEGCA>A49311-/'+''%%##""!!#"""#%&)*/56??GJSU^]ehksw{~~tvkodh[^SUHN?D78.*&xskfb]SSDH<;11(%yrmb`RSDB71*$|xonecYZUQNHGA?<33&-!% yvoidZXRPJKCA97636/1+.*,-)1(1.4599>AFGONVW]`cjou|!+1>ETYels '2=GT]jp !(4>FS[hr| $03@ENT]dkwx !)/175<AAJJLQLVPYS[[[\Z^Z^V\VWRONFE;=55..(%  }zyuuppplnllqnspttrtrprpqspuqssornnokkmhoinjjljjifjeeaa``]^Y\UXVRRLKFE@B??<?79./(&'!%!yrynpijcb]ZTWIKC@:92-+"$  zztsrmnjmjjgegfficleminlmhlgheifhdiehgigmhlefeecb^^][YUUTRRNLEG<>773/)%" usqgk__WSNLEA>9:23)'    %$--36;=B@IFKJPR[\adjmpttzz $&54DDQV]kl}})2<EOXejyw!+,=>LOX`jq}  %*1<?NPX`cipuz}{wtrmnhfdc^`V\SVORLLIHGGFGGBE@E=D8=7653532301/+-"%  }qvlkg`^YUTMPKKGEB>>974/.*(!$|yqje_YTLF?96-"  |wpme^[QNDA76,) yslf][RPIC<82.*%#   !%-/:=DIQVccpw$/2=79/2*($    &-/7<AFLRWa`klqxx~xkd[PG=3)zwc`NG9/% {ygfVRD>2+!xpia[QKC;6+' ~upk`_VNMAA:50(("   *'129@@LJTW`cpn} $!'%*++-+,+))(*()(&)%'%&&%%%!#"!%""&")%(*+1249:>DBPI[Weeoo} #2;ET]lv-<ASZhp{   /5;GISX_clrx~!--8=EMWZehow}|snia_XSNHC>850,*"  {rsdj[]QKE=80)"xrndbZUPJHC@<8611(.&(% "   }{rrihb`Y[NPHFA<46..$('  #%).09:@BHLORY[aflnvw~{wqqkigca\YTRKIF@?954+/#'!        ##+,46>>IIQWV`^egopw| (*8;HKY]jr| +3?JP^cst '"+*--/116386::;=;==;=;=:=9<967455163655:6<8<7<8=;=??CECFHGIKJMNNOQRVT[TZXY\XY[VYVSVQWPQNLIEC==45-,+"#ymd]PK?4/wodYRC@21!"}}vuqmjide^][YXVTRSLPHLIHGEBD<:<5:2401++'!$ |rqeg[ZPOEE=86.)%  !"%(-.42;9>@AFFINMPRTWX\^bagglirmwuw{| (-7IQWccpr{ !"&$+*0.61;4>9???ABDGFHGJLJOLOPPQUQWTVVUVWXWYWZWXXXXVUXVUUTTSPPOOPMPMPMLLJGJEDCC@B=B;?9<98:7:;9;98;969191515121/3.1-/-,,'*'%& "  }srih][TOLAA75/("  ~uukia\TNFC;4-#{|zvwvswrwvwzx}  "&)-258@>DKGTSWa]ieonux}#,17BEQX^jrv$,06BAPQXbcmpx}|xxvrqnlfg`^\WUSMPHGDB>=7733/+)#&       !%&*.167=<AFDKJPVU[\_acgfkipoprpupttrxuwwuwtvpupsloikfec`\\UWOPJHEB>>33,(! }zrhd]RPB>9+(~vpgcXULI@<32+#  "")+249=@GJOTX]`eioqz} &(.25<>DIKRT\\gepqy|"%-05<?FGLSOXV]\```bacc`d``bY_TXQQNLHHDBA<>7742./',$'!" "   %!%''*-.21668;>?BGGPOTW\^bcglkrpwv|||}xwxqvnnmghb``\\XXTWOPMJJCD=?772/,(&"#    {zvsqnih``YVRMJFB@<;640+)% vrofd\XONBD59*+!|x}vt}v|x{yzz~|} #%&),-42788>;DAHHMOSXX_^efjonxy}         !&),126:=AFJOUW`bhlrw{ $',/56<>AGKKRSWZ_`dggnpprsyy}{tona`VRKF?<2/(!z}zzzutqpjkgdc^^\UWQNLIDB><731)*#  {|vuqolhfd]]YTTNMJFD@>;8701,)%# uyqogjaaaV]PRPIJFAA=;7630,-'($ !   "#(+/57>EGNSV_ciry| $-1:7621--'(#!    "$(,039:AFJOS[]gfts|  ""&'(+.,.///0/0012/01,/.--*--.*++**'*)'+'.(.*0*2-415:5@;ADDJGNORUX\``igposvxz~~wzqqmkba\VVNMFE:<2/($   {xsoofg]\TTLKCA:81,( ||uvnrgkca]ZTUMMMCF<@783/,&&! |sogbZVJJ<=0/#$  "%))/23::>CFHNRT[[aeklwv}~ #-4>EPW`juz$,8@KU^jq~%(,037;??GCKKKQKQSPWSVWUZW[YZ[[X]W[YXXY\XYX]Y[\[^Z]Z^X]WZXXZWYWWXRURPTMPNMPJOJHIFGEGADC?@>==;<8;89896<7;798;99;9:;8>7>9<>=>@?@BACBDCEEEHEIHFKGJHLGMGLIIHKHIFHFGBD@?@<=:8745/0,,'*$' "  yzspmed\ZSPHE=82(( usje^XSLI=?41,&#   % ))-0448<>CEJKPTUZ]]cdelgpmtuvx{}~|wrsjjd`]YVOMLAD;;33)+#"  $((1089@9=88723312.--(('%$"#!$ $"  ""&%((,,1.24589;>@CGILORRYY_bghrjwt}|yxrnkfd[ZQQJE??37(,  {rnhd]YPQEE<940+&#  ~||wztwttsrprnrkonnomnpkplqmqoqtpxozu{zz ##+14=BFKTUb]mmu{ &)/7:CINUZaemozy ,/7?APP\`hpu}            }}ywtmlhcdZ_QWIM@@:51.'' }yrpjea^TXJNCB;=551.*($$  {usmih^]YTRMHH>B6800))##     ### # ###%&%)'-)2)3+4/4374<9@>EBHDLHNMOSRUTWXX]Y^]``_acbeeeeedeceeceacb`a^^\]Z\XYWVUUTTVTWSUWTXTUVTTVTTYT]WZ][a]baeggmjsmwq|v}  #"(#.&0,1042687<9?=AAAEDJIOLSRUXVZ]\a`dcjknrttw| !$()1078?@GFNORXV`_efimrryz}~~~{zyuxqtnpho`i`a_Z^WXUTQPLKEEC??98741.((!" ~xprff]ZSPHF@<55+-#$  ~~yzqskmdf]aYZTVPLNFGD@@<:945,4*,*($# !  wxoofg_`XXRTLNDH?D>?=::87:6988:<:=<>@@EEFKLPRTZX`_ghnpwx~ "))/65<@DLOUY^aihtt} !&047;EGQT]\ketq|{   "'#&'((-*.-//0.0.2/03.5)4'.')$$#!  }vsojf_aYYUOOHHB?=98525-3*,)()&%&#%%#&#%&&((*(,(+**-.+0*1--1,1,0-/,0+1.-0+-++()$%$!  ~|xwvsuponnklhhfedcaa__^]][ZZUVTUSQPOMNILFGDDA?>9<49/3++(%#     "%-,65@@HLPZVfappy~ (-.59>BGQMZX`bhjprwz| ##)'1.679>@BGKITPZX^abhgoltsw|z}}wtqnked^[XSPNGH>>932,(&#~wqpfe_XTNIC@95/($ }vvrmneibc]Z\QWLNIHCC?<;94501,+)$& "      "!(#-*.0154<8<=?ACAEFGLKLONRQQTSTVVWWVYX[VZXXZTYWVYUXXTYWTXTTTTSQRQMTKSKNLLKLJGJDIDFBGBDCBC?CB<<@=54/'*~}xurqkkgibbaZ\WUVQPQHKECD;A79520.)&%" ywsmjbaYWQNHD@<64.*'! {{}~z|{z}z{z|{{|}~ !)(/159=@DKKQTW]^efinruw|  %"()-/032779::@<AA@DACCECEICKCIFHGHFFECBD@A>?=<<;9:9986957577888::<>>A?EAIEKLNSSWZ\_bgjkoss}z{}xwurrnlldj_f^`ZZYVTTRQRMQLMIMEMCICJAEBAB@A@=@<=<:9:989392813111-1*,*(('%(%$&%%%"$# $''%#"%!(#)&*(-*//024599;>=BAFDJHOJQOUSV[X`]bccgihmjrltrtuuzvzw{zz{z~{|}~~}}zxw~z{ywyxwtwqvosjpkhifcba[^VYQSMLHHAB:<740-(("  y|uqqkiea][WRRLLFCA;;44,+&$       $"))-1095==BEJLSQYX``hhppyw#*/4:<EGMTW^eforw| #$.,63<?AGJNPWU`]bhfnlprsvuxx|{|}~z{}|~z}}x|xxxvwvrspplnhlci`c_Z\VVRPJKFA@9:21+($ }}wsrjicb[[XQRKIHBA?<87311(-"' ! }}|sujkeb]YURLJEC<<703'+#    !&#+*./364<9@>DCHJIOLSTTX[]^dchglkmonurxw}{ "!      &%),.155;;@BCIKKUR[Ybbfjlrtu{z  %$.*3388??CDGJKPPTTYV[X_^``dchehgjfihhjhhgiehggdeddd_b]_\YZXUSQNMJHGCA?::450-+'$   zzoohd[[QNID@97.+&  }yttmmgfa]]UXOOLGGAA=:943,-$(#   |~yyzwwuvutvpvqurvruzrzuyyz{} $(+44AIHQQZZbcjkptt{||zx~wzwuvsrppmoimfjdfcb`a\_ZZXVRXMUKQJNIKHFDG?E=C9=896856421102,0.*/(+()((((&'&$%##% $ $ '!# !"" $!#""&!&$'$(&)('+**/*1,2.60749699<;><A?ACBFEHHLIPJQMQPRPTSTUSVUUUXSTSTSUQTQSQSMTLQLNNLKKIJGHEEAF=B>=>9;9:7:693744415030100/.0,0,0+2*0,-0/,/+/+,+(.&*(''(#%"!  }|yysuoqnmlijegeecbc^`]]Z]V[SWSRONLLFKCGDBA=<<8:37/2.+-'($##   ! (&-048:=DDJNPUZ]cbjjpuu~} "').44?>HHQSY]cfmquz $%+,00679??G@JGKMLRPTVT]X]]__b`fbfggihiljkklknjoknkjnhjifhhdj`g`a]^Y[VVSPPLJIDD@>=9740.,''!   ||yvtopkjec_\XTSNLHG@A9940-)$# yutlkea[ZSRJHC@860.%&  $#*+-56:?@DILQTX]aemjvt{   "!!!! "!# $ $ % #$ $""%"&"&"$'%&"'#&#(%+%,%,*(.(1)1-0/004135182959899:9=9=;>;=?<A<@?@@@AAAC>C@D@BABADBCDECDDCDDADADCDCFCEDEEDEDGCIAIGBFBFCDCCCAC?@@=>><<;9:86745214-3+0--++()%)!* &!$!# "    &%!&%'((*,,-113395<9<;@>BCDFIGMKNNOQQUQWUZW]\^`^cbdcehfkfrhsltrsxwy|z~~{{wzttrqpnjkdec^aZ[RUMNGFAB9931,+#!x{rrkkcd_X\RTLKDD?<:50/**#!}zuywustpunuosrrtquvswvvzzz~} "&+04:>BHLOV[_jhqux !$&,10;7@@FDMLQUU\^`fekjppvuz|~        txlje`ZXPPEH<?821,(% {xxwrupnmikgdg]dY^XWTSQOKMDICB@<:;4702+/&+###!       !"$((/,0474?;DDHLLTR[Zacekkrrxy !%#((),.-1026192:78<9>;?>@@A@CADDDFEBFCDCEFEEFDHBICHCGCHAIAHBFBEDAG@FCECBABAB>D;A?<>>;>;:9;898;57556354344351808146353475667797>6=:=?>AAFAIHILJQPRVU[Z_aceijnrrwzz|{}{v{rvsqrmnjlgkbfbbb_\][ZZYYXWVTVTRSRQSOQRMQLPMNMMJLLHOGJIIHIHHGIEICDEBE@DA@A<@=:;784613-1*+(&& !  }w}qwmokfeb^\ZUTRMKIEC>=874.0+*&( %   "$"&%*)-+/2264;8>=A?DEDKILONUSWYZ`baefikomuryw}|   !'(0/76;?BGIMQRXZ`bgjjsry{}~zzyzrtnoljed^aZZVUOPIICB><66/.*#$ ~}|{wxuqvmrmlmgkfeecc`^a\`X]X\XYVTYRXUTWSVTTUTVTVUWUXUXVUYUYXX[W[Y\\[Y]\\][_^_a_babbcdefdhcghgleogmkmmplsppuovsvuuxwzz||}}  ""%'()-*/.10214384887999;8;;9>9;9:<;;:;=9>9=<;?9?8>;9=9;;9;9;9;;::;9<;9?:==<?=@A=F?EDCGCIDKHJLJPNPSPWRUYT\W^Ya[c^hciggmjonrqruuxxz{{~}~~zyyttnqlmiggbb]YZRSQLKHFBA<:752//()%"  }w{urqmgjac^[\TVPPMJGDD>?;9864-2*+(#%!       #$%&(+*/+4.73:8<>BEHKLRPXU[^\c_gegifljknlonnopppoqorqrqsqrrpsppoopmpmnnlmmlmkmkkmkmmmonoqoqrrrtrzxxzz{|~y}uyqpqjmdfc^bZZXTROMLIICC@@;9934..*'"$    " &%()(-*0,11021235162451613301./0*,*((#'!|}zwwqunqkohodieddbb`]^]\[[W[WWXUWTTTTUPTOQQONOOMPNPRMTMTLTQRTTTXTXVXV\U]Y\\]]a]^b]daccccdddededfdfgcgbjaibjefhfggfefedfcdf`fcceaeaeadadcdcdddeeedgdhdhejehiiilmkmkpkqlqtoustwuwwx{y}z~  ")+25:?FFQQZ]bfopw{ !!%'*-2074>7@=ACGEGIHOJPQOWPXPWVVXXXYYX\X\W\W\XYXXXWXUVUSSTOUNPNNKMIGIBFA?@;::5702-,*%'   {}rtmje`_VXLOFC@:92/*&"}}zxutpollegca`\_V[SVNSHMEGCA><<4922..+*%##      !!$%**//348;>AFGLNPUV]_bfjmrszz}ytvrqmkfeb]]YVTPNIIAB=974./'(  z~uxqslkkehaa`]^ZYXTWPTMRIPILJIGGEEECD?E>=>9>:8;8846332./,+,'('#$"!    %%-+237;>@EFLMNWV^^eeomvu|} #!(*0169>AHILRRZ]`ejjssz~                }zwtrnmifbb[ZWTQNLGCB9=37/.*'#! zv|uwutqrnnmklhmgjdjcgeeeecedbdcbebecgchhelgkllmmqmsquvuyv}w}{}}}~}zzuwsuqrpqmrjqkmjmfmfiiehfggfgefffeiehgigkhnjmmmrmtruuxy|} !$+*137:>ADIITPYY]bahhmntr{z~|tyoqjjfb_\XVQNKDF?:812+)" |~uvmlhc`]VUPNHIAB;9703+(& "   !#'(--258<>CEHPKTTU]Yabdijmpuu{z}  !"! !$% !  "# !$"$&&(((+).+//2144588<8?<@@ABBGDKGKKNMQNUQUWVY[X`Z`_aacbdefgiikilklnknnoqosnwnyqwuxwyzz|z|~|{xzsypwnqnmikche`a[]ZXWUUPRPMNIKHIECC?B<A;>:=;:8867656426081541716181543462746749596869597998<:;=;??=A?A@CACCCEECICIDGHGGIGIIHIIIJIJIJKHKHKIJIKIJHJIFKFIHGGGFEFBGAE?C?AA;A;?<;<9:796:1615/3//1+.*(,"-!, #"!   }{y}x{xwvxrvrtrqspormonmmmokolmnkplnnloomqmqnppnumupsttruusytvyvx{x{|yyz~}}z}~~}}}~}|}}~}|{z{}}}}~|}}  (&,,1267;;AAFEJJQNUQZW^\abcieljoprtuwzzz{z~v}rwrqpmljghdca`]Z[WXRTMRILEGB@A:>87531/.(,"( ! ~~~~}}}|~yz}z||{}|}}}}~}}}}~~     !# %#$&%('))****-+-+..+1*1,1/.1-2.10.1-1//1-1//1.1-3.2.1001/201103/3113151637491=3999:>:A>AABBBDEGHIIIOJOOPUQWTYWZZ]]^^c`gbhfjhojqksntruvwzzy{z|{|}}~~~~~}|z}y|x|uzywztyuwytswrurtqsqrrqrornqlqkokokmmknjmjjiiigihdfcdd`ba^b\_Z\ZW[VWXQYPVNPPKNKIMFKEFGEDCADA@B<B<>==<=9;9996:58859366363432412100//--++*(((#(#""  ~}|}zyyuwsuqrppqmmljlhldkcgeag^b_a]b\`\][^X]V\WXYWYWVXTXRYQWSVSWSWRWRVRUSTTVTUTWSWSXUVYVYWZW]W]]YaYb[a]c_e`ecehdkflklmnnpqrvryvyz{~}  "!''(*//2268;;>@BFFJIPMVQZXZa^dfglkrptxx}~~~~|{}z{{yzyzwzwxyvwvwtwtvrynxnunsnpqjrjokljjhjhhegcdbab`_^\]Y\YZYUVTVQTQQQPMOLNIMIHKGIHGHGFGDHCGDEDCDDBCDBEABDCAA@@A>A>?==;:97982704-/-+,$(!%! {yz}}z}z{{z|{z{|{~yy~}}}~}}~ " %#%('*,,/1062:4=8?<?AABCGCJGJKIOJPKQLRNTQVQVQXQXSWTVVUVUUYRYRYRVRVQVPTPROQMQLMMHMHLHHEGCEAB@A>=<:;8967371401///+/**+(()(((%(&(#(%(#'%&'%)&()'*)),).,/.0132648899;9@<C=DCEHGIIOLOQNWPWSXW[W]Z^^^b_d`hchfijjkkmkpksnsrurvwv|w~y{~~{zvrqmjhcb][YTQNKDE?<943/**!" |}}wxvtuorpnmkkigfee`d]b]\\XZVWTTQQPMMLJIHDGACA>?<:<887444/2-.*+'+%&#"#         ##'&+)0+4189<C7>14/.((" "      !"(,.579>AEHMKSQZZ[bbghklrrvw{z~{x|xssqpllijebc^[\WVRRKQFIFAD9?6:/6+/)'("  }}zwvrqloehbb`\[UWPQMKHEDE:?7953/2*-&)##      ! !'#'+)/,2256;:?CAEBDHCKDIIHLKLKMMMMOLNNONKMLNLJNGNGJIIFDHAF@AA:A9>8:876351200.,++(('#%#!#     |}uytqrljiee`]_YZTSSMOIJFECA?=;<65400-,)+%'( $  "$%%))-+/3498>69-1((!  ~}zvstnojkdgab]^X]T\SVSSRROQONPNOPOOROTNURTVTYU[X]]]a^eagekholsoutyxzz !$%'+)-/1265;9>=ABDIELJLQNWRZW]Z``bdbjgkkposrvvzy~|zv|xvwsspropjngkdicdab]]]W\TWRUOQMMIHGCD=A9>5916-1(+%$# }|{xwutsppmmkigeecd]aZ_XZVXTRSNPLMJLGJDEDCDA=A?<><:>7::694848494884948594<4>6:;;<<=>@@BCDFEGHJKMLSLUQVVU\W_\`_beefhilnnqqus{u||}  !""%"*#.%,*+1*1,2013152381:3978::;;<=>?>@AAABCFDGEIIKLKONPRQTUTWV\Z]\_`_e_ibifjjmlnorrstswszu|y{z|}~}~}}|~z|zzzuzvvususrrslrmolknjjkgihfhddcbf\c\_^Z^X\WYWVURTQROQKOKJJFKBIABC>A><;;794611,1),)&("$"             !"%(*)2.446::>@@FAJGLMNQRTWWZ\\``cdffjhmonrputxxzy|||~zywttooljjfdc_`Z]XXRSQNMKIKAG?AA:=9938/5/0-))(%%#   }}}||y{wywtwrurrnrlqkmllhlekfegcedccb_a^_]]\^[_[[\\[[[[]Z[ZZ]Y\Z\]Y][^]]^_ab_e_gbhhelglllonosoyoztzx{{|}}   "%$()*,//31677;8?<?AADDFGHJHOLMQLQQQVQWSXVXWXZWZYZ[W\YZZYYZYYWZTYUUVTRQQNPNKMIHJDGCBB?@:?8:68151.0)-(('%#!!      " $!($+(/+1.324769;:A<C@DFEHIIMKPMRPTRUUWVZYZ]Z]]]a[b\d^bcah^fbcecdbfbdebeaccbd_d^c^a`\`[^\ZZZYYXVWRXPROPMMKIJEHCE@A><<9964121,-(((!#     "&'(-(2/3669<;A?EFFMIQNUSWYZ___edglhqnrtvu|z}}zzussmojied_^ZXXQRJNCHA>@968-3(,%$&  }}{yzuvrtqoollmgjefdca^_]]Y[VXVTTSRQPNOLNLJLFLEKEHIDFEEDDFBGBIAK@KDHFHKIKJLLMNMSQSTSXV[Z^[b_ddfgijmmsnutxw}z  #"%(&-)/,1/42677:9=:?>@@BAECDGDJDJIIILJMKNMPMPNQPQQTQRTPYQXRYSXWYVZU]U\Y\Z][^[_^^`^a``b^d_bac_fabe`cbbbbabbbb`_`__^\\[\W]TZSYQVSQQPNNMKKIIEJAHAAC@??;=:9;4;1912100/.-+-&-%('#%! !     #!$#&&)',(/)1+4.4327487999=;>@??A?CCBDEEIEIFJIJLIOJOMOOOQNTNTPTPSRRQSQSUMVKTNPPLOLKMJIIGGFEDBB?A=<:;6836300+.()&%% %" zw}zxzvwyswuwsusutsrtptrstssurvuuuxwwyxz{||~~ "%%'.,246:=?EDHLLQRTXZ\_aeeijmorrwwzz}~}|zzxyuvrtqpqmnmjjhhgfbdbb_a\_\Z\X[VXVUVRRTORNPNLMILGIHGFGAF?E?A>=>9;98736120.1).'(&#%   {}z{wztwtsqpqnommmklijhhggegdfedeeagaebdceddeeefeghelelimmmootrsxs{w|}|}  ""%&)(*).,0/112235283766786997979796949556433202-1,/)/(-')($&%$!!       ! $ &#('(,(1,0134385<7=9@<AABCDFFIIIMJONPPSQSVUUYUZYY[Z\\][__`_a`dabagacdbddbhbfdbfbhbfcbgbfbdcbdbdcaeaeadacbbcbcbdbcdbebdddbfeagbedddfgckdiifjihjhikgkijjijjhjjhjjdmckeiegdfbe`caa_^_Z[ZXZTXRTRRPLNIKEHCEA>>;;7917.1.+,&(##  ~|wvqpmgibc\]UZNTKNHHAD>>;:6451//++**%*!&#"#"!  "###$#)#())++,./0345499<<@>DAHELJONTSWX\^_bfflkqquu|y #&"&%)'+(+.*1+111233567798;::=<=@<B?BADBFDGHGJIKMKOOPUOUTQ\Q]U\Z]]_]babechejfmgojpnqnsouqurxtwyzxzz{{{|{}}~y|xwwrvmrljjhecb^\[YWTQQLLFI@C<=86411,(($"   !! #!$$!&"($($*%(()'+(****-(.,,,,.+/--0)1*2+2,1//1/1//1101/1011.1.1./1/-1*0-.-*,,)+(((()#(!&#!""  ~|x}xvzrypuorompmmkkjjigieheegdeeeegcgcfeelamdiigmgnipjpppstswvyy}|} !&%))104299><AAFIIMOQVUYZ]_`ecjijpnurzv||}~|yzwtsopljifeba^\ZXUUOTGMFEE@<>7741.-'("" |~zyyuvttqnqmmllijhfhdeeg_da_d]c]]`[^]\^\\\\\]]\]Z^Z^Y_Z]_Zb]__^a`bbae`hdggifmlkpjrmtqutwvy|{~~         ! & $"#$&%&&((((+(,).+0/.0011233364777899<8>9<?;@;??@?@@A?D?CADAEACF@EADADAAAAAA@A?@>===<9::88664502/0,/(,'($%!"   "(!&)(.,0/33798<;=A>F?IBIHIJLMMPOQQQRSSSWTUWSZUXVXWXWWVXUXUXSXSVWRWRUSTRUPUPSQRPRNRNQMQOPNNNONMMLNLLLKKLJLINIJJHIHHHIFGFEGBEBCAB@A@A=<>;;9:88675413/1../(-'*%($$% %    }z{vzsynwmtmmllihgegdcb`a_]]]\ZZWZUVTTVOVNTPOQOOMOONNNNLNMOLPPPQQQTRUQXUXV\V^[]b]dedhgjmmppusww}z~  #'#&+)0/1478:;?AADHHMLQQUVW\Zb`efiklnto{ryzzvvrrlljfg`b]Z[SWNQJJHAE<@:87200(,%$"            %!*&**-/-3.628496>8?<A?@AACBECICGHHIHIHLIJLJLLJMLKNJNLKMLJMIMJJKILIJHLFJFIHHHEGEGBGAEBBE@C@C>B?@@?>A;@><>><>;<:A9=:<;<:<;;;=9=:;;<:?9@9@:<@;@;==><?<=@;@<=@;@<@=@;A9@=<?<=<=>:@9?:<=:<:;9<:9;9998:8:7997766774646354170712413112.2-0/-.+.)+(+')%)#%$" "!    $$((+.//52879<=@>CAGGGILKONQQRSVUYU_U`Z`]a^c`cdbhbiehhiikhngoiojpkplqnqppqprrrrsrtrsuttvutvwrytvwvvxvyvwwvxvyvxuwvtvsutrtrspqpoplokmjjjijiehbgaba`_^]\[ZYZWUWQURPPOMNIMFLFGEEBB@A<@;<;8;3:4631311/.+-(-((&($$#$                        ! $#(&,(/,0313496<9>?>CAEEHHIMIPOOSRSWSZWYZZ]\^^_aaabbbedceceeecgcfechbfdbebbb`b```b\^]Z]ZYZVWUTURSPQPMNKJJIHFGDDBC@B<@<<;9995745111.//)-(+&)$'#&'#   ~~~}{{z|~v~v|y{zy|uv~y|{|}z|}  ""!% (!'(%*&+),*.-,0/0215172877899<9=<==>??@@BAADAH@I@IDHHGEKDJGJFJGKHKHLFOHLIKILIKIMHMKHOILJMIOIMIJLJKKJJLJLIMJKIJJIKJIKIKJIJJJLIMJKIJKILHJIIHKIIHGKDIHFIFFIBICHAHAEA@E@AA??@<?;=9=8996853523110/0,-,),('*!* '" $#      !$#&%')(+),.,1/1317296899<;;?=@?ABAEAHCFIDKFNHMLNNOPRRQTVTYUZXZZ[\[^__`badechhgijkiojonqprqtsszszwz{y{|}zx}vzsyrsrmqkliieec_a\\ZYTWOROMLGICBA=>978/5*.((%"  {}wzuusnqjnijfeeccb]c[aY^X]V\U\VYVWXU[S[SZVXXXX]U]XZ][]]]_`^aabeeehgkjknmrpstuuyv}y~     !"!$"(#'&'(((*)-(/+.1,0/0111141625585788887;8=8=:=?<=?<A=AAAB@EAH@GCGEFHEIHGMEMHKIJLILLKMLLNLMNLOIQHQJOJMKJNILIIJFKFHHDGCCAE;E8B9;995806-3*0(.#* (!   #%().-21598><@EAIGLIQLRRSXV[Z^]`bbecifkhkmkonprtovpxtwvxvzxzyz{z||z~zzzz}~zzzyz|}z}z||zzyzyywzvwvxrxrurrrrqorkpjmjjjfhfdf`ba^^ZZZWXSTRQPOJMEJBFAA><:=6731/1(.#(#!  }~xzuuuropmllhhgefad_`]]]Y[XWVVTUSRSQROPNOMMNLOJPJMLKLLLMLLOKOLOMOPMTMTOTQUTVUXZV]X]]]b`bceehgjkmnosqxs{w}~~ ! $&'(,-/11768;;>@ADEEIHMLOPSRVUY[Z]]`bbddgjijmmpqrrvtxv|z|}}|~yyxrumrknidh_b^Y\TVPQMKIDEA>>97602++(#%!       " "$$$'&'+)++,,/./10212336455758687886968986939272341311000+.***((&'!$ "   ! $&'*,-1/6297<;?>ADBJCNGPNOQSSTVWZZ\[`\b_cccgckdmgljnmnpmsprtrvvuwwwxzyzzzz{{z}~~~{y~z{yzwzwvuurtqrpqloljkihhfddbaa]^\ZYZTWQUNQMLJIHGCAC@>::794311,-,&(#!!  }~zxyturpomjlfiddb_`^[^W\VVTVPUNROMRLLMJLJKGMDNCLEKHHLEMEMFNHLLKMOJTLTRURWWW\Z]]_`dbegkhnkrrswu{z~  %#(*)0.23579=:A?CBGGJIMNPQRVVYZZ]_]bbcdhfjimlnqprssuxw|v~x{~|xt}uvvrrromnhjhdfb_bZ^YYVUQQLMIIEG@C><=5:37/1*/&+"'!     ! " %!$%&&''(((+(-*-,,.,1-0//0001.2.01-2,1+3*/)-,)+(((&$'!%    !! $#&'&(((*),+---../00001/30111304/61411215131403/511306-5.5031412202112/405/5134152361552919486779797;7<8=9>;=<===??>A>BA?EAEEDCFDIEHHIFJGKIJJKJMJOIQKQLQMOPMRMQOQQPRQPTNVLTPQQQQORQPQPQLSJQKNNLNIOGLJHKGIGHEEDDBDABA<B:@;::897662541/.-,+(*$("%!         ! "!!$!"%!%$#&#&&&'&%)&*$*&+'((*(,&+*'*())'+'-&,')((((*%*&+%*%(&(%)$($'%%$$%$%%$#%##%!%#"$!% %"$&# # ## # "!!" !!!" #!""!!#!"""#$!%!%#$#&"'$&%%($'($*$((&(()(((()(+(.(,*,-*-*0)0+-..,1+0-.1-//.//.0./..../,0*0*0).)+*)*'+&)&'&$&%#!" #!!     ##&((,+-0023587;:<>>AACCDHGHJHNKNNOPQQSQUTVUVUXXVZVZYXZZYZX\V[U[UZUYXVWVUVTSVQSRQQOQMOOJOILIKIIFEGAFAAA@A>=@9@6<888945516110/.-/*,*(*((&(#("& &%!                  # # "!$!$#%$#'%&'%)')'((*',&-(++(/(.*.*.++0,.-/*/,/,-.*0+,-+,+-(/'.(*+',((((((%)$(&#%%"%!$ #" ""              !$!$%'((*),,.//01143749699;<:???ABAFBGFEJGMIMKPNPPQTQVSWXWZYZ^Z`[bac`ddehfijimjolrnrtoursvuwwxyy{w~z~{~|}~}~}~{}|~}{~xw|xyxuzqvrotnpnkljjggfcdb_^[[XZSVRQOMIMCIAB@<>89441./*(&$!     ##!#"'#'&(&)('.'.*-,....00101040313141618357495968888979989:79:9:9=7;8<9;8:8:8:6:7887785764818/8.7.20.0--0(-()('&%$ $!     "!&')+,-14396;<<A?DCGHHKMLQMURWVWZZZ^[a^bbdchehiillknoorqssrvryvzxzz|{}|~}}}|~y|vzsvqrnrlmiihgbaa]^YXZTTONNIIFBE=><88510/)*%(  ~}y|wwusurrpnpmnmjmhljjhhiekgiighigjiikhllinjmmmmonpqnutsvtwvxxz{|}}}~   "% '$*%/)/0025295=9><A?E@ICKHMJPNQRRUVXYY\\]__bbbbhchfjikjjmmnlomrlroptmtortpupttrqsqsrrqrqqqpnskpkkljjjgjdhcddab`^aZ\\V[SYQVQPOLJKGHFAD=A:<:69040-/'."(!"           !  ! # #!!$!&"&%%'%'''('()(*'+(+**+++---+/---.0-1-0./0/2-1.1/02-3-2-2-01.0/+2+./)/+,,+++)*()(%(#("&# % !    (#))+/0144699>=@CCDIGLJPLSPXQ[U]Z`_b`ddehijmjpnrrrvuwxw}xy{|~z}yzxvvssrroolkkgjded]dZ_ZXZTUQQLOHLDEBA>>995611/+,'&&#   #( %$&(%-(.-,1.122471;59:9;9>;?=?@AAABAEAECDFDFEEGEHEFGEGGCIBHDEECGBEBCBD@BA?B;E8B8@9;9793934303.1,-+*()&&$#        ! "!$!'"(&%('')(*)*)/(0*0.1-11133080736494;799::;=:<>>?>?>B?C@CBBG@IBGGFHIGKHJKIOILOISLOQMSMUORQQTQTRSSUTSTTVSWQWSUSVRURURUQUOTPSORNQLPLMJJJIIGGDG@G>C?=>;=7;382310-/(*(%&"          " &!'%(((-).,/0122657979;9?<??AA@E@HBHHGJHOILMKPNPQQRQSRTRUUVUVWVYUXWYXXYXZVZYXYWYYXWYWXXTZRXRVRTSQSQPRMOMLMOIKHIGFGAEAB?A;C6?6;5917/21,/)-()($%!$!!                         "!#"$"&$%'%(((()*(-*+.-.1-4/323557597;7>9>=;A<D=CAEBDFCIEHIHKIKKKMLKQKQMPQLSOQQQOUOSTOUOURRRQTTRRVPTQQSQSQQQRRQPRNTOOONPMPJOLKLJIJJHIHHFHDEDCBD@@@=?;<<7<6965331/0.,,(+&&&"$      $ &%%(('-'--,/.011314455495978;9:;:;=:>==?=>>?>@;A>?@<@>?=>=?:@8?9<9999895855343121/1+0,,+()((%&'!& #$                                                      ! $#!  !%$ !"!"" #" '%$!'"$$$%#&"&'!("(&$("($(&&'&($('&)'((()(+',)*,++.)0+///..1/21/404133334456467593984;6985;3;4:788886876867739355553241403/1.1/...+,+*-'+('*#(%$' %!!#       ! $ )!*(**--0/4.91876:9<;>=A?ABACHBIFIIILINKOLQPPRQRTRUVUWVVXYWYZY\Y\Z]Z^Z^Z^[^Z\^ZaZ\]Z]ZZ[Y[XZWYUXVSUQUQQPOMPIMIIHFGCDAAA;=:996613/0-+)('$#!        #""%!'"'%(&&+%,'-(.(-*---,/+1,1.1102,4/13031222415324332313224304141112111010/00/0,1*0++-++,)*()(('(%+!%%!% !       !##(%)),,0+4.61766;9:?;A@CBDEEIGKIKOMQPRSTTVWXZZ\]]\a^b`dbecehcldlhjjkmjnkolpmqoqqqpqrqpuovptrrssqvnwqrtqrrprpprmrmommlnjngmekgifddedbba_a\][ZZWXXTRSPQMMKJIHBE@B>><;89351-1+(, )$   "%!&&(')(.'0*0//20432839597;6?7>9<<?<A=@@A@@@C@D@DBAEADCAEACCCCBCACACAA@A@?<A:>:<8;796744111.0+++&*#&"!          " "##%#&$(&')(*(,(-(/,+1+0..10121151817365595:59:7;7>7?7>9<===>=>>?@?>A>A@@B@AAABBAACABEAFAFAFBDDCFBECDDBDCCCABABA@A?A>>>A;?:;:::9957535020/0+.))(&'$!"  }}}~|{~|}{}|}}}~{y| " #(%*(--/2081:5<9=>>CBCFCKFMHMMNNRPTSTWUYW[W]X\\\]]^_^b]c^ba`e^dbbdaebdbddbdbcebdcbbdad`bab`ba^aa]b[`]_\^]Z^Z\ZZYZWZVZRYRXQWMWLRNMQJNIKIHHGDEBBAA=A<<=9:6864601-/,,(*%*!*&      #"%&%+(*,,///11170:1<5:99=:>=>@>A>D>DDAGAGEDHCIEGHFGGIIGIFIFIFIIEHFGFGDGDECF?GACBC?A@=A;?;<:989583623/1-0*-()$(#"$"       !$!'$(((+*.,2.333766;9=;=A@ADBHEIIIOIQNQRRTWT[V[Z\^_a`bdbegejjjklmmqoprqrtruwsywu{yz{x}y}z}{|~z~|}~zy{z|zz{yzzuztzttwpvpqpolqioenbjdbd`a\\[ZXTVSPQMKIHGDB?A9=67410-,)&&    #&"# &#'('()+,--.102125366694=6<9;=;==??A?A?ABACBBEDEFCICHFGGIDJHIIHIIIIIKIIIJIJGLFLFIHHJFIEIBIAFBDACAA?@=?<=;::79571614.3-.+)*%*$'$ $        !% &$''(*)++-./103156569799:<<<>=@@A>E>EBDBHDGGFGIFIHIIJILHMIKNHMIKKJKJKHNGKIIIIIGHGHHCGDHBDBCAB@A>A;@:<;99867461301/--,))(($& & !    " &!('))+,-.1042759:8=;?A@BADEEIELHOJQMRQRUSVWWW[X^Ya\_`bacabfbgeffiflelhofnilkjlljminjmljjjhkhijfhhdgebg_e^c^_^\^Y\UZTVRVOQNLPIKIDIBCC<C9?9995431/0+.()'&$"#! hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/TomFloor-Hardest.wav000066400000000000000000005376561366722712400242670ustar00rootroot00000000000000RIFFWAVEfmt DXPAD data/U!+0T529;=]>> ??|@AAwAA@??3>&>>??=x=}<;:'9`62%/w-V+++)M,o*%D)&e"] 1?t W!$+!F )U66*A +ECKB.9tCE$VˇKp՝4٘s߅ e*W 0LA#$w#!c "&+,,,I,N-.0p23&31{0 001048>B9F4JNkRUhXfXSLZE?<=A8GLQTUTRPJD>:6O555554m3B2,1/-*I'W"Z  k "x#####l">e:'V)!u,6/>:AG@N<96`.$Z v]5a0*NKIdK4?aSx"5f:Pe/77ch)(  & :AF}Kh#g"'?-27:<:7r4223869>C)IM NLJmIOG$D@o><|<7<;':775444578:::9K60*$Ivqa 6$&&%#"n%&,'#''`'y()n+U-/,1^315641g.0+(''x()**)Z& =OH ; '0 o.E޿jd h:Pwpq֯( +ݦ$6 $]_Iб<̵7͜FҮԋ:G:H'{=uީf۲xד؞ؕذ׹reyˬ' F<ɕ:ڙÜjַƔ9ɆUʸ˗̺y%ȸŹW-߿־N+9 'aa ʗʗΡӭ[Vcٛ!m۹)u_ڮ~# ڼ۝ޘ,^:(/r  U7$ y Xb"]$%]$"! 4 G!"o$.&'()*+-=-/--M,*([&G$h" n'`q"$%&<&$"n G|5(2.!$&'-('m&%#!yh^k ZEay] R}u 4^~gNBw%ml.{ ! 0mfO ' [_# B"#$%x&m'F((())*G+*)>'$+"p "Xu(!"$ &'@*-d146L888D86x41@/,)&b%$ $$$%')) *x)e($'Z%"  l"#%I''&F&%%%%$#"+""J$&r)r,/81.3454743210/A//02=345979:<<<;@71*$Do N WpsT'[S ^Sk=:Ysv Olu}6eI^wK8* \nпΑ̾nƚ1ҼϷѶmo/&z˷зJ׸'>K<.}(,Ҽn̼2=^ėÃĹȍQ? ԶԽ*ufzV nH`tcG?+*J w<&\-%cL$@ZR+$PS\WU8~v  dO ` g ( * o  7 (QN}&X8Y   LI/OAc>I/29>l )  S  a p 5 lE{{y$ pj+Bz [^04 !! _\Z>#fwoMEQ Y E 9 th~pt3@$ 8"#$G%$#"! tr "n%T'h(('2&m%%&(a+-/-11/2|2 2 1/-,,,,U+*)'e&$h#D"!!r! Q 7Sgd"&9n0@&d$]z O#%')f**>*y)('c&$#"!j!!5"["""""!A! B * $&PL U B  pq6 >Gi JFg UӰщB$ϿΛΞ+|Ԩ֑ؾܔ!r6ޓ,ۺژ~HקCwyϥ%]Ԥ EӴaSЉ0HM' ǝǍ>'Ɇ25zˏxhdH^*؇wkԨmՁ־E5XӴӡ\*o}6'4}#lph =+gt!s1o^^JBw&u&H~`c](d l   ~o3K7!NZz<b ') c h?/ | R i|1}g,w  `  3 e o Opr0dkG: U Z # VL  P  Y) / F p \1= Z !#$&7()*=+++T,!-+.S/0=020~00]11110/.t-x,f+!*('$;"5 6=sx ! bM'l4?ws%HSyr_{ P +mG O a9q\^zJ1Qd+@8"M/s.XI2 |y!=tIyGwy=E Q S\އR k׊׆ֶ>XiҲGНб52<ϣtqλ<΢]SΤeГёפD;&p cݛI߬K+h9cK2qbk#H8zd\Y`K| o&cK\q'18D;O T JkD~1@/979C% \_# N T YS>   a ob#Kp8+<  6,=mM, 8  / y ] " I )\N ? ] 9 8 ' @{?!mV !!!M"~""#$%@&&%%%%t%8%$8$#/#!e 6^9a "#%')*+{,9--l..//0S0^0+0//_.l-,*'(&$q#!U =#ysioU;j$ f<&"g1'< E\+] f U h @ f x { z S PEj4'1AG]t@hu_KlQU#RWiK1owlmRp[lM=gEOabQc0*$aaO2#kzbbeqc|xCW3z[)gxI2`s[1SRO^Q57M84JqXyb|(f& w%b;?B^w&kUK?z7-DHmCIbeuB*5]U#7 {eAQrvn  D j . e M^x E , t T D6   |$ W ! D JgAKw+BR !!3"P"! "E"g"r""!!!2! !!#g$o%%~&''(g))))r)<)((@(''N&%%%F&&0''''(r((P('&y%$#G#b"!#!  t=y4]C<N<@z D  6 y k Q U 7 ( v 4 } + D W   3 @   4 #   ! j ADqxJQ'/ YTq1 Tj;WZ?2,$x|9_FS Mwުޗ7ceZ~ߵF_VVJ/7o1z hws^r?b-3TqZ GkvU`_5^Su{>&nU<=;K]rgQ=^l@xIV xHA^2:i?,S YP%aa jN] L > w |PjG]Mz -  t kB3^|9#.f !! " ##\$n$U$&$$ $$-%%*&&j'?(<) *~***+?+z++G,,-f--w......-Z-O-z--x- -,,V,+^+*2*)(s'&%$##! uA= d:KWB H W ] \ 0 6 B # ^  PDIO"WJ1G"yY6y/< )b(,`vZ  9O\_6eD."FXk[' i1HUjEAXEJnZ`gGC!gu!z%rW2C^?]wOXnBArtF97}5c3D P.VS1uz(kpfE8TKJLEޮZߏ&os/\<T~siw{.K$QfC#TorlU~O 2H'ND-)rNu2 WZ:f=`F$ p Wpw:);|Mwwl=*C{e $KvR !!g"""""w"<"!!p!M!D!!!"""'""!!" "!s!! (  dpuC:|mL AhEqH}le b.c4?#Z  5 &9W;XQ_Kz@  ^ m    DL`z <FT"} ]jVt9JFIL,j 8>!vlO?6J~~t<|PZq`xeZ-cc^oy=s..2HB +`j1*F_!w 6m:27,*9iN?hO_2zCߵߍwߣ=DCA-R{xq;J/FKIzbtK;1WtulhR1m:uH0S+OtsJ53g`E?  3pif`  3 s Q;OmsE 7]z \zO#B]n_W ITFET\aM1 M U0Q+V6Rx~ws^7h ;Iw ,??1+BDQS0y;S />5@gl]A<7`ykdAE C O e 'Ol+h+W-q(wR$cJ%X~)vgvD}- 6\aaosE#"XDl \/4_Agv o47>|(aqS"*iT6L1^;Z ByC[C]}046H9C p v&9@>tdro$yP ;ZQ JLWv_%6mtnmIGpG"jw,sKn\6TsS#F[yf P , v0i=3`~C aZDU&mP E{6lJq~g7N $AcaM>Cz  /XP_wiB^">=nRAxIJ 7gQbJ'}KR K  O F  l :p>=, OJ D m  @ F v8<J!(Kog@FnH@Z|W+p?o$XW'lGJk/g*GvbY1o$(z`$x*:VCr A*Va&9^0uxch`U"zAHH;^-45lb1~h!e`?BhlT:65P3# na+?nLtSOCp_UF2)d}j#%g|tX#b*vF4>i1tZnm3}\N s<+=2S_( X  * F P P [ t  p u e k O @ * 3 F {  V  5 m / H 0 , " t 5 t ^ Z R n    %   2 >  MDy")3-9+X*l t53Jf#5=:-7T[wx +!485 T=nwh:CAT-it_NQ:aN y z  a I  5 6 2 '  + ,  4 Y s h I  6 P .7=4\h{ 4K\huxC*VY) B=NY@\Mc.c L%h45|N NR:fE>rXl$'k!87Gr 8JY=pqM2`s([u8j8U,3~i2:@9Et> .Q@(dRY}U 1 & l6WYAR+X"6"sAt:fu(orB" |V-kFk WbBra]^cV=tc@-btHZ q8 Z/tDg@+i6!HllG)W | ,lWnE%`[,g"4\ Qi7u{zsgAq; ,9J^YWB+971!2*8cGx{edog3 \nB1lp:zN~Ruq*.}-UcchgTJDF:@;,<\S"&JCi0yelhSa%5[Dx0u3W[+  L & a ) *   G R h}G6@((WHPQkx9p0LZ`vw\>$ fl]\JK:'{HcX%\qQ3 _F:wF-3[;7\ Q 2 c ! h " v S #  S|<U gDB. -CDVhcQ7(  l45:z!~AKxF~PW)bG%  +DOQYgyJ$h64s\N45JRO?jGc*tGslr ".O{"Kq-nd 1=>,0/=5 Ww 6h#b?yw|ttl_Rav1oD|upfi"St"Hm#5Pn )>A::Nn=q/q"fnWdYEE-*g bh2.kk+{P!ze>w1Bc;qW> T C y 0H#Q} 3YkeH5f2[#uIQ%'<O=&'=Q^_f[g.8CNey ~R(|eJ7,$,PwL2K3E^lBgPk!q6|< 4 ' 4 |  d  TM)kh@qT?873&~V[!|*k$K9[uY=,lE%f M G H P t1Ccc^AB4Zj?X)oM}Z@&p?zGX7 c?2Mm :gI#a#$ uKGX%sK&\~T y _ N @ .   k d Z S $ k , ` 9  g 2 tZsrI|Bn-G&u0w_LCMTW]]hs& ,(BPTTDGAI7$gE'ycB(sI%Ve]d v1d!{&\Pc$e/ ]A* &6CIJNb}Ny(d]-?Vf} (2NY{kXE='}lT?%.IbV7&yo)|2x9Weoz'IlL 6l)Zyx'Lw%c4U*}vj><%q-kK6Ox 5 P ] n ! m  k T  L 0u)l 4o4S{3aQ$8Vrxh`T8mH#uXB53/"  *.?NXo3i?t`=fDs]VN?1~oTC:ACB?0fA%Q H - H p ; 4 +|2^"`4pT2V%oI+;f}!h Y%\1\1 wgF%kMGHKL;;:;@458BQkwcB. n@S$iuT1oOg ^2{otowe]KH92r_L1cP8*  !#$ 6BRj0U}BwPH(`,Kdv :f3jKC?o \t$nB Q ?zOG`#^"n 5Tp4Rz9X"Y A i     2 G [ o y }  , B e % X  = n Fh)7=C@;GH^br} %=b )Io ";Su %($ Y.x0g(i3m>  .Lr <o"GmgF eh ] U  ~ 4 f >   _ 6  {JB Ln>|hM)~S6 aT8 zSN{I.kM# r?k Zr%=V r';p0^9 wZ1uIs9d%\Fv|$;DYdwz}}wqif\UE6)'xY@% sJ.v]K0 )9CR\z9h 3_5d&Jx!04?FH>8+(!"$*(5Jd 0Kq*Nj@Vx(R|AnYIkLWQBMR^aSL;3Tr{g`ads.i YF} < f  2 S s  9 f  A ' q 7n+j*`5EUj{}uz{zjP7i1g3gG# *Gu(gX6 8t-R ;]|wQ$\!`rbeT : ; 8 t 5 v g O I M U o  H t W  # 8 G V b c h c X O G A /  x G  r < P $ DJEY~1L_s)o0rAnG,oQ;[6b0o*Q\xF^~3g3T XCa6\:}Pv^TXZQGDC?@;34($ iJ1*)' ;Rm",HQq $8WvJBbAzJ6[xwW6dE&M}Jx7b(P{ 7^%Im 4i?x6^,nM5u= S&m;q]$Kj/H_w 3Fh H m % I f  1 U n  ) G ^ x   7 N e y "8S`fnt#@f *G\}/Zw2Ny$Js#.:=?3.yoi`V?0 {H Y dW% ] 2 f 7 H d >S&h7y;i;X7 -Od)Mz<^v~d=PBLOOUcvCp`THA+! %579BNfjkhf_[STVM;' uL%[U#T+yW2 ~U%oN2a<uS%sU@(}fTM2'#5DP_hsz}|st]O/! 1@Zs (Ir%V+`z #Dh7` 4Nn 2Rr:_-i$OPS#`g9c|:B/mK}7IcpzqZXNMJN[bnu~ %7Ww28MZalqx - E ]   . S y  J  c  V #mJ ,Yv5Hi*68Ph=_ .820`9uR.mP,qO.h=yV2 } b 5  V $ ^ ) J  M yB_#P(xj_M8 oN/s4l:-"v#tk3YpI{\6vY8pI& jPC(}eL: xT:gE&{bK2jN7$jY9%{hLC$ #'9Cfu*Oo6Y%QmBY{KxEG:9|/k?t0Y~ @mFvP2iMDj:Nbr!<]}$CrP{D{ >j%]S $ A h  H k   - 4 M Z m y   ( A T m   . J m 9L`v!?b|<Zt  :Sk{ iDb6~V$~I r A  f A !  g T < ,  r \ D 3  n Q = #   ~o^PF:/ yiYE/#kA|Dc'yEg*Fh0{> W0S^*~NXX-{U.{W3sN(|L%wA{X:iM1sh]M>0 zviibbb]aZ]TTQUSXUWKSLPOSRSKM;8*'  !)5EXp :Oj0Ebx :W7dGUc9vQ|1G_z!1>Xf#Hd!Uo'Jy(Ps+J]{6Pe}3Sv$B^:a;s ?s0U2Y / W s  = S {   # + = G W ` l n q y    5 D X i   4 Q v ;^ '=[q %"  xmUD*uO* u C ` ) y E o ?  Y <   tu_d]UI4 kXF3zl\O>( {R&|R)nDpGOV<]u'Dp)k=mF`?kK1ocSPIE<2( wqd[H9) |wwuu~#,44450.~wcS>.jK1m<jK-/F_y!NmBm@l U~.^ 1\!;N`qwjUF0# =U9d2oZH>z-\4gDw [ G%Z@wMG :eDh > i 3 j < q  ? } = } HEw+_&Ls 3@QPWYchloje_YPP>7% ~{k_IB85#u]E0xV+ e= I  \ # } I w A  q V : )   yo^WH<" `<d?Z3U'yS!q? o9oAc=rY6`2f>a3i@a8kJ0y_B$v^E,kX;&oGX)U#a;`BuL/iX=  8Sn )Tw-aLB>v*mOAk 2On,=Qdp$7Lg.Pp 1X)Ek1ENXV`_ku|#BTs%=ZzCgP|DtTD DRN'[' E g  * K _ v   5 F d ~    , % 1 , , - & ) ) + & #   ! " & ' ) / 4 > H O V ` f w   / L k .IYp{o`F/ ~ ^ =  l O 3  } r ^ X K I E > @ 8 7 4 & !    p V G *  { f Y L ? 6 * ) "      # "     gN' zJ&S"`9N$rL0}cL5" xS&Ua1 l@'}wofZN;$d4 W"j+y@o9~bL5 }bB0tV3iN4 kdN<+v_:rKh9 ^6 }fJ1  + [ s #6@HHQXafjfaWNA9.$ _ E  s K -  i O 0          s T 6   t Z 4  {[0]8oM2pF#rE&c5pM'|_D+wT5e@%W0U,|J$f@eI,r\D.gVF6#wf^R?8!vfS8%nK6jJ!_P0maTLF6/#%-.:7CEK[W_Ycbpw#.BWq8Z 1Sz)Eev -<@LLUW_V[QYPUXY^\_^`^fprz||+2ENgt@h;l5j(f]O$R@n9j.b2gL,g:h+Z)P| 2 N c   + @ [ j  ! * C P c s   ! 1 5 @ F M U Y \ e d u s   # 3 E \ o !3ERhu .>X]t}vaF.]+ n A E  = U  z A vOvX<rYP;$nN&R/]/`<d>!nY=& lL&wMS(_BrdH9#}kUD0! yX5iS8t]9"z^9jV5"qdXK<3# rmZRA:586:6269?@HP\q#@^x9d#9`u1I\w *7?DKJTTcaa^YXRONPPTVQYW_`d__aajeljmrv{~}}4Jg(Mo"N ;h*`>g ;iR5]?n+U>g%Ip:Yy.Mw8Yy  1 E \ o     # , 2 6 6 6 / ' $    ~ s j d Z R E > 3 0 ' #       # ( 4 > F N X f s   5 G j  6 K h    % 4 A F W [ f n p | { ~ } x u n d \ K @ )   } _ A  u S 6  q S 4  bE!\6bB$xcE/|rjeaUQ:5 zmaYH@0,%  #.3>FJS[iw{`K+ c9{Pc2\;xY8{W)o9]\J y7Nh/]7t_L8% sja[RO@?6;284001,5-00),,)0+1+2,/+/+79DFKLOSU]Z^[_bgkposr} %2#dH0]:i?b0 f8[1 oI#c>nJ1tlbYLD94-&#"!  ~qnc\UZMULMGA:6+#l]Q@5( +Qk ,Qm6Vt".GPgt(I`~Dc , [  < n % L v  + B M Y e r x ~ y q j ] X K E : 1 + $     ~ f Y I 9 "   | w d [ O J G @ 9 5 4 2 4 6 = A I L [ a o w v ` I 6  m J (  nDqKiD$sQ.mGoQ+lV;"ncPD1+xaF-`7jQ1iN=) wg\RLA2n[A0h\C6%}naRG=2 }j\J3& vfXIF:5)# !"#.:GT[fl|}tkdaXVF>0$ wd\E;&! ubS@/# '.BNeu $E\|-E\n(6FQ`p)BWt'?g %Pv7Rs-Xf}.Qf?_)Ln%I_w:Up ,TuDs+W-Qy +Hi  4 K [ s  y d [ N E ? < 6 / & !           ) 7 B O e p  5 D [ p ( : S c v v b U < ,   ~ g I ,  f L #  yY=lV:#zhSA0%|kZE2vW8Z?|dS@1 pgVC4}^E! aA) uW4lI*lJ)sI*eBxR*eQ3qiYUG@30#"teWE4$ vk`MK>?<<;:=7:<;EHT[\b^bfhnjolqkmlgkaaYSLD<2+# %4HZv6OoPm(S~Ar.U/^Mw7`*Ut'Pl(:Ti1=Tez,8N]h2Oe ,Ou -cCz/Z<d 1 K e y   " < E Y _ p {  ) ; J U ] j v r g [ G <   ~ n e N H 6 / !    r m Y T C ; )  paNC6' zxnh`VMH<1# qbL;)xfJ6j\?-zaK* {gR:" tiK=#~p^O?.%zw\YB7 fG)]9sDb2Q&uQ%pQ-eWB2*     ~niaVQB=3,!!~xoojhdf`[WOPMRRZ[ehy|-E^y<[Ai1Z+\v 3Qu;Rs8Uo+?Tev *,49BFSScht} #&>IVh}0H`s?`DmEj7aLz1b9e / W v  ' G f   * 7 D P U e ^ p f q i i b U H : *   e O /  d M 0  vhSG=2,%   {rredTQC<.( }vfeYNF1'seN9' cQ2!y[L.ucS@-# vcYG8$q\J<*$zpaRF5. qY=' dJ(t^?.mXA0s`G3o]J6#unYQB8/)% ocRG91& #(06@DOT`k})4GZm 7Mez"9GWgt&/9BEOS\^bgkovw{}x|uyruvtxrqjlemgwp{v{*IbFr8j ^   6 Q l  % 8 E R ^ g k s y z ~ x t m i g f a b Z Z Y Z Y W P R J O L N Q W W ] _ c f k n s x ~ w n ` P D 2 %  q Y B ' n P 1 g?pJ'^E"ucK:" {mTD/~[@!mI zS+d;lD0znZR<5" |l^O<0rdVI;)ykP8bJ( \A|YG,}wvsxy{#%)((#$ veYK=/ neTM:5&#'+8DSas .@Vi&:Nds/>Rbr)BSi| "7Pe}8Ok#Vv #>Tj )9?INR[Xc`ifjfkgkijihfd_\WWSVPSWVecpr{#.@NYlvvh]NC4%|cVA.$vrf^QD9'# zeRC. zfWB8!{lZM9, zk`PD:% zjXF0# s]A)rR4uU=#wiMA'}sjYVE>2-##wf_JC0% waS=/ {`T8%rZC,hYD/zl\PC8'0AMao6J]u,COiv %8Lbs*8MZo|!.;GYg{(@To6Wk=Xw -Fl!=^y;Uq5Mj6Qe 4GVn} &0<GP\ft| +6HXfy #)7?FPSW]biqvyyyxutrpspronmnmollhlpr{{ "!('//56:BAJJQUX]X`X^Z\\[\\^^]Z`T[PSIHC<912+,$(  ysmg_SK<6&wiJ:|W?v]; hL+y_H-q\E2s`L6 ucJ7 yhI9u_F/mcPH7/ olYR=7$rcH9 r\E-n]E7zok][OLD?9811.++(&+'/-55>>GGRYejux&4>NYdp~"&23<;<@AHJNTQ^S^X^[]^cginmpqrvsypvotpuruuu{uzwuwuvwy+4FRct/E]o -Aav,Hd1Pm)Ec5Zt&>^s4Ig 7Lgx0H\w)>\s(Bau )@Wm '7BMX]ejpy{   - 9 I P g p    + 4 = D F P Q V [ W [ W W R Q H H = 7 / %    | p ] R > 6 "   {eZB7 oVC&uY:!hO+~_Cs[@% lQ@"m[J8)shTG9#~xa_JH50 whQB*s^F*oS6zaC+ jR2hN7! vk_VE>/+    (,6?HTZfly$*2;FGWTd`movx{ #(/17=@CKNY\gmt{ !)2:HN_ds&2JWo}+DYr "=Uk2E_s.:Ucz '/FSgw(.?BSUals}.6ITjv,AYn9Jcu *1HRbo !)05;@ELPX[abifmfkej`f]]\WVSKOGIHEIFMLPQOOLPLSORUTYWWYTTSOSKKF>;** qaM>+ zn`QH8/#tri_^SMM=:-# {ndVF<'# upe`UO@5)fTA+iM3sR8{W8dG(~_J+w[D)zbL3ubI6 ~m[I:'vmb[RMG<=,.! |vqmfe[WSPNMKKIBF?FBIJLMRRX^Wb]dehhmpv}!6?W_v5Ih (Gd,VuCe /Mo$>^y .@Zl#=Mj|-K\}/<S`u~ ",17>DRXdnv&7F]k(EYl"6Ne~ <Mhy.FYn ""$# }{qbVG;)ufJ7r[A2vfQA- xiXI7'n]O>. g[D9 ubQ;/ weTG6*|vji_XOE;1'qdP?-|dL5 iU7~eN1jZC7$&1=JSgr !-DScv/DUj}:Qo (Dg~1Jc+;Tcx"'27BEPT\ademkpss}|):>U]n}  8Eal 4HVr}-6IYew $/:BQTehtx $%17=LGVWagsy%*;=NQflt{odWK:3 ucJ:# w[I-uWH(}fM3sbH6#|h[KB4) |xmaWJB-&l_I7&vdO='pXC,xbR81 wd]JD7/* |yzu{yzwqofibcZXNI@;5-& ofWJ@3& wogc^XWOKB>53.*%#$"'+.89ABJN[dqz+:LZl| %.BOgt-D`t1Me:Ln,IYt.?N\i}"4J[r7B\d|+?Oau/E]u 6Sp 8Lgv+4<GJTV]]gjmtlsnoljea_VYMKGDFBAB@E?CDDFHKNRPZZgjvy#.7>LR[gir|}|{rpf]RKA9/) zxkd\PJ?3+zm_TH<3-{q[R<,xaO?!whXF?/){tl_WIB1#nR:xb?#~Y6qR-sS:qZK3$}yolbba__XYVYZX\X^W`]bddh`j_gdbe^\VUQPJG<;.*!xsaZL?8'{l\O?/%~~sle^\RQNMVPUXW_cfw~(@Pfs4J^x Tm(<H[ft~     x{yvwrtqqigg^e\`Z_Yb^c`a\aY\XZWZVXWVSNSPOMKHIGDF<B:<43()vrdaZMK9:+'    %!%"'"!$!  ~lcUD8#saSB4!~udXE5' piSH6.n_E:$scJ?%}f[F6( oaN@8!}zc_OC8+ ul\XC@(& vgVH9* |qxlslqmppqtx| */8CITYek{ /?N`m8=U\mt &,5,! udWG8.vh[J:/tbP@+ {p]SG:3'~uibUOA@1, "-8CS[ko$2@MYdq| (,058@AJHQQW[^bhlqx|  *6?MTgm{)1>EV[nt7?Vew3C\r >Yr,Ld0D]u  3FYj~26LSdn~$/AJ]hx .;NZow%*69AEJPUY_bhjllnlqnsotqttrwqvqsnohjddaaZ\NPFA=73+$" qpb_UIF55'  xm[R>7!sbNA'xjWG8%xhaXGE0,wm\RD9+# xm[N9*s[L5&fYC2 vrfc[WRKLDE=?8;66488=;;>8=7:57411,((! ul_RF7*" td[MB3'qgWOF:/%|pha[UQNJGC=:72437597==BEJP\^lo|';J\jt%.@IWdm~#.5BCQR^cdrq|~!!(49FMYdo|/>O^l%9J^m~ ,;Qbs/@M`m|&4FMer ',@GXds}! #%*,03576:5913/31/0/21,3*-((*',,,/2//,+(,(/,47<>CCFHJKMQSW^cjjojqps|~$%-)+(*)#($ vkdSRB:0"xnfZTF@1%  |rg]UE@3&~qaWJ=.xdWG<*#zrkaXLB9/( zs]WA8& ~jXD1sYM2 peG4iY=/zi\I?-zrpjea^^WZPSMPOLNIKKHMEDGAIDFFFEMKSNSTTWW\^ahjq|}$5;LWdr~",>BU[iy );H^g{,ERo{,D\p,Na9Rn6Pl4Lc~,L^}%6M]v *,>EU_kv   "(,,1076;<AFDOMSZY_a_hbnnvx~   ! !& (" }uslhb^TMF>:1(# }odSH5+r]N9+}mWF3 uaQD2"zlaQG7/wl^WC>'"weX?4 vbN?&yi[I9,|yxzt~xyyuuussvsvsyr{uz{z~*-7@FRP__jlxz &##$%),)0*4378;>@DFHKOPYW]ackltw )6JUhu&;L_s-FTp~(>Ocw)9HYgt$6=OTdly#/5CBRO_]omy~  &%/1;AAKIRR__mntv~~vtlkfc\ZTPKE?<10%!  xpc_RNE84$}q_TE5'ugQG6$|dW?/|_U:&v_Q=-}ibSH=2& ylbZOC7/  zlePQ99'# }{pnbaUSLMFD@97+*  {sieZVJI=;2,%  ".7=IR\ku  2>P_p~'/4?AJIRWY`bhlouu{y~ !$,68GDPQ[`hpw-6HReu#;Jds AQo)?Yo5Mf #8Pfz.9IVcpy  ''036?DSPcakmu}||tj`TOC:/! vfZJ=0 rj^YNKA;2-##          |tf\NC6' wcT@2!yfSG1" ycU@,pdL:&s_L?(vh^OC5,{sqcfVWNG@?1,% {oi_YOK>?1/%"  *.2.ohG?%fM1}aL.pRB'{l\K>0$ vsfgXSM>;-# tkdVRC>0+! !'5;GRYdov (*9=JKXZfemrs}})-6=ELV[dms~ $-8DIX\iny  $%,.5;@FNRZbfrs"-=ISdo&4GVhw#7L_s.BYl -?M_o~".@JVbiu~#(#))*+/.0.-*)$$ }~rvjibXSDC2/!uhXG7$weTA1!pcQC2#siRE6&k^F<#tcK<$peM?* rg]RIB61) zxnmd`UQCC43%#{sgYRA8.!zxqpjigdhfeeaeae_fbifmksryuz',3>FLWZcjrz&3>EW^oz16HS\kr(/?JRaetx,5CRYkt"-BIZgu(8<KTYlm} #&038?CLRZ]hiss{}~&*9=KR_jv"(8BOWgq|{tofb]VSHF@=61)%  tkdSO?;,"we[G=*!}le\LE60"~xtrifdZYOME?5.$jePG8( }o^P?4ukXL<1"uq_XMA90#}~xwvpulrmprnrmsssxrzx|  )7ANWgl-4KZj~ 5AT`s "*8?LU`nr !&-/87@CKLRXZdbooxz'*58CFPWadqr 06DKV]hmy}+3=FOZbku$#**/12749797848.4-,+'($($     !)(-068:;?=?BEFKMOTRXXXYUXSWSSQPQMMHFB?=32*+!! wmcVJ>2$|mXG7#n]J=*ylZM<-xg[L:2yk_PF3* {k^OF6.ug[K@4*wm`ZJC8,%  !',.84D=IHQS__mpy #2;NWju *?JZku/4BIW[kn%(79HPWbir| /3?IQ`dtw#08MUit,?Lao0CSgt &4FSbo|",*436<;@DBGEGFHBGECBA<<732,+'$! zuqkc^UTKF;;--# |vjgWTF=4(! ui^QJ94&yjdNJ44ymbTH;1"wmc\OJ?:0*$ }wukm`bXTMDA50!|s`[GA2& zjeXQD?5.&  (+4K\k{ (6DTcp~!0:LSclx  %'0-89<@BEJINMUS\Zb^genjtqxz !(/5=@HNS[Zidqsw    )$+,/152:3:68786:7955533300.)+##  }tlf[VIK37#  si[RB8)|rdTN67xmcYPH>8*(}~|ruhjd`XWPOFDA45)) rm^WIB1,snbWPF<4,# ~|tpjj``YTOOFFCHY`sz !'29DIV\glx~ $(17BIS[apq$,7BKY_nu%,6<EJVYbfpu  "'13<=HHTR[^demlswv|{|xxttllheaaZ[TSKNBE>;51.'# ~tqcbVOK=</'#vlbWL?3(uk[L?.${raYI=/$ wtb\OD@-*ylcZLD6-! }mkWTB>-%}|rlhc\YVROGIBAB9A5<3:154/00.0-/-3+5+4/443<2?8==?@EEEMIPMQQUTVZX]_^bccfgkkkomoppqpqnrmplnmjjghae]aZ^WZVSSOMODKAE>=<7:723///,+-),(+&-),,+../146<83/(" wo`[KF8-$|uqih^_TWLPGHFBEE@DACCBDCFGDIEMEPFQMQPVU[X_[c\g]cbbebccb`c[_XXURPKJF@A68,*$ }wml_]QQCE68/)$  }wtmg^XNI=6,"zreZMA2*umiX[HL;9/&" ~upgbYSNGB<81/("" yzrmlc`\VVOHH@@860.)'! $%(01:=AILVX`ent| $,16"}q_OC0%vi[RC:," |roib_XTSKNEDA<<6714./,0,00-70678>.% zqh\WNB>,0}ttkecXYMPAE73.&! |{zuyrvrtrqpppkpkmjkkhjcjdkdedfgaeabc_`]]\[XYUVOWLRHMIGFBB?<;74/0'+ ! wzgj\YMJ=<.,! ~~}}|~y{&*68EGNXZehqw~ !"()/059=>GCRLZWdaknq{y'1:EPYdny -4ALVclw'0@EV[hvz #03=DJVXdfqr}  !!$+(2/588>?DEJKTPWW^_edlhsnys~z{xusqim_fZZURMHCA;82-(! ~ymf]TLC7.& ~ug]PK73# |sibVPA<0*|ynrchY\PSJH@>830)$! ztla]RIC52% wqe^TLA:,*xol`_RSDG9ILSZ]glvx&-3=CKRZ`iox /5CMVaov#2HPTadnuy  "##&')++---0-3/33172645453433505/12.4.1./...--+-,,+**+),-*--./1,4.1413618.82380;48:7;5:7:55423-.)*'$"  {woe`WMI;7+&upe^TK@:/' yodWPB7. sh]PG81%{tjgZVOF@83.! ~zsli[[NJD;8./& ),1;9FDMRU\acljut}} %%-45B@NOZ\fnu #-5;FIVZeiry!-+9<ELR[eju|&/:EO_`py &-4?CKQZ`elmyu}||w}tytuuwswwtuutxuvwvxwzv}w|||~~|{}|y|txurujphgd]]SVKLGB;<.1(!|yonde[[PPHFB=:52-,*"" srfaYSIA:-+ ~nhXQE91! wg^LD5(~qh[PE>0-  " /-;;HJVXdjo}z"#13BGQZckv|,3FLUZeguy#,7AKWbit -*?;LN[^ims  '*158CBOOX^clpy~ &+8:DKQ]_jqt~xwlle`ZSRGG>78*."! zxrojfb[WSLJ?<3.'  sm\YD?.&um^RG51uo]VH<2%xoeaVRFE76,(# zvupjia`XWQIL=@77*+!  #,2;@JQ[agsw !+/9;CIKSW^cjmuz-+936++)$    %($,*255=?CGLNVW^`gjqty             wpf^QM=9+" rj]VKB6+$}}rshe\[TRHIB@;971.,)%" xphaXPL=<-(!~rjeUSGA9/+$  '*06:BFJTVbcnt~'/GAIJLURZ_`jlozw#*6>IQ\cox  #!(#+'*+(-((*&%!"  z{vxtpqnkifcaaZ]ZUTROOKHHDDB>>9:46/2)-&'!"  ~}tnhaXTJB=/, wodUN>4*|hgTOE=1(  zvwnoihdc]_ZWZNULNIFED?A9;946/0.+)&$#  |vskib_VVMJH>>833+)& %   !!$%,*3289=@BGIMRWY^belqq{y #'/1=62/($ ~|on^YMI=9+)vsf`VQFB62(" |~z{x{wzwxyyzx{|yy} %'.+64:>?EGLOSU[[bcgjmpsvyz~##/097=8783926012.1+.,-,*)-(,*).),-,.)0*0*3/6085::==BADHGMLQSWY^`fempsx| #*3:EJV^erx %.4;22*(!|zysurkpfmbg^_]YYXPSMOKKHGFAB@;@898604./)*&'$$""! $%$)&-)0.234869<9C>DGKNQXWa\eflmtty~|~{}zyxxvsxswrttrtqqsqrrqrtqvsutzs|w}{}~xwomf`aTULIBA58,+(  }~{vzstrmnhide]`YWVPTGK@E9:31*+ # {ujcZOK?9/$ {sne_SQGC<52(&   %+07;BENRZ^cknv{  -292-&" ~rng^ZPLE=7/)# |wpmacTQMAC42+ ! }wqjc_URJE>93+*! }}spkha^XQRFH=>42.(%    )'029?>JIPWWaahmpty~  ! %$)(/,23699A;GCILOPUWXb\geklrq{u|~ywsomig`bY]VRQNKHHAE=@=;;7;77;3=4=9?>@ABEHIMOSXYbalhuv} (05=FHTVadktv!')036;=CFIORT]Xealhpst{{   !#&'*)*,,/.//0-2-0...,,)(&'#"!   |yvtonihcb]\VTPNJIBC<=843.+''#  {}umn^cUQMF=:2+( |ylj`WVHJ=;2+' }ttokhc_]VUQKLBD;<621((!! ~}xspnigc^_WWRSMMIHFGBH?DC@FCEDHIJMMRUU\[adejmqux~"(14=DHTV_djtu')-238<97512-+('$$!"#$((+-/2388:?=EDHINOTVX^[ddglkquv}y ! ((.053=:BDEMNSTY\`ceinnut|{  ",*577CBGOLYV`_hhopvy}  "#)+-3277?<EAKINRR\Y^caikjvpyz|~|xvvothpficda]`TWSRNKJFGA@B8=833-/)($"  ~ytnma_UULGB<51)% {upha^SQKAC54-'% ~{vtqpkldga_\]UZPSOOJIFGDD>@<<:8<4;3645363354380:3959:7=9?I@E@B@@>?<;;<8995;476452424112.4+4,10*2*1+.**.),+)+'+()('*&*#)&+"* *)&#!   zvukne`^SVJKB=65,)" yymm`bVTOFD<90.$${x{vvssrnqkpmklilfkehgdheffefcfdcdabcac`baab[cZa]^]\Z]Y\WZWWVTSTRPRNRNOMMNJLJJKHJHHHIJGJELGKHKIJKMKPNQQQVUYV]]_accjgontsz{~ !*%.-55;>@GHORT[]ecmhusz|~ !#()129:@EJLRT][cfhspy| #&/17<@IJRT\^fhpsy~|zwysunqjlfhbc\_VZRTLNGHAB;>6742/,*)&##     ~}tqkdcYVPIF<:1/(# {srii_]VSMID?;74*+ " {wurmjj^fV^OWJMFCB8;22++"#   ""+*255@;HENPUW]`fhoru{} "(,089BELOUZ^giory| (%009:ADLPUV`^hipqyy   )$,.167:>@EGJPNVU[^^feknluryy|~z}~}|zz~zz{xwvtvpsnqkofkdfba\^WXTRNPKJHAE;@686./+&'    ~xzmreh`^XTPKID><72,+#! {{uvpqhjdb`[[VUNPIIF>@::530,,&%! }{x}x{w{xyyxzwzw}u~w||}~ #)#)),-/20738::>;C?ECFHJHNLRQTUXZ\^abfflkorsxy} #($++.0135497;9;<=;><=@;A8>9=:9=4=4;56673423.1.1,/--.-,,+-)/)/--./013273:7<;>?CEFIKNQRW\[^cdilotu{|  ' **/257<<BFELKQRVV]Y_abfghmmpquuxzz|~zztwnphkdd`]XYPTIJF@?9610'*! ysmfbZQNCB84.$#}|qpg`^UQMDB:9,-#! x{stmnfga\^WTRNLHEB=<642/*(#   "(+58ABMOX]clpy{%06?GOTbcqu~ '/8>JLZ^gov"%22<?FLQW\bdkosy{|xrogd^XUOJD@95-,#  |}{{zy~vyuytypwntooolmlgkegfbd^`\Z[UXPROKKGDD=A8;25,0('$! |{z~{{}yx~xy{z|x}wzxvxwwvuvqvounrlojljkfhedcc_bZ]\ZWVURSMOJMDLBEB??><8865.4,/,+*)&'&"'$!     $$'*.0479>?DEKLOSVW]\acfjjqmwvzz !#*+42=8GBMLTXZ[dejnpxw~   !%&(,*223;6>=@DCGHKONVR[W^^bddlfrjvpwxw~{wvjna_YTLIB;61(' zylmd`YTNKB>;2/'$vpke]ZQODA95/&# zuold`[USKHC?:83/-($&       #&#+,.52:9A@EJLQVV]_egmprxy $*,4:=DJMXZbiluw} '"),,5088;>=B@FCFIFOGOKMPNQRPUUQXRWVWXWYXZXYYZ\Z^\^`^dadfghlkqntrw{xz "#*+10:6@>CGFMMQTUY\Za`bgckflkmonpqqrrttuuvsxrxqvrursptmqnlokljjkgkdigecdbdbb`c^b^]`]][[Z[V\W[WWXWUYSXUUVVSVQTQTNSMRLNMIMFIFGBC@@>;8834-1(*#% |zuppem[fVYSQPGJAB<;531,,&'! |w|uupnmgiac\[VWOOJHDB<;831/)+!#   #$,,46=?GHPRX]`giotx} !!#'$*)*3*6-82:6?9C?EFGOHUOUWZ\_cdglnst{| !%*,2489?>GDKMORQXWZ][``adecicjhlhkikkjkiihifhdfbfac`a]`Y]WZUUTROPLOILEHEDB@A>>=;:;6<58475729071616/71515153170433260432304.4,1./,-)**&(&#%!  ~~xtrjhb`WZORIIBA;943,*)!%  }{wqtikeacV[PRNGHA@;:43.-)%$      #%(-,42:8@?GDLMRTYYa`ginoxu~} !$&-+145<;ACGLIUP[W`_egjort|y  %&,137?<KEPQWZ`ajjpuw   "!"!#!# $#  |vqndd\WQLEC;9/.#!  }~psfc`WULID>83.)  |vonddY[NRDH;;40+%" }}{}x{{v~s}vzxwzx{yz|{||~ " "$#'$(')())+(-*-,-/+4+6/3114155484687;;:?=?BCAECGJHNLOQRTVXW][babghjmmrsvyy}~ "'"()*.-4286:<<D?DFHHNKTMWVWYZ]^^c_icihkmlqoqtqys|x{~|}    #"$"'#')%)((*&-&/'-*++-).*,),(+)*'*%(&($%"$#""  !  {{stlmhac[ZVQRHM@G<;961/*)"# |~vyuquopnklekcec``_\]ZZVYSWQVPQOPLOHMHHIEGCF@A>?;;;99664503+3)-%)"$!     %%)-/187;<@CHIKRPWWZ^`behlksoxu}{ %%-44?=HKPWY`fgrry            ! !#%'(++.21569=;A@CHFOKQRSYX[_^edfljoqruwzxz~||uupmjfe^_XVQMLED>982-(&uwmkfa^YSQIJD?;8210'&# ~vuolgd][RTIIC<<31+) !     # )"-&/+3.82<7@=DDFLIRPVXZ^cdglmqtwz # &&++2066;9B?FHHOKSRWZZ^adejjqpux{~~   """'"'&'*'*)+)0(2+10/4/3414526275796?6;<:?;=@=B>B@BC@BBBCABC@E?CA@B??@=@;<<7<584514-2*,*''"$   zuumkhcc\XZOSFL@E==49.1,+#&!  ~{zwrspmkkhebb_^]Y\TYSTRRNNMJKHIGGDDHCGBFDDHCEHDHFGIDJHILHMKLPLQQOTOVRVSVYVYW\W_X^\[_]____c]eabcacccebeceecdfbfbddcdad`d^d]b`_a\_\^\]Z_UaRaU\SXSXRVNXNSQMSKPLLMJMIKJIGIDJEGFGCEDDCCDCCAAAC@C?E=D>D?D@BBCAD@CACCD@F@FACBBC@E@C@C@D@AAB?C>A?A@>>>?<><@;=:?8=;:=9=:=9?;<<>==?;C=B@@CCDDFFJGJLMMNQQSVVY\Yb_fckhooqwu{~~  "),45?@GNNXWd_piyt  # *'1+728<8D>FDIIMPOVSYU^[__bbffgikjolpqqtusyt{zz~}zzttloff_]XVQMIFB=:43,)& }|wspihc_ZXRQIGA?963,(% ~{womdb[UTGJ?<52+'! z|uppkfee[^UVQQJLDEC>A8:82700-,+(($'"""   !' )#*)-.2074<:?AECOFVQXYa]fgkrry|$(148ADJPTZ`ejouw  #(#-)./0365:8>=AADDKFOMQSUUZZ]``cfflkmsquxw~}{{vtqoniidd__Y]SWPQNJHI@H=A;=6<1<-9,2./+.&.&*%(#&###%$$!! !"%"" ! " " # $!#$ '!$#%"("($&#(%%$(")!'$%%#% (&%#%#    |zwuoomgj`e\^YXSVNOKIFH?C<=88350..))&!$  !&&'*(1,3277==DDJLQVT^^ahgnprzx  !#')/057:@?KBPKRSXZ\`_gdkjmpqusyx{~~}~{wxttrmpflcg^aZ[VSROPHHCA?<872./&+!"  yxsqkmcf]_XWRNNFI??:921.(("  }y~vwxrvptorlolkmglfiggffedgaeb`g^e_a`_a^^^]^Z^X\WYXUWRTRPPNKMHIEDCAC9@8753.1+*'( $  "#$''.+3358:;A?IBLJMPTS[W_^agcniqquu~y $('+-10758=;A?ECHJIOKTNYRZW[Z^`_aacedifkjkmnprqqvtvxt~ty|~ {{qqjga]WWMNDH:<41.&% |zxutpsjjgceZbS]NTMIJCB?99500),#!  % ))//449<;D>JBMINPTRUWXZ][b_cagckcmfphpmooqpssrutuwuzw{z~| "#*,049<?GCNLRUYYc[icljptqxy||~|{||~||vwspnmggc`_ZWURQMKGED>@:<3702-+*&%""   }|wurmlibb^YXRONGKBIKRSZ\dgkqty!(.18:CDOKWWa`jjrxx  "&).068:@CFIMOUV[]bchgnoquvz}~}zvtqkkee]]WTRLIF@@69,/'#" |z{xwvsttoqkpiodlfdgaab\^]WZXRWQPSLNKIICEB@?<9;5803-,*)$&!! }wzwtuoqoijhdg^c]]Z\UXSSQPNMJJFKBCD?B=<>9:867433204+/+,(+$(%"&#      $%(*.0294C8GAJHPPTYY^acgjoous|} ""($.(//24579:?<C?FDIGLKNPQQWS[U^X`[c`dcfhelijnlppqtrxryv{v|{{y||z}{zyvwusqprkqhjibg``^\ZZUURPNLIGF?D<=7632,,(&"" ~utojgc^\WQPIHAA:860,)%!   $%*)/-364<ACCEGFIHJKINJOOKSMSOPPQORMONNLMKMIIIGEH@H=D=?<=6<18/1-,))$$!  ~|zuspnhjdc_aX\UTSPLMFJAE>>;:76/4*0&+#%" {zyx{qyqsronnmmigicice```__[[YZVWTTRRLRHOHKGGFEFBDAA@?=>=99:49327/4.2-0.,.-+-+),')(&*"/ )"( )'##%!%&%!! !     $#((,-2359;=BAHHNOVU\]cejlsr|{ !#&*+0155=9A>EEIIMLRRTVYY^]aaebgelhnjoppsrsxtzxwuy||}{~w}yzyyywzuyuwvvzuwuytzt|uyzu~u}x|{{||~}}~}~yt|tvrsorlmjiffac[`ZXXTTQNNIJEF@A<=7:07,2*+($'    ~|{zxxuvsprmqjmglgffaf\c\]^V]TZSUPTMQKLIKFHBDB>?ABBFDGGIGMGOIMNOQNRQTTSUXSZTYXYYYZX^T`T_V^W[XYXXVWWSVSRROOOLKJGHGAD<><785.1),%$! wuojha`UWKMCA=73.*& |tsnkf`^WXOOIGA>984/,'&   #((/1489ABFGMPRYVa]gdmiunyw|}    ! #!###%&%($+',*&,+*/-.0.1112536496;7=;=>?>C@DDDEHHHKJLOMQORRTUUV[W[Y^[a\b`bbddfeifkhmiokqmqorqtqvswuxvxxx|w~z}~{}~|}}}}}~~~~|}}|}|z|z{zxzzwzywzv|wzv|v|w{y{y{{{z}zz}~|~}z|xwvtssnqlkleidb`]]YXUTOPILECB?=8813,+'!# }|uzmvjphjecd[dV^VYSTPPOMLJHJDH?F>A>;?>A@AECFEHIKLKNNOQQRTRVTXT]U_X[_[a]cacdfehhiiljolqnqrrwrwt{w}x{ !()027<ABJLST[\deoluy|}{zuvroojlegbb^\ZXTVQONJIHFAC;>;76504+-)*(#'%  ~|yxtrnphhce^_ZYXUTQOOKJIEGBAA?><:;89765526115-5.3.3/3030403433748788<:==98<6<6<7::9;:9=<<>=>BC@FHFJINKTMVTUXZY`[b_dfdkfokrqttxx||}|~uznwioefaa[YWRPPIHE@?;:44/+*'$  }x}vvrpnlhjag]bZZWVSSNLLCK>B>9<4420+,%(!"    '!-)/0358?HAPFUNXT^Ye]kcohumzt||~}{yvrqkkgdc_^ZWUPOLJFDA@::522--('$# ~|~{{|w{uwvutssptotoppoonmommnlnnlnmlplnnoppoqqquqvtwxyx|{~  # %#(%+)+.-.1244669;:>=?BAGDIGLIOMQSUUZW^Yc\cchghjllrovrwxx|{~}{zzvtqonhjeda`[ZXURQKMFEA@<:46./,&*"! ||xywsqrmohmfifbf^d]`^]\XYVWWTWRSRRQQOONOLLLIMHIIGGFFEEDBDBBAA?A>>?<<;;8;687664525020.2*0*/+,**()%*$'$$&"%"#%%&#"!!"%!"$!#$#%$&&&)&*),*-,/0025285;7@8B>BCBHEKHNNRRUUZZ]]aaefijnlsqxv|z ! (%*,,5187;?>DCIJMMSSWY[]a`gfklppttzz|~}}}~xy{|yy|u}uzzu|tzyyy{v{w{v{t{vyzxyxzv{vzyxyyzvxxwyvxuvuwrwqvrrtppoopmmkmjlhjheichbeab`__\\[X[UXRURWJRKOJIIFH?DA<C7=786530//+,('%$ "  |~|~yzzxvwtusqqrnsjrjnmimikiiiijeleihhhjfjhjjjkgmimkmmmnlrlrprrtswszt|vz}yz~   " $#%%&$*%-&0'.,-0,4-40513436566799:;:<<<==<C:C<BABADADBEDDFFGHEKIHNJNLNNOPOSQSTUTVVYZY\]]_^]d^fbgdjfijjmkolqnrqrsusvuuyvyxxxxyxyxw}x{wyywzxxyuwwvwtuttquotmrmpjpgohjhfhhdfdccab^b[a[][]X]WZXYXYYVSYSVTURXOVQSQSQRROUQPTNSRPSQQSORRQTOUOSQRRQRQSOVNVPTPTPQRPQPQPRPSMROPPNOOLPKNKMINGMFJIEICIDEDBG?B>A?=?;=9;87663414.2,.,*,'(&'"#!   }||uyovmrhmciac^aX]VXUTQQMPKNHHEFBE?@@>@?CAECIFLINMOPURXWY\^_abfekjmqnvuwz}~ #(%,-.45::@>GDKIQNVUW][bafhhmmqruu|y{~|{wtsqkmdj`c_\\WWTQOLLHFDBC=>;9:55502,/,()&&%"    ||||zzzzwzwwwxvyvzuyxwyyw|x|{||~}~        "$# $ ##!% $#"$$"%##%!%!#"#$!$#!$ ##!!$ $ # ## ! " # $%$!!$%"$%#&%%(''*(***+.-./-4/626699::?<@?BDCGFIIKLMPQSRVUZW^Y`_`bbfdgihkkmmooqsttvvyxz||}|~|z~y|vztyqvoumslokmjijeibfaba]`[]X[WVUTSRSNONLMKHLEIDDDAA@>?<<;99:6663413/2./-+-**(&(&%%$#"$#    }|~z{xxxsvotmqlnimiiiefecca^b\`[\\ZZWXVTUURTQPRNQMPKOJNKLMIMIKKHKGMGNFKGKJIKKJMIOLLOLNPPPTNVSTTXTYXY]Xa]abaeefhiljomsquuxy|}  $")&*-*2.4368<9=?>B@EDIELIMMMOPQRSTVTXXV\W^Z^\_]`_`b`bcaf`fcefbjcggghfhfiigjhjijilhjkjljkjmioimlkmmlmjqiqmnokqmononpmrmsmpppqprqsqtrttrutvswswuwtvvuxvwxtztzwwwxyvzywzvzywzvyxxvwvytytwvtxrurtquntoqnoonnlmkkjhjffecf_c]a\_Z]WYVUUTQQQLOILGKBHC@A=@:;:673322./++*''$$!$   }|~wwwqtnnokjhfedb`_]][ZYWVUTTQROQOPKQKNMNLNKNLMLMNMNPOPRPTSUVVVY\Z]\a`cfeijjonsswy{}  #%#&'*,,+0-334487::=;B>DDDFGHMJPMRQSWTZZZ_^``ddggjjmmpppstwwy{{}}~~||xzuwturrqlpilhhgdfdbc^c[`Y[[WZUWTVRTQQQOPNNNLMMKMJKJJIJJHHIFJGGGGGGFGGEGFEGDFDECECDABC@DA@@>>?:@:=;8<4;47434110.--**('$&!$!  ! ##$('*+,.10334667:9<<=A?ACBDEEHFJIJLIOLQLRPQSPVQXSYVZX[[Z_Ya\a`acbcdehfijimiqkrmsosssxuxxx{{}}~|{{{xyvvsvpspomkkhiffdc``_\^XZXVTTPTMOKKIJEFCD@?>;;8664311..*+'&%# ! |wztyrupqmmmiigffddad\c[a[^[Z]Y\YZZX\W]WZZX\V]W]ZZ]\\_[^_^```baebefdhejhhmhpjpnnsntrsvuvvwwzx{z|{{ "#$'&)*+.-012557799><@>ADAHCIHIKJOLOQQUSUWWYX]X_\b]cbdeehfkglknmopprtrxrywyy{y~{}}~|~z|yzwwuuurrpnokliigeecb__^[[XVVTQQMQJJIDGAB@=>:=56531.--**''#$!            "#%&)+-.014578;;>@ADEEKFOJQPRURYVZZ]]a_dcffihllmmppsruuxwzz|{~~~}~{yxvusqommihgcc`^]ZWXRTNOKKFGAC?=;974301+-()%#!      !"!"#%"'$()'+*),*/+/.000306275797<8=;=?=B>BBACDCGEFGJFKIKKKMLNONQNSPTRTTUTUWUWWWYWYYYYYZ[Z\Z][\][^\\\\\][]Z\[\[Z\X]XZ[XZXYVYTXUTVQVPSOQOPOLNKLIKFJFHDDCAC=A<=<9;6864432/1,--(+&)$&#!$!   " "!&!'%('())**,-+/./0/20425264757888:9;9>:=;=>=?=?=@@@@@@CBCAEAFCEEFEGFGIFKFLHKKKLLMMMMOONQNRPRRRTRUUTUUWVXWXYXZYZZ[Z[[]Z^[^[^]^]^^[aYa[`\^]^]\]\^[]\[\\[]X\ZY[V[UZUWVVVTTTSSQSPQOOONLMKKIJHHGEEEAD?C=@==::97572501//,,)*&'$$""      #"$&%(')+*.+//.3133447697;9<;;?<???AAABCBECFCGCHFFGFIFIHIIIJIIIIJIJJJKIKIJKHLHKIKJJKHMHMHKJKJJJJJKJKJLKJKLKKLKNKNKLLLNKNLOMMNLPMOMOOOOMPMPOOPOOONPLQLPLOMNLNLMLLLLJLIJIIHHFGFFEDDDBC@B??><=<;;9989482613101--/),(*&)$&$#$ "        " $"%$%'&*&+(,*-,/.00112245556778:7<:;=><???@B@DADEDEFFGIFKGKJLJMKMLNMMONOPNQOQQRORQRQRQQSRRQQRPQPPOPPOOPNPNNMNMMLKKJKKHJFIFFFCGCDDACAAA???>>=<<;;::999696655554524322302011/1.1/0-0-/-/,.,--+-+-+,,+,,*++*,)*+()*'*'(&''&&%#$$##!"!           !" #!#!%"&$&$($)$)&((())*'+)*+)+**-)-),+,,+,+,,+,,,,+,+,,-,+.*.++.+-,-,.)0*/*---,-----../-/-0.0./1/1/1011111213142335243435454556466484665765675757575665756665655655555363333413123/4.2/1/1-/-/----,-++,),','*(''&'&&$&#%#"#"!##!     !"! """$!$#%%%%&&&'&'''')'+(+*),),*,,+-+,.+/-...-/././/0.000/00100110112020212121102111113/2103/11110001.1/0/0.0-0-/-.--,.,,,+,*+**)+(*'*&'''%'$&$$#"# #           !$"&%&('***-,///1133556878;9=<>>?@ABCDDFEHFIIIKKLLMMNOOQNRPRSPTRTSTTTTSUTSVSTUSWSUSUSUTSTRURTRSRSRQSPRPPPPPOONNOLOLMMKMKKKKJKIHJGIHGHGGGGFEFCFCCDBBBABA?@>@=?;>;<<:;99989575544242200//---+,)+')'&&%$%!#      ! ! ""!% &"%$'%&(&('()())***++++,,-+,-,.+-,--/,/-...-/-/,/,/-.----,,+,,*+++))))(('(&(&%%%#%"$!# !           ! !         !!$#&''()*+--//0022445677:9:<;=<>>@?A@ACBDDDEDGDGGGHHHIHJIJJJLJLKLLLMKNKMMLNLMMMLMLLMLLLLMKMJMILJJKHKGJHHHHHFGFFFDFCEDCCAC@AA@?@>>><<;<:;9886766443312/0//--,,+)*('(%'#&!# !     ! ! " ! !!! ! ! ! ! !                 !!!!!" !!!"!!!"!!"""#!#""#!#!#"#"#"##"#!##!#"#"""#""""#!"#!#!#!" " ""!!!!!        ! !"!#!#"$"%#$$$%%&$'%'&&&'&'''(')'('(')&*&((((('(')')'('''''''&&''&&%&$&$%$$#$##$!$ #!!!        !   !                                      ! !!!!!!!""!"!"!"!"!"!"!!!!!"!!! !! !                                      hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/TomFloor-Med.wav000066400000000000000000005367361366722712400234000ustar00rootroot00000000000000RIFFֽWAVEfmt DXPAD dataޭ ~ q me/ 8"#"#u####h$$W$#%?%%$o#$$#"4! XP~<ZaC92 q aRs B 7c" ^* |>R& oiPK֔ȶѬ~7Mok:T8<]Tµc/龏șɆ͓Ѐ3.Eإ՟[+dz ||4?f^ƱƇƨF=լp5 i-b:g$Q-'Mt P<E U!\"q#E$$g$#""!!!-"#$)%&'(P)*`++*F)',&%v&V(*-..Z.-!-,+!+ *(Z&#!!8!^"$%Z''['h%&"{BR<S@(/},m> } 3/sM B^pa[ftF_ RNQ-!ZgB#`"kLiߓރߞ=9uy-Re46 - ~ G     bXU!Z4W   *#E%'(o*+,T---->../ 00/!/.U.7.m..P/N/,/.u.1.-..-A,>+e* *))q)))8))*+w+Z*I(%P#/!Of%< #$~UQ=-; p ~PP  # w { Y M e X J K ![XhTVi$\8,[{{gOj[w -L(@~خ"$ܭKݜ݌Ziz;PL4= #k")cݟ܄{;}3Ӱ8ѩڵ-/0޹HޠݰoRbh܌kbx?|]7%IW! w? [\tw(M ?Vn_ #0Mg . N  % ) M m Nd/ypwR I G h ^ _ " (    - (  =e  xM`. Y q s 5 W 8sdE=p5[ 5 Y=\^pTMoh)pg  % L cJG(>``x{yWD ]X]/q_D+[ahi8 $Ltw8 6u7U.{\ND(+r;(O?LnE   SD ] $t88J`1h5; ! Hc,<]jO`&*oYhHbV7Uq&4GE+D6K'1ؓNս?'>ՁԧӸљau,1Ϳ]<ЎT,Ը&`վ3֊sXqڴwߨW= M`_,Ac2,\g E"[qxrmlk gy}" G % X h    9 x\TUY=d@z dA v d [ Y G @  j " S r $^ y~ C`a d1LSj0:f)3_= +"c ]xtUq9*BYK.U+PlPz{   S S( S9 t W e w .  HQXoz<=8T *u"CF !"6##R$u$>$##u"B"s""#j##w$$%:&&&\&%$$5#^"! |zpjP!IWPr 7 } : p L  E<RlF&ejF.!  N A q 4 N  A 5 9XokMom?]` fv )Cj1rO&$mR3CN7sXR]w?u*t`R߀ޘoݖއޱ޸B`HޗߍE.%RJK@ @?`qiF p L?, |@%=]RM6h p=fn_8GMeh vmWxmbQ?5>%:i*q|]gG*3Lp ? ]1# q+Ee{OoK66OrFtS R C ! H_7FS&pu7+?)^V~V>9 o!"v""p##$H%%D&&&&A&%%A$L#L"q! W <  k~Rbifs3n46i3|&B G M @ Pzc#GTR=|C` o@x uksBi=2,iZTz NVt?MQY^nQr|HYajB'Gx ?9Q7#g'<}ZJ4i,S XN wym>.5.B)0 ?\.jq}Wv}^+&4]{[M91bDa pJJ]"H<#)ND0J>1u/'b]s_Y2+9/8cIGe)$fhZ9 +\u:fc=A5 X4$!3y{5HRP #  V k ~ \  : o  @u*  t-ON : - w A #jCr+:_ M] Qc/UykRNVZw"U,e:sV ()#8."(ZvV:q(FV1:o}mh$2VN^ ? -  R ( { p |!|W0o1\N-d q:s"\`qW_-_GaN}g\3!CC ?h(-y9L|G |U2K7'IiJ/b)X4T X363Kx:bxpRiu|}bxO(t2|!,nO&tG`*K8-s|FpTY< W95!)N7^L{@=2-\'R%H @e ^ : : 4 I3])[)bY]O>C9 AX#jD7!-vd?R}UK>2 ]]-opiEBW _P8c  ~ L 31g<kRIpjFBe;wK  N 7   %   C  X 7 Qb8&6D_F%`I,!/%6KPTftFV{qWi 3BfGlrv-oZg$=e2\FFH"c@-, 1JC:."!:?D2(ocX2ej\G2*+ u= *9Mt%>REU#\,f:zAetdH--NV%ZFRqta6VLXK$ 'cheYt#U#-GPZ`P1B *W HRKf O(_p5vWM`tuYRj 0azWxK W = ; A{.lE-{&~YHLgq 9: JgV1_3g\bww^D#w!*urR O 2 r $ s =   2 E W Q B (  Z  lHsTl0wlXQx'eJQ .`,z2X>z~YCg'7kwq?E{ "oS?aJ-`{tlvxx[#P F[Aw$Aq[ZWY]intx~s_)C>{fA5|Qk#hM @:r!BRp-OsNqpE1T PvQ{`DXCL ^^{qbF[ZJVzgq^:f 2ZIM*'1&0Bn3mcHW*MnQ<O!} G p g G C O l 7 % L j   N 2`"c B___jt7n<x/Q*c&T+5)$?LJ |\ 1k + O  " M ~  + 1 N O N K P 7 2 5 : ' z q w - : d  B * e  u @  x :  c2C\P`:j/z n|JT-\5 /n h> ;v!Fgf7 C KE\>!$X r[/j.)m(!n6`b[>s2l.c 2QpV+p \/A;[4p   @ v l @ 2 _ 1 ~  J  o 5 O \ &q_! x @ !  H \ f m 1W (Vk;Y/ d 2 x b N  c : &   ( - + : ; 4    E P % w Re-u<udF>93./,0GC/vnvp{H-sS:|= T  ~ 1  ~ - z % | : Gm9tJ+x+n3 w4XmF# 061)$ 48u7^ *<0;r5Q O-`nW2 [}5Hw.Ox[6nH)M!>~*2vF>"X]7Z|xI"|3=:[/y_>((%6O[^KGWk"T]*OY5g$X@15U+g9%YPo{KgE|Q5*N,Z E ".L_llw,NXqc2iHM 6GQ^vjdj^ a  > X  3 a  1 < \ >o :l "2..*0KL>0+" $9Ole9s r  U o ) yFs7kVF@877.Bdx2l9 V % K m ! / 0 %  x s e L  { M  ~~mU;tc[NI-~T1 V$ v0D;a{t7Fj)ep}O'v,|.p<^6"fN%QNiL+ pJ(TG}J_:|bn"X&s?OZf3v/_Co29];^k ,Y"\L&upWPo%CBE2"sY$ pP*_4}cXTW^uQr8naJI#[Bz 6Sz@f'lQ'|QN: O a ( \     ! G \ t Nx%_X)\"M)Q~pGJIn{7%Kq ,D_luy|xc<"]8i+ S  y < c e $ _  x-|I1CMH7+! kMA( T(xE}MR~PoQy\C Y,Q e&h(z=l@lN7.%&#/2?Xo*] 0EfQgEg&s)@gB!(!kP2{jR/,Pjg[OU\m|uy`K+\^'k_RJDLQZ`-Rh(5APs"1;NZl 3AGKK5}iV37eFGq/ D-ujU Ca*Kf -\(WG^/eDS9qE I  % X |  % ? V s   2 B @ F > : = : $ x P ! q . <   : l b + ~  s P `O&Z b'UEdv/:=/) hAl2d+b ar{5 x O > 6 )    5 @ [ i [6]m@< O  k @ {S;@e< |'~'E~u0X_9* 7^5d4M`nusmbZD2]B0n2[R(v}c> -IW`m{zfI_3zq\@tI-nLuS- pGvajYOJTq|Nv 0Ll &CSdHDyFar0Y2Iew+?]dme_n@j0nH{#G}:Nl@p>,s [L(i%^F{3O`domph[UG9 >Zk{Bo6e 7 V m  } { | y i W C A : @ F U a w   1 7 Q r y q c b Y Q < !  ~ W .  nJ}vxwwx%Q3 h & g  / U  % B _   # &    = P f l q  ;P]fyo[F* n C i ( J  o " ^  Uay; 'Hr[ N F $ K { m = L Y ` V~ >et(HOP$p2@d7 ];jN)yJ&L$mA e4E _#@M$R NB7p_E;51?Kk59>Uu 7Us 'Hv Br#/7::&IzL,fN?2! ;`XE_$_7`>S6}N%Ot9c#MaR#h1w6s P  % G q  1 k  I  = c Nw$IsDWty\H4"kF/rE H  B n + v $ ] ;  uO*qU:2(&% !'9Q{  {pSB'aE0 ?EHc&Z*(Kj)[2z?v oCm.F:5Y L~WWDCK{9n$Js_E2 1F`r'[3r 3OywfLQn3 o<_zQ)':X6ot@3d8]{{mY>Vw9cD0!.Uo//b"_3Tz"8FIMW_`qpxxy*Lm8[MxJ2^, O o 4 h + b . `  Q i 2Xx )Fb"/8FLZbpt|~{~/C^thT&z"7} `  6 r  N  H&@Ns8^8~dG-'6GUalstQ3 s6i,`-V#lD &22/6BZx3Ef} |_DV,`*R s*bKQ c&zCfe]NB;/'~hQE/ %;b~b)s/:\ro Go->GVS^WOFA@GFRLQWk~&Py7)v|9?[du1d1Lh$,ARi'DWgrpfWI8.&! /C[y )cI{Fr #1GAN?=2-%gWA2 ,9DRY]bg{+=W| ; y 6 u 6 ^  G m  % @ T o | u g Z K ? .  v j U G ; (  w q q k p c ^ M F ? > 8 + 2 % % $ ) / 3 9 E < C 4 ; 3 5 .    ^ 9   p :  ta:"~U0fDM$rE$Y.r\B. bImG\(X\)p2Z6`A& ugTI.|]0zgU8!gM3 kX;(  .6EPbqzt`XIA( ycM8$ kRB5% ()8FJe|/_1s(dHq"=Th'6Ng;b&b_6x+m<k%Lx4^6_>s?  ] & _  < i   & + 9 1 9 1 7 / - (    r a P < +      / O l   & < R g r  y g J 0  d 5  Y  [  F  CH f>`E, qfJ9, kcWM=8!}l\B5jQ5pIY-Wj;ueVOJHIFINYarmO3 f9>c"]u,p5W:vZH@+#}Y<{Z?seae|-@Wr$/:?JWo!(56;BLhu/N[ht +Ms#MJ7l5l 1Tn"lT1 ~^4~}~ 1GYs"HqKt!U^/~V\"\5f 6FRXfq  &8?CGMS]bns $/AT\t&8K^r "*7DUl 4 Z ! P { $ R }  % 2 L P _ Z h j u v o n e b \ \ P \ V d a o m y    4 5 G J V [ b Y T < 3  p C  ~ I  k 8  U  j-v@QqL1xcNC0$      #$!  }mcNN?5 oXH2$(/<?KLRRVUSQG7*a7_T 7Lm"U["U*kFrO)qN6r`H:/'"#&$ j@ `AqV;# +Sk| 4CWn %>[|8cBuQ 1`.[ :d+R{$Do @o5^ >i"Ep9\Bf &7K\px  '3@M[u %@^z*;Tcp{ /?Mbs 1 R m  = b  : Y }  6 L a x    ! #       z ` = %  { ` L 3  z o d X L A 4 ,     } i X I 5 "  lM- n=_*u> k2uH!nN<(~tng`TJ7-xiYG</"sZI' xJ&c<zW9 18KRemv|zo]R?3 zS4lIoDb5kE$u`H7%   zkYL?%xpgWSA=98<><@BGMW`p/Ebs4Pj'F\x $5EUat $@Zx*BPgt '/?Mbp1Qj1FVlz %9Xv0U{"Ov5\} !:L`q3J]w (?_xA[ (Tp@g,Sy ; i , R q  . K g  + B U f |   9 X v 4Nj/EYlwueN7j7  u I \ % l 3 G g 2 |S0  )?MV_^_VJ<'b3PHo)_S|Hzfh\\_ccmo} gQ,V*S$pEX)sL!nG'nK'~\:pS3{mc]WJJ<>:ACIRWir$4JP`oymeRF0sU4"~ieTNG:=7DIVhz@^9Xx!+099>86/)%wdTB3"nXA. 4[ E V657(q?*aATu&-=CT[px)+304/&#  %&25GNat 4Wz@b*Kh $16CIQ\]^afegb^`\a\][]agnqr.I_x 8Rl:Wi   # $ ( % ) ( - , 1 1 5 9 5 6 * '    zfP>& |yvoqtzyob`UWSKG:>;A>CGNWfy1FZs  ) 6 = E H R W [ [ Y W R N F = 3 '   eZD:,s\G.c<ZKyBg5tS.bG( r]F+ t`N0sT/pJxFi> p@|O.eU5"{smh^\OL;:+&}qvjg^UA;$|]J, {kcTNA?=@DH]d}.J[k{)=Ok})Hi2^Aw-x N e2nY5U{!.?HVdx  3 9 P W b o    ! 1 C U a n }  & : G ` p    / / 5 8 - #  j G # b 2  u K (  ~j^RIDAACAJNX\jp{yfS5vR&uA|Mc;jR@({`>) |`A*oYB,xwqqb\L?3& vaH2scZSH@==;?B@D8910+)! rM,wN#e> t`A,sm`]XQRMQD@1)% xd^KD7({zmgZWTQSJSGJHFFFOS[bftv(:FYjw8@Qfo'9DX`ms&1=P_u +:I]m2Gc+GYr}*GHUW]a^igq|y~}z{wrkdZV@7"|zkjf]^ZWabu| %<Rm)E`s 6Obt !$07GRes  , < P \ j r o _ N D 8 1  r_UE6. v^J/}mU@&v^K7 ~yhdTI<(jL~HSz9c-c)U(iBhD'vcL4k]ND:+ ~k`KA."p\P;+ xrcUL;3,   #3;KSaj~ "(,1/2)+%  ~lbYRI@5+  (4CR\x-Mm*J]z$=Rf0Hgu9Wu2Ti 4F[n 'Ee 5\2b+`1dCyNM}@j&Db":Let  $ 8 = G W ^ v x } } r p k h ` Y T M F = 5 5 . . , , . , 0 ' *     vhZH<.*2<@KQZmr~~zriaPG6&aH& rT4oY5!l[G>+'"#'( #%$% mV<"mK/ oN7w`Q?/&|qfXUD:"|jK3iP:s\K9*u[H4!mR>+ {}x{yscXG=+}yyvtwsvmmfbd]a\XUTRTOQKMLNQT]fm{/G]n wmbYRE@55/-/-58=BJMZao}%9J`w :Wt %=Tn   !1=R`t.Ki6[Cl*No5Ys/OiD\ AZyFd,@Vo!1GYk{   " * 2 8 G M ^ g x      $ % - % & #     w n g [ X M I F A = 9 3 1 / 2 3 / / , 2 ) 0 ( - $ # $ "         |gUE/}\=yX6uGlB"xQ~[?zhWE;.'$! ()-+3067521*)s^O7&qaRB;*%vrnec^\[[[\TULJFD@=2,$lS>& tO-sJtJ#}Q$iDw^B&mZE5 vsngc]X]SXWZ^_gfpnv| $69CCILOVS\Va`nm~|-E_w;`B_H`3Kk !=Qo*;Ocu &2=HUcv0Eb{=Xv,Cu />Xi~"0HPco7AL\cpx%(07DObm,?Up'?^q)=Q`s}uh`M@, yld^VSKIHFFHJQX\afgoo|~xqh]YGA1' yp]Q@4 |p]M=, ymUH3" q^C+w^@, u_N7# sh^SH>2( xbWC2 nP5jN0mM1y^F-|o\LA2+|j`QC;& wcTD0ywpii^bY\VVUNPKJIGGBGDIKEHCGBGEMHQKNOMZXhhoqxx0:GYg| "28?EIQV[]chgjnkolhoinnuv*3=IXj{3Su+Sm7[r7Pg 3F]h} #)8;JRXhgyz#.EQi{:\~8Y!Dt/Wv -Mo *Gi'<N]t~wrg`WSJG=71'!xo`XM@7)wqhXYKIA=4/#{l^L?'t^A- qR2kS,qS7q_I8% xrdZVHD<4.%sdWD8&xmbSJ=4* yvieWK=3%seYE=%~maNA3' }tkl_]WMPEE?=@;?>>CEJQV\bjrz~ui`WMJ>81,)!$%)-8>ETVfkz%9Lbr1J`y-AYm%4KYm'AWt3Sq&Dg (E`~%8K_r'1?ETZfou#5DVhw+9O_v#3EVgr!$18ALQX_clsy}|xqrefWRJ@>2*wdQ;)pVC+t]H3 s\H4 iXB1|pd^QMBB:<44-.#'o[G2v[> e>`?%xeE4{jP<#j]D4 wc[E8& znhXVHB941)"  (%4190''%(&2/=8CCPR`jz0G`t(La=f2Zw*H`.F[r+:I\g|+;K_r ':Sh  <Tq?`z <Up.@U_mw  (*?BP]dx|&9@R`r*:M_r $*'5+7665/,(ydQ3 zr^UJ?7+&zug]UMA4$ }bU;, }nUG, nZG8%rma\PMB=<0/$ xcX@6"uYE*jZA/gZG;-qm`VNC;/& |se`RP@6' m[H4)yxkm`daefcgdjiosqwv| &&&-+3,:3A;DBHLRXahqs )5FRco ,8HYew$)3778410*+%ug_PI>8(#  '*7X]x~ &-=HVar} &.<CMW`ls    % * 6 < H K W Z e g n r v y y | } {  x x r n m b [ Q C < ) !   }jJ> cD)fI2lT=&kXC3rhWM;,l_E4gW<,|gZH=,& yi[E9'rYB(iG, pP8kW:$ ylTG3' tl`MF/(tiXPC6+%/6BGV_ny%,>DT`k}';Pk4Pj #C]9Pk8J`q"/=GUfr ".:DTdk| &+=BV_q)5OSnw$2EV^px '/7<HLWbfuz %.8<FLQXZ[a^b^XWQLID?=51,'$(1=N\iz*4DN\epzxmfXP@<-'~|rthg]SNG<;-0!  yo\P?-wfO=" mN7kV<! {iRA-wdZB="taR?5~k[G<'tmaXUHKB?;10( # vfYF2)cU:&iU<'{m`SF:.'  %$/19:A@FADAB@EDEIIPUY\Yb^hgosx)4GYn5Y{1\In .Mm.E_n,29CLS]alt}3D[i)G^|9X| +Wu -Nl6Ws)=J[ls|qskmdf[]STMJG>>22,((%!"   ""%&+&*(/059<EFPQWY[``egjnmnpolofi_dXYRIF92'|ncOL61!$&28>GKNPVQVPROMFA7/& mS<$ oQ6z`E3sgWI?0)!}{idUL?/#vXK/pWC0 wi\L>2  ~|ymphb[RG<5$# zkYN8-'2;JWanz{}upjgb_\YTRKLDFDB>@=<<:=<=?BDFLPY[jlz1@Sey 5D`q !5G`t&APfy/DZp *;Sh}%AXt2Kj)Ebx-=Xk )2BFZ^mq| &8?R_k} "(4=FRZfmty~{~rld[SK@;* {fXA4 v`[C=)qpbWNA4*vfP=)}fR<${oaTJA70)"  xl`XI@3#zfY@3! s`P@/%|bcFA* |dR9# jJ.{aA'y`I+{bO?/~wq^_KJ96(${stjqhrlrux &/;HTepy $-@HYbn~*6Rcz">Pm'>\o $;Zk/I[w -=N_s ):>PUek{(5@M]as|  *8ETcp%7GVcx*'3/:5<59410*,%%(-<>MRZ`fpu|{ti_QI7." ~zspkf_^QQ@=0'{ue^NG5*zukb]UTPMJHINLOVY`enpx}ldK:&}a@'aG+hT?(qaS>4 |j_LC.)wiUH1(pcVC<(%|~yyyrtkifb^`VYRQMIIEBC<=:3.,%(""   "!..=@LTUdfs%;Kev*HZy+B`u,Gb~%8[n&=Wg.?Yh*8P]q.7JWes%,9BIU]ks~%,:8KK[\goz"7DUev",=MXgo{ysljbd^]_U\TWSUKOJIHCC<9541--%${lbVE=)ziXE1zrUN5+xiXL;0si^SH:0! rxjnfa`UXKMAB:2- ubO>*yeK7udN?'mgXTIE<70)$" %().37:?>IDNLWZagitt{~~yzuqtmomjpjmiigiidfacaab[gT`RZVYWWQPGDB964,-'"! ~unh`]SRFE@;8326,8*6+317<>ECNMVR\_bfjou{&(36DDVXcfot} ")9BO]o| "7Pi +De}(D`7Giw-@Pdt )4AM\cr}  "&.69?HJUZajqz*9HYk}-:IYds}yrl_YOD<4*% {wopecWRG>9*"whU=-oaG8! wcTF1( xtje_VUJE>5/*!v[O6#gN7vb?(cL0|iP9$ j^J<* {zxsymyswwz}zrng]]SQEE;7.("  )*9:GJU[in{ &+8;FOS_^inz+7L]m+CUl~ "3H]o"5BUcv.8HTajz ",8:GMZ`lt~ !*:DSbk~ $/9>FMR]^elp}            "&'0.65?<GBLEKLKPRNSRPOIFD>=63-#!sc\IA0"}pgWO>7)  %&76BIM[[igmoottvyxz{xwqrii`YUJE92$ ~ud[G9) yo_P=3{l\N=2 rbP:-{k]J;){rdXNG41{ypjeUQ=6*! ~uj]UH=6%# "(6>NTgo,6@L[fx #2>IWclz  ./@EQV\fpx %)19CJW[fnx,:G[gx&5H[m|!2FUkz+DRgw$7J\l&6KYr|-BTgz2?R`o'.5=@GLOWT_]]d]e^`_Z[RNF?5.p`H;#~c`IC1'z{qid]RO@=.' ncRB8' yiPB, |hV?/ {j_ND4*wugaYOH@9/' rg[RH8/|rbYL@.!{uki^cWZQQIF@<:;7;:;5937/1++&&#xslcZVOHD><863*)%#" %$*+43?:IDSP``ps}',8;DHNS[]fiouw~(/>ET[ft %,:@KV[fpx "#24BGU\jp!/DOev'=Lcu(4GTdq  #")"+%*',$%'%**-1163:<BCJKWXfis%/BJ_ju ,1=DIPU\_hinosxw}}~xzpohi[ZOMED87*'|shaUQJA=5/+&$  ~ml\\ID7/%sqa]MJ:5. zsog`WOGA7/  zfY@3 pZB*xhSA. ~wxvmqfh`Z[VWWSXQSPLMIHKILGIHDE@99,+&}nfTK@.)~zuusmpjkhde_b[`W^VYTRNIC?:61,&" {{pkg]ZULKD?>42,+)*+(0+5-:2=9EHQXbjx2AVfy":@Ydx -8KUgv/EOev-DPjt(;F]c{-8FX_sy#2:FT_kt "+3>ELV\bilw~  !#*.38=>EFLMQTWX[\^__```_^]\Z[[ZYTRPLJGFEE?=97743.1,01/0*+!$}kbOB4(|nYO</ ~wd_NF>1+ ~vldZTHC31 wbU=0qZK8%s_RA4'{}ysrrmljfgeefg`e[^]Y[YTTPPMKKED=;53.-(& {yyutporqrwr~{ (/5;DIVWli)4BO\kr$'38>JJXY`hhus~ $-2>CMW\hpx!"5;L[dy  1CYi}.ATm{'6FZj{$.6=CHRV]cfpqz|#(,0389BCHJKQPVPUTYZ^^^^^_^[_Y]SXMREF?<51) tofZUIE5,# ui`SJC3- nbOD6%rbVD;-qk^VLI99+$ |tiaVKF;0'veT>0 xhRA/~r_RA1 qnaZTJC;1+"  %-7IK^asz ')16:@BEJGNGPISNRONLLLJKIIFDIFJLLOVVZ_ckvz!8BYhz'6KYr(9JZfv !!#"%+)2/68=CGLNWVdcqu(7DO_kx+6EP^fsz !,29@MOZ^cmr~'(22?;FBJGMINNLPKHF?>10($ qi]PG91"  {xoja]RPE@;0/!   #$*)2-2349<=>>::21.*'  }tgaPH6." ok[UGA2/~uhZNA1)pcXD:.yte^SIB<3,$zxld[TGB7.( wk\RA:)# |qlf`]TTKNDF?A:9551526B?HIMRWXeapp}|#&13>@IPXels{},;K]l} &6Nat 7K]r(AH^fw+3BMXbmt-7NXpw-@Ucy+7JTgp  "!*',+4,94==CJPW[^`cgiopxw{{idYQIA23 zj^N=.whS</t`M>,wkYK:.$ ~xnb`OK>:0-{icQF7( yoa[HD0-}}urmfg[aWWYSSSOOPIMIIIFGHELILIIGKKMPRXXebkmpxx!&%,,11463562<243/3/++%#  +0>BMU^it %(<>IUXeju|%+27:ADNRZagqtz#$()-148;?ELMTSZWa`mnz{,8CSYhox $+6;GHST_cmpv}|  +3:@PS^gq##35A@LNVY\ccjinntn{m|ryvwuttqnkfc`]\YXSSONLD@<7732.-(&"   xkgWTD<.  ~sqdaWPKA;4.'& |qd_PL9/ wdXE9&teUC6#pf[MD7,!tpd[UJ?9-'!yuia\QOF@8/& }}qofe_ZWQQFH>B885000,/(*"$  $,5@IZapz ,?O^q~"6?S\q|%/@I\dt~!28NUjs *.DMaly%.6CIS^blq{ '15@HR]cmx(3@FSXfgux|zsogeW\MQGF>:4)" {wka\QLC74.%$  |{xrnlae[ZWQPMIICCBDBDB@=:814-1/-2/01/22331/2-5/34262402+1)0*-+(+%%%  ~zg_MD3' |nYY<;& ysddVTHE;8-*yuj`YLF<4*"}|qme`]UTLJE>=42,() |vuknbc]Z]TZSVSSSSSURYY^ccmmtx} #%5>HTXep{%.7AJR\dru%&5>HU\iu~ #4ARcj{ -<Mam!1FRfw (8GWbu|!3>OWis (9JRfn"*47FEPSZdcnlsst{}}zwwpphj`_ZVSKGA;33'* |pjZSH>5-!{o]WB=,#|og`VQI@;,)}{ohaVQD?1* ~uh\RE<( |wbZK>2$ yj_UH?1)ylg\TPH?9/)  ~xz}~y{{{ ")+43;CMQ\bnt,/3:<=EFHMMPQQQRTOSOQPNNLKGJEJDDA?:945/,*%'#$!-)66=CIKSXZierv(34DGUZeku'.??TUfmv*3=HS]ip| (*(*.+2+2//5/:5?@BGFKPQY^bhlq{|(+34>=DDHJNRRUTZS^T\VVVRSMLFD@;92/*% |ue\OB8+ul]VC<)!pj^TID82+ |suhg^YRLD85&# |nfXNB:,! zvf[OB8)! ysfaVOD;.$ }yjeVOC?3+#~wng]VQEE89/.&   $ &23BHO^_ls~ %4@R^r{!4CUdy$6ESet):K[k{2?IXcp{%.8KOai{ #27FKV`grw   )"/*243=:?CDIKLNQUY_aeiirovvu{z~}|}~{y|}~|~~{|wyrupslmmeh_[[QWPONGKEC=;74.,("yutkjc`YWRMKDA@9:7530'& " |rja[NLB97&% {wfbVNH<9/,"vwmnfe^^UXRSNLHEA@;>58.-($# {rqgd[ZPOFF;:1,&$ |yol_]QLE>60&!wwpqiha\WSOMFG?C=>>6>3<4560757<=?BDIISQ\_amnv|%2CDEIIKNOTV\Yd`hgjolossyyxy{{~}{~wzvtspqnoijiffdb^\ZWWSTPQQPRPPNPPRQVT[Zc^`_deijikknmsrxvwxwxxwzwyuvrsoljecZYOND@52""wibVKB6,%ri_TKD83' plXR@:," ndYI@2& vkeUM?8,!|{sqidYXMIA<4/)& }wrnhcb[YPMIGBD>A:?:>:>;A?ECIGOLQQYW`ckivq~~ !)/<>JOW]fkq|"%,.38;ABKJSRXZ_eepjvryvy{~ !!**/98ACNNYZcenp~$4<PYku*6DQ`hy$47ANQ`eow}  %!'()-,3095::9?<??BADACDAC>A?B?B>B=>>:9;/5.1+-')"" }}uupkia]XOPBB;940(" }|yzrymumpjmghgbb\[VSONFB:6-*%pfTI<+ pdVC7& |nbWHB3, xoic]XQNFD<:2-(! |xroeg\[VQPJIFD=@5900+,'%    (,3;BKTYdks{.4GL^hs %*:CQZjr)2;GQZfqy".<DQ[dry %44DHSZ`kqy$&+.47:@CHMRX\bgksu|     {xxqqnkjgca`UWOOJIAD;73-)%xwiaWLB;0& wncYQI?8,) |vskmeebY[UTOMHCC8<12('!~wyrrlhdc[\UUQKIHAB=;;55/.)&%! |ypiaZPLA94+' !&(-/57=81+ {sh`TJ>4, snb[SID<3-' {yrmib^ZRPHB@45-&%||wvrqplkkfjdfbbad[`Z]YZ[YZVZTZUZXWYWXZY[\Z^[]^_]c^gejinmruux~!).>@RVcjy}!/;ER]iw %0>JVhq(.=EP[dow -3<HNX^frt '*7:GLS\cksz %)42@?JLUVa`iipuy~|wqji_`VRKJ=?1+" }wmb\TJB:/) }~tsmhe`X[RQNHKAG=B;=9:8411*)'#&!%!  trkea^SUKJEB99-/"& {wrkh^`VRLCB8.+ |{tplfabZ]UUQOMGHDAA:;7644,0'.&)*$'#%#  ~|z~xy}y{zw|w}|{~~| %).77@DGPQW[bdlptv .1?EM\_px /@L_k}%3>O[hw',7=FLTYbfmowz  pod\WLFB75+%|snfc[UNH@9/'}ieUJ?-' wb[F<-!}pgZPF70%ymh[VIC81'$   )$-027:==CAJHQOXX]bdglkrqtx{~ &,4=BML\Wgepz|''9>JQ\_ks| "(02;ADNMT[Wc\gdnlusxw}~}{{~%'25;@HOQ[]ekpw| ""'+.34:<DBGHLRQZU]Z`b`igkmpsxt|x~}x{uvqrnoij`bYVOLFD<:2/+$  zvkf[VJG;5,% {{rpkiba[WSPOFLBI?@<=:<582312/2,.*+))+&*%'$&##!  wng^VO@9.! vse_WKC;*(xqc\PE<1*zpcbON@<1&  *39DKV_gsw %/;DOZgn|%1;GP[fs} !1=GU^hv~$29CQThkz (&67@HPU``moy} #-3;GM[\lp}  !$#*$+**.+-.)0'+)(*('*'+''%#(!$$#"%!#     |snb_UOHB;8-+!|vhbSLB41!uog]WPID;4/%# {{uqplgidd_]XUUNRMJQHNIJIGIDJBGDJFFFHGKEKGJKJPNTSVWT[Y]_^ediflfojnppvrwvxw{rxruurssrtnrnolkljkjfgdba^]\ZXYRWSQSNPMHJCI>C9?9:622++#%ywqpjifffba^]Z[RUQPTKOKKHJEGBCBBC=E=D=>::997300.--&*%%# ! &&+*2.79>AFELLOSTYW`^ehjptvx}{ ).=?RSfly&,<EO[bpx "#/2=CHOR[_glrz|  (01@DOVZdkk|y !(,589BAGMMSV\cekkrrxy{}}}~~{{uspjjde]^WUOKD=81.# ytgaSK>4) {obTG9.xfZH;/# tdSD1!vkSK7* ugYKA3+yspcfYZQQJIA@;;;5756434536478977<7A;A@BFHJLPRVV_`figqmxv &(53C@OPW_bkry} &*504%&   $')/43::=F@NFSMZS^X_\daghillrqwyy}~|~uvqmnjjfhcd\[WTRMJICD>;911)%   |wnh_\QKH9:)&!ul`VJ<3'|pk^XPD?6** }|u{ptlofj]dY_X[YXUWRUMPGOEKBF@@=<:<48231/.+)%(#("#   #*06?ENT]aqs ,8CL\es ".8DLVajv} "$05@DMVXgdptw #)04=@KOV[eguu  ',18<CEMSVcdmqy{ !$,-2255;9@?DCGFKFLGMHIHFFGAA<774..('   xsiaZQJF84&"}ynkbbVWII>:2,*"  |tphb^TOEA=53*#~|wurmlhhcca`^^VXPPOINDHA>A:>;9;661625-3*1-.0*/',$'$ &#   zyrkjccZZPNLBG:A49.-)#!  "#'./4;@BGCLELHIJILKMMNOPJPHJHEFDCE@E=D:@=;:37666434/10-/).())%'!$#$$%!(!( $$ #"'"*'*/+34598?=B>FBJJNQQWSZVYZ[][]]\adgjmmsmrprnrnurwuxzwyyuxuuwtywxzx{yzyw{xyx|{}{vysurpolide]`WVQLIJDG@C<=57--)$% ~yspgd]VVLOGD>;3.)" zvrmgaZXRLKDB?66*) zxtplh`^XTTNPJGB>:61-$& ~vumlbdY\QSJMFGD>=8320+/+,*,*,***,*/,01084;?>DBGJGNJSOYW_`fflktuy~~ %18>MJa^pv  -6EH[[ilw~ #"82ECKPV^glty  %-3@FNZ_jpz #$.3;@IHRQ][fflpux}~x{uwqslngjda^[VVNOHICECB=>:9:644/3/2.0.--*+%&%$#&#&&&*%'''&('*)))''')+*3)2../*+'%%(")$('#&!  }zpncaVPKB>1+!xughYULC?0-"!xnnb`TQED<71'& w{oie]YQNFC@:942/)(  "$&,-.549=EBOKVWY^[baghkrqxx~ ##.16>AHPTZ^fkqw{ #+099GEQR]Yhfotv|  #%!%&%&%'%+'*+)+*+*..-0.//629586949499<:@<GBLEMJNMOTQYX]__egimnpuvy|~}~}}yywtuosmojkigieheeedcdfaccdfegfgiiljmjooqsrvuyyxwzwyxwyyyzwxyuuqonljjdh`a_\[USPMHJ?C=;;733++%!  ~qqfa^ROH<9,% {ol^\PKA=3+#}xwjnce[XSLKCB;71-$"  %(+37;ADENMSZYefnuw !')-178?@DIIQLUS]Ybaefffefhhoksoxs~v{ &"3/BBOU[gjvz"+5?EOV_fow "(,:7IETU_ckpu|sufhXZIK>;4-%# }wulhaYTNEB86+(! wxif]YONBC84-'! |{vupokhibe]_]XYSTPMJHFCC>?>;<8:5732.,-(+$%  |}uttjlgdf\]WVTOPHLBH?D=>=8:86725345463544322012205.404/3/0/-0-/.///.01/22456699;9>:?>@@FBIEJJJOPSWV^[dblgsqvx~} (%*.177;?@FHJPRWX]_bekmsqzz  "!%"'(&.(2.72;=@AGFMONWU[[adgpmyv| $(.088=ACFJNPUY\_cckjntt~|  !$$-'0+6092>7B<DCCHAIDIDDHBHCEFACCDA?@==9=694313./+)*"'! vuhe]VQHF=:/.&! {xqle`YUNJC>72,'!wuff[UOE?70##|xkk^ZSKG==/1%#&')168<@DHMNSVYbchlquz~ &+.<CGEPIWP\Y\a_fhhliopqrsuuuwuxtvuqvoqpopokkiff``XYQSLMCC>972,(&  ~ysoec\ZRTEH<;12&'" xwsmlgdd\_VWQRKOGHGBB@=<;68525//,*+)(''%&#$!  {{uxnqjhb_Y]OYKQHKCD:>640,*)#! ',2ENX_jrz (+28<DGMOWZ\efmouww|lp^cTRKB=6/(! |tj_YLC</* ~wmgZUJE;5-(! }vpjeaZXUKP@A;21(& |twnojacWZQNMGHF>@949+4'0"*!$!      !#&$*'..35;8BFHQP\[eelpuw| &%.,72=<AHKMSSYZ^`egkmqrwy  "#&+(0-0323736553525533514425.4.4-1/,1(0)+*&'$#""   upgeYZNMB=4.% |vieXOG97'  wsf]TLA;1&!{xqpdg_^ZTTNMHGAD:@7=3;3943736477;<;>A>FBFHLLQPWX\_beinpuy|  # +%/13;8@CFLMTSV]Zcbfokswt~{  !!&")%**+-.00474657677:6=7@:@;?<?=C=B?B?B>A>B@@A>@<??=@;@>>=?;?:=;;=7=79<6?8>=>B>DBFDLEPJQOUTVWXYZ\^aacefikppxw~~ "",+074?>EIMPYW`aflnst~{~yyqrjfc[WPLBC:820%& ~zrnh_[TMI;;.)# yqjaYNHA62$#wpg][KK=71(#{xyotmnmjmggffdicjgjjmlqppwvz|~ ()24<=HKSW^biorx %$0,69?:=5:264411/5,/+,,,*-(('(%&!#        !!! % #$!'$&%(((()++-.1/2/20221262879<;?A@FBFGHNKRRXW^[aacdjioqty{!'*109>CGQO\[ggpuv~  "-+57ACLPWZaelnvwz~otfh\YNLA=6*+tphaYTKH@;90-)!}{xvurnlgdc]]XTSNKKBG>?;754//(-$'  |{xwwqsoojigde]c[^[]V[SVWTVSPSNROPNNOOLLGHFIEIGGHHIKGMIKLMOPQORRRYR]WaZb^bbbdhejjolrrvxxz| &.0;9EBOQY^bimtv!!'+/69@@EIMRUZ\bdjmru{y    !!$))./368;;@ACEJHSRU\Y^_`_dbefhfojrmsruuwwzz{}|xzzxwtrtjqhkhggfcba\[TULQHLGEA@9<602$.$ y|wttlmch]d^_ZYWQOPFK?C>;7715(1 ) |z{synukqllmkhehbca_]]W]TYTYSUQQRLQNLMGJEED@E?C>?==::4908.3/-/),**')%*$'$(%&%&$"$   !&),/299A?HGKMOTWY]^f`netnwx|{ " &&+-35;?CJKSSY\_gerpy|&&./77>AEKKSQ[Xadhkntt{yyyrpjbcVXMKDB<71,$#{xpnie_[USOIH??:46*," ~xtoke`[WPOCC;;40-#(   #%&*,*3-5478;=?@CDFFLHNNMRQRUTUXW[X\Z\[[^XaZb^c`eaebfahagehhjijlillknmorqqutwxu|w}z{"!)(145<?DJLRXXbbkkrvz     !" !           zvrlffZ[QPGG<=11)"" vskeaVULKE>:7)- }zuspnliieeb`a\^\\[X]V]WXXWVXUYTYT[W[[Z[][\\[\[`Y`[_]`^a^b_d^fadbdacb]d\b_[cWaY\[YZZZYZYX[Y\Z\Z^[`Za[a\b_dfgiojsquzy #"*-57A?JLOWY_ejmtu~$'-.98?EEQOWZafkoszz &',249;BGFNMU[Yecokst{wtsonjhacYZTPOHIBB>;7510)($   |xzqomgfa]ZVQNJFF??;77-.$#! ~|}uyvtvqrsnvluorompkoiojojlllkkjjkjnimjniokoqmspprnstuvwuyuyvzy{x|w~y~{~}~|||||}}|{~x~yzxyv{v{v{vyvxswsvsxrzp{q|s{vzxzyz{}~|~wxvpslmjeg_bZ\SXORMIIDE>?<7:27-2),)"$!        "#$&),/347;;?CBMGRNXU_^dgjnrtx~%/6<EHSY_gpt  %/3>BIQV_akmtz $#,-268@>HIJSPXT\Z\`]bbcfdfhijihkijiihhch_h\dY]XUSOKLEG@?;64,.$# vukg]\MK@71+" }toe^\PPC@91, {rrbbWVIG=74)% ytqjhc\\WSRMMKFEA=<8:28021.1-/(,%($( ' (#%&%(%(('*&-).-*0)0+0.1141627589:?AEFILPRYW^balirtx{~~z|uyssqlkkfgcb_]Z[RUNMPIMFHGDB@?:<79636.5,2+/***)%&#&" %$ #&!'%((+-.14389?=@DFHMPRXV`]gfomwv~ ",.5:CAPMZ[`kjuu~ "&.,549<>DDIJOSU\Zb`gejmmsrxv{y}~{xzuvtlrhneh`b\\VVOQILEF?@:81.-%&|vrld_YPPDB:6,*!xwli`^VPKD>:2.)$ }~wyuqqnkjiggbg]e]^\\T[PZPTPPQLNMJLKJJFKIIHJIIKHKKKKLKMLQMRQRUSWU\U_X__`cdgiiqnvtvx "$-,57?AFLPTY\bfiqr}| $$+,157;ABFMJSSU^_bfinquu|{|~wxrrrhpdhdc`_[]WXTTSPNLNNILGLFIGBI@HAFCDDCECFCFDFEGFIFKGKKJLILKINHMKLNMQLRLQPNRKULUOVRTUSUQVPUQRQTNVMSNQNPMLPLLMJKIHIHIGICICF@E>C>B=C=@?=>>=<>8?7@:?=>?>@?A?BCCGEJKIRLTOSRUVVXXY][a_afegijmpmtwtzw|z~}~}||xvutroolkggd`_YYVRNJGG>B791/*)  ztmha`WVNLEA:70,( }zutlkf`d[\WXRUKRHMEEF=F=A==:?8?8<;:=:=:@=CCLHRQV[]chhmpst|{ (,08<ALIXUabjqs|}~vtmhd\XPLE?:2,%  |vofeYXLJA?62*' }x{rrnkkfgba_Y^VWWPWLRMLMGMEHECF>;AA?ABAABAF@DBDCDFDHCIFIEIDJEKELGKIHIKGMIKKKLLJQIOLLPJPKRKQMRQQOSPTSUUWXV[XZXXXYY[ZZ[[[^\_^__`d`geemfolnqmrptrxszx}{  &()/1377:=@EIMPRWW]]acffojsoyt~{z{vtoohi`a\ZXPQIHA=<36*/$'  ~|xrqjid`^YWRQJLDEB@;943//))%!!         ##"$%'#,#-%-*.)2)1+2,2-/1*0,-,,++*))&*",* % #"      "%"((,,224:8B=ECJIQRUZZdakjouv|  &-/89?EFPOWZ`djlrvz          ~}|yxxqwltkolmikfg_b[]UWRSNOMGJAE?=9936/3-0((%! }w|rxrrrmmjfi`e_ba`__\_ZZXVWTTUTUQUPPSMSKONMOMOKPJPKNJNHNHLKJMIOJMJLKMJLMMLNLLNNMQNOMNOKMKMJNJLILLKMINIMHLHIJIGHGEFDDB@?B<@=><>8;97754441300//1+1+0,-..-/,0*2+/+//.1+4,01031253868;:=>>AAEBJDKGIKGPJOOPUPXSUYY[_]cagfjjlnnppsutyvzzz|~} "*$--064:?=EELMMVR\\]fdklmvs}{     %%#"'#%&'%(&()+-,,.,-/-10/102.1.11121404/2./1+1*.)-).#,&&%!&#  }u|nqijgacY]UXPSIODFAA:<968320++(!'! ~xyupolejac]VZOUINIGEB<>8751*-&##  $ "'#/$/*2/559;@AEGKLPST\Za^fhkppwv}} "&%'+(.-0/4.60:2;6;:;9<>:=<:?9?=@<?<><;<;<;<:;:9:6>3=698;7;85=2;59686898<7:;<9=<>??AFAIEEKFKKMNRUUYX]]]bafgijoosrxw}||xvuppljheh`d[^Z[XWVSUSSLQKOGLCGAE@D>B=<;<::7787793:193536562606.3.1-1../.1.4.4004/4232554728190807283767:88:9;7<7>6<7;8;<7=8<;::;<8;98<6;7665/5/1/...*.',(%%!#  ~|zxvvqpoiiec`^ZXWRUIUCLBB>=;96411.*(' $    -$0-76:>AFIPPYXbbgkqr|| "+-7:@DJQTZ_bjlqx| $$,.25;9@@CIGNMTTXW[]]a`cbdeghhkkmlkommmnmknlmmkmkkijehdfcc_a^^^X\VVVSRQNQLOOJPFNGKBI>F;B;:<3<162020,.)/(+(&*%'%##!     }wqojccZXTMLFB?:41-&# ~xvqmheb^]UTOLFE>?862.-'#"    #%'.)346>:@DFJLPPWW]]dckjprwx  "$"$"'!)$*((*(*+(-+,/+0,/,1.0.2+301//3.5.210/0/100/00-//-1-.0*0',((*#(!$ "      "($+)1068>=DCHLOORXX^`bhjkrqyx  !#" ##%&#)$(&(%)#(&#( (#$#"      vwnnfe][UTKIBB:<01,'# }xusmhg_`XYSPLHC@<:5-1$)  ||wzsvtosjqhrgngkjjkkkqhrlsqsttwv{y}~} &"/03<>EKMSY[eelpuz "&+.4::ACFONTYXbahkntvy #!'()0.44;9@>@DDFHGKIOMQRQWTV]Q\VX\X[]Y][]Z[XUXQRPONLKIHCBA:?682/0#'  ~v{ppjjbd]]YTSNMIDC?=97301*+%& !   %!%($/)002457598=><@=D@FBEDEFGDHEDJBICEG@F@BB>D;@9:7551/0*.&*"%! {}vxurrnmkhhdaa\^YVWQSMLHIDE@C>>;9844.1(.$)"% !!      #'$(),-1366<;AAFFJKOPTUWYZ^_eehhlnpvs{y &&.056?>GGNQS\Yfehonwx  %#))/,6396=9BAEGJJMOSTWVY[XaYc\e`fcfgigkglilkjkilijiihidgcaa_[_U\WTUOOMIHFCC>>;97602)+%&  ~|wuppfj`_\UUMOGF@=;62..''" {t{qsrljideb]\XXVROOJMEGBB?>==4815.-.()# !     !'%,,-4089;?ACFKHSLXT]Yb_hdkknrqwxz} " &&)*-+/0/3377:;?@?EBGGEKHGLFNIKLNNPOPPRPRRRSQRRRPRONQJMJHJHDGBCBD<?9<97530.-+)%$!    ! %#()(-*.0+3+30334567<;=>?AECHGJMMQPWXV\Ya_affiimpnxrzz|y|uvmohhca\\RXNPHJGAE9>542*+#& |zpqhgeZ]SSLKBB883..&%  }}}}|z{z}|z|{}z{|~ &&+12=;FFPP\\eikwx %$./8<@JIVW^djmuy~  #&--43;9@AEDLHQNVU[[^_ccghlnnrssuvvuxuzuywzwyxxwywvvwquotnpmnkihfc`bXZWQTMLKEH?@;721+(%" ~}vvlmhf``X[PQLGC@>660-*&" ~{|      ~|~ywwrqrikfecab^a[^XZUVRRRNRONNKOGJGGFFFFEEGEGEFDHDHEFGIFJFIIEJFHJJILLLMMMOQPWPUXVZXYY[Y\\]_]``badbedidkhkmonrqusxtzwzy||~ '&-23<;DFLOVX[cciklus{   "##!&#)$($)%())***+**,*,.)/*+*))()#'%#$! !!  |yqrhj_aXWTMKIAB9923+($  |~yzuusrqklggfbb]aX[VUTQOPKMHHHDF?C>?=<:;76523/.-+))&($$#"""           ! $ )#*)).-10458::>>@CAFGJKOMTQWYW`\f`jgmoovt{x}   !"!#$$'%)'++)/+0,-0///-3-5/704416116/5214.41123332528284668888:6=4=4:8:<:?<>@?A@AADCFHEIHJKLLOMQPSSTXU\X[^\a^d`icigmgoionnqpurwwwzx}}}{~x}w{xyx{uytvqupsnqmnohqeneihfffdfdedbbab```a]`^Z]WZVVUSRQSNQMNNIOFOHIIIFFEDDADACB@@B<B<@?<@9B:?<=;=:?9@9?<<<@9B:??>C=D@CDDCFBDCBDABDAEDAG>E@EDADDGDACBE@D@E??@>=>:<:988482706-2+,+)')"' %!  {xyrrollhfdc``]YZXTVQSONMLJHHDED@D?@>?<=;;8<899683617455281716281817151331415/5043465457393;789:8<:>;><>B=AC@HBGHFJJMMNPQQWQYSYX]Z^_^dbediglmksnrtqwswvyx{{}|  %#,(1/285<<BAGEMLQUUY\Zc_egfoirmxszu}z~{~wxtvpsonnilhggfada^bYcV]VYUWTVTRTSQVQTTPWQVRSSNVKXIYJVMPPMNNPLRMQOQMPKQKRJLLIJKHJFHEICEAAA>?<=9<5632210/-*+'&#!$  {~{zzx{xxvysxrttssprpoulvossstusvuvvvxwwzuzxzw}x{z||}|| !$$'(')+,0/24369;<;@<C?FAFBHCIBKELHLMLOLQOTPSTSXUYTZVZVYTYUXXVXWU[SZR[UVYTZUYU[R[TZT[R[TYTWWWXYY\Y\[^[^_\`^a_dacdbgdhgliknorptwu|w|~|~{}txprnlhhcc`\YVQQJJFDB?=8;/5/-*)(" ~{|zvypvmppjnjhidg`d]``Z_V\UWUTRSPSMONMKLHKGKDEEBCB=B;=:9:7654231100..-,-*,&**"' #!!         " ($*,+332:6?BCGJOQTW^[ebikmquv{~~}wxrqniie_`\VXNPKHCC=;833.+)#! |wuoih__YTQLHB?;34*+$   !%*+/43:9>ACGKLOQVW\^agfmktsw||  &',.238;<CAGJJQPVW_\gdnkqswx{}zvxtqrmmigeba^]YXVQRMLJFBD;>8743/-,'(#!   % *$-+.0.8297:=>ACCGFIJNMPPSRWXXXZZ\[`]badbgbkbkggkjjmklnjmkmkolooopnpnppmqomonmnpjnkklhjhffeef_g^ca`__\_[Z[UYSVSRQNQKLJJHFDDBB?A=?<;99838/7-4,1*-(+&&$$!  wxrongea_Y[QRMIH@B;;913+-'&      !&%)+-145:;@ADHKJSOZVZ^aaiilrrvz} "#*+/23;:?BBKHORTZY__ffjmotu{zyrwmofi^aWXQPIIDA<85/,'$  ~}{vwrtlmiife`c^_][[ZYUZSWTTTUSVSVSTSSUVSYS[VYZY`X`Ya^aaeegifohrnrstzw}|~  !'%,-/569>=EEKLMRSWY^^fajhnnxrz|{}|vvpqiicb]ZVTOLHEA<<36,.($" {zrrmhg^aUYRMKBC;=36+.%%  !"&(.039=@AJJRRW`\ffoovx~ $$++2299?CCJNMWUZ_^geiomvuz|~{v|uwrtpplljhfacY`UYTPRLJJDDA=<762//+%$!  "%#()+0.3367;7><?@CCEIHNMOMRSQXQ[W[\\`^aadafehijjknmnmportquruwtysyuxwxvywyyvyyyyvywyyxytzvvtusunrpponmmjjghgcfc`d^^]Z\WYTXPRQLOHIFCH<B<9<2:.3-.*'("%   ~yu|rvqrmoijgfdab^^ZZVURRRKMGJCEAA@:=7844/3,,,&($#"    !!'%+-5198?ABJEROUW]\gcjopwu| %(*32;;CDJMRT[\ckgrrz~ "%(&)-*0/14282:89>8?;<@>??B>A@=B>=@;A<?:<9:7937222/,/(,((&#&# y}ptjke__XWQMKED?;800*'## z|xstonjgfdb^^ZZYUTRQRJPHIIDGCCB@?A;A;>9<8<87;6:6:899;8<:<;?:AD@ECDFFGJGLJMMMMNPNUPXSYWX\X`[a``f_jeihljpnprrutwww{z~~    %%"$#&%)'+'-(-)/)0,0001133142535456475481853727736827253223/2,0+/**+%*$&#"!!     "&'&)**-/30485:8<=>?CBGFJKKMOORUUW[[]`_ecfjipmstvx{|~{zwupoikdda^[YUTKMGDC;=734*0&&%# ~x~uxtspnhmcfb^bX]UZQWNULNMKJGDE@A>?:>8:76735141/3.1-.-.,-*/+.*,++.*/-*0,1-2/02/6072:77<7?;@?AAECIHLJMMQOSRVVXZ^Zb_cddfijkmpotruyy||~ # '')-+0.52687<;=@>BCFFHJLNLSQSSTWWYXZ\\_\`\c`ccceeggijimhlliplommnnoopqntmsntrrpqsqrpoppoonnmpjpkqgqjmjilglflfhgggfecg`g^f`a`]`_\^Y^YYXXVVVRWRTSRUNTKSKQLOMMMKMJJJIIFKEJEFIDHGGFFDGBEDCDDCDD@EAECEBFAFBE@EACCAEBBC@D@B?A@CABADACC@F>D>B>BA@A@@C>A@@C=C@AAC>E>E?D?BAA@B?C@?A??>??>?<<>9>8<987471612403,2,/).&,&'%&"%#!    &,%,/.446::>CAFFLLPRSVZVaXd`egfkoluoyt{z|}~~|~y~y|v{uxxr{sxquosmqlpknkkjigkbhbdb`b_`]Z`U^TYWSVNUMQKOJKJGGFCCB??=;;98572511-/(.'('"% !  {}x{wwtsrtkqjkkgidh`h_d`a]]^[^X]YZY[YYYXXZWWZV[TWTZTXVWZWZZW^X[][a`a`ecegfhkhohsktquuuzx~{~    "!$$!$ $"%#%$'&'%($)#)#(#($&$%$#%!%"%"##!!!" !  ! !#""" ! "!" # "!! % #"#$#$$'#%%%$%%%(#&#%#'#(#'$$'#'"'!'"("*")$'%)$)'(*(*-)-+.+..,0.-2,20/01040717364676:6=7A9@>=D>DADBFBHCLFKGLGNIMLMMPLSKTMROQSQTSRWTXWVXWYXZV[U]U\WXXWYYZXZZXZYWZVXWXVXVTYRVTQSQSPTPSPROPMNMMLLLINKJJIIHGFGBGAC@C@A@?><>:<98:6837/5.2,0+.)-&)&'%&"$!" }}{|{zyyytytwrxqsorkrjmlimhjgifgedfad`d_c^ab^b]d^d\b``bcabeageeifhhkfninmlpmqpqsttxv{{{~~  ! $#$)$,(0,205479;:>=D@FFFJJKPORTSXYZ^[c\eagihknmprttzv}{~|{{{vztwrtopokjhfeda__ZZUUQONGKCCB<=:56-1))$$ ~{|zwyuvrspqmomkjlhjifhhggieldjfjgiiihlhliljmllpkqlonpqqsrvtvwwvyyy}x~z}}}~~ !##!&")'*(+,/.2/333448596:9<9?;@>=C>EBBCEBH@HBEFBL@IBHDHDFFEFCDFAEAAB@?A;B7>99875323/1,0(.%,#)"$!      "$&((,,10365=8?@@DDEIJJOKSNWRXWXZZ^_a`fbkejmjoloqosrsxq|vw{v{y{y|{~|}~~}}}}}}}~}{x}x|yx}v{uxvwvuuusuotopqknjjkijgegaca__]^^ZZWWVRUMTKMKJIDG@B?>9?5;4520.,*'($"" |~xvtroogkfce\`\ZXVTPTLOMIKGIAH>C==>9:676422/1/.,,+*+&+%)'&'")")"(%')$*%(&'&(&(()*(-+--/.3083888;;=>?ACAFEKIKMNQSTWYY^]acfhkmostxw~}  %")'/+11588<=?AFDLGOOQVTYZ]``eehkiqmtruxy{|~}|xwqqilddbZ[UTNOFI?@;:531,+("$ |{}{x{xwzsxrstprnpnmokmlmjmkoknnnmomqoqqrurvtxv{x{}{| !(',+137;;?BBHELMNTQYW_[c`gdijkmrpwsxz{|~~wr{mqjjec_ZZUROLKEC?;952-+'& ! |~xxuuqpmkjicg_d^_\\\UYRTTPQKQGLFHFFEFDDBD>C>?>>=<@6B6?7=9=8:;7?6?8>=;@BACCCGBHEIIKJOMQRUXWZY_]caifmmnprvvyx~~  !##%'()-,/.01344677:8<;<?<C=C@DDCEEEIIFMFNJMLOKSNPQOSPRRURUSURUTUUTVSVTTUSTQVNVOSQQOPMNNLNJMHKGKEHCGCDB@?>?<<:79431/0++'*$'#!      # ##(&))-,/.206195>6@<??D@I@KEMHONNSPUUVYYY[][_]a`abcdeeeifjjikkklnlppoqoqqrsqrssuttuvvwwxwzvxwvzuyvwwxvwyuzuxuwwtvtvvxtvsssrsqtmunqoopmokmlilflclcjbddad]bZaX\YWYTUTQSMPKNIJEJAE@@=>9:98656.4+-*)%'$  yyuqpkihbc\_WYRQPKIHG@C9>97612--+*'"& !            !!"&&',-,1-6197;>?DDHINNSSW[\bahhlnqszv # (%+,.4376=<ACDJJMQRVV\\baeihomssxx|~}xyttnpgkbd_^[WVQRLJGF>C9<44//)(%   }|zx}{|~wwy}{||~~}~    "!#'&((*(-)1-0011727769::>;A<C?DCCDGEFGEIGHIHLJLOKMNMNOOMNNMQMPPNNNNPJOMNMJPINHJFHFDGAD@@=?9<6858/4./*-&($# {}|yyswotmpmmkgkghfegcecdadb`c^e^a`aab^d^ebefcigigkjmjmmnpqruuxy{z} "")(..1387==ADDKHOORVUZZ__cffklmpsqyv{{}w{rtqnmihbf^_YWVOSFN@H<>6901+)&" {{usqlmeibc_][YXUSQSMPJLJHHDFDF?E?B=>@;=>=?=>@>=@?C?DBEEDGGHJIKKOOOWMZSXYZ]]``ddghikoouqvuzx|||    !$&"&&(','/*-..00407074686;:;>;>??@B@BCAGAJCIFIHJGLHMKLMMMNKOJOKNLOJOKNJLKLJKIKIJKFJFIIEGDDEDDBB@C@C=?><>8>6<695828/6.4,2+/*,))('*"'$     !$!$$&%'(',(/-.0031445493=1=5:98:9<9;9;:::<<;;;;;<9=8::8;8896:695857433333222001.3*3)1+/)/*.*/)+*))')&)%(%(%('&&%%&$$$$"% %" !"#    #!$$&(')(,*-//103153657879;8<9<<<<<?<@@@ABBDFGEFHFJHJLHOIPKQNPPPPSRTUSXTYV[XX[W][]\^___`a`c_eceddffegfifjflijjjilgngmjjlkhjhjhiekdhgdicfdad^a^a\`Z\]Y\YXXUUUSRQOPMLKLIIGFECBAB>@==::8874514//--++&*$'"% "       !&#&&&,).,.00326599;<==B=BBBEEDKFIJIMLNNNROUQUUUWWWYXYZZ[\^[^]_^^_^a]b```b`cacccdcdceecfcfedfdedeeddebddcdccddbbbbbb_b_`__]_^^\\[X[W[WWXUVSURURRQPNPLLLHLHHHDFBDB??=<<9976425.3,.**(('%$$!!!    " $#$'&(*'.*..0031554:4;8:<;>?>?@@AAACCCDECHEGIEKGHIHIHKHKHKIKJKKJLJKJHLGMIJIKHLGJGIFIDGFEEFEDEDBBABB???=?==<;<;<9:::7:5:7867746415/4.0,0+-+.(-',')'*$)#)#%"$!"!!"           "#!##$%&%'(')))-(0*0+0002335546769699::<:=;@;A>@ABBECFDICKCLFLHLJLNMOMOOPRPSRSUTVVXWVYVZW[YZZ[\[^Y_Z]^\`\^^^^^^^_\^]^\^[^\[[\[ZZY[YZYXYWYVXTVSTRRQPPNNNLLIKIGIDGCE@C>A?;=:966644200.+.)+&&&"#       $!$%"'%',&+*+.,///2133546577:7:9<:=:=>>??@@@BAB@D@CBBDBDDEEEDEFDGECHEFGIDHCHDHEGIFGEHCICGEFEEDECEECCEAE?CA@A=A>?>==<<;:<6<494734604000/,/*.(+(&($&##!!        !!$%$#"#$"$!#"##$#$"&!&!&"% $!"" "           " &!)$,).-/133769<:?=AACDFGHJLLONPTQUUVXYZ]Zb[c^ebfefggiijkkmlnolqmqqqrqsrtrtrurttrtrtrtsqrrorqormpolojmkjjhghdeccac]a]][[ZZXXTSSQRMPLOHJFHDEAB>@:=8:666221/.*-()&$#!           ! "$"&$&(((*)+,,.-0/0122344657788:9;<;====@=B?@BACCCCEDFEGEIFIGIHIIHKJKKILILJLMLLLLMKMKMMLMKLMJNJMLLLLJKJKJJJIIKFKFJFGFFFCFCDDBC@B>B=?>=>9>7=7;58563413.2/,.*,)*&)$%$#!    " $$&&*(,,-/013266899>:?=?A@BECFEGIIJJKLMMONPPQQSQTSTTVSVTWTVUVVVVWVWVWVVVUXSWUUTURVSRTPRQQPQOOMOKNILIKIIHGFEDDD@C>A=?;=9:97654322//,,**''%$"#       "!###%$&&&''')'*(***++-,-..00/1011122232334353534455453444443232212100///-/.--,,,*+(*&'&%$$#" !   !!#%%'(+*/.13275:9=;??@DBEFEIGLJMMNOQQRSTUTYVZYZ\\]]_^a_aaadbeddgcidieihgihjikhlikjkjkkjljkkjkkljjkjjijhjgigggffffddbdaba``^^^]]\ZZYXYVXUUTSRQPONLMKIIFHCDAC>A<>;;986624.0,-**)&&#$"     "$!%#%%('(())+)++,-,.-////100102113040314123131121222211110/1.0.//-.---,,,*+*)*&)%'&%%$##!# !     ! ""##$$%&%(&')')*+*+,,.,/////10313242625537466687888898:8:8;8;9::9::9;99;8;9::998897776647462434231312///-.--,++*)(('&%%"$!"!     ! !#!$$$&%&&&'()(+(,),,,.-.../.1.2/11113142343443637466575767666676677666757465544324241212100/./-.,,++**)(((&&&$%"#!"           !# ""!""""!#""#"#"#$$#$%$&#&&$'%&'%(&'''(&)')')'*))))*))(*())*)+(+))*)+(+)****)+(+(+(*())))')(''(&(&'&&&%%$%"$#"#!! !                        ! "!#"#"#$$$$%%%'%'&'''''(&)'()()()()*(*()))))()(((((('(&'''&&&%'$&#%#%"$"""!"                                                         hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/TomFloor-Soft.wav000066400000000000000000005404601366722712400235730ustar00rootroot00000000000000RIFF(WAVEfmt DXPAD data0- h <F]-il7 ! !!j"="! k !! R B-l(wE_ ~ZMXt\IIECoV / R u3u )y2;`  RJJ YQ-#Ÿ+Դgpmyc>])cqөҙ~Ї϶#m2~:ָ*ɴ7+ѻ cyUƆ?U˫dΎVI=8V&ڜڱ_mFS761tc[oY4\ +h6JR |UW"%>'()*m*++3-.v0246L7#76Q4e20y/..//=00/8-*'D$!%}v !"$#" !EJl$fn O > ` * QE7X"HiNq C dZ>W" W1~P*b8_[s %ݠ܊<ݞPߝ&Zoy,0a] W  &   m=9 Z}Syd4Ew5 !!"#o$%%g%^%a%@%Z%%%0&&'()++W,,,,%--.0n12345678$:r;<=>A>>>?%@@A@ @>=d<:^9 865e5432M0F.+)&# We% 2xN]G A ?5H| b4zsJYSx"D9 %X` b PhQ>x(< ]Rl? B R K | ;R1s}R!<w  Y j %Jkw%! }6qL& {e ,1e5!D#d$ %a%x%m%$O$`#)" ie~ |+BzcEBPu&Bv 5=Y _   8 "f N)XoP`SVxy`LmX%gߚWۮڗُ|גNջ!Ԑӟ{ҿ2Ӆzo֫֡;4ծ"֊ւ0աaԻԼ(ԑI xxҹO$}.<]ڢX۠Ze2LCf_Rj#MdZR[>T'mNOl M :fZnJ )  Z J  u m o o f SrN  6 } V'  rW{L4 Hj3C'M|.3!*D D-;7 A?d[*g/ 7^I\/H_aI ,)L"`  *"W -?xTR\M{x2` t {A5HB` L u b J O %  ){\jW-aU !c"$#$$6%%&\'%((m))f****L*))-)(a('' '&o&&b%$#r"h!i kznS5|E  %@Ct(pJtuEN`HIWdR'4n 8 F N   ? ` s z o F ` ) )c<%02g 6qUS`nJ[!`zy=jGiJ&J>@HNGR #IEw@`s!JX^?3!@g@[v}gR/']~oD&<#x5 H!Do!G-u u ; ?+7$t`!$PSmTp/qWGxhZ/`.\W"}BWsv$1l<DIg Kb#(b}IGE 7JY S  u Z a p x g I F G \ - t ^   (  2 P>R_j'ueQ)WREi K}{D]\X9%%.#(mg_Cf SF* [ z%R!rm6~E:[RI8C'Ma3)tcn:*KU5KRPY[L)e,EeeUnG 6\4vFnI:fn`)f]R+HC8;tw3+YBSrIh,=MUuE~?t[ kYF#bL1%OP7ReY+P'g a B g G ieX!MWrOlCX'Skh`}U0uZG  m :)\2Y:@t5R{`M[lN3T T i 0 , 8 Q F  h O 9 (   #  $ , O z G  "*:f!##:Ka # ( 3 2 f 1 i[3\< 1d*0VP"$ W  , 7 T W b ( A v fdLCbGIQGhbJ{9bhUt >d v:$\X7  *OLB.4TURG~"~5^Tr o b:{O"*"nB#Do$?W >N( iJHDWk+?TjhbM:XvxWAkszp]LIEowWI47ue,2:{"niEi.#c@H c*.Ziw9L\lTPH<[u6L`pCbvReW!4-1#4D3!3)ACg gz~- _ # fHe e~KW 1kRI--"OO\WD/E%.{@|Q% [ C C 3   8 q .l>NHXH;r2 o N %  F y 8~K + ( 4 ` , 7V8>#|P*)ikGq`d=>zRFmA?Qdh+Kub&}U6? & R  7 U X j\)nUGGVekD%w%\J4iSkw3S3tg} @owbIevhiYFWDU.H|[|Cl#Z0t&zX =ilVMNP=3/d6 "-%5n(|l_q-*s Gjos1[ x^!{B[2kHpr_Yq`P ]?w:E,?c* z^  6` ]C`p< { I  } 9 .PzEn)p$bg IY% 0Eq Ei?~,e.M<1/,9B7)#)Wz,otIX$*s q1@V>H R w . i6zII h!RQO(xbr(VmQ, Q74B.oE8IcoigXar"Ccw~y7??w V84X L7Yem{zwpo>ujho)\D-[qqtfNfyc2Y4v [ b  o  K r  ;    _  ; m \   {V70dM$3aKh 2 f D ; A L :2y9,G{ 4MWdwlM&{DqU$/2/&'PA:!.5@ "4*-/;: sX Y}^6 _Y/GX]@  / o 8~>)W^u>&")GIF9&d4ws]?"FO5{ n8.\ *>Xwa+Y5 "NYl%=[k`/tV2Q-N %81( #=ACAzL (IlOi@MTfv3HF=;FS|yq]^Y]C>*  /%@CVs{whcS]M[QUC30EcKG{Ag$Y.; sv~b{"Z b S n N D NEI2IGYl|pV(HIw?+r@JwcNH^fiHB7JPfYCiI0  j V A %  x K ` 9  W  m < tSBk@77 1 _    ! . O e $ W ; T  H d Y ;  K  F s B ~ j _ O : $     "          !  {phhiS<" !%^$t'D6r{!'|"^rO Ap)ab);mxhk*i t0Y mR?G<:17bJ4p5VY9wE@h?=Oc9p#}&iW08AIMYXTKaST:I8A-# oI-&AOgu[>0n2],c #GF`mwL*iWv ,>U_z}mdE>9DJRRJ4D_3Oz@oP">Q0k0p* L  } G Y 5lSk"cIm\ 9g7%?Yq$J`mnhcUD2 Y'~oUV+ }5o.rGu~*'V`T a a o 1 ) {E h/zfVF*c-lR GxDL {cSDEE2,$"@Opi~ 7fb,m>YbjgdN0D/=eqlZ_s-s zQ*}L-rR%:\Ji%~CrC eF%T7T:e[OMSb[f[jes 2RsO x> n-p:,mL"=dn|yrfN@'qaT " k@tj968D V2P\fc\> g@LLs?j=!:9U7MJI?.#eO4a2k/X W  W ]  { ?  ] 7   H)[;qM#=zK+ dJ+x_A&xAfR4 f9 WMpP!EpBv8vLGInE~^MGOUWP@Bq$-8J]dkqywyswtlklqo|Ep:hEFQH' }b.,u*k/]T&V%Au/S*3BYa`[HE?UMSPS[Yn~*X~ ' E c ~ A r  4 u % Q l  + = L N f j  %30KPqt$/BUovc^C=f2 u K  > d G /          1 9 I F W ` { z  } { e B ,   u j e c k o o c ?  y [ <  ]M2yX"vEIe 9xs MTo)W)W&[X%fX'zT1%#>HdmaN8#bC3}J((6T{%;JTT;0&mW4 k.-U"Y_5qaWbdi^^j}0>Ng0Qh4GeR&IxBU!?\iz|-3FO_rtt3Ez :3ES^cdYPEHSX[aSS5=>^y'5G^x2Eim{ #Hc 9XuIlvAr<d`V:)  \ ! j  m  K -3\qzc[APCA%  z  o d \ \ f b u 5Tfw  :Js4=0'""!![;VC(# y o a Y K F 9 3 % x j W Q 3    ` I /   x P $ ] 5  JXiAd; rhued\ew0Cl+K\w W5w9</G(m~ArH4kDa8Pl> d%bZ!ssM@d l9dF?&! ,?_o+Ff}3CdazzycX.lWVQ^T[TVo 5Q/c:y*]e?DY#\0h"@e{|~~|2?Z~ PQ(z6,|'1bvJ6 x]WXejmv2RzRKzDi3EgqQwK4 [  9 P , U w   < D i w   - I S o @f/Slww[J;vYM= y I  O , } U 7  s ] 7 7 ' '  s U /  iK/n-8FWm6oR$vcOE9,)  kEo)9 O_E;w@%dY5%t_D5rYAlLW1Z/tPqBkcIA00##+#EFX[i| (U{St15@==51'`N$%*JSy5X*PI L9i%>l2Kd~:P%Rp#Au#XbAz,bA~As?m.o;lEp':@J^x . R k {  + M h    > N    4 K a  ; S | 2Ag-M`v*4C`m||xyiP=U |N r > j 1 r 7 I  R  i*l(\2y1 Y.l; reI1 !'197/#n[4kO'oI d9  $$)$(0(4#~jO6&vHu5p/IA8|%+2]"sG2 %%*:Sq"Dh 2Ghv #.?LQTQMLDB+,jM.c@~sZc]nt5[ :cZR}Slyi<+Cl3g7|(V HU T;"x5D G!\%Ko#=S_ulH#b;Wk,[,~RG2!-1Oi7v,`Fu!iKz*K(=PXps`M@$%:Sk :s$ n ) e ]  \ * i .f%EYwwM3 _I'  i S ( g W I > 4 + 1 0 ! 0 ( F T t * @ r El(B`q sQB_ w # 0 ] O J G3(|*id:nRrAx;mR)g=i$s4\*KrO%uZ;x`F:3 )?hxbT6$pT<#mR' vifG/`P5_H0#'>Tl'Y%]4m]!Z_a-dM2sB|7vQ6fbU`F&<a%@Pn-SwU@~ . W , ]  9 ` u  ! ; C K ^ d x   % 5 8 D A K 8 3       i m ? C %  x g _ J 7 #  o T >  n B  vE%[B|kM8## 68@FENSi|27JSSSY]hd`Y[a`pcaUNC?, voPN68/>:;56/*(3:AVQ\^dtg[:}aQ1o_A#rO$rB!yeOB!{kbV=)}TD)u\,]1v[7sU:pMf/^Qr;__?*xpfcZZcbpq{~s{u $&42JPjn{~szheLD=?)1!*))# #)47ZJeZv{.LezRr9t9ELVi|yrfYQA9%tY>%wrZN,(4Ij#6D>;4+#uL~GJUN|KgN+ uma^aQFC03j]9 oQ`4eBpK-o[7wn^[SQF>C=@Fi|+Uv E"^G#s \+yFr 7Y:Un| ,Jf*]#X3hO?b{xbD) mIuOAwrsw~~ 3CQdo (>Lgjzw| )DHbu)Dk)Dx(9Wr!%<>Tblz} &6Tj;a'Ep$[ 4 k $ U  U I  K Sa:c$Hc7?OXsxnZA' }P/m4fK i I F M c  t'USFm(R+mA}M^,_%wC_,{X6pP5kc:$lS2taTKF=>6;@9C@AHPYgl}qYF* |S5 _3gAT$~J&xE2ohJN::+70=;BYVhk %8Np~ !@X&2Xc$.6OQmz+L] ;lS+yV:]M]V?h,c'bO+o-cCdH R 2 k # N ; l  1 b -Qcy|cP5 w N # e 8  e + _ + b .  t=w@ [; }lC. &0K\|@[7Jly/GUcs  & 2 @ B U W b ] m U _ [ c ] _ D =   fC'tV- kEgH6#zmjba\ZTTQRDVOWWZeqww|ro_YF<&mU<)  {ogd_Wd]kjz},(176LLZ__b_d\ZLF;1(oO)Dc%Ax3Fu&RSsFkC%y}omjqlwz}+EPq*=I[fnytkvafcUU;:'a@%_D"]V99+!&;D]dz(9@OWiuq\F-z_< _O&x}mphgge_ZT\cn~,Rs?jAz9\@h'Eas/Pc7]?o 9o-iGxU >s<eDm-ay2MiEd :h' R  2 e , U { & Q m  1 A T V f q (FTrr+7X`v$2;BBE;/"tU7g+ V # t > z 1 m ? p : ~E {[(o\/lQ6}dK9 oU7spb`bX\WLME<E.1,$/&.,+&~hb]MH." qbH7xdI0hN>+eF'sD#fG,V7qB tH}FY&u?`/ nWRDED?EBGSRffs~4P`j$(>Rgu )39FTdu|"ATo%;Xo8M`s0Rn7Pk . e  ! A R i o   x z | r i I > ( %  o ` D /  ~ X B   x Z H .   |yh[O@* h:nKzIuI!Q+kU:$vp]WB7vU*^6t7 h:e*Rn?a3r>mN8lrgeYZOD>,91;>?CFNOVWY]elxtoeYJ8 s]: gZB9/'! 1AGZ\ (h&6I]ew!>Vi"D['IwMd ,Z ! 7 E P Z b _ k b m e h c ` ] P S 9 )    ! . 2 G B R S _ j { ~ y x n h ] P D : . )   vpa^MB0"cS8$ |cE/znT= wxttu|}%=HY_fad^d^fdc_PP;C"tO@x_? \1 nM)|^@)gb_VQF13.01).+13<6161@oN.uN6eJ+bO1, vsh`ROTWWT]W``W`gp}&ARm1Ij|-6>LSju-2=L^iy-:K\s%?Vl1Un$Bc~ 4M{4Jm} 3Fdt '<D[fy:Xr1Rd#?bx !9Ri (+=IWtz0-QYq';Pi'@Zkx  / = U j v  # 2 A D \ `   + ? R g u   3 < O \ d j o u   o d R C 8 !   } h B .  v W 9  _ 9  ~]8tF d:qK0jI6mbF7]G$jJ"m<\6{dQ<$zkbQRLLD>>:FAJAB>46646/36+3#_W7!R-|P'wF*f=qL6|ulobmdtdzx (5;FOgbujtttqdWNKFD>1"xrpliWL4,! &),>>OQ\io} -' d_D;#}oO<  gO7kB#rZ)]5Z+ zN zb:T#U8xR$tCwS5zgWH@0(#& (.>AQO^aol||  +;FX_qy    $(3+70>>=@;:@FSSQCC:E8>0/"  vo[L=8-' #(;Lii":Pf$8a|7b| Hj9p(LFm/c4cIp#Ag;^"Nd%5Vq3Kd0Ja{  , G L h p    !  , / 7 G M ` h x ~  & + > 9 I D Y U p s } w z j m b e O F 3 # ` I &  [ B  qM0{S; nV3  cH& lTA+ubNB0~vjdWMD6:!+      22ALMdbv  09Wa}}aJ1]AyP'sDS pJX1 [2uS?fS,!lYF8/ttcQI3( t\W@; uupmbZLODFA>RLbRaW\em} +3>>OIVbgoy| *%;LTli2Ii$Hh8Wq1Dj,AUdp 3ATo}(C_}!:Pk:EZknyy}vn]U<1$iVG</)=]v!<]y.>\k7Ih}9b .fHq *Q{ 0Xx 4 X f  / A j  > `  ; Q r      p > +  L + Z  G  V"fJzwgfYVPPSY^ks ,-0,23/3*%z`6 tT-|Qe6pEP"yJ-ma<&wlZLG.& uo]WL99)  uh]HB*! ycXJG<<$ siM=~cQ2tN-oI_>rO( }b_DJ/='4,6:_};Kiy 03>LXaggqqzo}y8^|'=qX&ZZDl6g'Jb7Pey '4:EJXbr{)BYu@Z*Id"/HN`filqwt|itdlkn^\KH85"   /5AETTfkv **:5B?HKJQCFEENMF;?3C5?;8@2:,%"  td\TMK65( qycqfl_aWYSVHF6A@CNN^_a_W_W_YY_TfginolquuqyorwuzjjWQA1* tW3wR3 {\?$ jZA*s^R7* }oWN@- {aT71 }oZJ>// & #&+)47ABJL\]hhogkmsjo`]OB:3){bT:$qbOE7!xt`aMH4'  !*4CMc[hfklkfkafkllspxypl[YJJ=;* hK7iX;(|zbT8xux(A[t-A[t+S`BVy2Pp2Pb.Tz9]%Q|*V=]+J<mDw6d 6Vq'Mf!-=EV]m{   & 4 D H R X h m  ' 9 J O _ k p } k b P A 1  k U ?  kVM/n`P=5"vqnckXT@=%% }uilSW@>#  tiI@aGhI~M&^BzI4 pL9 z`O9 {]M:#u]?'~^@i:yL3}d1}taQ?6.)#!.(<>TT_blx &+A@[Qigty(3;FVXnv (2E^{:[n)gu 2Hao %%('0(' |tondkfddfcsny|  /7CFNVdqsyw||{kn`XF2 oTC' rQ5z_;#{ogTJ;3& _X:,cBK1jG a;\FjO4vX=%{cG0o`B7$ ga>-uaC+eQC+& #,COil-6KVgm|qla^_[QH;1%" #53HFT[iw'>Ti$=ay-Mt /On*]p /Oo9e 8a:]|&Bb1XrD_)1Tex*.88DHL[[jgnllnoqolga^[VSKFFAC=5119;DLLV[jgzr *;Q^z "'7=HP[`kw|      nhMC0 n\="fV3 jL3l_I6$vurhhZGE/2&m_O?9&{f`RGE72% ""$)-1252-%)"$%$)!* }t\S33 raRD6+}x{wz{ww}~zoj]XM>7$#keG9hU="vfN?*{n[E8 ogYQE5"uobVOFD<<<6;5561336>@FL[jj'@Sg*B`t-Mc2R],Lbu$/FGX`kp~{ #+7AO\]gox1KW"He:e<_Bl(Fl@Wt  ;Qgy0BV`w'?J`h  ' / D O j s   $ 7 A P P g e } u g I A #  m Z 9 &  |hK7"vihSPC:-" |zgaP=-y_C&lR(h7vJ/_AqO/ uaD4 x\I1 zbL/pX6&x^<$qX@* ~hV>8  "*3BHP\^llt{~w|o~syonhc\VQSMUVX[QXP\[ffk|,CRi{ /4HOem{x|&,EOcx3LgIT_fr| %:Eai-?J]p"')55:84-* vVF(gV3oI9iO- jR6{_9!~`={`1zI-{O6`D!~WH& mfHD%|iUJ4({ncUE8(yiI;#ziaWVSLFCCAF>C9C& r_4#gJ4vvbeTXQOLTIREJBBGJT__suso_XQBB/6!xb[OL=1$~mU@,x\ZC6&wwoebTYJOOILA;>,9&,!#  !!)$)!)!!!&&#  wpQD'gO<' yiO2"|thfVJ;(!%*2:?BHPK^[hlp||~%''""%1'22-/1/*-*)-,??UXm{&GXv,DTkx ,1;9CANRZbdjw (3Wf !:]pAZ~,Ig}6Jax#4CCabz   9CSadtz58\a-@Xh{,BCZf|th[O=, pfJB(naK>0w[K=*z_F.uR>kO6{[J'cZ?-ti^TG<." xptmmg]\JI>00# zsk`UOB93/# sm[RD<1'|eWB7!phH=${^S:+ti\QEA*-  %-8@EQVgv"HPt,KRyy%Rdu1Jbz)DVw,7K^q",/BDU`ms~yvh`ZMOLBA/"~{~~| !&9=PRbhv!9:Q\hx&3Tb}<Qo+5N_q (6:ICMHKQP\Ygoqoi`[TQSITCI;>6=62%" }qcNF9+ lVC9wmWG.zuXU:9#& }jcTJ:.! qc?5zYF-}gRC1(mdTFG,, {zppbXMD92*'#ynZRJB=// ~ila][USPUJVHSJHKJNJPRJPNVSMSNUPUPSJJPHREPJRKSJMG:8,-("!tlVNECE@E=B32%$%"+/5=EQXfhtw~ *2??BKN]it!2M^y.<]k&Fj7Fe1Lw,Kc$Ec 1Th<Zu!DQq"9S\w/2ENSa^dfdtk|wzttngf^XPKE6/(  }rjaWWDD;00}td_NKA<9.& tumhjbbb\]QTQRRQTLJF?996A<?;633.+&$&+#& seXI4& {bW:.qfSE/"uiZI;%" }d\L;+ }]R:) jXA*sfPP45$/,:?DK]bv{  &')&.'/),)**',*),'.*'!#))'!   $'/J\k~  ,?\d##;>KY^qw}|^^CA#%j_F>&vjOB!}m_LE52! qfMB%xYK0mJ6 oZG.~skeZUHB791.&ym^PH:, ~pKBkP: v_K6* (2FP\nv 'CMi~"4JKce ",4BKWfu~*4H[p.B\s)1O\z )8@OI\NbVfafbfllmdi^ldgiggdibjiiggiiqiojjuz'%=EO^m|&5M[s$:Jdp0<FR_]mm{-<QYtt(>Ti 2H\y25EJX`pp~{wtqii[]VJF23" wkYS==/'zjiWTD>." g^K9.lR1&seB2}nOB*xhRD4* zrgb\aWf_dm^mbad^a_^\YVYQWKI>;.0uwho\dNYIRNIQLQTRV\Zdggttz}mdZL>;!wbU?1! nkWRA<,,!& ~miXUE?1,  "4@\Zuw1-:DGU^bmv{!/AMZmr'7DZh}+9OZl  0AYj+=Lal"*8;KN[fl~|yqnYcNXPMK:@ 'yorfac\TYFH89-#&##   |woje^QF9(zuaY<0gQ7!ubO<& mO<$ jS6rYF7${oe\J:+{hhXOHB96)# ~sqe[[RKHB8/% |xlVN?@00 /7=KJ[[knvx%4@O]n|#/JPgjx #.7${o\MI22'$!  ##..1:>DDQTehgprz0>Qdm#8GZq&9HSdlz|ldLD5+q_O8. {oWG6 pgJ? }x`XE?) |xXV?5, wgYG<({ze_IC($ zsbjZZFD9//# xpWUA4'siP@,{hp^]UPRKSMXVXV[U[V]`ccihlnlnnhkef``^[XYVXPNG@=4:(*%  !$22BMVht %8Kfn ,6Tm +Dg4Tt(@\-Jx 2Gk #DTu 0ARer +1<AOOZ_dmq ->I_u6HSal|  $ |tcTF8/zcVC3"xmaVG<#r_N<) jUM>1,}pre`XTPM=D.4)$ nmUUB?2) |zggWNA6) rl\RC>3,,  ~}}rwowormkoowrwrxxxprspouhkkhkmhp_udwhurwsrmehbbb]edggZbTUOJRITJWOUUQTRZZZ`]_\`egku{xxjj\ZRUOLBB:>6:3>6>A>J9<4:7<<6<3?6DIU\jm} $.FWj{ 3@Vjz4G[p!2H[u <Lhz!>Zu #>Vm "*AF_d  (26>ACEKQVYX^Y`afglkoonnlgf`[`[^\VVNNAC58-+''%*'((( "   wtfg\WK>5# gaGA.!lgOD.o\G1'e_H?2! qnZ[MB=*$tqZZ@9( pgF;jWA)mM?|eP2!~hM4k`H>%znaVHA860.2(+ "##.*5=CS[grw *=Mcv-Gcq'D[q:Ls,?Zh+;Q_z.;LTjt%:ERbp{ $1DRfmx&&.94IBQITMUOLIJLEJBB>B7:2/..))&&##  ! '+#)'+&)..6<>IJTRUTUUTW\]`jdmjmkghjhhmjrjujrepeoghhhkmkmhg]_ZRWMRLRMOQEIA?BA>94241,++++&...2,1+/++,/4:::A?DBBJIMIQQTQZTbZZdUe\ejkrzz  !))30746;99>7F;A;;A;G>?<9;61,  zsk`]XUQOII?A772.) !$    }pr_`RM?9.'! ~xyu|xxuqpmpkhh`e``SSG=5-$xg_I>- trRG7!mbM?, xj`TB9& vn]ZG?2"scVH80 ||ohdPUECC7=8;:520/*-+/0+;-E8IFPX^lo*;K[l~7BSiq,7G]j/BWeu $9Qhz6Dbx/EVq{*BPbx7BXj)7ATbt68NYbqx #16@DQSaarqy}|yon__QNIADA@>;800%#xmj_^YOO>C38+1%+   zwedUQD;0) urZJ<&}jXD2! shJ?$lVC-wpYYI4.~uj`XOID?:9769/9//)$       ',4;A>JDTLQQNOLROaVg]a__\_\]WRJLDIGAO?IA\r2<Vhv"4?P]cvy  ',12?:OGUT]`jrx #30AATRgd{t  +-8IO_dg|w &#+((1-03-;3;8651.-.&(  queeY_NND>3-%!{xghUUL?90$ urWRD1$ n[H7"p[@,}oQD&zmTG.! {dW<. xcM?)yiZM=/xkf]VKE;5/("  !,0B@PX]qq| )1HHX`h{y,7<>:<<BGEJLLQMUUWU\T]T\\XZb\jejhmmpsvu~  ,09GNW]bou{uxmoja]OOGBB44)${zmedX]IQ9B.6&+!  xvnh`[]T_MXLHE<=55.2$1&1&/&),')"&$")$'$)',..4/5)2*.4,7.2/2,/*'&"""$!   up`XD@1) qjVL8)ubT<+weOF+xpZR?4'{qkc`]ZWRRPOOMPRPOOOOKHJMMXPbWe]b```kevv  !#&/*46:D=LGPP[Zh`jhrsu{~ )!))6?GQ\Zjkr{~#!43D>VNbbrz#-01% e^LC(!zo_UB7&z}gbUJ?62$+ rsc`ZOM=4,"usb]OH72"uw^\ND3.pm_WNG;1&!uued\\RLJ?LU]or (6E?LJTR\\dehgjjkkmso{z )(46?ILUWbdtluxraYJ<9(# sbUE2'shUL5, xbX?5xgdKI4-#{wh]OG<0(z}rugg_ZQLF41'znj_RRBD9:.6&, ',24=.$ mbTB9+~rjRO7/nfMH2'glQV;>"" }mtgh_aTWFI66,.#+ $ zroebW\IJ79+4)    #!!))117:>FFOMQTRXX_dbghhmjhjmgoeoghoembggb_g]g]`e`e`b\\_Zb\degdehbkemhppuzz~~     # !$ ,)01406073A6G>FINNTOVRRZVg\h_mdrpx}  %.3ADJLQUR\]bhhomuuxtgtbdgY]RJB?69).  {vpmgbbZZUJJ<<4,&#xfXMB5&uX]24 oYK8%t\T<1$ ~u_XI91!peRB4!{k[M?1$ vkfYKJ42%!!   *!-0:CUXfq{-=M^m):HZes!1DX`s 3?GTeg"%0.99?DGFIGLLQWZ\aYbWYWRURROUJYINDG??>6<361)$ x}mhgXXOIE:4'#}ypnfbZXLMB?7/&"      |yuik^[RJE<2-$! |loZVSAD41&( pr_gTQGC?<6.$ urb_JL<>,,smc[REE47),~{~~#,/GH`cr~ 4?Rep+?Lat;CWiq)=DU]p{  &.5=AHPTX_bcfkprux})+><TWerv ,1FTd}#9AW_r *1DQaly /06AAFMMYXc\cYXVTTPMIEE=:5'*ugQA- tbVD1#oaQ;0kRD, veO7' yhK= gO8maA4zkTB1vncZULMBG=?<<7A1B4E=EJGOJPWW]ehnru{''4?OJZX`mp~ 44GJT_]rr  wpgdWQF;0( ~s]XB9& ~nePB5"xnfOR:7!ofSD6#"tbVF<$o_L6'}u_RA2#ymic[SG74',  )!/-1:8@EKHZZ`ekkqv{ !.47DDPPgh !+,?:JM\`ow{ )0>FQel04KYfz *@R]s /9P]my &6AGUWkp (,;BRRjhuww        %!% %{tgdOJ;.! }k\T<4!eZH9/nhSH?2*  '$51@BOR]`ph~p    ~xvpme]USGG<5-!! rlb^QTFG<8)-# zzwwtwpxotlmdg\a]_YTQFL?><;(1#(   {~rsjdbZ\UQOJJOFQBL?G:>73,.$' {z}vzrzknbbZ_U[U[WX]U[XWZ][``_kguv~'$6?DX\ppz()CI\jr .AVjt%8Obx/BZn!7LXx(9N_u (1@FR^ajrx #&.1.6155518669538;89=6D5;5.0+%% um_\ODA1.! {ohZZD>1# xo]UA<'sc[H?1x]V?/%maI8+{o_]GG4,!z~p{jwoojphohohobjZbWZTLQFGD>>:3:163,+&! '/.7>DJXZjmwz (07CCOWYljzt %(-36CKT_fo}!)'42?:JGURb`nq|{~{yysqqnhnhkf^^SUKHH?D8B54/-"! uqfdWWSOOILIILDKCD>@6<99<8>A>KCFGDGKFTQYY^^fjoz%*5DES^euy '/:=TWenv $6?EZ\rr$)4<BJNY\edolruzzwzrmoebZQRIA<63))$#!x{pkg]RR?D66,.#  {yurjh[[ORDG771!$ ~vppc^SJD4/'!zmdVK;3" ttaYW>>!$ {sbUOA6' }ubXA9$nmWM:2"{x|~{xv{qqpsxy$*<@P^cq|$,DH[hv/>14,+))'$&##  !)$6+94BBGOU_bjss()>>RYhp%+;F^atz/4GO^ess.,??OO]_hknvx !'!1.44:9AAJQLWTZ`_gdro{z !(#,$,,0171>4A6D?DBD?A?A;?<<D?DBAB<<9;04++&!    ~~vxrphe]]TUQIJ>?2+# sn[MB/'|xhZO8-rfZF8) jbTL;1 }xh`XGG44+   !,.+4/?6BAJOU\bgmorxx((037?CJRQZ_dmjzp %(#((1-80<8C@KOS^Y_iaqguw}%/7?JR^kp$59PPehv~   ).2<>>BDIMRRZ\]g`jggpgrpuvzzuzruzmsmrporkkkjjghedd\`X_XZXXZRQJJED?<44),&'$! uykmkeb__TZGPDGGBDBD?B==<?<=BEEGHJLGOLWW[]Z_[]b]fchjmr~yy~nrmee`ZXTMOBE74/'!! ~{nmc]ZJPBB<7-) |m^VKA;-(t]\C?,#umbWJD36!!x{rkj]`TTJJDE<=421)2)92?:=E?LDOGWOW]bkpr~#.7>FR\dku{$.9>JFWR_gbwt  ))<4GAOK\Yjjrux%21=@JJZVccpm|v~~ '$151<5=DEOPUZ]c`nhsnuy}',4:AJU`kp}  ,!6+61999;A?BAAGBDGBD;?6<39443.3,0(,#$$  {xgmWZOIA7/  }ejZOG=**vqcbUPD54""}zlo_^SQFD99+3%% wr{otlpbaZVNL?A443)&(( ~}~~z~{z{uxpuroumxr{r~ $#,,3>?VOgduw"#.6DKTfa||$12EEPXbhqv{|~uvsmkccc]UVPXPOSDOBHEEGGGBJ@J?J?GB@@?=BBBH@KBOGRPPSZPUUXZ]cckisp|x  &&22<<BGMO][jmv '#62?<GBOLQTW_\`b_edhmprsuuzv}}~}rrk]]OMD<7.'$xpfXUD=1&~u{mnf^^SVPRHM=E7E7?551---%,$)!*,$"$$ zurjbZVIG89((}rjbQL<;.$ omXZLGB76$&~{urnnembg_e[cZeZeZbb_eemhpjnvkxvvz $+)96GITQ`]omz(19DOZet{ #4;NQiq$/BK]fx4<MWks  !26IQZkk}~ &(.,1396A4B?>>>A;?9B9?99;311).#( # ~xzkphg_`WWQLIDD992..'$! ~yvnm`bZRUJJHBE7<2//)'  ~sunkib^^USMHHB:71-,$$ xtqmoggjagWaNYNSGOFC>;8811((   "&%-)48;DDNVS\_fjqq|x}ww}rxltbj__ZQTDI@99-.(% xxmrhda]VTFD>711.,(##   ),,;1D9;97;6<;7944,+#  vogXWED2,{v`ZHA."{h[S?@"zlaLC-& wp\OC3(pm]WL?<+'    #$+.173?7DGITUZbdmuw (0?GRago{ ++3;9FFINTW\bgqqt *%-/5:?GOS^`inn{u   !'",,12:4A7=<==<B<J?JDEHEGJDHGMHMMHMHHG=G9D9A<=?<=:29.15,7121,*.)&$$&!!   '.!2.<<ADBODZJ]X_efkpmuu{y{yupe`]UTOJDA=11!yscXJ:/$ xl\N@." m\Q91 ojRO>1' ~rkh_XUJHA<:,.#    !!,*/46MWbps#+6DOVdlo&.>ASZgtz "%*2@<OOX`fkuy~&,/75HDLRX]efrr  /1>DJXWhjv{!)39FLR]\ljuzplaTG<, ~rbTJ7/!rcOH21us]]HE2-trd_YKN<<00 x{twhrdoadV\NLQCQAQFGIDGDDCI?NAOAOJQTRVZVa]aebpjttw}} %+#0.68CFKQV\dgmoqtuxzr}t|qwrwotltlrrtxwxz}}}xwtlrZiQ^KKK@C48.+%" }wztrwgp]bYWRVFT>G>GJRZ\hhut}   }olTT>>+$p_O>2 ~reMB)`[?1rdOD0"tdRO7,{rd\MG46#  ~}{xz}  !&,.?:MLU\\ekjxu ! ).17LL^amt| *1MK]km!)9ALUchy}&$1,:4?BJJXQb\egjmmmmkourvvvuxvrvmrksgpdj\_RMJGBA:1+'  }yjh[WJA7.&xqhbSPEB:7,%" x||zw}} $$-48HGUSccus  &*'*21<<ADEPPXW`]befmnrxx~~~{}~vyuuspnkjee]_[WUUOLPEPHEJBBB4<22..**&"  ~{pnk^fUVOGE85,)!xwtdlYZWKF>44)% {xroldhWWIJF>GBIIJQLRJLQJRRTZW\XZ\XdZmgwrz}{&)1>>VRgdwz(+>9QLabux "/2@HOX`fs{*1?LTbhr&17IJUXgrz  ).&.417499;<?<GDOIIIFI?GDGGBBB;?7>77100(+#( !   umj]\ROG?<.' {meXRA:'&{yhcXOG<-, }oxmil\aTTNNIGF39.0#&  &))%0"-"-#.#4(3.103131338986@9@>9<999<6;4816+1%%(  }twoll]]YORGGG>D9D4>19,7,3+++(+)(,&.)+,)())),4,?0C9+% zmo\\TGI<<711#( ~~{}x~wzrsopojgdbdejgpgwhzkrmsour~x (33?GOYbjjtu +37D>EILLMTOXUZ\X`Z\ZXZW]Z]]]\WZUWXRXMOLGMBLBG:?672)) ysppje_WTHA</,!!vnh^XOM@?-, rob\VFK8;-& wroldeY_RVRLJDA?><9704.41+3,0.0.+(,(,,&)&(((((+(,+..&+#,!+#((((0(0+.0,10116+A0>6473609.C1<390;1>9C;DCDGKOOWVZ^^flmlmitmww|x  )$-)1-22:5B?JJPOUX]`eehmnxx  &))9*919::BBLJROZU[]Z_]]Z]`[][_befhpbpbkkmnnnmrkurvsvssrnnmjhkhckcec]W_J[GZEWERGLG=B1=/4*)'$$!!  |~yyuymsfeb`^Z^VXSORHPJJGD=<77421-,)'%$ |tlaZVKK@A30# t}ttulrgmdea_bZ]RVTQQQTWWWZYZV\WZaWhZhodujxtx}{{}u{ludoebe\]YYWYOVLNJDI>DCAAI?DAF>F?NCLIORTYW]Zbedpm}w %&0;;IOY_jq !24@PMheuy $':AJT_hm{$+7?GRUbgjuv   xok\]JJ>61' su`eLP:?*.vxif]ZSHK@<:-2"'  }}}}zzwtuojlaia\\WWTQOLIFG@D>9<4;14+))"%"  uxoxdo]eYaW_RYWQVOWORLOJOIQIJLIOIIJDLDGJCOIOOOQTTTYT\\_dddghmprrxwx &).69@GKSTW\diqmx}z!!!""-*?5BEDGJBODROXZ`c]fbibicmhpimknkqivkspmqpxuxsyq~kk{nqpnmkkefb[b[Z^[^XRRKHG?B<7:-4)-"% |}z}xxtrllbabZb_fdgdidffgijlorux| !),5<HOZeiyq|"&*72E?MRT]_fmru}~ '+$'&$$)''+&,#,&+!'##& ! sujebZTREE75*'"yunheZ[PH@=,/xxjobdWZNSFIA>64)+% "upge\\NOCA<63,!  ~ $)77FJQY]gmx{ "#18GGTWddtu!$12?DKV[fqv!'24JDZTeers~        ~yvspfh`]WXRPEG:A542**" ~y~s|pvqnuhs`nXf^`][VZUSRPPKMDEEBH?B:85/-**,*,*)*'""  $"""'/14:5@:DBEHGJOKSMVOUSRZV]Z]`b^bc`fc`i[k`e`]`XXXKVBSBKDE?D7=21,,!*! }wwjl^ZWGG68-&#}ujgaVVIF<63)!~~}}{{{{}w~sx!!+.7>?GVOa_eop(-4>FNVWggwx 4/K?]Pie{| "'=<MR[jn{ !/'?:GIOTZ`eop{}~xxmmeb]URGD>44+&& xyjpZ`MHA41$yne^SH?/%qiZWI>0( }rp\]OGD;4,$ {wxuwuzurskmhmokpmspuouosuwu}u}wz{{ $(34<LQ\bot $45@KM^]mq  !!,.9:AEEMHTO[PUXU_U`U]T]MWRORHJGGB<=45..$,$~pqfcZRPDE882*%wrrrlljdb_^YTVLQINFKAI?GIMMUR\_bjrw~ ()69FIJVVdeowz %41D@SSZdiuw *1@BPScfqv !!14?EOUZebyk  $!.'1)649?>EDMOTWX\`bherjupuxs~v~xx}vsxmupppmpkudsemek`j`b\]WTRLLEI?B62.##{mhcUTJD:7*) xspcbUSEB87,,}}|}r|qxoogfb^\YYVTWNYKWNOTKVNNLKLNDQDODGI@FD@F0+(" troglb__TZQWNOJGIDGDDAA?A;7719+;+9.696;7699<9>?FCIJJQJQOVRZ\\hbroz{ #--89ACNKZVafiqux}"!*)5/:==JHRVX^chmn{{  )$54A?MJZ[_jjuv !$+46EBQR__jpo}zsxhk_UWAJ67+# pm[UJ<5*|kfXJE11 |uibWOD;1)#wuomeb\YRQLIDDC4?9>AE?I?D?G<B7?.:.7627)4)&&# yupcfW[LP?B:.4'uvihc[]SRKJDD8<1*'"! zut}urxmzlwowlufr_j\_bZ\ZVZTWVYZW\STYSZZY^_Yb^d_a_abfdbg_ggfmgtlxrxzrwzzzzqtmlgibb_WVQII><;866130.+&#     "%(&3-99@ICOGOQOSZZ^ggorlzr}z %)-24<@DMJRUU`[ibvn|  $!&&),.257:=<ADDGHHOLWRUZWb]cbchfjmkpnmumsjvfvmprpursppprjxmunxmxmupnnmhk`hbb`]][[X]X[XW]W_XZUTMPHPMOOOPOJLEDBB=A9=:7974/1$*)! sxnic^ZVPHE=71)% u}rrmlfg^_S^NOOFLC@<@66.+-%&     {{x{rupojl]eYYTOQJQFQAO>G??A?>>A>D;D>DCGDNIVNYVaZjdlmotwx ((30;@CNLZVf_rm}z'"-//8:@GEMMZZ`cbikmqpu|x~~  !$&!$!"!)"*$/'4)1//4/559:<9?7?9?=A<B5<557221,2)&*!&$$! x~mph[bR]KSE?=12-%% ||xruimdb__WYVQNNDNDDDA@>>69331..0.1+-+#+"-)+((0&6&0-)-+(3)3)04)4..6)8.<4@>>D98916)+#  }}}{xz{tzrzxt}t{rztwwpxt}wxw{{}zzu}wz{wtz{ #.1;AFQWbiqw} "*42GBVRecqs $'/4:?EGRM][ehhnn{u}{srjfZ[OPHD:51',!svnehUXMGJ::1*$ z|urmla_TWLLDF@@46+.("%"     #)#1(4184@>D@LCQIQSWYVa^ddjgxim|   "$"%$)$)$*$-*/1-2115-7245577=8==8@:B8?=?D=E?8B7::2?/:27211,,))'*$-'*')"*" zurollgf^a^ZYQONLFG8>361-))#&"  &&-+91D@GNN\\jjqx|2)::GKSX]ih{y &.1:AGHOT]]mmuv{             yvkjb[XRJB?5:&/  uuhf`PSGB=21)uwoglY^SLK><3-&"{wjl_ZWNTCG<>0(&#&06?GR]ajtw.(>CKZ\itw !)2:KM^]pn~$/15?=LBWL[Zbjku{~vs~nuphjZ`TUMGE:B24.!$ |~uqnf`^RVED?17"' |t}rxrqqlqlmrlxltrqtowqxux|zwx}x} $%*//7:8E<KBRGZO]Zbbhhskyp{x|~yvqpmihfcb^X]SVRJPBJ8@:47$-$|wmj__SSCF64-& {muet]dWVNI>D3>340.)$    !)+364C6N>QGVRVa_hpj{x %.1>DLYWljw $%27BOO`cnu"'/.A9LJT]Zmevu} $'#,#2.646::><?::9:4927647/2.,/&.',)+#'     ~vpmf]`TRLDD<91.&!|xqnfb]XOO@G1?)/! ||joff_YYSQIGD9@18.1((    &#-)044A6I>TGVVZ^_ajjmwmu $"-*745<8D@GGSPZV]]`e`m`shppsvuxxxyyy{~y|~||~~~{y|y|uvupnii`f[bV[UUPKMEHD@@<<7</4,,%"}xxttllfbiZ^W\QOQIOIFK@F@;@<;A6@>8@6>69646394;88<;<9><@@D@ICNINNTSSYT_Waaggqiumzx|}  !%%)-187?<DDKHUS]]hfnqpyy $$&))/*91B9DBEHGLMMRWW]_bcjhshsnuuxy{~~x}vurfh`]_U[OXOLJB?<42/,'$  {sihZXKG?51$! uljaVTFA;3)( }}ttje\\OODC;71,&#    ))36334-6&4%.-&(%%("&#& ("(##&%%#) . .%)(#) %#%#&#(&+%-&+)))--..011434916141.3(30.6+6444>+<-<3;6A9D;D9><;98;9<<9<9<<<;<9989894<6666181906-8(4)10)3..0+++)((&##" %(%"  "&(+&###%(&++.1.81;39;;@>@FALGNOWQbVj_lom|r"*25?BJMMSZ^fhqn~{  &$).*2/797?9D9E9G?GAJ<O=OAL?L<E:=A1D,=212*)&$" ~~{|||~~xv|{|vv{vx{uyyxxvuqvpvpxqyusqnnkkihiifhecc`eZcX]XUVPUJSJJKDH<@<8824-4"4,!!}|x||zxwxwuxxroxtmwirijqbgg^j_bf^d^^b\a_a__a^d\f\a_\\Y^ZaZdYfYf\abYfWd^a_f_ad_fbagbffbl_iamdmgmmmmomomolmqjumtmuqutzu|tzzzx|             %"))*44:?=EGMPUSXZ`[e^kfqqy{~v|q~mxpkvbpck`i]c^^Z]V[UXOSOMPJPHMJ@M=P=J?H@D?=@=8<78555/2)/)')''%$%$"$%" |xzowljlag\_YWVONCD;<30.&&(%   )#0.48;DCTIWYZiior||!%"*)11474:8@<EHBK@MEKGOHPGSMPRKXRURUVVU[VZXX]Z^[b]e]cc`ebfihmkmnpqqpvp{q~vx{{xx{k{bq`fcZ]SUPJEE??<7741*)$"$   !$""'%%)%-*/,1--2-41:1=5?5?7<:7=7=7?4<5:75271715-5///'2!1$),$)!!    |||uxqroildg_Z^WVOLLICFA@>;44)-"(  "&(.)64ADLQZ\ibrqx$'42?@JMOVX]`efqpv|   &**&**'1)9/9597?7D7E<BADBJEHJLLTJXLZM`UbWcZ`_ZbX_[]b````__`]``_k`sbpekbc`]b[]WXTUPMRLPLJLGEHDGB=?=7?*<5)  |xmn[cMVEJ5<*$}mob^QSVAJ?I;D>AC>CAIGIOQYZ_eelltpuu{ #&1.99IGLTV^^dmmxw $$'%-*2174<8=:@?DDHHMUH]K^PZVZ[[]``fhhhneinhqqqvq{xyxy{xv~uysxqqshifce]]ZZUSSKOEDD<:?2?/7,,'! zxzq|otmomflagbdad_f^ba^b^^a\_\__aZ^W\Y^Ya^aa^daggomruuzz|"'/45<<EGJPUUe[mesmyv~  $&$*&1*/.1.2,5,7547799594:1:2:7757474745729/7/11',")$!&!  svhk^bVROE@@58)*! }}tmfbVVIK<>10#"xtzho]dVYLQAI;>331,.#$#      ! ,(1047<;C;I>NFRQTZ\eemmxu  #00<>GLWSbaorz "'/2=@HOSS``kpv{&*1257A=GJLRUWe_henpuxv{~{{rprhk`f[]WUTLPDJ=?549") ysmh`]SOG<7/-! |wjm\dSVNLGA@36.+&%"     "&(+31>9CFOLTVYabfilowr}} %-%/,1/,7/:58:<=:H<K@KHEMEHK@REPGPJSJSHPMKOMMKMMPOPOOJSGSHOKKMKPGOMMRPKKKJKHJEHBG@G<E:B<?<8=4<2:455:454-7)/),**%)$%"   zurrolif_a\WYQSNIID;FCLKQTZ^bimqzz "))41:7B@BEHGPOU]]bcfmmpquxx|~{vvqnkmci`c]ZURJOBE=:44,*$ |||xurtluftgjgdfd_bYbWZ\\YZTVWTWVTVSVWV\S_Wa\f_jfloltqrutx}x} !$'1/:5<?DEJJUSZZh^ihmun|{   "$$"!&$)"'"/!,"*$')*!   xyxpnib`[SSHEB8?,8$1$  }zqqdiY^LQGD><40. & x{rrmjee]aW]QVJQDL>G?>>9;7447417(1+,++),+)+++).)3+164<;<<<<<>>F>ICGKFLLKNONTQSYW\\\^a^f_j_gglmmouuwx $),*4-88:<?BHEMJROXS]Z]c^eicpinuh{kxss{ux~|xxynymuqhkccf[bVXRSJKHBJ<?414%* wxtljdZ_QQOGK9C441()&#  %%))-3.99;A>AIGWLYVdbgmmrw|  !)%,11:8?DGJRPXZ[cbifnpp|u{   !""&',)/24599<<?AEBEMEJJJJGJEJBMEMEJBHBEEBGBEDGGAH<A9:9441/.).&,&''!&! xnuihe^ZVMJGB:<15)'"}qumjia_\YYKLFDC;;44.+(&"   %&..396AI@G@C>;@6>;9988>4@6><9C;C>CADFDGFIKNNNSSVVWYY^\__\dafiimlmrmwr}t||  %"/'14/=7?B?KDSJVXSZ]Xf[hffkknqvu{y~y{{{usvmqhiiffcbc]`X]VVUPRKRGJGDBD=B:85/1**$'!$!  "!)%-//52<4?:D=H?K@JKJOMPPRUM[O]UZbZ`]^^^[Z]V`P^S]S]XXZZRVRRXPUUSSRRPMOEJBBD=B=<=8<4814,1'2$%,'!"!       $$$'','2,1154:<<E=GDGKKOPVXVbXe`hbkkiipmusvy{|~{~uyqqnkmckbe^^Z[RXKKJE@E4?17*-,%) |zwwrurromojofijaf^\^VYOVNTNKLFIAD>A<<;99;434-10-1(0-).)+-)0%1&1)++---1+8043390>3A8@>FDKLNSSYW_ZfWm\odllltrwxx  ""%*-47<?BGKRSZV`]^icknk{uy|{~|{v{ys{xu~nvpmpfkhcff^cZZ[PVKPEP?M8E8=<7512--'*!'! }}}}zz} "$!!%!-%)2*4-474=8=<<?<???D<D?D?DBBB?G@EBDEHEGEEDE@D?==:858/8-42-2%/!-'!!!!" zzwttoolmimgidbdZ^V\VVTVVSTQTSTQQSWK\IYOWOVTVYVZWZZ\_Zf^jdilloruuz} !')227<D@MEPJUSS`Pi[ihiqpu{v~||~qsii^]UOK@B55'* xuii^VWIG<63&( zztorduaodag]gZeZd\]_\\\YZWWV\WZ]WaZg\beejmopzu} >@GCOFTIWL[RZX]^a`aaad`fai`g`g^d_dafabdb^_\\Y[[VYTTPPKMBI?C9@1<+7&,!#  wnn`^RRGA;20#!|vrkh_]RTFH@:?/2."%  !&&-128=CCMIWZXacdrl{rx    !!$$%$-".%0.040906447396=9:<?<?=C<E?KBNCNLONUKXQWUUXWWUXUZXZ[]]a[a`c`i^ldjmolompluirmslsmpsovruuvsxvuyxvvxu{uvxyrvpsrjrlpjjmjgjdgc_a^[\XXSVJSFLDCC>==58.4).)#&#vp|ktmmmghdgad_a__Za][`Z^WZWXUUTOXLZNXQZNZOWRUUW]ZfZf^gagdjdoclilmopvrx{|((,3/A8BKHRN[U^adljsty|    $&#&()+/1/44332253/8-<,>*>035302/-/*0/,2'/'#)& ~~xmree`W`GOA@:3.*  ~tpjc`TZHK@@72*(! !".+157>AAHGMMUU]__hgrnxu~~ %$&&.,13385@9I@IFLKSPSZUbZf_jdomqtww}~        ||rshna_ZRQGG@79-1#%xvqngk[hV]XTSMMMEC?;;46,1*((!*! !  " $$))'0.04467>8EAHLLRUV][fbfjlqxw $*'-0197<@?HCJJPLPVS]X^a_gdiinnposswv}z~}|z{z{w{qyqqrnrjqiqgigccc]`\Y\R[OVQLQHHH@A>>:632..%(  yxunmdcb[XTRQIG?B<;4.0''%"   &$2-8<@DKGXT\_ckkrv} "-,57@CKKZR`]glnzv  ##*'*.(/+,/+0+0,4,3307/7133444587;1=081511.0'.'+')')$+"+*# "    ~}urjg`_WUPJDD992.+$ ~yuokhdb\_SSPLOGGGAA<=885-5&1(         "$#$&'(+(../6399;;A@EEDIHNLPQTWX\Yc\cdckgkonpsxvx  "$)-.166>9K>IILMOTSYWY`\edgkiqouwx{~zwyruomkgee[]VVSKGGAE9;5/3'.## }|x{wvwppnjndgaca]cWbU_YZSZV[ZZ[YaYaVbX_]^a^^a^bfdmhonqrvy{}  &(+13;9@ABLHJQMVUZ^^_cegjhnrpsxt{}}|~~xzvwrrrqqjnkijegdb`aY`TYQWMSHKFC@@::925..**%%!! ~zx|qxqqqlqjlkfjdgdd_b]^]VXTSSQOQHPDJHGCFGAHBEF=F>995:55170534827292773<3<6;;9<9=6?4A?@?AAAH@OCPMMUPUSSZW`[_\ccgblflmopqvtz !!*#-,042:4@=BGDPKPURZW^[a_ccehimslxowvw|{~}}}ywwttltfkhch_cY\XYUWKUJLJBK@I9E4=736-4'3%1$*!%%$                          #$!$%%%&%+',%.'1*0-/-2/202104/60:2;77:88=8<7;9>9A;B;G9F?BEADGCDHKEJHKJOISKQMQNSNQQQPUTWQYS[V[Y_\__c_f]eabbbcagcfghhlgmnlrlsnsrtssuytzvyzuwyv|yz|}}|}|x~x}w{w{u{pzurxkxnunpqjrhohjeecbb]`ZZZVXRTPRMLKFHEBD;E3A2<324*3&.$(#& " ~}{}||~}}|}}{}~}                         "$" ""#! " !# &#$$'$&#&#(!'"$"$$!%$%"'"%%)#*#*%+'*%)%($(")$$+$*$($)$)$($%#$##!#!#!           """  #"$%##!          %"%"'#*"-'.-12365:6<;<=<A<G@FGDJEJKIKNMNSMVRUVWYY^\a]c`aeadgakdikiikliojnmpmoppqqqtqwrwsuutxuwyxy}v~y|x||z}{z|{{}x}x|wz{w~v}w{{xywyxvxtxpvltlpmimiighecccaa]b^^]ZYYTTRNPGNEGGBBA?=?;:966510/,+,+*&%!"     " &!'$)'+(,+--0105292=4@7@>@?B?D@DBECFDGEGGGJIGKHMJJNIUJQONRLOOKPHOHKJHKIGKCMBLCGCDEDE@I=H@B<@9;97:585643100.,,'*&&$#'!        $)))&(&*()*,-,,/./+1*2+2/.4/503150725747476693:5999;7<8=<=<?=A?@A@BACBDCEDEDEFFFGHIJHMINNLOQOTORUQSRSTSTSSUQUSTSWRVWSXTXXXYYZW\U\V[VWUUUTVRWRSURQTMSLQKPLPKKLJHFFCDB=@=;@7=896330..(*)%#  ~z|txoslqikfecb`_\][X\SXVTUURVTSSQRQQMPKQJOLLNJMKMMLMNPNRORQSSWXWXX[Y\[^^^^`cagehjiolqpstwu~{  (#)+.0347:;>>ABFFKKNPQTXXZ__dbidmgnmtovqys|v~y~~~}|{yywxrunthsdochbb`_[\YYSVNRLLKEJ@E??>;89/6+/**($$!     "#'(&**-00475;9<=>;B=BBBFFFHGIJNIQKRMRPURXTWYWY[WYXVWWUWVUXUVWUWWUVSWPXMUNSPPNMJMFHHDFCCA@@<>7:65502,+*&)#    ! !%!&&&+(..1151967=8?<A?BBDGFHGMHQNNSSUUWW[Z^_^e_fcggjflinkomqotruvww{{|~}}}z{yzxwvurukpjjgfdb^]\WWSQNJJFEC?@8=361/-+&'  {zxvvqupqooommkkhjegefaaa``^__]`[aYa]\`Za[`^`_ac]e^e`gagdgfjhlnmppqrtruvvzy~~~  "$$('***,.0.5/72485:89==@?BAEDHDKFKGJKHNINNNOOQQQQSTQURWTUXT[UZXXY[X[V[X[YZZZ]Z\[Z[Z\[Z[Y[Z_W^X[YYXZUYUYUZWV[SZTUVSTQTPSNPKLJKHIFFFDDAA@>==<8;783411.*,)*&'#$!    !##'$((+*0-0144688<;A>EAGFIJJMLPNSSSWUXZX_Za^bdedhillmnoorotnvqvvtywuzw{zz|{~|}~~~~~}}~z~z}|x}v{vwvvutrrppoolikehbd`_[^WYUSTPPMJJFDC=?986210(,"% |x}xvxsqtlpmjngkfheeg`g^g]f^dbcaaaa`a_a^b_b^a^b_ad`dcedhcjhlknkonqnsqtsvtxxy{}|   %%%%,%1(2126395<9<>@@CDEGIIMKOPRSVX\Z^_c`fcigimjomqqvryvzy~|z|vwrtnokggbb\YXSULMHEE>B7;05+.(&$  ~}{}{|y|w|xyzvzxw|x{zy}y}}||} "$$'%,*+,0,4-5274<8<>>BACDFDFHFJLHPHRLRMQQPTTTWTXTZUZYX\X\ZZ\Z^]Z^Z]]]Z^Z^Z`Z_Z]\\Z\[\Y[ZYZWYWVWUUUSURTQSPQNMNJMFJFFECA@=<;894805-3+-*()$$"!     ""$&*(.,.1173;5?;>@CCGEIJJMMPPSSUXZX\[__acbehhklmpnrqsstwwwyx~y}z|}{~|y}vzvvurqpmlligfdd``\]WZQUOQKNGICCA>>:;46/0.'+!'     ""%$('*-+1-70857::>=@@DDFIFMMMQPUSVWX[X_]a_baddfeifmilmlpmqotpussustvrxrwrwstrtqtpqppnpjnikjhifgecd_`^\[ZUYQUPPLMIHFAD?>;:9550/),$' !    "# ""##&#%$#'%'''('(&+&)'))),',*+*+)+),(-)++*+)+)+)+(,(+(*))*'))')'')$+")#($(#'#&&$%#&$$#%"%"$"##""""""##$"$#!!       !"%#&&)**-+1.1124475:7:9<;==@?@CCDGCIELFLIKNLNNOOQORSRURURVTVUVVVXUYVZVYWZXXYYXYXWYVYVWWVWUVUTUSSSRQRNPPNNLJKJHHHGFEBDBB@?>=<<7;58462200,0(.))(%#%%"             !!     !  ##"  ! !! " " !!!!#$ &!##"$"$#%"%$#'"'$&&%&&&'&(''&)%''&'%'&&&&&'%'&&'$'$%%%#%"$"$ %#       ! !!$ %!&!'#&%&%(&&(&)''((')()')()((((((''(&('&($'$&&%%&#%#"$"""!#!!                  ! ! !!!!!"""""#!$!##"##"$##$"$#$#####$#"#!$"#""!#!""!"!!!! !!       !!! ! ! " # "!"!#"""#"#"#!#""#""""!# #"""!"" $# !" "!! #!                    "!##"%#%%&'&('*'+(+*+,*-+.+.,..-/-0/00/101/1012020210203/2021110101/0///.0./..-.-,-*,**+)*))('''&&%&$$##"!"!!            !!!!"!""!#!"#"$"###"$#"#"$"##"#"#"#!#!""!!! !!      ! "!""#"###$$$%$%%&$&%%&&%'%'%'%'%'%&&&'%'%&%&$&#%#%#$####"#!" ! !              ! ! ! ! ! ! ! ! ! !                  hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/TomFloor-Softest.wav000066400000000000000000004652041366722712400243110ustar00rootroot00000000000000RIFF|jWAVEfmt DXPAD dataZ1SL 1/ X 0 nb//c1aiL+-_-(k8 9VT v,   | *98d sfO >gMvw!gKj-L qpwR  -`Y_%rr֤bMywz1ܞ܋6ܩY؈e2EȉAĶÙ¾<6ڿNkeoo-L~ʧ˯̼ͤΒϕоBԹ1ENـޔߺOkf޹ޔߕ oYB{rs0 ZDB~^8" 6 =$} !#%'()*n++,A,b,n,5,+X+* *W)g(Q' &$T#" 9=](W[(PTph # h 1 3  e { m ? F [ U WGc$  C p   }   6 O u (nJGy5<NLGzTpa1Vg'.Mi:obb>ydjaKIeW(SywEVQ0' SN T}(DZh > 1 U _ D*"e9-l& "$#3$=%2&&'(e(((D)}))N** +O+++^,,I--6.. /d///p0112E333u3 321F100////0"0///C//.S..-I-,',J+&*(&q$"<%k  \ D 4ofK g]kwWiMPN7R8"#,.d 3 } 9 ?|]o*5",Fn {BrCMwnq z 3 I m E=6m>)yi `v?T<$!Fo@/!q 3vh0Vu0-{U1vv{qsP5  X [>~hWcmK` Gcy*>!#$G5Ze^.q>4q^WP$NZ%Tߩޣۃۃۍg"ڝ0ڨqכ^) qMض9٫Xڈګڏm@&ZھuKܿIݝlK@7{E'U(.A*t!7,x;9A=x((4-I\}]ln5d@QD:T1 _ H W Y  t L / < u b@fc])a+Z%: \= `.i$Gv_3]U(hqr2ytQ RW'%o* 4fX?z!p&omcfy0m.nRv Vj$ L Y y H;={$M}Pu[ D!!d" ##$K$z$$$%R%}%% &>&t&&&"'d'k'O''&k&%%B%$$$#]#"U"!x!! g % g-3~/q$y0 PI$Ai _ e  + h  D \ &W)@PV" @&}}C IQMPeje="nf& k5wRn;{ac r]{=2$RE\ v,]Il[C:Tez 'BX!Z5?^`Gymvm}Dx0oOI5_tEaB*,##4a 4LC  W-o~Lw_y]2X#&4d@VMO= *6*@UNL={88K{xcS|Aj#f[GZGS$1A *% b><<: ].z^yM4@  [ ~ E S s <;Kg*zMJY%1%{kC o k _ d 7[*]?/4V"n*\7~5HgdnlH $5.ki>$ X7 Ec}8bXI )O\j nA f  ` 2 NKi.<[J:)A| P%hGs,g Z&y1}RYD|0id>N+Cm O1NQESy &EziYEL6!yr- Q%,! @bLC>uTi YId g cyM1^(^v{}Z-&-wQ&,M+EV]}!AO\ o8e^`sqzii[0 i_ItR,IxU>5u {&*Evh*x,-Bc0O7"Ad8xI^h -Bdw &$-Vus3#JuM,_L$DA{Lj+y >  x  / N h EVR&@?* |pFj4t> 8D:Woo}sMcIq;M ' = x l 8 kTSoi c3woh e H;Re8iA  U S ;  K A r _ V g " e  3 t  L ~ "HLO70 k B   x ; K  J h  vIeR T$V l,JQUaGK]_Pg'ym|wVySI( 6DNB#xM%Tvv}l}6{vjrhS9 *4((*Dh}7JbimC!hex2#8n.dy !MAw$;eW};z5ZrbFyL u D9k$Yx1W9;PSoG~rdJb]rii_ku14c7>.eRH1 %1[s={-y-DNZ$QOg8-svZ(  < w  j   B e ^ K % < )  ZIj L  7 L d  P ( \ .zzUm<.:v(t+-7OOOS2&{vv~o\4vv{xMiC uw~~[]"mahSZIckyUP.Q L c  3 i $ J DM-{s1~@I]tDO7Kg7u)=bS($D #R/{Q<}1U AgHx 8j;Ly9iCU;4rO]Ir7" j t+<`Wk_;3e%>Ccj7 < R 6  h J^tL&V:iuzp]eb|V0dVQpr",   f>vcXGEB# N<A + F ) O m m w  . C i  R  U     + ( 6 Q \ h f d X Q G #      \ ; z l <  [  t N h? ^5b"Lj1#vj^K8  JSjtD|E+>qfI eY@-0Z~ '7Mu%.c}A*Y bIhsVS3?k ;Y3~2IdbR R/yC.i?x(\0V^;o![gK;XWsxjT. :wCt%e.z0|2_PJS l l0k_-+0505E_p%`/hfL:`6Z >d5JPt!i.j{pK4f[( J = d 8F~E"?3:?JROF'[$m@49Zc"-SCV@QCbrwfO$P* tR8x59  k / K % j ^ F 3  u T 0  Z 4 !  cWK1! nR:''~ubppuFn 4I^o    qI, s?gE t7D3JS2c!]}Ug3k2i0Z!vHm!qTrm?^|URFCwPsY^8) "3Tn=Kaq9fTu 5==Ycv(aw5bp0-YLU-hN>/--;Nt#\m>n!iz'q46RZq  & @ Q ~  A k  K  \  f 2b,e*UPa^ct{}hhRahxvlcq{}U#z[< X E  q  b  Q  m &  tR!T]C)y|ia_Q@+yN(j5[)dN!{P1mJ( oI(Mg+~@!N-  -SZ7nW(NfyjP;n8 b0tE }6^lwh#DAQ@ 8H'iH- taG9}aI,AzEoEa8qA~Vm>&@dT8j4rqxk~Ybilc X:u1VEz1q*U(tN}_ YFj@pX3M} 4Iq{ 9 Q w t   ) H H > > 9 T p ~ [  p d @ B + ;      + J k f r ~  b  W ; a # L "r,RnxMX  h  c  T  E @ x\G?4BRem{ d 0 ~ 8 } # x  { TK8PvqU/uF k9 { Z 2  \ Y 3 #  ( B R c e Y W K N U F R D 3 : % _ &  { @  ^q1EJ{#e dr_!a*U+m,5s@BjO~Ef1F b3Q$cI#!@cv 9Ou?z#DTv} */hF.z]unun[?:CVuipOTAC37AJRTlx 3WLUcot $0ECO2&+9-&{ySoZych@;*&** -(1-6@Svr $&XpfN(t$l3P@9 ]R4; & g  b  W \ b3l^LVkySH&mE o\K#[FzT2 r 4 h 6  e ' i 9  Q 9    !  7 > m r t ~ ~ 9 T ' ? b z  3 D Y a { c j W \ I 8 (  [ D )     ? 8 e l     * / ? * 3 ( ,   z ` ) ~ O " { Q G5wANa*^?gM"|G2jN1Jc8 ^)XacJ4P^%b'|GyL(jMD/61 *s^O<nJ>\I&\?e?bZZG%Px+ Q uK47)y<[1s@4CS_|.JiDg(Gh(4>>EVt"'COOQEQQTTAMAA.i>c;e,uV0  'CH]pzTG2r"w3^;{4+sH@m!N+g5l?h7 m  ) A T r   " 1 1 H 5 Y [ u   8 ? R h h & @ S t 7AX]knTL90  ~ r r w m 0Q<Vs#3PcRW86# F ) y  m  M r  Q { %gm9=^z+>\6]BtvccZUjt $4EN]rd{r~~yU>oW(}cYMWjnxvz /B\qqv{}vm^B(xF%i+JfA]V9{KR _7mU*\F1sq[Y^sx :Mexls{elB8  ,1P^*@Pcroy{ 0EOmr $CTs8e9o   { \ = # ` Y D 5   ] J $ d J + }aG*s?O)kf4P Oa(t1Q+I}qA wT.|wL; aS-! ^`8|dH7+w@+r{\fS\BD#vWM:# iYF00 "7Fp'?KYevq{hYR\^\\IA.. i`5) 7Jl .:KII\Rloe`YY^KKAMFMAF:??=?I=AII^{1S7uMFx*v-~A==th&Z +dw)733++.$".0<<F>QQpAc6(fC1P 16UZ}     4 ( &  $ - > J 2 9 4 G d y  . Q w  R } D  Z &u Hu#*BUWqxRW?1,zR rC2 y Q } F  R ?  | V >  w ] N >    {oaUB%}x}jjj[^W[KA|gT.NhK`H' ]Cyyd__>LCV@QJXQ_S]wppaX9t9Q Nl,b"Ch@P[ |GP*xYWI\`\^WMYAF%|bA ]<Z(`Y888,:/?1B8\\} //SUyLZyrpZS>&   !2CZpu.R|*T(S)Em:lFg(@^+4_Cb5Ycs 6@Wj9p!6S4_| 7JY|K^z*Kh$9Za+Jk1D^e 8Uh}  a t 2 [ ) A , N  4 _ V'Me8a#!@;NIXX\XEB{aB,V X+ L & x W B % q g D : ,   w d > 2  t U L  eN*nP.`])t_JL/+{N6n3'znTA+|aS-vh@ E^!^:d m z.5L vL* 4LtO~'QwIqvqeYT?1znbTQF:'yrypm_]GZOVXXkw|fb]_VX>G4ycI;-}`AF%1  %,,=8Ylql`ehx1SfOiHnI8a7EQityta]J;0tZD* e?%'1AIlqPtJwAu',fE j@O:q It>Zy$Jn8eq*c B p  7 n  < [ x  b [ ? )   ~ u w i [ A 2 ) < & 0   & . 5 0 $ + $    " &  + 5 > O b i z , R g  % ( 3 3 / 8 6 B B W Y j { { x v v } } x v q c h Y W Y P ^ P ^ U N ; 3 , ( * %   b K  ~ V 0  U  N8:JI n.CNyG{W%R= kAXGhP-q\A%]H. ff>)yfN9eY8,gJ'p]C0vaSE9#&{ol`jWP=%    %:6YWoov@Z 4CQrRx6K(Nv0Z3d AKqq   (DU{&-SZi$0MT[V`[]VH+yf>({fI-sqP? zuu`YF<) ukXL2 rmUS=6(lxe^PF::'6'33:ARcx!@Wr2Cmy'g| :Tc}6;GGD@GGG;8-/1*4z^P=#pT.upiprpufbfku :`8j#S-XO P;y/Z!SQr H Kg 6GUhv}&+4BBQQQLEXi$2JTns  8?PR^^=Nm  9 B Z f y                  $ $    $            7 5 . C < T T T Q J Q T b b [ [ H [ [ d d g ] b V H C 2 )     y S +  {Z/ RH G^R`LD2fs1QVfg=bJ$Z; eF]R? bO7r\=* {{qqv{{ 2/UNv +Jm :`s*Pq4Uh!24EXw0>JOin#1*:1.,'%%#* lw]n`]]Qb[nu 3Ml (So0i2X3} P!NP9m >%MgNv/>rHk.T=Uv}    + ! > ( @ > N B @ 9 @ 9 ; 7 / 2         ! / / Q B _ d m t      ~ p d Q 9  xW?}g^W1.k`A: y_QE>EB-& {vfSK8-4PZt$4SZ| "070)"ydV9/$m^6[T'.  bJ)tdN7+ _9mS&aW/ c[55zn`Q>:+$"iaG+mS8( g?wT5w@m=!Y8nR0$wdL<494COQdJ_VXSQV]ddkd.M`,'`T*=P_f{-+))92<-$&!+9CQL_Zbfw"MY6DM^v!^m 0Vr'Ms'P}!G{-U4rC_ $>`%5=FH?8.5,,"15FKTWTg`sv@j>d)b*R/a ; {  < n  ? ^ u  % B W o   2 G L a o )L]iiiHC$90A7 k r S U E +  U \ / W 3 k ) U & }/n3O+t;v@lT:|Y7_&oG& Z4{P=(n8 s2"aG++-(@GSw0Js1MegPA8 i2Z>yhg`M:=*' zspddOT73+|kdO>&oN=*qPD'*18=Ihx!=Ico!+LV|7Yg.Ts%Ba-@dt7Xi':Yg#@Ut/+JXQaJfw #4@GU_r ;]~+7gn *3=AKDKRYTRKPR^ggzz!KIy@Vp5V,W%N{ > ] y  + > O Q Q b k p i n i p r w u r b k b i T Q "  t U E $ jc^^N8%4%;;DD??KNaq}  $ / L U d f ~    $ ) )  d B + mN!v[?|M5wG+qN(nY5gH0waL+oW#S>mI%sK*nM<wyN9vf@I%sY,pJCki90{_G-}jTI,sssguipgebxz ',6AI\^}}&/@GamE]:l 11FYq --*/GUq9] .Ed8`8c(Q;_-i M'^Iq(Q+[:eBG^qv              ( + $ +          ! $ !   ooWZIB*nvY`P`TgPgc}sqnszljYAK::' |sgTE2"|k_NJ9/tthhc\UG;68!#vl`WH5Y5rd;-{oU;* ddJG/!yyj^G(!  }YA's])ZE&j@-qP?n]Y30VJky )<OXw   "wnVQH<<.<EEHH5H:AEXVwn 5cq/q ; h  C n  , ? g n           } x n j F 5   r O 5  w k G +  {jRN/ gWF,1|niX0|iiXV;$ {fK1jP*sT7 tS2 o=dJ/j^4(leW?'wi`JJ$) ~i]E>+}mZP=@!zvlz\vjq}}lggccWPT=#p[H)|k_O<9&{{jaZNUNNBGLL64!-(/&((4=9NN\cr{ )0GQr+0Obw *:AWTql *;Sc+NZp 'Od,5H[sx,@K^ftv{->Ldf@Dt{-9ZZ'0AC`l "%88DT^ls66GSa{q &-Lk$A[.8TYgns %,INav} & G Q r ~   . 0 X g z | w p p n L 5 $  f G $ {K,sH%n[)|rJ( j^=;(#ej[njj`TPK?:% z``F:<)+  yk_N;$}hcIPG==#& w]a>>!}yZ;%lD%[0ZJf8^8Y5|O& vhLL!}xv(-LDZjv@Juu$'':>OMQYbbpn|w #.KRso (@@KZh}G_t0Mg,P[q}(@N\y 49Sd9Nco+LZk5M]iu*%A=RTln} !4GUqt !Bi'[z8Y 6c- X 9 ]  : e ( / ; F ^ ^ m c m c j c c \ R N = ? 3 3 #  s b H 5 " p X C )  p S / oU1^5s`M)rrNV4U\B=!jvl}zn^M31 lH+rV& \@d7 o,c8O2]L4{ohUUIIBG;=/-/%1*6-#! xv^eT\WIM*,wib]VQOFF35'  $"JVz 1'KT`-/@=Uhy}{ 2@Qkp'AVpw,MM}}1Ka2Qa#1Ljy&+;CJ@XQr| )+75COVi'5=Yez%B\q>>tf")+"5<"2$$~d]@G(2//LVfk)2HO`is*'M:cFTPTYgnszq *%111I?WPcZoZjaca\RZDD4?,B!1#zRM'"VAZB$Gz[T3|J$o@ tQ4qU, T^=*u]THE72'"iXC0( vcKN@%zWP,'l]QC:0'  ypimbifbbGO2  $!>Zm >QQg`iuw,5?PTW`^jexqxgjKK5."" uuki][XHQ::>AJOQQ]<OCQVd`gVXHTEQCA507.+ ~~fkSQ@7!qSB%eT5`[C.ykdXSQGL24!+ vchScPPG-(tkLE(yoPD!v`D1zu]MA.2" ~~rpfdNL4&{^W4*}gI?%sslpnsgpnipdidglpuwwz  ,DYjz%-DBNUaqy-;9XNik~.2>VX '1KMl48S\fo $!9BLaam~*9U\v}$CXp~ .Fdw*:Tg;Dcv $4Zf'Qb ,Mlx(;hv  2 ; a m  $ 7 9 L J ] ] n | ~ | g ] O +   y ] N 2  cW/R:zT>tJ& vc8#}^H=  gM7'yZQ@>( vZL;(hfQ>2}qaWIB1(leYPMDA=83"3,|sVT'|X@&yP/zP1nA'fJ0{trcrcjhjvotjmj{v}!49L_r +.HHds|3A`g @h{2Zr"2Od':Tg%(1*6/468864=,6%# #8@\cq7JZt*;\m!-Q]$0CVin|szlnVH:$"'0MVs| .=P^jx%4BI\^v--;L_r52A>MM`Xpswu`VA0"yffNB4jcSGGB6/#  /6#;8NP\oq!+/7;;E4>29/>-@+4 a^B8qe5%`M$iC&tD{a+a;qD%d0]QvZ4zlcPF1%ui`YTF>)' |k_J@+$  !)20CLZbur:+CCQY`sw#6K\q!IWt2Sf$En:eDh /U(Gt LXA]*Hl4Bo}-Nf +<Mdn "%3'A5^Kgglvnnlllnxx/;(B;GNUaZaa^aR^\hmmxv}{t{hxom}jtjheW\DK*6sT?* `O+ taB4qjP;-vl^YPDF833 ,         uidYQ:)rf@4 \L!fS2ZD(gT:5wpd`JMAA72'  "'7.HEJOQO`[kbnpi,%3FFR[Kl^svvsq^RD85%"|]XE+yXL(}tSN(#oeqe^TK?D18.,.,1.',..61=,=*.1*.*#' .#31,6,6:::M=YT\gcov} !/=Uh!@Qm0Mg'Kj1Nm;]r6Uj(4Sd|)7H[l|""     *5?T[lx/I^t!(Qa<Vk1DWs %8DZcq  - 2 7 E B Q L a U h _ k a h k h t _ ~ ] t S _ L B @ & -   {c^GB%#z`YA1%uig[QJ<5+rVN$$qa@#e:pO+i9S/{E/tG1WK' wdHA~t_iJN09$}vhoZaUSNWDUGSNPIIGDDPKPNGPINNDDBBB861;1@*D(I/D/6666;41816*/%!  v}qveo`^\KFD88.1*.%..%' ,6'='D3MAWRcjoz#(8BKZhq0E_d+.[p3Ke,8fj />_r(=Pc} (;>QQfi~|~ppf_]SGN>@@;;;0;-@7G;GCNJXVi_wm5.HO[ps 53KHccv}!/=B^\}{(/GNfi '7HTbnu~pnXOE+' riNB2{oZWBB//zsx^`HF:8:%  wwpg]YMQ:A+3)$'  tw]]J70rUS4&yaN/!oW4!qFzJ'~J-K4`?VF uZC$}t_cLI=;91/&!#&/69DPUjf7COrp:FYs#1Rj;Na}2NZy)+MT`zsz|| %?Mcz(8Uj$GZ{1Dcy9Sr +Jg,?j}BhL]AHw '5Tg} (/4?KPWcamhhhhjomjaeW^PWRRPDG==11,*/#}njTKD.. wiQ:)~pE9}aK4eR=%zzdVM>:'"ytdfLZJGQ@G;92-$+{rtja_NS==*&! whp_ZNGB9;7/+&y\U;;!nzTM3"kX>)~kXL2+ y{oo\cSUKKDP@NGUP^^hhmvy-79CGS]aww  $$  |r~tktd_XLJ970-++$(  !44@XSiit$CJ| 5Knq,@Pat++@GUhk&#BDL\Zor$+>@XZp~$:Fdn*DPgv !%#(%**#4-!#   #*6DK\o{&9Nm.Q`w "55PMecssxzjzeecY^TWKK53""  ikXTO7<mZ@+hW6jK*Y>~k7!fG(tS&jh88 gTF1" p[Q7.||_ZNG92&&24CNSair~ywkfVJ>;-(vq^ZKB4*voj`\RFF6=.6. % %8=PWoq;Df0Edw $Ob 3Fg 6W&Ey1Iv>Jm0Odz 8HWn}%-;DWPfahjv{}{v}jq^\B@%%vcPF** zsn|uz %,8AP`n !8GZt+2NVm~<<Q`p~udT:+~rX7/{^Z8(xnM?% bgAA+|ytidaV]JNEC;E+9vjSN;/&{aLL2+ ym^IB%zegPA8"pzgk][QOH>.+y~tttmymfaS_QXNJJJLJE@920&!! oohPPPDUGIBI6I;GB=D;I6K;KDSN\Ucajq &;GVfpw"5:CHV]nk|nw  "%%11DPWcsv *1N\o +-EEUZdhwr  !1-=GL_crv--LNwy $:Yl 'MYv/I\$EQy+7Vkz"3:AHYgsnjMK*"~bT2iN-oU4jT8%zgTA)   .$CATdgw '.:HP^c`lcvs`DAnV<)r]4(mP& kS4fS%`W1unO<|XG&vyZI6*xqscqgqclYc\\WYMMFFKDD8:.:.6*1%,   1%F6KIMTY\glv%4Ia{-Gm $H[ *F^s,,SPot{{mma^SNB6*% (/=PSvt7EXf~ 6@\hy;Nay ':MluAT`x/8\^vy-7>@ELSZZkitw~|mydtZdLN@974-y^ZGG1*ngPH:5%  % **8:FFAADFRFWFPH?R:[KY[Y[^Weegcj`s^xnqvsvqjcg[lYlT^[R^TWRFD88.' '' |l]J:$ySG(y\D-rS7$vZK4v}[T?'uzdz`s]bdX]HH>20)))+')+0..ymd]L>&qoWPB4-  !!#/-68DKKPNWU^afoo}+;Lir0>]kAYx!/ct/4_p/Sh0Ld:>di|%.FKcxx46@@NKNUS\WZWZZ\WaWaUUWPGNDKI=G84-*%!!(#%*!146B=PIcUqm}47NZkt'2>EMJQJTQTg[zd|s~wn~nkn`bXTVAQ05+" ytaaLL9+!{tf\^IK;-* cqAM.5l]M:. VN!t\G( fS9 cS,*q[M1. zuknbb]OM><5270727EOT][niu  "1:MRjcvz#!/*4,4*/1444444@;=6/8(6(1#/!%!ll[W=8s]HA0~y]fLCG+9$$   $47;22;>CXNiiy)+CGht#-;N_cry  (42;LL_dp ):Jdz %DD`j 6KUmv $-ELifyy50<>J`bdkgwzz|`kVOQ:C$.iVX4;& hW=4 nHAdT:.|mV>7 jU@9wmk]XLE2-}oofSK;4(! }}`WA8,wdQA.rfL;-vcN-%oWM3, wnd[`MQMJCH3A0>ACFJHTJgTl`uw'6PRqz;=^fv&2NQy|03 yyXQ-& tt\WG9/(&!  !&&4;GWUvj94V]y :>]Vuwplg]dQY<C.+yw_ZE;0yo\L;&r]E4ocDK#!zc^PD5"wuiwiwisikb`gXp]kbgd[[`OTCOHXMQTMTOQOHH;&4( !20JJZir'5AT`p|.=T^z#DUqGUp!4Wj+Vd0]l58cq *D^v+4Sa|.EM`kn  '%,=*H,H::3*55?FDDHADD?H=A8=3''  ~bgQVC:$ tkV>4{oWS=**nxejRP?,* p`VC>7.." k|]]L@@-0moSW@9fa9;yjZ@6xvM[5:' wud[TE>:")  07C35" yifNS77+ vmcLB-(rkhd_US@@-+  !-!B;QL]]prw!&&&1*-*&## rf_>2tjID^Y:*wbT>7wwaa]VSVEL;@E2G4794;4;;;9@9@@EGLLQV__dardwmyyw~"$.52AUX{w-;P_v+-SSt|'>OYs|  1,TWezx!*@PWcy(4(EEVarw'"..<2A7:HAQM[`Vg[d[TOJHAE05.$+w~aiQE;!y{Wc;@(zz`eKD:,,sigT[FF<+) yy_ZL9;!taZIB6(pmXSB;$aZ;*lRA.n]<0rwVV42} $-09CJZ]fr|+77XVpz %.HRgz8IIhh} &$(2->@BGLLLQQLSBS>L;>2+& q}vfma\ZKPDDDDBD;G=KGPPNWU\\\mj}&2-9>JNZ]kkt !1/GBSScfrt} !$4CJak|75VTnp  *'3=8HDFYF^P^Yc[e`lee^`R`P^FWDPDDD=35". '%   "31HDTWjgszzsqjcYWMKA81,"|ig`CM$0 fXG;$cZG;-#mdGB-otKW18``?A*|nbXJ:2"~|rkpadaV_NJN@N>CG-G(C->>;J@L9C7C>EE@L@VNaidppwwy~~ ..027::E:QCQOgTn[zn**==PWeqv16KZm(BLty/B\j0@Vfw):J[`||''1=?PPYWeclnv}}}}xxsjs`qcjegc^cY^R[WWYYTYRYPMKRMRPTPTMRPTPTTT[Y[[YY^TcTY[R[TWYWYYR[MTHFD15*%zd[JC'. |mkSV@9+&{vvhhZZPG;1** wpfaLS>B+&&{tqchUSDD68(#zsqqczTsTeYWTPMFHA?3311,5.1***"' '%  z|ii`VOCC<..~yyrwptppmidmawfrrm~p||0'MEgg.FR`v8;^a{!$QJrr !;;SZ_vo}ymtfr_h_\aU_W\_aafhjoryv +-;CJ_]wy''OF`p'3FWgx 4==SWhq$&($!&&&$}htWZI;/%}j^YA?.' wniVTC73 wwZQ@7!&}jrZWUII;94#* ~wwrpafU]JG4/& yqjZ^IK@;64!%vxj`[KH:5"" uwdXVAC5'miXN@2(y}oqojohvo}v4CVdw 0EOsp'=Mlz46Uj{ (2BJ]kt   &#41=BLL_\hvt&0ENd_r~++AHO]bpu %''*%*,,,838F:MFHRMRKRPY^^egjlllqjvjzlzx}xqzje^RHH8?,%" sndiTYHCC3<3.0"' ||m|kykrmkr_r]kXiXf]__Z]VVGS>J;@>>7>292(4$2+!$vvhhSNI94&{raaBS(- vfaIN4;% }zssqlnj`jYeTYRYRWPRKRKMKKTMWHPHRMM?M=D5F8?=5:.8*1,11,53133=581=5:581=,8,*'"      1=DYYvs /DStt(EXy6Lf;Nm 'ATp1:K^c !%!###((/#6%*-(#-! xqvclc[g[`^[[YW^W^WWWWTWYY^[c`geneqnv}}z}}zslje[KD8.'wbM3 ~NJ+tZ@ tQ7!fP,xPDk]M20|tkk]ZVZVZQVV]]p]|fw~w )'0EC`Viizu "%88MK[Tc^lqq}} !!%%,,*(81@8IIUZ^fcjjmjtty}{} &$-/9;GEQSXfk{y !-;BUZhty0;N]d||  '00:ACJJTQ[V[VTQMJFFHF>J3F)3 ~ytff]SVQLNJLCC99949270240>-@9ECJESVdi|w 30CCV]bp| '" *.",% wnupgl`[YMJ>A35'$ ~yyrfdVQEE790&$ }yrha\UWLNGD96/**&&&!! {ymf_QJ>-$}yWN1!}xWF5*p]H>+" yidNC0$}{ytvjojmmqtv $9-G@XVpk|$0>HVdi| ''?=YTgv %4BKahy(+GEk]w #--@@Way ($07CGVS__iamiy~~  $ 0.7>FJ[Qdbnu*'AARWgl}(*D=SWf{}&2BEJX_iyrrrd]XGG(-  vcU=1[F, sT:pE7 hU=&mfQ79}vtjtchcWcSc\ZZP\SZISNZZ\Zcajmm{q(+--++-79>@ENNZU_ZXS_X]aZdZdadhakahfak_fkdrmprm~p~y~ww{wwwt{tpmdd]SNG@B77--$!yqaUBB%#lq^[PM??3.,' ",55H8W?[M`cexq *(;6DG=IDD\Pf\tj{}y{vtohhaW\IUBG8811(!!  #,/DD\^oy{ $7BS]p{ #;ILff} !-LNiw:C]d|*8DPgn  %%;6D=KINaSj^focyj}y}ovjf^WWIU6K*6(!z}xc`PMD=1'ni`OFC5+ ypSN2hcB1 maE4!ycI;!xe^AD*"nkXOQ7>'" '$27>OOM[Tdiu"53FHWMeReWc^vq ##,(6=D@DGGPI^NhZamZm^faca\mao^o^o\hcohoojvjvvt}{yvy $/>BXZmt&==Zho(4EGZ]wt  $ 30AAMMQV[g`pippbnd]g]```d[[QOMFC::3)$ wyifVXNC>22( {}&$44JCSNXX_]fdkw|  '.:>HJVdlw '':3A?ADPTg`zeqzxxgj[[PHD33 wbYC3$ mVC-mZL/(~hZB>}qjfWZSKPD@;/,(%#!  %!((%1,,//1*8,816616/(1(( `gMM?:3* nsb`VH>2'rt_aVVQZ@V9;72040200$0&240;;>>>LGQXZimt .2J__y  ++AOYpw 1,DDMWTjgqv           xvlqec[TRFF=:8.''wnb[QHJ30$mp_XGC00}jhWPB4(wkfSJB4-(! yv{qoqjjq\oamhofj\cSfU^WZZ^UfScSc\^\aUZPZSZUUZU\\^\\Zj^hfjovot{m{tvvqqyqyqvvtv}vqymvtjofococqfmah^mWjScUaI\@ZDNIDD=B6;/,,%#!#!  #/86BSWcjm}+!7>JQadpty~y{hp__ZNQ@;9(- {amW\WK=8%1(#   !%#(4*6;BINKPSZajq{}-(;GN__m{**=DPW\mm94QSrw5AM`p 33RTj}%*44K=WNc\qt}{}{}{oqcfj^hSZD@;86/-# svcc[TPA?,. zwli]]JOA:0 $yyprik_]NN>;-+&om_UL;-#wh_UJ;7!}hcI=*zjcHK8%"|kdTJ>5'|pf_QS@E>C;9>4>2-+!! !-+2;@EQE]Ladmp $)HCdg| *5F`[8Baa!7@Zdy~1/DDaUhjyt{ (+$-(049;EJLSV]X]VaZfdrp|w|    "'  |wrrtyppptrwptrty|wkk_SXCC2((yrjcWUN9@/1## {~ymmdZ_QZZLNJ>J7N7B7>;/4&/(}tjmc\WKNBB4/* }xxen^`WRMK?F=F:A835*8%*"%    .*?=KT[`ss ,4SWm ((GS_-;Uj{(>S_wr "305ACO[Vilwsuzniidgdg`i`dbbgddg`iYl]lgg]dQdTbYd]dYd[iduu       u|gndb]YQOCC<:..)''"  ytmk]]NN@;0$vt__GG4&&~pa]G@/(ym^ZIGD/6    #!/#;1D=KDSNPZSaccmcvjvoqyo}}}{}}qmt^cSKK;B=4=/1,/%( !**66BDNISU^ht !&4J>dQmft &99NS_mm&7-@>@GLS]_fipmtw|ywty~  "$  )":.<5><CF>F>H<H:C>F>JFMJJMOFQJOOMOMJFQCTCMH>A7A:AFCCJAMAMAHCAJ>OCOMQTOVMTQQVV[]bilnslzpszs|unnwlslsglininingbbddd`b][VTAM:7+" rrdVN@;$$ rhaNP@;- yphaXSJ;@22+$&{qmocc\WPUGGB68/(( ssq^gW[YHTA=5,' %5*D:KKW[^jjx} #!/86KD\Waojy &$+>4GBUNk_prr~y  !!#!-(11;;GIUWcctv !44ENXif|y $)><OV]pd|u  "%%1*5183:88A:HDKHMKPKTHWDYF[F[MWWW[[TcPcTYWWTMTHFA5A15,%%pud[TC>3"ykfZE>$& rj_SI=6(!~{~~y{rpt_rNfEQ;;-4-}vvomch^a\SPG@@4=,444*!  !#,#6,=;IGSI^P\cZjjjqtmm{ !((!(-+$!!$&&-+-4&4&-$+-+!       (--$22299BBLSSaamtr{ *1@GSam &!77NLady  +.5CATO``gpsz|u|zlugi]dQYOVJMC>F5>5.5$+""""   y|ri_VLG>47!}hoUZ@B/! wkaQL>2(jvUZI==(zvvlg^[RK?A13'% .*=A=RFYWcnqz %6,DBUZ^ffqo{y $/-9>;LEXNfakrp~~!!99PSchr} &+>@SVkm "$37CCTYbipu|swid`TTMHA<05  ~wwtmaaVVLL>C770-($&&$ !     $(+40>9CCEEJEEJGJVJXL_S_ZX]_]fadifikkkrpmrkrktrwp~m|mwktimfia]_JXGGE>C4>242(!(  y{rofc_\WSLID;=-1(&& ~trkfhS]GQ@E;;72-2-(2(2(((++(/!2&-(+/-$+(--22>2E9EJGQXSaZkawprp{twkh_]QQBG27&$vfh\NI86(%zln^`YPHF:=3.."%  '*8:HH[[jlxz(4GK\fo} !!E7XXdyy #-9@LZWrf !+--@-N>NVViawm| ".+7<AMJVVd`pgu.*==MR^jgxxsqe`TKD=.'uw[[AC)) maQN74 jaPI// rkdSL92! {{caPKG64(% zz /(64G@UKZZ\ajftovtv{{}yyqvooqjojfhSaNZZ@Z4U8G8B6;=64888;;8D=GGNKZPZZ^hfqoty}$-2@LNd_tr &*#4*@-@6DDNLWU\WaWc\_Z_UfS\UWUSSNSNNUPPGSDSIBB=;69(6&-((!~~y~{ywwr{p{wyyywwytwym~k{ptrtwy~w */;=SNfjo{ (7>N]drr$'75HAYObbipnzz|pnuggd]Y]H[AQ>F><:5.0. 0)$ ~wkiQZC>7!! }oWP9- hdJ@&{fZG6*`cD=* swQ`EE2$' +27CAQTbks%8AP[jvv /,DBUZhmo}{ -&4247>@GNJXS]famfrmt{{~ #*1=BLP__mo}!-0E@ZZpy)+>:TFd`gplw     sp][OF<0""ppSS@2${r_UI9-! wwmm_dZSSNSLQLQNQEUBUJNXUaZf_hffkmkwmy//69@@BPLcSofyv}}{{oyjoc_aSWGID6@-4# yryktfk]h]ZXSNJE;B4@42-$!{tcfNZ@K4=,1*##}szsqljg[gTcWcPPDHAFAA?=A8:81:18,5'1%,**,*,.,888::?:FAKHPWMeWlejvvz(88SNfayv$$B>ZZp/6DSWrv &&9@VStf ' 3+:5::A<H>JFQMQQT[T][]i`lngwlzuwww*8*:?=M?KFMDPHWR^P`McWcecleqgqnsqqssxvzqxnxlljeljggg`j`j`e^^[YPPKFF:D551 "wpYY><"~m_J@$y\N;!mhLB+( y{ccUG=*,xzqljeg`e`Y`^R`RTPHFF?H?KKDP=M=MFTKT[Tg^gjsqv !,(/(11646;61=,D/G@KDNKKGU@\BZGPGPNGUIPDKNKPNUNSSPUPWS\WZPZNZU^Zcafhhqoqv}{-(7JEZaZhftp -(B=USchrt}!!!-&>+@0>9>>CE@LJEL>J;J9>99;90@+9+0!(!   }yvjm\cPSG@;/1(&~trwwrwryrt{ptywwtw #-1B@ZWfmy $72JEZ]km|  $$$$3.555:573<7:<353+3))).'||priki_iaf_k]ifdmXdZ_]]]X]NZJZ@VCLGGGGEEC;E9C;9@0;424&-$ yvmma\SII;9*! {tpa_XQQ>>2++{jcUS;B,, vj^[FD3*%"|zpzdi`X[OTJH<7:+5)2++))0+0.275><H><705$$~wrfiV]QLG@C22+$$!  }trojamPcSPUIID=;6//-*#  ((&*1*=/;9@=BD=I@DD@DDGINLLLILNLPNLPNBLGLGB@@696*1*-1&-ywwmhfUQB@99-$!    $(+&&&&(&($-$!&!&yyvhjW\KSII@8/,#!  %,/4DDUZcot +4>S]dy==U\at  (7CNX_mm   $ $""$" "$     $" ""  ' .".'")$++.+3+:.73:3:3:5:3:5:C:J7><5:73703'5).'++++'$""$"$"  ~ywtrttmmad]ZZSXXSXEL9C7;02--&$!  }jrfZPB;1(yf_X99!yhaSK@64! } !!(%,,68D=P@UPK\Wjmhomtt{}   (2!9-9@GLUUakdrhr{w~  (#*//491D@GUG_Sa\fhot{{}       !&!$$&$---40;;4;4>;GCSQZZ_mfrfrktmwrww~y|y~|~ytyt|rrwkwfrirfmViNkGiE_JLLCJ;@;>2>-4$&!  }{{{r{ryyt{rtmmhhaaaZaS_P_UPPLIGLBS@L@D6@/1-&*#!  {mhdXXJG94( ymfSU84(}sneg^gKcH^HTHPFKDFFDFAFAAH?MFRRPYT^ccl^qcnvlsz%%/;4N;UG^afqt!!-74;BGXUdakrw{ (#61D=NPU_Uc_fmovy  -&>2NEVZ_krr$33AAOM[biw|pli]TQFAC73)ppZ_LJ;-(rrZaIL;6-& ~{t{pwhr]fX]QSLLE>4;-/+/&  v{{o{hojhocmcccchjfojmthqfhmjmqjvo{oty &(2299>>@EBNLSZShdfrmr{{~    # !&&&###!-&*#;(=6@9G@IGNZSfWjchjrcrvyy}}   $(!-++04->-@4G;L>EN>Q@NGLLQNSGJJGGJGCL;QCQ@J@>E2@07+7&0&$-($   &&-(+-+447@4C2C9@@EEJEQJSQNLXLXLXQ]NZNSSLSCQCJEL>L9C7>442(&((!!& {ot\jSZNL=G*=#( ~~ypwff]UQJLBE;77(2$-$ {{qyh{WqWfU\SNPN@K=B=;46*1,%,!    !%!*%,/,=(B#;46@;8I/N8KBK@N@SBPINUKNUIPKKKSKWNPSPNKKPKUSS\SfWc\cchcm^maommvjq} /4EBZ_rp!/=LNccyv --GLSdmw  )+.:7FATM[`gdllunzzz|zwpnlidl`dVYMJAC5:.5+++$ wtpkfa]_NX>C>-4$+! {{yroohfcW\NUPLIGG;G;9=19/64/4(/#&&(#! !     yrhdZUNB@24$+$ }{y}{{}&(22;>EELLNZX]Xfdkrw~~~twpmhf__dZaaaZaUXXNZGXNQNLGLBJB@E7;272//-----+++&(&!(&!    $-$4/77B>JENUQ_Zadfh{ry !#&-/=6GDLLPSN\\\aachjr}} $&229@JQSaarp|$ .$505>>CHCTFYM`Y[```gidplnsnuusuppup|wz|suszz|szspssgsdn]gQ[QOOCM:C5+0"  ypr_dLJ79$ vtoccWSBB//# ttdmZZLB>94((yh{fhZcSWPGNB=B=6=,6(,(*%  !/1@=KKWWjcvt}$!+9@ESUaatr *(6@LNaZjmr  !!(+-4+C+L7NCXJ]VZZdaffimkpm|mty~wtt~~|tykyiwipirakXiZZZJ]EXCQ>C9;0-( y{mr_fUSLBI9=/1&-  -6(1;6GGISSUa_frhy}y}o{coc_aLU@=9!# y{afNS@9-! y}jj\UNI8;#(xsgnTeWKR?D?=3='1""%     "%'%.,81A5DDKPK[[gqsz !/*@;SP^\mv} $$77LLU_fkyw!(6(=;DISUfZmctt} &$7+G;JGSV_]ipkt "'73><OTT]`ll|wu|pgg[[MFA.0 mt]XN@C+0! voh\\GI;/6* {y{wypwtmpphkh_d_Z_UXXNUJX@NEEJ>E;>27(/+(  }t{qotctamchham^mafcfafcac^camatctmt{t{} +---B2B>@LGQJXU_ddmtm{{{ #-*/;6@DDGPNSZWa\_j_mcormyorrv}{{}v}mvjmmco_j\f_WaNULNDL;L9;;*1#{wrfdSZ@G92-&!  !-44JEUSafkw{ ##1&D1I@WN_\_chhrjvo}t   !-++--07-;0C9CLEQLNXV]_fiprw~   """'0':7<ACHHMTO[Q][[``[`[`bYlTnYd]g]lTpTlYbd``]V[QOJFC5A.:'3$+$ "|tiaVJQ72&foIS16faJG++ ymfaKI81%}xslge^[^RRKFDD==:85?1=35::=5=58?1=51:83=5=D=M?HMKTPYWe[lgnqsv}x}%(,86=@IDZKa\^fmftqtt{ $$/2>@JQUdfpry*&4=DPZac{m +07>@JQ]Zfmr|      rta_VNNCE;;-+$yhracZNNBD964*(-&    #&!*/16;6@9G9G=BD9G=DDBIDIGNLLSGSLNUPSWSUUNWPPLPPLUIWIULWIWNPSNPLNGNGDI@GB@@=B=@9@;6@1D1=B4D/;1/61&96#1*--*(/#441#*&*&(#&(&###(#(#1(/-(9(6-6/9-@/D1B9G@;@D=NBPISUZZh\jhfvfvrryrv{tty}}yy{rrrfo_fWZSSLBG414(# ~ph_ZEG2/&}qf^NI@1/v}nsgg`cYcR^P[P[PTRRRPcH^TW^W^^ejgvv!%44@KK^^qt &+7;@@NL]Up_h &4&=/D=IPS_Wffjomvt$((20>>NNZZ_kkwp~ $')$5)3<.F:AHFHOMQVQ]T`Vd]bb``bb`iYi]biVsYnbidgidlblbp`d`bb[`[T`O]F[>MCF<A755$0 " ~wmaXQ;>(  tmaNS49!pmdUNE99&2  !+/+>2E;GBLLUQUX]d_dhdhkpryp{wy{{{yy{{rypwpwm~_tdhhad__ZUSUGLBB>9;/2/$2&      !$(/-;4@>EGNNUNXN]QXXX]Zk]kkpp{r~~yty~y{wt{ !#(4*64=BGLNaUjctmv &!++2+4->4>>>CECLC]GSXNZNVQZNZLZSXXSVQVSQZGVLSVSNQLLLJNEGCG;L>EC;J9G9E;C>>C9@4>749444+;&9->490;2@-C-@9;@4E9>77224+947;97C0G9C@EJJLLSNVSXSXXVXXVZXZ_]daffiifrfpkmmrprrmppfidk_pZf_ZZXQJN;J2;(0!!{hm\UL=6!# ~{h_SE4-qvha^KS;B/1#!  %%!%,/,=;BGBPP\UWa^mctjvq{{ &(&+&//24/99>B;JBGGLJLSLXUS_XaaZfZmZparprwr{ty~{{y /(;/DGNW_cvt !-0>@LXVi]|i~ttffX]GQ>@9+2(  t}htf\cZUZNZISBU@S@IN@P=L;I=@;4@/;149/611446;@;GDBN@PBGLBNBLBNBPGDSBUGSPSZS_WaWa_aa_fZjUhWa\_a_c\cWfhafZcWcUaWW_SZLNNLGDI;I;D6B/;444-4&*-/( ytw{tykyhrhpkmdkhht_kffdf]fZ_aZZdXfZdXf__famkwp~y{y{~~t{phmX]NJG>72-+! $+//;>BJQGZJaUd_kmpw{{ &6/6D9LGNNWZWcWh_fafcjhomoymtttvtvr{o{vtymyrtotttyottotrrrvttjyfrocvfrtj}o}vvy}!-&-7-C7GGLVQddktpww~iiaXVGN;C20&! ryjma\_LZDU;=46-*& ymt]__L_>X7E994-/&(!! yqovfvct\j\a\ZZZWU^NZPWSSSIW@W;^@SNPUUZNWK\KaS^\aahhmqt}t/4EE]Upp~{*!=-DBLPPZZhfrhryy}{}yyy}t{m{omjmoffhffaaaccaa\aa_fcccfaj\fZa_cchhmhcjcmamar_jjjvmyjyrt{yy $(+22$4;&27299;;>7;7>4>97442-((!&!{}yrohj\fUZUUDIB=@4B-=(//*  #&*&/!;9#4/*;B@*64(9#4!1!1#4(*-*&-&**&*!&!! ymymyaf]XXNJGB>>74-+!$&  $($/&-2/@/G;LJULXUaZfdfrdwkymtwp~m{wwt{~~yttrrrkpkfkXdUXSSSQJLL@B79927---+   $2!9/;>BBNN_]ph~w *#/D/PDS\\jmt!(&-2;7G>JGVQa_frm~y~~rrif__XSXGQ@E94400++$!  }vyommfj_hac\U_SSPIID@@6;*6(#wpph_SSJG>;/2&$! }{qf}jqohofocjhjhhjchZhWjUf^\f^ch^qaohoqvy{!!!&/+>4GEGSSXZUh_khmptwryt~~       !##!&&#&!***6-4--/-14/;/;/@*B(=/694B9==BD=IDL@IBGGBGI=PBG@D=D;I;B;=;;;;99;9=@6611--/(-(##&(!!!    &**/466G6SDZSfavhv  !(-042C7JGLSXV]_iipry~~t~tmtdiZ_QVEG;9;&-! v{hh\SSDD@/1# ~{{kf~affXfUQQEL@E9>474477727-2$+(& }}yvvjmfmZhS\USKPBN=D;B68;,41%1(,%(!#!!!%%,!@#B14=/@4D8GBKKWSh\mhym}y(&7GBQSamky*/;@NN\cfyt !(44ECJQXSiVpfryt~||rkfaZXXQLJC@;47;&2!&!   yh{fyfmahc__\ZUSGII@@B/@&1!!{{{k{dpkah]_]_U]XUZUUQXL]JZN]SZXUUXSZ_UaZadddmmwk{wy   &&!###&((!#-!1&**&1&4&4961=146/9469;9=6;=;@@@@D=G=NBLIIIIGLDID@GDGDDDBL@N@LGLGBB=9914--(#(&  yprmaa]SULJEG;74/4++&$!      ! $/!9!>+>;EBJEQGQQUX]]adhrpyy &*99LGW\atfv$(04;;GGQS]_afmw|y   $ "" $" '"   w~wrmpamSXSLLCC>79(-$ ymtacSSLI9@41/(#!wrrdmU_ULJ7@+-$ }tvmmhjacZZPNK=G6B16/1#*%    (,**81==DGSNcSmaojv{}$&24@JLh]wy-(;=LNZamt!$&++4-47-7020907402(-&(($($&($vrhh}frjcmZcW_UZPUPNGP=L9G1D1=496916/-&*(!# &--**1*9/@4@@G@DGILLLUPWPWWU\UfZhcfjmrtrvr}y}}} $$++222;;@@CGGQJXL]VX]]_ai]i_d_mLmQ_]Q_QXGLJ>G;C7@27-(&!}}rmaaPSD=;/1#& rwdhU]NNE@;7/+$ocvcffUZPPKI@I8@;,=(1(#(%     %#*1,=6=I@NISU^cjto{{} !(7/BBLXZhfm{-1;DGUZafoo  !&$;-C@ESQ_Xifrry~|yyyppffdZ]SVNCG979&- }yror\cUZNSNDN9@6/1*(& y{mwmhkadaaX]S]QXLNQGLLBJ@BE>>792/4$7&/(&+&(!($$!!!!$$-&$$!!$+$/+/4/94>7E>GBGGJEUGZQZ_a_pdwmyy  -!9/9==GDPIZNcUh_tc{mt}{tr{hvac\UWLU@N9B64/**#!!  ypydk_aXZSQNLGBE;B927/4$&  !((+/22;9BBENLSZXh_kmrt~y &9!11/44/B/G6BDILPIZSWZZ\h_rjtr{y{ $$409E>VEXVZ_ki|p~    ""$  " "yymf_ZQLC99(( voa\NP9@&/rw_dZLJ@94((! {yy{}y}}}{v{tttqvj{mvtoyoyh}h{mt}q}{{}y{}v{yy!&$(/22>7B@BGEJLUL]Sf]kaphrrwrw (/*64;@9GBDP@WLUUUa\fffomryry}{}v}o{ovrmrfrcm_fcWWUPNLDLBI@D9@9961/1(/&&##  !!!###-6&4*;1;6@;D6D;B@BDIIIUGIWIZSUZWZW_Zf_ffaffccf_h_f_acZfacZfZaZ\ZWWZWUZUUWIWDNBN@P9U;LB=G;D6@191414///--*&*!(!!#&&!#!&####(&!!(!*--#-/*4/4914946;D=@G@S@UGZN_W\hamjomvo}y}{yrja_ZWGL6=*/& twkaUQJ>>+2( }{{vtqqqomvfojjofjhmhmomyo{t}{}}!!!-&2/79>BGELGQSLZQ_Zaakdthwmyryr~ty{ww~rtwyy~{{{~~{~ !1&B6GLSahoy}0+>>JNX]dkrt~~ymmdXZNNGC@44-$ vorchaWSNBB6/1&( {wy~y~{ww~{y~{~~{{yt{wttmtpprfrdkfdhaf]aXZUJX>U>EE9G4B2;/7!;7-!          !!/&;2;;@BEJLLUSX]]f_mhyt~  !!&&(&&!*&&-&(--##!##  ~~~  ##!#*&#1&-*-&4(1*-*---11-/4/-/4*4--4/116*6-4*4*1--4/46-4446B*@4;9;499699@;@@@GGGLLLPUUU_\_fahcmhyjyo}v}  $!&+!(((+0(2-24+0--(4(2+&+&$$!!!  y{ohcZWSIP6B44(& ~yyrwhkdda]XXUNQJLGGGBGBEBBG@L;J>B;@4>4;77;97>9;>7J2J7J9Q@NGQLQQLXGZLXS]X]_]kffmfthyftrpyw{rpr{yyy{{~~{~wpkh~fwdhfa_ZZSULQGJ@E>9;7-4(-!$(   $--477G>QNX_apm{~&#/-;9DDLNZWahhtjryt}tvyovothvcohfccjWhUfWcZZ_\\_Zaf\c\hchffmcrhooorttv}{}rrchZ\PUIL=B;1;&/#!y~y~yyr~wrtmrprhpmmkpdrffkar_t_rhhrhppkrhthwmyr{mr~try~~{~tt~twtywrttt~mttwwrtrrrppptmmrmtkppptmwm~mk{wwy{w~ttw~~#((*61@=BLIWSa_mf{my $(-((0(402999>7E9C9G;E4E7;;99@2>0700+-&-!$!!  y{y{tvtrrmmhjmchZh\aZcW_U_S\\\Z_\chZhahffjjhmfrhroj}hj}t}{{}}{y{}y{}{}oytrmhjaaZ_USLIIB@66(1( {trfd]XXJG@9;(& {}ytvqqtqtmtmjtfohfjcjchchhchhmmmqqvt}}y !&(9-B@LUZdkmwy~ #&#*-14;9@@BGGBLBPLSUPUS_LfL_UW\S\UWZWZZ\U\W\\U\SWNPSGUGPLDLDIDDG@BD;BD9@6@@6B1B-@-;-=-9*61/9(=-991@1@=@=BDGGGIGNDUIZN\Uccacjmrottyv}}rtcj_\ZUPLDD@914(*(!& &&/(;/=1D6IDIPLPUUZZ\c\v\yhtytt{yrvjjmfjZhSfL\GPDB@961**!(  ~~{~~wp{tttrprmkmhh_h]hZdZaZZXUZLZNNQENJ>J7E2B/72/2-/!+$  !+-97EBSS_hfyt!#*66@DLS\_hjt}  !$!$&&(&+(0+2044092770;092>290;0;24909472449494797;2;47474790@0>092907492>7;9;>>>>@>>>>C9J9ECCJCJENGLJGNLJQGQNNSJSEVJQLNJSLQNNQSJQLJJJG@L9E7;474+0&!&tyfhWZPDD4-- ~mr]]XJEB/9(&! }{}}}{}y{{{{y !2(@4EBQLX]_hkry{ !*1(/;6;=9D@IDNISNPZP_Sa\\a__f_cc_fWhUcW\UWS\LUGUIPDLGIBB=9=14/*((#!#  #( !#!(&&#!!#    {t{tptkpkkhafdUfSaLUJQLLJGJGBEJ>N>SEGL@JJBSGUNUJ]L]XZd_fdmftpw !!*-64@4I@ILUUhZvam}$+$(4$>&>47@;G9J;JEGLEQJQGVGVGSNVLZL_QVVQQQLJJGG@G@J9@7;74409(7&2+!! vvtmramc\WUUNLDL=@6;16*(*# ~y{tpk__UXNL@E47/+$! ytycvZh^W\NSGNDID8D1=4/4*,(*,(#!!!!!%*,%(/*/144;6==GKGSKSZ\^hhvo}v(4-;@EGSNaXkhyy(&/49;BILWU_jcjorvv  !$+!+&+(0(2+907979>7;;7G7CC;J>J@J@GECG@CG>E>>>E7E;;@7490240--(+&(!(++! y{tyhmfacZ\WWPID@=664/*#! {twkmff_UaUSGL@E9999/9-2+&/2+!$$!!&--(-244;7@9EBLNNXUXaahhrm~y !(*/4;@@IGNPP\Uc\mhooyr}{{}yvyrtyj{jmjjfccWjScPZWPSISDPBN@IGBG;D=;;=;699/=*61/1(1(//!-#&*((! {yr{ar]__XSXQLQGB;;-;/((!&  $+/;;GNNZ]fpry!(4/L=\Pjcym  ++94;CNNXXd_kkrt~t|~|~twkpfia_]ZSXGSCJ>>;790--$$ y{rmhfZaSWLS@L4@/1(&! ~wttmmfdf]_QZLQ@E7;+4&-$  $-&-42>@BJJSQXXd]phtwty!-(*&/4-696B9D=GDDLDINIPLPPWP_P_W\c_c_f_fZh\m_hhaocfhfhhfjojhofrhmmhjjjhoftjoojjohhfhamchahaff_c\acUfS_PWPSNLIIIDBB;=9;664--&(!(!! &#//9==GPGWU\ccroy} !($(-0-7(>-;94E2G4G;G@EJ;N9L;J9J>G>G>L9E>C9C@9@2@0;4-9(7(--($&! {ttmhjZ\WLU@I@991*(!( ~pwhm]]ZSQQGJG2@&7!+ $&-449B;NLLZUdampt~ !&*/69DDISP_Wj_rjty}         {{y{rytoyfrjfo_jZfU\WWNWGWBLBDD6B/;4*1&-!#!!  ~w~wyrykwpmphmam_hd_k_fXdZd__a]_a_a_Za]a_f]ddaffdhpaphkkpprpwrpt #*&/-666D4I@IPIZL_ScUcZfjfrmortryvty{}{}}}{vy}yv{rytvmyfvmjtfoaj_c_WcWWSPLP@P;G6B464--(&!    {{yyw{ryrwprmppkpkkmkhpamddaa]aZaX_S_UXZSXSQUQSULXGXJULNQLSGS@SELGGGJGGEGE@N>GE7J7E;>>9E2B;9B2@7@;>B>E;JBBB>JEBS@QLQLXQSZ]XaXdadhdmphwkywyyy  &!*6/6;BGBPIZWa_fjtoy &+&0072@4E;N@QLQQZSZX]]__d_f_iiiimimpkrmmrmrkmimipfrdmamZkZ_iQaNXLSJJJ@@@2;02(-& {ytjhh__\NSGID=@461&4-# y~wwtwkthkmaf_dSaQSUENBL;J>>@2@/9+4(+-$+(!    $$(-2-7/@9BBGJJQUZZ_adrfwp{w{ %%!(!1#1-4/44;8B8BBBDI=NDIGPGPKNRKUN\N\PWWYRUPUUURYK\M\PYM\F^DYKMPIPKMMKKKBP:KD=A=A?A=?=:=:8=1?36=,=,31/3%6 /* %'# # %#    %%% , '*',*,*,,313351:1:1<0>57>077:<7<7C7E7A::::5A3A7>:E3>><A5<7:3757,5000..0,3).',)%'"%% " "              " )0")5';09999E9E@BL@PEKNIWK\R`\`e`igneunuyuy~|~{v{rtrkpkdi[bR[ITFFF;?;/6+)-")  }}}toovovotootomkofoimmoitktkyfypptmrptmym{tytwy{}{|~|xzvsvsosmjofobk_d]bYdRdW_Y]W[]N]PWWPWRRWRURRPRRLWJRRPUNWU[W^UiYg`k`kgritvr{ !.!.229@DFQFXVZachllup{yzxvztvqqmtkkidibd``d[bYbU[[Y`L]NWPUPLNLJLHLHNJLPLRNUNPNPLTNWLYLTNRTJ_JYTR[RWTT[PYTTVRVR[L[VPVNVKVKVNNTIRKGREKICKAI>EC>C><@3@/<616-81//++-"-"$    #%!+#+)'6%<':0>2::8>4@>>@@D@G@F@K>KBBKDDIBDMFDFBFBFBBB>B<<><4@-:1/1))+''##!#!!    #')++1)9/557=;;A;P5T=PJPTTVX^XdZdd`hdhljpwlrttv{xxtv~vz|x|tzxptprnngiigicgeg[eWaS[OUOOQCOAK<C<<A4:462606,4*4*.,$00$" "    &$""(, $& """&$"$$ $ "&     }}youkmeaaWYUMKCE;A15/')%    '!//55?9KCQSWYbchvj~t~ !)')//16/D/F:D@H>PDLJLJNNPTPVRZVVZTZZV[X[]]]Y]_[Y[[[W][U_WYYWW]S]Y[Y[WYY[Y_Wc[c[c]a[c]g_cceecial_p_jijjnjnnpprpxp|t|vv|yu|uswgscig^^`T_NZLRHHE?A9=19./(, & }{yy{yx{xzx}tppzxv~|~  !!'%!#!'%'#)#-%-'-')')%'%#)!)+%)#!#!#      ~zy|q~j|puqprlpjnlhhjhgigleggigekeggggggkkikngtetmtmxmyxvz{vx % $+)+6/946;9;B;KAJDMJOKQQVR[T][[c_ddajdfmfolltkxk}kozzzxx}~~p{ipff]_RXMKI=B3:*/!}qvefa\WQPBL;>6-0!(  !*#4*94>=DDLPRYWc^mctnzv       ##'/, ,',(//1/61;399>>B@GEJGJOITJVOTTV_V`Xi[jeenglojxiyss}osy{~|zzs}nwkskikci_a\ZXSXIUDKDCA?::733)-#)&  ""' ,'*,,/1244779<>:>A>AAC?I>KCFFFGGIFLGKLKNKNLLLOILNKOKQKSLOOLSITJVJSOQSNVOTNVOVQQVRWR\TVWTYZR^Q\Y^ZaZa^f\i]jZl\l]ldgigememijoilodtbohjlgjhhgegehebgbj_hbbb]b[^X]UZURNQHNCF@C;==464.0,(,#(  ~yxvnsdn^h[]XUUNRHN@M;G<BBDGGJMMRUP]RaUfYddfiofuqtuuwzz{|xpnjjb_[SSKHE>>58.-%% }}tynpjmbh\c[X[WWUQRQTLLKIKIHFICKEHJEKEKJKHQHPNPPQQTSWSY\Yb\d^jehjpmyn|y|      !    !!# ('$! """!!"!!"$!$'$'%$*!,!/21%*(*(**+'/%,+)),'/%.%1(+,),),&,(((&(&&%(%$$""$!|{yqxntlkogjheddcaa^]`Y`YZY\V\_XcVdYbb\ebbj_mfojrlrtp~t~~ #$*+2198@=CGGNOTUY]]c`jdnmqtuxy|}}}{{wvxssqomlhjhfae]a[]WRWPOLGMCK@D>>=<6:25.1*(("&   ~wtzrsnpej`g^`[[TZPWTNRKOLHLDL>K>G?;>=;>9<=:B:B@=E:CA?H=HAGCIDKGNKNORRTTW^Yc^fbjenkoquyw{z   ## $#$$'+'),)/1,10/5-6/505555<9=<>>ACAFBGGEOCOHLNNNPPPPTTUUYW^Z`]``\eYf^fc_g_kajegjghmhpkslqsqtrutvttyqytwyvyyuzs|syws{uxvv{q{owrvnvksmpkpgpgkdibfa^`Z`WZTYPSOPKKGFE>B:A1<-01'+$"!   !""&%(+-+1-554:7<A;?B?I?K@PAOJJOKOQMPSRSURWXWX\X][[^[`[`^]_a]d\c^aabaa^_^]^X^Z]X^W_W]YZYZXVXXTZQUUQQSLSNJPEOEJFGGDG@I<C><;;:::6555/7+51..,/,,*+*,#/!)#$%# #! !!    ~~z}wxtssmrkoijfkcjaeab^b\`[`W`U`U\XXYUZW]W[YXXZ\X_W_]^_^bbcdcheijkqotvt{v}~|~ ! (#+*.0051<2@7CADDHGKMNPTSYT^X__^e`gfkgjlnnpqtqvqwsvxuzv{{y~{|}}z{z{zy{xzvzwyxw|sxssuupwnwmoolomlngmeldjdhchbed`d^a]`Z][XYVWWXPXLUNSKOHLHJEHEDDF>C==<997334,2+++%%$""       "!  ! " $ %!'$'*%,#.&*+),*+.+/,/..0011.01/2/203/4/5-5+10*2*0,,-*-),)))'&'$&$$##"!!      "!$'$-$/(/..3/61767:9=:?=@@C?F>G@HBHFHFKGKILHMIOIPHSJLOHPILKKMHOFQGNILHLGJIHFHGEICJCEFBF@F>E?AA>A>=?:=;:=8<99;7:7796885:2957748487665565766839393856586678472719/6031102/1/0+0*-,+*+(+*(($'""       % %($'''+)-+/+1-2/2206055275677886:98;6=6<79;8;8;9<9<8<8<9:<;;::;8<8;;9;:::999979698795:3:959578384726215/4001.2//1-0/-1,..-,/,--*-*,)(+'()%)$$'!( %!#" #                             ! $$ "$!##$#&#&%%&&&&&'''&&'%)#*$('%(%&'($*%)$)%(%'%&%%%$%$$#$"$#$$$$$$$$$#"$"$#$#$"##"$#"& %!$"%"#$#%#$%"$"$""""""#""!#"" $"""""""" $"#"!#!!!!$$#"# !" ! !#!                                                 """!""!#"##$##$%#$$$&$&%%&$'%&'&'&%'&''&'''%)%('%'&&&%'%&%&$&$%#$#$!#!"!"!                                 hydrogen-1.0.0-rc1/data/drumkits/GMRockKit/drumkit.xml000066400000000000000000000756641366722712400226140ustar00rootroot00000000000000 GMRockKit Glen MacArthur / Sebastian Moors <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Sampled 5pc Pearl DX Series Drumkit.</p></body></html> GPL 0 Main 1 0 Kick 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 36 false VELOCITY -1 0 127 0 0 0 0 0 1 Kick-Softest.wav 0 0.202899 1 0 Kick-Soft.wav 0.202899 0.376812 1 0 Kick-Med.wav 0.369565 0.731884 1 0 Kick-Hard.wav 0.731884 0.865942 1 0 Kick-Hardest.wav 0.855072 1 1 0 1 Stick 0.99569 false 1 0.7 0 1 true false 1 0 0 0 1 1000 -1 -1 37 false VELOCITY -1 0 127 0 0 0 0 0 1 SideStick-Softest.wav 0 0.181159 1 0 SideStick-Soft.wav 0.188406 0.398551 1 0 SideStick-Med.wav 0.402174 0.597826 1 0 SideStick-Hard.wav 0.597826 0.782609 1 0 SideStick-Hardest.wav 0.768116 1 1 0 2 Snare 1.02155 false 1 0.7 0 1 true false 1 0 0 0 1 1000 -1 -1 38 false VELOCITY -1 0 127 0 0 0 0 0 1 Snare-Softest.wav 0 0.206522 1 0 Snare-Soft.wav 0.202899 0.380435 1 0 Snare-Med.wav 0.376812 0.572464 1 0 Snare-Hard.wav 0.568841 0.782609 1 0 Snare-Hardest.wav 0.782609 1 1 0 3 Hand Clap 1.02155 false 0.7 1 0 1 true false 1 0 0 0 1 1000 -1 -1 39 false VELOCITY -1 0 127 0 0 0 0 0 1 HandClap.wav 0 1 1 0 4 Snare Rimshot 1 false 1 0.7 0 1 true false 1 0 0 0 1 1000 -1 -1 40 false VELOCITY -1 0 127 0 0 0 0 0 1 SnareRimshot-Softest.wav 0 0.192029 1 0 SnareRimshot-Soft.wav 0.188406 0.387681 1 0 SnareRimshot-Med.wav 0.380435 0.597826 1 0 SnareRimshot-Hard.wav 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav 0.728261 1 1 0 5 Floor Tom 1.04741 false 0.44 1 0 1 true false 1 0 0 0 1 1000 -1 -1 41 false VELOCITY -1 0 127 0 0 0 0 0 1 TomFloor-Softest.wav 0 0.199275 1 0 TomFloor-Soft.wav 0.199275 0.391304 1 0 TomFloor-Med.wav 0.394928 0.608696 1 0 TomFloor-Hard.wav 0.608696 0.786232 1 0 TomFloor-Hardest.wav 0.786232 1 1 0 6 Hat Closed 0.685345 false 1 0.48 0 1 true false 1 0 0 0 1 1000 -1 -1 42 false VELOCITY -1 0 127 0 0 0 0 0 1 HatClosed-Softest.wav 0 0.173913 1 0 HatClosed-Soft.wav 0.173913 0.376812 1 0 HatClosed-Med.wav 0.373188 0.572464 1 0 HatClosed-Hard.wav 0.576087 0.786232 1 0 HatClosed-Hardest.wav 0.786232 1 1 0 7 Tom 2 1 false 0.76 1 0 1 true false 1 0 0 0 1 1000 -1 -1 43 false VELOCITY -1 0 127 0 0 0 0 0 1 Tom2-Softest.wav 0 0.177536 1 0 Tom2-Soft.wav 0.177536 0.376812 1 0 Tom2-Med.wav 0.373188 0.572464 1 0 Tom2-Hard.wav 0.576087 0.786232 1 0 Tom2-Hardest.wav 0.782609 1 1 0 8 Hat Pedal 0.685345 false 1 0.48 0 1 true false 1 0 0 0 1 1000 -1 -1 44 false VELOCITY -1 0 127 0 0 0 0 0 1 HatPedal-Softest.wav 0 0.206522 1 0 HatPedal-Soft.wav 0.210145 0.391304 1 0 HatPedal-Med.wav 0.384058 0.59058 1 0 HatPedal-Hard.wav 0.594203 0.793478 1 0 HatPedal-Hardest.wav 0.797101 1 1 0 9 Tom 1 1 false 1 0.8 0 1 true false 1 0 0 0 1 1000 -1 -1 45 false VELOCITY -1 0 127 0 0 0 0 0 1 Tom1-Softest.wav 0 0.202899 1 0 Tom1-Soft.wav 0.202899 0.398551 1 0 Tom1-Med.wav 0.394928 0.601449 1 0 Tom1-Hard.wav 0.605072 0.789855 1 0 Tom1-Hardest.wav 0.786232 1 1 0 10 Hat Open 0.698276 false 1 0.48 0 1 true false 1 0 0 0 1 1000 -1 -1 46 false VELOCITY -1 0 127 0 0 0 0 0 1 HatOpen-Softest.wav 0 0.202899 1 0 HatOpen-Soft.wav 0.202899 0.394928 1 0 HatOpen-Med.wav 0.398551 0.601449 1 0 HatOpen-Hard.wav 0.605072 0.793478 1 0 HatOpen-Hardest.wav 0.797101 1 1 0 11 Cowbell 0.568965 false 1 0.32 0 1 true false 1 0 0 0 1 1000 -1 -1 56 false VELOCITY -1 0 127 0 0 0 0 0 1 Cowbell-Softest.wav 0 0.199275 1 0 Cowbell-Soft.wav 0.184783 0.384058 1 0 Cowbell-Med.wav 0.384058 0.57971 1 0 Cowbell-Hard.wav 0.576087 0.778986 1 0 Cowbell-Hardest.wav 0.782609 1 1 0 12 Ride 0.633621 false 0.56 1 0 1 true false 1 0 0 0 1 1000 -1 -1 51 false VELOCITY -1 0 127 0 0 0 0 0 1 Ride-Softest.wav 0 0.195652 1 0 Ride-Soft.wav 0.195652 0.373188 1 0 Ride-Med.wav 0.376812 0.576087 1 0 Ride-Hard.wav 0.572464 0.775362 1 0 Ride-Hardest.wav 0.782609 1 1 0 13 Crash 0.517241 false 1 0.74 0 1 true false 1 0 0 0 1 1000 -1 -1 49 false VELOCITY -1 0 127 0 0 0 0 0 1 Crash-Softest.wav 0 0.195652 1 0 Crash-Soft.wav 0.199275 0.380435 1 0 Crash-Med.wav 0.384058 0.586957 1 0 Crash-Hard.wav 0.59058 0.782609 1 0 Crash-Hardest.wav 0.789855 1 1 0 14 Ride 2 1 false 0.5 1 0 0.6 true false 1 0 0 0 1 1000 -1 -1 59 false VELOCITY -1 0 127 0 0 0 0 0 1 24Ride-5.wav 0.8 1 1 0 24Ride-4.wav 0.6 0.8 1 0 24Ride-3.wav 0.4 0.6 1 0 24Ride-2.wav 0.2 0.4 1 0 24Ride-1.wav 0 0.2 1 0 15 Splash 0.543103 false 0.98 1 0 1 true false 1 0 0 0 1 1000 -1 -1 57 false VELOCITY -1 0 127 0 0 0 0 0 1 Splash-Softest.wav 0 0.195652 1 0 Splash-Soft.wav 0.195652 0.362319 1 0 Splash-Med.wav 0.362319 0.565217 1 0 Splash-Hard.wav 0.568841 0.753623 1 0 Splash-Hardest.wav 0.75 1 1 0 16 Hat Semi-Open 0.69 false 1 0.48 0 1 true false 1 0 0 0 1 1000 -1 -1 82 false VELOCITY -1 0 127 0 0 0 0 0 1 HatSemiOpen-Softest.wav 0 0.192029 1 0 HatSemiOpen-Soft.wav 0.188406 0.380435 1 0 HatSemiOpen-Med.wav 0.380435 0.583333 1 0 HatSemiOpen-Hard.wav 0.57971 0.789855 1 0 HatSemiOpen-Hardest.wav 0.782609 1 1 0 17 Bell 0.534828 false 0.56 1 0 1 true false 1 0 0 0 1 1000 -1 -1 81 false VELOCITY -1 0 127 0 0 0 0 0 1 Bell-Softest.wav 0 0.217391 1 0 Bell-Soft.wav 0.210145 0.402174 1 0 Bell-Med.wav 0.405797 0.605072 1 0 Bell-Hard.wav 0.605072 0.782609 1 0 Bell-Hardest.wav 0.786232 1 1 0 hydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/000077500000000000000000000000001366722712400217125ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Clap.flac000066400000000000000000000263011366722712400240210ustar00rootroot00000000000000fLaC"O @yIc ]ڔ? ]Z( reference libFLAC 1.1.1 20041001Y<|1m?h*gpfL&/¦6Ys2 [Sb:r5JFsMzSryM$.GxqԡZJh,92Ա }ON ~ǠUf{@ rDypT2'xjöIޜYR /P*(xI9M2yoAJX;}Q$HO7VUÒl.=جAe#o6| 6G U:K yJc$.j(|2{GOD/4DwsJ4 Oֹ ]I(MhɒDžVqOp_c!eF,MPX"YC(e Q J?Bk"cUMXi2ڤ5J­h|vU8ӥZԭ[GEEYkkBŒoIM#3i d7KJjdAms刋MzPN<5.lp: q0BOU:dʩ^t)EReA,B$Cʳ5Ey,Ǡu2̚1~ QXK6 TKqoψIAe :N&jUj{xJ&0e>Qj=Uԩ olc6|V))57s ҟc8r5XhX,BY K+1!9i?%u@Ы;1Y0LsWdŠ-YHJNb|SȬ^݋k *zw\ \d,U>_?b3,2)2Z9T/-R(jGԨ3޲x "ĬGp[f ɣ},WkyK\\:{- t8G܁Yr/ s ۈ :V@FUXwU6y^wf.",)B9[VjiF%zeѭ,;ʱP2K%A&"M GTW:LYPn:֐tmP´{]ZylZ8 !"$(š.IJԧ+ r"F+bx.bZih iP_'aAyɊdiJ?c)O CDXfm?i\.:(=V @DYJB%yWB:`*|d X1S =^ ǀwI97"F3]>нHY#kL*8^9ynax;(MDE%`p*/N7,#D9g, s01(ؙEݖ7 (.| Y\ZN'Z 9b  :)%UئĦ |@T;R* }`um'/WG35_bBN|LJ9 h;ԣ8$#d4a խqu-IǾHG ^w(H:PPۧ|^ch@ȶCK"=-FJ(pȝ7,1Cx{U8C;BCtG-K]/pƄ lk yD9Ue׋# a&G P{257UI"뒤)czE$'{awJ+eZ{p|pFEaV(h*:)ʢ꺚Jv BH!V1ZGvM'(f:hFnɚ#8fj bXWY9E4|@{5ջT$.gi3V !(j(#^ȶ\dug4uiWUh ,84;Rյ_W5CL/ɱKTEH42NAR5EQDQ%Mż4b*EșR^) )b}[[șJޤ3KV 2Qdsn~88^|IXTdv1ѷⰐ02lEQ .ǘ*;ƚNL " QT &'kW1HSi`SqQE10FQ1VdgU[=%Yɡhj4bJȲR$PhX K2Zl S3L~1e>qMQQ4 X!EUL,a Gq$Ҁٗ0ZHB[GS5Ya]$t/ ymVV< tʠl ‰A!VY}耭̈́-f[#L`5iVYE{]њi )BFB2s;s0ı+B=֣7,M|wZ*?3G1{_} w(N1F>+`ho2^`iQiag ͂2*lU-"B4K"#`CVaO48A5:8χrg/B`eabkLCP;Cy!4>#l&rNk /y 0B$^lm _QXAM:PsAަOrl^ ,؊p& `#Љl XD4q],@D"Sju&l" 7^#C*ƀhqt]B2 Y3!tơ]c=A}ɻQoF3y]#%\05P^e p?<> @4*'3VK%X 10&X !0 ٰu>h3Aꁀ -]nLZ4t쀄qFR!~r[@LWXI{MFY1qM74) RbRR2V,az*忇>=ώٴa:&J+-pO^5`ZԬ{6@D]lcE$2*6S nb*ReŗN B$I~ze1&xx \Q[}_=AxpѪ*Rw/Byѳ>~V2ÁϘPZd C>.Qn)QYbUI]}gG>xl՛H(VQ3+R|eol* ;8o WLp %V[]@)h}"DpfS[gXg0xK tA4~Tag[OIq)fWxE@` 59L.q\GIAל/ͽ}<*=`|z"jb3tJ"ki>mvW >"PMP x@ p<\P((( Me=H_2& ."|ٳ%ɺ% )h fk<UxH CaC'{=Γ \dR,rYkޥ`kX R r;)IR! B) R!B/_ÉB9poFU5 Rt g+Bi9*諼YK,:DDIw`h:!LJ NjmR'9w.PqPQ%3: :Ym@˯ ➜ y x  (R p8((w  0'qNp@P@Lp i T8 @ `(({r( u9_@ ( @r@0$HDdHp !@0 P8^9E82DDb hg$ WW(SB̯F! BID{߫_htB#"@r1O1Q\$P@&S8P `b(PDBP(R A= 8C 1@,0 @p  P( 0@0 PTy@R@@90 :4! !0C`+a@ A@ p   @`H"&'€ Є@ (@~C)( tBm$Gc9.'LGwrnXI:&$$'I,Idy'I$đ$Ix{O=&$'.0|UE?[j;qe<`K.rB&U5?bۗ(k=8h@PTPPVOݐZYk &E5y>h1aqBğaUrŻ|/2 &0&&\',HYgM& 8Uc]o5œ $)qZTcgΊ8MSתVصWŲgM >MSUڷ[3ó6t(tWffcCVY"dTA!Etbl0PHXhCd舉28Pa!`@='L?*08('/drQ/G-UK2ds0@X@PГ%)&L&0p`XXD=˲u,XhXPdST^,$(楯G;~ʌq(ݲč17Q !9brX!o,97*!0>DA;8Bᝑ=jл,|9;?H)|cRr e%P'Q,FtYeaFQ8qPZBH¢U1̤V5R"'ALIvne "“=ΑVDSӥ +),&e2efQ+DݘP؝T@WL!oڡZʆ*s#b|ۢ ¢!L(â[  Rb"q k"#I*)x܋vV#Y&K+bLq\[Ei]e.sWst]ʕ5֥Z>!RKIԙ+]&LF 2Ne1LZpe212d2MUe'jCae2ˈdbё S#ɈTa;#FŦLa: ՄYrj eL.˘OR ꪬ .URj$]&AMUI˪j.5V]&5eUUUUV]UYuUYuU#UV]UV]UYuUeUU9yX_kꪮꪫꪮuUUuUWUUu]UuUWUU]UUWU]UU]rꪫꪮꪮꪫꪮꪪꪮꪫꪮꪫꪮꪮꪮꪮDhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Cowbell.flac000066400000000000000000000275711366722712400245430ustar00rootroot00000000000000fLaC"_ @7B"4Jrw94dV( reference libFLAC 1.1.1 20041001Y'z@DdHI^"tTT:@'!%˅?ihr Ȏ Ilrb2_zF%9LHw#V:EXGߑ=$b9 ʈ 3o߶MHޓ=|B ޼rD.]pɢ*ӤP `0G_X Py1k&mWjB ܱ*aO%NB(*V̓G ;~hf!W"JQ9`dM[9hg HZ>p7N`25(e\@'g-7b&dNHI HZp[U prǯƌ8#V"J(fG.[>fT$7a92fϒSν\ve^WX6^ѫ,;hW ^jeiS(WH E. *C3Ҷ-ȉ:dC6M> !$"'zL&( :8lʅB H2ldvhuX@tZ Vk@Ahѫ֭X\Œ,^vm5bk% QF?Ir 6Q>U&O8|ENY2s5C($lh̼l 2:p˒=#?ieK6INE U҅|IEgYF ~ZoF @FE<\22xё#Nap]璬*>.|2&SjCD8Xw.@&4 &GI>IY\uP @ <6XɲNMK6O7c6qWxI]fVauȨU$ :mhDz >D`5Ziӯ$I[*&Zuh_ Q )R[/!:42 > 2X3Ih,2 ŌV,]VWMŕm_dh^ $`7aZ(Ȑm &'})< 2@#CL *H6`e.\u\RFbx#M̲m8|eB`nE.PZ\w\1͗x$em6Eqy2hQs) pbl0'2hf"*bS4]G]7UZu\AX P :XWq hުN|ymqx8IIY5T@w2ܟ` hRdil&hR"ͤ4/!9).ͬx'  LPᶪd.(SpO8"Auƚ]MR9DჅ"H07ʜ"pI]EHk*DivXD*h+̈́"X0s8Kp] ]}rxΒmQY6*MlBL:,ub]. ,-6Xb&Tζ,`fwDŜ4UWYWimʴY'.:0L.CP H 5[mԝeB D^l ˬ≲VbJl$Z]T]ם.PŊ Ie6ۤ]ya̬Il.<5D ѡ3-.덠Z eY"A&j6k:D"HbBOr0$iʒp$.>W2TB>(#\Y-Ҍ(˴%8EXPЋ% *OY_Uma$:í srd D"㯓 T2ň` .T5LQ=QUiB˾$Nz..H"0ҽL]IEXayl]YFQϐo}$["JEJ*D7Z}V]%(C4 U]emFTy$cɁs_,MJz_.I}]w]]Zy aaL-\Q>41 p){M,g(pq-s(.KAHaGq.%( +RTՒbR X<5%?K jkKZZJňQ$AdV\U$յ5% KK0KAC[R6Z2}HPǽm)Os<@pI,QBI-c0O CԽ.{ZRCi AKK330,8}-H,CiMIY(ϩVJk.cPDHF4QB5d6:cֲJ^Ky$CJ!k^0!-9F=iIe5H@`aoB9dNn.&${"2:К х&duGw7-ˎld$ )h[o> e8|*wgpM*Ȉ!M @P5JVbe5hWZx Q P,X _ɺm5c/@,DE>7I있GIK pp_ol DnZ'{H8FVEPtjnR)]* x6ݴȫ@8$4dNSz/7ѽfG|+,`^gǾ^Yβ!SH.21j~[ܙ&rc9hH4(0![@h1G-IRUy}9j@ 0n.\ %wVDwVMo$ *. T\$}eR u^DeufrBձۖK= rP9B.m( ((ԺUtM haY c8k9 ِÈ"}%Xe5q8.*&bݾBQ2L <p 0k]8T)R :>&ke-@\ QKKRTaKuN ]XMDN,4$qË@h0+)7uB)ŹŠBدCj>v1:/`pE"ʓogj*=qlNCĘ1hnŦ╤EyޅbT\ 'ͪ{i@'A%V"q\cы!8z7!aa1t@S$o.(FW\="V!Ty͈ɨ% !8`e[[Rz51;«`4`|YwT#U7SjG|EQ56CԀ~c!i'lݔ<&Xz=D\Ifi hM\ C=Qȩ&4Q E%M뛌h!E|1Vb\ij2-U!1WFbJԉrE=i2}WK٪J4H !jnoB+]wkbrsG !-B&uՒGzjxDC!S}_}D \HHL\bМM,[Z#h!Z:b gXδT7/*[(L_|Luţ>~ 3QRy_gշV]=Yb$HrqݺDZj3b*b.pC=kW&19j[9HG0d.BҳB! aLs)hQ˺v9/"E(a+NJ&uJa#9 T8H!FvS;tP؄Spв&G%dtHÅ ܭ+qVQCa)T 0%\\sG'̴EPN LdĠ80QlrnjE!u EKH+~'G@F `+`&4b'C.D4SytQN$l@$h8 ;BֈvT!LO 0m[=@b2YaɊaF92i.)byXP ǎy T$PÍ B\ 8 (ʓ$ Ŗȑ8KkUHVGȤ)<9"@1HK*TLjdp@ Ʉ*rL d55g'S < :G{9:L t:;XeJBԞ#;E2L9?*Za)@(=!1Tz=D*):0`1Lpϑ<^+}!D:r #q BTq/!rUtzaY \%ݼspp ZB$Q[g#|Ov))%q/G` |Ar:|GݼO$3 ŇMճs v3ĥ!S%09ZeF BwMEo!hga5Ub"xg'!H5nO$.b(p"!cmLM{yU 5nF:YӘthvQ:T#HTЂl:DJ׌|!Q(1XED S.XOM GI򢐤|:vs^ʖD`pz LVIn8K$йAi@߈8$B("÷Q"(1*crNaƽ,G'B rR0e7%R<ĝ9g ΑXZ)d$IrCH62|AB3:kDZG#G'G#srDޘVqGJ8":~j=קoc8$[o \O$QO"9ˮ<'# 5|8katV}b.8gY2 M2LTC3cExx((4j̛BK{fB_Z$eD AB6bFTNRSYe~TONeD,OLi/OO/r'O- O O?tOOK&ZOOO?O??O??OOXyA  jꪪꪪꪪhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Cymbal.flac000066400000000000000000000777701366722712400243710ustar00rootroot00000000000000fLaC" @E]WNܓOl&( reference libFLAC 1.1.1 20041001YP(TJ5"LT*U*ZZW+ fZj^,6[%_sZ`+XGi+h5,rpm׃ X$Of ~J$QFO&f%7P Ex])E`}limj-*Nf=VD'H$iF+d)!8VudȪQ"8ď|*ηrDA "O54Ba \EeIG}ClH.F m1SS=E&$YV8}{1d6qSWnK(0,Mjx-FBlĨ $ W(Ɓ+{LP%S#V{S=QkQAq1E p@Uй#֏` Eqj5MY+JS,:* `ldg'ĐmuJlLYE\m0xCd_oQE%?_#eyBICdUcit٩&>ņs8# d(=;hA`~GgXE`X#)TdR1q|uDUSqmL:․z1~HQ1\pڂW}2pHak/;K \eG4%HtOII4Q}f+jgHBxIf3sDkpK J pIO}2)K)JJ~Bdžl3ZܖVrhtXJ$cb 89C@辈AŞJ[#JXWDd] MD%<}l 6iR M+i߅q/Yv,֛)h][sOM KTeiKJ⁡);~i95<^ LNtgO]h]C#qY.Y%Y"\ZX\4R\ݝJUh@m~),k9L` փ1y71|`*}[z4j#:Υ/)2[/_,}-vϱ-*vCPэ5 7D3sb9F ljfA_:G`l43VO6%` X|_q _ z(,ض3F"lG]vR n"CM }݅%^/ξz7骢+AXw[r5Difu Gc(`-dq 27os+74&NV!m+NlQB0(H /݅H\S*X-2-ѯK6{KZ ̦i ,9\ֵF#tH:#bb#O-.Z?BLR]dNI/(򬊷cW #Zfk("ڄr /j85TS^?WDfPdBjڮ%NѺ㋻EdVL ΩG. 6CR{$$_>W- AnۚU@#)Z9$ uA%dn9{7f.t< c[. :u&A | ӵ# ˒ϒxS5Y;w1) +ۉ9W),]+DDˆ1.P>K"41k:3cլBf]<,FuGK.X$@Lohełt d 3)KPeK%Au+)3$D"Ln&ѝZEgi\x zQ:T2ߌjuOT.)xűJhX$ NVk䦩r 4dK/sI z.H 4!It;QiCs=bAL3J7~dU 2A.ccXP3P4' C#LBtkIO%żѷj WeFiN ~RW *ʦT˝XT"vuY},5`CWSQS }ec+޳?nY"iL.42Tf֠mRT<ɧj걦"r(7LeL.H$N}aL^ ˫Ad0&RfdAv][<~ܖU fNYglrBWkw!mj2uLZB B$D<}?aT_$^։FMCǹE de{өSia.`'`\YDDShpoJmrdFjbյYhC~ЭmRAs&̓ub35NkX_HmeO $fxQ6:`#4Km8wNv&,BpVD3cvcD$@D0&%FNlpCK^xZ?؝4yHFF]_*q$m#&ră-٭RrVaLŷ-fؙUim<)Zy?5.hGWl¥4YlA@>.Kם6oŸYC;+I~h/^dUUcKㆄ@:+{K\dAJd~%OGt⒧?Sv8$Xk)`A钭Aߕ* QT=C#] `;GwN6 !,E!APR-pT*G1dPc<.A( dkw12`"h 8C;U"UjF4%?1(2 ;a1S%lJ'`*CXHq}qyp/ r=o=}aDZDWdR=EܖB`~AD<$C SuXN('jVUM%ǗP Fìȁ@ >"#:F `Q; SY,t<(P៣tPRR;%PW.#DWMG+aXTHI=0 :AC9Ád6!`eNb\E0ةhWsT oP|m)7 rZ#Fy(:9<`ɹg1<Y73?t«FhK'ڌo _1.|lSb `P3.$Q1?ժq|" Rh?I$rAhT(IMm}ŊUgv#ֆ`Z @s)4Vm!Q${AmũٲgR6#px&2BN?PG 3c}rRyg!n``k b0Hȭ6N0?un&-=΅N/r@Y;^8أdoWK s(Li$@9..L4b\hV!€bWm[F$ۥ %l-91CDCƼ` <$)mc:cW8jݒI,ќ+V$Q ^¥"a!>,E0E؈(-6CND[{Q\giNOi/ `q=L% BMh`} C:. %T!R/DV5Jܹ4%cr.^ N/E] @PM51 =. f3qY=iĿ8f T6PMU񙏏ЬlaVcvj4g$#x>.iaptj ᜋŹNTlkZMRT0Q$%Y+3, )a? ocBH5h35bA\d-堬!L`H$H#8V^GZMΧH%0^+7Q3ea|#L,E=+G&IKit Ahd e" B/n8T0z"!ɔjR^ k>GWȺپ I w |ʪ^Ps]J,=d S0!fTLRفnҾP6(qT6zU.J97*XA]%hN>m#g]%Yc~~kXwE%l}ֈȱ"pJq]8Q-#`G$QN5"8O-]xiyh!K'CHX5m6*jP*Y VQM,U;¥?kX U-dZJJfꡐ\$<$b28F _] 6 > [ !(F"~Zt. -:5IhTMb*VG_ }/ʬ=nB=$"v]Pl!>չ >}`0ƕ68FX{^ z!*MayJxXQUz] fD*\" T.&:j%Jҹ!8Fp7X~˻IhmƘS6 zqiq]q۞V J~6yȦ!efS":$Kt#s#H҂Lh3e5"ɰS . nݜGqUn}:*G&  ޿##칗 bE9NtaJD'fh]vҿOutaH{VD}HBjg-49\2{4LY^y8bAmW~+٣T҆!W5'Va Q08P' SF)30~9\iMF/&V._dcX012YB}nr LFttHW-|߽ m hy4LZx IRX, ؼnF c-Vq uYQo~XaGX'5R1툒Hk ·0NHԺV{W6{&. Ge;*!y[Av!MY EP̕P\Y9\:YfC_grRDSdY@^MkzpR~|nC]vNR[}U֌ҟi Yl13q-k߈ћapHDEJ-,Y*\i o_iH[a`=I[2 uL =z0e'N9ZF9+R!" &ZلC(R(a"mbG'.pVst^//0M(, -O)iu(H( qry퓂0 $x\0 p =0r1*YO52a2HX7ὢH'fHjwӴg6o@x5.كpy 2At!Sx\xe!,1DH"Ә`.@tx0NpѺGJΕ]x^cCf yz yk#8^.:-D x G&͡q/ VXS:墛航E?P(3QؐN=}22fK@9fC I%Pb_| )tާ@;"YYzJ6XLMb&aT(A:;͓[New!4hp2֚v a@(e"~@]EVDDl)mJg 13wXPF`SH:ēciVlwu;%_1d.BkX!K1@PvwAT:(4)i^nϷIbri$55N2ت}EX D bS"GaÀ(;LeTahmggR-DNjOZ$?ol=G8s&EYq,d; <AoY7 42]ᅙWͧ'^[U~^,a SxP quy%PMBp(0Ց`3\Rag4cv # 9߮Q `=An Z3ʠu(Ch8yBWD4BEbELHهjHLlQDHhk4q0&Tew1NS|#i#7-Xij:δu%v%~><" POs<.:"A9E GD (5aU$1f4${ qUS@f՚u& "X-(p5h)&T U!,j"?D#נ`SBRq}ܿ&ۮ#*vGaOLHaA$4p"WPZ襝O,mNWuBqFoZf1cQtbcQ9 -M" htFxpq+Sp@+0Tk-p؄j ΪڧT-F0I6<ɒ}`fʁx_z[A>Q,HaRQ}!U c.wde$,yl4?C}bDUH=m;v.QF$$D}ɈP2Jx,Q>gu90CȈ J&|4{QΰƈiW"hyKˇkc#Co1m2Ut>!MrZf '+"MFց8"!ݙY*D^ƒޞOEXxy@[(;b-QUVA &h\n鞍 qf-}h4>˃-P&6ef2B_^`72u6łh; H+GGKU1M@R:O=Q I :m*zIe):.C`jc@KR9Хe=Ld)$t̺zzV'f&4n8nB 3`/Q|d\HȨ=$ů|L Y ١PT4uw`D4G*yp) `yAϾc Ӭ%EcZ5Oή[l!QL X؛NK cr$uPIkAm#@UvF}&VMK( +o'< ;&FaT%#RLf`/ 7HxZ 1r2ĝ`{u|n3VRSpY /zxc=q8 `2ÄK9$${S)dnBh`<.L{3ˢ^^!!.lc"4zQ0/x[⭓J<aT)ӵYR|T4V ?\kKiδp^U({b=8qj+lG-bIT>7"k#ʋ+NB)FG8)@_R:ӠɎnv9Mx.{H4lIkxLOTf:$G~Y8JW:=QHI#ixۢ ,ȐķGpgDf`k@eBu`OPѢ'D2[iBq:P@G֣s-RD-0)R~=[H#4) /!'nq"ZwegbfOFv $QB#cdL䖇J:ݙI U|G;lĄz2L^U B(Du YN¨Z&K-hA"^j1ilzj9ٙґ\zx9@BfRbkXOObZift'0mgdލPbڂ19eH)_՟3-91uQ=YgtkD\I#țVdshq~ci(R6HQ'[sPȵ@/EތS7Bl48KU+& O$ 2$O3] ゥi\o.Iϔ̴}M Xe m]CfC*xsA 9+r"6vӫJs?.1eJE,Aə4 Xޚ1EkeDDW<; AqYG4pK~JK1S1s#f OZm)$2O:aIЕW\8dŻF>NJn2+07;XO&NJBһ[3S:S !}Y2Lp5ص&+vA o`^shyi]%X"(Vz!YG@vk (j+,k(D+h,!H,#6YWĥ bLB34u$/9m5uw-e*O&j?ĭ=Bu#-XKJ^J#lR$^UVelUVl}C4e"H_841F0R2_w/aUyzHR\[r{rݚ[iUYZghB BQŠ캿JLkXD[m TIm Y7+TDZlwu{4q𓊀w+?ala 6Ea]Yu$䫓֣α`pgRʱarRR(1uO&șVݽ[ѷ%NV.%5mD3Rv PXfb!a02b9ԁ8ǂn2S[粶- ژʎJPW!,yMgetj{&RzTWֵEtdnHGdL_}gOa :p^SLqrmaV⩯@(YU&_C.2*z.ZWF!QdգDDN`KQ$'r@bݶ wjLz4YPYD%shqPT}D- qI+@mNg /7 4l1"F -nw4 eB{sq/*7lY6kCl}脌( ?wIJQ x1Y3Ѝ,À;߷F7pb 6e$rd358eEw7 _@X{}4,لB}Y !i8/ !ߐ`9E+"w~Z#i\(l ϟ= [GqεA*0Ѫs};7,P1A ( Om j@RаQ{+F|##6,ӉQdD(륡<`,&Cu3 ÆrʥEh!?3Q>T4xf#ZrcLK8@m&Q F?Wnm L  .DAGTcc!WM;ǁ@;[lQ{ʙɗAT9q@f0OAT#/CJ f1PpkEG9Rn^if.M23R=f- H" ec* nBSHH1vȰҤ>84, eh0Af7 Ax &ypf*7 /֊61;}t֡g.*,k*E8X+u2WDPp9vZ.s('w[H/^ԿeY5,F L@N! D ջGKO]01Iro.m@ϯ6(8 ,T'l WR3׵ HR05O]^ԻiS(O،d?5GFĠP C)<~%KL'!o#h#11\҉[gRpKex<W0`β< !dWL~V8\.zU )_p C0$ W(72ۼ,^Lo>K+d2LB,\cn$xx XoJ}1Ze CGOFm[MXIwԣ4)^ @xG-V+q< a$'kq!5"&H RJ[ fl_!]"H .m(Q|*!Kxa玵*@{MH*"5܆#SX-|t;ȉ%ւ+9dg\RR@xT!=Y9BQnќ#CF, @07VcC-ưNġ#OD# 8ػ $@~u=(?b$ln>4dN -G<B!~. - ñepi*vWWP$ tkSlJA厸#oh +\*.eӰ' h~z3Od̉Ee@3+Jzڰ#>쩫غ5RO;$JiM@+`ZviotU1>gHjƋ, mFㅤh˅%l s*3 _Re歫,4DʞFv H ͗7-> Aj|d"FPFrJ>Z\! mpOӠFz?XYQP%X;o͗2.2 HӃ"w5X#E% "V9Ot8)v-+YN8e +ƐGmDj'*s6O|*$oTF+*•bAk Ǥ DѻNj筒TR,n& <r%ӚoFB6yg+Snn7Ԏԡ ;rv Q ΄+1jnJӼ˫Qd٪?Re+)Dށߔ凥3o^C(PIǬD3\NTlۊ~~2NyYCR!P@#2(5XĐB0KRZ&UKC׍dD\&0GUH9wZ 9A("}}x;ѓ3xQU>ZϾ]͂3ewkUKX'?ܩGF pQ}lrԡ CY'ã|zN4씡֐K,Gm@EWL1t5E*MlyE;cM&X,JѐLF\Ԧ}l)E!{*mu?-ɍ[ԹvVev$ZU+Ы3<mpD٩@e7D3$GFP,=v~H H3 ʝjT9)"0Jo B1ڈW\mᗘ(bEZyշ\ԨVc!J #d8wxQəN!8DمCgFō* 땥Xر{H~)E16Q}jzKpN~׿^$ u`=[hf~be|;\N|G Rѷu!x#@fNF ԭhBfI6\õgREO H "]H?NݻxVgbZt9Kvc6IHU$cQ`WJVD Y 11)%eΙBjځ{ UƸJHMag92 1.٠BM Ha~T<ٱdW5c}~t=Jq-ok"D !"GK)YҁއZ9s'Ή9pum $ jLUHUz UىMߦդƨ3(Ų u;+rݤjǯx0f 2gdժDL /b3+[9n#P֦G 1,^:uŠy2Ubؿa-'Il j/eTm9=Góމ0͝ck:Մɂ8(n.@%.b(ЋDb I0TqXn TeR"hBTd4 X>feB n#J љ+it`\Ǫ}f ,w깄!7>M8nO*=Hl~yS!yp0 $5za}XQ+ ζxVPTMqy}hOxRV([:uy#rC(J UVcz8ph!jkQ $lB߳+H؟%rp M@'^.#mK|Muqx'(fʂ7N@GeS?d)B P#.Q7d>qaOfLR lFY ܊-PK}pq0HKСBfGBԃ&  "3nB*ؕ_qKʝPr?>8Hd޵Qw}ҁhnc.T(r$`N;p~5^@}XɺY ^( Ť0~i6s ,YBbQP+XȌݙD'9! Q& RCcD8 ZG\&/>v{zI8Qpܩ($MOY[dQDYm'}E5F]E8PYJ]oGV Ht/"Y4r ҡ0eLDS @PZqOak_+NM.g{04sV*h9  j.lJl! .ǿdl\΅SF$`K>^]`tdžeaz[֍Wɵ đH)z"tl _;HU7?t*bFҿ N-hmʡi&l"5<.܋"ZfN R+}pS2WQ&=G]<np4|~vSCy-&~gxK"6%ɼ$"(F@zSb Ӣ,oe{ji=,r؂L&j EDi8#^&AI^骭m Q')p7Ia3%pΓ"?HC-$nyhEuWTYeE샲E7|c Iz9C@I<8EjK$IT!?AÒ SI1Щ2ZpI]W W/8SY%[7l3'CK_9\er\HƲu1pDDӔEPfqkY[#)hfn íЧS(6Ee<0[mGdVa4:m,FH2*q=ēeT_ P "z,4Y2tױ8Ikkjz9~MH~*[Rjʲ0gy-KjϱIYXתyҊ3@_Wni軾 `-B+r!PHFoYAtXI$c9RDE9 -{<%9~Ela~4ZWih 4˞P8>)}>r"`DR@(y,*(Kl]ߝ6̱h)[ p>le8E2mq޲Itek,nj88$/20`ey~yHvP 5 !`L.P@PtG[酁%mI*KBi~>C]pǙt| YΔ;VIvѥ[vz0 Ϧ)y|# XTNR.B+Zw`A}3m(&D2 ZWʬa!SS"{8ϪFb#d=Iߩ]#RSjQ'1H8Ў Vi _L%u#%QS~)U a6HJ9 !A7TM5mADe$X[Xa[ jb@ȀTAQ:P &K8EERX-FUK5^(7 |{̩ jC DG-o=Q!Ӆ!Qެd"EzŔ2`=c‘/ESDZkʗ^NdP#FK%$:﫤WB'N4 2>m SM V#4HϏ4?9߆3ķ [궲Km;r(r} 9TN~,aL;JsH8sXYJ*[m>D|Hqpfbw O3R6qD'&0Y43N؋Y%{F5joe=Ң`$Dt\2 KZV nΡ!Cjˢ ] wߐqjTVBzm8B!)jGdyMRRDL,2*L\L\cKX3^\B4#~hJ1E H%Vړ7Hsi[%T$A6ն$ȄZ&" '"V\J Z5e BA O{b8:6hiLWc'}#(b9D,t1 ]J*:>dgr4?A8ߧnS5ĭMG+jwv2 jageI:r:ZH7:Q DH{=59Rqkwm ';֑Yt)ֽmjg$-jqcnъ"X/l%8v{]kRpc*GǭjFLjAu3d! _SeAv/5Ye p7zhWC?1M GEXP$uĚ~-+KBWVqM\@ȚlcDd(00 z 4d*gb%U>w6hX4 usKꮭFKQ}KpV\& Mi MP-EDT!HA.A`icEbMvgUS֝D8Qn($JA,9GFo#ND6( k ,<8w$Mw*SYّ'0<30N7g#EJUMΰTp'40|@X J"bXfEA'"Ebz]~Ӕ psdЄ)ބףDwO8e~(Skq},FRעtGIJhœɖLW:`)zk Ug^z h  AhF |C)R "H-y,.dpj1{FNOfEWwt젤IqnX4Cg*Zȋ\UUѐˍ>`Y#Pƒ3Zntj5i)GCT@HcɕђtaMͥfa2^ 7A'FDmDlMH8D 3.a Mb1]6"Du ^02Cfh6#5ȅ!P0&;7֢iDL oF^dآDr&#>m$MZC4EU2 b (Ϥ J7MmͦBteQķ&ڦm6&fon| ')P#R!J%&M6Fe5Jvl!!:DВ2DmDlHN0Z!<umY"$Imh$inȒ!T茖D3T04n"Zy#4JY.6"VNzIXĊ8ƭzBfhMD̍E GkiTmJmOL\Q #6m#V6H#;T*#."X6D Ԗ /(x1635MMm5LMLO1-d6P&mb!="F?grUAf팸im"ThM9Eʉ 4m$Ԃ%mթT=fbJmRmN/"dDIPRY. jUZ#!D1GL `&r'Q=8FENG)"6Ob|@CNN'ʀc@)z( q2Xz'UUUUlJ(c A0c! TꨜOb*q1!2 4 (UUr*{8 Q@Qz@8ƨhEF@ uAvܪ]KtA (ib&rQ:Qz'%tNUSe=XplD|ܪ|S)蛂l F24)7)ꪪ'Kp qQM4S'UTTA ʨD 0DQ NF6!L)cQDp(uURf c`D:#'UuUUG)S!4a:*|\)bz3 + rWUudS!Bz'DyD1(=UUU\WitpS"ȠXETUUUUQG*Sb#`)BD:nB"3\ CQ@ CUU.  aCF6 ԉUUPTb/BcdDuQ:)AG2+uQ-Qei%򪪪YC1:UQO02!d CFN1J L& |!G@ c DaY5? `PB fp F4<" 4@> ^HDh!$a "! @!e D&3a )L? BH`"T Dg&HB"#1PO͆?Y+( DD!tYR%dx`0B gE PQD#jýBl." DHtB_Noi! ǧsYͨCM8Gc'REBR_$Q!&ن!b02$DRdDJSႄ )` ` /IL~#H,zfe1V@P $Di5?b 0pC"|f0dž0 # a!ɪ5!:,5>_#ሆ _8q11ì%#0c)*?#Y5e&G9ItPI_1sM2^ r3Rc%/C\hji(-2Rc<*&o|v?+B?"IRTR"Y)e # IZoMNyޟ+?H<ݟyN*o/*{dQ 6ϲVJ3^<<?/fj/V}7f_o\*rrw7ʓoʝN^^_TϿ/5%g/S/__l5%w7 7͗//o6_/lo//oy_sl7;7g//o/_=?7/7y D(jUUUUUUUUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUURꪪuUUUUUUUUUUUUUUUUUUUUUU.]UUUUUUUUUUWUUUUUUUUUUUUUUUUUUUuUUUUUUUUUUUUUUUUUU]UUUUUTꪪꪪꪪꪪꪪꪪꪪꪪhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Hat_Closed.flac000066400000000000000000000224011366722712400251440ustar00rootroot00000000000000fLaC" @j>mBeA( reference libFLAC 1.1.1 20041001yiN !-8CNE{举#(ځ)1$! (lJ +P##MTb ' &֫ 8G0h@j;n'@_+ DV@$p$P!@v`zӀ {. P\,ƪZBS-@H|&V H`_$+ BH>^c/hKxC!^4?r a H<)j2(2(W+O]}>m5lba")41WV4YP^$,I@|tLV# ؎:78Q~V1᧙߬)?nA:Xf1Kf^Xy 8+ a:/ y b4:dLv;EP)p:0mt4; Ib m9V h˚щ`;GZˀ+tX!âAj7)D': ZOI]9iK1䦝T[X> | f]iIڅ8~&@HHEj"> h=кBц6{-0xi7IX"lErKI>96{#$dtP|A 8kt𐏂 0A'IR%ȨQ0Β7)<å^a >fUޠB&66>.Y-w}Q,A?1}z]x;LzC|)X Eb".4WdY( 91QokIn!cY%EŬ!1Tq 314ۛ"]HP+1Y(Bcv`1,fhd*#=V@"df^z(}Ml~јh3o^|r@ ZŸggͼZFZF*Pᴮ7S%lv?rc G_i5+̖V1M =dQn~C<]vS &U ;=o3&NqiDgB#0Ș!m:fDzSI[堍eH<5*㾬i,ӗVsl5a[˒wIk5iȭ QIHA%='$NXRx~ݿD)VRWۙlokCLKr~)%.LLfzXLQrr \wfꖦ-T~inGNκf]E@řjEO.f Ͳe$i{ٕ]X4*)͝ [Y4OJ$ȊMn]#KeMmqI;c4:j qQf 2>+k_2uUD;S2:q:MV~R:cx`U1/ۿ%WEf*dT8=rh~dq f]QMU6 %)_UڔukM@H6,.}1ʫz3 /w'MNlV?A^b<{B)^;@jh/(b,+ 2hRU [ma@WdCquXSA8KuxNQ5YVGGSԵFU]DHVT$9IQ9`TW c$YV@USPe#bSnSdqKgTzUG-US͝nY]F$ZIm%AP!QVa%OSVmBLv]X]X$TXu_EэY^dG7GXy]WbFGIDFDot4DuA75d_TYG7:VW֑ U P$1p\$l fY3E%ZST) FI;W-XbV=0RV9SSD ZI,he^JT5WYU)WHխInDK+NVm^֔XN/Uu|KeWYUfKKѶ_SS`UZakSRձcQjYTW]X6U.PT$}`AVehV5ZLUUAZT/VE=RSqWYSM\L&9ML-CLVeybZ$Um^u#XVPquF^ZEM_DV>V[PuR\R}]\TYWutNEe7RZW4MNVV3^UIP%];[QinPW%P^mMV}$TW%OEGVWYTe8TD\SyXVt5XMM1BY[W5q.^2]ԤZ]YYօEXX%UhR֥:ZeUTAMXSGYJO^VuHMUIgV-XTZ%)WQ%WT^[V1aNTeqKP`LLRԕ%OYum6YmLReM[ZT5!JVQXd?YIRՄZ[=^OԵabQA^N%O5 ARe:PGP%AP$BQ :O DQ=OT$9OS?Q5ن#

mp dKv3$z7e~H(iZ5Tǒ] =*GcjtΣe%ע QD1 o+dJ.dmSl ur%VֿrơZ|J!70ej hTܣe(KŨS- vVYFiw;꺦ys: }HhcF8TQo,m݊ dXL4:+lY\}*1diRnSSU49[$#zSgO {Sl'3ł2|ֈ=ÅgOX.>}O|~3tՀjܚW^QO֣qC6EUTW.q^Ɂi{Nc݀d*RbK9݊БdxM"2)Y8[;H~h.B[f<$gBOaC*"X_NS@tQd-ٜP(ТBtaʟ!Wu5)}˂$Zt2f-'3@U;b+b#雴dL(pvd=?niɝ9怢](ҝJ,᳢T/ $Oz֦,X WEL,R%^!`'dqc4/b#<p3^0 1qM: CVݥY樵 -r ( z1xHHAQr%Gn#PA?O*2X z0;&N 8B[qI DRy!NG2%ϖ'Ls*>0:^S-6by*> Zԑ$>XDc`v!ƭc(KVf?̏8m)^N9䤽Y<-$C/sWޠ jq-ÁFXB;aj!{^g,^m -iDƮ/3)%;r##YdffXC-Hr"ƾQ%zgP`c>̨ۘfW=a(_PjM=TGk!ژ}ᚃ3D= @"K'wRz5%},h@' 0u>?plQꗂ.`h:4& AE: N%K7Q!K 5W*k $"zU-Bp?u©:ZB:e(Ks%2]v%p1p \.@<>"a )[ZK+gU8Wt(@bMX<42`@x% "Z,=FƓ ǩZHqJ+AdVsЯG[t(R\QGZGAA61FfHQ,B8mX8R1Ttn7~i}we*E7v[^hke*X3WW)*UD8so Qm ƍUUJq*GKC!܋lQנ(V5J1+ xB??Bzti a >UV.ThQ"ɑSϹyN2󒥲a钢BO<(;eTE,@(d0f.%qs-KM-~iﻊRA+!%TnWϧjBvj_$Ymx6|jA#:潌1nt8\ ^ `ȴlCᐬT?*[%$|"Ma tJHXt(:WF!=gNcIB֓Ɔo4k15c#϶+[6FYĭbRúOnCY)^h,S'% ) l}K9'ȉEI @=#U}+$~)JzPY6BzJ9p!L;Q%=%;U+Ke6~Xe%.,u UEZ4A(NA΃@]߬ 冪(9FBǤ`rQSXt A Ez2ǠJ%5>H YWRnuKM 5A$x)3`+r/0⑑03ىKԿ^8VL-=he!_}ݜFB@(il3c fa:,3?BN0hyDA'%3@6f @--.GgרUL,h+R@I'Oxi䯒ܶF۞\j]zDIJ.tSm͓~!(,DyUg, (G`5A4Bv6}.89t"擽֗&Y,2XYm?%(L39PkD15tܛb-Va.ʦFL;\ivFw_a*lu$HHKEýF!x=XODm. 396TH ]t1TB%Re,TE57Ylf6:`*w͚fZ43JYYsB#|:h&Gf *B'`FuromGL.0Z !IZ8$;uLDKvD2$p.S;x6{QXyB[k(Y)Lԧ qڮ4rUHh`-Qx 3޲~ۄtzTjO@iTC%/<-@Z5 h:4fΛ@jZgSȁU!,Oŗaz;J0$A(h`DCT^/fL[{{S]`mm>Yd6Sj5"@:? J{P O)`ͻqMDZIR9+Gh*G=&9B!lDx?…{Q^jȀp S nTf*dfxt[ֳKe%g=$[N, `zl.^. Y ,DٝR6gh^ ?VuA4ie.Ņ0֢c>D %T*P7#bQ\*0GHZ}%CTEQ,Fkq3ljr58F\TU _ˮBj@yd6FV)$S W&N 'ȗ+Mf`:Gd44J8/ǔRjPC3IZO;}5 NFPwXҚɾa+\ܝq0d^- Q'*B!1>`fsjX EG0D\A. k?{Phlk0Ѐ#Y;NajRZTmxۡMк:x]UOu||2T`Hb2Kťac ^I ˆfwm Yb,\~!x,Qnƫr`+Vᯉn-J]L'"Vuq`DZN~^E8Bq.E3YI N.)ԪWaIn !&'3& *lvt4]u"&Vbg p^+̀Enr4{ dg;hw Zql,?eTqrl෱2SXg4N L3&0Rx H1.xMC t'#gm!(v`Y hBNu.$F "+I1]r)CvDoL~ ^9lIXUP_% +@ sJkDOT7H=)BJ2tR. eMUeac>q".';1_͕nwBiθ2Gn`e oiB0{r;otp n| +$t+n:Wv96Oq Yo\~Pj Zk$Qb #.$kBG=ҸO`Ƣ"Ц$@&r*NXh!cGystDaaZ,#NDy C)e9?N lM% I*v ?%#s&CNj v7b%" np"\& 4q“%_%T@_DܚS#% DN1spR) RVU:u:ح-r `_d%K Y݊?ț)tQ NH*d\Ga(>BZIT(D"Gx-~CLY0|blc!xwaU _$$!J 222Jx](6HDJY0%6Xd I Pz(Pà <b&[EQ9qJcsWYPpE~HCPMM.}DMG-x$^Lɼt?UA[2=`R/]H\O/u[CHR_.g$?^*,#ԗ9{xwMczcGorg)JVhXQ :7jW ՄJ ȒSa}oR{XI`ԹzEb Z*5qM,},\L#*`u-9|;"B0Pb ;b=̝]j"(ǁb)A5hʳ*ĝj` JE!1Qv%zӤGYXJ|+ͧb9^R커KIH|nq]jo'Wt#O,Ȕޤx ŜHhԼ,w߀r'ES޼Ze mwZ9KL<bEd2^.-@91I4q,?5du)=zJQXۘOWD ]ǹĮjxȊ^Nϓ5ֈʓ8>ش..I&_l!dصR|,Q&]RQ3}1$'܈ioRN*BOsR\:v)*VQU$/X2U9$EbOKUiC30^˫~qLm~Ǽ2`G2wbYr&եt.25 a$1cۘ7/QWxE_TpKoqH6yMSZU܌!i12$.(wfRVz܅c +!|t Ȓw 3K"=0K1N$oXc!רkqXi d&q Z2] x?RhYkR< =R:* ԅ)yi6$k _@VPN2/ h[؞kUka&5Ap0?g:'58N~5ɓ-.ƹv(̍֊gw1rx>e-h~צK7|m6p%RI;WnY6M>*r*];Tjz󟖉l;˗ c)=3Bc )J؈bP-)*.<[< gyEɍ.[RvZ03H y/J%Nbd>w91Te&,O$btrt^dcAbs.#;Ҥ72mĐ\pE{ɄlCD,,әRњ89@ B׊^V7 8\,Y>kBJ1m#7A IE>@[A>ۥe"vPn2NYA3D(PD>∿# #/Y OBaE8 T@at舌Ɩل" l7bK ֪ :kR3ͳ 7wk4pBc,$ulk7 $u9xI.\ c>Y=#PP3EdZi#L_\ƗBp?+I"]!YCrBTc <ЍAgE eC^!ɱ[}DR5~HF8)ǩ`,ڻeC7y? ld<B'?b֕cUL d*/+~2hޞРpJ+'-BXK$" MJ值7 ) A`J˜J9R#h7#) d҉4QZtY3! 8FhYqPF8W-LINUr\HqEQ°'Is+`,flj ݗ(<5m/xSd|wV,z5M6#ctz Ir$u ],-].G' J!j&)g> CdI&M1/yQ^h'W9ޙɢ wBCV$W6*ӮnD?5xCbBJЪ'FAI( njrk\PRE&Gԕap[ᓖaNf ZKuI@ů)U p۫A|5xA(d珚+о_+ gJo1&߫iff|h#<,uAt\&3pӐBŒ@٤1=n1_q rfbr4/XZ R]rKI"rR4d/4P\уQyGIPr9hwp3QVY0 H7*R=9]ؼE%:Y2Nc|V~EjE#/5bz tepJiɛQDVF]^ř̏E\>'_~S ω%ѩGec6e5@)]l-dS3o<+U(/k ZK-zЭ[s[E7ǥqNtdpE挖IRcEa,H#.b@vu PxӘ CӒ8$YD &'B"J6{P;Zbe̡34Do$`xdմ.gC`41CngZ8Nf$ }`:|e< tyI)-y+@0f1!c  1$ ^NSu]/ʎ K RIRE.GWdC-Tac詭-}ٕ* E2 nX8R|O2Z &e]%#-zrlZ Uި)cy1Ѡho{Q'ZܧgV NA:~/."]Z_RXCdۅӦ͕~~\HU AH1uJ~#LWf pMew)!/)u%J5VL"xͬ4_4mLPU?FyJ<ϟe\vb<(Bu(OLSI[j4.q#S׽9p׍Լa6Eo@!'\C/Mky; ,)L{'mh=—ѨؔȿA5cdaXyŒj+f8qGԙY/0)Z.IAdֆXFths]zas4 "P!ś)0F>]+׽O y(=T:SV~zLl^E.2$ru{bkcرtf=2vQolc$N1-+fJK_a"s}t^ MȒmcx8Is)&n]$b4OS V4i"hگO"G )+gojD5e/$yDHբ`WBzC|~214- e/`xz$4ΔL_V.P:͐ 4~! k:WĊޣy?慏8LAGB{R $Z'J*> +Dnj .TZbTaDx*$Wyh@#.Q`aS(0S'b|YPdMjI^ɯaH[xcɰ"loN/yNj(Ռ(5 6y2 %n@_#I㮡T[']_ diaV+=I^{m_Mu W neШ8\POIp,rev[S*=JU\{e&rQhK~(=k5tp7l&exժ"Q4`ò%cNaO$=ѿqEKܤ۹TN8tU'b;aL2YFr|"PuFgYq%HHlPÈD \ /ȪMTr!Dа9g޷uQpR&](BmYwRpH71MTn_t2|Re<1_NCT6{& ,$o,/ i0J) A x<*U[|kLE<0vQT';YR*)a8涩|T~z`o;zDj+)YvUY6,jI f)@W kCgE[=F eR$t.CCYZ) NmY`,YfQXFh A.'|)9 S45EeG/%%A*x sF G׵Ƅc4]O e3) 9&G`S\Tr0$6||)uYQ1{$B\ 'L>|NG"cRy#g$[3 'E8ex\fG?m<#BzY*CNLnrs@N[۴өBE`J/OFrL):uf0'F噆VerV8J)'lm ptaG(dgqKZRPi_tfFLje{)b]|ݯ `_D]]+_JxN{usS1i2ѧjIX×fs'Nr=RY'vČ8w-*Fc־b0"O&,}VnrsV/!r+ von? I7Su_K%_7J㰋c`t|) % D0E+~0jҡt=6l:t*],f\QC[Deh%;TBQ@4h(sT#؁"U:$L:[$ ,:lYL6vc6 M: HAɒFPZcLCsØ!Հ Rqb53P3!4sKF旋svY,S"W4O ['E׹P#V)9 O Qp+8GFyBzDcFF аF ݤб R 6^V pAiB1(X 7 GOӃ6oY)<+R4*V2=.#d Uju_2N>V"IFOKE8H}ܰ"cB>+.e_-5Tp_23Ui;Wșr ;`=acie5S6uZM WuQLL @z_Ysqy3>ULKUU ;i@9M&,tjNtq)B*xXm gk)G *~.ReN@=*$>9HԜJs-##3G&5ܯDh0(ѳ=Y5N=%X)y7)5w%pfrMŒ]#<` Vp-h]τ&{W6猆>]τ'JvHف$&Ԟ]pȐrc Fm gZ6vXHW J'a1#TjsK qj` ;='&DԱ/'eqvr\i"1u[UB!W::*%IS\Xܒ^9Dhq<,\P#~X`jJQ{{v8~(#ig"z-ߋBD0b.tQm@} MC"5"|)iAuRkep؇ aP4I!9#6R32L:% մҋ(4^ۑgTRHߏ?(/h2dBd-.{Iw*&{xY d }Lf%M %Ii"-X[M[X6#pFNMNT ]WA!<#( &YkgA " 4I=U #^r壗5uШ`6wM0h *>˅Z,6A7'Kv'2C\ 2P> 9j&,jlj`O\`bQ3-ҡ0M$p.")mEsdC^:a恐ӵ}2ZL>I+8wahdBD|rDJΥ"}%LxHM("v]3¾z6*[K// ;. A1QK=ce:({c6Bah|HHͨDx+o%VđF\=*Ld<QҋvX'e$z PY1I] .izXD.-H e/DJ 0P(5좺'XAxygDȦA% ؑ:-z$X܎ۉN7$0LPc8"8 |V8#6sޣcB5hQ FŢ>y⓪tقp ͗0'dbHydjAm yI_"fR nzTIc~a΂ AHℍ_a!   (emR F&~!r&+wjHp@0 9>8A p[ F9Pcp!Ppn Xі1您C4A1k"85 [!LXe jh$!Ć-R D8)JH_r݆/w&lG#II%!Ia y/k[dā+?ijr*"ȡ)TB;2=O$ =J$0[!YLg&:b:!jFN#ܛ3+(daEPCde MQqAc@PG /h1 5Ģ0<'_i4X1Cj! ~"\p djEPDz(G$h$F\Q%H8Z^ HFH@фI! HZ&E˂,V(JPe'0IM pȚ"]!l_LHEE r$VI~RB)y"蒉 VJ"$D-$ HLNHHJQpN?c!L 7LHI $BRH@ 990L5Q$%&BIIb鄅0'! KY I8 C"! ;rP'2JY3?$%fra"8C&Haa L9$OHHCm!$ +OI@$$M'$B^d!8I$I$y$IC5$I$I$I$rI$I$I$I$M$I$I$I$I$\I$I$I$I$rI$I$I$I$LE$I$I$I$I$I$I$I$I&"I$I$I$I$I$I$I$I$b.I$I$I$I$I$I$I$I$I&"I$I$I$I$\I$y`jꪪꪪꪪꪪꪪꪪꪪGhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Hat_Pedal.flac000066400000000000000000000245621366722712400247720ustar00rootroot00000000000000fLaC"= @KsE >l[*r( reference libFLAC 1.1.1 20041001YCxp#_Kq?834u%+tJj4bzkEw$$gBfz)v8GBjdޯP٫V,XM3gl!ABGd @b𳪱Ɉj1|jEX_tI6ȌYHbB;EncV%B LE=JxhU'!<k:?vOue EOIHs51 OJwS 4q)~wJH^73*38UZWSG:`(1 +\"J֤LP8 c!ppUxPW0<)Ih!_E/qg;֑^+kԤ*nMEqi-c0Jk*v,NKxize^fCŠJr'xuh$/6 ˿E Y%:_2Hs!7ӝiL.?Kl^H`Ijn(\ nk '\4mURQtҖ]A_Nh|Dc%&Z5{N7рM)c{vy2ͨ`B5jlNKÔKqnȊtOwg;R\UJ&e^gB\sFFkXĂr&e+qrrg r˳Z7i*Ӌ%8T|wE \E ,Pyb1hm*pm_I@4.,BGgd]Z xLP.*S Xm*ǁL2P1Y$IGs&QS,Ug^(WXƋbu0H;c*)<. I7Ka8Ҳ4oCNߑ XmEX1%Bck`eNLg11w#4̡ kw:Bj\Lt]5\Ϻ9s B)My[>"I>ct:PQfT'"l<|ukv2ѡ-^n֑#t )l 0^_P#6&OL"4$Y%"p<9Ng-a2'ȦZZP+wM-}u]\hRc!u:EsF{z(l-]ni!$Q)6sLsеCfm)[xXKA:S ynꍘɲ_8F>J&ڿ"_D蛎GeI&QUԡ<^@MJ͜$qr2x/z9jh]u('O,!P$vsXGT 9bF(._iDCLZ=v@FV^4nF'qnzS_JI2;nmlm!dG - 4H_CfFכS+XTe4G6ȎK^evhYtBlѮ1l0˹:E׏9Ww٘bb=Qn/ D!afѻI$ cemޯ4"}Ȕ1=-"zKd5 //d 9TTcH@-j!WΑ@gdmU0dgBr, EĹAph!>JkSQ"[iDjENoHQX >б`NҡO&RQP`&SJ*B~%WLSzB $0tRFf@H_/ @`Y= HO łtdE@:?bzOނ`x_RW/)$ e33ayqh-UE;'AJ\SRF0ݬ"`Јt,*$*#F2/)6r/EaAqIHռĐf<4`<;U,zJ2d3bC2`l(3z"D'gSaHHz^B6F JDHmND*3!HuبXpN1K Jď.!bґ9c\|F<_F 6H"bP|VT!5;=59 TEdbqRsJSf$'b8-Ȍ͹qӓQ+ R"@LnDT*hvRXdP@nL%&^HrJ~t/MBn$$tL.*7,lpPh%PHFbbtC2'$%R"!"#! Aj"Z A i2R#b#՛ HE$ K- 7d#"0p0tHvdдXܬɠE腃qbBnΈ3,>;#\N&vpJJ^NNԬkr$b冤.97~VjNJ؄2b#G_##+,xFPQK3'MJ *&"6x\쬄Q! YI3RrrG$n)&+$,tDDHFtؠыdoߔ%,2"#%-pj+fψ>()|`Bh+fd%nIX?&&!ntbH %$oK>vPHJDdQY#r&OI H^.,'!,t9KRGI*4xXB/ ~FF#R"R#.߾")%$~I+"O;zNDF+F/$t@D?nX䀌"22$d`yDhib uFFgP! @` %>@BfP# 2 p(8 ]P08 c"; /""G YQ.@`†pe)7šC0jL0Kq >.cgCẒ""Z˙QF$!Ī"+$%G%RTre*%k2e$r9LvD4MtjMiT&h]&I6mlmYi"m&M4m&mDIiiitmIi4i$miMi&MfKk6MtID鴓m6&I2I&Mi&M4mIM$M4I6Im$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mmIm$mI$4hydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Kick_Long.flac000066400000000000000000000566711366722712400250170ustar00rootroot00000000000000fLaC" @kJuyyCPmM( reference libFLAC 1.1.1 20041001Y< !B!B!B`bL3eߦ&Ȫ$~NޗGY&?eFP)#e#h~񵕿rt/4orTMʸ+7!ZnAsY vy,&h|BbӰg=?sB0*xTDBf#=Ʊ/*e f.rI LЙsLұwH?0sǻ6Fk#vCCbz7N)}JSĥoyB-cR'4)!iGJ1R*mkeMq65B ݱߤ'3NnѤm"L#m] \%glZŢɇM6$W,@#Åe<G#tD \ZMR$"5-9"Q.%-g(l LH2lDz ).劚\rsdRRIR]KX#X3h 0zB/h4ccaկNꍠ κ# 3;w\*y9\+'wrX L6JHnG^5978'Y?/?-?es54fs0nfʦ H3S@l|;cGb`JbyTY~ 3X/e ڮ/RF& N ~VF4K4/?FXHB+RphF%N#R1cFԮ*16mҾXZzz=bTM&>{ 2C eAR"{;!KN(%& Lf$[1BD9vIYLD2*bg !T TI*yP!Tyc/W䟹m;R?7H2,7iْ.A>"@"H͔l:$fXn +y( v :1Y"5q]rQt1Q:U$hk'oo6=V|/^Rʚ2𩩪DDtUFD_J̉Vg7."kީMe~|q.MFWSCQq:A,\syǩ{HoI,K%ak//.-55;UhgO-N<On$8aڣt+br@aDΎ8cQ vv)qB0s pv+)0C9~Bb(a(+)(EC8J+)BFBQCNs  ct8!YGg$+jS 4+++!X XP™b!ZʊKحtVSU![]ڦ$r}DG$.H%.KTEo:N!Fz2΄؅3쨎l.Ccc1E!T28G .ACL09X1 A#ej*qb  |b8 x2pFYi!x̦-j6("Z!L+Mi::9,"9.vTkDGm''I+NR$.efv''SK[sW&ӓͥ1Zעi]$J]PR.O0NNKREj"r[m "'YϮ)-5ӤLr+KYr.jZ U192j02dRPģؿXHMq6:(e2~WzzZڈk*C&Hu tᅙf#&Z3tF2b!ji~#0A '25bk2;L! #& 0FF/aEb2kN!(L a}21l1 akIļk/Ip#Y-2$Y2Z-RUJiZ,L-*&^.a JJZVJ'bV#--K#&,VyPC  (đ|,&D0,Z#2FHM*XC"1V^.ZS$e$0C LDrN-:OӅk؞!2r 8 `@Ųb b֌ l!2t$p#CkC4i~F':Zhk#eɓC1#\1idbu8-:G1vŘM'^F 5OS!2hmdiGzkd\1Q< 50@֜C*s"Zhbe2C&##?/bzHq^S Sa !dL⩗p hCY.ZMhFŮ\2$!^S N&RF)'14,NqjTLXm%^ "tV!$jKDbjJDXZiT0p!A#apI:6EUK)+CІa'A60 +M+V#K-k-Z\ aHɖ!Me *tLe)H䝈b1~1 FSdqh&a 0@ha '#)NkCOS)̪X 1A2FC b I'F ,G9dV9a LFbB8!ibxOזXF&CB$0a /'# !2Ț2i^ M&^VbѬY[YhGІeLuL&Ӊ8M!F#V56Sa2l0ZkxI!@ʦSeb#/^4.AZuU2qCd0<妱meFd#-pV#$ejRq|L*NtU %behM-F-J^,ĘT#uDTS2M$#zXAVl`CNeL'b2dCDҌ xAR01q -2U8]Deb[E،[׈b2LFZ0CJBz'Av<& t -W2Z-rѤHF1j5$./&ZeNUL&C !i)b'4Zi \,س-2 bbMˈaC&F'5ZZrԹkrבLe'N&LKZdu f0Gbdb _Mb81&l#D\\zbdAyzkyi4`5&F#ř%F!YK0FF#F#zH1䵣yh4xxdbA40\HlH1\rC GB#*1V0`LD1&tZEC ̪e'T™2W8UZ5hLNJ|Z0G5bz\#/-//b5/Z^#ZZik21/K#Xd/KІFMb51/ R4 ŦbkHb^#=#"<i2YFzz'bVD2b0Nkq )Na 'Ls&D2e4M29!!]RKɈɈɤ/q|#..]5Ѝ&QF&#F4i'Fb XZŚ/IA21, r iHڐ`RؓԌz/S$ZY. AsJ #&.TXNNș4¦LS*Q:kq6ɤaL*qZu'Kx,hCYF&Zi2-F+DVXZjjY}'1%#Ѝx^F$r###Zx_-pAxXԽqz&b LFLFO䜓21:KdTɮL02Ui BY /T̵2FM&ZeeNIL/Rrb، .щ-2lF#.HŵFHZwx#J#ؚBI;E$bk`CqC VAeʯ)R2ʑ :!M59)a2ӉbPªiT0D'2L2ʜZRDj&k&#ҌLGSIX ڵhGhB5،Zz#KIb=, ^#R_!/A#5.=.3ijhLGf" SI1ODQvl:bFS"&SkNS"tʈe2dC),tN-2u,I:t̖]L[-SL&#IMq &Tr1lIҵ#0ibx#/xb,#Y,Ř2Vb8_4[Ic$jFF'.ahd#e4a (єOaZ8yLUN ʨDDe &+ʜVN[ ˥8LLipS>g]9];u^U]:UuUSdUUJUu*)QKR(*"RJ%QDHBH*DDEE"(H$A"Q"PDH$"HH$D"H"A"DHH"J"DDRDR!""(I! C!&3 98g!0g?C qq!164b8,bƈ"4hEhZ1Dj#1hE5*"Db#b1E"E,DF(Tb?XccX;b8=q5[1lcF8hbZ4EXŋDh"DV(AQbDP*4EAhDA5EE1DTb4DX0[Xccbbⱼv8?p燘s<20pf2BaL 030 2!d2BB`Hd!a 2BC!02BHHH 00$$$Ba $C $LB@d `C!2C!9 9<9sa0~!cX Gň5TQhFE,b(V Q8+E(TQcAQAEA1ƌc;]x?v}aÜ3!C&apxd2 !!!a0̐CI 2 0BBBdHL$HI!I 2Hdd$$I!d$&HLfBa$Ø.a3|g?~>DZlv=XطcF6-F4jFXQQZ,ZjEbTj 8QTQ-EXUZEAbTVk c{3y|s8Y  &g3  g 090Ϙd&CfI&CI$8HC I&C! L$a&B@$2HHI$H$I!L!I dIa'9Üd9>|l?oǾ6}vm.cm5khV.*֋j"TQ6+EAZEjƭh֊jTjcPcWw}z<39s3xNLi$L339 ɐC$3$d2L$f$0!&dL$IBI! $ɓ 2dI!3$339a? yϘg?CXxOwwxۮt{mE[kkFUZծFmkUmj5[X4qۯnlmk[~~|Ny9 rs2ff39&Lpə3$ɇ&a32rg' 3$s&>yd9s9ϟ?|ҕ{[wvw[V۱vkmommm}wvH~iϟ??9Ϟg<3399<ᙞfg9̜0s333333>fLg y93'|ҟ< f{wno۶m}ۮ{owj۷w~_}Ory|ssd|)<3d?39gO>o{ow>{߿|=}_?gy>yy939<~;zY R 4߿}_?y?????7}:v{i>????:o/>???oe?w?<_? ^w/2y jꪗUJjUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUuUUUUUUUUUUUUUUUUUUUUUuRU]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUuUUUUUUUUUUUUUUUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@hydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Kick_Short.flac000066400000000000000000000246471366722712400252150ustar00rootroot00000000000000fLaC"  @9@'eE ,$|G( reference libFLAC 1.1.1 20041001Y< !B!444SH2L]mrkU7Wtj]>kbKƄPcB|Wyr)\LMHMܨ}Bn v@~$"R90+T\c~H!_6Zw?|j`lLF5suc2q#=0\>`I$DZdV")xF0kN7:%Z^8hSKysp)Ҍ)y KVXrֶ58LТaW:R$ dt°n;JrcCN `ŗ4\XN:(|` pT?h㱷-h}M .e# AѬ5sRl. 2BR|1BEؒlC D\ZMT%XjF  د}$R8vm8޲+Qa sZwm=:-_VemvV&6HV&4e$*|˽yB*k#I7AedfZPNr5<+:;GcqX?;Gfb`£;[/s@̢9+/? ?wB@vi4giZ,V"±a9%sT+b5BqeW5ZGզ#)JhVR/_R}bե-DHCKjrRȵNږz$,\%0ZdI6b䥥IYdş5 .RK(Z̒)ȺJbDIV|)&Xi%&>RHV͹MStb͹hc EآY#%ւhav+$Mh|>#ڷO_>ff'iۙN_qnzo<گ5%[L&!Ĭetr`(\6L'7L/tp?GĤ@l`}%" X`5 zF H(O  }%a)6E CPOKӆ 0be.Uͷnˆ.V¶GҶ*̞'*2+23/QIU{"󼆕rIGZ*tbUR\]SA!ecN,e)q,cpЫYhU($V!BJzF /,&L6$a(rQZ?G嗟JJ.K&zk-錈Gk*'uY5UQ=l"mRi*T#YRz-,A'R]C,Hoؑޒbʄ%40$pX13I*Ki*a^4T 34hy!4Gӄ,DGkD(cySy*Ċ$iIҍ:VzQަ.JJ]%Dzߛ}n]ѳ;U;<~'cTBcg.vsw"jkz(rq|5ϨM./ al\T*ZI5k=Q%Z7X14C5Kc}s[' (q8ǰ QtL-ĐbhZ>QkCԔ-ͤ%űŹ%5_ڤlJ^J?]S5ڭ鈩DEFLNVDGM'NDR/zhUFR&:U5طjЖNZMw,T,zIrU[1ӧOM)4҄JiJSJRM)JSe)M,4,K;.u igJSKiM*R)viJttN44=:~4/_e_)|.YK˖^P)r)#˗^YrYe_.\Y/п*~_OOO=?SO?O4OODO yjꥮUWUU*UZUUUUUUUUUUU*VUUUUUUUURtWUUUUUUU*UVUUUUUUUuUUUU]UUUUUUUUUUUWUUUUUZWUUUUUWUUUUUUUWUUUUUUUUW*ꪪꪪꪪꪪꪪꪪꪪTOhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Shaker.flac000066400000000000000000000227001366722712400243560ustar00rootroot00000000000000fLaC" @8f$WEI( reference libFLAC 1.1.1 20041001Y<` (  ( (  ( (  (  ( ( ( ( x (& XF. hRฺa/`v(!) aBgifR5i2y$z~%,&8 "4Y"AyR Ē'[mkZ+n>(W ѣ2fb8k=䕵זt#Ⱥ/aȅO!M϶?BEc:pdsa[r{B2sEI严iN@QX F14G̉qpkt-iV(t2 H ̗*HVAArBXKd_qW TR4YD'!cUˬU^#*i`3wCO0 % =zA"yeI Q;T@bBcrh`@;{v] -"!7RA"s>Q&ՔZ`D E 7s׽0s y]FJXjKźc=.6^}X7 YQL,E%eK.Ed9bBeFlw`-7j)RA8xE.-FF[Aj}Dpm. ~m9ʏ!DtM%C߹r#^yWF!n @w>3F|d.0 H*?.1I,@MϬM\/!Me$"@bv;ԴWt3PEk=H pPx!+u:*5R3fvDATAO!E!TȠfWD*H >տڶ՟jDbJ;( pEo_ڏN} ͤb#5Vq0OEF_;a^+6@ C *'\hN%܋KyLnVDX.#)l[-#'K Ag KT@HaKyW̑vقUmAS:*F:g2 wݡg~*}?4qȾ2Ypp։{ֿ\wxlҕp6֦ɱ( )^oҔ!6|vb b>(9G-.`ɤT{W!1'6 5:vWk2"l =DAmJEA(zB褾/3r$b̶J'qalJvE=.ۤ29e?խ[: ccmn0>_D|ábOVI"muG-[/mpvɩtm( }v>ZhuN7lefĊ T*z P;C>Yu !Uϭig4fǸxSGsw[2V~ՐLf=&!`85e'9~z|KF{e S?Մ3^-gQ)!% /*Hm_"Qr%\5K#Ue`X5՜犭saVy ReQ\ XiHC괽)t=,˱_CH]3qH>r3CMSwbHpȰQf+ɽrLjUi耑X<]l$e~I4f=Q4V%(ԛs >=O'DWOȤy@rhȁ:j)H0{`ozWNvW56^1՗EmfEE/(u3VƠˉQr"ݸYWdƍ?154*Բ.*+ʴpQY}{q={ j[@LDNo0j dё|k轇b"#T("Juf:S{6oj#Nn;XXUxQ>1קޥJce^Mά+(G, S@b fs)cS3{4Fa"p x'xQz-‹܀R-{VFVBm,GG1V<1WV=I ,~/FApBȎV~T0) Lk-J AQZ/NU::9R5TE` `b )"Tɂfaud&v%0jw@BE8lP´ocg s:L*cbJi$ZdžUE {eW$D)=w{F_]V+ Qw:'X;:D !SS,C93=sForPSiIiJXU24Ky($' pl!D {DYСr4L1QWR-X\]=;T/h ;D$odΓavԚ+}CJ;z ¯ޏ+#B/R vPTF7 Z1ed  Ai6І 0L@،0& DύP0x$L.Cb00Xg+(hPc@NMPœdE ]{& | 7,8 6I2n-QĒW)!oR'KODA9>UM<{%jWS"%5jMW1wbUnKtKUUvM]Uq_}UUkWUUXyKJeuV]UWUWUUZ\uU]UUuUj꫕W.]UUU]UUuUUU]Ujꪮꪫꪮꪮꪫꪮꪫꪮꪫꪮꪫꪮꪫhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Snare_1.flac000066400000000000000000000234501366722712400244340ustar00rootroot00000000000000fLaC" @HzHQ69q]L( reference libFLAC 1.1.1 20041001YŞ7iq]>P3G.})%$ uvsQu`+?<bi`=G>8^!.fsa7O3PXnYȭ%+̖(~!HWT2"pNǫX'vU8 s}he00DCP^ D㌰vZo%;YVb hHɂ!n#V付Hc!DGYI|c7ѳ]K2hRB%um?C)qu7oVG4b` ¥(+M><4lOyNSVMNqJi頳qeFLr=}: EiӄN+TBB/#{;5UMc բL @]n\W>.ްDd9XTaOH187mblz ry j߯_ aDm֖T,Ky}2Q O*Һx$;, ɋ>IM @qhf&΃LN欕eJ6ղ(]I+Gd%q,?xE95s&NOR!mROolfG`>H |z1 iy1ox5N3Nbu*?-Ѕm- E5mug zh'%)`Ȳz..+HRBⲷcF43u:X#-wQTѽZ)'lЬ5k*eu캌V&NBa+2gzm?-o7@Kv+I\hh*5<[NbGu_rSP P-IJȊ|g0 ԢH%mlDF>IOO9yhfgZ}~ۤM:TX= ѱZ㦣NN5&I'|I[T꽶'K"s~5gXW!=סcj3@)L5sr^xΤ+pHE Iӽ~hEe EU~\˒աSsnKCB tD0ґ )ѕRZ..:R89w3iedciprcƢQ&;VE)0uffxG Jo^XEh=&Z^ cN%Rx!){C6 ߷B"*rgmW$2a.;˝=W$5b7jNʈ Adz \Ō՗8cn[5]-,XKPhU:^6@רs}!ɐ}Myk†)] 7JMՔ$Z QKmuS+9l+M1p.R>9ZHTxŌ@eѡ-4Fk)@dEpRI iraw- ([pƞDj 5 D"C1JJ0bGQxaG"պWbJ*8jˤ kOm6ݹ dF;3gKY? 8sCxUĞCb4d#z(o`q )q[4l!gp/UÆLۧ+(JHeMg= 9\|&XYnm\]s/Lj V1xR߸.R|f3W㲘Of޹Ƚ"jyyӕQ8=J<< K<8I-;?[{9M:Ky=Lͻ6XzJOVizSߝ!p2=p2ӾJpnΤdĘe):b 6)[ӲTsi4*y,9YPv Y@lwQ,&Kl:R{}9xa3K!cnx"̲f&yfͰ#Ye9# 'ؑ.W7!&ٚt,ƧJM*LTP rKVb%kzά\ EUE=j j:uakD1T~81Ğ?.aKԅoJ x&D`]\JCfd XDl.dUIZRdW02 SԶDkN@,xfJ" o{EP,B5fYOwέ _Fܶh)ICp&8Ր{&|%FDwQ$ҋdG<ŋ1O&%-ҢX2>>T9V-gX9QQ'zTrFfWۡ?8̎sgޛQLs}[1wdtn T$~_Եwzhb3_Y()cwc^k =',g{&?{E쭳[Š7cLůX\Z,wOU +KxOI))GU4]ƶQ;9UaS+#cmΪ@>~Lv>[w22 Rr"}f]zG"w&)jjE^1!Ex]ΉM"C/ s'D8IHWGUnxl-I++fG-:W&(~^fza?nQѹ7/K軕Ld 7Q`w޸62YoU뷙x҉fEas($ѾNQ&QcmofZyƾy+Au~b-}qL;rʊ犸⍠8㪨m3DX=}e$_]VsvQUvT?O8 H` 1C0 g1T&G  pJ@ 3  8DU((x pjJ0-C0g P (S+#`Ȅ&1"2!'1cM24V"؆BMtKPPt$\ɛFb2").ɉq!#4Fb"#hLАFddfDB"1"23#&Ddd&&DDDH3lɑ3dL#"dFM&FDL"&FhyfjUʺ+uU.uWRJ.RUUuWU}UwJ˪UuU]UWUWUrꪺꪺuUuU]U]UWUUUUuU]U]UWUUUUuU]U]UWUUUUuU]U]UWUUUUuUuU]UWUWUUUuUuU]UWUWUUUuUuU]UWUWUUUuUuU]UWUWUUUUuU]U]UWUUUUuU]U]UWUUUUuU]U]UWUUUUuU]U]UWUPhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Snare_2.flac000066400000000000000000000225661366722712400244440ustar00rootroot00000000000000fLaC"4 @cryPR&vDkML( reference libFLAC 1.1.1 20041001Y<e (s0'LdpžC_)i+ܫ#!$Ta}~nI^c]t)ؚckBhK$>]Є$DI[8tnV< &hr>~+T3/-TX7[e1fh}ꕞZ!kY@#/X\.HP’l.6FnCF(ON3q_쇪) ACEe-} n˗[2=CئNBT:$~W$#ĂB'(B]o"qھK. -D[fq⾍J<0£J[v­[{s=HYSԡf_] ]}] e*2Pӗf|dUIU/Ve˭UXXQvpV{[>e)$uC<֑PЦ $1?&ʜm~dM@e0iRC5 ¯+-F $\iٸJlf]Iފs|ǜ KyA޺ڲTpѾhօJUN30mbb| P70˖󽎶+sT;=R VLJsT| Pp̭$pb>Gqa94)JEM`/zDE'в&hDIksRּq*_GP‘~.`0 DbCocq峧4b-F{yى3S^E<ٌ%شbˠwS%9 uӏ~nfSd[&@#$&ԎKZJ|xȉѴz5=ܱ[ӳ2YJLT8^4Y$tpt}Qv3|.6Rz,EDQ1!:fzlUOq}^&ք?kN8ᆖА٧5Dm_:O! L~ X#X_@ZgTRȎvVdݛ*7ZH|x겛H4](Jjqw!Wdz4Ֆf̪sWy5$fq<$3o4͞uFV!;5Jjľ w^PMnvQYw#h&yL KDXJLS2]}m2*U!ꣾd3IsvCY27.r,vzQB2uTGwޢTI1DwDOiPn_$%t %l7dfM:F#rXOJKy|+V?]~έMYY>qɿFT Pv ȑ\ʱjJܙtg؀(Auf ^dퟪ Zlct૶9QpL4w~BJ]|z|QhO֔u|W7Dؑ Sg f`_Sƫ/hXя͢D *9'Rmy?\߻2syLw#'i+O Z.&ǖ4F@SXt/}iAR,#8*bLH@@ 3Jb s `QubA/ؿ$4*p55boaԻ1'j60 !ZbB 8Q^,2) P^ה e{ s@mjxӒ * 'Y=I|Us!cRa ļnf)ě[AKPW̓ SY0q /˨ɣCI1Y*Or +KO> qul$&#W8<UywŰ_]:eN6L32p6y[Y;s`ZD9LF%Q"X:8[b*o$o=0HWhk/Zޣr1c$Kaeũig@?J"-2& 1|I~<@-IB%5l*sɶv3#Oˡ-T5vv?,(g9 og%oŎD3 9x7uBOe-Xnr$QH$]|Uo3RĮͤGIwg1:oCeh㑌o< dG T}FaTSDҗ]IAOb:z%]R;涏qX7/4ƚOZL$hDӞu蠋+F=sC>72rbDeČ4NƢ pYȈ8 bd6&XB_ElظpD I|(Ƭ;HSQ|LFi8q6 ].y[ ӧ!AdKGLI)u(o]f <,LW$t&ʋ3JW5:֟ a b]G7Ϲjfj9qDs&NӖհV/Ta`mRfB#YL*S\ 3[,L,2&LJwG)[K'dl@R 픭6<9My"Vecqn6:[ų՚P!ѣZ3gk_Tϟ r,4)(0?7\qQApp6d, #im l sƯ=GHzm:D-gM0yQ+A|[xٲI2(4!q,)A#$T/ ]DsM CDšZY[ClV$tZ(ѹHDe B9K Na(]֣+L$D)Fjgq2n'_V!Kky }JiyVȱRt8vQ*Bn6*l͋U;x4!7fL],)CZ ZОCE*/N+!tm1fi bNtZ]G ҦDyIγb.K9-ҭ/l"w:y#NV6)8fV)@ AH$ @8 @ (  A!`@@PL0H" A KNZp2rAY WϔXB`EU /L:y~)LZRAIr!*q Oc7Osy#eΝ:_߿^[ybXijuRꪮ]ruUWUUU]UWUUuU]UUUuUWUUuU]UUUuUWUUU]UWUUuUWUUU]UWUUuU]UUUuUWUUuU]UUUuUWUUU]UWUUuUWUUU]UWUUuU]UUUuUWUUuU]UUUuUWUUU]UWUUuUWUUU]UWUUuU]UUUuUWUUuU]UUUuUWUUU]UWUUuUWUUU]UWUUuU]UUUuUWUT%Vhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Tom_Hi.flac000066400000000000000000000172611366722712400243260ustar00rootroot00000000000000fLaC" @#ޒ;;<}[W( reference libFLAC 1.1.1 20041001Y< %B2#)2eM@X Q`6W.ES&.2c>mO]2fͻt͕2T~2_.q|NP y.EfB?tgWV(+#+Yx_q+G-sԜQN,5f!7:\e:m'mr}ٺt.KBK<=6~|پ/pklL %BE&%XL.%*Z[KUyrHF"gaEsAuTtZ3 (QBAXQZ!#:ID;x yҋ˩Mwo׫2mW6&_t.z>_mp\%]/^ZtԚܺlԣzѽNgC2dBs"sԮ"P*]ʇnKaV+Jr"t: #3J%SU5}՝RʫyJǞ;U] i^?^y徕t)]R=%"x#VHE5lLH#" %3dFP J!1 Bqۉ5RݟkREltڻ[|yV c{ǴTU_>v-!W?Vޏ\ttI[KsYI$ٻRrm#fDh [!8Ʀٚ"CfٚDJ̜NBJї&'KRIGI"mo1d7{mð;cCdg~ sc44L4vj #Mе¬E!`,!B "HXPPHD(1BD$(DQ BIT0Li8&kb 3G m | <chh#;q !URՉ2iRUh/AX `$"$HHHH BP1EbK D&$kF Nt4?|8vh1bo3G2gsb5i^.FZC FUEQRPq$XahPDBBȊ($X&HR) #d-M"p*1P̜C&d6 ךkfL{ d Aۇ4f hA4f#e6T̥ ɔN%XYQ!X,"PQBXN $q+DȨ&Oj#Nc4t50 M4}1z?h2u9˼G,F"2D0*Ie2& `$V ŅDVQ!" QDLJ$%iiRL'TȇɔLGyNr FH;N7F!̆OiuCu1t2eTL*Ж."F,Ib1(YQbIEDZ,F&E.)Z'i.^/.ը1L'Mm}[2 t-'^鵺F#2NdiLLC׫#^bb.Y#$U0# Ky bF L0'KHEHFJY.-D2,(k WS':ӈ~=2lspΣ^N5Z: )sd4e5QZk4pCV-+%#e2e,%b iN+ɓ*dp=Zb-w#e},֍bC/lF#Mtb2^!&YYi I_ Ų)PA/`d\S"dEhZRd!Ʉ1!ijI&(ů1jV'LFN&N kLA1Nb^y<8m5ikN2RWF'.Ua|LS L'FFęKL9)i4#-, 0SdN&N(Ğ2&UTNq=U2Qi0AlDɤz䌼e8M e9Q82FZbtYuES%JbFŭkx$iLF]K!YZb9eֳOt:^#iz\F^^Y dF&k/ K'^-zH0[jă ]&S*eL#TF)bzִ^#/+^F1z/A5b&dɓ2^-it1 &1&db1kYhŗFS.Բb *]DҜL'TLɄ0TF&_ui-4ifz׬//բ ha4dMʝ'/FLdHdzkW~H1+LFK2\^M)K/dUU.2Uj211F&ZdbjjH]b5jxAk4NL'42ɔq219ZY2AMt\i9&HֲLV!a22dC(TLMdʙ4L]V5DhFh)ָDʙT1jLDꑑ6eM&Z2t^L,jغ֪ԵԮ_R'di2UUUKu&Mdҭyi+W)ZM\L#J8kZe\NMtNUUTʙS*e2eZd&e^\LMj֙45&M&M/)jeiU0UURꨝ.\NY:/&ZN&i8M&k#uDˢxUQ'UTʵ]*erզU^S+ZeS&VS+S+S*yS*2UjUUU&֨ꖺˢ5-k\\].ԺUR0Y5UUjU2VeVeUV#*UUUUj]ZuUKTOU.uTiuTUTM.UUUUjUUZUZUUUW$˲jUUUUjUUUTKKUUUUZMRUUUUUUUUUUUUUUUUUUUUUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUjUUUUZUUUUZUUUUZUUUUZUUUUZUUUUZUUUZUUUZUUUZUUUZUUUZUUUVUUUVUUUVUUUVUUUVUUUVUUUVUUUVUUUVUUUVUUUVUUUUUUUUUUUUUUUUUUUU#hydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Tom_Low.flac000066400000000000000000000176431366722712400245330ustar00rootroot00000000000000fLaC" @'߱8QZ{( reference libFLAC 1.1.1 20041001Y< 'HBH( cao}(M:uhhFV#S2j'"Q!} }1nguhv$&R;o9M ӽ=wɡB.*sp19uoֱ#s5,^e "FXH)JtYN$sv1k+ bI˟ ('/'+HssK–y}FaSJ؅k() Z!Zr)9]:\UFE$E^D,3B<妅#QI MKEMzjGEpؔ1:jΐPش6-$lJE)"d @ȵ[s6z/R:rSrV&KFMAtrQ]2c%& QEj:QB ңjJhB=J?MM=1I]&:e`LjGPM `Jl0o.HfCp]/D0o& p Clp0(^>6 G\ (((-mnnwXcL\WO/ySm+2&rg*2&{shjQUY*UJ2|Tk*چ-ݤ{EIjRJx1rΥI!%BʥTyT **8008Ғ*D{%d4$,_(%[iR҉*f6$J=觑 rY:^4{-\LPd9S,Ou'o"Sy1Yrs*}RE:y2T˥*UO$Zr-g avES+v^!txC)=nv\ek[d$f.]u7b;dEbTI2q'Q/JLS[8KHS1ZIbSU5iUvg1FG$q1HIҥr9jr"pivgr9.Ӥt-NG#I)ek+oKd"9QQ9)l9[N)B.+/b8rxB謬TeenaMaxckh;n ^t}htۧMbtG'=o칭mktlkYRNG#Iȭ5%Q;Tի9"rNE7բene2RJ#le1I5rr.&RG1I;*+4dől&,C)C2!#˄r9pKB8De(VH唡B%)B%(D"RG˖,Da|#/.#>ʅ_BDDCOӈ>4iM>!OC=?OOO__///OiB_OB'S.Oȟ?O?yjꪪꪪꪪꪪꪪꪪnhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/808_Tom_Mid.flac000066400000000000000000000171421366722712400244750ustar00rootroot00000000000000fLaC"| @"WPBRtgOQS( reference libFLAC 1.1.1 20041001Y< ⦦*jjjjji ` "< ^_kַV),֛{B|ig/ClI,$MpZp., 嚒MZo@_>}O4P5|BSx NxN6>^^UUtUZ+ b)aN#Q%9%j-(ô« Pa 頫2fQ@NJXIACLx$I\bHe!!TYCB\gmv}L^)'*S55 ܶS N=h)}N=a>.|,y&%Mh4^4y>NihY=PVmim-Z/_oQ)KPJ^Kb-h$Te4'#V):FjњFHB2E H1 `fn2 0E @@2Q c)@ݰ3`BQ:tAQ8ޘ‰L\e#)Ef)2I\9;Ƕr̲T\Evd1Shl̬v'&Flj3RA%Ba!!7(JIhs)6 ar3a$# SB$j+&%Ħ,B@`DNJZ"4DL‘zI#;M+Md-18/ȴ˂1b0##@e%"!XR&,P! (!RB0*(/!1Q0Q+#  axNĦֵ!M!' N5}dYih2?C1 n y= 8hM6 ! e58xG1.9*bɓ ⴲ0pbX pLa-L$BL"`%-,jJ!M0V^"eD/"1iF/b&#a?vb1 d2|v' GM9W40i_i~# f(dC# F\`Y,^ȨaDrRX A!aRX$ĘM$.BpCZb/(Q1eh4&N ´F)#bF xN I20^Gѕ ̑4dֳ'M\zCHd0C5r8=#Zr2teF#^F;U2d0C"Dꢝ2# C Բ0F!زC2&ŋ*,D0Ղ0)V ZH$ę2C dEMeIj[-XB=KAS8!t#i4b5jz'@ Xb #S^f}Ktʛ"> zш0C\ks&Lʼ_P&K&0Kq4]*!ja#02AAXZbL(`M,#ZV+ 1КZb0XX$i!2)LL5SԺFXe.T0LH0@C)螙fZF'hnYphȆ2]k!4GQ1j/Ib5Xɢj&2&NILZֱj)a '%b4ZԸGʙ`C&U `A!Dh B$`CHz*Չf!†2iԌkMk3SɐhɈ2^K<#CJ a5Cc 2jdbqhahd124Lqb@>y1$dP@! !5)Nҵb152)2&C ʗՉeF-r- Ȟ C)2!e d0a:!0Ʉ8Xdզ#azKdl\d2KNHiZG,FF- %_YCBL[(`YLy2eʼCBb /&R1i4HFW8\LULdʆv&ZhZ1b5$i _IЇFVVej ^!#Zh@`F'L\:dɓ&MR2#KkkZYZ1k1/ Đţ1F؍HčKzZ=CdbFb[j\4LAi:!TʪK*eZtF&ZM+\B5F'Xbּ^i5&Idek#PRF/ȃdvveL&Y:ZdɓtL4f\V]Z[zR5x.1j1-rع,E2Hʼ'-8-2e0&ʨG/&Tɥ2DQ2NBi[#$ъ^DrԜAOJqC ֗jԚ#.e-d>ZN'DM&TɓVNq:֤eZ#ZG Yre .Wkrdb1r1f-/LMJ4KF,-2dZU'U.rk'ZLLLN $i/=r4XY4!OUd˫Il5ŗ24ֵ֖5DRURVdҚN+ɓ_ܵd'&\婥婥I8e%5bKM&F-ikUUS"UURuQ9rkZɭdɈjɓUtT.Mqr&Ո.\^\#TU]*SJS-2)KZeɪ.]ReԚZeLkkVjeS*ULeUTK\t˖&Zֵkk\U-rԹtJTե.˪UUUULZS+S*իVZUV\rZVUjVVZVZjUUUjUTRtR\\\]RiuKU.MRKUZUV˵jUjUUUUZUjUdUUUZUUUVMUUUUUUUUUUUUUUUUUUUYuUUUUUUUUUUVUUUjUUUUUUVUUUZUUUjUUVUUUZUUUjUUUUUUVUUUjUUUUUUVUUUZUUUjUUUUUUZUUUjUUUUUUVUUUZUUUUUUVUUUZUUUjUUUhydrogen-1.0.0-rc1/data/drumkits/TR808EmulationKit/drumkit.xml000066400000000000000000000445401366722712400241220ustar00rootroot00000000000000 TR808EmulationKit ArtemioLabs [http://artemiolabs.com] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This drum kit contains 16 original sounds that were synthesized from scratch (using only basic synth waves, like sine, noise etc.). It simulates the sounds of the legendary Roland TR-808 Rhythm Composer. More kits from ArtemioLabs: http://artemiolabs.com/downloads/audio/hydrogen/</p></body></html> GPL 0 Main 1 0 Kick Long 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 35 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Kick_Long.flac 0 1 1 0 1 Kick Short 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 36 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Kick_Short.flac 0 1 1 0 2 Snare 1 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 38 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Snare_1.flac 0 1 1 0 3 Snare 2 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 40 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Snare_2.flac 0 1 1 0 4 Clap 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 39 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Clap.flac 0 1 1 0 5 Tom Low 0.77 false 1 0.52 0 1 true false 1 0 0 0 1 1000 -1 -1 43 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Tom_Low.flac 0 1 1 0 6 Tom Mid 0.79 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 45 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Tom_Mid.flac 0 1 1 0 7 Tom Hi 0.79 false 0.48 1 0 1 true false 1 0 0 0 1 1000 -1 -1 48 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Tom_Hi.flac 0 1 1 0 8 Closed Hat 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 42 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Hat_Closed.flac 0 1 1 0 9 Pedal Hat 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 44 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Hat_Pedal.flac 0 1 1 0 10 Open Hat 1 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 46 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Hat_Open.flac 0 1 1 0 11 Cymbal 0.82 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 49 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Cymbal.flac 0 1 1 0 12 Shaker 0.84 false 1 1 0 1 true false 1 0 0 0 1 1000 -1 -1 70 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Shaker.flac 0 1 1 0 13 Conga 0.88 false 0.9 1 0 1 true false 1 0 0 0 1 1000 -1 -1 63 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Conga.flac 0 1 1 0 14 Clave 0.84 false 0.96 1 0 1 true false 1 0 0 0 1 1000 -1 -1 75 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Clave.flac 0 1 1 0 15 Cowbell 0.85 false 0.96 1 0 1 true false 1 0 0 0 1 1000 -1 -1 56 false VELOCITY -1 0 127 0 0 0 0 0 1 808_Cowbell.flac 0 1 1 0 hydrogen-1.0.0-rc1/data/emptySample.wav000066400000000000000000000173221366722712400177610ustar00rootroot00000000000000RIFFWAVEfmt Ddatahydrogen-1.0.0-rc1/data/hydrogen.default.conf000066400000000000000000000155401366722712400210530ustar00rootroot00000000000000 0.9.7 0 true false true false false 400 16 0 0 false false 0 0 true true false true Path to Rubberband-CLI http://hydrogen-music.org/feeds/drumkit_list.php not_categorized - Auto false 0.5 256 1024 44100 /dev/dsp alsa_pcm:playback_1 alsa_pcm:playback_2 USE_JACK_TRANSPORT NO_JACK_TIME_MASTER true 0 false hw:0 ALSA None None -1 false true false false false false true 9000 Plastique Lucida Grande 10 Lucida Grande 11 1.1 8 21 3 false true true BC_OFF SET_PLAY_OFF 0 0 true true true false 0 44100 0 true 0 0 1000 700 true 10 350 829 276 true 280 100 706 439 true 10 10 600 250 false 500 20 526 437 false 720 120 0 0 false 2 20 0 0 false 2 20 0 0 false 2 20 0 0 false 2 20 0 0 95,101,117 128,134,152 128,134,152 72,76,88 196,201,214 97,167,251 58,62,72 167,168,163 167,168,163 207,208,200 40,40,40 40,40,40 100,100,200 65,65,65 75,75,75 95,95,95 115,115,115 125,125,125 135,135,135 2 213 hydrogen-1.0.0-rc1/data/i18n/000077500000000000000000000000001366722712400155145ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/i18n/CMakeLists.txt000066400000000000000000000005011366722712400202500ustar00rootroot00000000000000# make clean does not delete *.ts and *.qm files SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM 1) FILE(GLOB TS_FILES ${CMAKE_CURRENT_LIST_DIR}/*.ts) QT5_ADD_TRANSLATION(QM_FILES ${TS_FILES}) ADD_CUSTOM_TARGET(translations ALL DEPENDS ${QM_FILES}) INSTALL(FILES ${QM_FILES} DESTINATION "${H2_SYS_PATH}/data/i18n") hydrogen-1.0.0-rc1/data/i18n/hydrogen_ca.ts000066400000000000000000003636711366722712400203660ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Pàgina del Projecte</b><br> About Sobre has no 'a'... &A sobre <b>Website</b><br> <b>Pàgina web</b><br> <b>Development mailing list</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> AboutDialog_UI ### About Hydrogen Sobre hydrogen A&bout So&bre &Authors &Autors &License &Licència &OK &O Acceptar Alt+O Alt+O AudioEngineInfoForm Audio Engine Info Informació de motor d'àudio AudioEngineInfoForm_UI Playing notes Polifonía Process time Tiempo de elaboración Audio engine state Estat del motor de sò Song state Estado de la canción Buffer size Mida del buffer Sample rate Tasa de sampleo Form1 Forma1 ### Frames Marcs Ticks Partes Song position Posición de la canción Patterns Patrones Selected pattern Patrón seleccionado Selected instrument Instrumento seleccionado Connected to Connectat a Synth Sintetizador Sampler Sampler Sequencer Secuenciador MIDI input Entrada MIDI Name Nombre Audio output Sortida d'àudio Realtime frames Marcos en tiempo real AudioFileBrowser Audio File Browser Navegador de fitxers d'àudio Size: %1 bytes Mida: %1 bytes Samplerate: %1 Velocitat de mostreig: %1 s s Name: Nom: Size: Mida: Samplerate: velocitat de mostreig: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Quadre de diàleg Open Obrir Name: Nom: Samplerate: Velocitat de mostreig: Size: Mida: Length: Longitud: Cancel Cancel.lar Pla&y samples by clicking &Y Reproduïr mostres al clicar &Up Am&unt &Home &H Inici &Play Sample Re&produeix Mostra &Filename to instrument name &Fitxer a nom d'instrument &Stop &S atura View hidden folders Veure carpetes ocultes Be careful, this change all Layer velocity settings Compte! això canviarà tota la configuració de velocitat de la capa Set automatic velocity Configurar velocitat automàtica ComponentMixerLine Mute Silenciar Solo Sol Component name Set instrument volume [%1] Configurar volum de l'instrument [%1] Director Director Director_UI Dialog DonationDialog Donations DonationDialog_UI Form <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Choose random entry. Donate! Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - T.E. %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Exportar arxiu MIDI Directory %1 does not exists The file %1 exists. Overwrite the existing file? ExportMidiDialog_UI Dialog Filename &Browse... E&xaminar... Alt+B Alt+B Modus: &Export &Exportar Alt+E Alt+E &Close Tan&car Alt+C Alt+C ExportSongDialog Export song Exportar cançó Export to a single track Export to separate tracks Both The file %1 exists. Overwrite the existing file? Directory %1 does not exists ExportSongDialog_UI Alt+C Alt+C &Export &Exportar Alt+E Alt+E &Browse... E&xaminar... Alt+B Alt+B &Close Tan&car Dialog Export directory: Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Samplerate in Hz: 22050 22050 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 SampleDepth in Bit: 8 8 16 16 24 24 32 32 Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Modus: Enable tempo changing TimeLine BPM Enable use of rubberband's batch processor Rubberband Batch Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Efectes si/no Master output Sortida principal H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Propietats de la llibreria de sò &Ok &O Aceptar &Cancel &Cancelar This is not possible, you can only save changes inside instruments to the current loaded sound library Això no és possible, només es poden desar canvis a instruments en la llibreria de sò actual Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Atenció! Si canvies el nom del kit de bateria en crearàs un de nom amb aquest nom N'estàs segur? Open Image Image Files (*.png *.jpg *.jpeg) Saving of this drumkit failed. HydrogenApp Drumkit loaded: [%1] Kit de bateria carregat: [%1] Song Editor Editor de cançó Instrument + Pattern Mixer Mesclador modified Song saved. Cançó desada. InstrumentEditor Show instrument properties Mostrar propietats de l'instrument Show layers properties Mostrar propietats de les capes Random pitch factor Factor aleatorio de tono Filter Cutoff Tall en el filtre Filter resonance Ressonància en el filtre Attack Atac Decay Decaiment Sustain Sosteniment Release Alliberament Layer gain Guany de capa New instrument name Nom de l'instrument nou Instrument gain Guany de l'instrument General General Layers Capes Layer pitch (Coarse) Ajust tò de capa (Fort) Layer pitch (Fine) Ajust tò de capa (Suau) Midi out channel Midi out note Stop the current playing instrument-note before trigger the next note sample. Don't change the layers' gain based on velocity Component volume Select pattern size Seleccionar mida del patró New component name Component name InstrumentLine Clear notes Esborrar notes Randomize velocity Velocitat aleatòria Delete instrument Eliminar instrument Mute instrument Solo Sol Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nom de l'instrument nou Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Mostar editor d'instrument Instrument Instrument Show sound library Veure llibreria de sò Sound library Llibreria de sò LadspaFXMixerLine Edit FX parameters Editar paràmetres efectes FX bypass Ignorar efectes Ladspa FX name Nom de l'efecte Ladspa Effect return Retorn d'efectes LadspaFXProperties Select FX Seleccionar Efecte [%1] LADSPA FX Properties [%1] Propietats Efecte LADSPA LADSPA FX %1 Properties Propietats Efecte LADSPA %1 No plugin Sense complement Activate Activar Deactivate Desactivar Remove FX LadspaFXSelector Groups Grups Stereo Stereo Mono Mono Not supported No soportat Select LADSPA FX Seleccionar Efecte LADSPA Recently Used Utilizat Recientment Alphabetic List Llista Alfabètica Categorized Categoritzat LadspaFXSelector_UI Form1 Formulari1 ### fx label ### Etiqueta Efecte ### fx type ### Tipus d'efecte ### fx ID ### ID Efecte &Cancel &Cancelar Alt+C Alt+C &OK &O acceptar Alt+O Alt+O 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 ### nombre d'efecte 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 ### Creador d'efectes 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### Copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm &Save &Guardar &Discard &Descartar les modificacions Cancel Cancelar Error loading song. Error al carregar la cançó. Hydrogen Ready. Hydrogen apunt. Save song Desar cançó Open song Obrir cançó Print Objects Imprimir Objectes &New &Nou &Open &Obrir Open &Demo Obrir &Demo Open &recent Obrir &recent Export &MIDI file Exportar arxiu &MIDI &Preferences &Preferències &Quit &Q Sortir Show &audio engine info Mostrar informació del motor d'&audio &User manual Manual d'&usuari &About &A Sobre &Cancel &Cancelar Unknown audio driver Controlador d'àudio desconegut Error starting audio driver Error inicialitzant el controlador d'àudio Jack driver: server shutdown Controlador Jack: tancar el servidor Jack driver: cannot activate client Controlador Jack: no es pot activar el client Jack driver: cannot connect output port Controlador Jack no es pot conectar al port de sortida Jack driver: error in port register Controlador Jack: error al registrar el port &Export song &Exportar cançó De&bug &b Depurar Save &as... Gu&ardar com a... &Mixer &Mesclador &Instrument Rack Taula d'&instruments &Info &Info Song saved. Cançó desada. Clear all instruments? Borrar tots els instruments? Ok Acceptar Unknown error %1 Error desconegut %1 You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Estàs utilitzant una versió de desenvolupament d'Hydrogen, si us plau ajudan's reportant errors o suggerint a la llista de correu hydrogen-devel.<br><br>Gràcies! Could not save song. No s'ha pogut guardar la cançó. Open &Pattern Obrir &Patró Save Pattern as ... Desar Patró com a... Pattern saved. Patrón desat. Open Pattern Obrir Patró Don't show this message anymore No tornar a mostrar aquest missatge Playlist: Set song No. %1 Lista de Reproducció: Fixar nº cançó %1 Show &info Mostrar &info Expor&t pattern as... Expor&tar patró com a... I&nstruments I&nstruments &Add instrument &Afegir instrument &Clear all &c Netejar-ho tot Playlist &editor &Editor llista de reproducció Info|About Informació|Sobre Info|Acerca de Song saved as. Cançó desada com a. Playlist: Song No. %1 Llista de reproducció: Cançó No. %1 Could not export pattern. No ha estat possible exportar el patró. The document contains unsaved changes. Do you want to save the changes? El document ha estat modificat i no s'ha desat Vols desar les modificacions? Undo history Pro&ject Export &LilyPond file &Undo menu Undo Redo Drum&kits New Nou Open Obrir Properties Propietats Save Desar Save As Export Exportar Import Importar Online import Add component &View Director &Automation path Full screen &Options Input mode Instrument Instrument Drumkit Report bug Donate Component name Saving of this library failed. MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Configura Volum principal [%1] Swing Swing Humanize time Humanizar el temps Humanize velocity Humanitzar velocitat Set humanize time parameter [%1] Configura el paràmetre d'humanització del temps [%1] Set humanize velocity parameter [%1] Configura el paràmetre d'humanització de velocitat [%1] Set swing factor [%1] Configura el Factor de swing [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Event Param. Paràm. Action Acció press button to record midi event Prem el botó per grabar event midi Mixer Show FX panel Veure panell d'efectes Show instrument peaks Mostrar pics d'instrument Show instrument peaks = On Mostrar pics d'instrument = Sí Show instrument peaks = Off Mostrar pics d'instrument = No Set FX %1 level Configura nivell Efecte %1 Set LADSPA FX ( %1 ) volume Configura volum efecte LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer Mesclador MixerLine Play sample Reproduïr mostra Mute Silenciar Solo Sol Pan Balanceig Instrument name (double click to edit) Nom de l'instrument (doble click per a editar) Set instrument volume [%1] Configurar volum de l'instrument [%1] Set instr. pan [%1] Fixar balanç instr. [%1] PatternEditorPanel Hear new notes Escoltar notes noves Hear new notes = On Escoltar notes noves = Si Hear new notes = Off Escoltar notes noves = No Pattern editor - %1 Editor de patrons - %1 Quantize keyboard/midi events to grid quantitzar events de teclat/midi a la graella Quantize incoming keyboard/midi events = On Quantitzar events entrants de teclat/midi = Activat Quantize incoming keyboard/midi events = Off Quantitzar events entrants de teclat/midi = Desactivat Zoom in Apropar Zoom out Allunyar Is not possible to change the pattern size when playing. No és possible canviar la mida del patró durant la reproducció. Select pattern size Seleccionar mida del patró Select grid resolution Seleccionar resolució de la graella Select note properties Seleccionar propietats de la nota Velocity Velocitat Pan Balanç No pattern selected No s'ha seleccionat cap patró Lead and Lag Desfasament negatiu i positiu Loaded Soundlibrary Carregat:Llibreria de sò Show piano roll editor destructive mode pre delete settings destructive mode post delete settings NoteKey Probability Show drum editor PatternFillDialog Fill with selected pattern Omplir amb el patró seleccionat PatternFillDialog_UI Form 1 Formulari 1 &Fill &F Omplir Alt+F Alt+F &Clear &c Netejar Alt+C Alt+C To: A: From: De: Cancel Cancelar OK Acceptar PatternPropertiesDialog Pattern properties Propietats del patró %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI Form1 Formulari1 &Cancel &Cancelar Alt+C Alt+C &OK &O Acceptar Alt+O Alt+O New Pattern Name Nom del nou patró Pattern category Categoria del patró Pattern description PlayerControl Song Mode Mode cançó Playing. Reproduïnt. Stopped. Aturat. Song mode selected. Mode cançó seleccionat. Stop Aturar Pattern Mode Mode de patró Pattern mode selected. Mode de patró seleccionat. Jack-transport on/off Transport jack activat/desactivat Jack-transport mode = On Mode de transport jack = Activat Jack-transport mode = Off Mode de transport jack = Desctivat New BPM value Nou valor de PPM Rewind Rebobinar Play/ Pause Reproduïr / Pausa Fast Forward Avançar Pause. Pausa. JACK-transport will work only with JACK driver. El transport JACK només funciona amb el controlador JACK. Loop song Repetir cançó Loop song = On Repetir Cançó = Activat Loop song = Off Repetir cançó = Desactivat Show mixer Veure mesclador Mixer Mesclador Show Instrument Rack Veure taula d'instruments Instrument rack Taula d'instruments BeatCounter Panel on Panell contador de polsacions activat Set BPM / Set BPM and play Fixar PPM / Fixar PPM i reproduïr Jack-Time-Master on/off Mestre de sò JACK Activat/Desactivat BC Panel on Panell CP Activat BC Panel off Panell CP Desactivat Count BPM and start PLAY Contar PPM i REPRODUÏR Count and set BPM Contar i fixar PPM Jack-Time-Master mode = On Mode mestre de temps JACK = Activat Jack-Time-Master mode = Off Mode mestre de temps JACK = Desactivat Record Destructive Record Recalculate Rubberband modified samples if bpm will change Switch metronome on/off Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF PlaylistDialog Song list Llista de cançons Script Script exec Script Executar Script Add Song to PlayList Afegir cançó a la llista de reproducció No Song selected! No hi ha cap cançó seleccionada! Load Playlist Carregar una llista de reproducció Save Playlist Desar Llista de reproducció No Song in List or no Song selected! No hi ha cançons a la llista de reproducció o no s'ha seleccionat cap cançó! Hydrogen Playlist (*.sh) Llista de reproducció Hydrogen (*.sh) Add Script to selected Song Afegir script a la cançó seleccionada No Script in use! No s'està utilitzant cap Script! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. No s'ha configurat cap editor per defecte. Si us plau selecciona el teu Editor per defecte No utilitzis un editor basat en consola Ho sentim, però no funcionarà en aquests moments. Set your Default Editor Configurar l'editor per defecte No Script selected! No has seleccionat cap Script! Error loading song. Error al carregar la cançó. sort ordena New Script Nou script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. El nom o ruta de l'Script conté espais en blanc IMPORTNT La ruta a l'Script i el nom del Script no poden tenir espais en blanc. No Script! No hi ha cap Script! Playlist Browser &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &New Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Rebobinar Play/ Pause/ Load selected song Stop Aturar Fast Forward Avançar Please save your song first The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Descartar les modificacions &Cancel &Cancelar no Script File not found: Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. WARNING, the new file is executable by the owner of the file! No valid song selected! Pause. Pausa. Playlist: set song no. %1 PlaylistDialog_UI PlayList Browser Navegador de llistes de reproducció Song list Llista de cançons PreferencesDialog Slow Lent Normal Normal Fast Ràpid <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Sistema Open Sound</b><br>Controlador d'àudio simple [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">No compilat</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Controlador de conexió Audio Jack</b><br>Controlador d'audio de baixa latència Preferences Preferències <b>ALSA Driver</b><br> <b>Controlador ALSA</b><br> <b>PortAudio Driver</b><br> <b>Controlador PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Controlador CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Si us plau, reinicia hydrogen per activar/desactivar soport per LASH Automatic Steps Fixed Driver restart required. Restart driver? &Ok &Cancel &Cancelar <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Buffer size Mida del buffer Device Dispositiu de sò Input Entrada Channel Canal All Tot Meters falloff speed Celocitat de caiguda de pic Slow Lent Normal Normal Fast Ràpid Application font Font per a l'aplicació Mixer font Font per al mesclador Select font Seleccionar font Sample rate Freqüència de mostreig 44100 44100 48000 48000 ### 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 9 8 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Form1 Formulari1 Polyphony Polifonia Style Estil &Cancel &Cancelar Alt+C Alt+C &OK &O acceptar Alt+O Alt+O &General &General Alt+R Alt+R Audio &System &Sistema d'Àudio Metronome volume Volum del metrònom Connect to &Default Output Pair Connectar al parell sortida per &defecte Alt+D Alt+D 88200 88200 96000 96000 &Midi System Sistema &Midi Midi driver Controlador Midi Ignore note-off Ignorar note-off &Appearance &Aparença &Reopen last used song Tornar a carrega&r l'ultima cançó usada Restart output Reiniciar la sortida Audio output details Detells de la sortida d'àudio Post-Fader Post-Atenuador Pre-Fader Pre-Atenuador Track output Sortida de pista Use lash Utilitzar lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm primer pas, ajustar error de temps entre la latència del controlador/teclat disparador i els ppm computats Beat counter drift compensation in 1/10 ms Compensació de deriva del contador de polsacions en 1/10 ms Beat counter start offset in ms Compensació del contador de polsacions en ms &Reopen last used playlist Use relative paths for playlist Maximum number of bars Path to the Rubberband command-line utility Create per-instrument outputs Interpolate resampling Linear Cosine Third Cubic Hermite Enable feedback Discard midi messages after action has been triggered Use output note as input note &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Cancel &Cancelar Close dialog! maybe there is some unsaved work on sample. Are you sure? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog &Close Tan&car Start Adjust sample start frame Loop Adjust sample loop begin frame <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> set processing forward reverse pingpong <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> loops End Adjust sample end & loop end frame "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Sample length to beat: off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 8 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch (Semitone,Cent) Pitch the sample in semitones, cents Crispness: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> 0 0 &Apply Changes &Play P&lay original sample new sample length: fade-out type volume panorama SimpleHTMLBrowser Manual Manual Welcome to Hydrogen Benvingut(da) a Hydrogen Don't show this message anymore No tornar a mostrar aquest missatge Ok Acceptar Documentation index Index de la documentació SongEditorPanel Create new pattern Crear un nou patró Move the selected pattern down Moure avall el patró seleccionat Move the selected pattern up Moure amunt el patró seleccionat Clear pattern sequence Eliminar la seqüència de patrons Song Editor Editor de cançó Select mode Mode seleccionar Draw mode Mode dibuix Warning, this will erase your pattern sequence. Are you sure? Atenció! això borrarà la teva seqüencia de patrons N'estàs segur? &Ok &Acceptar &Cancel &Cancelar stacked mode mode apilat stacked pattern mode mode patrons apilats single pattern mode mode de patró únic Pattern %1 Patró %1 Enable time line edit View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Velocitat Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 500,55 Edit beat in timeline 500 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Ok Acceptar SongEditorPanelTagWidget_UI Form Tag Cancel Ok Acceptar SongEditorPatternList Copy Copiar Delete Eliminar Properties Propietats Fill/Clear ... Omplir/Buidar ... Save Pattern Desar Patró Load Pattern Carregar Patró Open Pattern Obrir Patró Pattern 1 Patró 1 not_categorized no_categoritzat Export Pattern Virtual Pattern The pattern-file exists. Overwrite the existing pattern? &Ok &Cancel &Cancelar Could not export pattern. No ha estat possible exportar el patró. Could not export sequence. Pattern saved. Patrón desat. SongPropertiesDialog Song properties Propietatsde cançó SongPropertiesDialog_UI Notes Notes Author Autor Song name Títol de la cançó Form1 Formulari1 &Cancel &Cancelar Alt+C Alt+C &OK &Acceptar Alt+O Alt+O License Llicència SoundLibraryExportDialog Export Sound Library Exportar llibreria de sons Directory SoundLibraryExportDialog_UI Dialog Diàleg Export Exportar Drumkit Component Path Browse... Navegar... Version 0.9.7 and higher 0.9.6 and lower Cancel SoundLibraryImportDialog Sound Library import Importació de llibreria de sò Sound library Llibreria de sò Status Estat Updating SoundLibrary list... Actualitzant llista de llibreries de sò... Installed Instalació completa New Nou Author: %1 Autor: %1 Downloading SoundLibrary... Descarregant llibreria de sò... SoundLibrary imported in %1 Llibreria de sò importada a %1 An error occurred importing the SoundLibrary. Hi ha hagut un error a l'importar la llibreria de sò. Import drumkit Importar kit de bateria Drumkits Kits de bateria Songs Cançons Patterns Patrons Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Diàleg Internet Internet Update list Actualitzar llista Sound Library Name Nom de la llibreria de sò Author... Autor... Download and install Descarregar i instalar Local file Fitxer local Browse... Navegar... Install Instalar 1 1 Edit server list Editar la llista de servidors Close Tancar TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Carregar Cancel SoundLibraryPanel Load Carregar Export Exportar Delete Eliminar System drumkits Kits de bateria del sistema User drumkits Kits de bateria de l'usuari &Ok &O Acceptar &Cancel &Cancelar Songs Cançons Patterns Patrons Error loading song. Error al carregar la cançó. Properties Propietats Warning, the selected pattern will be deleted from disk. Are you sure? Atenció, el patró seleccionat serà esborrat del disc. N'estàs segur? The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Keep It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Diàleg Name Nom Author Autor Information Informació Save Desar Cancel Cancelar Save changes made to instruments into sound library Desar els canvis fets als instruments a la llibreria de sò Drumkit License Image Browse Image License SoundLibraryRepositoryDialog Edit repository settings Editar configuració de repositoris Edit server list Editar llista de servidors URL URL SoundLibraryRepositoryDialog_UI Dialog Diàleg Add Afegir Delete Eliminar SoundLibrarySaveDialog Save Sound Library Desar llibreria de sò Please supply at least a valid name Si us plau, proporciona almenys un nom vàlid Open Image Image Files (*.png *.jpg *.jpeg) A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. SoundLibrarySaveDialog_UI Dialog Diàleg Name Nom Author Autor Information Informació Cancel Cancelar License Llicència Save Desar Image Browse Image License SoundLibraryTree Sound library Llibreria de sò VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog OK Acceptar Cancel hydrogen-1.0.0-rc1/data/i18n/hydrogen_cs.ts000066400000000000000000003613771366722712400204110ustar00rootroot00000000000000 AboutDialog About O aplikaci <b>Website</b><br> <b>Domovská stránka</b><br> <b>Project page</b><br> <b>Stránka projektu</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen O Hydrogenu &OK &OK Alt+O Alt+O A&bout O &programu ### ### &Authors &Autoři &License &Licence AudioEngineInfoForm Audio Engine Info Informace o audio enginu AudioEngineInfoForm_UI Form1 Formulář1 ### ### Buffer size Velikost bufferu Sample rate Vzorkovací frekvence Connected to Připojen k Frames Snímky Process time Vytížení procesoru Ticks Tempo Song state Stav skladby Selected instrument Vybraný nástroj Audio engine state Stav audio enginu Selected pattern Vybraný patern Playing notes Hrané noty Patterns Paterny Song position Pozice skladby Sampler Sampler Synth Syntezátor Sequencer Sekvencer MIDI input MIDI vstup Name Název Audio output Audio výstup Realtime frames Realtimeové snímky AudioFileBrowser Audio File Browser Vyhledávání audio souborů Size: %1 bytes Velikost: %1 B Samplerate: %1 Vzorkovací frekvence %1 s s Name: Název: Size: Velikost: Samplerate: Vzorkovací frekvence: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Dialog Open Otevřít Name: Název: Samplerate: Vzorkovací frekvence: Size: Velikost: Length: Délka: Cancel Storno Pla&y samples by clicking Přehrát vzork&y po kliknutí &Up &Nahoru &Home &Domů &Play Sample &Přehrát vzorek &Filename to instrument name &Název souboru do názvu nástroje &Stop &Stop View hidden folders Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Ztlumit Solo Sólo Component name Set instrument volume [%1] Nastavit hlasitost nástroje [%1] Director Director Director_UI Dialog Dialog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Export MIDI souboru Directory %1 does not exists The file %1 exists. Overwrite the existing file? ExportMidiDialog_UI Dialog Dialog Filename &Browse... &Procházet... Alt+B Alt+B Modus: &Export &Export Alt+E Alt+E &Close &Zavřít Alt+C Alt+C ExportSongDialog Export song Export skladby The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks Directory %1 does not exists ExportSongDialog_UI &Close &Zavřít Alt+C Alt+C &Export &Export Alt+E Alt+E &Browse... &Procházet... Alt+B Alt+B Samplerate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: 8 8 16 16 24 24 32 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Dialog Export directory: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Zapnout/vypnout efekt Master output Hlavní výstup (master) H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Vlastnosti zvukové knihovny &Ok &OK &Cancel &Storno This is not possible, you can only save changes inside instruments to the current loaded sound library Toto není dostupné, můžete pouze uložit změny nástroje do aktuálně nahrané zvukové knihovny Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Pozor! Změna názvu bicí sady bude mít za následek vytvoření nové bicí sady s tímto jménem. Určitě to chcete? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Nahraná bicí sada: [%1] Song Editor Editor skladby Instrument + Pattern Mixer Mixér modified Song saved. Skladba uložena. InstrumentEditor Random pitch factor Náhodný faktor výšky Filter Cutoff Ořez filtru Filter resonance Rezonance filtru Attack Síla Decay Útlum Sustain Výdrž Release Uvolnění Instrument gain Zisk nástroje Layer gain Zisk vrstvy Layer pitch (Coarse) Ladění vrstvy (hrubé) Layer pitch (Fine) Ladění vrstvy (jemné) Show instrument properties Zobrazit vlastnosti nástroje Show layers properties Zobrazit vlastnosti vrstvy New instrument name Nový název nástroje General Hlavní Layers Vrstvy Stop the current playing instrument-note before trigger the next note sample. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Vybrat velikost paternu InstrumentLine Clear notes Vymazat noty Randomize velocity Náhodná síla úderu Delete instrument Vymazat nástroj Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Mute instrument Solo Sólo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nový název nástroje Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Zobrazit editor nástrojů Instrument Nástroj Show sound library Zobrazit knihovnu zvuků Sound library Knihovna zvuků LadspaFXMixerLine FX bypass Vyřadit efekt Edit FX parameters Editovat parametry efektu Ladspa FX name Název LADSPA efektu Effect return Návrat efektu LadspaFXProperties Select FX Vybrat efekt Activate Zapnout [%1] LADSPA FX Properties [%1] Vlastnosti LADSPA efektu Deactivate Vypnout LADSPA FX %1 Properties Vlastnosti LADSPA efektu %1 No plugin Bez efektu Remove FX LadspaFXSelector Select LADSPA FX Vybrat LADSPA efekt Groups Skupiny Stereo Stereo Mono Mono Not supported Nepodporováno Recently Used Naposledy použité Alphabetic List Abecední seznam Categorized Kategorizováno LadspaFXSelector_UI Form1 Formulář1 &Cancel &Storno Alt+C Alt+C &OK &OK Alt+O Alt+O ### fx label ### Jmenovka efektu ### fx type ### Typ efektu ### fx ID ### ID efektu 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 ### Jméno efektu 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 ### Autor efektu 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Hydrogen Ready. Hydrogen pripraven. &New &Nový &Open &Otevřít Open &Demo Otevřít &demo Open &recent Otevřít &nedávný &Save &Uložit Save &as... Uložit &jako... Export &MIDI file Export &MIDI souboru &Export song &Export skladby &Quit &Konec &Mixer &Mixér &Instrument Rack &Nástrojový panel &Preferences &Předvolby De&bug &Ladit Show &audio engine info Zobrazit informace o &audio enginu Print Objects Tisk objektů &Info &Informace &User manual &Uživatelská příručka &About O &aplikaci &Discard &Zahodit &Cancel &Storno Save song Uložit skladbu Song saved. Skladba uložena. Open song Otevřít skladbu Error loading song. Chyba při otevírání skladby. Unknown audio driver Neznámý audio ovladač Error starting audio driver Chyba při zavádění audio ovladače Jack driver: server shutdown Jack: server neběží Jack driver: cannot activate client Jack: nemohu aktivovat klienta Jack driver: cannot connect output port Jack: nemohu připojit výstupní porty Jack driver: error in port register Jack: chyba registrace portů Unknown error %1 Neznámá chyba %1 Clear all instruments? Vymazat všechny nástroje? Ok OK Cancel Storno You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Používáte vývojovou verzi Hydrogenu. Prosíme, pomozte nám hlášením chyb nebo nápady na kontaktní adrese hydrogen-devel týmu.<br><br>Děkujeme! Could not save song. Nemohu uložit skladbu. Open &Pattern Otevřít &patern Save Pattern as ... Uložit patern jako... Pattern saved. Patern uložen. Open Pattern Otevřít patern Don't show this message anymore Příště tuto zprávu již nezobrazovat Playlist: Set song No. %1 Playlist: Nastavit skladbu č. %1 Show &info &Informace o skladbě Expor&t pattern as... Expor&tovat patern jako... I&nstruments &Nástroje &Add instrument &Přidat nástroj &Clear all &Vymazat vše Playlist &editor Playlist &editor Info|About Song saved as. Skladba uložena. Playlist: Song No. %1 Playlist: Skladba č. %1 Director Could not export pattern. The document contains unsaved changes. Do you want to save the changes? Undo history &Undo menu Undo Redo Input mode Instrument Nástroj Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Nový Open Otevřít Properties Vlastnosti Save Save As Export Export Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Humanize velocity Lidský faktor síly úderu Humanize time Lidský faktor přesnosti Swing Kolísání Set master volume [%1] Nastavit celkovou hlasitost [%1] Set humanize time parameter [%1] Nastavit lidský faktor přesnosti [%1] Set humanize velocity parameter [%1] Nastavit lidský faktor síly úderu [%1] Set swing factor [%1] Nastavit faktor kolísání [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Událost Param. Param. Action Akce press button to record midi event Mixer Show FX panel Zobrazit panel efektů Show instrument peaks Zobrazit špičky nástrojů Set FX %1 level Nastavit úroveň efektu %1 Show instrument peaks = On Zobrazování spicek nastroju zapnuto Show instrument peaks = Off Zobrazování spicek nastroju vypnuto Set LADSPA FX ( %1 ) volume Nastavit hlasitost LADSPA efektu ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer Mixér MixerLine Play sample Přehrát vzorek Mute Ztlumit Solo Sólo Pan Panorama Instrument name (double click to edit) Název nástroje (dvojklik pro editaci) Set instrument volume [%1] Nastavit hlasitost nástroje [%1] Set instr. pan [%1] Nastavit panoramu nástroje [%1] PatternEditorPanel Select pattern size Vybrat velikost paternu Select grid resolution Vybrat rozlišení mřížky Hear new notes Poslech nových not Quantize keyboard/midi events to grid Přichytit noty z klávesnice / MIDI ke mřížce Zoom in Zvětšit Zoom out Zmenšit Pattern editor - %1 Patern editor - %1 No pattern selected Není vybrán žádný patern Hear new notes = On Zapnout poslech nových not Hear new notes = Off Vypnout poslech nových not Quantize incoming keyboard/midi events = On Zapnout přichytávání not z klávesnice / MIDI Quantize incoming keyboard/midi events = Off Vypnout přichytávání not z klávesnice / MIDI Is not possible to change the pattern size when playing. Není možné změnit patern během přehrávání. Select note properties Vybrat vlatnosti noty Velocity Sila uderu Pan Panorama Lead and Lag Preciznost Loaded Soundlibrary Nahraná zvuková knihovna destructive mode pre delete settings destructive mode post delete settings Show piano roll editor NoteKey Show drum editor Probability PatternFillDialog Fill with selected pattern Vyplnit vybraným paternem PatternFillDialog_UI Form 1 Form 1 &Fill Vy&plnit Alt+F Alt+F &Clear &Vyčistit Alt+C Alt+C From: Od: To: Do: Cancel Storno OK OK PatternPropertiesDialog Pattern properties Vlastnosti paternu %1#2 %1 PatternPropertiesDialog_UI Form1 Form1 &Cancel &Storno Alt+C Alt+C &OK &OK Alt+O Alt+O New Pattern Name Název nového paternu Pattern category Kategorie paternu Pattern description PlayerControl Rewind Zpět Play/ Pause Přehrát / Pauza Stop Stop Fast Forward Vpřed Loop song Opakovat skladbu Pattern Mode Režim patern Song Mode Režim skladba Jack-transport on/off Zapnout / Vypnout Jack přenos Show mixer Zobrazit mixér Mixer Mixér Show Instrument Rack Zobrazit nástrojový panel Instrument rack Nástrojový panel Playing. Prehrava se. Pause. Pozastaveno. Stopped. Zastaveno. Song mode selected. Rezim skladby vybran. Pattern mode selected. Rezim paternu vybran. Jack-transport mode = On Zapnout Jack přenos Jack-transport mode = Off Vypnout Jack přenos JACK-transport will work only with JACK driver. Jack přenos pracuje pouze s Jack ovladačem. New BPM value Nová hodnota BPM Loop song = On Opakovani skladby zapnuto Loop song = Off Opakovani skladby vypnuto BeatCounter Panel on Panel rytmu Set BPM / Set BPM and play Nastavit BPM / Nastavit BPM a přehrát Jack-Time-Master on/off Zapnout / Vypnout Jack-Time-Master BC Panel on Panel rytmu zapnut BC Panel off Panel rytmu vypnut Count BPM and start PLAY Zaznamenat BPM a prehrat Count and set BPM Zaznamenat a nastavit BPM Jack-Time-Master mode = On Jack-Time-Master mod zapnut Jack-Time-Master mode = Off Jack-Time-Master mod vypnut Record Destructive Record Recalculate Rubberband modified samples if bpm will change Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off PlaylistDialog Song list Seznam skladeb Script Skript exec Script Spustit skript Add Song to PlayList Přidat skladbu do playlistu No Song selected! Není vybrána žádná skladba! Load Playlist Nahrát playlist Save Playlist Uložit playlist No Song in List or no Song selected! Seznam neobsahuje skladby nebo není žádná skladba vybrána! Hydrogen Playlist (*.sh) Hydrogen playlist (*.sh) Add Script to selected Song Přidat skript do zvolené skladby No Script in use! Nepoužívá se žádný skript! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Není nastaven výchozí editor. Prosím, nastavte si váš výchozí editor! Nepoužívejte konzolový editor! Omlouváme se, momentálně tato funkce není implementována. Set your Default Editor Nastavte si vlastní výchozí editor No Script selected! Není vybrán žádný skript! Error loading song. Chyba při otevírání skladby. sort Seřadit New Script Nový skript Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Název skriptu nebo cesta k němu obsahuje mezery. DŮLEŽITÉ Cesta ke skriptu a jeho název nesmí obsahovat mezery. No Script! Žádný skript! &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Zpět Play/ Pause/ Load selected song Stop Stop Fast Forward Vpřed Please save your song first WARNING, the new file is executable by the owner of the file! Pause. Pozastaveno. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Zahodit &Cancel &Storno Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. PlaylistDialog_UI PlayList Browser Správce playlistů Song list Seznam skladeb PreferencesDialog Preferences Předvolby Slow Pomalu Normal Normálně Fast Rychle <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Jednoduchý audio ovladač [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Nekompilováno</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit</b><br>Nízkolatenční zvukový ovladač <b>ALSA Driver</b><br> <b>Ovladač ALSA</b><br> <b>PortAudio Driver</b><br> <b>Ovladač PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Ovladač CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Prosím restartujte Hydrogen pro zapnutí / vypnutí LASH podpory Driver restart required. Restart driver? &Ok &OK &Cancel &Storno Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Form1 Form1 &Cancel &Storno Alt+C Alt+C &OK &OK Alt+O Alt+O &General &Obecné &Reopen last used song &Znovu načíst naposledy použitou skladbu Alt+R Alt+R Audio &System Audio &systém ### ### Device Zařízení Buffer size Velikost vyrovnávací paměti Sample rate Vzorkovací frekvence 44100 44100 48000 48000 88200 88200 96000 96000 Connect to &Default Output Pair Napojit na &výchozí stereo výstup Alt+D Alt+D Polyphony Vícehlas (polyfonie) Metronome volume Hlasitost metronomu &Midi System &MIDI systém Ignore note-off Ignorovat vypnuté noty Channel Kanál All Všechno 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Midi driver MIDI ovladač Input Vstup &Appearance &Vzhled Application font Písmo aplikace Select font Vybrat písmo Style Styl Slow Pomalu Normal Normálně Fast Rychle Meters falloff speed Rychlost poklesu indikátorů Mixer font Písmo mixéru Restart output Restartovat výstup Audio output details Detaily audio výstupu Post-Fader Post fáder Pre-Fader Pre fáder Track output Výstup stopy Use lash Používat LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm První krok: upravte nesoulad časování mezi latencí tlačítka kontroléru (klávesnice) a napočítaným BPM Beat counter drift compensation in 1/10 ms Počítadlo úderů kompenzuje odchylku po 0,1 ms Beat counter start offset in ms Počítač úderů startuje s odchylkou v ms Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &OK &Cancel &Storno Close dialog! maybe there is some unsaved work on sample. Are you sure? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Dialog &Close &Zavřít Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame Sample length to beat: off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Crispness: 0 0 &Apply Changes &Play P&lay original sample new sample length: fade-out type volume panorama Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Příručka Welcome to Hydrogen Vítejte v Hydrogenu Don't show this message anymore Tuto zprávu příště již nezobrazovat Ok OK Documentation index Obsah dokumentace SongEditorPanel Song Editor Editor skladby Clear pattern sequence Vyčistit sekvenci paternu Create new pattern Vytvořit nový patern Move the selected pattern down Přesunout vybraný patern dolů Move the selected pattern up Přesunout vybraný patern nahoru Select mode Režim výběru Draw mode Režim zadávání Warning, this will erase your pattern sequence. Are you sure? Varování: toto vymaže vaši sekvenci paternu. Určitě to chcete? &Ok &OK &Cancel &Storno stacked mode Hromadný režim stacked pattern mode Režim více paternů single pattern mode Režim jednoho paternu Enable time line edit Pattern %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Sila uderu Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 500,55 Edit beat in timeline 500 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Storno Ok OK SongEditorPanelTagWidget_UI Form Tag Cancel Storno Ok OK SongEditorPatternList Copy Kopírovat Delete Vymazat Fill/Clear ... Vyplnit / Vyčistit... Properties Vlastnosti Save Pattern Uložit patern Load Pattern Nahrát patern Open Pattern Otevřít patern Virtual Pattern The pattern-file exists. Overwrite the existing pattern? &Ok &OK &Cancel &Storno Pattern 1 not_categorized Nekategorizováno Export Pattern Could not export pattern. Could not export sequence. Pattern saved. Patern uložen. SongPropertiesDialog Song properties Vlastnosti skladby SongPropertiesDialog_UI Form1 Form1 Author Autor Notes Poznámky Song name Název skladby &OK &OK Alt+O Alt+O &Cancel &Storno Alt+C Alt+C License Licence SoundLibraryExportDialog Export Sound Library Export knihovny zvuků Directory SoundLibraryExportDialog_UI Dialog Dialog Export Export Drumkit Component Path Version Browse... Procházet... 0.9.7 and higher 0.9.6 and lower Cancel Storno SoundLibraryImportDialog Sound Library import Import knihovny zvuků Sound library Knihovna zvuků Status Stav Updating SoundLibrary list... Aktualizace seznamu knihoven zvuků... Installed Instalováno New Nový Author: %1 Autor: %1 Downloading SoundLibrary... Stahování knihovny zvuků... Import drumkit Importovat bicí sadu SoundLibrary imported in %1 Knihovna zvuků importována do %1 An error occurred importing the SoundLibrary. Vyskytla se chyba při importu knihovny zvuků. Drumkits Bicí sady Songs Skladby Patterns Paterny Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Dialog Internet Internet Update list Aktualizovat seznam Sound Library Name Název knihovny zvuků Author... Autor... Download and install Stáhnout a nainstalovat Local file Lokální soubor Browse... Procházet... Install Instalovat 1 1 Edit server list Upravit seznam serverů Close Zavřít TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Nahrát Cancel Storno SoundLibraryPanel Load Nahrát Export Export Delete Vymazat System drumkits Systémové bicí sady User drumkits Uživatelské bicí sady &Ok &OK &Cancel &Storno Songs Skladby Patterns Paterny Error loading song. Chyba při otevírání skladby. Properties Vlastnosti Warning, the selected pattern will be deleted from disk. Are you sure? Varování: vybraný patern bude vymazán z disku. Určitě to chcete? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Dialog Name Název Author Autor Information Informace Save Uložit Cancel Storno Save changes made to instruments into sound library Uložit provedené změny nástrojů do knihovny zvuků Drumkit License Image Browse Najít Image License SoundLibraryRepositoryDialog Edit repository settings Upravit nastavení repozitáře Edit server list Upravit seznam serverů URL URL SoundLibraryRepositoryDialog_UI Dialog Dialog Add Přidat Delete Vymazat SoundLibrarySaveDialog Save Sound Library Uložit knihovnu zvuků Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Dialog Name Název Author Autor Information Informace Cancel Storno License Licence Save Uložit Image Browse Najít Image License SoundLibraryTree Sound library Knihovna zvuků VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog Dialog OK OK Cancel Storno hydrogen-1.0.0-rc1/data/i18n/hydrogen_de.ts000066400000000000000000004066741366722712400203740ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Projektseite</b><br> About Über Hydrogen <b>Website</b><br> <b>Website</b><br> <b>Main coder and maintainer:</b><br> <b>Hauptautor und Instandhalter::</b><br> <b>Thanks to:</b> <b>Vielen Dank an:</b> <b>Development mailing list</b><br> <b>Entwickler Mailingliste (auf Englisch)</b><br> AboutDialog_UI ### ### About Hydrogen Über Hydrogen A&bout Über &Hydrogen &Authors &Autoren &License &Lizenz &OK &OK Alt+O Alt+O AudioEngineInfoForm Audio Engine Info Infos über die Audio-Engine AudioEngineInfoForm_UI Form1 Formular 1 Playing notes Playing notes Process time Prozesszeit Audio engine state Zustand der Audio-Engine Song state Song-Status Frames Frames Ticks Ticks Buffer size Puffergröße Sample rate Samplerate ### ### Song position Song-Position Patterns Patterns Selected pattern Gewähltes Pattern Selected instrument Gewähltes Instrument Connected to Verbunden mit Synth Synthesizer Sampler Sampler Sequencer Sequenzer MIDI input Midi Eingang Name Name Audio output Audio-Ausgang Realtime frames Echtzeit-Frames AudioFileBrowser Audio File Browser Audiodatei Browser Size: %1 bytes Größe: %1 bytes Samplerate: %1 Samplerate: %1 s s Name: Name: Size: Größe: Samplerate: Samplerate: Sample length: Sample Länge: Please do not preview samples which are longer than 10 minutes! Bitte keinen Samples öffnen, die länger als 10 Minuten sind! Sample length: Samplelänge: Unable to load that sample file. Sample-Datei konnte nicht geladen werden. AudioFileBrowser_UI Dialog Dialog Open Öffnen Name: Name: Samplerate: Samplerate: Size: Größe: Length: Länge: Cancel Abbrechen Pla&y samples by clicking Spiele Sample durch &anklicken ab &Up Ho&ch &Home Persö&nlicher Ordner &Play Sample &Spiele Sample ab &Filename to instrument name &Dateiname wird Instrument Name &Stop S&topp View hidden folders Versteckte Ordner anzeigen Be careful, this change all Layer velocity settings Vorsicht. Hierdurch werden alle Velocity Einstellungen der Layer geändert Set automatic velocity Setze Velocity automatisch ComponentMixerLine Mute Stumm Solo Solo Component name Komponentenname Set instrument volume [%1] Instrumentenlautstärke [%1] Director Director Dirigent Director_UI Dialog Dialog DonationDialog Donations Spenden DonationDialog_UI Form Formular Donate! Spende! Choose random entry. Zufälligen Eintrag wählen. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Hydrogen ist ein Open-Source Projekt und wird von vielen Freiwilligen in ihrer Freizeit entwickelt. Mit einer Spende kannst Du allen Beteiligten Deinen &quot;Dank&quot; ausdrücken.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Sebastian Moors (aka mauser): Maintainer / Entwickler Michael Wolkstein (aka wolke): Forum hosting Michael Wolkstein (aka wolke): Bereitstellen des Forums Download Importing item failed: %1 Importieren von Objekt fehlgeschlagen: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - ETA %3 ExportMidiDialog Export midi Exportiere Midi SMF1 single: export all instruments to a single track SMF1 single: exportiere alle Instrumente in eine Spur SMF1 multi: export each instrument to separate track SMF1 multi: exportiere jedes Instrument in eine eigene Spur SMF0: export all events to one track SMF0: exportiere alle Midi Events in eine Spur Midi file (*%1) Midi Datei (*%1) Export MIDI file Mididatei exportieren Directory %1 does not exists Verzeichnis %1 existiert nicht The file %1 exists. Overwrite the existing file? Die Datei %1 existiert bereits. Willst du sie überschreiben? ExportMidiDialog_UI Dialog Dialog Filename Dateiname &Browse... &Durchsuchen... Alt+B Alt+B Modus: Modus: &Export &Exportieren Alt+E Alt+E &Close &Schließen Alt+C Alt+C ExportSongDialog Export song Lied exportieren The file %1 exists. Overwrite the existing file? Die Datei %1 existiert bereits. Willst du sie überschreiben? Export to a single track Als einzelne Spur exportieren Both Beides Export to separate tracks Als separate Spur exportieren Directory %1 does not exists Verzeichnis %1 existiert nicht ExportSongDialog_UI Alt+C Alt+C &Export &Exportieren Alt+E Alt+E &Browse... &Durchsuchen... Alt+B Alt+B &Close &Schließen Samplerate in Hz: Samplerate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Sampletiefe in Bit: 8 8 16 16 24 24 32 32 Templates: Vorlagen: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in CD Qualität "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in ADAT Qualität "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV in besserer Qualität "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV in geringster Qualität "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV beste Qualität "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in CD Qualität "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in ADAT Qualität "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF in besserer Qualität "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" FLAC verlustfreie Kompression in guter Qualität "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis verlustbehaftete Kompression in guter Qualität "VBR" Interpolation: Interpolation: Choose type of interpolation methode Wähle eine Interpolationsmethode Linear Linear Cosine Cosinus Third Dritte (Third) Cubic Kubisch Hermite Hermitisch Enable tempo changing Erlaube Tempoänderungen TimeLine BPM Zeitstrahl BPM 88200 88200 Enable use of rubberband's batch processor Benutze Rubberbands Batchverarbeitung Rubberband Batch Rubberband Batch Dialog Dialog Export directory: Export Verzeichnis: Modus: Modus: Choose type of interpolation method Wähle Art der Interpolationsmethode FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off FX an/aus Master output Master-Ausgang H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Eigenschaften der Soundbibliothek &Ok &OK &Cancel &Abbrechen This is not possible, you can only save changes inside instruments to the current loaded sound library Nicht möglich. Es lassen sich nur Änderungen an Instrumenten innerhalb der aktuell verwendeten Soundbibliothek speichern. Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Achtung! Bei Änderungen des Schlagzeugnames wird ein neues Schlagzeug eben jenes Namens erstellt. Bist Du sicher? Saving of this drumkit failed. Speichern des Schlagzeugs ist fehlgeschlagen. Open Image Öffne Bild Image Files (*.png *.jpg *.jpeg) Bilddatei (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Schlagzeug geladen: [%1] Song Editor Song-Editor Instrument + Pattern Instrument + Pattern Mixer Mixer modified geändert Song saved. Song gespeichert. InstrumentEditor Show instrument properties Eigenschaften des Instruments anzeigen Show layers properties Eigenschaften der Ebene anzeigen Random pitch factor Grad der zufälligen Tonhöhe Filter Cutoff Cutoff des Filters Filter resonance Resonanz des Filters Attack Attack Decay Dämpfung (decay) Sustain Sustain Release Freigabe (release) Layer gain Verstärkung (gain) der Ebene New instrument name Neuer Name für das Instrument Instrument gain Verstärkung (gain) des Instruments Layer pitch (Coarse) Tonhöhe der Ebene (grob) Layer pitch (Fine) Tonhöhe der Ebene (fein) General Übersicht Layers Ebene Stop the current playing instrument-note before trigger the next note sample. Beende das Spielen der altuellen Note des Instruments bevor die nächste beginnt. New component name Neuer Komponentenname Component name Komponentenname Midi out channel Kanal des Midi-Ausgabe Midi out note Note der Midi-Ausgabe Component volume Lautstärke der Komponente Don't change the layers' gain based on velocity Entkoppel die der Lautstärke der Ebene und ihre Anschlag (velocty) Select pattern size Patternlänge wählen InstrumentLine Clear notes Noten löschen Randomize velocity Zufälliger Anschlag (velocity) Delete instrument Instrument löschen Fill notes ... Noten einfügen ... Fill all notes (1/1) Füge alle Noten ein Fill 1/2 notes (1/2) Füge jede zweite Note ein Fill 1/3 notes (1/3) Füge jede dritte Note ein Fill 1/4 notes (1/4) Füge jede vierte Note ein Fill 1/6 notes (1/6) Füge jede sechste Note ein Fill 1/8 notes (1/8) Füge jede achte Note ein Mute instrument Schalte Instrument stumm Solo Solo Copy notes ... Noten kopieren ... Only for this pattern Nur für dieses Pattern For all patterns Für alle Pattern Paste notes ... Noten einfügen ... Rename instrument Instrument umbenennen New instrument name Neuer Name für das Instrument Fill 1/12 notes (1/12) Füge jede zwölfte Note ein Fill 1/16 notes (1/16) Füge jede sechzehnte Note ein InstrumentRack Show Instrument editor Instrumenteneditor anzeigen Instrument Instrument Show sound library Soundbibliothek anzeigen Sound library Soundbibliothek LadspaFXMixerLine Edit FX parameters Effektparameter bearbeiten FX bypass Effekt umgehen (bypass) Ladspa FX name LADSPA-Effektname Effect return Effekt-Return LadspaFXProperties Select FX Effekt wählen [%1] LADSPA FX Properties [%1] Eigenschaften des LADSPA-Effekts LADSPA FX %1 Properties Eigenschaften des LADSPA-Effekts %1 No plugin Kein Plugin Activate Aktivieren Deactivate Deaktivieren Remove FX Effekt löschen LadspaFXSelector Groups Gruppen Stereo Stereo Mono Mono Not supported Nicht unterstützt Select LADSPA FX LADSPA-Effekt wählen Recently Used Zuletzt benutzt Alphabetic List Alphatisch Categorized Kategorisiert LadspaFXSelector_UI Form1 Formular 1 ### fx label ### Effekt-Label ### fx type ### Effekt-Typ ### fx ID ### Effekt-ID &Cancel &Abbrechen Alt+C Alt+C &OK &OK Alt+O Alt+O 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 ### Effekt-Name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Typ:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Autor:</span></p></body></html> ### FX maker 1 2 ### Effekt-Autor 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### Copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Dec. = %1 MIDI = %2 MainForm &Save &Speichern &Discard Änderungen &verwerfen Cancel Abbrechen Error loading song. Fehler beim Laden des Songs. Hydrogen Ready. Hydrogen ist bereit. Save song Song speichern Open song Song öffnen &New &Neu &Open &Öffnen Open &Demo &Demo öffnen Open &recent Zuletzt &geöffnete Export &MIDI file &Mididatei exportieren &Preferences &Einstellungen &Quit &Beenden Show &audio engine info Informationen zur &Audio-Engine anzeigen &User manual &Handbuch &About &Über Hydrogen &Cancel &Abbrechen Unknown audio driver Unbekannter Audiotreiber Error starting audio driver Fehler beim Starten des Audiotreibers Jack driver: server shutdown JACK: Server heruntergefahren Jack driver: cannot activate client JACK: Konnte Klienten nicht aktivieren Jack driver: cannot connect output port JACK: Keine Verbindung zum Ausgangsport möglich Jack driver: error in port register JACK: Fehler im Portregister &Export song Song &exportieren De&bug De&bug Save &as... Speichern &unter... &Mixer &Mixer &Instrument Rack &Instrumenten Rack Print Objects Objekte ausgeben &Info &Info Song saved. Lied gespeichert. Unknown error %1 Unbekannter Fehler %1 Clear all instruments? Alle Instrumente löschen? Ok OK You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Du benutzt eine Entwicklerversion von Hydrogen. Bitte hilf uns, in dem Du Fehler oder Verbesserungsvorschläge der hydrogen-devel Mailingliste meldest.<br><br>Danke! Could not save song. Der Song konnte nicht gespeichert werden. Open &Pattern Öffne &Pattern Save Pattern as ... Speichere Pattern als... Pattern saved. Pattern gespeichert. Open Pattern Öffne Pattern Don't show this message anymore Diese Nachricht nicht mehr anzeigen Playlist: Set song No. %1 Wiedergabeliste: Song %1 Show &info &Information anzeigen Expor&t pattern as... Expor&tiere Pattern als... I&nstruments I&nstrumente &Add instrument Instrument &hinzufügen &Clear all &Alle löschen Playlist &editor Wiedergabe&liste editieren Info|About Song saved as. Lied gespeichert als. Playlist: Song No. %1 Playlist: Song Nr. %1 Could not export pattern. Pattern konnte nicht exportiert werden. The document contains unsaved changes. Do you want to save the changes? Das Dokument enthält ungespeicherte Änderungen. Willst Du die Änderungen speichern? Director Dirigent Undo history Historie rückgängig machen &Undo Rückgängig machen menu Undo Rückgängig machen Redo Wiederherstellen Input mode Eingabe Modus Instrument Instrument Drumkit Schlagzeug Report bug Fehler melden Export &LilyPond file Exportiere &LilyPond Datei Donate Spenden LilyPond file (*.ly) LilyPond Datei (*.ly) Export LilyPond file Exportiere LilyPond Datei The current playlist contains unsaved changes. Do you want to discard the changes? Die aktuelle Wiedergabeliste enthält ungesicherte Änderungen. Möchtest Du diese speichern? Pro&ject Pro&jekt New Neu Open Öffnen Properties Eigenschaften Save Speichern Save As Speichern als Export Exportieren Import Importieren Online import Online importieren Add component Komponente hinzufügen Component name Komponentenname Saving of this library failed. Speichern der Bibliothek ist fehlgeschlagen. Drum&kits Schlagzeuge &View Fenster &Automation path Automatisierungspfad Full screen Vollbild &Options Optionen MIDI setup advice Hinweise zur MIDI-Einrichtung MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Es wurden keine MIDI Noten für dieses Schlagzeug eingerichtet. Daher wird der Export als MIDI-Datei scheitern. Möchtest Du dies automatisch beheben, indem die Standardwerte zugewiesen werden? Set default values Standardwerte setzen The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. Der LilyPond-Export ist ein experimentelles Feature. Sobald du das GM-kit (Schlagzeug) verwendest und keine Triolen benutzt, sollte es aber reibungslos funktionieren. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead OSC Server: Konnte nicht zum ausgewählten Port verbinden, verwende stattdessen temporären Port Retrieving information about drumkit '%1' failed: drumkit does not exist. Konnte keine Information zu Schlagzeug '%1' abrufen: Schlagzeug existiert nicht. MasterMixerLine Set master volume [%1] LCD Panel, do not use any umlaut! Master-Lautstaerke [%1] Swing Swing Humanize time Zeitpunkt vermenschlichen Humanize velocity Anschlag (velocity) vermenschlichen Set humanize time parameter [%1] Setzen des vermenschlichten Zeitpunkt-Parameters [%1] Set humanize velocity parameter [%1] Setzen des vermenschlichten Anschlag-Parameters [%1] Set swing factor [%1] Swingfaktor [%1] MidiSenseWidget This element is not midi operable. Dieses Element kann nicht per MIDI angesprochen werden. Waiting for midi input... Warte auf MIDI Eingabe... MidiTable Event Ereignis Param. Param. Action Aktion press button to record midi event Knopf drücken, um Midi-Event aufzunehmen Mixer Show FX panel Effekte anzeigen Show instrument peaks Peaks anzeigen Show instrument peaks = On Peaks anzeigen = aktiviert Show instrument peaks = Off Peaks anzeigen = deaktiviert Set FX %1 level Effekt-Intensität %1 Set LADSPA FX ( %1 ) volume LADSPA-Effekt-Lautstärke (%1) LADSPA effects are not available in this version of Hydrogen. LADSPA-Effekte stehen in dieser Hydrogenversion nicht zur Verfügung. Mixer Mixer MixerLine Play sample Sample abspielen Mute Stumm Solo Solo Pan Pan Instrument name (double click to edit) Instrumentname (Doppelklick zum Ändern) Set instrument volume [%1] Instrumentenlautstärke [%1] Set instr. pan [%1] Panorama für Instrument [%1] PatternEditorPanel Hear new notes Neue Noten hören Hear new notes = On Neue Noten hören = aktiviert Hear new notes = Off Neue Noten hören = deaktiviert Pattern editor - %1 Pattern-Editor - %1 Quantize keyboard/midi events to grid Tastatur/Midi-Eingaben ins Raster quantisieren Quantize incoming keyboard/midi events = On Tastatur/Midi-Eingaben quantisieren = aktiviert Quantize incoming keyboard/midi events = Off Tastatur/Midi-Eingaben quantisieren = deaktiviert Zoom in Vergrößern Zoom out Verkleinern Is not possible to change the pattern size when playing. Während des Abspielens kann die Patternlänge nicht verändert werden. Select pattern size Patternlänge wählen Select grid resolution Gitterauflösung wählen No pattern selected Kein Pattern ausgewählt Select note properties Eigenschaften der Note wählen Velocity Anschlag (velocity) Pan Pan Lead and Lag Vorlauf (lead) und Verzögerung (lag) Loaded Soundlibrary Geladene Soundbibliothek NoteKey NoteKey destructive mode pre delete settings Invasiver Modus vor dem Löschen destructive mode post delete settings Invasiver Modus nach dem Löschen Show piano roll editor Piano-Roll anzeigen Show drum editor Schlagzeug-Editor anzeigen Probability Wahrscheinlichkeit PatternFillDialog Fill with selected pattern Mit ausgewähltem Pattern füllen PatternFillDialog_UI Form 1 Formular 1 &Fill &Füllen Alt+F Alt+F &Clear &Löschen Alt+C Alt+C To: An: From: Von: Cancel Abbrechen OK OK PatternPropertiesDialog Pattern properties Pattern-Eigenschaften %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI Form1 Formular 1 &Cancel &Abbrechen Alt+C Alt+C &OK &OK Alt+O Alt+O New Pattern Name Neuer Pattern-Name Pattern category Pattern-Kategorie Pattern description Pattern-Beschreibung PlayerControl Stop Stopp Song Mode Songmodus Playing. Spielt ab. Stopped. Gestoppt. Song mode selected. Songmodus gewählt. Pattern Mode Patternmodus Pattern mode selected. Patternmodus gewählt. Jack-transport on/off JACK-Transport an/aus Jack-transport mode = On JACK-Transport = aktiviert Jack-transport mode = Off JACK-Transport = deaktiviert New BPM value Neuer BPM-Wert Rewind Zurückspulen Play/ Pause Play/Pause Fast Forward Vorspulen Pause. Pause. JACK-transport will work only with JACK driver. JACK-Transport funktioniert nur mit einem JACK-Treiber. Loop song Song wiederholen Loop song = On Song wiederholen = aktiviert Loop song = Off Song wiederholen = deaktiviert Show mixer Mixer anzeigen Mixer Mixer Show Instrument Rack Instrumenten Rack anzeigen Instrument rack Instrumenten Rack BeatCounter Panel on Beatcounter sichtbar Set BPM / Set BPM and play Setze Geschwindigkeit / Setze Geschwindigkeit und spiele ab Jack-Time-Master on/off Jack Time Master an/aus BC Panel on Takt Zähler Anzeige sichtbar BC Panel off Takt Zähler Anzeige aus Count BPM and start PLAY Zähle Takte und spiele ab Count and set BPM Zähle Takte setze BPM Jack-Time-Master mode = On Jack Time Master Betrieb = aktiviert Jack-Time-Master mode = Off Jack Time Master Betrieb = deaktiviert Record Aufnehmen Destructive Record Invasives Aufnehmen Record midi events = On Midi-Eingaben aufnehmen = aktiviert Record midi events = Off Midi-Eingaben aufnehmen = deaktiviert Destructive mode = Off Invasiver Modus = deaktiviert Destructive mode = On Invasiver Modus = aktiviert Recalculate Rubberband modified samples if bpm will change Berechne Samples neu, welche mit Rubberband verändert wurden, sobald die BPM verändert werden Recalculate all samples using Rubberband ON Alle Samples mit Rubberband neu berechnen = aktiviert Recalculate all samples using Rubberband OFF Alle Samples mit Rubberband neu berechnen = aktiviert Switch metronome on/off Metronom An/Aus PlaylistDialog Song list Liste der Lieder Script Skript exec Script Skript ausführen Add Song to PlayList Lied zur Wiedergabeliste hinzufügen No Song selected! Kein Lied ausgewählt! Load Playlist Lade Wiedergabeliste Save Playlist Speichere Wiedergabeliste No Song in List or no Song selected! Kein Lied in der Liste oder keins ausgewählt! Hydrogen Playlist (*.sh) Hydrogen Wiedergabeliste (*.sh) Add Script to selected Song Skript zu ausgewähltem Lied hinzufügen No Script in use! Kein Skript in Verwendung! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Kein Standard-Editor definiert. Bitte wähle Deinen Standard-Editor aus. Konsolen-basierte Editoren werden noch nicht unterstützt. Set your Default Editor Wähle Deinen Standard-Editor No Script selected! Kein Skript ausgewählt! Error loading song. Fehler beim Laden des Liedes. sort sortieren New Script Neues Skript Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Der Pfad zum Skript oder der Skriptname darf keine Leerzeichen enthalten. No Script! Kein Skript! &Playlist Wiedergabeliste Add song to Play&list Lied zur Wiedergabeliste hinzufügen Add &current song to Playlist Aktuelles Lied zur Wiedergabeliste hinzufügen &Remove selected song from Playlist Aktuelles Lied zur Wiedergabeliste entfernen &Open Playlist Öffne Wiedergabeliste &Save Playlist &Speichere Wiedergabeliste Save Playlist &as Speichere Wiedergabeliste &als &Scripts &Skripte &Add Script to selected song Skript zum ausgewählten Lied hinzufügen &Edit selected Script &Editiere ausgewähltes Skript &Remove selected Script Entferne ausgewähltes Skript &Create a new Script Neues Skript erstellen Rewind Zurückspulen Play/ Pause/ Load selected song Wiederhabe / Pause/ Lade ausgewähltes Lied Stop Stopp Fast Forward Vorspulen Please save your song first Bitte speichere Dein Lied erst WARNING, the new file is executable by the owner of the file! Achtung! Die neue Datei kann vom Besitzer ausgeführt werden. Pause. Pause. Playlist Browser Wiedergabelisten-Browser Playlist: set song no. %1 Wiedergabeliste: Lied Nr. %1 no Script kein Skript &New Playlist Neue Wiedergabeliste File not found: Datei nicht gefunden: No valid song selected! Kein gültiges Lied ausgewählt! The current playlist contains unsaved changes. Do you want to discard the changes? Die aktuelle Wiedergabeliste enthält nicht-gespeicherte Änderungen. Möchtest Du diese verwerfen? &Discard Änderungen &verwerfen &Cancel &Abbrechen Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Der Pfad zum Skript oder der Skriptname darf keine Leerzeichen enthalten. PlaylistDialog_UI PlayList Browser Wiedergabelisten-Browser Song list Lied Liste PreferencesDialog Slow Langsam Normal Normal Fast Schnell <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>einfacher Audiotreiber [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Nicht kompiliert</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit</b><br>Niedriglatenztreiber Preferences Einstellungen <b>ALSA Driver</b><br> <b>ALSA-Treiber</b><br> <b>PortAudio Driver</b><br> <b>PortAudio-Treiber</b><br> <b>CoreAudio Driver</b><br> <b>CoreAudio Treiber</b><br> Please restart hydrogen to enable/disable LASH support Bitte starte Hydrogen neu, um die LASH-Unterstützung zu aktivieren/deaktivieren Driver restart required. Restart driver? Treiber-Neustart notwendig. Soll der Treiber nun neu gestartet werden? &Ok &OK &Cancel &Abbrechen Automatic Automatisch Steps Schritte Fixed Unveränderlich <b>PulseAudio Driver</b><br> <b>PulseAudio-Treiber</b><br> Number of steps Anzahl der Schritte Color (Hue value) Farbe (hue) Automatic driver selection <br><b> <br><b> </b> selected </b> selected PreferencesDialog_UI Sample rate Samplerate 44100 44100 48000 48000 Buffer size Puffergröße Device Audiogerät Input Eingang Channel Kanal All Alle 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Meters falloff speed Peak-Abfallgeschwindigkeit Slow Langsam Normal Normal Fast Schnell Application font Anwendungs-Schriftart Mixer font Mixer-Schriftart Select font Schriftart wählen ### ### Form1 Formular 1 Polyphony Polyphonie Style Stil &Cancel &Abbrechen Alt+C Alt+C &OK &OK Alt+O Alt+O &General &Generell Alt+R Alt+R Audio &System Audio&system Metronome volume Metronomlautstärke Connect to &Default Output Pair Mit &voreingestelltem Ausgang verbinden Alt+D Alt+D 88200 88200 96000 96000 &Midi System &Midi-System Midi driver Midi-Treiber Ignore note-off 'Note-off' ignorieren &Appearance &Erscheinungsbild &Reopen last used song &Zuletzt geöffnetes Lied öffnen Restart output Output-Treiber neu starten Audio output details Details des Audio-Ausgangs Post-Fader Post-Fader Pre-Fader Pre-Fader Track output Spur-Ausgang Use lash Lash benutzen first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Zuerst, justiere die Zeitdifferenz zwischen Tastatur-/Controller-Anschlägen und den von Hydrogen errechneten BPM-Werten Beat counter drift compensation in 1/10 ms Takt-Zähler-Kompensation in 1/10 ms Beat counter start offset in ms Takt-Zähler-Startverzögerung in ms Path to the Rubberband command-line utility Pfad zum Rubberband Kommondozeilen-Programm Maximum number of bars Maximale Anzahl an Takten &Reopen last used playlist &Zuletzt benutzte Wiedergabeliste wiederherstellen Interpolate resampling Resampling interpolieren Linear Linear Cosine Cosinus Third Dritte (Third) Cubic Kubisch Hermite Hermitisch Default interface layout Standard Schnittstellen-Layout Single pane Einfacher Ausschnitt Tabbed Tabular TextLabel Text-Label Coloring method for Song Editor elements Farbgebung für Elemente des Lied-Editors <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">Nachdem die Schriftart oder Farbe der Schnittstelle verändert wurde, muss die Anwendung neugestartet werden.</span></p></body></html> Use relative paths for playlist Relative Pfade in der Wiedergabeliste nutzen Use output note as input note Ausgabe-Note als Eingabe-Note nutzen Discard midi messages after action has been triggered Verwerfe Midi-Nachrichten, nachdem die Aktion zugelöst wurde Create per-instrument outputs Erzeuge Ausgänge für jedes einzelne Instrument Enable feedback Rückkopplung aktivieren &OSC &OSC &Enable OSC support &OSC-Unterstützung aktivieren Incoming port Eingangs-Port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Port, welcher von eingehenden OSC-Nachrichten genutzt wird</p></body></html> Enable OSC &feedback Aktiviere OSC-Feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback Aktiviere Midi Feedback SampleEditor &Ok &OK &Cancel &Abbrechen Close dialog! maybe there is some unsaved work on sample. Are you sure? Schließe Fenster. Möglicherweise sind noch ungespeicherte Änderungen in diesen Samplen. Bist Du sicher? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Dialog P&lay original sample Spie&le Original &Apply Changes &Anwenden &Close &Schließen Adjust sample start frame Justiere Sample-Start Adjust sample loop begin frame Justiere den Sample-Loop-Anfang set processing Sample-Verarbeitung einstellen forward vorwärts reverse rückwärts pingpong hin und her loops Wiederholungen Adjust sample end & loop end frame Justiere Sample-Ende & Wiederholungs-Ende &Play &Abspielen new sample length: Neue Sample-Länge: fade-out type Art der Ausblendung (fade-out) volume Lautstärke panorama Panorama Sample length to beat: Sample-Länge zu Beat: off aus 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Verändere die Tonhöhe des Samples in Prozent Crispness: Cripsness (Knusprigkeit) 0 0 Start Start Loop Wiederholung <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Wiederholung</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Modus</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Wiederholung</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Zähler</span></p></body></html> End Ende "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Rubberband Audio-Processor" : Ändere das Tempo (Länge der Sample) und die Tonhöhe des Audiosignals. Pitch (Semitone,Cent) Tonhöhe (Halbton,Prozent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness (Knusprigkeit)":</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 äquivalent zu --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 äquivalent zu --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 äquivalent zu --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 äquivalent zu --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 Standard-Verarbeitungsoptionen</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 äquivalent zu --no-lamination --window-short (könnte gut fürs Schlagzeug sein)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier kannst Du weiterführende Informationen finden:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Handbuch Welcome to Hydrogen Willkommen in Hydrogen Don't show this message anymore Diese Nachricht nicht mehr anzeigen Ok OK Documentation index Index der Dokumentation SongEditorPanel Create new pattern Neues Pattern Move the selected pattern down Verschiebe ausgewähltes Pattern nach unten Move the selected pattern up Verschiebe ausgewähltes Pattern nach oben Clear pattern sequence Pattern löschen Song Editor Lied-Editor Select mode Auswahlmodus Draw mode Zeichenmodus Warning, this will erase your pattern sequence. Are you sure? Achtung, dieser Vorgang wird das Pattern löschen. Fortsetzen? &Ok &OK &Cancel &Abbrechen stacked mode gestapelter Modus stacked pattern mode Gestapelter Pattern-Modus single pattern mode Einfacher Pattern-Modus Enable time line edit Zeitstrahl-Editor aktivieren Pattern %1 Pattern %1 View playback track Wiedergabetrack anzeigen Mute playback track Wiedergabetrack stumm schalten Choose playback track Wiedergabetrack wählen View timeline Zeitstrahl anzeigen Adjust parameter values in time Zeitliche Parameterwerte anpassen Velocity Anschlag (velocity) Timeline usage is disabled in the presence of an external JACK timebase master Die Verwendung der Timeline ist deaktiviert, solange JACK als timebase master verwendet wird. SongEditorPanelBpmWidget_UI Form Formular Edit the bpm value for current beat BPM des aktuellen Beats bearbeiten 500,55 500,55 Edit beat in timeline Beat in Zeitstrahl bearbeiten 500 500 Bar Bar BPM BPM Delete this BPM Marker Diese BPM Markierung löschen Delete BPM Marker BPM Markierung löschen Cancel Abbrechen Ok OK SongEditorPanelTagWidget_UI Form Formular Tag Etikett Cancel Abbrechen Ok OK SongEditorPatternList Copy Kopieren Delete Löschen Properties Eigenschaften Fill/Clear ... Füllen/Löschen Save Pattern Speichere Pattern Load Pattern Lade Pattern Open Pattern Öffne Pattern Virtual Pattern Virtuelles Pattern Pattern 1 Pattern 1 not_categorized nicht_kategorisiert The pattern-file exists. Overwrite the existing pattern? Die Pattern-Datei existiert bereits. Soll sie überschrieben werden? &Ok &OK &Cancel &Abbrechen Export Pattern Exportiere Pattern Could not export pattern. Pattern konnte nicht exportiert werden. Could not export sequence. Pattern saved. Pattern gespeichert. SongPropertiesDialog Song properties Lied-Eigenschaften SongPropertiesDialog_UI Form1 Formular 1 Notes Notizen Author Autor Song name Lied-Name &Cancel &Abbrechen Alt+C Alt+C &OK &OK Alt+O Alt+O License Lizenz SoundLibraryExportDialog Export Sound Library Soundbibliothek exportieren Directory Verzeichnis SoundLibraryExportDialog_UI Dialog Dialog Export Exportieren Drumkit Schlagzeug Component Komponente Path Pfad Version Version Browse... Durchsuchen... 0.9.7 and higher 0.9.7 und höher 0.9.6 and lower 0.9.6 und niedriger Cancel Abbrechen SoundLibraryImportDialog Sound Library import Soundbibliothek importieren Sound library Soundbibliothek Status Status Updating SoundLibrary list... Liste der Soundbibliotheken wird aktualisiert... Installed Installiert New Neu Author: %1 Autor: %1 Downloading SoundLibrary... Lade Soundbibliothek herunter... SoundLibrary imported in %1 Soundbibliothek importiert in %1 An error occurred importing the SoundLibrary. Ein Fehler trat beim Importieren der Soundbibliothek auf. Import drumkit Schlagzeug importieren Drumkits Schlagzeuge Songs Lieder Patterns Pattern Drumkit License: %1 Schlagzeug-Lizenz: %1 Image License: %1 Bild-Lizenz: %1 SoundLibraryImportDialog_UI Dialog Dialog Internet Internet Update list Liste aktualisieren Sound Library Name Name der Soundbibliothek Author... Autor... Download and install Herunterladen und installieren Local file Lokale Datei Browse... Durchsuchen... Install Installieren 1 1 Edit server list Bearbeite Server-Liste Close Schliessen TextLabel Textlabel Image License... Bild-Lizenz... Drumkit License... Schlagzeug-Lizenz... SoundLibraryOpenDialog Open Sound Library Öffne Soundbibliothek Load Laden Cancel Abbrechen SoundLibraryPanel Load Laden Export Exportieren Delete Löschen System drumkits Schlagzeuge des Systems User drumkits Schlagzeuge des Benutzers &Ok &OK &Cancel &Abbrechen Songs Lieder Patterns Pattern Error loading song. Fehler beim Laden des Liedes. Properties Eigenschaften Warning, the selected pattern will be deleted from disk. Are you sure? Achtung! Das ausgewählte Pattern wird von der Festplatte gelöscht werden. Bist Du sicher? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Das aktuell geladene Schlagzeug kann nicht gelöscht werden: "%1". Um es dennoch zu löschen, muss zuerst ein anderes geladen werden. "%1"is a system drumkit and can't be deleted. "%1" ist ein Schlagzeug des Systems und kann nicht gelöscht werden. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Achtung! Das Schlagzeug "%1" wird von der Festplatte gelöscht. Bist Du sicher? Drumkit deletion failed. Löschen des Schlagzeuges ist fehlgeschlagen. Keep Behalten The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Das vorhandene Schlagzeug beinhaltet %1 Instrumente. Das Neue dagegen %2. Die ersten %2 Instrumente werden mit den neuen Instrumenten ersetzt und behalten ihre Noten. Aber auch einige der übrigen Instrument beinhalten Noten. Willst Du diese verwerfen oder behalten? Double click to expand the list Doppelklick zum Aufblättern der Liste SoundLibraryPropertiesDialog_UI Dialog Dialog Name Name Author Autor Information Information Save Speichern Cancel Abbrechen Save changes made to instruments into sound library Änderungen an den Instrumenten übernehmen Drumkit License Schlagzeug-Lizenz Image Bild Browse Durchsuchen Image License Bild-Lizenz SoundLibraryRepositoryDialog Edit repository settings Bearbeite Repository-Einstellungen Edit server list Bearbeite Server-Liste URL URL SoundLibraryRepositoryDialog_UI Dialog Dialog Add Hinzufügen Delete Löschen SoundLibrarySaveDialog Save Sound Library Soundbibliothek speichern Please supply at least a valid name Bitte gültigen Dateinamen angeben A library with the same name already exists. Do you want to overwrite the existing library? Es gibt bereits ein Bibliothek mit diesem Namen. Soll sie überschrieben werden? Saving of this library failed. Speichern der Bibliothek ist fehlgeschlagen. Open Image Bild öffnen Image Files (*.png *.jpg *.jpeg) Bild-Dateien (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Dialog Name Name Author Autor Information Information Cancel Abbrechen License Lizenz Save Speichern Image Bild Browse Durchsuchen Image License Bild-Lizenz SoundLibraryTree Sound library Soundbibliothek VirtualPatternDialog Select virtual pattern Virtuelles Pattern auswählen VirtualPatternDialog_UI Dialog Dialog OK OK Cancel Abbrechen hydrogen-1.0.0-rc1/data/i18n/hydrogen_el.ts000066400000000000000000004546361366722712400204050ustar00rootroot00000000000000 AboutDialog About Σχετικά με <b>Website</b><br> <b>Ιστότοπος</b><br> <b>Project page</b><br> <b>Σελίδα του εγχειρήματος</b><br> <b>Main coder and maintainer:</b><br> <b>Κύριοι προγραμματιστές και συντηρητές:</b><br> <b>Thanks to:</b> <b>Ευχαριστίες στους:</b> <b>Development mailing list</b><br> <b>Κατάστιχο ηλεκτρονικού ταχυδρομείου ανάπτυξης</b><br> AboutDialog_UI About Hydrogen Σχετικά με το Hydrogen A&bout Σχετικά &με... &Authors &Δημιουργοί &License &Άδεια &OK &Εντάξει Alt+O Alt+O ### ### AudioEngineInfoForm Audio Engine Info Πληροφορίες Μηχανής Ήχου AudioEngineInfoForm_UI Playing notes Αναπαραγωγή μουσικών στιγμάτων Process time Χρόνος επεξεργασίας Audio engine state Κατάσταση της μηχανής ήχου Song state Κατάσταση του τραγουδιού Buffer size Μέγεθος της μικραποθήκευσης Sample rate Ρυθμός δειγματοληψίας Song position Θέση του τραγουδιού Patterns Μήτρες Selected pattern Επιλεγμένες μήτρες Selected instrument Επιλεγμένο όργανο Connected to Συνδεμένο σε Form1 Προμόρφωμα1 ### ### Frames Καρέ Ticks Τίκια Sampler Δειγματιστής Synth Συνθέτης Sequencer Συχνοτιστής MIDI input Εισαγωγή ΜΙΝΤΙ Name Όνομα Audio output Εξαγωγή ήχου Realtime frames Καρέ πραγματικού χρόνου AudioFileBrowser Audio File Browser Πλοηγός Αρχείων Ήχου Size: %1 bytes Μέγεθος: %1 μπάιτια Samplerate: %1 Ρυθμός δειγματοληψίας:%1 Sample length: Διάρκεια δείγματος: s Please do not preview samples which are longer than 10 minutes! Παρακαλώ, μην προ-ακούς δείγματα τα οποία είναι μεγαλύτερα των 10 λεπτών. Name: Όνομα: Size: Μέγεθος: Samplerate: Ρυθμός δειγματοληψίας: Sample length: Διάρκεια δείγματος: Unable to load that sample file. AudioFileBrowser_UI Dialog Διάλογος Open Άνοιγμα Name: Όνομα: Samplerate: Ρυθμός δειγματοληψίας: Size: Μέγεθος: Length: Διάρκεια: Cancel Ακύρωση Pla&y samples by clicking Αναπαραγωγή των δειγμάτων με &κλικάρισμα &Up &Επάνω &Home &Αρχική &Play Sample Αναπαραγωγή &Δείγματος &Filename to instrument name &Το όνομα αρχείου στο όνομα του οργάνου &Stop &Σταμάτημα View hidden folders Εμφάνιση των κρυφών αρχείων Be careful, this change all Layer velocity settings Προσοχή: αυτό αλλάζει τις ρυθμίσεις της ταχύτητας σε όλα τα Επίπεδα Set automatic velocity Αυτόματη ταχύτητα ComponentMixerLine Mute Σίγηση Solo Μόνο του Component name Όνομα του συστατικού Set instrument volume [%1] Όρισε την ένταση του οργάνου [%1] Director Director Ενορχηστρωτής Director_UI Dialog Διάλογος DonationDialog Donations Δωρεές DonationDialog_UI Form Έντυπο Donate! Να γίνει δωρεά! Choose random entry. Επέλεξε τυχαία εισαγωγή. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Το Υδρογόνο είναι ένα εγχείρημα ανοιχτής πηγής, το οποίο αναπτύσσεται με την εργασία πολλών ανθρώπων, στον διαθέσιμο χρόνο τους. Κάνοντας μια δωρεά, θα μπορέσεις να πεις ένα &quot;Ευχαριστώ!&quot; σε όσους εμπλέκονται.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Σεμπάστιαν Μουρ (Sebastian Moors· γνωστός ως mauser): Συντηρητής / Προγραμματιστής Michael Wolkstein (aka wolke): Forum hosting Μάικλ Γουολκστέιν (Michael Wolkstein γνωστός ως wolke): Φιλοξενία του φόρουμ Download Importing item failed: %1 Αποτυχία εισαγωγής αντικειμένου: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 ΧίλιοΜπάιτια) - Εκτ.Χρ. %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Εξαγωγή αρχείου ΜΙΝΤΙ Directory %1 does not exists The file %1 exists. Overwrite the existing file? Το αρχείο % υπάρχει. Να επανωγραφεί; ExportMidiDialog_UI Dialog Διάλογος Filename &Browse... Εξε&ρεύνηση... Alt+B Alt+B Modus: &Export &Εξαγωγή Alt+E Alt+E &Close &Κλείσιμο Alt+C Alt+C ExportSongDialog Export song Εξαγωγή τραγουδιού Export to a single track Εξαγωγή σε ένα κανάλι Both Καί τα δύο The file %1 exists. Overwrite the existing file? Το αρχείο % υπάρχει. Να επανωγραφεί; Export to separate tracks Εξαγωγή σε ξεχωριστά κανάλια Directory %1 does not exists ExportSongDialog_UI &Export &Εξαγωγή &Browse... Εξε&ρεύνηση... &Close &Κλείσιμο Alt+C Alt+C Alt+E Alt+E Alt+B Alt+B Samplerate in Hz: Ρυθμός δειγματοληψίας σε Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Βάθος Δειγματοληψίας σε Μπίτια: 8 8 16 16 24 24 32 32 Templates: Προσχέδια: WAV in CD quality "44,1kHz, 16 bit PCM" WAV σε ποιότητα CD "44,1 χιλιοΧέρτζ, 16 μπίτια PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV σε ποιότητα ADAT "48 χιλιοΧέρτζ, 16 μπίτια PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV σε καλύτερη ποιότητα "48 χιλιοΧέρτζ, 24 μπίτια PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV LOFI "22.05 χιλιοΧέρτζ, 8 μπίτια PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV στην καλύτερη ποιότητα μείξης "96 χιλιοΧέρτζ, 32 μπίτια PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF σε ποιότητα CD "41 χιλιοΧέρτζ, 16 μπίτια PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF σε ποιότητα ADAT "48 χιλιοΧέρτζ, 16 μπίτια PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF σε καλύτερη ποιότητα "48 χιλιοΧέρτζ, 24 μπίτια PCM" FLAC lossless compressor in good quality "48 kHz" FLAC συμπίεση χωρίς απώλειες, με καλή ποιότητα "48 χιλιοΧέρτζ" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis συμπίεση με απώλειες, σε καλή ποιότητα "VBR" Interpolation: Επανασύνθεση: Choose type of interpolation methode Επέλεξε τη μέθοδο επανασύνθεσης Linear Γραμμική Cosine Συνημίτονου Third Τρίτη Cubic Κυβική Hermite Του Χερμάιτ Enable tempo changing Ενεργοποίηση της αλλαγής της ταχύτητας TimeLine BPM Χτ.ΑνάΛεπ. της Χρονογραμμής 88200 88200 Enable use of rubberband's batch processor Ενεργοποίηση της χρήσης του ομαδικού επεξεργαστή του Ράμπερμπανντ Rubberband Batch Ομαδική του Ράμπερμπανντ Dialog Διάλογος Export directory: Κατάλογος εξαγωγής: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 χιλιοΧέρτζ<br>%3 %4 FxMixerLine FX on/off FX ενεργά ή όχι Master output Κύρια εξαγωγή H2Core::SongEditorPanelBpmWidget BPM Χτ.ΑνάΛεπ. H2Core::SongEditorPanelTagWidget Tag Ετικέτα H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Ιδιότητες της Βιβλιοθήκης Ήχων This is not possible, you can only save changes inside instruments to the current loaded sound library Αυτό δεν είναι δυνατό. Μπορείς, μονάχα, να αποθηκεύσεις αλλαγές μέσα σε όργανα στην τωρινή φορτωμένη βιβλιοθήκη ήχων Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Προειδοποίηση: Η αλλαγή του ονόματος της ομάδας κρουστών, θα έχει σαν αποτέλεσμα τη δημιουργία μιας νέας ομάδας κρουστών, με αυτό το νέο όνομα. Είσαι σίγουρος; &Ok &Εντάξει &Cancel Α&κύρωση Saving of this drumkit failed. Αποτυχία αποθήκευσης αυτής της ομάδας κρουστών. Open Image Άνοιγμα Εικόνας Image Files (*.png *.jpg *.jpeg) Αρχεία Εικόνας (*.png *.jpg *.jpeg) HydrogenApp Song Editor Επεξεργαστής Τραγουδιού Instrument + Pattern Όργανο + Μήτρα Mixer Μείκτης Drumkit loaded: [%1] Φορτώθηκε η ομάδα κρουστών: [%1] modified μετατράπηκε Song saved. Το τραγούδι αποθηκεύτηκε. InstrumentEditor General Γενικά Show instrument properties Προβολή των ιδιοτήτων του οργάνου Layers Στρώματα Show layers properties Προβολή των ιδιοτήτων των στρωμάτων Random pitch factor Παράγοντας τυχαίας τονικότητας Filter Cutoff Αποκοπή Φίλτρου Filter resonance Αντήχηση φίλτρου Attack Decay Πτώση Sustain Διάρκεια Release Απελευθέρωση Instrument gain Ένταση οργάνου Stop the current playing instrument-note before trigger the next note sample. Σταμάτημα του τωρινού αναπαραγόμενου στίγματος του οργάνου, πριν την εκτέλεση του επόμενου δείγματος του στίγματος. Layer gain Ένταση στρώματος Layer pitch (Coarse) Τόνος στρώματος (Τραχύς) Layer pitch (Fine) Τόνος του στρώματος (Φίνος) New instrument name Όνομα του νέου οργάνου New component name Όνομα του νέου συστατικού Component name Όνομα του συστατικού Midi out channel Κανάλι εξόδου ΜΙΝΤΙ Midi out note Στίγμα εξόδου ΜΙΝΤΙ Component volume Ένταση του συστατικού Don't change the layers' gain based on velocity Να μην αλλάξει η ένταση του στρώματος βάση της ταχύτητας Select pattern size Επέλεξε το μέγεθος της μήτρας InstrumentLine Mute instrument Σίγηση οργάνου Solo Μόνο του Clear notes Καθάρισμα των στιγμάτων Fill notes ... Συμπλήρωμα στιγμάτων ... Fill all notes Συμπλήρωμα όλων των στιγμάτων Fill 1/2 notes Συμπλήρωμα 1/2 στιγμάτων Fill 1/3 notes Συμπλήρωμα 1/3 στιγμάτων Fill 1/4 notes Συμπλήρωμα 1/4 στιγμάτων Fill 1/6 notes Συμπλήρωμα 1/6 στιγμάτων Fill 1/8 notes Συμπλήρωμα 1/8 στιγμάτων Randomize velocity Τυχαίωση της ταχύτητας Delete instrument Διαγραφή οργάνου Copy notes ... Αντιγραφή στιγμάτων ... Only for this pattern Μόνο γι αυτή τη μήτρα For all patterns Για όλες τις μήτρες Paste notes ... Επικόλληση στιγμάτων ... Rename instrument Μετονομασία οργάνου New instrument name Όνομα του νέου οργάνου Fill 1/12 notes Συμπλήρωμα 1/12 στιγμάτων Fill 1/16 notes Συμπλήρωμα 1/16 στιγμάτων InstrumentRack Show Instrument editor Προβολή του επεξεργαστή οργάνου Instrument Όργανο Show sound library Προβολή της βιβλιοθήκης ήχων Sound library Βιβλιοθήκη ήχων LadspaFXMixerLine FX bypass Παράκαμψη FX Edit FX parameters Επεξεργασία των παραμέτρων FX Ladspa FX name Όνομα του Ladspa FX Effect return Επιστροφή του εφέ LadspaFXProperties Select FX Επιλογή FX Remove FX Απομάκρυνση FX Activate Ενεργοποίηση [%1] LADSPA FX Properties [%1] Ιδιότητες LADSPA FX Deactivate Απενεργοποίηση LADSPA FX %1 Properties LADSPA FX %1 Ιδιότητες No plugin Κανένα ένθεμα LadspaFXSelector Select LADSPA FX Επιλογή LADSPA FX Groups Ομάδες Alphabetic List Αλφαβητικό Κατάστιχο Categorized Ανά Κατηγορία Recently Used Πρόσφατα Χρησιμοποιημένα Stereo Στερεοφωνικά Mono Μονοφωνικά Not supported Δεν υποστηρίζονται LadspaFXSelector_UI &Cancel Α&κύρωση &OK &Εντάξει Form1 Προμόρφωμα1 Alt+C Alt+C Alt+O Alt+O ### fx label ### ετικέτα εφέ ### fx type ### τύπος εφέ ### fx ID ### εφέ ταυτότητα 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Όνομα:</span></p></body></html> ### fx name 1 ### όνομα εφέ 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ετικέτα:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Τύπος:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ταυτότητα:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Δημιουργός:</span></p></body></html> ### FX maker 1 2 ### δημιουργός εφέ 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Info|About Πληροφορίες|Σχετικά με... Hydrogen Ready. Το Υδρογόνο είναι έτοιμο. Undo history Ιστορικό αναιρέσεων &New &Νέο Show &info Προβολή Πληροφορ&ιών &Open Άν&οιγμα Open &Demo Άνοιγμα Επί&δειξης Open &recent Άνοιγμα &πρόσφατου &Save &Αποθήκευση Save &as... Αποθήκευση &ως... Open &Pattern Άνοιγμα &Μήτρας Expor&t pattern as... Εξαγωγή της μή&τρας ως... Export &MIDI file Εξαγωγή αρχείου &ΜΙΝΤΙ &Export song Ε&ξαγωγή τραγουδιού &Quit &Τερματισμός &Undo Α&ναίρεση menu Undo Αναίρεση Redo Ξαναφτιάξιμο I&nstruments Όργα&να &Add instrument &Προσθήκη όργανου &Clear all &Καθάρισμα όλων Playlist &editor &Επεξεργαστής Κατάστιχου αναπαραγωγής Director Ενορχηστρωτής &Mixer &Μείκτης &Instrument Rack Ραφ&ιέρα Οργάνων Input mode Λειτουργία Κατάστασης Εισαγωγής Instrument Όργανο Drumkit Ομάδα Κρουστών &Preferences &Προτιμήσεις De&bug Αποσ&φαλμάτωση Show &audio engine info Προβολή των πληροφοριών της μ&ηχανής ήχου Print Objects Εκτύπωση Αντικείμενων &Info &Πληροφορίες &User manual Εγ&χειρίδιο χρήσης &About &Σχετικά με... Report bug Αναφορά δυσλειτουργίας Save song Αποθήκευση του τραγουδιού Song saved as. Το τραγούδι αποθηκεύτηκε ως. Could not save song. Αδυναμία αποθήκευσης του τραγουδιού. Song saved. Το τραγούδι αποθηκεύτηκε. Save Pattern as ... Αποθήκευση της Μήτρας ως ... Could not export pattern. Αδυναμία εξαγωγής της μήτρας. Pattern saved. Αποθηκεύτηκε η μήτρα. Open song Άνοιγμα τραγουδιού Open Pattern Άνοιγμα Μήτρας Clear all instruments? Καθάρισμα όλων των οργάνων; Ok Εντάξει Cancel Ακύρωση Error loading song. Σφάλμα στο φόρτωμα του τραγουδιού. Unknown audio driver Άγνωστος οδηγός ήχου Error starting audio driver Σφάλμα στο ξεκίνημα του οδηγού ήχου Jack driver: server shutdown Οδηγός ΤΖΑΚ: τερματισμός λειτουργίας του εξυπηρετητή Jack driver: cannot activate client Οδηγός ΤΖΑΚ: αδυναμία ενεργοποίησης του πελάτη Jack driver: cannot connect output port Οδηγός ΤΖΑΚ: αδυναμία σύνδεσης της θύρας εξαγωγής Jack driver: error in port register Οδηγός ΤΖΑΚ: σφάλμα στην καταγραφή της θύρας Unknown error %1 Άγνωστο σφάλμα %1 Playlist: Set song No. %1 Κατάστιχο αναπαραγωγής. Όρισε το τραγούδι Αρ. %1 You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Χρησιμοποιείς μια δοκιμαστική έκδοση του Υδρογόνου. Μπορείς να μας βοηθήσεις αναφέροντας δυσλειτουργίες και προτάσεις στο κατάστιχο ηλεκτρονικού ταχυδρομείου ανάπτυξης του Υδρογόνου.<br><br>Εκ των προτέρων, σε ευχαριστούμε! Don't show this message anymore Να μην προβάλλεται αυτό το μήνυμα, από εδώ και πέρα Playlist: Song No. %1 Κατάστιχο αναπαραγωγής. Τραγούδι Νο. %1 The document contains unsaved changes. Do you want to save the changes? Αυτό το έγγραφο περιέχει μη αποθηκευμένες αλλαγές. Θέλεις να αποθηκεύσεις τις αλλαγές; &Discard Από&ρριψη &Cancel Α&κύρωση Export &LilyPond file Εξαγωγή αρχείου &ΛίλυΠονντ Donate Να γίνει δωρεά LilyPond file (*.ly) LilyPond αρχείο (*.ly) Export LilyPond file Εξαγωγή αρχείου ΛίλυΠονντ The current playlist contains unsaved changes. Do you want to discard the changes? Το παρών κατάστιχο αναπαραγωγής περιέχει μη αποθηκευμένες αλλαγές. Θέλεις να απορρίψεις τις αλλαγές; Pro&ject Ε&ργασία New Νέα Open Άνοιγμα Properties Ιδιότητες Save Αποθήκευση Save As Αποθήκευση Ως Export Εξαγωγή Import Εισαγωγή Online import Εισαγωγή μέσω δικτύου Add component Προσθήκη συστατικού Component name Όνομα του συστατικού Saving of this library failed. Αποτυχία αποθήκευσης αυτής της βιβλιοθήκης. Drum&kits Ομάδες &Κρουστών &View &Προβολή &Automation path &Διαδρομή αυτοματισμού Full screen Πλήρης οθόνη &Options &Επιλογές MIDI setup advice Συμβουλή ΜΙΝΤΙ στησίματος MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Η έξοδος στιγμάτων ΜΙΝΤΙ δεν έχει ρυθμιστεί γι αυτή την ομάδα κρουστών. Κατά συνέπεια, η προσπάθεια εξαγωγής αυτού του ΜΙΝΤΙ αρχείου ίσως να αποτύχει. Θα ήθελες το Υδρογόνο να διορθώσει αυτόματα αυτό το πρόβλημα, αναθέτοντας προεπιλεγμένες τιμές; Set default values Όρισε τις προεπιλεγμένες τιμές The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. Η εξαγωγή ΛίνυΠονντ είναι μία πειραματική λειτουργία. Θα πρέπει να τρέχει σαν νεράκι, υπό την προϋπόθεση ότι χρησιμοποιείς το GM-kit, και δεν χρησιμοποιείς τριάδες. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Humanize velocity Εξανθρωπισμός της ταχύτητας Humanize time Εξανθρωπισμός του χρόνου Swing Set master volume [%1] Όρισε την κύρια ένταση [%1] Set humanize time parameter [%1] Όρισε την παράμετρο εξανθρωπισμού του χρόνου [%1] Set humanize velocity parameter [%1] Όρισε την παράμετρο εξανθρωπισμού της ταχύτητας [%1] Set swing factor [%1] MidiSenseWidget This element is not midi operable. Αυτό το στοιχείο δεν είναι λειτουργίσιμο από το ΜΙΝΤΙ. Waiting for midi input... Αναμονή για το εισαγόμενο από το ΜΙΝΤΙ... MidiTable press button to record midi event πίεσε το πλήκτρο για να καταγράψεις τα ΜΙΝΤΙ γενόμενα Event Γενόμενο Param. Παράμ. Action Ενέργεια Mixer Show FX panel Προβολή του πλαίσιου των Εφέ Show instrument peaks Προβολή των κορυφών του οργάνου Set FX %1 level Όρισε το επίπεδου του FX %1 Show instrument peaks = On Προβολή των κορυφών του οργάνου = Ενεργό Show instrument peaks = Off Προβολή των κορυφών του οργάνου = Ανενεργό Set LADSPA FX ( %1 ) volume Όρισε την ένταση του LADSPA FX ( %1 ) LADSPA effects are not available in this version of Hydrogen. Τα εφέ LADSPA δεν είναι διαθέσιμα στην παρούσα έκδοση του Υδρογόνου. Mixer Μείκτης MixerLine Play sample Αναπαραγωγή δείγματος Mute Σίγηση Solo Μόνο του Pan Πανόψη Instrument name (double click to edit) Όνομα του όργανου (διπλό κλικ για επεξεργασία) Set instrument volume [%1] Όρισε την ένταση του οργάνου [%1] Set instr. pan [%1] PatternEditorPanel Loaded Soundlibrary Φορτωμένη Βιβλιοθήκη Ήχων Select pattern size Επέλεξε το μέγεθος της μήτρας Select grid resolution Επέλεξε την ανάλυση του πλέγματος Hear new notes Άκουσμα νέων στιγμάτων Quantize keyboard/midi events to grid Κβαντισμός των γενόμενων του πληκτρολόγιου ή του ΜΙΝΤΙ στο πλέγμα Show piano roll editor destructive mode pre delete settings καταστροφική κατάσταση λειτουργίας, πρότερη διαγραφή των ρυθμίσεων destructive mode post delete settings καταστροφική κατάσταση λειτουργίας, μετέπειτα διαγραφή των ρυθμίσεων Zoom in Εστίαση Zoom out Απεστίαση Select note properties Επέλεξε τις ιδιότητες του στίγματος Velocity Ταχύτητα Pan Πανόψη Lead and Lag NoteKey Κλειδί Στίγματος Pattern editor - %1 Επεξεργαστής μητρών - %1 No pattern selected Δε επιλέχτηκε καμία μήτρα Hear new notes = On Άκουσμα νέων στιγμάτων = Ενεργό Hear new notes = Off Άκουσμα νέων στιγμάτων = Ανενεργό Quantize incoming keyboard/midi events = On Κβαντισμός των εισερχομένων γενομένων του πληκτρολογίου ή του ΜΙΝΤΙ = Ενεργός Quantize incoming keyboard/midi events = Off Κβαντισμός των εισερχομένων γενομένων του πληκτρολογίου ή του ΜΙΝΤΙ = Ανενεργός Show drum editor Προβολή του επεξεργαστή κρουστών Is not possible to change the pattern size when playing. Δεν είναι δυνατή η αλλαγή του μέγεθους της μήτρας κατά την αναπαραγωγή. Probability Πιθανότητα PatternFillDialog Fill with selected pattern Γέμισμα με την επιλεγμένη μήτρα PatternFillDialog_UI &Fill &Γέμισμα &Clear &Καθάρισμα To: Στο: From: Από: Cancel Ακύρωση OK Εντάξει Form 1 Προμόρφωμα1 Alt+F Alt+F Alt+C Alt+C PatternPropertiesDialog Pattern properties Ιδιότητες της μήτρας %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel Α&κύρωση &OK &Εντάξει New Pattern Name Όνομα της Νέας Μήτρας Form1 Προμόρφωμα1 Alt+C Alt+C Alt+O Alt+O Pattern category Κατηγορία της μήτρας Pattern description Περιγραφή της μήτρας PlayerControl Rewind Μετακίνηση προς την αρχή Record Ηχογράφηση Destructive Record Καταστροφική Ηχογράφηση Play/ Pause Αναπαραγωγή/Παύση Stop Σταμάτημα Fast Forward Γρήγορα Μπροστά Loop song Επανάληψη τραγουδιού Pattern Mode Κατάσταση Λειτουργίας Μήτρας Song Mode Κατάσταση Λειτουργίας Τραγουδιού BeatCounter Panel on Το Πλαίσιο του Μετρητή Χτύπων ενεργό Set BPM / Set BPM and play Όρισε τους Χτ.ΑνάΛεπ. ή Ορισμός των Χτ.ΑνάΛεπ. και αναπαραγωγή Recalculate Rubberband modified samples if bpm will change Επανυπολογισμός των δειγμάτων, που έχουν μετατραπεί με το Ράμπερμπανντ, αν αλλάξουν οι ΧτύποιΑνάΛεπτό Switch metronome on/off Εναλλαγή της ενεργοποίησης/απενεργοποίησης του μετρονόμου Jack-transport on/off Μεταφορά-ΤΖΑΚ ενεργή/ανενεργή Jack-Time-Master on/off Κύριος-Χρόνου-ΤΖΑΚ ενεργός/ανενεργός Show mixer Προβολή του Μείκτη Mixer Μείκτης Show Instrument Rack Προβολή της Ραφιέρας των Οργάνων Instrument rack Ραφιέρα Οργάνων Record midi events = On Καταγραφή των ΜΙΝΤΙ γενόμενων = Ενεργό Record midi events = Off Καταγραφή των ΜΙΝΤΙ γενόμενων = Ανενεργό Destructive mode = Off Καταστροφική Κατάσταση Λειτουργίας = Ανενεργή Destructive mode = On Καταστροφική Κατάσταση Λειτουργίας = Ενεργή Playing. Παίζει. Pause. Σε παύση. Stopped. Σταματημένο. Song mode selected. Επιλέχτηκε κατάσταση λειτουργίας τραγουδιού. Pattern mode selected. Επιλέχτηκε κατάσταση λειτουργίας μήτρας. BC Panel on Πλαίσιο του Μετ.Χτύπ. ενεργό BC Panel off Πλαίσιο του Μετ.Χτύπ. ανενεργό Count BPM and start PLAY Μέτρημα των Χτ.ΑνάΛεπ. και εκκίνηση της ΑΝΑΠΑΡΑΓΩΓΗΣ Count and set BPM Μέτρημα και ορισμός των Χτ.ΑνάΛεπ. Recalculate all samples using Rubberband ON Επανϋπολογισμός όλων των δειγμάτων με χρήση του Ράμπερμπανντ: ΕΝΕΡΓΟΣ Recalculate all samples using Rubberband OFF Επανϋπολογισμός όλων των δειγμάτων με χρήση του Ράμπερμπανντ: ΑΝΕΝΕΡΓΟΣ Jack-transport mode = On Κατάσταση λειτουργίας μεταφοράς-ΤΖΑΚ = Ενεργή Jack-transport mode = Off Κατάσταση λειτουργίας μεταφοράς-ΤΖΑΚ = Ανενεργή JACK-transport will work only with JACK driver. Η μεταφορά-ΤΖΑΚ μπορεί να λειτουργεί μόνο με τον οδηγό ΤΖΑΚ. Jack-Time-Master mode = On ΤΖΑΚ-Χρόνος-Κύρια λειτουργία = Ενεργή Jack-Time-Master mode = Off ΤΖΑΚ-Χρόνος-Κύρια λειτουργία = Ανενεργή New BPM value Νέα τιμή Χτ.ΑνάΛεπ. Loop song = On Επανάληψη τραγουδιού = Ενεργή Loop song = Off Επανάληψη τραγουδιού = Ανενεργή PlaylistDialog Playlist Browser Πλοηγός Κατάστιχου Αναπαραγωγής &Playlist &Κατάστιχο αναπαραγωγής Add song to Play&list Προσθήκη τραγουδιού στο &Κατάστιχο Αναπαραγωγής Add &current song to Playlist Προσθήκη του &παρόντος τραγουδιού στο Κατάστιχο Αναπαραγωγής &Remove selected song from Playlist Απομάκ&ρυνση του επιλεγμένου τραγουδιού από το κατάστιχο αναπαραγωγής &New Playlist &Νέο Κατάστιχο Αναπαραγωγής &Open Playlist Άν&οιγμα Κατάστιχου Αναπαραγωγής &Save Playlist Αποθήκευ&ση του Κατάστιχου Αναπαραγωγής Save Playlist &as Αποθήκευση του Κατάστιχου &Αναπαραγωγής ως &Scripts &Σενάρια &Add Script to selected song &Προσθήκη Σενάριου στο επιλεγμένο τραγούδι &Edit selected Script &Επεξεργασία του επιλεγμένου Σενάριου &Remove selected Script Απομάκ&ρυνση του επιλεγμένου Σενάριου &Create a new Script &Δημιουργία ενός νέου Σενάριου Rewind Μετακίνηση προς την αρχή Play/ Pause/ Load selected song Παίξιμο, Παύση, Φόρτωμα του επιλεγμένου τραγουδιού Stop Σταμάτημα Fast Forward Γρήγορα Μπροστά Song list Κατάστιχο τραγουδιών Script Σενάριο exec Script εκτέλεση Σενάριου sort ταξινόμηση Add Song to PlayList Προσθήκη τραγουδιού στο Κατάστιχο Αναπαραγωγής Please save your song first Παρακαλώ, αποθήκευσε πρώτα το τραγούδι σου No Song selected! Δε επιλέχτηκε κανένα Τραγούδι! no Script κανένα Σενάριο Load Playlist Φόρτωμα Κατάστιχου Αναπαραγωγής New Script Νέο Σενάριο Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Το όνομα του σενάριου ή η διαδρομή προς το σενάριο περιέχουν κενά διαστήματα. ΣΗΜΑΝΤΙΚΟ Και η διαδρομή προς το σενάριο, και το όνομα του σενάριου, δεν πρέπει να περιέχουν κενά διαστήματα. WARNING, the new file is executable by the owner of the file! ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το νέο αρχείο είναι εκτελέσιμο από τον ιδιοκτήτη του! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Δεν Έχει Οριστεί ο Προεπιλεγμένος Επεξεργαστής. Παρακαλώ, όρισε τον Προεπιλεγμένο Επεξεργαστή. Μην επιλέξεις έναν επεξεργαστή τύπου κονσόλας. Δυστυχώς, κάτι τέτοιο μπορεί ακόμη να λειτουργήσει. Set your Default Editor Όρισε τον Προκαθορισμένο Επεξεργαστή Save Playlist Αποθήκευση του Κατάστιχου Αναπαραγωγής No Song in List or no Song selected! Κανένα Τραγούδι στο κατάστιχο, ή δεν επιλέχτηκε κανένα Τραγούδι! Hydrogen Playlist (*.sh) Κατάστιχο Αναπαραγωγής του Υδρογόνου (*.h2playlist) Add Script to selected Song Προσθήκη Σενάριου στο επιλεγμένο Τραγούδι No Script in use! Δεν χρησιμοποιείται κανένα Σενάριο! No Script selected! Δεν επιλέχτηκε κανένα Σενάριο! No Script! Κανένα Σενάριο! Error loading song. Σφάλμα στο φόρτωμα του τραγουδιού. Pause. Σε παύση. Playlist: set song no. %1 Κατάστιχο αναπαραγωγής. Όρισε το τραγούδι αρ. %1 File not found: Δεν βρέθηκε το αρχείο: No valid song selected! Δε επιλέχτηκε κανένα έγκυρο τραγούδι! The current playlist contains unsaved changes. Do you want to discard the changes? Το παρών κατάστιχο αναπαραγωγής περιέχει μη αποθηκευμένες αλλαγές. Θέλεις να απορρίψεις τις αλλαγές; &Discard Από&ρριψη &Cancel Α&κύρωση Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Το όνομα του σενάριου ή η διαδρομή προς το σενάριο περιέχουν κενά διαστήματα. ΣΗΜΑΝΤΙΚΟ Και η διαδρομή προς το σενάριο, και το όνομα του σενάριου, δεν πρέπει να περιέχουν κενά διαστήματα. PlaylistDialog_UI PlayList Browser Πλοηγός Λιστών Αναπαραγωγής Song list Κατάστιχο τραγουδιών PreferencesDialog Preferences Προτιμήσεις Slow Αργά Normal Κανονικά Fast Γρήγορα Driver restart required. Restart driver? Απαιτείται επανεκκίνηση του οδηγού. Να επανεκκινηθεί ο οδηγός; &Ok &Εντάξει &Cancel Α&κύρωση <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Σύστημα Ανοιχτού Ήχου OSS</b><br>Απλός οδηγός ήχου [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Δεν προστέθηκε στην σύνθεση</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Οδηγός Jack Audio Connection Kit</b><br>Οδηγός ήχου χαμηλής καθυστέρησης φάσης <b>ALSA Driver</b><br> <b>Οδηγός ALSA</b><br> <b>PortAudio Driver</b><br> <b>Οδηγός Ήχου PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Οδηγός ήχου CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Παρακαλείσαι να επανεκκινήσεις το Υδρογόνο, για να ενεργοποιήσεις ή να απενεργοποιήσεις την υποστήριξη του LASH Automatic Αυτόματο Steps Βήματα Fixed Σταθερό <b>PulseAudio Driver</b><br> <b>Οδηγός Ήχου PulseAudio</b><br> Number of steps Πλήθος βημάτων Color (Hue value) Χρώμα (τιμή απόχρωσης) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Buffer size Μέγεθος της μικραποθήκευσης Device Συσκευή Input Εισαγόμενο Channel Κανάλι All Όλα Meters falloff speed Ταχύτητα πτώσης των μετρητών Slow Αργή Normal Κανονική Fast Γρήγορη Application font Γραμματοσειρά της εφαρμογής Mixer font Γραμματοσειρά του μείκτη Select font Επιλογή γραμματοσειράς Polyphony Πολυφωνία Style Διακόσμηση &Cancel Α&κύρωση &OK &Εντάξει &General &Γενικά Audio &System &Σύστημα Ήχου Metronome volume Ένταση του μετρονόμου Connect to &Default Output Pair Σύνδεση στο &Προεπιλεγμένο Ζευγάρι Εξόδου &Midi System Σύστη&μα ΜΙΝΤΙ Midi driver Οδηγός ΜΙΝΤΙ Ignore note-off Αγνόηση της αποστιγμάτωσης &Appearance Εμ&φάνιση Form1 Προμόρφωμα1 Alt+C Alt+C Alt+O Alt+O &Reopen last used song &Ξανά άνοιγμα του τελευταίου χρησιμοποιημένου τραγουδιού Alt+R Alt+R ### ### Sample rate Ρυθμός δειγματοληψίας 44100 44100 48000 48000 88200 88200 96000 96000 Alt+D Alt+D 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Restart output Επανεκκίνηση του εξαγόμενου Audio output details Λεπτομέρειες του εξαγόμενου ήχου Post-Fader Μέτα-Φθορά Pre-Fader Προ-Φθορά Track output Εξαγόμενου του καναλιού Use lash Χρήση του lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm βήμα πρώτο: προσάρμοσε τη χρονική ασυνέπεια, μεταξύ, της καθυστέρησης φάσης της ενεργοποίησης του ελεγκτή εισόδου ή του πληκτρολόγιου, και των υπολογισμένων ΧτύπωνΑνάΛεπτό Beat counter drift compensation in 1/10 ms Αποζημίωση της απώλειας του μετρητή χτύπων, σε 1/10 του χιλιοστοδευτερόλεπτου Beat counter start offset in ms Διαφοροποίηση της εκκίνησης του μετρητή χτύπων, σε χιλιοστοδευτερόλεπτα. Path to the Rubberband command-line utility Η διαδρομή του εργαλείου γραμμής εντολών του Ράμπερμπανντ Maximum number of bars Μέγιστο πλήθος στηλών &Reopen last used playlist &Ξανά άνοιγμα της τελευταίας χρησιμοποιημένης λίστας αναπαραγωγής Interpolate resampling Επανασύνθεση της επαναδειγματοληψίας Linear Γραμμική Cosine Συνημίτονου Third Τρίτη Cubic Κυβική Hermite Του Χερμάιτ Default interface layout Διάταξη προεπιλεγμένης διεπαφής Single pane Σε ένα παράθυρο Tabbed Με καρτέλες TextLabel ΕτικέταΚείμενου Coloring method for Song Editor elements Μέθοδος χρωματισμού για τα στοιχεία του Επεξεργαστή Τραγουδιών <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">Μετά την αλλαγή μιας γραμματοσειράς, ή της διάταξης της διεπαφής, θα πρέπει να επανεκκινηθεί η εφαρμογή.</span></p></body></html> Use relative paths for playlist Χρήση σχετικών διαδρομών για το κατάστιχο αναπαραγωγής Use output note as input note Χρήση του εξαγόμενου στίγματος σαν στίγμα εισαγωγής Discard midi messages after action has been triggered Απόρριψη των μηνυμάτων ΜΙΝΤΙ, αφού έχει, πρώτα, εκκινηθεί μία ενέργεια Create per-instrument outputs Δημιουργία εξαγωγής ανά όργανο Enable feedback Ενεργοποίηση της ανατροφοδότησης &OSC Αν&οιχτός Ηχητικός Έλεγχος (OSC) &Enable OSC support &Ενεργοποίηση της υποστήριξης του Ανοιχτού Ηχητικού Έλεγχου Incoming port Θύρα εισερχόμενων <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Η θύρα η οποία θα χρησιμοποιείται για να λαμβάνει μηνύματα του Ανοιχτού Ηχητικού Έλεγχου</p></body></html> Enable OSC &feedback Ενεργοποίηση της ανατρο&φοδότησης του Ανοιχτού Ηχητικού Έλεγχου second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Εντάξει &Cancel Α&κύρωση Close dialog! maybe there is some unsaved work on sample. Are you sure? Διάλογος κλεισίματος: ίσως να υπάρχει μη αποθηκευμένο έργο στο δείγμα. Στα σίγουρα; Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Διάλογος P&lay original sample Αναπα&ραγωγή του αρχικού δείγματος &Apply Changes Ε&φαρμογή των Αλλαγών &Close &Κλείσιμο Adjust sample start frame Προσαρμογή του καρέ εκκίνησης του δείγματος Adjust sample loop begin frame Προσαρμογή του καρέ εκκίνησης του ανακυκλώμενου δείγματος set processing όρισε την επεξεργασία forward μπροστά reverse πίσω pingpong πινγκ πονγκ loops ανακυκλώσεις Adjust sample end & loop end frame Προσάρμοσε το τελικό καρέ του δείγματος και του ανακυκλώμενου &Play Ανα&παραγωγή new sample length: το μήκος του νέου δείγματος: fade-out type τύπου ομαλής εξόδου volume ένταση panorama πανοραμικό Sample length to beat: Μήκος δείγματος στο χτύπημα: off ανενεργό 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Crispness: Τραγανότητα: 0 0 Start Εκκίνηση Loop Επανάληψη <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Ανακύκλωση</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">λειτουργία</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Ανακύκλωση</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Μέτρηση</span></p></body></html> End Τέλος "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. «Ράμπερμπανντ Επεξεργαστής Ήχου» : Άλλαξε το ρυθμό (μήκος δείγματος) και τον τόνο του ήχου. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Εππεδα «Τραγαντητας»:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 ιστιμο με --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 ιστιμο με --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 ιστιμο με --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 ιστιμο με --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 προεπιλεγμένες επιλογές επεξεργασίας</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 ιστιμο με --no-lamination --window-short (ίσως να είναι καλό για ντραμς)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">μπορείς να βρεις επιπλέον πληροφορίες, εδώ:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Εγχειρίδιο Χρήσης Welcome to Hydrogen Καλώς ήρθες στο Υδρογόνο Don't show this message anymore Να μην προβάλλεται αυτό το μήνυμα, από εδώ και πέρα Ok Εντάξει Documentation index Περιεχόμενα της τεκμηρίωσης SongEditorPanel Song Editor Επεξεργαστής Τραγουδιού Enable time line edit Ενεργοποίηση της επεξεργασίας της χρονικής γραμμής Clear pattern sequence Καθάρισμα της ακολουθίας της μήτρας Create new pattern Δημιουργία νέας μήτρας Move the selected pattern down Μετακίνηση, προς τα κάτω, της επιλεγμένης μήτρας Move the selected pattern up Μετακίνηση, προς τα πάνω, της επιλεγμένης μήτρας Select mode Κατάσταση λειτουργίας επιλογής Draw mode Κατάσταση λειτουργίας σχεδίασης stacked mode κατάσταση λειτουργίας στοιβάγματος Pattern %1 Μήτρα %1 Warning, this will erase your pattern sequence. Are you sure? Προειδοποίηση: αυτό θα διαγράψει την ακολουθία της μήτρας σου. Στα σίγουρα; &Ok &Εντάξει &Cancel Α&κύρωση stacked pattern mode κατάσταση λειτουργίας στοιβάγματος μήτρας single pattern mode κατάσταση λειτουργίας μονής μήτρας View playback track Προβολή του καναλιού αναπαραγωγής Mute playback track Σίγηση του καναλιού αναπαραγωγής Choose playback track Επέλεξε κανάλι αναπαραγωγής View timeline Εμφάνιση της χρονογραμμής Adjust parameter values in time Προσαρμογή στο χρόνο των τιμών της παράμετρου Velocity Ταχύτητα Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Προμόρφωμα Edit the bpm value for current beat Επεξεργασία της τιμής των ΧτύπωνΑνάΛεπτό για το συγκεκριμένο χτύπο 500,55 500,55 Edit beat in timeline Επεξεργασία του χτύπου στη χρονογραμμή 500 500 Bar Στήλη BPM Χτ.ΑνάΛεπ. Delete this BPM Marker Διαγραφή αυτού του Σημαδιού Χτ.ΑνάΛεπ. Delete BPM Marker Διαγραφή του Σημαδιού Χτ.ΑνάΛεπ. Cancel Ακύρωση Ok Εντάξει SongEditorPanelTagWidget_UI Form Προμόρφωμα1 Tag Ετικέτα Cancel Ακύρωση Ok Εντάξει SongEditorPatternList Copy Αντιγραφή Delete Διαγραφή Fill/Clear ... Γέμισμα/Καθάρισμα ... Properties Ιδιότητες Load Pattern Φόρτωμα Μήτρας Save Pattern Αποθήκευση Μήτρας Virtual Pattern Εικονική Μήτρα Open Pattern Άνοιγμα Μήτρας The pattern-file exists. Overwrite the existing pattern? Υπάρχει το αρχείο μήτρας. Να επανωγραφεί η υπάρχουσα μήτρα; &Ok &Εντάξει &Cancel Α&κύρωση Pattern 1 Μήτρα 1 not_categorized μη_ταξινομημένο Export Pattern Εξαγωγής Μήτρας Could not export pattern. Αδυναμία εξαγωγής της μήτρας. Could not export sequence. Pattern saved. Αποθηκεύτηκε η μήτρα. SongPropertiesDialog Song properties Ιδιότητες του τραγουδιού SongPropertiesDialog_UI Notes Στίγματα Author Δημιουργός Song name Όνομα του τραγουδιού &Cancel Α&κύρωση &OK &Εντάξει Form1 Προμόρφωμα1 Alt+O Alt+O Alt+C Alt+C License Άδεια SoundLibraryExportDialog Export Sound Library Εξαγωγή Βιβλιοθήκης Ήχων Directory Κατάλογος SoundLibraryExportDialog_UI Dialog Διάλογος Export Εξαγωγή Drumkit Ομάδα Κρουστών Component Συστατικό Path Διαδρομή Version Έκδοση Browse... Εξερεύνηση... 0.9.7 and higher 0.9.7 και νεότερη 0.9.6 and lower 0.9.6 και παλαιότερη Cancel Ακύρωση SoundLibraryImportDialog Sound Library import Εισαγωγή Βιβλιοθήκης Ήχων Sound library Βιβλιοθήκη ήχων Status Κατάσταση Updating SoundLibrary list... Ενημερώνεται το κατάστιχο με τις ΒιβλιοθήκεςΉχων... Drumkits Ομάδες Κρουστών Songs Τραγούδια Patterns Μήτρες Installed Εγκατεστημένο New Νέα Author: %1 Δημιουργός: %1 Downloading SoundLibrary... Λαμβάνεται η ΒιβλιοθήκηΉχων... SoundLibrary imported in %1 Εισήχθη Βιβλιοθήκη Ήχων στο %1 An error occurred importing the SoundLibrary. Παρουσιάστηκε κάποιο σφάλμα στην εισαγωγή της ΒιβλιοθήκηςΉχων. Import drumkit Εισαγωγή ομάδας κρουστών Drumkit License: %1 Άδεια της Ομάδας Κρουστών: %1 Image License: %1 Άδεια της Εικόνας: %1 SoundLibraryImportDialog_UI Dialog Διάλογος Internet Διαδίκτυο Update list Ενημέρωση του κατάλογου Sound Library Name Όνομα της Βιβλιοθήκης Ήχων Author... Δημιουργός... Download and install Λήψη και εγκατάσταση Local file Τοπικό αρχείο Browse... Εξερεύνηση... Install Εγκατάσταση 1 1 Edit server list Επεξεργασία της λίστας των εξυπηρετητών Close Κλείσιμο TextLabel ΕτικέταΚείμενου Image License... Άδεια της Εικόνας... Drumkit License... Άδεια της Ομάδας Κρουστών... SoundLibraryOpenDialog Open Sound Library Άνοιγμα Βιβλιοθήκης Ήχων Load Φόρτωμα Cancel Ακύρωση SoundLibraryPanel Load Φόρτωμα Export Εξαγωγή Properties Ιδιότητες Delete Διαγραφή System drumkits Ομάδες κρουστών του συστήματος User drumkits Ομάδες κρουστών του χρήστη Songs Τραγούδια Patterns Μήτρες &Ok &Εντάξει &Cancel Α&κύρωση Error loading song. Σφάλμα στο φόρτωμα του τραγουδιού. Warning, the selected pattern will be deleted from disk. Are you sure? Προειδοποίηση: η επιλεγμένη μήτρα θα διαγραφεί από το δίσκο. Στα σίγουρα; It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Δεν είναι δυνατή η διαγραφή της ομάδας κρουστών που είναι, τώρα, φορτωμένη: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Το "%1" είναι ομάδα κρουστών του συστήματος, και δεν μπορεί να διαγραφεί. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Προειδοποίηση: η ομάδα κρουστών "%1" θα διαγραφεί από το δίσκο. Στα σίγουρα; Drumkit deletion failed. Αποτυχία διαγραφής της ομάδας κρουστών. Keep Διατήρηση The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Η υπάρχουσα ομάδα κρουστών έχει %1 όργανα, όμως η καινούρια έχει %2. Τα πρώτα %2 όργανα θα αντικατασταθούν από τα νέα όργανα και θα διατηρήσουν τα στίγματά τους. Όμως, κάποια από τα υπόλοιπα όργανα έχουν στίγματα. Θα ήθελες να διατηρήσεις ή να απορρίψεις τα υπόλοιπα όργανα και τα στίγματα; Double click to expand the list Διπλό κλικ για την επέκταση του κατάστιχου SoundLibraryPropertiesDialog_UI Dialog Διάλογος Name Όνομα Author Δημιουργός Information Πληροφορίες Save Αποθήκευση Cancel Ακύρωση Save changes made to instruments into sound library Αποθήκευσε στη βιβλιοθήκη ήχων αυτές τις αλλαγές που έγιναν στα όργανα Drumkit License Άδεια της Ομάδας Κρουστών Image Εικόνα Browse Εξερεύνηση Image License Άδεια της Εικόνας SoundLibraryRepositoryDialog Edit repository settings Επεξεργασία των ρυθμίσεων της δεξαμενής Edit server list Επεξεργασία της λίστας των εξυπηρετητών URL Διεύθυνση URL SoundLibraryRepositoryDialog_UI Dialog Διάλογος Add Προσθήκη Delete Διαγραφή SoundLibrarySaveDialog Save Sound Library Αποθήκευση της Βιβλιοθήκης Ήχων Please supply at least a valid name Παρακαλώ, δώσε τουλάχιστον ένα έγκυρο όνομα A library with the same name already exists. Do you want to overwrite the existing library? Υπάρχει, ήδη, μία βιβλιοθήκη με το ίδιο όνομα. Θέλεις να επανωγραφεί η υπάρχουσα βιβλιοθήκη; Saving of this library failed. Αποτυχία αποθήκευσης αυτής της βιβλιοθήκης. Open Image Άνοιγμα Εικόνας Image Files (*.png *.jpg *.jpeg) Αρχεία Εικόνας (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Διάλογος Name Όνομα Author Δημιουργός Information Πληροφορίες Cancel Ακύρωση License Άδεια Save Αποθήκευση Image Εικόνα Browse Εξερεύνηση Image License Άδεια της Εικόνας SoundLibraryTree Sound library Βιβλιοθήκη ήχων VirtualPatternDialog Select virtual pattern Επέλεξε την εικονική μήτρα VirtualPatternDialog_UI Dialog Διάλογος OK Εντάξει Cancel Ακύρωση hydrogen-1.0.0-rc1/data/i18n/hydrogen_es.ts000066400000000000000000004063241366722712400204030ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Página del proyecto</b><br> About Acerca de <b>Website</b><br> <b>Página web</b><br> <b>Main coder and maintainer:</b><br> <b>Programador y mantenedeor principal:</b><br> <b>Thanks to:</b> <b>Gracias a:</b> <b>Development mailing list</b><br> <b>Lista correo desarrolladores</b><br> AboutDialog_UI ### ### About Hydrogen Acerca de Hydrogen A&bout Ace&rca &Authors &Autores &License &Licencia &OK &Aceptar Alt+O Alt+O AudioEngineInfoForm Audio Engine Info Información del motor de audio AudioEngineInfoForm_UI Playing notes Polifonía Process time Tiempo de procesamiento Audio engine state Estado del motor de audio Song state Estado de la canción Buffer size Tamaño del buffer Sample rate Tasa de muestreo Form1 Forma1 ### ### Frames Muestras Ticks Ticks Song position Posición de la canción Patterns Patrones Selected pattern Patrón seleccionado Selected instrument Instrumento seleccionado Connected to Conectado a Synth Sintetizador Sampler Sampler Sequencer Secuenciador MIDI input Entrada MIDI Name Nombre Audio output Salida de Audio Realtime frames Marcos en tiempo real AudioFileBrowser Audio File Browser Navegador Archivos Audio Size: %1 bytes Tamaño: %1 bytes Samplerate: %1 Tasa de muestreo: %1 s s Name: Nombre: Size: Tamaño: Samplerate: Tasa de muestreo: Sample length: Longitud del Sample: Please do not preview samples which are longer than 10 minutes! ¡Por favor no previsualice samples de más de 10 minutos! Sample length: Longitud del Sample: Unable to load that sample file. No es posible cargar el archivo del sample. AudioFileBrowser_UI Dialog Diálogo Open Abrir Name: Nombre: Samplerate: Tasa de Muestreo: Size: Tamaño: Length: Longitud: Cancel Cancelar Pla&y samples by clicking Reprodu&ce samples haciendo click &Up &Arriba &Home &Inicio &Play Sample &Reproduce Sample &Filename to instrument name &Nombre de archivo a nombre de instrumento &Stop &Detener View hidden folders Ver carpetas ocultas Be careful, this change all Layer velocity settings Atención, esto modificará todos los ajustes de Velocidad de Capas Set automatic velocity Seleccionar velocidad automática ComponentMixerLine Mute Silencio Solo Solo Component name Nombre componente Set instrument volume [%1] Fijar volumen del instrumento [%1] Director Director Director Director_UI Dialog Diálogo DonationDialog Donations Donaciones DonationDialog_UI Form Forma Donate! Dona! Choose random entry. Escoge entrada al azar. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Hydrogen es un proyecto de código abierto desarrollado por múltiples personas en su tiempo libre. Al hacer un donativo puede mostrar su agradecimiento a las personas involucradas.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Sebastian Moors (alias mauser): Mantenedor / Programador Michael Wolkstein (aka wolke): Forum hosting Michael Wolkstein (alias wolke): Hosting del foro Download Importing item failed: %1 Error al importar elemento: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - ETA %3 ExportMidiDialog Export midi Exportar MIDI SMF1 single: export all instruments to a single track SMF1 uno: exportar todos los instrumentos a una pista SMF1 multi: export each instrument to separate track SMF1: exportar cada instrumento a una pista separada SMF0: export all events to one track SMF0: exportar todos los eventos a una pista Midi file (*%1) Archivo midi (*%1) Export MIDI file Exportar archivo MIDI Directory %1 does not exists El directorio %1 no existe The file %1 exists. Overwrite the existing file? El archivo %1 existe. ¿Sobreescribir el archivo existente? ExportMidiDialog_UI Dialog Diálogo Filename Nombre de archivo &Browse... &Examinar... Alt+B Alt+B Modus: Modus: &Export &Exportar Alt+E Alt+E &Close &Cerrar Alt+C Alt+C ExportSongDialog Export song Exportar canción The file %1 exists. Overwrite the existing file? El archivo %1 existe. ¿Sobreescribir el archivo existente? Export to a single track Exportar a pista única Both Ambos Export to separate tracks Exportar a pistas separadas Directory %1 does not exists El directorio %1 no existe ExportSongDialog_UI Alt+C Alt+C &Export &Exportar Alt+E Alt+E &Browse... &Examinar... Alt+B Alt+B &Close &Cerrar Samplerate in Hz: Tasa de Muestreo en Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Profundidad de Sample en Bit: 8 8 16 16 24 24 32 32 Templates: Plantillas: WAV in CD quality "44,1kHz, 16 bit PCM" WAV en calidad CD "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV en calidad ADAT "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV en mejor calidad "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV mejor calidad Mixdown "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF en calidad CD "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF en calidad ADAT "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF en mejor calidad "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" FLAC compresor sin pérdida en buena calidad "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis comprimido holgadamente en buena calidad "VBR" Interpolation: Interpolación: Choose type of interpolation methode Elige método de interpolación Linear Lineal Cosine Coseno Third Tercio Cubic Cúbico Hermite Hermite Enable tempo changing Activar cambio tempo TimeLine BPM Cronograma PPM 88200 88200 Enable use of rubberband's batch processor Activar uso del procesador en lotes de rubberband Rubberband Batch Rubberband Lote Dialog Diálogo Export directory: Exportar directorio: Modus: Modus: Choose type of interpolation method Escoge el método de interpolación FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Efectos si/no Master output Salida Master H2Core::SongEditorPanelBpmWidget BPM PPM H2Core::SongEditorPanelTagWidget Tag Etiqueta H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Propiedades de la Biblioteca de Sonidos &Ok &Aceptar &Cancel &Cancelar This is not possible, you can only save changes inside instruments to the current loaded sound library Esto no es posible, solo puede guardar las modificaciones de los instrumentos en la biblioteca de sonidos cargada actualmente Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? ¡Atención! Cambiar el nombre del drumkit resultará en la creación de otro drumkit con este nombre. ¿Seguir? Saving of this drumkit failed. Error al guardar drumkit. Open Image Abrir Imagen Image Files (*.png *.jpg *.jpeg) Archivos de Imagen (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Drumkit cargado: [%1] Song Editor Editor de canciones Instrument + Pattern Instrumento + Patrón Mixer Mezclador modified modificado Song saved. Canción guardada. InstrumentEditor Show instrument properties Mostrar propiedades de instrumento Show layers properties Mostrar propiedades de capas Random pitch factor Factor aleatorio de tono Filter Cutoff Filtro de Corte Filter resonance Filtro de resonancia Attack Ataque Decay Decay Sustain Sustain Release Release Layer gain Ganancia de capa New instrument name Nombre de instrumento nuevo Instrument gain Ganancia del instrumento General General Layers Capas Layer pitch (Coarse) Afinación de capa (gruesa) Layer pitch (Fine) Afinación de capa (fina) Stop the current playing instrument-note before trigger the next note sample. Detén la nota del instrumento actual antes de disparar la siguiente nota de sample. New component name Nombre nuevo componente Component name Nombre componente Midi out channel Canal salida Midi Midi out note Nota salida Midi Component volume Volumen componente Don't change the layers' gain based on velocity No cambiar ganancia de capas basado en la velocidad Select pattern size Seleccionar tamaño del patrón InstrumentLine Clear notes Borrar notas Randomize velocity Intensidad aleatoria Delete instrument Eliminar instrumento Fill notes ... Llena notas ... Fill all notes Llena todas las notas Fill 1/2 notes Llena notas 1/2 Fill 1/3 notes Llena notas 1/3 Fill 1/4 notes Llena notas 1/4 Fill 1/6 notes Llena notas 1/6 Fill 1/8 notes Llena notas 1/8 Mute instrument Silenciar instrumento Solo Solo Copy notes ... Copiar notas ... Only for this pattern Solo para este patrón For all patterns Para todos los patrones Paste notes ... Pegar notas ... Fill 1/12 notes Llenar notas 1/12 Fill 1/16 notes Llenar notas 1/16 Rename instrument Renombrar instrumento New instrument name Nombre de instrumento nuevo InstrumentRack Show Instrument editor Ver editor de instrumentos Instrument Instrumento Show sound library Ver biblioteca de sonidos Sound library Biblioteca de sonidos LadspaFXMixerLine Edit FX parameters Editar parámetros efectos FX bypass Bypass Efectos Ladspa FX name Nombre de efecto Ladspa Effect return Retorno de efectos LadspaFXProperties Select FX Seleccionar Efecto [%1] LADSPA FX Properties [%1] Propiedades Efecto LADSPA LADSPA FX %1 Properties Propiedades Efecto LADSPA %1 No plugin Sin plugin Activate Activar Deactivate Desactivar Remove FX Quitar efectos LadspaFXSelector Groups Grupos Stereo Estéreo Mono Mono Not supported No soportado Select LADSPA FX Seleccionar Efecto LADSPA Recently Used Utilizado Recientemente Alphabetic List Lista Alfabética Categorized Categorizado LadspaFXSelector_UI Form1 Forma1 ### fx label ### Etiqueta Efecto ### fx type ### Tipo Efecto ### fx ID ### ID Efecto &Cancel &Cancelar Alt+C Alt+C &OK &Aceptar Alt+O Alt+O 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nombre:</span></p></body></html> ### fx name 1 ### nombre efectos 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etiqueta:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tipo:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Creador:</span></p></body></html> ### FX maker 1 2 ### Creador Efecto 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### Copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Dec. = %1 MIDI = %2 MainForm &Save &Guardar &Discard &Descartar Cancel Cancelar Error loading song. Error al cargar la canción. Hydrogen Ready. Hydrogen Listo. Save song Guardar canción Open song Abrir canción Print Objects Imprimir objetos &New &Nuevo &Open &Abrir Open &Demo Abrir &Demo Open &recent Abrir &reciente Export &MIDI file Exportar archivo &MIDI &Preferences &Preferencias &Quit &Salir Show &audio engine info Ver info de motor de &audio &User manual Manual de &usuario &About &Acerca de &Cancel &Cancelar Unknown audio driver Controlador de audio desconocido Error starting audio driver Error iniciando controlador de audio Jack driver: server shutdown Controlador Jack: cierre del servidor Jack driver: cannot activate client Controlador Jack: no se puede activar el cliente Jack driver: cannot connect output port Controlador Jack: no se puede conectar al puerto de salida Jack driver: error in port register Controlador Jack: error en el registro del puerto &Export song &Exportar canción De&bug De&bug Save &as... Gu&ardar como... &Mixer &Mezclador &Instrument Rack Rack de &instrumentos &Info &Info Song saved. Canción guardada. Clear all instruments? ¿Eliminar todos los instrumentos? Ok Aceptar Unknown error %1 Error desconocido %1 You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Está usando una versión de desarrollo de Hydrogen, por favor ayúdenos a informar sobre errores o sugerencias en la lista de correo hydrogen-devel.<br><br>¡Gracias! Could not save song. No se pudo guardar la canción. Open &Pattern Abrir &Patrón Save Pattern as ... Guardar Patrón como... Pattern saved. Patrón guardado. Open Pattern Abrir Patrón Don't show this message anymore No mostrar este mensaje de nuevo Playlist: Set song No. %1 Playlist: Set song No. %1 Show &info Mostrar &info Expor&t pattern as... Expor&tar patrón como... I&nstruments I&nstrumentos &Add instrument &Añadir Instrumento &Clear all &Limpiar todo Playlist &editor &Editor playlist Info|About Info|Acerca de Song saved as. Canción guardada.como. Playlist: Song No. %1 Playlist: Canción nº %1 Could not export pattern. No se pudo exportar el patrón. The document contains unsaved changes. Do you want to save the changes? El documento contiene cambios sin guardar. ¿Quiere guardar los cambios? Director Director Undo history Deshacer historial &Undo &Deshacer menu Undo Deshacer Redo Rehacer Input mode Modo entrada Instrument Instrumento Drumkit Drumkit Report bug Reportar bug Export &LilyPond file Exportar archivo &LilyPond Donate Donar LilyPond file (*.ly) Archivo LilyPond (*.ly) Export LilyPond file Exportar archivo LilyPond The current playlist contains unsaved changes. Do you want to discard the changes? El playlist actual contiene cambios sin guardar. ¿Quiere descartar los cambios? Pro&ject Pro&yecto New Nuevo Open Abrir Properties Propiedades Save Guardar Save As Guardar como Export Exportar Import Importar Online import Importar online Add component Añadir componente Component name Nombre componente Saving of this library failed. Error al guardar esta biblioteca. Drum&kits Drum&kits &View &Ver &Automation path &Ruta automatización Full screen Pantalla completa &Options &Opciones MIDI setup advice Consejo configuración MIDI MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Las notas de salida MIDI no están configuradas para este drumkit, por tanto exportar esta canción a un archivo MIDI puede fallar. ¿Quiere que Hydrogen arregle esto automáticamente asignando valores por defecto? Set default values Asignar valores por defecto The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. La exportación LilyPond es una herramienta experimental. Debería funcionar correctamente mientras utilice el GM-kit, y no use tresillos. &Timeline &Línea de tiempo &Playback track &Reproducción pista Jack driver: cannot disconnect client Jack driver: no se puede desconectar el cliente OSC Server: Cannot connect to given port, using temporary port instead OSC server: No se puede conectar al puerto indicado, usando puerto temporal Retrieving information about drumkit '%1' failed: drumkit does not exist. Recogiendo información sobre el drumkit '%1' error: el drumkit no existe. MasterMixerLine Set master volume [%1] Volumen principal [%1] Swing Swing Humanize time Humanizar tiempo Humanize velocity Humanizar velocidad Set humanize time parameter [%1] Parametro de humanización de tiempo [%1] Set humanize velocity parameter [%1] Parámetro de humanización de intensidad [%1] Set swing factor [%1] Factor de swing [%1] MidiSenseWidget This element is not midi operable. Este elemento no puede operar con midi. Waiting for midi input... Esperando entrada midi... MidiTable Event Evento Param. Parám. Action Acción press button to record midi event Pulse el botón para grabar evento midi Mixer Show FX panel Ver panel de efectos Show instrument peaks Mostrar picos de instrumento Show instrument peaks = On Mostrar picos de instrumento = Sí Show instrument peaks = Off Mostrar picos de instrumento = No Set FX %1 level Nivel Efecto %1 Set LADSPA FX ( %1 ) volume Volumen Efecto LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Los efectos LADSPA no están disponibles en esta versión de Hydrogen. Mixer Mezclador MixerLine Play sample Reproducir sample Mute Silencio Solo Solo Pan Balance Instrument name (double click to edit) Nombre del instrumento (doble click para editar) Set instrument volume [%1] Fijar volumen del instrumento [%1] Set instr. pan [%1] Estab. paneo instr. [%1] PatternEditorPanel Hear new notes Escuchar notas nuevas Hear new notes = On Escuchar notas nuevas = Si Hear new notes = Off Escuchar notas nuevas = No Pattern editor - %1 Editor de patrones - %1 Quantize keyboard/midi events to grid Cuantizar eventos de teclado/midi a la rejilla Quantize incoming keyboard/midi events = On Cuantizar eventos teclado/midi entrantes = On Quantize incoming keyboard/midi events = Off Cuantizar eventos de teclado/midi entrantes = Off Zoom in Acercar Zoom out Alejar Is not possible to change the pattern size when playing. No es posible cambiar el tamaño del patrón durante la reproducción. Select pattern size Seleccionar tamaño del patrón Select grid resolution Seleccionar resolución de rejilla Select note properties Seleccionar propiedades de nota Velocity Intensidad Pan Balance No pattern selected No se ha seleccionado un patrón Lead and Lag Desfase Negativo y Positivo Loaded Soundlibrary Biblioteca de Sonidos cargado NoteKey Clave de Nota destructive mode pre delete settings Modo destructivo borrar previamente ajustes destructive mode post delete settings Modo destructivo borrar posteriormente ajustes Show piano roll editor Mostrar editor del piano roll Show drum editor Mostrar drum editor Probability Probabilidad PatternFillDialog Fill with selected pattern Rellenar con el patrón seleccionado PatternFillDialog_UI Form 1 Forma 1 &Fill &Llenar Alt+F Alt+F &Clear &Limpiar Alt+C Alt+C To: A: From: De: Cancel Cancelar OK Aceptar PatternPropertiesDialog Pattern properties Propiedades del patrón %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI Form1 Forma1 &Cancel &Cancelar Alt+C Alt+C &OK &Aceptar Alt+O Alt+O New Pattern Name Nombre del patrón nuevo Pattern category Categoría de patrón Pattern description Descripción patrón PlayerControl Song Mode Modo canción Playing. Reproduciendo. Stopped. Parado. Song mode selected. Modo canción seleccionado. Stop Parar Pattern Mode Modo de patrón Pattern mode selected. Modo de patrón seleccionado. Jack-transport on/off Transporte Jack si/no Jack-transport mode = On Modo de transporte Jack = Si Jack-transport mode = Off Modo de transporte Jack = No New BPM value Nuevo valor de PPM Rewind Regresar Play/ Pause Reproducir/ Pausa Fast Forward Adelantar Pause. Pausa. JACK-transport will work only with JACK driver. JACK-transport operará sólo con el controlador JACK. Loop song Repetir canción Loop song = On Repetir canción = Si Loop song = Off Repetir canción = No Show mixer Ver mezclador Mixer Mezclador Show Instrument Rack Ver rack de instrumentos Instrument rack Rack de instrumentos BeatCounter Panel on Panel del Contador de Pulsaciones sí Set BPM / Set BPM and play Fijar PPM / Fijar PPM y reproducir Jack-Time-Master on/off Jack-Time-Master sí/no BC Panel on Panel CP sí BC Panel off Panel CP no Count BPM and start PLAY Contar PPM y REPRODUCIR Count and set BPM Contar y fijar PPM Jack-Time-Master mode = On Modo Jack-Time-Master = Sí Jack-Time-Master mode = Off Modo Jack-Time-Master = no Record Grabar Destructive Record Grabación destructiva Record midi events = On Grabar eventos midi = Sí Record midi events = Off Grabar eventos midi = No Destructive mode = Off Modo destructivo = No Destructive mode = On Modo destructivo = Sí Recalculate Rubberband modified samples if bpm will change Recalcular samples modificados con Rubberband si cambian las PPM Recalculate all samples using Rubberband ON Recalcular todos los samples usando Rubberband ON Recalculate all samples using Rubberband OFF Recalcular todos los samples usando Rubberband OFF Switch metronome on/off Encender/apagar metrónomo PlaylistDialog Song list Lista de canciones Script Script exec Script Ejecutar Script Add Song to PlayList Añadir canción al Playlist No Song selected! ¡Ninguna canción seleccionada! Load Playlist Cargar Playlist Save Playlist Guardar Playlist No Song in List or no Song selected! ¡No hay Canciones en lista o no se seleccionó ninguna Canción! Hydrogen Playlist (*.sh) Playlist Hydrogen (*.sh) Add Script to selected Song Añadir Script a la Canción seleccionada No Script in use! ¡No hay Script en uso! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. No se ha Fijado un Editor por Defecto. For favor fije su Editor por Defecto No utilice un Editor de consola Lo sentimos, pero por ahora no funciona. Set your Default Editor Fije el Editor por Defecto No Script selected! ¡No se seleccionó ningún Script! Error loading song. Error al cargar la canción. sort ordena New Script Script Nuevo Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. El nombre o la ruta del script contiene espacios en blanco. IMPORTANTE La ruta al script y el nombre no pueden contener espacios en blanco. No Script! ¡No hay Script! &Playlist &Playlist Add song to Play&list Añadir canción al Play&list Add &current song to Playlist Añadir canción &actual al Playlist &Remove selected song from Playlist &Quitar canción seleccionada del Playlist &Open Playlist &Abrir Playlist &Save Playlist &Guardar Playlist Save Playlist &as Guardar Playlist &como &Scripts &Scripts &Add Script to selected song &Añadir script a canción seleccionada &Edit selected Script &Editar Script seleccionado &Remove selected Script &Quitar Script seleccionado &Create a new Script &Crear nuevo Script Rewind Regresar Play/ Pause/ Load selected song Reproducir/ Pausar/ Cargar canción seleccionada Stop Parar Fast Forward Adelantar Please save your song first Por favor guarde primero la canción WARNING, the new file is executable by the owner of the file! ¡ATENCIÓN, el nuevo archivo es ejecutable por el dueño del archivo! Pause. Pausa. Playlist Browser Navegador playlist Playlist: set song no. %1 Playlist: fijar canción nº %1 no Script no Script &New Playlist &Nuevo playlist File not found: Archivo no encontrado: No valid song selected! No se ha seleccionado una canción válida! The current playlist contains unsaved changes. Do you want to discard the changes? El playlist actual contiene cambios sin guardar. ¿Quiere descartar los cambios? &Discard &Descartar &Cancel &Cancelar Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. El nombre o la ruta del script contiene espacios en blanco. IMPORTANTE La ruta al script y al nombre del script no pueden contener espacios en blanco. PlaylistDialog_UI PlayList Browser Navegador Playlist Song list Lista de canciones PreferencesDialog Slow Lento Normal Normal Fast Rápido <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Sistema Open Sound</b><br>Controlador de audio simple [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">No compilado</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Controlador de audio de baja latencia Preferences Preferencias <b>ALSA Driver</b><br> <b>Controlador ALSA</b><br> <b>PortAudio Driver</b><br> <b>Controlador PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Controlador CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Por favor reinicie hydrogen para activar/desactivar LASH Driver restart required. Restart driver? Debe reiniciarse el controlador ¿Reiniciar controlador? &Ok &Aceptar &Cancel &Cancelar Automatic Automático Steps Pasos Fixed Fijo <b>PulseAudio Driver</b><br> <b>Controlador PulseAudio</b><br> Number of steps Número de pasos Color (Hue value) Color (Tono valor) Automatic driver selection Selección automática de driver <br><b> <br><b> </b> selected </b> seleccionado PreferencesDialog_UI Buffer size Tamaño del buffer Device Dispositivo Input Entrada Channel Canal All Todo Meters falloff speed Velocidad de caída de vúmetros Slow Lento Normal Normal Fast Rápido Application font Fuente para la aplicación Mixer font Fuente para el mixer Select font Seleccionar fuente Sample rate Tasa de muestreo 44100 44100 48000 48000 ### ### 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 8 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Form1 Forma1 Polyphony Polifonía Style Estilo &Cancel &Cancelar Alt+C Alt+C &OK &Aceptar Alt+O Alt+O &General &General Alt+R Alt+R Audio &System &Sistema de Audio Metronome volume Volumen de metrónomo Connect to &Default Output Pair Conectar a par de salida por &defecto Alt+D Alt+D 88200 88200 96000 96000 &Midi System Sistema &Midi Midi driver Controlador Midi Ignore note-off Ignorar note-off &Appearance &Apariencia &Reopen last used song &Recargar canción más reciente Restart output Reiniciar salida Audio output details Detalles salida de audio Post-Fader Post-Fader Pre-Fader Pre-Fader Track output Salida de pista Use lash Utilizar lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm primer paso, ajustar el desajuste de tiempo entre la latencia de disparo del controlador/teclado y las ppm computadas Beat counter drift compensation in 1/10 ms Compensación del desajuste del contador de pulsaciones en 1/10 ms Beat counter start offset in ms Compensación del arranque del contador de pulsaciones en ms Path to the Rubberband command-line utility Ruta a la utilidad de línea de comandos Rubberband Maximum number of bars Número máximo de compases &Reopen last used playlist &Reabrir último playlist utilizado Interpolate resampling Interpolar resampleo Linear Lineal Cosine Coseno Third Tercio Cubic Cúbico Hermite Hermite Default interface layout Formato interfaz por defecto Single pane Ventana única Tabbed Pestañas TextLabel Etiqueta Texto Coloring method for Song Editor elements Método coloreo para elementos Editor Canciones <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">Tras cambiar una fuente o el formato de interfaz se debe reiniciar la aplicación.</span></p></body></html> Use relative paths for playlist Use rutas relativas para playlist Use output note as input note Usar nota de salida como nota de entrada Discard midi messages after action has been triggered Descartar mensajes midi tras activar acción Create per-instrument outputs Crear salidas para cada instrumento Enable feedback Activar feedback &OSC &OSC Incoming port Puerto de entrada <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Puerto que se utilizará para recibir mensajes OSC entrantes</p></body></html> Enable OSC &feedback Activar OSC &feedback &Enable OSC support &Activar soporte OSC second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup segundo paso, ajusta el offset entre el último disparo del controlador/teclado y el arranque diferido del secuenciador Maximum number of instrument layers Número máximo de capas de instrumento Maximum number of layers (requires restart of Hydrogen) Número máximo de capas (require reinicio de Hydrogen) Output Salida Enable midi feedback Activar MIDI feedback SampleEditor &Ok &Aceptar &Cancel &Cancelar Close dialog! maybe there is some unsaved work on sample. Are you sure? ¡Cerrar diálogo! quizá haya trabajo sin guardar en el sample. ¿Seguir? Unsaved changes left. These changes will be lost. Are you sure? Cambios sin guardar. Estos cambios se perderán. ¿Seguir? SampleEditor_UI Dialog Diálogo P&lay original sample R&eproducir sample original &Apply Changes &Aplicar Cambios &Close &Cerrar Adjust sample start frame Ajustar marco de comienzo del sample Adjust sample loop begin frame Ajustar marco de comienzo del sample loop set processing ajustar procesamiento forward adelante reverse atrás pingpong pingpong loops loops Adjust sample end & loop end frame Ajustar marco de fin de sample & fin de loop &Play &Reproducir new sample length: nueva longitud de sample: fade-out type tipo de fundido volume volumen panorama panorama Sample length to beat: Longitud de sample a pulso: off apagado 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 8 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Afina el sample en semitonos, cents Crispness: Nitidez: 0 0 Start Empezar Loop Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">modo</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Recuento</span></p></body></html> End Fin "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Procesador Audio Rubberband" : Cambiar el tempo (longitud sample) y tono de audio. Pitch (Semitone,Cent) Tono (Semitono,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Nitidez" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalente a --no-transitorios --no-laminación --ventana-larga</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalente a --no-transitorios --no-laminación</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalente a --no-transitorios</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalente a --bl-transitorios</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 opciones de procesamiento por defecto</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalente a --no-laminación --ventana-corta (puede estar bien para baterías)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">puede encontrar más información aquí:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Manual Welcome to Hydrogen Bienvenid@ a Hydrogen Don't show this message anymore No mostrar este mensaje de nuevo Ok Aceptar Documentation index Índice de documentación SongEditorPanel Create new pattern Crear nuevo patrón Move the selected pattern down Mover el patrón seleccionado hacia abajo Move the selected pattern up Mover el patrón seleccionado hacia arriba Clear pattern sequence Eliminar la secuencia del patrón Song Editor Editor de canciones Select mode Seleccionar modo Draw mode Modo dibujo Warning, this will erase your pattern sequence. Are you sure? Atención, esto borrará tu secuencia de patrones. ¿Seguir? &Ok &Aceptar &Cancel &Cancelar stacked mode modo apilado stacked pattern mode modo patrones apilados single pattern mode modo patrón único Enable time line edit Activar edición de línea de tiempo Pattern %1 Patrón %1 View playback track Ver pista reproducción Mute playback track Silenciar pista reproducción Choose playback track Seleccionar pista reproducción View timeline Ver timeline Adjust parameter values in time Ajustar valores de parámetros en tiempo Velocity Intensidad Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Forma Edit the bpm value for current beat Editar valor de ppm para ritmo actual 500,55 500,55 Edit beat in timeline Editar ritmo en línea de tiempo 500 500 Bar Compás BPM PPM Delete this BPM Marker Borrar este marcador de PPM Delete BPM Marker Borrar marcador de PPM Cancel Cancelar Ok Aceptar SongEditorPanelTagWidget_UI Form Forma Tag Etiqueta Cancel Cancelar Ok Aceptar SongEditorPatternList Copy Copiar Delete Eliminar Properties Propiedades Fill/Clear ... Llenar/Limpiar ... Save Pattern Guardar Patrón Load Pattern Cargar Patrón Open Pattern Abrir Patrón Virtual Pattern Patrón Virtual Pattern 1 Patrón 1 not_categorized sin_categorizar The pattern-file exists. Overwrite the existing pattern? El archivo de patrones existe. ¿Sobreescribir el patron actual? &Ok &Aceptar &Cancel &Cancelar Export Pattern Exportar Patrón Could not export pattern. No se pudo exportar el patrón. Could not export sequence. No se pudo exportar la secuencia. Pattern saved. Patrón guardado. SongPropertiesDialog Song properties Propiedades de la canción SongPropertiesDialog_UI Notes Notas Author Autor Song name Título de la canción Form1 Forma1 &Cancel &Cancelar Alt+C Alt+C &OK &Aceptar Alt+O Alt+O License Licencia SoundLibraryExportDialog Export Sound Library Exportar Biblioteca de Sonidos Directory Directorio SoundLibraryExportDialog_UI Dialog Diálogo Export Exportar Drumkit Drumkit Component Componente Path Ruta Version Versión Browse... Examinar... 0.9.7 and higher 0.9.7 y siguientes 0.9.6 and lower 0.9.6 y anteriores Cancel Cancelar SoundLibraryImportDialog Sound Library import Importar de Biblioteca de Sonidos Sound library Biblioteca de sonidos Status Estado Updating SoundLibrary list... Actualizando lista de Biblioteca de Sonidos... Installed Instalación completada New Nuevo Author: %1 Autor: %1 Downloading SoundLibrary... Descargando Biblioteca de Sonidos... SoundLibrary imported in %1 Biblioteca de Sonidos importada en %1 An error occurred importing the SoundLibrary. Ocurrió un error al importar la Biblioteca de Sonidos. Import drumkit Importar drumkit Drumkits Drumkits Songs Canciones Patterns Patrones Drumkit License: %1 Licencia Drumkit: %1 Image License: %1 Licencia Imagen: %1 SoundLibraryImportDialog_UI Dialog Diálogo Internet Internet Update list Actualizar lista Sound Library Name Nombre de Biblioteca de Sonidos Author... Autor... Download and install Descargar e instalar Local file Archivo local Browse... Examinar... Install Instalar 1 1 Edit server list Editar lista de servidores Close Cerrar TextLabel Etiqueta Texto Image License... Licencia Imagen... Drumkit License... Licencia Drumkit... SoundLibraryOpenDialog Open Sound Library Abrir Biblioteca de Sonidos Load Cargar Cancel Cancelar SoundLibraryPanel Load Cargar Export Exportar Delete Eliminar System drumkits Drumkits del sistema User drumkits Drumkits del usuario &Ok &Aceptar &Cancel &Cancelar Songs Canciones Patterns Patrones Error loading song. Error al cargar la canción. Properties Propiedades Warning, the selected pattern will be deleted from disk. Are you sure? Atención, el patrón seleccionado se borrará del disco. ¿Seguir? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. No es posible borrar el drumkit cargado actualmente: "%1". Para borrar este, primero cargue otro drumkit. "%1"is a system drumkit and can't be deleted. "%1"es un drumkit del sistema y no puede ser borrado. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Atención, el drumkit "%1" será borrado del disco. ¿Seguir? Drumkit deletion failed. Error al borrar drumkit. Keep Guardar The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? El kit existente tiene %1 instrumentos pero el nuevo solo tiene %2. Los primeros %2 instrumentos serán reemplazados con los nuevos intrumentos y mantendrán sus notas, pero algunos de los instrumentos restantes tienen notas. ¿Quiere mantener o descartar los instrumentos y las notas restantes? Double click to expand the list Hacer doble clic para expandir la lista SoundLibraryPropertiesDialog_UI Dialog Diálogo Name Nombre Author Autor Information Info Save Guardar Cancel Cancelar Save changes made to instruments into sound library Guardar cambios a los instrumentos en la biblioteca de sonidos Drumkit License Licencia Drumkit Image Imagen Browse Examinar Image License Licencia Imagen SoundLibraryRepositoryDialog Edit repository settings Editar configuración repositorios Edit server list Editar lista de servidores URL URL SoundLibraryRepositoryDialog_UI Dialog Diálogo Add Añadir Delete Eliminar SoundLibrarySaveDialog Save Sound Library Guardar Biblioteca de sonidos Please supply at least a valid name Por favor proporcione al menos un nombre válido A library with the same name already exists. Do you want to overwrite the existing library? Ya existe una biblioteca con el mismo nombre. ¿Quiere sobreescribir la biblioteca existente? Saving of this library failed. Error al guardar esta biblioteca. Open Image Abrir Imagen Image Files (*.png *.jpg *.jpeg) Archivos de Imagen (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Diálogo Name Nombre Author Autor Information Info Cancel Cancelar License Licencia Save Guardar Image Imagen Browse Examinar Image License Licencia Imagen SoundLibraryTree Sound library Biblioteca de sonidos VirtualPatternDialog Select virtual pattern Seleccionar patrón virtual VirtualPatternDialog_UI Dialog Diálogo OK Aceptar Cancel Cancelar hydrogen-1.0.0-rc1/data/i18n/hydrogen_fr.ts000066400000000000000000004140521366722712400204000ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Page du projet</b><br> About À propos <b>Website</b><br> <b>Site internet</b><br> <b>Main coder and maintainer:</b><br> <b>Codeurs et mainteneurs principaux :</b><br> <b>Thanks to:</b> <b>Merci à :</b> <b>Development mailing list</b><br> <b>Liste de discussion pour le développement</b><br> AboutDialog_UI About Hydrogen À propos d'Hydrogen &OK &OK Alt+O Alt+O A&bout À &propos ### ### &Authors &Auteurs &License &Licence AudioEngineInfoForm Audio Engine Info Informations du système audio AudioEngineInfoForm_UI Playing notes En lecture Process time Temps de traitement Audio engine state État du système audio Song state État du morceau Ticks Clics Buffer size Taille du tampon Sample rate Taux d'échantillonnage Song position Position dans le morceau Patterns Motifs Selected pattern Motif choisi Selected instrument Instrument sélectionné Form1 Form1 ### ### Connected to Connecté à Frames Trames Sampler Échantillonneur Synth Synthétiseur Sequencer Séquenceur MIDI input Entrée MIDI Name Nom Audio output Sortie audio Realtime frames Trames en temps réel AudioFileBrowser Audio File Browser Navigateur de fichiers audio Size: %1 bytes Taille : %1 bytes Samplerate: %1 Fréquence : %1 Hz s s Name: Nom : Size: Taille : Samplerate: Taux d'échantillonnage : Sample length: Longueur de l'échantillon : Please do not preview samples which are longer than 10 minutes! Merci de ne pas faire des previews sur des échantillons de plus de 10 minutes! Sample length: Longueur d'échantillon : Unable to load that sample file. Impossible de charger ce fichier échantillon. AudioFileBrowser_UI Dialog Dialogue Name: Nom: Samplerate: Taux d'échantillonnage : Size: Taille : Length: Durée : Pla&y samples by clicking Jouer les échantillons en cliquant (&Y) &Up Ha&ut &Home &Home &Play Sample &Jouer l'échantillon &Filename to instrument name &Nommer l'instrument suivant le nom du fichier Open Ouvrir Cancel Annuler &Stop &Arrêter View hidden folders Voir les répertoires cachés Be careful, this change all Layer velocity settings Soyez prudent, ceci change tous les paramètres de vélocité des couches Set automatic velocity Réglage de vélocité auto ComponentMixerLine Mute Muet Solo Solo Component name Nom du composant Set instrument volume [%1] Régler le volume de l'instrument [%1] Director Director Directeur Director_UI Dialog Dialogue DonationDialog Donations Dons DonationDialog_UI Form Forme Donate! Donner ! Choose random entry. Choisir au hasard <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Hydrogen est un projet à source ouverte qui est développé par plusieurs personnes sur leur temps libre. En faisant un don, vous pouvez dire &quot;merci à vous&quot; aux personnes impliquées.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Sebastian Moors (dit : mauser) : mainteneur / développeur Michael Wolkstein (aka wolke): Forum hosting Michael Wolkstein (dit : wolke) : hébergement des forums Download Importing item failed: %1 Échec de l'importation de l'élément : %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 Kio) - temps estimé %3 ExportMidiDialog Export midi Exportation MIDI SMF1 single: export all instruments to a single track SMF1 simple : exporter tous les instruments dans une piste unique> SMF1 multi: export each instrument to separate track SMF1 multi : exporter chaque instrument dans des pistes séparées> SMF0: export all events to one track SMF0 : exporter tous les événements vers une piste> Midi file (*%1) Fichier MIDI (*%1) Export MIDI file Exporter le fichier MIDI Directory %1 does not exists Le répertoire %1 n'existe pas The file %1 exists. Overwrite the existing file? Le fichier %1 existe. Écraser le fichier existant ? ExportMidiDialog_UI Dialog Dialogue Filename Nom de fichier &Browse... &Naviguer... Alt+B Alt+B Modus: Modus : &Export &Exporter Alt+E Alt+E &Close &Fermer Alt+C Alt+C ExportSongDialog Export song Exporter le morceau The file %1 exists. Overwrite the existing file? Le fichier %1 existe déjà. Écraser le fichier existant ? Export to a single track Mode piste unique Both Mode combiné Export to separate tracks Mode multipistes Directory %1 does not exists Le répertoire %1 n'existe pas ExportSongDialog_UI &Export &Exporter &Close &Fermer Alt+C Alt+C Alt+E Alt+E &Browse... E&xplorer... Alt+B Alt+B Samplerate in Hz: L'ancienne étiquette "Taux d'échantillonnage en Hz:" était beaucoup trop longue Fréquence : 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: L'ancienne étiquette "Profondeur d'échantillonnage en Bit:" était beaucoup trop longue Résolution : 8 8 16 16 24 24 32 32 Templates: Format : WAV in CD quality "44,1kHz, 16 bit PCM" WAV en qualité CD "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV en qualité ADAT "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV en meilleure qualité "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV meilleure qualité MixDown "96kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF en qualité CD "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF en qualité ADAT "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF en meilleure qualité "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" FLAC sans perte compressé en bonne qualité "48kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis avec perte compressé en bonne qualité "VBR" Interpolation: Interpolation : Choose type of interpolation methode Choisir le type de méthode d'interpolation Linear Linéaire Cosine Cosinus Third Troisième Cubic Cubique Hermite Hermite Enable tempo changing Active les modifications de tempo TimeLine BPM Ligne de temps BPM 88200 88200 Enable use of rubberband's batch processor Autorise l'utilisation du traitement en lot de rubberband Rubberband Batch Traitement en lot Rubberband Dialog Dialogue Export directory: Répertoire d'exportation : Modus: Méthode : Choose type of interpolation method Choisir le type de la méthode d'interpolation FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Effet on/off Master output Niveau général de sortie H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Propriétés de la bibliothèque de sons &Ok &OK &Cancel &Annuler This is not possible, you can only save changes inside instruments to the current loaded sound library Cette action est impossible, vous pouvez sauvegarder les changements des instruments seulement dans la bibliothèque de sons en cours. Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Attention! Le changement du nom d'un kit de batterie créera un nouveau kit de batterie avec ce nom. Voulez-vous confirmer? Saving of this drumkit failed. La sauvegarde de ce kit de batterie a échouée Open Image Ouvrir une image Image Files (*.png *.jpg *.jpeg) Fichiers d'images (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Chargement du kit: [%1] Song Editor Éditeur de morceau Instrument + Pattern Instrument + Motif Mixer Mixeur modified modifié Song saved. Morceau sauvegardé. InstrumentEditor Random pitch factor Hauteur de tonalité aléatoire Filter Cutoff Coupure du filtre Filter resonance Résonance du filtre Attack Attaque Decay Décroissance Sustain Soutien Release Relâchement Instrument gain Gain de l'instrument Layer gain Gain de la couche Layer pitch (Coarse) Hauteur de tonalité de la couche (réglage grossier) Layer pitch (Fine) Hauteur de tonalité de la couche (réglage fin) Show instrument properties Afficher les propriétés des instruments Show layers properties Afficher les propriétés des couches New instrument name Nom du nouvel instrument General Général Layers Couches Stop the current playing instrument-note before trigger the next note sample. Arrêter la note actuelle avant de déclencher l'échantillon suivant. New component name Nom du nouveau composant Component name Nom du composant Midi out channel Canal de sortie MIDI Midi out note Note de sortie MIDI Component volume Volume du composant Don't change the layers' gain based on velocity Ne pas modifier le gain de la couche basé sur la vélocité Select pattern size Sélectionner la taille du motif InstrumentLine Clear notes Effacer les notes Randomize velocity Vélocité aléatoire Delete instrument Effacer l'instrument Fill notes ... Remplir de notes ... Fill all notes Remplir toutes les notes Fill 1/2 notes Remplir une note sur 2 Fill 1/3 notes Remplir une note sur 3 Fill 1/4 notes Remplir une note sur 4 Fill 1/6 notes Remplir une note sur 6 Fill 1/8 notes Remplir une note sur 8 Mute instrument Rendre l'instrument muet Solo Solo Copy notes ... Copier les notes... Only for this pattern Seulement pour ce motif For all patterns Pour tous les motifs Paste notes ... Coller les notes... Rename instrument Renommer l'instrument New instrument name Nom du nouvel instrument Fill 1/12 notes Remplir une note sur 12 Fill 1/16 notes Remplir une note sur 16 InstrumentRack Show Instrument editor Afficher l'éditeur d'instrument Instrument Instrument Show sound library Afficher la bibliothèque de sons Sound library Bibliothèque LadspaFXMixerLine Edit FX parameters Éditer les paramètres d'effet FX bypass Court-circuiter l'effet Ladspa FX name Nom de l'effet LADSPA Effect return Retour de l'effet LadspaFXProperties Select FX Choisir l'effet [%1] LADSPA FX Properties [%1] Propriétés de l'effet LADSPA LADSPA FX %1 Properties Propriétés de l'effet LADSPA %1 No plugin Pas de greffon Activate Activer Deactivate Désactiver Remove FX Retirer l'effet LadspaFXSelector Groups Groupes Stereo Stéréo Mono Mono Not supported Non supporté Select LADSPA FX Choisir un effet LADSPA Recently Used Utilisé récemment Alphabetic List Liste en ordre alphabétique Categorized Par catégorie LadspaFXSelector_UI Form1 Form1 ### fx label ### étiquette de l'effet ### fx type ### type d'effet ### fx ID ### ID de l'effet &Cancel &Annuler Alt+C Alt+C &OK &OK Alt+O Alt+O 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nom:</span></p></body></html> ### fx name 1 ### nom de l'effet 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Étiquette:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Auteur:</span></p></body></html> ### FX maker 1 2 ### Créateur de l'effet 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Déc. = %1 MIDI = %2 MainForm Error loading song. Erreur au chargement du morceau. Hydrogen Ready. Hydrogen est pret. &Save &Sauvegarder &Discard &Détruire Cancel Annuler Save song Sauvegarder le morceau Open song Ouvrir un morceau &New &Nouveau &Open &Ouvrir... Open &Demo Ouvrir une &démo Open &recent Ouvrir un fichier ré&cent... Save &as... Sauveg&arder sous... Export &MIDI file Exporter le morceau en fichier M&IDI... &Preferences &Préférences... &Quit &Quitter Show &audio engine info Montrer les informations du système &audio &User manual Manuel &Utilisateur &About À &propos &Cancel &Annuler Unknown audio driver Pilote audio inconnu Error starting audio driver Erreur au lancement du pilote audio Jack driver: server shutdown Pilote JACK : fermeture du serveur Jack driver: cannot activate client Pilote JACK : impossible d'activer le client Jack driver: cannot connect output port Pilote JACK : impossible de connecter le port de sortie Jack driver: error in port register Pilote JACK : impossible d'authentifier le client &Export song &Exporter le morceau en fichier WAV... &Mixer &Table de mixage... &Instrument Rack &Instruments De&bug Mode de&bug Print Objects Imprimer les objets &Info &Informations Song saved. Morceau sauvegardé. Unknown error %1 Erreur inconnue %1 Clear all instruments? Effacer tous les instruments ? Ok OK You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Vous utiliser une version d'Hydrogen en développement.<br> Merci de nous aider en envoyant des suggestions ou des problèmes sur la <a href="http://lists.sourceforge.net/mailman/listinfo/hydrogen-devel">liste de discussion d'Hydrogen</a>.<br><br>Merci ! Could not save song. Impossible de sauvegarder le morceau. Open &Pattern Ouvrir un &motif... Save Pattern as ... Sauvegarder le motif sous... Pattern saved. Motif sauvegardé. Open Pattern Ouvrir un motif Don't show this message anymore Ne plus afficher ce message Playlist: Set song No. %1 Liste de lecture: utiliser le morceau %1 Show &info &Propriétés... Expor&t pattern as... Expor&ter le motif sous... I&nstruments I&nstruments &Add instrument &Ajouter un instrument &Clear all Effacer &tout Playlist &editor &Navigateur de liste de lecture... Info|About Info|À propos Song saved as. Morceau sauvegardé sous. Playlist: Song No. %1 Liste de lecture : morceau %1 Could not export pattern. Ne peut pas exporter le motif. The document contains unsaved changes. Do you want to save the changes? Le document contient des changements non sauvegardés. Voulez-vous sauvegarder les changements? Director &Directeur Undo history Historique d'annulation &Undo &Défaire menu Undo Défaire Redo Refaire Input mode Mode d'entrée Instrument Instrument Drumkit Kit de batterie Report bug Rapporter un bogue Export &LilyPond file Exporter le morceau en fichier LilyPond... Donate Donner LilyPond file (*.ly) Fichier LilyPond (*.ly) Export LilyPond file Exporter un fichier LilyPond The current playlist contains unsaved changes. Do you want to discard the changes? La liste de lecture courante contient des modifications non-sauvegardées. Voulez-vous abandonner ces changements ? Pro&ject Pro&jet New Nouveau Open Ouvrir Properties Propriétés Save Sauvegarder Save As Sauvegarder sous Export Exporter Import Importer Online import Importer en ligne Add component Ajouter un composant Component name Nom du composant Saving of this library failed. La sauvegarde de cette bibliothèque a échouée Drum&kits &Kits de batterie &View A&ffichage &Automation path Chemin d'&automation Full screen Plein écran &Options &Options MIDI setup advice Conseil de paramétrage MIDI MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Les notes de sortie MIDI se sont pas configurées pour ce kit de batterie et donc, exporter ce morceau dans un fichier MIDI pourrait échouer. Souhaitez-vous qu'Hydrogen corrige automatiquement ceci en assignant des valeurs par défaut ? Set default values Paramètre les valeurs par défaut The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. L'export LilyPond est une fonctionnalité expérimentale. Ça devrait fonctionner comme un charme tant que vous utilisez le GM-kit, et que vous n'utilisez pas de triolet. &Timeline Ligne &temporelle &Playback track Piste de &playback Jack driver: cannot disconnect client Pilote Jack : impossible de déconnecter le client OSC Server: Cannot connect to given port, using temporary port instead Serveur OSC : impossible de se connecter au port donné, on utilise un port temporaire à la place Retrieving information about drumkit '%1' failed: drumkit does not exist. Échec de la recherche d'informations sur le kit de batterie apos;%1' : le kit n'existe pas. MasterMixerLine Set master volume [%1] Régler le volume principal [%1] Set humanize time parameter [%1] Régler les paramètres de temps humanisé [%1] Set humanize velocity parameter [%1] Régler les paramètres de vélocité humanisée [%1] Set swing factor [%1] Régler le facteur de swing [%1] Humanize velocity Vélocité humanisée Humanize time Temps humanisé Swing Swing MidiSenseWidget This element is not midi operable. Cet élément n'est pas opérable par MIDI. Waiting for midi input... Attente d'une entrée MIDI... MidiTable Event Événements Param. Param. Action Action press button to record midi event Appuyer sur le bouton pour enregistrer les événements midi Mixer Show FX panel Montrer les effets Show instrument peaks Montrer les niveaux Show instrument peaks = On Afficher les niveaux = Actif Show instrument peaks = Off Afficher les niveaux = Inactif Set FX %1 level Régler le niveau de l'effet %1 Set LADSPA FX ( %1 ) volume Régler le volume de l'effet LADSPA (%1) LADSPA effects are not available in this version of Hydrogen. Les effets LADSPA ne sont pas disponibles dans cette version d'Hydrogen. Mixer Mixeur MixerLine Play sample Jouer l'échantillon Mute Muet Solo Solo Pan Pan Instrument name (double click to edit) Nom de l'instrument (double cliquer pour éditer) Set instrument volume [%1] Régler le volume de l'instrument [%1] Set instr. pan [%1] Régler l'effet pan. de l'instrument [%1] PatternEditorPanel Hear new notes Entendre les notes ajoutées Hear new notes = On Entendre les notes ajoutées = Actif Hear new notes = Off Entendre les notes ajoutées = Inactif Pattern editor - %1 Éditeur de motif - %1 Quantize keyboard/midi events to grid Quantifier les événements clavier/MIDI sur la grille Quantize incoming keyboard/midi events = On Quantifier les événements clavier/MIDI entrant = Actif Select pattern size Sélectionner la longueur du motif Select grid resolution Sélectionner la résolution de la grille Zoom in Agrandir Zoom out Réduire No pattern selected Aucun motif sélectionné Is not possible to change the pattern size when playing. Il n'est pas possible de changer la taille d'un motif durant sa lecture. Select note properties Sélectionner les propriétés de la note Velocity Velocite Pan Pan Lead and Lag Avance et retard Loaded Soundlibrary Bibliothèque chargée Quantize incoming keyboard/midi events = Off Quantifier les événements entrant du clavier/midi = Inactif NoteKey Numéro de note destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Afficher l'éditeur piano-roll Show drum editor Afficher l'éditeur de batterie Probability Probabilité PatternFillDialog Fill with selected pattern Remplir avec le motif sélectionné PatternFillDialog_UI Cancel Annuler Form 1 Form 1 &Fill Remplir (&F) Alt+F Alt+F &Clear Effa&cer Alt+C Alt+C From: De : To: À : OK OK PatternPropertiesDialog Pattern properties Propriétés du motif %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel &Annuler Form1 Form1 Alt+C Alt+C &OK &OK Alt+O Alt+O New Pattern Name Nom du nouveau motif Pattern category Catégorie du motif Pattern description Description du motif PlayerControl Stop Arrêter Song Mode Mode morceau Pattern Mode Mode motif Playing. Lecture en cours. Stopped. Arrêté. Song mode selected. Mode morceau sélectionné. Pattern mode selected. Mode motif sélectionné. Jack-transport on/off Transport JACK actif/inactif Jack-transport mode = On Transport JACK = Actif Jack-transport mode = Off Transport JACK = Inactif Show mixer Montrer la table de mixage Rewind Reculer Play/ Pause Jouer/Pause Fast Forward Avancer Loop song Morceau en boucle Mixer Mixeur Show Instrument Rack Afficher les instruments Instrument rack Instruments Pause. Pause. JACK-transport will work only with JACK driver. Le transport JACK fonctionne seulement avec le pilote JACK. New BPM value Nouvelle valeur du BPM Loop song = On Morceau en boucle = Actif Loop song = Off Morceau en boucle = Inactif BeatCounter Panel on Activation du panneau du compteur BPM Set BPM / Set BPM and play Régler le BPM / régler le BPM et jouer Jack-Time-Master on/off JACK-time-master actif/inactif BC Panel on Panneau du compteur BPM actif BC Panel off Panneau du compteur BPM inactif Count BPM and start PLAY Compter les BPM et jouer Count and set BPM Compter et régler les BPM Jack-Time-Master mode = On Mode JACK-time-master = Actif Jack-Time-Master mode = Off Mode JACK-time-master = Inactif Record Enregistrer Destructive Record Enregistrement destructif Record midi events = On Enregistrer les événements midi = actif Record midi events = Off Enregistrer les événements midi = inactif Destructive mode = Off Mode destructif = inactif Destructive mode = On Mode destructif = actif Recalculate Rubberband modified samples if bpm will change Recalcule les échantillons modifiés par Rubberband si le BPM change Recalculate all samples using Rubberband ON Recalcule tous les échantillons qui utilisent Rubberband Recalculate all samples using Rubberband OFF Recalcule tous les échantillons qui n'utilisent pas Rubberband Switch metronome on/off Active/désactive le métronome PlaylistDialog Song list Liste de morceau Script Script exec Script Exécuter le script Add Song to PlayList Ajouter un morceau à la liste No Song selected! Aucun morceau n'est sélectionné ! Load Playlist Charger la liste Save Playlist Sauvegarder la liste No Song in List or no Song selected! Aucun morceau dans la liste ou aucun morceau de sélectionné ! Hydrogen Playlist (*.sh) Liste de lecture Hydrogen (*.sh) Add Script to selected Song Ajouter un script au morceau sélectionné No Script in use! Aucun script utilisé! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Aucun éditeur par défaut de réglé. Veuillez régler l'éditeur par défaut. N'utilisez pas un éditeur en mode console. Désolé, mais un éditeur en mode console ne fonctionne pas pour l'instant. Set your Default Editor Régler votre éditeur par défaut No Script selected! Aucun script de sélectionné ! Error loading song. Erreur au chargement du morceau. sort Trier New Script Nouveau script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Le nom ou le chemin du script contient des espaces. IMPORTANT Le chemin d'accès au script et le nom du script ne doivent pas contenir d'espaces. No Script! Aucun script! &Playlist &Liste de lecture Add song to Play&list &Ajouter un morceau à la &liste Add &current song to Playlist Ajouter &ce morceau à la liste &Remove selected song from Playlist &Retirer le morceau sélectionné &Open Playlist &Ouvrir une liste de lecture &Save Playlist &Sauvegarder la liste Save Playlist &as S&auvegarder sous... &Scripts &Scripts &Add Script to selected song &Ajouter un script au morceau sélectionné &Edit selected Script Édit&er le script sélectionné &Remove selected Script &Retirer le script sélectionné &Create a new Script &Créer un nouveau script Rewind Reculer Play/ Pause/ Load selected song Lecture/ Pause/ Chargement du morceau sélectionné Stop Arrêter Fast Forward Avancer Please save your song first Veuillez sauvegarder votre morceau d'abord WARNING, the new file is executable by the owner of the file! ATTENTION, le nouveau fichier est exécutable par le propriétaire du fichier! Pause. Pause. Playlist Browser Navigateur de liste de lecture Playlist: set song no. %1 Liste : choisir le morceau #%1 no Script Aucun script &New Playlist Nouvelle liste de lecture File not found: Fichier non-trouvé : No valid song selected! Pas de morceau valide sélectionné ! &Discard Aband&onner &Cancel Ann&uler The current playlist contains unsaved changes. Do you want to discard the changes? La liste de lecture actuelle contient des modifications non-sauvegardées. Voulez-vous abandonner ces changements ? Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Le nom du script ou le chemin vers le script contient des espaces. IMPORTANT Le chemin vers le script et le nom du script doivent être sans espaces. PlaylistDialog_UI PlayList Browser Navigateur de liste de lecture Song list Liste de morceaux PreferencesDialog Slow Lent Normal Normal Fast Rapide <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Pilote audio simple [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Non compilé</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Pilote Jack Audio Connection Kit</b><br>Pilote audio faible latence Preferences Préférences <b>ALSA Driver</b><br> <b>Pilote ALSA</b><br> <b>PortAudio Driver</b><br> <b>Pilote PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Pilote CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Veuillez relancer Hydrogen pour activer/désactiver le support LASH Driver restart required. Restart driver? Redémarrage de pilote nécessaire. Redémarrer le pilote? &Ok &OK &Cancel &Annuler Automatic Automatique Steps Par pas Fixed Fixe <b>PulseAudio Driver</b><br> <b>Pilote PulseAudio</b><br> Number of steps Nombre de pas Color (Hue value) Couleur (valeur Hue) Automatic driver selection Sélection de pilote automatique <br><b> </b> selected </b> sélectionné PreferencesDialog_UI Sample rate Taux d'échantillonnage Device Périphérique audio Buffer size Taille du tampon Polyphony Polyphonie Input Entrée Channel Canal All Tous Slow Lent Normal Normal Fast Rapide Meters falloff speed Vitesse de chute des niveaux Application font Police de l'application Select font Choisir la police Mixer font Police de la table de mixage Style Style &Cancel &Annuler 88200 88200 96000 96000 Midi driver Pilote MIDI Form1 Form1 Alt+C Alt+C &OK &OK Alt+O Alt+O &General &Général &Reopen last used song Ouvrir le dernier mo&rceau à chaque démarrage de l'application Alt+R Alt+R Audio &System &Système Audio ### ### 44100 44100 48000 48000 Connect to &Default Output Pair Connecter à la paire de sortie par &défaut Alt+D Alt+D Metronome volume Volume du métronome &Midi System Système MIDI Ignore note-off Ignorer les fins de note (note-off) 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 &Appearance &Apparence Restart output Redémarrer la sortie Audio output details Détails de la sortie audio Post-Fader Post-équilibreur Pre-Fader Pré-équilibreur Track output Piste de sortie Use lash Utiliser LASH (système de gestion de session JACK/ALSA) first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm première étape: synchroniser la latence du déclencheur du contrôleur/clavier et le BPM calculé. Beat counter drift compensation in 1/10 ms Compensation en 1/10ms de la dérive du compteur de battement Beat counter start offset in ms Début en ms du compteur de battement Path to the Rubberband command-line utility Chemin vers l'utilitaire en ligne de commande Rubberband Maximum number of bars Nombre de barres maximum &Reopen last used playlist &Ré-ouvrir la dernière liste de lecture utilisée Interpolate resampling Interpoler le ré-échantillonnage Linear Linéaire Cosine Cosinus Third Troisième Cubic Cubique Hermite Hermite Default interface layout Agencement de l'interface par défaut Single pane Tout-en-un Tabbed Plusieurs onglets TextLabel Label de texte Coloring method for Song Editor elements Méthode de colorisation des éléments de l'éditeur de morceau <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">Après avoir modifié une police ou l'agencement de l'interface, l'application doit être redémarrée.</span></p></body></html> Use relative paths for playlist Utiliser des chemins relatifs pour la liste de lecture Use output note as input note Utiliser la note de sortie en tant que note d'entrée Discard midi messages after action has been triggered Abandonner les messages MIDI après que l'action ait été déclenchée Create per-instrument outputs Créer une sortie par instrument Enable feedback Activer la boucle de retour &OSC &OSC &Enable OSC support Activ&e le support OSC Incoming port Port entrant <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Le port qui sera utilisé pour recevoir les messages OSC entrant</p></body></html> Enable OSC &feedback Activer la &boucle de retour OSC second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup seconde étape, ajuste le décalage entre le dernier contrôleur/clavier déclencheur et le début du séquenceur différé Maximum number of instrument layers Nombre maximal de couches d'instruments Maximum number of layers (requires restart of Hydrogen) Nombre maximum de couches (nécessite le redémarrage d'Hydrogen) Output Sortie Enable midi feedback Activer le retour d'information MIDI SampleEditor &Ok &OK &Cancel &Annuler Close dialog! maybe there is some unsaved work on sample. Are you sure? Fermeture de la boite de dialogue! Peut être y a-t'il du travail non sauvegardé sur l'échantillon. Êtes-vous sûr ? Unsaved changes left. These changes will be lost. Are you sure? Il reste des changements non sauvegardés. Ces changements seront perdus. Êtes-vous sûr ? SampleEditor_UI Dialog Dialogue P&lay original sample &Lecture de l'échantillon original &Apply Changes &Appliquer les modifications &Close &Fermer Adjust sample start frame Ajuster le point de départ de l'échantillon Adjust sample loop begin frame Ajuster le début de la boucle de l'échantillon set processing paramètrer le traitement forward vers l'avant reverse inversé pingpong ping-pong loops boucles Adjust sample end & loop end frame Ajuster le point d'arrivé de l'échantillon &Play Jouer (&P) new sample length: nouvelle longueur de l'échantillon: fade-out type type fondu à la fermeture volume volume panorama panoramique 0 0 1 1 2 2 3 3 4 4 5 5 off off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Sample length to beat: Pitch the sample in semitones, cents Accorder l'échantillon en demi-tons, cents Crispness: Croustillance : Start Départ Loop Boucle <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End Fin "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Processeur audio Rubberband" : Modifie le tempo et la hauteur de l'échantillon. Pitch (Semitone,Cent) Hauteur (Demi-ton,cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"niveaux de croustillance" :</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 équivalent à --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 équivalent à --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 équivalent à --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 équivalent à --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 options de traitement par défault </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 équivalent à --no-lamination --window-short (pourrait être bon pour les tambours)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vous pouvez trouver davantage d'information ici :</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Manuel Ok OK Welcome to Hydrogen Bienvenue dans Hydrogen Don't show this message anymore Ne plus afficher ce message Documentation index Index de la documentation SongEditorPanel Create new pattern Créer un nouveau motif Move the selected pattern down Descendre le motif sélectionné Move the selected pattern up Monter le motif sélectionné Song Editor Éditeur de morceau &Cancel &Annuler Clear pattern sequence Effacer la séquence de motifs Select mode Mode sélection Draw mode Mode dessin Warning, this will erase your pattern sequence. Are you sure? Attention, cette action effacera la séquence de motifs. Voulez-vous continuer? &Ok &OK stacked mode Mode en pile stacked pattern mode Mode en pile de motif single pattern mode Mode à un motif Enable time line edit Active l'édition de la ligne de temps Pattern %1 Motif %1 View playback track Afficher la piste de lecture Mute playback track Silencer la piste de lecture Choose playback track Choisir la piste de lecture View timeline Afficher la ligne de temps Adjust parameter values in time Ajuster les valeurs des paramètre dans le temps Velocity Vélocité Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Forme Edit the bpm value for current beat Éditer la valeur du bpm pour la mesure actuelle 500,55 500,55 Edit beat in timeline Éditer la mesure dans la TimeLine 500 500 Bar Barre BPM BPM Delete this BPM Marker Effacer ce marqueur BPM Delete BPM Marker Effacer les marqueurs BPM Cancel Annuler Ok OK SongEditorPanelTagWidget_UI Form Forme Tag Tag Cancel Annuler Ok OK SongEditorPatternList Copy Copier Delete Effacer Properties Propriétés Fill/Clear ... Remplir/Effacer ... Save Pattern Sauvegarder un motif Load Pattern Charger un motif Open Pattern Ouvrir un motif Virtual Pattern Motif virtuel Pattern 1 Motif 1 not_categorized Sans catégorie The pattern-file exists. Overwrite the existing pattern? Le fichier de motif existe. Écraser le motif existant ? &Ok &OK &Cancel &Annuler Export Pattern Exporter le motif Could not export pattern. Ne peut pas exporter le motif. Could not export sequence. Ne peut pas exporter la séquence. Pattern saved. Motif sauvegardé. SongPropertiesDialog Song properties Propriétés du morceau SongPropertiesDialog_UI Song name Nom du morceau Author Auteur Notes Notes &Cancel &Annuler Form1 Form1 &OK &OK Alt+O Alt+O Alt+C Alt+C License Licence SoundLibraryExportDialog Export Sound Library Exporter la bibliothèque de son Directory Répertoire SoundLibraryExportDialog_UI Dialog Dialogue Export Exporter Drumkit Kit de batterie Component Composant Path Chemin Version Version Browse... Explorer... 0.9.7 and higher 0.9.7 et supérieur 0.9.6 and lower 0.9.6 et inférieur Cancel Annuler SoundLibraryImportDialog Sound Library import Importation de la bibliothèque de sons Sound library Bibliothèque de sons Status Statut Updating SoundLibrary list... Mise à jour de la liste de la bibliothèque de sons... Installed Installé New Nouveau Author: %1 Auteur : %1 Downloading SoundLibrary... Téléchargement de la bibliothèque de sons... Import drumkit Importer un kit de batterie SoundLibrary imported in %1 La bibliothèque de sons a été importée dans %1 An error occurred importing the SoundLibrary. Une erreur s'est produite lors de l'importation de la bibliothèque de sons. Drumkits Kits de batterie Songs Morceaux Patterns Motifs Drumkit License: %1 Licence du kit de batterie : %1 Image License: %1 Licence de l'image : %1 SoundLibraryImportDialog_UI Dialog Dialogue Internet Internet Update list Mettre à jour la liste Sound Library Name Nom de la bibliothèque de sons Author... Auteur... Download and install Télécharger et installer Local file Fichier local Browse... Explorer... Install Installer 1 1 Edit server list Éditer la liste des serveurs Close Fermer TextLabel Label de texte Image License... Licence de l'image... Drumkit License... Licence du kit de batterie... SoundLibraryOpenDialog Open Sound Library Ouvrir une bibliothèque de son Load Charger Cancel Annuler SoundLibraryPanel Load Charger Export Exporter Delete Effacer System drumkits Kits de batterie du système User drumkits Kits de batterie de l'utilisateur &Ok &OK &Cancel &Annuler Songs Morceaux Patterns Motifs Error loading song. Erreur au chargement du morceau. Properties Propriété Warning, the selected pattern will be deleted from disk. Are you sure? Attention, le motif sélectionné sera effacé du disque. Voulez-vous continuer? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Il n'est pas possible de supprimer le kit de batterie actuellement chargé : "%1". Pour effacer ce kit de batterie, chargez d'abord un autre kit. "%1"is a system drumkit and can't be deleted. "%1" est un kit système et ne peut pas être effacé. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Attention, le kit "%1" va être effacé du disque. Êtes-vous certain ? Drumkit deletion failed. Échec de la suppression du kit. Keep Conserver The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Le kit existant possède %1 instruments mais le nouveau en a seulement %2. Les %2 premiers instruments seront remplacés avec les nouveaux instruments et conserveront leurs notes, mais certains des instruments restant possèdent des notes. Souhaitez-vous conserver ou abandonner les instruments et notes restant ? Double click to expand the list Double-clic pour étendre la liste SoundLibraryPropertiesDialog_UI Dialog Dialogue Name Nom Author Auteur Information Information Save Enregistrer Cancel Annuler Save changes made to instruments into sound library Enregistrer les changements appliqués aux instruments dans la bibliothèque de sons Drumkit License Licence du kit de batterie Image Image Browse Naviguer Image License Licence de l'image SoundLibraryRepositoryDialog Edit repository settings Éditer les préférences du dépôt Edit server list Éditer la liste des serveurs URL URL SoundLibraryRepositoryDialog_UI Dialog Dialogue Add Ajouter Delete Effacer SoundLibrarySaveDialog Save Sound Library Enregistrer la bibliothèque de sons Please supply at least a valid name S'il vous plaît, mettez au moins un nom valide A library with the same name already exists. Do you want to overwrite the existing library? Une bibliothèque avec le même nom existe déjà. Voulez-vous la remplacer ? Saving of this library failed. La sauvegarde de cette bibliothèque a échouée Open Image Ouvrir l'image Image Files (*.png *.jpg *.jpeg) Fichiers d'images (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Dialogue Name Nom Author Auteur Information Information Cancel Annuler License Licence Save Enregistrer Image Image Browse Naviguer Image License Licence de l'image SoundLibraryTree Sound library Bibliothèque VirtualPatternDialog Select virtual pattern Sélectionner un motif virtuel VirtualPatternDialog_UI Dialog Dialogue OK OK Cancel Annuler hydrogen-1.0.0-rc1/data/i18n/hydrogen_gl.ts000066400000000000000000003774531366722712400204100ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Páxina do proxecto</b><br> About Sobre <b>Website</b><br> <b>Sitio web</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen Sobre Hydrogen &OK &Aceptar Alt+O Alt+A A&bout &Sobre ### ### &Authors &Autores &License &Licenza AudioEngineInfoForm Audio Engine Info Información do motor de son AudioEngineInfoForm_UI Playing notes Polifonía Process time Tempo de procesado Audio engine state Estado do motor de son Song state Estado da canción Ticks Marcas Buffer size Tamaño do búfer Sample rate Taxa de mostraxe Song position Posición da canción Patterns Patróns Selected pattern Patrón seleccionado Selected instrument Instrumento seleccionado Form1 Forma1 ### ### Connected to Conectado a Frames Marcos Sampler Mostreador Synth Sintetizador Sequencer Secuenciador MIDI input Entrada MIDI Name Nome Audio output Saída de son Realtime frames Cadros en tempo real AudioFileBrowser Audio File Browser Navegador de ficheiros de son s s Name: Nome: Size: Tamaño: Samplerate: Taxa de mostraxe: Size: %1 bytes Tamaño: %1 bytes Samplerate: %1 Taxa de mostraxe: %1 Sample length: Lonxitude da mostra: Please do not preview samples which are longer than 10 minutes! Non faga escoitas previas de mostras de máis de 10 minutos! Sample length: Lonxitude da mostra: Unable to load that sample file. AudioFileBrowser_UI Dialog Diálogo Name: Nome: Samplerate: Taxa de mostraxe: Size: Tamaño: Length: Lonxitude: Pla&y samples by clicking &Reproducir mostras premendo &Up &Arriba &Home &Inicio &Play Sample &Reproducir mostra &Filename to instrument name Nome de &ficheiro para nome de instrumento Open Abrir Cancel Cancelar &Stop &Parar View hidden folders Ver os cartafoles agochados Be careful, this change all Layer velocity settings Teña tino, isto cambio todos os axustes da capas de velocidade Set automatic velocity Estabelecer a velocidade automaticamente ComponentMixerLine Mute Silencio Solo Solo Component name Set instrument volume [%1] Estabelecer o volume do instrumento [%1] Director Director Director Director_UI Dialog Diálogo DonationDialog Donations DonationDialog_UI Form Forma Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - transcorrido %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Exportar ficheiro MIDI Directory %1 does not exists The file %1 exists. Overwrite the existing file? O ficheiro %1 xa existe. Sobrescribir o ficheiro existente? ExportMidiDialog_UI Dialog Diálogo Filename &Browse... E&xaminar... Alt+B Alt+X Modus: &Export &Exportar Alt+E Alt+E &Close &Pechar Alt+C ExportSongDialog Export song Exportar canción Export to a single track Exportar a unha única pista Both Ambas The file %1 exists. Overwrite the existing file? O ficheiro %1 xa existe. Sobrescribir o ficheiro existente? Export to separate tracks Directory %1 does not exists ExportSongDialog_UI &Export &Exportar &Close &Pechar Alt+C Alt+P Alt+E Alt+E &Browse... E&xaminar... Alt+B Alt+X Samplerate in Hz: Taxa de mostraxe en Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Profundidade da mostra en Bit: 8 8 16 16 24 24 32 32 Templates: Modelos: WAV in CD quality "44,1kHz, 16 bit PCM" WAV en calidade CD «44,1kHz, 16 bit PCM» WAV in ADAT quality "48 kHz, 16 bit PCM" WAV en calidade ADAT «48 kHz, 16 bit PCM» WAV in better quality "48 kHz, 24 bit PCM" WAV na mellor calidade «48 kHz, 24 bit PCM» WAV LOFI "22.05kHz, 8 bit PCM WAV LOFI «22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV na mellor calidade de mistura «96 kHz, 32 bit PCM» AIFF in CD quality "41 kHz, 16 bit PCM" AIFF en calidade CD «41 kHz, 16 bit PCM» AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF en calidade ADAT «48 kHz, 16 bit PCM» AIFF in better quality "48 kHz, 24 bit PCM" AIFF na mellor calidade «48 kHz, 24 bit PCM» FLAC lossless compressor in good quality "48 kHz" FLAC compresión sen perdas en boa calidade «48 kHz» OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis compresión suave en boa calidade «VBR" Interpolation: Interpolación: Choose type of interpolation methode Escolla o tipo do método de interpolación Linear Lineal Cosine Coseno Third Terceiro Cubic Cúbico Hermite Hermite Enable tempo changing Activar o cambio de tempo TimeLine BPM Liña de tempo BPM Enable use of rubberband's batch processor Rubberband Batch 88200 88200 Dialog Diálogo Export directory: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Efectos si/non Master output Saída principal H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Etiqueta H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Propiedades da biblioteca de son &Ok &Aceptar &Cancel &Cancelar This is not possible, you can only save changes inside instruments to the current loaded sound library Isto non é posíbel, só se pode gardar os cambios dentro dos instrumentos para a biblioteca de son cargada actualmente Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Aviso! O cambio do nome da batería resultará na creación dunha nova batería con este nome. Está seguro? Saving of this drumkit failed. Non foi posíbel gardar esta batería. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Batería cargada: [%1] Song Editor Editor de cancións Instrument + Pattern Instrumento + Patrón Mixer Misturador modified Song saved. Canción gardada. InstrumentEditor Random pitch factor Factor aleatorio de ton Filter Cutoff Filtro de corte Filter resonance Filtro de resonancia Attack Ataque Decay Decaemento Sustain Sustain Release Publicación Instrument gain Ganancia do instrumento Layer gain Ganancia da capa Layer pitch (Coarse) Afinación da capa (grosa) Layer pitch (Fine) Afinación da capa (fina) Show instrument properties Amosar o editor de instrumento Show layers properties Mostrar propiedades de capas New instrument name Novo nome do instrumento General Xeral Layers Capas Stop the current playing instrument-note before trigger the next note sample. Deteña a nota do instrumento actual antes de disparar a seguinte nota da mostra. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Seleccionar o tamaño do patrón InstrumentLine Clear notes Limpar notas Randomize velocity Velocidade ao chou Delete instrument Eliminar instrumento Mute instrument Silenciar instrumento Solo Solo Fill notes ... Encher notas ... Fill all notes Encher todas as notas Fill 1/2 notes Encher as notas 1/2 Fill 1/3 notes Encher as notas 1/3 Fill 1/4 notes Encher as notas 1/4 Fill 1/6 notes Encher as notas 1/6 Fill 1/8 notes Encher as notas 1/8 Copy notes ... Copiar as notas ... Only for this pattern Só para este patrón For all patterns Para todos os patróns Paste notes ... Pegar notas ... Rename instrument New instrument name Novo nome do instrumento Fill 1/12 notes Encher as notas 1/8 {1/12 ?} Fill 1/16 notes Encher as notas 1/8 {1/16 ?} InstrumentRack Show Instrument editor Amosar o editor de instrumento Instrument Instrumento Show sound library Amosar a biblioteca de son Sound library Biblioteca de son LadspaFXMixerLine Edit FX parameters Editar os parámetros do efecto FX bypass Derivación do efecto Ladspa FX name Nome do efecto LADSPA Effect return Retorno de efectos LadspaFXProperties Select FX Seleccionar efecto [%1] LADSPA FX Properties [%1] Propiedades do efecto LADSPA LADSPA FX %1 Properties Propiedades do efecto LADSPA %1 No plugin Sen engadido Activate Activar Deactivate Desactivar Remove FX Retirar efectos LadspaFXSelector Groups Grupos Stereo Estéreo Mono Mono Not supported Non admitido Select LADSPA FX Seleccionar o efecto LADSPA Recently Used Usado recentemente Alphabetic List Lista alfabética Categorized Categorizado LadspaFXSelector_UI Form1 Forma1 ### fx label ### etiqueta do efecto ### fx type ### tipo do efecto ### fx ID ### ID do efecto &Cancel &Cancelar Alt+C Alt+C &OK &Aceptar Alt+O Alt+A 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> ### fx name 1 ### nome do efecto 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etiqueta:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tipo:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Creador:</span></p></body></html> ### FX maker 1 2 ### Creador de efectos 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Dereitos de autoría:</span></p></body></html> ### copyright 1 2 3 ### dereitos de autoría 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Dec. = %1 MIDI = %2 MainForm Error loading song. Produciuse u erro ao cargar a canción. Hydrogen Ready. Hydrogen Preparado. &Save &Gardar &Discard &Desbotar Cancel Cancelar Save song Gardar a canción Open song Abrir unha canción &New &Novo &Open &Abrir Open &Demo Abrir &demostración Open &recent Open &recente Save &as... Gardar &como... Export &MIDI file Exportar ficheiro &MIDI &Preferences &Preferencias &Quit &Saír Show &audio engine info Amosar información do motor de &son &User manual Manual de &usuario &About &Sobre &Cancel &Cancelar Unknown audio driver Controlador de son descoñecido Error starting audio driver Produciuse un erro ao iniciar o controlador de son Jack driver: server shutdown Controlador Jack: pechar o servidor Jack driver: cannot activate client Controlador Jack: non é posíbel activar o cliente Jack driver: cannot connect output port Controlador Jack: non é posíbel conectar ao porto de saída Jack driver: error in port register Controlador Jack: produciuse un erro no rexistro do porto &Export song &Exportar canción &Mixer &Mesturador &Instrument Rack Armario de &instrumentos De&bug &Depurar Print Objects Imprimir obxectos &Info &Información Song saved. Canción gardada. Unknown error %1 Erro descoñecido: %1 Clear all instruments? Limpar todos os instrumento? Ok Aceptar Could not save song. Non foi posíbel gardar a canción. Open &Pattern Abrir un &patrón Save Pattern as ... Gardar o patrón como... Pattern saved. Patrón gardado. Open Pattern Abrir un patrón Playlist: Set song No. %1 Lista de reprodución: estabelecer canción num. %1 Show &info Amosar &información Expor&t pattern as... Expor&tar o patrón como... I&nstruments I&nstrumentos &Add instrument &Engadir instrumento &Clear all &Limpar todo Playlist &editor &Editor de listas de reprodución Song saved as. Canción gardada como. Playlist: Song No. %1 Lista de reprodución: canción num. %1 Could not export pattern. Non foi posíbel exportar o patrón. The document contains unsaved changes. Do you want to save the changes? O documento conten cambios sen gardar. Quere gardar os cambios? Undo history Desfacer o historial &Undo &Desfacer menu Undo Desfacer Redo Refacer Director Director Input mode Modo de entrada Instrument Instrumento Drumkit Batería Info|About Información|Sobre Report bug Informar dun fallo You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Está a usar unha versión de desenvolvemento de Hydrogen, axúdenos informándonos dos fallos ou con suxestións na la lista de correo hydrogen-devel.<br><br>Grazas! Don't show this message anymore Non volver amosar esta mensaxe Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Novo Open Abrir Properties Propiedades Save Save As Export Exportar Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Estabelecer o volume principal [%1] Set humanize time parameter [%1] Parámetro de humanización do tempo [%1] Set humanize velocity parameter [%1] Parámetro de humanización da velocidade [%1] Set swing factor [%1] Factor de swing [%1] Humanize velocity Humanizar a velocidade Humanize time Humanizar o tempo Swing Swing MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Actividade Param. Parám. Action Acción press button to record midi event prema o botón para gravar a actividade MIDI Mixer Show FX panel Amosar o panel do efecto Show instrument peaks Amosar os picos do instrumento Show instrument peaks = On Amosar os picos do instrumento = Si Show instrument peaks = Off Amosar os picos do instrumento = Non Set FX %1 level Nivel do efecto %1 Set LADSPA FX ( %1 ) volume Volume do efecto LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer MixerLine Play sample Reproducir mostra Mute Silencio Solo Solo Pan Panorama Instrument name (double click to edit) Nome do instrumento (premer dúas veces para modificar) Set instrument volume [%1] Estabelecer o volume do instrumento [%1] Set instr. pan [%1] Estabelecer o panorama do instrumento [%1] PatternEditorPanel Hear new notes Escoitar notas novas Hear new notes = On Escoitar notas novas = Si Hear new notes = Off Escoitar notas novas = Non Pattern editor - %1 Editor de patróns - %1 Quantize keyboard/midi events to grid Cuantizar eventos de teclado/midi á rella Quantize incoming keyboard/midi events = On Cuantizar eventos teclado/MIDI entrantes = Si Select pattern size Seleccionar o tamaño do patrón Select grid resolution Seleccionar a resolución da rella Zoom in Acercar Zoom out Afastar No pattern selected Non hai ningún patrón seleccionado Is not possible to change the pattern size when playing. Non é posíbel cambiar o tamaño do patrón durante a reprodución. Select note properties Seleccionar as propiedades da nota Velocity Velocidade Pan Panorama Lead and Lag Adianto e atraso Loaded Soundlibrary Cargada a biblioteca de son Quantize incoming keyboard/midi events = Off Cuantizar eventos teclado/MIDI entrantes = Non Show piano roll editor Amosar o editor da pianola destructive mode pre delete settings modo destrutivo borra previamente os axustes destructive mode post delete settings modo destrutivo borra posteriormente os axustes NoteKey Clave da nota Show drum editor Amosar o editor de baterías Probability PatternFillDialog Fill with selected pattern Encher co patrón seleccionado PatternFillDialog_UI Cancel Cancelar Form 1 Forma 1 &Fill &Encher Alt+F Alt+E &Clear &Limpar Alt+C Alt+L From: De: To: A: OK Aceptar PatternPropertiesDialog Pattern properties Propiedades do patron %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel &Cancelar Form1 Forma 1 Alt+C Alt+C &OK &Aceptar Alt+O Alt+A New Pattern Name Novo nome do patrón Pattern category Categoría de patrónss Pattern description Descrición do patrón PlayerControl Stop Deter Song Mode Modo canción Pattern Mode Modo patrón Playing. Reproducindo. Stopped. Detido. Song mode selected. Seleccionado o modo canción. Pattern mode selected. Seleccionado o modo patrón. Jack-transport on/off Transporte Jack si/non Jack-transport mode = On Modo de transporte Jack = Si Jack-transport mode = Off Modo de transporte Jack = Non Show mixer Amosar o misturador Rewind Regresar Play/ Pause Reproducir/ Pausa Fast Forward Adiantar Loop song Repetir canción Mixer Mesturador Show Instrument Rack Amosar o armario de instrumentos Instrument rack Armario de instrumentos Pause. Pausa. JACK-transport will work only with JACK driver. JACK-transport operará só co controlador JACK. New BPM value Novo valor de PPM Loop song = On Repetir canción = Si Loop song = Off Repetir canción = Non BeatCounter Panel on Panel de Conta_de_pulsos (beats) activado Set BPM / Set BPM and play Estabelecer os BPM / Estabelecer os BPM e reproducir Jack-Time-Master on/off Tempo mestre do JACK activado/apagado BC Panel on Panel CdeG activado BC Panel off Panel CdeG apagado Count BPM and start PLAY Contar os BPM e iniciar a reprodución Count and set BPM Contar e estabelecer os BPM Jack-Time-Master mode = On Modo do tempo mestre do JACK = activado Jack-Time-Master mode = Off Modo do tempo mestre do JACK = apagado Record Gravar Destructive Record Gravación destrutiva Recalculate Rubberband modified samples if bpm will change Volver calcular as mostras modificadas con Rubberband se cambian os BPM Switch metronome on/off Acender/apagar o metrónomo Record midi events = On Gravar accións MIDI = Acendido Record midi events = Off Gravar accións MIDI = Apagado Destructive mode = Off Modo destrutivo = Apagado Destructive mode = On Modo destrutivo = Acendido Recalculate all samples using Rubberband ON Volver calcular todas as mostras usando Rubberband ACTIVADO Recalculate all samples using Rubberband OFF Volver calcular todas as mostras usando Rubberband DESACTIVADO PlaylistDialog Song list Lista de cancións Script Script exec Script Executar script Add Song to PlayList Engadir unha canción á lista de reprodución No Song selected! Non se seleccionou ningunha canción! Load Playlist Cargar a lista de reprodución Save Playlist Gardar a lista de reprodución No Song in List or no Song selected! Non hai ningunha canción na lista ou non se seleccionou ningunha canción! Hydrogen Playlist (*.sh) Lista de reprodución do Hydrogen (*.sh) Add Script to selected Song Engadir script á canción seleccionada No Script in use! Non hai ningún script en uso! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Non se estabeleceu un editor predeterminado. Configure o seu editor predeterminado Non utilice un editor baseado na consola Sentímolo, mais isto non vai a funcionar polo de agora. Set your Default Editor Estabelecer o seu editor predeterminado No Script selected! Non se seleccionou ningún script! Error loading song. Produciuse u erro ao cargar a canción. sort ordenar New Script Novo script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. O nome do script ou a ruta ao script contén espazos en branco. IMPORTANTE A ruta ao script e o nome do script non pode conter espazos en branco. No Script! Non hai ningún script! &Playlist &Lista de reprodución Add song to Play&list Engadir unha canción á &lista de reprodución Add &current song to Playlist Engadir a canción a&ctual á &lista de reprodución &Remove selected song from Playlist &Retirar as cancións seleccionadas da lista de reprodución &Open Playlist &Abrir a lista de reprodución &Save Playlist &Gardar a lista de reprodución Save Playlist &as Gardar a lista de reprodución &como &Scripts &Scripts &Add Script to selected song &Engadir script á canción seleccionada &Edit selected Script &Editar o script seleccionado &Remove selected Script &Retirar o script seleccionado &Create a new Script &Crear un script novo Rewind Regresar Play/ Pause/ Load selected song Reproducir/ Pausar/ Cargar/ a canción seleccionada Stop Deter Fast Forward Adiantar Please save your song first Garde primeiro a súa canción WARNING, the new file is executable by the owner of the file! AVISO, o novo ficheiro é executábel polo seu propietario! Pause. Pausa. Playlist Browser Navegador de listas de reprodución &New Playlist &Nova lista de reprodución no Script non hai script File not found: Non se atopou o ficheiro: No valid song selected! A canción seleccionada non é correcta! Playlist: set song no. %1 Lista de reprodución: estabelecer a canción num. %1 The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Desbotar &Cancel Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. PlaylistDialog_UI PlayList Browser Navegador de listas de reprodución Song list Lista de cancións PreferencesDialog Slow Lento Normal Normal Fast Rápido <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Sistema Open Sound</b><br>Controlador simple de son [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Sen compilar</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Controlador de audio de baixa latencia Preferences Preferencias <b>ALSA Driver</b><br> <b>Controlador ALSA</b><br> <b>PortAudio Driver</b><br> <b>Controlador PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Controlador CoreAudio </b><br> Please restart hydrogen to enable/disable LASH support Reinicie o Hydrogen para activar/desactivar a compatibilidade LASH Driver restart required. Restart driver? É necesario reiniciar o controlador. Reiniciar o controlador? &Ok &Aceptar &Cancel &Cancelar <b>PulseAudio Driver</b><br> <b>Controlador PulseAudio </b><br> Automatic Steps Fixed Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Sample rate Taxa de mostraxe Device Dispositivo Buffer size Tamaño do búfer Polyphony Polifonía Input Entrada Channel Canle All Todo Slow Lento Normal Normal Fast Rápido Meters falloff speed Velocidade de caída de vúmetros Application font Tipo de letra para o aplicativo Select font Seleccionar o tipo de letra Mixer font Tipo de letra para o mesturador Style Estilo &Cancel &Cancelar 88200 88200 96000 96000 Midi driver Controlador MIDI Form1 Forma1 Alt+C Alt+C &OK &Aceptar Alt+O Alt+A &General &Xeral &Reopen last used song &Volver abrir a última canción usada Alt+R Alt+R Audio &System &Sistema de son ### ### 44100 44100 48000 48000 Connect to &Default Output Pair Conectar co par de saída &predeterminado Alt+D Alt+P Metronome volume Volume do metrónomo &Midi System Sistema &MIDI Ignore note-off Ignorar note-off 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 &Appearance &Aparencia Restart output Reiniciar a saída Audio output details Detalles da saída de son Post-Fader Post-atenuación Pre-Fader Pre-atenuación Track output Saída da pista Use lash Usar LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm primeiro paso, axuste do desfase temporal entre a latencia do disparador do controlador/teclado e o BPM calculado Beat counter drift compensation in 1/10 ms Compensación en 1/10ms da deriva do contador de pulsos Beat counter start offset in ms Desprazamento en ms do inicio do contador de pulsos Path to the Rubberband command-line utility Ruta á utilidade en liña de ordes Rubberband Maximum number of bars Número máximo de compases &Reopen last used playlist &Volver abrir a última lista de reprodución usada Interpolate resampling Sobremostraxe interpolado Linear Lineal Cosine Coseno Third Terceira Cubic Cubica Hermite Hermite Default interface layout Deseño predeterminado da interface Single pane Panel único Tabbed En páxinas TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Aceptar &Cancel &Cancelar Close dialog! maybe there is some unsaved work on sample. Are you sure? Pechar o diálogo! Semella que hai traballo sobre a mostra sen gardar. Está seguro? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Diálogo &Close &Pechar Start Iniciar Adjust sample start frame Axustar o marco de comezo da mostra Loop Bucle Adjust sample loop begin frame Axustar o marco de comezo do bucle da mostra <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Bucle</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">modo</span></p></body></html> set processing axustar o procesamento forward adiante reverse inverter pingpong pingpong <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Bucle</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Contador</span></p></body></html> loops bucles End Fin Adjust sample end & loop end frame Axustar o marco de fin de mostra e fin de bucle "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. «Procesador de son Rubberband» : Cambia o tempo (lonxitude da mostra) e a afinación do son. Sample length to beat: Lonxitude da mostra do pulso: off apagado 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch (Semitone,Cent) Afinación (semitón,cent) Pitch the sample in semitones, cents Afina a mostra en semitóns, cents Crispness: Nitidez: 0 0 &Apply Changes &Aplicar os cambios &Play &Reproducir P&lay original sample R&eproducir a mostra orixinal new sample length: nova lonxitude da mostra: fade-out type tipo de esvaecemento volume volume panorama panorama <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Manual Ok Aceptar Welcome to Hydrogen Benvido a Hydrogen Don't show this message anymore Non volver amosar esta mensaxe de novo Documentation index Índice da documentación SongEditorPanel Create new pattern Crear un novo patrón Move the selected pattern down Mover o patrón seleccionado cara abaixo Move the selected pattern up Mover o patrón seleccionado cara arriba Song Editor Editor de cancións &Cancel &Cancel Clear pattern sequence Eliminar a secuencia do patrón Select mode Seleccionar modo Draw mode Modo de debuxo Warning, this will erase your pattern sequence. Are you sure? Aviso, isto borrará a súa secuencia de patrón. Está seguro? &Ok &Aceptar stacked mode patróns amoreados stacked pattern mode modo de patróns amoreados single pattern mode modo de patrón único Pattern %1 Patrón %1 Enable time line edit Activar a edición da liña de tempo View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Velocidade Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Forma Edit the bpm value for current beat Editar o valor de BPM para o ritmo actual 500,55 500,55 Edit beat in timeline Editar o ritmo na liña de tempo 500 500 Bar Compás BPM BPM Delete this BPM Marker Eliminar este marcador de BPM Delete BPM Marker Eliminar o marcador de BPM Cancel Cancelar Ok Aceptar SongEditorPanelTagWidget_UI Form Forma Tag Etiqueta Cancel Cancelar Ok Aceptar SongEditorPatternList Copy Copiar Delete Eliminar Properties Propiedades Fill/Clear ... Encher/Limpar ... Save Pattern Gardar un patrón Load Pattern Cargar un patrón Open Pattern Abrir un patrón The pattern-file exists. Overwrite the existing pattern? Xa existe o ficheiro patrón. Sobrescribir o patrón existente? &Ok &Aceptar &Cancel &Cancelar Pattern 1 Patrón 1 not_categorized sen categoría Export Pattern Exportar un patron Virtual Pattern Patrón virtual Could not export pattern. Non foi posíbel exportar o patrón. Could not export sequence. Pattern saved. Patrón gardado. SongPropertiesDialog Song properties Propiedades da canción SongPropertiesDialog_UI Song name Nome da canción Author Autor Notes Notas &Cancel &Cancelar Form1 Forma1 &OK &Aceptar Alt+O Alt+A Alt+C Alt+C License Licenza SoundLibraryExportDialog Export Sound Library Exportar a biblioteca de son Directory Directorio SoundLibraryExportDialog_UI Dialog Diálogo Export Exportar Drumkit Batería Component Path Version Browse... Examinar... 0.9.7 and higher 0.9.6 and lower Cancel Cancelar SoundLibraryImportDialog Sound Library import Importar biblioteca de son Sound library Biblioteca de son Status Estado Updating SoundLibrary list... Actualizando a lista de bibliotecas de son... Installed Instalado New Novo Author: %1 Autor: %1 Downloading SoundLibrary... Descargando biblioteca de son... Import drumkit Importar batería SoundLibrary imported in %1 Biblioteca de son importada en %1 An error occurred importing the SoundLibrary. Produciuse un erro ao importar a biblioteca de son. Drumkits Baterías Songs Cancións Patterns Patróns Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Diálogo Internet Internet Update list Actualizar a lista Sound Library Name Nome da biblioteca de son Author... Autor... Download and install Descargar e instalar Local file Ficheiro local Browse... Examinar... Install Instalar 1 1 Edit server list Editar a lista de servidores Close Pechar TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Cargar Cancel Cancelar SoundLibraryPanel Load Cargar Export Exportar Delete Eliminar System drumkits Baterías do sistema User drumkits Baterías do usuario &Ok &Aceptar &Cancel &Cancelar Songs Cancións Patterns Patróns Error loading song. Produciuse u erro ao cargar a canción. Properties Propiedades Warning, the selected pattern will be deleted from disk. Are you sure? Aviso, o patrón seleccionado borrarase do disco. Estás seguro? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Non é posíbel eliminar a batería cargada neste momento: «%1». Para eliminar esta batería ten que cargar antes outra batería. "%1"is a system drumkit and can't be deleted. «%1» é un conxunto de batería e non pode ser eliminado. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Aviso, a batería «%1» eliminarase do disco. Estás seguro? Drumkit deletion failed. Non foi posíbel eliminar a batería. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Diálogo Name Nome Author Autor Information Información Save Gardar Cancel Cancelar Save changes made to instruments into sound library Gardar os cambios feitos aos instrumentos na biblioteca de son Drumkit License Image Browse Examinar Image License SoundLibraryRepositoryDialog Edit repository settings Editar os axustes do repositorio Edit server list Editar a lista de servidores URL URL SoundLibraryRepositoryDialog_UI Dialog Diálogo Add Engadir Delete Eliminar SoundLibrarySaveDialog Save Sound Library Gardar a biblioteca de son Please supply at least a valid name Forneza polo menos un nome correcto A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Diálogo Name Nome Author Autor Information Información Cancel Cancelar License Licenza Save Gardar Image Browse Examinar Image License SoundLibraryTree Sound library Biblioteca de son VirtualPatternDialog Select virtual pattern Seleccionar o patrón virtual VirtualPatternDialog_UI Dialog Diálogo OK Aceptar Cancel Cancelar hydrogen-1.0.0-rc1/data/i18n/hydrogen_hr.ts000066400000000000000000003625001366722712400204020ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Stranica projekta</b><br> About O Programu <b>Website</b><br> <b>Web stranica</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen Informacije o programu A&bout &Informacije o programu &Authors &Autori &License &Licenca &OK &OK Alt+O ### AudioEngineInfoForm Audio Engine Info Informacije o audio engine-u AudioEngineInfoForm_UI Playing notes Polifonia Process time Vrijeme izvođenja Audio engine state Stanje audio engine-a Song state Stanje pjesme Buffer size Veličina buffer-a Sample rate Frekvencija uzorka Song position Pozicija pjesme Patterns Uzorci Selected pattern Odabrani uzorak Selected instrument Odabrani instrument Connected to Konektiran na Form1 ### Frames Frejmovi Ticks Udarci Sampler Sampler Synth Synth Sequencer Sequencer MIDI input MIDI ulaz Name Ime Audio output Izlazni signal Realtime frames Stvarni framerate AudioFileBrowser Audio File Browser Pretraživač audio podataka Size: %1 bytes Veličina: %1 byte Samplerate: %1 Samplerate: %1 Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: s Name: Ime: Size: Veličina: Samplerate: Frekvencija uzorka: Unable to load that sample file. AudioFileBrowser_UI Dialog Dijalog Open Otvori Name: Ime: Samplerate: Frekvencija uzorka: Size: Veličina: Length: Duljina: Cancel Otkaži Pla&y samples by clicking S&viraj uzorke klikajući na njih View hidden folders &Up &Gore &Home &Početak &Play Sample &Sviraj Uzorak &Filename to instrument name &Ime fajla koje odgovara imenu instrumenta &Stop S&tani Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Escludi Solo Solo Component name Set instrument volume [%1] Volume strumento [%1] Director Director Director_UI Dialog Dijalog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportSongDialog Export song Izbaci pjesmu The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks ExportSongDialog_UI &Export &Izbaci &Browse... &Pretraži... Samplerate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: 8 8 16 16 24 24 32 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" &Close &Zatvori Alt+C Alt+E Alt+B Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Dijalog Export directory: Modus: FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Efekti on/off Master output Glavni izlaz H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Karakteristike 'Zvučne knjižnice' &Ok &OK &Cancel &Otkaži This is not possible, you can only save changes inside instruments to the current loaded sound library To nije moguće, možeš spremiti promjene unutar instrumenta u samo trenutno otvorenoj 'zvučnoj knjižnici' Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Upozorenje! Mijenjanje imena seta bubnjeva će rezultirati stvaranjem novog seta bubnjeva s tim imenom. Jesi li siguran da to želiš napraviti? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Set bubnjeva učitan: [%1] Song Editor Editor pjesme Instrument + Pattern Mixer Mixer modified InstrumentEditor Show instrument properties Prikaži karakteristike instrumenta Show layers properties Prikaži karakteristike razine Stop the current playing instrument-note before trigger the next note sample. Layer gain Gain razine New instrument name Novo ime instrumenta Instrument gain Gain instrumenta Random pitch factor Faktor izmjene nivoa Filter Cutoff Filter Cutoff Filter resonance Filter rezonancija Attack Attack Decay Sustain Release Layer pitch (Coarse) Layer pitch (grezzo) Layer pitch (Fine) Layer pitch (Fine) General Generale Layers New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Izaberi veličinu uzorka InstrumentLine Clear notes Obriši note Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Randomize velocity Automatski mijenjaj iznos note Delete instrument Izbriši instrument Mute instrument Solo Solo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Novo ime instrumenta Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Prikaži uređivač instrumenta Instrument Instrument Show sound library Prikaži 'zvučnu knjižnicu' Sound library Zvučna knjižnica LadspaFXMixerLine Edit FX parameters Uredi FX parametre Ladspa FX name Ime LADSPA FX-a FX bypass Zaobiđi efekt(e) Effect return FX Return LadspaFXProperties Select FX Odaberi efekt [%1] LADSPA FX Properties [%1] LADSPA FX karakteristike LADSPA FX %1 Properties LADSPA FX karakteristike %1 No plugin Nema dodatka Activate Aktiviraj Deactivate Deaktiviraj Remove FX LadspaFXSelector Groups Grupe Stereo Stereo Mono Mono Not supported Nije podržano Select LADSPA FX Izaberi LADSPA efekt Recently Used Zadnje korišten Alphabetic List Lista po abecedi Categorized Razvrstano LadspaFXSelector_UI &Cancel &Otkaži &OK &OK Form1 Alt+C Alt+O ### fx label ### naziv efekta ### fx type ### vrsta efekta ### fx ID ### ID efekta 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> ### fx name 1 ### ime efekta 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etichetta:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tipo:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Autore:</span></p></body></html> ### FX maker 1 2 ### Autor efekta 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm &Save &Spremi &Discard Odbaci promje&ne Cancel Otkaži Error loading song. Neuspješno otvaranje pjesme. Hydrogen Ready. Hydrogen je spreman za rad. Hydrogen Song (*.h2song) Hydrogen pjesma (*.h2song) Save song Spremi pjesmu Open song Otvori pjesmu Export MIDI file Izbaci MIDI file Midi file (*.mid) MIDI file (*.mid) &New &Novo &Open &Otvori Open &Demo Otvori &demonstraciju Open &recent Otvori &posljednje Save &as... Spremi &kao... Export &MIDI file Izbaci &MIDI file &Preferences &Karakteristike &Quit &Izlaz Show &audio engine info Prikaži informacije &audio engine &User manual &Korisnički priručnik &About &Informacije The document contains unsaved changes. Do you want to save the changes? &Cancel &Otkaži Unknown audio driver Nepoznati audio driver Error starting audio driver Problem pri pokretanju drivera zvuka Jack driver: server shutdown Jack driver: server shutdown Jack driver: cannot activate client Jack driver: ne mogu aktivirati klijenta Jack driver: cannot connect output port Jack driver: ne mogu povezati izlaz Jack driver: error in port register Jack driver: greška u registraciji porta &Export song &Izbaci pjesmu De&bug &Debugiraj Director &Mixer &Mixer &Instrument Rack &Instrument Rack Print Objects Isprintaj objekte &Info &Informacije Song saved. Pjesma spremljena. Could not export pattern. Unknown error %1 nepoznata pogreška %1 Clear all instruments? Izbrisati sve instrumente? Ok Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Koristiš verziju Hydrogena koja je još u razvoju, molimo te da nam pomogneš tako da nas izvjestiš o greškama ili daš svoj savjet na hydrogen-devel mailing listu.<br><br>Hvala! Could not save song. Neuspješno spremanje pjesme. Open &Pattern Otvori &uzorak Hydrogen Pattern (*.h2pattern) Hydrogen uzorak (*.h2pattern) Save Pattern as ... Spremi uzorak kao ... Pattern saved. Uzorak spremljen. Open Pattern Otvori uzorak Don't show this message anymore Nemoj više prikazivati ovu poruku Playlist: Set song No. %1 Playlist: Pjesma br. %1 Show &info Prikaži &informacije Expor&t pattern as... Iz&baci pattern kao... I&nstruments Instru&menti &Add instrument &Dodaj instrument &Clear all &Elimina tutti Playlist &editor Playlist &editor Info|About Song saved as. Pjesma spremljena kao. Playlist: Song No. %1 Playlist: Pjesma br. %1 Undo history &Undo menu Undo Redo Input mode Instrument Instrument Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Novo Open Otvori Properties Karakteristike Save Save As Export Izbaci Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. MasterMixerLine Set master volume [%1] Podesi glavnu glasnoću [%1] Swing Swing Humanize time Humaniziraj tempo Humanize velocity Humaniziraj intenzitet Set humanize time parameter [%1] Podesi parametar za humaniziranje tempa [%1] Set humanize velocity parameter [%1] Podesi parametar za humaniziranje raspona [%1] Set swing factor [%1] Swing faktor [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable press button to record midi event Event Događaj Param. Param. Action Poduzimanje Mixer Show FX panel Prikaži FX ploču Show instrument peaks Prikaži visinu točke instrumenta Show instrument peaks = On Prikaži visinu točke instrumenta = Aktivno Show instrument peaks = Off Prikaži visinu točke instrumenta = Neaktivno Set FX %1 level Postavi razinu FX-a %1 Set LADSPA FX ( %1 ) volume Postavi glasnoću LADSPA FX-a ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer Mixer MixerLine Play sample Suona sample Mute Escludi Solo Solo Pan Pan Instrument name (double click to edit) Nome strumento (doppio click per modificarne le proprietà) Set instrument volume [%1] Volume strumento [%1] Set instr. pan [%1] Pan strumento [%1] PatternEditorPanel Hear new notes Poslušaj nove note Hear new notes = On Poslušaj nove note = Aktivno Hear new notes = Off Poslušaj nove note = Neaktivno Pattern editor - %1 Uređivač uzorka - %1 Quantize keyboard/midi events to grid Kvantiziranje klavijatura/midi pokušaja u rešetku Quantize incoming keyboard/midi events = On Kvantiziranje nadolazećih klavijaturnih/midi sesija = Aktivno Quantize incoming keyboard/midi events = Off Kvantiziranje nadolazećih klavijaturnih/midi sesija = Neaktivno Is not possible to change the pattern size when playing. Nije moguće promijeniti veličinu uzorka za vrijeme trajanja preslušavanja. Select pattern size Izaberi veličinu uzorka Select grid resolution Odaberi veličinu rešetke destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Zoom in Povećaj pogled Zoom out Smanji pogled NoteKey No pattern selected Nema izabranih uzoraka Select note properties Odaberni karakteristike note Velocity Frekvencija Pan Pan Show drum editor Cutoff Cutoff Resonance Rezonancija Lead and Lag 'Lead and Lag' Loaded Soundlibrary Otvorena zvučna knjižnica Probability PatternFillDialog Fill with selected pattern Popuni odabranim uzorkom PatternFillDialog_UI &Fill &Popuni &Clear &Obriši To: K: From: Od: Cancel Otkaži OK Ok Form 1 Prva forma Alt+F Alt+C PatternPropertiesDialog Pattern properties Karakteristike uzorka %1#2 %1 PatternPropertiesDialog_UI &Cancel &Otkaži &OK &OK New Pattern Name Novo ime uzorka Form1 Alt+C Alt+O Pattern category Kategorija uzorka Pattern description PianoRollEditor Velocity Frekvencija Pan Pan Lead and Lag 'Lead and Lag' PlayerControl Song Mode Mod pjesme Playing. Svira. Stopped. Zaustavljeno. Song mode selected. Mod pjesme odabran. Pattern Mode Uzorak Mod Pattern mode selected. Uzorak Mod odabran. Jack-transport on/off Jack-transport uključen/isključen Jack-transport mode = On Jack-transport Mod = Uključen Jack-transport mode = Off Jack-transport Mod = Isključen New BPM value Nova vrijednost broja udaraca u minuti (BPM) Rewind Premotaj unazad Play/ Pause Reproduciraj/ Pauziraj Fast Forward Premotaj unaprijed Pause. Pauza. JACK-transport will work only with JACK driver. JACK-transport će funkcionirati samo sa JACK driverom. Loop song Ponavljaj pjesmu Loop song = On Ponavljaj pjesmu = Uključeno Loop song = Off Ponavljaj pjesmu = Isključeno Show mixer Prikaži mixer Stop Stani Mixer Mixer Show Instrument Rack Prikaži Rack Instrument rack Rack BeatCounter Panel on Ploča brojača udaraca uključena Record Destructive Record Set BPM / Set BPM and play Postavi BPM / Postavi BPM i reproduciraj Recalculate Rubberband modified samples if bpm will change Jack-Time-Master on/off Jack-Time-Master uključen/isključen Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On BC Panel on Ploča brojača udaraca aktivan BC Panel off Ploča brojača udaraca neaktivan Count BPM and start PLAY Prebroji BPM i počni reprodukciju Count and set BPM Izbroji i postavi BPM Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Jack-Time-Master mode = On Mod Jack-Time-Master = Uključen Jack-Time-Master mode = Off Mod Jack-Time-Master = Isključen Switch metronome on/off PlaylistDialog Song list Popis pjesama Script Skripta exec Script Izvrši skriptu Add Song to PlayList Dodaj pjesmu na plejlistu No Song selected! Nema izabrane pjesme! Load Playlist Učitaj plejlistu Hydrogen Playlist (*.h2playlist) Hydrogen Playlist (*.h2playlist) Save Playlist Spremi plejlistu No Song in List or no Song selected! Nema pjesme na popisu ili na plejlisti! Hydrogen Playlist (*.sh) Shell script (*.sh) Add Script to selected Song Dodaj skriptu na izabranu pjesmu No Script in use! Nema skripte u upotrebi! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Nije postavljen osnovni uređivač. Molim da ga odrediš Nemoj koristiti editor baziran na konzoli Nažalost, ovo trenutno neće funkcionirati. Set your Default Editor Postavi svoj osnovni uređivač No Script selected! Skripta nije odabrana! Error loading song. Pogreška kod učitavanja pjesme. sort sortiraj &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Premotaj unazad Play/ Pause/ Load selected song Stop Stani Fast Forward Premotaj unaprijed Please save your song first Hydrogen Scripts (*.sh) Shell Scripts (*.sh) New Script Nova skripta Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Ime skripte ili njezina adresa sadrže razmake. VAŽNO Adresa skripte i njezino ime ne smiju sadržavati razmake. WARNING, the new file is executable by the owner of the file! No Script! Nema skripte! Pause. Pauza. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard Odbaci promje&ne &Cancel Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Hydrogen playlist (*.h2playlist) PlaylistDialog_UI PlayList Browser Pretraživač plejliste Song list Popis pjesama PreferencesDialog Slow Polako Normal Umjereno Fast Brzo Driver restart required. Restart driver? &Ok &Cancel <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>jednostavni audio driver [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Nije kompajlirano</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver Preferences Postavke <b>ALSA Driver</b><br> <b>ALSA driver</b><br> <b>Automatic driver selection</b> <b>Automatsko odabiranje drivera</b> <b>PortAudio Driver</b><br> <b>PortAudio driver</b><br> <b>CoreAudio Driver</b><br> <b>CoreAudio driver</b><br> Please restart hydrogen to enable/disable LASH support Restartaj hydrogen kako bi se uključila/isključila LASH podrška Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) PreferencesDialog_UI Buffer size Veličina privremenog spremnika Device Uređaj Input Ulaz Channel Kanal All Sve Meters falloff speed Falloff brzina Slow Sporo Normal Umjereno Fast Brzo Application font Font aplikacije Mixer font Font Mixera Select font Odaberi font Polyphony Polifonija Style Stil &Cancel &Otkaži &OK &OK &General O&pčenito Audio &System &Audio Sustav Metronome volume Glasnoća metronoma Connect to &Default Output Pair Poveži se na osnovnu &izlaznu paricu &Midi System &Midi sustav Midi driver Midi driver Ignore note-off Ignoriraj note-off &Appearance &Izgled Form1 Alt+C Alt+O &Reopen last used song &Ponovno otvori zadnje korištenu pjesmu Alt+R Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist ### ### Sample rate Frekvencija uzorka 44100 48000 88200 96000 Alt+D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Restart output Restartaj izlaz Audio output details Detalji zvučnog izlaza Post-Fader Pre-Fader Track output Izlaz trake Use lash Koristi LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Prvo, namjesti vrijeme nepodudaranja signala latencije između kontrolera/klavijature i izračunatog BPM Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Beat counter start offset in ms Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback SampleEditor Unsaved changes left. This changes will be lost. Are you sure? &Ok &Cancel Close dialog! maybe there is some unsaved work on sample. Are you sure? SampleEditor_UI Dialog Dijalog P&lay original sample &Apply Changes &Close &Zatvori Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame Sample length to beat: off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Crispness: 0 0 &Play new sample length: fade-out type volume panorama Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Priručnik Welcome to Hydrogen Dobrodošli u Hydrogen Don't show this message anymore Nemoj više nikad prikazivati ovu obavijest Ok Ok Documentation index Dokumentacija kazala pojmova SongEditorPanel Create new pattern Kreiraj novi uzorak Move the selected pattern down Pomakni dolje odabrani uzorak Move the selected pattern up Pomakni gore odabrani uzorak Clear pattern sequence Obriši sekvencu uzoraka Song Editor Editor pjesme Enable time line edit Select mode Odaberi Mod Draw mode Crtački Mod Pattern %1 Warning, this will erase your pattern sequence. Are you sure? Pozor, ovo će obrisati sekvencu uzoraka. Da li to želiš napraviti? &Ok &Ok &Cancel &Otkaži stacked mode Skupni Mod stacked pattern mode Skupni Mod uzorka single pattern mode Pojedinačni Mod uzoraka View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Frekvencija Select playback track SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 500,55 Edit beat in timeline 500 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Ok Ok SongEditorPanelTagWidget_UI Form Tag Cancel Ok Ok SongEditorPatternList Copy Kopiraj Delete Izbriši Properties Karakteristike The pattern-file exists. Overwrite the existing pattern? &Ok &Cancel Pattern 1 not_categorized Nije kategorizirano Fill/Clear ... Popuni/Obriši ... Save Pattern Spremi uzorak Load Pattern Učitaj uzorak Virtual Pattern Open Pattern Otvori uzorak Hydrogen Pattern (*.h2pattern) Hydrogen Pattern (*.h2pattern) Export Pattern SongPropertiesDialog Song properties Karakteristike pjesme SongPropertiesDialog_UI Notes Note Author Autor Song name Ime pjesme &Cancel &Otkaži &OK &Ok Form1 Alt+O Alt+C License Licenca SoundLibraryExportDialog Export Sound Library Izbaci zvučnu knjižnicu Directory SoundLibraryExportDialog_UI Dialog Export Izbaci Drumkit Component Path Version Browse... Pretražuj... 0.9.7 and higher 0.9.6 and lower Cancel SoundLibraryImportDialog Sound Library import Ubaci zvučnu knjižnicu Sound library Zvučna knjižnica Status Status Updating SoundLibrary list... Osvježavanje zvučne knjižnice... Installed Instalirano New Novo Author: %1 Autor: %1 Downloading SoundLibrary... Skidanje zvučne knjižnice... Import drumkit Umetni set bubnjeva SoundLibrary imported in %1 Zvučna knjižnica umetnuta u %1 An error occurred importing the SoundLibrary. Došlo je do pogreške pri ubacivanju zvučne knjižnice. Drumkits Setovi bubnjeva Songs Pjesme Patterns Uzorci Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Internet Internet Update list Osvježi popis Sound Library Name Ime zvučne knjižnice Author... Autor... Download and install Skini i instaliraj Local file Lokalni fajl Browse... Pretražuj... Install Instaliraj 1 1 Edit server list Uredi server listu Close Zatvori TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Učitaj Cancel SoundLibraryPanel Load Učitaj Export Izbaci Delete Obriši System drumkits Setovi bubnjeva iz sustava User drumkits Korisnički setovi bubnjeva &Ok &OK &Cancel &Odustani Songs Pjesme Patterns Uzorci Error loading song. Pogreška pri učitavanju pjesme. Properties Karakteristike Warning, the selected pattern will be deleted from disk. Are you sure? Pozor, odabrani uzorak će biti izbrisan. Potvrdi brisanje! It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Dijalog Name Ime Author Autor Information Informacije Save Spremi Cancel Otkaži Save changes made to instruments into sound library Spremi promjene napravljene na instrumentima u zvučnoj knjižnici Drumkit License Image Browse Pretraži Image License SoundLibraryRepositoryDialog Edit repository settings Uredi postavke repositorija Edit server list Uredi popis servera URL URL SoundLibraryRepositoryDialog_UI Dialog Dijalog Add Dodaj Delete Obriši SoundLibrarySaveDialog Save Sound Library Spremi zvučnu knjižnicu Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Dijalog Name Ime Author Autor Information Informacije Cancel Odustani License Licenca Save Spremi Image Browse Pretraži Image License SoundLibraryTree Sound library Zvučna knjižnica VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog Dijalog OK Ok Cancel hydrogen-1.0.0-rc1/data/i18n/hydrogen_hu_HU.ts000066400000000000000000003573101366722712400210040ustar00rootroot00000000000000 AboutDialog About Névjegy <b>Project page</b><br> <b>Honlap</b><br> <b>Website</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen &OK Alt+O A&bout ### &Authors &License AudioEngineInfoForm Audio Engine Info Hangeszköz információk AudioEngineInfoForm_UI Sample rate Mintavétel Buffer size Bufferméret Audio engine state Hang meghajtók állapota Playing notes Hangjegyek lejátszása Process time Feldolgozási idő Song position Szám pozíciója Patterns Motívumok Song state Szám állapota Frames Keretek Ticks Leütés Selected pattern Kiválasztott motívum Selected instrument Kiválasztott hangszer Form1 ### Connected to Sampler Synth Sequencer MIDI input Name Audio output Realtime frames AudioFileBrowser Audio File Browser Size: %1 bytes Samplerate: %1 s Name: Size: Samplerate: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Open Name: Samplerate: Size: Length: Cancel Mégsem Pla&y samples by clicking &Up &Home &Play Sample &Filename to instrument name &Stop View hidden folders Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Némít Solo Szóló Component name Set instrument volume [%1] [%1] hangszer hangerejének beállítása Director Director Director_UI Dialog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportSongDialog Export song Szám exportálása The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks ExportSongDialog_UI &Close Alt+C &Export Alt+E &Browse... Alt+B Samplerate in Hz: 22050 44100 48000 96000 192000 SampleDepth in Bit: 8 16 24 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Export directory: Modus: FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off FX be/ki Master output Master kimenet H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties &Ok &Cancel This is not possible, you can only save changes inside instruments to the current loaded sound library Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Dobszerkó betöltve: [%1] Song Editor Számszerkesztő Instrument + Pattern Mixer Keverő modified InstrumentEditor Random pitch factor Filter Cutoff Filter resonance Attack Decay Sustain Release Instrument gain Layer gain Layer pitch (Coarse) Layer pitch (Fine) Show instrument properties Show layers properties New instrument name General Általános Layers Stop the current playing instrument-note before trigger the next note sample. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size InstrumentLine Clear notes Randomize velocity Delete instrument Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Mute instrument Solo Szóló Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Instrument Show sound library Sound library LadspaFXMixerLine Edit FX parameters Effekt paraméterek módosítása FX bypass Ladspa FX name Effect return LadspaFXProperties Select FX Kiválasztás Activate Bekapcsolás [%1] LADSPA FX Properties [%1] LADSPA Effekt tulajdonságai Deactivate Kikapcsolás LADSPA FX %1 Properties LADSPA %1 effekt tulajdonságai No plugin Nincs plugin Remove FX LadspaFXSelector Select LADSPA FX LADSPA effekt kiválasztása Groups Csoportok Stereo Sztereó Mono Monó Not supported Nem támogatott Recently Used Alphabetic List Categorized LadspaFXSelector_UI Form1 &Cancel Alt+C &OK Alt+O ### fx label ### fx type ### fx ID 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Error loading song. A számot nem lehet betölteni. Hydrogen Ready. Hydrogen kész. Export MIDI file Exportálás MIDI-be Print Objects Objektumok nyomtatása &Save &Mentés &Discard &Eldobás Cancel Mégsem Hydrogen Song (*.h2song) Hydrogen szám (*.h2song) Save song Szám mentése Open song Szám megnyitása Unknown audio driver Ismeretlen audió meghajtó Error starting audio driver Audió meghajtó indítási hiba Jack driver: server shutdown Jack meghajtó: kiszolgáló leállt Jack driver: cannot activate client Jack meghajtó: kliens nem aktiválható Jack driver: cannot connect output port Jack meghajtó: nem sikerül csatlakozni a kimenethez Jack driver: error in port register Jack meghajtó: hiba a port regiszterben &New &Open Open &Demo Open &recent Save &as... Export &MIDI file &Export song &Quit &Mixer &Instrument Rack &Preferences De&bug Show &audio engine info &Info &User manual &About &Cancel Song saved. Midi file (*.mid) Unknown error %1 Clear all instruments? Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Could not save song. Open &Pattern Hydrogen Pattern (*.h2pattern) Save Pattern as ... Pattern saved. Open Pattern Don't show this message anymore Playlist: Set song No. %1 Show &info Expor&t pattern as... I&nstruments &Add instrument &Clear all Playlist &editor Info|About Song saved as. Playlist: Song No. %1 Could not export pattern. The document contains unsaved changes. Do you want to save the changes? Director Undo history &Undo menu Undo Redo Input mode Instrument Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Új Open Properties Tulajdonságok Save Save As Export Exportálás Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. MasterMixerLine Set master volume [%1] Master hangerő [%1] Humanize velocity Humanize time Swing Set humanize time parameter [%1] Set humanize velocity parameter [%1] Set swing factor [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Param. Action press button to record midi event Mixer Set FX %1 level Effekt %1 szint Set LADSPA FX ( %1 ) volume LADSPA ( %1 ) effekt hangereje Show FX panel Show instrument peaks Show instrument peaks = On Show instrument peaks = Off LADSPA effects are not available in this version of Hydrogen. Mixer Keverő MixerLine Play sample Minta lejátszása Mute Némít Solo Szóló Pan Balansz Instrument name (double click to edit) Hangszer neve (dupla kattintással megváltoztatható) Set instrument volume [%1] [%1] hangszer hangerejének beállítása Set instr. pan [%1] PatternEditorPanel Hear new notes Lejátsza az új hangokat Quantize keyboard/midi events to grid Események illesztése a hálóhoz Pattern editor - %1 Motívumok szerkesztése - %1 Hear new notes = On Lejátsza az új hangokat = Igen Hear new notes = Off Lejátsza az új hangokat = Nem Quantize incoming keyboard/midi events = On Események illesztése a hálóhoz = Igen Quantize incoming keyboard/midi events = Off Események illesztése a hálóhoz = Nem Select pattern size Select grid resolution Zoom in Zoom out No pattern selected Is not possible to change the pattern size when playing. Select note properties Velocity Pan Balansz Cutoff Resonance Lead and Lag Loaded Soundlibrary NoteKey destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Show drum editor Probability PatternFillDialog Fill with selected pattern PatternFillDialog_UI Cancel Mégsem Form 1 &Fill Alt+F &Clear Alt+C From: To: OK PatternPropertiesDialog Pattern properties Motívum tulajdonságai %1#2 %1 PatternPropertiesDialog_UI Form1 &Cancel Alt+C &OK Alt+O New Pattern Name Pattern category Pattern description PianoRollEditor Velocity Pan Balansz Lead and Lag PlayerControl Stop Állj Song Mode Szám mód Pattern Mode Motívum mód Jack-transport on/off Jack-transport Be/Ki Playing. Lejátszás. Stopped. Megállt. Song mode selected. Szám módot választottad. Pattern mode selected. Motívum módot választottad. Jack-transport mode = On Jack-transport mode = Be Jack-transport mode = Off Jack-transport mode = Ki Show mixer Keverő Rewind Play/ Pause Fast Forward Loop song Mixer Keverő Show Instrument Rack Instrument rack Pause. JACK-transport will work only with JACK driver. New BPM value Loop song = On Loop song = Off BeatCounter Panel on Set BPM / Set BPM and play Jack-Time-Master on/off BC Panel on BC Panel off Count BPM and start PLAY Count and set BPM Jack-Time-Master mode = On Jack-Time-Master mode = Off Record Destructive Record Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate Rubberband modified samples if bpm will change Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off PlaylistDialog Song list Script exec Script Add Song to PlayList No Song selected! Load Playlist Hydrogen Playlist (*.h2playlist) Save Playlist No Song in List or no Song selected! Hydrogen Playlist (*.sh) Add Script to selected Song No Script in use! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Set your Default Editor No Script selected! Error loading song. A számot nem lehet betölteni. sort Hydrogen Scripts (*.sh) New Script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. No Script! &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Play/ Pause/ Load selected song Stop Állj Fast Forward Please save your song first WARNING, the new file is executable by the owner of the file! Pause. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Eldobás &Cancel Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Hydrogen playlist (*.h2playlist) PlaylistDialog_UI PlayList Browser Song list PreferencesDialog Preferences Beállítások Slow Lassú Normal Normál Fast Gyors <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Egyszerű audio meghajtó [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Nincs lefordítva</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Kis késleltetésű audio meghajtó <b>Automatic driver selection</b> <b>ALSA Driver</b><br> <b>PortAudio Driver</b><br> <b>CoreAudio Driver</b><br> Please restart hydrogen to enable/disable LASH support Driver restart required. Restart driver? &Ok &Cancel Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) PreferencesDialog_UI Polyphony Polifónia Device Eszköz Buffer size Bufferméret Sample rate Mitavétel Input Bemenet Channel Csatorna All Összes Application font Alkalmazás betütípusa Style Stílus Select font Betütípus kiválasztása Slow Lassú Normal Normál Fast Gyors Mixer font Keverő betütípusa Meters falloff speed Csúcsindikátor esési sebessége Midi driver Midi meghajtó Form1 &Cancel Alt+C &OK Alt+O &General &Reopen last used song Alt+R Audio &System ### 44100 48000 88200 96000 Connect to &Default Output Pair Alt+D Metronome volume &Midi System Ignore note-off 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 &Appearance Restart output Audio output details Post-Fader Pre-Fader Track output Use lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Beat counter start offset in ms Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback SampleEditor Unsaved changes left. This changes will be lost. Are you sure? &Ok &Cancel Close dialog! maybe there is some unsaved work on sample. Are you sure? SampleEditor_UI Dialog P&lay original sample &Apply Changes &Close Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame &Play new sample length: fade-out type volume panorama Sample length to beat: off 1/64 1/32 1/16 1/8 1/4 1/2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Pitch the sample in semitones, cents Crispness: 0 Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Kézikönyv Welcome to Hydrogen Don't show this message anymore Ok Documentation index SongEditorPanel Song Editor Számszerkesztő Create new pattern Új motívum Move the selected pattern down Kijelölt lefelé mozgatása Move the selected pattern up Kijelölt felfelé mozgatása Clear pattern sequence Motívum törlése Select mode Draw mode Warning, this will erase your pattern sequence. Are you sure? &Ok &Cancel stacked mode stacked pattern mode single pattern mode Enable time line edit Pattern %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Select playback track SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 Edit beat in timeline 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Mégsem Ok SongEditorPanelTagWidget_UI Form Tag Cancel Mégsem Ok SongEditorPatternList Copy Másolás Delete Törlés Properties Tulajdonságok Fill/Clear ... Save Pattern Load Pattern Open Pattern Hydrogen Pattern (*.h2pattern) Virtual Pattern Pattern 1 not_categorized The pattern-file exists. Overwrite the existing pattern? &Ok &Cancel Export Pattern SongPropertiesDialog Song properties Szám tulajdonságai SongPropertiesDialog_UI Song name Szám címe Author Szerző Notes Hangjegyek Form1 &OK Alt+O &Cancel Alt+C License Jogok SoundLibraryExportDialog Export Sound Library Directory SoundLibraryExportDialog_UI Dialog Export Exportálás Drumkit Component Path Version Browse... Tallóz... 0.9.7 and higher 0.9.6 and lower Cancel Mégsem SoundLibraryImportDialog Sound Library import Sound library Status Updating SoundLibrary list... Installed New Új Author: %1 Szerző: %1 Downloading SoundLibrary... Import drumkit Dobszerkó importálása SoundLibrary imported in %1 An error occurred importing the SoundLibrary. Drumkits Songs Patterns Motívumok Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Internet Update list Sound Library Name Author... Download and install Local file Browse... Tallóz... Install 1 Edit server list Close TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Betöltés Cancel Mégsem SoundLibraryPanel Load Betöltés Export Exportálás Delete Törlés System drumkits User drumkits &Ok &Cancel Songs Patterns Motívumok Error loading song. A számot nem lehet betölteni. Properties Tulajdonságok Warning, the selected pattern will be deleted from disk. Are you sure? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Name Author Szerző Information Save Cancel Mégsem Save changes made to instruments into sound library Drumkit License Image Browse Tallóz Image License SoundLibraryRepositoryDialog Edit repository settings Edit server list URL SoundLibraryRepositoryDialog_UI Dialog Add Delete Törlés SoundLibrarySaveDialog Save Sound Library Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Name Author Szerző Information Cancel Mégsem License Jogok Save Image Browse Tallóz Image License SoundLibraryTree Sound library VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog OK Cancel Mégsem hydrogen-1.0.0-rc1/data/i18n/hydrogen_it.ts000066400000000000000000003702171366722712400204110ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Pagina del progetto</b><br> About Informazioni su <b>Website</b><br> <b>Sito web</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen Informazioni su A&bout &Informazioni su &Authors &Autori &License &Licenza &OK &OK Alt+O ### AudioEngineInfoForm Audio Engine Info Informazioni audio engine AudioEngineInfoForm_UI Playing notes Polifonia Process time Tempo elaborazione Audio engine state Stato engine audio Song state Stato canzone Buffer size Dimensione buffer Sample rate Frequenza campionamento Song position Posizione canzone Patterns Pattern Selected pattern Pattern selezionato Selected instrument Strumento selezionato Connected to Connesso a Form1 Form1 ### ### Frames Frame Ticks Tic Sampler Campionatore Synth Sintetizzatore Sequencer Sequencer MIDI input Ingresso MIDI Name Nome Audio output Uscita audio Realtime frames Frame in tempo reale AudioFileBrowser Audio File Browser Browser Audio Size: %1 bytes Dimensione: %1 byte Samplerate: %1 Frequenza: %1 s s Name: Nome: Size: Dimensione: Samplerate: Frequenza: Sample length: Lunghezza del campione: Please do not preview samples which are longer than 10 minutes! Non suonare campioni più lunghi di 10 minuti! Sample length: Lunghezza del campione: Unable to load that sample file. AudioFileBrowser_UI Dialog Dialogo Open Apri Name: Nome: Samplerate: Frequenza: Size: Dimensione: Length: Lunghezza: Cancel Annulla Pla&y samples by clicking &Riproduci campioni al click &Up &Su &Home &Home &Play Sample &Suona Campione &Filename to instrument name &Rinomina il file con il nome dello strumento &Stop &Stop View hidden folders Mostra cartelle nascoste Be careful, this change all Layer velocity settings Attenzione, stai per cambiare le impostazioni di velocità di tutti i Livelli Set automatic velocity Imposta la velocità in automatico ComponentMixerLine Mute Escludi Solo Solo Component name Set instrument volume [%1] Volume strumento [%1] Director Director Direttore Director_UI Dialog Dialogo DonationDialog Donations DonationDialog_UI Form Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 Kib) - ETA %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Esporta MIDI file Directory %1 does not exists The file %1 exists. Overwrite the existing file? Il file %1 esiste. Sovrascrivere il file esistente? ExportMidiDialog_UI Dialog Dialogo Filename &Browse... &Cerca... Alt+B Alt+B Modus: &Export &Esporta Alt+E Alt+E &Close &Chiudi Alt+C Alt+C ExportSongDialog Export song Esporta canzone The file %1 exists. Overwrite the existing file? Il file %1 esiste. Sovrascrivere il file esistente? Export to a single track Esporta su una traccia singola Both Entrambi Export to separate tracks Directory %1 does not exists ExportSongDialog_UI &Export &Esporta &Browse... &Cerca... &Close &Chiudi Alt+C Alt+C Alt+E Alt+E Alt+B Alt+B Samplerate in Hz: Rate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Definizione in Bit: 8 8 16 16 24 24 32 32 Templates: Modelli: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in qualità CD "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in qualità ADAT "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV in qualità migliore "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV LOFI "22,05kHz, 8 bit PCM" WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV in qualitù best Mixdown "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in qualità CD "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in qualitù ADAT "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF in qualità migliore "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" FLAC non compresso di buona qualità "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis senza perdita compresso in buona qualità "VBR" Interpolation: Interpolazione: Choose type of interpolation methode Scegli il metodo di interpolazione Linear Lineare Cosine Cosine Third Third Cubic Cubico Hermite Hermite Enable tempo changing Abilita i cambi di tempo TimeLine BPM Linea BPM 88200 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Dialogo Export directory: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off FX acceso/spento Master output Uscita principale H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Proprietà Libreria &Ok &OK &Cancel &Annulla This is not possible, you can only save changes inside instruments to the current loaded sound library Non è possibile, puoi salvare cambiamente solo per gli strumenti attualmente aggiunti alla libreria suoni Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Attenzione! Cambiare il nome del drumkit sarà come creare un nuovo drumkit con lo stesso nome. Sei sicuro? Saving of this drumkit failed. Salvataggio del drumkit fallito. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Drumkit caricato: [%1] Song Editor Editor di canzone Instrument + Pattern Strumento + Pattern Mixer Mixer modified Song saved. Canzone salvata InstrumentEditor Show instrument properties Visualizza le proprietà dello strumento Show layers properties Visualizza le proprietà dei layer Layer gain Gain del layer New instrument name Nuovo nome dello strumento Instrument gain Gain dello strumento Random pitch factor Fattore random pitch Filter Cutoff Filtro di taglio Filter resonance Filtro di risonanza Attack Attack Decay Sustain Release Layer pitch (Coarse) Layer pitch (grezzo) Layer pitch (Fine) Layer pitch (Fine) General Generale Layers Stop the current playing instrument-note before trigger the next note sample. Ferma la riproduzione della nota-strumento prima di riprodurre la prossima. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Seleziona la dimensione del pattern InstrumentLine Clear notes Elimina note Randomize velocity Velocity casuale Delete instrument Elimina strumento Fill notes ... Riempi note ... Fill all notes Riempi tutte le note Fill 1/2 notes Riempi 1/2 note Fill 1/3 notes Riempi 1/3 note Fill 1/4 notes Riempi 1/4 note Fill 1/6 notes riempi 1/6 note Fill 1/8 notes Riempi 1/8 note Mute instrument Muto strumento Solo Solo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nuovo nome dello strumento Fill 1/12 notes Riempi 1/8 note {1/12 ?} Fill 1/16 notes Riempi 1/8 note {1/16 ?} InstrumentRack Show Instrument editor Mostra editor strumento Instrument Strumento Show sound library Mostra libreria Sound library LIbreria Suoni LadspaFXMixerLine Edit FX parameters Modifica parametri degli effetti Ladspa FX name Nome effetto LADSPA FX bypass Escludi effetto Effect return Ritorno dell'effetto LadspaFXProperties Select FX Seleziona effetto [%1] LADSPA FX Properties [%1] Proprietà effetto LADSPA LADSPA FX %1 Properties Proprietà effetto LADSPA %1 No plugin Nessun plugin Activate Attiva Deactivate Disattiva Remove FX Rimuove FX LadspaFXSelector Groups Gruppi Stereo Stereo Mono Mono Not supported Non supportato Select LADSPA FX Seleziona effetto LADSPA Recently Used Recenti Alphabetic List Ordine alfabetico Categorized Ordine per categoria LadspaFXSelector_UI &Cancel &Annulla &OK &OK Form1 Alt+C Alt+O ### fx label ### etichetta effetto ### fx type ### tipo effetto ### fx ID ### ID effetto 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Nome:</span></p></body></html> ### fx name 1 ### nome effetto 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etichetta:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Tipo:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Autore:</span></p></body></html> ### FX maker 1 2 ### Autore effetto 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm &Save &Salva &Discard Annulla le &modifiche Cancel Annulla Error loading song. Errore durante il caricamento della canzone. Hydrogen Ready. Pronto. Save song Salva canzone Open song Apri canzone &New &Nuova canzone &Open &Apri Open &Demo Apri &demo Open &recent Apri &recenti Save &as... Salva &come... Export &MIDI file Esporta file &MIDI &Preferences &Preferenze &Quit &Esci Show &audio engine info Visualizza informazioni &audio engine &User manual &Manuale utente &About &Informazioni su &Cancel &Annulla Unknown audio driver Audio driver sconosciuto Error starting audio driver Errore durante l'avvio del driver audio Jack driver: server shutdown Jack driver: server shutdown Jack driver: cannot activate client Jack driver: errore durante l'attivazione del client Jack driver: cannot connect output port Jack driver: errore durante la connessione della porta di output Jack driver: error in port register Jack driver: errore in port register &Export song &Esporta la canzone De&bug &Debug &Mixer &Mixer &Instrument Rack &Rack Strumenti Print Objects Stampa Oggetti &Info &Informazioni Song saved. Canzone salvata Unknown error %1 Errore sconosciuto %1 Clear all instruments? Eliminare tutti gli strumenti? Ok Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Stai usando una versione di sviluppo di Hydrogen, aiutaci riportando bug o suggerimenti nella mailing list hydrogen-devel<br><br>Grazie! Could not save song. Salvataggio canzone fallito. Open &Pattern Apri &Pattern Save Pattern as ... Salva Pattern come ... Pattern saved. Pattern salvato. Open Pattern Apri Pattern Don't show this message anymore Non mostrare più questo messaggio Playlist: Set song No. %1 Playlist: Imposta canzone No. %1 Show &info Mostra &Info Expor&t pattern as... Espor&ta pattern come... I&nstruments Strume&nti &Add instrument &Aggiungi strumento &Clear all &Elimina tutti Playlist &editor Playlist &editor Info|About Song saved as. Canzone salvata come. Playlist: Song No. %1 Playlist: Canzone n. %1 Could not export pattern. Non riesco a esportare il modello. The document contains unsaved changes. Do you want to save the changes? Il documento contiene cambiamenti non salvati. Vuoi salvare i cambiamenti? Director Direttore Undo history Indietro &Undo &Indietro menu Undo Indietro Redo Avanti Input mode Modo input Instrument Strumento Drumkit Drumkit Report bug Segnala bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Nuovo Open Apri Properties Proprietà Save Save As Export Esporta Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Volume principale [%1] Swing Swing Humanize time Umanizza tempo Humanize velocity Umanizza intensità Set humanize time parameter [%1] Umanizza (tempo) [%1] Set humanize velocity parameter [%1] Umanizza (intensità) [%1] Set swing factor [%1] Fattore di swing [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Evento Param. Param. Action Azione press button to record midi event premi il bottone per registrare un evento MIDI Mixer Show FX panel Mostra pannello effetti Show instrument peaks Visualizza il valore di picco degli strumenti Show instrument peaks = On Visualizza valore di picco degli strumenti = Attivo Show instrument peaks = Off Visualizza valore di picco degli strumenti = Non attivo Set FX %1 level Imposta livello effetto %1 Set LADSPA FX ( %1 ) volume Imposta volume effetto LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer Mixer MixerLine Play sample Suona sample Mute Escludi Solo Solo Pan Pan Instrument name (double click to edit) Nome strumento (doppio click per modificarne le proprietà) Set instrument volume [%1] Volume strumento [%1] Set instr. pan [%1] Pan strumento [%1] PatternEditorPanel Hear new notes Ascolta le nuove note Hear new notes = On Ascolta le nuove note = Attivo Hear new notes = Off Ascolta le nuove note = Non attivo Pattern editor - %1 Editor di pattern - %1 Quantize keyboard/midi events to grid Quantizza alla griglia gli eventi da tastiera/midi Quantize incoming keyboard/midi events = On Quantizza eventi in arrivo da tastiera/midi = Attivo Quantize incoming keyboard/midi events = Off Quantizza eventi in arrivo da tastiera/midi = Non attivo Is not possible to change the pattern size when playing. Non è possibile cambiare la dimensione del pattern durante la riproduzione. Select pattern size Seleziona la dimensione del pattern Select grid resolution Seleziona la risoluzione della griglia Zoom in Aumenta Zoom Zoom out Diminuisci Zoom No pattern selected Nessun pattern selezionato Select note properties Seleziona proprietà nota Velocity Velocità Pan Pan Lead and Lag Anticipo e Ritardo Loaded Soundlibrary Libreria suoni caricata NoteKey TastoNota destructive mode pre delete settings modo distruttivo elimina impostazioni prima destructive mode post delete settings modo distruttivo elimina impostazioni dopo Show piano roll editor Mostra editor del piano Show drum editor Mostra editor batteria Probability PatternFillDialog Fill with selected pattern Riempi con il pattern selezionato PatternFillDialog_UI &Fill &Riempi &Clear &Svuota To: A: From: Da: Cancel Annulla OK Ok Form 1 Alt+F Alt+C PatternPropertiesDialog Pattern properties Proprietà del pattern %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel &Annulla &OK &OK New Pattern Name Nuovo Nome Pattern Form1 Alt+C Alt+O Pattern category Categoria pattern Pattern description PlayerControl Song Mode Modalità canzone Playing. In esecuzione. Stopped. Fermato. Song mode selected. Modalità canzone selezionata. Pattern Mode Modalità Pattern Pattern mode selected. Modalità pattern selezionata. Jack-transport on/off Attiva/Disattiva modalità Jack-transport Jack-transport mode = On Modalità Jack-transport = Attivata Jack-transport mode = Off Modalità Jack-transport = Disattivata New BPM value Nuovo valore per BPM Rewind Indietro Play/ Pause Riproduci / Pausa Fast Forward Avanti Pause. Pausa. JACK-transport will work only with JACK driver. JACK-transport attivato solo con il driver JACK. Loop song Riproduzione continua canzone Loop song = On Riproduzione continua canzone = Attivo Loop song = Off Riproduzione continua canzone = Disattivato Show mixer Mostra mixer Stop Ferma Mixer Mixer Show Instrument Rack Mostra Rack strumenti Instrument rack Rack strumenti BeatCounter Panel on Pannello contatore BPM attivo Set BPM / Set BPM and play Imposta BPM / Imposta BPM e riproduci Jack-Time-Master on/off Jack-Time-Master attivo / non attivo BC Panel on Pannello BC attivo BC Panel off Pannello BC non attivo Count BPM and start PLAY Conta BPM e riproduci Count and set BPM Conta e imposta BPM Jack-Time-Master mode = On Modalità Jack-Time-Master = Attiva Jack-Time-Master mode = Off Modalità Jack-Time-Master = Non attiva Record Registra Destructive Record Registrazione distruttiva Record midi events = On Registrazione eventi MIDI = On Record midi events = Off Registrazione eventi MIDI = Off Destructive mode = Off Modalità distruttivo = Off Destructive mode = On Modalità distruttiva = On Recalculate Rubberband modified samples if bpm will change Ricalcola i sample Rubberband modificati se cambia il BPM Recalculate all samples using Rubberband ON Ricalcola tutti i sample usando Rubberband ON Recalculate all samples using Rubberband OFF Ricalcola tutti i sample usando Rubberband OFF Switch metronome on/off Passa a metronomo on/off PlaylistDialog Song list Lista canzoni Script Script exec Script Esegui script Add Song to PlayList Aggiungi canzone alla Playlist No Song selected! Nessuna canzone selezionata! Load Playlist Apri Playlist Save Playlist Salva Playlist No Song in List or no Song selected! Nessuna canzone nella lista o nessuna canzone selezionata! Hydrogen Playlist (*.sh) Shell script (*.sh) Add Script to selected Song Aggiungi script alla canzone selezionata No Script in use! Nessuno script in uso! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Non è impostato alcun editor di testo predefinito. Per favore selezionarne uno Non utilizzare editor di testo da console Purtroppo al momento non sono supportati. Set your Default Editor Seleziona un editor di testo predefinito No Script selected! Nessuno script selezionato! Error loading song. Errore durante il caricamento della canzone. sort ordina New Script Nuovo script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Il nome dello script o il suo percorso contiene spazi. IMPORTANTE Il percorso dello script o il suo nome non devono contenere spazi. No Script! Nessuno script! &Playlist &Playlist Add song to Play&list Aggiungi canzone alla Play&list Add &current song to Playlist Aggiungi la canzone &corrente alla Playlist &Remove selected song from Playlist &Rimuovi la canzone dalla Playlist &Open Playlist &Apri Playlist &Save Playlist &Salva Playlist Save Playlist &as Salva Playlist &con nome &Scripts &Script &Add Script to selected song A&ggiungi Script alla canzone selezionata &Edit selected Script &Modifica lo script &Remove selected Script &Rimuovi lo script &Create a new Script &Crea nuovo Script Rewind Indietro Play/ Pause/ Load selected song Play/ Pausa / Carica canzone Stop Ferma Fast Forward Avanti Please save your song first Prima salva la canzone WARNING, the new file is executable by the owner of the file! ATTENZIONE, il nuovo file è eseguibile dal possessore del file! Pause. Pausa. Playlist Browser Browser della Playlist Playlist: set song no. %1 Playlist: imposta canzone n. %1 no Script no Script &New Playlist &Nuova Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard Annulla le &modifiche &Cancel &Annulla Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. PlaylistDialog_UI PlayList Browser Browser Playlist Song list Lista canzoni PreferencesDialog Slow Lenta Normal Normale Fast Veloce <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Driver audio semplice [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Non compilato</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Audio driver a bassa latenza Preferences Preferenze <b>ALSA Driver</b><br> <b>Driver ALSA</b><br> <b>PortAudio Driver</b><br> <b>Driver PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Driver CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Riavviare Hydrogen per attivare / disattivare il supporto LASH Driver restart required. Restart driver? Riavvio del driver richiesto Riavvio il driver? &Ok &Ok &Cancel &Annulla Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Buffer size Dimensione buffer Device Dispositivo audio Input Ingresso Channel Canale All Tutti Meters falloff speed Velocità picchi Slow Lenta Normal Normale Fast Veloce Application font Caratteri Applicazione Mixer font Caratteri mixer Select font Seleziona caratteri Polyphony Polifonia Style Stile interfaccia &Cancel &Annulla &OK &OK &General &Generale Audio &System &Sistema audio Metronome volume Volume metronomo Connect to &Default Output Pair Connetti alle uscite audio &principali &Midi System Sistema &midi Midi driver Driver Midi Ignore note-off Ignora il note-off &Appearance &Aspetto grafico Form1 Alt+C Alt+O &Reopen last used song &Ripristina all'avvio l'ultima canzone usata Alt+R ### ### Sample rate Frequenza campionamento 44100 48000 88200 96000 Alt+D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Restart output Riavvia output Audio output details Dettagli uscita audio Post-Fader Pre-Fader Track output Uscita traccia Use lash Usa LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm primo passo, regolare il disallineamento temporale tra la latenza di controller/tastiera e i BPM Beat counter drift compensation in 1/10 ms Compensazione del beat in 1/10ms Beat counter start offset in ms Il conta battiti in izza in ms Path to the Rubberband command-line utility Percorso per l'utility Rubberband Maximum number of bars Numero massimo di barre &Reopen last used playlist &Riapri l'ultima playlist Interpolate resampling Interpolazione del ricampionmento Linear Lineare Cosine Cosine Third Terzo Cubic Cubica Hermite Hermite Default interface layout Interfaccia predefinita Single pane Pannello singolo Tabbed Tab TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Ok &Cancel &Annulla Close dialog! maybe there is some unsaved work on sample. Are you sure? Finestra di chiusura! possono esserci dei lavori non salvati. Sei sicuro? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Dialogo P&lay original sample Riproduci i&l campione originale &Apply Changes &Applica modifiche &Close &Chiudi Adjust sample start frame Regola il frame iniziale Adjust sample loop begin frame Regola il frame iniziale del loop set processing imposta elaborazione forward avanti reverse riavvolgi pingpong pingpong loops loop Adjust sample end & loop end frame Regola la fine e il loop finale del frame &Play Ri&produci new sample length: nuova lunghezza del campione: fade-out type tipo di fade out volume volume panorama panorama Sample length to beat: Lunghezza del campione: off off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Cambia intonazione al campione in semitoni, cent Crispness: 0 0 Start Inizio Loop Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End Fine "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Processore Audio Rubberband" : Cambia il tempo (lunghezza del campione) e il pitch. Pitch (Semitone,Cent) Intonazione (Semitoni,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Manuale utente Welcome to Hydrogen Benvenuto in Hydrogen Don't show this message anymore Non mostrare più questo messaggio Ok Ok Documentation index Indice documentazione SongEditorPanel Create new pattern Crea un nuovo pattern Move the selected pattern down Sposta il pattern selezionato in basso Move the selected pattern up Sposta il pattern selezionato in alto Clear pattern sequence Elimina la sequenza di pattern Song Editor Editor di canzone Select mode Modalità di selezione Draw mode Modalità di modifica Warning, this will erase your pattern sequence. Are you sure? Attenzione, l'intera sequenza di pattern verrà cancellata. Confermi? &Ok &Ok &Cancel &Annulla stacked mode Pattern multipli stacked pattern mode Modalità pattern multipli single pattern mode Modalità pattern singolo Enable time line edit Abilita la modifica del timeline Pattern %1 Modello %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Velocità Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Form Edit the bpm value for current beat Modifica il BPM 500,55 500,55 Edit beat in timeline Modifica il beat sulla timeline 500 500 Bar Barra BPM BPM Delete this BPM Marker Cancella questo marker BPM Delete BPM Marker Cancella marker BPM Cancel Annulla Ok Ok SongEditorPanelTagWidget_UI Form Form Tag Tag Cancel Annulla Ok Ok SongEditorPatternList Copy Copia Delete Elimina Properties Proprietà Fill/Clear ... Riempi/Svuota ... Save Pattern Salva Pattern Load Pattern Carica Pattern Open Pattern Apri Pattern Virtual Pattern Modello Virtuale Pattern 1 Modello 1 not_categorized Nessuna categoria The pattern-file exists. Overwrite the existing pattern? Il file del modello esiste. Sovrascrivere il modello esistente? &Ok &Ok &Cancel &Annulla Export Pattern Could not export pattern. Non riesco a esportare il modello. Could not export sequence. Pattern saved. Pattern salvato. SongPropertiesDialog Song properties Proprietà canzone SongPropertiesDialog_UI Notes Note Author Autore Song name Titolo canzone &Cancel &Annulla &OK &Ok Form1 Alt+O Alt+C License Licenza SoundLibraryExportDialog Export Sound Library Esporta libreria Directory Cartella SoundLibraryExportDialog_UI Dialog Export Esporta Drumkit Drumkit Component Path Version Browse... Cerca... 0.9.7 and higher 0.9.6 and lower Cancel Annulla SoundLibraryImportDialog Sound Library import Importa Sound Library Sound library Sound Library Status Stato Updating SoundLibrary list... Aggiorno la lista di Sound Library... Installed Installato New Nuovo Author: %1 Autore: %1 Downloading SoundLibrary... Scarico la Sound Library... Import drumkit Importa drumkit SoundLibrary imported in %1 Sound Library importata in %1 An error occurred importing the SoundLibrary. C'é stato un errore importando la Sound Library. Drumkits Drumkits Songs Canzoni Patterns Pattern Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Internet Internet Update list Aggiorna list Sound Library Name Nome libreria Author... Autore... Download and install Scarica e installa Local file File locale Browse... Cerca... Install Installa 1 1 Edit server list Modifica lista server Close Chiudi TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Apri Cancel Annulla SoundLibraryPanel Load Apri Export Esporta Delete Elimina System drumkits Drumkit di sistema User drumkits Drumkit utente &Ok &OK &Cancel &Annulla Songs Canzoni Patterns Pattern Error loading song. Errore durante il caricamento della canzone. Properties Proprietà Warning, the selected pattern will be deleted from disk. Are you sure? Attenzione, il modello selezionato sarà cancellato dal disco. Sei sicuro? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Name Nome Author Autore Information Informazioni Save Salva Cancel Annulla Save changes made to instruments into sound library Salva le modifiche fatte agli strumenti nella libreria suoni Drumkit License Image Browse Cerca Image License SoundLibraryRepositoryDialog Edit repository settings Modifica preferenze repository Edit server list Modifica lista server URL URL SoundLibraryRepositoryDialog_UI Dialog Add Aggiungi Delete Elimina SoundLibrarySaveDialog Save Sound Library Salva libreria Please supply at least a valid name Fornisci un nome valido A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Name Nome Author Autore Information Informazioni Cancel Annulla License Licenza Save Salva Image Browse Cerca Image License SoundLibraryTree Sound library Libreria VirtualPatternDialog Select virtual pattern Seleziona modello virtuale VirtualPatternDialog_UI Dialog Dialogo OK Ok Cancel Annulla hydrogen-1.0.0-rc1/data/i18n/hydrogen_ja.ts000066400000000000000000004040361366722712400203640ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>プロジェクトページ</b><br> About このプログラムについて <b>Website</b><br> <b>ウェブサイト</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI ### About Hydrogen Hydrogenについて A&bout Hydrogenについて(&A) &Authors 作者(&A) &License ライセンス(&L) &OK Alt+O AudioEngineInfoForm Audio Engine Info オーディオエンジン情報 AudioEngineInfoForm_UI Playing notes ノートの再生 Process time 経過時間 Audio engine state オーディオエンジンの状態 Song state ソングの状態 Buffer size バッファーサイズ Sample rate サンプルレート Form1 ### Frames フレーム Ticks チック Song position ソングポジション Patterns パターン Selected pattern 選択されたパターン Selected instrument 選択されたインストルメント Connected to 接続 Sampler サンプラー Synth シンセサイザー Sequencer シーケンサー MIDI input MIDI入力 Name 名前 Audio output 音声出力 Realtime frames リアルタイムフレーム AudioFileBrowser Audio File Browser オーディオファイルブラウザー Size: %1 bytes サイズ: %1 バイト Samplerate: %1 サンプルレート: %1 s Name: 名前: Size: サイズ: Samplerate: サンプルレート: Sample length: サンプル長: Please do not preview samples which are longer than 10 minutes! 10分以上のサンプルはプレビューしないで下さい! Sample length: サンプル長: Unable to load that sample file. AudioFileBrowser_UI Dialog ダイアログ Open 開く Name: 名前: Samplerate: サンプルレート: Size: サイズ: Length: 長さ: Cancel キャンセル Pla&y samples by clicking クリックでサンプルを再生(&Y) &Up 上へ(&U) &Home ホーム(&H) &Play Sample サンプルの再生(&P) &Filename to instrument name ファイル名をインストルメント名にする(&F) &Stop 停止(&S) View hidden folders 隠しフォルダーの表示 Be careful, this change all Layer velocity settings この変更はすべてのレイヤーの設定に反映されます Set automatic velocity ベロシティーの自動調製 ComponentMixerLine Mute ミュート Solo ソロ Component name Set instrument volume [%1] インストルメントの音量設定 [%1] Director Director ディレクター Director_UI Dialog ダイアログ DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file MIDI ファイルへのエクスポート Directory %1 does not exists The file %1 exists. Overwrite the existing file? ファイル %1 は存在しています。 上書きしますか? ExportMidiDialog_UI Dialog ダイアログ Filename &Browse... 参照(&B)... Alt+B Modus: &Export エクスポート(&E) Alt+E &Close 閉じる(&C) Alt+C ExportSongDialog Export song ソングのエクスポート The file %1 exists. Overwrite the existing file? ファイル %1 は存在しています。 上書きしますか? Export to a single track 1トラックにエキスポート Both 両方 Export to separate tracks Directory %1 does not exists ExportSongDialog_UI Alt+C &Export エクスポート(&E) Alt+E &Browse... 参照(&B)... Alt+B &Close 閉じる(&C) Samplerate in Hz: サンプルレート (Hz): 22050 44100 48000 96000 192000 SampleDepth in Bit: サンプルのビット数: 8 16 24 32 Templates: テンプレート: WAV in CD quality "44,1kHz, 16 bit PCM" WAV - CDクオリティー "44.1kHz, 16ビット PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV - ADATクオリティー "48kHz, 16ビット PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV - 程良いクオリティー "48kHz, 24ビット PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV- 低クオリティー "22.05kHz, 8ビット PCM" WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV - ミックスダウン向きクオリティー "96kHz, 32ビット PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF - CDクオリティー "44.1kHz, 16ビット PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF - ADATクオリティー "48kHz, 16ビット PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF - 程よいクオリティー "48kHz, 24ビット PCM" FLAC lossless compressor in good quality "48 kHz" FLAC - よいクオリティのロスレス圧縮 "48kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis - よいクオリティのロスレス圧縮 "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog ダイアログ Export directory: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off プラグイン on/off Master output マスター出力 H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag タグ H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties サウンドライブラリーのプロパティー &Ok &Cancel キャンセル(&C) This is not possible, you can only save changes inside instruments to the current loaded sound library 現在ロードされているサウンドライブラリーに属するインストルメントでなければ変更を保存できません Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? 警告! ドラムキット名を変更すると新規にドラムキットを作ることになります。 よろしいですか? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] 読み込まれたドラムキット: [%1] Song Editor ソングエディタ Instrument + Pattern Mixer ミキサー modified Song saved. ソングを保存しました。 InstrumentEditor Show instrument properties インストルメントのプロパティー表示 Show layers properties レイヤーのプロパティー表示 Random pitch factor ランダムピッチ要素 Filter Cutoff カットオフフィルター Filter resonance レゾナンスフィルター Attack アタック Decay ディケイ Sustain サステイン Release リリース Layer gain レイヤーのゲイン New instrument name 新しいインストルメント名 Instrument gain インストルメントのゲイン Layer pitch (Coarse) レイヤーのピッチ (粗め) Layer pitch (Fine) レイヤーのピッチ (細やか) General 一般 Layers レイヤー Stop the current playing instrument-note before trigger the next note sample. 次のノートサンプルがセットされたら現在のインストルメントノートの再生を停止する。 New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size パターンサイズの選択 InstrumentLine Clear notes ノートのクリア Randomize velocity ベロシティーをランダムに Delete instrument インストルメントの削除 Fill notes ... ノートの自動挿入... Fill all notes ノートを全て挿入 Fill 1/2 notes ノートを2つおきに挿入 Fill 1/3 notes ノートを3つおきに挿入 Fill 1/4 notes ノートを4つおきに挿入 Fill 1/6 notes ノートを6つおきに挿入 Fill 1/8 notes ノートを8つおきに挿入 Mute instrument Solo ソロ Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name 新しいインストルメント名 Fill 1/12 notes ノートを8つおきに挿入 {1/12 ?} Fill 1/16 notes ノートを8つおきに挿入 {1/16 ?} InstrumentRack Show Instrument editor インストルメントエディターの表示 Instrument インストルメント Show sound library サウンドライブラリーの表示 Sound library サウンドライブラリー LadspaFXMixerLine Edit FX parameters プラグインのパラメーターを変更 FX bypass プラグインのバイパス Ladspa FX name LADSPAプラグイン名 Effect return エフェクトのリターン LadspaFXProperties Select FX プラグインの選択 [%1] LADSPA FX Properties [%1] LADSPAプラグインのプロパティー LADSPA FX %1 Properties LADSPAプラグイン %1 のプロパティー No plugin プラグインなし Activate 有効化 Deactivate 無効化 Remove FX プラグインの削除 LadspaFXSelector Groups グループ Stereo ステレオ Mono モノラル Not supported サポートされていません Select LADSPA FX LADSPAプラグインの選択 Recently Used 最近使ったプラグイン Alphabetic List アルファベット順リスト Categorized カテゴリー別リスト LadspaFXSelector_UI Form1 ### fx label ### プラグインラベル ### fx type ### プラグインタイプ ### fx ID ### プラグインID &Cancel キャンセル(&C) Alt+C &OK Alt+O 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">プラグイン名:</span></p></body></html> ### fx name 1 ### プラグイン名 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ラベル:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">タイプ:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">開発者:</span></p></body></html> ### FX maker 1 2 ### プラグインマーカー 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">コピーライト:</span></p></body></html> ### copyright 1 2 3 ### コピーライト 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm &Save 保存(&S) &Discard 破棄(&D) Cancel キャンセル Error loading song. ソングの読み込みに失敗しました。 Hydrogen Ready. Save song ソングの保存 Open song ソングを開く Print Objects オブジェクトの印刷 &New 新規(&N) &Open 開く(&O) Open &Demo デモを開く(&D) Open &recent 最近開いたファイル(&R) Export &MIDI file MIDI ファイルへエクスポート(&M) &Preferences 設定(&P) &Quit 閉じる(&Q) Show &audio engine info オーディオエンジンの情報表示(&A) &User manual ユーザマニュアル(&U) &About このプログラムについて(&A) &Cancel キャンセル(&C) Unknown audio driver 不明なオーディオドライバー Error starting audio driver オーディオドライバーにエラーが発生 Jack driver: server shutdown JACKドライバー: サーバーの終了 Jack driver: cannot activate client JACKドライバー: クライアントを有効化できませんでした Jack driver: cannot connect output port JACKドライバー: 出力ポートへ接続できませんでした Jack driver: error in port register JACKドライバー: ポート登録のエラー &Export song ソングのエクスポート(&E) De&bug デバッグ(&B) Save &as... 名前を付けて保存(&A)... &Mixer ミキサー(&M) &Instrument Rack インストルメントラック(&I) &Info 情報(&I) Song saved. ソングを保存しました。 Unknown error %1 不明なエラーです %1 Clear all instruments? すべてのインストルメントを除去しますか? Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! これはHydrogenの開発バージョンです。バグや提案をメーリングリストで報告してくれたら嬉しいです。<br><br>どうもありがとう! Could not save song. ソングを保存できませんでした。 Open &Pattern パターンを開く(&P) Save Pattern as ... 名前を付けてパターンを保存... Pattern saved. パターンを保存しました。 Open Pattern パターンを開く Don't show this message anymore このメッセージをこれ以上は表示しない Playlist: Set song No. %1 プレイリスト: ソングNo. %1 にセット Show &info 情報の表示(&I) Expor&t pattern as... 名前を付けてパターンをエクスポート(&T)... I&nstruments インストルメント(&N) &Add instrument インストルメントの追加(&A) &Clear all 全てを除去(&C) Playlist &editor プレイリストエディター(&E) Info|About Song saved as. 名前を付けてソングを保存します。 Playlist: Song No. %1 プレイリスト: ソング No. %1 Could not export pattern. パターンをエクスポートできませんでした。 The document contains unsaved changes. Do you want to save the changes? ドキュメントは保存されていない変更を含んでいます。 変更を保存しますか? Director ディレクター Undo history &Undo menu Undo Redo Input mode Instrument インストルメント Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New 新規 Open 開く Properties Save Save As Export エクスポート Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] マスター音量の設定 [%1] Swing スウィング Humanize time 時間のヒューマナイズ Humanize velocity ベロシティーのヒューマナイズ Set humanize time parameter [%1] 時間パラメーターをヒューマナイズ [%1] Set humanize velocity parameter [%1] ベロシティーパラメーターをヒューマナイズ [%1] Set swing factor [%1] スウィング要素の設定 [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event イベント Param. パラメーター。 Action アクション press button to record midi event ボタンを押してMIDIイベントを記録します Mixer Show instrument peaks インストルメントのピークの表示 Show instrument peaks = On インストルメントのピークの表示 = On Show instrument peaks = Off インストルメントのピークの表示 = Off Set FX %1 level プラグインに %1 レベルを設定 Set LADSPA FX ( %1 ) volume LADSPAプラグインにボリュームを設定 ( %1 ) Show FX panel プラグインパネルの表示 LADSPA effects are not available in this version of Hydrogen. Mixer ミキサー MixerLine Play sample サンプルの再生 Mute ミュート Solo ソロ Pan パン Instrument name (double click to edit) インストルメント名 (ダブルクリックで編集) Set instrument volume [%1] インストルメントの音量設定 [%1] Set instr. pan [%1] インストルメントのパンを設定 [%1] PatternEditorPanel Hear new notes 新しいノートを聞く Hear new notes = On 新しいノートの音 = On Hear new notes = Off 新しいノートの音 = Off Pattern editor - %1 パターンエディタ - %1 Quantize keyboard/midi events to grid キーボード/MIDIイベントをグリッドにクオンタイズする Quantize incoming keyboard/midi events = On 入力されたキーボード/MIDIイベントのクオンタイズ = On Quantize incoming keyboard/midi events = Off 入力されたキーボード/MIDIイベントのクオンタイズ = Off Zoom in 拡大 Zoom out 縮小 Is not possible to change the pattern size when playing. 再生中はパターンのサイズを変更できません。 Select pattern size パターンサイズの選択 Select grid resolution グリッド解像度の選択 No pattern selected パターンが選択されていません Select note properties ノートのプロパティーを選択 Velocity ベロシティー Pan パン Lead and Lag Loaded Soundlibrary ロードされたサウンドライブラリー NoteKey ノートキー destructive mode pre delete settings destructive mode post delete settings Show piano roll editor ピアノロールエディターの表示 Show drum editor ドラムエディターの表示 Probability PatternFillDialog Fill with selected pattern 選択したパターンを並べる PatternFillDialog_UI Alt+C Form 1 &Fill 並べる(&F) Alt+F &Clear 除去(&C) From: 開始: To: 終了: Cancel キャンセル OK PatternPropertiesDialog Pattern properties パターンのプロパティ %1#2 %1 PatternPropertiesDialog_UI &Cancel キャンセル(&C) Alt+C &OK Alt+O New Pattern Name 新しいパターンの名前 Form1 Pattern category パターンのカテゴリー Pattern description PlayerControl Song Mode ソングモード Playing. 再生。 Stopped. 停止。 Song mode selected. ソングモードの選択。 Stop 停止 Pattern Mode パターンモード Pattern mode selected. パターンモードの選択。 Jack-transport on/off JACKトランスポートの on/off Jack-transport mode = On JACKトランスポートモード = On Jack-transport mode = Off JACKトランスポートモード = Off New BPM value 新しいBPM値 Rewind 巻き戻し Play/ Pause 再生/一時停止 Fast Forward 早送り Pause. 一時停止。 JACK-transport will work only with JACK driver. JACKトランスポートはJACKドライバーを使用時のみ動作します。 Loop song ソングのループ Loop song = On ソングのループ = オン Loop song = Off ソングのループ = オフ Show mixer ミキサーを表示 Mixer ミキサー Show Instrument Rack インストルメントラックの表示 Instrument rack インストルメントラック BeatCounter Panel on ビートカウンターパネルのon Set BPM / Set BPM and play BPMの設定/BPMの設定と再生 Jack-Time-Master on/off JACKタイムマスターのon/off BC Panel on BC パネル on BC Panel off BC パネル off Count BPM and start PLAY BPMのカウントと再生開始 Count and set BPM BPMのカウントと設定 Jack-Time-Master mode = On JACKタイムマスターモード = On Jack-Time-Master mode = Off JACKタイムマスターモード = Off Record 記録 Destructive Record 上書き録音 Record midi events = On MIDIイベントの記録 = On Record midi events = Off MIDIイベントの記録 = Off Destructive mode = Off 上書きモード = Off Destructive mode = On 上書きモード = On Recalculate Rubberband modified samples if bpm will change BPMが変更した時にRubberbandによる修正サンプルを再計算する Recalculate all samples using Rubberband ON Rubberbandによる全サンプルの再計算 On Recalculate all samples using Rubberband OFF Rubberbandによる全サンプルの再計算 OFF Switch metronome on/off PlaylistDialog Song list ソングリスト Script スクリプト exec Script スクリプトの実行 Add Song to PlayList ソングをプレイリストに追加 No Song selected! ソングが選択されていません! Load Playlist プレイリストの読み込み Save Playlist プレイリストの保存 No Song in List or no Song selected! リストにソングがないか、ソングが選択されていません! Hydrogen Playlist (*.sh) Hydrogen プレイリスト (*.sh) Add Script to selected Song 選択したソングにスクリプトを追加 No Script in use! スクリプトが使われていません! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. デフォルトのエディターを設定してください。 ただし、コンソールベースのエディターは使わないでください。 ごめんなさい、けど現時点では使うことができないのです。 Set your Default Editor デフォルトのエディターを設定 No Script selected! スクリプトが選択されていません! Error loading song. ソングの読み込みに失敗しました。 sort 並べ替え New Script 新規スクリプト Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. スクリプト名あるいはスクリプトのパスが空白文字を含んでいます。 重要 スクリプト名あるいはスクリプトのパスが空白文字を含んではいけません。 No Script! スクリプトなし! &Playlist プレイリスト(&P) Add song to Play&list ソングをプレイリストに追加(&L) Add &current song to Playlist 現在のソングをプレイリストに追加(&C) &Remove selected song from Playlist 選択したソングをプレイリストから除外(&R) &Open Playlist プレイリストを開く(&O) &Save Playlist プレイリストを保存(&S) Save Playlist &as 名前を付けてプレイリストを保存(&A) &Scripts スクリプト(&S) &Add Script to selected song 選択したソングにスクリプトを追加(&A) &Edit selected Script 選択したスクリプトの編集(&E) &Remove selected Script 選択したスクリプトの削除(&R) &Create a new Script 新しいスクリプトの作成(&C) Rewind 巻き戻し Play/ Pause/ Load selected song 再生 / 一時停止 / 選択したソングの読み込み Stop 停止 Fast Forward 早送り Please save your song first まずソングを保存して下さい WARNING, the new file is executable by the owner of the file! 警告, 新しいファイルは所有者が実行を許されている必要があります! Pause. 一時停止。 Playlist Browser プレイリストブラウザー Playlist: set song no. %1 プレイリスト: ソング No. %1 に設定 no Script スクリプトなし &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard 破棄(&D) &Cancel キャンセル(&C) Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. PlaylistDialog_UI PlayList Browser プレイリストブラウザー Song list ソングリスト PreferencesDialog Slow 遅い Normal 普通 Fast 早い <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>簡易なオーディオドライバ [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">不完全</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>JACK Audio Connection Kit ドライバー</b><br>低遅延なオーディオドライバー Preferences 設定 <b>ALSA Driver</b><br> <b>ALSA ドライバ</b><br> <b>PortAudio Driver</b><br> <b>PortAudio ドライバ</b><br> <b>CoreAudio Driver</b><br> <b>CoreAudio ドライバー</b><br> Please restart hydrogen to enable/disable LASH support LASHサポートを有効/無効にするためhydrogenを再起動してください Driver restart required. Restart driver? ドライバーの再起動が必要です。 再起動しますか? &Ok &Cancel キャンセル(&C) Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Buffer size バッファーサイズ Device デバイス Input 入力 Channel キャンセル All すべて Meters falloff speed メータ減衰速度 Slow 遅い Normal 普通 Fast 早い Application font アプリケーションのフォント Mixer font ミキサーのフォント Select font フォントの選択 Sample rate サンプルレート 44100 48000 ### 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Form1 Polyphony ポリフォニー Style スタイル &Cancel キャンセル(&C) Alt+C &OK Alt+O &General 一般(&G) Alt+R Audio &System オーディオシステム(&S) Metronome volume メトロノームの音量 Connect to &Default Output Pair デフォルトの出力ペアへ接続(&D) Alt+D 88200 96000 &Midi System MIDI システム(&M) Midi driver MIDI ドライバー Ignore note-off ノートオフを無視 &Appearance 外観(&A) &Reopen last used song 最後に使用したソングを開く(&R) Restart output 出力の再開 Audio output details オーディオ出力の詳細 Post-Fader ポストフェーダー Pre-Fader プレフェーダー Track output トラック出力 Use lash lashを使う first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms Beat counter start offset in ms Path to the Rubberband command-line utility Rubberbandコマンドラインユーティリティーへのパス Maximum number of bars &Reopen last used playlist 最後に使ったプレイリストを開く(&R) Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Cancel キャンセル(&C) Close dialog! maybe there is some unsaved work on sample. Are you sure? ダイアログを閉じますが、保存されていない変更があるかもしれません。 よろしいですか? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog ダイアログ P&lay original sample オリジナルサンプルの再生(&L) &Apply Changes 変更の適用(&A) &Close 閉じる(&C) Adjust sample start frame サンプルの開始フレームの調整 Adjust sample loop begin frame サンプルのループ開始フレームの調整 set processing ループ方向の設定 forward 順方向 reverse 逆方向 pingpong ピンポン loops ループ Adjust sample end & loop end frame サンプルの終わりとループの終わりフレームの調整 &Play 再生(&P) new sample length: 新しいサンプル長: fade-out type フェードアウトの種類 volume 音量 panorama パノラマ Sample length to beat: ビートあたりのサンプル長: off オフ 1/64 1/32 1/16 1/8 1/4 1/2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Pitch the sample in semitones, cents Crispness: 0 Start 開始 Loop ループ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">ループ</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">モード</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">ループ</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">カウント</span></p></body></html> End 終わり "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Rubberband オーディオプロセッサー" : テンポ (サンプル長) とオーディオのピッチを変更。 Pitch (Semitone,Cent) ピッチ (半音、セント) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual マニュアル Welcome to Hydrogen Hydrogen へようこそ Don't show this message anymore このメッセージをこれ以上表示しない Ok Documentation index ドキュメントのインデックス SongEditorPanel Create new pattern 新しいパターンの作成 Move the selected pattern down 選択したパターンを下に Move the selected pattern up 選択したパターンを上に Clear pattern sequence パターンシーケンスのクリア Song Editor ソングエディタ Select mode 選択モード Draw mode ドローモード Warning, this will erase your pattern sequence. Are you sure? 警告、あなたのパターンシーケンスを消去します。 よろしいですか? &Ok &Cancel キャンセル(&C) stacked mode スタックモード stacked pattern mode スタックパターンモード single pattern mode シングルパターンモード Enable time line edit タイムライン編集を有効にする Pattern %1 パターン %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity ベロシティー Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 現在のBPM値を編集 500,55 Edit beat in timeline タイムライン上のビートを編集 500 Bar BPM Delete this BPM Marker このBPMマーカーを削除します Delete BPM Marker BPMマーカーの削除 Cancel キャンセル Ok SongEditorPanelTagWidget_UI Form Tag タグ Cancel キャンセル Ok SongEditorPatternList Copy コピー Delete 削除 Properties プロパティー Fill/Clear ... 並べる/クリアー... Save Pattern パターンの保存 Load Pattern パターンの読み込み Open Pattern パターンを開く Virtual Pattern 仮想パターン Pattern 1 パターン 1 not_categorized 未分類 The pattern-file exists. Overwrite the existing pattern? パターンファイルが存在しています。 上書きしますか? &Ok &Cancel キャンセル(&C) Export Pattern Could not export pattern. パターンをエクスポートできませんでした。 Could not export sequence. Pattern saved. パターンを保存しました。 SongPropertiesDialog Song properties ソングのプロパティー SongPropertiesDialog_UI Notes 備考 Author 作者 Song name ソングの名前 Form1 &Cancel キャンセル(&C) Alt+C &OK Alt+O License ライセンス SoundLibraryExportDialog Export Sound Library サウンドライブラリーのエクスポート Directory SoundLibraryExportDialog_UI Dialog ダイアログ Export エクスポート Drumkit Component Path Version Browse... 参照... 0.9.7 and higher 0.9.6 and lower Cancel キャンセル SoundLibraryImportDialog Sound Library import サウンドライブラリーのインポート Sound library サウンドライブラリー Status 状態 Updating SoundLibrary list... サウンドライブラリーリストの更新... Installed インストール済 New 新規 Author: %1 作者: %1 Downloading SoundLibrary... サウンドライブラリーのダウンロード... Import drumkit ドラムキットのインポート SoundLibrary imported in %1 %1 にサウンドライブラリーをインポートしました An error occurred importing the SoundLibrary. サウンドライブラリーのインポートでエラーが発生しました。 Drumkits ドラムキット Songs ソング Patterns パターン Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog ダイアログ Internet インターネット Update list リストの更新 Sound Library Name サウンドライブラリー名 Author... 作者... Download and install ダウンロードとインストール Local file ローカルファイル Browse... 参照... Install インストール 1 Edit server list サーバーリストの編集 Close 閉じる TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load 読み込み Cancel キャンセル SoundLibraryPanel Load 読み込み Export エクスポート Delete 削除 System drumkits システムのドラムキット User drumkits ユーザーのドラムキット &Ok &Cancel キャンセル(&C) Songs ソング Patterns パターン Error loading song. ソングの読み込みに失敗しました。 Properties プロパティ Warning, the selected pattern will be deleted from disk. Are you sure? 警告、選択されたパターンはディスクから削除されます。 よろしいですか? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog ダイアログ Name 名前 Author 作者 Information 情報 Save 保存 Cancel キャンセル Save changes made to instruments into sound library インストルメントの変更をサウンドライブラリーに保存します Drumkit License Image Browse 参照 Image License SoundLibraryRepositoryDialog Edit repository settings リポジトリの設定を編集 Edit server list サーバーリストを編集 URL URL SoundLibraryRepositoryDialog_UI Dialog ダイアログ Add 追加 Delete 削除 SoundLibrarySaveDialog Save Sound Library サウンドライブラリーの保存 Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog ダイアログ Name 名前 Author 作者 Information 情報 Cancel キャンセル License ライセンス Save 保存 Image Browse 参照 Image License SoundLibraryTree Sound library サウンドライブラリー VirtualPatternDialog Select virtual pattern 仮想パターンを選択 VirtualPatternDialog_UI Dialog ダイアログ OK Cancel キャンセル hydrogen-1.0.0-rc1/data/i18n/hydrogen_nl.ts000066400000000000000000003517561366722712400204150ustar00rootroot00000000000000 AboutDialog About Info <b>Project page</b><br> <b>Project pagina</ba><br> <b>Website</b><br> <b>Website</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen Info over Hydrogen A&bout &Info ### ### &Authors &Auteurs &License &Licentie &OK &OK Alt+O Alt+O AudioEngineInfoForm Audio Engine Info Audio info AudioEngineInfoForm_UI Form1 Form1 Audio engine state Driver status ### ### Playing notes Gespeelde noten Process time Proces tijd Song position Positie Patterns Patroon Song state Opname status Frames Frames Ticks Tellen Selected pattern Patroon Selected instrument Instrument Sample rate Sample rate Buffer size Buffer grootte Connected to Verbonden met Sampler Sampler Synth Synth Sequencer Sequencer MIDI input MIDI ingang Name Naam Audio output Audio uitgang Realtime frames Realtime frames AudioFileBrowser Audio File Browser Size: %1 bytes Samplerate: %1 s Name: Size: Samplerate: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Name: Samplerate: Size: Length: Pla&y samples by clicking &Up &Home &Play Sample &Filename to instrument name Open Cancel Annuleren &Stop View hidden folders Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Dempen Solo Solo Component name Set instrument volume [%1] Instrument volume [%1] Director Director Director_UI Dialog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - Geschatte tijd: %3 ExportSongDialog Export song Exporteren The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks ExportSongDialog_UI Alt+C Alt+A &Export &Exporteren Alt+E Alt+E &Browse... &Bladeren... Alt+B Alt+B &Close &Afsluiten Samplerate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: 8 8 16 16 24 24 32 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Export directory: Modus: FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off FX aan/uit Master output Master uitgang H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties &Ok &Ok &Cancel &Annuleren This is not possible, you can only save changes inside instruments to the current loaded sound library Dit is niet mogelijk, je kan enkel wijzigingen opslaan van instrumment in de geladen geluids bibliotheek Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Opgelet! Door de drumkit naam te wijzigen wordt een nieuwe drumkit met deze naam aangemaakt Ben je zeker dat je de naam wilt wijzigen? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Geladen drumkit:[%1] Song Editor Opname editor Instrument + Pattern Mixer Mixer modified InstrumentEditor Random pitch factor Willekeurige pitch Filter Cutoff Filter Cutoff Filter resonance Filter tonen Attack Attack Decay Decay Sustain Sustain Release Release Instrument gain Instrument gain Layer gain Laag gain Show instrument properties Toon instrument eigenschappen Show layers properties Toon laag eigenschappen New instrument name Nieuwe instrument naam Layer pitch (Coarse) Laag picht (grof) Layer pitch (Fine) Laag pitch (fijn) General Algemeen Layers Lagen Stop the current playing instrument-note before trigger the next note sample. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Selecteer patroon groote InstrumentLine Clear notes Wis noten Randomize velocity Willekeurige velocity Delete instrument Verwijderen Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Mute instrument Solo Solo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nieuwe instrument naam Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Toon instrument bewerker Instrument Instrument Show sound library Toon geluids bibliotheek Sound library Geluids bibliotheek LadspaFXMixerLine FX bypass FX bypass Edit FX parameters Bewerk FX parameters Ladspa FX name Ladspa FX naam Effect return Effect volume LadspaFXProperties Select FX Selecteer FX Activate Inschakelen [%1] LADSPA FX Properties [%1] LADSPA FX eigenschappen Deactivate Uitschakelen LADSPA FX %1 Properties LADSPA FX %1 instellingen No plugin Geen plugin Remove FX LadspaFXSelector Select LADSPA FX Selecteer LADSPA FX Groups Groepen Stereo Stereo Mono Mono Not supported Niet ondersteund Recently Used Recent gebruikt Alphabetic List Alfabetische lijst Categorized Categoriën LadspaFXSelector_UI Form1 Form1 &Cancel &Annuleren Alt+C Alt+A &OK &OK Alt+O Alt+O ### fx label ### fx label ### fx type ### fx type ### fx ID ### fx ID 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 ### FX maker 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Error loading song. Fout bij het laden van de opname. Hydrogen Ready. Hydrogen is klaar. &New &Nieuw &Open &Openen Open &Demo Open &voorbeeld Open &recent Open &recent &Save Op&slaan &Export song &Exporteren Export &MIDI file Exporteren naar &MIDI &Preferences &Instellingen &Quit &Afsluiten De&bug &Debug Show &audio engine info Toon &audio engine info &User manual &Handleiding &About &Over &Discard &Negeren &Cancel &Annuleren Hydrogen Song (*.h2song) Hydrogen Opname (*.h2song) Save song Opname opslaan Open song Open opname Cancel Annuleren Midi file (*.mid) MIDI file (*.mid) Export MIDI file Exporteer MIDI bestand Unknown audio driver Onbekende audio driver Error starting audio driver Fout bij het starten van de audio driver Jack driver: server shutdown Jack driver: proces gestopt Jack driver: cannot activate client Jack driver: kan client niet activeren Jack driver: cannot connect output port Jack driver: kan niet verbinden met uitgangspoort Jack driver: error in port register Jack driver: fout in het poort register Save &as... Opslaan &als ... &Mixer &Mixer &Instrument Rack &Instrument rack Print Objects Print objecten &Info &Info Song saved. Opname opgeslaan. Unknown error %1 Ongekende error: %1 Clear all instruments? Wis alle instrumenten? Ok Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Je gebruikt een ontwikkel versie van Hydrogen. Help ons Hydrogen beter te maken door bugs te melden en voorstellen te doen in de hydrogen-devel mailing lijst.<br><br>Dank u! Could not save song. Kon de opname niet opslaan. Open &Pattern Open &patroon Hydrogen Pattern (*.h2pattern) Hydrogen Patroon (*.h2pattern) Save Pattern as ... Sla patroon op als ... Pattern saved. Patroon opgeslaan. Open Pattern Open patroon Don't show this message anymore Toon deze boodschap niet meer Playlist: Set song No. %1 Afspeellijst: opname nummer: %1 Show &info Toon &info Expor&t pattern as... Expor&teer patroon als ... I&nstruments I&nstrumenten &Add instrument Instrument toevoegen &Clear all Wis alles Playlist &editor Afspeellijst bewerken Info|About Info|Over Song saved as. Opname opgeslaan Playlist: Song No. %1 Afspeellijst: opname nummer: %1 Could not export pattern. The document contains unsaved changes. Do you want to save the changes? Director Undo history &Undo menu Undo Redo Input mode Instrument Instrument Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Nieuw Open Properties Eigenschappen Save Save As Export Exporteren Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. MasterMixerLine Humanize velocity Menselijke velocity Humanize time Menselijke tijd Swing Swing Set master volume [%1] Master volume [%1] Set humanize time parameter [%1] Menselijke tijd parameter [%1] Set humanize velocity parameter [%1] Menselijke velocity parameter [%1] Set swing factor [%1] Swing factor [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Param. Action press button to record midi event Mixer Show FX panel Toon FX venster Show instrument peaks Toon piek volumes Set FX %1 level Stel FX %1 volume in Show instrument peaks = On Toon piek volumes = Aan Show instrument peaks = Off Toon piek volumes = Uit Set LADSPA FX ( %1 ) volume Stel LADSPA FX ( %1 ) volume in LADSPA effects are not available in this version of Hydrogen. Mixer Mixer MixerLine Play sample Speel voorbeeld Mute Dempen Solo Solo Pan Pan Instrument name (double click to edit) Instrument naam (dubbelklik om te bewerken) Set instrument volume [%1] Instrument volume [%1] Set instr. pan [%1] Instrument pan [%1] PatternEditorPanel Select pattern size Selecteer patroon groote Select grid resolution Selecteer raster resolutie Hear new notes Speel nieuwe noten Quantize keyboard/midi events to grid Plaats keyboard/midi noten op het raster Zoom in Inzoomen Zoom out Uitzoomen Pattern editor - %1 Patroon editor - %1 Hear new notes = On Speel nieuwe noten = Aan Hear new notes = Off Speel nieuwe noten = Uit Quantize incoming keyboard/midi events = On Quantiseer toetsenbord/midi = Aan Quantize incoming keyboard/midi events = Off Quantiseer toetsenbord/midi = Uit Is not possible to change the pattern size when playing. Het is niet mogelijk om de patroon grootte te wijzigen gedurende het spelen. No pattern selected Geen patroon geselecteerd Select note properties Selecteer noot opties Velocity Velocity Pan Pan Cutoff Cutoff Resonance Resonantie Lead and Lag Loaded Soundlibrary NoteKey destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Show drum editor Probability PatternFillDialog Fill with selected pattern Vul met geselecteerd patroon PatternFillDialog_UI Alt+C Alt+A Cancel Annuleren Form 1 Form 1 &Fill &Vullen Alt+F Alt+V &Clear Wissen From: Van: To: Naar: OK OK PatternPropertiesDialog Pattern properties Patroon eigenschappen %1#2 %1 PatternPropertiesDialog_UI Form1 Form1 &Cancel &Annuleren Alt+C Alt+A &OK &OK Alt+O Alt+O New Pattern Name Patroon naam Pattern category Patroon categorie Pattern description PianoRollEditor Velocity Velocity Pan Pan Lead and Lag PlayerControl Rewind Terugspoelen Play/ Pause Start/Pause Stop Stop Fast Forward Doorspoelen Loop song Herhaal opname Pattern Mode Patroon mode Song Mode Opname mode Jack-transport on/off Jack-transport aan/uit Playing. Gestart. Pause. Pause. Stopped. Gestopt. Song mode selected. Opname mode geslecteerd. Pattern mode selected. Patroon mode geselecteerd. Jack-transport mode = On Jack-transport mode = Aan Jack-transport mode = Off Jack-transport mode = Uit JACK-transport will work only with JACK driver. Jack-transport zal enkel werken met de JACK driver. New BPM value Nieuwe BPM waarde Loop song = On Herhaal opame = Aan Loop song = Off Herhaal opname = Uit Show mixer Toon mixer Mixer Mixer Show Instrument Rack Toon instrument rack Instrument rack Instrument rack BeatCounter Panel on BeatCounter paneel aan Set BPM / Set BPM and play Jack-Time-Master on/off Jack-Time-Master aan/uit BC Panel on BC paneel aan BC Panel off BC paneel uit Count BPM and start PLAY Tel BPM en afspelen Count and set BPM Tel BPM en BPM opslaan Jack-Time-Master mode = On Jack-Time-Master mode = Aan Jack-Time-Master mode = Off Jack-Time-Master mode = Uit Record Destructive Record Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate Rubberband modified samples if bpm will change Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off PlaylistDialog Song list Script exec Script Add Song to PlayList No Song selected! Load Playlist Hydrogen Playlist (*.h2playlist) Save Playlist No Song in List or no Song selected! Hydrogen Playlist (*.sh) Add Script to selected Song No Script in use! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Set your Default Editor No Script selected! Error loading song. sort Hydrogen Scripts (*.sh) New Script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. No Script! &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Terugspoelen Play/ Pause/ Load selected song Stop Stop Fast Forward Doorspoelen Please save your song first WARNING, the new file is executable by the owner of the file! Pause. Pause. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Negeren &Cancel &Annuleren Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Hydrogen playlist (*.h2playlist) PlaylistDialog_UI PlayList Browser Song list PreferencesDialog Preferences Instellingen Slow Traag Normal Normaal Fast Snel <b>Automatic driver selection</b> <b>Automatische driver selectie</b> <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Niet ingebouwd</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Lage latency audio driver <b>ALSA Driver</b><br> <b>ALSA Driver</b><br> <b>PortAudio Driver</b><br> <b>PortAudio Driver</b><br> <b>CoreAudio Driver</b><br> <b>CoreAudio Driver</b><br> Please restart hydrogen to enable/disable LASH support Je moet Hydrogen herstarten om LASH ondersteuning in of uit te schakelen Driver restart required. Restart driver? &Ok &Cancel &Annuleren Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) PreferencesDialog_UI Form1 Form1 &Cancel &Annuleren Alt+C Alt+A &OK &OK Alt+O Alt+O &General Al&gemeen Alt+R Alt+H Audio &System Audio &Systeem ### ### Device Apparaat Buffer size Buffer grootte Sample rate Sample rate Metronome volume Metronoom volume Connect to &Default Output Pair &Verbind standaard uitvoer paar Alt+D Alt+V 44100 44100 48000 48000 88200 88200 96000 96000 &Midi System &Midi Systeem Midi driver Midi driver Input Ingang All Alles 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Channel Kanaal Ignore note-off Negeer noot af &Appearance &Voorkomen Application font Programma lettertype Style Stijl Select font Selecteer lettertype Slow Traag Normal Normaal Fast Snel Mixer font Mixer lettertype Meters falloff speed Meters afval snelheid &Reopen last used song &Heropen laatst gebruikte opname Polyphony Restart output Herstart uitgang Audio output details Audio uitgang details Post-Fader Post-Fader Pre-Fader Pre-Fader Track output Use lash Gebruik LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Beat counter start offset in ms Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback SampleEditor Unsaved changes left. This changes will be lost. Are you sure? &Ok &Cancel &Annuleren Close dialog! maybe there is some unsaved work on sample. Are you sure? SampleEditor_UI Dialog P&lay original sample &Apply Changes &Close &Afsluiten Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame &Play new sample length: fade-out type volume panorama Sample length to beat: off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Crispness: 0 0 Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Handleiding Welcome to Hydrogen Welkom bij Hydrogen Don't show this message anymore Toon deze boodschap niet meer Ok Ok Documentation index Documentatie index SongEditorPanel Song Editor Opname editor Create new pattern Maak een nieuw patroon Move the selected pattern down Verplaats het geselecteerde patroon naar beneden Move the selected pattern up Verplaats het geselecteerde patroon naar boven Clear pattern sequence Wis patroon sequenties Select mode Selectie mode Draw mode Teken mode Warning, this will erase your pattern sequence. Are you sure? Opgepast, dit zal alle sequenties voor het patroon wissen Ben je zeker? &Ok &Ok &Cancel &Annuleren stacked mode stacked pattern mode single pattern mode Enable time line edit Pattern %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Velocity Select playback track SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 500,55 Edit beat in timeline 500 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Annuleren Ok Ok SongEditorPanelTagWidget_UI Form Tag Cancel Annuleren Ok Ok SongEditorPatternList Copy Kopiëren Delete Wissen Properties Eigenschappen Fill/Clear ... Opvullen/Wissen ... Save Pattern Patroon opslaan Load Pattern Patroon laden Open Pattern Patroon openen Hydrogen Pattern (*.h2pattern) Hydrogen patroon (*.h2pattern) Virtual Pattern Pattern 1 not_categorized The pattern-file exists. Overwrite the existing pattern? &Ok &Cancel &Annuleren Export Pattern SongPropertiesDialog Song properties Opname eigenschappen SongPropertiesDialog_UI Form1 Form1 Song name Opname naam Author Auteur Notes Commentaar &Cancel &Annuleren Alt+C Alt+A &OK &OK Alt+O Alt+O License Licentie SoundLibraryExportDialog Export Sound Library Exporteer geluid bibliotheek Directory SoundLibraryExportDialog_UI Dialog Export Exporteren Drumkit Component Path Version Browse... Bladeren ... 0.9.7 and higher 0.9.6 and lower Cancel Annuleren SoundLibraryImportDialog Sound Library import Geluid bibliotheek importeren Sound library Geluid bibliotheek Status Status Updating SoundLibrary list... Geluid bibliotheek updaten ... Installed Geïnstalleerd New Nieuw Author: %1 Auteur: %1 Downloading SoundLibrary... Geluid bibliotheek downloaden ... Import drumkit Drumkit importeren SoundLibrary imported in %1 Geluid bibliotheek geïmporteerd in %1 An error occurred importing the SoundLibrary. Er is een fout opgetreden bij het importeren van de geluid bibliotheek. Drumkits Drumkits Songs Opnames Patterns Patronen Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Internet Internet Update list Update lijst Sound Library Name Geluid bibliotheek naam Author... Auteur ... Download and install Downloaden en installeren Local file Lokaal bestand Browse... Bladeren ... Install Installeren 1 1 Edit server list Bewerk server lijst Close Sluiten TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Laden Cancel Annuleren SoundLibraryPanel Load Laden Export Exporteren Delete Wissen System drumkits Systeem drumkits User drumkits Gebruiker drumkits &Ok &OK &Cancel &Annuleren Songs Opnames Patterns Patronen Error loading song. Fout bij het laden van de opname Properties Eigenschappen Warning, the selected pattern will be deleted from disk. Are you sure? Opgelet, het geselecteerde patroon zal gewist worden. Ben je zeker dat verder wilt gaan? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Name Naam Author Auteur Information Informatie Save Opslaan Cancel Annuleren Save changes made to instruments into sound library Gemaakte wijzigingen opslaan in geluids bibliotheek Drumkit License Image Browse Bladeren Image License SoundLibraryRepositoryDialog Edit repository settings Edit server list Bewerk server lijst URL URL SoundLibraryRepositoryDialog_UI Dialog Add Toevoegen Delete Wissen SoundLibrarySaveDialog Save Sound Library Geluid bibliotheek opslaan Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Name Naam Author Auteur Information Informatie Cancel Annuleren License Licentie Save Opslaan Image Browse Bladeren Image License SoundLibraryTree Sound library Geluid bibliotheek VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog OK OK Cancel Annuleren hydrogen-1.0.0-rc1/data/i18n/hydrogen_pl.ts000066400000000000000000003544611366722712400204130ustar00rootroot00000000000000 AboutDialog About O programie <b>Website</b><br> <b>Strona WWW</b><br> <b>Project page</b><br> <b>Strona projektu</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen O Hydrogen &OK &OK Alt+O Alt+O A&bout O &programie ### ### &Authors &Autorzy &License &Licencja AudioEngineInfoForm Audio Engine Info Informacja o Silniku Audio AudioEngineInfoForm_UI Form1 Formularz1 ### ### Buffer size Rozmiar bufora Sample rate Częstotliwość próbkowania Connected to Podłączony do Frames Ramki Process time Czas przetwarzania Ticks Cykle Song state Stan utworu Selected instrument Wybrany instrument Audio engine state Stan silnika Audio Selected pattern Wybrany układ rytmiczny Playing notes Odtwarzanie nut Patterns Układy Song position Pozycja utworu Sampler Sampler Synth Syntezator Sequencer Sekwencer MIDI input wejście MIDI Name Nazwa Audio output Wyjście Audio Realtime frames Ramki czasu rzeczywistego AudioFileBrowser Audio File Browser Size: %1 bytes Samplerate: %1 s Name: Size: Samplerate: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Dialog Open Name: Samplerate: Size: Length: Cancel Anuluj Pla&y samples by clicking &Up &Home &Play Sample &Filename to instrument name &Stop View hidden folders Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Wyciszenie Solo Solo Component name Set instrument volume [%1] Ustawia głośność instrumentu [%1] Director Director Director_UI Dialog Dialog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportSongDialog Export song Eksportuj utwór The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks ExportSongDialog_UI &Close &Zamknij Alt+C Alt+C &Export &Eksportuj Alt+E Alt+E &Browse... &Przeglądaj... Alt+B Alt+B Samplerate in Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: 8 8 16 16 24 24 32 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Dialog Export directory: Modus: FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off włącz/wyłącz efekt Master output Wyjście główne (master) H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties &Ok &Ok &Cancel &Anuluj This is not possible, you can only save changes inside instruments to the current loaded sound library Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Zestaw załadowany: [%1] Song Editor Edytor utworu Instrument + Pattern Mixer Mikser modified InstrumentEditor Random pitch factor Współczynnik losowości zmiany wysokości dźwięku Filter Cutoff Częstotliwość graniczna filtru Filter resonance Częstotliwość rezonansowa filtru Attack Atak Decay Zanik Sustain Podtrzymanie Release Uwolnienie Instrument gain Wzmocnienie instrumentu Layer gain Wzmocnienie warstwy Layer pitch (Coarse) Wysokość dźwięku warstwy (zgrubna) Layer pitch (Fine) Wysokość dźwięku warstwy (dokładna) Show instrument properties Pokazuje właściwości instrumentu Show layers properties Pokazuje właściwości warstw New instrument name Nowa nazwa instrumentu General Ogólne Layers Warstwy Stop the current playing instrument-note before trigger the next note sample. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Wybór rozmiaru układu rytmicznego InstrumentLine Clear notes Usuń nuty Randomize velocity Losowa głośność Delete instrument Usuń instrument Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Mute instrument Solo Solo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nowa nazwa instrumentu Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Pokazuje edytor instrumentów Instrument Instrument Show sound library Pokazuje bibliotekę dźwięków Sound library Biblioteka dźwięków LadspaFXMixerLine FX bypass obejście efektu Edit FX parameters Edycja parametrów efektu Ladspa FX name nazwa LADSPA efektu Effect return Powrót efektu LadspaFXProperties Select FX wybór efektu Activate Aktywacja [%1] LADSPA FX Properties [%1] właściwości efektu LADSPA Deactivate Deaktywuj LADSPA FX %1 Properties właściwości efektu LADSPA %1 No plugin Brak wtyczki Remove FX LadspaFXSelector Select LADSPA FX Wybór efektu LADSPA Groups Grupy Stereo Stereo Mono Mono Not supported Nie wspierane Recently Used Alphabetic List Categorized LadspaFXSelector_UI Form1 Formularz1 &Cancel &Anuluj Alt+C Alt+C &OK &OK Alt+O Alt+O ### fx label ### etykieta efektu ### fx type ### typ efektu ### fx ID ### ID efektu 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 ### twórca efektu1234 {1 2?} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### copyright1234 {1 2 3?} LayerPreview Dec. = %1 MIDI = %2 MainForm Hydrogen Ready. Hydrogen Gotowy. &New &Nowy &Open &Otwórz Open &Demo Otwórz &Demo Open &recent Otwó&rz niedawne &Save &Zapisz Save &as... Zapisz j&ako... Export &MIDI file Eksportuj plik &MIDI &Export song &Eksportuj utwór &Quit &Wyjdź &Mixer &Mikser &Instrument Rack Panel &instrumentów &Preferences &Preferencje De&bug &Odpluskwianie Show &audio engine info Pokaż informacje o silniku &audio Print Objects Drukuj Obiekty &Info &Informacja &User manual Podręcznik &Użytkownika &About O progr&amie &Discard &Porzuć &Cancel &Anuluj Hydrogen Song (*.h2song) Utwór Hydrogen (*.h2song) Save song Zapisz utwór Song saved. Utwór zapisany. Open song Otwórz utwór Error loading song. Błąd podczas ładowania utworu. Midi file (*.mid) Plik midi (*.mid) Export MIDI file Eksportuj plik MIDI Unknown audio driver Nieznany sterownik audio Error starting audio driver Błąd podczas uruchamiania sterownika audio Jack driver: server shutdown Sterownik jack: serwer zatrzymany Jack driver: cannot activate client Sterownik jack: nie mogę uruchomić klienta Jack driver: cannot connect output port Sterownik jack: nie mogę podłączyć porty wyjściowego Jack driver: error in port register Sterownik jack: błąd podczas rejestrowania portu Unknown error %1 Nieznany błąd %1 Clear all instruments? Wyczyścić wszystkie instrumenty? Ok Ok Cancel Anuluj You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Używasz wersji rozwojowej Hydrogen. Proszę, pomóż nam zgłaszając błędy lub sugestie (w języku angielskim) na listę hydrogen-devel.<br><br>Dziękujemy! Could not save song. Open &Pattern Hydrogen Pattern (*.h2pattern) Save Pattern as ... Pattern saved. Open Pattern Don't show this message anymore Nie pokazuj więcej tego komunikatu Playlist: Set song No. %1 Show &info Expor&t pattern as... I&nstruments &Add instrument &Clear all Playlist &editor Info|About Song saved as. Playlist: Song No. %1 Could not export pattern. The document contains unsaved changes. Do you want to save the changes? Director Undo history &Undo menu Undo Redo Input mode Instrument Instrument Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Nowy Open Properties Właściwości Save Save As Export Eksportuj Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. MasterMixerLine Humanize velocity Humanizacja głośności Humanize time Humanizacja czasu Swing Kołysanie Set master volume [%1] Ustawia głośność główną (master) [%1] Set humanize time parameter [%1] Ustawia parametr czasu humanizacji [%1] Set humanize velocity parameter [%1] Ustawia parametr humanizacji głośności [%1] Set swing factor [%1] Ustawia współczynnik swingowania [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Param. Action press button to record midi event Mixer Show FX panel Pokazuje panel efektów Show instrument peaks Pokazuje szczyty głośności instrumentów Set FX %1 level Ustawia poziom efektu %1 Show instrument peaks = On Pomiar głośności instrumentów = Włączony Show instrument peaks = Off Pomiar głośności instrumentów = Wyłączony Set LADSPA FX ( %1 ) volume Ustawia głośność efektu LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Mixer Mikser MixerLine Play sample Odtwarza próbkę Mute Wyciszenie Solo Solo Pan Panorama Instrument name (double click to edit) Nazwa instrumentu (kliknij 2x aby edytować) Set instrument volume [%1] Ustawia głośność instrumentu [%1] Set instr. pan [%1] PatternEditorPanel Select pattern size Wybór rozmiaru układu rytmicznego Select grid resolution Wybór rozdzielczości siatki Hear new notes Odtwarzanie nowych nut Quantize keyboard/midi events to grid Dopasowywanie zdarzeń z klawiatury/midi do siatki Zoom in Powiększenie Zoom out Pomniejszenie Pattern editor - %1 Edytor układu rytmicznego - %1 No pattern selected Nie wybrano żadnego układu rytmicznego Hear new notes = On Odtwarzanie nowych nut = Włączone Hear new notes = Off Odtwarzanie nowych nut = Wyłączone Quantize incoming keyboard/midi events = On Dopasuj nadchodzące zdarzenia z klawiatury/midi = Włączone Quantize incoming keyboard/midi events = Off Dopasuj nadchodzące zdarzenia z klawiatury/midi = Wyłączone Is not possible to change the pattern size when playing. Nie można zmieniać rozmiaru układu rytmicznego podczas odtwarzania. Select note properties Wybór właściwości nut Velocity Głośność Pan Panorama Cutoff Granica Resonance Rezonans Lead and Lag Loaded Soundlibrary NoteKey destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Show drum editor Probability PatternFillDialog Fill with selected pattern Wypełnij wybranym układem rytmicznym PatternFillDialog_UI Form 1 Form 1 &Fill &Wypełnianie Alt+F Alt+F &Clear &Wypełnianie Alt+C Alt+C From: Od: To: Do: Cancel Anuluj OK OK PatternPropertiesDialog Pattern properties Właściwości układu rytmicznego %1#2 %1 PatternPropertiesDialog_UI Form1 Form1 &Cancel &Anuluj Alt+C Alt+C &OK &OK Alt+O Alt+O New Pattern Name Nazwa Nowego Układu Pattern category Pattern description PianoRollEditor Velocity Głośność Pan Panorama Lead and Lag PlayerControl Rewind Przewijanie wstecz Play/ Pause Odtwarzanie/ Pauza Stop Stop Fast Forward Przewijanie do przodu Loop song Zapętlanie utworu Pattern Mode Tryb odtwarzania układu rytmicznego Song Mode Tryb odtwarzania utworu Jack-transport on/off Włącz/wyłącz jack-transport Show mixer Pokazuje mikser Mixer Mikser Show Instrument Rack Pokazuje Panel Instrumentów Instrument rack Panel Instrumentów Playing. Odtwarzanie. Pause. Pauza. Stopped. Zatrzymany. Song mode selected. Wybrano tryb: cały utwór. Pattern mode selected. Wybrano tryb: układ rytmiczny. Jack-transport mode = On Tryb jack-transport = Włączony Jack-transport mode = Off Tryb jack-transport = Wyłączony JACK-transport will work only with JACK driver. JACK-transport działa tylko ze sterownikiem JACK. New BPM value Nowa wartość BPM Loop song = On Zapętlanie utworu = Włączone Loop song = Off Zapętlanie utworu = Wyłączone BeatCounter Panel on Set BPM / Set BPM and play Jack-Time-Master on/off BC Panel on BC Panel off Count BPM and start PLAY Count and set BPM Jack-Time-Master mode = On Jack-Time-Master mode = Off Record Destructive Record Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate Rubberband modified samples if bpm will change Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off PlaylistDialog Song list Script exec Script Add Song to PlayList No Song selected! Load Playlist Hydrogen Playlist (*.h2playlist) Save Playlist No Song in List or no Song selected! Hydrogen Playlist (*.sh) Add Script to selected Song No Script in use! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Set your Default Editor No Script selected! Error loading song. Błąd podczas ładowania utworu. sort Hydrogen Scripts (*.sh) New Script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. No Script! &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Przewijanie wstecz Play/ Pause/ Load selected song Stop Stop Fast Forward Przewijanie do przodu Please save your song first WARNING, the new file is executable by the owner of the file! Pause. Pauza. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Porzuć &Cancel &Anuluj Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Hydrogen playlist (*.h2playlist) PlaylistDialog_UI PlayList Browser Song list PreferencesDialog Preferences Ustawienia Slow Wolno Normal Normalnie Fast Szybko <b>Automatic driver selection</b> <b>Automatyczny wybór sterownika</b> <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Prosty sterownik audio [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Nie wkompilowany</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Sterownik Jack Audio Connection Kit</b><br>sterownik audio o niskim opóźnieniu <b>ALSA Driver</b><br> <b>Sterownik ALSA</b><br> <b>PortAudio Driver</b><br> <b>Sterownik PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Sterownik CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Driver restart required. Restart driver? &Ok &Ok &Cancel &Anuluj Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) PreferencesDialog_UI Form1 Form1 &Cancel &Anuluj Alt+C Alt+C &OK &OK Alt+O Alt+O &General &Ogólne &Reopen last used song Otwó&rz ponownie ostatnio używany utwór Alt+R Alt+R Audio &System &System Audio ### ### Device Urządzenie Buffer size Rozmiar bufora Sample rate Częstotliwość próbkowania 44100 44100 48000 48000 88200 88200 96000 96000 Connect to &Default Output Pair Podłącz do &Domyślnej Pary Wyjściowej Alt+D Alt+D Polyphony Polifonia Metronome volume Głośność metronomu &Midi System System &Midi Ignore note-off Ignoruj komunikat "note-off" Channel Kanał All Wszystkie 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Midi driver Sterownik midi Input Wejście &Appearance &Wygląd Application font Czcionka programu Select font Wybór czcionki Style Styl Slow Wolno Normal Normalnie Fast Szybko Meters falloff speed Szybkość zanikania wskazań miernika Mixer font Czcionka miksera Restart output Audio output details Post-Fader Pre-Fader Track output Use lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Beat counter start offset in ms Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback SampleEditor Unsaved changes left. This changes will be lost. Are you sure? &Ok &Ok &Cancel &Anuluj Close dialog! maybe there is some unsaved work on sample. Are you sure? SampleEditor_UI Dialog Dialog P&lay original sample &Apply Changes &Close &Zamknij Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame &Play new sample length: fade-out type volume panorama Sample length to beat: off 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Crispness: 0 0 Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Instrukcja obsługi Welcome to Hydrogen Witamy w Hydrogen Don't show this message anymore Nie pokazuj więcej tego komunikatu Ok Ok Documentation index Indeks dokumentacji SongEditorPanel Song Editor Edytor utworu Clear pattern sequence Czyści sekwencję układów rytmicznych Create new pattern Tworzy nowy układ rytmiczny Move the selected pattern down Przesuwa wybrany układ rytmiczny w dół Move the selected pattern up Przesuwa wybrany układ rytmiczny w górę Select mode Tryb zaznaczania Draw mode Tryb rysowania Warning, this will erase your pattern sequence. Are you sure? Ostrzeżenie: ta operacja usunie całą twoją sekwencję układów rytmicznych. Kontynuować? &Ok &Ok &Cancel &Anuluj stacked mode stacked pattern mode single pattern mode Enable time line edit Pattern %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Głośność Select playback track SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 500,55 Edit beat in timeline 500 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Anuluj Ok Ok SongEditorPanelTagWidget_UI Form Tag Cancel Anuluj Ok Ok SongEditorPatternList Copy Kopiuj Delete Usuń Fill/Clear ... Wypełnij/Wyczyść ... Properties Właściwości Save Pattern Load Pattern Open Pattern Hydrogen Pattern (*.h2pattern) Virtual Pattern Pattern 1 not_categorized The pattern-file exists. Overwrite the existing pattern? &Ok &Ok &Cancel &Anuluj Export Pattern SongPropertiesDialog Song properties Właściwości utworu SongPropertiesDialog_UI Form1 Form1 Author Autor Notes Notatki Song name Nazwa utworu &OK &OK Alt+O Alt+O &Cancel &Anuluj Alt+C Alt+C License SoundLibraryExportDialog Export Sound Library Directory SoundLibraryExportDialog_UI Dialog Dialog Export Eksportuj Drumkit Component Path Version Browse... Przeglądaj... 0.9.7 and higher 0.9.6 and lower Cancel Anuluj SoundLibraryImportDialog Sound Library import Importuj bibliotekę dzwięków Sound library Biblioteka dźwięków Status Status Updating SoundLibrary list... Uaktualnianie listy Biblioteki Dźwięków... Installed Zainstalowane New Nowy Author: %1 Autor: %1 Downloading SoundLibrary... Ściąganie Biblioteki Dźwięków... Import drumkit Import zestawu perkusyjnego SoundLibrary imported in %1 Biblioteka Dźwięków zaimportowana w %1 An error occurred importing the SoundLibrary. Wystąpił błąd podczas importowania Biblioteki Dźwięków. Drumkits Songs Patterns Układy Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Dialog Internet Internet Update list Aktualizacja listy Sound Library Name Nazwa Biblioteki Dźwięków Author... Autor... Download and install Ściągnij i zainstaluj Local file Plik lokalny Browse... Przeglądaj... Install Instalacja 1 1 Edit server list Close TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Ładuj Cancel Anuluj SoundLibraryPanel Load Ładuj Export Eksportuj Delete Usuń System drumkits Zestawy perkusyjne systemowe User drumkits Zestawy perkusyjne użytkownika &Ok &Ok &Cancel &Anuluj Songs Patterns Układy Error loading song. Błąd podczas ładowania utworu. Properties Właściwości Warning, the selected pattern will be deleted from disk. Are you sure? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Dialog Name Nazwa Author Autor Information Informacja Save Cancel Anuluj Save changes made to instruments into sound library Drumkit License Image Browse Przeglądaj Image License SoundLibraryRepositoryDialog Edit repository settings Edit server list URL SoundLibraryRepositoryDialog_UI Dialog Dialog Add Delete Usuń SoundLibrarySaveDialog Save Sound Library Zachowaj Bibliotekę Dźwięków Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Dialog Name Nazwa Author Autor Information Informacja Cancel Anuluj License Save Image Browse Przeglądaj Image License SoundLibraryTree Sound library Biblioteka dźwięków VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog Dialog OK OK Cancel Anuluj hydrogen-1.0.0-rc1/data/i18n/hydrogen_pt_BR.ts000066400000000000000000004006101366722712400207720ustar00rootroot00000000000000 AboutDialog About Sobre <b>Project page</b><br> <b>Página do projeto</b><br> <b>Website</b><br> <b>Site</b><br> <b>Main coder and maintainer:</b><br> <b>Principal codificador e mantenedor:</b><br> <b>Thanks to:</b> <b>Obrigado a:</b> <b>Development mailing list</b><br> <b>Lista de email dos desenvolvedores</b><br> AboutDialog_UI About Hydrogen Sobre Hydrogen A&bout S&obre &Authors &Autores &License &Licença &OK &OK Alt+O Alt+O ### ### AudioEngineInfoForm Audio Engine Info Informações sobre Motor de Áudio AudioEngineInfoForm_UI Sample rate Taxa de amostragem Buffer size Tamanho do buffer Audio engine state Estado do Motor de Áudio Playing notes Reproduzindo notas Process time Tempo de processamento Song position Posição na canção Patterns Padrões Song state Estado da canção Frames Quadros Ticks Marcações Selected pattern Padrão selecionado Selected instrument Instrumento selecionado Connected to Conectado a Form1 Forma1 ### ### Sampler Sampler Synth Sintetizador Sequencer Sequenciador MIDI input Entrada MIDI Name Nome Audio output Saída de Áudio Realtime frames Quadros em tempo real AudioFileBrowser Audio File Browser Buscador de Arquivos de Áudio Size: %1 bytes Tamanho: %1 bytes Samplerate: %1 Taxa de amostragem: 1% s s Name: Nome: Size: Tamanho: Samplerate: Taxa de amostragem: Sample length: Comprimento da amostra: Please do not preview samples which are longer than 10 minutes! Por favor, não visualize amostras mais longas que 10 minutos! Sample length: Comprimento da amostra: Unable to load that sample file. AudioFileBrowser_UI Dialog Diálogo Open Abrir Name: Nome: Samplerate: Taxa de amostragem: Size: Tamanho: Length: Comprimento: Cancel Cancelar Pla&y samples by clicking Reproduz&a amostras clicando &Up &Acima &Home &Começo &Play Sample Executar Amostra &Filename to instrument name &Nome do arquivo para nome do instrumento &Stop &Parar View hidden folders Visualizar arquivos ocultos Be careful, this change all Layer velocity settings Tome cuidado, isto muda todos os ajustes na velocidade da Camada Set automatic velocity Definir velocidade automática ComponentMixerLine Mute Mudo Solo Solo Component name Nome do componente Set instrument volume [%1] Ajustar volume do instrumento [%1] Director Director Diretor Director_UI Dialog Diálogo DonationDialog Donations Doações DonationDialog_UI Form Forma Donate! Doe! Choose random entry. Escolha uma entrada aleatória. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Hydrogen é um projeto de código aberto que é desenvolvido por várias pessoas em seu tempo livre. Fazendo uma doação você pode dizer &quot;obrigado(a)&quot; às pessoas envolvidas.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Sebastian Moors (aka mauser): Mantenedor principal Michael Wolkstein (aka wolke): Forum hosting Michael Wolkstein (aka wolke): Hospedagem de fórum Download Importing item failed: %1 Falha ao importar um item: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 KiB) - ETA %3 ExportSongDialog Export song Exportar música The file %1 exists. Overwrite the existing file? O arquivo %1 já existe. Sobrescrever o arquivo existente? Export to a single track Exportar para uma única faixa Both Ambos Export to separate tracks Exportar para faixas separadas ExportSongDialog_UI &Export &Exportar &Browse... &Navegar... &Close &Fechar Alt+C Alt+C Alt+E Alt+E Alt+B Alt+B Samplerate in Hz: Taxa de amostragem em Hz 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Profundidade da amostra em Bit: 8 8 16 16 24 24 32 32 Templates: Modelos: WAV in CD quality "44,1kHz, 16 bit PCM" WAV em qualidade de CD "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV em qualidade ADAT "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV em melhor qualidade "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV em baixa fidelidade "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV em melhor qualidade para Mixagem "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF em qualidade de CD "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF em qualidade ADAT "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" AIFF em melhor qualidade "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" FLAC compressão sem perdas em boa qualidade "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" OGG Vorbis pouco comprimido em boa qualidade "VBR" Interpolation: Interpolação: Choose type of interpolation methode Escolha tipo de método de interpolação Linear Linear Cosine Cossena Third Terceira Cubic Cubica Hermite Hermite Enable tempo changing Ativar mudança de tempo TimeLine BPM Linha do tempo BPM 88200 88200 Enable use of rubberband's batch processor Ativar o uso de processador Rubberband em lote Rubberband Batch Lote Rubberband Dialog Diálogo Export directory: Exportar diretório: Modus: Modo: FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off Efeitos lig/des Master output Saída master H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Etiquetar H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Propriedades da biblioteca de som &Ok &Ok &Cancel &Cancelar This is not possible, you can only save changes inside instruments to the current loaded sound library Isto não é possível, você pode salvar mudanças apenas em instrumentos para a biblioteca de som carregada atualmente Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Atenção! Mudar o nome do drumkit resultará na criação de um novo drumkit com este nome. Está certo disto? Saving of this drumkit failed. Erro ao salvar este drumkit. Open Image Abrir imagem Image Files (*.png *.jpg *.jpeg) Arquivos de Imagem (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Drumkit carregado: [%1] Song Editor Editor de música Instrument + Pattern Instrumento + Padrão Mixer Mixer modified modificado InstrumentEditor Show instrument properties Exibir propriedades do instrumento Show layers properties Exibir propriedades das camadas Random pitch factor Tom aleatório Filter Cutoff Filtro de corte Filter resonance Filtro de ressonância Attack Ataque Decay Decaimento Sustain Sustentação Release Liberação Layer gain Ganho na camada New instrument name Novo nome para o instrumento Instrument gain Ganho do instrumento Layer pitch (Coarse) Tom da camada (Grosseiro) Layer pitch (Fine) Tom da camada (Fino) General Geral Layers Camadas Stop the current playing instrument-note before trigger the next note sample. Pare o instrumento-nota atual antes de reproduzir a próxima nota. New component name Novo nome do componente Component name Nome do componente Midi out channel Canal de saída MIDI Midi out note Nota de saída MIDI Component volume Volume do componente Don't change the layers' gain based on velocity Não mude o ganho das camadas baseado em velocidade Select pattern size Selecionar tamanho do padrão InstrumentLine Clear notes Limpar notas Randomize velocity Randomizar velocidade Delete instrument Deletar instrumento Fill notes ... Preencher notas ... Fill all notes Preencher todas as notas Fill 1/2 notes Preencha uma nota em 2 Fill 1/3 notes Preencha uma nota em 3 Fill 1/4 notes Preencha uma nota em 4 Fill 1/6 notes Preencha uma nota em 6 Fill 1/8 notes Preencha uma nota em 8 Mute instrument Silenciar instrumento Solo Solo Copy notes ... Copiar notas ... Only for this pattern Apenas deste padrão For all patterns Para todos os padrões Paste notes ... Colar notas ... Rename instrument Renomear instrumento New instrument name Novo nome para o instrumento Fill 1/12 notes Preencha uma nota em 12 Fill 1/16 notes Preencha uma nota em 16 InstrumentRack Show Instrument editor Exibir editor de instrumento Instrument Instrumento Show sound library Exibir biblioteca de som Sound library Biblioteca de som LadspaFXMixerLine Edit FX parameters Editar parâmetros de efeitos Effect return Retorno de feito FX bypass Bypass de efeito Ladspa FX name Nome do efeito LADSPA LadspaFXProperties Select FX Selecionar efeito Activate Ativar [%1] LADSPA FX Properties [%1] Propriedades de efeito LADSPA Deactivate Desativar LADSPA FX %1 Properties Propriedades efeito LADSPA %1 No plugin Sem plugin Remove FX Remover efeito LadspaFXSelector Select LADSPA FX Selecionar efeito LADSPA Groups Grupos Stereo Estéreo Not supported Não suportado Mono Mono Recently Used Utilizado Recentemente Alphabetic List Lista Alfabética Categorized Categorizado LadspaFXSelector_UI ### fx label selo ### etiqueta de efeito ### fx type ### tipo de efeito &Cancel &Cancelar &OK &OK Form1 Forma1 Alt+C Alt+C Alt+O Alt+O ### fx ID ### ID de efeito 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 ### nome de efeito <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 ### produtor de efeitos 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 ### direitos 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Dec. = %1 MIDI = %2 MainForm Error loading song. Erro ao carregar música. Hydrogen Ready. Hydrogen Pronto. Export MIDI file Exportar aquivo MIDI Print Objects Imprimir Objetos &Save &Salvar &Discard &Descartar Cancel Cancelar Hydrogen Song (*.h2song) Música do Hydrogen (*.h2song) Save song Salvar canção Open song Abrir música Midi file (*.mid) Arquivo Midi (*.mid) &New &Novo &Open &Abrir Open &Demo Abrir &Demo Open &recent Abrir &recente Export &MIDI file Exportar para arquivo &MIDI &Preferences &Preferências &Quit &Sair Show &audio engine info Exibir informações do &motor de áudio &User manual &Manual do usuário &About &Sobre &Cancel &Cancelar Unknown audio driver Driver de áudio desconhecido Error starting audio driver Erro ao iniciar driver de áudio Jack driver: server shutdown Driver Jack: servidor finalizado Jack driver: cannot activate client Driver Jack: não foi possvel ativar cliente Jack driver: cannot connect output port Driver Jack: não foi possvel conectar na porta de saída Jack driver: error in port register Driver Jack: Erro no registro da porta &Export song &Exportar música De&bug De&purar Save &as... Salvar %amp;como... &Mixer &Mixer &Instrument Rack &Rack de instrumentos &Info &Info Song saved. Música salva. Unknown error %1 Erro desconhecido %1 Clear all instruments? Limpar todos os instrumentos? Ok Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Você está usando uma versão em desenvolvimento do Hydrogen, por favor nos ajude reportando bugs ou sugestões na lista de e-mail de desenvolvedores.<br><br> Obrigado! Could not save song. Não foi possível salvar a música. Open &Pattern Abrir &Padrão Hydrogen Pattern (*.h2pattern) Padrão Hydrogen (*.h2pattern) Save Pattern as ... Salvar padrão como ... Pattern saved. Padrão salvo. Open Pattern Abrir Padrão Don't show this message anymore Não exibir mais esta mensagem Playlist: Set song No. %1 Lista de reprodução: Definir música Nº %1 Show &info Exibir &informações Expor&t pattern as... Exporta&r padrão como... I&nstruments I&nstrumentos &Add instrument &Adicionar instrumento &Clear all &Limpar tudo Playlist &editor Editor de &Lista de reprodução Info|About Info|Sobre Song saved as. Música salva como. Playlist: Song No. %1 Lista de reprodução: Música Nº %1 Could not export pattern. Não foi possível exportar padrão. The document contains unsaved changes. Do you want to save the changes? Este documento contém mudanças não salvas. Deseja salvar as mudanças? Director Diretor Undo history Desfazer histórico &Undo &Desfazer menu Undo Desfazer Redo Refazer Input mode Modo de entrada Instrument Instrumento Drumkit Drumkit Report bug Reportar bug Export &LilyPond file Exportar arquivo &LilyPond Donate Doar LilyPond file (*.ly) Arquivo LilyPond (*.ly) Export LilyPond file Exportar arquivo LilyPond The current playlist contains unsaved changes. Do you want to discard the changes? A lista de reprodução atual contém mudanças não salvas. Deseja descartar as mudanças? Pro&ject Pro&jeto New Novo Open Abrir Properties Propriedades Save Salvar Save As Salvar como Export Exportar Import Importar Online import Importar Online Add component Adicionar componente Component name Nome do componente Saving of this library failed. Falha ao salvar esta biblioteca. Drum&kits Drum&kits &View &Visualizar &Automation path &Caminho de automação Full screen Tela cheia &Options &Opções MIDI setup advice Recomendação de configuração MIDI MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Notas de saída MIDI não estão configuradas para este drumkit, portanto, a exportação desta música para o arquivo MIDI pode falhar. Você gostaria que o Hydrogen corrigisse automaticamente isso atribuindo valores padrão? Set default values Definir valores padrão The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. A exportação LilyPond é uma ferramenta experimental. Deveria funcionar como um melhoramento enquanto você usa o GM-kit, e enquanto você não use trios. MasterMixerLine Set master volume [%1] Ajustar volume principal [%1] Swing Swing Humanize time Humanizar tempo Humanize velocity Humanizar velocidade Set humanize time parameter [%1] Ajustar o parâmetro de humanização de tempo [%1] Set humanize velocity parameter [%1] Ajustar o parmetro de humanização de velocidade [%1] Set swing factor [%1] Ajustar o fator de swing [%1] MidiSenseWidget This element is not MIDI operable. Este não é um elemento midi operável. Waiting for midi input... Esperando pela entrada MIDI MidiTable Event Evento Param. Param. Action Ação press button to record midi event pressione o botão para gravar evento MIDI Mixer Show FX panel Exibir painel de efeitos Show instrument peaks Mostrar picos dos instrumentos Set FX %1 level Ajustar nível %1 de efeito Show instrument peaks = On Mostrar picos dos instrumentos = Lig. Show instrument peaks = Off Mostrar picos dos instrumentos = Des. Set LADSPA FX ( %1 ) volume Ajustar volume do efeito LADSPA ( %1 ) LADSPA effects are not available in this version of Hydrogen. Efeitos LADSPA não estão disponíveis nesta versão do Hydrogen. Mixer Mixer MixerLine Play sample Executar amostra Mute Mudo Solo Solo Instrument name (double click to edit) Nome do instrumento (clique duplo para editar) Set instrument volume [%1] Ajustar volume [%1] do instrumento Pan Pan Set instr. pan [%1] Ajustar o pan do instrumento [%1] PatternEditorPanel Hear new notes Ouvir novas notas Quantize keyboard/midi events to grid Quantizar eventos do teclado/midi para grade Pattern editor - %1 Editor de padrões - %1 Hear new notes = On Ouvir novas notas = Lig. Hear new notes = Off Ouvir novas notas = Des. Quantize incoming keyboard/midi events = On Quantizar eventos de teclado/MIDI que entram = Lig. Quantize incoming keyboard/midi events = Off Quantizar eventos de teclado/MIDI que entram = Des. Zoom in Mais zoom Zoom out Menos zoom Is not possible to change the pattern size when playing. Não é possível mudar o tamanho do padrão enquanto estiver tocando. Select pattern size Selecionar tamanho do padrão Select grid resolution Selecionar resolução da grade No pattern selected Nenhum padrão selecionado Select note properties Selecionar propriedades da nota Velocity Velocidade Pan Pan Cutoff Corte Resonance Ressonância Lead and Lag Adiantar/atrasar Loaded Soundlibrary Biblioteca de som carregada NoteKey Nota da clave destructive mode pre delete settings modo destrutivo, configurações pré-deletadas destructive mode post delete settings modo destrutivo, configurações pós-deletadas Show piano roll editor Exibir editor de piano automático Show drum editor Exibir editor de bateria Probability Probabilidade PatternFillDialog Fill with selected pattern Preencher com padrão selecionado PatternFillDialog_UI Cancel Cancelar Form 1 Forma 1 &Fill &Preencher Alt+F Alt+F &Clear &Limpar Alt+C Alt+C From: De: To: Para: OK OK PatternPropertiesDialog Pattern properties Propriedades do padrão %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel &Cancelar Alt+C Alt+C &OK &OK Alt+O Alt+O New Pattern Name Nome do novo padrão Form1 Forma1 Pattern category Categoria do padrão Pattern description Descrição do padrão PianoRollEditor Velocity Velocidade Pan Pan Lead and Lag Adiantar/atrasar PlayerControl Stop Parar Song Mode Modo música Pattern Mode Modo padrão Jack-transport on/off Jack-transport lig/des Playing. Executando. Stopped. Parado. Song mode selected. Modo música selecionado. Pattern mode selected. Modo padrão selecionado. Jack-transport mode = On Modo Jack-transport = Lig. Jack-transport mode = Off Modo Jack-transport = Des. New BPM value Novo valor de BPM Rewind Rebobinar Play/ Pause Executar/ Pausar Fast Forward Avanço rápido Pause. Pausar. JACK-transport will work only with JACK driver. JACK-transport somente funcionará com o driver JACK. Loop song Repetir música Loop song = On Repetir música = Lig. Loop song = Off Repetir música = Des. Show mixer Exibir mixer Mixer Mixer Show Instrument Rack Exibir Rack de Instrumentos Instrument rack Rack de instrumentos BeatCounter Panel on Painel do Contador de Batidas Lig. Set BPM / Set BPM and play Definir BPM / definir BPM e executar Jack-Time-Master on/off Tempo Master do Jack Lig./Des. BC Panel on Painel do CB Lig. BC Panel off Painel do CB Des. Count BPM and start PLAY Contar BPM e EXECUTAR Count and set BPM Contar e definir BPM Jack-Time-Master mode = On Tempo master do Jack = Lig. Jack-Time-Master mode = Off Tempo master do Jack = Des. Record Gravar Destructive Record Gravação destrutiva Record midi events = On Gravar eventos MIDI = Lig. Record midi events = Off Gravar eventos MIDI = Des. Destructive mode = Off Modo destrutivo = Des. Destructive mode = On Modo destrutivo = Lig. Recalculate Rubberband modified samples if bpm will change Recalcular amostras modificadas pelo Rubberband caso o BPM mude Recalculate all samples using Rubberband ON Recalcular todas as amostras usando Rubberband LIG Recalculate all samples using Rubberband OFF Recalcular todas as amostras usando Rubberband DES Switch metronome on/off Metrônomo Lig./Des. PlaylistDialog Song list Lista de músicas Script Script exec Script Executar Script Add Song to PlayList Adicionar música à Lista de Reprodução No Song selected! Nenhuma música selecionada! Load Playlist Carregar Lista de Reprodução Hydrogen Playlist (*.h2playlist) Lista de Reprodução do Hydrogen(*.h2playlist) Save Playlist Salvar Lista de Reprodução No Song in List or no Song selected! Nenhuma música na Lista ou nenhuma Música selecionada! Hydrogen Playlist (*.sh) Lista de Reprodução do Hydrogen (*.sh) Add Script to selected Song Adicionar Script à Música selecionada No Script in use! Nenhum Scripr em uso! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Sem Editor Padrão definido. Por favor, defina seu Editor Padrão Não use um Editor baseado em console Desculpe, mas isto não funcionará no momento. Set your Default Editor Definir Editor Padrão No Script selected! Nenhum Script selecionado! Error loading song. Erro ao carregar música. sort ordenar Hydrogen Scripts (*.sh) Scripts do Hydrogen (*.sh) New Script Novo Script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Nome do script ou caminho do script contém espaços em branco. IMPORTANTE O caminho do script e o nome do script devem estar sem espaços em branco. No Script! Sem Script! &Playlist &Lista de reprodução Add song to Play&list Adicionar música à Lista de Reprodução Add &current song to Playlist Adicionar música atual à Lista de Reprodução &Remove selected song from Playlist Remover música selecionada da Lista de Reprodução &Open Playlist Abrir Lista de Reprodução &Save Playlist &Salvar Lista de Reprodução Save Playlist &as Salvar Lista de Reprodução &como &Scripts &Scripts &Add Script to selected song &&Adicionar script à música selecionada &Edit selected Script &Editar Script selecionado &Remove selected Script &Remover Script selecionado &Create a new Script &Criar novo Script Rewind Rebobinar Play/ Pause/ Load selected song Executar/ Pausar/ Carregar música selecionada Stop Parar Fast Forward Avançar rápido Please save your song first Por favor, salve sua música primeiro WARNING, the new file is executable by the owner of the file! AVISO, o novo arquivo é executável pelo proprietário do arquivo! Pause. Pausar. Playlist Browser Buscador da Lista de Reprodução Playlist: set song no. %1 Lista de Reprodução: definir música nº %1 no Script sem Script &New Playlist &Nova Lista de Reprodução File not found: Arquivo não encontrado No valid song selected! Nenhuma música válida selecionada! The current playlist contains unsaved changes. Do you want to discard the changes? A presente Lista de Reprodução contém mudanças não salvas. Deseja descartar as mudanças? &Discard &Descartar &Cancel &Cancelar Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Nome do script ou o caminho para o script contém espaços em branco. IMPORTANTE O caminho para o script e o nome do script não devem conter espaços em branco. Hydrogen playlist (*.h2playlist) Lista de Reprodução do Hydrogen (*.h2playlist) PlaylistDialog_UI PlayList Browser Buscador da Lista de Reprodução Song list Lista de músicas PreferencesDialog Preferences Preferências Slow Lento Normal Normal Fast Rápido <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Abrir Sistema de Som</b><br>Driver de áudio simples [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Não compilado</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Driver kit de conexão Jack Audio</b><br>Driver de áudio de baixa latência <b>ALSA Driver</b><br> <b>Driver ALSA</b><br> <b>Automatic driver selection</b> <b>Seleção automática de driver</b> <b>PortAudio Driver</b><br> <b>Driver PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Driver CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Por favor, reinicie o Hydrogen para ativar/desativar o suporte ao LASH Driver restart required. Restart driver? Reinicialização do driver necessária. Reiniciar driver? &Ok &Ok &Cancel &Cancelar Automatic Automático Steps Passos Fixed Fixo <b>PulseAudio Driver</b><br> <b>Driver PulseAudio</b><br> Number of steps Número de passos Color (Hue value) Cor (valor da Matiz) PreferencesDialog_UI Polyphony Polifonia Device Dispositivo Buffer size Tamanho do buffer Sample rate Taxa de amostragem Input Entrada Channel Canal All Todos Application font Fonte da aplicação Style Estilo Select font Selecionar fontes Slow Lento Normal Normal Fast Rápido Mixer font Fonte do Mixer Meters falloff speed Medidores de velocidade de queda &Cancel &Cancelar &General &Geral Audio &System Sistema de &áudio Metronome volume Volume do metrônomo Connect to &Default Output Pair Conectar ao par de saída &padrão Alt+D Alt+D &Midi System &Sistema midi Midi driver Driver de Midi Ignore note-off Ignorar nota desligada &Appearance &Aparência Form1 Form1 Alt+C Alt+C &OK &OK Alt+O Alt+O &Reopen last used song &Reabrir última música usada Alt+R Alt+R ### ### 44100 44100 48000 48000 88200 88200 96000 96000 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Restart output Reiniciar saída Audio output details Detalhes da saída de áudio Post-Fader Pós-Fader Pre-Fader Pré-Fader Track output Saída da faixa Use lash Use LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Primeiro passo, ajuste a diferença de sincronismo entre a latência do acionador do controlador/teclado e o BPM computado. Beat counter drift compensation in 1/10 ms Compensação de desvio do Contador de Batidas em 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Segundo passo, ajuste a compensação entre o último acionador do controlador/teclado e a partida do sequenciador deferida. Beat counter start offset in ms Compensação de início do Contador de Batidas em ms Path to the Rubberband command-line utility Caminho para o utilitário de linha de comando Rubberband Maximum number of bars Número máximo de barras &Reopen last used playlist &Reabrir a última Lista de Reprodução usada Interpolate resampling Interpolar a reamostragem Linear Linear Cosine Coseno Third Terceira Cubic Cúbica Hermite Hermite Default interface layout Layout de interface padrão Single pane Único painel Tabbed Com abas TextLabel TextoEtiqueta Coloring method for Song Editor elements Método de coloração para elementos do Editor de Músicas <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> ><html><head/><body><p><span style=" font-style:italic;">Depois de alterar uma fonte ou o layout da interface, o aplicativo deve ser reiniciado.</span></p></body></html> Use relative paths for playlist Use caminhos relativos para Lista de Reprodução Use output note as input note Use a nota de saída como nota de entrada Discard midi messages after action has been triggered Descartar mensagens MIDI após a ação ter sido disparada Create per-instrument outputs Criar saídas por instrumento Enable feedback Ativar feedback &OSC &OSC &Enable OSC support &Ativar suporte OSC Incoming port Porta de entrada <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Porta que será usada para receber mensagens OSC de entrada</p></body></html> Enable OSC &feedback Ativar fedback OSC SampleEditor Unsaved changes left. This changes will be lost. Are you sure? Mudanças não salvas deixadas. Estas mudanças serão perdidas. Está certo disto? &Ok &Ok &Cancel &Cancelar Close dialog! maybe there is some unsaved work on sample. Are you sure? Fechar caixa de diálogo! Talvez haja algum trabalho não salvo na amostra. Está certo disto? SampleEditor_UI Dialog Diálogo P&lay original sample R&eproduzir amostra original &Apply Changes &Aplicar Mudanças &Close &Fechar Adjust sample start frame Ajuste o quadro inicial da amostra Adjust sample loop begin frame Ajustar o quadro inicial do loop de amostra set processing Ajustar processamento forward Para frente reverse Reverso pingpong pingue-pongue loops loops Adjust sample end & loop end frame Ajustar o quadro final do loop & final da amostra &Play &Reproduzir new sample length: novo comprimento da amostra: fade-out type tipo de fade-out volume volume panorama panorama Sample length to beat: Comprimento da amostra a bater: off desligado 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4> 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Afina a amostra em semitons, cents Crispness: Nitidez: 0 0 Start Iniciar Loop Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End Fim "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Processador de Audio Rubberband" Mude o tempo (comprimento da amostra) e o tom do audio. Pitch (Semitone,Cent) Afinação (Semiton, Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">você pode achar mais informação aqui:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Manual Welcome to Hydrogen Bem-vindo ao Hydrogen Ok Ok Documentation index Índice de documentação Don't show this message anymore Não mostrar mais esta mensagem SongEditorPanel Song Editor Editor de música Create new pattern Criar novo padrão Move the selected pattern down Mover o padrão selecionado para baixo Move the selected pattern up Mover o padrão selecionado para cima Clear pattern sequence Limpar sequência de padrões Select mode Selecionar modo Draw mode Modo desenho Warning, this will erase your pattern sequence. Are you sure? Atenção, isto apagará sua sequência de padrões Está certo disto? &Cancel &Cancelar &Ok &Ok stacked mode modo empilhado stacked pattern mode modo padrão empilhado single pattern mode modo padrão único Enable time line edit Ativar edição de linha do tempo Pattern %1 Padrão %1 View playback track Visualizar faixa de reprodução Mute playback track Silenciar faixa de reprodução Choose playback track Escolher faixa de reprodução View timeline Visualizar linha do tempo Adjust parameter values in time Ajustar valores dos parâmetros no tempo Velocity Velocidade Select playback track Selecionar faixa de reprodução SongEditorPanelBpmWidget_UI Form Forma Edit the bpm value for current beat Editar o valor do BPM para batida atual 500,55 500,55 Edit beat in timeline Editar batida na linha do tempo 500 500 Bar Barra BPM BPM Delete this BPM Marker Deletar este Marcador de BPM Delete BPM Marker Deletar Marcador de BPM Cancel Cancelar Ok Ok SongEditorPanelTagWidget_UI Form Forma Tag Etiqueta Cancel Cancelar Ok Ok SongEditorPatternList Copy Copiar Delete Remover Properties Propriedades Fill/Clear ... Preencher/Limpar ... Save Pattern Salvar Padrão Load Pattern Carregar Padrão Open Pattern Abrir Padrão Hydrogen Pattern (*.h2pattern) Padrão Hydrogen (*.h2pattern) Virtual Pattern Padrão Virtual Pattern 1 Padrão 1 not_categorized não_categorizado The pattern-file exists. Overwrite the existing pattern? O padrão-arquivo existe. Sobrescrever o padrão existente? &Ok &Ok &Cancel &Cancelar Export Pattern Exportar Padrão SongPropertiesDialog Song properties Propriedades da música SongPropertiesDialog_UI Song name Nome da música Author Autor Notes Notas &Cancel &Cancelar Form1 Form1 &OK &OK Alt+O Alt+O Alt+C Alt+C License Lincença SoundLibraryExportDialog Export Sound Library Exportar biblioteca de som Directory Diretório SoundLibraryExportDialog_UI Dialog Diálogo Export Exportar Drumkit Drumkit Component Component Path Caminho Version Versão Browse... Procurar... 0.9.7 and higher 0.9.7 e mais recente 0.9.6 and lower 0.9.6 e mais antiga Cancel Cancelar SoundLibraryImportDialog Sound Library import Importar biblioteca de som Sound library Biblioteca de som Status Status Updating SoundLibrary list... Atualizando lista de Bibliotecas de Som... Installed Instalado New Novo Author: %1 Autor: %1 Downloading SoundLibrary... Baixando Biblioteca de Som Import drumkit Importar drumkit SoundLibrary imported in %1 Biblioteca de som importada em %1 An error occurred importing the SoundLibrary. Ocorreu um erro ao importar Biblioteca de Som. Drumkits Drumkits Songs Músicas Patterns Padrões Drumkit License: %1 Licença do drumkit: %1 Image License: %1 Licença da imagem: %1 SoundLibraryImportDialog_UI Dialog Diálogo Internet Internet Update list Atualizar lista Sound Library Name Nome da Biblioteca de Som Author... Autor... Download and install Baixar e instalar Local file Arquivo local Browse... Procurar... Install Instalar 1 1 Edit server list Editar lista de servidores Close Fechar TextLabel Rótulo de texto Image License... Licença da imagem... Drumkit License... Licença do Drumkit... SoundLibraryOpenDialog Open Sound Library Abrir Biblioteca de Som Load Carregar Cancel Cancelar SoundLibraryPanel Load Carregar Export Exportar Delete Remover System drumkits Drumkits do sistema User drumkits Drumkits do usuário &Ok &Ok &Cancel &Cancelar Songs Músicas Patterns Padrões Error loading song. Erro ao carregar música. Properties Propriedades Warning, the selected pattern will be deleted from disk. Are you sure? Aviso, o padrão selecionado será deletado do disco. Está certo disto? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Não é possível deletar o drumkit carregado atualmente: "%1". Para deletar este drumkit, carregue antes outro drumkit. "%1"is a system drumkit and can't be deleted. "%1"é um drumkit do sistema e não pode ser deletado. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Aviso, o drumkit "%1" drumkit será deletado do disco. Está certo disto? Drumkit deletion failed. Remoção do drumkit falhou. Keep Manter The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? O kit existente possui %1 instrumentos, mas o novo possui apenas %2. Os primeiros %2 instrumentos serão substituídos pelos novos instrumentos e manterão suas notas, mas alguns dos instrumentos restantes têm notas. Você gostaria de manter ou descartar os instrumentos e anotações restantes? Double click to expand the list Clique duplo pra expandir a lista SoundLibraryPropertiesDialog_UI Dialog Diálogo Name Nome Author Autor Information Informação Save Salvar Cancel Cancelar Save changes made to instruments into sound library Salvar mudanças feitas a instrumentos na biblioteca de som Drumkit License Licença do drumkit Image Imagem Browse Procurar Image License Licença da imagem SoundLibraryRepositoryDialog Edit repository settings Editar configurações do repositório Edit server list Editar lista dos servidores URL URL SoundLibraryRepositoryDialog_UI Dialog Diálogo Add Adicionar Delete Remover SoundLibrarySaveDialog Save Sound Library Salvar biblioteca de Som Please supply at least a valid name Por favor, forneça pelo menos um nome válido A library with the same name already exists. Do you want to overwrite the existing library? Uma biblioteca com o mesmo nome já existe. Deseja sobrescrever a biblioteca existente? Saving of this library failed. Falha ao salvar esta biblioteca. Open Image Abrir Imagem Image Files (*.png *.jpg *.jpeg) Arquivos de imagens (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Diálogo Name Nome Author Autor Information Informação Cancel Cancelar License Lincença Save Salvar Image Imagem Browse Procurar Image License Licença da Imagem SoundLibraryTree Sound library Biblioteca de Som VirtualPatternDialog Select virtual pattern Selecione um padrão virtual VirtualPatternDialog_UI Dialog Diálogo OK OK Cancel Cancelar hydrogen-1.0.0-rc1/data/i18n/hydrogen_ru.ts000066400000000000000000004152061366722712400204210ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Страница проекта</b><br> About О программе <b>Website</b><br> <b>Веб-сайт</b><br> <b>Main coder and maintainer:</b><br> <b>главный разработчик и руководитель:</b><br> <b>Thanks to:</b> <b>Благодарности:</b> <b>Development mailing list</b><br> <b>Список рассылки для разработчиков</b><br> AboutDialog_UI About Hydrogen О Hydrogen A&bout &Программа &Authors &Авторы &License &Лицензия &OK &OK Alt+O Alt+O ### ### AudioEngineInfoForm Audio Engine Info Звуковой движок AudioEngineInfoForm_UI Form1 Form1 Playing notes Воспроизведение нот Process time Время обработки Audio engine state Состояние движка Song state Состояние композиции Frames Выборок Ticks Тиков Buffer size Размер буфера Sample rate Частота сэмплирования ### ### Song position Положение в композиции Patterns Паттернов Selected pattern Выбранный паттерн Selected instrument Выбранный инструмент Connected to Соединён с Sampler Сэмплер Synth Синтезатор Sequencer Секвенсер MIDI input Вход MIDI Name Название Audio output Выход звука Realtime frames Выборок в релаьном времени AudioFileBrowser Audio File Browser Просмотр звуковых файлов Size: %1 bytes Размер: %1 байтов Samplerate: %1 Частота сэмплирования: %1 s с Name: Имя: Size: Размер: Samplerate: Частота сэмплирования: Sample length: Длина сэмпла: Please do not preview samples which are longer than 10 minutes! Постарайтесь не включать предпрослушивание для записей длительностью больше 10 минут! Sample length: Длина сэмпла: Unable to load that sample file. AudioFileBrowser_UI Dialog Диалог Open Открыть Name: Имя: Samplerate: Частота сэмплирования: Size: Размер: Length: Длительность: Cancel Отменить Pla&y samples by clicking Воспроизводить по &щелчку &Up В&ыше &Home &Домой &Play Sample &Воспроизвести &Filename to instrument name &Имя файла в название инструмента &Stop &Стоп View hidden folders Видеть скрытые папки Be careful, this change all Layer velocity settings Осторожно, все параметры силы нажатия изменятся Set automatic velocity Автоматически назначить силу нажатия ComponentMixerLine Mute Тихо Solo Соло Component name Название компонента Set instrument volume [%1] Установить громкость инструмента [%1] Director Director Дирижёр Director_UI Dialog Диалог DonationDialog Donations Пожертвования DonationDialog_UI Form Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 Не удалось импортировать: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 КиБ) - ETA %3 ExportMidiDialog Export midi Экспортировать MIDI SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Файл MIDI (*%1) Export MIDI file Экспорт файла MIDI Directory %1 does not exists Каталог %1 не существует The file %1 exists. Overwrite the existing file? Файл %1 уже существует. Перезаписать его? ExportMidiDialog_UI Dialog Диалог Filename Имя файла &Browse... &Просмотр... Alt+B Alt+п Modus: Режим: &Export &Экспорт Alt+E Alt+э &Close &Закрыть Alt+C Alt+з ExportSongDialog Export song Экспортировать композицию The file %1 exists. Overwrite the existing file? Файл %1 уже существует. Перезаписать его? Export to a single track Экспортировать в одну дорожку Both И то, и другое Export to separate tracks Directory %1 does not exists Каталог %1 не существует ExportSongDialog_UI Alt+C Alt+т &Export &Экспорт Alt+E Alt+э &Browse... &Файл... Alt+B Alt+ф &Close &Закрыть Samplerate in Hz: Частота сэмплирования: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Разрядность сэмпла: 8 8 16 16 24 24 32 32 Templates: Шаблоны: WAV in CD quality "44,1kHz, 16 bit PCM" WAV с качеством CD: 44,1КГц, 16-разрядный PCM WAV in ADAT quality "48 kHz, 16 bit PCM" WAV с качеством ADAT: 48КГц, 16-разрядный PCM WAV in better quality "48 kHz, 24 bit PCM" WAV с улучшенным качеством: 48КГц, 24-разрядный PCM WAV LOFI "22.05kHz, 8 bit PCM WAV низкого качества: 22,05КГц, 8-разрядный PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV с наилучшим качеством: 96КГц, 32-разрядный PCM AIFF in CD quality "41 kHz, 16 bit PCM" AIFF с качеством CD: 41КГц, 16-разрядный PCM AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF с качеством ADAT: 48КГц, 16-разрядный PCM AIFF in better quality "48 kHz, 24 bit PCM" AIFF с улучшенным качеством: 48КГц, 24-разрядный PCM FLAC lossless compressor in good quality "48 kHz" FLAC, без потерь, с хорошим качеством: 48КГц OGG Vorbis loosely compressed in good quality "VBR" Ogg Vorbis, с потерями, но хорошим качеством: VBR Interpolation: Интерполяция: Choose type of interpolation methode Выберите способ интерполяции Linear Линейная Cosine По косинусу Third Cubic Кубическая Hermite Эрмита Enable tempo changing Включить смену темпа TimeLine BPM Enable use of rubberband's batch processor Использовать пакетный обработчик Rubberband Rubberband Batch 88200 88200 Dialog Диалог Export directory: Диалог экспорта: Modus: Режим: Choose type of interpolation method Выберите способ интерполяции FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 КГц<br>%3 %4 FxMixerLine FX on/off Эффекты вкл/выкл Master output Общий выход H2Core::SongEditorPanelBpmWidget BPM BPM H2Core::SongEditorPanelTagWidget Tag Метка H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Свойства звуковой библиотеки This is not possible, you can only save changes inside instruments to the current loaded sound library Вы можете сохранять изменения в инструментах только для текущей загруженной библиотеки. Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Внимание! Смена названия драмкита приведет к созданию нового драмкита. Вы уверены? &Ok &OK &Cancel О&тменить Saving of this drumkit failed. Не удалось сохранить этот драмкит. Open Image Открыть изображение Image Files (*.png *.jpg *.jpeg) Файлы изображений (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Загружен драмкит: [%1] Song Editor Редактор композиций Instrument + Pattern Инструмент + ритм. рисунок Mixer Микшер modified изменено Song saved. Композиция сохранена. InstrumentEditor Show instrument properties Показать свойства инструмента Show layers properties Показать свойства слоя Random pitch factor Случайный коэфф. высоты тона Filter resonance Резонансный фильтр Attack Атака Decay Первое затухание Sustain Стабильная фаза Release Конечное затухание Layer gain Усиление слоя New instrument name Новое название инструмента Instrument gain Усиление инструмента Filter Cutoff Layer pitch (Coarse) Layer pitch (Fine) General Общие Layers Слои Stop the current playing instrument-note before trigger the next note sample. Остановить воспроизведение текущей ноты при переходе к сэмплу следующей. New component name Новое название компонента Component name Название компонента Midi out channel Midi out note Component volume Громкость компонента Don't change the layers' gain based on velocity Select pattern size Выбрать размер паттерна InstrumentLine Clear notes Удалить все ноты Randomize velocity Случайная сила нажатия Delete instrument Удалить инструмент Fill notes ... Заполнить ноты... Fill all notes Заполнить все ноты Fill 1/2 notes Заполнить 1/2 Fill 1/3 notes Заполнить 1/3 Fill 1/4 notes Заполнить 1/4 Fill 1/6 notes Заполнить 1/6 Fill 1/8 notes Заполнить 1/8 Mute instrument Приглушить инструмент Solo Соло Copy notes ... Скопировать ноты... Only for this pattern Только этот ритм. рисунок For all patterns Все ритм. рисунки Paste notes ... Вставить ноты... Rename instrument New instrument name Новое название инструмента Fill 1/12 notes Заполнить 1/8 {1/12 ?} Fill 1/16 notes Заполнить 1/8 {1/16 ?} InstrumentRack Show Instrument editor Показать редактор инструментов Instrument Инструмент Show sound library Показать библиотеку звуков Sound library Библиотека звуков LadspaFXMixerLine Edit FX parameters Изменить параметры FX FX bypass Обход эффекта Ladspa FX name Название LADSPA FX Effect return Возврат эффекта LadspaFXProperties Select FX Выбрать эффект [%1] LADSPA FX Properties Свойства эффекта [%1] LADSPA FX %1 Properties Свойства эффекта [%1] No plugin Эффект не назначен Activate Включить Deactivate Выключить Remove FX Удалить эффект LadspaFXSelector Groups Группы Stereo Стерео Mono Моно Not supported Не поддерживается Select LADSPA FX Выберите LADSPA FX Recently Used Недавно использовавшиеся Alphabetic List Алфавитный список Categorized По категории LadspaFXSelector_UI &Cancel О&тменить Alt+C Alt+т &OK &OK Alt+O Alt+о Form1 Form1 ### fx label ### fx label ### fx type ### fx type ### fx ID ### fx ID 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Название:</span></p></body></html> ### fx name 1 ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Метка:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Тип:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Создатель:</span></p></body></html> ### FX maker 1 2 ### FX maker 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Авторские права:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Error loading song. Ошибка при загрузке композиции. Hydrogen Ready. Hydrogen готов к работе. &Save &Сохранить &Discard &Отказаться от изменений Cancel Отменить Save song Сохранить композицию Open song Открыть композицию &New &Создать &Open &Открыть Open &Demo Открыть &демо Open &recent Н&едавние композиции Save &as... Сохранить &как... Export &MIDI file Э&кспортировать MIDI-файл &Preferences &Параметры Hydrogen &Quit В&ыход Show &audio engine info Показать сводку по &звуковому движку &User manual &Руководство пользователя &About О &программе &Cancel О&тменить Unknown audio driver Неизвестный звуковой драйвер Error starting audio driver Ошибка при загрузке звукового драйвера Jack driver: server shutdown Драйвер JACK: сервер выгружен Jack driver: cannot activate client Драйвер JACK: невозможно активировать клиент Jack driver: cannot connect output port Драйвер JACK: невозможно соединиться с портом выхода Jack driver: error in port register Драйвер JACK: ошибка при регистрации порта &Export song &Экспортировать композицию De&bug Отла&дка &Mixer &Микшер &Instrument Rack &Стойка инструментов Print Objects Напечатать объекты &Info &Справка Song saved. Композиция сохранена. Unknown error %1 Неизвестная ошибка %1 Clear all instruments? Очистить все инструменты? Ok ОК Could not save song. Не удалось сохранить композицию. You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Вы используете нестабильную версию Hydrogen. Помогите нам улучшить ее, присылая в список рассылки hydrogen-devel свои отчеты об ошибках и предложения. <br><br>Спасибо! Don't show this message anymore Больше не показывать это сообщение Open &Pattern Открыть &паттерн Save Pattern as ... Сохранить паттерн как... Pattern saved. Паттерн сохранен. Open Pattern Открыть паттерн Show &info &Метаданные... Expor&t pattern as... Э&кспортировать паттерн как... I&nstruments &Инструменты &Add instrument &Добавить инструмент &Clear all О&чистить всё Playlist &editor &Редактор списков воспроизведения Playlist: Set song No. %1 Song saved as. Композиция сохранена под другим именем. Playlist: Song No. %1 Список воспроизведения: композиция №%1 Could not export pattern. Не удалось экспортировать паттерн. The document contains unsaved changes. Do you want to save the changes? Некоторые изменения в композиции не были сохранены. Вы хотите сохранить их перед выходом? Info|About Director Дирижёр Undo history История действий &Undo &Действия menu Undo Отменить Redo Вернуть Input mode Режим ввода Instrument Инструмент Drumkit Драмкит Report bug Сообщить об ошибке Export &LilyPond file Экспортировать фа&йл LilyPond Donate Пожертвовать деньги проекту LilyPond file (*.ly) Файл LilyPond (*.ly) Export LilyPond file Экспортировать файл LilyPond The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject &Проект New Создать Open Открыть Properties Свойства Save Сохранить Save As Сохранить как Export Экспортировать Import Импортировать Online import Импортировать из Сети Add component Добавить компонент Component name Название компонента Saving of this library failed. Не удалось сохранить эту библиотеку. Drum&kits Драм&киты &View &Вид &Automation path Дорожка &автоматизации Full screen Полноэкранный режим &Options П&араметры MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. &Timeline &Шкала времени &Playback track Дорожка &воспроизведения Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Установить общую громкость [%1] Swing Свинг Humanize time Очеловечить время Humanize velocity Очеловечить силу Set humanize time parameter [%1] Установить параметр «человеческого» времени [%1] Set humanize velocity parameter [%1] Установить параметр «человеческой» силы нажатия [%1] Set swing factor [%1] Установить свинг-фактор [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Событие Param. Парам. Action Действие press button to record midi event Нажмите кнопку для записи MIDI-события Mixer Show FX panel Показать панель эффектов Show instrument peaks Показывать пики инструментов Show instrument peaks = On Отображение пиков инструментов = Вкл Show instrument peaks = Off Отображение пиков инструментов = Выкл Set FX %1 level Установить уровень эффекта %1 Set LADSPA FX ( %1 ) volume Установить уровень эффекта LADSPA %1 LADSPA effects are not available in this version of Hydrogen. Эффекты LADSPA недоступны в этой версии Hydrogen. Mixer Микшер MixerLine Play sample Воспроизвести сэмпл Mute Тихо Solo Соло Pan Панорама Instrument name (double click to edit) Название инструмента (изменить двойным щелчком) Set instrument volume [%1] Установить громкость инструмента [%1] Set instr. pan [%1] Установить пан. инстр. [%1] PatternEditorPanel Hear new notes Слушать новые ноты Hear new notes = On Слушать новые ноты = Вкл Hear new notes = Off Слушать новые ноты = Выкл Pattern editor - %1 Редактор паттернов — %1 Quantize keyboard/midi events to grid Квантовать события с клавиатуры/MIDI по сетке Quantize incoming keyboard/midi events = On Квантование событий с клавиатуры/MIDI по сетке = Вкл Quantize incoming keyboard/midi events = Off Квантование событий с клавиатуры/MIDI по сетке = Выкл Zoom in Увеличить Zoom out Уменьшить Is not possible to change the pattern size when playing. При воспроизведении размер паттерна изменить нельзя. Select pattern size Выбрать размер паттерна Select grid resolution Выбрать разрешение сетки No pattern selected Ни один паттерн не выбран Select note properties Выбрать свойства ноты Velocity Сила нажатия Pan Панорама Lead and Lag Смещение во времени Loaded Soundlibrary Загружена библиотека звуков destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Показать матричный редактор NoteKey Show drum editor Показать редактор перкуссии Probability Вероятность PatternFillDialog Fill with selected pattern Заполнить выбранным паттерном PatternFillDialog_UI Alt+C Alt+т Cancel Отменить Form 1 Form 1 &Fill &Заполнить Alt+F Alt+з &Clear О&чистить From: От: To: До: OK ОК PatternPropertiesDialog Pattern properties Свойства паттерна %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel О&тменить Alt+C Alt+т &OK &OK Alt+O Alt+о New Pattern Name Новое название паттерна Form1 Form1 Pattern category Категория ритм. рисунков Pattern description Описание ритм. рисунка PlayerControl Stop Остановить Song Mode Режим композиции Playing. Идёт воспроизведение Stopped. Воспр. остановлено Song mode selected. Выбран режим композиции Pattern Mode Режим паттерна Pattern mode selected. Выбран режим редактора паттерна Jack-transport on/off Переключение транспорта JACK Jack-transport mode = On Режим JACK-транспорт = Вкл Jack-transport mode = Off Режим JACK-транспорт = Выкл New BPM value Новое значение BPM Rewind Назад Play/ Pause Играть/Приостановить Fast Forward Вперёд Pause. Приостановлено. JACK-transport will work only with JACK driver. Транспорт JACK работает только с драйвером JACK. Loop song Зациклить композицию Loop song = On Зацикливание композиции = Вкл Loop song = Off Зацикливание композиции = Выкл Show mixer Показать микшер Mixer Микшер Show Instrument Rack Показать банк инструментов Instrument rack Стойка инструментов BeatCounter Panel on Set BPM / Set BPM and play Jack-Time-Master on/off BC Panel on BC Panel off Count BPM and start PLAY Count and set BPM Jack-Time-Master mode = On Режим Jack-Time-Master Вкл Jack-Time-Master mode = Off Режим Jack-Time-Master Выкл Record Запись Destructive Record Разрушающая запись Record midi events = On Запись MIDI = Вкл Record midi events = Off Запись MIDI = Выкл Destructive mode = Off Разруш. режим = Выкл Destructive mode = On Разруш. режим = Вкл Recalculate Rubberband modified samples if bpm will change Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off Переключить слышимость метронома PlaylistDialog Song list Список композиций Script Сценарий exec Script Выполнение Add Song to PlayList Добавить композицию в список No Song selected! Ни одна композиция не выбрана! Load Playlist Загрузить список Save Playlist Сохранить список No Song in List or no Song selected! Нет выбранных композиций! Hydrogen Playlist (*.sh) Список воспроизведения Hydrogen (*.sh) Add Script to selected Song Добавить сценарий в выбранную композицию No Script in use! Нет используемого сценария! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Set your Default Editor Укажите используемый редактор No Script selected! Не выбран ни один сценарий! Error loading song. Ошибка при загрузке композиции sort New Script Создать сценарий No Script! Нет сценария! Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Имя сценария или путь к нему содержит пробелы. Этого не должно быть. &Playlist &Список Add song to Play&list &Добавить композицию в список Add &current song to Playlist Добавить &текущую композицию в список &Remove selected song from Playlist &Удалить текущую песню из списка &Open Playlist &Открыть список &Save Playlist &Сохранить список Save Playlist &as Сохранить список &как &Scripts С&ценарии &Add Script to selected song &Добавить сценарий в выбранную композицию &Edit selected Script &Изменить выбранный сценарий &Remove selected Script &Удалить выбранный сценарий &Create a new Script &Создать выбранный сценарий Rewind Перемотать назад Play/ Pause/ Load selected song Воспроизведение / Пауза / Загрузить выбранную композицию Stop Стоп Fast Forward Перемотать вперёд Please save your song first Сначала сохраните композицию WARNING, the new file is executable by the owner of the file! ВНИМАНИЕ, новый файл содержит бит исполнения, доступный его владельцу Pause. Пауза. Playlist Browser Редактор списка воспроизведения Playlist: set song no. %1 no Script &New Playlist &Создать список File not found: Файл не найден: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &Отказаться &Cancel О&тмена Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. PlaylistDialog_UI PlayList Browser Просмотр списка воспроизведения Song list Список композиций PreferencesDialog Slow Медленное Normal Нормальное Fast Быстрое <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Обычный звуковой драйвер [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Не скомпилировано</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Драйвер Jack Audio Connection Kit</b><br>Низколатентный звуковой драйвер Preferences Параметры <b>ALSA Driver</b><br> <b>Драйвер ALSA</b><br> <b>PortAudio Driver</b><br> <b>Драйвер PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Драйвер CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Перезапустите Hydrogen, чтобы включить или отключить поддержку LASH Driver restart required. Restart driver? Необходим повторный запуск драйвера. Запустить его заново? &Ok &OK &Cancel О&тменить <b>PulseAudio Driver</b><br> <b>Драйвер PulseAudio</b><br> Automatic Steps Fixed Number of steps Color (Hue value) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Sample rate Частота сэмплирования 44100 44100 48000 48000 Buffer size Размер буфера Device Устройство Input Вход Channel Канал All Все 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Meters falloff speed Скорость спадания индикаторов Slow Медленно Normal Нормально Fast Быстро Application font Шрифт приложения Mixer font Шрифт в микшере Select font Выбрать шрифт Polyphony Полифония Style Стиль &Cancel О&тменить Alt+C Alt+т &OK &OK Alt+O Alt+о &General О&бщие Alt+R Alt+п Audio &System &Звуковая система Metronome volume Громкость метронома Connect to &Default Output Pair &Соединиться с обычной парой выхода Alt+D Alt+с 88200 88200 96000 96000 &Midi System MIDI-с&истема Midi driver Драйвер MIDI Ignore note-off Игнорировать note-off &Appearance &Интерфейс Form1 Form1 &Reopen last used song От&крывать последнюю композицию ### ### Restart output Перезагрузить Audio output details Подробности о выводе Post-Fader Постфейдер Pre-Fader Префейдер Track output Вывод дорожки Use lash Использовать LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms Beat counter start offset in ms Path to the Rubberband command-line utility Расположение утилиты Rubberband Maximum number of bars Максимальное оличество тактов &Reopen last used playlist &Повторно открывать последний список воспроизведения Interpolate resampling Интерполяция при ресэмплировании Linear Линейная Cosine По косинусу Third Cubic Кубическая Hermite Эрмита Default interface layout Макет интерфейса по умолчанию Single pane В одну панель Tabbed Со вкладками TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &OSC &Enable OSC support Вклю&чить поддержку OSC Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Выход Enable midi feedback SampleEditor &Ok &OK &Cancel О&тменить Close dialog! maybe there is some unsaved work on sample. Are you sure? Закрыть диалог! Возможно, осталась какая-то несохранённая работа. Вы уверены? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Диалог P&lay original sample &Сыграть исходный сэмпл &Apply Changes &Применить изменения &Close &Закрыть Adjust sample start frame Adjust sample loop begin frame set processing forward Вперёд reverse Назад pingpong Пингпонг loops Adjust sample end & loop end frame &Play С&ыграть new sample length: Новая длина сэмпла: fade-out type Тип угасания volume Громкость panorama Панорама Sample length to beat: off выкл 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Изменить высоту тона в полутонах, сотых Crispness: Чёткость: 0 0 Start Начало Loop Петля <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Режим</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">петли</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End Конец "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) Высота тона (полутона, сотые) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Руководство пользователя Welcome to Hydrogen Знакомство с Hydrogen Don't show this message anymore Спасибо, больше не надо это показывать Ok ОК Documentation index Оглавление SongEditorPanel Create new pattern Создать новый паттерн Move the selected pattern down Опустить выбранный паттерн Move the selected pattern up Повысить выбранный паттерн Clear pattern sequence Стереть данные паттерна Song Editor Редактор композиций Select mode Выделять паттерны Draw mode Рисовать паттерны Warning, this will erase your pattern sequence. Are you sure? Внимание, вся последовательность паттернов будет удалена. Вы уверены? &Ok &OK &Cancel О&тменить stacked mode stacked pattern mode single pattern mode Pattern %1 Паттерн %1 Enable time line edit View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Сила нажатия Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Form Edit the bpm value for current beat Изменить значение bpm для текущей доли 500,55 500,55 Edit beat in timeline Указать долю на линии времени 500 500 Bar Такт BPM BPM Delete this BPM Marker Удалить этот маркер BPM Delete BPM Marker Удалить маркер BPM Cancel Отменить Ok ОК SongEditorPanelTagWidget_UI Form Form Tag Метка Cancel Отменить Ok ОК SongEditorPatternList Copy Скопировать Delete Удалить Properties Свойства Fill/Clear ... Заполнить/Очистить... Save Pattern Сохранить паттерн Load Pattern Загрузить паттерн Open Pattern Открыть паттерн Pattern 1 Паттерн 1 not_categorized Без категории Virtual Pattern Виртуальный паттерн The pattern-file exists. Overwrite the existing pattern? Такой файл паттерна уже существует. Перезаписать его? &Ok &OK &Cancel О&тменить Export Pattern Экспортировать паттерн Could not export pattern. Не удалось экспортировать паттерн. Could not export sequence. Не удалось экспортировать секвенцию. Pattern saved. Паттерн сохранён. SongPropertiesDialog Song properties Метаданные SongPropertiesDialog_UI Notes Ноты Author Автор Song name Название композиции &Cancel О&тменить Alt+C Alt+т &OK &OK Alt+O Alt+о Form1 Form1 License Лицензия SoundLibraryExportDialog Export Sound Library Экспортировать библиотеку звуков Directory Каталог SoundLibraryExportDialog_UI Dialog Диалог Export Экспорт Drumkit Драмкит Component Компонент Path Расположение Version Версия Browse... Просмотр… 0.9.7 and higher 0.9.7 и новее 0.9.6 and lower 0.9.6 и старше Cancel Отмена SoundLibraryImportDialog Sound Library import Импорт звуковой библиотеки Sound library Библиотека звуков Status Статус Updating SoundLibrary list... Список звуковых библиотек обновляется... Installed Установлена New Новая Author: %1 Автор: %1 Downloading SoundLibrary... Скачивается библиотека звуков... Import drumkit Импортировать драмкит SoundLibrary imported in %1 Библиотека звуков импортирована в %1 An error occurred importing the SoundLibrary. Во время импорта библиотеки звуков произошла ошибка. Drumkits Драмкиты Songs Композиции Patterns Паттерны Drumkit License: %1 Лицензия на драмкит: %1 Image License: %1 Лицензия на изображение: %1 SoundLibraryImportDialog_UI Dialog Диалог Internet Интернет Update list Обновить список Sound Library Name Название библиотеки звуков Author... Автор... Download and install Скачать и установить Local file Локальный файл Browse... Просмотреть... Install Установить 1 1 Edit server list Изменить список серверов Close Закрыть TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Открыть звуковую библиотеку Load Загрузить Cancel Отмена SoundLibraryPanel Load Загрузить Delete Удалить Export Экспортировать System drumkits Системные драмкиты User drumkits Пользовательские драмкиты &Ok &OK &Cancel О&тменить Songs Композиции Patterns Паттерны Error loading song. Ошибка при загрузке композиции. Properties Свойства Warning, the selected pattern will be deleted from disk. Are you sure? Предупреждение: выбранный паттерн будет удален с диска. Вы уверены? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Диалог Name Название Author Автор Information Информация Save Сохранить Cancel Отменить Save changes made to instruments into sound library Сохранить в библиотеку изменения, внесенные в инструменты Drumkit License Лицензия на драмкит Image Изображение Browse Просмотр Image License Лицензия на изображение SoundLibraryRepositoryDialog Edit repository settings Изменить параметры репозитория Edit server list Изменить список серверов URL URL SoundLibraryRepositoryDialog_UI Dialog Диалог Add Добавить Delete Удалить SoundLibrarySaveDialog Save Sound Library Сохранить библиотеку звуков Please supply at least a valid name Укажите хотя бы корректное название A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Не удалось сохранить эту библиотеку Open Image Открыть изображение Image Files (*.png *.jpg *.jpeg) Файлы изображений (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Диалог Name Название Author Автор Information Информация Cancel Отменить License Лицензия Save Сохранить Image Изображение Browse Просмотр Image License Лицензия на изображение SoundLibraryTree Sound library Библиотека звуков VirtualPatternDialog Select virtual pattern Выберите виртуальный паттерн VirtualPatternDialog_UI Dialog Диалог OK ОК Cancel Отменить hydrogen-1.0.0-rc1/data/i18n/hydrogen_sr.ts000066400000000000000000004334521366722712400204220ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Страна пројекта</b><br> About О програму <b>Website</b><br> <b>Веб страна</b><br> <b>Main coder and maintainer:</b><br> <b>Главни програмер и одржавалац:</b><br> <b>Thanks to:</b> <b>Захваљујемо:</b> <b>Development mailing list</b><br> <b>Дописна листа програмера</b><br> AboutDialog_UI About Hydrogen О програму &OK &У реду Alt+O Алт+У A&bout О про&граму ### ### &Authors &Аутори &License &Лиценца AudioEngineInfoForm Audio Engine Info Подаци о зв. посреднику AudioEngineInfoForm_UI ### ### Playing notes Свирање нота Process time Време процеса Audio engine state Стање зв. посредника Song state Стање песме Ticks Откуцаји Buffer size Величина међуспремника Sample rate Учестаност узорковања Song position Позиција песме Patterns Мустре Selected pattern Одабрана мустра Selected instrument Одабрани инструменат Form1 Формулар1 Connected to Повезан на Frames Оквири Sampler Семплер Synth Синтесајзер Sequencer Секвенцер MIDI input Миди-улаз Name Назив Audio output Звучни излаз Realtime frames Оквири у реалном времену AudioFileBrowser Audio File Browser Прегледник звучних датотека s s Name: Назив: Size: Величина: Samplerate: Учестаност узорковања: Size: %1 bytes Величина: %1 бајтова Samplerate: %1 Учестаност_узорковања: %1 Sample length: Трајање узорка: Please do not preview samples which are longer than 10 minutes! Не преслушајте узорке који трају дуже од 10 минута! Sample length: Трајање узорка: Unable to load that sample file. AudioFileBrowser_UI Name: Назив: Size: Величина: Samplerate: Учестаност узорковања: Dialog Прозорче Length: Трајање: Pla&y samples by clicking Кликом на њих засвирај &узорке &Up &Горе &Home &Главни директоријум &Play Sample Свирај &узорак &Filename to instrument name &Назив датотеке у назив инструмента Open Отвори Cancel Поништи &Stop Зау&стави View hidden folders Прикажи скривене директоријуме Be careful, this change all Layer velocity settings Опрез! Ово мења поставке јачине удара у свим слојевима Set automatic velocity Постављај сам јачину удара ComponentMixerLine Mute Утишај Solo Соло Component name Назив компоненте Set instrument volume [%1] Постави гласнођу инструмента [%1] Director Director Директор Director_UI Dialog Прозорче DonationDialog Donations Новчани помагачи DonationDialog_UI Form Формулар Donate! Приложите! Choose random entry. Одабери случајан унос. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Хидроген је пројекат отвореног кода који развијају многи људи у своје слободно време. Одужите се овим људима у виду &quot;новчаног прилога&quot;.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Себастијан Мурс (познат и као „mauser“): Одржавалац и програмер Michael Wolkstein (aka wolke): Forum hosting Михаел Волкштајн (познат и као „wolke“): Услуга прог. форума Download Importing item failed: %1 Није успео увоз ставке: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 КиБ) — још %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Извези Миди-датотеку Directory %1 does not exists The file %1 exists. Overwrite the existing file? Датотека %1 већ постоји. Да ли да преписујем преко ње? ExportMidiDialog_UI Dialog Прозорче Filename &Browse... &Разгледај... Alt+B Алт+Р Modus: Modus: &Export &Извези Alt+E Alt+E &Close За&твори Alt+C ExportSongDialog Export song Извези песму Export to a single track Извези као једну траку Both Обоје The file %1 exists. Overwrite the existing file? Датотека %1 већ постоји. Да ли да преписујем преко ње? Export to separate tracks Извези као подвојене траке Directory %1 does not exists ExportSongDialog_UI &Export &Извези &Close За&твори Alt+C Alt+C Alt+E Alt+E &Browse... &Разгледај... Alt+B Алт+Р Samplerate in Hz: Учестаност_узорковања у Hz: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Дубина узорка у битовима: 8 8 16 16 24 24 32 32 Templates: Шаблони: WAV in CD quality "44,1kHz, 16 bit PCM" WAV ЦД квалитета „44,1kHz, 16 bit PCM“ WAV in ADAT quality "48 kHz, 16 bit PCM" WAV АДАТ квалитета „48kHz, 16 bit PCM“ WAV in better quality "48 kHz, 24 bit PCM" WAV бољи квалитет „48kHz, 24 bit PCM“ WAV LOFI "22.05kHz, 8 bit PCM WAV лошијег квалитета „22,05kHz, 8 bit PCM“ WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV измешано најбољег квалитета „96kHz, 32 bit PCM“ AIFF in CD quality "41 kHz, 16 bit PCM" AIFF ЦД квалитета „44,1kHz, 16 bit PCM“ AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF АДАТ квалитета „48kHz, 16 bit PCM“ AIFF in better quality "48 kHz, 24 bit PCM" AIFF бољег квалитета „48kHz, 24 bit PCM“ FLAC lossless compressor in good quality "48 kHz" ФЛАК доброг квалитета „48 kHz“ OGG Vorbis loosely compressed in good quality "VBR" ОГГ аудио (oga) доброг квалитета „VBR“ Interpolation: Интерполација: Choose type of interpolation methode Одаберите врсту интерполационог метода Linear Линеарни Cosine Косинусни Third Трећи Cubic Кубично Hermite Хермит Enable tempo changing Омогући промену темпа TimeLine BPM Врем линија — о/м Enable use of rubberband's batch processor Омогући употребу „rubberband“-ове скупне обраде Rubberband Batch Рабербендова скупна обрада 88200 88200 Dialog Прозорче Export directory: Одредиште: Modus: Modus: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 kHz<br>%3 %4 FxMixerLine FX on/off Ефекат УКЉ/ИСКЉ Master output Главни излаз H2Core::SongEditorPanelBpmWidget BPM о/м H2Core::SongEditorPanelTagWidget Tag Ознака H2Core::SoundLibraryPropertiesDialog &Cancel &Поништи SoundLibrary Properties Особине бубњева &Ok &У реду This is not possible, you can only save changes inside instruments to the current loaded sound library Не можете то да урадите. Промене у инструменту можете да сачувате само у тренутно учитаним бубњевима из листе бубњева. Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? УПОЗОРЕЊЕ! Промена назива бубњева ће довести до стварања нових бубњева оваквог назива. Желите ли то да урадите? Saving of this drumkit failed. Није успело чување ових бубњева. Open Image Отвори слику Image Files (*.png *.jpg *.jpeg) Датотеке са сликама (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Бубњеви су учитани: [%1] Song Editor Уредник песме Instrument + Pattern Инструменат + Мустра Mixer Миксета modified измењено Song saved. Песма је сачувана. InstrumentEditor Random pitch factor Коефицијенат насумичне промене корака учестаности Filter Cutoff Гранични филтар Filter resonance Резонантни филтар Attack Вр. пораста Decay Вр. пада Sustain Вр. задршке Release Вр. стишавања Instrument gain Јачина инструмента Layer gain Појачање слоја Layer pitch (Coarse) Промена висине тона у корацима (грубо) Layer pitch (Fine) Промена висине тона у корацима (прецизно) Show instrument properties Прикажи особине инструмента Show layers properties Прикажи особине слојева New instrument name Назив новог инструмента General Опште Layers Слојеви Stop the current playing instrument-note before trigger the next note sample. Заустави ноту инструмента која се свира пре но се засвира нови нови узорак ноте. New component name Назив нове компоненте Component name Назив компоненте Midi out channel Изл. миди-канал Midi out note Изл. миди-нота Component volume Гласноћа компоненте Don't change the layers' gain based on velocity Не мењај појачање слојева засновано на јачини удара Select pattern size Одабери величину узорка InstrumentLine Clear notes Уклони ноте Randomize velocity Насумична јачина удара Delete instrument Обриши инструменат Mute instrument Утишај инструменат Solo Соло Fill notes ... Попуни нотама... Fill all notes све Fill 1/2 notes сваки други Fill 1/3 notes сваки трећи Fill 1/4 notes сваки четврти Fill 1/6 notes сваки шести Fill 1/8 notes сваки осми Copy notes ... Умножи ноте... Only for this pattern Само за ову мустру For all patterns За све мустре Paste notes ... Убаци ноте... Rename instrument Преименуј инструменат New instrument name Назив новог инструмента Fill 1/12 notes сваки дванаести Fill 1/16 notes сваки шеснаести InstrumentRack Show Instrument editor Прикажи уредника инструмента Instrument Инструменат Show sound library Прикажи листу бубњева Sound library Бубњеви LadspaFXMixerLine Edit FX parameters Уреди особине ефекта FX bypass Заобиђи ефекат Ladspa FX name Назив ЛАДСПА ефекта Effect return Утицај ефекта LadspaFXProperties Select FX Одабери ефекат [%1] LADSPA FX Properties [%1] Особине ЛАДСПА ефекта LADSPA FX %1 Properties ЛАДСПА ефекат %1 — особине No plugin Нема ефеката Activate Покрени Deactivate Заустави Remove FX Уклони ефекат LadspaFXSelector Groups Групе Stereo Стерео Mono Моно Not supported Неподржано Select LADSPA FX Одабери ЛАДСПА ефекат Recently Used Скоро коришћено Alphabetic List По азбучном реду Categorized Разврстано LadspaFXSelector_UI &OK &У реду Alt+O Алт+У Form1 Формулар1 Alt+C Алт+П &Cancel &Поништи ### fx label ### ознака еф. ### fx type ### врста еф. ### fx ID ### ИД еф. 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Назив:</span></p></body></html> ### fx name 1 ### назив ефекта 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ознака:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Врста:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ИД:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Творац:</span></p></body></html> ### FX maker 1 2 ### творац ефекта 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ауторска права:</span></p></body></html> ### copyright 1 2 3 ### Ауторска права 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Дец. = %1 МИДИ = %2 MainForm Ok У реду Cancel Поништи &Cancel &Поништи Unknown audio driver Непознат зв. посредник Error starting audio driver Грешка при покретању зв. посредника Jack driver: server shutdown Џек-посредник: није покренут сервер Jack driver: cannot activate client Џек-посредник: Не могу да активирам клијента Jack driver: cannot connect output port Џек-посредник: Не могу да повежем излазни порт Jack driver: error in port register Џек-посредник: Грешка у регистру порта Error loading song. Грешка при учитавању песме. Hydrogen Ready. Спреман за бубњање. &Save &Сачувај &Discard &Одбаци Save song Сачувај песму Open song Отвори песму &New &Нов &Open &Отвори Open &Demo Отвори &пробне... Open &recent Отво&ри скорашње Save &as... Сними к&ао... Export &MIDI file Извези &Миди-датотеку &Preferences &Поставке &Quit &Напусти Show &audio engine info Прикажи податке о &зв. посреднику &User manual &Упутство за кориснике &About O прогр&аму &Export song Изв&ези песму &Mixer &Миксета &Instrument Rack Пр&ибор De&bug Решавање про&блема Print Objects Штампај објекте &Info По&моћ Song saved. Песма је сачувана. Unknown error %1 Непозната грешка %1 Clear all instruments? Уклони све инструменте? Could not save song. Не могу да сачувам песму. Open &Pattern Отвори &мустру Save Pattern as ... Сачувај мустру као... Pattern saved. Мустра је сачувана. Open Pattern Отвори мустру Playlist: Set song No. %1 Листа: Постави песму бр. %1 Show &info Пр&икажи податке Expor&t pattern as... Извези мус&тру као... I&nstruments И&нструменти &Add instrument Дод&ај инструменат &Clear all О&чисти све Playlist &editor Ур&едник зв. листа Song saved as. Песма је сачувана као. Playlist: Song No. %1 Листа: Песму бр. %1 Could not export pattern. Не могох извести мустру. The document contains unsaved changes. Do you want to save the changes? Има несачуваних делова документа. Да ли желите да их сачувам пре изласка? Undo history Историјат опозивања &Undo &Опозови menu Undo Опозови Redo Понови Director Директор Input mode Улазни режим Instrument Инструменат Drumkit Бубњеви Report bug Извести о грешци You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Користите развојно издање програма, па Вас молимо да пошаљете извештаје о грешкама и предлоге на дописну листу програма.<br><br>Хвала Вам! Don't show this message anymore Не приказуј више ову поруку Export &LilyPond file Извези у &лилипонд-датотеку Donate Приложите LilyPond file (*.ly) Лилипонд-датотека (*.ly) Export LilyPond file Извези у лилипонд-датотеку The current playlist contains unsaved changes. Do you want to discard the changes? Текућа листа песама садржи неке несачуване податке. Желите ли да одбаците ове измене? Pro&ject Про&јекат New Нов Open Отвори Properties Особине Save Сачувај Save As Сачувај као Export Извоз Import Увоз Online import Увоз са мреже Add component Додај компоненту Component name Назив компоненте Saving of this library failed. Није успело чување ових бубњева. Drum&kits Бу&бњеви &View П&реглед &Automation path Full screen Преко целог екрана &Options &Опције MIDI setup advice Миди-поставке — Обавештење MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Нису преподешене изл. миди-ноте за ове бубњеве па би извоз ове песме у миди-датотеку био неуспешан. Желите ли да програм ово разреши придруживањем уобичајених вредности? Set default values Постави уобичајене вредности The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. Лилипонд-извоз је у фази испробавања. Ово ће радити ваљано ако употребљавате опште миди бубњеве (енг. „GM-kit“) и ако не употребљавате триплете. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Постави гласноћу Мастера [%1] Set humanize time parameter [%1] Поставите вредност за уљудније интервале [%1] Set humanize velocity parameter [%1] Поставите вредност за уљуднију јачину удараца [%1] Set swing factor [%1] Поставите вредност за напетост (свинг) [%1] Humanize velocity Уљуди јачину удараца Humanize time Уљуди инервале Swing Напетост (Свинг) MidiSenseWidget This element is not midi operable. Овај елеменат није употребљив за миди. Waiting for midi input... Ослушкујем на миди-улазу... MidiTable Event Догађај Param. Особина Action Радња press button to record midi event Притисните ово дугме да би снимили Миди-догађаје Mixer Show FX panel Прикажи пано са ефектима Show instrument peaks Прикажи вршне вредности за инструмете Show instrument peaks = On Прикажи вршне вредности = УКЉ Show instrument peaks = Off Прикажи вршне вредности = ИСКЉ Set FX %1 level Поставите ниво еф. %1 Set LADSPA FX ( %1 ) volume Поставите гласноћу ЛАДСПА еф. ( %1 ) LADSPA effects are not available in this version of Hydrogen. У овом издању програма нису доступи ЛАДСПА-ефекти. Mixer Миксета MixerLine Play sample Свирај узорак Mute Утишај Solo Соло Pan Пан. Instrument name (double click to edit) Назив инструмента (двоклик за уређивање) Set instrument volume [%1] Поставите гласнођу инструмента [%1] Set instr. pan [%1] Распоред инстр. — пан. [%1] PatternEditorPanel Pan Панорамисање Hear new notes Нове ноте су чујне Hear new notes = On Нове ноте су чујне = Укљ Hear new notes = Off Нове ноте су чујне = Искљ Pattern editor - %1 Уредник мустре - %1 Quantize keyboard/midi events to grid Квантизуј догађаје МИДИ/клавијатуре у мрежи Quantize incoming keyboard/midi events = On Квантизуј долазне догађаје МИДИ/клавијатуре = Укљ Select pattern size Одабери величину мустре Select grid resolution Обаберите резолуцију мреже Zoom in Приближи Zoom out Удаљи No pattern selected Нема одабране мустре Is not possible to change the pattern size when playing. За време свирања не може се мењати величина мустре. Select note properties Одаберите особине ноте Velocity Јачина удара Lead and Lag Пожури или Окасни Loaded Soundlibrary Учитани бубњеви Quantize incoming keyboard/midi events = Off Квантизуј долазне догађаје МИДИ/клавијатуре = Искљ Show piano roll editor Прикажи уредника са клав. диркама destructive mode pre delete settings destructive mode post delete settings NoteKey Висина ноте Show drum editor Прикажи уредника бубња Probability PatternFillDialog Fill with selected pattern Попуна одабраном мустром PatternFillDialog_UI Cancel Поништи Alt+C Alt+C Form 1 Формулар 1 &Fill &Попуни Alt+F Alt+F &Clear У&клони From: Од: To: До: OK У реду PatternPropertiesDialog Pattern properties Особине мустре %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &OK &У реду Alt+O Алт+У Form1 Формулар1 Alt+C Алт+П &Cancel &Поништи New Pattern Name Назив нове мустре Pattern category Обележја мустре Pattern description Опис мустре PlayerControl Mixer Миксета Stop Заустави Song Mode Песма Pattern Mode Мустра Playing. Свирам. Stopped. Заустављен. Song mode selected. Одабран је режим песме. Pattern mode selected. Одабран је мустра режим. Jack-transport on/off Џек-транспорт укљ/искљ Jack-transport mode = On Џек-транспорт режим = УКЉ Jack-transport mode = Off Џек-транспорт режим = ИСКЉ Show mixer Прикажи миксету Rewind Премотавање уназад Play/ Pause Свирај/Заустави Fast Forward Премотавање унапред Loop song Понављај песму Show Instrument Rack Прикажи бубњарски прибор Instrument rack Прибор Pause. Пауза. JACK-transport will work only with JACK driver. Џек-транспорт неће радити без Џек-посредника. New BPM value Број о/м Loop song = On Понављај песму = УКЉ Loop song = Off Понављај песму = ИСКЉ BeatCounter Panel on Укљ. пано бројача откуцаја Set BPM / Set BPM and play Постави о/м — Постави о/м и свирај Jack-Time-Master on/off Укљ/Искљ. Џеков управник времена BC Panel on Укљ. пано бројача откуцаја BC Panel off Искљ. пано бројача откуцаја Count BPM and start PLAY Израчунај број о/м и свирај Count and set BPM Израчунај и постави број о/м Jack-Time-Master mode = On Режим Џековог управника времена = УКЉ Jack-Time-Master mode = Off Режим Џековог управника времена = ИСКЉ Record Снимај Destructive Record Деструктивно снимање Recalculate Rubberband modified samples if bpm will change Уколико се мења број о/м прерачунај рабербендове измењене узорке Switch metronome on/off Укљ/Искљ. метроном Record midi events = On Снимај Миди-догађаје = УКЉ Record midi events = Off Снимај Миди-догађаје = ИСКЉ Destructive mode = Off Деструктивни режим = ИСКЉ Destructive mode = On Деструктивни режим = УКЉ Recalculate all samples using Rubberband ON Укљ. прерачунавање свих рабербендових измењених узорака Recalculate all samples using Rubberband OFF Искљ. прерачунавање свих рабербендових измењених узорака PlaylistDialog Error loading song. Грешка при учитавању песме. Stop Заустави Rewind Премотавање уназад Fast Forward Премотавање унапред Pause. Пауза. Song list Песме Script Скрипта exec Script Покрени скрипту Add Song to PlayList Додај песму у листу No Song selected! Нисте одабрали песму! Load Playlist Учитај листу Save Playlist Сачувај листу No Song in List or no Song selected! Нисте одабрали песму или листу! Hydrogen Playlist (*.sh) Бубњарска скрипта (*.sh) Add Script to selected Song Додели скрипту одабраној песми No Script in use! Нема скрипте у употреби! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Морате да поставите подразумевани уредник. Одаберите један, али не-конзолни. Жао нам је, тренутно, ово и неће баш радити. Set your Default Editor Постави подразумевани уредник No Script selected! Нисте одабрали скрипту! sort Помери New Script Нова скрипта Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Назив скрипте или путања до ње садржи празнине (размак). ВАЖНО Назив скрипте или путања до ње не смеју садржавати празнине (размаке). No Script! Нема скрипте! &Playlist &Листа Add song to Play&list Додај песму у &листу Add &current song to Playlist Додај &текућу песму у листу &Remove selected song from Playlist &Уклони текућу песму из листе &Open Playlist &Отвори листу &Save Playlist &Сачувај листу Save Playlist &as Сачувај листу к&ао &Scripts &Скрипте &Add Script to selected song &Додели скрипту одабраној песми &Edit selected Script Ур&еди одабрану листу &Remove selected Script &Уклони одабрану листу &Create a new Script &Створи нову скрипту Play/ Pause/ Load selected song Свирај, заустави или учитај одабрану песму Please save your song first Најпре сачувајте песму WARNING, the new file is executable by the owner of the file! УПОЗОРЕЊЕ: Ова датотека ће моћи да се покрене од стране њеног власника! Playlist Browser Прегледник листе песама &New Playlist &Нова листа no Script без скрипте File not found: Нисам пронашао датотеку: No valid song selected! Нисте одабрали исправну песму! Playlist: set song no. %1 Листа: Постави песму бр. %1 The current playlist contains unsaved changes. Do you want to discard the changes? Текућа листа песама садржи неке несачуване податке. Желите ли да одбаците ове измене? &Discard &Одбаци &Cancel &Поништи Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Назив скрипте или путања до ње садржи празнине (размак). ВАЖНО Назив скрипте или путања до ње не смеју садржавати празнине (размаке). PlaylistDialog_UI Song list Песме PlayList Browser Прегледник листе песама PreferencesDialog Preferences Поставке Slow Споро Normal Обично Fast Брзо <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Прост зв. посредник [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Није компајлирано</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>JACK Driver</b><br>„Џек-посредник“ је звучни посредник са минималним кашњењем у преносу података <b>ALSA Driver</b><br> <b>АЛСА-посредник</b><br> <b>PortAudio Driver</b><br> <b>ПортАудио посредник</b><br> <b>CoreAudio Driver</b><br> <b>CoreAudio</b> зв. посредник<br> Please restart hydrogen to enable/disable LASH support Да би (не)омогућили „LASH“ подршку, покрените наново Хидроген Driver restart required. Restart driver? Неопходно је поновно покретање зв. посредника. Желите ли да то урадим за Вас? &Ok &У реду &Cancel &Поништи <b>PulseAudio Driver</b><br> <b>ПулсеАудио посредник</b><br> Automatic Сам одлучи Steps У корацима Fixed Једнообразно Number of steps Број корака Color (Hue value) Нијанса боје Automatic driver selection <br><b> </b> selected PreferencesDialog_UI &OK &У реду Alt+O Алт+У ### ### Buffer size Величина бафера Sample rate Учестаност узорковања Form1 Формулар1 Midi driver Миди-посредник Alt+C Алт+П &Cancel &Поништи 1 1 Slow Споро Normal Обично Fast Брзо Device Уређај Polyphony Полифонија Input Улаз Channel Канал All Све Meters falloff speed Брзина опадања мерача Application font Словолик у програму Select font Одабери словолик Mixer font Словолик у миксети Style Изглед 88200 88200 96000 96000 &General &Опште &Reopen last used song Обнови последњу ко&ришћену песму Alt+R Alt+R Audio &System Звучни &систем 44100 44100 48000 48000 Connect to &Default Output Pair Повежи на &подрезумевани излазни пар Alt+D Alt+D Metronome volume Гласноћа метронома &Midi System &Миди-систем Ignore note-off Игнориши поруку за узбуну (note-off) 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 &Appearance Из&глед Restart output Обнови излаз Audio output details Детаљи звучног излаза Post-Fader Регулатор на излазу Pre-Fader Регулатор на улазу Track output Излаз траке Use lash Користи „lash“ first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Најпре прилагоди врем. разлику између кашњења окидача клавијатуре (контролера) и прорачунатог броја о/м Beat counter drift compensation in 1/10 ms Исправка помераја бројача откуцаја у 1/10 мс Beat counter start offset in ms Почетни помак бројача откуцаја у мс Path to the Rubberband command-line utility Путања до програма рабербенд (ориг. „Rubberband“) Maximum number of bars Највећи број тактова &Reopen last used playlist Обнови последњу ко&ришћену листу Interpolate resampling Интерполација учестаности узорковања Linear Линеарно Cosine Косинусно Third Треће Cubic Кубично Hermite Хермит Default interface layout Подразумевано окружење Single pane све у једном паноу Tabbed у посебним језичцима TextLabel СловнОзнака Coloring method for Song Editor elements Боја елемената Уредника песме <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">По промени словолика и окружења поново покрените програм.</span></p></body></html> Use relative paths for playlist Користи релативне путање за листе Use output note as input note Користи излазну ноту као улазну Discard midi messages after action has been triggered Одбаци миди-поруке након окинуте радње Create per-instrument outputs Стварај излазе по инструменту Enable feedback Омогући повратну везу &OSC &ОЗК &Enable OSC support Омогући-подршку за ОЗ&К (ориг. „OSC“) Incoming port Улазни прикључак <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Прикључак за пријем ОЗК-порука (ориг. „OSC messages“)</p></body></html> Enable OSC &feedback Омогући повратну &везу за ОЗК second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &У реду &Cancel &Поништи Close dialog! maybe there is some unsaved work on sample. Are you sure? Завршно прозорче! Можда имате несачуваних измена на узорку. Да ли сте сигурни? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Прозорче &Close За&твори Start Почетак Adjust sample start frame Прилагоди почетни оквир узорка Loop Петља Adjust sample loop begin frame Прилагоди почетни оквир петље узорка <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Петља</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">режим</span></p></body></html> set processing постави процесирање forward унапред reverse уназад pingpong пинг-понг <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Петља</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Бројач</span></p></body></html> loops петље End Крај Adjust sample end & loop end frame Прилагоди последње оквир петље и узорка "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. „Rubberband Audio Processor“: Промена темпа (трајања узорка) и висине тона звука. Sample length to beat: Трајање узорка у доба: off искљ 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch (Semitone,Cent) Висина тона (полутон, стоти) Pitch the sample in semitones, cents Промена висине тона узорка у полутоновима или стотима Crispness: Јасноћа: 0 0 &Apply Changes Примени про&мене &Play &Свирај P&lay original sample Свирај изворни &узорак new sample length: Ново трајање узорка: fade-out type врста ишчезавања volume гласноћа panorama панорама <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Нивои јасноће (ориг. „Crispness“):</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 одговара „--no-transients --no-lamination --window-long“</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 одговара „--no-transients --no-lamination“</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 одговара „--no-transients“</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 одговара „--bl-transients“</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 подразумеване поставке обраде</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 одговара „--no-lamination --window-short“ (можда корисно за бубњеве)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Више информација о овој теми на адреси:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Ok У реду Manual Упутство Welcome to Hydrogen Хидроген Вас поздравља Don't show this message anymore Не приказуј више ову поруку Documentation index Индекс документације SongEditorPanel &Cancel &Поништи &Ok &У реду Create new pattern Додај нову мустру Move the selected pattern down Спусти одабрану мустру Move the selected pattern up Подигни одабрану мустру Song Editor Уредник песме Clear pattern sequence Обриши исцртана поља у свим мустрама Select mode Режим одабирања Draw mode Режим цртања Warning, this will erase your pattern sequence. Are you sure? !!! УПОЗОРЕЊЕ !!! Желите ли стварно да обришем исцртана поља у свим мустрама? stacked mode Сложен режим stacked pattern mode Режим сложене мустре single pattern mode Режим једне мустре Pattern %1 Мустра %1 Enable time line edit Омогући уређивање временске линије View playback track Прикажи траку која свира Mute playback track Утишај траку која свира Choose playback track Одабери траку за свирање View timeline Прикажи временску линију Adjust parameter values in time Временско прилагођавање вредности параметра Velocity Јачина удара Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Формулар Edit the bpm value for current beat Уреди број о/м за текуће доба 500,55 500,55 Edit beat in timeline Уреди доба на врем. линији 500 500 Bar Такт BPM о/м Delete this BPM Marker Уклони ову ознаку броја о/м Delete BPM Marker Уклони ознаку броја о/м Cancel Поништи Ok У реду SongEditorPanelTagWidget_UI Form Формулар Tag Ознака Cancel Поништи Ok У реду SongEditorPatternList &Cancel &Поништи &Ok &У реду Open Pattern Отвори мустру not_categorized не_сврстано Copy Умножи Delete Обриши Properties Особине Fill/Clear ... Попуни/Уклони... Save Pattern Сачувај мустру Load Pattern Учитај мустру The pattern-file exists. Overwrite the existing pattern? Датотека предлошка већ постоји. Да ли да преписујем преко ње? Pattern 1 Мустра 1 Export Pattern Извези мустру Virtual Pattern Виртуелна мустра Could not export pattern. Не могох извести мустру. Could not export sequence. Pattern saved. Мустра је сачувана. SongPropertiesDialog Song properties Особине песме SongPropertiesDialog_UI Alt+O Алт+У License Лиценца: Form1 Формулар1 Author Аутор: Alt+C Алт+П &Cancel &Поништи Song name Наслов песме: Notes Примедбе: &OK &У реду SoundLibraryExportDialog Export Sound Library Извези бубњеве Directory Директоријум SoundLibraryExportDialog_UI Dialog Прозорче Export Извоз Drumkit Бубњеви Component Компонента Path Путања Version Издање Browse... Разгледај... 0.9.7 and higher 0.9.7 и новије 0.9.6 and lower 0.9.6 и старије Cancel Поништи SoundLibraryImportDialog Patterns Мустре Sound library Бубњеви Sound Library import Увоз гарнитура бубњева Status Статус Updating SoundLibrary list... Освежавам списак гарнитура бубњева... Installed Инсталирано New Нов Author: %1 Аутор: %1 Downloading SoundLibrary... Преузимам гарнитуру бубњева... Import drumkit Увези бубњеве SoundLibrary imported in %1 Бубњеви су увежени у %1 An error occurred importing the SoundLibrary. Догодила се грешка током увоза бубњева. Drumkits Бубњеви Songs Песме Drumkit License: %1 Лиценца за бубњеве: %1 Image License: %1 Лиценца за слику: %1 SoundLibraryImportDialog_UI Dialog Прозорче 1 1 Internet Мрежа Update list Обнови списак Sound Library Name Назив бубњева Author... Аутор... Download and install Преузми и постави Local file Локална датотека Browse... Разгледај... Install Инсталирај Edit server list Уреди списак сервера Close Затвори TextLabel СловнаОзнака Image License... Лиценца за слику... Drumkit License... Лиценца за бубњеве... SoundLibraryOpenDialog Open Sound Library Отвори бубњеве Load Учитај Cancel Поништи SoundLibraryPanel Patterns Мустре Load Учитај Export Извоз &Cancel &Поништи &Ok &У реду Error loading song. Грешка при учитавању песме. Delete Обриши Properties Особине Songs Песме System drumkits Бубњеви на систему User drumkits Лични бубњеви Warning, the selected pattern will be deleted from disk. Are you sure? ПАЖЊА: Желите ли да одабрану мустру уклоните са диска? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Не можете уклонити бубњеве који су тренутно учитани: „%1“. Да би сте то урадили најпре учитајте друге бубњеве. "%1"is a system drumkit and can't be deleted. „%1“ су системски бубњеви и не могу бити уклоњени. Warning, the "%1" drumkit will be deleted from disk. Are you sure? ПАЖЊА: „%1“ ће бити уклоњени са диска. Да ли сте сигурни? Drumkit deletion failed. Није успело уклањање бубњева. Keep Задржи The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Постојећи бубњеви садрже %1, а ови нови само %2 инструмента. Првих %2 биће замењено новим инструментима уз задржавање њ. нота, али неки од преосталих инструмената садрже ноте. Желите ли да задржите ове преостале инструменте и ноте? Double click to expand the list Двоклик за проширење ове листе SoundLibraryPropertiesDialog_UI Name Назив Dialog Прозорче Cancel Поништи Author Аутор Information Подаци Save Сачувај Save changes made to instruments into sound library Сачувај измењени инструменат у бубњеве Drumkit License Лиценца за бубњеве Image Слика Browse Разгледај Image License Лиценца за слику SoundLibraryRepositoryDialog Edit server list Уреди списак сервера Edit repository settings Уреди подешавања складишта URL Адреса SoundLibraryRepositoryDialog_UI Dialog Прозорче Delete Обриши Add Додај SoundLibrarySaveDialog Save Sound Library Сачувај бубњеве Please supply at least a valid name Унесите бар ваљан назив A library with the same name already exists. Do you want to overwrite the existing library? Бубњеви са оваквим називом већ постоје. Желите ли да препишем преко њих? Saving of this library failed. Није успело чување ових бубњева. Open Image Отвори слику Image Files (*.png *.jpg *.jpeg) Датотеке са сликама (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI License Лиценца Name Назив Dialog Прозорче Cancel Поништи Author Аутор Information Подаци Save Сачувај Image Слика Browse Разгледај Image License Лиценца за слику SoundLibraryTree Sound library Бубњеви VirtualPatternDialog Select virtual pattern Одаберите виртуелну мустру VirtualPatternDialog_UI Dialog Прозорче OK У реду Cancel Поништи hydrogen-1.0.0-rc1/data/i18n/hydrogen_sv.ts000066400000000000000000003603121366722712400204200ustar00rootroot00000000000000 AboutDialog About Om <b>Project page</b><br> <b>Project sida</b><br> <b>Website</b><br> <b>Main coder and maintainer:</b><br> <b>Thanks to:</b> <b>Development mailing list</b><br> AboutDialog_UI About Hydrogen Om Hydrogen A&bout Om &Authors &Upphovsmän &License &Licens &OK Alt+O ### AudioEngineInfoForm Audio Engine Info AudioEngineInfoForm_UI Process time Process tid Song position Sång position Patterns Mönster Selected pattern Valt mönster Selected instrument Valt instrument Buffer size Buffer storlek Connected to Kopplad till Form1 ### Sample rate Frames Ticks Song state Audio engine state Playing notes Sampler Synth Sequencer MIDI input Name Audio output Realtime frames AudioFileBrowser Audio File Browser Size: %1 bytes Samplerate: %1 s Name: Size: Samplerate: Sample length: Please do not preview samples which are longer than 10 minutes! Sample length: Unable to load that sample file. AudioFileBrowser_UI Dialog Open Name: Samplerate: Size: Length: Cancel Avbryt Pla&y samples by clicking &Up &Home &Play Sample &Filename to instrument name &Stop View hidden folders Be careful, this change all Layer velocity settings Set automatic velocity ComponentMixerLine Mute Ljudlöst Solo Component name Set instrument volume [%1] Director Director Director_UI Dialog DonationDialog Donations DonationDialog_UI Form Donate! Choose random entry. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Download Importing item failed: %1 DownloadWidget (%1/%2 KiB) - ETA %3 ExportSongDialog Export song Exportera sång The file %1 exists. Overwrite the existing file? Export to a single track Both Export to separate tracks ExportSongDialog_UI &Browse... &Bläddra... &Export &Exportera &Close &Stäng Alt+C Alt+E Alt+B Samplerate in Hz: 22050 44100 48000 96000 192000 SampleDepth in Bit: 8 16 24 32 Templates: WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" Interpolation: Choose type of interpolation methode Linear Cosine Third Cubic Hermite Enable tempo changing TimeLine BPM 88200 Enable use of rubberband's batch processor Rubberband Batch Dialog Export directory: Modus: FileBrowser %1<br>%2 KHz<br>%3 %4 FxMixerLine FX on/off FX på/av Master output H2Core::SongEditorPanelBpmWidget BPM H2Core::SongEditorPanelTagWidget Tag H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties &Ok &Cancel &Avbryt This is not possible, you can only save changes inside instruments to the current loaded sound library Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Saving of this drumkit failed. Open Image Image Files (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Drumkit laddat: [1%] Song Editor Sång Editor Instrument + Pattern Mixer modified InstrumentEditor Random pitch factor Slumpvald pitch faktor Filter resonance Filter resonans Show instrument properties Visa instrument egenskaper Show layers properties Visa lager egenskaper New instrument name Nytt instrument namn Filter Cutoff Attack Decay Sustain Release Instrument gain Layer gain Layer pitch (Coarse) Layer pitch (Fine) General Layers Stop the current playing instrument-note before trigger the next note sample. New component name Component name Midi out channel Midi out note Component volume Don't change the layers' gain based on velocity Select pattern size Välj mönster storlek InstrumentLine Clear notes Rensa noter Randomize velocity Slumpvald hastighet Delete instrument Fill notes ... Fill all notes Fill 1/2 notes Fill 1/3 notes Fill 1/4 notes Fill 1/6 notes Fill 1/8 notes Mute instrument Solo Copy notes ... Only for this pattern For all patterns Paste notes ... Rename instrument New instrument name Nytt instrument namn Fill 1/12 notes Fill 1/16 notes InstrumentRack Show Instrument editor Instrument Show sound library Sound library LadspaFXMixerLine FX bypass FX förbikoppling Edit FX parameters Ändra FX parametrar Ladspa FX name Ladspa FX namn Effect return Effekt retur LadspaFXProperties Select FX Välj FX Activate Aktivera [%1] LADSPA FX Properties [%1] LADSPA FX Egenskaper Deactivate Deaktivera LADSPA FX %1 Properties LADSPA FX %1 Egenskaper No plugin Inget plugin Remove FX LadspaFXSelector Select LADSPA FX Välj LADSPA FX Groups Grupper Stereo Mono Not supported Recently Used Alphabetic List Categorized LadspaFXSelector_UI &Cancel &Avbryt ### fx type ### fx typ Form1 Alt+C &OK Alt+O ### fx label ### fx ID 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> ### FX maker 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 MainForm Error loading song. Kunde inte ladda sång. Hydrogen Ready. Hydrogen Klar. &New &Ny &Open &Öppna... Open &Demo Öppna &Demo... Open &recent Öppna &tidigare &Save &Spara &Export song &Exportera sång Export &MIDI file Exportera &MIDI fil &Preferences &Inställningar... &Quit &Avsluta Show &audio engine info Visa &audio engine info &User manual Användar &manual &About &Om... &Discard &No &Cancel &Avbryt Hydrogen Song (*.h2song) Hydrogen Sång (*.h2song) Save song Spara sång Open song Öppna sång Cancel Avbryt Midi file (*.mid) Midi fil (*.mid) Export MIDI file Exportera MIDI fil Unknown audio driver Okänd ljud drivrutin Error starting audio driver Kunde inte starta ljud drivrutin Jack driver: server shutdown Jack drivrutin: server nedstängd Jack driver: cannot activate client Jack drivrutin: kan inte aktivera klient Jack driver: cannot connect output port Jack drivrutin: kan inte koppla output port Jack driver: error in port register Jack drivrutin: fel i port register Save &as... &Mixer &Instrument Rack De&bug Print Objects &Info Song saved. Unknown error %1 Clear all instruments? Ok You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Could not save song. Open &Pattern Hydrogen Pattern (*.h2pattern) Save Pattern as ... Pattern saved. Open Pattern Don't show this message anymore Visa inte detta meddelande igen Playlist: Set song No. %1 Show &info Expor&t pattern as... I&nstruments &Add instrument &Clear all Playlist &editor Info|About Song saved as. Playlist: Song No. %1 Could not export pattern. The document contains unsaved changes. Do you want to save the changes? Director Undo history &Undo menu Undo Redo Input mode Instrument Drumkit Report bug Export &LilyPond file Donate LilyPond file (*.ly) Export LilyPond file The current playlist contains unsaved changes. Do you want to discard the changes? Pro&ject New Open Properties Egenskaper Save Save As Export Exportera Import Online import Add component Component name Saving of this library failed. Drum&kits &View &Automation path Full screen &Options MIDI setup advice MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Set default values The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. MasterMixerLine Humanize velocity Förmänskliga hastighet Humanize time Förmänskliga tid Swing Set master volume [%1] Set humanize time parameter [%1] Set humanize velocity parameter [%1] Set swing factor [%1] MidiSenseWidget This element is not midi operable. Waiting for midi input... MidiTable Event Param. Action press button to record midi event Mixer Show FX panel Visa FX panel Show instrument peaks Set FX %1 level Show instrument peaks = On Show instrument peaks = Off Set LADSPA FX ( %1 ) volume LADSPA effects are not available in this version of Hydrogen. Mixer MixerLine Play sample Spela sample Mute Ljudlöst Instrument name (double click to edit) Instrument namn (dubbel klicka för att redigera) Solo Pan Set instrument volume [%1] Set instr. pan [%1] PatternEditorPanel Select pattern size Välj mönster storlek Select grid resolution Välj grid upplösning Hear new notes Hör nya noter Zoom in Zooma in Zoom out Zooma ut Pattern editor - %1 Mönster editor - %1 Hear new notes = On Hör nya noter = På Hear new notes = Off Hör nya noter = Av Is not possible to change the pattern size when playing. Ej möjligt att ändra i mönstret medans den spelas. Quantize keyboard/midi events to grid No pattern selected Quantize incoming keyboard/midi events = On Quantize incoming keyboard/midi events = Off Select note properties Velocity Pan Cutoff Resonance Lead and Lag Loaded Soundlibrary NoteKey destructive mode pre delete settings destructive mode post delete settings Show piano roll editor Show drum editor Probability PatternFillDialog Fill with selected pattern Fyll med valt mönster PatternFillDialog_UI &Fill &Fyll &Clear &Rensa To: Till: From: Från: Cancel Avbryt Form 1 Alt+F Alt+C OK PatternPropertiesDialog Pattern properties Mönster egenskaper %1#2 %1 PatternPropertiesDialog_UI &Cancel &Avbryt New Pattern Name Nytt Mönster Namn Form1 Alt+C &OK Alt+O Pattern category Pattern description PianoRollEditor Velocity Pan Lead and Lag PlayerControl Rewind Tillbakaspolning Play/ Pause Spela/ Pause Stop Stopp Fast Forward Snabbt Fram Loop song Loopa sång Pattern Mode Mönster Läge Song Mode Sång Läge Jack-transport on/off Jack-transport på/av Playing. Spelar. Stopped. Stoppad. Song mode selected. Sång läge valt. Pattern mode selected. Mönster läge valt. Jack-transport mode = On Jack-transport mode = På Jack-transport mode = Off Jack-transport mode = Av JACK-transport will work only with JACK driver. JACK-transport funkar endast med JACK drivrutin. New BPM value Nytt BPM värde Loop song = On Loopa sång = På Loop song = Off Loopa sång = Av Show mixer Mixer Show Instrument Rack Instrument rack Pause. BeatCounter Panel on Set BPM / Set BPM and play Jack-Time-Master on/off BC Panel on BC Panel off Count BPM and start PLAY Count and set BPM Jack-Time-Master mode = On Jack-Time-Master mode = Off Record Destructive Record Record midi events = On Record midi events = Off Destructive mode = Off Destructive mode = On Recalculate Rubberband modified samples if bpm will change Recalculate all samples using Rubberband ON Recalculate all samples using Rubberband OFF Switch metronome on/off PlaylistDialog Song list Script exec Script Add Song to PlayList No Song selected! Load Playlist Hydrogen Playlist (*.h2playlist) Save Playlist No Song in List or no Song selected! Hydrogen Playlist (*.sh) Add Script to selected Song No Script in use! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Set your Default Editor No Script selected! Error loading song. Kunde inte ladda sång. sort Hydrogen Scripts (*.sh) New Script Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. No Script! &Playlist Add song to Play&list Add &current song to Playlist &Remove selected song from Playlist &Open Playlist &Save Playlist Save Playlist &as &Scripts &Add Script to selected song &Edit selected Script &Remove selected Script &Create a new Script Rewind Tillbakaspolning Play/ Pause/ Load selected song Stop Stopp Fast Forward Snabbt Fram Please save your song first WARNING, the new file is executable by the owner of the file! Pause. Playlist Browser Playlist: set song no. %1 no Script &New Playlist File not found: No valid song selected! The current playlist contains unsaved changes. Do you want to discard the changes? &Discard &No &Cancel &Avbryt Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Hydrogen playlist (*.h2playlist) PlaylistDialog_UI PlayList Browser Song list PreferencesDialog Preferences Inställningar Slow Långsam Fast Snabb <b>Automatic driver selection</b> <b>Automatisk drivrutins väljning</b> <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Simpel ljud drivrutin [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Inte kompilerad</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Jack Audio Connection Kit Driver</b><br>Låg latens ljud drivrutin <b>ALSA Driver</b><br> <b>ALSA Drivrutin</b><br> <b>PortAudio Driver</b><br> <b>PortAudio Drivrutin</b><br> Normal <b>CoreAudio Driver</b><br> Please restart hydrogen to enable/disable LASH support Driver restart required. Restart driver? &Ok &Cancel &Avbryt Automatic Steps Fixed <b>PulseAudio Driver</b><br> Number of steps Color (Hue value) PreferencesDialog_UI &Cancel &Avbryt &General &Allmänt Audio &System Ljud &System Polyphony Polyfoni Device Enhet Buffer size Buffer storlek Metronome volume Metronome volym Midi driver Midi drivrutin All Alla Channel Kanal &Appearance &Utseende Application font Applikation font Style Stil Select font Välj teckensnitt Slow Långsam Fast Snabb Mixer font Mixer teckensnitt Form1 Alt+C &OK Alt+O &Reopen last used song Alt+R ### Sample rate 44100 48000 88200 96000 Connect to &Default Output Pair Alt+D &Midi System Ignore note-off 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Input Normal Meters falloff speed Restart output Audio output details Post-Fader Pre-Fader Track output Use lash first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keybord trigger and the deferred sequencer startup Beat counter start offset in ms Path to the Rubberband command-line utility Maximum number of bars &Reopen last used playlist Interpolate resampling Linear Cosine Third Cubic Hermite Default interface layout Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> Use relative paths for playlist Use output note as input note Discard midi messages after action has been triggered Create per-instrument outputs Enable feedback &OSC &Enable OSC support Incoming port <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> Enable OSC &feedback SampleEditor Unsaved changes left. This changes will be lost. Are you sure? &Ok &Cancel &Avbryt Close dialog! maybe there is some unsaved work on sample. Are you sure? SampleEditor_UI Dialog P&lay original sample &Apply Changes &Close &Stäng Adjust sample start frame Adjust sample loop begin frame set processing forward reverse pingpong loops Adjust sample end & loop end frame &Play new sample length: fade-out type volume panorama Sample length to beat: off 1/64 1/32 1/16 1/8 1/4 1/2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Pitch the sample in semitones, cents Crispness: 0 Start Loop <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> End "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Pitch (Semitone,Cent) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Welcome to Hydrogen Välkommen till Hydrogen Don't show this message anymore Visa inte detta meddelande igen Documentation index Dokumentation index Manual Ok SongEditorPanel Song Editor Sång Editor Clear pattern sequence Rensa mönster sekvens Create new pattern Skapa nytt mönster Move the selected pattern down Flytta ner valt mönster Move the selected pattern up Flytta upp valt mönster Select mode Val läge Warning, this will erase your pattern sequence. Are you sure? Varning, detta kommer att radera din mönster sekvens. Är du säker? &Cancel &Avbryt Draw mode &Ok stacked mode stacked pattern mode single pattern mode Enable time line edit Pattern %1 View playback track Mute playback track Choose playback track View timeline Adjust parameter values in time Velocity Select playback track SongEditorPanelBpmWidget_UI Form Edit the bpm value for current beat 500,55 Edit beat in timeline 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Avbryt Ok SongEditorPanelTagWidget_UI Form Tag Cancel Avbryt Ok SongEditorPatternList Copy Kopiera Delete Ta bort Fill/Clear ... Fyll/Rensa ... Properties Egenskaper Save Pattern Load Pattern Open Pattern Hydrogen Pattern (*.h2pattern) Virtual Pattern Pattern 1 not_categorized The pattern-file exists. Overwrite the existing pattern? &Ok &Cancel &Avbryt Export Pattern SongPropertiesDialog Song properties Sång egenskaper SongPropertiesDialog_UI Song name Låt namn Author Upphovsman Notes Anteckningar &Cancel &Avbryt Form1 &OK Alt+O Alt+C License SoundLibraryExportDialog Export Sound Library Directory SoundLibraryExportDialog_UI Dialog Export Exportera Drumkit Component Path Version Browse... 0.9.7 and higher 0.9.6 and lower Cancel Avbryt SoundLibraryImportDialog Sound Library import Sound library Status Updating SoundLibrary list... Installed New Author: %1 Upphovsman: %1 Downloading SoundLibrary... Import drumkit Importera drumkit SoundLibrary imported in %1 An error occurred importing the SoundLibrary. Drumkits Songs Patterns Mönster Drumkit License: %1 Image License: %1 SoundLibraryImportDialog_UI Dialog Internet Update list Sound Library Name Author... Download and install Local file Browse... Install 1 Edit server list Close TextLabel Image License... Drumkit License... SoundLibraryOpenDialog Open Sound Library Load Ladda Cancel Avbryt SoundLibraryPanel Load Ladda Export Exportera Delete Ta bort System drumkits User drumkits &Ok &Cancel &Avbryt Songs Patterns Mönster Error loading song. Kunde inte ladda sång. Properties Egenskaper Warning, the selected pattern will be deleted from disk. Are you sure? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. "%1"is a system drumkit and can't be deleted. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Drumkit deletion failed. Keep The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Double click to expand the list SoundLibraryPropertiesDialog_UI Dialog Name Author Upphovsman Information Save Cancel Avbryt Save changes made to instruments into sound library Drumkit License Image Browse Bläddra Image License SoundLibraryRepositoryDialog Edit repository settings Edit server list URL SoundLibraryRepositoryDialog_UI Dialog Add Delete Ta bort SoundLibrarySaveDialog Save Sound Library Please supply at least a valid name A library with the same name already exists. Do you want to overwrite the existing library? Saving of this library failed. Open Image Image Files (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Name Author Upphovsman Information Cancel Avbryt License Save Image Browse Bläddra Image License SoundLibraryTree Sound library VirtualPatternDialog Select virtual pattern VirtualPatternDialog_UI Dialog OK Cancel Avbryt hydrogen-1.0.0-rc1/data/i18n/hydrogen_uk.ts000066400000000000000000004360501366722712400204120ustar00rootroot00000000000000 AboutDialog <b>Project page</b><br> <b>Сторінка проекту</b><br> About Про програму <b>Website</b><br> <b>Веб-сайт</b><br> <b>Main coder and maintainer:</b><br> <b>Відповідальний за випуск, головний розробник:</b><br> <b>Thanks to:</b> <b>Подяки:</b> <b>Development mailing list</b><br> <b>Список розсилання для розробників:</b><br> AboutDialog_UI About Hydrogen Про Hydrogen A&bout &Про програму &Authors &Автори &License &Ліцензія &OK &Гаразд Alt+O Alt+O ### ### AudioEngineInfoForm Audio Engine Info Звуковий рушій AudioEngineInfoForm_UI Form1 Form1 Playing notes Відтворення нот Process time Час обробки Audio engine state Стан звукового рушія Song state Стан композиції Frames Вибірок Ticks Тіків Buffer size Розмір буфера Sample rate Частота вибірки ### ### Song position Положення в композиції Patterns Патернів Selected pattern Вибраний патерн Selected instrument Вибраний інструмент Connected to З'єднано з Sampler Семплер Synth Синтезатор Sequencer Секвенсер MIDI input Вхід MIDI Name Назва Audio output Звуковий вихід Realtime frames Вибірок в реальному часі AudioFileBrowser Audio File Browser Огляд звукових файлів Size: %1 bytes Розмір: %1 байтів Samplerate: %1 Частота вибірки: %1 s с Name: Назва: Size: Розмір: Samplerate: Частота вибірки: Sample length: Довжина вибірки: Please do not preview samples which are longer than 10 minutes! Намагайтесь не вмикати прослуховування для записів тривалістю більше 10 хвилин! Sample length: Довжина вибірки: Unable to load that sample file. AudioFileBrowser_UI Dialog Діалог Open Відкрити Name: Назва: Samplerate: Частота вибірки: Size: Розмір: Length: Тривалість: Cancel Скасувати Pla&y samples by clicking Відтворювати при &клацанні &Up В&ище &Home &Домівка &Play Sample &Відтворити &Filename to instrument name &Назва файлу в назві інструмента &Stop &Стоп View hidden folders Показати приховані теки Be careful, this change all Layer velocity settings Обережно, всі параметри шару для сили натиску зміняться Set automatic velocity Автоматично призначати силу натиску ComponentMixerLine Mute Приглушити Solo Соло Component name Назва компонента Set instrument volume [%1] Задати гучність інструмента [%1] Director Director Диригент Director_UI Dialog Діалог DonationDialog Donations Підтримка DonationDialog_UI Form Form Donate! Допомогти! Choose random entry. Вибрати випадково. <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> <html><head/><body><p align="justify">Hydrogen - відкритий проект, який розробляється багатьма людьми в їхній вільний час. Зробивши пожертву ви можете сказати тим, хто долучився до роботи, &quot;Дякую!&quot;.</p></body></html> Sebastian Moors (aka mauser): Maintainer / Developer Sebastian Moors (він же mauser): супровідник / розробник Michael Wolkstein (aka wolke): Forum hosting Michael Wolkstein (він же wolke): хостинг форуму Download Importing item failed: %1 Не вдалось імпортувати: %1 DownloadWidget (%1/%2 KiB) - ETA %3 (%1/%2 КіБ) - ETA %3 ExportMidiDialog Export midi SMF1 single: export all instruments to a single track SMF1 multi: export each instrument to separate track SMF0: export all events to one track Midi file (*%1) Export MIDI file Експорт файлу MIDI Directory %1 does not exists The file %1 exists. Overwrite the existing file? Файл %1 вже існує. Перезаписати його? ExportMidiDialog_UI Dialog Діалог Filename &Browse... &Огляд... Alt+B Alt+о Modus: Спосіб: &Export &Експорт Alt+E Alt+е &Close &Закрити Alt+C Alt+т ExportSongDialog Export song Експортувати композицію The file %1 exists. Overwrite the existing file? Файл %1 вже існує. Перезаписати його? Export to a single track Експорт в одну доріжку Both І те, й інше Export to separate tracks Експортувати в окремі доріжки Directory %1 does not exists ExportSongDialog_UI Alt+C Alt+т &Export &Експорт Alt+E Alt+е &Browse... &Огляд... Alt+B Alt+о &Close &Закрити Samplerate in Hz: Частота, Гц: 22050 22050 44100 44100 48000 48000 96000 96000 192000 192000 SampleDepth in Bit: Розрядність вибірки, біт: 8 8 16 16 24 24 32 32 Templates: Шаблони: WAV in CD quality "44,1kHz, 16 bit PCM" WAV з якістю CD: 44,1 КГц, 16-розрядний PCM WAV in ADAT quality "48 kHz, 16 bit PCM" WAV з якістю ADAT: 48 КГц, 16-розрядний PCM WAV in better quality "48 kHz, 24 bit PCM" WAV з покращеною якістю: 48 КГц, 24-розрядний PCM WAV LOFI "22.05kHz, 8 bit PCM WAV низької якості: 22,05 КГц, 8-розрядний PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" WAV з найвищою якістю: 96КГц, 32-розрядний PCM AIFF in CD quality "41 kHz, 16 bit PCM" AIFF з якістю CD: 41 КГц, 16-розрядний PCM AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF з якістю ADAT: 48 КГц, 16-розрядний PCM AIFF in better quality "48 kHz, 24 bit PCM" AIFF з покращеною якістю: 48КГц, 24-розрядний PCM FLAC lossless compressor in good quality "48 kHz" FLAC, без втрат, з хорошою якістю: 48КГц OGG Vorbis loosely compressed in good quality "VBR" Ogg Vorbis, зі втратами, але з хорошою якістю: VBR Interpolation: Інтерполяція: Choose type of interpolation methode Виберіть спосіб інтерполяції Linear Лінійна Cosine За косинусом Third За Тейлором Cubic Кубічна Hermite Ермітова Enable tempo changing Дозволити зміну темпу TimeLine BPM Темп шкали часу Enable use of rubberband's batch processor Використовувати пакетний обробник Rubberband Rubberband Batch Пакет Rubberband 88200 88200 Dialog Діалог Export directory: Тека для експорту: Modus: Спосіб: Choose type of interpolation method FileBrowser %1<br>%2 KHz<br>%3 %4 %1<br>%2 КГц<br>%3 %4 FxMixerLine FX on/off Ефекти увімкн/вимкн Master output Загальний вихід H2Core::SongEditorPanelBpmWidget BPM уд/хв H2Core::SongEditorPanelTagWidget Tag Мітка H2Core::SoundLibraryPropertiesDialog SoundLibrary Properties Властивості звукової бібліотеки This is not possible, you can only save changes inside instruments to the current loaded sound library Ви можете зберігати зміни в інструментах тільки в поточній завантаженій бібліотеці. Warning! Changing the drumkit name will result in creating a new drumkit with this name. Are you sure? Увага! Змінення назви набору спричинить створення нового набору. Ви впевнені? &Ok &Гаразд &Cancel &Скасувати Saving of this drumkit failed. Не вдалось записати набір. Open Image Відкрити зображення Image Files (*.png *.jpg *.jpeg) Файли зображень (*.png *.jpg *.jpeg) HydrogenApp Drumkit loaded: [%1] Завантажено набір: [%1] Song Editor Редактор композицій Instrument + Pattern Інструмент + патерн Mixer Мікшер modified змінено Song saved. Композицію збережено. InstrumentEditor Show instrument properties Показати властивості інструмента Show layers properties Показати властивості шару Random pitch factor Випадковий коеф. висоти тону Filter resonance Резонансний фільтр Attack Атака Decay Перше затухання Sustain Стабільна фаза Release Кінцеве затухання Layer gain Підсилення шару New instrument name Нова назва інструмента Instrument gain Підсилення інструмента Filter Cutoff Фільтр відсікання Layer pitch (Coarse) Тон шару (грубо) Layer pitch (Fine) Тон шару (точно) General Загальні Layers Шари Stop the current playing instrument-note before trigger the next note sample. Зупинити відтворення поточної ноти при переході до вибірки наступної. New component name Назва нового компонента Component name Назва компонента Midi out channel Вихідний канал MIDI Midi out note Вихідна нота MIDI Component volume Гучність компонента Don't change the layers' gain based on velocity Не змінювати підсилення шару на основі сили натиску Select pattern size Вибрати розмір патерна InstrumentLine Clear notes Стерти всі ноти Randomize velocity Випадкова сила натиску Delete instrument Видалити інструмент Fill notes ... Заповнити ноти... Fill all notes Заповнити всі ноти Fill 1/2 notes Заповнити 1/2 Fill 1/3 notes Заповнити 1/3 Fill 1/4 notes Заповнити 1/4 Fill 1/6 notes Заповнити 1/6 Fill 1/8 notes Заповнити 1/8 Mute instrument Приглушити інструмент Solo Соло Copy notes ... Скопіювати ноти... Only for this pattern Лише для цього ритм. рисунка For all patterns Для всіх ритм. рисунків Paste notes ... Вставити ноти... Fill 1/12 notes Заповнити 1/12 Fill 1/16 notes Заповнити 1/16 Rename instrument Перейменувати інструмент New instrument name Нова назва інструмента InstrumentRack Show Instrument editor Показати редактор інструментів Instrument Інструмент Show sound library Показати бібліотеку звуків Sound library Бібліотека звуків LadspaFXMixerLine Edit FX parameters Змінити параметри ефектів FX bypass Обхід ефекту Ladspa FX name Назва ефекту LADSPA Effect return Повернення ефекту LadspaFXProperties Select FX Вибрати ефект [%1] LADSPA FX Properties Властивості ефекту LADSPA [%1] LADSPA FX %1 Properties Властивості ефекту LADSPA %1 No plugin Немає додатка Activate Увімкнути Deactivate Вимкнути Remove FX Видалити ефект LadspaFXSelector Groups Групи Stereo Стерео Mono Моно Not supported Не підтримується Select LADSPA FX Виберіть ефект LADSPA Recently Used Недавно використані Alphabetic List Алфавітний список Categorized За категоріями LadspaFXSelector_UI &Cancel &Скасувати Alt+C Alt+т &OK &Гаразд Alt+O Alt+O Form1 Form1 ### fx label ### fx label ### fx type ### fx type ### fx ID ### fx ID 1 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Назва:</span></p></body></html> ### fx name 1 ### fx name 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Мітка:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Тип:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Автор:</span></p></body></html> ### FX maker 1 2 ### FX maker 1 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Авторські права:</span></p></body></html> ### copyright 1 2 3 ### copyright 1 2 3 LayerPreview Dec. = %1 MIDI = %2 Дес. = %1 MIDI = %2 MainForm Error loading song. Помилка при завантаженні композиції. Hydrogen Ready. Hydrogen готовий до роботи. &Save &Записати &Discard &Відмовитися від змін Cancel Скасувати Save song Записати композицію Open song Відкрити композицію &New &Створити &Open &Відкрити Open &Demo Відкрити &демо Open &recent Н&едавні композиції Save &as... Записати &як... Export &MIDI file Е&кспортувати MIDI-файл &Preferences &Параметри Hydrogen &Quit В&ихід Show &audio engine info Показати дані &звукового рушія &User manual &Посібник користувача &About &Про програму &Cancel &Скасувати Unknown audio driver Невідомий звуковий драйвер Error starting audio driver Помилка при завантаженні звукового драйвера Jack driver: server shutdown Драйвер JACK: сервер зупинено Jack driver: cannot activate client Драйвер JACK: неможливо активувати клієнт Jack driver: cannot connect output port Драйвер JACK: неможливо з'єднатися з портом виходу Jack driver: error in port register Драйвер JACK: помилка при реєстрації порту &Export song &Експортувати композицію De&bug Налаго&дження &Mixer &Мікшер &Instrument Rack &Стійка інструментів Print Objects Надрукувати об'єкти &Info &Довідка Song saved. Композицію збережено. Unknown error %1 Невідома помилка %1 Clear all instruments? Очистити всі інструменти? Ok Гаразд Could not save song. Не вдалось зберегти композицію. You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.<br><br>Thank you! Ви користуєтеся нестабільною версією Hydrogen. Допоможіть нам покращити її, надаючи до списку розсилання hydrogen-devel свої звіти про помилки і пропозиції. <br><br>Дякуємо! Don't show this message anymore Більше не показувати це повідомлення Open &Pattern Відкрити &патерн Save Pattern as ... Зберегти патерн як... Pattern saved. Патерн збережено. Open Pattern Відкрити патерн Show &info &Показати інформацію... Expor&t pattern as... Е&кспортувати патерн як... I&nstruments &Інструменти &Add instrument &Додати інструмент &Clear all О&чистити все Playlist &editor &Редактор списків відтворення Playlist: Set song No. %1 Список відтворення: Задати номер композиції %1 Song saved as. Композицію збережено з іншою назвою. Playlist: Song No. %1 Список відтворення: композиція №%1 Could not export pattern. Не вдалось експортувати патерн. The document contains unsaved changes. Do you want to save the changes? Деякі зміни в композиції не були збережені. Бажаєте зберегти їх перед виходом? Info|About Director Диригент Undo history Історія дій &Undo &Дії menu Undo Скасувати Redo Повернути Input mode Режим введення Instrument Інструмент Drumkit Набір Report bug Повідомити про помилку Export &LilyPond file Експортувати у формат &LilyPond Donate Допомогти LilyPond file (*.ly) Файл LilyPond (*.ly) Export LilyPond file Експорт у файл LilyPond The current playlist contains unsaved changes. Do you want to discard the changes? Поточний список відтворення містить не збережені зміни. Бажаєте відмовитись від змін? Pro&ject Прое&кт Drum&kits &Набори перкусії New Створити Open Відкрити Properties Властивості Save Зберегти Save As Зберегти як Export Експортувати Import Імпортувати Online import Імпортувати онлайн Add component Додати компонент &View &Перегляд &Automation path &Шлях автоматизації Full screen На весь екран &Options &Параметри Component name Назва компонента Saving of this library failed. Не вдалось зберегти цю бібліотеку. MIDI setup advice Порада з налаштування MIDI MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values? Для цього набору перкусії не налаштовані вихідні ноти MIDI, тому експорт цієї композиції у файл MIDI може бути невдалим. Бажаєте, щоб Hydrogen автоматично виправив це, призначивши типові значення? Set default values Встановити типові значення The LilyPond export is an experimental feature. It should work like a charm provided that you use the GM-kit, and that you do not use triplet. Можливість експорту у формат LilyPond - експериментальна. Вона має гарно працювати, якщо ви використовуєте GM-kit, і не використовуєте тріолі. &Timeline &Playback track Jack driver: cannot disconnect client OSC Server: Cannot connect to given port, using temporary port instead Retrieving information about drumkit '%1' failed: drumkit does not exist. MasterMixerLine Set master volume [%1] Задати загальну гучність [%1] Swing Свінг Humanize time Олюднити час Humanize velocity Олюднити силу Set humanize time parameter [%1] Встановити параметр «людського» часу [%1] Set humanize velocity parameter [%1] Встановити параметр «людської» сили натиску [%1] Set swing factor [%1] Встановити свінг-фактор [%1] MidiSenseWidget This element is not midi operable. Цей елемент не обробляється в MIDI. Waiting for midi input... Очікування вводу MIDI... MidiTable Event Подія Param. Парам. Action Дія press button to record midi event натисніть кнопку для запису MIDI-події Mixer Show FX panel Показати панель ефектів Show instrument peaks Показувати піки інструментів Show instrument peaks = On Показ піків інструментів = Увімкн Show instrument peaks = Off Показ піків інструментів = Вимкн Set FX %1 level Задати рівень ефекту %1 Set LADSPA FX ( %1 ) volume Задати рівень ефекту LADSPA (%1) LADSPA effects are not available in this version of Hydrogen. В цій версії Hydrogen не доступні ефекти LADSPA. Mixer Мікшер MixerLine Play sample Відтворити вибірку Mute Приглушити Solo Соло Pan Панорама Instrument name (double click to edit) Назва інструмента (для зміни - двічі клацнути) Set instrument volume [%1] Задати гучність інструмента [%1] Set instr. pan [%1] Задати пан. інстр. [%1] PatternEditorPanel Hear new notes Слухати нові ноти Hear new notes = On Слухати нові ноти = Увімкн Hear new notes = Off Слухати нові ноти = Вимкн Pattern editor - %1 Редактор патернів — %1 Quantize keyboard/midi events to grid Квантувати події з клавіатури/MIDI за сіткою Quantize incoming keyboard/midi events = On Квантування вхідних подій з клавіатури/MIDI = Увімкн Quantize incoming keyboard/midi events = Off Квантування вхідних подій з клавіатури/MIDI = Вимкн Zoom in Збільшити Zoom out Зменшити Is not possible to change the pattern size when playing. Під час відтворення розмір патерна змінювати не можна. Select pattern size Вибрати розмір патерна Select grid resolution Вибрати роздільність сітки No pattern selected Не вибрано жодного патерна Select note properties Вибрати властивості ноти Velocity Сила натиску Pan Панорама Lead and Lag Зміщення в часі Loaded Soundlibrary Завантажена бібліотека звуків destructive mode pre delete settings параметри деструктивного режиму перед стиранням destructive mode post delete settings параметри деструктивного режиму після стирання Show piano roll editor Показати матричний редактор NoteKey Висота тону Show drum editor Показати редактор перкусії Probability Ймовірність PatternFillDialog Fill with selected pattern Заповнити вибраним патерном PatternFillDialog_UI Alt+C Alt+т Cancel Скасувати Form 1 Form 1 &Fill &Заповнити Alt+F Alt+з &Clear О&чистити From: Від: To: До: OK Гаразд PatternPropertiesDialog Pattern properties Властивості патерна %1#2 %1#2 %1 %1 PatternPropertiesDialog_UI &Cancel &Скасувати Alt+C Alt+т &OK &Гаразд Alt+O Alt+O New Pattern Name Нова назва патерна Form1 Form1 Pattern category Категорія патерна Pattern description Опис патерна PlayerControl Stop Зупинити Song Mode Режим композиції Playing. Відтворюється. Stopped. Зупинено. Song mode selected. Вибрано режим композиції. Pattern Mode Режим патерна Pattern mode selected. Вибрано режим патерна. Jack-transport on/off Перемикання транспорту JACK Jack-transport mode = On Режим JACK-транспорт = Увімкн Jack-transport mode = Off Режим JACK-транспорт = Вимкн New BPM value Нове значення уд/хв Rewind Назад Play/ Pause Грати/Призупинити Fast Forward Вперед Pause. Призупинено. JACK-transport will work only with JACK driver. Транспорт JACK працює лише з драйвером JACK. Loop song Зациклити композицію Loop song = On Зациклення композиції = Увімкн Loop song = Off Зациклення композиції = Вимкн Show mixer Показати мікшер Mixer Мікшер Show Instrument Rack Показати стійку інструментів Instrument rack Стійка інструментів BeatCounter Panel on Увімкнути панель лічильника бітів Set BPM / Set BPM and play Задати уд/хв / задати уд/хв і грати Jack-Time-Master on/off Режим Jack-Time-Master увімкн/вимкн BC Panel on Увімкнути панель лічильника бітів BC Panel off Вимкнути панель лічильника бітів Count BPM and start PLAY Підрахувати уд/хв і почати грати Count and set BPM Підрахувати і встановити уд/хв Jack-Time-Master mode = On Режим Jack-Time-Master = Увімкн Jack-Time-Master mode = Off Режим Jack-Time-Master = Вимкн Record Запис Destructive Record Руйнівний запис Record midi events = On Запис подій MIDI = Увімкн Record midi events = Off Запис подій MIDI = Вимкн Destructive mode = Off Руйнівний режим = Вимкн Destructive mode = On Руйнівний режим = Увімкн Recalculate Rubberband modified samples if bpm will change Переобчислити вибірки, змінені Rubberband, якщо змінилися уд/хв Recalculate all samples using Rubberband ON Переобчислити всі вибірки з використанням Rubberband Увімкн Recalculate all samples using Rubberband OFF Переобчислити всі вибірки з використанням Rubberband Вимкн Switch metronome on/off Перемкнути чутність метронома PlaylistDialog Song list Список композицій Script Сценарій exec Script Виконати сценарій Add Song to PlayList Додати композицію в список No Song selected! Не вибрано жодної композиції! Load Playlist Завантажити список Save Playlist Зберегти список No Song in List or no Song selected! Немає вибраних композицій! Hydrogen Playlist (*.sh) Список відтворення Hydrogen (*.sh) Add Script to selected Song Додати сценарій у вибрану композицію No Script in use! Немає використовуваного сценарію! No Default Editor Set. Please set your Default Editor Do not use a console based Editor Sorry, but this will not work for the moment. Не задано типового редактора. Задайте типовий редактор. Не використовуйте редактор на базі консолі. На жаль, наразі це не працює. Set your Default Editor Задайте типовий редактор No Script selected! Не вибрано жодного сценарію! Error loading song. Помилка при завантаженні композиції. sort упорядкувати New Script Створити сценарій No Script! Немає сценарію! Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must without whitespaces. Назва сценарію або шлях до нього містить пропуски. ВАЖЛИВО Назва сценарію і шлях до нього не повинні містити пропусків. &Playlist &Список відтворення Add song to Play&list &Додати композицію до списку відтворення Add &current song to Playlist Додати &поточну композицію до списку &Remove selected song from Playlist &Вилучити поточну композицію зі списку &Open Playlist &Відкрити список &Save Playlist &Зберегти список Save Playlist &as Зберегти список &як &Scripts С&ценарії &Add Script to selected song &Додати сценарій у вибрану композицію &Edit selected Script &Змінити вибраний сценарій &Remove selected Script &Вилучити вибраний сценарій &Create a new Script &Створити новий сценарій Rewind Назад Play/ Pause/ Load selected song Відтворити/ Зупинити/ Завантажити вибрану композицію Stop Зупинити Fast Forward Вперед Please save your song first Спочатку збережіть композицію WARNING, the new file is executable by the owner of the file! УВАГА, новий файл містить біт виконання його власником! Pause. Призупинено. Playlist Browser Оглядач списку відтворення Playlist: set song no. %1 Список відтворення: Задати номер композиції %1 no Script немає сценарію &New Playlist &Створити список File not found: Файл не знайдено: No valid song selected! Не вибрано коректної композиції! The current playlist contains unsaved changes. Do you want to discard the changes? Поточний список відтворення містить не збережені зміни. Бажаєте відмовитись від змін? &Discard &Відмовитися від змін &Cancel &Скасувати Script name or path to the script contains whitespaces. IMPORTANT The path to the script and the scriptname must be without whitespaces. Назва сценарію або шлях до нього містить пропуски. ВАЖЛИВО Назва сценарію і шлях до нього не повинні містити пропусків. PlaylistDialog_UI PlayList Browser Оглядач списку відтворення Song list Список композицій PreferencesDialog Slow Повільно Normal Нормально Fast Швидко <b>Open Sound System</b><br>Simple audio driver [/dev/dsp] <b>Open Sound System</b><br>Звичайний звуковий драйвер [/dev/dsp] <br><b><font color="red">Not compiled</font></b> <br><b><font color="red">Не скомпільовано</font></b> <b>Jack Audio Connection Kit Driver</b><br>Low latency audio driver <b>Драйвер Jack Audio Connection Kit</b><br>Низьколатентний звуковий драйвер Preferences Параметри <b>ALSA Driver</b><br> <b>Драйвер ALSA</b><br> <b>PortAudio Driver</b><br> <b>Драйвер PortAudio</b><br> <b>CoreAudio Driver</b><br> <b>Драйвер CoreAudio</b><br> Please restart hydrogen to enable/disable LASH support Перезапустіть Hydrogen, щоб увімкнути або вимкнути підтримку LASH Driver restart required. Restart driver? Потрібно перезапустити драйвер. Перезапустити? &Ok &Гаразд &Cancel &Скасувати <b>PulseAudio Driver</b><br> <b>Драйвер PulseAudio</b><br> Automatic Автоматично Steps Покроково Fixed Фіксовано Number of steps Число кроків Color (Hue value) Колір (тон) Automatic driver selection <br><b> </b> selected PreferencesDialog_UI Sample rate Частота вибірки 44100 44100 48000 48000 Buffer size Розмір буфера Device Пристрій Input Вхід Channel Канал All Всі 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 Meters falloff speed Швидкість спадання індикаторів Slow Повільно Normal Нормально Fast Швидко Application font Шрифт застосунку Mixer font Шрифт мікшера Select font Вибрати шрифт Polyphony Поліфонія Style Стиль &Cancel &Скасувати Alt+C Alt+т &OK &Гаразд Alt+O Alt+O &General &Загальні Alt+R Alt+З Audio &System З&вукова система Metronome volume Гучність метронома Connect to &Default Output Pair З'&єднатися зі звичайною парою виходу Alt+D Alt+Є 88200 88200 96000 96000 &Midi System MIDI-с&истема Midi driver Драйвер MIDI Ignore note-off Нехтувати note-off &Appearance Виг&ляд Form1 Form1 &Reopen last used song Від&кривати останню композицію ### ### Restart output Перезапустити виведення Audio output details Подробиці про виведення звуку Post-Fader Постфейдер Pre-Fader Префейдер Track output Виведення доріжки Use lash Використати LASH first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm перший крок: виправлення часової неузгодженості між затримкою перемикання контролера/клавіатури і розрахованими уд/хв Beat counter drift compensation in 1/10 ms Компенсація зсуву лічильника бітів, х1/10 мс Beat counter start offset in ms Початковий зсув лічильника бітів, мс Path to the Rubberband command-line utility Шлях до утиліти Rubberband Maximum number of bars Найбільше число тактів &Reopen last used playlist &Повторно відкривати останній список відтворення Interpolate resampling Інтерполяція при перевибірці Linear Лінійна Cosine За косинусом Third За Тейлором Cubic Кубічна Hermite Ермітова Default interface layout Типова розкладка інтерфейсу Single pane В одну панель Tabbed Зі вкладками TextLabel Напис Coloring method for Song Editor elements Спосіб фарбування в редакторі композицій <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> <html><head/><body><p><span style=" font-style:italic;">Після змінення шрифту або розкладки інтерфейсу програму слід перезапустити.</span></p></body></html> Use relative paths for playlist Використовувати для списків відтворення відносні шляхи Use output note as input note Використовувати вихідну ноту як вхідну Discard midi messages after action has been triggered Нехтувати midi-повідомлення після перемикання дії Create per-instrument outputs Вивести кожен інструмент окремо Enable feedback Увімкнути зворотний зв'язок &OSC &OSC Incoming port Вхідний порт <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> <html><head/><body><p>Порт, який використовується для отримання повідомлень OSC</p></body></html> Enable OSC &feedback Увімкнути зворотний зв'язок OSC &Enable OSC support Увімкнути підтримку OSC second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup Maximum number of instrument layers Maximum number of layers (requires restart of Hydrogen) Output Enable midi feedback SampleEditor &Ok &Гаразд &Cancel &Скасувати Close dialog! maybe there is some unsaved work on sample. Are you sure? Закрити діалог! Можливо, залишилась якась незбережена робота. Ви впевнені? Unsaved changes left. These changes will be lost. Are you sure? SampleEditor_UI Dialog Діалог P&lay original sample &Зіграти початковий зразок &Apply Changes &Застосувати зміни &Close &Закрити Adjust sample start frame Скоригувати кадр початку зразка Adjust sample loop begin frame Скоригувати кадр початку повтору зразка set processing задати обробку forward вперед reverse назад pingpong туди-сюди loops повтори Adjust sample end & loop end frame Скоригувати кадр кінця зразка і кінця повтору &Play &Програти new sample length: нова довжина вибірки: fade-out type тип згасання volume гучність panorama панорама Sample length to beat: Довжину семплу до долі: off вимкн 1/64 1/64 1/32 1/32 1/16 1/16 1/8 1/8 1/4 1/4 1/2 1/2 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 Pitch the sample in semitones, cents Змінити висоту тону в напівтонах, сотих Crispness: Чіткість: 0 0 Start Початок Loop Петля <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Режим</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">повтору</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Число</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">повторів</span></p></body></html> End Кінець "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. "Звуковий процесор Rubberband" : Змінення темпу (тривалості семплу) і висоти звуку. Pitch (Semitone,Cent) Висота тону (напівтони, соті) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Рівні "чіткості":</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 еквівалентно --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 еквівалентно --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 еквівалентно --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 еквівалентно --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 типові параметри обробки</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 еквівалентно --no-lamination --window-short (може підійти для барабанів)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Більше про це можна прочитати тут:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> SimpleHTMLBrowser Manual Посібник користувача Welcome to Hydrogen Знайомство з Hydrogen Don't show this message anymore Більше не показувати це повідомлення Ok Гаразд Documentation index Зміст SongEditorPanel Create new pattern Створити новий патерн Move the selected pattern down Опустити вибраний патерн Move the selected pattern up Підняти вибраний патерн Clear pattern sequence Стерти дані патерна Song Editor Редактор композицій Select mode Режим вибору Draw mode Режим малювання Warning, this will erase your pattern sequence. Are you sure? Увага, всю послідовність патернів буде видалено. Ви впевнені? &Ok &Гаразд &Cancel &Скасувати stacked mode стековий режим stacked pattern mode режим стеку патернів single pattern mode режим одного патерна Pattern %1 Патерн %1 Enable time line edit Увімкнути редагування шкали часу View playback track Показати доріжку, що відтворюється Mute playback track Приглушити доріжку, що відтворюється Choose playback track Вибрати доріжку, що відтворюється View timeline Показати шкалу часу Adjust parameter values in time Змінювати з часом значення параметрів Velocity Сила натиску Timeline usage is disabled in the presence of an external JACK timebase master SongEditorPanelBpmWidget_UI Form Форма Edit the bpm value for current beat Змінити значення уд/хв для поточної долі 500,55 500,55 Edit beat in timeline Вказати долю на шкалі часу 500 500 Bar Такт BPM уд/хв Delete this BPM Marker Видалити цей маркер уд/хв Delete BPM Marker Видалити маркер уд/хв Cancel Скасувати Ok Гаразд SongEditorPanelTagWidget_UI Form Форма Tag Мітка Cancel Скасувати Ok Гаразд SongEditorPatternList Copy Копіювати Delete Видалити Properties Властивості Fill/Clear ... Заповнити/Очистити ... Save Pattern Зберегти патерн Load Pattern Завантажити патерн Open Pattern Відкрити патерн Pattern 1 Патерн 1 not_categorized Без категорії Virtual Pattern Віртуальний патерн The pattern-file exists. Overwrite the existing pattern? Такий файл патерна вже є. Перезаписати його? &Ok &Гаразд &Cancel &Скасувати Export Pattern Експортувати патерн Could not export pattern. Не вдалось експортувати патерн. Could not export sequence. Pattern saved. Патерн збережено. SongPropertiesDialog Song properties Властивості композиції SongPropertiesDialog_UI Notes Ноти Author Автор Song name Назва композиції &Cancel &Скасувати Alt+C Alt+т &OK &Гаразд Alt+O Alt+O Form1 Form1 License Ліцензія SoundLibraryExportDialog Export Sound Library Експортувати бібліотеку звуків Directory Тека SoundLibraryExportDialog_UI Dialog Діалог Export Експорт Drumkit Набір Component Компонент Path Шлях Version Версія Browse... Огляд... 0.9.7 and higher 0.9.7 і вище 0.9.6 and lower 0.9.6 і нижче Cancel Скасувати SoundLibraryImportDialog Sound Library import Імпорт бібліотеки звуків Sound library Бібліотека звуків Status Стан Updating SoundLibrary list... Оновлення списку звукових бібліотек... Installed Встановлено New Нова Author: %1 Автор: %1 Downloading SoundLibrary... Звантаження бібліотеки звуків... Import drumkit Імпортувати набір SoundLibrary imported in %1 Бібліотеку звуків імпортовано в %1 An error occurred importing the SoundLibrary. Під час імпорту бібліотеки звуків трапилась помилка. Drumkits Набори перкусії Songs Композиції Patterns Патернів Drumkit License: %1 Ліцензія набору: %1 Image License: %1 Ліцензія зображення: %1 SoundLibraryImportDialog_UI Dialog Діалог Internet Інтернет Update list Оновити список Sound Library Name Назва бібліотеки звуків Author... Автор... Download and install Звантажити і встановити Local file Локальний файл Browse... Огляд... Install Встановити 1 1 Edit server list Змінити список серверів Close Закрити TextLabel Напис Image License... Ліцензія зображення... Drumkit License... Ліцензія набору... SoundLibraryOpenDialog Open Sound Library Відкрити бібліотеку звуків Load Завантажити Cancel Скасувати SoundLibraryPanel Load Завантажити Delete Видалити Export Експорт System drumkits Системні набори User drumkits Користувацькі набори &Ok &Гаразд &Cancel &Скасувати Songs Композиції Patterns Патернів Error loading song. Помилка при завантаженні композиції. Properties Властивості Warning, the selected pattern will be deleted from disk. Are you sure? Попередження: вибраний патерн буде видалено з диска. Ви впевнені? It is not possible to delete the currently loaded drumkit: "%1". To delete this drumkit first load another drumkit. Неможливо видалити завантажений набір: "%1". Для видалення цього набору слід завантажити інший набір. "%1"is a system drumkit and can't be deleted. "%1" - системний набір, тому не може бути видалений. Warning, the "%1" drumkit will be deleted from disk. Are you sure? Увага, набір "%1" буде видалено з диска. Впевнені? Drumkit deletion failed. Не вдалось видалити набір. Keep Залишити The existing kit has %1 instruments but the new one only has %2. The first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes. Would you like to keep or discard the remaining instruments and notes? Наявний набір має %1 інструментів, а новий - лише %2. Перші %2 інструментів буде замінено новими інструментами і будуть збережені їхні ноти, .але деякі з решти інструментів мають ноти. Залишити чи вилучити решту інструментів і нот? Double click to expand the list Двічі клацніть, щоб розширити список SoundLibraryPropertiesDialog_UI Dialog Діалог Name Назва Author Автор Information Інформація Save Зберегти Cancel Скасувати Save changes made to instruments into sound library Зберегти в бібліотеці зміни, внесені в інструменти Drumkit License Ліцензія набору Image Зображення Browse Огляд Image License Ліцензія зображення SoundLibraryRepositoryDialog Edit repository settings Змінити параметри сховища Edit server list Змінити список серверів URL Адреса SoundLibraryRepositoryDialog_UI Dialog Діалог Add Додати Delete Видалити SoundLibrarySaveDialog Save Sound Library Зберегти бібліотеку звуків Please supply at least a valid name Вкажіть принаймні коректну назву A library with the same name already exists. Do you want to overwrite the existing library? Бібліотека з такою назвою вже є. Перезаписати наявну бібліотеку? Saving of this library failed. Не вдалось зберегти цю бібліотеку. Open Image Відкрити зображення Image Files (*.png *.jpg *.jpeg) Файли зображень (*.png *.jpg *.jpeg) SoundLibrarySaveDialog_UI Dialog Діалог Name Назва Author Автор Information Інформація Cancel Скасувати License Ліцензія Save Зберегти Image Зображення Browse Огляд Image License Ліцензія зображення SoundLibraryTree Sound library Бібліотека звуків VirtualPatternDialog Select virtual pattern Виберіть віртуальний патерн VirtualPatternDialog_UI Dialog Діалог OK Гаразд Cancel Скасувати hydrogen-1.0.0-rc1/data/i18n/stats.py000077500000000000000000000027541366722712400172370ustar00rootroot00000000000000#!/usr/bin/env python ## Python script checking the coverage of the translation files. import os import re from xml.dom import minidom, Node def parse_ts(filename): doc = minidom.parse(filename) root_node = doc.documentElement total = 0 unfinished = 0 obsolete = 0 for node in root_node.childNodes: if node.nodeName == "context": context_node = node for context_child in context_node.childNodes: if context_child.nodeName == "message": message_node = context_child for message_node_child in message_node.childNodes: if message_node_child.nodeName == "translation": #print "translation" translation_node = message_node_child total += 1 if translation_node.attributes: translation_type = translation_node.attributes["type"].value #print translation_type if translation_type == "unfinished": unfinished += 1 elif translation_type == "obsolete": obsolete += 1 #print "Total: %d" % (total - obsolete) #print "obsolete %d" % obsolete #print "Unfinished: %d" % unfinished completed = (total - obsolete) - unfinished perc = 100.0 / (total - obsolete) * completed print( "|| %s\t|| [%d/%d]\t|| %d%%\t||" % (filename, completed, total - obsolete, perc)) ## Loop over all files in the current directory patternTs = re.compile(r'(.*?)(\.ts)$') for ffile in os.listdir(os.getcwd()): match = patternTs.match(ffile) if match != None: parse_ts(ffile) hydrogen-1.0.0-rc1/data/i18n/updateTranslations.sh000077500000000000000000000021241366722712400217360ustar00rootroot00000000000000#!/bin/sh echo "Updating translation (*.ts) files" cd ../../src/gui if [ "$QTDIR" ]; then LUPDATE="$QTDIR/bin/lupdate" LRELEASE="$QTDIR/bin/lrelease" else LUPDATE=$(which lupdate) LRELEASE=$(which lrelease) fi; UI=`find . | grep "\.ui$"` CPP=`find . | grep "\.cpp$"` H=`find . | grep "\.h$"` FILES="$UI $CPP $H" CMD="$LUPDATE -noobsolete ${FILES} -ts" $CMD ../../data/i18n/hydrogen_it.ts $CMD ../../data/i18n/hydrogen_es.ts $CMD ../../data/i18n/hydrogen_ru.ts $CMD ../../data/i18n/hydrogen_fr.ts $CMD ../../data/i18n/hydrogen_pt_BR.ts $CMD ../../data/i18n/hydrogen_hu_HU.ts $CMD ../../data/i18n/hydrogen_pl.ts $CMD ../../data/i18n/hydrogen_nl.ts $CMD ../../data/i18n/hydrogen_ja.ts $CMD ../../data/i18n/hydrogen_de.ts $CMD ../../data/i18n/hydrogen_sv.ts $CMD ../../data/i18n/hydrogen_hr.ts $CMD ../../data/i18n/hydrogen_cs.ts $CMD ../../data/i18n/hydrogen_el.ts $CMD ../../data/i18n/hydrogen_gl.ts $CMD ../../data/i18n/hydrogen_sr.ts $CMD ../../data/i18n/hydrogen_ca.ts $CMD ../../data/i18n/hydrogen_uk.ts echo "Creating *.qm files" cd ../../data/i18n $LRELEASE *.ts echo "Stats" ./stats.py hydrogen-1.0.0-rc1/data/img/000077500000000000000000000000001366722712400155115ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/000077500000000000000000000000001366722712400164535ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/about/000077500000000000000000000000001366722712400175655ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/about/aboutLogo.png000066400000000000000000000231751366722712400222360ustar00rootroot00000000000000PNG  IHDRd<tbKGD pHYs  tIME">6 IDATxwx' AD[bYeI;ǛvNKnMr۽\6)ώ[ֱ8r(VDQl` DP<33ٺ~B!sRB! B!P0A! &!B!BB`B!LB! B! &!B!B( BB!LB! B!P0A! &!B( BB`re<6_~[P!yQ(5,V,wlGeE)$ x rSB( DOݏ|̶>zx}~ _gp-7C"DQL!P0AE:W.Nٖk3ϽHĴ@B BB`B!LB! B!4h+ˢR;n9&Riy>Bw^{MY!BJh_㟠V!&}~?FGӏ7vήyopf~ᑴ,e3~㻘&;0dAP$= tMhЧ6рoEEy)l(r0 .;:#k0m(.*9'JeC!8N[8v4#r zc(/+ٜ JR x)j5غej!ל Z6A\ 011a=vIz,ZMy9h`Y65ta`p'O7cSP0Ayyf|c⚤ FTWUbx])=9CAA^ǂ &rlx?= ȗ:sV΂B.O;ovw;Ω:~k>v؎; Lvz:- nJ7]\oۡÌZEEXjq'~Oq<6o\ %ÐSiQP7.{?90_װ < ddt^yyfܰb)vܽ xL9'$B#eYH},K;|< f>xMm[7;)HWC*<)W_m޼޽mNĥAyY ׬^1@"Z~~.أ3~I-}9Ѳ3ؗAiiqk->3@"^-?0jD( ן[6GmMռcnIJ+5okjk%`,r?y_Z[u¾#;5%Ņm18`w7>d E z|y\j }+r&j f q^ I! br9֬'N5Az%8HJELZR)V\~U7nh[#!b8 q 8.࠶fQ&Q#AE"ݼ~mܾ楄Tcaj )/+q)A! rMP*u1C!M-ݓTd4Y8`p48oBu(@&=4gge}_)%1~3ۓT!ל%ŅIUU ~45嚊DŽ`ö9N /u`j qspAYiQg:T 7<"ns/1xI$0y1j2&s,Qҟ_Ǒ#'᜘Hx, hnU+"=F_ٙqo5qp:'JL,456nh7G ';}Vz@ &!+3~m0lAggWo:-VGڕ(×-,[Q&r\CxѸ@Jwyy1/W^ۍW_{3wu6<۟-^ f۞/rzsJ(/ozmi߈> |T MQQ~O)Bw/Nn3O>FQ#},Kel0qL v=lJÉSMxrϐix壩uf[ =}~uhjnEYi1J".`,j@# V3EO=D| '?U ALǎP&x<8w+4>zP(,Y0D{aw81::{*-*Q5Q!ty'lj4Q|6A'=.3i_ϖmY0vhZ䡶 nـ\3&].V#=o~1<| U0<i9ܿѶ0 kZ0+MLEBJpg6PSi@aS;B.WDzlD]@fxpEy$ reKbe2x}~CRn^&!V03xg" •ˏN\{它8k0L,ɔ :„R04R3`|HxO[C[۹uq{~_)5릆Uxߟx ˲X%E1wvuSf &I_;!C ő')3^r|~<>N" z8t +׃$~oj`hF9(qΣ2蓹#"BZB!v? zښ|x d^$Q٤!p~Sؼ香aq55AۑcOG4]sEDw=drYǒHؘS1 B.OSVeYJEyKcK'zGDF dGA_=Ĕ J yMش!y㊥ZaWѣ'e1O6B15%^|5P3Y 6 ܶuLL芊 ܊`Hc +qǶ-11xr^ Fq|;nQOi5Ou0%3Jy%-TQ%}Nj@?Nz?c;V\4GF㷿C0LěnU봳h,<|X+#8kl7tM֞B5C嚂5ZP)}r v 6mX7ѨL06m̓C6TEl4៿wp8x}q[ER{`b`(N Waw&Ony55+Xqstt|鵄˪;{7v#nz^/_Hgi^x>ׯ}+l`"LK0߅ޗ( ݂ӵgwE^d<N9{bxW//|z/7SSn귿GwO__[8x'7,S3-8sUQg/$LdAP3YP'N53~ 6R᥽giEP@v~ ݸ/  &q;_0cv8} {|l^{F C"$sB!(: #^~b YWE  =ơ#s/•`-q>of.sX7bdd O? +N\&KދyvqIr%^rp? jY> 28NX~JyirMwWܧPoBT*My>IN291Ŷ HH8.\SϼGÈ,(fEr%, Fܜ: 2£JK =@WWw%ʊ҈LLp+~*%rQlN)LJq;~o!''뒠(G>59Jfڔ5dadd,噑{I? χ#Vu \;6fSm\#7 ^t@ ÉO

?lB ,H98zԼ]к) :R)e5`.fB( 䪓xhS᪭},̀(sI5sr:|GYrMEt# m릈~" sxJݰoZN"I @V#?V8Nd p]Ahrfs6r1o|>߂L5N^kW}s\Fq㊥0󲿞>Z4Q B権e_v^}}51!{e_~W) B'QtwuTYTqO ^wߘ &C"aߗh(,,D__&θRDQAKz@bbb/\ `\ ߊ`(U`qט7Y99Xz- C%qHAa!zFGF1>6:U*t_Lbe`$ z9.|^o Lj͆gf h:} KwA qqZ1Ô^c>sÿ8x}LNN#;y+ $e1(+ wnHV>fG{K} +I@ C'n3ls3A$ܞԱpFcvCEl+**˲IX"fC `0 MlĢj0`tv{)59-:wAx99rcxp  ]7vѲeC0$T3AuAAA~Nå475fdCQ}1[vhpy˃jEuu8/#?<QRR z(J"$1s b_ٹs:)gfgZ-6Y1`Y |d3hF|….T/Yх_jYJ4x<*#3&Sua_ZV@ ёQ&mh!ZTUUd2AB!W>NB==L;:ўXΨ /GjNtD6/RX\8bp:ND$%UJ0 aPxI缌GfVF^Riz=l3rQaj(…˖@qQ0< ''w M1;^ϗR)J\&/cjDx^%y#~!y<^oA`~i%OBg^ v>XV҂j5.8lظ:| C!=8''g"vM9XD,;J8 42B-IDATڹP(!"`MtmF|JP^VZ4FuXW˰ x<j(drئj~䢸Gm~y˃ɉpM[:è} CX[ZS>.tڈҩR\[X\ Z渇uH"ktt)4K\遘}XFa$ݍVCQctdǏTdq}=:=8B\5 tSµ@)W_F<ƹD@`6 33EF1fB vڂˆIazZ;E >\8~& H% 0ElAeeQUCEdEAi;ƶN__:<2,j &C9L)k򞶏CR~?Y!>\g 7Mqq&TէUQ.ךpE\~AwVZCEB5$}u!q&558}S.0ذq[Pe hmV EII JJJ{ (((FQQ{^j&\. #3oހ6(J.MQޠǦ[ Q/Is ހuBvN̹\ang! !rE^ 4 VZۨ y3}@50VCR'iSSdhhX37QRT ̡HgNFII)KK!B fszJ2?paܞs'*-^Gtpq&"T3A ;'"D&0&.,,l߾FAo0`ժ5$D0$2NOw7X&[w3 ܄)Rd~n0L&VY;ӳؑ#qKنiq+rJ(rX}8vhcymL&UkWlFOdfd"3#&T*X 14v҉9r0B rrQ&cN8yM~+D!t W*h1:b y`&(] TgtzlV>*x׏ϳ1$,X sz&)'6ۢg*N~;Ζ6`4fpF+_'Y*97kΉIz &!0B!LB! B!P0A! &!B( BB`B!LB!P0A! &!r Ucp/IENDB`hydrogen-1.0.0-rc1/data/img/gray/audiFileBrowser/000077500000000000000000000000001366722712400215415ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/audiFileBrowser/go-home.png000066400000000000000000000020451366722712400236030ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|dIDAT8KL\U{wqxSTiݸڴDkIcR۴DSMea;j`SGZk\` 5B1bCM^mx00txu:|?_UEe 0#+5.@s˗cH0X\?}\ )_ݿرOԸ6oj`]eeξCJ7U$J=M'3~,8)D{z07m߿>eep lж]};ϞuoNfFi5X&ffFcN<u'w5 >IENDB`hydrogen-1.0.0-rc1/data/img/gray/audiFileBrowser/go-up.png000066400000000000000000000013201366722712400232720ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|dIDAT8KLQm14#i!5 E F0҅I Ih!qqqCLn\]E[VCi:(njR==v^ `?@YSRi,=/`ؑllJ |S0{jv&?` hJteJosa'˾ŕFcy􉙙DN`SGhr}],k 'nb5s|YQFӚ>Q/M7=!CGuxFw<<-KPhj=G.AZM雗V 7cyi(2@L&N\Q A8Wp pKSM}7Y+o( Jp_'~ p8\#:ӗGwXк!̍jq,;ϑo#`НE̱A& ^0`ن>ߴdjpUeYU$g%DVUsP`Y{rncVF!K뛺llRgE_W&o $pK U[yj խ(n.l `ҿV̿IENDB`hydrogen-1.0.0-rc1/data/img/gray/audiFileBrowser/player_play.png000066400000000000000000000014561366722712400245760ustar00rootroot00000000000000PNG  IHDRĴl;bKGDtIME',IDAT8[Hao߷M7mcs[T."].ERtiy"(H(/tii͙;tiʦY=\o~{BU9 @,Y'lV&'^7 pbJjrWFO$&$xH FX '& vŊbx0 Qp\߆ =NGf}A6'dGҶdddVaD"j5Ecjzn{RS^fx~lmJpˍ3ΙH <$%%@)y `hhnr f `ogJyN]]V隰FY9~y t: UwO9{XPf󶨰R*y=C ƿc%vۧrT*.܊ ZuFeٰX,Ꙭ,CCѹ^aQaZ|CȲe0 (p:Bhz!%8*j,;%y}Μ7KO/.ċ0q}}s>0@W׍xH2LL5BYs8q%X^~˗J@!dn=0"L) @}cˊʧr@!dHxBz:tB&7  S"IENDB`hydrogen-1.0.0-rc1/data/img/gray/audiFileBrowser/player_stop.png000066400000000000000000000006271366722712400246150ustar00rootroot00000000000000PNG  IHDRĴl;bKGDtIME',9IDAT8픽J@{wFqHaeo ڋꛈ",X;$55+v{ %qroك/s-nsw{B\oj?0o(pyuAa8L6>>= "R-"Vs~v`!"L5M`}s"p73j**|98P} Qqt9]Qx102N}]yOfVMq._,"YT3c\\rXUmATc g秭.;4ob{.-;f9Z7p=Ma7IENDB`hydrogen-1.0.0-rc1/data/img/gray/h2-icon.svg000066400000000000000000000221271366722712400204370ustar00rootroot00000000000000 image/svg+xml hydrogen-1.0.0-rc1/data/img/gray/icon.icns000066400000000000000000014726351366722712400203030ustar00rootroot00000000000000icnsuTOC hic08_ic109ic13_ic09 !ic12ic07+il32 l8mkic11is32s8mkic14 !ic08_̉PNG  IHDR\rf AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  @IDATxymy}#s("%V,Ke[;Fz-ڮ qe(@@U䏤iM pN$A6n#][UYeZ,H>wi}k9};޵Eo}[{s;w{釾c{u[;R͡DZZV d q qӗݡn}/r5&p];ս>@r7ɶ/y x9F(v>n!g"--o_'>AOF~,b22_2s8x{? ⿎223+f>9_=t=}ӝxSWwN\=r8S oMtFSޡ4\Bǜؖ:1evbP,JهH!WB8-LM w #XCw R]c;٢ز'L1=$+eY qr>ܝ7,ڂA2Nt"f1řk&{E~SJTbcz}_楒ţ ~E+50uzK8R E1d'C2BkwL4z޾|ed'o]of&ZΓi_-1cMį} (#s31jrY1rֹ7 btZ kM[=$Y)L10ft{/l}H~'q[dw]!oc`o~뺿BUX$E'[ uQ'u>bKD@[$ a=zH-%-YCnpqa:itt݌șrږ_׋ O|Il[_;oB_w޾M9|}74 ss9M<]%87ĠF;K <.3 ڑe7ɯiO]iҙ^P} :tEJ {@~qh{ 8n oOosRy>m^LR!BF)TnF8/N~_N}2g.brZhrc&aK@x&3J;2UUڒA^s#Omt 66;r ZxH3GmnRa,݌6&%$DW ?1R ȩn*\Jd^Ii`)+BیΠ%Mn^ r_"Š+MzMp\.s'qbћ3AD5bxw~wP MTH8yXwOt3GWER4cnF(C7Sn DϦ <àdoR1Rjrb])=F~^^E вgmc0M·N^Of877_yMM)a^-TL(ɕC0'C‘x_ai!Q_ZBnǏNo5O4]Q.L4:~1^xq/W۾jO&E0mIÚ״hɜg? Q|8뇦zձ1bv[:%y/c;:-kX>2'eo5Ԭxrna:gr0#X?Z_¢7wy% :#jޱ1HYqNяa:ن&ĦgSFG7K{LG'e}f09ojc~:1RłNba{Aכp3$@oK<9&S> ar;7lE˅b+InOKE9U`,!gY~ ;,c8r)h.&#:pɏF6^¸El~.X ;R;:1Ṙ #',Sxdu3H=RFɟj .tFNAJ`Éq^0!yvϮ;?곮Sz!q0dG < N5+\&3-Muwh,AsdHpNBH٬a+{P).tb #'_;5|1D )^q5U\+, h2뀊)aBUfnL [tǁ Y+0zAB@qhz^b&RfRdJl-ɯ瀓O'4B"9`h6#v\%5ɳK"4=i'`,P&C =+ >cR%,/uF7QMEǰRC09g"!!:8ڒ?%Os$y9|p9_8Ҁ$MIN?uϞڷx;|kiYĹ3c?Ɏ7rr~FM5z=ó2.zA=-x_3(- _cE2PƬ3ºwO)ڽ"uSo &S:v[j#ޗwdÈZ1ѧOQE `cɟ/ὗXd!3_uGeܦ],{HMKQw lD3J]?3 K{tHȿw3<1ml/_C[ly^=c٫$kxpMjLD~ WY_H~;N3 1]1eB]{Ɠ^>̾w.wA~jݩ[cOzGN63g뻚o{D~da|NhTRMbɏoWAlzgsemxo]*b$՛/=&?lx v }?g|nd aWֆa(:=FD Ckc e{&>o_HJЫ0,E[uFohLo6WM’O;Iq=!^&VwذGkVebaLxt u@q:哅6/Iɂcs!miޘl@wʴː_{% 3rf#bV󓟵3{q-=}{A3an1K9X̴&-WVJhV\@ǿґ_Z f!K 5?<sz\}o}]w b`7C<ٗ\:Rq*/+h_-0lt~G?ݟN &s}639cG^LLJۛ??DHdzɏ`:[ _O6kj|7O6iņV`EFChei1Yflby*s6"ؕSWC)svkokM  ={Уrg ;vM%p^C@AzL]1M7S(z!6,y /ȢcЎeȑCKuZ{'q1cGtY!?ln?ب tۿCبt`wZt'ɏ7tӚIq`U)GOmꏴ8XI>rgv `WA~J7.X8tAg0:K9L~rtKgA7/RGCm92Ǹ^j=jflӓ'Y g}&䑅B kN~$=+݇?Vldp~îD HMA~rxVn⡻8ͣ@XL|=FBaz&E5U9Tل|f_1 !anr(œ>勳41nRˀS %0])`Fw;?Dq̱O~~\xȿ?jD27#a#a]+vH^IHc$%Yc019z <4BSN+Jx""gm^i>I-$",~6h`w~ݙ6vLC#45Ӓ<˷X{zŔˀԖWXA,Br nuYψA|*k.7S|R=9J;WRIyqM^j&r_!?U1Yu{Խ a@.mƁ*1B8R,5~{7w[Kmo@h欬= Eݒv7دѻ&6xM8>Y5C؆mH2-CU칗M\]Ō `S/;_L#-B~IJAkaӕ+H*ɿISze.?wta~ї&49ewT9_Ǎ_J`uG.F7T񒶸!,zg 4MzYJLğŨ\mȖbwh @҆7Bo İ0sT Sv7DjlZSxCA'?R~zz?]5$aQZseOǓFfnS_&=#홣__9TG+$Em᥉Pb q?VAMe7_}y&+.ᶌRg;HB1PSֿD弣/ Y~ -f Y&u?g \?lE6_X鍜?7oMapPVc5mleO ;I>XΟ4r6 -C~P@5~ʀ~6 Φ$(L5[X@zpdR  g9lt[2?75gC@V '0BZ8 [ed3w}*]4KfGbǏ~? ܎ܐ7,/~< Yann 4ӻ@혨؂ִG@assN{퉾]x/c>HGuJb ZBh?R x䷏*]~,Q D~,ۙl@a4`@mtPDJ䇥 F Nh|OmTxZZ$jc0F~&\X?;FrXu3%`pv|Mef6[6&?/#v p+My 05idH.CdZZB{s737,20"E.`2o87Dȟ 2<@zR^{-BZ8čՓ>G7<]y>h|ך Ss22 Hyɟ26`㋑/-э7ܵv 2OF{|'?7o䷔k20~p/t~rD㋑?(\u"Þ|@F cD睵CD"%L#?F7{t~>%ptܿkh4A; p.%c_H$Uɟd/i|ϻk?:-)vm`w~59V߽۝?Zk H.]T*l[|HT36{ 7P&f+>2Mؓx+\m"iԬ M?/v[}TlcOpﭱo3wݷ[r=_4_Kda$6G^@+Ek?`AJ :^[Z'dx(/dPQx*fn")k@@ޑ>lP{gmG@@'l"[b&:-<XXW00gOUӯ'wt3Jt!䯇ЖyMtD ?dIkJ9,3ZzwFЅ[F2 #;wqoO`H'9趣ee ezg" ]wʆ~Oukϰ4oo设M߶\fM ;nv 4$R>3#?3,#ݿF6mH._WRH­ɏPH37ڋoxPQJ,fsyBYo [D0r\uH $WMmpؑoEw}#xgeeAE䥗?9h">+9(ԑ|w)}Ȫ\4&\w4{M~N`J&@xg⻗{}+$?x6$ c'mi2>٠"&lwPoz&39:#<єns36ga't٥bTJRk l|Jwܨ?#\.7<76P')$v&Fm廿Ԗ4OxF6597!j@ຠ#3k_wqLHF6X[OC~ ߠgf*xɏ nZ LC~8PSw~l4x;̀Gʻyu緘7('=_{|3:yimImtܐX&ݮ8Z 6C* Yq*k@7ߧ:F~v%?LYiǰc1Hr ZoXV)UBSJ`5LO;DZZj%3 bd/O#@a3ߝ?3h;7/YMc^nyc6?^('c[_X))=_AnZ{f`/ɏo\R^ԡOH!F-[!$Sfc[Dd[ke@(l;f:{84ó?rZwe$п|m]ӓ7M7 8ŵ\ZQo;n3zkR6Y}\?36@r%sכ+?{z=D߭2-YR6=-J~pu|pǡ%?Hk0@,Eףּ?M8 í23J)H@K$e pf02AG}φg=?Sp`sY,@a2Y'l#C椬E Hm"?qs!GLbAP֜30hOOsHpb69Sjkicfl]pNywڴ1+tMRZ fjyĆB ӛ4y+6٨-{[|쏿 p j4E20y~!?U[K ʍl4u}$$؍&L}JtdPOɟ,m2g㙇]<Ԯx~S_1}\"4èD1gѩJց<<>}w9tr}wgiU3*k_`ȏ.W*<*ˍj\YA[^iuz5.9Y /}fD3-Alvɭhw~ISEb36}z:$WG^hQv6da}[|ٚorPCl'ڜe^۱)oUEϟN N6Z%kt h9!S p]0+ទ_6uCcuLr0!{ ygལ"f;:@~H`=$&Yn{G~LqVO~ǖG[) w䌘:H#i"%Hґr:؟䂅~R7~6xsc1>_@ ZL1`#J\qy t|s&Ƈ\ˑ_ܑM& {^0)ˇrLfgVJwviM@N\˓QYNPbalX;c{BD_5a?؀\wlWO~D9 `##?%-:!ȟ$f3Y +.!?TCYu.KC\~F,IR3a`n,@~=o6F7/U7Hh'`[<7\Q\#Fܦ O% w~##6e=8 !rl@qfTXxR#73gi5OYH|..H*viG;nw[扫u|w^6i-ЂXmngLdLpݩ}?}ݑ yꪣ/(#iqxnx[w1o}oۻw?Ο]ovk<]?){C󻠌,$D<r WOɐ9z+Ǐ:>HgcYt$(EO}oDZl`$ErlSF<4}V<018ج% aYKbU~cb8&(Ċᔬ`=1F vaT$Xx5' IE Ecޒ5kl~%:qU ox&%Q.&bI e@ =B! d6cq Qmf>X&G65K"{\Un4 }U8&<T5I 4JM*`i &e(afuVFYS! pǪY" G}} >5ay8BB0.=2LLNf!ѩD-s:㬈[;jHpi_2 *.@_s*[@jڍ9 T1e^_o#ܬEoԳ O%wȟΓ57M 5h1Z79hw~d!͙騐M&\F~ZI-{\q:t40PcB\|X H1n&`?dz9,i~$]1fe;N?Ʀ9#n?iIwx珹l䧕 !q&b܎akх 6:V_]{/{@\kl 2[؏қ(R:x3#aJ3YB{U8:iCK$9669Q~J9)!v9jM(g'kn,Њ[ 9`6!Xf(Am+[ x`C1 Ь4gD kH)c^ݐ)k'2 Lw̌ȊLpY{D%X3 @EP!?ЉDu l7`O"< r1é)rErY2-Z`?MJNZB'3w!MWmҀ˒#$8Y{x3fDĦ"DFUVe2NbJ"{bI:޽eENYΏ0tPeEVdT'BWƌJ9KOLiJ 9-:gqɺč"CzJM]3PCXd*.5;9N1SB%=!C prqL][T=QBP+g#?ĦZ.ҙ$jeX#Tw~Z\I&MvG"ґfSAZH }5# nY#ȯkPhNQ*PJJlD̳J f M;AV`j/o#?=XN,@9RՒ ;?O3ShH,aVܼ;?/PI(z\7M\]TFjV:2aѧ7Wp-{ѧ3?ս"LNw=}oaE'2+2]wK.wcGH.]w^fqg5lR-5O$!Ov_Lқuď|{ziG]w+~=例ҿuCQ/.\xO~{WfRFUE oodQm}+shc|.#Q _^cǨCH?!<QS"KD ݥ$!cgg>4`!X1U~urW}gW|b(zjءuJ=99aǞ qš:Z4_z`R}/]ܼCMgz`jǞoqq5I*c($57LA~89+"?&bNZι08&?l_&r>vyDksOTJ~]+ʧ8It|جV|&hĝ!ϼgIE NF`3y@JSI${J/3x=X!?@UmiC':YZ@PY†(Hd ,NZ3հ`D(|a9K]DaxK}~*;1cx %QUv`;@Irs9C&$?k#c39 !h:M:4ͪ(M +#uތr3쇀9pFM-% O-53Pm`԰IEa`)o-[I*]6,K5d0"?|n. :m+\4%xfP!?[(H/HaGq YH7u5qf S84jGY2:~ٜfyb3ѫaa}XV(jуZ&F!^*6Fԍ=Ħ܀k/36V;K pECۚqRq"قuSU±pE#Y_X+bƠ QU̓<,& 0dcg`cO%y=c_2< &X?`բS4@I1sSqQZRWC~X4orYb/X%_0h;CPEnEL^d#f>U?=+CIsP,}ў㠼},o+FU%ՏQE'=H^ sS xCk1T MqJ Jd6N!_vI֊1CgSf>s?ǡ A:dqg#?{ nKa_!s>rGG+d 5dBo*{@1nnS?* x=XHAtNnc?옕wnycY{J0T`>ly6LdU1 3@d^XbIbyC!&5/2Fm~HŐ`5=E" ۖhNC~maݺLJyvm:LefNp0jJF~HU7(Ҵ~ށz״"&Le萙 YcsQrzB 4 1)hJ Aߤȏqwmd`Y ERf:Ii k2)!ٵ%"/V+1j~y:u¦ ?[Jb?@ &U-p1&,W ;p!*uRzeJ >N)`QNl0;dٜJxڮbGo5Ay| %Ϯ}^ùL`z[,1F^i@acUۊ(cˈp+}/ nrfU1#vkthi-願ċ OIX c"kɗ'"ٞpR #OQ5[2/qI>e90\=o".Eȏ"Ѧ+6?[IDAT>fB t,0rG 5h0я+iE  ȬK' O䇠$+6m.ɰ  ȟet(kvEZf)nOW_Hf;>/&=˾d؊0AuXV\i\vQ j>DIN4X[.af]^Mнr 5nڠUSZt;IVL,L<փ˛3Lo*Dǟljf!,n~|eT]cǝB0X B6yN+0!Ȁȡ6{lx HzWUXkiTPɞ2>p";̰D?.cj"e$+Rq݁[E83.>p9@YDXz!,lb(1&1A O7D%[ UпM^>D~dٍ qM'K@ ?D%"źf&bX >cNE8Z5 Cc}IVlj@UM<փ˛35A`nTj&˛]773S$Ԣg )dH7h\LhDvT( .u(S ̗b:hqBp>C~TRş2$ՊIƨlHDz##<*QPAo$d'_Mp?(mr( q1g RR a{xA?a(}*󐠐p5YHȝ$/,1VS꫎vGљ11tU?<oE!|1ͷdɊ=(1}<7aA[}k -o|r$䬅‹ƤsӍtoz9f3Ot;1*>ɚ o/}=_2|R}P![1M6X) uWGF7Xd5^ݤjMI~3bGŸs堏=A_ s@ 8d$x7\w;_“#b{Z?W_y9[ٝ;o_ \Ć}ݵ':l8#מo>F_oο`hfW7\J5LCב o#%5'ŌU'| `O/8o3{+8b/XfV}=OG0J[s&+=PM(kv C w7JCq!EB(9FL?<~2e_Ǐ$Opʍfآ\IRanw] Ԇ,͢ {&7B{g45mnRŽtBڜC6d4=xCs}\bdg o3E륫/'CG .yRr}.dYe{ɗ{\ Eᇹ}Cx+9h_~^7KRDeKj0iA1 gZultA,Ej @ GM&sÇ*}42L)k,F~_K6ձ^\_nɚ{UN.5kw~t0̻xÀ'@€FBw~F+3تso FJ,|6j7yIP~һHŤZ*˶5D~]'[:iRyԱ/y iΏ(i('#>%A ~'?犌jzwEO*Go,Fa86~[/ph:oAnzrK"/5奩;D+)ˆqm6HVA~h0z _˜Xl| N 8ᴢcYiY SE[+<&,/@ݤ6G}i^X9-AF~R/ie?-1<ҵk=$ yrxa/hjdaom y_*%i/х_b;P$]2[slX1[RSFmU#?%SIN8EqWqZkxfRɠOH"ua6GZ /0C,D2;L@fu_ʓ?5S%p`fD>RG6' lOPi>`Y͵$% $ ,K~]5`|AYF^B9ErWHRԂ \DX-fPLV7$6p1&YO%H xD_3;1We{#¦Skw]FlwfLl+xg$.y `;9Źw~Raat%p0d5͌fl Ž-K& m @%m{fKU-?d ɦc?ǥ+*3f,L6x}LiUs YIvҒAyf<+F~I`fyBYŴz = X |V%:)Ӫ $Hd9A!-i:H=b@;4]L"I_#@f0u,ƅت%D{f8-dL)[lGQ2Jr9&ESE~ĆĠfts¤kd g. ˢq#?"8$4ᆴ蝿Zp\j*z\ʀ,D`1D^f1Xgp8{NxQgts Hi&MNp M-!Xw{Ƀ6({o59jc?KarkyYfNd *^L=4Td;jÄYRSzq8}râ ɒѬ a`;ALC~#i[pd Uǝ̣SmnO<\w|tepg/6RQnt+\lp&ϹQHH .^vuc$P05=Rw1 k=n]Zm ( ;kD~6Ek9Mތh䗜I1!!װF~NQ+/%%1"Kh<'5KHSυ)T0AN /06>9L~0Ǹk'w7kCWapN^w~ 0E!s%vEɟQ2OsLՖoR:9#oR:?ލM?4候cw-1O6?s$F Q;fWCO 'g}Y rmZV4sR@@|#?G'.LhatزϙH֔j646dIӸ¦nwnͿ|R/'8l|~}`<A^5!j܎t&gRF~͍:ԍuT@|*-F Q۝_3OΞ'=Gsr۳DB ɟ}iJP:WH~]lDoWPwS0:lڝ3T4Ȅ9tH?_O}+( z˭}'>ox@ >u}+/J:%*E `|V-DL-)_X`7eC䇆Fr@d"zOuS(LxJvZ;Q)*uAzw~ϺzVkwoK[~Ԟ|s_ ם)BjQ _8])>! tUI5zf3Xd%6din@jB;5gVZ<CLBA Ϟ~{ӣü}ߋ'{>ۗ,ݏ?$X-7]v)'> ![8q2Iu]C}UIK.=g$ 85Wd$6 7q:JNg*蒙 $LЋF VU,l}@JrB^1IC_ZP}spG9;<;`?[`?ɟp{K#== )`ء__0=Ň.?Դ22$U;o{f222g={E/[ee`c2pމ/Cz3*L=?ݹH֍f ee Nw?}_}o0|];սPQi疁 K'w׏ TN>[[?D -a-4?7vmhث gg#3O_w>4+仞IENDB`ic109PNG  IHDR+ AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATx{Y}n$@  R( UIN8VԀVS!Aig:MSXEdF"^!kruy޿ڳsy>{f߾8= ~}7~K~˛;n}/^vy|X_x:]>-wW;/w{y:Z/O?q:ɋgO??'YSs_\t񦶂?XX]XXXXXXXXXXXx:mtqK:>> {__ryqzkk&<:ڊ/x޷_߽?.//Ϲ::::::::::::Q݁t|÷[؉ ~gN;[?5ՁՁՁՁՁՁՁՁՁՁՁՁg ׋^/|G=E#֘w`o+_M~../?N6zy'o^sWsg_<񥗷n|W[x'֯ՁՁՁՁՁՁՁՁՁՁՁՁՁgy.O?~~໿J _syf{5={7}ߟx?y\_u/x??.\"XY~wuZoxkyڂ>:XXXXXXXXXXXXXx0:p#_?nޯj/^vցϹ<;ާڟگ}k"ށO~s?x7rWW?}ڄ7\XXXXXXXXXXXxvn|{N/Ի-?&䝞[XXXXXXXXXXXX(uy{wZx / ;yGS^z|;;;n?϶=~''VVVVVVVVVVVVV> ;`;wzo?.[o|?~vq?`S&r4.jWVVVVVVVVVVVVExu￝5O}w|=r;XՁՁՁՁՁՁՁՁՁՁՁՁՁՁruzWJV^ wuqyVVVVVVVVVVVVVVL3˷wˏ^J_<[Z*.:On=tx{Ź}w=zϬs[݁Wx<ԷW_ȷ鶧 VVVVVVVVVVVVVVҁϻ й³ ;<6Ys'enW/?_xE+qy4JՁՁՁՁՁՁՁՁՁՁՁՁՁՁ{Ӂ}{_o7/of^tuqVVVVVVVVVVVVV~^>.~xy:?5\.wo8wofsys==籇O=顇o_puN1$_a^Tbb0>=<]ݿE#m۳8;huxx\M5ZrWmn{aJKE{-3 (F);3۰L@t-q#߻ \%3gW~#_GNӧ|䙫L٠vI|7\*c.Og _/e/}^} ^tzsރ*~lG%frQKH30Lé&::DRC98P azd6kPp^ P `J4.NRPQf^3o$ Z٢h!7bfy׾ƿh 91 ſd3A+NR2= m FX92xf:)cśA"Y5S]ڔ|WrD'ߎhcFkz_9?$XavSpuhc !1AKqbP 3lC J ]PBz8,P f~w`VY)+¯>~~?3?zg[ [xVzߛoҡ*m䋞wO~鵟rcgzuQ?^u?@ 0L}( 3L I#&)= a*&gzd6kPp^ ]/uCQ-\J|xTffEF\OH i~tKJi}, F-ьrd [qS2zQ9tS'HRbt 2@ JZba匁X&uW&* f+Icx{>׭'Ev63ӷrN;9??{'?3/~t=~ݺu}+[S'Zh>/9/xN͟rz9c. f:n~0&:0%$M6!R%۬Byt}CMFiDs)Qm+-B T pu?#56[S@-)}[/$pVR0@ )n]ڔ߿-.UZ`&hHq0WFA>`b$)Q; Z]T}(ށ֎Ў`V~=lU(Ui3c?;0}+,.Ο,~՟L{O?~ѿ<|uƍ[ϖv~?2P/g>3_szz?;^⨟G 8h'Sfrh,L=PT $k~$gdcjfk*`&ެ"TL|t}1DI4.*ce3E'SW/?^Co~i?cbE),IY3@@vi^oH]EUvBhs`5+! WFA>`b$)Q; Z00% BCLvl̾v;dȮB1JYށ[ggpql!/~G~~ճm%4O\A$k7n\מ~W믷 JxYN?ꧬ{H ')+8z rSa&I L”Od#7yM ttdcjρ1s4NFn瓤>3f(h0\jU.SffN"'^~fz S%o|.VG6G樐geA)$)qT0Dk T*(1ւ BCLm~ʯ" p*mfgyo垝"H~q_~oOO_ϵ/_U7vw}[Tb? 9OP/} DQV̮w6{tfaϗ>E%Jp!R)X0ICn1 Zfnfĥڒ Kޫ;4f v`Fg Qaܳ d8pDyXO_{(=Ƭ%8P {^[Xl&u.*UQffJXV66[TIc[9[0w6*$͑9,$lŏwf:a[˿B1;y$!F Ġd$-Q0F٥j<ߚ B֌uiƞG 驔qS$Os.)͛7_%O{?y~斖qYO&?ЭnĀy{;jvsC8|9[d⨟ug ')+8'X_Qn*3)AIRl&^= QlL C90fpFFx\ՅG >z]͏gzw6)iaJ %n*e>l*&q>I^[c&M \!VffAr'h~-JPqsS T5I{LI1뒒JC3xً@8h@,ކ_7Р|1\2o2eA?HR&[/wo[/c V&HRy )%75F[3q+Kh2Q$ٯ;XY{ĐSiS$OlsO'sx:1_?yݧ3'?gO6HUPvS%<`(IP(x]XFP*D;4fC;XpY$+ "CT=6E":0=.?1"QjjF~N7k?#!'ߡg#/ȭ[?_в_/<}f|~.f[*YJ}sd&h%2 Sf$IWk SlL Cl G2U0Ef#7XTW J: dNRidcQP YPjm(*j 4!61c%%͉gCqFX .]/yWGk˿BG[>zWb>(,K>iy%C]J,}N 2u+e "qW*4JҘF#؁_'E"2DcS$櫇O Dq5u w/Џ.uѵG~G^w×/gv߲^'~o L$Je Փa{&:.' SP5e<)5IĢN7ܤQ*s YTij%}Y@jm{5L1뒒JC3xً@8h@,ކ_?_zw_c,!PGu)R:-׭-@]yАg+Ic`V~=l vML?w/^e8pDyIxNK?d;]~䡇?ɔh'mT3^zzoS٥M62{ް_ [:Fh~^ЏϑyY`X&a Pd0yM taJabC!HjHl&*Z/;Eg,vr:F-de*SSfX֪٢^rՈ@hCl2c ߯KJ+8hg/*X x~]^֎酎ޭc²ßp^BY;ԥGKp,_R-wBC$o;XpY$+ "CT=6E":0YO{gm38hl} y=?8=sz;؆YgQ?7}֯(wn,+ ]La%2 Sf$IWk SlL Cl G2U0Ef#7XTzo)f?c4\en!+S 2M0+HVmBcFBb3f ~]R؜Xip̟K;<l 8t92mSzO[zWPֻZ"X}LQD];0yKPE ͚<|-u Ԛ]TZaV7z8,!*"~,zE~^~&Sz?oxkY}2ǟ צw[1؆ԥac&hda)3H@u $ޫ5q)A6j xm#I"ZD,h}M \U2LNV z`Yfz!ȱW#g yԏ3}.)YlN?D8ӏm 6gj1!mQSzO[NzWPֻZ"X}LQD?5a%H9nͥ "iZmFmpqW,?oFFp4cOYvML?wb?M=MLq8};'3x[ ݸ8w!mCXp`S⇥֋+Zx,:,q^~Va;&:Ɇa@8Ô SP56[CL$L@yO.F8Z//E&&u.%nz[TV 8UbYf`/%I < H j9mݭk4# I ?ml]? R@Q@,4 Fl4;pGJ 2@Lt4[RY 'mpqW,Lv`%iLJql 7=ُ\[Ξ//ן^/8^\^Od|жjxWivflR㇥ WvΑK.1gR $֒T'0Lz^gdcjfk<)5y(J3|+Uun!+S 0+(=4e~-EI&>$䟱ګ{9l9z| V" Ia@(gw*GRRzO[3[_5C;}SD & Y+Z͂fHUPvSQɛ]:z+X\kN 9]Th,*< ڍlY$+ 2CT=6E":07 (5W5#ϣ~gh-"˗;n?G|7K-*cŞ7UxY:Fhы8{"/lh^tL"aZ$I~Nq)ٕ$CPȣI"aXH?4i( _D,ssk8ws YTFJS+Q{X֪7br5!Aߙ^\2l9p)aLbf3ݮF3Bʑɯ޵܁zcD&@hQd]l;pGJ9(Pv\S!:-\gRmQb{|VƤ=T HyQ8,8͌,@gd8ma!pU38<࣏)YP"_Oe~%.C5FLBµ +OʘB#*D(l f~~`V_/Q}tRӟ>A'ݯG}p c|?,ay^$;:Gc/ld-JOkE)I@wANjRGiIL 1U0EӟHP+釦 k4.x~~_3*˒H>+s )FS hZ(q 6?:XkC\/G_ NHUCc"a@(gw*GSzO[3[_5C;}SD ,MeC`h֊+- ` {X3~4slܯ3 Jre! g+O2Q;e*D(l f~~`V3x_2\0RcI|˿%/~yO_|=gŸHHyFZ٬Ww8Fkы8{"/lh^tL"0t'Y(֤3\ӔkN4IL 1U0EӟHP+釦 k4.x~~_w HeItbn!R pJhTlS d&>$]^Ml9na r64E(cOU5ɔXQ>$ l I4X? A"x~PF1̑KS?]U"%VX[@\a Pyc \c;(aqW*1%ځG=T HyQ8,8͌,@gd8mcQj W5#q}kǟ5ko\ܺx5_EVqfۑS}f^wԯsկf?yE$]1P94 xBr{76&<90IJɀ ,C N)V"+d%ɂ6CIj<]j;w>&J(4 F^R 1W{Xċehhat! 'V#vlbАg+Ic*D(l f~~`V3x_2\q)~AQq{@Yȁ)?C/|5g^z)=<=٘T_ Ef^;;put2y~@٢DVt'YT&uaea &F0DTM \آ ~h PZm"{|ߜyv2((1QdBxe4rhtQmU (Ebw)^s|xC9~HQe&%AG Cjh*9mM%xltSJߝ|T cIͦ?ɐSgsdG_eπk&PٟGnL4}#m5d2~Rh"%VX[@\a PycB5=-eL]yPϋhؘ Q)/ 'EǠ 𾾡2b?Qx!j\^6Pr` ϻw 'n)>at=smo 3m6SLZ/ xY/$vC@),Zм~9pI{قDK@wZM(: sAL#Фn&a?~3y(CSrMR=.zM+zXLC3>:Ba̒GJh* aO% dxCco)Ŀd3ȁ!aHMZ%g ɼd@>npJ黓X!u,I'xlR윗#~jxZZɨ h{{G'YIHDToW+AJ!* \a\|̱]r((iO uZ8.ӗuy)~XVq:{@Yȁ-+n<}ӿDQ /ן{Qnm6.h-BѡaU+QύM]/ ѝd2nQ>5u$GS!2n&a?~y(CSrMR=.zM+z6/ -s YTX(JhlӧvP5NRTfCb!$J@(gyɀ ,}*w'B&X,hO2$ܥ6z׽zcBKS?]`)SpU/%JM]j @Aڏp, 6#6+ 7#CgYM6dDf G)}}#O3dW زg}`@k6ŵpm_ ?m#+r#śzQOoOHN28 =:֤<'$<!2n&a?v V(MA 6K5u~z;&J=8u\d"Yǹq>Ϫ[F{`P,)V4^o4l El9P1$V" IY r63I\#S6?8^Y,h9?ɐS2R{IL1AUDDUB̟.V0”BT@)%^\Nަ.C5DkG uZ8Bc\K|³&E"3Dݣ G𾾑dq䉧~2XBlZp:v3^pz kvdᣵ_vxY/8I^IIfGǚQ>5u$G4DM$L< E)HC9&b?}YzD@|L"U$8r0gYuh e>Jk -S2 #JC!5I4k6P&]F YsT)ӈ%6#w,I'BH6^/Q}0s$)To*8:mHq0W{Xlh^.C5=-,iXJXܕ eLv`!iR^N6dA遣Ɂ G𾾑xIx_Cոj=l,EW5_?F~~6ۑ!GkH㇥ Y$v\/ԏ$3ңcM(:sAL# "jHoA b"|mTϟ^S羬n`"D>كSE&*E}[H9eGvz^ ŲOb%IC5NǖRTf呇iIY@(g.#BU*iĒ`A;$ l IzL!Hqʨw>F9cbi*KJ k 8W_1R2 )mدp, 6#6+ 7#CgYM6dDf G)}}#O3dW زٓ/|/{bwHnxf;2h-)l֋,z;G?wѱ&upM9 & qS5 S$p B~h P@XEs_kA0P"wu5֧X!esk3VNK6xwfcc 9cLrߤP`ɼH)UیuǒdAM!I)4noAN3G"bL,MevVXamSpe Dv)%iaN 2v&Pӗuy)~XVq:{@Yȁ-[2*^/>iC:Z^!W/4y yc6θLZ.[p`-K@L 8@^TIaM|4r̕l&a? V(MA 6K5u~z;&J#1Qd!{Qhn!H*S!PÒmU @-*bO1,xC{-OLK6(vfcch3dP mJ7?8t$Xfd%ɂ6>$CSi2Ꝿv#mZ ƊXamSp%^\Nަ.C5DkG uZ8Bc\K|³&E"3DG <07 6$R!j\BfA>_Ѷљ}Jݎ?7Q.6z9iC),D࠿Uh} -8VH@ZM(u'cgjdȸ)>y(CSrMR=.zM^g*rD^ [H94T԰d%G[PXS& iiS2 ؘ r62!j[ 4)F, cIͦ?ɐDzzc# KQ?]`qQ + 8~~>(p%8PM((iO uZ83wBSX}dC"YcPz S$/dFO3dWI͢OZi/c_Rp_iCkrp@7"sCJaQ bKM|vUϘd-9v;/`AW\f ,~h PXE'I}Y߱k-%AML"dO|x[H94Th%G[@KXSն&iևo)Jv ؘ r62!j[ M)F, cIͦ?ɐDzzc# KQ?]`qQ + 8~~>(p%8PM((iO uZ83wBSX}dC"YcPz S$/dFO3dWI͢OZQWcR xZFOTcvL{]|se&unM$&:E :Xa~Spe Dv)%iaN 2v&PZEb[ʗt浾u׼c~t`4 0n#9zCE 8jjRGT?zM# 6X!+7gQ臦\Kϟt p:4QsCɒ$'qn!*Sa m)~UOʃ05QxC=~HQe"%A;3폱1 4hl2eB(JR:X"+d4%6z!I)4noAN G"@ 2~D`HVq0W},QJ4qlPPҞp,cg%,S2D;ȴ Q)/ 'Eb#úXMDFSSR%q5:,#<'Zxh-$rㆋ^]~^I2iX:g`Fn!h=c&?3Cx~h PP4D,b*/DCMd'KKBʡ٫L4hX06?}YPk MS2 ؘ r62!j[ M)F, 2ǒ`AM?ɐDzzc# KQ?]`qQ + 8~~>(p%8PM((iO uZ83wBSX}dC"Y1a],]}}Pxi)~Cոm}Lhl} 9/w/{K_?`zaيqE&:E :Xa~Spe Dv)%iaN 2v&P(p%8PM((iO uZ83wBSX}dC"Y1a],]}}Pxi)~Cոm}Lhl} 9tEҿRoK>?"FsN2ie*}M(_Nj= j&&3Fn`=<*釦 %LMdSL Q;_nN^S og",`M %A`1̴?$ѨUv`;-rQCCVMyI?O2$R^W\>}gl[4!'}%Zro~3Hq0W}] im}>fD{, m6f@2n :07 矚&*10XǤfѧA??g,ܬ$kWW_( 5|vkdϾ&3Fn`=<*釦 %LMdSL ^ׯ;ĠDAML"dO|x[H94TIQdGgEDXҪ7ި5N_ה#6\K& jg16&Q֌C0hn97?oJдW"+4< lI$=$Ҹٽg>ٟc_79eȪCKQ?]`Cy qՉ+TgNtܶYX±wl*+ y&;4&BT@ʋfȰ.qSсe(<4T!j\6>&}6>e 6=NW}LXYI5 j~eҘ&unM7^)(cKZU&iWrĆd(p%8K{ @I,,iXBp T!U[&BT@ʋfȰ.qSсe(<4T!j\6>&}6>e GkG՛XrpCPx ^eҸhkRGT?H>1^)(cKZU&iWrĆd Iܥ6z׽zcȮSKQ?]`Hq0W},QJ4qܽPҞp,M[pU T!U[&BT@ʋfȰ.qSсe(<4T!j\6>&}6>e ͬ s;]O՛XXpѫˏ١˿!]Q&hkRGT?Ȟ}#Mg${y(OUMA JHi _٫wA&DȞ8rh4ꓢhΊ2Uo:Q+kr )GlL9RLclL$m  b֢E\#jHHڊRU=mp5 '$Ҹ˿e;}#,)X"%VXQ@\CDن(Ѽ] XX± 4mU1,SLTl Q)/ 'Eb#úXMDFSSR%q5:,s06Kum_1^($AKr'kZ uZl- 6#6W,#N']# R^.d@32n :05yQ0TSD ,:X',`hloskh+f(<n6eҘ&unM3##2ni[=r[^GB#Y衉PId1BʡU%@"=:+MVVmLf{P?6F fd4L9a3@`|kQ!/G:)CSA,q DO2$).j!?"eQH͙99 )1AKr_\Tx[TX.՞i-nLFr~6d#úXS/d/v~x n=:y"0'V2I͌~bf6͸/"n P8ԻJWE8-2s` @WIaEǚQ|r?G u4Dj(0Un\d5R(0 hL7LBʡ 2rCUovʘbɃ7touįs_:dMjFєrE!!i+&HUV#LIgvRBH6^/Q?uD9c 2ZK4T?Z?N 2@h3rlcT HZܘt8.r(mf'+Luoky5,TtSi'c!`3cپͽ`\G7hbd(1?®+8[*:E*KLe(ѵ&u#" &Ć#C̫]ԙx7R%1Q$^#v[H9TThΊDVm%Qr^ o4lXuMhL9RUb8&Q֌@1kQ"B5$$mEj)) @?Dzz^#H͙%ts\LH. WZQrϳĥGL\Ui-nLFvY&1e@tp7 XpXa>&}63 90Bv8+m"4$-x6eҘ&unM3##2ni[=r[^GB#Y衉PId1BʡU%@"=:+MVVmLf{P?6F fd4L9aGI]hkP05ڨ #L~۔~FK 8H"E'_hd_NbzpD͙tsR0hCZ>%}xN˼KE,RY@ƤkĎh,húXMD5@ÞPf+ Ǥfb?a1Cc}f\Ygq^¡&CL`h٭Ix7<5N u ?R =4Q+E&Qy>Is )LZgx*i@آAN0B=7,"#1a4L#7'm  FU~9ױM'j eF)?jF&/z*#π࿍b)U (M()Mq1Z3, a Xl%HRC 81(ilTGqw,jQiZώh,húXMD}}ڡaOẺLcG`3cپ 3,d+q^¡&CLaDP\:giq4r/!G^xrXh}CMKITOBʡ*S"=:+Y0J 8lQV txC_ob!Wſ JƑG ғ@F P`a ئMWO5r\).P"?jFn4=QT Q>zdhYE(QY EcBuY?Ǯc>hUc*AX!/QgR3|𳨸;jUi62]#vD;pe@2n :8} M{Bu,D8`N0d>Z mt= n ݐP8ԕz6aDP\:gNÜd4)w4䁅J(8 Z1$)>敽ih"--@CEF{tV B*?y#nx:i(%ATPۈ4 Ԍ@35Cr)c?4]Ovjk=:y"0'V2I͌~bf6quYw-_6 ^u@2iaCqM(ݚFAM#$z%RD##K/<"֥߭~DMLIb:2Qd pfpR_+8)Dz%bd4L9#i>¤ p&!9֌@35Cr)c?4]O@ JLo:-pȱ .R-* Mkqc5bGG_ 4a],·_aOE^3̉LcG`3cپ 3pd]`] q¡f&CLaDP\:giq4r/!G^Ȓmv:p8OTxԲDΰRɳ_ڐ4dYi> p&!9֌v!k 㷛@VMHIo$D`H$ lNGܵ\c@ӟthBY/s[(z? pssiZ>;8@VI b7E!*:^4> E10VǤf+AY=t9||7XtXy(Zzm= I5|vk*G#7 `rHyL,f nߋ#? @+{T=4.2R<V2B}R;$XN%ϚG:{K 6UI8&14JjF Y1C6|MHsؔX1Sߒ$D`H$cw7. \{ G@՟Îߴzw}LǴYUaBݸ8QgR3ݙT{m#g`GG_ 4a],HD} T:I^4/c2vF}X3jn,`m*9=Om3t9 wbƢCвܗC$ ܇0L;8 4<%h"sgX/IT^ӞuFC&pMbhԌv!؈A 囧hGæĊ$%RC̵Қd|waFS0DFHGp%U;V~^(u>Z\F1Bg &0n\ 3ppL\= HӶ3#ځo @f/!1> ['TX\\a`IͰWZe1jT-{t+r=`,:<~6q $ڇQT4: 2FnCI$J(8#KYӅ <4A),WD,swSxe/j3pzh"\d ̥ćGޤ&x) W/5@˿kMo0(hCfs@VF PM.+$)1%G %-0ڣ6رqw,9 ]#vv`7d@ʦHD} q^0lJFum+4: {Us06K أ[B%,C5XtXy(zm= I5|)htd$QfKYĎB%۬CZLl"`YxE?7m =4ќE&\J|xTffEF\OH5Ħ7Q4QR39P c#y(ܦ_oi"+f[R,h&G'8atxo5b ?ɵW184~\`_sd@ Z9vH)"(LCc$!B Ġ%F{2Ԇ6;6{ R#j,t`G߈&{hK9ϯk"pAC{Z?` ߴ@ 5zK/Ƶ b.&0&t/%5u$Ky/ d5Y(XCbtMR?,{?Kf _x&$KZlZhZ^ݘ.My,Ӎz5fm= zkCwKK( Xh"&~VL/c?#$b JC9B XJ[ v]cp0|}Ắ15<[]kMODn(BsI0ʻ k6VF-(% }=ݘ N+@=||֛xi{b+KZ!~upT{6 1A'(U4EZZZR d8 !lڢ7NHIkѢ1RczdR ˵nx]];* Ϝ<YQZ* :GI1:t*2uMj!Z61"yA[KyG&-)ݣZ>H] (4v=ZFa:t4S}Z%1͑rN'8Ĩ64Pͻ Ѝ;sXpk$cuiˆ@Y>AR7iEH ׾p,{U)Gtx PuNISmoRHR#ڢtݴNl3b "0nIi5F@pкYC5# 3H' ?fEmp<\֡8.?JrAЁSyljs-rh}4Q_hޒ=僴aѕBne/`J-D͑A"*Q)(%ݖt8qg X|q` # AM:^j#ƌMpZqdRqmPmaXU5PK27m¦-zzrLA-)mHZ7k(\}>!xF #mV_/ hs@$NH:G:`i!Z61"yA[Ky^;[Hv/xP7)bJStT'8CQs`!B SZmPnܙúX4&OCFq "Wڼ N+DƏjįjy1զ!1AAꐝ`ۻˆ]R_q jIԒM[4 aM4hqKJ1R͚g α4&3ۊ?=&ij .TY }$Tړ+?__5gE,MDP;'= @҅`!91kpS@)ͥET?ς'ZGYhޒ=僴aѕBnu$Y?k'CN`UC1E?Es;!U!ܫIbTiunqƝ9 8G G ˶U̥)*``6 %7uGxR h7iŝڛLE'KƂNBJZCਖSmbNP$)i +5^z(H-ٴN6mD3# [8hݬzvppHc28>ZcB k*9 +/y֡8Pwo[fw hyM4cI4zKJx.fEW+ ]O֑Z'n`CJm#/}Ϳ˺d+ Na &fMqՏtgmS0^MJzZӣ3ohHO}E9Ҧ3¦zjڳNoj~ e^kXvČ@}7xg爬y %nHH2`x`Pj}4bDwj mfXt%hDku߰DWzwܒR[m$!¦nRr#<[X^;W*5/o:-V<9*j/-vs¢e0 BCMvl~lD3 B!^61C܉#XCd8;XAnU@^m0S.ӕm3/?m2P0dNsh$VsuOD tr2`;k GƬL6oG(vK4zKJxfEW+ ]O֑Z Kt8y6mБv)Ԛ0!֏V Aa+sNYn҃la]^=J:='TcVi37,Vx̤EWGjt y PuNISO1NQ]Ј¦( Іi+N4,beic=ĝ>85;Dg5$a_Ո 4191`+2%h%ȉZ僴aQPh4z:oX+C;nI)6bs3Ǿi6iϳOxBml_:tU{6ONPn7',s.;Ni+:9kFu)ƚ#n驤qccNIUAl[Îsn/kҽqͨ,Am3Ȧ8$#4U(d,#X>,-*L9}4BhQ- W ph#N qP6[R }Ϳ̱o)-l=0 %7MmOp]3`>įUcL*Anvsr Su҆mA*ش aVz=h&[T# ~kv gN05ίjDeۊϯv{gw`v`*KpPߩJ6 %a|B!{`BpaiPe6͙7z,ūZ>H1-v=EcN(cWĵlEdL5λ Ѝ;sXp׏& Am+KS T pgI&lK'7XgAR-=<<8#TSJK^+HBUP*dlڈkhCش^'IrH'ǚ $LăhٶU_T(D/y<(e/p) 2+t;6YA6 %a|B!{`BpaPe6͙7I{yP%x僴aУ 롖u߰Du;CзuVM̚w DGHD={ͿWN|V1DG_U6 IjtWLv9a D(y=B% (#( :,*L9}4i/"ob|63,zT@Zv=#NnqWVuVM̚w DGHD={ͿWN|V1DG_U6 IjtWLv9a D(y=B% (#( SѨM KZ禀uI C͐P3^('T8hg-*516 pשm4 wMZ>`z.HI*FͿNû#*R {"0At25yF#fYRĆgOJDV7mEi6mFg[ 3N# ~ kh 8OԯJD˶{^Z[JI DI$JQFI "LW\cT|mٝg;)EjlɁGHL$ ATMdyXjx2P l1FdQx tHx4' 1kA]ԲTE- H<4߰Dqn 8^W= 1uJbqBJ=6֢)Pcn zZa7g/FgLi~%F=ڊAy@#48@A"VT"*\MLO1ִq 'dNL?Ѝ5;A'IW5"Ѳm_vJuwq ]56Z#M&  h/c@@j<Pw,5J<@SB#AH萈D濹u.KjYfEECARnoXJ87 LRzhz:%E8BpA?kQ1yA\[|Nvϛ?q' 9W` D5֛j=GgpBBleU+z)ӂ?,^G8&1BDWX aڶeBOpVkhCش^'IrH'ǚ $Lăhٶk|1kOg]@7n06(H2^dyXjx2P l1G*$ @3!,zͿwn8A[K{LwZ= f:!Y91a/&% 4hxЍJ`Hdi !3Z=J<@SB UH";gC"Y26Ή9"DӂA h+Mx&4dlD3I΀ܢc䣇PIYv ?`]@?D͖R&_e@AMe HV % |B!{`G*$ @3!,s' 1A]Բ\BHS f"0+kçjJtr_G!C=F@zXP?R@ϥ&-\[3eC@mCkͿ2CwWHVSE|#(f9C:#ڢP*4bi+JCi+N4 -*lNL?V?xX 7$HBI r-̬@p?W&]56~06(H2ɪ@8ē4U(HP!(s:$"Eo$=f`LjM&  h/c@@j<Pw<)dM +2T!aHdQm;oxY'"TBT0)}YF_>U߰DWZ 8^7<41b !z<bqF 6 pC6QC@mCkͿ2CwWHVS7L4pmI "i"b!lF P* =7"x2>XS΀H' ,Q\V^$P$\uEfV^Oa~~SCq1 Z4՗1 Yz;x2P Ir0Dw;Qm/GyP%%lxKi*Sa4l,8i%Kpע׍1MJ) Mx(/ TTy/b4+!lP%AS=Qɪ@8ē4U(HP!(s6tS)/s%L/=.K3Uu.!LH 6R i%IAkMcVLsPO`B0萸1[@1<PКi]?_BNT[BJō&7vZaΦb+Z{LA2>y xx+ DӂEB،4E]TzoBͤr#h&[T# ~ g 05ίjDg^ۢ.v4䗻?xkSmPPa(H֒IOW('X˔D`L-CN cT,TLAH4)x k 1/V> o[fwH&Zr蜸T%4В RņOv>Ut[&HP_sNSMS479Xf)B0hbbt˻ fŝkYXyc H 6(0Fw(`0ٲM-VXW0- Ns]Ro\sZp h4D]TlڊҐRRZN4 'M~bHЙ^?2x{~U#8ۯ]® #D{ du tpvCx5NC^ooT+01AKcs`%(ϊ42UŁNrPŐN$r UH"cb "EPMSXk4.}noƹQo =&p&sKH) bNH5ڪH5tӧzt5>}p_4_5D?EsaCB`P!b#Iۯ]® #D{ du tpvCx5NC^ooTM;+sFs(ϊ4鉲qԻ-X:d#UH"4Mae`? gXx=9dDZrQEB%*SGH5ڪETקz^b_kijB* F#*O@iؐP?THXohOn-}H=SN2mD1a^dSWs m=BA<٫=jsҕ csD<&CۙmfBlI0>įEﰀنs:N5m 딴&5Ҷ+MyQiPBJZJ‰fđ {ʈv@S+ݠӟ7>:{LJBJōvjb.$!%-!~U/zLwZ::%myN ugmQW*d 6mDJHIKiQ8L3X8B91}^?@<}^nhˊ*Je"XF}2H0MVKH gW0dzvoz4xBt 9Xac6MzLUFq`SԻr: `8ѫ8?JPMA 1Uϟ!m[n\'LC6RĆSA VņK>ӗgcךNGBDoGO@iؐP?THXoh#Iǘw&7)B>n:2a9z]O B6;;J^0׷U! )iz~;,`'PqNε-i b!lF P* =7!ZCfBM4 -*lNL_k<=@A~%w2,>I$K&Kˆ+2}uv>i )E|tnNghVxXM)A(SQT!./8BC#"!!:.n J G#`Jz\4`oQtcv2 \BJOvN)F[/CO_bU_kb:u( F#E?EsaCB`P!b#I|0S dnRiMH`9 lb6u֋H1?Aycԃ#hlVX07iƇU=0pN)ѼƱ=ruJZ "6Hۢ4U(cJi Lk(!%-ED3I`APzj F{{xy)z.+.(F`%H"^ 4Y-!]6][ X_A]D^1zWt39Xac5MzLUFq`SԻLRMAEBCH,n *&C5E ÃT=.dA hި5Ջ>- BT&Rh*6#}ڡ/qrt}t_4_=D?Es? +#I"1aٔpDlj{C$۔"T^NQmQBlI0>į6d`btYD(D,qAsP*L6mEiHZC )i)- 'Ir US('/5rJw@S\V\DWQ ߕDF3I3 J"Q.ĤjխHn++D%b{ LJa4+|K??yL臿vs0% ]OR'm.?S [2D>.Yh>gƵzZ{O|˾\g}ɔ6O;[x;ESHNiHyzE?EsU2^swx??廿]>ϸ7h|m$CSWJ<>YTDgo!^- r}8=aysz,y{syrN G0ןnH'vng!LOP*4c>~}5 LZ|sh& %jv?~{j)@'z\>ֿVRH70A~ey3A u H&%>1۵DOĵ[[TR&=Q*80éB]^9t]q@盿;._vw.lLC;/?3?q_ Z܍_k:Ůd7aWi~&J;2d qbĜ? pֿ].M-~~<|@~>۾{_~W]y`$D>-j2ojzve? ])pacGiJ ΁QT!.:5ctf'\_] _vSlr s7 |dSR@9P8wi^A2lf)$;֚svGI b)ԍ#z9XO7l@Y$)%h._ƌ 9wy1Щ;ǟxdO~ۍ^na@x >+7ct6~J9'27yG $FbĜ? JvU,ʁr(ʁuyoNpI4Q> ϫg  Er"˗1Kp P嵜Ct $[?{83gEuԷ$ c[q9P@9P<7se59pTPd|Gܣ =)ő;V5x{O!r7+;l@Rs`f8UAK-NHxVsxڍ^ncS}vmWG8} @:!>cˁr(ʁr{P{SDȾ.$& 9`Gs#KA\Kj*ٺ{ϛe E8epzC1:C>s'ڍ^naC}VHmWG8} @:"Or(ʁrԧ>|E7?vF5Pɻ0a.M.l[K#8X$ Ak9NHxg>{M ܲFhK~nppQ[K` Cʁr(ʁry7X?ǜ._}V|js?M?D##98:,:Uct `f,JʁۍvPSLzwF(ʁr(^:M+e2i^8kjU` OMi@ <ϰaΐ,8壒DZzC @#L:oc{a'ϊo{fquWP@9Pwq?|oJm].~?{5/J Ի5ϡsHxhˁtn]Svy>@9P v@X}hC @;|Kq΁<._:Ect ĶzJt+Rpg\SY< ʁr(ʁr1xaRCjnsS-:"rMFr%"^A[:AЁG@ݨx3K"펛>kwxB(ʁr(ʁ]?,jP("uH"x6ۛ0 p LOy H6yLr(ʁrxi?/;WDAwo?r["0x9byA (ʁrx<?ѯ?濯;pn 9qޅoU/^<;DPQxͿ_@9P@9^aQp? Z`*vX}Hc @#$бUY9F8xSߞ?O|'Vr(ʁrEm0t>ٿ?oǁ7^s߁r]^ 9t @#8re9wTPDB^9seRߞyP/j@9Poa6zjw"}}'0Z`O3.:ct  Vjˁr{Ϧ6Gs= @;6qg8dF@9P@9˻͢6G\?h[At`1x9w[4NHxoY+;@p`{O6l `{)dmP0֋; (ʁr(āOgwmg6dPη, *(y|9,fO3.osAЁG&jS1@ u`K%_ nIG/+r(ʁrxQb^;DpMU/^zC< xUC7G{x^(ʁr(ʁqյqb ZW$f]:ct  TL!r9x~ |m+z6?Nd| O@9P@9p/j"7}y<QAR@m"^x>~sy=_, %Cu !ܡF͑Ar\*-ʁr(ʁq3ǗF!+aWXZVM8SCϚb& 4s@bȡS<A`x`LN7 p \϶?f܊lQ!{;Ss!arDpMYg`U%@9P9@q:4AC> ~nh>|gwOh`*$f]^j9t @K,TLA+.L amË?&{T5ʁr(ʁrȿ76S5PoO~t2|9(o9)b4**xUD㼀;@9Pw|{oLyDssN~$Vs@Vۺ ?17b D9wy˜Cd $ʣL}07Zr tnswf"OƉ͑rNCn%nn /z'(YY9P@9P$w=}Ly.`VDmZpl%ߡ?!@%il3)b26k L7c Y@9PoWz]j|+n@͊7ʱS=/X)dI'Ɓ80`Mm!x`̐VY98UzfbrhnrY2Bӧ@Hޠ;]r@9P;`>TBm䗯bX3,IJ< @٧3x~iw:L,N&j0jy@j +4+14Mtn8tN6^^]kS@9P@9ȗ8 W=PPG8ako9osj'>wo4SĤ5Lepbu(ʁr(ʁGqs6PGR<-9X3xCPɜN^N Q>1k4]X~XAʁf7g4)bRN ߊlǨ64̻ Ѝ;sXp&bjʁr(ʁr0cG7G|ŝ4̳+:E-stZѼ%~?9B@A sB-9KBprYJUVQ{#]"rhnrI(5Y0\4MwW[7(rT*)ʁr(ʁtxͿV@o?p- VtXx2P~ْLS1ҝG9 7eJˁsn s"ɁQB-WfLzo۠.-ݸ3uG+^aP@9P|Q9׽low$2!ru"DAM Qe* `Jˁ7ЁwrhnrIhzr2 SVmPnܙúx濫~ΡP@9P瀼׏=6%w⼝oowv. F;%(d>T-7|n6 WV9ȋFӸrhnr!0;m1M4MXyA][mRz\(̾Oڪ(ʁr(^A7ODJM G(b $a`PdimU)^8M1NW)f na 3tMw.(% ?VH@9P@9|ȿYQ`M48W" uICS6 subd4U(d ctS1e,*,:o?ÙBMRG f䋁Zcmi ʻ Ѝ;sXpM ٫ɥ[@9PƁS܍F\?JzőTd=@mHhPȾ>8F7SX& ; $N)k\Ktq?)H uP4&ӎZ4jcm_Y6m?&TS@9P/9|ɝ8eG*.:Ĺ40]Jrq҉'Nݱ(Iz*12IXl HJˁȁqیM!p&[X3sS=A  |10\k4MXyA][qgnz9z7+@9PrGZJy%9YeĹ40]Jr_SOc1P5*12IXl H 8W9:ݝr΂Jnr ND(5'Ak)+6 pC7aC@t t[X@9P/}o%wLM8*p5;i1I%zX lm lpn*LCE'H^ Wr[ȝM\5**'_ o6<1P@9P8Inկz;VqNcӅ*D!57ĩ;%[#|B![n),fPd *Q-MRf䋁Zcmi ʻ Ѝ;s>\9~ʁr(ʁrav~{ѴDvv5XtJ*QȽC~Oc1P5*@C kEV^l-pz qB䋁f64`unqƝ9lx=>U0Yr(ʁrx U/sw4~M{NcӐ6BոSw,JgM r UH",6 $"Ez=^9pB{G(5'_ #n7MSVmPnܙÆ׷#˥C9P@9P<`<]G*"eSjv HC=JN#y;2%1|v|B![nѡ C$CȢgTMts斕Bz qB-8b`_Z1cnYqg(>snu(ʁr(ʁsٸvIM#}K40uN)߳?9c1Pu*@0DXl HD"Ϳ'Rʁ;No!nr0 |10\kxFmpvܙC׿CC9P@9P<{~[ib17qf9E:L$ wn<dX lM lG*$ CȢhqW ȭ%pz qB8 '_ _dxk H #6 pC;̡C}6}u(ʁr(^ݪ˗܉s4~M{NcS*%B34p3qo(8x@+Ɂ "{'_ 8HIAm(dܙ#mLk1Yr(ʁrx>{~[u;1wG)CsԡJI"x~ Kbdk4U(d <:T!a,TLAh8U+,1> Pp k7͘WĺVC@9P;%>6`!ˡ%qb*%ȁg/WN<ߌKvlhU(^íMV Vk%[`Cʁr(ʁr^-zvzGiЩsPCNpN?>?%c1Prb t ɖytB `YHyQɿJF> Pp kF 8Fg a nC8$1hP@9P@9<61uͿgH{]sŔlO!BjP!)]NjKre|oq0%T(IAf#M H^mpvM6}fO|Y֡(ʁr(#6Zxk'^8'nhmscr-^[Pw : 2p@_>ڊ{;;+xw/i_xO|>S[?|'~⃷܉[N6G>Xm _ny)^ގG(Oj `WͿa]AST3rc˿]~ͿK.__v/ۄU[?_k}o˗?v'?oN`6/m߯]?aYHp9:UH",TLAͿUrMr(s"B-q5H4qE-3cD/ٗ7˗}'Tʁr(<k/E_:?~|omM~Sms;%:*^1IQ74?ܦ[3Ccmஆ=W]~~MmSY9>ǿ߸?/9[Ke`?_g UUpf9HόPA#nX 6هTW-!6lEP@"low˻e @9P~勾~ FG9ۍ+5 PCNpNo*%rzⓆ$r UH",6 6S)/i)Tx 9'N(5Fq#3RtC2CX= ۰QGʞWp7W@9PɁ3?qm7\>6s=%40|s~MC=JN4wG*%v2h>YɱЁ$[n9*$Pb3tSPZN^X8U*^A=w* 0ĵ*Fg RυbwV84-٬ZxÁ3o_Uv@9Pf~ɿ5ݘ9(9 "> Vc N3iuޣ-4L1K䞬?' H@6 0DؐYHySn+'Mj:pWέqB[΍#pio4_ܙp4vaS ].k~[@9:_qŸRen0|tGii=PCNpN?O$r _B bCff "Eco \r:ppB:#j󏆡S!8%ʟoU(ʁrx=|!ۍSqGi9$jvӌtZZhb=yO:d lT!af!F3"ak)tuxP]3<}`naM !#jF-7JA@+/P//|8j17uI1oԟH@R\k9w7 ++^mKo#16h:"9KAG3,RAwr(ʁ: ~O|#w7y94HkPCNpN7 SzⓆ$lT!af!F3'f,VLv˻ߎ!UH\3bDm0t 3Dr/O&V93+W(ʁr5:K?K57ua#(9e0uR(,4L1Sw >i@R\9lQ O݈(RY9bXeuz>?$8FM:"9KAČ*XlTZ@9p?za^sٷX17mp48CDg^濟$Ewn$WVH@[o~ʐĈaSSYJf%$*zRr({=y14j7x~I  ;UH"9 pH[cfd*-^?З~pnb lr=t@9P@9p>Es` t=/heu (T!af!EoO[Vi9X40ܼ1b H@-L'Ga'HS3M5)llR(ʁr("W{7[g;P!0k4S)/ߛCʁ7W-L' *$c?<c&3`*+ʁr(ʁgp|/9u/vH )Y~; ?^hnDԱxxw.õ3Mi+z-N?,ʕ@9P3;bދͯ61|hv@R(0-6'Ȫxh˾' 7 $qM[I{gB7"יο@9P@9lC{6? yN Ϳ(p"osr֏~Ԫxn &=_1ķ0ȟ /6[UA9P@9P<L`ZHFImEYo~nH\+bwh" H6"(ʁr(Á=];/rmSmͻoO!lDʋ^JwY27'q9Vx #jYls٘MzQZJˁr(ʁr`yo_N˶{|bP!ʼnDʋeͭj@~+o-6n` w<V/ئyp  ]/n%Q(ʁr(́_8ij;|~qٚIP!/H$`h R^hf{Wjo^=ўCF1q!^Jm}NOz^Qa9P@9P<jW g: |SqxlFo"T!!:r§4LJ[o~u!GW^)^a{=^ M[Qi,EDO8*iP |ˁr(ʁrY @mb-BC@e>T!qNz\ MUz=srnjoc $o3n30뽃FoY?,(ʁr(Áe V%s>V9T)I]qhR&c6ĔrN~`3O߯(1krYͦ)0i,0W͠.^#GeJ[leBGw"X@9P@^LWQr+7$U4u3oD@ S57 5)(-7i)Ni6pʁ7~q-؆, ].iTZ@9P@4UqvG*%v2ߛ KOp橁}3:Y㙂rĹTr907G_uV=+.t}Nc'+-ʁr(݁=y%rܡJIo濟3_S5ubC0fg J IgZrQ03֮ͿXfA ]/ Rc Za9P@9Pׁ'QrgOšJI3rogmc붻zSJK-֣8D-|?n>pB 4ҦZR+9͑al@&h溆g󹿺]9U-Jim]zτz6սC4'Qkk>O.'^g^77iGBWj++4 @$fr[VW[tNvѦ9\6q7Q 6!ɦz4.8@y:k_4WKTb] p}9J6 @X~RoY->bWȂ٫Z]՚I.=ʹלr?Ȍ Q"z)\4 /mzZRYBD@HWVoME fc8 O/mz[R5`J^ sN  W@s(u٫ TrRZ"5ћHj@-)b= aj5'nH?Bw5m7Qw7:_~J$]Qh= pP-QCG'+95X-B 3aKfm@uUk^hU|myy hfR(5S7Hp@Drc! -a@Y88UUW֤פv p58ZG!qZ5f[8 bƗ&Vk+1K[&5  LyպhNZuUkkMԮN.-֣Pqk5Ȭsq >}'||?}q6Ů [,ޣ4P;ܲ 6 @x:@j]H'&ͿOn,X¦4Uteoۋ~juu hjZOUk(jLos"gKy aCNI|a.ZV]Z˷ly^zݣpNkRI/1&қEhAz7SjZ%i.&DŽ @HO0:EktҪZ[kI`vrY(x1!Ws^3*Jj^qmi1>|]-}i=U]h|xGwb @B{ WUWEj濲Y=?uz8z'n7.q5x dz}ch=U]H(TPѩb#*3)Tnj , pBszIlIj98{L-Rl= 9Cqn- Xc{\Cz F8nך*i-Wjt= :U0enc) @;{qnZNzݺ6;n,(qAyƂ8\Cmn F8nך4 e3T  @GH}z3.IjuM}c=}(a|3 ox-L*AP uӮݕzn=&DzNiH[U0QoޔKY {r~TTWLEb:{֣1Ӓs^3*Jj^qm]]g @GC ϳN`ukv5Qc< M/Ij y^֢AhGN] @Y?iXWjLWZ-CQȭkFTC X>&t4@) ||UWfer?uRl= i ~bD3!p2k3=>Ѱ!W:# +X4hLo\( @{t}^9<ݾh/CcV|zYazf-^?غi?]=D]Qh=XE:G!{3iDvU01u"r1 @B|an+ne`Q517zʚTRqq3 + %޼QQlξ\M]4TkoicV@QrKy~sTZ+`QXlo &o1kRIgzql!5ma& G;+p˲+W:]cPzr{,ۈd0ګ`* ʭͿ}?32 @h:o%5@l= m /.6J!gwsh?8I?>W.i#Qs\( @$`Z[M6ݎ֣1߀l 1QRbűbc4 ŋ 5w ׹d#+Xv~Wו_6zr:D#s-*Rޭ53 @szq]ںkPX.D65ѿPDN;+06zl0tPB5qI  p"憣usߤmS]5Ԙc9ߩ|Wi<8!dIB1{MeHڔ+XrMWZ-CQ}?[C @uTkJ?cRP6)bU[O9#?hÑqN|*%;xPM{M΅F?`թ rWjwEmbIu= ^݈윫`*Ki~RyST@NE@hCJ7zG5{`Yˑ?kww48'Y>ŒU‹ 'Pmp˦Ώo=cg[ׅ }[jm3&UhkEWn ꆺi77f3 O?P.A% !Ap˶DΏhTKf !@@W J3&UhkeanRܼ[JWYJjZ8.EQ+խ*7/OL6VJ? \xzm8"#VtMEUPN~x[V_#@H4ؗ^~ƤmIL+knkR^`䒻?w]&O„ @737zG7m@[Lkc~䬛hcMͿ?m xQ)'Ug:ֶz'NN@|+^~Mwm:tPR>d %^SByLEbgx @xGC=ڼ&n#*gZۤ7FI yGXܽVIv\yjs}^!6]gfp96zCQ%]H[Ւqm?CW,>A p<sӡzy1MUZϴIN`=Zɛbݳ_s&<)x^_k|6*"=}e)c^ ayzy1MFUZϴIN`=Z;+kŹ._^03!l{Aוwm"u(A=J5\t"1L!K=1}Zt+EfR{< GmD[Lk؉G|v5gǽֺ 'q5 '+^|Y/<,.5}*lE:GiAWT$ Ґlr ѣ iiim濮L\ef{Mqq^_2!pXz^ CQgCQ'ɹZ2glFNA 79YaL{<X]6/o6BB 27{O*ԣH(ճrEr*kY {lA p(Ҹo#qVJ +Ꚕ=?G3yS\Ή3p}Eq%GB8)mgPz!0z}.\ %~?_;F O`ʘ{c23O[廊$.7yfi/g'^M6ӷ@Cf(A=J\t"9wTKƵ]pik'>EUWċ94Ǹb(?3S@NM ۈLcRoc#5r3|?n+T{zeXzJ< f_H\M"!\j=mcԣNšH(ՓsUP-+4뎶V#Om @"o=m)"8z17YַɸYޱ͕fCpÂ|$^_gx:C/y@8'"~/-[?2{`^q^KYK띢l!L⇌U àfzrEr*kһe |l @8'x##L7bRi v֣U+6ti>~iS4Moqӷ k(A=Jun؀[,՚m{2 >; hٺ s U:Kur]ZLͿTmgU mPCQ#־x\ %(ԳS[LWx1g&>v[؏c@x4M}Gpxtvar Hfi@wxʹ} 蕵⬗;SJ_o>m9sA6B-o?ZtZ$K#5r3|?"mx@IDAT@>rO^/m'^8'ov3|/izn- K0cnJ~oC1@؍M_@P9;>H߁\+@ {Il=Pzź"9gTKƵw0j <Ǿ_=?^ @⍌k3]IYb͊7ώ”r^It\2IpÄ7Ruպxm''fn 5:/o~vƉ*\l G3{Sm @N.SLbR֡d)`DFn>:>]HH!pg^6z"ԣT.9Z2o[7]ǝ[?? }oƷϿ0J#@N@FA3ȤC1RfE ?TQsj쀋S5{M=cB npxchLUJ/Z_UTa/_g}We_۟y2DF [j:~?:]GlvEܩ֜BfٓF2e/Xb$Nxy^m\\Z\UP-lUcat!/S2C |O}@`,!m?fD x߿`v0Nyl89# s{xcy&9Z2 ^a@41G+Ƈkˍ>p8^'"0lZWJoaⳲs 02 @P4xS3])8 `jFӒ}oo`Tj`@b7=@1@JmwUP-G?B '_NNGmR֡0"S~Ni+N$%>6NI~Eg~ź@J?zop6CuClR",< D ~Lg<흟͊mI8 $jޙZ={~Xb@>ʵoG% UY+TK԰M+z86Ƚ~ǹ ShoZt&e#5r3N9:=bb3ө6q} ؏b]\ p#uE^TKƵMoxX:  {-w:f&en*Yo-}PĈ]K1C|}]SmxJxDq4G6(X`B p0i&Ř!vɂeMukk66^mwPTժwJD=cڏ;NõҖzKfp{ɛU%KjeP%vP*k @Rx{#-I;k977uM5Py^Frxn\uCQ VͿ+95Xk_L`*啰yՂ:R{vhBT <@nSCmDM0r37z%#f£j ̿[t.%0˚/䩁,/I 7N%5!WsjZ9־.WT \^ {D6kU5q} OE[ @G9]?%C{bDJ{=[Lj]*1C%l<nM5Pԓ; :E5-lS%;7IŁ!@ow7`D V<,Wj}y=Jj(SA piQ?C{bDF Eb4M3`µȽ^50CY_`6j̚O䩁&^@{^5X-Qk6]IٲpLey J#Uן?y*l֗ *1"I`@ea~l Fn43~N|9 TS eqZ`mr֮ibc<5K2֫ZB]8P䤧SYHYpLey J#r0nnOǿ@m2oW@N@{of>סW1~ ig:#Y^SM3y{5rNͩ/XxAq67 .͙ny* S*JYS +¬U8z0!@8a^g7uhUf5R31b/4EP*- ծ$,<*ZДCqtZijZz^33@Ԯԣ 6"[vLe|L [V%"os>__bZX0Gyow& @g!P?CinD[96R31b/4EP*- I2  ![ޯQP oǽ @`?W̍:͖ͭjf(nldPHP$ƈ]K1C no*sx+& ˰3F7Jt34%P+Fکs'`*Bx:C&^0^tP¯2:ƃ @)s퇸6bf(nldPHP$ƈ]K1C no*{x+& ˰3hq27 `ϼ%bAYHDͩ,pLeܶV}/c C uhUh`#7Cq+g#Fj"1FEXJeetP_LG O`ݿ`Ϳ>$l<;V9xW@#FdI,-k [V fnbǿom@Qz{7Q;;=&0R31b/4EP*- I2 !+-AoD(( {*cT %}`ϻ ok~1 @8~ҫr ŭ Jai"f(I})5U5<uJ4Ԓl!*o BDbqB?VeJa1^!@8ީmQ[0r3r6 8Fj"!FEXJeetR_JMGO`ݻ!`Ϳ9c  (FdA,SzJTV}6 - ޫ2 ŭ Jai"f(I}! m:Ϳ>$l;dG@6"KjLe|L".X4F0 @Xols{ᇷ^ Eb4M3`褾 {ͶPn_Zxf (M/eRuY>4ng6mL"SVV0B |ە[9Hw*1CQ32:/4;<am3[קd3h#<+ B¾α,[AI>4n'_V![ @HzϺ`#7Cq+g#k!k"fh2:/4?<am3[>z2KxQGa#47H?A~')K | l+sfVFp Ebԕ@k"fh2:/4`ݰٶʭߐ!$$ 4wcM[95R312iγ1ìJ2:/4`ݰٶʭ;J~ܜ4'kc'/  {o6ݢ`74f#v:,}`$aP ŸL;Daۅ M5ȯ`* " +$Kh{KdV+ D̷ EbxYB"MQHRlRa:5uրͿ'\Mr7» ̺E.MF}hR ," @8sc EbxYB"MQHRlRa:5k$^>`4S l3bvYANB ۅZ*BvE&$s}hRIʯZ; F`'uX_Vi EblXcUF'T4 GlM PıiiR2X׫ }1^=8n$ `*6 oiD0RO 7q', !@ncGaM 6"HPcd@#O~(I}!TsTNkG}j?^u..&PL[SYniֽ[r=Df !@8!seVF{1R31rM($LQ/2:/̅\a6@g47!,Mb=֯wƥ. @5 t6Ϛ!Ϳ:,uU?Dj*"uZikZz.DŸ8]&wLeI}7=izi!@E}PoSP26}܏m' II}!S3Nܟ߭f@2X4a)iyZrhH>V9h!,[߭}񋟿}+ny_} a$yH~߾dn+?uOR3 @<vXX7CdOB.I$, IfZ/Ԛ2[R-w7M?kZW< NK#6zvCg Zk`A@l*h,߿y B &` s4 Btdtd 0+*N܇ k4H?os0]0@ @$saSe62A'œ$M¢0$}?nz4&OzoS/ @ p$򯏉fFj/c# 0'I($L'IF_zӫ} FFRҤQAb @zD3#E]K~!$i$ͿYݽ]=L?Lovo͋ tZi簔 8=B^0?~kkB @B"ɌB.I$, IGU SIWTFIjX=}ݷٽ>z/?D @ra[d"!$i$hXjZR/ksuff8ܳ8N:-sXJuZLfӜ 9ykpC @3ۋ^F& 0'I($L'FESiB*LJc_Q2?SC5[6í{izF7Gqx @ pO煉CAMraNӆQHN~?87ChiW:V:M#rى^tsD @ \I@4$SQ 0k!͚-t4+sSh @ F66qB.# өi d+v ⺯4+ۥT @ @@/XeB&LYh7{f]`4ΥD*& @ K//C\jE!aHDCf kW\o# WD*nXإkKz Px_+OFߏ9A @}U\GSFi3;G{,Jz4dX @n"M 󦹷?P3%!fga"dԌmAB>to4`WX @>5ݮ s,t% SIց[H=®Ďi+  @8' Yks! S*mB*LftY S_wp~.Y._ @ Խ>YHlj褅YŲA}!f _ h+ cAV_[oxo}_귟& pϚe0)\f(jȠ9J{^LA}!Uؾa duMe5>z\i+ ,@D?M _8m"@x5C4B){~=A}QH9Ѽgo&濞t6ӼĂ %sO#_vl 'nx'XplZDaZҔA}!,$l_ 9?&h-@K/;[~$; s=iBP7FdYSUT 07ԬWi㎎@_Ϭ+I\@/L ~=K3[ p>6C4B) R1/dE̫x|?XY= =W6 |$_7oHB8@hLlb1E)jIS*L}.Ϳ?X}#ycߜ2 (7=o E5FJQDs($ 5D!aքƚy4BX Q&Ϳl}BIğ>{w_EaR-BPJ6W($̚X3UXLԼcX0nQ!xu`kNZ9&UKSEMLM׆o^$ %qb$c8RW뤭aRu;5MI?[3  '~#1C,B&LS+}E 0sugjg]>՛#a^|2BWz0Y_+%ݹ6Y)a@x6W|-BKH&5d2aZy+~OȄ83\41Cidy?mל ^k%7,֋ @E/=ׂY- 0~lM(IA}!L:S F"FtHv]5- SjZ>:O[5'LVR>ց^֛ @`g/O& 1d2aZy+~OȄ83չ@tHv]5- S)4'àN R҉Ɂ$ @ LSQ2C3~HP''.$\ "ϓ.%|x#@ @c= \Nu &ϓ8)4! @ pk/+;7}ݹ]?{*J;E{s7ߢb @ @tGjbșV~ g0sy|7-_KhMv7$^@ @64rfL*hLwr@{ S @eƜK-6~8iǙ @ p'þ4rf謠U|o[N]1b*R29zkҖeyl@ @"0OZ7 f^kyn9-_CE:.PZv+y @ p=OED;"L)V`lە&)=& zg .z5LP= z0j @ '=MIHfHp{!fftTa^Y3BOU 3kɇuN=zOwwU.b@ @NrS SUwP=};$ͽ`| @n$xMI) eL=RͿCE &x @ pgMI/lԑB&L0HEo`!@ ܟ@nJBeaviYL=R=Y?ʀG?:{A @ \Z?mn/#dL?v}?4/z! @ p-|_U{JUʣpoMH?[7FB@ @fUh_08[A @ iڸ"d,qL]'(sX鮕ܠz0Qv >@n=u!}_Q* @n!~ȾSK^OȄ٩3g:Dú|MwVmLSjAvl%Cj$/ q) @ @cf4(ۢ0KNkT;k2uZ9 +;@'DUtwq~ @ h;52a6S|M9tInP5Yҩq'vl(Cj$4 pn @ hSk5aIB&Zg*ݝu2uZ9 *gV =!=Ȑ7h$8 @ pO9VA2@ @`L&d$T;De5ݵr\IG7qQ>iBREXKpHUkYΪÑ,?7c*w! @ k ,-QiPT%2a=tw>Se5ݵr\IghN Cjp @ =w5C\t)~ߜS !@ M7qzo 2?_\֊%8T*P]HKV5Kg4F9 `C @&`;Kiiu2uZ9 $m?Ճw @wKEӭWɨbPUgUsdE\X/ @ @d#e\VsQeՌ٩n-_~+9Z^Q$֟׋)CU)UŒYpa^W @ @~1vF⚱HJ.)/' 5$+^2hzEZ^/ UxV5KVdr: @J JM?SK;Juw.a]~RsC8խk?QCth.к"^LJj.Ȃ [\@ @@vc.z\%$Dúf Ď4e|m//ZsKSM^Q$֟׋)CU)U< .W& @ 7\sQe1;ΪghNy!5(͹EӭWɨbPUgp-1 @ ܋@r s0LN4Q._ӻVNR8@Ԡ\^zR[(QŔϪnc+0 @ ܛ@l=JL"UB"LW]e5kĎ Ꙛ]dH %Eͭ.u"^LJڭ`@ @3ws0LN4Q._ӻVNR8b)x_^6vӞhPP](SyFV͛/zm$~Z-@ @ȿPZa*/B"aU)s!]S_N4SN9;Ϊ{6ws{` 66I @ p;uFݝue5kĎ ۙ\wPۂvCu c>}PTeW+pB @7]ʳDw3uj궖.oxΪWk#4GJ2t[%Ѝ y?T`1D̪5lW @tϑ;^]ݝԵe5kMpVb6ЛFKFkfٚvx @ <@zuw>S*Q5Ysڜ{'CobKZ.bU4-< @~#lǥʝQOV٠]wIΪWn#;>z[ݨCu Chͬ:kWwޮ @ p;y #(r)ɮ7(SӳA)暨S8^`v|0>]2tqVs tB^%X Q5j< @= WYj'.?]q7vFyw;Ļ4q jj"zݵpB @[ ?n 6h<1{ms@7*.<P]5|3* *n~Ϳ;1N@ @fo?3Z^@H4}~yF%CtQ/c1?цoo9*7OB@ |~lU,~cN@=XC(%X)<s o) @ @7 G۴Z}>was-5֏  @ xȆ.$JhvnIpGIΝ @ @ qmݓ0:٪nX;~F?d@ @`?QtrP,UǬ0Vh= @ p aAA6rw~.n1QV,spnݱͿ @G%flӁq?%&J^?"QxSiU #a}?PJӝfeVKnii @IDAT@ @%(+܁@v}0^ c߬*ØRC@ @rM{i?-bLƬlN˜K5p?o' @ +Ȧ#6Qm>!, #dn<@wX19ˬ̙X+< @D 6Qoy[kVo}Pc٬~ɱ濿jp-& @ [|J=Ϳs۟KzeŘ6+,_r8/k* @ K ,}?7}q-omVYfeejb @ @?DL7Hb7oXbUz/F6+,gxӛ˦ @ ĞcOrgs?mr.aD%9Zm:u˻wL{1yY9gcw63ѰF8bQ^Lf9@ @@h7QD84ު:'!/=+i Ca[ж F%3 @ pgnRlneRV OT*e 2֜7uޭ5k] meeVb8V<7?@ @'K~4Cw msp)nuK' @ + qEP\m @܆6Rj+^w7 @.Ɲz&v9Rzܣ{?rWG( @ p]\g}d~$ jEW^߅@ @_eJ&ƕeN /DkW V}&&@ @.&g#6wA}"?('4yGQGQ΄ @ m\d"͏W8Z>0% Prp]b}?_A? V' @v";nRW ٤x{PNIŧRc4! @]RZI?ۢ<('g`*E>F @ tMY6ikGwPNo9K ;>V?@ @HbhʲI?fC9κ=r2xeOje_ uY @ 0"6)˦k guX)[EDh$j( @ p LHIdlAyPS1z׾ @ Yhǀw鸍n c濂S,@ @ȝ}䳅WgKfl @n")<%Oquteg. Rru @ L\~Naah+> @ pmqҧD,x;M={8W?ERj=U@ @Vt֛t%)!au 2RhPs诪;YT8@S*=-S$*j @ @НpOm CY7=y}lʥ=[OUk1 @ ܏@G.oK"$v/wFρhkzb {! @ 4vіl`!Bl # 5^uaM5ZxAhQlzbm5 @ 8#% ffFhiOSrD5P0 @ Fqڒ f[,B)4PBoKNօ5}װ g :WM&Na@ @.G"$v4- ==KQ5h>+pK~$M֮~'x @ p7N\ Id@*՝Ew'šjk@ñ5lꦻΥR?& 3!@ !miEHj_nEqge]nu.3#iA]9d @'m\2 p-=<oqpsӏ$v]5Vn>3(@ <wn3CmOToo|(b5Nօ5u;3w}~zr-nu.G2?{Ŗ6zDlE`+ @~o;xL{?]5nG( -Rgw w9TA׹PGĮ` +Ǥ+h'CƑ] %K~ї_KˠL?-=}$,|W}eh٣[a,_BNvv돾õW@x<_[߯_/xy{w򣏟%g|⋐0[ [(.uaM5h𨺣9ElbV`wGRnWl3ݕOf\DE:G&^_۝N>8Q%'abaV5)וI8kPA $je3KR݁Qa]: @`mo{w||#Cܸ!QwAF j.uaM5h𨺣9M쀿 ;ث4G+Xp.Xǥ6.ĉ:.YSM+& kuQSr]ٞ,eP$ BV6$E @8=>_gw+[o%>rC" ާ؍5E-}ҩefQu7/`~6wm4QHtk~YR1SE0"#YC'6=F¾||m8Q% Y"ԊZ]\W', AaBB[~7-zE)4PfUﳢSš|Tnuqm?$]o'ӣdm E:Gk)3s$;%08Q%Kwidp.j S+ۓpנ|7 @o'ۯub{]I > cKMQgEg5EYtׅ6QHtk]yq(A=Pz{S!@>koC4=2Aȩ%IƄrqApXt\G~XS2x;)^m)%b^XӦ=7=,Nn#IWi߻,0 fvxKpt{C׊Z]\W', A?TIͤ.IuF_CRsc 2@Noڃ(}JSRbSš|2,t4zq}?$]x余=e蜨%uXl:,`EMaue{β4& @6o5xz2 K7,|pdm)jɕvzaMQ>qg7mggF8I` 8-wUeheuXl:,`EMaue{βCu4ZLTw׽uȂ A,1 稟(}JN֖M暑ޛN}cxõ6GIG+X/m}7rr`| {/㒰t~UVL0 ꢦ0՚0ΜIͤ.IuY_KX:v0Iy4 ׆_?-@QSdbw4Sz8#Y1:]({G+Xl"GFw}1I(wǮhbx"o=wݕu\Uo鏌Ug QV*aZzZ AAH[FI]sh 'ɯ>,D m3No3ܵuʻ:Y[jꋥ%WSQWvI` םA_=dmij;5qGԍ8uwc(GlʹP[XW4ԣT^0BS8wK"abaV5)וI8kPA $je3KRAVΡ2$|=,I ] |oXS'늚jM5 zog E͐a4Gl?R$N{#97#͡@(ձ'+ZO@ pڇ9Q%1wh7E,.CVIXe~$ BV6$y|\@5,5d   {wn b|kMQKߩ8u)3qPco Qvڏ{,#5+M9&GĽs7btj/W$Ʊ92 #\Kn[Gƪ -fn+z?צ  ( e[P "Qܶ D=I=St.4E؁"5Ҡ$(lN~LH UQp8ǻn*Z:*7YIduRAeeKm9ON0 |yE#I:) BX?_)6ZOP4!x^޻48烔\.GƎ7+A*  &eA)HG HТ;W@29 # -ߗ8G8ɶXA{ ^ jR~SI%THf𙬲 [,lOI9XJR<ɷW0 !xb5\.GF-¯w7KQ J8xba<[:*7YId_/CW A{_O3uB HÁ@p)j]֏A˩ͿBHO ҠQCwR)"5yڅ8xH:E{^ jR9atR!g!`TPhRa[Jmt 1p8p=;{/1U8t{C4CèeRsP$=0&Iv@zY&qa HRmvs Tp8eɓjا~'ty:C{&z`6_I}U/ h =j)QnKKǣ׈@BaЪe4(IX Ҥu;W A,ø0R]BR*D1U8pOI5\$ty:C{&z`6>}ٓooCh hXV!x&)K#\Aw7 p7@RI5F%ty2l @xkmEzf(w@_/N#M+aД>YݠP% +qAҷҤu;W A,ø056TQp8ns\$t:C{&EI>@Ξj-LA3V .r$4PK!Pp` +bYJypYh>#c_F̮9VA$ JV₤{Ą4){NHP/0.T_?Io<p80s\$tyu@,MR/".'RlT}'׾QO@c׏}AannPf(I 1!M^gx=, q iڛXh8pw!H$ty:C{&z`6.~8} ve)|ƊE=j) NLa],+@)<_Eav2JAIJ\t&e[3W AXBdpE"{F2&;2~SI'ru@,MR/"r5]RlDX<_aq}Z ?:WdSX. 0jAxj#c_(.wTfu2C9(I:!MF^ӫHHu IIN9KW5H8~v!-0O) Y^D]N٨yD v/?&{2T{HySXAn80O~fG޸9.nTfu2C9(IҤltz 4^FB:kht"p;9>J? rFp5>GeO`7)iz 4^FB_{p7@' -M%atR u9Yggiz?h:WpndSx*T:Ms]ȨeG4&&Ķ@jpTĒφe$p;PzTئ^E*Nk#'ȑ׳J4b80W|2(3<46&5i85 #!a?e8oЁh٠RNY$_DBK*ӆ]_M҂S/LzTPι*a= px]1CQHeG4&&ĺ&M3&Qa$$l'֡ p:n߭ WRNC}0Ҥ)T0?Ya 9(s!M=/-8Z<=y ^  8)b1(3.\D .6IФ"zr ~`pkKFK'Uuy&RD~و ?mE ҂S/LzTPι*a= pU80Fe~ Z&e¤z[НD085 #!=?o0p;:RyK'Iuy&MYD~و ?mE n҂S/LzTPι*a сU/ dPfhNL2mQCwM°^$*0 Pp8@o)FK'ɢ ,M^Ia6ڐ2W  _!Hhٓ;sLaU~IoN0NNQHe֧I40)5t'$ %NMHHOz,e8p7s'Nuրy&TD~و gmE+nt +3zTPι*l;Á'wKW)sNL2mQCwM°^$*tͿnb4*`pp@?gxK'B ,M^Ia6ڐ2W=+3CC.QѲ'Cw ;ªZ:Ynhxd=? 2i aRf-jNIKD|i)8pn'ӗh? _ggiuEJ*ӆ]21H] tQ=9wVvЊIf&g:~pd%@  2){ aRz5lN%̇z݃EpʁzRN ,Mw`*BEz]_Wo_C!Hp0cӪ%<L ߏ!+KytR,0Ҥ)]JMsM >Yѹ(GeOJt Vۣ0<g[F+48Q'} ef¤,*ȅ^nNҫ,,b]Ocׄ>5+w l$f2p89K3dA="`IS?OHOfooAua3 2JAGkOV-`Jfx?Z<%h񓲠d&IYհ;IB o4,b]Oׄ>5+w l$f2p89OIu0Ҥ),]JMބF>_vw|&mE=*ZddSX_A+z['(O l+q}_D1) JA.tCw^@>fazо&QY!:Ю27m}%h铲y]J7t'Uc kB 63eQ$p{;O{t,M꬈ޥt-6ia?o@/LzTPιF[{߶1xEd[nk(F6LʂR u*НW!YXĺ. }kVO6H̔8+p;=Cgy giKE.ۦv&Myꤷ ]/L!Hhٓ;sLaͿc8pGr*E'eA)ȅ^nNꏍ>o/,(~"kVOOg%1p8idz&TvwVB-k<_:\a7~> ]ԣeO*@v056?id\ʋ7'e`A.tCw&%JL? #!-皕FbY@ p<j={D,餲hCaFyu[-^y]} X 2-{2Tys)fW1x: tZ'e-z1MЫaCwDga$\x:"H̔8+pt=O{YIeц¶&xn렿4 (؝>tQ ݞ Uсi^8lx',,(ȅ^nNĽDga$\x:"H̔8Ksp8mhfI'L ٺfyU|_LzTP,GKt@^{-YF+ vzU;W@%OsJ|`#1SD p8WN{?{*?mhJq|/bKo>4<Z551D;C<+aIYP raWx4q/QbY iD=׬63%.Jb8pa(/={D,餲hCa!_<[Whn34Qht!f~q&pG BĄ‘!6 pkoa4,({^׫ I(1,~kVOOg%1p8[@I'E ;띭+:ބ HӮA}_uFC.Qf ~2#Y#mٵV1O"E-jR̈́0) 6t's/f>,~"kVOOg%1p8n-ʢ mjg7"xf4 i Vx/ AGMΚ HuHFp8~#aIYP #&IYհ;o{0aa$\x:"H̔8+:>0&bp\Ձw<+6y (餲a'{uEj HӮA}_ktQ53ɩ!7.H: /H OʂQ u*Н$:ϥJ?H̔8+p6|L ~ Wnw!HZ3Cɺr[(˙\ vzU;o{It2 #!-KT1t63%.Jb8pXaԼ {_eM}`/nE=jr$fGshmx/)T3:IY raWKqX i\6ɺEprcϖ6w/،$2i.QC2IUp$:~Ϳn#8_㪴 vzU; 4-|fqp8nn鉱~2 놏Oc AHp$:~Y}0z ~hMnH߯g{st;بh#l, 88Ϳ>⍨_)E=j(l.Dp9^ ="UrCw7Ak7(*)qqV"x0p8ʛq{ǦۛPI鬝xu,TZH~ 5}ARɺ'Ա́kw_sA҅1 Ju I~K;NFBZh?YlsoPp8;znm{_J^ףom_M{stQT 5,8u?_wx==ʵ 1 J I1K;NFBZh?Yk@tFb,YHf@8xׇB~O 5ŸG EoD AT HuͿ#8\{IiP Н7ϽTa$cɚ}bGVTp9@/(HbMUh-xL7{Egԫ`y/?]ԣf d]ϺL^Fphʵ 1 JE IWcF<=F8F ?w>O~ SŞH!ɺuWx]\ ҠН586LmĘgj(87umx{iok@;&F¼գ{b *Op$:~ͿߗbЁ_g)W9#QCwz)`ǩHH ǒ5;g%"L4p8py7?`keZ"͊"xf*ԫ`_CGt Hu^FpikŚUN7?( - 5KD~挅sIOɎ; cMdMmXKͿ)_2*pix?UN/㮗vZh6?#Н^ qj2j}(٨W2jhB1f@8t^\f{gyQMz?K+睾Ћԣ\y2T0#Y/~}Ubہ+G YhB]_ý4ԑEɵld^aܣʨqz =lĘg@8s]eycv:]|aly/V5'O԰p$:~m:q KUN?(5t's/8e5>ml+{[5N4YO烍\8phӟI/CuIgk/6|Pj+zԚ'C jU8uںGw*{%7t's/8e5>ml+{[5N4YO烍㬖|G4Fp81Vq)-u& Oi1Wpd0LH-w=_}_ ކ媤{5K{ Fx*.X̔8+Icv:k?0p8HԷgz&v& M)a2ۿbRϻ| ʓfC%` -4lws8_ ~P Н7ϽTaą`Cs ʃn%pn;)-6 Uz;OSkWn@xɠc GZ x޿r >` I~K;OV@\h 64W|`<3rL1p+;ziBg7SX${qŝ {x/P!H` -`U@IDAT Ɂ/{;湗v*@2lhsRI^\Xoō㬗@qp9[YN-6@/CuwVu/ N0!pd b6KB8vpJh tYfQDM}q#8%*KO/bpGqg~'I ([&TS;r/6t'ś^f$*D4+d^'2Fq˸{U'q|zry$p:+/?*gGOxV?wr/PhI *pו{;)<2'Qa$^)ۅ  Mh#8OkH  j wxm@;BYґ]qY3#Q6!6 +q@[+^vCwRye&NH JRN6zqxz)3.lĘgU2/#RR*qkLDHyzP]O{Lgl/w >*Q-ilsoPcWֆqLDy&zL PTz)3.lĘg̑Ϳz9d?!pRo}~KIB6@/Cuu`!7]:r/8&2Z3;om.6&CN] I湗-+Dϻ4WN6zqxz)3.lĘgwb6ydrOkS>7×~Uŧ/<]Nt ?h @8&z (=7+7xlxVds9lhE _'湗c [wA)0X/(0d=.E1fYK؃G^+G?/;^훿w.p<?ğy/?[7_@yzAJg:+`O^v_ QN?88օHye # .(͕jm%'q/-2?Ry|7~k>/3?z1pi;/ٗG~<:nxy!V?YΥ2ha{!A</kw~zȍ+1fY/Ϳ֙Oa߭|p8:؟mr[Q ?( ؛b&phgGqnĘgn;8poA]RyϬ@?ϱG*j#r+tf?Gp/*rӰޭ Ձ~G b`_]vDr1fY/v+"p<] #k`lWBb;v/pµTs2V~ó}tåֺ}͍<xb꿽;k"X,Jǃ5WghMLF%%Ϳ8U^Vr#XmoهܫU/|AO-F[ x_wiKeNM"l5p"lvRd>K*pN#%p8;Q}w8 > ?Oc}EɮT=o{YF8z+x ܅5g}TͿ8ہ 7ؒܶ Un|ސwvO,xN)W]ɿ|KLk^Xިcώe|U88ہvr"YacKN10_콭8w{Weƹ!5?{E p8^tM fb*z+ě~l݌0y~C8z?Qq|&v\h'ldC" p8p`ف~M 9<2#$tEh&?a(j'(\_ȓ!_nӲY o O>>JmpÅ?i>>a$l&?/&>p8~=ΞگQ(kmL'6,Tj'\v/ɐ/ji,^'__7w8Ӿ06V [8"r~gOm(oO͊S{ydȗdsgV7upv[zQqVpv9_~}|Jz\Zۊ+#c̪YlsoPp8Xo{qT׌Bb˻} O C=z}Br`; xj0_#K+TcIi,5Z/˚7Km*gblc_p82-C8fyPokby2FtqmٙUM,vˊ?ҟ 9J_#+{nVQp8nx/]rS4 ex=E*G%vM@ jvӄu9Vʛɣm}" k9]2_R/@>`Уvrt p~gO(oOuⒼ~l5m7?ڂ1x5?.FBl 6cPp8w[҅;;W.|n$S03A$aB8p#fץkɛḼCBL+ѳ}&6/8́b?-J]aj6ef9f/olCVʍAxgmM>pbDGU8x ޽OmoX®(|۔+#^_Y C<_WRB?wV' Qp8nta߼_E't SJ>97md ޙYD:+*عE8ۆ_o#}_'BYwOV]PY,@8l ~[-\Ʌhc?U8p@; 6͛U!7;}'L#̶Ώk7Kp;P|*p8;&}_o{?jČu@r> 2p8% S*Лؓv-j#͒@"Ns]g;cm5/"Fl_^fz(ʾ8pg`Vy_F o䌵JF\G^i{L-rp>Dw"{zxNmn}r[mFو3O+{Uԉ= zXH8OuPo=^c Mr:`Vv>¬ "@~|n׽۹.cp<ؼ׻ld3Ԧ]{Յ>:kv7`y]ͿDr}#7>u?9~7dpgr ڗ߼!6+caoRW木wO.mYWCԁt[?p8yw[hӮ&?MHqp_[G'|9 OsvͿ^Ht҈>Zn p8piN~D2?R҇=O a ߖ=Ágv :<63qV"8\{ېp8{X<[2b` l5%.H;p|ܽBz|Ɓ"1=Ep8yɜ؝Qnmi4Of wmQg^^GZ%s9I6{Dx#1STFSIxOͿ%"pɁoICR[g}{O6h>.~_cgV).:ױ=^+p8Xyn9DNDhkY_$u%}0P-m{-N@lc?U8pVJn9N{X'"4m5]0._ CK9=m'$i߇P^eXLr*<=]gzi("8*{ H8w;M τQ2QkMz xW_c]lNb_l)8jI+ŋߊq73e[qV"8\{mu'n" p\ޡ2O22+㞘x۬28 tH̔qV"8\sNAgzi("8*{4 2! I8pabnlGXXN_ī<{k!<zkf63%&JD'z'" p\́ɼᖱs"su6>̑~m/Ww/S'_[l2MO_7GC8@tpR| )1qV"8\?i8pMy{)-sͿ&݋u_2\zUte棘b7=@vwV\=HI`#13JD'zu|&ɦY˜=ygXh 8pyᖹȃ\h9v.f}_k76팴 EXDE<ﳛG~dkd*'3oZe=793B?SͤG1Oya?8U22v?sRBtOұ$}˛;/f r|"vڿ^*v`~ps?fl$fJB$N4WO|E8y{)-8x _2gRi; Bc8P̥w܍L8+Iha4p8pSUygg~]V{,4ֵÁ96 GHD5p8c:@AH,btY){| ߚx/o^,|~cG x% 5Uq֍Li]$N4WO1qi8pr{yx3*:V^ztWz=*z37vpjYɡp0w.^Wֻ)qV"8\{MpGp^l'h7u"y X|Nw| #Z0Nݔ>5L2p9Ϳ:' idp8l'gۿ) $b\li’#9@~ zw#1SYHDsU_m`u݉H8@}c?9 =hn0=_uYc5믱VOc_?:Ϳr]Tm8PDp4dEI=8OKlB L+i?0mb#){'n&qbGĩm7&eZ 8j76 ^_iҬ8+Ih'^n p88 ^oF%E~J.6]f͘FxHԶCg|G\ 8||cJ)@!5!*OB8pQo%3']l@/VleGΧV/\WB<_. ")*暓IhƳx-_xLlDp<yb+ͨbtфR?yş@/nGDOּJB_/'O8pI>_Ϳk8IO50cp8pef Z"]l_g("E]l/4=[hJ|WXpժ>S!FbDYH35Ǜݕ%DiEGidqdzˆ}K=8pn|~勓̛QNYD W6͖QIǾ1I8|__u>γW`#1SD$ _A͇G>Bpہo` !_B1:cB)zǷ@/Faߌ5(}'囿㡵Hgr]kf|[oO.V8+Icv: ?a_[;\8rs?c/w}́Cbt@# D7xfA<})嫾l?7)1fYͿƛB}(up81/sR!_B1Z(b󟚧 @Mk7Cĉm,Zz*>_|>*` {z+c M<@!iOdo|G_!Qp\ŁË?{W}X"? D;"Nl{%Jȗ~Ӏd>k(;;ϕu'%y_@!UsxOGg^>|p9P/o?^,%3Joŋ֙n?uN~h|_/_%柎Y*NlkD}|m4_?O~ǿww=: $gLVu?˷}׾/O/Pp8e?5_3| hR{L+fA1@fZҫDrO'^~7׋~~[;nPs"/^c?kD'__/Mx_-s)g%"7b̎Z_ [>#/}w7Пї/ʯSp8|z'ޯoƏՍTVw/ӑX]׹n EM^/\typh79n(M|E,@*`O 01n :A01$vs>a ԃJB5(TшI2 Mʾ( V> ΡiPZ6t' V) 3Fmo߼X 7N4Y1Ɖ㬖 ؃GZg8RDp4dEILA֑OY^Sv~%oH.πf)2&CC=a\ixբt|۴&Z6p3$TaPD L q!\4CDNI'D8.?_ ʗ(ТJ8);`XE4LQr&d-+TZ^&#)TB1"93++%,OR·QMz )π|vlɁ@;v H I2 @HP RP Ԉ~BHl@P=2*\@sPZ6t'yz(OɄlݖ{[5N4YO烍㬖_ c,$M :zIP)" {*(Xn6(|JP 1i8.`"60&5=CD6h.kد Z(ТJ8)yM!?y\D^l!gNֲBO'L9^&Z_wɘTM7<&Oz{ZNQA01$vs9z(%*A>< %5u9`4bBS/'eςsh@ IgdB QQ0oe8d=6b̎sI^VУ("8"OI@PGhBԝ j? *82ߟz$ø*>3ԫECyO(q,Q)BjAρN0fҿKBR]Q Q@DhQxhbpKX+Iil[;.""fml&ݲ~xl'^&O;3ԃ2 /vs,ZTo'T #y_)e?=g:gP"L ݜF/~$V>f\b`ƐD{F/"Jʬ.P"Z3=/Bt 4%-x%J,}V@\h?WO6SsJdYHq?l$=:iFyQ ,LϳNÕEKҭRA!Ӱ),-gE:a҆ 7 sdUdX>0ƒ[v* -?\le J"d<`)N=ah-P{p :KѕٽROr0|+?Erݪy% D?,u8fՑ|5ݤא"1fٛ}!]r $Jc B$)AXxAJjrtEjD?! ZTXDE w9( - "{vM-` <MֳML1fYF[XZj2萺uSV]"@sOE *8(RQ'ςJLއފ`&Bj.aY3T_@D8\mSk悮h* Ŋ-*4@{SOX+FK z:5t,EW^gJs?eœiTɍ#t:(kLjn`}r>nkHp;XZ!`69]0"DJo AJjrtEjdr*q9  &eA)HHТ;)甛r4R nS[>N4Y#ׂ㬗y -c,-N5tH:)aRa"S z? MgAU|f&iCgIoApEqp0Ѭ/ "h趩DsAW4X~MbEIV A֊gh{p :KѕٽROr0|+?Erݪy% Dwڬ:2XR2<8_q@0lȜV."A%H 7 %5u9"5bv2h9J $pAIhQНsMvMk}hpT'בkFq^}\J@ʈC Ӟ482m WN5yH:)aRa"S z?ak*>4lP̰㬕c7vΎ7CaЈ@_Dhh#% `"$s* -Z@VI<]~࿚AU DIV A֊'h) Э]y+un!gsʧQS$7Э'XPJtsRcM^OPΏט:\6_,`'Jc B$)AXxAJjrthdr*J&P"T6 ; JB†ȟSnEk\K3F-Oo8d\ 6b̎^&LFf$QNYiK-&ȸY>d!uP*"EJ 8TNq4P hWJTPd0!6?^p`*W@DTfY!Z^)ă(U"-hx,J?-WY[єknNS[g)"8W)CORueHn[5OֱD瘥Ǭ:2[OQ!33`Eam2n3!T ,35}(& h&jf:% `"*>z)Y@VW `+ʻ=?cUH 1< )+hJ|CA7'h) Э]y+un!gsʧQS$7Э'XPJtsRcM^OPΧ(ϐ[auy`EaT2n3!T ,!_"@sOE *8(Ri hWJTPd0l Dρ}0C;CBr#K)qH#U8^gR-*>l8"niffb-of(ȵbe3@_ Uw MzZ 6CwYgUTŴ*ǃIWʗ(ТJV4Mڡ@M=Eu+/{ι͟2 aN4*UWUdKJnYp̺ɫ# 4R`+NpTw6X?0i1!T l1$);A˩蝠J $pAIhQНVCg ]h6my+lj&uZcv7Oa{L3KyyŁ`4Nq4JW/b2$܀b zL`Xq`LhBOtEyktޯ [@+ ! MP[f+03zE]l:p?eș!qR4*U7"n R۟c&`Ց 4R`+NpTw6}Xp 駛? D %Cu AJjr4AJm%B'V$pAIhQН+ DeƅUw[*?M4Y/eƅ㬗y sfq^3(KS@G)_4q {"&c(PL H!60^@Y]_2BѱÉ(z4DJѧ(]NXkPTR !4%EaCwerF@Zh?WmyT4d6b̎^7| V](GIgtPix`jV8/MS | :;APd€|g:cfw:%``f8!0P坒NLtEyV rrDIV vMwk:ajnCnRJYXg'g("֟ fa6.Y'dmkzsus,k-̳n,}r>vxxp-݃mmXp i1!T l1$)!u(6hJo.P"T6 ; JB†$^!g/0.~:Tqhz)3.lĘg]]wd4c)hau+$hl? *82ߟSI44q,i Ю &ju ~[g 3D;&BqBS҉(j<DN(ТJĮrM'UMѭv(M*B) ^ ESRl:̰E4넬M_umþнXuneyM^OPΧnϐEaeStoy2˹kabHwGb3a敜=TGp1],F RpTfuժIYP ΟiPZ6t' Q?{Y&qasd^ JznT ;01`'Ќk/*ska4]ޞhI -*4@W3$UMuP:C>W?CT03ӆEP%}N\M=zLrBgB b6$sGd3!Tt;`@R w!=9ޅ5zMʂR%EaCwRsȃ"5>ml+R}h^G1fY/'4㼔LPb_1!6c ;=L,Txy]QWc'TeYm<`k^͐V5v(M*B) ^ ESRl:̰OrvHBb? :r592) ^r/5G@HRI Ln9H&]nLz!$=0AIjNqr4,] 3FFx+͎9p#5(),6g؞_.k祼f@um?vӐ)>õ$2}hH!6ݨXwBa@3Q7Cl~uaq0ChصP幵0.oP$BDIV vMzث֪]N3'ʚOIa6ڐ2fgNT4`LR%έ` nyS4Xa!`dJgƠDgTŏĆݬi ,)ŢvRʬnPf(I33 JFI^a,5>m4+﯉_Z7҃ %`OFR[_)s#NъvѤS}!6`[wwuxM 'ЌPn4]ޞN%BDIV vMzث֪]N3'ʚOIa6ڐ2foKQ=z ݈ ĹŊ׈nyS4Xa!`dJgƠDgT޿p@IDATŏĆݬi ,)vRʬnPf(I33 JFI^a,5>m4+5Xm}7҃^R6g؞_.k祼@?N@KDi0 =3ȈC{0!6?g(2! 4c3,*x+ʻ=?\ bϵ@DhQxhbפ!aj -ty:C{BIQT0?Ya 9(`F /}:G}bxJ)t# *k+UdOQU_וp0!>yabH?+ 3l>,3'";V/O,59{V/^w!eMt ov8e7o8{vjI:t~TZ.SͪWNъdo3S]Cه(Lucf fa1vTxyn-&3-IA ()0mb s kUS.OQgtO5)*"֟ f#'+l!ge(!6OPO^I=nDAS`Mze)W 򺒅JK=.Tg`!qލ_D|?PAIJ\t5NH^LHʃ*^C(}7҃^R6g؞XK+?iT'=o9z@% ԫ h0r(nρSz$yHvhZ>Gـ6p3U?:@̰8! 4c ZMtEyg(ZAZy ƪfxKtW5Eڡu@^Y"b)`6",~OrvQBb?9^uSFT8U֤WȞxMױZ5D ~(VF!t % bHcr ᐲd"BW@&e  3F@Zl?TBe͐퓽t ov8]ZN:y٥5}YM]*)^AS 5DaF !Yq#7CųԈЬ%̰`Bɞp iBR񃉮( |0U 'Sty:C{BIQT0?Ya 9(`F _S=]mJLPR{jOX:ZࠆQtϬ3 H1$ڳϗ A$IW4){NHP/0.~<+5˚!'{#=%`p퉅S f=MuٳKkTR BZ 6 *8j"6ŒZClFn^+g1CYCYKa64 /a,z !$ˆr Z.?_$* QfW$}s˞7`rzɆ`4FC⬽ao/h4C$Iτ4){NHP/0.~<+5˚!'{#=%`p퉅S f=MuٳKkTR BZ 6 *8j"6ŒZClFn^+g1CYCYKa64 /a,z !$ˆr Z.?_$*{0aa H@2gJPxp՚!{l7_a{ne)뼔gPj8ޫ qPͰߦ}1CAۿ(ЈDXVfXF d1&B 0P坒NLtEyQ۠'9`juUSpCI'u@,MR/"֟ f#'+l!ge(56nړkeXjj"T`z ݈ F[ל^)@ _ _pPC(m%Pr>5%Đ8k.}L0KF#`}ʬnPfHZsPIW4){NHP/0.T/֋/k85;@7_a{mo)IdSYZ6_wGY*o(# H 7C񘷕@Rj*be3@_ !,=^D I:{{l@G ۥזX6~=#bbZY35ՁlCC(YG0L /`"B&^@U7:v8e w-!%V vA3j >CnN) Y^D?%FOViC.8Q(Cl>I:{pK)7r)9vu͒cG&ǷisQ'k6Tm5f`4yȑaSE?{Q# b[<52P3ZYTI֑IS8z\t򰺦o3ZM]*iFx8X5!S#5CųԈЬ%̰`Bɲ?!`"PTxy]Q0zʄ-T@0V5gYκ)8 M=A3gizT0?Ya 9(`F nSBev@3Iq^I{@#OST#O:nG?[Q(pabHSEK CuT>&%D0C>GeV7(3$ßt5N&e3mCo :W2skK#)1yEx#zܒ oLqpi4Nq45l~Fi_<52 VqF f eu/aeJ ޻ܖ\au,Y؈lڂ $$Inr'kr@@6,%ȎdD)|fyfRUF75jsƬ֪7zS @U \BL볖V&δHO/P9`d5W7f5wD`ޤIEDΧjDH^BOwg4)`B~Mnj޼LkW!E9n 8Tq8.Cg=XI 3244xȰ!vTސߧOhoQښIWg=,GUT?OUBaH xG =- T_P/<_kPr5rMmQuĦ}.j`GzۻfUgH.> 9If8y*\L5N4@a%+%: iF?@B'PA2& 3- AYMƪYM{,Q+7iz)!שM(P(_|1#)7/Sݣܢ 3ӽcb%)"ÆQYzCr~>FikGZ']pĞU9S5pÌP9@ S i2ZRuA#M"#X:(0ukC&M/"r>%dT#B:|;I ŽoR5U8f|$e \{[7P7Abޓ~p='w #cCh@zC4W'(mfcг! \(dzS]UISjTd0R3 !'u&+-tt5[G4F>5#p?&Y3h$C_ M2 V@ ĚI f51(B\! /f̡ ZGFHHi}֒ij YMPLD(PU@`ޤIO ՈN6hRFBqTMI9y M'=d_5rz ]B);8ސ M%8F*{9J٘ EW,JT",sUrT,ņ&- -pHI]tpJ5]hDMf'a4"Z#r{8 dȤqeAY"nsz(5eKԬ,#SiZ6RGA!i#B :3tHP 4ipۼp pZ3H)DbcvP0a~$b\#T `ZJRJIl@BL볖'δHO/P9`d5W7B90lCVW^{&*"r>%dT#B:|;I ŽoR5U8f|$e \{[T5P >|=_J( EbGRD:'He/Gi3E =BDeJB TФ"U85^i:5sjJ8b"wáPLtLWJ+ͺyp[[E)P`jV\Nˣ'"'8?4 1O@ КIR!"\Ь&fS葫s>5pÌP9@ S i2ZRuA#M"#Xʁe갲* ݛ4P)!שM(P(_|1#)7/SݣܢҬ G{P(pA06Ď67$HS~u2N^f6&=az<;Յp9\>8KvIEf #5C 0R}AqRWkr=ݿ+̉ N9:-p?cuywUvzfD"ӝR>)9y{e'h$_ㄈpA]LGF 3BPFERL## $ɴ>kIe]45ߋ&ci(&"wkV0toҤBEDΧjDH^BOwg4)`B fCFZ;|mÿ=khܳբBR!vq e=,dp#%J٘ QW,JT",sUrT,ņ&- -pH=I]tp#r6a(eջl(%9iEt8 z6?oV@ k&'D B` =r5b·0fn06(djY !MYK.;b^$`d5W7KC90lCVW^{&*"r>%dT#B:|;I }xX]nuoC~sKѾ{ZP(pA06Ď6T_nDi34 E =BDeJB TФ"U95nD&lpu4z<;_ p`$_ㄈpA]LGF 3BPFERL## $ɴ>kIe]45ߋ&ci(&"wkV0toҤBEDΧjDH^BOwg4)`B~Mnj?HYTѾ]x'ֶB`);8ސ M%8F*K61AYOB@*r-_XdG.4USjUuMT'%na4g G3^qTl8D'kQ5p(D"fR<魢Ԕm~`jV\Nˣ'"'8e'h$w.hV })Ո9a&Ps(\ePkdZtBLeFVsu5Tf CVWLN`ޤIEDΧjDH^BOwg4)`B~Mnj?Hއf^EdBR!vq e!AJqT(mfcгFC4WC"Mr-ȺEуW"68.>' ׬YN?$Hi;v4zMY[&r{; E47ȤqҬ9U OL 2:iyTDۼpT."jbvP01C^^37 `m$PZEĂӁ4gI kO/PT݀\dY5y|:njjC&MPD|JȨFu*twF2 &{?'ߤj@t*k)`e H/Dr`&{Ƹytx=@ 4FVsugvߡNZнI*9)sJmWD-2P9Mځfc tou/3Sn h< A06Ď6T_n Blyi(0QE`Zu-4UElq\}NY!HH&vhf>W5#,{FQ&PsԐA: ps̠TdL4]LC4Ѵu90-JģÃ4 +^ rjng|NѬ]oʧnEA=cލ`M:¶q辸ÿ7\{"5 }/ÒC" )a4W'(mfcг6!`pq^ L!{&XdC " zAEnzhkV,hĴEc;YߙP.v-'PJFo\*SUBӾМZ}@P˽6QPo  E1.|0*\ 2 B`P. YCanhں\B`rHJsyDQ#x,Јz 4/`d5W7YVvߡNZнI*9tFWPkHM;7X]z5rϘ$uoC~@>,}E  EbGRi*ѯN 7 !l#3Ả"=%ajv UB" =K 5+d i4dbڎ"±ͬ]"}pSL?4+T7vnQW+a<25ڧ;xTr/M|92z Cj\^f6TdL4]LC4Ѵu90-JģBgChtPF8jng.Mů ҔkVvtu,Bצ^ Hĵ`M:¶qt*_*>5DG'HƆƁ@Jq|C5Fii5BpusHO`}/ " zAEnzhkV,hĴEc;YU 胛sҬ }TAFE8RdIJyWhNwZY> ^J(p(4:2se2@ ps mp_30 Ș&i@1(f iirpYa[ ) G!I2}頌p\dY5y|:njjC&MPD|ҕ)]_q )װnXM3&ktmнt`s#4_}!:2A06Ď6T_nA6Bp0B ⾘ruu^ VY_pEуW"68.>' ׬YN?$Hi;v4z7>XaYAp㍊ZqcV/Мb}@P˽6QPhud ˀ=d pz K#f€VJ B`5F4"t43e f%!.&{*) AYM5-՘[~–W]Ќn*HSaWVvF:h1ֺ:nˆ @")p^s^I-KNE&du=jE);8HS~u2N^f6&%X0B8/&ꐽH\ > " zAEnzhkV,hĴEc;YU 胛sҬ Fp㍊ZqcjIJyWhNwZY> ^J(p(4:2se2@ ps 866!0 6fHxEBNz$(k*kJHJsy.<" t!36Eh#UCBA@7n04dTPlV?k|]'c*`a+U]Ќn*HSaWVvF:h1qF$06tJ{!}}{?:q/SUlh#AzX =jqSr61A,!Bs>" "  ,Ҡ5R 7D}C7hl0[ԎJ3ш#ߧv f2(Z}RӝVVl*wn8ZEGBmD\^f"ђ8 " B`$ 0{}SePe S)Ii.%G$!x&°mjHh:(#)&np^ut75Y?C̷-bc횤3@3I`M:¶;2 -4 #ٷEGrOѯJ$HY E+N 7 !x'3xt05#|K"T_pOӫ]lhw !%wd}Jt`'M&("5[Glv͞U;7(G0V>iB) N++6jnVёPۀ=d"Qf's$#00wV&QIi.TxH<ʼ!xH: Me]H5 SՀ_wSaE{ ڤ@]7=cZw0&a?4}[VrU: AzX -Zq2N{ !xp}=:3NJE| =fbH;v4z?h`L+Y"}1YCs*oP jQ}c Ԋ@>4}޼z9i.]w*wD *:"%V͇Q@v4otD Y^lѴ%2gcsB5L $4k$ trEb*w'$|hzFPN9&༽2`.H4i0 7@6DQgdPe 3Ь\6M(;U$S(0 P7BFOVOamjQ3 iPH6}lKfztQeCw(e  aoo6艐I6Q9y_ApO-bVH{XEpCr՞gq'AJ-ӳi .@)D.4Ui#E0R}G׬YNvd"Ύ"±Qu0chGhl7-uG#1:m~dŖNwZ̎A.&{aU# E|qhߚn, A%iK U0͚Z )tם{$ Me]H5 SqX-nh)I7[w@c+)ﺙ^&e*LCכ2}]}FWz/ FHWЅdЬ*-i^>!hB!"\_Ofs+ hOizDzF#etd !%ڷ%Y 3w;i2gG؍:b)lcMQҜ-ucVFp06GHH tQe|*w'5\hq(!(? 8$!`RV\m` 00+TY@D^ ) "w 51~ 퀄2.WHj65Y![11R&hnM]{doR)$ 8t )XIm![u7 O/ U%m{#Mfcf&ӝE(Yajv p(CJ0NLQD8v#j梆F{ rI J3zNg!::z:"%/(ÿP ,Ȳ\w"KsB5L $<0="+ZMh^O/P>)0',uk"`T v;amj?C̷-bcL&o5:]7+ߤRH)pz3Rҽo5scɾۢ=E5DG. fUiI|^ P05D +kF鹝Ԫ" O䂰HTpH}uGfJ 6d"Ύ"±ͬsUCc=9$%RW=ֽh8vNr{2* nVёÿ5LKl` 00^&fBB3;!p zz2R`j u+$`T`5t֦&+p?8|51R&p1K}T}12]7+ߤ6t-Sf0 c}{o={ߪk,Г|зEo{jMtk ]Hy @ͪҒ6An 6JZNeT09id}"Eу4W@Z)ѾrW&qvhf71{4'pK]XtxTrϐC7@-QAa6C›00(P,AL`Hs* `J!/BrhJ 51~ 퀄2.WHjK 0qWh=Zbb}l=cB7`f  aoקּt[uŜz/sOix ё )aȠYUZ"ҍFIk ¢ = &G" O䂰H^5;z 8RX^ !%ՃWYN 6d"Ύ"±ͬsUCc=9{On7S=2˽rAU#KmA9/MJ`JԞB`2 7A DuFi͐+T `J!/BrhJ 51~ 퀄2.WHj65Y!Ks51R&hM%ccnWI7t3Sf0 c}{o={ߪk,У~зEo{jMtk ]Hy @ͪҒ6An 6JZNeT09id}"Eу4W@Z)ѾrW&qvhf71{4'pK]X{/x4rOHn *:<KM]v^378ienDL꾍30!W?@B_ )兆ʕXOjg:ԝp|ϼ;B ݝ+׵cVҍY6oR3/p?f<e,ҕ!:2!=,4JKrQ1(i=0BD(Cg:чH 7 )"i@ M\ھ@ ^ߒjFLQD8{_dmNSLTzGnh!#A%&_^ RSjHլ@#)A.7@H,Xr?[C› So##00^&fBB3;!p zz2R`j u+$`T`5t֦&+MR|mF%ģݽJ7_ c#1hMJ35c=muSVYᡭG`q: ё14Hy @5"p Du[bm80Ė#,7&wgJAhу4W &Elq8ϣI/xtz#M&("0W54:oc$iNꑶ!#AAidj~wmJUtd-(ÿ511$ P0%6B=Ѭl"h&tI/4S bib`ZE = X > |xh= -1> lu4oRΆ g \w^tG{̭cX@$Hy @DY#c^bpc@j4Mu@YRD Zdv kzhлqވtؽδLVD2l! FV RzInh!#A%! _^ RSjHլ@#)A.7@H,Xr?[C› So##00^&fBB3;!Չaz*@E Q78jB>N,Vp%d,!#8:EWl3*iRl+ߤ4ԝ-pa'uɯN [ugDzz \H}#yYg|Aԣ[?bm8XZ 4[T ܝE(IOd@ REfG\@9ፘaLݛLdA$p,`dP!W9Y[2Tՠ.5] 4x4rYipĂ%+(ÿ511$ P0%6B=i@IDATѬl"h&tI/4SPAZ b`jus&TqX=dA2kYN2b3St{6"x&*ݼi6ΕoRDa0ۓtTӧקQoi Ȥx|fdC3 WKJP`2pwi$=)H=Hz>#E0R}_}cqF2ˆә$$|$pBCP3bOU8iNꖺy|y5KM!}W?zlV#` ?E(Cf&H4@ LGW?@ 4$y)̟U# N2 T7FOVOamjEu2\:gtSTwfTB}@и=f*: ˉ 0O0%6B=Ѭl"hft{i.L-a! )02SwX@sb]F.>7JgmFŝ\sn9MPwWuiܞvN-[ugas>#Lw Qo6Ď0u FK0j8j n5oJAhу3RDY^$$ڟ`iQ/ehN=^;h(aj`tP߼$j4 yC@ԥԐYFR]=6+ nVёXd~& So##00^J3\~ R[*B L(CR`J9eFOwd"f.͚p*nQqg0\Ab|.4ԝ-pauSVY}(>N xFqh;,%+V 1F5yph LOu"{&X$=)H=HsAn*5'%K9WhOoԳHAmZ?C zk$IRW=^4Tՠ!#!oPghZ}@и=v *:դpPp$``JTmzY+T `^/4As6oܬI-wwFsTy?/7LCݹ_q{_˵5KUSk7 xiBjG1!9L[{C =.jU;JOu@)Vz_ 4k^G\G˫ԜD,-^aGݿa9z4Ͷ\~yA}$l% RW=^4Tՠ!#!oPghZ}@и=v *:դpPp$``JTmzY+T `^/4As7kR]mFŝ\sn9MPwWuiܞvr-k gRѓ1M\b14jWbdj4 # `b_d/+ׂ'2 )"i@ M\$ڟ`i9 A-ќz)5Ͷ\~yA]Q`Ŧ9i[J/ |:CA.ڕ7@HWK P [4+aH!mS@``&4'D= $(k*L dpy.az ݞ&xL- c݆  s MؼY Cp&܅fT!5WP_F7QjBwp!: ܞ#Ȍ3ХFSkW֞j;*70Ҍb3(*Y#<7ÁEa.oS]lIOd1-!swoіa{o>|g'/? @uPL%ͩG9}˷xo2=N({nǜm(pyw^~7K?wy5uoT_._7/-{?x;g{~Nm)=&^{796[o^;~?}.W?vO84[iq/@\A{.2-ZE\@̡ƛo]>_|[߽|o^~7G5@LN7ml@̑^?m {{/^W_ݪE=M(C&` P(wƷ_Y=]|m)L={嵉~+S?d_h-q9B]*~|#𳗏G/??6;uͤfT|Ty^>N-!w Ɛzw˾ MB]*V^ɇ?'~.?OZ,UT8n ]?P?Im>/&z`fgdh^#kPf8phM׍|o~ߘ-04E@3H=Hz>#Ef??>h% kfaGsIo7_ɧpWQ~s\]ݏ/~7˶e:Ss F[O]?Wm+;W7~g_㗾./CPv+:|+X_?ˇ>.i}β(Sggz^>/t_UdbDn/9秦x׼AkM6,o z3||Ec91=CЃFV œeџy([totk gҪ߻|{pv#?|/M`GNޔf1Bl^#kPf8phM}k!%/BDA A)6oxЇO8ʚzTaj9BN6~w.oZe4) g\yA6Jc:8 g h'_wb{>T?*{Lºbp[,\h d rOc~sOQ{_i%Br>U_F:9" ]HW5D/(_wڗFWՕwxGSW1"W>?+_;+E.=bqgXK:$T}LhןWuyBr`"ZZf7h[[+lOW> g=!E=n ]Z _+1?(5=诏*{Q ޔfY1Bl^#kPf8phM̟[MQco^^D Zdv Y!u2Y-?Vq珖/>j9Wԣ \ͩ2D#6alٍ`x _GvgŅf92U%3*H3 !f;|גwXO>_^>^?h_(9F0\_}}U,쥸rﭧ+]Yğ~} _\_ ]HW5k)0%}ƧݗʗFHC:WՒ;SHƷ^o+wԺ\OqgDRuWcBG?bC"\{BZADK3+mb岒1Uk勔SHqHtX9W'?RaO#SڛJ0J>Xo 1!Oۛ ʟ~QOs (u"'2 )Wݎ$k>edR :f*cQ'cOI}>z?+~^icRzGZ9=bf'O~' !Fp>\^%'.Wy Pìy;-t!]Ms#+3>_|_|vwxGSW1"|(}/;\OqgdGGbJ%_\{u nvurYY)s/|#C4{TX3֐Х)q؏u}/M`GNޔf1Bl^#kPf8phM׿볟+?-B{" '2 )"ɚNB~%QN#N_fzTB1y:d(Ԉ|~7i [;HŴ*4A0Y4?_$ ߝ&ӗ?w_AF.gku?Zy' _w'w9. D >ğ}j􎦮bDN,">5収~%͵wFS4yu[oJ2%m^W1!hBppQQ{[ak!z 4k^G5x͆h A&u;ˠsL-VG z-WR$]٣Ȍ"9>9RQ\BS CE?W9Cޝ'OA~un/}O}˗OeoOl=@^4a.֟YB,%R`Jʗo? lq7WՔU)E&J/kу m>ŝH'*[_3q]MMփV e%;ga;OEy]`3V3ti \9kO5DzSz#gb! =.jU;JU~[D@3Hqu YldiR j8og*t+ן|٣Ȍ}فu?O(M}LAJhF>Ax]ʟa'PO_]/_y*b taO; 29K0 D X~DTUwxGS,WktM)]LKBOqg$Bb`F..v nvurYQ%qvѼ.TKqH Kk_~/!֛! j߾ek_y$ Zdv EM\ ÒePѬ7[ U0V˗wfV#3v?Yd6GWȷ?hѐSьV&3A͟y /[ҿUp__vɤo|rⲳ+]n_XpVe@ LrSWeAUgh"V"]ӓmTh)lPؿM2ԛ?ug"ZXf7(hd'|] '-tBXCU ]Z #l9ޔ^F}qyߟZy:uhу"7q KvA fՃw_T[G8ײ_ʷba4L b3>ɿpWW[VzEj&h?y8z~3/r{T}1{ ^/9q+]^i?P,GS?`[&}9Q ULh"V"]3~7iN6ΈlLT]?+qަRlݠ"xoDb#[Ʋ]V|8[k8CV_v_8;Y7%1B@x-oXb͋4 i HA A@A%u;ˠ~O,Rn_Ky̯O)Q~>o wU]z!L?w w7GS Uquu_#TjaHN\y ̯~]/([Ms])0%FOKW@TU}f*bN,">53-?E m>ŝӽ;QEq v^s?Ao5>{~)M}L= ,TzT=bk- ywp-q{$w|ܗL5!'.o=@^F9k`D/(=EݑKI3L]k oJW>ЛFS+ Ru++Eآʕ J7AGukƌYh[/#otkHg"K;U<ǾIoJ26ܫbd4!f8pB@U(=;zvѤ1h"Hqu  x16l(X+C_|Sߧ {JSi&]V(=bo1M`TQ@#e|e>+]Y6-l5_N0R%{w4E+"bH[?[_Sͧ3Ru7;K<}%Cg+PϺ_CGԮ ÎotkHgK<ו<c,7%1B@z  VTRkE@3Hqu  x16l(XUXiJdVhDmGOF戺 mUsz!L# #wQ& np_QfwJ9q)wsei}β+Q D9~h;; N,"}n m>h֩L6+op]j9-V :.FdmdڵjŷCRu51֛^,#kPf8ph LOu,:Ae6!eD*izMEb('aQIvj 0ژO̼;ෆ>j/4.sJswHb_?xdjO{.ܗW ~ *'.]JW9nk,R/eT4`Tf3r>PBI#km>_g/?y]s1ADKɕnvPײތLQn5FnQ^Cݿ󱜗Oy\~+}/`֛neʽf6&= :&HR/HHAJUi#жngC̰J_}ԱG'b3p 0Ml{^㮛x6_'ʓ}X9q! nH>%Y;?A3cӒE[]Q2r`rTnnzSͧ3JvBqoU\v[xѺL_tt4P2EFW6oO9K$o֛n,{9J٘ EWN?JOcq zу4Wp&HI}ͰWy,?)I)9@:h p/1R  oq96_^΅؛}}:%{/'.UEHBIJ2R`{>`Th},QyaԸi-PDaJvbWP;Dv.oC"ܢl;LstI|sGzS7qm^Ei3 XpT(Hrmf^;z Pv16l(XUXi|ꕩ 0DGFlhAs5n&rZ-u0̢& _6V=^etQX Iu!"\Ь&f[&U, aV6h_Hl5`T8j`%vtEK=Eg9PBK78jgRZ{3@ցΪ&3Q:٠1,o&SP=ķ~<ޡGz Mdpne/Gi3o%ܦcVjVC n8zȊbƳ ePùe͐?3WG:2Rè῏#3182GӊRW F0iU Jp9BeZF\@."jbV{ {hѿS"grCяnj@61A%VT"EVBX r67GHc0mPp ҫ~'~&a 3T8x|`xj RsCvnaw;~Ͻ#nl W$\."jbW_L sWݿ䱕.G? )0- G z8KM>Y);P6O+"0Vn P >_iݫ@EzwA[`5SU(Oy03dp-{9J٘ E7^|"E bm"u[tG| 3,NEU $xV#va3A/O`k4 ;W KA9$wSkW!u/]mmE1.k&KpA L!.j #gbB dQCId ; %l""QBKO:j/( }#Z;ɕmuL[K4>$_πqmclLz"7Lu!"A(FB؁M׬Ăi u; dEUz+m2Hi)f?-cc`3wMDޮV>C9ϧ:׆%"u=C?\ ZTpfT4@^ B\*qm+]A0z*@FF5хyX(ۥœr^X U{Gt7Uť_B$Jwހ!|$5t2E^[|?|Gn(mfcг! \D.PEMJs.ȱxFz)_Ѓ0Wؑ`h R`IfYTeWl50Hi)f>h $f`n&vAG,4>z^D{RN9^ $T[ I`!"\Ь&f}{Py{_MFOp [Ԅ@掮")bEDn ;Kmګ_Э 6ADK+p>xx.llYg8V<0Qg=B@rQz pQ3H!9vH 7Y=s(9 mAv6,,d0bXAHH1CCq1wjtn"oW4|Xx ֡8 !.j*A2p>@bo)%]ߓCFOC|_YqK?˫)bEDΧn SZtEB\ܧ:oVΟ{>Pi9@ܥra럧{JٺsYݢ3p(*J٘ f8•kS]*5EVM4E=vngʲJ6IBf@FЩ u/Rmܳ-1Mj>o2isZJy*4 2"p k(p+A.?goO/P:FV>0@,>˫)bEDΧn (p@}7Aj"Zzn{9W1V/P&]4?Oui:\ cө8+*J٘ f8z•G.PE bm"%ܼf% Hc0cF,{ jJf΁tV:0z@y8cxMj~MCZaNE,tMڸ(5_M|Ce  8f}cMx+]Ex=~{z20YKݱYFgpwtU9]z*|fT/' }%rE.n7ś?B@5ثP^td]4?OXum];6 dWQ7Ж_T"ERPA۞FHA\bG3j?fYL6[M6fbXewcxծ'}>(:VB Y /+ P@+8!"\Ь&f}!ޛø U$_a1EĢߞ^+شDh2=ES3z9P(CE\{t^,7!#)u *$o$+ /+\<ݣOz z/Mu WU61Ap&+S]A a.ȱDJyJ,A+@ɑ`hZFYSxMؔk֦UGl_](6vś\}t7 2`~Ж6g`a7L!"\Al.v p%oGl;/_Uj֥CGswtj=ES3s{BkMpA8fl|$%q{&u;Lst#| cөFpÕ{lLz|3 T(ftxA݆ ^irFA\bF3j?fYL6[M6fbzSa=_=:08-ssX)ۥgF*e /Wy,'`sƁg`L MN\{\hZP@a)ܩHL-[^[<ҼGZK_UjgtG4OZr˩AY""SBKOόf)qBro[] VGRC!SU(V/M:v\?_}9ٗ4__]kļ?N رN+"r>%tThP$(P(s<m^r2d8S8PLkWXt3*;st# +^Ei3 -=0Qz pڦvrHbͫv+@~>VXUY6[M6fbߖy(-O|UHFggcF-VC^OU>8cl xMfpA &XB]p҉4%}9 YMd&vS6SĊ\` .=p>3N }gɈ}`ܴ#{կםu ҹy ~i|=4^Ei3 -=0Qz pفLO הXPYZr3Z } dֽn3x#)u *_;;st#Ru7)*J٘ f8V++'@ wGa@d8Qlƞ^Z϶r,{ hJtQuD1[?pZ`WUdDȋ;}w4> ބg =)\d!"\Ь&f} $6 H c_UqL>Y9&ha*m9]z*|f4N^m%jE ,] 9GRC!Sh4Ӯ,;r_KQ;stER_΅~ څ^Ei3 -=0Qz pفLO i:: )v|F]uZ8ˢ!EZ=f*:-a8ע%}`S7x%޻n"q٢`qP)\``A0pI,!]kzkkDU p7!9hs&WN+"r>%tTjP(K:ӫ.C0Hng t] κv\3Z =@mz-lAM3x`P{կםu ҹy ~{ƚϔ5BXarĢ0=ĵx).A HQ`yUFYU ^iS,~#j]e6[D7F!.-jRh_0n"_U:g;*f%J" q<<y䗨uUp })Ոn&.ULgi* XU 9T8Ta0jbC7HsX)ۥgFEB/oě`0xn=bi?z-v\^K5FW|38X4y yIL\;z*8RX^}FUpwUWl5kMyH CF0H`M*^G}q/{"4kcGHdN oh /ضG6 .,)\ L.hV })ՈuH¼j V7Ҝ/R-B9T8TM* `&x9]z*|f4X"ڭEgU$@Ejv*ś?zk/S.kZ}IlHΝwHueO@Whec`p•MD.PdX*p^bC#5C gTu?fYW5xVSڍ:-^,q## ɲ'9 BWU|UHI^EC OCuӒSDdٱ*xI"{^[ZWݤ\vٱ8$ d)/" | D#D!qH$.q]\s1s9i#Us{}\`v>ix }וn ^1S;Xac$%*kOUf"K` bG C9QϽWOCP`:\Ll%`^r?KmIH(1[R* k+\qQ%={/ڹZ_SA6iF4L :& iNOƴ9O3(SؾNϳ+pUO "zM) `p*0Uu0~ I.q|pgP 㳁hG(HTH+B}pޙzdgs5`#{!\d b`q>4`P H+EMhb72t潰a״ J4&Ixh῝sC9\ǝWQq!5dz3:]ڳ ӸIC0&6L˔RQl+:=ϮU?ȘGS$f |Sa9³ jO.M+& sI$#$]bPn_ndp Gc20L2qL#Wߗ y=-H8~&0;=4ދq7-wwGVs A|Z~p>- {I\a:kIJRtn\";5<[Y`rK3E{mpC_scyk*!:7èG,L+amP*|G:s\"GA55Wtz]*J=17$I$*=d ^G84NLhQIjRuU.qu >à,FV  g⊕G͝]F@yӱz q>ixpϲ\ZqnAOo E`p1ZTyNr4*wj]wF,bΧG #qIudoN҂yﴩ4't|q!]㎣K]Gb_ ^p\7è A(gJ&yB&Kf QpؾNϳ+pUO2є$Y幛_kF^`jO!w]0gy |#WLquxn҂z- w JLv&%CEN  Øb3۞d3*wtSW,*n0K8Lfe{t\#ҊIZ0ߞKJf46sC3xFt"_W\iF8bA(gJFTIKakRAf>8+:=ϮU?ȘGS$7Uj( |Skc Zk:K)&ٻ 9aaPVi B][F*XkdI\옜ƉX{߅JLWʺᮇȉΡYL-*Ơv'َʝ:}vNgrË#G :{'QYsM$`ϱSϜFaFTx&7}d*Eb#x<'c:~/-XtZoQ+Xʙt)bmR/lf> 00Wy֕CD2Q-YRֆx][O*B%Vu>q~퍟0P7Rqʤ6o>N-xn͎3'.L>)(epC[@R9掫%Ob3#hr'M]͵: b^k;ɽ/jDo9@sЀk"$-ΐXbQ< !~='z<tW6_ `A_ͦ+ԑ@qi:TighS<L}_NE͇\y6`UO2є$q?n .N %̣D%&O\%^pN}A^yG(H0ucbml\.5PÎɠ^xb410C)RoqG9 ԂC$5pb3ٝd;*w kWgrËHh\{b4 k"[B^0I &}EҨςR>>x?ʛߛ{/+.ը+Yʙt)bmR FIOUWrKNA'k3WgaE8!jYlG86p8n5g 㧐/.DW}AYIfX|f+V&qR8߶w#e&;& s}TٮL8"<0,[-gӘNiwܩgw:kgrË#ͱUEZUGls$-\ewlFw u@>>1tM~ Ʌ] !.Kk:T7i*khl4߬f>^)V\yvŭ|)@8$0{j6x-PBp ɚ91~ 0Ls>às  !Եe⊵HoY)}7Ȯ+z3 cvsP f}!20Q7cs XWN5dzRX9q}vIfd&K\ v>*|$ gbɾ74.w9I &ݲBd>roҮ]aOV~"3O9/@0 dRJ&Y!5#Kk:T7i*+`^7g5Q@ѭ\NϳU <17jy%*}p ^G86Pn^0@a]\nW}AYn_G(Humb&.ޭqb #w @`+:(01);1D##1dz;}< U;neD%Kc6z9©M%?z[pЂ ҈̰ |#WLj|du׊;$s |qr;̀@) 32V}p9 SY9\Ca^ޔ,W? `czRHk ܌#X4C8I &VmVIEdO~Y4WJ#x=|w{b3PK鳛"*fI+|^Y7GOE@,^`AA-:{B;STs'TcVgK~<py/ DJf#f\*-+@M$hl4`)ox4+u<+*9]s cn]F2aVyoNhOtByv/3 J+O2 #$6T\2MAzǃ-kSLE0 D0{(p0'w2.u9 'L?w{B1S >*a)Iۨ WLHG ] i]}e Zqm$- >WTVڵ?ÿm贯z7 ^ MfT1JݰViYo iMt#ؤ%7jNe><*9+ڑ;[lӫ}$fK'T/-%G:N،±`%aE7%ZF*XX?#n]"+[^1 u`znJ =We`&LcHɵS;krR,3Pg7Q-x \q*Qv>^OqftwjLtjQ&*ҍьt4W3¨`-L1!=SAeiT5{3>Ұ;4}7g _>қA\*qnXU`ZV7ilY$G@7U2gsb]%hGh$&nM꧖f|DrG +.'KbSDᘸ%ްJ=AYIfXS{a6\AH W2[b~{rz+P3aAYA)bp5u^+rs Ǿra loC lgjQ΀>$S-rVk;KzՍьtTwrG@Z$D:r!=SV|wYY1_Lx}}VYW`ZLq8Wi` L& V=Ãչ 9ZSؾNϳ+pUO2є$Y<ݱtr᭘ Y:fL0:P *'p*!'`˛Swq؎aJn*35M-9rQik;r1qDuctT:s2]FzmfO{B)bOnS9~+ b/8<~?zv=T-50zCqck*-t6<]@C2^O3hmNQ`+:=ϮU?ȘGS$f>\ɔ榥G,0`$6) @ͽK\[0(K? Mխ@z+o S뭱nے'k@kH40 mvqP f졸]Pf̹PA]Jާ=9Daq+Ԣ{ IT'..v9k֍ьt4W3B]8fNk&x'aϣɅ^VOswSR_>Pv=]x/bC\ViC;2^O3hQF sɳNFnhYMDH0)E.qq{à' #$4uiJ&ЮX;v.|Í5P> x],Wme`&Ϋ><>/+R$  L-*_DuN\Puh<% -pJl =)^e=ƝOeZ`TܠC{<.W9l#25څkWG*_C4VWtc1ժFP*& V?46Mxݜ,#BNQ`+:=?GS$fGl֝LjF" zr)v;E0( ? +!Z@Bb!#7MF]!>EooJVL+k͚ WR0]P&pZoIpu%q[Q%bH-*ԬMT3dUrԝX6 *dvBl?AK'RşcN LnЫ㝚Oͻ,0̞=2`4[ iXRſЇmi]{2@U`l inP`y]ujo:[mż׷jvA@)Iq ̄û*ޥ Fq#{[GMܝ>xjzw&LI[It|.U7F3QMi q dO&B~Ҟ`E}j>'B}mcO_)*͘[Dkb .1/>~CX QB*06icA(0.,# 4(}gwR\̌)I ʳN47-Ռ8b92p|N(y8>C,1M?V  aH%$V&84vzo"hWSxA@)ɻ}=/jޫIw>z{ٌrNpBjPcf6`&c L=jϒN3wǝ92^:Qd*dHm~z4`;^ H ܁R%))&L:5\^@{m\Y+[2\?<y33zƞ ~(_ o*-tSk~Cu!ZEf 0WKI PQ 3hx¬NA;S kxN`7)`k8;@:B:qEK%$Vy]#ӮPo=&duxOŠy #޷ٮLR09r(SjCIx䀈BW@q<?9_gjQ!=4KDu8VJt$iʛd+ujx% -pJI:k&x 1TIJW%"pC~7W+Õj_,Az숹-n><]5N~CLViC6iJzCY)`9Y$G`*UԎ o輜nVؠz8z;o`OwVBqr}`\/ aTBbYYMiW{clCX1Ob5.CzJL |;Pf]U; Pxk[8S (~js&)a2 .˫'ඇ=6.ÿpGx±ݪ{0E Xdj r sD+b8CL]bz.71M5HG(Ht;CFw?B+CoLynV#WlfuxNJyхxf9WR0}+cEP&jC n]JxG-3P׻3Qd75Wן&7]ں_R@))qUV`9Ƒ1I SN.pC~Oo\*,}}m_bn_xp-.8^ X0Vi`*& VI ",2g5L+udjW8 **Zdybf@OUY;0U3){KlX=  fl} X[|ddgR0կCX1/85f`&+ ̄iaU@`> V;Xl%xB'|#%LR?%^7x}hS'J H dug= L?8R1&)a*'S'8=qlpZ_k<pl|0C0*-[ o i-R"sVHT[xe%z^$h-͘G<7I%G=Uxaӄ\Y tDư@*!,ȴƚOCWwk+GNJ,8)Ren=(SjC 6V;PO}ZTk|:T $?d9_y]kьn H >qL𘞿pI`LRTSm"n{Hor" L2\'J(Z8s^# _!aU`ZV7iJX)`9Y$G`*]o8jW8 **Zd+3:B!qTSoY!^XSqm'OAFfZʉ4!pz  1l2!FiiB@;JHB|dd՞d.WWSr4F pL=jC )}VdSbÛ$=>\EP͝ı0ˤ fǥ9Ƒ1I S|%OpY,y2n{HoRWA/iUDI@^ v{.k_ 8LVijP&&ui7hErkiJrTTS.[p (Lʖ>EL{L?&b7nXiMiW{Qe2 Wig}+IOqcC wU$@ )sJex?U}2+>dOT'g{aQPfA3+-@@Z6Wgn1?8R1&)a*Bi> ./RZUU,pzmx;i=hU٫սf֫l53& VI ",2g5LWd8_)ฤ<2򕕠\CHHC=YzJ(XKuD1 +"qE5iiB@:BA"c`BYfMiW{Ż hi_2j?Ҋy ߆@`ƋFU&j}C @e s4>QdF lpP0OP+IFV -`Ks#c" ./R]ඇ=6.;T"ê j2_ߏkOI딿YҲՠ ht4HZ%-DȜ,#0^-S$D$U**Z%Te\l )l[5iiBᬃ@:BA"cxt#4,ted^]?/"os0aVB31209]UDPGHtͩS&\û_xOfyN2w}r>Ꞹ:0&Y ě*G"i5M@ZwWWౚ?8R1$V;1 I =އp<5 2(?!ۆ6IrHupo먦z/F&[ 4HZ%hEr«eNI\&% N?'RaqZN,NNPvL%N$/N{Lr g XY 62j=jlΆ2y!܅Iwq}7vUa(ӣTdTQsMqvUϓ'XlnEp7Ҍ$B5wrr`})ud>,Mz0yL=hSCm_%|57t[ 7,_Nl53& Vɻ ƬpVH@5n*P+*WV 0VQM d!H{4C  6`8$AoN4!pm  18{ MLq>2&{+'|g#aWܫs1N,s!}tNO0 w ̄ûvSsߔdiӕa'>S<.O$䏤^nOb0hƔ%MguY&5<^?8R1: |WU]`sd?{t ?}tunaFyH.3o i l: g5) ^*?FHR%9-߿+@^Y 1lXGYyCYQ=A墄∅ꢍb8HGq"/M{Lr g] cGc?MS|ddwF-p?OR(ޱK1vxr]ӟyq}qP&j'J(ѕ'U #9'%fO$kW n}i ̜f$PZNl>(u7B!Qz85m/.'`sd{*ӳͦC:MG.ሻV?zg WWRTIUn1.,#0ؓn2So wJn8:d!G^{ZbO nPNWg|*ʗ= .oL۴#.[+__mU|2옉%ß'>o9fDވRN)%++۠?+_h V" = ?׎/u/J .l| q9Ƒ!Q 3"BoVu$uw6o?*5'v]UX]Dr@ѡo i l: g5S)SS] wJa8J6OYQ=Ƈ윷#VXQ k@Q?W>=4!pS  1 qy9&#Ӯ 팒.[nryK 6 cnK7We~ e`.iWN`T\o|>#ң9inKT W/}.Xq"WZBHj.xPZ܁/~sk&x-qb)uȩL.z-+VuTߝ~y!%xMGz*ȫ lIacy]8Y$G@XNQTж/~MUt] wJa8J6pV{,OħǬPRD@1 b|d_?9+YiiB@:BA"ch_R<&#Ӯ 팒.[2wm 4Cy Z~["{^\A)io 0=JE3_S肋HqvO&?l?w)K 2Ep 3q"WK4PJ \;5#5Ul\Z\Y{'>ٓ#.n,^ U`FdzIUn1.,#0ؓn2SQ!+_ݰ-9WVrK!qS`=Ո8bnʹ4!p\  1[OhiZLu)> ?ԿP|?61{1ˠ%?_nW7vUmA "WُLD/S28oS03V+\F /{#~i> ^;w .jNWƍ9&KHɭ0Ngr^ S]`si>zr^ .xu k[.G8x0#& Vɻ ƬpVHn@j[_orN!ߕQ yDzcuUqo>,dӞDܧBJ(bAjN(ٟӗ_A5=4!p^  1O_??~[{yv$$V{urԲwm1;f^ԧw+K LN{cWNQ*Rl%7~[ :5\d"7%) ),Lv/BJݽH4PJ \;6'esTBJnvj>ڡ_>~9ruΥŝ^{?s.xb_ XtIacy]8Y$GXNcpi7E ڵS7 ]wJP0VQ>|ngh+D&b`8-cMg?|?  #$2Ɖ;7)hGBbheg}n |?6eP^x|#H,209]U;PGH4|ooWw)dZ[~L %fm ~R }zo{JJHj.xPZ܁Ϸr3ƍ9v!%Be>IKqX]`,m^{77k9xoagU!B%D#Un#VY"9\\M o|O?~uA]wJP0VQ>wN{E:*IS `8Qadퟋ^8=ӄ\Z ^  !O?盦 ڭesk?/ ka{TcRW.{;[s7vU@ "^2o7/>夫0ӣL?Yi[ee¬A㶋7~?W:*#Ci pF?~?I[{h}*Qqz>QYAP_뿯g+\K[»՟ߎS>M6 ,#{6վC%D#Un#VY"9\\M +w~O_/XT݉weH++BXGpB6:yNm_"4ES `8Qa'xH7둺Jr S} #$ɜ@IDATJi ڑXep/28#[~|,ߛpڀcfŎYW.;$Z7^>Xe`r*}v/T_şy[큣S#Y-j}2-~;Ow~ٗl r_9ƝyÿWzRHDWu(-p6|w/ƍ9-M!%8=Ѩ [o`Eׇh͇틕/-= r_^x2nw?SC?3;zӄ\Tj_)-Tg6/XӶMSg%u& bAYQџmi080wHs2v~*~$9CƮjY~hțv}y)83d">`>9y\ۻh\QbgkOWhB/G"yCifWwa旞~7~>͟cT^HɭThTVTl?܏Oڏl ÷ј{_̷?K?~y|?/?it3xAw_~R4HZ%}`,DȜ,/wNl~N~/~W/M}ܿ)7yZ::za!H{U_o(OS$7vbbs?~׿8ns(08 [>ґg[7OY ?M4;i]$ؑ28#[ w,<C̗Hzcp,cf+dA7Ǘkfu)3npy ̀GBU/x^?o?~* |Ex!&_x Ơ4-dLa Ě^-=vW dž@󑈭PZ^hFow}{mc7Bjbi{qz>QYaK@kۗG ?~śwQqK))Z%ﶼY͢ &оျxG=~@4fC(+p 8jb6c"8#ZcPČ((_gV*?ៀiC{:mG(.k  aH%$V&842 ڭep5qLIK@+Bv()(T(n";?<}M*$}̓1H, HiE`Éʄn͹IHW7Wh; Vci"/#1 [CGis-Qxj iLT> 36:+_NKݿ?c{%pU& Vɻ ƬpVH_,4M ;,BRe8:z lOt h-B]A^$2R ee7MLBbE4fdm2IY0ڳlHr>͸vBB^H^7\Hݟ vu=fF 3 w{8QUЋPM2@̾BWBP.#B8s /(cε/ʒ׾֞˟cYka\ɭxj i)!=v h4txMvNv2t`_`yIacy]8Y/BsצDsAO Sx2NXG=]0,disq1I /NL̓ӆN-x!I6OR#K,#=˦(Aqؔσꆝ|q)1.hBU/xi-6\Hݟ!AhK JbIjDUeKO(& ef_!PЫ_A|Z(XK!|}eI^k_k}7UOy &)~·[ ިgt\:z=Wxt{9 ,CJ/@y^Vɻ-/:cV(~3t4E *o8&B6t[)u 8굧{lDqGL9Flt h=q'l< G$XF2\{MQ)7 ;2Sb\.cW7N1؅^Zhmx?Ch Ж@ L[ L-*> PM2@̾BWBP.#B8#ROPs )>Գ{-Ѯݢ 4m?p2~ח<7iJm6fׅE ZgdS)A7=݇zvT;ڵ[Tx;Cڞkܳ({cSew[^_E A6"ϱ\M  fX .Y]0,dמBq1I 2NLxuL:M῏?L|V$JyZ2\{MjʍxWӑ1.3%21v~]%/ֆ 遷3 m UPԢb0^L` ;a EΧռt1Jt)^$ d -ƌͤ)V'붽enOy)e lSb6c"8#}S‰y(-O]B y"H( kA[@Cc < G$XF2\{MQ)7 ;2Sb\.cW7N1؅^Zhmx?Ch Ж@ L[ L-*3|KTU&t'tW+z&Y bBj$( t%Zĸ2Chsu1-QP?Y^XYvdU麇iͿ;4e?eސח 91$­ƺHb/4Ȕڗ%icp(3Cr#lppJa!Gbﰘ9N`xߔpbb8)i(ٛ}<d#c\fJeb*讬;n%/ ֆ 遯ǁЮ )0mU/3LW+$*XzBqeBWa v>-FLWE+3>7KoP7Q3^ܒz  UeJ6^zx{븳Kz<$U|Z%]&mk, rWdJq}xǀ(LV n N)?6ԟ.5.yKqj'r ++F۪zBBz૟a B L[ L-*> u\YpoUd5O *c>ӕh Mƌ^BoDAFBdmzbe- zW^<5:~Ҥ4}}/%_9VIWFIZ5 BR\l_h-it1 2ka}Sx)e<8Fڇsg(\,E@} t䶴Np !U }:{OrMqǘ*+ y vBxm.OcF u L-*(|KTU&'tW+z&Y bBj$( t%Zĸ2Ch3~s* Zh4zKvjY/iͿ;s5xIP([%0X_,9eܾZ+c@e&+7xpB'vhTˏػ?"2ڳlMqkм|gzBa!P{1+9`8%K811O_v~^t4] B0WUII X"X[=;A96u3ƅҞ)R1.0ˌk-* h*fP&]%o8p! z7UU$U&hM,Ww1 v>-FLWE+3> KoR7U3^ë,OV׈Ε{KyLBq| 8aѸQ_,9^W!(y^G*Aw123TQ/Xxsqw'fQ$$$Vvÿ Mׯ3‚=S|3]̨ pFТ2P@Pbe`"؅^c d~2Iv*/U$U&hM+K]L7O *c>ӕh қMUƌ* U5/sex5:8|crMkoy܈Z_, VPlB seWft8^#1?6x,nx %?&ioi%L!]P*ʖnʍo8{%,ӘqUu7fw}}b(Sԝ?\` U̞p!M=RCijF3I[(b b/ V#AU|+"ƕBs/k\'Pzv}B%\ЛT3\ܒz  FHMl-n 'uӚw9Y1!-x7} 8uF4}*x]BW.y18Q:莎j}<ϑm} !>mg A ĸ&f|,3*P&XsU50-BU/x`D i2k'Tb3 E;ɸj C~o}{ bBj$( t%Zĸ2Chӕh қMUƌ* U5/sex5:89O~?f(3>s^ mύhV/bU)Q?$E%Jgc\Z3]:BV>{tmQζe4E9JLPk)n_!PŤ5^-FLWE+3'M*2h[RU=dݶ NuwNcw^v2rOY{J|q}@{y6=MfB smDP^y9Scp]ҚyzwCFYucp5=&N811O_Kv̾u4] DU|qWLBb{<45ƅ{K ĸ&f|,3*P&XsU50-BU/x`D i2%w(MM5I[(b b/ V#AU|+"ƕBs߅5f!C5S>QdH_AA u޲[To 'tͿ;38rl[5qo9K 6isxt9^6E"Lҋ:/gj^| \Z3]:Bxsqǻfu$7~-FLWE+3> KoR7U3^ܒë,0z[TMP/tͿ;x;97½q&m1Z@umS$~$)rp=U!j叇97x1w(M +=I[(b b/ V#AU|+"ƕBs7/nIuU;[T77AaZd5:8gcrw37LD_~@{ys9Y-REnS$?(~u ϑCFYucp5=&N811"e˨cmZ~,o'( =$>GbzL 'YSlݾBIk4Z(XW!DWf}<Ηޤn:0ftt* +-0-2^uW?!{wu3 ˄} L/of EqJB)QCIR735ReRkzwCFYucp5=&N811O_Kv̾u4] DU|qWLBb{<45ƅ{K ĸ&f7|(2{ԱC LFJdzl*!MOo'h}C 'Y4~_!PŤ%^-FLWE+3> KoR7U3^ܒë,p w,eno xq=ku\=qƜ>~?Ƨ|Ijw9Mf` T0OJ҅kDþU=^5S!j1ՇX]r3lBYTFc8SNL.}Ki+Zjc:JCfO ;B~T csU50B%TBÿ:AI[(g(Xoj{}̾LW)Ch OoҤcƋ[R*pv웠0-2^uw|7WsgnXG],P&y/qn5q:IF_Ϭf`qh6E"LqG&gj?k*[TsWS?>:ꎝ g⊕ua'H7ttuqA381.0 J41ٻ+LH6֢Wξ3Y/>CN_0IjCϙZyFn(h33aVyba!pjm$$fQ;p(D%^'ί]1^t-?VLۆ! |#WLj㏇=;A)8u ĸ`w`BC5zy:6 UP&Q6"2=F6&`Bv*/U$be;4QU{Udr .&ΧHP|1Jqe|MꦪcWYXnQ ٻ~g&# _Xxf5 $ =gj?B8Jk¬B6xqPBqZ,OP('ί]1^t-?VLۆ! |#WLj㏇=;AiS)5.LqqMnP +d>T csWՎJd7 UT"$RAq M{O&'MT3d* .&^-FLWE+3> KoR7U3(pjvHcgޕ <6>p^T87Y"©0"7$L-.Ng$ =g})h$&$I$*],,dN %G<̒]Љy5G􀩉>UC5B)X5P/bM^M8 zbB'ܸpzm)5.T 2 0RnP f!_n(3a\]hYH#K|'ޡ$Ww1iUܹ1K8AM#zJ<ƌ,,2p2vw:NIwsi<35׈gn`]rl@z=ɋ~P?9L`:SehS$6{࣑8$0Dĺ80w?P-6;GDN cwIGoHu0 &#ծJl PIE1Sn\Ը dB@`̀C"PfŒeTRZEHG|EEjhc7UZsx E;v*wM=-]LZA|4D711&'ӜH0kPRƬpeޤ (ZY`p}0ڟv3ێǒlpx ]ˎy&h"  Lqf Sj\dB@`̀C"PfŒeTRZEHʛ%Tט*U 3 n;v*wM=-]LZA|4D711&'ӜH0kPRƬpeޤ\T\y0c؟?oOթ sϝR=4stɭWŭ|03o(UID %Im9 OHXG"f. ֆ#ZfI||b%TAA̚n9eWG;(<@O4>U> bUa|d^M8H.r!Sn\&l#@ J =8Pf¬p1%DŽe9NJT,?ӛ@PT{٭޻]]Z&m!RHB[EP*z p^q {hD*IՆ&؊׍q;;ۧOm{ZӘ?Nsy[ky?qߜϘs;uwuNnZ窹gB%WE ~X=3nxmf؜K"픕*/fxj̗&x>S~-&')7V{?h=o(==()Cu̴JWBx]? ыlƆ(dqA[45`/n1d 3+U}rLf<iULvZ/MT[bS ,F8X!GzHɕ u|`(t1 (<{@#KtJ0̜()-1aXO֠H`A*,0<3"}0 V*bnkj4Ϫ'8J@L [zf ڜ9敇9E葁)+T._zԘ/yM%>Uy+Һ첵 _Tt.:XKM${:ՙLAhNfa%٢)S ,cT@!DIiQIpIH+N*3P9w 9;(8WCF517HDjݟJ9J!'J@L PFP%sfK֯1Yӻ2WI5Hm+^2@ŬO_R#5~5Y7 #7 Z3{OJO T7 ǎYL;VC+QGQsgK/FFzjlBvY*.ຸUqMS#L0^7 -Qd̓^]dUXҤJ+Uv9Ȱb#S*{H $0K%/L sR4ILrV\rZ d`rf Ӑd`K$8$gEj'C )0-,p *ZjcTmd .GAw=E C6qs#7\& oʕ*7AG9|yny4}J7*u?oM 'AJ5ffVĕRhmį7vHO Q[r7K\*2ij^bfVث>%>Uy+Һ첵 _Tt.RldV%v)Pfՙ `N&iaQʑYQ L.0L$` Lx0±HrH1p!eΒAEK b CL1yv&D5%]]|ΘqW*7)W PQ:1{^sBc(L&~-W ;}@KTә8],CiRҕ^Ӊ\ `)6W%t(I)VyRe9 5Sg $%%^"GE&&!e?cp,R;R@\HifdPRCРj#S p^-wl6qf"Fߵ3iܕMA+Tnԃrܶ_7OiK ZDR7,q`6-5Ծc(2HM132?"DEE`U{XdɰÖrp]`LJUa*xWMti4V{\$:tU)l*ѿ4RJO!b7XİQ%6 `"*OYs,љ*=H0sj_DŽa?Y2"[zr2gɠ 1NP)8/䖈PdKu3soDqW*7Xg PQ:1{^$T@IDATs61 :˴ cא@vJ2&ŔFS\ `)6"=G&"h9Lj0Gd`& @?as :D* eΒAEK b ٝj#S p^-wl6qf"Fw96C|UnRAn/^rtc̗/δ6dmCףw3b͐ĝة C۝* 5oϠSv!q%(*;`r%TLL<@尐sZ?/N{R_Sӌep-FB%Tї^B L`F8tjuAA V5Wp̯J~L()-\ZTZT&u R@\HifdPRCΠj#S p^k eK&8-U"&eGΘ3\ܤ6n\rtc̗?nlXj >8r?"EKAQef!6z)Jӏ"*=,W2LdaTT\ 9Wu1m?_@azu&&U&] p2[H㩒yQg^:r0j 0"h5HԪ ?S%%C AK@^äD )0-,p *ZjcTmd?C1-N&xKձIƵ3GhܕMA+Tnԃr>~eirjo&w߼FUeH)H{Dm ٍ+\ C@Ж#A05xV(+ql?<\43a-S1bvؚ#?.$20{C1MIHr9b+piReҕWO\GRldBuyCT)Z|_a 93Z.`s^+ۭ9jוdyNҙJA y Z,4# a˭s1<8YS|^.L/:iReҕ'SlvpUy-j.Lj0 3`L6H0 sx8!ԁ'*xP)0-,p *ZjcUbzk'եG)$A4 f>px RO鶺@J&x?zdh)ru6p{.?c?7r/y;xbG/&T1g~^FR:UEџ]=Q[b5=k Pf^6pzҤʤ+Nrp઒/[^=$\-)Z|_Ad`5f@EDIiߡB?Ks%U?cIZzr2gɠ 1E܍L1m\GW͕f.WzB2Jڭ@iyPn҉eVwO~Yc݄f8v[#=s{[m+zC ayRĕ쀹s˕L3S1v2`xQ S|^U]K/Нm%Q'9*8eJ=.$A)5`:9Ћ@fO[cJ %" ,xA IϘ(U@LHI@ )0-,p *ZjcTmd˿l]cU6ua ޴r,R]?c8RLT瘈n2=_}\^4k<2忝ڞv]a3}fͅވ1r C5 <"?z+}9_gGsT)(Wn$gBvVI,t )>/nS6$IIWzLU%_6E{I:><;h"h5HԪ[9ЋfO[cJ %" ,xA IϘ(U@LHI@ )0-,p *ZjcTmd3ZjqGWՎ]zS؂a(4Wv\FE 9 %^~zI2)`?Du6p{<=l}_ė>/m u3`n.dFKnX@[ gNjސ]OP j?*=,Hz3D!;l ${:AA)K|uZҤʤ+Nrp઒ }RM1nIXZ|_Ad`5f4iQ"ߙp[T0RȄԐӲgɠ 1ܝAF`\mLp%(!͞W4c>M:SS.Ӹ=2+\A|HWnpe;mF2׽l372{#%7`>:.Y'꥓?}pQυ̋P|d^PK_G%=,Hz3D!;l $`/DMytk23$~1Qeҕ'SlvpUy-j.Ljρ^20{3UD ӢDdA%/34a  )0);x!eΒAEK b xbs5GW3i ңr4{^?ܤ15uz2ӟ>._ė>/mg[f$sF>ss!7b\r㚪cmu^:\ȼ %LuQ~T Q'9COְOb1,AA)K<3Nr@U&] p2ˆgWr߃E'Z|_Ad`5f4iQ"ߙp[T0RȄu4 T@!+wgP)9Ws{t5&@-=J.GH(M:SS.Ӹ=2+\A|HWnpe;mF2׽l372{#%7`>:>~Y'꥓?}pQυ̋P|d^PK_G%=,Hz3D!;l $`/DMytk23$~1Qeҕ'SlvpUy-gj Ljρ^20{3U?H(YPf L-M~|DBdB LN^-5PxgP„Kzؼأ4JnQr9B=@iyQn҉eVwO~YD v3-i3}f#1F.{~qM9DtR.깐yJ p)vIOr(dabX )ELN9Yf1_r6Rc_LTtC;X y9JnQs·\P3$ `Y b L# 0X3U?H4$XPfKM-M~\c͆ *ZjHϠb Ӕ􀻑 y5GW3i ңr4{^7?:7TnR_ӣnY`egR:Gren_!G,;⁜bPVY2CN23}K7gSqC`akn.p?hMI͟~pLͧ%Я:}gr Q'9COְOb1<AEMtã'ACxkL֐rrbʤ+=2XK%&n_x\\ D cLid5 XZ|_a 9LM RP j?* Q'9COְOb1,A?Dft8"-=Cl*zbU%?6L)KDRb=%W.scL#T ss&kJ $ ,xp WsYTAj -5Pks 5rw3|3(=5? r^'(S7tT:@"C`=g8=\}Iͳ/Kv^[h=wld*Utش(K &ҷA/yz.d }?P^:mVJ2oc;&yBv:fH0sCaX KaS3 bR3·Ln^L  a֐)[BO/ML3#X̐$JG54)BP}9 3`L0nZ'.L0MPSPR؊,8W3p{57=AlWNp6t UQ2|ÇcnՑe[կ]By>MG{%{#4%zt47Ͼyo}ܺξbalb/qC Ci΀ɼ®|O2n0sCaX KaS3 bR3·Ln^L  a֐)[BO/ML3#X̐=0kȗq0  200sxJ  -&~Ʀd(ZHU?hB^lA SpD8L9D>7ͣ$.J3\fϫd.73wst!C6s,. j`~3i::_#.3/ԣye]Lue{rwNN6xevLͧ%v{zy^[LJq $#dh*fT@H(8N)ziReҕ^/ Rldk~^aoad`jU}9 3`L0nZ'.L0MPSPR؊q;r|nGI\<Wϕf-'8!͞WE\dnfB 3l_Y\ݱո\*gttG\ҽg8KO#G_ҩGGszZϭk/6-0&1NN6xevLͧ%v{zy^[LJq $#dh*fT@H(8N)ziReҕ^/ Rldk~^aoad`jU}9 3`L0nZ'.L0MPSPR؊q;r|nGI\<Wϕf-'8!͞WE\dnfB 3l_Y\ݱո\*gӶG{pF򏾤8g_>zk;-3cOLS8NNV˞Gr{73`2oDK_G-ѕzcC&6 rhL0kIr&U&]♑`,FfHG"h9Ԫ s@f*$`+6O \`6Pk!Vjf*wCnGI\<Wϕf-I.GHUQ2Yj9Hw!WG qj`n ~PPP,%>5.=}Iͳ/u^[h=bsش([{m ;7 n܎Ɏ !63`2O 3wJ_G-/bY" öh1t&D7ʡ2ì!'ءr!% mcqs,H UVG#~v]]XGCZM(r8gI1(W1; L"W#20 Ti aahA%p!]Pē)0*-5Pȋ!Za >wS&yCp\i<߲yUAfn.Rct37իG+JxLx\kG\ҽg8K G_ҩ?GszZ=jk/6-0lpC Inyq;O';*΀<1)~[tLDzvna a 0F SLWj ! 6 rhLk0kIvh:bkh)[+̮eb#62TIuaRDJ^G8xUrBQCMQ.*d`*IuJ  C ,x _"HU?hB^lA Sp p;r7ͣ$.J3\fϫd.73wst!nӥCWG^=½NGX`+/t3Hїt<頊e |op!w%!;*ʹ0';Яy^[OL(qń1{MD7 >n:rhb8bkB))[+̮eb#62TIuaRDJ7TL1vzM-(DԄ _ i(z*ZjL!)'G n%q\=W9Ϸ'!͞WE\dnfB 9K>s\-7(CNG-:V.;^#.3g/ԟ4tȒ#z(4eܖ:gsن,jcJ$7뜅X$Io^^yاm ̛~Tg^؍R$=Fzq7c"xIS\NaL.n4Fϸ Rl0t@T)z% +rPU~| LLַfjF/(D<&\HWޟ R`jU*ZjL9T2aCw#7؟皙<ҟr*(U R=/KD\77P T)UATYb14BDPlC L AEK i9U&Vv( Ef1W;B3-FPjT䞗Is:7uXdNWoQ8]-uɵeeӰNyp5-0G,^ Lr޻r?wk?x\)܂-L<1QU90,=5ݸr`jó))&5Fԡt H㝗)Memep.TIu*+Qa%Wyʆh@)v͙o…ti-Z)0*-5PT)ZelebnRds#$O 9a ?xT䞗ArJnЉ8sSAptq^?^{Ҿ8|ls9Ę2Z`S9Ru-Z9T(볿*O^yERqR R &2H 90E/=;1SL `x>)0r\L=f!˿Kl@.KTWVr垗ިl{ tRa7М ,x9&\HWޟP%SPREe_U&Vvh̅ f4AtR͖#L(i.GŃ"$ڕSrN9]{:=[$/'8[T?םש]FneOs 'Bfsh'.$u_9Tg.oS K<}ROv.3p'ҍ90E/=;1SL `x>)0ܰ 6JkfGP\^wN)2Zrg6nSI[r12*ۑxLRr垗2{[V`rf fuUX'\HWޟ ](f@ L AEK ULq\"pw̕d%O 9Q+JE)Br˿i *sW{)0ܰ iyw^ӦR{S_;{ScR#@ oA%/(֙p!]qPZ(*U&dyc$+AtR _P\.bL{^'%7 z#r2ʋ5+H&趹M:2-qh.u&̮Vu+6whN)cnN$;TS(%K_6@W-N@ O]b#=% s`za7^z1wzq7c"|RJaa}ҞuTyNw{fXз2*rA%ք _}B=.ԪT@Qj :C2I!g4*X|eBOs912EHyܠ6P{ I#j)p_x_lv͖L^ԍyo0 cSo=ufigo&N)=9!6Lr+8e2$d }+U z7r\_uk$ ʱL)hVQTYbrxMx? 0 (*} V0E١ I#j)r7^17T6WVhL205 UX<0K9/|&\*ilZ$pCE8[8h.Nس:RH,COr4`ܡClp;OA6Əǟxz ĻWjrjqwza7J|Vݸ2p8(a{q%鲼b*z}E9.[^Ys8VX_6DwXgdT ͙] f61;LU)`sUArd`@#U?H TYb d]NH퍙b-=Q9ŃUlqU&w#8ܫDOݟrFW&4#S~Cd{O(s|yc7vru*wԖPh5,Ee~.sw ?Gs?vĞ]Lݴ֑ݐBZdz;eb+E߹ܿ򙧿o4W|O0i ?;V mbVoW.[ N M˖:)rA3 \`f>T6W(*@&9RL A% Ϝp!Mޘ)Swɯ@)6V?zrXC!I'QSLLMf^.LeLYy3QLv̙q .gIDAT:Q_uyuF OI ҜYܥ \`f>T6W(*@&9RL A% Ϝp!My1Ck/V Y%nIc$>)FL(i.G1Fɽ暱2`1=~cBn|%uVmvqHoQe?.>ٞs'<׮8Dž֑ݐKA,COr4`ܡClpbn6g?Oov?A@?U"^hmĭ>/Ӱx#j]iz$'ym uSR4g T*=f|%r3V96G6A/.\3Zzr"㨫L;4.GpW1 ?)FL(i.G1F=/ %7 JyVh\z[T&X,R?.>~ޭ{)f.sW+teuYFfiNCJ(r~ⳁwݻiS= vJ[V)65` QًqʕSnf n2[y3q$RuCp|y;eme vg{SߣiryᇟwPm~ᙯ]>Oa2R+THTHTe VOϮ&9,}"s'Q8YKJ;8h(a?L孏Nfא )[#?v~o譒*̙] f61;L#*? usj `IdZL&J_PY%nl!'?UCB1pL(i.GS!4On@Dcyѡ\2nOoQ9 z KǕ9/wQsM271{RuC*LJ@j'9SF^por'bCw˿uW^6´`nB驱 Q#Lav%`owb>҃'*eUyY'<%U.Hsf (rMN Sȵ itAf'XcAE4#%\ZA*s8* &*-whP:WCρ<ýI%O 9Q+JE)BrosyX;cxroTJ [G[mVl[uKq0ԟfukkW8υqݐKA,COr4`ܡClpx'/_׃[ O|6X~Po| qoЯ=??le.cEng' LX˖ _6Fw?/tF OI ҜiZAK `*V!Mz H05Id 0'JHv1!x؉)T@QyEQ&*-whPA0e T^ŤD'Ѩ` ?"! \4Vd^!7iFʋ{uEyf҈_vFRg´\%--놔MgOr{ SdS.ՌFxs_<ϳZܿ*뗾¿IhWL;Za56Scv7F,R JsqQf>2.ˀfai"'k#_VT_vDw?/tF OI ҜYܥ \`f>HT,}|׫oi^&lO_~*ˎ lFP,Rq9,աI6bbn9.jDR7eyP3,?-pY$tmRvيJuˎ:)rA3TA lbv)GUpH# $`v5T$I-"rtd4kRS2.ˀfai"'k#_VT_vDw?/tF OI ҜYܥ \`f>HT9]KeK/F/na\,h帨A 3ep3]ZI1NQ ,Nz6rԹA~WI s=H̘0;`dp?OAfd'^H'T MyzrRTM Y%nIc$>P^eH!sͣ3%*>ETøy0ΘWMþQ(_%+QcgoMǖH0mMDHp{My\sA/S,Y&Ors:ܡ%[\p˯?G;K&2~CO*ӌ_>9,FzjlBvY*.:r)&fgH t3υO$]VQwUtĦX zmbJ\^30 m*rA3 ȸ&tA !p? >W3L)3DIi7"\)ޠb9[d=*w#SN)pb ss3_"(pGB~x5J/Z;c]ތ9WMþQ|U22neS\9 柠Wah^kcx͎2 7Yvc.q%79jP"˅z{^`a}?^ʛ>p/HO=w+]~ lƆ(dqrXqkA{q[a3ôDU7{Cqu*&l¢/M$%6Ph9Ǣ+ W%U. 42 0)f'|0s*20ϕ Sʌ7QRZ EHF=5Dl *VEmurȔS#8ܫ4Bu<MdU["i, ,jlCZ;cproT._| [G/yϝk\?WW:ۍzC`!}$ˁLKkO^>{t/<* JG3?SQzwO}rރ.w1nDZna!g] b5`/n\2 3Wث\ aZbP\f".[IJWzKl*ˑ=T)r{toL_N5fa%~a'>Dg s̩ed ʈo)T2C:#R#*ٝjuLN^$vmC$nC;^6fW4WG?ǜ\s{m_2@ŬO۶~Ӯ ̲OJ]Xrs: ,w̮u}˃]pSь_d*wÎ?kg.˿?VdK7Sna!g] b5`/n\2 3Wث\ôDU;{Cqu*&l&U*]魲Rldvv9Tɕ ufM99)SYXGme9  5Sg $%%^"GE&&!e?cp,R;R@UY`3ֹwu|ʿp>θ0Lպ?W͕<ޟ(鶾*13lj=qu|<`1=+"픕*/fxj̗&޶vu]gV=vLcgV&4֑Pw~WN0 `cv#kO={_ۡ<}:K~-YOſ\wAc79驱! ak\frFޥp-V%S0s7aZ*:WEZw]VaK*V}Rldvv9Tɕ ufM99)SYXGme9  5Sg $%%^"GE&&!e?cp,R;R@UY`3ֹwu|F FtI6u+I!n"S?Vl8q̵3+" P|᳔(2_{w^*;)_vHm 24Վ𙧟||Zs`N4O;ww?L DЇdG>/_.'/ݦaFg, ak2*.\ŃM0b{Uevg.33B*eV%&U*])D2XKg+/ΨBLLYXGJ_Uk(fWA!'?僿z5G4xOgF \xM^$?0=JbOѷx[k4~aX*.䌶1*8<-Mt]ӏ٧Sv$CSְK*|l2XK10eUy:MHʓ79GL$`95QRZc°A-=Q9Ń HifdPRCv'horK]c([2Mܥ|ّ5sL'^Un㸝2@oԃr?.^=gb!ٟ_{.rR?!ܡIUbv4S]>\^}uG|^y7R?ʏ_Oc{ozӛ.^~䇾ob֎Ah/$NuiGiA0-jOUkB*eV%&U*])D2XK2{&LXI=k%:Sg fNM0,'kPF$u0|KOTNR`ZY,T@!Ɛ 62ڡqʖL`wn&b._vdM׸+s8n' Pc7xsf9/oir_B_J6};5Tkg/|._xrc_+$G{_}Oin7K2G~^<?e! ;l2 *.c3`i9V籕~𲌘\0-{ELFSٿ4)tMs,؈a*9/AWMErU ̀3UD s\H'u.tRA Y2hB!Tmd?C7%1-&RL\Ț9&qW*7qNZ7AG9|yn[-7B{le ;B_TceJ#y;?jQLS8Br@WDzȿ.}3=_k=z "3+΃7]~?}&cK_~2﷼͗}?s}w_;|x廾-ž{w ZwfunSxzxZs[2/_ fRt: +@ciTM8Ӌ9!Z8X0} @sA ԩߙ?$;`M"DҞj̫hcR4]yI=2LJH9cUr=bMl=ћ2OvK@Tl-*B+#|E銳 pU|'[-uLqh.,b]?gفg8;pvفggyӟ{?3Үwd~}gفg8;pvفg8;܁߹-W(d/Շ<%= "8!"T`VA / fTP(-.8Tt(ѩP%VroY3}yfޛY@@@F৲ccSؾVIE@@@Yiy?>؝x0Jg^ss2zX/Ͳ ܎   d}㟉 ,VxFrnI<ۆp?   d>hGS9&qʨI>i@@@k5p Ju]+K l    07CSs{bw ںd2||hE@@@"Z{emKhFr   ϒ?~'B"y荨1U2O   ߏ骰.P+BSk| TZ'   $ kɈPO|;z^=a+Hĭw졯@peC@@@@2vTX>۔]ƨKW'   BW(ѿy x1:.;<   ,rؽO:\uR),y.}@@@B5]v*2B* IB9#   W)r@[N,Ă x]Œ*AKk@@@( 2?,֬L&j[)ȴPuVj`Ud2D@@@ dֈ3]r}Km}Ew*2ڨz:^4    |ʗG+22}dTfVt6 A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATxymy}#s("%V,Ke[;Fz-ڮ qe(@@U䏤iM pN$A6n#][UYeZ,H>wi}k9};޵Eo}[{s;w{釾c{u[;R͡DZZV d q qӗݡn}/r5&p];ս>@r7ɶ/y x9F(v>n!g"--o_'>AOF~,b22_2s8x{? ⿎223+f>9_=t=}ӝxSWwN\=r8S oMtFSޡ4\Bǜؖ:1evbP,JهH!WB8-LM w #XCw R]c;٢ز'L1=$+eY qr>ܝ7,ڂA2Nt"f1řk&{E~SJTbcz}_楒ţ ~E+50uzK8R E1d'C2BkwL4z޾|ed'o]of&ZΓi_-1cMį} (#s31jrY1rֹ7 btZ kM[=$Y)L10ft{/l}H~'q[dw]!oc`o~뺿BUX$E'[ uQ'u>bKD@[$ a=zH-%-YCnpqa:itt݌șrږ_׋ O|Il[_;oB_w޾M9|}74 ss9M<]%87ĠF;K <.3 ڑe7ɯiO]iҙ^P} :tEJ {@~qh{ 8n oOosRy>m^LR!BF)TnF8/N~_N}2g.brZhrc&aK@x&3J;2UUڒA^s#Omt 66;r ZxH3GmnRa,݌6&%$DW ?1R ȩn*\Jd^Ii`)+BیΠ%Mn^ r_"Š+MzMp\.s'qbћ3AD5bxw~wP MTH8yXwOt3GWER4cnF(C7Sn DϦ <àdoR1Rjrb])=F~^^E вgmc0M·N^Of877_yMM)a^-TL(ɕC0'C‘x_ai!Q_ZBnǏNo5O4]Q.L4:~1^xq/W۾jO&E0mIÚ״hɜg? Q|8뇦zձ1bv[:%y/c;:-kX>2'eo5Ԭxrna:gr0#X?Z_¢7wy% :#jޱ1HYqNяa:ن&ĦgSFG7K{LG'e}f09ojc~:1RłNba{Aכp3$@oK<9&S> ar;7lE˅b+InOKE9U`,!gY~ ;,c8r)h.&#:pɏF6^¸El~.X ;R;:1Ṙ #',Sxdu3H=RFɟj .tFNAJ`Éq^0!yvϮ;?곮Sz!q0dG < N5+\&3-Muwh,AsdHpNBH٬a+{P).tb #'_;5|1D )^q5U\+, h2뀊)aBUfnL [tǁ Y+0zAB@qhz^b&RfRdJl-ɯ瀓O'4B"9`h6#v\%5ɳK"4=i'`,P&C =+ >cR%,/uF7QMEǰRC09g"!!:8ڒ?%Os$y9|p9_8Ҁ$MIN?uϞڷx;|kiYĹ3c?Ɏ7rr~FM5z=ó2.zA=-x_3(- _cE2PƬ3ºwO)ڽ"uSo &S:v[j#ޗwdÈZ1ѧOQE `cɟ/ὗXd!3_uGeܦ],{HMKQw lD3J]?3 K{tHȿw3<1ml/_C[ly^=c٫$kxpMjLD~ WY_H~;N3 1]1eB]{Ɠ^>̾w.wA~jݩ[cOzGN63g뻚o{D~da|NhTRMbɏoWAlzgsemxo]*b$՛/=&?lx v }?g|nd aWֆa(:=FD Ckc e{&>o_HJЫ0,E[uFohLo6WM’O;Iq=!^&VwذGkVebaLxt u@q:哅6/Iɂcs!miޘl@wʴː_{% 3rf#bV󓟵3{q-=}{A3an1K9X̴&-WVJhV\@ǿґ_Z f!K 5?<sz\}o}]w b`7C<ٗ\:Rq*/+h_-0lt~G?ݟN &s}639cG^LLJۛ??DHdzɏ`:[ _O6kj|7O6iņV`EFChei1Yflby*s6"ؕSWC)svkokM  ={Уrg ;vM%p^C@AzL]1M7S(z!6,y /ȢcЎeȑCKuZ{'q1cGtY!?ln?ب tۿCبt`wZt'ɏ7tӚIq`U)GOmꏴ8XI>rgv `WA~J7.X8tAg0:K9L~rtKgA7/RGCm92Ǹ^j=jflӓ'Y g}&䑅B kN~$=+݇?Vldp~îD HMA~rxVn⡻8ͣ@XL|=FBaz&E5U9Tل|f_1 !anr(œ>勳41nRˀS %0])`Fw;?Dq̱O~~\xȿ?jD27#a#a]+vH^IHc$%Yc019z <4BSN+Jx""gm^i>I-$",~6h`w~ݙ6vLC#45Ӓ<˷X{zŔˀԖWXA,Br nuYψA|*k.7S|R=9J;WRIyqM^j&r_!?U1Yu{Խ a@.mƁ*1B8R,5~{7w[Kmo@h欬= Eݒv7دѻ&6xM8>Y5C؆mH2-CU칗M\]Ō `S/;_L#-B~IJAkaӕ+H*ɿISze.?wta~ї&49ewT9_Ǎ_J`uG.F7T񒶸!,zg 4MzYJLğŨ\mȖbwh @҆7Bo İ0sT Sv7DjlZSxCA'?R~zz?]5$aQZseOǓFfnS_&=#홣__9TG+$Em᥉Pb q?VAMe7_}y&+.ᶌRg;HB1PSֿD弣/ Y~ -f Y&u?g \?lE6_X鍜?7oMapPVc5mleO ;I>XΟ4r6 -C~P@5~ʀ~6 Φ$(L5[X@zpdR  g9lt[2?75gC@V '0BZ8 [ed3w}*]4KfGbǏ~? ܎ܐ7,/~< Yann 4ӻ@혨؂ִG@assN{퉾]x/c>HGuJb ZBh?R x䷏*]~,Q D~,ۙl@a4`@mtPDJ䇥 F Nh|OmTxZZ$jc0F~&\X?;FrXu3%`pv|Mef6[6&?/#v p+My 05idH.CdZZB{s737,20"E.`2o87Dȟ 2<@zR^{-BZ8čՓ>G7<]y>h|ך Ss22 Hyɟ26`㋑/-э7ܵv 2OF{|'?7o䷔k20~p/t~rD㋑?(\u"Þ|@F cD睵CD"%L#?F7{t~>%ptܿkh4A; p.%c_H$Uɟd/i|ϻk?:-)vm`w~59V߽۝?Zk H.]T*l[|HT36{ 7P&f+>2Mؓx+\m"iԬ M?/v[}TlcOpﭱo3wݷ[r=_4_Kda$6G^@+Ek?`AJ :^[Z'dx(/dPQx*fn")k@@ޑ>lP{gmG@@'l"[b&:-<XXW00gOUӯ'wt3Jt!䯇ЖyMtD ?dIkJ9,3ZzwFЅ[F2 #;wqoO`H'9趣ee ezg" ]wʆ~Oukϰ4oo设M߶\fM ;nv 4$R>3#?3,#ݿF6mH._WRH­ɏPH37ڋoxPQJ,fsyBYo [D0r\uH $WMmpؑoEw}#xgeeAE䥗?9h">+9(ԑ|w)}Ȫ\4&\w4{M~N`J&@xg⻗{}+$?x6$ c'mi2>٠"&lwPoz&39:#<єns36ga't٥bTJRk l|Jwܨ?#\.7<76P')$v&Fm廿Ԗ4OxF6597!j@ຠ#3k_wqLHF6X[OC~ ߠgf*xɏ nZ LC~8PSw~l4x;̀Gʻyu緘7('=_{|3:yimImtܐX&ݮ8Z 6C* Yq*k@7ߧ:F~v%?LYiǰc1Hr ZoXV)UBSJ`5LO;DZZj%3 bd/O#@a3ߝ?3h;7/YMc^nyc6?^('c[_X))=_AnZ{f`/ɏo\R^ԡOH!F-[!$Sfc[Dd[ke@(l;f:{84ó?rZwe$п|m]ӓ7M7 8ŵ\ZQo;n3zkR6Y}\?36@r%sכ+?{z=D߭2-YR6=-J~pu|pǡ%?Hk0@,Eףּ?M8 í23J)H@K$e pf02AG}φg=?Sp`sY,@a2Y'l#C椬E Hm"?qs!GLbAP֜30hOOsHpb69Sjkicfl]pNywڴ1+tMRZ fjyĆB ӛ4y+6٨-{[|쏿 p j4E20y~!?U[K ʍl4u}$$؍&L}JtdPOɟ,m2g㙇]<Ԯx~S_1}\"4èD1gѩJց<<>}w9tr}wgiU3*k_`ȏ.W*<*ˍj\YA[^iuz5.9Y /}fD3-Alvɭhw~ISEb36}z:$WG^hQv6da}[|ٚorPCl'ڜe^۱)oUEϟN N6Z%kt h9!S p]0+ទ_6uCcuLr0!{ ygལ"f;:@~H`=$&Yn{G~LqVO~ǖG[) w䌘:H#i"%Hґr:؟䂅~R7~6xsc1>_@ ZL1`#J\qy t|s&Ƈ\ˑ_ܑM& {^0)ˇrLfgVJwviM@N\˓QYNPbalX;c{BD_5a?؀\wlWO~D9 `##?%-:!ȟ$f3Y +.!?TCYu.KC\~F,IR3a`n,@~=o6F7/U7Hh'`[<7\Q\#Fܦ O% w~##6e=8 !rl@qfTXxR#73gi5OYH|..H*viG;nw[扫u|w^6i-ЂXmngLdLpݩ}?}ݑ yꪣ/(#iqxnx[w1o}oۻw?Ο]ovk<]?){C󻠌,$D<r WOɐ9z+Ǐ:>HgcYt$(EO}oDZl`$ErlSF<4}V<018ج% aYKbU~cb8&(Ċᔬ`=1F vaT$Xx5' IE Ecޒ5kl~%:qU ox&%Q.&bI e@ =B! d6cq Qmf>X&G65K"{\Un4 }U8&<T5I 4JM*`i &e(afuVFYS! pǪY" G}} >5ay8BB0.=2LLNf!ѩD-s:㬈[;jHpi_2 *.@_s*[@jڍ9 T1e^_o#ܬEoԳ O%wȟΓ57M 5h1Z79hw~d!͙騐M&\F~ZI-{\q:t40PcB\|X H1n&`?dz9,i~$]1fe;N?Ʀ9#n?iIwx珹l䧕 !q&b܎akх 6:V_]{/{@\kl 2[؏қ(R:x3#aJ3YB{U8:iCK$9669Q~J9)!v9jM(g'kn,Њ[ 9`6!Xf(Am+[ x`C1 Ь4gD kH)c^ݐ)k'2 Lw̌ȊLpY{D%X3 @EP!?ЉDu l7`O"< r1é)rErY2-Z`?MJNZB'3w!MWmҀ˒#$8Y{x3fDĦ"DFUVe2NbJ"{bI:޽eENYΏ0tPeEVdT'BWƌJ9KOLiJ 9-:gqɺč"CzJM]3PCXd*.5;9N1SB%=!C prqL][T=QBP+g#?ĦZ.ҙ$jeX#Tw~Z\I&MvG"ґfSAZH }5# nY#ȯkPhNQ*PJJlD̳J f M;AV`j/o#?=XN,@9RՒ ;?O3ShH,aVܼ;?/PI(z\7M\]TFjV:2aѧ7Wp-{ѧ3?ս"LNw=}oaE'2+2]wK.wcGH.]w^fqg5lR-5O$!Ov_Lқuď|{ziG]w+~=例ҿuCQ/.\xO~{WfRFUE oodQm}+shc|.#Q _^cǨCH?!<QS"KD ݥ$!cgg>4`!X1U~urW}gW|b(zjءuJ=99aǞ qš:Z4_z`R}/]ܼCMgz`jǞoqq5I*c($57LA~89+"?&bNZι08&?l_&r>vyDksOTJ~]+ʧ8It|جV|&hĝ!ϼgIE NF`3y@JSI${J/3x=X!?@UmiC':YZ@PY†(Hd ,NZ3հ`D(|a9K]DaxK}~*;1cx %QUv`;@Irs9C&$?k#c39 !h:M:4ͪ(M +#uތr3쇀9pFM-% O-53Pm`԰IEa`)o-[I*]6,K5d0"?|n. :m+\4%xfP!?[(H/HaGq YH7u5qf S84jGY2:~ٜfyb3ѫaa}XV(jуZ&F!^*6Fԍ=Ħ܀k/36V;K pECۚqRq"قuSU±pE#Y_X+bƠ QU̓<,& 0dcg`cO%y=c_2< &X?`բS4@I1sSqQZRWC~X4orYb/X%_0h;CPEnEL^d#f>U?=+CIsP,}ў㠼},o+FU%ՏQE'=H^ sS xCk1T MqJ Jd6N!_vI֊1CgSf>s?ǡ A:dqg#?{ nKa_!s>rGG+d 5dBo*{@1nnS?* x=XHAtNnc?옕wnycY{J0T`>ly6LdU1 3@d^XbIbyC!&5/2Fm~HŐ`5=E" ۖhNC~maݺLJyvm:LefNp0jJF~HU7(Ҵ~ށz״"&Le萙 YcsQrzB 4 1)hJ Aߤȏqwmd`Y ERf:Ii k2)!ٵ%"/V+1j~y:u¦ ?[Jb?@ &U-p1&,W ;p!*uRzeJ >N)`QNl0;dٜJxڮbGo5Ay| %Ϯ}^ùL`z[,1F^i@acUۊ(cˈp+}/ nrfU1#vkthi-願ċ OIX c"kɗ'"ٞpR #OQ5[2/qI>e90\=o".Eȏ"Ѧ+6?[IDAT>fB t,0rG 5h0я+iE  ȬK' O䇠$+6m.ɰ  ȟet(kvEZf)nOW_Hf;>/&=˾d؊0AuXV\i\vQ j>DIN4X[.af]^Mнr 5nڠUSZt;IVL,L<փ˛3Lo*Dǟljf!,n~|eT]cǝB0X B6yN+0!Ȁȡ6{lx HzWUXkiTPɞ2>p";̰D?.cj"e$+Rq݁[E83.>p9@YDXz!,lb(1&1A O7D%[ UпM^>D~dٍ qM'K@ ?D%"źf&bX >cNE8Z5 Cc}IVlj@UM<փ˛35A`nTj&˛]773S$Ԣg )dH7h\LhDvT( .u(S ̗b:hqBp>C~TRş2$ՊIƨlHDz##<*QPAo$d'_Mp?(mr( q1g RR a{xA?a(}*󐠐p5YHȝ$/,1VS꫎vGљ11tU?<oE!|1ͷdɊ=(1}<7aA[}k -o|r$䬅‹ƤsӍtoz9f3Ot;1*>ɚ o/}=_2|R}P![1M6X) uWGF7Xd5^ݤjMI~3bGŸs堏=A_ s@ 8d$x7\w;_“#b{Z?W_y9[ٝ;o_ \Ć}ݵ':l8#מo>F_oο`hfW7\J5LCב o#%5'ŌU'| `O/8o3{+8b/XfV}=OG0J[s&+=PM(kv C w7JCq!EB(9FL?<~2e_Ǐ$Opʍfآ\IRanw] Ԇ,͢ {&7B{g45mnRŽtBڜC6d4=xCs}\bdg o3E륫/'CG .yRr}.dYe{ɗ{\ Eᇹ}Cx+9h_~^7KRDeKj0iA1 gZultA,Ej @ GM&sÇ*}42L)k,F~_K6ձ^\_nɚ{UN.5kw~t0̻xÀ'@€FBw~F+3تso FJ,|6j7yIP~һHŤZ*˶5D~]'[:iRyԱ/y iΏ(i('#>%A ~'?犌jzwEO*Go,Fa86~[/ph:oAnzrK"/5奩;D+)ˆqm6HVA~h0z _˜Xl| N 8ᴢcYiY SE[+<&,/@ݤ6G}i^X9-AF~R/ie?-1<ҵk=$ yrxa/hjdaom y_*%i/х_b;P$]2[slX1[RSFmU#?%SIN8EqWqZkxfRɠOH"ua6GZ /0C,D2;L@fu_ʓ?5S%p`fD>RG6' lOPi>`Y͵$% $ ,K~]5`|AYF^B9ErWHRԂ \DX-fPLV7$6p1&YO%H xD_3;1We{#¦Skw]FlwfLl+xg$.y `;9Źw~Raat%p0d5͌fl Ž-K& m @%m{fKU-?d ɦc?ǥ+*3f,L6x}LiUs YIvҒAyf<+F~I`fyBYŴz = X |V%:)Ӫ $Hd9A!-i:H=b@;4]L"I_#@f0u,ƅت%D{f8-dL)[lGQ2Jr9&ESE~ĆĠfts¤kd g. ˢq#?"8$4ᆴ蝿Zp\j*z\ʀ,D`1D^f1Xgp8{NxQgts Hi&MNp M-!Xw{Ƀ6({o59jc?KarkyYfNd *^L=4Td;jÄYRSzq8}râ ɒѬ a`;ALC~#i[pd Uǝ̣SmnO<\w|tepg/6RQnt+\lp&ϹQHH .^vuc$P05=Rw1 k=n]Zm ( ;kD~6Ek9Mތh䗜I1!!װF~NQ+/%%1"Kh<'5KHSυ)T0AN /06>9L~0Ǹk'w7kCWapN^w~ 0E!s%vEɟQ2OsLՖoR:9#oR:?ލM?4候cw-1O6?s$F Q;fWCO 'g}Y rmZV4sR@@|#?G'.LhatزϙH֔j646dIӸ¦nwnͿ|R/'8l|~}`<A^5!j܎t&gRF~͍:ԍuT@|*-F Q۝_3OΞ'=Gsr۳DB ɟ}iJP:WH~]lDoWPwS0:lڝ3T4Ȅ9tH?_O}+( z˭}'>ox@ >u}+/J:%*E `|V-DL-)_X`7eC䇆Fr@d"zOuS(LxJvZ;Q)*uAzw~ϺzVkwoK[~Ԟ|s_ ם)BjQ _8])>! tUI5zf3Xd%6din@jB;5gVZ<CLBA Ϟ~{ӣü}ߋ'{>ۗ,ݏ?$X-7]v)'> ![8q2Iu]C}UIK.=g$ 85Wd$6 7q:JNg*蒙 $LЋF VU,l}@JrB^1IC_ZP}spG9;<;`?[`?ɟp{K#== )`ء__0=Ň.?Դ22$U;o{f222g={E/[ee`c2pމ/Cz3*L=?ݹH֍f ee Nw?}_}o0|];սPQi疁 K'w׏ TN>[[?D -a-4?7vmhث gg#3O_w>4+仞IENDB`ic09 !PNG  IHDRx AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  @IDATxyU}!Hf& IH !a&@E&>EĆ(FljC[@J).6HWS   H I17k{?y|:g~k{X{] {z=Ի'CW\]_ps1Ofd Hdxp{5}pWWrug}?߱]2~y#w .gd Hd1(\ ~~o_wrS_M}}WgAbw\Id Hecw^\ Vo[o+>z} $@2 $2zۿ7S 7֭[H)$@2 $AG?~Ӧo|_۠oYⓁd Hd` | _}D^|w?-+7 @2 $@2_Hd HxΠ<볮o%>g;Hd HΎ?3<|w|e(+O}g=)={۷ U_AS[8VyI*Y8sH 8*d0J*t E ^L.IksĀǎ2M ̘L&EgaN |ZVcXny !UtqT̸XڄTHԛz4 *UcwQx玮\pUSn /9/'"jz ϞC[=g81oѫ&:maMf8kxpG;Gzxx;w}! _鉏 w"M}:{x xG|}?1tAzrl >nsԋGp ^)L젍9OTQp*`frRM*H^լMbƟhpU,3qg@ӼB:Áq\to=7lQϗ^)x*>h8jN0RfJ*NHUֱáڴvq69w9uM~8#PU8kT2l:#ǜ¸KVBOhHqjpP<̀ \c*8'Ra\rUx"q~8ڛ~g_~g/_^/W(7Tv|>S?rxǿpx Otgp'E*4}JY佩LtncAQV{0TR8qTgRVMFG8&pw1O Agէ͙dɀ 'Vf L8.wnp(J8OmGr4Y,Q WUЉqY Eic:kC8d+5MNCޢյX=,71,OT8p'"7)?JYu,.,o+CQ6*p%n%8sp^M<DkNAjmi=6+ k(4@R 38 7zx L(Ng]l6.Y+鬡:^=vrûǜE3(A,ѨVT:WSI~LCe m1X>}3 o-IMYv1 K ?ï˿ܷl<|u}gzCwڿpyyf[ΆSITi,a"Y0=c8̱wxzxV9$1رvZȄ|.W`*@Y{$i-:lXg؜u2 xYtP+8atTM(یor.% J*?>ֻzW:7t&|*7Y8Ie- H ?x=>U.!{|1 0Y~kD%g$+ӹHi#!_/_җ  ~k /jY`aſO/8JX6.+ xLx**TeS=c#q73¡8OqLNǃBd @&s  ^c睚AAAI'κ:$Ry{b{|8Ci ml UEN$iKy=:ŏI/=I~%Q͋FX k/? ׃OuO`[L?YASSϜlgn&46NTR;))URqդBPq-UY*p \~j~Lk:AmiK]PE[EKlA Uƙ}>NM 5JN: 8tMu.}欋|JAUC*6W\U3vTODI(5%\xƧPa}Ь'Kp*8˧rP#8pXY| 5JEfqcwyzƮ+/QYU%߭`aKC%V&* yq73¡8Oq_TtaNB Kp_?_'ƂWI >h8r{LT(ac-P {7q`AIN= 6.Rq ,]^Umbx+g T»3\MEjua|g \ ̀ \a AgTntg-`(Q~_?珿Be9^pU'/The*,DNl{0-Nyi/,U2 TI{8F0O¡WaۅV=TŖh-CDKlEg '1L!N: JrlTnXXH/u=E* E8y>*8u5>ճ&1=N3DP5 b|8g\n^MpXY|ŘЋ=sZDǿu~C7u?;A|_\T`= CB[*mqbI0J*&"Z|p(N 8] ֒Ba2I-%bhhL$fi#DI'AI Yml{T /gIWLe(sVJr5r!񩞕o5`Y( ,+Fqᰄ Vk o(%/Bua·fvF8'Rx6Nc!KpԻg5jх=4>h8 1uR[_*tpR 384֤Mk01D'n*Nх8K,hS]RNLe1gU'& Ƨ..z;`s b|8QFvXY| .XQtO~Yxx⏾\aIMr9]ĖcdoҎ z5 ,3c#默gvF8'Rx6Nc[mb^M:ѣGF@@mGU'JUB*50C3^'|<;JT2D4`76{,Rʭ,K4\ˉ4#8&pKp8|*7 `xeBEeB Vk,3"Vp?bo;" ӽQ_fCY leՠR_X4SQrP2B*hrEQuZD-85P,*U0CsBQd~ M:0N!,@6[Aq xg{<.@cŪT%\leHaY#2NsDU(39šUPk,LӎOUȈ-s#gIx47}ދUOcvSVGKl hٔşYSU>Ia?Cq"%Sxkp NjE=4>h8߇W' (A*tpR 384'BQd !. ;`'-mMC g8Z, 5J:7)wEpl0lrSf RĖMY UY lU'd`" iQHMW&q3:m*8+Ε,@6^Bq?ƷşǵUaTe ׯx5+Ƞf̏FD{őΜ‡#œ'Ӌ:PP[0f=WHA%k:(1JXE6MM*r+*ˡUD|,. / 4dqE!⻀\Zc9HkA =4g+VqKMUq-%eS~gVT'Y4iT'`bܛ0Yx?!' T&DfxbNW%GJ0.=lH.|,DG4~޺h*0rP2B*0NS C- % (%x 5Nc ,QeP^'tG%O\i+D-pP Ԭ Y ID" ?Th0N!mMC g8Z, 5J:QڦK<1֪ H:4|nլ9ZbKE˦Ϭ*T&sYFnl/tFBT(b TPaG8 ſIT(2HK/4 Y*oyw=KMUhpѲ)?ҧj/_RAfƞY EUx!oU3sUP2-CR|IQ!QFTc]d\u#gtXCP`iU#] g5J$⓿D;ܫ;SGGKl|,J,hӨ^4 kuGqD#|F?FK!*[l ^BL( Uw(Ui/̻qD$q?ZsVp-k.Z\ˉ7TBO3!TpO ?yn=ԫY&?=NJ+Z6eg TeoV?WNiԆ ]f'd,!>V$bkϺ)8]yE%E߹o_uzB7/Q:ݒ @oʂWoV9ԬI 4FO(f9\  #3tp-a,RHNl0h$83%jsBYK[Q#wYj&NxCV8-%c 9YMC@9Y$Y|6yNAWYl\ypSV9fhtY߆#WmUeP ,lUY#̕Tؒ)GԋG#k:(;8?kiQ`GJ]ˉXl}3q2\i5{a"@˧rsPqxQHѾ&Y0c#!z8(ƥ8HMF&&J93ſYbr-.htGzzo[85ŊjAf)Zbˇ8o9p4#U9vşI|r.Öu=Wܜ)3$CéG1.ũ–whTh_MhM|լBxr"έanJ&\oKpQ?t=@n85ŊjAf)Zbˇ8o9p4#U9vs_=l43X 0(YM21ŜǁW'}5#lqpfBmFR7UsR.70adjq: X>5"p-?.!USLQD,e~E8U+`xf5TcΜL(pF'_2I~9kl XpLbG \ [ S!_`qF' .%huy20ڻ MYeHJ^jV!R:rEPiqGb;'pdb /x}MhK1,OY95 BjR ՠjLĖaW _I߯4(şQT ~ʠf'pX_{6PT{Fg3Yu]^H,@BōoRd7nD*:,4۸Q<ŹfuKpkXdpVq`+/OYeH^G򩁗U`LY=(M{6YMqI` ژ?z5L*Ls84BɀUak?ECмyex^LG㩒-Sðtba-qsb$DKqX?Oo&;OS%R*D^|*!,j[vN"6oڧrΨY 7~נIA'jh’LE*:[cJ Gq3:Q6I͛Yi+6.mI8 nKӰmp'Q'`.G)h4F-4DjFEi^TdP S*f"s,&?Aw,NEnLsӿȄ SqD!F9 t 886%j1gd#ē|Rl\aEfvG`L(;gSTl{,Z]ˉBgtee|j]eKhLdl]lEC @$=l.3vc䜋?b'0sh-*UHTԽbEE5f\G f"wF1aQ cqG&8?(wez4E&tiǞnSX(gs0ũрVf*jAI(gVƬ&qĠ8O!i|Rk p|hl aDT&hu-'囡 3>ŕ0&p,XrcUHP {]lҙhí+L@pqKc #$^TdU LX&f~b @ű'lJ(qYM̂%x]n4Z~ZLe{lnj,46; dGq3:3tMǢյx~(eh9CCHy.vPP 5)+-[_+5&B~P3܀iluQſ]L3!,O(`(5b&7ӞŹXaL,NNq ݩAR0I8gy'e!9.J#(3:Q0IMǢյgt"Ƨ?Qҋy^;X;Pbvz4)+-;⏋bk ?- ] *LKR*I*D.b:ゑ2TJ+JByɿ$2)YMYq$;հc,E81 XcLeRA3@ʖuJ< jR_(zCNVQ7'[/6IMhD }GZjT@kF-CsŘj.BM2Y#z+rpp8vic.`ׯX& 9ŹXa!B#");ݑ gHA5LM9*Nִ*/v ?ի"hkq`® 4-`-qr -I]−>Y+ 4 h 8( mxƻC>8&x%}YMb[Pd!-RnpdGqSGhu-'\}iTkk.H;+0${l`)Fټ(8I"rC1]M@bpgU{pCwr.[0DR"ԋJIKM*Ĝ`R K0(|9FÅ46Y7*TREPls0i`d86ޅ΢xctPX$Y iQN'@&x+h5=D<|F6TM:P5k Ga~HLʧ}~@cju&us) \n[uŒ/¢qjVsY"385^Tj֤.uSA*Xf(f"7G1aQ lS^Q)MSJ+`ٜ Y6Pn&3hBP[uwf5#E9BZT5;ы`&U6.b`M1C_i+.))y#k'T{bvz4ηF#nu.wQKa vB巗z^Tj5mMԬ$pjV!0bٶw8֯43wtV;RR(!YFڦG5^TjzpN*H^I*DWLH?:XiA[j'T8 ig`-Bܤ0L4΂5Wḋq1]eȧ۳&lPT Z#8QƋ kMdAl:s.% q zPFi`9=Ũ=Tvi An2 _bp(GBpX" W1x81jW*KZ.ѐ9b$@耔[ /oOn|ѻ{|ho[|=a~wB~Ɏ7C3Oe/>o@7׿MÃ5q׭۷; Z c{ߞl?1ek({;6{ sn<;kɝ۷{KtLxiAQzג sϥc,{s6| 7܆Ӽ4a rfV8S8$:Hgw#g.i gz׃ ?S4|+_<wHA n@7~l ^www#yAf?lzI5S#!vşwU1UҬ$!<4=<fיؽyma܀~Wo=jd ؈O`;*D~o<4I?E?9گ~M<P};، $eOo>i!gVq [] -PZ4bmӉQo ,B 8_ +APKtǩ/[OJ@2p \_~G~ҧ=!xGО}Zv=7Gy(&fM^Ύ_qv;ǜ \,>q€x2ǐplB=841{{'Z{|:A9S2 읁wᑩ_Rvſ_;/Ċ(]@q-<5@2p 4{]Ɓ_D_?5XuQďӮQy6&Vx fQvT"DڸT$d c/Pbg2 ;xM~9drȇ8boRpwu2d2p\_dGfC>'Q]EW%q_U&L3w{δzjh+Q"8 =r 3_Ju_Lp:JN3W 6/ay)Rm z2p) S Fef 3:OtY [A/4҈|O.=P{qdzȍt+/ڈ؛ @}i .v8;O8k*}F*d#+ߒKa@z$Kb:бҖ[Jd@nX4"JA5!7-)& RA$50Mਨ >@2p ȞVҏS5T .!Z켜QhSMc4Κ!<{o*דA4%7Ԅ9`Y1>WM܎Bf3H.[q*( eZuj's혁X{7~j}PJ3RJΟL~8ϻ㐶( l^9Dm 5pS?)Қd tWK?Ѡl @[ T}2+')dMPgEKSaKb3V2 7-tX)d` ]#B]MXz8G%OgrXznud^'MUyT} -|dc "ԗFДPD Qe Gq*tpR 3O0 YBm%À~) C5tP gv &u>MU*&pc\zſ=8dc `! SASDM8K4?槇%R2 ;zYIULc.jF;PzſJ;`eS`vcx#{p}Zz eG~18uy{I0QI2?m IϓLB auBT(㊭Ϊӯ͔Ṷ/>9O#dx[:}/w&[crPGIsCR\c~( l상2W턡|}d*!̞'-__*'<÷}W m)dw!Q&p+b p}8YQ ;ĎKKU6Uu%Bllb Qd[~TB4aFcGh|^Wa OAv l㩿pʓW#{>ߒaB!B0p*XxJ5@0y_Z}=20F뜪P-pP Ԭ ;,~^X>ӆW~ N"L"؄=OeXp-3\q<[\ TiS9YY:})>!LlW<<{Nd/-#TMu?9i9vW_XBl* A*X?(-/_Q/;sw9ɍs,/bW}ʓ+]`G^Mp%/%{+hn/=[vC:ߝ05ʻ^d^GQ6QN yOݾ⏳ptO0+am,yJ:A52|KamK*8?/%{ڏR aTKgӯ+ohvC:]x@IDATuz+rzd X̀?ιtɇ= "}?=Oנ꠮J*U#ɣtoo!-jl)%6 'pm6ufT$z' ȭX׈ %|l 1XZUpuB<%|&Y2`GYlQaȝi ' $GkP^md*|BYq~8VET~l9@4 Ls3Hv|PGsY4]S]hoN;^%8 œA*lw[E%=0p-*O#@wAşFl)C&Gc@˖dP+PGs‰WVr { l* %z8|C&C'0S{f~"NHlAWA^2|2pP͇=t)vub=/X*}+idP 1~Qˑ==^`/?Gd 8w@~c!ԙm ϼ 1 ݫ])idP 1}b)vzSF3X2 <̴q|ѣ9,Mgsta+/Ր|n?f K'6ݏ@ov $b@LJZUd7=vW^ܷn %zcYW0]>^O:V]{&8'Nm4]S3׉)WI.ڽ ܷkT,?ǂTE?>nBa:zʸqГk =´I9vm&LPBU5 Q7CC1aQ P Y>@xgXQ^\_沑 =mn3b!LrPw| !&L!fX,4<:@Gp)zIdk/ h!dDS 4E⏽^rPdjd鼂ra^|Vp.@2pz `i*%cW.Z7qoja?S>K\4 ʰQ>?uȚV0/_<g2 7(k3׾_䠬H}c=7.HKOqD kĽ69G2ppgNƿOZT @ W }$^Ul) /DOc82MvĀ 9^~PXäi̸Y<|$2@Vszz$TCsUŞ]nS.T5LT:NQK@)$|G8}]yG865L\#VLx>z Y剅=}g~0on:(aS1 fODpXijT1U :"ȧ!5qX*[5'_fC\@5b 8nPcoD&@)*OdaZAHqf`$SD].-Yq$t \ 8 pߏk? N.Zw:GU ,Hk q#?~e0S $g?N.ZxmrWئ1/!Hqut'w:ӁFQG>-I;Vé"k4>Fs=/IqMaR;ƼIOP/;[H@2ptal\ӢAQ`Xd# Gʔ{?F(&$>(.sd /cԊXKY}Ooz=B^w׉:LƀDCr? - nofd 8vIR5>W]=T]?2KG_~vs1T¼^^=!g2 \T8O`ݘUEUhnunݲ!A<\^a֗Pz>d<__bYYu\zO\͞GF.#3>H^ϥppv?)G)Nj4+ۻg<\n/aӌ $`?v?-{uGfTBL?bs})pX#^ 7H@SVM&Ɣ4C'ʷ#uXwLKR&ZR RZZir |VM.0И!]s:)Q Qu%t%[@2p H!¤e5|$be;4vt}$Ȥ? tL)OHG« EZMu-*%iXdä1¤e>H^c-xZKL3`M?R3W# UKUGZ⏽ESg2p! Q$ aR@?Ȅܬ_;u tK2I,V[Pb ns ydna?$7KwD1v)Bq'ɿ$)OA|y)9$ˀIc53  (W D@1JlU͕g}+rٍ+e7_F)I6 O(F.B(N*ZXCY:(oJZ's{ڎ HY}s]yOd?2v f 9ZQ݀ 8ّhc?tIM2:[~Ï J aNގ Շ)y: 62v2)nM墊8:+ռʢQBqWp>d.zNw9E _@2!rTnv R|ksX+h1?L%e"ϣklfٴppq/K_ȧv0t˾?_e، H(0)jzȡ_/Q!w6B x$O4uqn_ WFH1v Vz~/:v+p;1>|xm$%SN"KHB &UGR o| o;2]1{//b#=zyY$xsZ#0_qZVQZv*Kw(U\ $πA&Qr-trifÓBpx"\L#af^+)LǁI6ȔdaǀIaLԚ%HndԲCwm%+ ş%LaJ_1Xd7Vx$;踸@ϙ pФh,p%L8i-T,V8)Z¯]7&pd 8#f5=\Y'] 3S7MCZwVk_UDOCN2nN/@2p #) 'zvˤ+hW*tc]a*}?4ePi*',[.毫VC{LdX$C?@dgyc@=) ȝ7=f/'qid<01pݫ2WjUiժ2&Qa ` }r>]d 5[aaH)HΝs:d_ ճ‘QDPGrm=<9a1mW!XOLH4{aÜQCU~WRu\q(8x.Xt" L1@I!!X:bcNZ GTJ%XtuJ@j*L0k@UJDq9=C U~2NB2 (zDP1|2`+RK@xb;9q`O=< >g@:jJwJEW(΢5dRC.#)Љv?TT-H֨lIɤ5aΨ3.D}.d 8k̢VCcX阓V8R/"wKŝ\Nw_KV2/|ry8v<8[2 {=eIsdX^c;&6pלy:-ViIJMW(.M6Doe7twT/|d9'pX9L 2z/+O8 Y0, 'ec 272+5=uc [@2pF Hopr/ ‘ փGeo*1[epjſlS~!p])2˺*c֚ w]!f<[@2p M]<Vh+YP)g,b*<-W]28>{BWbVp֪keW+N6F/,.R1読plpB2 \u.Ђ#9-E6$UQ)5ϖ ZݰTqY\N_rpMR2 +r#‘Xe8,'u?_7T8d&Ȅ${upWI||5SQu9sşAWW~f!& Ñ܋?ζ$_ca85H֨lIE7So^_~F1[x[}vA_3"5@2p 1uǗa2. XiUxPzk5f[&mu8vC:蓭]3?Kd H.RnG?P$ɑW1 +pQ5޲.CP(ӑFU)$@2 $ ZK*8XnOL';@2 $3@C>DlW t߲L)Hd ،^%FM J|2n}1de@=#^ 9Epf O'KvmD |2s{ӄw$`I<`+ӲߌQ\u6CTs]Ӭ*b΋/gRy. \O|c/~5L2p(vV8ԜnGW],HhLHwNh4"X^ދ_,+PfZjb]@ tjeB\k`d?2+MvH.g?ɗ=]2G&Jʀ/8U};r2;XK& j)$۷/s`9d T%<ȥ0hf/Dt;ѳ7d He XNJfE:Js( @;j;{S,wqYd HNhYu9_MHNd H"U"kI3?FmFuO.?|b~饋 $@2 1 05 ˊL:GmN.NY=ξGݲMݢqDgxYhj{2 $@2 \_2Cs,8/NYV=.uƻ\h6)$@2 $ Hiү0Sp @- 8T( []|R'[,%@2 $7Gf u(/5Ѩ_04ʍ}:2Q uuű.Ӛ7&)d Hn&m !T- J۞cuJXuADjTCzO)Hd bkGaLP@\iYi[^wW]5uת vpşߒ!l @2 $7PqTKT SiW>s(f-~ LO9FHu2 $@2 :S}n7~%d H8σ)fD*$"|hʰmQ4g}+Rd Hd`9Xt:ZWi'meҥV*n[1 WH3uU{IKƛHJ= 6@2 $B|iPJ+z'0Pԍ€)|5c/{Hxd H6e. e4$*Hd 0%Vs)=MnJ@2 $Z7ЅZv'_kpgUXZ}]'Ť$0Hd jRRiwVl4a uqfHs2 $@2 `MNY'P49a@CBC @2 $@@ǫR{pF?Vv6d H6dſJҩ2utpb?O m)%@2 ,oU{-ӯu9AIB2 $@2e@FUmOWYuG0 P!*s=HdxN PC8սJyVZh23Poò4U+/SwErJ $@2-6VWWU8_p+/=t{b%x]SJd 8=zG_71']Ӵ@ lDzj3Hd ]m;ISċM*@2 $Gcj~_rKݸ\u8B&6@2 $~ٟOko>.#ɫ.:;& ;&Q/38{?qN@JH̴B VZ,m׉&UtZ|d 'YIc2 $@20PoQq*V]<\tP-0ÄY1c ЪPTmK8L>d Hn"X^|Y X)jh>qpXF@t];k.UY9(>bz#6C* $@2 lĀ+,/,(V{OE?D"{(5Pn@Mcgy#6C*X/9m)'@2 $=p`ye)MQy1*h@]Jm EwgizcUPĖY/)%@2 $ `Ae)8T_PiJMC-_Jmis,?rxB&":$dIM1`꓁d H.~-DE'B;h.oEMcgqÔd HIB-SdUϠY~UмV1.$3 Ӎu16G(#0*v9 æ>Hd&0Ph?l;= j[Fa3d Hdπi^(,X[ι㠷zp]% $@2 25ȩ_sE7I ,ŵQsy$iLd H(fX._JF?支d Hd`?yXJ=;=r{Ì $@2 tϯgQˈj @8O1qd H>P:@8gϦgǺ$&ŝ\\:*T(IT,n/Q{M%@2 $]֘1)_ƠÝ@dDn@45!jUf2 $@20ʀ}HUMYi\gqBs]*9V ..nF}PP#'d Hd`PMJ4YXt; 8FYAt-osq &psN#Hd37V:lVǒ4'W1U0SS.]nRLd Hz ?t(|90(`Cr]Kt '$cWlLd H) NsOo*-.g$,Hd3tud8 Ns'x@GBY0*U0E/Ð Sd H n})AEGPqBVuK.? . 5_*lX(3)Hd Hҭ/YXtqG͟؂hPt[fs8B{ Q $_᫾3+v~dxcx/qmw:WdXtf,c P %847}Lm_ |Cl _oqqD4R;0pqQ#UUU?'o`iA<^_7-ѝ&DksV]K&8;\ZyUBb?L>mx ޿_VzrߊP.@hLt|*=B2 ,`c?ꃇֿ4mÛ~x uY@t-M{` `h  2@{.n)0ІUD̎5DSMBsn<^|*7t@)& O}ㇿ?iq |fG4gX0x PkҪ(01an$|RFWD40:tq>q:Xt8STNb2 f-+>VFhN q(#X"<7ǶHUBbߦCL"LL7B*w@|V4Ŷzvq40! 4d1ך$d`{>e>?"[|hMR<6:ٸ@\uqu*sl*(6/{ jLLP @Ի1jZM 4 ́A \`fw 섁? ; )ԘrDs s XF&ƹcV[ !@9e0 lÀ. hC%8Sid#8b2 ,f֭FOҋ6xPq\V6TS߂_H t)h`[(}B3`E%8SidcGK%2 GCwls L`nf[b+/:-PQ'/D욚~2d&a NwSiHs;ZRL.k%_wJp-M`cGKlhdOy܃yş ]Ȥ%⮑|Ǻ1 jZM=Q-l"oxa AgTn.`='ρSL3ftܜѝŎfBqik v[GPWE]&%|.,gMn"1iV4qͨt6Q7^:,!,l[(d TŎfBq@?k_+/]wP[)MX R؊'tnayCNa  4d8ι $.ATCb(Op$ʴ $5jȇ ) w,MClhI1p -8}/́T/|ZlV4SS)H6f?rPzWlW;`Z+_j1HN hMÇM`qb ƪ @H>q?2IԟwG&.w#C&JJuD Aϱ6qS&qkMw2p Zq_]JZ'Tֵ| Ԁ%J#IjbXC<.ᴼOicB_8W+'OZ5w67@Uj97sqJʡ d 8m1&xg6!fX3CѴb@c됶.&ž]<:dͰUѡ2TM•wQRL3f`l p,M2`0fD=TMD$!iLd`c8pdpXuϫިgذo ygOojWfD@Mno!fw.%N̯)&@8RRq4⿸*l/55L F*$s|)|n@wHyo   IyCen<`)Ћ(8n\?d2М(2I,. :B0# Ukҩ1p9[;g e?4&ibWЋ2Ap!W9)'92`CsTGf8BǜW_€g =P3g@'MN`yhm*ǒ ?]7KB5\J@2p ȞnN,q^7I db 8mUx6ڿq.Lɏ,$b>ǀ/[7@*UCycK16[ $w8HnbAcl%2۽9Q`/Xpݫa.?v 0a x# UwL-eeəּPDZF;n$C11Ld|hNw,G.83/ k?Pދ>5y_/\B>hlUdžZBeǖbl* @>H p ,>| d 8G1Q!`Ցd'er01FIϑ&= *0Ji (!6h+Cd4jlqK1~]GGr,b W-쌬4nIb}̺ ƲLbBՎ WEdc "Ҫ96V>`)Fc>`7C1p uhW2 129Y,\ݳSxTGS<㠪-.֩IwDjGfRB(.!Pdy-<Ш&jr*C8XQ{Cp#awǡȊLᲕ $0s4b>`)F㸋v8hR d ,:A X]ݛBt:bőMP.@Fv$BqlucDm^}RQUxVJb| Gb8lu[PjdlrpL*g X3::\qSwPKU.!x)T-IB+w]gfIkZYgFiGd 8{X[8ˊ?w1%h ] "%IU±zo?? {6S^z- gtbXq/K FzM}wG1MDbvJ3d{a0yU`<#pWdav$`Gpl[S:B5N *͋hjnwjdLsa:`Os7h!:eǎ_B4T#!>űqſȘTv@_ŒC/<4C۵kdM>,3 UHS\+] -6+a\]`BΥe[ NHbOxLhuuoK BLPu8c_IUX1_ZUb 7< U2 썁!|aXOg9FP= 8O߹R,8;=6Q$%JHɖ,ْ%%XF$ H HS $Oy0W1 ~P2  EF,ٚ'QTsj=wjZ^ZU_}Uګ9o_y£Gnty+3mXݥ eXuS+DyOCBq J|8*pVƢ$won(ce|S.7p=&lIEVFKUw8 Xx5YQ Lw d i@z׋vZ[Y-3yv4m4YЇxͿΉ@{ yҌ]>?f[◾ 8GpowN+vdY 6Z~g=4{-R+2ߜv؝ lL(ǍKKx#Qv4WaGag4MR2Jpz=d >>_z ]Ҍv'ȜIߘVxݿ+G.S7~pّeGf9"/˃u>d*0_ 4c{ϚtUEg.QۯNo'}slGaݏS8`8D՗moƁVL37W0^Q'IKt4TT3/G/o?>};WȲ#l4ݜ˒Q:]j9򐮼м~78>}:ǯ?*ʫ~7>w⇀jؑeGfrT. 57+oϹ=}ɎUV`v؝tWT!g_kFA zۀ_ށL /ҍz4 gbZ ΰe9G&`KLhRv9?_p?9 *^bG ЁP `W=za$9eřRN6IX@lWеQ| dGJr(  L,O.4;k=eh{j,4*/5V@zmXc\.rGFAN)zh[M=pwF P Q_<{)QTg=2c~8ᷚz4Oo2|OWp|5.VM3,QRǻ̽H.pSͿ|;md ڋ1C:*pTVnw_u\wOg{ߗQyZ=ٖZ?+ݯ8XJJ*@uw?1!`i\7 *Yo<ģGYq͟RIc%Fәl:[8UD2i@{_DuHbq9p &6 *PQ;C)P@-H{0v-[V@nRm!!^ГGQwn_`__-ߚ?7uSkT8G \e[Hr]+6TWb]`=_qqXJQTMNfs8*p*0u;TLYK *p;ؼ堻ݟS\|5[V ;FxK}=fZ.G ܽ l~tKɍ+-!!a|R[cxǩ1!θ`W65aÁAUWlŦ|G r>o4#N1f 1YtA$ 7 _A|k \\s>hFATk?l@GW_sv l?p}qN8@FDqxG4m5H1qѹ@IDAT %dae;G@ĺ'J{hN7*+@7 +yP8*pOfʞ(O4-nDhEwAioƁikC CuT@;L?f1>9p?&qQ<e^iE[‘9ecz5آl*MŀuqXaIeLQẵ"NOqG IՎ3 TJψiԩhK8J亚PCqsR)6l<xT+pғPmF1'=M!h0CŕVj.{[ʝ;Ȏ h'iJڕ0b?.s;`/Ar 9@ 6Bvr;KqG J[Wb^e_Js 97\(gy{R3xҩekLZnHI{v?C~*uT۟||cz&U5bB4/''?$|߇%9SO}F,k4j}}w׳֣7[{wTN7 3zޕٝ byK?;>>J]}#ݺ寮W eXHjF!;C'l/?Q?'?~⇀燝#4#.5N&ըף"j''8{z9q2`-O>#T ʈu êu?t_==$Vh/ۼ1! ]m#<|k_>~H:QwO?.O[o^Y|% 9 qQP$3Al4|[@+}g#@X:k ID I wL"=!EpL4sn8 J͗DMrqͅM4@w='XljLw :9q iH5F _Ua1֬e/uה#vIKBNfd2F6Xu/sűsDIx O/@ELj6D??)GB2%. XëWg7NK\qQ,qP8@Pj')/{lIACF{u8b)lq {NYphe0`|0yl6&,&AaͿb˯XF6P Zwv=LXtMv0%Qċ`ys1p?UZb-@J%K1-P&S(YuӿTB2AuR=WD74&p7)V8qRЀGߨ85l6LcZRBPUa1֬ ]S؍&i,Y& ;O]q(aM ^Aǒp4Iyvg= *hTTv7F7)9;pqp$7k"DZ*Ra1h$3,_!UZU'TZ(BU*5rd/usIKBNfd0JFkXpqGRHPjO Yu4*B  ,';t +Zx4( Z|پ<~_lT\W1i}pиQT4LfKjeT>똡Xw^-1)f:?!A&+85whPx,DMdXHN- ش&A?Ũ_Ua1p *k} V;ȍ&i,Y& ;O]q(aM ^Aǒ`~O֪h\UbeRu7ɐ1ܰ^V_eu4f\dF>he'SwEr)p_ W2F^~UE6S(t&lY:An@4LK`IFq ,";*Q{'.]:0Q.C\8 D8K}\q6 $7l@5ʂ?pwilx"x=ԫd Yk#l*1%o=lH[a4!Y*l4V8έeW@|Hy ?ZbO\Ag2;jn'n Vp~F>).{na)u4fO<1p{A z9͐ޢ _QWN;Uqӌݖ17J4LnTXsRU2ZB" 2xC)p4.p%[^h(}qDh݄Vpn88whPTrȣK-6UV`Ž?j=HLD[(C*L66J 1@szI+kQRUHk-l9J/7!!j:?VגA+bw87#8`"Y*ሽOy k{bhK~z'}4*BZ=ʢ ,;}4\*[&i:oƍ[q9E+v ,ccuDW % f}aI#,4Lp*V]ⲋ%.~دi{bXm^SdzqDhğVp>.ޭTS4\p/NN9a4ű!&p5IWho\nl#&LѯbmpJFq %l9}WPBn>q*M"֐L_ǀ2l# 9ިԹu7N9c3s`Y}H)}?;EfSTG&5b8Uz\j95RfoS0LFIX<ű!&sw8L aʿI,4L4X*JFkXHD ^<_gkjn4N6 }˓&`<`Q#*ߪW**¥عͿSHhR MU!6-N\ӤcB1X>,p Bä9?TKDPH ᑇ}f(zͱ6}@ ҵ`.PdȖ00h*$sE3k/(C\8>Nˇ >5Or(Y.Q6McE/nTL[أc=c.#YPVg Ue0 #I;嬱ɛAJ&T~ Ur #Z4|mUv{ubV/?i$e91 Z \pQ:Z D6E%NooF>) l1\"lp)Ǟ)q#Vkk _5s:obvs`Ve p"¸z4)XPqP&] [-df PYD>i`p\5eW@|1.I \T A^Fw|&8$l*i-/)6ٺPdX00hɆ*$VȻݨ7(E%N2>ow@%#Dc9` 8vX9(8];[@K1ꈦ+?F\ml;jw,M/xn ~&MpRUs040͟j}ytX]{H|,bw*qǤ!DF  *=]W@cC|k bcq R86ƀpɟRU.SͿ FpEC۬rۨLVcMڟXB##'Eml Jr] m!c*yN*ONkEװ ^@!;Ir8?e54,ۢʁIdH{8oy DK8wK'P a>HqvQn"06N v1\ k`pGZo$uRj]^ALpb~`UmV9lEl.voRCwP įC a,|!4V˜7\ bN6@Ur8?N)G3@(]@Tl*ja ̓xVx4`wE.a'"a?bպ%-Ҵ{ñ6.gvNQn5lSyld壶Ml:( DZ윙3$v$ p5&o,4L4XTsJ`!F+],毥5jͰ^X+lLzl:GҊ ɐ'K3*`X4}ee.ZN{zgkBډY84CD ˜O̼*>~YSb,4puN@2<chjUPhv5'`!Fii%.B:n%_\όIMz@ ^utKw8uILg>eYPT!.Jo7)(ƥPK~ajҌi^zI;Q8 f!tmhQ[6Աj DH$V bc'58v"ƿš?S`AMO* n%ΔP%oϭ6yCvBäE d-Ǩᵋ%-xBGb܍ϙ  $kHFCz+@sݨ7(j86^OneK3 ~==qEFC36D/Ubv^Sb g~4puN#=Fـ9mlj5#\S4=03:s|pAY2OvAJqfI[4=o+6s`&S "ZBjр[a"rvޠ8(yxh' [3a`CpH|u2*!!kYʛ$L"iRUSǮ5"$ iazOEYXck`7IGbiM K[, 1bDkƜƟp7y!c>mMԡUqs@Bhu&n]:lhE0hV};LJ p w4ݲ1$5˥ƶ{1Q F_L6=hı&OXÒ@#1I{4\)d> ` %7^a8F(]u͘JpMèog(Uj5m)X9̰Q}^C?%V~Bjaр[aab#u&P&&Cj`D8_1p#!A{ؐz6 w4mKUM=^klDF뜶&8 g֣cLE:%È pWV'DyKgKܜ# d"sh&\&Sw\/62kr:̰QΠc 6ϖ=ۓ#t8pQz+@sRS#lN5amy$hDmO6zz0,!"ӵpVGvoC-\jp_c#2"&X0i8ͿrRNxn ڪQ,`.`]Vt3yHVgW88F N/lRQ}7?F?z+@sr tJ7n$ HsUp{l}ʧ94XyRO'ذG-oolk7ȓW?g^%Y80,N8[ݬÉB T.b ``IG A3dNc!Ip*^slLܞ7X*6s`+Y!`hE0werIZp&hA5-7w٨/TtIʅC3 B8+܃SME0PrpQc=!(VoQe{]z@#i`,A_R6h:aT԰X.#Fi %za7H3*5 ۳f(gpϱA=lJg=yZp4Vx'ڸn_|4,>N}YdEؐz6;½5?Q3sL#T l3T3l3rc{`t@ZaC8\ F s&bhSMZ.i6n i|7.AT]Ҍ>N5aih3DĐc"pV[x9 ̂Gz Rꜵ71y2.͠ℑ’}8Q&8ryKg1FA{{arr-P5arF.s`({ҙ@kWU?(`!OȔz_+{ӈqB(`AhASwNnE#lF6؉DGͷz w4݆1$5˥_ϋK3ZL{TUf2zOm!c>&%# CTXN 2讻X`58Fp@~ݲV۾ҫ=zˆģcL@Îz TPI -FIOgl,CHa G{$i)+Z0i WTX2ܝ/r>p| BeS<K;ˆģW@_C7}##5%S.b&TxqhR (V'4GDUbɞ 0 `%b ` rG5(!<^CSkkl>T3^g=8}hx4\-SaLG/jk| %)Z93z0Gb@Y:KZ(bsEX<` eKMinS֜7X7מzW]@XF 6֡%k6~3=8hrB)?#'ԝS+Y# EÉ.#h2P^ݫaj֨'@ &0؁PGb@Y:% UhY{?Mr5'0+,هeC*w|vz4I[9} f(SÚmbOW/2?{hR Д@$sÝN+_z+x |!6 x!?o'xyO?Dia&W_? |:d !x;:};wz|QZ`7^g~ /?K/jWaN@Eͧ>ӟ>=#M͈yjjaHQ2EUIm,~?{O/L9b$=xӏ}DҐ5vfU4=ot/<<+7>MN;CS3Wizӧ}}g}ZhXaW:>_}U:Ws6Ze]4So`w})=+WyґB9C.B` D0R,̡BqÝN_7O7]蕝`3,htn#V56Η^~կw?}GY< j lHq|HE_ Ɯ t`~_9=Ϝ~>yzQit%-̓D eXq=JK_Z_ƷN/?ӿW~w@JzCk8A3Q+oqr_=_{ηf?~Os6kɕM!H @?Sӏg5 WmQX·_3NO}s{p`grhjr27r:6kx_"=]م#͟3& ;1͟ߋN:zqwL_\Nǽߠ5u4fڅAUŗu+{ۙ{願لaYͶ!+@ @ o6~R;ZW4X8gu4zEv# F rЛhpοdH{?'z.6je>4u[c nJ1mZ}wiw}Qt.^#?Wj$U&kƮE}U do;zOU4=s ^{qyal+௾?Ϲq22|M5AN@FhgfQ$KN9ZpDxS͟77:Wuǎdi(Xc` C`5i$´WH4&vʭ DC4lm4y=F;ܽFu6) ,^ 0-c/;zOMq<05AXSWuhϑ9:e`Aj ŃYSd`ꏕ/Y, :?G9@n~`"P i'[tH]ĝ ֩oR6θ.0MMcnEpa;}:@x?m=uVo ӕ8pnqg]{^AC(zx~f,Wp) -ar6'xckxGI@Ϳ>E8߭~~#qab+i@qp%NU̓Mpl'Fb{bat[9IFݠpٌp󾊉4MMcO: m.MKwzӰLXF5]ed_kvU4,$Hpm/ fu>)lXf >< C]ʽ䕱6_uIgQSb-#U#9؍~EpX^&P"!c&VXy9Q|"sjUl4:* 4NW +pdyNTM5OWee3cbqWE$r#鞫>r XͶ¦D"ThCB4yYAiMAS>zxl_5ia좭0%y=(D|[͟(oV5,^)e5`%I%Xi ~G, *נmf'M6Ǜ tɞ 1;j,$H,y`M^Yå?Dk<-($8rx%р#)kl5ԝ"K%Xblk5iaQ#,Eg=xN( :+X6 z͔ M׌u f , )Mő:-xUsڨM1B)Dnx Oԁp١;E&Z!*v̂"v!iab-S!m3"$ KHG2]4O_swWsY〚~ۉ6Unj>_.$6 ev<,cVS,Kof?26,W-#DI ݞk%ls>ɣϨC/RxLHܛF!AisN@8F;˸ )HhI ~ K|;LfQqk+0V=x <ނi(Bj'zpa 1ep!dЌp~.T~Squv2(/.D6y -dLz8 X`1&40"^] Ix0r F0X , B~ E'٧DxlQ>)h  4^8F;˰)֜zmZ'*s9v;ueE'm3"Ne`e  rl3 ͚N0$:CsVT\1G*N&q,n>~ OX)]Czar`8x{ՙ@$HG/VX#9 ҙɣQI=S?68zs7D:uǐdN*>Ez6VbZ^K7*iD: ɐNfETx  e$X˱( 6Ws訋 șK'Xc Ovy yU7TS,%B3_Yi2Dž %Q86hL-ҩ2$:j Zk_;W:0~ߴ:&bhE M%V (zJL m8܌nG‚ą&jt;4%AT4F<ԡ 8_vQ:n wY. {ܥ~?\VSl%,;S(ImJh| ?BHF17NF#X+,yl79 LWo7ߞ-FXIos4.:owKĮ_ 5VX.R ]Y=-.V ,W$iDQZ Gc%;4VfD8ƹ)I4-`.`7;,(n\Hsr,Af?SYBvkDV0>ay(ImC}ͲwR23r F'CVXBlkv v~o&դl]nCkMZ&Vӭ8Ԓ N{fv]ܜ Ig47iEAi|S ]n@Kc8Tɤ#Ad }n0_6!Q0q?Fbf>[=, Kmԁu12=r(R 8HtӰQٜ<~vη\ ;ϳK',V^ZҢ9[PK&P4& ɐ f|*H{\(?t$ی|3p+ i>G]n wPrIXd?ao Oapjr7wC[f1$jRNAJRvƛP:CF>aN1[~D"$K -$~Y:[ F(c`ˢ$S-@ZTio5tg +G*Qf.Z2!CCB'pOr 1H+KwhX˱( w9< Pӯb;|訋 g7;,=gͿv?]0B-nf xIT@R:<1Jg'Za c;cB`g/ WA\4 $Vzۊ#evtFQ{(!*\E%,dHadHCkR+_ %7`7Q(uA٨L~vÂ*a1Q5a<j26%Fq=F)t񽢪4b]7Xޝ7[n./0Lc`Eln![(A ^ z0bXsmu֢DK80WI[.||[{`OxIypQ`n8Ԓ HadHC|jR+_ e$kCȠQY|(q@Me PN}MmڂJX=\SHdz9On/c{n fX(bp_Lkѻ3,$3ق5aSmYYb5Cv٣uZ Wza{/H#ƒPTp?c>6ɥdpQtPK&DiP0 i(85峵9W`O6 *\[Nȗ갊e @Q2C#un(9|,yz@qŃ,)c*m,Ab8]۩okP'IA$3قuu' .[%N!c=Zgp%H@GlaOOR36uFs"t{ 1]pOl(mG1xljĆҤ`!Pp CA|v h |]' ]@t|݀;}ߙ6&Z}Krriwv~p6K0˯<43k툐[>aN $ju:,!Ѻ-+kдH&5P1xvnCs4FD~-E(/dbCiP0 i(85C)V z%3!6Lq<DR&f ײ6# L,؀sj ?ƘnJdIrbNk+^D96KЅ{b!U݂SJ9#O6  9) `3B.{@QouȈ]iBʟ*A(s?Nwi[՘k@IDATN~f1C)j@idɐ]h6Y$)Uwa CȠQ\aVXg4ߠ4M>vj 'GǺ1МC_^<l>l؝ s @j]h{X 5*o[r-mH'hND(XMNs2v٣5Y+m pl$2bldRk͹Ï0[ =Y*4|eKC- ICC2΍EqHƜ଑r3"$Ϛu#O㺃#&Q/;n0&f$,4rfDTLv l-l'- XC 5s5[V`%F" G09 lš x X4gtPGο) cA>qMigV'g #?͟'yyBPK&64naX&|,=X,adsflZ y*LD)$S=|Hf$H-9͟gglf؝p3x;F\hqX |൨jN+0ڞamwWrT6Lq< DHF܌pQq9Lt OV^\,2Y. 8Nyoa/9 3g6#MD$zz.`7t=jnW}kNkaDY{+*9vfp昪՟p }۟8};x?K\Hؐ&'VE'͟g?& Gޕ6c=rz΢xU6o=GZyHاƇp3Ϳm-Jg=`(-CiP0 i(85C,bcaw汼2K]adǣ@4wRT*>g6#MD%wOI} ?NsG?~z≭oRi_flO$A?;ߟ0*A'0 '>R\Dn`[n=jN(w ~z@WhsE}O|&]k+LICC2Rbk r~;2KwN GQ B EO>~ Sf),{WW#O;mJWO?yh_[5M>rꏥ#n\o+a>b=9I?~G=q1+렙}ɏ}&l|Jٜs|#eR9&8yKӝ#gYǫk}/7shn[3vο[=ӿϽp P3k6P%O?=/=BBR#V)U1nO<؏|#p R],hN|·OF*9p>"b`5ߌ)}ZCf0>{SB85ˇu z_f;GZҐАa*xlzsxuW_ "п;</>ܻ%@Z4 8Pp jXpJߙ֗hӽz5\7A(/I(Z*>g6#De|DM_>LDDգEFX唋72:?NJyzWO_ڷȞ@Dhkxozl ˚@2׈c7Oov KvO '-4'z6Tx+>b 1B5yoBYDv^w"X_!Qx'b0!&W^;zk.6igу_p9;xC 3ZR{ g>w[x7|Pɐq 7sCo?Y2c5]z lxd4/#X+X[5^M6\㻟x1V{ɐ/8Xİ$7ɔ`qWq)X?l$RCl}c%bNEHd4EDԄ3]Lw%S(86zz*I]2}i/6+80ڝ$&܍N $4` )pGZHm i?8Ge3t{bc5?"ULZۨ p5Y*wV8唌ְ !Z^쉣I끽i{L9Gu2}^dHȵ,6DŽj<x|3FM; :Xh.- PhR:+` /cgY"Ant¤}{O&7RU2 ,$".GײeZ{%|OkMpƭ}B+!85^ߧOVK= 5N4\]cLqLƶ(0J1p #Dh8*ls ȋ7;O6,#Ase;Ș(D.k*fMll]qNV 7d& X*JFkXHd!W.B:F*?բA'+jocTwDlKC|W\c~(k i(aI1( o)s{"MXGIXC m2:0wwp"BjSUHk-9?V0ڬr0(&lpcMVk'87qdu0_1͎oRa;)dL+Xh>l7 H0v"mjz>9sq$֤uG |WBVjz)~ [`ҋCpa< pmd `3GZHm i=oq 4c7VaB݄z@äq`GzլjcNLtOlZXZVV}o4,>N>ίlԅda )B?jyBDEPH#QS B,. &8vRS|32:N"rA N ƒI%Ι9SJ y[AY҇%b D-rf8`i s .Vzז9U3m}K +4(\5ˋ7ٲb!#K3*`X4c-pLؑ GZtnq&Ml:( ;rrdg>5C* ad%vtCϰ^X:+*LTmWsTҌí ,Nձ ЈRƑ=o_F"L|컀3g82>6EDv{Ή򧒂ӱA\pR:O Yv=T~_KCøV*33M%#hRXy K=S!K3B4X1l¡!+y_T|] p͑obF Dv{Mъ5QmYpN6#/#fl eOCIQΣ],U H;>k /-\0z9c%(BY KebͶ+qmt<4,>Nu3 ph"bHf"pV8 _ŵYkxNъQn:'[GbMW~R  '3  ئ%ktC濹Jh. $4 ,YTҌ~q[w8K 1$p(YҍC[u IpSeb5#/Z`Xr_DhdaMڟ)~/1M\=Np.Upn8*Y-S,Trx@)<[5 j'J f+{Tg_dի`+Μw|VAw^`NzvA=k[gq/X t; qg>ts^=P -V5= @χ+;5X`C; wSͿٺh^FtڕK 8FYVt4!He]IwM +jj*1gfR^r҅a|N<-,] beFP5۽ rɻ< DHM%]@aU 4 4zI{4I"iM K[,MGU׌90ѝ. Э6KqG:̰Qb $DE' ~%>3 n^1h[ )`k+(.@[l]*BN p2 f+s406CE n\ش͉@p#s5x2k8sx毾z`U=vy#5iTc{Fch"R}ZS`Knh221wJϚ[]+ 6gY83P o&ܛ %-~4 Y w8phR&p(YٍC[u ͍ 9q\Lъ5QgL9͟R$ SX{0p= ( mڣO5SyZS`KnpQJ2'D?՛XƷi 淴$=j!G'*,| ARpV8_pƅMXMݜ72g1_:K*)Z",y8-p8w[J2:WۗQȕ@#4 2KƗT 䠽柢icQz1\S_`0_k;z!6 lOD>CްU3lpxQj^o濶hyo 4V׉S7b>ӱ@<Ϧڞʳ+|Ta>G/s4n`F}10zKkAl67*}Qx4LhRahR(s}J+nA{?dZ7X, \a*?5 *35 Fj_zӹ c^8;/2 py$R,UPY} 4#i+eҴ$-.}dǭBx4 ws|ӁZwN؞f5$xBq4.nc+`| Y#m>aUD5u|-^-Mg g  ޗP~'n6՜pd= 5],,],_j;oVN_v O=9&6lE,mٍ|* @ xy- ;.Bc.r3(<̇saAZ,F8`| 4av[LT_76ɢOpQ$qZ:}Yd#LΰEU ;%Jp_6;m5'@+,Y;ȃ3 |vu4ݼI[9p솺=\w"qivZ{#V#LEJsqZ;aO}̇sa/-`E4`|4a$v[LT_76ɢO]@M&PUrGls fև2 eQսGEU{2#@#=i<7xM/Lpd%.0+X"dv8F" I+ l˅]mWDVMnXѬ8xiٞ˄:F;/KyJ9Pia7IS>E*k|nj9"diE!ac$3ëbyЛ?k*,Q*TOՔLpQ1P],A- xGJxTvI%ZiCN.ͷ6L0ƳTϱ+XjCo};Jm ʶ޻c55g?Y *oH79x$(.s[`Rl K@XcKImQT\.XŒ-lZ0|{e/Ka v4)O35[zh7,PdO%Ÿ9s;6a5]\Kk2ۅ&XU #by]w=MJYѐ5u31BD'CVXBD5; 9*V+ƮVkc=V>*`9OVMciE2֫p)QApIz(>OIXC G-ۄ$I (HEp p <$z'_"h8`\w0D9gd Z}Vevy9t4ENފͿ[b~b\d_GoKۧ[b`k [?OA'h/x!YeTTIw&`i%^GZn*n~olc-:qShHo@I Qkd(L0mA>(_ &V13 kӖ6ul1XSHi̴;ˡauKx(fCwĊU=>K_{9΢\ ]=Zs,hR2tb& >^2@ ~=Api*87/̿YfW=gXA-X%`mW= Şķ;=l{pa2ۈ>,5 C6apGka'GUmD0_x,75E:6]G̝#e22| 1ɶi +EIjrt *X+XJxZ%ůEgQ F:a Ecgt|p4԰J*4z N4x[TOw -1;Rw~m([gEfNxL6(Z8l~vum=6VzoCtl<$R R%k\gJJQl6zK,eTђO&墳DKWZslG.witg|:|5, B\/טp8GK 4u :yA*UJ(>h)㼅+}s/@4 5#T&99n-ً=Q)Bni%9r.ye 2V50 EZ}rtYF蘖I:f%t"U< !.'nH*27\45, x%^!rNJWKU: mi!osw%%iM1y+tbCc`{g֭\7Vzҩs{Å0-J죾Za^hEW-\Xs+ݘEZ}]%$)d<ֱ:z&i"jIa-$aq 8Y"`'9>ˡayK8xJD'V.ܹWڱ\tZj9ךcE3pb8>5, x%#^! rNJW̎%B| XaF7uɔ:e1?w'$?vӁ6ƹs|BoNhohx$Q eoSnojmUCiqqQ`mmdAt=Q⍠.v{a,X)bpq.. M}FN5aь<-$2@ vBwyA#0RwMD$1nO|%._R<,Sցo3:>έ\Bo;~|eo0jٔ2QF"r\KYNke5y?U=Wd2܀, 5dcb*O!Bp ho}F7a@X4,=͍OeAv\'$-"I!6YbPݞAr6uɔ:e1x-䏳>n}y&@ g6O f$je5k%4^_gN%&q;3gG@cfY, 7 -x=`YX +wHP%\vkaM#,8K`fsdGdqeΦBF 0uOx%P]2%-Wb]0ZGX lO4`67>AvjXJN%_/bu #uQgǢ$!6YA}&xjYk 纋 w~ {l2֔hg:jjEaq?h”Ub=+Ut#zKפZjJP:q7;5, x%#̕9lpPԁ}ɜ#PBO; -G #ȳnv'lyM6tw@В%DU)wVLLc4Ƶ䯩)hϲ$Ie{ڵX=x dqk˟)P8/sdJi!%HVWޒ3+Sn7ɑi1|݌pJ׾F(F"r\/3 Me5{Y'X*tmD2UL*K;fp(an丛 PÂ߀W8BKohd@/AW(s"m_{M^F$Եj<8i7z}>?8 KQ\eħvA.ڬ Ҳ0ͬx,oFD[ɽ?W,-oL jnbn丛\45, x%#^! n[DS'Pjkv[r?? ;B/z W ~{z|%cz<|:xy .ÿ<]@|i6utQ9V{9v 2~5JFtPɵ?*CX❬o*,vagݗ EW#H'UךchY|Gx^-n""( cŐB؉Y^_,Bձ&,8\lVpԂFJY$XƵY%MVrXIT%x8A_R<,z/뀭؞15a5d)2 ;hSM@I?7w /ڌ%z׷-/[3N'X><y o{ǯ4ߊͼ;~{A(a6a+eFw(~c99dPUKQN ÆS%nLl &`Z(ʌYiJyeSE3,-,*?EBV+V gg O=s抎ƪkͱ@X4,`~ > PndqplshpAEoɟ=f;H.TKgYoc@pࣇp&_-'dʕNGse Ct!Ud0h^ioJ+V g O}lN+ƪkͱ@X4,`~ > PBdqQvREa~K3P51Ò-DX3g/t_C)a68O>7;←{ϯ oQ^g:vM&]3ڮAOiRE¬O`J;bpj}$'FX(:a E3_Qk(Ə;$jU-ޔ̙"Ȁ`6[{,tu{6zГtm+Egtm3e|w?~]o^W(JjBh$b |aIFƷc/k5Jׅb|shH-,-,zZN-LĊUř;Y“C<뜹c]Q0ZEW3\Kk70ud>KKDK#V&YO=L_lc2coTm}a 8o}w?7uo  8v?1F?>_oh>rUSt36m'l?(bB`CW'Bʳ2L|v,%o.-Z`0v?%q#Ш#O^[j[3yOǴUE!IR: ۓ{O={} {ջֺEe/yґυ_u[G~mp%pƹ\gCەj)=Kd?鍉Y:nPZu*g%+0aEpq9>$fɱ\tB3a`?D =-Х>tv7&}ɳ3lSN ~Lf_H۷{ +n}*^Td'kr9w!Ce>GԻNd@sYy&LόIb822͉k8Q9/@aN|Ӝ&&NaebXpBtA|; 5b)ԟ\n)eр X|υKWBǧ^<#涥{=8[??*6NS)h 4['>j^ys6M@S);B-~~C}徵 C]%h 4MR#זT vB%h 4MNR`nC|>X](۫)h 4My廗 c ` zW'ɾ [{S)h 4VC>5#@gmKٚM@S)U ;ZtMA냟i7<=`GIc;7M@S) <]_ݬ-y ACwnm}Fw+|Aڹ)h 4M x?Nsw,aK1n_]5c/NIDATx3xM@S)V`rr`>@},l6%+ՇPIENDB`ic12PNG  IHDR@@iq AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$ IDATx[k]UγNہ1NT@D` 1&b 5 Zňh|PjNLg:{g3q:Ns~Z{s=eY gYuo*=ӡ=ZԾ'pUdJwBuY°xB1Ӭ#fFބKD5ce叝'BZ%.jmsxׯa;WJf,Ea4sƄxmIN@*B"5M>P\Atca'ބë{g~Ӏ(֯ vZMW70f0Z)Xn \+ʂw<PAȵOK/Jpd_dϫ'4ZL:XŮ1q TB/*.C"f{I-;ڦhYEp #: 8mÊaCĢ S<|_ĭ*½(YTq~SϵqETO K@v>Rj%<V;x+^ )xQ2x1< 4? OLL#6h}V@r]G^",DȼҰϗˆ9<|j7ɛq <6."x*Rj7;6 klJL|zpSԦ(ۊGq[FO?s0!YŘ=ES#@8IϳpeڡCwn1Cݲ];GPu Lc xUQLb8\e/oI(:MX؋ @'x%n4E>r4 ET3'duK6@M ՜=$Yg+L?1=M2%\rDʍŸ m˚|5#Ɔ-à t o+;{D#*" 46%@DO+<='x(u@Iz|?n@~┰'$2`0R\S9@P6$aYYUxX: '!UTC=ONkݣVsIy9x!>[HzsqjƾE\7Ӡeخu$x?kR.8 {L|.lb:*ك>6ebz{ZW'4%݂^^R麻&'RN+Ҋ]R(pnUlS-Op7 ԰p"<;߽!ya|}ã9:1)B\Hw1 BCwvUMC&;7-G?/>zx[%r(Y`R!6&Unܮ} Ya AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  !\IDATx]kgU~[ۙL7R(-ShAhU* -Iȟ& hH"ALCbHH4@H[+zަӹ9>ϳz/߾3{9w|ֻzosN/Uc߾}s=vmܭ)-STS}ma]d WWΥ\H=1hzik'ܻ??x_yk4 BMv}[ LJwmOW]qQ:mi&,B6nHI:fz[yCԲ`dzrJAs!"_Qy t#޽{=]^ >-7\*,2G#<s6s^I"/aToAflRGxۥǣ𽸘hu|{جъ„¥ɤxԈY2y>+0s7\BhO#u#,cgߺ&I?\x'%{{U >)EC*^<d/ >]K+}(S&*KNon.ӞW>ɻKKms8筟ۿ3~gЍ'h@*iFawE|YpL'Qx(CM!@&(/SH}+ T5;;B0!"ajkGPsc6q={.? `.tEǕY[LOr(dGآK i fGoVA*`\1=,p}bzˠrț{ \#4LOn({.L]z"6ux0% aGq:sjD)D [eŋ&6@vnMY> ^a:Ua|3DǡiMsm9m e4 !Y-0̋hxvA.<]>$K<0.8ttU3k2py_Y >yE!<'|Z*S\ۼͤ4JGŚ|6p8ƺ)53_M~WM).|{۹ḭ9[ҁv 6/ sO͉eutj}ˮ3G MC#W άpr̯mFu9:m/0"J]bKwlD%/]mm}xAڋW_y>}C.سxNٓh,1`Ls)H-Զm9>W_8?#Ye&lf)m۶%]wힴmaӺbTih9|&}WCnټ9}o':L٪i/$'ҟN'UbWN>j#UXs hЀրǾX"uĉdр& ܓO t 'Y~ u^ RMPJ< )biyѸV g˪1jm0[VrJ{7R<PGO ίw0|wR֣Wd}vp21Snn.X^$6Jm;+JDZ9m>9|WSJZǯ|i] V׆O/|&~0+ڢ-Oܞ \CŰ*g1|ڌ1ѩˋ@9݀1!Ims 0 u|Fvj˂'o;] |8)o?cRNw~1=(~gxcY\8Vv a~FJڲ9n՗_Ə:&Zh +K[d?frz Ɍ_ې)'mMFtDi"ЪŚL >m6 :Ӑw(Nҩ;iN޿!8 _E_4)Z H[U|1g֩wVq]3TniC ܚ18V.IVʴ _M2 %Ģ`'G϶i)ql>R3 F[;$5x"ϊ(;QC}z*UaWUj _EIi+xglX,;L0Lȏo9H䀶/^4iΌ[?<6wa NV"Yɪ wX_@j?Fn ~7PP{>\_q0Ʈ|i 4k±]e_z<!5 @ە::fVC>t5ۮ x$gi]0t| )ȣ"-*MAd|g>K~֌3"WXjg[RvEÏ_FtEW?q{{D,X8Zx>yh߱Q> T,SXpȷI:?x+zPU>u[KʢBGg69L>ckY+аYhe$QOs$rϧ(!|\Zr^eG{HQ_Ϲ@MDQu'cVLXrc#|r<+ݜ-FGy35lOjڒc.3%sAm+R:,YoC ǂOmyEd~hpt^ɠi\&[(h`̶WN*&Wқ2uṾ?"߱8c}6dsl3}[0ӻmW{vNO^Ua D”noFg K!DžH2_qжos"Tqԗhڙ^(xR[֚'>zgG`}'GuaR#Z>Ti"kDNT۝X\~bfh oZ}6 0~^XkmiIVpU䕜(Vm&mpnĶ$?6NG nܗ}s h>/_@ʀg۸^+X)[m _?1QV6bЕۓM5 @mou>_zLzel%xI9o<-'8M~=x>CگZ hÉ &NJZSs"}efrU_4@"iKn)6L1q+?im ӚCͶ8a6%?Tm;R Čr"jɩm!]!hHwf3agʵ(ە6 ]jvY2k%;ˎ\66 `xGPOXLΌCPxLљX*L[FQIŬrh@sRE~~XY&I E8kGZ+&Ak4RjQiX4Ȩ{p]X8iI{,Ϩy^w 5*/26[ץiͮ&xs%ʗhVS\T5*ULӞhsݕi%e1Y ZXҟ;bˉdNR)hn?i?o > k} Y^ܶ}PeLȱr(aߔ1&g;|CcV4g>*HYT(/1T )L* %nG:f!~?hV8~|>_j5{ɼ*X7t4 qY"Qm?kkkam1mYWqZMM[D $%O~MkBlY(laGeP4YdS!3|;Ra-^N >bd\VW0z_]Ph|@7^iP2' ߵ묩IJZfB],Tj1zS]zMWC|J ADb:^qsnc|N>y;O9xv҇ nvbO *5+i1`lC([rF%DaiSڽ,L}>拄\i0gMٝLqKqc೒jx2醂y|Lх[nNSNdS__E4h&ȻÓi0BZxh_g4@~Q"= dG&##^d.g'߭IY4;?hF@p6R<8lo>u9b #Z},eo/4Tc/RxhY*-:HFEyX` \,sI{ބd9ɖuV>sт>kˊH|l}fR <cbt/kHLHKÊRŀhuk:OBnkS\W reyA/Rx־j0UpԷe@Irih#.p]\:< }I4 -KOQ5ySTS)4<)h6 N}ǐdG Sf"k̓Čt14oZ?P˵\S6\[6b 9cm)V8PC2ss?fv ;=-Ϸp F%["t1Kr$=Pe($\!+r~Pai(8- |+Y>o>O%D ?]JSC3K/>'s^zhHV5'qWtdS/`zQpP*蔶O޼7ٚ%8ݕ / b:hH5/|k%r&E>w =n۶9GҶ3J/;l/xpzŃ9aoݲ9]tj=#(:  Z xnqRO{Ɓm[\෿B.?roV"<?w"w8ϭoS]i_z =c9G͇{o P- >d6 MӢ&FuinSzuWL֨Q'~?{!Lnْٽ]<ۭAQ H Ii6˫G.rO%Riv3S8z>;|H߰l)͢Lڼ!as$`RO:\ #,lDp&t< ^qb//Iox1!"4QY$ 6A y.X8gE/(dPq_Uʞ=~凯Rt Bg@tqH}tHn8=4Ld) LLr:6IԱQ1sɀ5 2fKqS2K6&MriWhifL͏, &:7׀( ڄ}[٤B\Bt90j@K;VuQH,p7CHwޘKxɰLơm:$$=m?Bn3ڎ|65e@d(X8][@1w~Yb A' <_XleBʂJKSlF9j_lXAv8. :δۆƫ ey%f_持pƂ5M]3.9(IgZq[L\C["%%ZlʼS;y2fvyslvg\h ˀ =y-<7]$#P%~(NJg "cJxY#Av'q8|dW֢F@L茌BD~"Ҋ:* 0L_e5M^ГohƳd;U%ib˴s7615$_%. jV$$"Eۮq(1t}GTjD(B +sѓXKs• X+وi9aGqw8`,A<q+UՑ]dB[ ʧ,E _3ȴ0do ;$I[Oߌ~"']"i J4",pC;/*6 8锿2<} x-١SN}h4^t%>z=|G*Pyp QȾǮtqc8lh(?~ӵ)%TtCPSC|Ո|jWo=Ŀ%l"~ ItKxН5]ƻr2*dwC|K.mpsKmG.p]V3Y\hUfBQ<f>#'ag6oȦF_.qr9ĵIѦ ̓*!:y^l5W &Gѳ܍/\3CmBqM| eY9cs~B- ϐP9* ]CY೦ u>SCm``E]KN]է6;SlpҌl-L+#3JHwex鋗RZK+sffV 1+z^B8Qxad6q3eU \6UA?y]*sTk5n U'}|dW-$ 47d$V$(v/\nU@a":;Q5+!$a [U$o[et! 5N+[1߷|u~ L|~%\(˾k#4OW'xUȸǢ۰\Ql$t >iCՀf(ΒW~e*lL |WzUr!jEJH:eKG1y lA\tFvXq>{e>{,0}pUyЦs iJX|mY?]orzB+av"= ~H?.= |vWt 9-wQ)G/2>4%ڗ2BAocf÷-W}8}籧CM;z훻{;ޑްt٥m[ cláCcӶfn:໙~R4 AT 7M]q޷rmִ< \5#:R+Ҋ2QVbv+Ux@.NRk)il<УOڏ΅ν{y-Һ7?tFfbVM;?o?q#N1vқ3M5=wρٲ_i~HXĴ`;DV)/YHIENDB`il32 TTadcba]ToѧTndthskihgecbbcbcbhs픁17G1uhs퓁18I1P I1uhs뒁17I1 1vgrꒁ18I1 1ugr鑁17I1 1vgr琁19I1 1ugr搁14A>1Hx 1wgq又1 1vfq䏈1 1vfq㎈1 [1vfqᎈ11ufpፁ16EN<1x D1tfpߌ1 9G1 1vfpތ19E1 1uep݋19F1 s1ueoۋ18F1ueoۨHIIHIiGFEDeoeoeoƭʽxfwɽhcÙenֵuuXJXǰSJ^~nudnԶzzUTTƳQRburdnͻɹįdmdk)aTTTUnqponmlkjgTTbbnqqponjbuծbzptwvttsnooppoopop ootBGVBtBHXB^ XBt횁BGWB Bt~뚁BHWB Bt~뙁BHWB Bs~ꘁBIWB Bs~蘁BEPQNBW Bs}藈B Bs}嗈B Bs}喈B iBs}䖈BBs|㕁B GV]]\LB넃 SBs|━B IVB Br|BIUB Br|BIVB Br{ߓBIUBr{ݰVXtWVUSq{q{q{ʴÔЃsuqȡqzڼijeYe˶bXlƈ{qzؼŴdcc˹`boŊ~qzͿȵŽpypw'nbbbcz|{zyxwvtbbŎ$ߛڞ쯀ޛw{솋wޛw|w wܛw{wɇ wܛw|wɇ wۚw|w wښw}膆w wښwyw wٚwȄ wٚwɇ wך초w wך쳈ww֚벁w {~w w՚鲁w {w wՙ鲁w{wɇ wԙ鱁w{w wԙ豁w{wҙƀߛҙљЙ԰ަӛ׻нЙȤݑʎ֩ɷYЙȦ܏̍իʷΙΘԀҀ͘ԀҀ͗ԀҀ;l8mkXXXXic11PNG  IHDR szz AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$IDATX W_h[e?&i4ifmZun8WNaPDQ8'8EIP} "(q۔NP2k6Mw{o4mׇ59Ο9j=kH<6H G?^8Za2 %037 A<}{s'HGJ%< +%h4\*b 9TQK@ :'|cݾ>ܼ*ijF@TDw#s/ ` jj]翟 wδc3# ?{Dò\80=G-]nYa~??#/ Tj@8p1L^|[-eFum>=3!t |N;GzN}SH5T5S[ӆf14M6L/Z.-Xi5ޘj2C@yA;]uB aZ-DpB\VLjʔ Xt 9-ҶI,nK9f4\ /ݴ^SLngy܊B{Ԟsثl# qLtZdXWpn]a[ɹi`+;WH#yf{=N|NmIG{Lg/l!ڒ?d%H x|iuWMzȎn }c<*ɦ֡2b:v{G'29Ω 4?g$lvF35+XzJ hL%d  J~vΊR(ihJ4M4/螡xBAnDv4FeTSԍD$2|&ifuP-[ (XDcQ;M'. '؊ND q~hm]E8`iꍨ~a@%u0}@'@ 0 n_d8cfrpL" !3>t-\g%ss`*7ϹiLRv7'̩k̺eu y_Xfs 9yE/M.d* Rh_IcIAϰ3u?XT#73u&FL"eF*"qm /NIENDB`is321gcОΟ1ބ1˞111ɝ111Ǜ1ׁ11Ś11™ރ11ۃ11ـ111׀111Ԁ1Ʉ11e`1tpԦҧBBϦBBBͥBBBˤBځBBʣBBȡBBŠ߃BBğ݀BBBڀBBB؀B̈́B1qm1޿wwܿwww۾wwwڽwwwټww׻wwջwwԹwwwҹwwwѸwۄw1зζʹs8mkic14 !PNG  IHDRx AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATxyU}!Hf& IH !a&@E&>EĆ(FljC[@J).6HWS   H I17k{?y|:g~k{X{] {z=Ի'CW\]_ps1Ofd Hdxp{5}pWWrug}?߱]2~y#w .gd Hd1(\ ~~o_wrS_M}}WgAbw\Id Hecw^\ Vo[o+>z} $@2 $2zۿ7S 7֭[H)$@2 $AG?~Ӧo|_۠oYⓁd Hd` | _}D^|w?-+7 @2 $@2_Hd HxΠ<볮o%>g;Hd HΎ?3<|w|e(+O}g=)={۷ U_AS[8VyI*Y8sH 8*d0J*t E ^L.IksĀǎ2M ̘L&EgaN |ZVcXny !UtqT̸XڄTHԛz4 *UcwQx玮\pUSn /9/'"jz ϞC[=g81oѫ&:maMf8kxpG;Gzxx;w}! _鉏 w"M}:{x xG|}?1tAzrl >nsԋGp ^)L젍9OTQp*`frRM*H^լMbƟhpU,3qg@ӼB:Áq\to=7lQϗ^)x*>h8jN0RfJ*NHUֱáڴvq69w9uM~8#PU8kT2l:#ǜ¸KVBOhHqjpP<̀ \c*8'Ra\rUx"q~8ڛ~g_~g/_^/W(7Tv|>S?rxǿpx Otgp'E*4}JY佩LtncAQV{0TR8qTgRVMFG8&pw1O Agէ͙dɀ 'Vf L8.wnp(J8OmGr4Y,Q WUЉqY Eic:kC8d+5MNCޢյX=,71,OT8p'"7)?JYu,.,o+CQ6*p%n%8sp^M<DkNAjmi=6+ k(4@R 38 7zx L(Ng]l6.Y+鬡:^=vrûǜE3(A,ѨVT:WSI~LCe m1X>}3 o-IMYv1 K ?ï˿ܷl<|u}gzCwڿpyyf[ΆSITi,a"Y0=c8̱wxzxV9$1رvZȄ|.W`*@Y{$i-:lXg؜u2 xYtP+8atTM(یor.% J*?>ֻzW:7t&|*7Y8Ie- H ?x=>U.!{|1 0Y~kD%g$+ӹHi#!_/_җ  ~k /jY`aſO/8JX6.+ xLx**TeS=c#q73¡8OqLNǃBd @&s  ^c睚AAAI'κ:$Ry{b{|8Ci ml UEN$iKy=:ŏI/=I~%Q͋FX k/? ׃OuO`[L?YASSϜlgn&46NTR;))URqդBPq-UY*p \~j~Lk:AmiK]PE[EKlA Uƙ}>NM 5JN: 8tMu.}欋|JAUC*6W\U3vTODI(5%\xƧPa}Ь'Kp*8˧rP#8pXY| 5JEfqcwyzƮ+/QYU%߭`aKC%V&* yq73¡8Oq_TtaNB Kp_?_'ƂWI >h8r{LT(ac-P {7q`AIN= 6.Rq ,]^Umbx+g T»3\MEjua|g \ ̀ \a AgTntg-`(Q~_?珿Be9^pU'/The*,DNl{0-Nyi/,U2 TI{8F0O¡WaۅV=TŖh-CDKlEg '1L!N: JrlTnXXH/u=E* E8y>*8u5>ճ&1=N3DP5 b|8g\n^MpXY|ŘЋ=sZDǿu~C7u?;A|_\T`= CB[*mqbI0J*&"Z|p(N 8] ֒Ba2I-%bhhL$fi#DI'AI Yml{T /gIWLe(sVJr5r!񩞕o5`Y( ,+Fqᰄ Vk o(%/Bua·fvF8'Rx6Nc!KpԻg5jх=4>h8 1uR[_*tpR 384֤Mk01D'n*Nх8K,hS]RNLe1gU'& Ƨ..z;`s b|8QFvXY| .XQtO~Yxx⏾\aIMr9]ĖcdoҎ z5 ,3c#默gvF8'Rx6Nc[mb^M:ѣGF@@mGU'JUB*50C3^'|<;JT2D4`76{,Rʭ,K4\ˉ4#8&pKp8|*7 `xeBEeB Vk,3"Vp?bo;" ӽQ_fCY leՠR_X4SQrP2B*hrEQuZD-85P,*U0CsBQd~ M:0N!,@6[Aq xg{<.@cŪT%\leHaY#2NsDU(39šUPk,LӎOUȈ-s#gIx47}ދUOcvSVGKl hٔşYSU>Ia?Cq"%Sxkp NjE=4>h8߇W' (A*tpR 384'BQd !. ;`'-mMC g8Z, 5J:7)wEpl0lrSf RĖMY UY lU'd`" iQHMW&q3:m*8+Ε,@6^Bq?ƷşǵUaTe ׯx5+Ƞf̏FD{őΜ‡#œ'Ӌ:PP[0f=WHA%k:(1JXE6MM*r+*ˡUD|,. / 4dqE!⻀\Zc9HkA =4g+VqKMUq-%eS~gVT'Y4iT'`bܛ0Yx?!' T&DfxbNW%GJ0.=lH.|,DG4~޺h*0rP2B*0NS C- % (%x 5Nc ,QeP^'tG%O\i+D-pP Ԭ Y ID" ?Th0N!mMC g8Z, 5J:QڦK<1֪ H:4|nլ9ZbKE˦Ϭ*T&sYFnl/tFBT(b TPaG8 ſIT(2HK/4 Y*oyw=KMUhpѲ)?ҧj/_RAfƞY EUx!oU3sUP2-CR|IQ!QFTc]d\u#gtXCP`iU#] g5J$⓿D;ܫ;SGGKl|,J,hӨ^4 kuGqD#|F?FK!*[l ^BL( Uw(Ui/̻qD$q?ZsVp-k.Z\ˉ7TBO3!TpO ?yn=ԫY&?=NJ+Z6eg TeoV?WNiԆ ]f'd,!>V$bkϺ)8]yE%E߹o_uzB7/Q:ݒ @oʂWoV9ԬI 4FO(f9\  #3tp-a,RHNl0h$83%jsBYK[Q#wYj&NxCV8-%c 9YMC@9Y$Y|6yNAWYl\ypSV9fhtY߆#WmUeP ,lUY#̕Tؒ)GԋG#k:(;8?kiQ`GJ]ˉXl}3q2\i5{a"@˧rsPqxQHѾ&Y0c#!z8(ƥ8HMF&&J93ſYbr-.htGzzo[85ŊjAf)Zbˇ8o9p4#U9vşI|r.Öu=Wܜ)3$CéG1.ũ–whTh_MhM|լBxr"έanJ&\oKpQ?t=@n85ŊjAf)Zbˇ8o9p4#U9vs_=l43X 0(YM21ŜǁW'}5#lqpfBmFR7UsR.70adjq: X>5"p-?.!USLQD,e~E8U+`xf5TcΜL(pF'_2I~9kl XpLbG \ [ S!_`qF' .%huy20ڻ MYeHJ^jV!R:rEPiqGb;'pdb /x}MhK1,OY95 BjR ՠjLĖaW _I߯4(şQT ~ʠf'pX_{6PT{Fg3Yu]^H,@BōoRd7nD*:,4۸Q<ŹfuKpkXdpVq`+/OYeH^G򩁗U`LY=(M{6YMqI` ژ?z5L*Ls84BɀUak?ECмyex^LG㩒-Sðtba-qsb$DKqX?Oo&;OS%R*D^|*!,j[vN"6oڧrΨY 7~נIA'jh’LE*:[cJ Gq3:Q6I͛Yi+6.mI8 nKӰmp'Q'`.G)h4F-4DjFEi^TdP S*f"s,&?Aw,NEnLsӿȄ SqD!F9 t 886%j1gd#ē|Rl\aEfvG`L(;gSTl{,Z]ˉBgtee|j]eKhLdl]lEC @$=l.3vc䜋?b'0sh-*UHTԽbEE5f\G f"wF1aQ cqG&8?(wez4E&tiǞnSX(gs0ũрVf*jAI(gVƬ&qĠ8O!i|Rk p|hl aDT&hu-'囡 3>ŕ0&p,XrcUHP {]lҙhí+L@pqKc #$^TdU LX&f~b @ű'lJ(qYM̂%x]n4Z~ZLe{lnj,46; dGq3:3tMǢյx~(eh9CCHy.vPP 5)+-[_+5&B~P3܀iluQſ]L3!,O(`(5b&7ӞŹXaL,NNq ݩAR0I8gy'e!9.J#(3:Q0IMǢյgt"Ƨ?Qҋy^;X;Pbvz4)+-;⏋bk ?- ] *LKR*I*D.b:ゑ2TJ+JByɿ$2)YMYq$;հc,E81 XcLeRA3@ʖuJ< jR_(zCNVQ7'[/6IMhD }GZjT@kF-CsŘj.BM2Y#z+rpp8vic.`ׯX& 9ŹXa!B#");ݑ gHA5LM9*Nִ*/v ?ի"hkq`® 4-`-qr -I]−>Y+ 4 h 8( mxƻC>8&x%}YMb[Pd!-RnpdGqSGhu-'\}iTkk.H;+0${l`)Fټ(8I"rC1]M@bpgU{pCwr.[0DR"ԋJIKM*Ĝ`R K0(|9FÅ46Y7*TREPls0i`d86ޅ΢xctPX$Y iQN'@&x+h5=D<|F6TM:P5k Ga~HLʧ}~@cju&us) \n[uŒ/¢qjVsY"385^Tj֤.uSA*Xf(f"7G1aQ lS^Q)MSJ+`ٜ Y6Pn&3hBP[uwf5#E9BZT5;ы`&U6.b`M1C_i+.))y#k'T{bvz4ηF#nu.wQKa vB巗z^Tj5mMԬ$pjV!0bٶw8֯43wtV;RR(!YFڦG5^TjzpN*H^I*DWLH?:XiA[j'T8 ig`-Bܤ0L4΂5Wḋq1]eȧ۳&lPT Z#8QƋ kMdAl:s.% q zPFi`9=Ũ=Tvi An2 _bp(GBpX" W1x81jW*KZ.ѐ9b$@耔[ /oOn|ѻ{|ho[|=a~wB~Ɏ7C3Oe/>o@7׿MÃ5q׭۷; Z c{ߞl?1ek({;6{ sn<;kɝ۷{KtLxiAQzג sϥc,{s6| 7܆Ӽ4a rfV8S8$:Hgw#g.i gz׃ ?S4|+_<wHA n@7~l ^www#yAf?lzI5S#!vşwU1UҬ$!<4=<fיؽyma܀~Wo=jd ؈O`;*D~o<4I?E?9گ~M<P};، $eOo>i!gVq [] -PZ4bmӉQo ,B 8_ +APKtǩ/[OJ@2p \_~G~ҧ=!xGО}Zv=7Gy(&fM^Ύ_qv;ǜ \,>q€x2ǐplB=841{{'Z{|:A9S2 읁wᑩ_Rvſ_;/Ċ(]@q-<5@2p 4{]Ɓ_D_?5XuQďӮQy6&Vx fQvT"DڸT$d c/Pbg2 ;xM~9drȇ8boRpwu2d2p\_dGfC>'Q]EW%q_U&L3w{δzjh+Q"8 =r 3_Ju_Lp:JN3W 6/ay)Rm z2p) S Fef 3:OtY [A/4҈|O.=P{qdzȍt+/ڈ؛ @}i .v8;O8k*}F*d#+ߒKa@z$Kb:бҖ[Jd@nX4"JA5!7-)& RA$50Mਨ >@2p ȞVҏS5T .!Z켜QhSMc4Κ!<{o*דA4%7Ԅ9`Y1>WM܎Bf3H.[q*( eZuj's혁X{7~j}PJ3RJΟL~8ϻ㐶( l^9Dm 5pS?)Қd tWK?Ѡl @[ T}2+')dMPgEKSaKb3V2 7-tX)d` ]#B]MXz8G%OgrXznud^'MUyT} -|dc "ԗFДPD Qe Gq*tpR 3O0 YBm%À~) C5tP gv &u>MU*&pc\zſ=8dc `! SASDM8K4?槇%R2 ;zYIULc.jF;PzſJ;`eS`vcx#{p}Zz eG~18uy{I0QI2?m IϓLB auBT(㊭Ϊӯ͔Ṷ/>9O#dx[:}/w&[crPGIsCR\c~( l상2W턡|}d*!̞'-__*'<÷}W m)dw!Q&p+b p}8YQ ;ĎKKU6Uu%Bllb Qd[~TB4aFcGh|^Wa OAv l㩿pʓW#{>ߒaB!B0p*XxJ5@0y_Z}=20F뜪P-pP Ԭ ;,~^X>ӆW~ N"L"؄=OeXp-3\q<[\ TiS9YY:})>!LlW<<{Nd/-#TMu?9i9vW_XBl* A*X?(-/_Q/;sw9ɍs,/bW}ʓ+]`G^Mp%/%{+hn/=[vC:ߝ05ʻ^d^GQ6QN yOݾ⏳ptO0+am,yJ:A52|KamK*8?/%{ڏR aTKgӯ+ohvC:]x@IDATuz+rzd X̀?ιtɇ= "}?=Oנ꠮J*U#ɣtoo!-jl)%6 'pm6ufT$z' ȭX׈ %|l 1XZUpuB<%|&Y2`GYlQaȝi ' $GkP^md*|BYq~8VET~l9@4 Ls3Hv|PGsY4]S]hoN;^%8 œA*lw[E%=0p-*O#@wAşFl)C&Gc@˖dP+PGs‰WVr { l* %z8|C&C'0S{f~"NHlAWA^2|2pP͇=t)vub=/X*}+idP 1~Qˑ==^`/?Gd 8w@~c!ԙm ϼ 1 ݫ])idP 1}b)vzSF3X2 <̴q|ѣ9,Mgsta+/Ր|n?f K'6ݏ@ov $b@LJZUd7=vW^ܷn %zcYW0]>^O:V]{&8'Nm4]S3׉)WI.ڽ ܷkT,?ǂTE?>nBa:zʸqГk =´I9vm&LPBU5 Q7CC1aQ P Y>@xgXQ^\_沑 =mn3b!LrPw| !&L!fX,4<:@Gp)zIdk/ h!dDS 4E⏽^rPdjd鼂ra^|Vp.@2pz `i*%cW.Z7qoja?S>K\4 ʰQ>?uȚV0/_<g2 7(k3׾_䠬H}c=7.HKOqD kĽ69G2ppgNƿOZT @ W }$^Ul) /DOc82MvĀ 9^~PXäi̸Y<|$2@Vszz$TCsUŞ]nS.T5LT:NQK@)$|G8}]yG865L\#VLx>z Y剅=}g~0on:(aS1 fODpXijT1U :"ȧ!5qX*[5'_fC\@5b 8nPcoD&@)*OdaZAHqf`$SD].-Yq$t \ 8 pߏk? N.Zw:GU ,Hk q#?~e0S $g?N.ZxmrWئ1/!Hqut'w:ӁFQG>-I;Vé"k4>Fs=/IqMaR;ƼIOP/;[H@2ptal\ӢAQ`Xd# Gʔ{?F(&$>(.sd /cԊXKY}Ooz=B^w׉:LƀDCr? - nofd 8vIR5>W]=T]?2KG_~vs1T¼^^=!g2 \T8O`ݘUEUhnunݲ!A<\^a֗Pz>d<__bYYu\zO\͞GF.#3>H^ϥppv?)G)Nj4+ۻg<\n/aӌ $`?v?-{uGfTBL?bs})pX#^ 7H@SVM&Ɣ4C'ʷ#uXwLKR&ZR RZZir |VM.0И!]s:)Q Qu%t%[@2p H!¤e5|$be;4vt}$Ȥ? tL)OHG« EZMu-*%iXdä1¤e>H^c-xZKL3`M?R3W# UKUGZ⏽ESg2p! Q$ aR@?Ȅܬ_;u tK2I,V[Pb ns ydna?$7KwD1v)Bq'ɿ$)OA|y)9$ˀIc53  (W D@1JlU͕g}+rٍ+e7_F)I6 O(F.B(N*ZXCY:(oJZ's{ڎ HY}s]yOd?2v f 9ZQ݀ 8ّhc?tIM2:[~Ï J aNގ Շ)y: 62v2)nM墊8:+ռʢQBqWp>d.zNw9E _@2!rTnv R|ksX+h1?L%e"ϣklfٴppq/K_ȧv0t˾?_e، H(0)jzȡ_/Q!w6B x$O4uqn_ WFH1v Vz~/:v+p;1>|xm$%SN"KHB &UGR o| o;2]1{//b#=zyY$xsZ#0_qZVQZv*Kw(U\ $πA&Qr-trifÓBpx"\L#af^+)LǁI6ȔdaǀIaLԚ%HndԲCwm%+ ş%LaJ_1Xd7Vx$;踸@ϙ pФh,p%L8i-T,V8)Z¯]7&pd 8#f5=\Y'] 3S7MCZwVk_UDOCN2nN/@2p #) 'zvˤ+hW*tc]a*}?4ePi*',[.毫VC{LdX$C?@dgyc@=) ȝ7=f/'qid<01pݫ2WjUiժ2&Qa ` }r>]d 5[aaH)HΝs:d_ ճ‘QDPGrm=<9a1mW!XOLH4{aÜQCU~WRu\q(8x.Xt" L1@I!!X:bcNZ GTJ%XtuJ@j*L0k@UJDq9=C U~2NB2 (zDP1|2`+RK@xb;9q`O=< >g@:jJwJEW(΢5dRC.#)Љv?TT-H֨lIɤ5aΨ3.D}.d 8k̢VCcX阓V8R/"wKŝ\Nw_KV2/|ry8v<8[2 {=eIsdX^c;&6pלy:-ViIJMW(.M6Doe7twT/|d9'pX9L 2z/+O8 Y0, 'ec 272+5=uc [@2pF Hopr/ ‘ փGeo*1[epjſlS~!p])2˺*c֚ w]!f<[@2p M]<Vh+YP)g,b*<-W]28>{BWbVp֪keW+N6F/,.R1読plpB2 \u.Ђ#9-E6$UQ)5ϖ ZݰTqY\N_rpMR2 +r#‘Xe8,'u?_7T8d&Ȅ${upWI||5SQu9sşAWW~f!& Ñ܋?ζ$_ca85H֨lIE7So^_~F1[x[}vA_3"5@2p 1uǗa2. XiUxPzk5f[&mu8vC:蓭]3?Kd H.RnG?P$ɑW1 +pQ5޲.CP(ӑFU)$@2 $ ZK*8XnOL';@2 $3@C>DlW t߲L)Hd ،^%FM J|2n}1de@=#^ 9Epf O'KvmD |2s{ӄw$`I<`+ӲߌQ\u6CTs]Ӭ*b΋/gRy. \O|c/~5L2p(vV8ԜnGW],HhLHwNh4"X^ދ_,+PfZjb]@ tjeB\k`d?2+MvH.g?ɗ=]2G&Jʀ/8U};r2;XK& j)$۷/s`9d T%<ȥ0hf/Dt;ѳ7d He XNJfE:Js( @;j;{S,wqYd HNhYu9_MHNd H"U"kI3?FmFuO.?|b~饋 $@2 1 05 ˊL:GmN.NY=ξGݲMݢqDgxYhj{2 $@2 \_2Cs,8/NYV=.uƻ\h6)$@2 $ Hiү0Sp @- 8T( []|R'[,%@2 $7Gf u(/5Ѩ_04ʍ}:2Q uuű.Ӛ7&)d Hn&m !T- J۞cuJXuADjTCzO)Hd bkGaLP@\iYi[^wW]5uת vpşߒ!l @2 $7PqTKT SiW>s(f-~ LO9FHu2 $@2 :S}n7~%d H8σ)fD*$"|hʰmQ4g}+Rd Hd`9Xt:ZWi'meҥV*n[1 WH3uU{IKƛHJ= 6@2 $B|iPJ+z'0Pԍ€)|5c/{Hxd H6e. e4$*Hd 0%Vs)=MnJ@2 $Z7ЅZv'_kpgUXZ}]'Ť$0Hd jRRiwVl4a uqfHs2 $@2 `MNY'P49a@CBC @2 $@@ǫR{pF?Vv6d H6dſJҩ2utpb?O m)%@2 ,oU{-ӯu9AIB2 $@2e@FUmOWYuG0 P!*s=HdxN PC8սJyVZh23Poò4U+/SwErJ $@2-6VWWU8_p+/=t{b%x]SJd 8=zG_71']Ӵ@ lDzj3Hd ]m;ISċM*@2 $Gcj~_rKݸ\u8B&6@2 $~ٟOko>.#ɫ.:;& ;&Q/38{?qN@JH̴B VZ,m׉&UtZ|d 'YIc2 $@20PoQq*V]<\tP-0ÄY1c ЪPTmK8L>d Hn"X^|Y X)jh>qpXF@t];k.UY9(>bz#6C* $@2 lĀ+,/,(V{OE?D"{(5Pn@Mcgy#6C*X/9m)'@2 $=p`ye)MQy1*h@]Jm EwgizcUPĖY/)%@2 $ `Ae)8T_PiJMC-_Jmis,?rxB&":$dIM1`꓁d H.~-DE'B;h.oEMcgqÔd HIB-SdUϠY~UмV1.$3 Ӎu16G(#0*v9 æ>Hd&0Ph?l;= j[Fa3d Hdπi^(,X[ι㠷zp]% $@2 25ȩ_sE7I ,ŵQsy$iLd H(fX._JF?支d Hd`?yXJ=;=r{Ì $@2 tϯgQˈj @8O1qd H>P:@8gϦgǺ$&ŝ\\:*T(IT,n/Q{M%@2 $]֘1)_ƠÝ@dDn@45!jUf2 $@20ʀ}HUMYi\gqBs]*9V ..nF}PP#'d Hd`PMJ4YXt; 8FYAt-osq &psN#Hd37V:lVǒ4'W1U0SS.]nRLd Hz ?t(|90(`Cr]Kt '$cWlLd H) NsOo*-.g$,Hd3tud8 Ns'x@GBY0*U0E/Ð Sd H n})AEGPqBVuK.? . 5_*lX(3)Hd Hҭ/YXtqG͟؂hPt[fs8B{ Q $_᫾3+v~dxcx/qmw:WdXtf,c P %847}Lm_ |Cl _oqqD4R;0pqQ#UUU?'o`iA<^_7-ѝ&DksV]K&8;\ZyUBb?L>mx ޿_VzrߊP.@hLt|*=B2 ,`c?ꃇֿ4mÛ~x uY@t-M{` `h  2@{.n)0ІUD̎5DSMBsn<^|*7t@)& O}ㇿ?iq |fG4gX0x PkҪ(01an$|RFWD40:tq>q:Xt8STNb2 f-+>VFhN q(#X"<7ǶHUBbߦCL"LL7B*w@|V4Ŷzvq40! 4d1ך$d`{>e>?"[|hMR<6:ٸ@\uqu*sl*(6/{ jLLP @Ի1jZM 4 ́A \`fw 섁? ; )ԘrDs s XF&ƹcV[ !@9e0 lÀ. hC%8Sid#8b2 ,f֭FOҋ6xPq\V6TS߂_H t)h`[(}B3`E%8SidcGK%2 GCwls L`nf[b+/:-PQ'/D욚~2d&a NwSiHs;ZRL.k%_wJp-M`cGKlhdOy܃yş ]Ȥ%⮑|Ǻ1 jZM=Q-l"oxa AgTn.`='ρSL3ftܜѝŎfBqik v[GPWE]&%|.,gMn"1iV4qͨt6Q7^:,!,l[(d TŎfBq@?k_+/]wP[)MX R؊'tnayCNa  4d8ι $.ATCb(Op$ʴ $5jȇ ) w,MClhI1p -8}/́T/|ZlV4SS)H6f?rPzWlW;`Z+_j1HN hMÇM`qb ƪ @H>q?2IԟwG&.w#C&JJuD Aϱ6qS&qkMw2p Zq_]JZ'Tֵ| Ԁ%J#IjbXC<.ᴼOicB_8W+'OZ5w67@Uj97sqJʡ d 8m1&xg6!fX3CѴb@c됶.&ž]<:dͰUѡ2TM•wQRL3f`l p,M2`0fD=TMD$!iLd`c8pdpXuϫިgذo ygOojWfD@Mno!fw.%N̯)&@8RRq4⿸*l/55L F*$s|)|n@wHyo   IyCen<`)Ћ(8n\?d2М(2I,. :B0# Ukҩ1p9[;g e?4&ibWЋ2Ap!W9)'92`CsTGf8BǜW_€g =P3g@'MN`yhm*ǒ ?]7KB5\J@2p ȞnN,q^7I db 8mUx6ڿq.Lɏ,$b>ǀ/[7@*UCycK16[ $w8HnbAcl%2۽9Q`/Xpݫa.?v 0a x# UwL-eeəּPDZF;n$C11Ld|hNw,G.83/ k?Pދ>5y_/\B>hlUdžZBeǖbl* @>H p ,>| d 8G1Q!`Ցd'er01FIϑ&= *0Ji (!6h+Cd4jlqK1~]GGr,b W-쌬4nIb}̺ ƲLbBՎ WEdc "Ҫ96V>`)Fc>`7C1p uhW2 129Y,\ݳSxTGS<㠪-.֩IwDjGfRB(.!Pdy-<Ш&jr*C8XQ{Cp#awǡȊLᲕ $0s4b>`)F㸋v8hR d ,:A X]ݛBt:bőMP.@Fv$BqlucDm^}RQUxVJb| Gb8lu[PjdlrpL*g X3::\qSwPKU.!x)T-IB+w]gfIkZYgFiGd 8{X[8ˊ?w1%h ] "%IU±zo?? {6S^z- gtbXq/K FzM}wG1MDbvJ3d{a0yU`<#pWdav$`Gpl[S:B5N *͋hjnwjdLsa:`Os7h!:eǎ_B4T#!>űqſȘTv@_ŒC/<4C۵kdM>,3 UHS\+] -6+a\]`BΥe[ NHbOxLhuuoK BLPu8c_IUX1_ZUb 7< U2 썁!|aXOg9FP= 8O߹R,8;=6Q$%JHɖ,ْ%%XF$ H HS $Oy0W1 ~P2  EF,ٚ'QTsj=wjZ^ZU_}Uګ9o_y£Gnty+3mXݥ eXuS+DyOCBq J|8*pVƢ$won(ce|S.7p=&lIEVFKUw8 Xx5YQ Lw d i@z׋vZ[Y-3yv4m4YЇxͿΉ@{ yҌ]>?f[◾ 8GpowN+vdY 6Z~g=4{-R+2ߜv؝ lL(ǍKKx#Qv4WaGag4MR2Jpz=d >>_z ]Ҍv'ȜIߘVxݿ+G.S7~pّeGf9"/˃u>d*0_ 4c{ϚtUEg.QۯNo'}slGaݏS8`8D՗moƁVL37W0^Q'IKt4TT3/G/o?>};WȲ#l4ݜ˒Q:]j9򐮼м~78>}:ǯ?*ʫ~7>w⇀jؑeGfrT. 57+oϹ=}ɎUV`v؝tWT!g_kFA zۀ_ށL /ҍz4 gbZ ΰe9G&`KLhRv9?_p?9 *^bG ЁP `W=za$9eřRN6IX@lWеQ| dGJr(  L,O.4;k=eh{j,4*/5V@zmXc\.rGFAN)zh[M=pwF P Q_<{)QTg=2c~8ᷚz4Oo2|OWp|5.VM3,QRǻ̽H.pSͿ|;md ڋ1C:*pTVnw_u\wOg{ߗQyZ=ٖZ?+ݯ8XJJ*@uw?1!`i\7 *Yo<ģGYq͟RIc%Fәl:[8UD2i@{_DuHbq9p &6 *PQ;C)P@-H{0v-[V@nRm!!^ГGQwn_`__-ߚ?7uSkT8G \e[Hr]+6TWb]`=_qqXJQTMNfs8*p*0u;TLYK *p;ؼ堻ݟS\|5[V ;FxK}=fZ.G ܽ l~tKɍ+-!!a|R[cxǩ1!θ`W65aÁAUWlŦ|G r>o4#N1f 1YtA$ 7 _A|k \\s>hFATk?l@GW_sv l?p}qN8@FDqxG4m5H1qѹ@IDAT %dae;G@ĺ'J{hN7*+@7 +yP8*pOfʞ(O4-nDhEwAioƁikC CuT@;L?f1>9p?&qQ<e^iE[‘9ecz5آl*MŀuqXaIeLQẵ"NOqG IՎ3 TJψiԩhK8J亚PCqsR)6l<xT+pғPmF1'=M!h0CŕVj.{[ʝ;Ȏ h'iJڕ0b?.s;`/Ar 9@ 6Bvr;KqG J[Wb^e_Js 97\(gy{R3xҩekLZnHI{v?C~*uT۟||cz&U5bB4/''?$|߇%9SO}F,k4j}}w׳֣7[{wTN7 3zޕٝ byK?;>>J]}#ݺ寮W eXHjF!;C'l/?Q?'?~⇀燝#4#.5N&ըף"j''8{z9q2`-O>#T ʈu êu?t_==$Vh/ۼ1! ]m#<|k_>~H:QwO?.O[o^Y|% 9 qQP$3Al4|[@+}g#@X:k ID I wL"=!EpL4sn8 J͗DMrqͅM4@w='XljLw :9q iH5F _Ua1֬e/uה#vIKBNfd2F6Xu/sűsDIx O/@ELj6D??)GB2%. XëWg7NK\qQ,qP8@Pj')/{lIACF{u8b)lq {NYphe0`|0yl6&,&AaͿb˯XF6P Zwv=LXtMv0%Qċ`ys1p?UZb-@J%K1-P&S(YuӿTB2AuR=WD74&p7)V8qRЀGߨ85l6LcZRBPUa1֬ ]S؍&i,Y& ;O]q(aM ^Aǒp4Iyvg= *hTTv7F7)9;pqp$7k"DZ*Ra1h$3,_!UZU'TZ(BU*5rd/usIKBNfd0JFkXpqGRHPjO Yu4*B  ,';t +Zx4( Z|پ<~_lT\W1i}pиQT4LfKjeT>똡Xw^-1)f:?!A&+85whPx,DMdXHN- ش&A?Ũ_Ua1p *k} V;ȍ&i,Y& ;O]q(aM ^Aǒ`~O֪h\UbeRu7ɐ1ܰ^V_eu4f\dF>he'SwEr)p_ W2F^~UE6S(t&lY:An@4LK`IFq ,";*Q{'.]:0Q.C\8 D8K}\q6 $7l@5ʂ?pwilx"x=ԫd Yk#l*1%o=lH[a4!Y*l4V8έeW@|Hy ?ZbO\Ag2;jn'n Vp~F>).{na)u4fO<1p{A z9͐ޢ _QWN;Uqӌݖ17J4LnTXsRU2ZB" 2xC)p4.p%[^h(}qDh݄Vpn88whPTrȣK-6UV`Ž?j=HLD[(C*L66J 1@szI+kQRUHk-l9J/7!!j:?VגA+bw87#8`"Y*ሽOy k{bhK~z'}4*BZ=ʢ ,;}4\*[&i:oƍ[q9E+v ,ccuDW % f}aI#,4Lp*V]ⲋ%.~دi{bXm^SdzqDhğVp>.ޭTS4\p/NN9a4ű!&p5IWho\nl#&LѯbmpJFq %l9}WPBn>q*M"֐L_ǀ2l# 9ިԹu7N9c3s`Y}H)}?;EfSTG&5b8Uz\j95RfoS0LFIX<ű!&sw8L aʿI,4L4X*JFkXHD ^<_gkjn4N6 }˓&`<`Q#*ߪW**¥عͿSHhR MU!6-N\ӤcB1X>,p Bä9?TKDPH ᑇ}f(zͱ6}@ ҵ`.PdȖ00h*$sE3k/(C\8>Nˇ >5Or(Y.Q6McE/nTL[أc=c.#YPVg Ue0 #I;嬱ɛAJ&T~ Ur #Z4|mUv{ubV/?i$e91 Z \pQ:Z D6E%NooF>) l1\"lp)Ǟ)q#Vkk _5s:obvs`Ve p"¸z4)XPqP&] [-df PYD>i`p\5eW@|1.I \T A^Fw|&8$l*i-/)6ٺPdX00hɆ*$VȻݨ7(E%N2>ow@%#Dc9` 8vX9(8];[@K1ꈦ+?F\ml;jw,M/xn ~&MpRUs040͟j}ytX]{H|,bw*qǤ!DF  *=]W@cC|k bcq R86ƀpɟRU.SͿ FpEC۬rۨLVcMڟXB##'Eml Jr] m!c*yN*ONkEװ ^@!;Ir8?e54,ۢʁIdH{8oy DK8wK'P a>HqvQn"06N v1\ k`pGZo$uRj]^ALpb~`UmV9lEl.voRCwP įC a,|!4V˜7\ bN6@Ur8?N)G3@(]@Tl*ja ̓xVx4`wE.a'"a?bպ%-Ҵ{ñ6.gvNQn5lSyld壶Ml:( DZ윙3$v$ p5&o,4L4XTsJ`!F+],毥5jͰ^X+lLzl:GҊ ɐ'K3*`X4}ee.ZN{zgkBډY84CD ˜O̼*>~YSb,4puN@2<chjUPhv5'`!Fii%.B:n%_\όIMz@ ^utKw8uILg>eYPT!.Jo7)(ƥPK~ajҌi^zI;Q8 f!tmhQ[6Աj DH$V bc'58v"ƿš?S`AMO* n%ΔP%oϭ6yCvBäE d-Ǩᵋ%-xBGb܍ϙ  $kHFCz+@sݨ7(j86^OneK3 ~==qEFC36D/Ubv^Sb g~4puN#=Fـ9mlj5#\S4=03:s|pAY2OvAJqfI[4=o+6s`&S "ZBjр[a"rvޠ8(yxh' [3a`CpH|u2*!!kYʛ$L"iRUSǮ5"$ iazOEYXck`7IGbiM K[, 1bDkƜƟp7y!c>mMԡUqs@Bhu&n]:lhE0hV};LJ p w4ݲ1$5˥ƶ{1Q F_L6=hı&OXÒ@#1I{4\)d> ` %7^a8F(]u͘JpMèog(Uj5m)X9̰Q}^C?%V~Bjaр[aab#u&P&&Cj`D8_1p#!A{ؐz6 w4mKUM=^klDF뜶&8 g֣cLE:%È pWV'DyKgKܜ# d"sh&\&Sw\/62kr:̰QΠc 6ϖ=ۓ#t8pQz+@sRS#lN5amy$hDmO6zz0,!"ӵpVGvoC-\jp_c#2"&X0i8ͿrRNxn ڪQ,`.`]Vt3yHVgW88F N/lRQ}7?F?z+@sr tJ7n$ HsUp{l}ʧ94XyRO'ذG-oolk7ȓW?g^%Y80,N8[ݬÉB T.b ``IG A3dNc!Ip*^slLܞ7X*6s`+Y!`hE0werIZp&hA5-7w٨/TtIʅC3 B8+܃SME0PrpQc=!(VoQe{]z@#i`,A_R6h:aT԰X.#Fi %za7H3*5 ۳f(gpϱA=lJg=yZp4Vx'ڸn_|4,>N}YdEؐz6;½5?Q3sL#T l3T3l3rc{`t@ZaC8\ F s&bhSMZ.i6n i|7.AT]Ҍ>N5aih3DĐc"pV[x9 ̂Gz Rꜵ71y2.͠ℑ’}8Q&8ryKg1FA{{arr-P5arF.s`({ҙ@kWU?(`!OȔz_+{ӈqB(`AhASwNnE#lF6؉DGͷz w4݆1$5˥_ϋK3ZL{TUf2zOm!c>&%# CTXN 2讻X`58Fp@~ݲV۾ҫ=zˆģcL@Îz TPI -FIOgl,CHa G{$i)+Z0i WTX2ܝ/r>p| BeS<K;ˆģW@_C7}##5%S.b&TxqhR (V'4GDUbɞ 0 `%b ` rG5(!<^CSkkl>T3^g=8}hx4\-SaLG/jk| %)Z93z0Gb@Y:KZ(bsEX<` eKMinS֜7X7מzW]@XF 6֡%k6~3=8hrB)?#'ԝS+Y# EÉ.#h2P^ݫaj֨'@ &0؁PGb@Y:% UhY{?Mr5'0+,هeC*w|vz4I[9} f(SÚmbOW/2?{hR Д@$sÝN+_z+x |!6 x!?o'xyO?Dia&W_? |:d !x;:};wz|QZ`7^g~ /?K/jWaN@Eͧ>ӟ>=#M͈yjjaHQ2EUIm,~?{O/L9b$=xӏ}DҐ5vfU4=ot/<<+7>MN;CS3Wizӧ}}g}ZhXaW:>_}U:Ws6Ze]4So`w})=+WyґB9C.B` D0R,̡BqÝN_7O7]蕝`3,htn#V56Η^~կw?}GY< j lHq|HE_ Ɯ t`~_9=Ϝ~>yzQit%-̓D eXq=JK_Z_ƷN/?ӿW~w@JzCk8A3Q+oqr_=_{ηf?~Os6kɕM!H @?Sӏg5 WmQX·_3NO}s{p`grhjr27r:6kx_"=]م#͟3& ;1͟ߋN:zqwL_\Nǽߠ5u4fڅAUŗu+{ۙ{願لaYͶ!+@ @ o6~R;ZW4X8gu4zEv# F rЛhpοdH{?'z.6je>4u[c nJ1mZ}wiw}Qt.^#?Wj$U&kƮE}U do;zOU4=s ^{qyal+௾?Ϲq22|M5AN@FhgfQ$KN9ZpDxS͟77:Wuǎdi(Xc` C`5i$´WH4&vʭ DC4lm4y=F;ܽFu6) ,^ 0-c/;zOMq<05AXSWuhϑ9:e`Aj ŃYSd`ꏕ/Y, :?G9@n~`"P i'[tH]ĝ ֩oR6θ.0MMcnEpa;}:@x?m=uVo ӕ8pnqg]{^AC(zx~f,Wp) -ar6'xckxGI@Ϳ>E8߭~~#qab+i@qp%NU̓Mpl'Fb{bat[9IFݠpٌp󾊉4MMcO: m.MKwzӰLXF5]ed_kvU4,$Hpm/ fu>)lXf >< C]ʽ䕱6_uIgQSb-#U#9؍~EpX^&P"!c&VXy9Q|"sjUl4:* 4NW +pdyNTM5OWee3cbqWE$r#鞫>r XͶ¦D"ThCB4yYAiMAS>zxl_5ia좭0%y=(D|[͟(oV5,^)e5`%I%Xi ~G, *נmf'M6Ǜ tɞ 1;j,$H,y`M^Yå?Dk<-($8rx%р#)kl5ԝ"K%Xblk5iaQ#,Eg=xN( :+X6 z͔ M׌u f , )Mő:-xUsڨM1B)Dnx Oԁp١;E&Z!*v̂"v!iab-S!m3"$ KHG2]4O_swWsY〚~ۉ6Unj>_.$6 ev<,cVS,Kof?26,W-#DI ݞk%ls>ɣϨC/RxLHܛF!AisN@8F;˸ )HhI ~ K|;LfQqk+0V=x <ނi(Bj'zpa 1ep!dЌp~.T~Squv2(/.D6y -dLz8 X`1&40"^] Ix0r F0X , B~ E'٧DxlQ>)h  4^8F;˰)֜zmZ'*s9v;ueE'm3"Ne`e  rl3 ͚N0$:CsVT\1G*N&q,n>~ OX)]Czar`8x{ՙ@$HG/VX#9 ҙɣQI=S?68zs7D:uǐdN*>Ez6VbZ^K7*iD: ɐNfETx  e$X˱( 6Ws訋 șK'Xc Ovy yU7TS,%B3_Yi2Dž %Q86hL-ҩ2$:j Zk_;W:0~ߴ:&bhE M%V (zJL m8܌nG‚ą&jt;4%AT4F<ԡ 8_vQ:n wY. {ܥ~?\VSl%,;S(ImJh| ?BHF17NF#X+,yl79 LWo7ߞ-FXIos4.:owKĮ_ 5VX.R ]Y=-.V ,W$iDQZ Gc%;4VfD8ƹ)I4-`.`7;,(n\Hsr,Af?SYBvkDV0>ay(ImC}ͲwR23r F'CVXBlkv v~o&դl]nCkMZ&Vӭ8Ԓ N{fv]ܜ Ig47iEAi|S ]n@Kc8Tɤ#Ad }n0_6!Q0q?Fbf>[=, Kmԁu12=r(R 8HtӰQٜ<~vη\ ;ϳK',V^ZҢ9[PK&P4& ɐ f|*H{\(?t$ی|3p+ i>G]n wPrIXd?ao Oapjr7wC[f1$jRNAJRvƛP:CF>aN1[~D"$K -$~Y:[ F(c`ˢ$S-@ZTio5tg +G*Qf.Z2!CCB'pOr 1H+KwhX˱( w9< Pӯb;|訋 g7;,=gͿv?]0B-nf xIT@R:<1Jg'Za c;cB`g/ WA\4 $Vzۊ#evtFQ{(!*\E%,dHadHCkR+_ %7`7Q(uA٨L~vÂ*a1Q5a<j26%Fq=F)t񽢪4b]7Xޝ7[n./0Lc`Eln![(A ^ z0bXsmu֢DK80WI[.||[{`OxIypQ`n8Ԓ HadHC|jR+_ e$kCȠQY|(q@Me PN}MmڂJX=\SHdz9On/c{n fX(bp_Lkѻ3,$3ق5aSmYYb5Cv٣uZ Wza{/H#ƒPTp?c>6ɥdpQtPK&DiP0 i(85峵9W`O6 *\[Nȗ갊e @Q2C#un(9|,yz@qŃ,)c*m,Ab8]۩okP'IA$3قuu' .[%N!c=Zgp%H@GlaOOR36uFs"t{ 1]pOl(mG1xljĆҤ`!Pp CA|v h |]' ]@t|݀;}ߙ6&Z}Krriwv~p6K0˯<43k툐[>aN $ju:,!Ѻ-+kдH&5P1xvnCs4FD~-E(/dbCiP0 i(85C)V z%3!6Lq<DR&f ײ6# L,؀sj ?ƘnJdIrbNk+^D96KЅ{b!U݂SJ9#O6  9) `3B.{@QouȈ]iBʟ*A(s?Nwi[՘k@IDATN~f1C)j@idɐ]h6Y$)Uwa CȠQ\aVXg4ߠ4M>vj 'GǺ1МC_^<l>l؝ s @j]h{X 5*o[r-mH'hND(XMNs2v٣5Y+m pl$2bldRk͹Ï0[ =Y*4|eKC- ICC2΍EqHƜ଑r3"$Ϛu#O㺃#&Q/;n0&f$,4rfDTLv l-l'- XC 5s5[V`%F" G09 lš x X4gtPGο) cA>qMigV'g #?͟'yyBPK&64naX&|,=X,adsflZ y*LD)$S=|Hf$H-9͟gglf؝p3x;F\hqX |൨jN+0ڞamwWrT6Lq< DHF܌pQq9Lt OV^\,2Y. 8Nyoa/9 3g6#MD$zz.`7t=jnW}kNkaDY{+*9vfp昪՟p }۟8};x?K\Hؐ&'VE'͟g?& Gޕ6c=rz΢xU6o=GZyHاƇp3Ϳm-Jg=`(-CiP0 i(85C,bcaw汼2K]adǣ@4wRT*>g6#MD%wOI} ?NsG?~z≭oRi_flO$A?;ߟ0*A'0 '>R\Dn`[n=jN(w ~z@WhsE}O|&]k+LICC2Rbk r~;2KwN GQ B EO>~ Sf),{WW#O;mJWO?yh_[5M>rꏥ#n\o+a>b=9I?~G=q1+렙}ɏ}&l|Jٜs|#eR9&8yKӝ#gYǫk}/7shn[3vο[=ӿϽp P3k6P%O?=/=BBR#V)U1nO<؏|#p R],hN|·OF*9p>"b`5ߌ)}ZCf0>{SB85ˇu z_f;GZҐАa*xlzsxuW_ "п;</>ܻ%@Z4 8Pp jXpJߙ֗hӽz5\7A(/I(Z*>g6#De|DM_>LDDգEFX唋72:?NJyzWO_ڷȞ@Dhkxozl ˚@2׈c7Oov KvO '-4'z6Tx+>b 1B5yoBYDv^w"X_!Qx'b0!&W^;zk.6igу_p9;xC 3ZR{ g>w[x7|Pɐq 7sCo?Y2c5]z lxd4/#X+X[5^M6\㻟x1V{ɐ/8Xİ$7ɔ`qWq)X?l$RCl}c%bNEHd4EDԄ3]Lw%S(86zz*I]2}i/6+80ڝ$&܍N $4` )pGZHm i?8Ge3t{bc5?"ULZۨ p5Y*wV8唌ְ !Z^쉣I끽i{L9Gu2}^dHȵ,6DŽj<x|3FM; :Xh.- PhR:+` /cgY"Ant¤}{O&7RU2 ,$".GײeZ{%|OkMpƭ}B+!85^ߧOVK= 5N4\]cLqLƶ(0J1p #Dh8*ls ȋ7;O6,#Ase;Ș(D.k*fMll]qNV 7d& X*JFkXHd!W.B:F*?բA'+jocTwDlKC|W\c~(k i(aI1( o)s{"MXGIXC m2:0wwp"BjSUHk-9?V0ڬr0(&lpcMVk'87qdu0_1͎oRa;)dL+Xh>l7 H0v"mjz>9sq$֤uG |WBVjz)~ [`ҋCpa< pmd `3GZHm i=oq 4c7VaB݄z@äq`GzլjcNLtOlZXZVV}o4,>N>ίlԅda )B?jyBDEPH#QS B,. &8vRS|32:N"rA N ƒI%Ι9SJ y[AY҇%b D-rf8`i s .Vzז9U3m}K +4(\5ˋ7ٲb!#K3*`X4c-pLؑ GZtnq&Ml:( ;rrdg>5C* ad%vtCϰ^X:+*LTmWsTҌí ,Nձ ЈRƑ=o_F"L|컀3g82>6EDv{Ή򧒂ӱA\pR:O Yv=T~_KCøV*33M%#hRXy K=S!K3B4X1l¡!+y_T|] p͑obF Dv{Mъ5QmYpN6#/#fl eOCIQΣ],U H;>k /-\0z9c%(BY KebͶ+qmt<4,>Nu3 ph"bHf"pV8 _ŵYkxNъQn:'[GbMW~R  '3  ئ%ktC濹Jh. $4 ,YTҌ~q[w8K 1$p(YҍC[u IpSeb5#/Z`Xr_DhdaMڟ)~/1M\=Np.Upn8*Y-S,Trx@)<[5 j'J f+{Tg_dի`+Μw|VAw^`NzvA=k[gq/X t; qg>ts^=P -V5= @χ+;5X`C; wSͿٺh^FtڕK 8FYVt4!He]IwM +jj*1gfR^r҅a|N<-,] beFP5۽ rɻ< DHM%]@aU 4 4zI{4I"iM K[,MGU׌90ѝ. Э6KqG:̰Qb $DE' ~%>3 n^1h[ )`k+(.@[l]*BN p2 f+s406CE n\ش͉@p#s5x2k8sx毾z`U=vy#5iTc{Fch"R}ZS`Knh221wJϚ[]+ 6gY83P o&ܛ %-~4 Y w8phR&p(YٍC[u ͍ 9q\Lъ5QgL9͟R$ SX{0p= ( mڣO5SyZS`KnpQJ2'D?՛XƷi 淴$=j!G'*,| ARpV8_pƅMXMݜ72g1_:K*)Z",y8-p8w[J2:WۗQȕ@#4 2KƗT 䠽柢icQz1\S_`0_k;z!6 lOD>CްU3lpxQj^o濶hyo 4V׉S7b>ӱ@<Ϧڞʳ+|Ta>G/s4n`F}10zKkAl67*}Qx4LhRahR(s}J+nA{?dZ7X, \a*?5 *35 Fj_zӹ c^8;/2 py$R,UPY} 4#i+eҴ$-.}dǭBx4 ws|ӁZwN؞f5$xBq4.nc+`| Y#m>aUD5u|-^-Mg g  ޗP~'n6՜pd= 5],,],_j;oVN_v O=9&6lE,mٍ|* @ xy- ;.Bc.r3(<̇saAZ,F8`| 4av[LT_76ɢOpQ$qZ:}Yd#LΰEU ;%Jp_6;m5'@+,Y;ȃ3 |vu4ݼI[9p솺=\w"qivZ{#V#LEJsqZ;aO}̇sa/-`E4`|4a$v[LT_76ɢO]@M&PUrGls fև2 eQսGEU{2#@#=i<7xM/Lpd%.0+X"dv8F" I+ l˅]mWDVMnXѬ8xiٞ˄:F;/KyJ9Pia7IS>E*k|nj9"diE!ac$3ëbyЛ?k*,Q*TOՔLpQ1P],A- xGJxTvI%ZiCN.ͷ6L0ƳTϱ+XjCo};Jm ʶ޻c55g?Y *oH79x$(.s[`Rl K@XcKImQT\.XŒ-lZ0|{e/Ka v4)O35[zh7,PdO%Ÿ9s;6a5]\Kk2ۅ&XU #by]w=MJYѐ5u31BD'CVXBD5; 9*V+ƮVkc=V>*`9OVMciE2֫p)QApIz(>OIXC G-ۄ$I (HEp p <$z'_"h8`\w0D9gd Z}Vevy9t4ENފͿ[b~b\d_GoKۧ[b`k [?OA'h/x!YeTTIw&`i%^GZn*n~olc-:qShHo@I Qkd(L0mA>(_ &V13 kӖ6ul1XSHi̴;ˡauKx(fCwĊU=>K_{9΢\ ]=Zs,hR2tb& >^2@ ~=Api*87/̿YfW=gXA-X%`mW= Şķ;=l{pa2ۈ>,5 C6apGka'GUmD0_x,75E:6]G̝#e22| 1ɶi +EIjrt *X+XJxZ%ůEgQ F:a Ecgt|p4԰J*4z N4x[TOw -1;Rw~m([gEfNxL6(Z8l~vum=6VzoCtl<$R R%k\gJJQl6zK,eTђO&墳DKWZslG.witg|:|5, B\/טp8GK 4u :yA*UJ(>h)㼅+}s/@4 5#T&99n-ً=Q)Bni%9r.ye 2V50 EZ}rtYF蘖I:f%t"U< !.'nH*27\45, x%^!rNJWKU: mi!osw%%iM1y+tbCc`{g֭\7Vzҩs{Å0-J죾Za^hEW-\Xs+ݘEZ}]%$)d<ֱ:z&i"jIa-$aq 8Y"`'9>ˡayK8xJD'V.ܹWڱ\tZj9ךcE3pb8>5, x%#^! rNJW̎%B| XaF7uɔ:e1?w'$?vӁ6ƹs|BoNhohx$Q eoSnojmUCiqqQ`mmdAt=Q⍠.v{a,X)bpq.. M}FN5aь<-$2@ vBwyA#0RwMD$1nO|%._R<,Sցo3:>έ\Bo;~|eo0jٔ2QF"r\KYNke5y?U=Wd2܀, 5dcb*O!Bp ho}F7a@X4,=͍OeAv\'$-"I!6YbPݞAr6uɔ:e1x-䏳>n}y&@ g6O f$je5k%4^_gN%&q;3gG@cfY, 7 -x=`YX +wHP%\vkaM#,8K`fsdGdqeΦBF 0uOx%P]2%-Wb]0ZGX lO4`67>AvjXJN%_/bu #uQgǢ$!6YA}&xjYk 纋 w~ {l2֔hg:jjEaq?h”Ub=+Ut#zKפZjJP:q7;5, x%#̕9lpPԁ}ɜ#PBO; -G #ȳnv'lyM6tw@В%DU)wVLLc4Ƶ䯩)hϲ$Ie{ڵX=x dqk˟)P8/sdJi!%HVWޒ3+Sn7ɑi1|݌pJ׾F(F"r\/3 Me5{Y'X*tmD2UL*K;fp(an丛 PÂ߀W8BKohd@/AW(s"m_{M^F$Եj<8i7z}>?8 KQ\eħvA.ڬ Ҳ0ͬx,oFD[ɽ?W,-oL jnbn丛\45, x%#^! n[DS'Pjkv[r?? ;B/z W ~{z|%cz<|:xy .ÿ<]@|i6utQ9V{9v 2~5JFtPɵ?*CX❬o*,vagݗ EW#H'UךchY|Gx^-n""( cŐB؉Y^_,Bձ&,8\lVpԂFJY$XƵY%MVrXIT%x8A_R<,z/뀭؞15a5d)2 ;hSM@I?7w /ڌ%z׷-/[3N'X><y o{ǯ4ߊͼ;~{A(a6a+eFw(~c99dPUKQN ÆS%nLl &`Z(ʌYiJyeSE3,-,*?EBV+V gg O=s抎ƪkͱ@X4,`~ > PndqplshpAEoɟ=f;H.TKgYoc@pࣇp&_-'dʕNGse Ct!Ud0h^ioJ+V g O}lN+ƪkͱ@X4,`~ > PBdqQvREa~K3P51Ò-DX3g/t_C)a68O>7;←{ϯ oQ^g:vM&]3ڮAOiRE¬O`J;bpj}$'FX(:a E3_Qk(Ə;$jU-ޔ̙"Ȁ`6[{,tu{6zГtm+Egtm3e|w?~]o^W(JjBh$b |aIFƷc/k5Jׅb|shH-,-,zZN-LĊUř;Y“C<뜹c]Q0ZEW3\Kk70ud>KKDK#V&YO=L_lc2coTm}a 8o}w?7uo  8v?1F?>_oh>rUSt36m'l?(bB`CW'Bʳ2L|v,%o.-Z`0v?%q#Ш#O^[j[3yOǴUE!IR: ۓ{O={} {ջֺEe/yґυ_u[G~mp%pƹ\gCەj)=Kd?鍉Y:nPZu*g%+0aEpq9>$fɱ\tB3a`?D =-Х>tv7&}ɳ3lSN ~Lf_H۷{ +n}*^Td'kr9w!Ce>GԻNd@sYy&LόIb822͉k8Q9/@aN|Ӝ&&NaebXpBtA|; 5b)ԟ\n)eр X|υKWBǧ^<#涥{=8[??*6NS)h 4['>j^ys6M@S);B-~~C}徵 C]%h 4MR#זT vB%h 4MNR`nC|>X](۫)h 4My廗 c ` zW'ɾ [{S)h 4VC>5#@gmKٚM@S)U ;ZtMA냟i7<=`GIc;7M@S) <]_ݬ-y ACwnm}Fw+|Aڹ)h 4M x?Nsw,aK1n_]5c/NIDATx3xM@S)V`rr`>@},l6%+ՇPIENDB`hydrogen-1.0.0-rc1/data/img/gray/icon.svg000066400000000000000000000221271366722712400201300ustar00rootroot00000000000000 image/svg+xml hydrogen-1.0.0-rc1/data/img/gray/icon16.png000066400000000000000000000014011366722712400202540ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs\rtEXtSoftwarewww.inkscape.org<~IDAT8mKlU3u*HS$hFF$$Q%`G\c6θƨ I.$v%تC[p))"y_;799.[om,!2)`KX$չx]UKJF2= ( )d4%$Q*|owx/VL|'^W?1C %0^J?vdkh-,$nz7P9kkL% 0h0c-[ƀQ6 t/ߠ5ĩ3gG0cHbchZ\ k4y~,пC,+YfzSr;gyiŹ}oM~bYHƘ @64(5z[,;OMPhWeSDoS22Gع˩32IvE#'f{Sci4iQ-,mܽwoݏΝZYetv X !P|X5jcr^JT"y>LPdaD8=M,ŢH&=l#R*h{n볘)Ȓu*3:+7ʳ?)IENDB`hydrogen-1.0.0-rc1/data/img/gray/icon24.png000066400000000000000000000022371366722712400202630ustar00rootroot00000000000000PNG  IHDRw=sBIT|d pHYstEXtSoftwarewww.inkscape.org<IDATHMh\UwޛW&)/jӦH[khkP0R ZHQ+ DB).Bk Ԗ1d&o>x4xs=9]صɗJŜH2D BH>! %ERx{F&Μ~y$L0IȄyo ",YTq[ݸK|03&.9gT ~-DQ JJw0#{ر |E7n#MMff,kIFn z$"!y >Lc8q(t b]17H}k`N砄> A1?^Joyf}$MKA>049ffh}sfrNqrE{X/4ͽyΜ~%XO+s.1#9mT}u0Ĺ")Q8ܛ8f ,*0}34nRsٞ{S<0 Hא g3i>8*&RuubÇvy~gA΄`Ssܼ=f-"R8"m%N;qиtuKW'W5ܻd->mf{H6٬7QsA:-=-Hbtd#/Br)ϋz{ns߻-4~r ?Y<7_gzfL&M>;d>q56^gR7*x}9]I;ƒJ h28\!Rb$HTj9L2_^oZ;WTV; V;$-4agL#Ikl Ix~fu"GeyR1,4iu%B6!n Ƕot!mݘoݲ;.z H5MC@O"fѫ.߸u@KH, $J $HA޽?{?}fjIENDB`hydrogen-1.0.0-rc1/data/img/gray/icon32.png000066400000000000000000000027521366722712400202640ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsItEXtSoftwarewww.inkscape.org<gIDATXKlUי__3P %>0Qh¨EKF7qѝlHJ4,\qF@iiKt:s{ob=Q}9--LW1 K> ̬@(ʙyeV.FPETU *ܧ "ű#d5q(9 "a.^+:l;>򤟼EW5DI2T\ϷzMx/əDj Yfeqqzu^J* [uFu 曹玍>͚ R c.`xSxeEN ,&M͞Z$ WBJۍS; DtHD&^5i~֚#2z"Y!}|INo h[ 9@CNv]{@v^ !Ʊ%= .#gMEDn*P?q`ްb<r WoX4~5\xģIM\: ۥ 8$8 ]񿀫f؃Mq|T Vbi@yrtEuV/{Z('GJFp4 3*eFF'QR˖91<ʹ qF&Znv'O1>9C>Qb1TY(u~D騭!6L=@pcwIwEB 1B!B.n2Xx¢0b_b%, >ٹ9r K]<||DxZf+(wPUV./!g*@TZzq J'/ WVBD! 1J>ߖ: *JYm(I#5L)8JdMS)oOfk;r<7r<\[kLp[+)Sը^>·_:0Г3IS7Qyk9f$~ ӵz?-IENDB`hydrogen-1.0.0-rc1/data/img/gray/icon48.png000066400000000000000000000040261366722712400202670ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYsmhtEXtSoftwarewww.inkscape.org<IDATh՚KGfױ8Vb;@D Bq@H!!!|BX"x ry$`vxLϡD)i3]}j|oD v[IBA9욢Xcd"H RMof Fq ^NxZ=ܿ/WNxh ~jOK_x C[#9Y},/'SlLGQ,}כOG߷^}?4 Xׇo1SKgx-t:B/Fa0zo5^qe7-0$@}|l&k<z6Qd\ P:C{`T`D<4)(Ru~zd@Ef"0q~?wa?Xi|p毶|682$Vz`񌲰Qh0XHlKr1+ B!Y@֬rOe``:3(xX+eF{vﮮcڤ\) & H5HUh7U*k,{woYW^=_8.hO4^=-I!}喠}3|EP `v `nƄpϛɧ\7L 'LAN೐t&5g! /ycvtW.wSb @Nö 4[H5P}Бٮزy߾c%ׁ|֒;8.]]FP Yyt&YO}$('?w84~/eP j$ڳezjk[WƖXKc̅$pi7n` qDwnHC B&*mnIܼoyȣ=ZjZ:e!_݈fo;lPnh R ,%<٦[+拧+Vy]@\0~eX'qď;5f_onCi 9JY.lŶJBm|t@2uWn5jUevF ޥ lV 1@NNQ7MrE on9ݪ?4VfԱ^'Ks~ig֧'" 5Itp? kyKHgrHmMy0H.atZ(@T)10J\u{bs`2O}jT6wgϝdcފmud_/UOxY!3{_ ]t{ 0BR Ywu# F./-R/={ LdΨE "CaQ[0Ђix篊Z>֪D-Ԥ~6bV$5}(IENDB`hydrogen-1.0.0-rc1/data/img/gray/icon64.png000066400000000000000000000053631366722712400202720ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYsbb8ztEXtSoftwarewww.inkscape.org< pIDATxݛ[]e3L C^,CK*1H0$H$hI $>“ /"/$B E^Bš N[\ˇ3=iff/[Z_߻p(Z\rFp>͗=MS b FCJ~@t7w {zA+L5X '>ETIij hOQDAU:EPZlQ%vc }q׳x~.͍IΜe)n.afOezz6Pf~\t͡31"sUJx lتWo b׿K?u;>ν_W~X~~^PGBItryue~~< kZQ vAU+ 1*m>>WW_D~Tk0ꉈT۴q l__0?ć`? FʛSG~Vw;vWV ^ܛQ[lyeE*5G r@ xɲhjr Q(w\(kW!``5瑵T5`c./"H ^=/3}MV۪W^m6.VgL E5W`!J}y[f9;y:,^='j6 'xnwA58e, jɩy.&徻og)cu$]D :DWqC)jO&tU|%~[,̷V&2|7Iv;GDWd 2J3VK[|p+^Z”W3u)"RXcۨ߅u/j)QKAĹwP. ҳUW:uj^\_?|)>W1m27xE? V_9op M,-bW'|vU_M/#}L2쵻rT{PG]+wnb7!~Ư!'6s-5wP~v#ˎc0::̭\_rWvl) Pp.2|5EØ+[/LZnr.ZeuJ|U(wUӠ*x"(? z&\yn0/*0Ɣv`w{u?!x3TňἜ9;σ?޾zXȪ@%gTt{?՟c63WoP??G_L-!|HO _|/sv2349~D5 H(_k?:jAۻUvSD?P!;[AY, zxUe߳ qTP| 'pU[\|GO{ךYVx\9o53I;^.$?5/;u@9|@(̜`ѓ?1bm/&$5/Wmg` qj _>l3pk- o"1|z6W/qk|x#Vs~]o{[W_'z1R?ܰUxcշ] 'r LahUرm3͡~,F >I7< iFn&N4@6W<<@uShI>M= |X9B_3xh޽J1_WImi ޶1,z¹Ny BJ9_>'F I |‹ \y ೯bo/J ^1!]x9r(;2s֘FIm7 +4D>+cxH<ٗ'ycLTr! &w\ZA|x'OFkݱcӧ\ E[;3CjYL^vXfΕ}sz&#i4&SYwR^=AW( #KD{I>#$$=tQa.m9#"ϧ}of"~v>IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/000077500000000000000000000000001366722712400220325ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/btn_dropdown_off.png000066400000000000000000000005631366722712400260750ustar00rootroot00000000000000PNG  IHDR gAMA1_*IDATx?kAw\7?? %VJRTDR\B'X\)t%8yoBP7q3pS0~G/KoR턆} )%a:\L gRJR؍J)bQjutR/?D"A̐uBFG~ɑDRicq:yV,kʐ'C?NJeY.b# .Z[-;:4i.ek;$7t Yĵ["Dַɜuc$Ԭ09\}xw1?j}%l>}ղ%8{ݝx;]Yоs>A￱}W\JҚՖMI^:VOG9:}Z*aE ȲaY GqB&I\(8qQIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/bypass_on.png000066400000000000000000000007121366722712400245350ustar00rootroot00000000000000PNG  IHDR ugAMA1_IDATxA (٭\U4uD!jW!~j=hMi :FPiW7NOG-P+UV=j%ۿ~z/sG>8?qLg!"6wG1c"MhlpL+9Ǵ)z]g)#Npy.xK\+¶@Bݚp~Vz_y[gm[ܝR8=FF'R{3r1¾,a19 9 ߻]1M:1x\{ om!~衛^([/6qLUX[ a|m/xr?X0ڲӇ;{{>Gǔ?d1IYIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/deleteLayer_off.png000066400000000000000000000013431366722712400256320ustar00rootroot00000000000000PNG  IHDR^ WgAMA1_IDATx?hSQ;(8p ZCiNATR0Ŕ:H Tq(bSQ2 \!L!}/IW!=ι˻UhX|`|lc0k <k5+YLed*k.Dc5c&߳olɫx,"H4H4mso\r:\n&l34حcػ_o*BB>$u/@_BWݶ Ut3oJ:.Oiege5N6 Km~dV}!TR)rRvT>̩旘R T{`vnGGGom ]:ի*Nzf]τ_7ELL"ft¯X,: $|;IAR'u$&G־- tT`Sё~`-?֜?xH>rz9{|ʩ?.~}L2%ϳuzbXt>wʩ?.~'Ux۷25Ft f ]ihu흟 ێ,Gd888huO`O!kZQIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/deleteLayer_on.png000066400000000000000000000013441366722712400254750ustar00rootroot00000000000000PNG  IHDR^ WgAMA1_IDATx1O"ADmM$Xl B+cIal \B(,L&h@_Nαaw=%qy7۷ *@bQ.m Q.Nx_F\̙ ܕ89Ql4l6%`tx9$jJEA\6j$"@:8"G:F6n6tXۀ⤪7%C3PEn b007UsضZ5EmNg]ׇш8ZtzB*P@VBm[ 6 ąbN{?;]s^\'J[r6]Kd\d:Er\j=.c~cL:$0)yzݞٶ//JxYecYf| hՙk pݙu:B< φ^^Wb1C}k"d#Qk>CZA2 Z-~R: 0,qtDi2Ov7/fȿJLԺWeu$g+K>[o}bۅn/^%m;^ EΘݽlejja%w1EDt8"%ki(i2:7/^ۤrCP]i`զBAzZ;n#:! v˕1'9WV2d@ٓq ]M-<|@(l9- byJ%,>k<8Vb'׮(YSWKM]-Vb\IZysK)z7^Q}OdTpEcL%wOuv򕲾 p,Tg}N&cYmRt5(iyƆImZl[bwfݽ8pzC,ug^mo/ P]OOP[wZVk?MFgBwmMu[6~2W-{mbç&ܺgsog8_̢\޷{mbç&`p$7ظ}SLϴe<Ɗk Qb371}QG%^|s'$LŽo"_3!:.ۘIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/editLayer_off.png000066400000000000000000000012361366722712400253160ustar00rootroot00000000000000PNG  IHDR^  7sRGBbKGD pHYs  tIME  ɡӗIDATXKq_OPY";zXN(^Da;m'!"٠8q80:t“hb`fP`D|sty}C#S#]|=*{~ށrT>EQPFz G$I\'7I }]2 S_c}>g8g,rf>s^YH׋>a>^Zp&/=%<8j9z__ߧ^zV,]8዗.snݝefQ߶\s\ۅCFHsd3IR7{ڥYRa/"縦ցeY䘽;o)㼨Vl&X: [O-$hqfF4{chɵ]!˽ɖ+~mf?]Vhb'PU2.OnlOr(^jio[y{oqRJ❊ {K]AIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/editLayer_on.png000066400000000000000000000013021366722712400251520ustar00rootroot00000000000000PNG  IHDR^  7sRGBbKGD pHYs  tIME  vBIDATX?KPoBfˊ۬66V #"3ej "bHa؈~Yݎeq)ַE_l!{ɽ!SRQqj]JHJ I)Jxz j)HQ:VI"2FlysY\[\Mǡ֤;d vڔS稶eN)W(C#1;:>J|#t=䜵.ׅ8*#wwao/]wj'r[R <,.*kz ooIJjPhun&m;+k'swO}[#md[[X1pwv{@"'WZ-FDXd1 =eL\d_.^^R9mmIBрHl4`{;Qkgvw{ydm|dWuGj`4jסJ\^/}2R|Y|Ӊ1MDj<}Ǜf,Ub;wޖW#\?jR[IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/editLayer_over.png000066400000000000000000000014751366722712400255240ustar00rootroot00000000000000PNG  IHDR^  7sRGBbKGD pHYs  tIME  9BYuIDATXKHTQwjH{PHP!*f @ -*a/4#(]Xh lcZ0X4Er'Yz̽gz_sm"k1\8{~=\;5 9IrlߗWo? wKo4VZj7}>x!&"J[)2cI(]L˹fr6쳑 `ьy[m<ଳĶ$Xk~GQfD%M{{j'yvMغͭ62 {/2&TWCc [[((-pՇj\szlcPU,/m߄jШVykص}'69YFsy^@ w2ǸugtCT5ҧÖWBU͍"w=Xe]E<}l*^5I\xjUӻƻw^G9>K>>aIj,y(7j~3 >slIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/instrumentTab.png000066400000000000000000000371171366722712400254100ustar00rootroot00000000000000PNG  IHDR"[qsRGBbKGDC pHYs  tIME!dKV IDATxyxU?՝@$!.f.AGQsu:Ν2, (_I" !$I:HNwg!:U:zϩSUʓϾb)? Bo!@%ۈ uڮPNuUNGEE{d |9zĎhώO6#~q. rW stA=DA!A!AHAH"A"ADADA!A!AHAH"A"ADADA!A!AHAH"A"ADADA:N^OqFObEBTu冂 5AHPAo1mFAL& Vz`k4A FqO)th4X,(-gr˟b2jOʾc6-_XfK~~w(**.T˙,א1"AJAo2mFAO>xB?Nh,?*k ^GƈA*fdk x\W<"A u\\|xF7:'D+/aڌ K\tAͮ>-{ܞ.kO՝?FO'z!'_ݓ “eQ ;{LOԯ75"BkEc-/0\ȫ/?Ï@bh4-khtZjmT\X\mdŚyw X֝&HL#B$  "D Aڛ=?1=ju |;F;߻{ C c=+BEμ]}çƈCaڌ y' Yۙ/RE/$$THz@BBBڶJE!44LH<(Ba^o~'Dn .pM}M#ȵQxx$fd/a}#=fde r^Mll =z\̙_;JIJ-QQ0F  ٳ A0Ʋ.kN=i `PWfƞn hXX,F>X݅(|j'{Y4%>/ƏR\;7JrPMQ?5uu*:%%EQW^5eOinv)' 8lE{=#BQ|.^(7_C[_O\\555TVVMzz:&M⪫+dСFZ-DEEC^΁v:7޼o^:ld@3`HT`6#`wI6g=lڲ߾ݽũ2SOv$&&R[[Kmm-ZֶlFRJ||<&g>W NB$BBSet,\7fdQ\&O)g t ~5X8(o[ҧRAl"D ;AK|-k7vNۦ^>Z߷-GȶΔ-_ ︕wsWz;/}9֑/'Bԋ_&k}LVׯyus]p(g4)J c]9ڦ+{glݡ|x?qvn˭ZxOڷC^]|ٮEzM6(ՙ[Z1?+;n3k'.;'V Y[mѺ~ݭ/kJ' ϮLj=tv]~"DLZInD]\ҲH%k't&iϦ;^B7Zn}JG^Z^_~ݭ/Eڕkkyj=ޝ _k:{k((N6Z^<3KⴝbK_goq8ֺ>mZG[Kѿ^shMko˩۷v?uUޝ ]~~իqGO) xߏx Bd}i WhAb'qLJ:Az B$d6X̶׿lYSz ^TTHR;,5~׃̚5[jEmW_˙.gϞCyExN1{֯yu$u7˗7'D+/aڌ AB|IĨ<&׻fVF\QQl6Sxٽ2j;'e.0pP2S"uHj8S8Up7T_=[)?FPPpDT6oqHx떍gnQ>G]3Ei >)Begٶu#Jb.Éwyblڶ/.:&8]?%LrYy OtGSeS.krƌKcFF#455AL22>x# f}˸@ I׻`Nm ݽɳ]̘22`S?Qh!rhSWAgyd2)//F, RE >u٫0[aI:95S3EߟymNNO8ѥ4DDIxSzOpG]N!> EQ0L=zGRWWGSS&R"&&˜fYD0H^F>skؖÇ0vXN,0*t~2 -!)-!-cN_.fvDʔXhK$d4ٹs'yyyDFFOdd$PWWǹs())x><~4;.} ZQ_O묫a2Wl˫V̢{u'""<*o{we?xٯ{N_.:]=_rTUkyɧl'޽{9x ƍ#%%Fdl6@jj*QVVFTT&^ɉǨ8Wh{ϙttbcJ]tg]Nzg#ロロ?{) S۷n~#ESvזsEN~JNN&&&:j5ZC}eyL&hpVAw'w$D%%%NXbcc]1"OkʓQdfIEfz= LZMPPjuPӕMQRRR8t uLi %EfgFyўO;Jo7|=eQPKDd`hj%_|o^7FD ID$BXPm<( yD )8%?~:(ƏOnn.(t:(//gȐ!$&&R__O~Zn9g]ZZ겲2{rT. O6# LHD3 I6gO t_qqq={@tt4 եuZLdd$!/@tŚkxL&5z$h?) xp9jVEVOpp0yyy9X'3hdY_ x Sgq&OD[IT;}l|c@Ḣp7)0"}ՄGDq.&OV[=?Of2 N~weF6 2_h6Qvf,#"PXx%M۱9Q Dc'16*9zن>@Y, m^KvGٖn֓~ܼ=Vꬍ˫nw:k#׿ץsZoZ|rMX,nkUY=׀#_6_8լsHkl~mZOq(,ʜo+-"m]wlZYYcmٯߞiJPdmt:5m U`m&i?x(~b*k}ey{l^G_j|imo?͸NuNWgmdQ|R,_(s>֭3gS'4n?wi?N|CM ewdmbMk᰿S9]̺w;,Cg˻(s-[ٛͿ6fk[~"ch]קo[~]BCٿuyAb6d]-Y\4^wes/{C9;Y2햩ڗZi?<+R^Q+/]&NWPy#8tMww4Gs761!\Ȃz3mF"ܜC/+'&"W/' J=~ā} 29P/AbBEǙ0FDKAhzpxFҞV,_"W2MX,iEOAvT* Jvxl6s]2kl c۶Xmo7p5={ B QfϞ5o= xn߾AmA:zGh%'AX|IH>G1(/ ui`4H| Bã&fVF\QQl6Sxٽ2j$R`SSQ:}FV}֦v/:{ |&8Up7T_=[)?FPP0_2Utf:#  L/, ER*7|QvL #QaI>f?2x# f}XG MI׬Cz{Twbs45GLyJ-GKe.kCc#TWWh{JBɠE>UL3{]Ar}ug"ȁ6_?bY UMɝ>|WaPR|l%Y"tYFLm w:Q}]-phx!&? ѣG9z(uuu455a2Z-(bbbX,ĥزk? 4|sc?c-?K]EƤ6"~2BVS}^Ifcr;+JH̉o69o&_rg pn,~hK$d4ٹs'yyyDFFOdd$PWWǹs())x0<4<|V|oqG1dϔXhK$t96 u?,%' wVpkc<9k ?2(}R' {rAƍGJJ Ʉl&!!T ˣ &^IΉc$+d$pϙttbc\=zZO>ek kӄWr1* 6PHk |z7cHg}n\i@-+9ĦERQYYΝ;3f #GD`6( Ɍ5 V^ Pudi4NVOriݏg!6LSX=mS EDh2FMMM459E?s 7p`0\Z6 /Xœ?W`DX\n Ʉbh4Fm[.NNN: V%l0΄E3!@},fFrss=z-b]RRRt6 2~ c tzFcԁ&ǂIM=hSDi2/=ϴi's6FrLX;ooYMdd$jqD@HH< jdOJbؔ_;JIJ-QQ0͘L&L*..vIWfˑ#G8sL+::"ppN @hI5RRRcL<&Dߢ{˖6͞\1RRR1^YA$-wJ]}g:li݁lcM=FL&F@AA 2fN!i GX_1>bqj *DǷEa2hjjbر>|EQHOO'((&DF|#MzZ@DD S-ÚDhdeM x~BϯۿbZjkQPXa0l6YEĉ'$"!UaMs]NLUN0 HSr '鈊bRZZJjj*(NFSRILL~aI:rLZyMӮKo<Ç2Φk&_KpH({siSyy9C qIד{(w)e_TGiyY@4V4i?~Stt4&L@Rj %$$ݮ\]SNp & HًP ^>i]۩)02 D$"4km 746 t_qqq={@tt4 եu`WLdd$6AOwcI| %Mr{nKofX_yCcgOw)g9 p NDjkkE:4ZJEhh(L&ؽsv[L{dS[ iI>"1yLL&;w"i ;?֙* EQ0-*,&O$$&a,/s:7z Qqz&ZmAk&]3@HV>j#lEQ]]=eDDMhh(f :555̈́ENSgqb w< BՕe>yn ny$*A"*2~|CI:5SgyS$ ,ѵ 5 q߳zVgmdl[OkKm;ZX:{EYpgGG˞ MV:k#kNn]m_ٺ<](ӺMVؖm@WhȎE 8,[}<@n?*ϻ7J⮎.s egӺܕ9af5KzS[">mԞ}[q~ ~$"Q%m׻ڮ3dmbM&'[yl~ש _ٛmXm׎ |:-ʜ";~ #B'łlz2絜ٛXumV~)gk2`29ٸ!oWa,ض8]=+]>O> mņwxWTwKL4ٯx"G!!1 A&vQΑHU$&Ѓ YAo\Ds~DC$e%9rxߕ;q`|C4lAB7HLH8&^݈3cI rC.QъKs x/"AM\FD 23w\ c֭NPs eܹnHf f׬+Ƞ i&4._´R ׅhn|`b7RQ^FEy h4?AGYIqFG}LfV**ʨmw@Q:}FVřO!DֈHDw"JA1;! 2r8>x~E̚5#Gdbe%' Çcֶ}qi4!)d/N:$ڣ{1f?a"FHss3MMMDDD4x0SLO>ȁ_Y2.P=C/qaa>&G{@ ?[#KRZrillb( *H\#X 3hu|sk\/ED5]N!> EQ0L=zGRWWGSSo+BTT111X,Ƥ6"~@MEr6r 'ӥk-=X(\}́};lbeY,}%2Lܹ۷@||<~4!ϒ3~(gڿfRNW׻8Skyɧl'޽{9x ƍ#%%Fdl6@jj*QVVFTTˤ ĉcT+{Lz:}3$Hp\iӺϜCjPT*ܹ1c0rH4 fv($''3j(Z-zږGtlԅsx,D薝?W~7a20 8pFѣ1L.YOdbbbCVj:t!aWVY GYY 0k1*% QoQ\&л_OE՗q6y  **++aÆKJJ2(+-&)iDEl6c20ZHj-q8FHH< "F"D" 8o1 444(+/Dhh`0~h$44NGeeCm-ϸcB$KGwvlGSScǎeH:tKy0477ĉ"R;j!ӮKo;Ç2nt:QQQ\3ZCBٻw( :"2dӯ_?z=Gk؋PBX}&=Mhh(j&MDqq1Ǐẅ́ PThZBCC aՔE+_|A.R}Gk&g谑/'..*++&==I&qUWqW2tPF#Zp!/@7/ƛ9!]Iex$h3N:ǟ~µ%11Zjkkjf3*P1L{`1Ӆi5 >ztt}L: H4i߿ֺuJBQF#g(*,S$$&QQ^toHHfފ kkHw5Q¨`Ϟ2""‰&44E}f"l3j8ayV2"T]YF쓧vM0њm.DV1#WW۶]Qk?}~fuY5 mӺ(Ȧu+ݦ,Zay!sQ|<;Sf}q-~{EQ9gc|7I׬Y9[6).^`Vr5OǼN_n: ]3|5YXﶼEή>]Aa1]it%m؎v[WZٛߕu\DHw.L s1foniٛl[.uaݕ92]cfm]ٶlNbaW.pOu.aͯe|(O> mņwxWTwKlW&/T^=$$&$xi~;(A[Թ761!\Ȃz3mF"ܜC/+'&"(+9͑{܉`4lAE!Z$&Y$} nDԙ$Apb\(+n#˗ANDRz ^tSDd65kԊ c۶XwfϞ#Ђ xٳ"# u}^A˗0mFԂ u!Z[b$fVF\QQA#> NY#"aϼwyn|q[ OS?x$5S5O%>>P~D@~>U{wGr-\< SeS\6ɳ]̘2g<0""yOUsy999L8e羨D5s-O?nc41N> رc]#>h,0#S:":o;e,[0LLKݜg{ؖW|E=ƽ및#Znוs_iI-e+=bvһzu{~u췻tyzu'݄t  WW~)uJNl:Jw(JJJƶ|UZ_|WSgir ݉7w,vӎi2E>999<=R1ڿz% W݄QcDD|s_=4&QFaԸ.&&FH|ރ_U:Jjضmo67͛0>*Mr;뮻뮻vWwӎꤽs_A""tfu"##;嫳\"""?eee8yvC y9}L^G-y/+O_z< H": }@9^+o=0t| <N}kgBE+(8\3uߊ(,s>m2=szw[j߯sxqbbQT;_/~0c9m˖>HUUĻfS@y?F Ib#Fk $$)^I^QEQ6;&O\,(Ԥ7j<n;OZЀijҳ`^%4hZjuogξ>qcx7O_-I?Jss3yH,fIRTTN(@!88(jե=2231\?cU5t 8xf8zkOve!Gk#̻Fۺ)-=``0rĄxyKO7MMMݥ{`Bתn-wl1Çҿ쥱fY O%~3&'{ ̺aY?fzkޏ,{&޶m۲E֮ٳ~d[.*.#55018i tf^ /{D(0""O BԦqvr_wj۪( ?a:>eO_/=C$1bPP/CCCؘ.e1n։Wl˟~' N};vq_Ǐ#B#_yW,Gm+6doÝW,_;`~ 9rx InBx AAA444 X,fkȃvQΑl~/ w9ys}y{^iyg#=ͧbȄ+Ao#H :!7TUS[SACC}##}] rg 6.h/>kQq3 Ԗ;+fB$ "@ H  !D@ H !!D@@ !B@@ B$B"@ B$ "@ H  !D@ H !!Di{"_@ 9#SS]ѶTWx

k!vZdZd2$'/)WW\M%fsuXlP#MA{Bn$9j_ӿt/Պ}WM{Sl6s!Zz1g-Ջ= ηÝ=n^]e[i7Fw;zuɝ A(|@E= ^yc:ӥ|ADxOU*ygH'- C F}ힶy;_CEeMB 'Ļ] ?yi{{ k&z!D@@ !B Ĺ?8@ ͏^nox^zu:F@7=[i9.T@ 9YosO1"225n!g;'< $I U 1ABCUڶJ$IB b$PT^o'D$ʪjQPYUph,D3tfox`3]1ov;-t=g- <\y {Eo89~8999\}\ǧ().$%e +I"#lX,f3ݻNX,ƲatҞYftMdnncXcHĵ?M"1&Mב6eSOO ,]¹rWA!I~9W]G*󗗗GCC111X,T*:^-@<~@{8bqvn^\{voNGrUj]f ­,%e@M=Q>Ж^w֖ܹk VQ a+Q\d2a49s N"66G'/ u]h 󮹡ӕ/S  .pad⊫s chwǐw KWȁa̞qS^^՞.@h5T)_)gϜC3NGdd$&OAb߾tP^^IJJ(F#9G=3sܩ')s8; H9sÇHhbϘ1cɡأ==inFRa ||)n{3s)=Y>ОZ_|;$BRQ\\\.gr L&NرcdhZT*ٽM]J͟ԏME(X@LPE{tw0){|U>;F$TW믠mh ..:&++3a.2 bANdd$fl3>/ACʞ0x3% C%A{3|-{xZ=[[FG>S&O!))zjm62 JEBBV\vkٚ=={]]gJ.) #{Z>g- &6> :-5/ڛ麷~wl!Du!K̻[m̻Z:[^ͯuۭ?knCkiw|e~BsH,yAjŮooivu9?g>l-r>M[ufCȆu\Gmr/^䩩:Z=>f-ױR!yv4/H}U!ZT}:fZ;i~u`'Xɦ~5wxZ^䲵#4=xo6|! XP{ [ u›8 ɵ'}#7Z>k}?jEDŸμ{ʣs_ku߼ko󚖯rvo6oT+ T W@!)DEWƅ2 5CxF CmFDM}0@ H Bl6+v͵᳏f^ɺڦL&g7Rd2R?9sR>c7=d8X=wՔW 1w|ᛞ#%@ۄt5 / }Ͼ{BvbZ JA BzqĨx/M zI &:ѣIKKCP`Zl$&&N~~> qqT޳s ' 66Gʢ=>kz\g7";;xw;[DAwo5%hvIOL&]v1rHBf=$T Vh4R_{4-ү(2l:RN!j"++`|.D F|)B+l>o5XVf3DP0bV@ΊJLL \VeР Bâݎ(jto/66X/ڿxjQ/.Պb$gT(l6F(G.\&G&Iiii>|x å1d ~6`X|2N䋛Gk>mkkE/9""+fs@Ud, %fшN//1z npu.!z wyu]u]:';;GSPGD%`۰lD4)KՂFN\\GV! |?LyE%qqjɣX,V&Mǚc:eK_틖2uV<|?o_~+W=ټ >iԉx~o̿ R\y=j8kݹgz0ᇓg8].˗GM}OR~JNeQYUMtT$Ͽ?p'׬ >>LFaa O?eʤX>+ (/u؆kCFF~1tFT$Ib31ƍIllLsz7\tCVǴ)_246{˿9KZŘQ#ݓ+YjFfNd2ۧ įx$Y#68,[E\>ٗ{g4X*-O͝N!Ě՗v :^$SPXN>~5RQ#8a,łbB]c#gsu$ F#ՏC.DZRǖeBC[àTBC_86oAD˰X,F+?ռ( ֮/fLġ#9A94]_滆؎ _{_Ai_$=m ̜> BG+gx< 1w=Rl'%%M[|ҦhQ*`0`2[L\`4*uO=`Y(((&=} a*""VPj^, ȲOLheڝlݶ!gtWTР+g[13dȠk4 |} o-.)w;I?/2jaa*6;}yr+.UldwVxx5#W]s>$I3DL:+׼h;sܵuoQ^QkW/暟W+9zd/I)A/DW&CPE RbvyYڎA.O }I^>`zlRb,K7g-kV[,f V+ͦͿ^oq?xL3/}} șՂ"=cxY!r“SDKE]BG#`„@Ч(Lj''Kʪ(-OYߧII>ij V|'~}Nfn!I2BUƟ蚵ۏSBd2yE(лf Rhd"R)da44P b7n'::FcJ(5 ZFHu86ʹBrB4 s\iHu8F8#Za6[ 5 N- m<a&,+r0] ˥7aX6BBnve2WzMZ2TGT*'$$-/(˼ϟ1]1f6[c܅F!iq5/住63bXr>;<}BDDhXX[pmFɨu["%9_Skꉊ_l⶛;2ẫk *2_}9\MaoIV,%o Udټn*WyMTUue6[FgsaW̓9{ƹ?)ޕBO2Im̧r<j_(rɏ2k5"jJށ_sƍs 4uDkovv0yBQjڇo?9c瓤kMx/RU]f ۇ?eFțhbƔ( 6oy__xn'Zu{IL&#=6v=vH5 j۴˛&M"9y^lMKk5Ad4v5[MUMV BmhdW͚A8Yk7 )1Ciȹג5"g0M>{iSƴ+=!r~~|~~|n'msҨ7}d4\N:"$̌TFg !vOq1TT`4:-&s3[__"Bc'IHH\?PƍƗ_C!T RdbxTI'T@"_\4͆lj!YWv޿dQV^VzdwXrJ8WXc~fv9㶦9ZPVʩ37gp'ڴ˛ ÇeCoRTfX7zPYMf.\,f@$v}skxL᥿|rFµgbXcًJk!v+\Ǟ=W>@csN2kƄ6P%ƹ IDATO59.tS'yۚM^'Ǝ0LjuXXO$?sLf3'O_<(oȾC'/pN0n[/V>A-*V]O&. ۽tR`lJv?/$I!rfK~;DR__tW {ҁV#8J+`śv{Pu.yDK ? k&˔Uq/vx@O)-/W ? dXxT #$%ψ(I|Y }5c>qz7"j|#@ h -6@SZՋAFDv ݆L&^#82Kk̙+&|_oz\clܫ @ )s^zL z.?%@U֮^Y D)}]V/(f*KWLBB2 QG 5s9d83 )6v6**Js'0H*b`sC9FrT͘CzPrԠom $Ο;͹S!DΈH P]m5Fޙ Q򕦞QD笎0`0XG6pJ:}.Cfʌ%j$ɦD%FyMa?wO" +c^n[R||M}] &+l5@T5S|c̹ HܦNsT.~`S@/ˀHA߲'/y(=_b6[&K"t̺9:ȘVڪ*Π;rIKp п<(Cٽc ~KS /?<2̙СÈjQ]Uټ3|w09c1i]G6˚ۻy T'bb`20 (""0T16#〗N %W/-=eaqXAʀL:|#|6c#${&Yh=o.P9+\l9\zQZz=vId(j/P}f _j8}IS=ج_˃˖ޓԷbZօ3x6 h{&Dk֦ n^ݹg}krE8|:kqqT6QHҫ$IAF߬C~7ovk(8WW>LFUUvbȑ :BylIHMMeذahZF#؁&Sc4 ǓŶf_MlwM1V0  az+Olov|ӿ[;y-_taJ\J q5XVv;DP0b6ovjj*h4j BX4 22薮ӦMeQIuCD$3O˟[u'qIM|U"O+/W^rW< Zl MO0uT_6l6MJb`5x Ԣq~N>mn7SR(C&]vDŵ8mrl{yf %%EجV=O6) ktM9 ! #1Mq֢FDU՞298^b2CL%HDD4ivƎȈc8y"S, >BBB%ez=KW9P*-'65t&4z?e 'Lf<٤ݮ+?"B+Qw^# ~qiWRz>5hCדANNYYYv2e_ovǵ?MZF."u}(BCüϴeSS5TUU̦Tǧ().$%e +I"#lXVVpIS_v _$GfѣGpB\+::"ph.Hs5ˁ}fP-ʢf\;0rV+QFq$I"++Y,j>z-Acc#eOIK$p<%'󮹁/7kodۖ]YvlEBRa6]69EԩSͦl7DD$G'qs$ "aXt:3IOO'<<ItiГNRR DEEa6I9z8&}|) gW<{Gbt&M2Tž}=T^^l2="%f-eSTq,li7S;TBRQ\\\.gr Nь;LVERn&֕zboRMEqA3]ihی̺æ "7l 3 g,_aѢ{ŋfws`h4b2PՄs;2POf12"M[ۢk0]rJm<%J盾`)$%%Q__O}}=Z֭d2T* XVrssٳs {V wdSshvP?hkw$#lt]zEbXVvMJ L~'?Ι2 IX,\,( ?f&OCw$&`)/iqm[6Vq&.Tэ6y` t& {K'::J$dQW5'gVT iWVU/FDxxUPzQJJˈǓO*]{|n \4g.0qX<0gwϼ؋<6C }~Q=9 JOeɲilԣR2yx.}hcFwOdë1MtõDZd*BrxyξހdO=@Ii93[l,F_?/IF%?E_7z J$~k~z7\p+gc3;~K_ uW6|Ik)X`0ȴ;V0쟜HqqHYy;0T*Y2V? Uhm!4Tc޳%< Jj~u:w]'""s+fMzg_o;ADDA]/`ˈ~qh4ZJa*bc0 Lf3qXT( HIf˗;]Q˃״dolDSڕ\1k-Ҏ26{&j~>\_>c2JGYZ+gMK_,""!DoQLSnŐ ^ F7ǎWLƇ?zm;1|z<|q)n_Ee>]>0><11;1`sH6%eWi{Xxu\u 6~u?#66{ XOLBzJڮk"ÔlQG>fŵ #^{izC|uw~җ葽Is$19P mh+j@;nRFDK]rm3+^# ދ'ݸ^͛'#|ƶmt[yAh@S͛UDL g׬#Am@ՏvmBL@@ׅh.blSQ^BEy j`IHH&!?H,w͜da£~f#iݳ4_pH5HʴsHz-wΟ;͹S!DΈH P]m5Fޙ Q)B.1 %%>}F3elD$,`p0Ο;퓴LA$B%پm#EP]UtNʥҒv~%;6 QzD$>9TV/1^hxe̙3CjygarsbҺ/,8BXӅ%'u^Ⱦ8Cv}#GOdٲG3vłd`0AʀL:|#|6N205ov n",,\8D~!DB㹇9zYY_˃˖VS[[^n#I2 Zͭ og!lX>fcEj5>ĤW"Dk&hIv~=KXr$Ijrq?F`0<*I`5췳a8>SW[MnA2_Dt5]dA`8gO1e9"!ʮ]رc$$$0bFMzz: "Μ9C]] gYTxcZl@( Bk[ݶ>Axx@LL JN-  >"1wi_^0 5?!}?*%>& ș3g8uDD8D*<<3no7e57`ۙw `PD359ǕΞ9Ç=f,:H&M2Tž}IOO'<<ItP^^IJJ(F#9G |S 9Cr*T*rƏOaa!'Np{رcdhZT*ٽM]WQtOMH 3(cՕE+h*bL0.AaXjInn6[(tLFoV9ɿp~M_0eV:f!PT$$$`Ze-` Yѣ㨿i/-9~֝e2$aXXP@A~>Lz 1)ڶeD׬"x}r}} Y'!Fmm{Ntt4* ILNG]]!raaj2ylZ '!_?}Dy~*z#0i8Xgwϼ)X{|n \4X>5 *&>ٸUh(OYA||2~%W:_l7s^?q|h ,_ve卿hb}Ryq"ÈNᯯU-cpF:յ\/ 'HW];sgs9?KWR\RΨHĜf\ƎILt`G7p PBl3M?EÆp5scɲUdYn>?7ǿ^ ~kàT,{7OrRu'75bY ;S*Ǧۉ`epݿXPkllnG ?Ecc#r"eX, F#eh<~{bg k&qHNLAa1Q3k")JV?Gԑ ""ꞻ#"Sc0rtf͜R`%$''2窙Jц\[d̚9JŹ)((&=} a*"BQP:~Ӗ$i']mdي'XmB~Xձ_\+zpV=\#""/m@IDATO7[Ͽd݆ψ//!C4=,:Waa*ֽյ啿s!¢F >Gٹ{Ϙ@qI~q3mm~q9QGf7Vyўwkç7?͓׮^ :Bq'+9zd/I)YtH.vc75;j1-|ܹW{"GNߋAm@*DkW/f.DwI'Aw͜da£AӜ;B䌈 ۶nI: )|%g>IO$I.` i aw=" ONk~Ew{"oNo\| *O3na9{C镕1kPinYp\-eee-gg;A6n8B |J$fz_-mcX\_`mʑ#G5jsυσkѹ 홉޿-Xvjjy>狮n-ZvN-:qב}}5!'t7 bϮoޝ}]w@;gM~o""Fԕ&deeymA(<\:_<@""ID{{kEEE-:>fi__|OS{ NOz;ёx[ {pZi[{yD(BwuwuWчIϻWD=1>ᩛ9*}qȗw_>芨tQ4uuuB$|ލbl?܎FUZF&9{Eu3gd̙@y[>mLZ}/oZ?ߝED$()..iIIpyv͂Cݽ~'OQc}ѩ4i9 "T%Gr |TX)bjsoڿ!>]3?Z#A߯wUVUS[UBٓ%zI !HL Z>=E'gח#[? Kxr ds/SFtt5p GmR.ݬZf#f>aPz*K=Nc*#I?Hg_9c옑D}R&>XoԆ߮fq,Y7^}/gC3j{r%K^hb̩-|(]5 YgLAa1z #RR*Y2dhED;"'@LL4W̚FMMF滥m3mG{Z(O3<r"e+?{1 65F)Uy_Ai:~quF._ê'=*j5 & dB_)us>$D$-nJ5|ev}`oR[e2dqÌ 3gq{w~1>4BKc#dFԯ)]YwTLb7 nZo˫/zAq|w""69N=Op26~[aW}a\2d!_}PQQSg۔єnkǩ؎!њfɴۉ?ز) oHor_n}#j'.1yU۰i>HJNNk?7S ,.yܜspu0|>0fFfJ Ξ#dflGrfy\X>SgS7LboR["C=z}}ښ10ęZmxS@m)Ȼܜsөi>эrnIMR1%nzAX8~Ìg- B6$*ֈ(9!4Gq"1Ao555a?1aB0Y >onm,8x"-B*:"#at ޾Em KQrB$ $'DApjixOk\]33z4[d.f:`iuvn6) Ӿ٬Nid7㿋f&e+_1FC2 w+;T_aa!ƌhVΈF:`cw#]U6ј͢t`2DhjGͣ|LkrrrXƜ!Lxjֹ*֘jgSM٩&W>^3k.*]?;X̝;WÆ H.uMZI1;ۤ-JК3UBBBݻwfϞNbv3TYmim4Hi])Yl_Ϙ\3//X XQFHd v3w59k6)fNCb˖-z[y @SEDZsD\#44*#HtlrBFd7Kс#yzH+\\pD-SVV1H$"GDvXxf;l% 5fvv6Nڡ)obʔ):`7C\%tu}|\tPזG\=G֘O v3Dn v#Q"S7^#"f&?? ~HCv(Ԭ} +_M`(NTH4Hl)HyR,+gV,Al:HF:0ҩYqC!zrT{nD{ENwTZ-MMMWTV)ZVJ/-+0pP^Q&u*tYY,BMm-dz99ή' 5?* -`Fʊ'GGU:)t -,F}CsZ蠬:qa}QCp~fΚvn])McUb# [L.CltKkm]OFGQ~+VVBrqUk! ڤݽצB -'} -* 8b(bQRH[9iQ1\opXYY?hύn$G{V^ 5`ccs܅|_nߟ>[!ոq/uD!/]?$/%Xa:C|\> iQ1ňXW?WH?#ia~2 ѱ3u+t}3:֏y\yTR|[_>pttPɴ(' KȱXi)Ǝ Z;Guu .G$& , ˢacm͊}mm>z|}QT\!:9^tyޜ;gÆᙧ|9]}ۦfdi׮z\_!<ރAfvC$rBļY7 93[I 1ocVXߟ>TTWՠp -*AwG6gvM ?"6 1+**q*,fL 1&oQq |w sG?0b>K5֙u' OSQU] iQ1***ڻlm)i;G4}i%xذq^}MAWOxq߆M[AZTprB$^j⒇9W7(>[[TWhL7xѣd<OpnuDχP `5dhǒ̌HNݬ7W1ͨ1؋.K.@Z~a80 jjj,CtWoݏ=M nttCUD] GnbAX8~Ìg- Bgegk&qAL A˯h"IsAt m;p0i iyTHoD-3ADW'atGTACj X3 =6mG (({t( BA_ځ_f&0#=Aw#0JIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/instrumentTab_top.png000066400000000000000000000006311366722712400262610ustar00rootroot00000000000000PNG  IHDR"C-qsRGBbKGD pHYs  tIME  }IDATx!KqTʄaa 4,bXj'0ˎfa 7a^襁lPP3?;P,m7I$_Eaq{)`oۋ(IHZ>v[DIRוĀrO$*E/"7l"E."j PDfE|յEXD"E=`_D`ȍEF,xחd݊hz|\b'~V?싫4P\d#{Pu$~-xIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/instrument_show_off.png000066400000000000000000000011171366722712400266420ustar00rootroot00000000000000PNG  IHDR6%sRGBbKGD pHYs KtIME &wIDATh+DQǿ40(ƒZb!!B)E! ?֎Rdc),8oxo$yS}9JO@xgO뇍@L鐓?1K.o;+D_6ZɳnCDmV,ohmn8NUB 3!'b@#S,Y& U!#BAc%(E}@1=1͗ a25>,yJCjiA\)~K צk'`o룋"ofjxN%k%H!}gQAZ 4;?RS^gcmu<7oA;GE_9F цZ%d45Fa`**ʇcm;]5=`K$ÃST% z"|:ϻcC._u} IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/instrument_show_on.png000066400000000000000000000010561366722712400265060ustar00rootroot00000000000000PNG  IHDR6%sRGBbKGD pHYs KtIME \mIDAThJQƿkWJ%ьA=D6!"Ѣvip 3p|;{. Mn(ˁ@Npw޹l?y'Cx*ZHW+ݧTRYI\?k&H@dX#u$ЬMiF; Үc3z0'ZhByy6˫TjzAtUNWXEHF&=Ԭx -`ΰF A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ @A @'!uMpAVYN/rҪ\D7rJдh;b5 I @&s 2k}Aҟ{z=a@fb@sGd^ԡ.>Esy qckwG^|^Z@T.RWT\RJH6& @D" D@ @A A"D" D@ @A A"D" D@ @A A"D" D@ 0hyU-;W|˝*ubB s253fjgJH-nT$mݾk9RM`~ϫ]>=[TÀ)'KZ*k5"g_Ğ戮sޏ>I a D{_Gsm#:5| AqkaktsdFsΕd1" i{w\;?ڲuǘ/;S̉.O3\fֳLpv9m 5JNQ(R(C7]o5?9ޖF<ש~m_3ƻ~2Ӷm ۆx6>Tm-5J׾NQ4x/ɮl_tmշkSo$[}}욭'oM&GDSDD6'n&̧1"Z#"IwvHG_m]7ų/KwC?jǶ9R&;'MN>f|#E2"?qӵsh##qӴnK}ϙg%ӟsˈ2="6L>˽~&m-5Z#"# /_*Eƛn>ϥ 1MNշ/7&x g3mDb).0uHL1 $>B|Ziyah>gdw;)}OgXt; I @&sG~@3ȈǾ$ɞ_棣Ipcgj0Xqcάx$ A3e8&x_ܿgXk i}/P,l̬"y,ⅴ=ŋµ575Kڿ~ffB]m:KkǶaJ(8P0P p8X4rb)77OGw0 n9?VTm۩WUsDSLGۭh4ߢʫ'gAUYL,yݥ^hW\KZ[۠9^}*--7g `Z>_gi>wx`pHW08ퟺYˮRž:twFhTXLHDPHGKZWW;v\(/Ӳںm^{Eݸwңx? Lo 'ծ$)/spoĽ#nSӾ}NxS:oKPOymݚj!( *H0 )á͛UKKζS]W?*wS#_2b1>m(˲Fu䨾^e{rbmV\)˥Al6~-]R(TqKyygzF? { tM,Ҡ_E.6>jqA577>5 J~MNUUU .2 +C E"!M|>bQ6IN fzy#"KhDyyyEiӖ#iS4U8V Paa,FɝsԫixRMShDi*//_pPA Y龼=Oh_Q.x<EɸVӰ H`PVRssd)Y<eY,KpX*,,fv?)''WDBpHEKwyf_X|Q ~ YIMzFe,{-)jhhHUUU2 Cobؘh4jmmR,P0i+7/OXTC^{uߌ+|j63؍L}$b1?5wTNe) Qo PCCv{j Vv@CCCr::֦"r:זZ|xCiN\\Rǵz:񪥥EVR PQQ6lؠfuvvZNSa(]===Zb***T\\H$@HeKeuT\DҫL}q]wyߏ-]>8Ӣ%k[KĉUXT$áNl6mڴIzwFVRR74M~9婵UnKE._Йw32K~h(,4.'`~>ȡsrݻR)DK.MKr:+PNST\RRwl6:r@ J)S3h-=߯-'gw?_>o?쇧ٮwN99Hgϼ߽𼺻UQQ"B!y<_~_6MeeeՉ'tyZB1ukSYD,VgxϣO^Ww{yJ?}^J^Zn[RΦi0 b1Y)m7zob/,,kD f>UMWHLW<^<إJJJp8dR8P mq9NI"r͖O+靓oчĈHQ΍':Ao/Od7Ԯwg;XVL%%wDSfWIIrsr Gl[XXk^A؇>C>#koO~@-# ># TNz||Q*J,: %6<*ʗ' 2l| 0X@H,fwؕeoiS;jjii[ w)Z Fo0? # %NYLpٿhw$ |t 0sL 2n{<:hiWQVE助(?;>pNZ @ZKzg֤'IΝ7r#ٰzӟ3GSgm £Ofϓax<|nHڿﷺgz9?9 55zMCyOgZ[&Gu͖3:RA5=qv=ԘxWi~?ߠWojfm.va}ҫReԩS:u dYVj-**R"PUUѨehejoԉGvrjk@]!ь7}L}x<#_eY4ߧWvX,&8qB*++SaAuwwܹsUYYUYY)ǣ p5v\l6;5XD5OlΡ`#g:KR S{[>*@OA}[SCCѣZv6oެXBі-[بP(.Z>PArsTn:488@ Q 4N.w.:$uwkSE Ze˖4MIׯWmmrrrǕH$F\Ruuu zJ$rW,ʪ }M I .~wS#_2b1>m(˲Fu䨾^eG/b\R.KlZ-?P(=/ˊQ^(A4t~dlF CG ܬ85Q;UUU)T(Rnn %d69M$' j@e}O;E-E0 Y%Ӗ#iS4U8V Paa,;Wr›шLT^^ᠬXPXzq1I}G#^Y1 aIR$1S$OoN`s8 SQY(A`I'Mtl?UF QMLӦH84b 2M ۫˗'w_#efdYrm`׀ 2Q4{+mDruҀd\ziXxTTT`0UVY 2Mst ˲,Yp8f D"p8%z;<'+ [je`?tpEQ9r: ^{FRUU oX,6+Z[[rp8 eS,P^wϕPfSL?ab9NUk,n],R(Rccz-ԑ6Z[["ۭ tl[s\[juc:;755 ,[q^NxjiiѪUTTT 6Ya jooWOOVX |>+h(Rrmv=,Q繳ԀD3fvթےwDۏwy*?1 CiQqtɵĭ%KJt*,*Pggl66mڤ;#^)))ƍe~*ۥb/Ly'kN FurdSA *ôҲezq5Hk7B^W^W~D'H~NYY,҉'tӻoS׹6_h 6(拻HlD_#=M6U u?h Α[WVjrݒZ4M31mj?{VJDu :tp[*X>a=w#dLԶ.D]ٝ~Np%wѼ~5\q9  4M-q]*(pDC!#Q t l9VFjxa4 Q5L47M]gE?zz=Iy~v$Ǯʆ?rR;p: DdYGc.{Nrsr g|ֻG\޿ZZVA I n/uM=F$3d'wh'wdSj, 0NE Aj@ ># TrU,*=5Ȍ )@ BYD{}RK?/OD/f{qvhL'  mS@08bjv_UMm#- 횛xKA.V>E3 CT{dDT!ɁXGIDATSw 2Ё}[U:;IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/layerTabnew.png000066400000000000000000000306351366722712400250240ustar00rootroot00000000000000PNG  IHDR"-vgAMA abKGD pHYs  tIME 3na IDATxy|Su7I}o :PYdRd3SGqN\Eg#sGhTERhK}Kis(iI۴I_BON|~''ϽXZr "+s;dPS} D'FQlFQlFQl+Y|lcpρ62wmsH@8iе+Lt6bب>Ut//GD;nf]ӻ8<%uuLb{`pssGD>5ˣ,Nٯ=P(ZpRDF(7w5] / ;:2qscW?qTfc)wwgfMT?[~$69M9HOgO3gA"-^nzO͍hRc9xcЦVu)#>-^xe;v qc0"4Ǐ[urQ]]hdaGЦVuyM< ҥBd>5n x 3&;;RRW;=<)MGQi#dMuFxXVNmp*šQqTh̜yKAlAlAl0kw?r,_{\Al rc>sG֎C}䛼ŦkrY0 - 2"tp'kWa,Ox"ݑ6894$D8 lic̡΁n2{>\d]1>߮~Uc-mdT,6w]m]/ vߵ=,Zk]y*;@},JYX>|111|> /OzЂOڼrd a>V7jos1yrŵ,X`LʇI@ǵ̿Hl:M}eH\qN9mqs5B+Čln`s._]*x1 2Z5k7 *ޖ͞ov9Afx-_5T߂nݼ%)G#(&uzW_|{.Khm㡇5zn_jȼdj!Jbܸq:KR"//5շ:]|n?!̧[[ؼiTVVBbɓ􂏏<<< ~n>c6BW]QͿ'P_SN!99MMM9 u[. 60 @mRƏSN?BBBЪTaK3vûv|29߲ T"Hc%;-(0{^]8-l7_uH!w1(?x 0͛87=qxxfl12}Ȉ0DD#22Z:J>>hj>ܩA);;['ǎSg눉/sg9Aɝ旗Wg!%e1Ǝc_Fk1&)@ݬbC]g,f&&q}ᚵEt cfFm\_ 0=`Ygh~8w7toc1zw:p;K0g,\--BC{MolsR>ٳ8{KЌ6krI3;#b֜PQQښmHYzտuM.tzǜ`Ub6kIw ^=I}]5{Qdggc={6._B|qhw L}vi?ۿE/W_ٳ1fxzzbԨV bI Pю/hzӏqzi k0QUUgB@ H$nlk{20#=  FvCEhA){< M@6M&/"J ձ7n}۷QQQ0qN˱ZRRWw;XDQD0رEqa~ԯM5Q/Ν9!ɠT*qR>:=#+aOn? Wq^߿YQ|mshaA6(.Yġ|(Il9bys0r{ΠRr蹗^%Wgen8՜yKL75晊oL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"b) bb9EilD!#C}K(x{1*'Y!+ 4Oě=x<D$"bD$"bD$"b#(*& FrL|"'"vIDÌ HU>01"dc(+s;dWٚe y$ueB6˿p =Dˮ} rPDR 6H|8HRCX,XzDJng;&O _-tj5r9J%nܸg86{vo9m"I!^)UPV4M翙xOXQ46M0cT9rhiiAkk+N8?oum/e5N?aDRWO"ٺt;{Ѵ!((MxnFCC NQ!-Z2Ԡ ܃SJ$qݙT*;@ю(12:MGD7q/j*F/bES|w_}(:p$e2:$OFIqv&2l3=8 N1`.^WOl)N:V ZpTT^ĉ؟\Lxe~i=u_R\ҫE=o%nnhSoo{|+$X~6 ߘ79x8> E'@πk !vה_,RQ׬d:Mdco#cxPden&#A۝yy ??MM͸q#B6  AxȎ$2> ` <3D0(e}29aA9A8ZjMcCm(:2 |x.c OS݉0ӧetю= Ɵ'~K\?KRܾ}ce2BCRA!oƌYڵ I3}`y˞./Uvo>,/f̼KRWbP((..J2'LxW/CzD;|rޞo?+ K  ׯ_Gcc#|}Ѩ+v-yJ  oo_l|b.\> 555CHH<==@?\Vu;{u2IVurnToTMV+V܏7obڴih4E#Gč7P[[v Ga-erX]!,< Mhjj믿t:n`0`pssCTT$3: U"~{13sFؔʮ`@cc#&O Z}!)) |VG3r" 0hP= O;+V@*BբJF\X|vܺYi:|Ξ9+W;XW"Y3_R\`qgםjlG'> B:u gΜA~~>MrA*@.$0c շo`c??̙37 77yyyGŘI`>+ѷߜSg:ayںFS%7gtR=D*"9Trc,ѦdrUep߁Lkߦõv e!Zs/.΋WYyX kn G  @8$G1"dTΈIDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1IDL"b1hPɌƏGCC-#B}O"LHF;!D)))YVvjj _%RԌ/JK.1 40W P0"ԫȨDFtM"`3B+C|XL"bDDL"bDDL"bDDL"bDDL"bDDL"bDDL"b# eU[D.o DĎ51ID$"&1IDԉ`yK IcC-gJ"ޞ]23ds[ޖAY!;k1DH$w"FzO-Z ޅl'tMRk'ڡ}"CsUx*!r;$$ d#vIu\C|f%:or:|Fr3PZP_ e +PY~< 0oXܝu]A__ڃSU8r0 <*+J|r=* ---PT9(ӽ5 ݙ7VPVěVi60n'Ox4T^@RRߏ]vaC\\, z-<LIV[ E ' ׯD"$''cŸBs~9ٙDNDt\̘y/jL&(v5jd2Z[[1&! Z:7l rnjT&]F\hZ 0%ҸqP* mX&(2pp10.ӛ1MnmD`0@.:]G1 tT*5D0(%D~Z)iteN 'J%ϟ'N`ƌ0 thkkCaa!R뇦z~}lyH@8v4s… ݋$T*;wSN_仦PK'{(%]*dUSc==:˿pkr u8ep:B&QO=0AD"9eǚ'(%%Q>HDjQ%QIed?+߀q!M<2DyAIFz$r!^ɁC 2gR!v>_T.JY+ȡ. O%U\Wo2fU7X)2 6WP0k?46ouI$66#B#PYQS#>> =svcGT9O~%hڱp|/"..M x@*+._ N˗/ĉE=^K`؞cD*-*'hhh@kk+Νh3K.EII A";JpssA-[l2$%%!22fѣ؈ܼQRVhHaH[BXη_ĈAƸqLt04iR)"!7! 0M]wVaPXrr9&MNg AUUڪF`P_(2 z%2un|kϷFiD@"uCkk+J%t:)  <<m|'CHR8q> DQ`VZF`` d2t+tzޖC鯐0B0޽+VT*VEQQd2ԄP[L_dVobcC}9.d>}'O`ZFvv6 F*`?BCC yKnݬ4[qO\ uAcS={`׮]8z(&LQqUDC{aGg~+xtf$O|e-PR\ɦm-M({PU}KRXS׿_<2{ϦvivJ={fى ?xכ^D"ATT9^^^((( `-{ ˎ7&L2 (**\.GCc#Ξ=ϝ{gǶ)ֶ~Q_W? [=jkk!ڵk8arLpX kn %eɀlSg:Ճ~sƥ(g/FF 2dnUC@e!0`Zh_8[.1cP]72lCxXh9ywz?'?keeIDATn`LDFlVZrNzwkDvW"9$ͨ_4\yNNR{u!" Y;D3jX Q"Ȩ_f#р8i^                                            j!k{!oƨрjlEi% QcC-j5"4a C5M  4IzDϽz)+s;GDDN@fB͞р˛tVG`ѐc!"""""""b!""b!"""""""b!""b!"""""""b!""b!"""""""b!""b!"""""""b!""b!"""""""b!""b!"""""""r26=12D4jQZrɶBPƆZFGQ!7sbDFV`TF\ތ1x   u)DQ1 9DwڐFu:螙?dhGDw[84#!'0D4tyw&FLZ,hjj+"pa![!w?BMmFD&#= f6GJ ED@Ɩm. .Y20gRfEAd }x .= E)+t>vѐ"I+h[dU `" N : Pa7^$ )I/{C9{)[jgDF@ގF45I!22^^^hinƭ۸vZZ C`P<=P]ugO LkʭمI#r=>FY4uR HN͙ٺӼgw4?ÙS_`7VˮbD#?5h jjjZ Q:b H`0P\\KĪ=۷[1{bL9#X {Y6gl݀[4/C/Gx|3d wOo t:+\x /A\.GUUЎ^ϴwM 9*m92w_ R[0g+@k/"dYzz۪2/NJ?j [lAkk+-[s")) шĘ1c0k,,]GFII QVVHnyFiI!JUnDdp[bjQR|#"1",juXrZ-r9~mL4 ƍN`r19cbb0i$TUUA*QQhmUC.oB`Pp*46n.D!84ӓ:uףI}vc@η^F_?H z=$R7Vh4(JCә (zӏt:$ t:]NJIޮ_T*mo'a 81ڿy+ڱ+vk5}MeƬ{"dnnEuu R0qD8q?яL{CQM?:Zj L&3=W : ?v f= q`1/B*Aw+a˗/JBXX{nc„ dBd,B|2BBBfzmk n߼ŅcHOc1r퀅ȉEu8>yii-eoq`nL̸AAAhiiL7 H$E^^^pwwGaa!} zׯyTeq ؞oJƖmv ,u97W`/|6Tj||OOOiBT2|=%XahM||ZNKŻ[=f,DíK  YsŌ1cPYJƖm b&טuA|\D2J5k7aLDX>NDWϽ: ??Ь#GDF. bfD4Tǎ#"eby XOD]'+s.Whd"'TY;#O1:D4 9}.-l"0&Oÿ>zN94̞ʵKtp΃h ݗ^ƌG|8f */b4ЯWwz8n3K% PVZuD뀅hH2ݰOwgv \C Wp!<],D64yOp(gS׮`[p47bH0"DUJJJh4mi;S*<= /[Q  Ƭ=_>R뀅C3V>vZ;j 9 ]h([(',˜1cjގ6h4tMM ΟZ(<ȓ~h,N:`!rX=uj ;*.!Ǧ6/A˜$,]0VT )i~^K.ҥKhkk^@eee|111xpsX q uB4="K9[7 E |'cނX7ng?݄(H$;v 'ODrr2fݴ^VEee%.^T ???`\X;s 9ٙ# u=YNױpcD@o~<׹t1^*Va ^ǁp)<HHHL&`t4DQFaѢEdCkk+ $hmU`Bi(tz`/D]lIΜLlFZm;1"4R mj4z$CѠ>}:Zil0tW bܸq;.RDR)L憀`46Bfs;7a:pu@WP;Οv1q'[`hĎ4 P9ホ7obĈREQ__T Tj8D :n>ׁk" lџOLGDV'|}~jXp̱kf \X84]8!oo_;W>аH@8444`֬Yhhh~OOO=Jׯ_GMM F &@P=:޾8g:pucD04[Ӗz{~o~*/+FSc=>ǵkABE( 5 jjuW1axyy`0 44W*M477AYbx_{D4437M?n3';2VVUk,ÁT#*2 8xL& pwwǍ7Q\TZ!;}@Xxjknk/;m8us+D ee_P?#= +X{, |IqJ{Ю@^g$ RdnnpwsG[[Qwňp'YKHOra;W="g8>{d\\x}m{X1@xDw__S5OA}טYSO>5KDWjuњ"rsVG`G(F]VvNId8h eIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/layerTabsupernew.png000066400000000000000000000255401366722712400261020ustar00rootroot00000000000000PNG  IHDR"qDbKGD pHYs  tIME  % IDATxyxS/9G%X^;q&'u IIt3홶Og:w6s;0I:$i$41{ $`0Ā/ƛd[ۑHX7ٲ~Hg}@ND%޾<~۱a7xhFDSDDD ""bD4QCza~ ZѸ؉.3~,fkb#  ^b-yW1(!=uXѤ"viѤ&ѣGq…a ""JJ ""0{vbhjbADD """1G| %\i28ڇ"gW{xhFD """ D,נiWHUU! 􄧩 @AQQ^q4m@CӴ,}[_}EUUh$Qm/V^'ξ< Kf L T~Lr**WMTܱe| DB0=#ho=CQ~:*@ t"/o&f3B!=hnmACC;1#Æ,(.fǡcG;Pyfdff(Q]&anǼÁPqZ̜Ǎ6 <?( B dYd#ˁ%%hkkѣԄܜl̛V۱oX]f5k =s;}O6h~|јyO8cUsS\l]GwKXXRC[[\.~?4M E& ˗ߌZ7\D8";'Vx 'M+n+hk0\[QƈfHxpOvd/(AG{+ʮ/Æ }JԠ,CUjِMPPPEQ N9PRǏ}GSkpmW ¨1p68tc差D(BLlp/AG}χlb(,,^ŋqtwwyyy0 M+ PAjhk6b _PBCjzhlCi X}8pƂ |raCQQVXEAep{p`0x4{kpP*y0#u@ks#|7AQy=(,3gBEtvv _=iZ9sPRRǃ@ h {:zzBS0^RTk &~a\jɌLG6B^7,YUU( :^RĜ3g222 Ix#CHgh4Ҩ F[T k 6D'l% J0_u"WPTPP])Ya0 @C0(C%fx=nB# "'xۈ5 D)`糏{s*%%=$Q(zZPU5fGlo;9pE BEf~k$Ŵ8h=ҷv+z19*#?F8dyk6h`08hc!f-b@N3̐etD`m $p9m]>?.(A%r̆ ގnzdt:bB% I'MX F҆րA41Q4szDJ$7r]]IQPrufcܹFYYDQt8*TUE @SSV+$Iix:*AԀcD#JW]*( t:=,4= EQPPPA'  Q%SWWۍ B!L&~׃}w͆i~C2 <B.]DA|-i8[w% K*dYƢEp2t+mdGCmm-`XPЀt -H6k\ 5`MCI0x}.kM3h4jCՂ@PA0ܟN'l[ <"3P{_5.Wjkk1w\x^l6,YhnnFaa!, AEcc#0{lv#==`>$ϟF}/'43 =Ξ{59@(mOB4q$XLp{ > A`6G8 R I<4Ғ?jX=i f堻6["(.*T|~bd.6_vgN}Zg31ÎOjd2$aٲehjj©SbűXt)DQdhD]] 3tv\p9;"_I ff׋.nGՠ6 .a>d92gzr}XG JKb]e~/ 1+Zy,,]C`[Jow`c=w}9^~}:F[*րA4Ńh$nqf: Yh#t˼tq17au`M1Kqل=l:VUnDFY [>L444@QvdeeE%2P aZaXP]}Ld:!IGVnt' beϷ@@A9w{hnmǼfÞnϷIԓ.D0Ckb~ (_@ ]FQBx.gψT,G;\ 6o*zrs0 (.*D#hpbɢ֕N-7/nKT Zqgx_I~v"776 ,rx<Hl ?~{>~y f_< ;s2a5@{JN՞^C9X|T?G]P0J^8f9Ei(geZԜwux5x5CdKqP5v4 |b3'cK }==N-2,i6>6\ػiivL&*yN dxM+ƩG^#GO!r_3gg_=<;qK8I̞P{5gpO}w DQ}]>].cǾKnDžk)??O۴ _@[k>m?_t4E"=_>,+JJ0U żK:=cn.s@$JH#"4`w:԰:wC ֮ڔg# 󦼢r]M8!qWnO֎{!jiژB@W$ár xh6if]kL05` ~G4WcR3+9rgΊ$GтRݽ Sk0]\+!A!7gD˦[[DtE< [ws/i@O"Qͼ~̡ن@Q" %\u7wL [&Gf6;4㙲D4j"J~h˅ %\ny " UM=+WՈ(!>C xdk #UVA"J%KxafDDfOrlK΃JnDGiJA4^bVr?wjY)TTWz0"mLG$;9';[{ `րA4Y94~ʯNke R v+hC/k0ϟ=c1ek b݋atNwu#33{c ӰBݙ DwIw|wJ=ޯV70Zpp߇vbٍ(-[ >/~/|^/!%% &4++A UȟU805c-J˖uO0&`zGފ{އ(uțU@@FO.g',i(--E^LfB*zڂ&w4bF 3XP\͎C?vf XQC{My]߇{w⎵ș9 ^]mLش~AQB!AȲ G KJֆG 9٘7巭Bcr#f kp׀A4zDڽ1*zsҢ?6jMkv K~=6|hkki(d2aQ[[Ud֊5xoıøiczee R $GQԋ=x?wo>d7KaRxt2lAMM z{{!2TUn6 4 P--S8%Kq!/Gkp׀A41]1:30b+ =#6 A PUUǏj";;Vk߀hoo/Z[[qE#;;Nyyyp\ɌW¹ZT~ߵc Q 1sh,5ʙ{PҲ`q݋'?p> `(++ٳ"X-,hiiEgg' `D%hmiBoo7k0j JhGRaFL444@QvdeeE+2P aZaXP]}Ld:!IGVnt'<$f'P^zm;كY1A+ĩW]o"RQHaά\ذg92Fwux5ď_88u3,Zz^{؎7/Gnn.zzzD';;{/'Q\lّDDۃr㖛^ub DS{(wG#xpulA.z jj*7f1obkŸeg%GwLŝzPUyy7D).5,w߬Ar-( ;ŵB)DOxrsfpK$ݕA$`7<]w;?Ȗ!\KzDh^(af^?lox[S ;X]w-FD#J3LY"hxf5%G4pBScÄǑ 1z;]A D.3r#]^_ ;i!֠i^ۜh  } ~687{ PXru._\iV(xpo (D5 p(`܊|0itI; h_yAEQ{$&mBUTjj8 -]Q J"$QN'A͇~xl݆`ժ3}qY3`2b._t͏4s $f |fc$#[ٳcQgfᑇFixtaAQ<u7w{WЧ'\}+n\V~Fs'\nҰuU~ݗ%sq=w^w]xafcyY1IDcF܄QaA>>?~ hO%8{ΎB~%sqq,?%ױk|D(Fkw]xafcyYzDeȲ^yܠ[yeyL?C'Ϣكo> 7'&Eؽ3;xQߥJgeZԜ:  eql}Ixh~,f4$Ixif,__Nl KQ#5R{X8z?F#p}`E/E Ͽ9rńY98[ȭh="Xa B~%l|`+o7Ѩ`L|mmThplY[ggZ-77#?/~:lJMp=fh^1_z2c"*q[ TUźLщSuFz+ك|y<K13~Nݎ??| (q"vi#r $ÏS1MՖ ;q9;z(.\0rvA4Oa'WTĨ}u͈hr|Qvlx]3"pYIbC%kFD5#)""ѕ{%AyE%tl "JȩB:ЌX>BDHwM|FCIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/library_show_off.png000066400000000000000000000010351366722712400260750ustar00rootroot00000000000000PNG  IHDRyotsBIT|d pHYs KtEXtSoftwarewww.inkscape.org<IDAThٽJCA3j#FSHD 6R1V`>DF-$] &ravv.ڟ (HQhmΣiڕ[aFȎӹ %#"F3LF3S#PUDJ h⢾`$|WG"ȱs7VcT/zKD5s-ury(8Pn{LKr]EVIgr{-TC跋gXm]^zm?uyuӋDP(~"8SVD>^D>6D> D5 0im"7^xy}K;1DZ fhh<.-.d@DZkoEU1[PM9 GE|aIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/library_show_on.png000066400000000000000000000010541366722712400257400ustar00rootroot00000000000000PNG  IHDRyotsBIT|d pHYs KtEXtSoftwarewww.inkscape.org<IDAThJQ͠`D-$6 $""^ZV=XVpע?:JifaV 9{GouNA)DCR'"':F ;J/[Zzv&2DBrzÊ3ZqDG !qhV. Em.+tDd^[XlB"K}UCpyh8cx=g5܀4qLiW[,*!Ckxo]5(*1̫1m5_Gś@ÐY|V._^P`|E}spmx4"RJj2H 07m6ht2xDP*Z-۾Ԕ3r!#3\|4gʍIENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/loadLayer_off.png000066400000000000000000000014131366722712400253050ustar00rootroot00000000000000PNG  IHDR^ WgAMA1_IDATx;hSa#*8pD[B)աة8J[DKS 銃TЖkiZcRMmݼC1C+M uiPB߹''abzV*tIVtIVt _b*VIV=4 $+З#yz\M,Gvطɽa|NWURER*hv7inncg{`Qx=e9ȠLiIVqcjq?V4$ɢx8 LZ~_T>)f':3cSF,ֿ)]ֽTn?ZLt;yzFF,9'Gb`4 MӊJ#'\ml{4@:6z3\k$E<ޙGn篐d䚦q:0gƀ6ORhfjo IVrr%YKZ:X /Q/҆wGkc\qkω@K.v.z>&VI5in=qnb %e%Y(fxZ4 5_Us'KA |"e[q˶b<%ԩu*I\~AGH I<3|8@B 3ךּe}GIƣu-۽U[= ϐM=01 #!n$yT2!קK۾S_]ŋYꫫ)_~)5-vFlVVV =Ϟe~\~d!3(?ˬ7} ȫ~1LWlb;闋*5@yYILd. `q@F^G3&ש.+K:s잇y^WKs4u5 >Z`guݹ7@U0å5zL]^}܊IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/loadLayer_over.png000066400000000000000000000015761366722712400255200ustar00rootroot00000000000000PNG  IHDR^ WgAMA1_5IDATxMHTQOEE АHF\Y…p$(4nE 6DӇRC,IJT4u>5-޼睙7# {坋!SՄSՄ!Z(ƪv]}BE1NU3~!PbLe%ٴioM4pn0>> hRRtE rhَ޾AꪏmUYI65-\|z}rmCܺJ*G&s1NUcxd7055e܊YoڢIH 0>#!uxcO7EYO0,Drk'aM_?;_4O;:|6/N<~z׺QZEZ `pIP,e/{>7d -Yw:96[1\&[0;Kx9o?~_lh!?/+}^>or)>X@.iE7dyD-̄W\}SLyvދ57;.4|Xvj/(,ȧyu߉rI4.~}Cnm]ѿo];2ֺp|?6Z lL 8\ban@h),DŽ8{m떄vY_Oνm!232bo%$yyo|0gJ}}戶zœqc[-lZAEͻo(/ͥJ/iϰ=UHfrs,d8g)d@۷xO316F9W#>E7UK&5&IENDB`hydrogen-1.0.0-rc1/data/img/gray/instrumentEditor/speaker.png000066400000000000000000000006441366722712400241760ustar00rootroot00000000000000PNG  IHDR szzgAMA abKGDIIDATxW[  o\/:ֺY&Ff@^MB~mߕY֚$ `I@Se>,R@.D"e]kbdQr|ִ⥏'v,#%'sU`X[i坳bQ@ by so,1*ߩۭ4,:,'x"RqoۧjQ^JiNhz맷EE{4W?/}V9okr*zdUڍZ!={>:v}oVWM;V:+[qߛvWIo?_k{z*WU;OLfh~Yh|?|VA>Uougqr48ݮ;:[Gg6QY>/fokݞw~+}<1z^ZUSft0;-og/J]t5Iʞ̬ʷ`Բߛ_vWj'w֕ףb;.h?VVmsweDˮxھ.k~r:Ut~6l]t{v}%h{:lJ^+]g1}2j4X?|6nVwv;hgvq4~V]\lO(^Er{9{ѵuQj>-oeughj2REUzϫ~'|#z81+fGz;Af6ݮIft]U蝼jW`z>A+]oՂYhqY8z-g{+߳d"dEO2^\U矣Ky:Q\[V'>:֭Fˑu|Q|W=ۛl=De2n;O͞^Yl2ov~ۯgxʷw?8d5V+G5ί*qx]*j%Uq jx~F?_AՕ9.nSTf9EgC7N+h,:g]eJj4_]/r?{c-P*u9~69NE[;YmXM_Z,:XƢe,:XƢe,:XƢe,:XƢe,:XƢe,:XƢe,:XƢe,:XΏdʒIENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDLargeGrayFontSet.png000066400000000000000000000031761366722712400234350ustar00rootroot00000000000000PNG  IHDR@c#gAMA1_5IDATxKr6P٧ d\‹%;Y\5V h6*KHJ~?o\ z1*bTŨЋQbz-zŨЋQB/F^ z1֡P A0 A0 A0 s=(9(9(9(9(9(9(9( 3[< H O< H O< H O< Ho'tN8 @N8 @N8 @N8 @N8 @N8 @N8 @Ny>v۝_o鲎oz譟roM=V_:zNYYUʱ[uv~Gu~+7*+e6߬tmMo{|g8FKʹ{|4ތfQgIZTdfUU}lV>1Xݵؼ_tLv~GMw8go{=/e8v_\|'ZvśtY_tgm+-l۹F;젱J.gyu>g야Vc%bt2:Y;"]ehnlܬv.:wlޱyϨG9V=fݎo۵Z=ɌW Y7:9hr|zZ?k\߳|t\=WV;kGo^qo{]H1>Qًst|:OU!ʙB:A޶n7Zt㋚-꡵|f!.|fG?vݿhnjgƗ|~8?^vǣVQ#qz\?q~U9wKGvǣzW9WQ%%uљU{<Rw:GYޥmj꾭f<(Ql~uiͷP_I;ksUNYdُݶC Ӹ^#Wŏt`?Lu[t_ĞwH7~gDT|'/_?sGψjD? l/?sңx bT3UH+Y]xF(s!YYXVz? ? oxĨ6w/05D!]/w\cS>tH7f<"Ɓ8V5E~<7+ ?@pңw-2Z.Dq em9geeȱZsEcl:06@oǹF0{~XQ&gl8lm4Gy#{n}x:ݏsn^6ࢳN7"̰}eyV{xl+Dztznj>ϽgiYaTxJ3Fl2>`-~']pm,#=5Up]Q^1kD{p?9>wuϏ`Y|X9jg'QTqLfDXު8;c F#'Nf5 뽫?Z[?3hE?'ޟ7b=평]66ʪGD>`|G1sl^gsج]/>yX__6ffo_wzG+oB!, C!ߗWY3#_e ĺ kn=uvףfM32Oj`C_poHקu^LSn_E3G Ӣce+g<6!o.m,#;?߁h~1&?|Z⚹?س8٣m*==gV؟tZXUJ3FlfH2Jݛ= ĽEGoh#>|.Qq~sϣznXd9֏oc;zz2?Vq*}Q]?cJWu;y{>d]IrFlc|QL{ hOuy3kn+-T@u`kǼWOÎϕ͛']_wL^>ֳ#[4^?a$F7Q_LLLFo&m<|2#1ZcGx*V+=EG{Ǔi/1:h=6>(|hr܎}ݏ gVu u:p|0t`[㈽|\j/S^7Z/~Y@8UٸQ=8F4N4#gp<e\stt9ft3ڃ<̨fhTwo&lpF>1Gx,"QmXWF !9qe[pkx{xbz6"dy:DQ-t0՟/? g!|b|ЌD~ cyu}@ߟň;f~Ïu1{^ :fێȖ:s~Y.<Y}";f?a_cԷY50B͇(:PzStSotZE1x9@#_#5*o(/W !qVA+ͨl2-fdv1cZdE1_C4t![UB!Q !B_e ҥGHHzB!B!B!B!B!B!B!B!諬B1)u# IENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSmallFontSetRed.xcf000066400000000000000000001215541366722712400232600ustar00rootroot00000000000000gimp xcf file,BB gS,Sfondo     ,6eq},f`*C$TSfy|B:/$   B@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@B:/$   BA     F@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@A     F@A : =@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiimiiiii"@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiriiiii"A : B@       766     &88889z@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@       766     :88889zC         @iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@C         r==   %"@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@r==   %"l23     8@iiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiioiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@q23     8A     """=@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqiiiiiiiiijiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii|iiiiiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii@A     """iiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiii!iiiiiiiiiiiiiiiiii B!,Nuovo livello     ?,c#/;G, G    G    G    G    G    G    G    G   G B!,Maschera di selezione,<HT`, $(,048         B!hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSmallGrayFontSet.png000066400000000000000000000007551366722712400234530ustar00rootroot00000000000000PNG  IHDR,~BsRGBbKGD pHYs  tIME 4{BmIDATxݱ @ v(a v V&b$xN|_s!<Bh?/&&c7tSP_:$ yV{7K{6z*") `0 2G=1SJ`N dG}0"G"F&.'I0$|\cO IENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSmallRedFontSet.png000066400000000000000000000051561366722712400232630ustar00rootroot00000000000000PNG  IHDR,4'vbKGD pHYs  ~tIME { IDATxKr8̬s\ %&w—f7" 7$$_U*&^hׯ__!BHRJ)/RJO/Ͽ~m|5$/#委ӗ/Zo/8$/ʗ)%XV{_4[.Hv5ͿZxl?*PfrʿG&ӯ/gA/%yKjia74YVHZH%úv~ Zx)3|5mo/ʦh>&//?:rR쏗}8IV16R -GͨC˽%nZ6{(ί}6#o35CD˾nY<I RGP ѧǵIW";–A(S3WJIO+٫M*S+!m0^j\Goo'QB!$ʰ[B_VGYotz)pbǣ^_O *:7c(\W-#Pv]+_"ysn@ gZ_R~?ID'{?d=ɬf4ЇZGWoZ: t x2ZʷBv_~}q|R>KzȽ]CϵED9Qh-.Kj둗9ZV'ʻlď$)eyIAtBe^$]K/y9oq^6@V]9CU:ǒ\JؑIX?ez XQZʣXArk'%yF McM=Z ̑X;J=RVK yk@ZGyz{xPOأ mѐ;m)b-ޑ,@j[Sc:<_yޞԟos$umS揶5냝ho=hl5Y ze - 0J1B3_N.I2zQֿ.SA ׎Ff#bĥ{щp|F8?k:6Z[bD^jl{HCC(nbi1g,Z+CrPVQ^Dt0k@J^4>f@ko=Av<%jyHz)*whY$/ mIZ V8Ōqa| h(1P~R~Ɂ.?/,2pgDBHmE9:>U?t8Dtdj@ (8NZ0bijt@]'BoJ|;Ph[zXS6{YrS` ZiTcԟ">&BHnaB!d~eM9SN9߯ARQiާ]J"85hЇlX3>hFơ>$;?k.BfD|B{Bz* ֏^Ol}UJ./ɯP;*ʈF!d)$.ʞV^s=hhd=8A-2?,s ,#}bB- =amǛj;kvQ:)hhN !-rJI>A)"\kӮ9Oc]+򛕦!QRnHޑEO!DG| Xx':$ʶ rђ!r(D IuBlZCރ|TZ0F(z=!!£ !GYB!$ r)rrF !!d^NV?? B.VA!2)?VA!BЁ BH:B CL!<ʚLwtzyB@SքIENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSpinBox_down_off.png000066400000000000000000000004341366722712400235120ustar00rootroot00000000000000PNG  IHDRqOgAMA1_IDATx=j@F` \Jt |T ܻ¤ T:5bPFպ0'ȃof ܊VT =,KL]xP`i}Ouk'""ǑynڶED0Lywi x?TUTu<+?-^W,os86[s+v wIr=IENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSpinBox_down_on.png000066400000000000000000000005001366722712400233460ustar00rootroot00000000000000PNG  IHDRqOgAMA1_IDATx1KPBy6 R!E"pPqqsAA)еtTn}YJtOq{/Qĝ1*@aAkDQwXʼn_D.NZӈ7 l,AC$2Ê#wVF|}E'% wF}=^ ҬZ>WgG3 ;xW3`)ѠB)5uC+m*ܦ2c_uXIENDB`hydrogen-1.0.0-rc1/data/img/gray/lcd/LCDSpinBox_up_off.png000066400000000000000000000004701366722712400231670ustar00rootroot00000000000000PNG  IHDR L-gAMA1_IDATx}J@}QH)GHauO2ƀhAXL1[8v_3êZ;'9 R~u'7[o{ wa0 EQFc`cb%jڽ.sk-]x @"B]dYF$ s}|ZS],ii{yCL8F,{tG7t[ǶW)[9is[Qp s ѡ`>&dPQ3˦~`)Nm(7Zzq!ÏgIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/000077500000000000000000000000001366722712400205575ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/background_FX.png000066400000000000000000000377111366722712400240120ustar00rootroot00000000000000PNG  IHDRPKbKGD pHYs  tIME^jv IDATx{xս?eoBBHIrGAAAJbVnPSk϶O}|>'{b ~D| /_qWx71A$aƻj; CS !*@J BT@ D%!*@J BT@0YO`zOa#><\{G@e ;'L ˿}̩斈y'?%\jo& bB @ D%Q ExoRUTbF@0q(-@!*SBl#X}n W3k5cx}qE) ,gZb5_/6=p(y!MTlz^^֐[<0O~K$ICģ`jq5=_3nI VA f]zub2[PU -vܰ u/MeryeWßpZ[P*^Ǒ_P/U1r:f%e~!0$QųPіjry%9=_ԶˀEp;>L[[ KJ,+}x47]3= >E7SZV()Ta k͘1Cˁ$رm3ǎ~T^ݞh~ɒ ͑,ddܼTT`_݇B)V9աnjW8/F>./"'0 ܡ>aT*&T ՎjG7 N4;q?ȈJSyh;͎Ñax47^OĂR6itΞ.\.'[Iw/D%Tubʹ47Q<{Z:^Fo Xw}TM躎vc(Wٳ9s 55矓f7LW9o}waمb5c{8z%tlY5߿Y.V:::#I,cYzo߆ǖ38~k\j \6Upx<:VsEzqz^$ 08p ۍaNVV~)S`;wnGd3lv-`B[_tKZ'7<]aL,-ve ]שA~~>IӜ:u6ioo/*8~0jb\Q Gn߇,Yz[g]Rekq:EzF6ɌvyIٹs'wfƌ`20 GAA444P__OKK TNʩSxMӨ*dx]C^^nÁ#́PUjӍү]rs#_,[G\= 4U ~kbiNM#ElQ Fw dFUT4C!snсx9ƅ W|(8O/NzUdkBocPT,DJ)_\+X~ZQc JȲ Ixu( i"RUU$)Tg<$u/&9`/#Qu Jb+$K2I{9<q^/aD|B 5Mɓ8EAQ~?^wUCױXl9UoF-I-{5Q\<a 2Lmm- .rQRRB}}=}ӗ2 ]z;vnCC. Wt-ԌBUMв71ov)ǵزe״hB >lL&{~ܹ0 ٻw/$qUWjHT:|0r:|U(*==> !˲Uɜkn57y?hD&~\L& mcԩ8Nә9s&uuu477SZZnG$N'MMMR\\Laa!dddi1ȲLv,+ET")ދ%Eg9~yGH*+TU$P65PXlcOLJxlڿgm~TO7pݼ>eH=6crҲ ,Ng7y)rrrhllI^^^*4Mp8Á,ɜi9ngjլQ{RN_j?,)RP+{;pމe$l.c`M;{t /N:;;,XV1 z>xo7FΝmUבe?;yEgWP%yqJ<&QP>eW_̾;8TWh?KMV1|2g[,#IChjhWe+|\fTNۋtJӴi,˗Dt߆~PX+W;aM-IY#\m~ܱa֮ \w2t]]ݽ;>ի#Ҿ““cDRJR=}-Ȋ٭ r͋5ItxJx<㗩}-gŷT7u"+ͦgd:]_&KO꟟?jwmdժU}aù^:w0*=a)sVxgՁLzW||K. UNۧ~"?|8x߰ht"M\^~h t7~c ''V`,Uz.ԳcBrӟ%̎:5K\+Sk6#B᯾\Km_jy/'R%jFlT}_Q1*eڿ?'NHJdf&ޞK;>*es)\­Wj g57#%`7ˤQWPc͆>Mh+6ga$oK~vx:[=5y^u֎kG#uW7F㥏N/ҏ$&\1ewzb8*֕am=?{Xy!Q+cg~IFX3-䧿%/bѿTW< W@Ec3-1OTS cOKX&h6=p/jL[[ KJ,k _߇Gsu/8#PC[t3e1% :i6l0~PxZ]*_:c Qc/wcǶ;)bbRyv{zhχˆ$c;Hsd 29x57<3Xh)99#}pY^\a+N^>K=|lS,^nx@TTKs#nx3ףC}*ø$I(PM&,V;V08u/caVNZV_[koČ4 ڧ.jJS}h;͎Ñax47^OĂR6itΞ.\.'[Iw?u28/]JTC#=L˲ezdY ^Z[[蠷ߏ$IȲngŊjپ}[`4>cv7\dT)8#6Upx<:VsEzqz^둤StuuvCK?KDzz:YYY~LaܹIIȦ]WL#7`Jij{b*U,U-/d -“Į0 &q]TTNg r`q8p8$.N>ͩShkk#??vJJJ&p~}ȒCS|enw_-iq:EzF6ɌvyIٹs'wfƌ`2B{PZZJCCXrTNqcS'u{s"FOsYi[]IS|kЋ ts^<|>ܹs)..FeΞ=KMM 3gΤ"$I8q"Q[[l;yr9aHȢ9h;QlpOMCS25$F>3O*6F-Zax^vڅd 0b.eO8,PMW Ŋ(m;aIO&&`N)KW5T|?Wh=EU@߇Śzh錻m~?6-4*uar̨b:$m_VSg$xh^q1soYA7t?$@U{,!QC9%/gwCoX"a差5v , Wiiiiih!p!EQUIBu I~]b21=]CkHe% 1QXVt=`dIF8io?㡷290OPHAib}Ra:^cǎMqqqhHruYjWDN=-yDMq>=Ė-[EJ}8ddfc2ػcΝanO޽{$ UUC Ç%-- ˅nCEQW0.GPRucE~Ok)?k#+;B[i:u*NtfΜI]]͔bۑ$ ISSSXXHww 1ȲLv,+ET"ɦolKj$*TW*ajgl~p9{XmX&yg3XVQ9spI< YLf͚,`ZX,x/^̖ nXU8#)2H{mڒS*f! kmHUEIRYu}DF[99EW֧lGf@^N77RZVb7e啘Lf!-Յ@HHi~7㉌7@^ nXonݺ[u֭[Ǐ~pDX0m>Ux'y'#*fƌ<ɖ^ի{< 3hKu߆q-IK,wtX<*rNDpA\C,`̌ۧr:#vw~v8z?^XO\CTߵիW[_-4 oHw]K~_;,_<ҥKC '`T}#ݯ\U/Ϳ*l{8aqb;ѿp+3/GiWUU9^"j牕x~!~g -;lG,_}鹘 +JIDATͿ8_S&07$jF#ZXo>/D(VX|Ÿ,ՐjjS*_p8q")L<\׬puňj(̹o}+4s&GJW*ac͆>Mh+6ga$oK~vx:[=5y^u֎kG#uW7F㥏N/ҏ$&\1ewzb8*֕am=?{Xy!Q+cg~IFX3-䧿%/bI_R\,\\=ƋRYZϴk>QTO%>U,a ׋.wozބ ~#n[S NS\t݋Au$ UU1- GKzvl[q- zۯ%#+D)T&WZvh= M hkmϒͺ%?ELRS*c6 $c9)++G k-U< m&WEm X{i}> ǏʹYNb}x47]3= >E7SZVsZpaÆ5ϩ3f5r!|9vḻ(&&Wa|/l(K264G,Ws+SQ9?2݇ nڊQ?hFڱT8[TG%ȇߥ|;yEhP0./%I*&T ՎjG7 N4;q?tXhX<ǖ-[x͚qWv#aZQSqmx^3sp821 X0Z&M‘@}tih8IucӅd7nrrG43wԐYd7.xO0usfZ(X=-WIфI>MCut]-|c(Wٳ9s 55矓f7LW9o}waG\X?>/]JTC#=L˲ezdY ^Z[[蠷ߏ$IȲngŊjپ}[`4>cv7\dFSPodTdG['3;꡺zׯG$ 8p.nwhgIHOO'++ ϔ)S0 ;#I2tvS_iMthaIxwo^S w%LExrR>?n_Y^SSC}}=|$ӧ9ummmNII _UpaTĸOݾYlOϓϼK>UU#I2;wd̘1L&Sh߂JKKihhVNʩSxgNBQUl6=,Z0zڵ DUUa\,x8q"YYYtuu( ===/ϯ:EQ8vGeIsJY!<D0 vf+$c^tGEE>MӨ*dx]C^^nÁ#́PUjӍ#ޯa;ֈ.|#_,[G\= 4U ~kb t:~-2ߏf g]Xm6\&3i.Sg$xh^q1 S¶QdkBocPT,DJ)_4 g;\òk-ucYVe%dY$MPMHKKCӴ )ގH3II!ZC*+Q]Jb+$K2I{9<q^/aD|B 5Mɓ8EAQ~?^wUCױXlIyN5Y&Q#Sw{GQTrhn|$˨&3,\EII |G̟?O_0 t]r1).. \.\.P32## UM)ﲥ71ov)ǵزe״hB >lL&{~ܹ0 ٻw/$qUWjHT:|0r:|U(*==> %uUHJnL o8E'RT4smdeb2Yhk=M]]SNt̙3Rv;$t:ijjb &##M؈lEe:ϷcX/(L6}ۿg[R%Q1BR!ݝV;Ӧe[كjj5;j܌(̙3'OrA<OZeff2k,dYՊba{bdv8/IIFlcF*JR(U(T=hc5'|z)DѴ8P͍U`p:3OqCcc#^LB48PiÁnn?-8dILIv;Sfo)6PtVUPgI)_H|Y$-X&^{yΝ=C^x|PXXHgg'DJeV+A}}=7#ζɪNHӝ"+h*+U(2/fp`P+tf+㋊\>\г-Y!MM454ز>UCAx[t3S*ELDY%+-ݷ{_>_s%J ?Ν;C/ ?{ ի#Ҿ““cDRE;̘1_8rXzu\ZMh0 [n铦?/-ܼ\i6=#s;P6 3^ӼZO0l8ߵիWǽ^ ?_-t~[<)?+vwX|yLK*X~Sts>s7nz(lTh!x-zX;]_~>:m@0VT5lf_/WA0&{7?mMrc(3:MIpe`6[u/^]_XZ$TUd&<-y۱o ]$;o[KS\^)jǣq'45֖>K6놗q1KULlIZ#3^YY=PHX#nYhK5ߜ/jeƢCNh8~lʥtr%5ã:_O!-ҲӒFR.]ǿVװ?̘1Cˁ$رm3ǎ~T^ݞz,ȲLFf^kMӰZ}8狶m^/98GseI,-e&Hw>:ihl44Zmdru˛T~799ۖ/C#=z{]ܶ&'cOKuR4aiu]C 6 2{lΜ9CM|́&$y[fy]l6ߏ$I!K5<2 !́==|ISBrzY_,KKkk+*,vV۷Ns?vOjws͵KFLO55*ɰ"<ɞOfv.׋Cu*֯_$I8p]]]ϒ$NVV~)S`;wnGd3lv-H$I߽yO**\2 OdpbׇcKK.**~d9NzMM 8q8HDWWOԩSO{{;%%%|VQUJ8rh?u>dے=ϼK>UU#I2;wd̘1L&Sh߂JKKihhVNʩSxќnn񐕝gz;w.Ȳٳga̙TTT>D.I'ND4jkk1͡='O.:,Yt?m*Ѧ!FfI#c ǙӧPT~ak-0 ^/vd2QUUa17'N$++.EEUtCb( g`z~gFDFĂ9,]qאrRSU Anx"AWg;fI1t/χiQUUNO.BII {!//ۍgh E5Fn뒏1>|?Wh=EU@߇ŚBk;θFcB 3٭6].TUQѴ^ ]͹knX%lEV ),l>E/rHTꐢ K7,^mwpe)2P[~ZQc JȲ Ixu( i"RUU$)Tg<$u/&9`Cڅ=TVjEVHdtsx<z{{)++ȑ#x^ Ètkɓ'q8((~ܽ"~?cؒj8QKu7lMF8nyޫ7de IQMfjkkYp.裏?~a躎رctwwS\\Rw\z];lfdFFSveKob*QkSkeiф|~Ng7٘L&sanӧw^$I⪫BUՐuarssIKKra9tCQTzz:}K)+Tݘ@p+nZqOh"dz:N$==3gRWWGss3v$ItDkk+MFF桩ي,tob_P4J%rl϶KbN|B;[vM Նjw6jEQ3g'Oxxo7FΝmUבe?;yEgWTW*!QP>eW_̾;8TWh?KMV1|2g[,#IChjhWe+|\fTNۋtn|IJKmׯs.\_sN~ ?{ TK}p 0c duw/cq=@h5X6|[nOwtX<*rNDpA\C,`̌%ڧxO꟟6jժ>qð~FV^{)*~m}ПX?+~ܯa1.]Jb O?KE9pHaDBn3/njN0NtYZc7UUU%b{Sk6#B᯾\Km]1C,Hq)j4 yHRzy$BDgd,HZaߠ`S߿'N$P23oϧBR!"5'z۠ i/̹{䡤L"sR!_Z6C54颭`,6 /mSa۝>7nz(lTha㦇"[v];z1?/}tx~~$)7ᒏ1, .›QRҏ4{`C #+*썰VgZO)J^p0/?E x.QAf;F@0v(9 b?@J @ D%Q !*@J BT@ D%Q !*@J ##;E)  ʋϲpqӟjix|XE B0 Qq-1 u޼k>3gͦxxQB`Eu%'L F BT@pE!WbEoIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_edit_off.png000066400000000000000000000006761366722712400237200ustar00rootroot00000000000000PNG  IHDR *gAMA1_uIDATxKPJG(D:9vI ?D\QAکJuH5URZҀDqx11^wxh APpT*+"2Hjcs_jknvMF3LuqV^x!kB5Bd#eY,KtWEfNw/8Ch$DJ^ȣRXENvX*x{lƢW\=2??N "jhjz&է~Q]gQ_aSd%Im +3XRyx0+% dJ$C4'*f+7 IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_edit_on.png000066400000000000000000000007061366722712400235540ustar00rootroot00000000000000PNG  IHDR *gAMA1_}IDATx1K#QҦZMJ 8`;Xl elhENQYNd% b<#^ 4΅-κwt@k1c Zk\`-\F@Vcyk-QP˥ YQ3?B^4 aZYT:IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_edit_over.png000066400000000000000000000007321366722712400241120ustar00rootroot00000000000000PNG  IHDR *gAMA1_IDATxK#A? C&w *mť>V`#D9. W\(Dfhfgj$kr3Ǜ{`BڲN҃R”e U8Հ*jH'k?46NBf@ aB8]5n`fsZKg3  e^j$)/"QAlU*^:;\6ep&)2 ͐f{Q-ShO)V+1xx|u]qa?NO 5:;af7λ1Eʧ݉rerzCz2&S/x}{z=FPг 24#}U5c6lAt_ 27О(RIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_load_off.png000066400000000000000000000006261366722712400237050ustar00rootroot00000000000000PNG  IHDR *gAMA1_MIDATx1K@-Q3tr6X8I" .V`Uw q9zY.k]DE=KqL% O/Sqdum!msr|@\]? di~)e붹yx"!9&ym{3~o| uۅ:="(j IR(U+殔2b++<q1+u 0qel|}mۤm<.:-v6G0a'ɩb6lCJ)|/ eFQEg#ϙ!-?E|ij]cܟIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_load_over.png000066400000000000000000000006751366722712400241120ustar00rootroot00000000000000PNG  IHDR *gAMA1_tIDATx=KP~M\W! ]$ N. (8 U((tr "X[k֨I:šmc{8E|WT͏҇ķ/;jBfQ#9xTQbQi6;9y=Y-bPI$ g*24Mky=7jU5`JPTx#d8pp\y# 6nry~J"gT&Y;6ǒ4Esn27;ߑ=`w})܀ez㳏8P'p h#~jX֛7BZ˲B,:A_ÓŕIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_mute_off.png000066400000000000000000000006231366722712400237350ustar00rootroot00000000000000PNG  IHDR IgAMA1_JIDATxK@ ݻ*b 8'"XĿBpqC8)lXL;OrCs x}}w `,MRX?U F ;"( )"; =ϋ ̣N j\]?#Z^dfCK^*T WM E@ks$"gjz_$SJ"rglfuߥZ)8NU!%I/ks ?!"_ޱ/^[i= (89 'r]p8PX#4k-IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_mute_on.png000066400000000000000000000006061366722712400236000ustar00rootroot00000000000000PNG  IHDR IgAMA1_=IDATx@ i.>rm86`)hiR>])v\1#}027;3,o\ 9źD},@$Q* 4 lzC.O/F#dx l|ρl<51_$_1bYk*x>Z:]IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_mute_over.png000066400000000000000000000006761366722712400241460ustar00rootroot00000000000000PNG  IHDR IgAMA1_uIDATx=,CQ{s Z ] `a,MLv1Y"6$~#MB5z[=Mp+MNΗs -,P(`|XeķN3@,mo` H%h1@)yI9l#f5iuf.X]sJD tbryT.Q٬ry,GH|O׶Lq]$C&D,±D";_ X--cWanL_ 4HB]o,mme9G #iJON#i5+rAtw=#D$`| IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_on_off.png000066400000000000000000000006371366722712400234040ustar00rootroot00000000000000PNG  IHDR *gAMA1_VIDATx=KAEOB*m߰Jۿ`a')lA`#IL AHoaeMTmfڱ0..~adM (~VojF 3EQt;uF튢mH) u@K˹-lJ) qO)mdòuo6@I$ ˜[H=* G6ho]IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_on_on.png000066400000000000000000000006771366722712400232520ustar00rootroot00000000000000PNG  IHDR *gAMA1_vIDATxKP/t?&k'q? S!`@ǠKM "8KA:Jti($A,< Uνwy%i֏# r*aZr"% +R%Q*Dy|h!aZ|eOQoIVTm .6iA aF1S>t ͬ8di.uW>r5u@8' BkäC'JbsA0e& bƽ_Uznc_hhVх X;|ZG bgQ(~f/bIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_on_over.png000066400000000000000000000006741366722712400236060ustar00rootroot00000000000000PNG  IHDR *gAMA1_sIDATx;HP֮:wUA89e3Cl]ܝ}(N. qQB'qpri+>PQcm\Mڂpqai$ @ iL^r=iK@Uޥ\.jI-/iCpszxr<,]#wvk<9/SQ&WW> v2Lk5 Ӯ!?5,]RJ)E>ץ[t4T#UC!'H׸b1vFd3;,n062=`yv"`{OO6OQR/{|MG~ (_s._ M0 Q r=[9 ׽S) jG*hЈ@IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_play_off.png000066400000000000000000000005601366722712400237300ustar00rootroot00000000000000PNG  IHDR IgAMA1_'IDATx1K@ n"X]I?P:ASc l̘A!9Ą\cB{;:vW /WV~Up *әB((A03E@JG4@>ԡaWe0{qҤ^T"(߿Hb|Œ'*M{kQBnY:+ Q&&(ñ҃TMht _?X:o%{t4گ#Țf:9ꆍ2rۻҁ u}Eu4 ~*IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_play_on.png000066400000000000000000000006521366722712400235740ustar00rootroot00000000000000PNG  IHDR IgAMA1_aIDATx?HQ?/0M/ 6p(""(%¡"isjZZ%hiͩIZr+ApS/<}G*9"e $<} JL˻W#Ǜ 7MFΎ$S?^Z:λ|V"C sBR6H͎x}4`J%)W`q~̛Qj{'4V>llO3kH U4@|(W_~hT+IMd2 j$K9Ԗ"DPx}9@]=  X;q`@IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_solo_off.png000066400000000000000000000005741366722712400237440ustar00rootroot00000000000000PNG  IHDR IgAMA1_3IDATx?K@ D:HZ)A⠃ 8*VD,f`fNpt5Ťm?{cquKй ۻ8;MZm*j{H)7`Kg̩A`[ea 8FaWRHˑ)iՖ6_'G"CEDQmJ)Raڏ[C/oBO/FVvw+9a_"6>YN4MkP0u|z88.gIkMPIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/btn_solo_on.png000066400000000000000000000006521366722712400236030ustar00rootroot00000000000000PNG  IHDR IgAMA1_aIDATx-HCQwvA(_AY 6f+. bbY0,eisNDDr oo7BdYDUn B0'%IfDʊP p,A7d*"yp(@RYgS U^evqMt@w^ H$p4I&f@Ȕ&< % EQHV~{N @Fy$V[}xiK/[[AUw!ׅZ05Q,9Z%zG/0[ԟfWCfmubsi9VzWR j3=AeiB%gC|}aSF[eQl*WVE e[m%t^;%pTIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/bypass_off.png000066400000000000000000000010071366722712400234160ustar00rootroot00000000000000PNG  IHDR ugAMA1_IDATx?A i XDXH &ZyUWDA4w'"]b:NE ,0Z;&Ur#z}E*aZ.U*~D\j[$AYtnc{L~ ?>r9Gt S*F?bKL#p<^ʗ~j!WVZ mbQǁf9]T&c:N[gX8{ה!IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/bypass_over.png000066400000000000000000000010601366722712400236160ustar00rootroot00000000000000PNG  IHDR ugAMA1_IDATxOhQ.R`N҃x`*m ^<(E=Tr / ĽDE H(` ԍv_?z?`fx,jrB?KJ5-\+ZljVA+ژ V ,宮u]]R,B''uQzd,P/W|[Zuw~_E?;uLAM.M<%xZE>rlixZYƵ!?ʹ l0Ž# BD6ť /qGFXAza[DGXb\Wyv;̷~":cc{wĵ,\" I7WĦc#~C7\~ [7(,8ͭ. E/5?GGX}|ߟx{wÉgtxJIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/componentmixerline_background.png000066400000000000000000000044171366722712400274110ustar00rootroot00000000000000PNG  IHDR8o7ƷbKGDC pHYs  tIME.4m IDATx]klUu7Ebk0E4(GKG ђ@M 1cVZT0 Rji 1j ݶ[iwc;yu;3Lڹ{9wܙ˔UTrŋJ 0t928x\Bfa|LGAd5dk7q PX#c2v('OQA;4}26rlmH&Q4R:|~QT^>oک> I4ezZdffIRiiޅS(Zphj˱biɃE EM0*kX9NQY]F"QQGruy[f$2Tp8pXܯ$~Ӂe%h4*u)V-+ooY,!kD-u{ZV055%;g˟P[].7θ#(>nVp.Ap۬[}/65߃SSQAS'|n_ %eok6D_}Pm3¾\TdZH}3 N@+P7܌'ku'zuQzXL}-9jJ4ea>w~.,-T0n{1 [Kвyyy̝w݃YM;AMiB$;۩I?#"|zu,zG^F"Qtu[y-zO,33G5Zvh(Q(jDTSEV#X(Q(J%EDQS!2E3`]n\X{ ֵE7-\+,;xխשASs#MELvv6|>梨ܫ!.DC/t:1g%Nx&u099Iź3m  BB돏r7D)֢&Vŋ~NN~P4 YrSQ51]M@Xu(F- tJEnUefV='7ˍ&SOLl1vp1vo~ |wp1DAP P]zB7@DQ(Q(J%EDQ(Q(JU"ɦDQDQݒt(Q(j(%ZO%R%MQzy+k[ᶓyx-H{^^T?b+eىAUzPT6@GǃrIR 냥ewC$ccc G$2 2CCC7ob0Dެ~$5{Y )D+-{eO^onԖc`ޠkF7KV'];1e[ʹ%晄Pb `^ޕ[dbJSIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/edit_off.png000066400000000000000000000007671366722712400230560ustar00rootroot00000000000000PNG  IHDR ugAMA1_IDATxK[Q?/d, "SҡN! KUq(]lЩPfiKi;D-C<_8~ysYnh<_ 9P!Xh@7[]/"2VFXP,Uh$}7A)}uvg"!n.V!; CvTǹ !f4 + n5bnu$Kc'f>2RJ6 e^~F\U89Eݯ"?e獺^ OJ˛DP`a稽~_uoћtKwWZn ',_a"o p&u$1OY9>L?R~GHZm 9?̍20r_~y3IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/edit_over.png000066400000000000000000000010731366722712400232460ustar00rootroot00000000000000PNG  IHDR ugAMA1_IDATx?hQ?w )*VfLfѩ`q1-()(N.֨hՖ}CGm/‡!6t9SYqr-?͸۲EUXtmܶ?8.:}]Z(Vh" n\v\'`e]C 6nIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/fader_background.png000066400000000000000000000016341366722712400245510ustar00rootroot00000000000000PNG  IHDRtMgAMA1_SIDATxYMkQ=LT2. .BNlGǢ k҅ wO\QZMW.DPk)IЦp]3}L wϜ{ &HQn)CUUTE4}(ލa"- n@(FxN*0 "D(vX^`ggGs ~S0}&ƪ̻UǕ(C/_nq($I#lc_<k[X]]n0 j57}/F T*Q]Kl^ B@'[,ɯmYڱPYj 3߾"wD /KCuM4"]}z"_zd ϗe&,|Y&iAtfe:3:RP/|؎,?_\H~f"3)ED"ZʝRdO*8&oe)uZJQV /T~ɢ=<ޡ,(4Y-ݐ%4vkdpɢ*zV<|D}BeZOrzhp\^,˚͈b&?vT`Jbl~рau]bԠ: #" xBOIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/fxline_background.png000066400000000000000000000070721366722712400247570ustar00rootroot00000000000000PNG  IHDR+*W{bKGD pHYs  tIME" H IDATx{pT}?}Ѓ`x`F! a2(&n<8ݴ!өa<1vCg41c76y l$0a$a $J{ˮXI+@{w9W-jXFHbF]yx$SɻĘŞϻ`^i3OλG"v*?:BZz&޴hJ Ii]9{,gϞYu=/)))b&3f@uN8 Kk$ f #}ưgWY|t[ 0=0ͦ웈TTTp!1g Z|\x6gBA?21;֛T!"cxP}o Q;:b !do]nω'8u3f`ѢE̚5\>}:/fȲLcc#~9C($#Ii4mw;IR}NxXOG~zPԴ CGUC<""---TTT0w\ uk/4c&μ<E ͆i8NƅNRƥk뤥e$F#*S!CO?1nэ_ Y,8. @UC,[ ]1M'ObZ)**AQ[[K{{;tvv2)gϝC5v$|iӋ$ː~὎,.@H65@kfs "i(TWWSTTWO.u~~>ddd 2ۃ+X,V$g 9 Z!WgDߌ I 0MÍE*x<1 =it:#Ѥp:h`ڰH%i`;.$Jk }I❃q(( P(FÊm%wQf+bAӴ>ݖ@]ZO%DQBQ$IBQn7DwbX!GPA0MMSl]V> A(>ڸy&{]xEx_oKVij1-䧵^o*`)SP]]ͬY"|e0 ]uEQvI"uul45 ɿ QC5Ǧn'qoO}X۝jKϧ>⻈:*/_H4H8R9vdc 2$bX#I1LIZ>q,̞=WRYYI @U+r.^ȅ HKKvi.kX$I Lu1M'mhk$. #ΣV3iZ47]3gIIIaܹTWW@AA. ADnn.YYYttt0n8%D}]6Qb; ç5 &zyGENvO>>>Y} YDHƁw ͠,?'y1qg1D8Syg(*{MGLQo8l]eɂ)&CNN>(Rve3SWWx^222"^,+B(r>CSS#Qx ! R1l;Kv?#FՋ8]nn #3 >?CQq8dff:555|p=0u,Zɭ&:;}p~ځa8Wl7ǥKF{u?-\rǟsN**iS?~<@dAEA@4멯Se՜8Z'+=!G-XbNLիWGzJ.ZVoW}M6nSu|Vf3\(=ڈp8PB*6,$TUe';8bx"Ȳ,N/ݿrJ֯]IS?:[ogƍw_v!EҚ!2GO~w<9._燐kx8] j(( I^6 YƴxQdU#"啟u]?,YEQ﷏irTu'#,L±ݗEx?_olׯkS/:ݽD,V?K!EtR\I̓.^8_o~ _۲5k_jU]8$dUx܋&k']>f_}:׉׮Y/Гԟ$bw*jt`)hoʶ}/B>a(e4ҽ^6x=p<$$XE8D2IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/knob_images.png000066400000000000000000000552611366722712400235540ustar00rootroot00000000000000PNG  IHDR@DQugAMA1_ IDATx|ytT5J@ `#1ر1:}zH'׽νɰνq' s6 `M4ռǷT[zy}=fݸ?xysdxYgNnf~p,igNsV~;DXh?su=x9N/kIִ̝7ǪsS<=}fӊ0cIӴk[Z3o}=<?O-v$m{\xM%+7%u\nǗysOy4[MVnKj΢,%;aV|.uas XX[vaj{\x[-`aMFj>αiӝxYTWǕ!Z=H\t0E5m7p;/>?c唖W+ܻM~.]:K˦;Y1!Jʊ p=x&ǣ̚SoQ\^7^DeG=aJ zLLF]Q@0R xLNZ}#̞WF0兌 xLLF=*1;DIi#ã8x d<}[Z8AK?TEe%/e+lTd{̯8︛B}D2Ju}=+W;7q6nVqJe(0*oųln݊/5\n=LBq3{|.^:C;-{$5x 7߁/Eub,m{!cllRo-߿!G;JnI|;+ba*އIhqŨdS8n'QfU3lJ׃7Ú߲5r1f)es}L5ƠWeph gƨ#3LiY!#ã^;3N_&ʊ}j 3+]{cfN8vkWCPd^=b#;#?Zw7/w:ކ,ߡ6|n~q>;1\g~ǡP$/=4U"'#>UHj*/=tq>0׮]NĨI^ jÐd~?}/{i^vϾkWyK=*jUch\"0kCѓT+ƗBr6c.u*6<<ȏOv|w{PM?1zteǡH* ^yY4FNG}Јu, =<\K'kC^4j''?ڕ˼qX.Ty|s />-4UT]";G̑/>+x?`[tS6J*LIbKLw242nnw6n+$1hF$:cGpy),ΧddcxF7T&#QNGaq3fchFU"0ǿ<ǝM|JK`Gp:HDr(]FilL!/QEV/fFi!%0$;Ãt7H8Me$n+GnY %1t_^l^^^i1%f5?UOq, K#;Mh,/D<E׈ig\r gp)LIֵp @ż~tz{>8ia3w.y%=νn>s!31|]BLmla9[4 OcJ& k6Yf-(iL0ᖖ|B$̫ pgN1ҲOZ&W0iqx$ 4?3D[[9rR)ϜJbM왧Kh;Kdٸ%?P^^JXo[BRMMg8|nX=e?aH]~k+ 5F,an+TLok%ƈ,N_ '{Hj 0{7{q).E`7D֧yvbbqͦ!y *OX}y 뻯vE\noallEE_$ɵk]<J}Y}س (-/̩/pfJx"žUHYy9c^ZHQb{,JKh?͆ $+B<7ַT<,voV-ӊ6{,67Zl#!rݽ `wJ&8?wE! sƓ墬|5˦;1w^xo%8C"&A$GLYlFG z}F$xLل^6mYՈExu#tSR6PM[C"LilBAtCށ˔fl4@/nC~۩nJf"axgMI,"I}l޺ ;324BoeJgQX\-YlN~ށ˔cHj h#0 Chٺ EӈF Dil"@<()+rqSRV@d"dL()+r07 J(%eE8N#Hy&#ǣHt:E-IJ LD8.Q 33\V/r{Dd(p}p{=(- :e"S^da':ar5_%3z<5 14UI2cF@hqk$9u|Y΢yYӑUkW7Tϗ}AM=IS\q+lyz!Td~dM |ibl.?-f=^Miܾ'[1w:;dζ41>ɇflesl6vp[xd.8=v.xtL~]v3s~Oc;x:!-qp 9xx4$I͚K9+&Cd")g'u] ֜<..~hT9!C%$K &9s֩(SpqL?vv O n"* XհB<#Eyg/db4JTVW XѸd"d4W#//uRYh +H$G{OX1YPUMp<F8W%/ɱXVLF}3aa^PUW"'F#{Yr Hᩪ"06"#Q,j <ìlXIBNDɷj.Z"yY QhEU}&X${_~|&Fc.YLeU5 ;w=O9\BUu?|Mwm4pS11.f׮\ d{Gyyi~*kk 9v#~X$+7&//_x15CV7``ϻoZ -B7 ^}OD" -/@Px#Hp%L IDATkTT?'Y۸C3A{z\<'|~4@54\v;-[!9U4-' qsnXf`ne=CN ;Gg;Kol.|q>=1]p9l^w]tMizw>+VqKV&&Ʊ[; +ts} oMi]sUT;%~~b=|5Q YwC Ba5a`*Kl;~YݴMӰՁU 0L RT\Р-?F7tqf疍[ F,GYհUM;$ZSv9/TAᴻظY3M3Y 0MLFdb³G >ݴ O$dY-玻fIBVY~s =`ذcJӚ 4.]ΦMb tF8! It$UQ5(,,4D&'0& Yf zťtS3h&6" L Ik6 +:n$L (a5)I׬GTLDL¼ʅq5A(ahvTrB ;eUM7P19PdfϞ$Vb1?]>%(f$& ~b*h6gCa|$EWPuݎi T+S\T誆Hv;~̫䉟#K.A]EQ$$q?`y*j 6v;45&)ȚH6 p/=W;q%.\BRQPt C0#;KN4MDQUMnc}\$'tIt݊1$\"$UX߃RyJDVUrk*6;O﵋&(KUdlvkhot!+*3z& sJjJRs Y4D2iNi }~?׮UWQdY"WMEϕNd5,+$5]wpk]h*$IUAj {&)*IEASUŖꈟ]5 Yٹi<~z]BVEd2IM͍nŘ { USQ-sOw ]EUb -}E7-pb&~zuL=n܌a0b.(2STΫtl =C^(hJBS qxn|37W:TE|G南lRZޫYH( *]Ot`]*b.uw#aY쩎:e#Ct;An^>tf&>?!UudegsNK"*иϏ|$b|\tbwzHT0MW6٧R*`Bf>?!5ux}\ppGqe3!UuudeeqZyƕM|GVL:;p8^1EY%TpӉ%Aֻ/˝dDdيfjY.4RNOVZ:+33F$lOS}Y1.DVi "!R8?, L+";7fCSa4E#uf GNN.6 UM U-$GnN.dQ#Y"mJ`(&kW&SxD$dOdInA9V9A0jM-dvTL^ܩP(*kd-&NJєfjZya4EMג,~rR?~4u%!3!ZxLxfCSatENf59tLEv&)YJa<y>=8dYKM DP^Yiij``M A4M γ{, oF,yl3 )z2H}$ 13' :!Gi2W"ش,/!#Ⱥij(8[X$L,kb|YY 񨺊(a?}<-MXZz 1<4H$.t %*^u*OC-[38' =} L?9V,~ OU 5#82dIϥ75x9 022d|]W ՚/fN][z|~Dcad]Pt644iC }A?C"!36"LSkj o%7𡡠k&J4h`M^[ַ3FQ CHFeFGi?;d(?g88H8A3U MEɄtV{bn'++9Bs}@sF)ddpP(妰xX4>ܽ_{S__TBN^!cn'ΓZ? <>O'+G~c`b, `EA 8cxYܩ&pyH6oPPTL"`,81oWߤx_PJn~>H6&G  p ~BӴz豝u kXaT_E)&;ކrL)~qDxp.^gɹSeg_XJ^^؈'qQ8 ;+'B$#/=C3ɹ -FKL2x(QLL|i~ROA $sd<8.FGCBLN]4ܾ7,֟egWPLN~!A.v.+CxJtܓZWO[^8򏍞 twur{XFZ7&Ak0㡰8's~] O}e\Ln^1d21_ssFe,x2֯G5dME@SUdYEVe~Mb3D yĢ _{0u4C'N8wB),DI<Ĕ$韞r,ogMtd]A3 q''I*mO~$EHXT_ .u-Ȋa,a*15hKUdډEe$$yXK]E1 4M'dq$,")xys]Ֆl~ /~?a~$( bb)L_DT46?/~/4?ocvGX$A !$ҳiq,˜_Z;b z;GGOu9${wFHBP(bELQ*z{WS?Ɇ }ذq~bVMD`IRk~[? 7rrQ RqE?tx)vlc9?ڕ9ٹgZؚ"f[n;`,/6wd Ξz{3wyWMO*EDŽϕKe<4ݻ_ٹyYNjy7ٻkq$ u+_u·8xA˯X![ߠ!`A+?Œͳ?o "c?<[E_^dkio<2هl\Z*:ϯQr졳\T.Ipy?`&G䑇Z#;_{>׮L9;%0_{O;N?R ){럸w; ve/S1R%RQ,ܟݷ,6pO4{ߟ~[8 >|XOĞA1>ˬ..4 |w-;O$&xcqQFB-q;s֏lR֎zIOX^ʎ "KDK>!`~gl3Gmb0Hmm 9_-]}/^y>s J$BՌP\}\T.I:[x?>tH(O}L(B8ᩗQ ;G7T^R" -nt 'NT"PiH @d֫X.{\_q聣ؽϿ婋ܻ;vCc@T Ba <gO ~wA*哛W{&ۘ{ndE cWC WO8cx/aqN?|()$z9r Ul?uM|r:2>vǏKϲ8gN"%c1$sg9k( 1"[7oyqg{xӓNhӌ2v(hCPh׽ͯ'x|Ͻ4sjG*0ܸ3wxb-%6~\~h RH>{˕U;ԙ3a?INNKϰ+FhѨWعw?&HeR|r16qygΟ8C";1`o#"Ksl޾`O?F;q^z)/hcPiͯ>.B^P(pJA|=c<x@eFۿbËܻ (pxLNePQ4v dyue>3J岍k'x /9=yXHOQ@a;J&ӟ%խtyc>c?puמA,sǭ[71חsib!JaJ!"W,`\?'&yg{h'O#d[=4F Zx>ɣy{Z|Hh\8Ӎ_AɞViԫF|OFXi .N{PR.ܧ^{B*vmn3*֊%e'%0Hzz..RRʭ[W9qTHc?QF!"T3K4UQ\r07˦8y4B* F*I:݋ O=E2dniFJm>oV*,--ٵ OB*OjE:AIi0yt2Y޽M5U|ϣ?c۳-$FQZγ$J2w(lK’TddY7h7l\R}ƃL*Z\ȮٵmmzF"">h鮺{T""zL{ܴaP0Jcٸ_Yҟxxܺ{hK.?˓[\QISb.߃$REk:i`H-Yf2}q3HF(*RdR)f+DdZIg9q>p(JJҽ/1.?Ki֪E1xxHB2tO㗍+L2D^@D8FK1@}R'^==IgnizJ_ ܼ}CHig(aH{PJ{>I8+eBq=&RMT]d,~c$TKUzi \>C)FE:1I:bniFF:G$"2AkH`ػs/; 8Gv'b/ɳoģ'sB!Rj=i[a}N(#|m,}'?|ELD4f^"6T*ɽE ^(7)m_ER1y4264 h'~!I[tv2vl2#=p(ܽs?!J0hG 8 Y^?I%YX\JZb9;Z(Vkn^$Izz3he'I&xzF_8P%?ݼ/Gc,VW=c՟00sH25uuzf=-e[s7D½as`9,ޟ#/ߗCJtE*~@0y48L"3HұȞ@+~D R*4H)<-~0PKaCO/r\PDD@T\tl8./BBqݷY\{oQY]f-${c #QPr»r9(LރVX!Zog:h b#ߕF!B*߼?1Vz4}ͰevA+o "4:jW8/nxJ(TA [K G'I i6Tv~Nu@17wѭ({|m` Qшԛ  M_?/e VN27w=S,pR JC)€h6\z o\?6P[mf aӶry~4OXBJ{KSuj 7/s3~:q(6oF._fii\r܌hVϺֈ"6oI7^KdEp¸IѰyyxx#:"RDA m'ן_fi>JXl~*MOq_X]\" fؼ};l7^ťr*hFfZyٺD$ fݶl6gtc?xW]tu'?Dqg@fsۍ.~I{wֽO^[\\a:8^~2LV~m|*+U`͑m^ɷ7(@M<5{QkGZ;%k'`6/xp`4[qݚں{N˔iZ¡ݻws+W} 9d3KLa FZ0PXw SV~-*it 'l<{;-.Y;̷p -߷X*+-iຎ?-kbyv:6?=,0}'x H86 _v9:߭W>-=|+?-ZX;N[vZu~Ѯów/`qq3#i6':'ظ]xS(it3J'O"h똭)wtR'GhsW" ]<21JeCwɺymf]~Zu_w~ڪEGZir]:c_\~>Kr$DUK:}pNЈ:f~ؕ#(O$I||HT ZnV)xO&I%=&s$6zǴuDzuYTD(aFDMAyoFeoY1Z? 9IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/led_trigger_on.png000066400000000000000000000003631366722712400242520ustar00rootroot00000000000000PNG  IHDR ;gAMA1_IDATxu D-ja7h2ؼl5 AP,LN8}iwY88Q<ԏ0>I$m{aIA<}n `V ĴOUpѕ ([$Xdz CIDATxjAJ".ԗP$R("/P zz ԋ!x-hh{l4Z7)g;v7eScfg>3e@]RE8=KQ\)XI2`p{rE/VHeCуn(Va{qb筏;y͍湍 u]ؚt;&Jy::'-,>v6_OMdj?eѨ^472 <+R/4hhhhh<)4iV@si[&24EI74k5h14+e24A:roh4@Z7 ͟/4K%h1"xbh ͪfhL ,syC3렙hhhhhhhhhЏӡ@ 4@ 4@SqʬHuHq N.ǹz-ҫom9&w"~s^\N~|/oE0Tj4'M&cLrO.c%{̇_SSF~ $L$3IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/masterMixerline_background.png000066400000000000000000000155571366722712400266510ustar00rootroot00000000000000PNG  IHDR~hmbKGD pHYs  tIME ;0IDATx]y՝[1g|1` lV(&TmBNK)RP&,[[ne<3F1#!itG׭{Z_3[۩Pv7R+:R3'XU]gȈ&(>.l~=&Ixaگ2மfi}!8a`ph&v\wյ&E߹.ƥ&L-TH/"~rNrx4 [%K. tcg-VN^e `4n&6vsZ GWŲ8~ ^|8l 놢(X+`0 vAx f``yi4٪ 2&'0 #*`Y`b|:Z^J"~nl= Pd $f#=BoŢ( Uk*Ξ9UU!Nx4EQGQaVʨBVVz<2 ܓh<"> hPUej[#pM` bN?%`[e7/9sXlŌI450:M3Nz^ZV.@e#jkV>/0yaq,׍xnȒ=HQӁy,l%t:=$ID8*pGC|G|D#[,sBUUN ="0f "TUVрcHtAQU5@_8krN5u$PxsLn1[TAcS X`?FFPS[o`1<ހ%K/0p@5pT"j7SFkG #7L=ݷoʴ^J;$IN aԂE!J"8┍FVYINԂF5mq| L,FIOU>qc "ď-Ν9>+.f59znD<'֨>~K4ҏE[ksQ~o޹Kķ6ӳEkkkIϞ=KxS.]ӊ7^{)v%U^lB>#N{)DA?1Z>v=v7ر?~藸cKMOvnyxv{\IE֓mK{GpǎxW""^UKxQێF|zTi|alzcƨϣg,Q#{};>?Ψ+q䞸6mޞ}qj;U&OE < \x(f#A=Oчv|HC ["P*_{Njrd'm//kl ;ҁeW-xzb'ww9{K[Գ/fM8a?6}ll5Ln{>o޿hs# râEKÅWvV/پMUSigPn}F'"D] iuh8Ez"Y鐮l.9!+Vr!7׋GT5iK'K0[Ɏ|'#ϪL]ϩY'9g[& w3qxnns1Et*3G/$ݎys2 5J~:c# iI_;|"H{ZP7GCL\$~g]r4}I"={5['΄ϨuJxWM/_Zk\_TO Dn)#~k7",pLvΣhYȻs]OL%YzlES>wv=0ٻgE끇9n=vlmz3>aZS{H`&DHOF~}H$:\\'>Qƙ 酌(۪ttc$*DDBC,I4l.dMb7`#X>oMdQ\ I=>ـj!uA$s s1eFiVDԣK>ւ-vMC* JZ^orST~oa16oZ8EQtܙϠdyL&+TU(P괕˰0,0[*,*lv|/I} Qaa >p(E``%X-$.zz{p)\V`D`y;kkH P?>4-^ Q и7v$ $A^f2QW_+###xϟ٤ġoDR_LRΜ>%+!tNsϽ`Yf attBPU ÀeYL&ر8t} Eq#lf{%>K;rUتD;wމ{ @e,Ϸ>tw |8ATq}P0,>>k׮Ess3Z-dY(EKK zzzݍ!XVU004Ah4^OcU[QUUMR?R?<QPYU E!֯_&, tttQ՘a/N$I0 Xl9N^ocy%> h4AQ[BeGBբ ,K<,^z8~H016W'Y0,dI$)hmm(y]]]hkkFydIJ f;v ðX,-PdFIq ~I}D9 0*pZ`X=3BPUF1:ڏFAh:h8 x>Y}DBCdc!c9HW/)a ĩ@d=ɲlx*@%gY,E# Q<80{G,ىF0Ѿ_0 UU!I":ݔШ>Ra7_˰\.'lJB!,]]]]Xz5X!@eȲ e¡ϸ Y_0ycX4@:|a> E,4Z:;;!" 0 9]DQ.ΝCeeev. " 1s%~]q *lUj8~c_,#c͚58~8իh!ܹs8}4f3 L&>?94@Uox󵗰㶯$ר>2(KnhX s Uhz VB jE{{;088L&0 @ > uuu| Ng˲] <5ePqi~ F Z8a0088n:ԩSq#}͆+,`0@㓏pI' y>ϣX,ZԌ^,m^oD þg=v;z{{!"l6DEwz.dsb5pOglzxxgY555exUƆM91 ߃p(XHS `1\<p # 54`ep8ީ @$PEl%~>>ځںEII?PI,zU0`YUVLN`6``00/pp (b57 ԧ I4~8wY/l6;& 㞀+&9NVp8R7X+]ۮݾ`wX̏|T_.id2*JfF̄(AQ r1Y"3qHez׶LHsiCM[-iTeTFvgnd(iJ$&iRg<Hgs;$ KRH}J=)(R? SbB:! ̏.E꿙 oO/&Q̏ /ϧWc͏$3?zݰX,b0zPSS˅f…hoh_??O>oϛ)I}(E#ٚ]~hmmVMi~rJ~<gq˖-χ( Ec$-̏TU^QS}6hem%X 8T͏H3F|nGɲ 0LQH)z2?*S'2@''H/t`l0?ڲekGW_=xY|p|>fY-Ƭ͏ґ_IgҧONGe2?ʗߚBo-e >AGe,d~6A0Ӌd~TB <}މ(bqT.B!bs)ζ,mڂ})$}߭ ߲(D6)~#2Iҙe[. ', q@H>m0 2?3*RHz[QJ=) ̏PLQG$Y [v9cDlytvvBE-lr>kE%}UUU0͐$ & }}Qp88HUUrKKCۊbTOGz'>R3?"#UQ!!{)}>vnLLLfaXn6l؀cɒ%$ ~& Vݝ`3?qW;nʜTKRdf̏Td~TBROGe*d~T(7#/S\}d`TG$9 a\SH#flIW.%eP~Qcs%D|BVq}4Qќ邘O#4lM٦Q=PR^̏UXpS*WO>Rp餹R'~>lIRO/Q=_zzE)Td@RO(B2z''reԜ %B&IJxtI=@RO 'H $z"@OROēԓ(IxzzEᡡK_5:W/.-?y krKN|~D/Zo޹mN/vv۶mz=oܶft~z(]Rr Yo@xeٳ "3<O~q޼}mÏ7|鶜m';7 ppCu7ܱc#DAnEcƴWnS?y}E|xܱc#رnlrz5nQn[Ws(ʈ嵃ؿsV߿c`P [2OxB# RE'~܏jeuu;s 6hJ45.V-ULb< D<'5+7_X0fIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/master_mute_off.png000066400000000000000000000010671366722712400244500ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxœ1hQoRPA28P%v.PĂP*b !SRPCCZRڤ) tP 7 <+7=^Tp}ޣ,34 K4R8r%bZs 2_XxޒoV6$^0k֙Z+t:EᏙG6gml<ٖylFFWZFҗWq}2_/-'9"C w?1g[As=L!B}SZs !X<`аCÑ)T}o>rɉ>~I;tzl޿ ?纕I2wb~l091 dIBK@qS\׍\aűޮ23h}5FVkΣnw;zIK+KՎ2WnG8~Tټ[ӎP{/WpQܮvt}c_顢epTzC^vt@y1SBݡIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/mixer_background.png000066400000000000000000000004441366722712400246120ustar00rootroot00000000000000PNG  IHDR e^gAMA1_IDATx횽0`J4. ̬,.F pA@)$"Rg!XP7TlP75=y>)dH~B ǔdD @uU[#y"Pw'uř qŦ/3;Up@ŘЈgd|ْNXTczx~\]^o2t0| Ϧaz+O~9+V6D %px<ѤK?3j_s%xÓW|8\#&3O{YvY$?[m$ )[Z`̈&ßtO?Q+\.q\39r$?Jykk+S*lx?f|_@,z_Hr. m;t>`"L7t)Mp<)K\Bx_5q/!i͟јD3.qgnJD i`ӥl~Gzs-ߋy.EOE3#! Z#7m%I/^M7F_ 1k{ܴ}#=sy|Kw!ψeY$grUhI yO?nꙗ'?n>P:u JRRXt~.+ʉWJX$I!#4,#L;]aESiEEEa0-w;cte0K D7%ۺ:9|pȹ,M8xF?4x.m$ DdtdphrLU^4KOM;crb'9s} .{qxp*C0OϔY^-Wm&i_~ C4 scccoNbb3rNNOiLClܲ-Wmx`oo/v=*sZ{vjYpgppp})磯xvP[{bEadxS4}p͇񉎐>'!I]VEw~$5W`dYF@:e6Yx%l޼>ؿWɃSX7{aiSȦ+cqrrrBռ^w$Λ1ǘY7C_z~ӕB(..tRZZZD3*( (ݍbh4<#77HފbvYx1 p@|O{{;!2yyy\.BUݷ_9=ש MӢNa{|#y^V\IGG$i@|)Z[[)..l6#2B'"XX,ZrΜn=:Xz .BV^MKK TWWSPP \.`ѢETTT011jEEqgXq4!Jq 9݊pl7>J  0Al.f (p\vr*P6]y N>nUsw"n2f7ÌIh̡ВbeӕdWQ{*z3p-WЦ'~t*2PsGHكuM&w&3LЌF{F1T z( hh4XUk$8c 7lf1ai 2~YK koko l^&pb,Rh+r"Fzh”UP2@3l?a]~mp:L mE-Xzg𙦙> ]{?p-f-@0qNLP`#ǘùnF))OqLffF+/s=\Ux * .eڍkǚl)b+`efF7~1? l*{(Z4׭Vt:|"(J`jh`TVaګPeŠ scԮVR`!?l/4SfpQu-45|OR_[Oʵ,Y Ȣ%'& A:h~2DL~^.n5AIq׿ޠh h_$IT yȪiapME4pG/DbTՇ=FDFECAEPUTIU 4YF4TMF@0#ffd^Euu|l݁RHNTIEEU$EFT}H*(((T5Zqu0^KP.qn$Y+x%OFTه䓐|n8=]XV!l]!462qKk`$yDB> WzDδdVR,rlЌ֌U\gjbz(QK+P5 IS$DQvsNÍޯ'tD#aNR^y +stxR , ]N;;`*+& uiU4:pElBV]Ϲ.ZO@Vʵkр;^ffdv1<0$/ψblg 4EAU%<.K瓧d%jjXܘ )28/Njpr 0dICUB-٠2?2:60MS}J #bmhY dfm"&U&E&]&mzMb$`h aȪ^M&MI38j2)KkzMF5&dL%(%®N>LUd2C)nC7I[gh -Iчusl\~9![ol8zZu oʈU VV.J^+t eW'܎<ɲrsz|}gWy276#ӥ?&k5g; hV5m#m3?] ̥`&˺{6@3OefpY9O;X$? .tӃmdVKSapm][A`MFv?&̕W}GZuc>/lMdyr('m+ :1qi99䘢qEQHިJ\OyyF$~DI:K,ޞJJJw%o%W_9p 7r### 5 ꋡ> 1g&;neD6D#:Duf߬hխnEu!;zM_2/2.Ln3~3^ 5oC4mWPۥCTь4Gu!fMjV:Du!CTѹQu^`sڊgڊRWg~FowM7nCUw}pWR}x٧P~=%4diooOh? `6)(H|KlOcCxx< u Lј u88]  A7888 s ֭ =VXXMH,Z CCCIIphhhAthhHh0D{܂h܃jM {kEu6644$Q˯q@tdd$)  -&s uuuI9zJgW܁VpR̬I:mkh@T'l9Go۱I?NA9#5z&?A"/=3!:&7c?ȏ9|0=k>C&9QWLȸ}@4д7}TQ:Du!CTQ:DuM+![QiEuVT[_Q5D+7g~VT'8 zg~Ilr}{a&ʑ&ϝK_F k7PRR֭[#8V"-[GGGxň+.K52,X afkFda6~5 "vۧ0~Zlin:~z^9fYr ~xͲiš3`F`:z#Zbg+R$8u?x0XQ1l6vIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/mixerline_background_on.png000066400000000000000000000130361366722712400261570ustar00rootroot00000000000000PNG  IHDR8o7ƷbKGD pHYs  tIME  'OIDATxyt[՝?OE-b;q,J)'BB^2@tҖaJsÙi̜-i:4@@ Ά8^ݲIo?d)Zm{;+=a5;PUM^ΟF PȠ>m8$T_tz mw="XGnI WNT šcT&%[|]~wuMMG{xQyJ#_0jk*i:і?}i蚛QobT G~KMH;yx*v - >];~:;E1q}{I76W^7ƊQۍ]}~bÀ+`C7P ~\Mh*-$AhgF20TAM]OG jB|ysx⩟Rbkn>W:q JRRX|Ml%]H .ŰUUt;1 dҥxӛLM N=W__O%qi7 OY0Wa``y˗E q ]CJQUӠ#UOY={,A A3"* P?=6fY&\| (=219'g'$&a6nΖQXX8{`oo/~.V5pj{7q:\,\ 888Ⱦy2+wPSs9BdYfdxVxQ-T><]FEr~,仕k<5H$Ith4ؼy }}}?q>P._m~~>wLvvF7 [ۇ#\.r_a2s_zr^mS+μvFx䛏",sINNCe˞={p:̟?Y~PUU`VV+]]],^k ycGͬ :;;<3w9|0V3_lUUU;wǏG~~>6lS ^0%3]tmTU-F1<<޽{Yb555 EE+**˱툢8$vƈldK{"o~#,z9tZdYZ6Ǘ`v/!;š>`=rɲm|4j[(Hss3(6*444PRRd21sc}Qt=-otC14(zBLBjˉȨABx,*2,=/`P6-a>ׅ,I%~)_|'`o ]XO,C@{R(xސqHlN 6bFT1t-􈢈hPT"18YYY!ng$Λ>K^7_ڿm!(,,rd D3kQQdYFeDQɄ^#;;Ǣ_3%{#t:D<C8ۙIp0<d>x'.y7jI=n7+WNgP@JKK F$I"//V$q"\(u]iE˖^3-i8̪kp8zj<Ap- f3(t!4r z qVU;`;I xL &"hɡ^ڵkx<[,֬YNnCvv6. QK9v];C(RT{Gk`;w{泌N^/cQxmf4Hz}ܨt&MW]YkXEMǥ޶\C,_G׾ddl排T5zUxa uM&w&2&?Uxx}OrA,XNqQncd<}=awj| Sdf&nFrF{e;b3<.bd߅*LZ5%TxM' ef^;{݊`"Rє '1n |puW?G`4_A>1A1,}{x>%Ɔƃ.diZyԮ\_5k7Qjٜl;pRa%ZG8u^|L<&@@L2:wSmW}\IA@oyf,|vWY\) Xp75+b Ǘ I t*'*U( +Qr-K!C@Eӳb1Ή S33 YrH&7'˃1AQa AEVeP6ǃWPСJLH wB(FQ؜]ND$TdUEAȠH*I(J*:}ĖLL~+ѷ a0?߉|EVPd,!*^< ȊJȲ(d5ZSb^z\?!:Hn#JȒ"yx=xqz:1:B}LLg::FG9׬A|ǍGzHqE.-ٰ"yn)w&xFkeO/XndT/< D˩[G),.CQU<A=NZ[I qڜHsuF=l >o$#0<4LיJ/cezN;BoOgAp ++()-::3 jyTUSXYv=绻h9u FPTT,V] Xq;:3v :÷ *5V+~Epcf83g XZj |?Tg\7~.ϼTŌ᳝46OR.%p) ɧOpwo<{_hvtѧ?eI~kL<htl[Ye*]4lU5 n>5󔕕ͪLAફ?S5qc9D'[s4I $~>q!>(z&"+..`GV!a,CTP=k-7PZZhIhbœAQQQBt]v[C>!ǭ#h:MHtFx%ra1ft5n"Kݰ㖰ZFta/Q- ATh:f-DEAT AT5GA4v*vx1XrFf\_5o 3I AThZ- j:d4YQ D5j AtCpq \̖o?se-uki?sKA!7ldpoܸu Ev~V0~鞄hxQ{+)f4drssioo{|OOhXb0ſ%h41!Zxø\.\.WܴNIh3aٰlqCvpppnA4)3 tuOHѡ48444 :44A47 gDT܃lN{˥kE3t_DlG-L&c?]Z ca`(**b֭;u]5y6|nD(.r:DTtlNgq 3]KyٜpVoL",i`sSgϴǽYZOgT/ML'^,8t&*ў?M5f'lf `6H+ 65hYd,+Af"IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/mixerline_label_background.png000066400000000000000000000005041366722712400266160ustar00rootroot00000000000000PNG  IHDRtSgAMA1_IDATx;@g wcXXhD B#ǡ xm| %"A?2͒]8IqFRS[tL>VQLjI]mvPjA$dKv9I "Z9B=bQxeB}_AU ؙ5NR{q]rng-(J(^ a J(J($#pv 3qwt=DW IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/mixerline_text_background.png000066400000000000000000000007411366722712400265260ustar00rootroot00000000000000PNG  IHDR&@ќgAMA1_IDATx͕1OP֢R!$b\L?D6&V'p/n qrjLL,„Cy= w{}jOA(]P`͔JtKE]t0X.*qxqUO"5!xD5}Xf=99Gi"zR Q b2_oP,X~SMG66.4YH=S)V;Z޼_+, BzU^kTP,bQ|}j4!llthJpkJٺeF c3ճ&}%'k~B\Iq~$/s_&AX7W/&A;N¾tBFT؊M)Tp\e|}}IIMgu'?W^MfXЈZS^a0b3famÇ1߫"2%AguMkb:: ߫}7ت`:ڀAg2ˈE1ϋZP|Bzmoj_߾ĦgڍT&hJжo#Ww@='NdΡ&E|YZj{坫3grk[Z;]ǒ R|9ulc^IJNڵjQsi.jny <(ueo߳Ȧ)}^[h^6' ;AK9H'vGDw;C=w/$/lt8N.]c"/Qd?@4E@DT**nbWŮ\ \U\BFƉw_ݴu?7`K в׉[{:2dyEq 8Hn臘"qkӺ%g-hf6Zw8lie_98ܱ]T\go۴t=NYZ75մIM9ohM45 푳UY'b -]/Z`!Z,]6SX ^Gg]\ptt/aȣn.8p٥-),ĥ;j FB"UťU;uݪlT1.n/JsszFDoW*88bdcXƐg @[/y5Mytf39{_0si3/>4Ψ04hTszt&;4?[ЊKر)(iժ9{꛵SciaWՂVPYC3A5[\-tFb= ڻOR6w<| ڜEsHo,j},:f٥"g Ǐ}/I=;S|-향%_%hJG'BJɦ Mp )))ʆЕh9*l&#eBWR-b/d6w n\A`ԨQ61!l;>⁘E6Sf:.\tq#b_䨈 ["6ma2k@ye%4o\]޽{Rd55֪"?jNNNpum߮m`5f0jBuMSKVYY(ma@rLĆr0_І 4A{ꩧH</h%j۷nǩLQDMVZl-snw7Lz}}Ϋ"-Q[cQ:|||HOZUn#m٧8*W7ٟ Pm]GF]kĘ8\VϬrFUnꙣ#^;׉eQ3Tȍ7r ܶe&՟$j%Zyy]~b:uG&Lj/740j,I݄/ƽh4:ywM͍RVKlml>r,j-݈Qϡ_x_lml䮣WgK5.i ^ 䮟%w#wL[­:vܩj0~ ]ʱ$L{Yrw`JRBE9WsrvsNr:+Lʕϗ,ʔre-\y;)gg(*J.Kg~)ɽTMʹUr^RW)W.[{!_5hEKaרI ]]mzxq,kӶ_ԭ[Wk׾3Za6R\7rqɪS=%ՔoîH̀x+ `)Y?p$EzQ5sE>o=!gnQ Tvލ (݁hx!fffTPxbxXyEU:թNuST:թt 05kq#nb̛77ח)-T:թNuۉWO5TT:թN֙|.>L`Fy ptt|STʜ> wa$>- 8^3 x1I']}}..*$]ORT\7[uyCGb?(-8w ceeT:\ Lpb'邁)*$a`X'N 7ztm96m]``W]]It2+epRI`m$DH` ;[w w{թofd?;͹0>!x_Lij[̌M`cDSTՓtptc$ Ftg%݀p$>Iw9\I9]ss|WY%J>I`iAm[ eiۤ:թNug룬źThGoʊtΜ9`s<64Xp9T:.d E[vttmю.Wʵ!js|sEiv,rۣPRnF[5EnͪPk=%33SEn^OJrm܁{ZO /o!ǼhШ ssf-]ؾ5lba(C[C /\r}Ο;G~AKOOԩ8ɓ')(( @Н>}C~>qXޞE9 C4K4VNuG:Ԑ__&55DVˣ'7uRQM./_ΔRy sׯ_ARn0}c+-gObАa7As`a21j=b?)wV"E۴a {vmaB勬^>A#\bb"k89; -~nnՅS03W2b~IN݄CV.AC l\aBϏ?BݮQR̩ﰳNB.]&\fBҲ,۶l`BƆ-[p&Nv>IA\pQ-^0 N0M9qcim/~%Bs$䬭]8S988|,9`0 e 8}^6W^CsՓ +a0HpdBj9v{H{qsNu8Mmນp0___ͩUT#YOX%$\HvNmٴ_}ΣGVs!Dz"t>)$@AfKbn ՁKΖsgOG9{TG1נacl}_ K>[? rBØ2ȍkeHIϬiܰc{cC!By{p7a:|+'v3,f֍voq5spp$//WؕO܅gWۿ EEEӹkoahҴVkrTr7 > {߻ ʂSYnee2jX_.rsr:0=@7x{PWruԯN_֮ZF菝5)p,_2wpuͱET)`GfC&WCA&ON¥&IKȖa\|Kq)8{Yp~8>t\ Ξ69NCb ߴ|eXh\l\JEn\7G M!˃dMN%rۢ"ܔs̤o7Lωvg\EVVGnNz۞*N.(r;s,]At7Op3,zqraTܺcb}r&OLGQbŘS\fF:"Pb`*F#+iԸb׳Gww̶ -[kg3ܺ- 9}^.+6p$fTwTؽؔvZ&LvVVL1{hJ)(4L-[Qʭ "6l)"A K H!CGG^^ [ʵnӎ&-Bϯ!KWl`O^ʕJ999bf B\r,YKK+tlҲ,-\=IIIYsSb%!1&VCuIJJ"9"Y/ F>Y)rׯęLgv6F-x{7 sV:Tƌ5Ӏs `3lHO;]\vQ{(2!+oC^Cea8^& ztSR͵:4w맛̙5v;Q?@~-3fT*vW.'t\. {b(m?Ǻ]!Nёx_w~ȅ, dff́}{ؾm#"vP`,$ȕ*WLa-&?ԴG߼np.ԨY[u9i>r cF"V.bfƝh4!O=iXI.uTa2EtQ*RW])r+$*J9[{)giUN(Fcc'g,䅺B̤f)(C^N(S giUNK9 .RˮRγf)(kסs{{8rrr8t萐`\)7wJPVR+DCXĎ82Ou;%8&o^Cg9[;G"v(Υ˄E=rfmZ"v!l9{XsʵQ|0ܴZu1{n(&ׯ) (g=F 41Ҫmg\&-IAѱ>%q$f?B4@Vf&...IJf٪Hzt:W^‚\._z<%8w^x:rrrܫo x)׼]fkZW+(r11IDATŜCdgg:Ë+ (չ!\tt" ȔpCuST:թNu )OZY6ţ$wM^zB:5|KoҋR``1΁a&Z wOsr=zuێS&NU:3(qq:to.G?3e=ijukJK;[[P(Yz1`0U9`o@Y@E:D':щNtD':;u 0:v^n:`gBYvNZrT*l (--᧫9D':щNtD':щNtv&sվEc㥾߿G1fL7/_f~ZǫyۿpwwE!< Ox'< U=.A2ze2zig iPV#kTLQ p;dWo Vx'< OxyNȩT*ROVT_vy(="Cvo8::>'< Ox5䌌^%A=TOt.0 %"W!y2z?R}r^S`,pAF 5rx@_'^;|mʄ'tt:DѠh4p`Τ%u{^cee'< Ox_ u2z.q0ɻs@4P.ИKeR&d452zS#W^FJf/7'2z){!-r{P%PIL[Z Lrd Q\9OVF/0Ox(< ɌK327{83|^RDTRRRBee%zlllh4P(ʎeѥ-'< Oo`n&s3Y(W T4h2y>cq15   l^yy9ٶVot:d UdTʫl%C&/Gy瘭i42x.1[yS[  8 OxLZg]a$YZO7w8uxyy쌅z^GՒMFFfff`mmBaMԶTǫh4Oxg0ͺB#?ؿbiMGG5Ɐ;vN|%,k hOxqN$WŤ)Q#kɽÉHO;qv~Mr/11i'hڬ(wi7慬խ^rr2Y7?[oeɒ{2\?,'LE.Kݾەْ{LdLRٙ5+q\*fѷgX:~?NÆd|(-4m42ymtT&dnX [ Ox'<]FC/D8p vvvb41;BŅ{V177GӦ7J5)) Ux>CxWޡxqvqATOspx‹'iy@e"l ,xщ_Sa@eE(3.bmezZ2 /*r~+XY5xa^+5É :Çra^nB3},^ZZ*kg${wbcW7ɼt֕}놹daø}M>:ccX2oذḹ{;.]8;˒y ۽9=;h4j'7p@t}R~<Okt{-I=W7=ZsaN坞011̳ï$&$^ 6soٚ [a𒤞%%jnݼNF Z355bnnAN]$Z-Ǐ&`jfF%F#xPY{wplzWwɽCq{}Β{.c(\\[2j$ɽX8? K~?$UU̜6 %;JF/s.#'HL84w˯]RBz_Κƒ4e&H3?%%:tfz|0m[~D2h43f +ʥ4om%XpG'/;8Q{Pt4h3Ǟ}o.ףHI>mr1 KK̭{6W^㌶]=xF‚|Rt2)oKԓPXY7mQyJz VܾJ[+T^I[?B{8\ UdW3}Ԁʶ:hPդ^Ša(%:=F֭<())+++ZzxZ~;ͮHټ?_e{Fټiټq,^Ey)GKd ћYdA!ɧv) I8w&nQ0sfMKII!{c_o"h$M;|3'3c8&d˜W'K=c2؛ѐ]N^ G⶯WQVZ'/zlѬ=,Qk8cmsyAOyy9u@<0 /55W^Ϫ!{wzfz}fBfž¶4#xF Ǎxz#:65[0L8Q̸ ױc'6l%r{<}~s5S%Zyx0}f0b0qtg԰~>yDGG'ֆEr&JL3G$:-cO%|.Z4c $<7KÓN@'ZҒ⧼)ݹbu-'o]WQ^Lo_槶g'TǥN[LoOlS=O@:zF c0i$A3&2sV/_M1_fEћ9y,bi9ASYd{⢸|,EO^[8?a+HK9Iۻਪ;߻o6 KH$$HO$@ !<"*U,mQ1Ъ:vDU|L1*QC B6ٻ{wbÐ^wf?wvs3眽9]w(ëוO{r*:6{y~Ϭ[ÿ^rLos8Pnދ/lH!ݼ7^{ǿ,/ގר=qٞ#|]vv ɭz|(?d aa ʡ`´y>̉jf ү` &5&{#F3$^xx8}qqtut'-?1]q 5. -WV ņjm\k>oᅅp 4߭0||Kż P{.5 -,Yt/M-Eyaaa8WȌu*i}3ws.x55xqWuq\ۿ==^L=fP mJ5/Ow©?a.WΣĐ1xC2s+l޴Ht\kliI)lyn=OY @>d v^{ `XJ^/](v&[%ɓ' a.s54-'nE\q'VM+kT2A'guuu$&&RZZkݝۙ\4; 3{bhn8UUeTTTt:1 vn7;Kij K{yv45X>9۳onpb/-&_KԴlr\.y\wc'LHjAl(2G0L:쫮#U@{ #wts-`B&2K&XmH^CF]@\z$j>'=ت6=/QLzz鋣[wfKO x grF-6 v{bHy}X,JL xeeeҽ{w4MzO<O<O<O<CGQFcyGSyhNt+\M%<<|lӵ)0h(0:m-)渦R Էӳ!ٌ+ęzq/)f8O4"IBM™loin7)% p2,k㧒7n]bRILL LHbTxOexh~n{>^iNe\L&omo CC?qbz?fBP=zxa3b&!#jqC[=L|rr[.n}}.Y?iQ+x3Xv2R]yI˱l$%%aQtK}}=(–8SwU3;p:x* br`ee]:X 'x'x'x'x'x≷yg뎑O`C{e7cCTw:xFE-)GrorAgK̚5 Deee`[łl@Q3nUU nS^^ήmJz`%boow-^ +h}M<O<O<O<O<Oq233Bi"Q&Dg)!Nۯu9 }|,a)/+ UC"//ᛷcGJRWBJRDY/7")I HK;G^^>n}CfRRr/wX#bve()koMI H۬_pt4SQDt$%a?uۇh'Me2"YڛHͦaO?/ч`a@al).}dzN@) za6t UYEky’[W;g;%hŵXwu۟,Ka&z- 7̲UaUTV)Y:(mhlcT.˶"t{3prQ cy ߌA=5vݺs^ԓ ɔv;-ŻQƉy(D̗"%)7nbĈr{ (|ᛷ@h3*xz%+L͈spAɹC_#*p6VsMf>U5I3 (q= )񱀙 8bqIOTnfVXZʙOWg&]4134]'њۈ󠥵f!aRG)-9ARRG'W)c.¢UX M*,FyX}J]fhĐ{ѽ+,,-affqŀ1zv-.ؤ m`aa)GEUa($uk﷔1hJ=׈QJu1s1IJ"aaW/1sZdqpFK%cnbJbY_af.8˹X ~Ji?oSPZ723aHJo36<+I`kۍ gObf`m4U(񇭔V؀,mJ { -(pڱ/}>Qڢ.%є`"P[3ZxΝqpҡ7tF]>c+UU+nҚvDO[)of5_] ςW!77ZZZpo,H`g$,@ Jzݹ]Ai~~cqeJ5jD(N?zh7o\%idebaѾZh+id+'ZD>Kmy=썂(,%\{/eV6(5q$lP`wBhMkzH4HV`ZZ|Rle fЩXիCammVWYXX@"< T֭YuadlVwLjUvɉe]{Oz6~Gs, ÚoL;r 1N,--1u/͘Rgעխ|!`jfN۳; *ҫrFb7 AsnY[UU-D҆6 Vz'yjr".{wEprKqX4νNGGΝn=p!nYC@4kq6$Fw1'#C]sc FCO?Bܚvw,0xڨRݍA*P7 WN,~0L+:[<{@lƃup8b|H$tx:[4B,,iuԬ -,>=:w6U++#x8p݉8 \B_@ѣF_設x~Eps_KKn]/vÐa#(wP}p.`9] zGDV;6ǎđC{ g;GZZq1'`n*>dAcCb#*;:]]]ήjw<ޡN(|Z2,-m4W /Xa/J!&O @IMUYzΜ5 xH_K l6V7q ;8b v/ՙoJ:@q'B"$;|]H0Oo]záθwR'H0C:UAUpp\ڝp>?F;;8C$t~Kǁ hwaμק՝OKF'̩DLhuǎĐa#1ݡw-Q슾Gõw?t&8jt6=ɻL6J}(:Ki#9&iC'gZ݊eƝq Eg"RpN.0C$NDA~||>z|]H*6߮@5;~g]Ey1,> &p/\ͥ]>cu: .=z*u0++.sl\+Baai8#'a`ub欹066yngVeX,FHeg 8+YwfAO8Ap0y\ . (Xj[o]ͥP%BCqEͥLͮ⒦j]EfcfEKsZ~u;?=yy9gp=<܀w<!quusyzP^#aՀML|swصЉ-ڒ=ilukZPbo{X{q9?ܶo44iwQThK]=i85^uaRίj5o%&6>g ^ UFh^^υժUٳ|zp/yJԋ8:,*Y)r#W^9SWp5SNP N z\lܙh\\FXr)r)r)ro4sZj%c_:]Lޭܟ@_?8@1SN9xnǭ\Ikrtk xTҍH8#ݒA5tyQ4pi;p@[,p.)r"NӺ]Ǚ;ə'03<-yܸh\jF r)=u$'xGDk,赬FHJ@Kzc&(4c&󼄻3\i&nOI/Mh|B[r$BK R/d˼qO%kJfF.h5SN߱szKo[tʘIqEz=ƔI0 )#** łbh4k.(( _rmC0)𬄳U~a֫'V,_ = C2c|a׫3>w9nBnP zq8Qu$ 9)3kY46m+iؘ \WHNYD#Յܶ-: kW/Չ$2]Tg/zogٸi=s;?OxH!{ =;r9;1ql!g0IԃUon1-yG|.&28V!mk*G[ 175ڴ&t:#^#, {ѬӄKAAB.d9OPPuܹ`w'}vq+5ci{uVpi;hAW5rS pIlfݺuDGGcZ)h4;rDqUj?reK8w4\XUƥmZr]] K6Kszn\rYȥ$B^9}+!Y>;rP5~ }{>Gr3f-`hb/A[lN}S_lfLMr/AF$Ir?%%r̘=ʵ:e: mMv?s׏bsSo4 8Ʋů3rh_F'* m9/gOHJK.>s1dWΝ=Mڦu|se+p99|u \ TLQa5k{qΔp1nɇ_ ZNbΝ|ƌwbZquuٙrWS'[W ԍ9t#a7cx^,nNNrִBnQ\gssKe稻 %(Z-3h0`2XnCЕq%f-_l-PӖig>8~s,ʹ[qGlXIr-ߕ' ‚;q57tؽ`%%%l\Z:ztekFVǏM[{g+))aӖX,,^vc^#Sy//oaW+"I ;O&N%l6Sg̓rs歐rrKV%V}GmH)6mًdvVdh4 I1HCFP\\LqqֽkӮO$d2 &,^,jGa4J(+צ ?eR sssgμxW!++aRӓP- Hi4FDhXYYY;:uA\deem78'''jGo 9l6ׅܷ3n4fkM$mZ;-~57f qѸL^qfA|4 @K@aN1o}]|ƌݞ˻IҘDhD+"";g]cQ3N]{ۿϊܕ_&yt'?qUSpv؝ f3oW'%,^G.;s(**AܼƏMdX,f3BxlOOet!71iwn-G݀>#{S. oPFhFGv6u@QW;"ظҧvu1t gg ݐ2At!g~k׮R.""Ba׊vFmy"ΨCG$ ;ggg &':v!^=HʵlkҴkTիPՎ#jKjAR׷r+J9FII* ;*Jo`ŝ3bah0 ®reW)%KG\Dh)xӄt \\܋0 ߿_M4Sz}ݹ8얯#7n?X>G]7!NqI8WN;=.#}N㼼f}:lO  ftN[;^5ٰn9~;] ՛8~aQ4sEiLLJLf7nꐋmؘ~yMGkE]&EEE{.fYFJt?F#x0~uߢ$jE2wj kӾGMtȍzx \2ɶVq>UAW<2o(,,{+r)r)/6tй]Kҥi{HIDAT˄`2hJP{oOxeJ`,g񌄞7zF]wQۓ'-f=xQcɼ4]b-L؊3-=%󲲲R7v):R2o!BlTwҮ}g% W+vlf[h[fyk=LO%1>N mIӥܾ}vsJI=xy&}M9on])<t{{9˯ZT3jEnzJ-juW._V>z *mcTҡc=AϡX[[՞{fۢya%숥RM~4h"G~^.=ꇇ#zI =s}N'ؾ- ^ +WR|ysfT*aCI=}u5L͛MA~zfoCfs"+ͰHFo$|m4e$OdT1n4:u*W"-0x^UoC`˦Ti40 dl&.6% pTnMZ-:woCfsp. ryqSjɼDn\\xR(k&m|9]` -01Q9{*[[[ֶ5/_Tdt3͔zԔxU*38M?JK_/+{* :vaQ#lmet{*:6~^RAf^? I=> GgWڷN4:u^e,/I\X *++h4oœ蕔\gORl޵kWپ5J6O!w<# +d4ۻU+}&,#W^^FCZ9Ip<#c67_2kIcǎQ5ql_ɂ_1c|ltv}^#wӧc@ƍQe}BgW:מqk<a>/#c4{ xbirqovvū֘unݺgWݷ%u/--^`08 Oo:}6eeL6YolJv&n%pF xC}HdN.&MWٳ7EqKzgw_3"?'3%u{)S?cST"&%r#s:w&njƍJzFuԽ93>ȞzޭNn88I=šoHڵ zF:|??æ %^Ө('|r=;;{NL3L@Үxz 3#U׷#W.$$jٍRYb,ݱeRL%-MMv{6gyh ܋;xW?R)Gؒoܥ;+DyVݓgNݽVF2샏$1CY&|77wɼ#|8Of| 瞓;I.=lf_F׮%Ϋ8l&(4o#w `A$'ӷ{,\ ]O^n/̞c'Kx5fھﲷ?ᕖM(+-R}~X{?=w֭Fm#ju=.o^{LO>Kܾ%h0h4>ԋߺ/ۇb>Zc=DgaKB8sIY0˖~C\&R~ f=jo{m7k,CΜ:AyٍukBH?͛CJo¹lߺCJoE:V+!|%'^b"|lQ>`C0LFӡppp ??WWW*+̟7‚<ܚ6÷NNF FR Fߊ';u8/Zm|y{ի'ƈ+=hncc͹Mk(/Ɔ>}j(:Nfgqt&UgpGCDuuխS5p}=( YA\eY^*( "cbkFh1ϾEGÖvs]xKbf^~A ys5?=f^}?q.6fndh-)Tjs _PCЬ?mɩzM=s8M=>LSʻ|ÏWl6ӇԻ5Mn |~66pfކn ̻ y˯rՈ=JX\}y*) ͼ%i͜ǓsedyiS|AzVېއ~ob|^zcGD ;zb6lmK5_k~:ˁ~޺ =|ӁCϙ3ѣtb׮zy9d'0>H{X']]uc:oI)Y vNяhm7_pc8!_w=]ꏼ3OCl%$磼bo?) _K ~) p=3(y=` SU-<yiYd x<(|ݬ[swH53VqT._C@m!nCN=ÚX\VI57*/Xvb`絵w_0mU{Xr-E XFE@IKy^ٲuK$;'A{ {n sټe;EIIM)OO${x!\ô, 6ǁs$Z)0!(L: 1N7h4^}}=$$$~B{)x'S<O<.'x}sSF.Yxwy~EQ0A 5Qݼ"Z49 էpzyյ5Tn>g0`#5m*9򘘐Ni'Az&[r*m rX[C*1㙞5E.j.r^[ì1,q-G.$&6 /њ̢ҥ-]AQ³}$%%]k|Oɠb%Kʗx奿C3sɝ=7_jFR҅SIKmiP lCYv?NCC$''c2P۱XV9}4QQQ(sI;[Zz&^l4ƪ=L Hxŀjq!&4*<ެ&=O<Oo7j.YoNKO<"{y-M<-x[8(x'7;sN9B}7SJ Az:E!!rW1BEv'P۟:[RJ 6n}Xmmmg}E˜q\nf3&wxE {6VA ^bs`6sP<O<2Z/x]/O<fo̼fO<Og$PEo_Q`'jW0=k)ʁ˩S*=7'M"-= )pFӡ( ^O::hc{ibd: 9'x'x'x'x'x'x'zJAqa^NW'x'x'x'x'x'x'x#O~SIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showFX_off.png000066400000000000000000000007351366722712400233420ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxœ;KAF),҈bİA4S Q "B T+AP">A%bB))S#Z5nր#3Lmv:ʼnCQ T'H8 KB- zcz?bg:`_ZѶP*\X$!si}FG7UٴM~C2fs(5m/²ܗ40A~LoY)g^vrDvr?=OFJLx,d:nm!Խ7wϴ~q|vE<NWڪ*^;y GM,aE=k ?/\){+t^4>>@DDj|B5xA{tSIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showFX_on.png000066400000000000000000000010501366722712400231730ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxŔ?hQ_zDQ Bjł!P&hNYzN.tp/,H.̒b*N:fqW ipwkz?xw߽w(m(L@YES q |' !xq"VHhqg`lY^|`i~뇧GZEV`c?Z]Ƣa헾~3}r3xc'&!0uݭtqn.Nq)m`LaoB4M~ÑB>-~%=54MvN1(da=q{?Cɧf4lX XEq飐R?E:=,fPwVh6oR)+S P~4? nCw}Ϟ wW?sVdH/ n;0trυZУx:J heUGm_@]t}/R8+:2V.N28q8ݹdD<NǝIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showFX_over.png000066400000000000000000000010631366722712400235360ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxŕ?hQ?[dR:XQl{Nb0IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showMixer_off.png000066400000000000000000000010441366722712400241030ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxœ=haWoRPA2:KSBp  "$S"`DHC?і)|`B-W2=rɝx}||P_q.1w]-'Lż9y[w04ly̭݃3k%{! :kٞN%6@l46SW gf3guoח(= 'R[k7(̯`@h I%;-ZnɤzM-LL)%RЬY+ 9TH>SzA45t3n|r{ D\glm@>4k]UP?o`v:w ϟ=,SW} *^Wmk:(ܽ?K)^Ƶ1cǏѮw45wWt^N!XZxuVQwMbfjIIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showMixer_on.png000066400000000000000000000011331366722712400237440ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxŔ?haoz*(EAZ(4P *8up݅qꠒAACT,d!!5~'wK<||U-TV Q޿&0,M8.|`I52`a6|rwOX%fG kh[?x3 }f `fƣ:]9EEqymLSBBuOoX:K `}NYQ҂YQnĉ#Po[p^cZ%EaV|چ]_dԓ|}ԹZ8cC2|J̛hBw2즆a!cKKxqoʍf&YȈ;ZG֟v `![{H7L&~X"t];y}Ϟ5%p}Xq<j 3 ĚQg$Xo&ϫ/M:IENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showMixer_over.png000066400000000000000000000011321366722712400243020ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxŕ?hq?XAd/R ƩD ](RLvmD:X])/C%rIxw陴 سk|xhe$G,w&ru1#riGJĘz0 TЯu]MGX*ouj \Z?hC[Yy"-tsc=8O\hmnSPLϤEF5xa0͝Kƣd2i;T"jhN&[ P3ˏ4MEPTT Cיbv~!uz9>q<} ~pı0s/oܾri'_D,B[2%43-zEv gH/|^/b?ݵw,s%666M$n/!̽퉖y Q8?TˆIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showPeaks_off.png000066400000000000000000000010571366722712400240660ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxœ1hQWoRPA2bTҐs0.N NbC,RJpՂt`J"-i`@A6\nAx)C|ޥpG(΁ڦ2s{7/jmk_kڶzl_qJ!!Fն(ZYZm@kD\`vm{oq \]Okt>~XB}jm /[$0C FԽۍWɯ&)DJ:ѿ6=3OʲWbyj/\ ŇfZQ$TLQ 3"޽os1N2wbhHӉjгq޼uq#y%&'r>ۘq~:aG=)q?&pSϏU6W#sO滯$G+Îv]z)T ߥenW*EIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showPeaks_on.png000066400000000000000000000010721366722712400237250ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_IDATxŕ?hq?xtufP 1qv3=ZD:*=,СKҡ dJ+V$!\ %w%/<~Ud`j"(Q |nz^~@|[DM##C ),ek_D1tLq˲K+@c@iE>l>G]Bu7.\?Ӹ(b-Ēӊ)4Y׍փk00M3Z1\qVQ*淄z:K{F⍋igeY!_*q<^*V ]fUm #o֋zI$'0Y }S$V<@;`G s8=װ0s|+.Mi뺑u5YoUxKNN=KspuFyB.Lww_ /5IIENDB`hydrogen-1.0.0-rc1/data/img/gray/mixerPanel/showPeaks_over.png000066400000000000000000000011671366722712400242710ustar00rootroot00000000000000PNG  IHDR* mCgAMA1_.IDATxŕ=hSQ%Nڡ1)BNDq(dTP0q,"bK5TH,M)=ɹI*};9{{?(d:GUb@*3ryD8>|.d_g8^k@Q"kSv6$n p< p ?[m =0l2UV\+SUbjT`uiF*/OmSzbwb͊5 D%b/*\+byRR>+y62Wu `)K RwƋw \|{\'_xAC-eT`K zl( pl1(ob?NG7/~KZT.}g _?=܋"f7|;-J8OyS= ~}o_f.cDK"lQ(OU_o7?u3TjN++kcUQ'-P{1x1u_IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/000077500000000000000000000000001366722712400212775ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/patternEditor/background_channel.png000066400000000000000000000013761366722712400256230ustar00rootroot00000000000000PNG  IHDRacgAMA a cHRMz&u0`:pQ<PLTE8;Dsz@ER#'3"&2UZiRWd15=ڐӖˊāzᤪrxkq~x~ҕci{}pv\btv|ioagy/5GIOa:>Hu|t{A+tRNSbKGD pHYs  tIME YIDATHǵkO@E,ժmʫZ U!/8'rvɮ89tLBY hUN  T juEM hw:]Tez*[ymY7f j%$*W$FcUOVNgi3[P t xVa-cM5"°wQ հB73Ko+$`(/sp8&ǃ# %%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/background_rec-new.png000066400000000000000000000037751366722712400255600ustar00rootroot00000000000000PNG  IHDRKptgAMA a cHRMz&u0`:pQ<PLTE@ER#'3:=FUZiRWdu|^j@RjO^vsz|sxsy|puotouqw{}tyrxpvx~~ӱKUekru{uzw}lrylxqv{ [_l  79@w}ɢ@K\$.?lq%',&(-ns#%*tz IMX PT_eq CGPjo~IIImsmr `drgl{ X]i^cp>IZ%/@lyQso]bn ,.4$&,M\p+.4$&+MP\ntmmm35<,/5?BK"$(bguz5ASk{)+1!%fkz "&EISHKVcguP^rzFISV[g aes8;C=I[szQUaSWcW\hQVaSVbejy\i~S`vM]tEUkT[bKGD{Oҵ pHYs  tIME YIDATHc``Ā  >6 .vff6A r7"ppdB0/ `&'7?q CVdq D/"rE9E%$yedd8%ASeU ɭu L#'D6'.-ER :Γ774261557W9yNΖ&.2P-n^>ަ~P'(.T;8$<' #"ã#c')r^RRrJjCzFRyY9yἮQP-FEz%%z(+2>-Z@"}C@zU333W2d%S r^B]}CzdtSs;*\12"zzRn&L4+A8yZn&nZ jd)SYFNp>c,fvp0wٳΛ_ < -Zы/ .[b"V/+=KqvњG߰QM6oٺaMPBogBB%-ݻD۴w>(ڄp^8v6=X\{|Ӧ`lִ'uǎX y'Ai3@ b_=⥉^͟ u8p^@*Fś/ߪ+?yἓpշ)N{@~y@,#<}ċ-$y!A,I)^Χ^y++S~:{Ҽb"Š };r/EާO<`Zda+Ţg389?"W5`T-p!,k P3ZE:S@  I𒩏`C<Ў:1`̀p@Ԭy%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/background_res-new.png000066400000000000000000000017661366722712400255760ustar00rootroot00000000000000PNG  IHDRzgAMA a cHRMz&u0`:pQ<5PLTE@ER#'3:=FUZiRWdu|Z^kPT_kp!#'ejyMQ\c8:B EHRotLP[v|pv"#( w}kpHLVhm{}|SWc_cqӖ\`m [_l $:=Epu;>FmsZ]fFJTchvzW[hqv#|syVYbsxOS^ ntVZgADNX\h{tyRU^x~QUa_dq7:BX\gx~ҕpvioagy%^tRNSpS'bKGDf,% pHYs  tIME YIDATH喉N0VtZEQqx:QoʹPRBtdKo_֭} 4jvnA@NMI˄4NtYrxV";h'"chf!Bbl0Lm8^" @eEℇQTE/h3` "LYRv!8^d~aq)Mq{Aʊefֽֆ]("21w ޲,SV@s8"Q.dUNjO/K蒾  "(si2흚ET^j=ʊD8Odx.-B ]G$_^I# ""u'pU?>?]"@E|I=ۆ6%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/background_zoom-new.png000066400000000000000000000016511366722712400257620ustar00rootroot00000000000000PNG  IHDRIgAMA a cHRMz&u0`:pQ<8PLTE@ER#'3:=FUZiRWdu|15=.07=@IMP[9;C}NQ\TXd79Ajo~otin}Z_kRVa[_l]an=@HCFP13:ejyӖ|47>029PT_!qw"ˎ35< |,.4W[g !#'KNY:=E鬲ćOS^ w}~')/+-37:BX\hᤪ#/18 rwUYeuzx~mr~ҕpvw|ioagy0JbKGDg[ pHYs  tIME YYIDAT8˭kS@@k53*,ifw(+ewa⃜2 ÂtCrzAU ~`BNMKAJ " GGbbjcM` RLNMlj.ϋa,1BBXiyEf>Znq#۴ąv2%ZG<#a1-BRqNN -3R:ȓ\9zyu]0onhE`)=0VM=u1 ^i,q" UP Ѐ#ǧ̗zBJŒ̷WE`_{r|: $%HӖZ]fVYbRU^OR[x~ҕpvioagybKGDqtIME Y\IDATM[ DV@T_I1iJ_D\Mؔ9ʰPh-Թ=; "#0LPB3TZYmy턮[;k?{1E X%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_dropdown_on.png000066400000000000000000000006721366722712400252050ustar00rootroot00000000000000PNG  IHDR E5NgAMA1_ cHRMz&u0`:pQ<ZPLTE:>HH9qZAyP˜W/g_ڄ+cf|'_nu$\mbKGDqtIME Y]IDATM[ D|E-_I1iJ_Dl dj2ji5 u?' P/(2@cJi ;Cˊ{vh=!Z_y2`%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_dropdown_over.png000066400000000000000000000007131366722712400255400ustar00rootroot00000000000000PNG  IHDR E5NgAMA1_ cHRMz&u0`:pQ<lPLTE:>HѿȶޖM`{I\w虭EXs㑦BUp݉؂:CbKGD#*bl:tIME Y\IDATMG0 DQޓ@B?$m,{0qI1J, sBU6ѺkcmG=#4Cy6yo%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_drum_piano_off.png000066400000000000000000000010011366722712400256270ustar00rootroot00000000000000PNG  IHDR xu(gAMA a cHRMz&u0`:pQ<KPLTE)5D*5EFWoCUm?Pg@Rj߻ԬIII}}zmmmtRNS!bKGD a pHYs  tIME YgIDAT]0a6N ŢŽY8 4xz_xYPJ7 DD4mD f ҥwWT۸CZY\;ƿ/^DY;@ -]atEXtCommentCreated with GIMPW%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_drum_piano_on.png000066400000000000000000000012101366722712400254730ustar00rootroot00000000000000PNG  IHDR xu(gAMA a cHRMz&u0`:pQ<PLTE)5D*5EFWoCUm?Pg3$uE,}agy$$$mmmں;BJ}~S"i}Sii`TUk@A)h/tRNS!bKGD`Ԥ pHYs  tIME YIDAT]Y0PZ2Q NyfsbD"U NIz,q?IHN`8bO*5ZkR2bR ,N9Oy嘟ssr-$qYX Ad%՞/B> RJ!ActEXtCommentCreated with GIMPW%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_hear_off.png000066400000000000000000000011451366722712400244220ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<PLTEFWo)5D*5ECUm?Pg@Rj޺ӱKUeɢ@K\$.?>IZ%/@lyQsoz5ASk{=I[sBhtRNS$=>!}bKGDH pHYs KtIME Y}IDATMI0 DQ06& L0L尲H/Zv2"{m9⢩?eK<LQ;7+ `rN-lE;{!3pi_M7ѝ߮%26 %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{tEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_hear_on.png000066400000000000000000000007601366722712400242660ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<WPLTEFWo)5D*5ECUm?Pg3$uE,}޲CHO`;BJSk +FtRNS$=>!}bKGD`Ԥ pHYs KtIME YoIDATM @fͯN[Ln !C. eB5)ҩokVHƈ)-ӛi GibJ*@C :%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_mute_off.png000066400000000000000000000007021366722712400244530ustar00rootroot00000000000000PNG  IHDR O"gAMA a cHRMz&u0`:pQ<3PLTECSj̝zОxv)5D}*5E므Ϟzݦ|CTj?Od@RjWժtRNS$=¾8zbKGDH pHYs KtIME Y7IDAT%A0`آ0!}bKGDH pHYs KtIME Y9IDATcKKKd`H(S`Ȝ9sC֪U wc̜ỳ---ՀX q %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{tEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_quant_off.png000066400000000000000000000007561366722712400246420ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<HPLTEFWo)5D*5ECUm?Pg@Rj߻$.?末)3D}z"QtRNS$=>!}bKGDH pHYs KtIME YWIDATMY EѨm8kDsy? E YԀv `;'vR2Rkk}g`?"|w%{mD7^f%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{tEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_quant_on.png000066400000000000000000000007411366722712400244760ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<ZPLTEFWo)5D*5ECUm?Pg3$uE,}"#%;BJkS`HYtRNS$=>!}bKGDA pHYs KtIME Y]IDATMI Q[]]JB\&(P€pC{vl^Jѱuٓ*oꘄ:—m 69Ug%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_quant_over.png000066400000000000000000000014011366722712400250270ustar00rootroot00000000000000PNG  IHDRHѿݱܴܰ۟@Pf$ "/\mٜȶب .B1@VWh&6M]uך¥դu*;ӓ вҠUe~CSj!.흯ΜXh=Mc'蚬y%xǑ㕧7F]$)8N `qÑ\m0?U+P`yݎ*< w؋s~B] bKGDdڸ tIME YIDATc`` L者 988!LN(7  @QQ q@ J *j@hhrD<|pC;{WMVoC;LtRNS$=>!}bKGDH pHYs KtIME Y^IDATM@0Dі!2CUmzNND7 !ecv0)}`s΅]0صvB`_6{н;x w >#t%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_record_on.png000066400000000000000000000007521366722712400246260ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<TPLTEFWo)5D*5ECUm?Pg3$uE,}S;,BJ`kUtRNS$=uKbKGDug2 pHYs KtIME YlIDATM fQҍy_4OZ8]G7s|T^o&»] >;0YM5a?U- ?{qHTH֩ξѽ˹ʣIO8=goɶǴ^eƲ Ƃ8<\cíU\˜26 hqܸŽ@F;@ִ(+KR%(clѲ{js #04˯'+ T\ƷĬ bKGD\tIME YIDATuZ@AS#+1 311ȔR5rdӼp,ރgp…¾8Eb4 wJSB`gb*-e. YR@Qb[RTZ.nnutw۠M=pېL]@Yo`BO3@cvw~hik_[?3_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_solo_off.png000066400000000000000000000006741366722712400244650ustar00rootroot00000000000000PNG  IHDR #gAMA a cHRMz&u0`:pQ<-PLTEATjywyu)5D|*5EꀔzAUj>Pd@RjD"i tRNS$=ĒbKGDH pHYs KtIME Y9IDATc{"%cckii 7::z nΜ9ƾaݻw XVAӮ%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{tEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/btn_solo_on.png000066400000000000000000000006711366722712400243240ustar00rootroot00000000000000PNG  IHDR #gAMA a cHRMz&u0`:pQ<-PLTE?Wf)5D*5EIDATc d`+/OU`h5`9sCԪUK wjsQ&ccc~y%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{tEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/patternEditor/editor_top.png000066400000000000000000000015621366722712400241610ustar00rootroot00000000000000PNG  IHDRw>~gAMA a cHRMz&u0`:pQ<PLTE~~~~}~}~}fnYdyXcxWbwWavVauV`tU_sU_rT^qS]qS]pR\oR[nQ[mQZlPYkPYjOXjNWiNWhMVgMUfLUeLTdKScJScJRbIQaIQ`HP_HO^GO]GN\FM\EM[ELZDKYDKXCJWCIVBIUBHTAGT@GS@FR?EQ?EP>DO>CN=CN=BMynYl:~ie뚦wE5I <DZ,ÐBdPO]XKPԠ5A jP+x~WBp%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/000077500000000000000000000000001366722712400222705ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/background.png000066400000000000000000000005071366722712400251170ustar00rootroot00000000000000PNG  IHDR2pvgAMA a cHRMz&u0`:pQ<PLTEUZi`etmrzvbKGDo pHYs  tIME YIDAT(c``AT Q *0 %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/background_BPM.png000066400000000000000000000017711366722712400256210ustar00rootroot00000000000000PNG  IHDR+OWgAMA a cHRMz&u0`:pQ<PLTEUZi#'3:=FRWdu|222:>Hpw;Tt(:P֎Z`r緽Y_q㳹W]o߯ǂۓ]cuԌР̜ȘIOaŕ}yv|\btӍ邆fz{v{x~pupvioagyTGbKGDo0O pHYs  tIME YIDATX͗Z@FeYdZZZfў0J |~/0*ʘ\+LHB1 aBDyc3QŨŽb~{38 %`%$ws&CPMR_LQ^"'2v{LLL;Tt(:P#(4UZg$)5%*6&+838E*-4(-9:>Hҥקߥ෽Ϣ꣩ܢ^exܳW]o;A踾РٞدU[mX^p՚ӫSYk8>శV\nіQWi۬TZl̤͒OUg6<بRXjˏMSeեPVhNjƉKQc49ѡNTf…͝LRdCIYə}y|y|x|x|x|w|w|w|_bkƖ~`bgx|v|v|]bp’zfzLVbw}]cu15=UZibKGD{l pHYs  tIME YIDATh횉Uǣ#RmR+`%%E, ^A,""X}xx4{onl_lnIJ:8LKLkM RA+X8L +F^`ͩӞiC>#MGdڥ2Բlw9Sxh!*β``lQm39Y؜lNb@#=ch*rvB`f<} fFHL,1)4LjAS` qb=.F|2es'tb{l渙BXknp4_c?A1_=yDhLlk :Mm~9YsعfBM&O+DD1~IJ6\Y!JXw3n N"t ֩FfΔ`mTugER>o3N+`ONMQe]U20=BЪCtс 6Q#.`1iZ}BPU3enb,qm S@X&ڼeV\[Y4r g&Jm,lf& j*/iٿsGE^b`O_K%_&U^U`]Vf&NN<7vx=${[d]g.L#f}}> և1ԕ~Jgu ;_|9<CPMR_LQ^$/"'2v{Tj56\x>W j>J EE/zы^bNA!M%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/background_Mode.png000066400000000000000000000014421366722712400260620ustar00rootroot00000000000000PNG  IHDRZ+oTgAMA a cHRMz&u0`:pQ<PLTESXd#'3:=FRWdu|$0!&1>CPMR_LQ^"'2v{#(4UZg$)5%*6&+838E*-4(-9LLLӍˇ邆{x~ҕpvioagyŀ$bKGD pHYs  tIME YbIDATHR0FR ULB(KrH~t<%szIAȞ# #;35J5 நi [aFDrO"2QC?SGcg:yO8S,Pmڐsz1̠yכ+]L}y%Om@u¨KC.=uqkA/,bà'luܶ^]:KZkA^ˠ;Lm!#L`ꅵyoTVsaT])jѲԏ3xVrS/4%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bbt_off.png000066400000000000000000000010411366722712400243730ustar00rootroot00000000000000PNG  IHDR 0\dgAMA a cHRMz&u0`:pQ<PLTE/18^bosw{ACJv|Ⱥ89; PRZ hku OQYיĶNQXfis -07QUbeivlp}rwz~@BH7bbKGD2@L pHYs  tIME YpIDATc``dbfaecd1EDD`L>q \TZ”W0U`0\TR.*1:^{yLM-Fm]=}C/!1%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bbt_on.png000066400000000000000000000010341366722712400242370ustar00rootroot00000000000000PNG  IHDR 0\dgAMA a cHRMz&u0`:pQ<PLTE=BLqK{IzN|R}T}6h#2F79;[l|`1_ BVna{p Vps  CWol`@DLikmorFt%3G*bKGD0- pHYs  tIME YqIDATc``dbfbaec`d3%D$aLY<-"a *)7AXf I$&*UU1AGckhjiȏV%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bc_off.old.png000066400000000000000000000010331366722712400247660ustar00rootroot00000000000000PNG  IHDR 0\dgAMA a cHRMz&u0`:pQ<PLTE/18^bosw{ACJv|Ⱥ89; PRZ hku OQYיĶx}^ak_bm-07QUbeivlp}rwz~@BHdgbKGD5޶k pHYs  tIME YaIDATc``dbfaecd1EDD`L>q \TZ”W0U`@j|0Q M5-mL1ut M}Hh\%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bc_off.png000066400000000000000000000010431366722712400242120ustar00rootroot00000000000000PNG  IHDR (gAMA a cHRMz&u0`:pQ<PLTE/18^bosw{ACJv|Ⱥ89; PRZ hku OQYיĶx}^ak_bm-07QUbeivlp}rwz~@BHdgbKGD5޶k pHYs  tIME YiIDATc``dbfaecd1EDD`L>q \TZ”W0U`@j|0Q M5-mLH%AD SGQOv$dt%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bc_on.old.png000066400000000000000000000010761366722712400246370ustar00rootroot00000000000000PNG  IHDR 0\dgAMA a cHRMz&u0`:pQ<PLTE=BLqK{IzN|R}T}6h#2F79;[l|`1_ BVna{p Vps  CWolU*+GjvHl`U@DLikmorFt%3GS!AbKGD;9l pHYs  tIME YrIDATc``dbfbaec`d3%D$aLY<-"a *)CHg"UUS254`:pz!L-{L#cS3s K+3mk%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/bc_on.png000066400000000000000000000011101366722712400240470ustar00rootroot00000000000000PNG  IHDR (gAMA a cHRMz&u0`:pQ<PLTE=BLqK{IzN|R}T}6h#2F79;[l|`1_ BVna{p Vps  CWolU*+GjvHl`U@DLikmorFt%3GS!AbKGD;9l pHYs  tIME Y|IDATc``dbfbaec`d3%D$aLY<-"a *)CHg"UUS254`:pz!L-{亁HP𛑱! %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/beatConter_BG.png000066400000000000000000000014421366722712400254350ustar00rootroot00000000000000PNG  IHDRV+4gAMA a cHRMz&u0`:pQ<PLTE@ER#'3:=FSXdu|:>H222֎;Tt(:PZ`r緽Y_q㳹W]o߯ǂۓ]cuѿʴ®틡Ou ~$i˶e۲?mp17_ T?mu*=%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_ffwd_off.png000066400000000000000000000011171366722712400254210ustar00rootroot00000000000000PNG  IHDRHҥ᷽ϢܳW]oدU[mӫSYkϧQWiˤOUgƠMSeœKQc}x|x|w|w|w|v|v|]bpegbKGDf |dtIME YIDATm@.,AL?[GE-_)!TRaeٶ8Njkv\-u{}Ѡ#u33Q#Z+uhSLnQwۗEIwF\u7{'I> ,{{ F%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_ffwd_on.png000066400000000000000000000007701366722712400252670ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ;%i#gB!eJ{cSva`p_j]kfc{5'bKGD'-#tIME Y}IDATm0ᜢh ~/smû8o5_Ơis,Jm)XiԵ4V9֝'`?&sNGHy/Rp';kvYO%zkO|ϟs(%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_ffwd_over.png000066400000000000000000000010111366722712400256130ustar00rootroot00000000000000PNG  IHDRHѿݴۜȶM_~¥K]|I[z흯GYx蚬EWv㖨CUtASrݎ؋8bKGD,qtIME YIDATm1\mBi1OݣŷU/c). z}m u8R'X;cuy3α.<z_I]{6 a+u A1fR:f:3ݤ+!|ϟ}Ngo[%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_loop_off.png000066400000000000000000000011071366722712400254430ustar00rootroot00000000000000PNG  IHDRHҥ᷽^exܳW]oدU[mӫSYkϧQWiˤOUgƠMSeœKQcCIY}x|x|w|v|v|]bpGhbKGDf |dtIME YIDATmk0>lbb&2&oڤB(su :kiefӵgu ̽4r:۔uS3}fYa.0b]+ݫڲ{@[cD'D֙r-88I4}goXB@%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_loop_on.png000066400000000000000000000010471366722712400253100ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ4o;,g*eB(cJ|&aSwy$_`pu"]jq [kcmS_jB7bKGD/# tIME YIDATm0D*J?s$AIڤBp&)fͣ4Ku}+ڀk(襵 nۨ)KH )!S*T/ʎTO.Gj]Vu}Acn0N5hڎ곳=q:v \%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_loop_over.png000066400000000000000000000010731366722712400256460ustar00rootroot00000000000000PNG  IHDRHѿݴShȶL`¥զJ^~H\|흯ΜFZz蚬˙DXx㖨ǕBVvÑ@Ttݎ8Lj؋KabKGD5޶ktIME YIDATm0]U)JQPP$w1ii2Bh4ZhwT{K\Y]BV"ѐRDu1/fR r^, E{wof -H%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_metronome_on.png000066400000000000000000000007121366722712400263420ustar00rootroot00000000000000PNG  IHDR lgAMA1_ cHRMz&u0`:pQ<ZPLTE3$uE,}ާY;BSJNSwH`k_G7bKGDqtIME YmIDATeY D;.wTܽ91_)yM*"H҈ D(e|a*(ˊp m(kUEE[9=qϔJa7uuP1tgD{h I&%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_metronome_over.png000066400000000000000000000007601366722712400267040ustar00rootroot00000000000000PNG  IHDR lgAMA1_ cHRMz&u0`:pQ<xPLTEѿȶޚ²~y蘬r㐦m}݇~hibKGD'-#tIME YuIDATe0DwEP(XJI96a \<!o_{E'NvL(QKkmeiAuļ)?_솲,)G ) 4%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_mmc_space_off.png000066400000000000000000000011351366722712400264220ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<PLTEFWo)5D*5ECUm?Pg@Rj޺ӪɅ>8;) :36{'0')vz/'(pvONU.%'6/3]amuw-$&|o}IKU849,#%\dt,$&Y`o{ly-%'GFOs~aiyelz5/2(go~(tRNS$=>!}bKGD9@ pHYs KtIME YIDATM DQ83Ceқަ$2*Y.d;J UBz[[hFr c@l$Bp_\S'YtRNS$=>!}bKGD:N pHYs KtIME YIDATMG @ (6;Vc1}TR$%@$%kF5b`Nf8bd:֢/nZo!l;GOl:_;;Hקң踾Р䳹X^pశV\n۬TZlبRXjեPVhѡNTf͝LRdəƖ~’zw}]cu+^bKGDf |dtIME YIDATu@oPPEAA_y]*$8Ơch:iqe #'cPe}O2͂ * rsEPeגiemUObiTY!eyU(LVrd:\7'wɋqf "|%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_play_on.png000066400000000000000000000010201366722712400252730ustar00rootroot00000000000000PNG  IHDRSL?gAMA1_ cHRMz&u0`:pQ<~PLTE:>H3$uE,}ޢ;/hB-f+dJ)bS|'`x%^`t#\pkmiobKGD)ʷ$tIME YIDATu@ wE.//4c^CWT1a琬LplMv$e>ͼt*(x%SUPB "ڶT.1C=t*wa|%Yw6)O5!%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_play_over.png000066400000000000000000000010351366722712400256400ustar00rootroot00000000000000PNG  IHDRSL?gAMA1_ cHRMz&u0`:pQ<PLTE:>HѿݜȶܚªLaJ_H]~흱F[|蚮DYzBWx㑦@Uvå݊؆}_bKGD-A=tIME YIDATu@/p\iu:8hl2tf#i0YJZM6LIB妉´>2~ǔT.)bڇPB)C8H:VU KjNLMB-rf0]o&wIKcW$R8S%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_rec_off.png000066400000000000000000000011451366722712400252450ustar00rootroot00000000000000PNG  IHDRHҥ෽Ϣܳ˶;Aدdzӫ8>ϧ̤6<ȠÜ49y|y|x|x|x|w|w|w|_bkUbKGDf |d pHYs  tIME YIDATm0 !?s/M[#%,UZ3QMS aݵ|P {:{:{\{ْk{?00GtALw3$QJ:^og0T%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_rec_on.png000066400000000000000000000010301366722712400251000ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ;혤ع>R BHѿݴۜȶدݎ؋5bKGD1r pHYs  tIME YIDATm`˦PHB(PvuLghpD/7Z#~`NF(ubnd)kʽֺBƚq܅ J֒zU7Qow>?})^l%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_recdel_off.png000066400000000000000000000011751366722712400257350ustar00rootroot00000000000000PNG  IHDRHҥ෽Ϣܳ˶;Aدdzӫ8>&*ϧgr̤6<Ƞ,1Ü49y|y|x|x|x|w|w|w|_bk(bKGDf |d pHYs  tIME YIDATm0, ؕPI跺_b4d "jVkuMjEE홤60!"a'4E9dNi\5V rQOgzSQO (8I^ozϟ}EP%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_recdel_on.png000066400000000000000000000010621366722712400255720ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ;혤ع>R BHѿݴۜȶدݎ؋_bKGD70G pHYs  tIME YIDATm@ ь bP4s'Y_d"ZÐi4ku _f:mq nX̸XX\%buR?@nQONYR&ݸړ}??hC#T%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_rwd_off.png000066400000000000000000000010761366722712400252730ustar00rootroot00000000000000PNG  IHDRHҥ෽ϢܳW]oدU[mӫSYkϧQWi̤OUgȠMSeÜKQcy|y|x|x|x|w|w|w|_bk/bKGDf |dtIME YIDATm Q^bǎ{!?@.|b E(9ejWGm4}-vtQ{ T19߱樋%5FZ[r#uGwA|wS)EZ86$mg nQ%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_rwd_on.png000066400000000000000000000007621366722712400251360ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ;ķiBgȲJ|eƿSwc`paj_kc_2xObKGD&ZtIME YzIDATm@ D*-*8"/ZaZDoAR˱&k+e\/Z`nwTPź!HѿݴۜȶM_~¥K]|I[z흯GYx蚬EWv㖨CUtASrݎ؋8bKGD,qtIME Y|IDATm@ Dє8܈YA`ZUNDKC0Z#xlMXImM28u h֬|GX:ЉTvBhknr`-Jb}>N g31.%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_set_play_off.png000066400000000000000000000010731366722712400263140ustar00rootroot00000000000000PNG  IHDR AsgAMA a cHRMz&u0`:pQ<PLTEFWo)5D*5ECUm?Pg@Rj޺Ӫz #nv akw6!}bKGD1r pHYs KtIME Y{IDATM0 j:Ձ:Tš u=.qRF/gE!}bKGD  pHYs KtIME Y`IDATMI@ CQL04$?&2FwLLD Gx6z_]ʪ4։ڎ 80F0g|X~y ;m r%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showDrumkitManager_off.png000066400000000000000000000010161366722712400303040ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showDrumkitManager_on.png000066400000000000000000000007351366722712400301550ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showDrumkitManager_over.png000066400000000000000000000007471366722712400305170ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showInstrumentEditor_off.png000066400000000000000000000010161366722712400307110ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showInstrumentEditor_on.png000066400000000000000000000007351366722712400305620ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showInstrumentEditor_over.png000066400000000000000000000007471366722712400311240ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showMixer_off.png000066400000000000000000000010161366722712400264560ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showMixer_on.png000066400000000000000000000007351366722712400263270ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showMixer_over.png000066400000000000000000000007471366722712400266710ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showPatternEditor_off.png000066400000000000000000000010161366722712400301560ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showPatternEditor_on.png000066400000000000000000000007351366722712400300270ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showPatternEditor_over.png000066400000000000000000000007471366722712400303710ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showSongEditor_off.png000066400000000000000000000010161366722712400274470ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showSongEditor_on.png000066400000000000000000000007351366722712400273200ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_showSongEditor_over.png000066400000000000000000000007471366722712400276620ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_stop_off.png000066400000000000000000000010141366722712400254540ustar00rootroot00000000000000PNG  IHDRHߺҥܷϢٳ˞կǚѫÖͧˤǠÜy|`bgη*bKGDf |dtIME YIDATmK@ EѴ6("QK*: B#r(#đlsh-يӋsTeo*{=#:qкTe_S};[}H&&UU22<{~~ y%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/btn_stop_over.png000066400000000000000000000007421366722712400256640ustar00rootroot00000000000000PNG  IHDRH֩˹ѽɶĶƲíܸŽִѲ˯ƷįƵ=bKGD%tIME YmIDATm7P DQ}$l5ZJ9P!"wy-p-b[|!( ͐lh^ U%kU#U k!U=0"UTeC?̺u?l's?E4%@$%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/cpuLoad_back.png000066400000000000000000000005361366722712400253510ustar00rootroot00000000000000PNG  IHDR\ޅgAMA1_ cHRMz&u0`:pQ<PLTESXgRXgRWfUZiTYhTӧtRNSJJbKGDޕztIME Y0IDATcp BRBIQZN"My0Iy5 Fh˄H%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/cpuLoad_leds.png000066400000000000000000000006231366722712400253750ustar00rootroot00000000000000PNG  IHDR\C.hgAMA1_ cHRMz&u0`:pQ<3PLTESXgRXgRWfUZiTYh7Y ~tRNSJJbKGD ,tIME YMIDAT(ϵK EQ44K >G?xLI*g(j֠w<Ռv\ϿmaR\E^o%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/icn_metronome_off.png000066400000000000000000000004541366722712400264710ustar00rootroot00000000000000PNG  IHDR /gAMA1_ cHRMz&u0`:pQ< PLTE222LVc?DKԾ bKGD LtIME YIDATc` 6 f1$@BIh%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/icn_metronome_on.png000066400000000000000000000004541366722712400263330ustar00rootroot00000000000000PNG  IHDR /gAMA1_ cHRMz&u0`:pQ< PLTE222fz"bKGD LtIME YIDATc` 6 f1$@BIh%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/icn_pause.png000066400000000000000000000004421366722712400247440ustar00rootroot00000000000000PNG  IHDR  >gAMA1_ cHRMz&u0`:pQ< PLTEIQ[222S_mHHbKGDHtIME YIDATc(P^^€ +j&%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/icn_play.png000066400000000000000000000004501366722712400245730ustar00rootroot00000000000000PNG  IHDR  >gAMA1_ cHRMz&u0`:pQ< PLTE222IQ[S_mbbKGDf |dtIME YIDATc`(//ag3Em%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/jackMasterBtn_off.png000066400000000000000000000017461366722712400263700ustar00rootroot00000000000000PNG  IHDR-  hgAMA a cHRMz&u0`:pQ<PLTE?BJ>AJhktZ]f{|cfpuxQT]ru~̾̾̾>?C~]_c`agklsOQU9:=˽NQZnqzƸƷƷ!"$ "RTY0149:>MNS IMVjmv<=A}8:>hks++.!VX_ehoFHMFIRfirdgn&'*`bjz~@BGBENbeoACI?AF;=B]`hmoz()-UX`RT\ 137>AK^aj:=F[^g7:Cagy`fx9AJCu$u#L~BrJdEvOg Iy5CTkOd}QgNd} [s CUk 0=MUj#L}$/"-DYs(4D/>P،>Rk Zm'P/AWa,=R{ Rq!.> ,D^~On7Lf`p+S~wuKm*:Hi[Lp0Fattu es1Vs.Hg,Ec`])@]BgMx,@<]  :Zs #6Nkv6YghgpxSi\\[[v|Fa\msFDbKGD|Ѷ _ pHYs  tIME Y(IDAT(ϕWS0O4q@MB LŢD @# „wZn J_ِiZ/>_ԓzRO蝀 bZRZVnTĬ$Uf5%fM-5 ZcA 61 YX=BFEB><2:6>195mV =peWVPhcsk;$ S]Á0t$Q19Ayz&/.oRI$ruUayh,RX,Og׍Li^[=]%>_{ mf=W%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/jackMasterBtn_over.png000066400000000000000000000020771366722712400265670ustar00rootroot00000000000000PNG  IHDR-  hgAMA a cHRMz&u0`:pQ<PLTE?BJ>AJSasKXlam~\et_k~QYg]i}?CI_dmahplt}QV] :=COWd[g{ڹ۹"$( "&SYb14::>DMS[ MTaYfyֱֱ׮JOYT_pɖȖȖHLVYanĎĎčÍGJSBL[BIU8+bKGDi+9 pHYs  tIME YbIDAT(ϕWW0Tā`]w{{o**q+uoPErxN|w91 R6V)/tS(@JN$Y&iT*M2HѦjttyE,'d F0۔9L>/Д2lòF-)՗Aٌ VVU T[W5465#AvZZQ:xC*|_IbBU/v^\Z VmVڱcs&l]BDqo`2Gӳ+BakLDr \nIrº%yE,^[_D=y}/ %7 >|%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/jackTransportBtn_off.png000066400000000000000000000017631366722712400271300ustar00rootroot00000000000000PNG  IHDR-  hgAMA a cHRMz&u0`:pQ<PLTE?BJ>AJhktZ]f{|cfpuxQT]ru~̾̾̾]^dkms9:=~bci\_d`bf˽NQZnqzƸƷƷǨ RTY0159:>vyLNSIMVjmvFHM hks*+.!VX_FIRfirz~fiqsv @BGBENbeoACI>@F;AK^aj:=F[^g7:Cagy`fx9AJCu$u#L~BrJdEvOg IyNd}  [s 0=MlSiOd}QgUj#L} CXs(4D/>P a،>SkZm'P7Lfz l hRq!.> ,D^~`p+S~wuu \MoU~ /Fautes1Vss.Gg,Ec)A]BfMw,@@c<]  :Zkv6YghgpxSi\\[[v|Fa\mwbKGDv1cA pHYs  tIME Y-IDAT(ϕWS04Aެ{@wHɬVN\PX\P"rHHg2(WUQjw+a*RuMCj)R#EjzAF]æV۠0(߆&rFWwO{ 2E0abY%(`!!cS83; K2c+jS;FG6ҭ~e>m'(=ƘiA1v]^on?zE/?'s%!ԟ8}AOAJSasKXlam~\et_k~QYg]i}_dmms} :>CdjsbhqOWd[g{ڹ۹ۺڪ SYb15::>DwNS[MTaYfyֱֱ׭ҰְױFLUNJ iq*.4 $V^jMS^VcvѨҨҨѧҚ yfoq~ ?EOJQ[Ubs͟@GR=EO9@J[fvjv',3YcrS]kPZgJOYT_pɖȖȗȖHLVYanĎĎčGJSBL[BIUSfbKGDx pHYs  tIME YVIDAT(c``$010; `R8h~A!AaAQ1 B$$ed$%UT$e44@i)m]==}}==9==]=9 204361Փ33דJ낤ml䜜\~wustCpHhXxDdTthLhDXl\hlh|B"PKRlDrJljZzFDDXH\hxhD&CVvvNNvn^~vlNvvl-,*(..-+*ںښچ(UndhjnnimknnkmnkRm8vήΞޞ(Չg )Z`%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/lcd_background.png000066400000000000000000000006131366722712400257370ustar00rootroot00000000000000PNG  IHDR+e@KgAMA a cHRMz&u0`:pQ<PLTESXd#'3RWdzu|?/bKGDޕz pHYs  tIME YXIDATXA !A"H A~O6UT:{ sHw3%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/metronome_down.png000066400000000000000000000004551366722712400260360ustar00rootroot00000000000000PNG  IHDRUUgAMA1_ cHRMz&u0`:pQ<PLTE(:P;TtϝbKGDhQtIME YIDATc`$00  $K{F=Y%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/metronome_off.png000066400000000000000000000004441366722712400256370ustar00rootroot00000000000000PNG  IHDRUIH>gAMA1_ cHRMz&u0`:pQ< PLTE(:P;Tt|>bKGD LtIME YIDATcҰjmlR%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/metronome_up.png000066400000000000000000000004531366722712400255110ustar00rootroot00000000000000PNG  IHDRUUgAMA1_ cHRMz&u0`:pQ<PLTE(:P;TtϝbKGDhQtIME YIDATc`$00  2{,%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/midiActivity_back.png000066400000000000000000000007361366722712400264230ustar00rootroot00000000000000PNG  IHDR: TgAMA1_ cHRMz&u0`:pQ<NPLTE$0!&1>CPMR_LQ^ %0"'2v{=CP#(4UZgLR_$)5%*6&+838E*-4(-95tRNSbKGD atIME YIDAT(ϕ DhA@02! xف@};Oj`Uvȗg렵 eq+ O"66%)NmPĿ|_Q*cSw_Ou Gt%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/midiActivity_on.png000066400000000000000000000007301366722712400261310ustar00rootroot00000000000000PNG  IHDR: TgAMA1_ cHRMz&u0`:pQ<HPLTE$0!&1JLU"'2z#(4U$)5%*6&+824Np3Nt>otRNSbKGD tIME YIDAT(ϕ @)6l4kkO#M3=p@ Ldtj_2wuM!:CLZTʋEOkkTu3.xUShw [aR6^ir1 p\(%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/onoff.png000066400000000000000000000012031366722712400241010ustar00rootroot00000000000000PNG  IHDR+5"XgAMA a cHRMz&u0`:pQ<PLTESXd#'3:=F/18^bosw{ACJRWdu|v|Ⱥ89; PRZ hku OQYיĶNQXfis -07QUbeivlp}rwz~@BHx}^ak_bmTObKGD@\ pHYs  tIME YIDAT(ŐW0 K`JLKz'*'ͳ]bj ,%SL6/JJUz2 aa;Իm;]{@ z#_o {zwJ=_X×. mZo+@(?}p~z_eDj84!v3.sSR%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/pattern_mode.png000066400000000000000000000010031366722712400254510ustar00rootroot00000000000000PNG  IHDRE S gAMA a cHRMz&u0`:pQ<BPLTE$0!&1>CPMR_LQ^"'2v{#(4UZg$)5%*6&+838E*-4(-9?KbKGD ٥ pHYs  tIME YIDAT(ϥ E!^_-VwN:`g Up ̅R!V@1ia窻9@F7VP-3$J&dF} C %VtEXtCommentCreated with GIMPW%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/playlist_background_Control.png000066400000000000000000000025541366722712400305440ustar00rootroot00000000000000PNG  IHDRw lgAMA a cHRMz&u0`:pQ<PLTE@ER#'3SXdRWd:>Hҥקߥ෽Ϣ꣩ܢܳW]o踾РٞدU[mX^p՚ӫSYkశV\nіQWi۬TZl̤͒OUgبRXjˏMSeեPVhNjƉKQcѡNTf…͝LRdə}y|y|x|x|x|w|w|w|_bkƖ~`bgx|v|v|]bp’zw}]cu15="DptRNS@fbKGD ٥ pHYs  tIME YsIDATHWWQGl`TԱ7buP4-h``^B"vޙ̸Mֺ{ža=zHRCCt:f/_!+oK鼇!>O}W #J߾~= ߢ7<(j,~WcA!|- ,O5!]L%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/rubber_off.png000066400000000000000000000012751366722712400251160ustar00rootroot00000000000000PNG  IHDR %!3ogAMA a cHRMz&u0`:pQ<PLTE.07cgtvz}BDK~ʾ;<>~=>@ORZ uyILT:<8 !f`C^Lf&D253,m ,[yLv9rHf;L=4桛-kbq 2GDFE)%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/song_mode.png000066400000000000000000000007661366722712400247610ustar00rootroot00000000000000PNG  IHDRE S gAMA a cHRMz&u0`:pQ<BPLTE$0!&1>CPMR_LQ^"'2v{LLL#(4UZg$)5%*6&+838E*-4(-9"jbKGD hV pHYs  tIME YwIDAT(ϥK D[)G@qGy08[HjQs#U6'=QbF(Nm; RJ6+F~#(W=.xlK4ctEXtCommentCreated with GIMPW%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/statusLED_off.png000066400000000000000000000006651366722712400255070ustar00rootroot00000000000000PNG  IHDRD  z2gAMA a cHRMz&u0`:pQ<?PLTE$0!&1>CPMR_LQ^"'2v{#(4UZg$)5%*6&+838E*-4(-9,tRNS@fbKGD5 pHYs  tIME YQIDAT(ϥщ0D(&{c xð)dQrG5?@,+&GQU !}\Cvuy:Lmܦ$%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/playerControlPanel/statusLED_on.png000066400000000000000000000006731366722712400253500ustar00rootroot00000000000000PNG  IHDRD  z2gAMA a cHRMz&u0`:pQ<BPLTE$0!&1JLU"'2z#(4U$)5%*6&+824Np3Nt-tRNS@fbKGD , pHYs  tIME YTIDAT(ϥ0D![Qp>vSɂ \ȂB?4齒lMwBȁ'6n{gsV^%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/preferencesDialog/000077500000000000000000000000001366722712400220745ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/preferencesDialog/rec.png000066400000000000000000000003111366722712400233460ustar00rootroot00000000000000PNG  IHDR sRGB pHYs  tIME% tEXtCommentCreated with GIMPW6IDAT8c`0|]LFR #PFR #d(pHX$*" `IIENDB`hydrogen-1.0.0-rc1/data/img/gray/skin_btn_off.png000066400000000000000000000010161366722712400216200ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<PLTE:>Hקң踾Р䳹˜శȘ۬Ĕبեѡ͝əƖ~’zw}]cuȽk-bKGDf |d pHYs  tIME YiIDATuBE{G"4?tQä,=ؔz?Q9"˕! "3*GzT|QRzCH߉; "'w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/skin_btn_on.png000066400000000000000000000007351366722712400214710ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<iPLTE:>H3$uE,}ޢ;BJS|x`tpkmi@bKGD"]e\ pHYs  tIME Y\IDATu70 Ad 'Ǵ[!blDFLR&srHT7Gj)MDH nԎtPHEݚCMo<v& %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/skin_btn_over.png000066400000000000000000000007471366722712400220330ustar00rootroot00000000000000PNG  IHDRSL?gAMA a cHRMz&u0`:pQ<uPLTE:>Hѿݜȶܚªز֖Ӯ흱Е蚮͑ʨ㑦ǐå݊؆abKGD&Z pHYs  tIME YZIDATuѵ@{333ߢO<+b~˦#8M~@JR )˩j4# 8Q3B!k:Nt?ԋ+>k5m_%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/000077500000000000000000000000001366722712400205705ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/songEditor/bg_topPanel.png000066400000000000000000000026151366722712400235340ustar00rootroot00000000000000PNG  IHDR1'gAMA a cHRMz&u0`:pQ<qPLTE@ER#'3"&2:=FUZiRWdu|t{y~|~}k/615=7;DINY?DM6:C37?26>48@8 ڐӍˇ邆36=zä{rxv{x~~kqҕpvw|ci{}io\btv|agy/5GIOa`fx37@?BK_dq:>Hu|t{*bKGD4 pHYs  tIME  |SIDATh [@Pjc7RmAȡ"" ""xz7;9v&H'_3iľj~$HU}T~mT}=+a&>ml|VۦmlqRj~Zjsm!"~?a&uRȒ/~KÜ !!NgᓄQCj/$5՗6Q%tEXtdate:create2017-07-13T23:16:13+02:00<@%tEXtdate:modify2017-07-13T23:16:13+02:00MIENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_bpm_off.png000066400000000000000000000011211366722712400235440ustar00rootroot00000000000000PNG  IHDR6 &mgAMA a cHRMz&u0`:pQ<PLTE15= QT[˖adn $ILS CEMx~ҕpvioagy?LbKGD37|^ pHYs  tIME YIDAT(ϝ Ey-XֱdCHe'Y'@6ΖΫEY};ےOYGg += )y {'߉g-;Q%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_bpm_on.png000066400000000000000000000011421366722712400234110ustar00rootroot00000000000000PNG  IHDR6 &mgAMA a cHRMz&u0`:pQ<PLTE:>H3$uE,}ޚ; =To jir} Jh B".7Ola `J~sS{ 4Li!`ws4HbKGD8 pHYs  tIME YIDAT(ϝ0I(!$қ-+P 2(by51>fuh?:Rf1h<C4bP3LV)Dfkˈlga}g>/]ob=P|wo5?W?/D%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_bpm_over.png000066400000000000000000000011421366722712400237500ustar00rootroot00000000000000PNG  IHDR6 &mgAMA a cHRMz&u0`:pQ<PLTE:>Hѿݴۜȶ JQ^~¥Yct  &DLYyw흯ΐ蚬 AIV㖨ǐÂ+bKGD8 pHYs  tIME YIDAT(ϝ0b PBh3v1Hf.#KodɲRPS劘*ffMh;]Pf֘a=z//* s%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_down_off.png000066400000000000000000000007631366722712400237500ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE15=ڐӖˊāzᤪrxkqҕci{}\btv|agy/5GIOa%bKGD*SԞtIME YoIDATe0 DѽB165zE#Sݞ(J?joL'bK\Ŧ&Nuo8Eqx A1%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_down_on.png000066400000000000000000000007541366722712400236120ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<xPLTE15=tȲwh\ーomipe쁌ay^r}`XYEPgoqbKGD'-#tIME YqIDATe0 sCUoh)~IISkf$;pP#H[QqpL =P`c"9>wvൟqiB5((\J H]%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_down_over.png000066400000000000000000000010231366722712400241370ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE15=㪰¹ȶ޳ގ£ثւϖӕ蘬͑㐦Ȑ݇}~v|IOaV(7bKGD1rtIME YzIDATe@sl͈̂A${3MUuU}邽D\j֓(NXkc19{ґ!,W:Ǜ-+c)T5x: +x '|w%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_draw_off.png000066400000000000000000000010011366722712400237200ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE04<ڝӍˇĂ{v{x~}pvv|ioIOaagy`fxbKGD LtIME YqIDATe0DыʨqCEq!eECOW t{XxLHMjyw+~qKFs狲?ok mQ K%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_draw_on.png000066400000000000000000000010061366722712400235670ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE04lXZ).em%v{}h}8/ yfy!{ZDP%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_followPH_off.png000066400000000000000000000010151366722712400245220ustar00rootroot00000000000000PNG  IHDRHҥ෽Ϣܳ˞دǚӫÖϧ̤ȠÜy|y|w|w|w|_bkZbKGDf |d pHYs  tIME YkIDATmBP%*Τ(>^]7w刨)-R BB]oX'lf,GxbgKJkn5'kQPhc8cspg?M5vX%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_followPH_on.png000066400000000000000000000007211366722712400243670ustar00rootroot00000000000000PNG  IHDRH3$uE,}ޚ;BJ~S{`wskol}bKGD k= pHYs  tIME YVIDATm@0IK./\wc/c1c9-C-+LkӲl@'6.+۴Lq ,>nZ#%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_followPH_over.png000066400000000000000000000007371366722712400247350ustar00rootroot00000000000000PNG  IHDRHѿݴۜȶؚ¥ղҖ흯Ε蚬ˑ㖨ǐåݎ؋GbKGD% pHYs  tIME YUIDATmе@{333_u 7\%b,9F15Y',՚1yJԪf j۱u٤ufZmNfyI f%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_minus_off.png000066400000000000000000000007011366722712400241240ustar00rootroot00000000000000PNG  IHDR |RgAMA a cHRMz&u0`:pQ<TPLTE15=Ӗˎ鬲ćᤪx~ҕpvioagy/,bKGD`Ԥ pHYs  tIME YUIDATeI0 CфR2CWbVDQKD+ju@kL hmz!6N,猶lCh2ZLB˸t[Ž-%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_minus_on.png000066400000000000000000000006731366722712400237760ustar00rootroot00000000000000PNG  IHDR |RgAMA a cHRMz&u0`:pQ<NPLTE15=3$uE,}ާ;BJSw`k_(bKGDn pHYs  tIME YUIDATe D@DE!q3xV4#-uUt0\FifxznhigڙمoYb-3 h%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_minus_over.png000066400000000000000000000007471366722712400243370ustar00rootroot00000000000000PNG  IHDR |RgAMA a cHRMz&u0`:pQ<oPLTE15=ѿȶ޳ޚ²تؖӕ蘬͑㐦Ȑ݇~ \RbKGD$ pHYs  tIME Y`IDATeY 0 EY[my{^H 秄H|# ?c1,Rwd ˴6<9(]+XZX8fز6~N{ -g%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_mode_off.png000066400000000000000000000006611366722712400237220ustar00rootroot00000000000000PNG  IHDR +gAMA a cHRMz&u0`:pQ<EPLTE15=˲鬲ᤪҕagy`fx bKGD|Ѩ pHYs  tIME YTIDATeK C[AE{MӗfEyث) 8RBjMYn97+8-RHO-At?CzM%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_mode_on.png000066400000000000000000000006541366722712400235660ustar00rootroot00000000000000PNG  IHDR +gAMA a cHRMz&u0`:pQ<EPLTE15=˲鬲ᤪҕagy`fx bKGD|Ѩ pHYs  tIME YOIDATe DѩEU'#gnbr^1}fŴfis l?O̊)tS/Vk%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_mode_over.png000066400000000000000000000010111366722712400241110ustar00rootroot00000000000000PNG  IHDR +gAMA a cHRMz&u0`:pQ<PLTE15=㪰¹ȶޚ£ؖӔ蘬͐㐦ȏ݇Œ|~u{HN`;@bKGD-A= pHYs  tIME YgIDATeI@DpiAAd>ٵ_2JUwQ8y/J.!]8SmK,owxOcl˘W Von۲pi {%+%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_new_off.png000066400000000000000000000007311366722712400235650ustar00rootroot00000000000000PNG  IHDR |RgAMA1_ cHRMz&u0`:pQ<fPLTE15=Ӗˏ鬲ćᤪ~x~ҕw|pvioagybKGD!l tIME YpIDATeI0!,  a+p1R.$i4(TJ+PRٚcyl'lÇ8yee`ĨcEeekmƶ1 R,%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_new_on.png000066400000000000000000000007231366722712400234300ustar00rootroot00000000000000PNG  IHDR |RgAMA1_ cHRMz&u0`:pQ<`PLTE15=3$uE,}ާ̚;}Br̲JSw_`kV_L9bKGD tIME YpIDATeI0 BbϤbRRKFwDP%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_new_over.png000066400000000000000000000007771366722712400240000ustar00rootroot00000000000000PNG  IHDR |RgAMA1_ cHRMz&u0`:pQ<PLTE15=ѿȶ޳ޏ²ت؈ӕ蘬z㐦s݇l~~eVIbKGD*SԞtIME Y{IDATe0E*DEtx gfwΜ/"d)Sfm@eɶR]%nضXZcvlUM'G'|iDiٮ]Hy wxE{C%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_select_off.png000066400000000000000000000007751366722712400242630ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE15=ڐӍ˲ʁ鬲īÂzᤪrxv{kqҕci{|\btu{agy`fx/5GHN`bKGD.TtIME YmIDATe@EqFT6LHr4C pt\a偮/7v9Ԅ{b01O:k^N-c%oӀmgc_,?3%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_select_on.png000066400000000000000000000007501366722712400241160ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<~PLTE15=tֲw^唭ѥoɃSmši}pHevhan`f`XX9RvcbKGD)ʷ$tIME YgIDATe0XZ27lp B!:q"#xUTg1:.WP7cX k? X떕ײ4c! 5%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_select_over.png000066400000000000000000000007761366722712400244650ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE15=㪰¹ȶނ£ؖw蘬͐㐦l}݇Œ|~u{HN`bKGD0-tIME YhIDATeP6k%9?Z.W=6ߴUJ0x<̌a>Θ[K_P7`۽?(f D%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_up_off.png000066400000000000000000000007441366722712400234240ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<{PLTE15=ߪڝӖˎĊ~x~}pvv|ioIOaagyUbKGD LtIME YfIDATe[B`BQJB fYkņ- pTp y!Db~d {"RRxf gx;老Y?{ v%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_up_on.png000066400000000000000000000007541366722712400232670ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<~PLTE15=yȹ|t`r툓Zn遌uMjymfr}cEPge]^9TbKGD)ʷ$tIME YkIDATe@ Eэ p2e|IZZoN]@?xYp}".ABXcPCv02Q&3 _%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_up_over.png000066400000000000000000000010151366722712400236150ustar00rootroot00000000000000PNG  IHDR +gAMA1_ cHRMz&u0`:pQ<PLTE15=碼Ѫ¿ȣ޳ޚ›تؖ~蘬͙x㐦l}}݇v|~IOa>qbKGD2@LtIME YqIDATe[`7P+fx֚ٳ/(C'k*OWSE~KVZaf+`rpLR,0|E >[@D %tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/btn_viewPL_off.png000066400000000000000000000012101366722712400241730ustar00rootroot00000000000000PNG  IHDR |RgAMA a cHRMz&u0`:pQ<PLTE14;03;  һӹ績жᲸʶ˰ܭΫ֨ŦҤ ̞ǙÖ /2:  .19$%GbKGDLo pHYs  tIME  |SIDATU0EK,Ŋ-)Eh=:4@0"Q8H3T6|(,REs֐l1ue 2T1`:[[ڶ kf(;ov!3wvp񇋝/˻%tEXtdate:create2017-07-13T23:16:13+02:00<@%tEXtdate:modify2017-07-13T23:16:13+02:00MIENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/playingPattern_off.png000066400000000000000000000005301366722712400251270ustar00rootroot00000000000000PNG  IHDR OgAMA a cHRMz&u0`:pQ<PLTE tRNS%gbKGDhQ pHYs  ~tIME Y"IDATc`@PXJAi!*&Fö*%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/playingPattern_on.png000066400000000000000000000004721366722712400247760ustar00rootroot00000000000000PNG  IHDR ,gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs  ~tIME Y-IDATc` gX[?\R8$㖄IdXKj=vt! w,%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/songEditorLabelABG.png000066400000000000000000000005341366722712400246670ustar00rootroot00000000000000PNG  IHDRӌgAMA a cHRMz&u0`:pQ<PLTE:>H]akCHS#'3fCVbKGDhQ pHYs  tIME Y5IDAT8c` `5Z"DkHs;G-dԒQK% Ā٘ր]%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/songEditorLabelBG.png000066400000000000000000000005511366722712400245650ustar00rootroot00000000000000PNG  IHDRӌgAMA a cHRMz&u0`:pQ<PLTE:>Hmq}QVc#'3RWd3uebKGDo pHYs  tIME Y?IDAT8c` `5Z"DkHs;%*N =,OhF-0fcZO}!j*%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/songEditor/songEditorLabelSBG.png000066400000000000000000000005341366722712400247110ustar00rootroot00000000000000PNG  IHDRӌgAMA a cHRMz&u0`:pQ<PLTE:>HQVcVL>bKGDhQ pHYs  tIME Y5IDAT8c` `5Z"DkHs;G-dԒQK% Ā٘ր]%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2016-10-02T22:26:15+02:00{IENDB`hydrogen-1.0.0-rc1/data/img/gray/splash/000077500000000000000000000000001366722712400177455ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/splash/splash.png000066400000000000000000002310461366722712400217530ustar00rootroot00000000000000PNG  IHDR, pHYs  tIME $Zn IDATxYeu%o1#2#"2++3k YA,SK)6)QInܶl ڿ[a %ѶIl)Q,"EVee Y9gd x{}=6 2#p{ï~_?Wï?NcT Te qOU=῜S^K{o~$_Rr6Jd$|bC x#HN7=O~Ov΋ypE#3Yd\#Iy@BU+Rv!f.[窭s+uY\'{kw`+ kה?'w)WV$d{y#&ko6j(ku榘 wH/r攘k_~ ߐOcf'>Nm8hr{5)Csxs*ALqli88?fc]4C$ L+ I7'1%}\T86&ڣ&g/"V8iLq͏2|ͶR-hp?Hf34BP8vbX 'MYF!k/u ]A<_Ht}UL yx^]Eapjлp'iqS $b 5Q]0ABE_*C}yj3 Yɢ#,y߁P,:攓!qM{~YUO^xFX@mg>n[.ܮC7(Nl" ߩb8,7 PxeSjM" ZfG^t6)ZA)G$ ~Md]W@6uº+i .b|z; ''GXȀ5FU$#0QN)G"ۭ݁)OJQn$͈K6y, @(TlU"Eh+͛(B@^N1}DO!$ND*Mpx~E%AL"Jd,TXaTh4T MNm >i T՛Mݡmy촎S:uj7SEk+2 TK5Z y1+"|6 (qeʉSB [wrn'6q0( bD띧A$5QMɴ^jJ({cب h>#!"ndZ*bld#n7*pNA\cSŶ:m { P0e YrHK3y@"ҊB6A%[ Q8ܬGv뜼]N$E,LXB@2Knt(X\;V"ag f/MqWMdp&w=2r,PF%niR"DLjh&pU?adS, "KNϚVT8FB/m#%xRJy;Hq:YkfE8vq8 δ1ZsܐgqG%K"=H r#>}~jQٮb$ n+yS~oU؟6jF~.OhoK5`a4!0ntyHȑE*ן(+ÔT_l4Hp)e\ZFs i:yNAA-E$d%o;W^+Ѩe/@Wz lPX$(rmfanwsS!bp)&#1͍nWPW*IRGs1hp?Z`WS݈Ɉ%=HGd25Jt\ﳭS$j'BĠ b)0#1T]*#6Mq"q$jC84p"APghV9r@y$\W\jK|pBH[G'*G3(`*OGb:'r{>QT݊8Iid Nt-i) Yk(rᆛ !$BE_q9[r*[jy|v'vT?'|T(AݎL50`L|=պ|QI;d* r<4 no,* $=%"p֓"'"&,s4E<:(6gka A/8*K!!X j⿢\+ ]d jJȔ> hzQGE3q CP7sOCL/Q$EUFZǛ[a9F᫥94 6U}6_m܈m2#xݓkyLvqE.HM5xaf )ԖuP:[|q^421 ̍\jdm1꩹BtL7V1R ?CT z"s. |jAq<*fP'vr s) ⏇(PT mO9\@}Uj )jE!P>LG 4*q$$Q"w&VXّ[i=)щ*L;IЋezj feUj|m+YE.>zeY@5h$9R@BB*F~Jo%ka(S'{[mӁ>ȣ ?$Qz5BIRi?yaݕ UiRBz. gA)1r l*h|wσl&ghS=J{  Kli(9I,]ms dԦ^ݮ"Gngݒ4je1,;X 4תƬQ䣏Pt(]QnSNXz$fk%!N ꌙ#MT#snuemIȤ5z@Aihc*4?c>$qc)Rd4fpFHnQ$ 0]WZ9殳p/FWӯ2πHbj !clq>;㜣ː8P\F"fap0vIL(:pKm=*%{iRrH*و3ѨlD;6Ւ9RGk8C`S9J%jhRjgV- D+]LD5T(< nj3ygj "LQz?ٔV g76#2Ns!瑺qAQH8BCw0>3~M^v5héN;`R ?G&T1?ߪLF5xShNqt}XXi@ǐ+8/jĩӏ=GSP7ٌc]DϟV[N)'ږ QHvwSv-yrfM-(wRl&Q "!8{rH{hC]2-dZ:)mP/r+n$.CYMFrt Tk\p.B/Q'7SǬ5 i ,Q7Həa9-fBp#,sE C%خ@jZ⅟a å8UێH*mO45]0v֝ aA$XyHy[BDIf|m.H]. 2Wű?,dh'$1@doq1see āLGbUYO. T%;TL![XJm#3/2ٓm`| pmI`Kt^GRW!^'WMlpU`}"9m7e+8oF Y[â-U&=(ԏk52hfVƢ|vAd :S*Ȑi-Ws@qh,ۋ7ʯBh, Y &VJQUk 䖍{6@"/SOQwI@ʖdXRBW٠1܇J^AUt;1 _g4BN3(qO (ĭ U*5ur֔u ġ51`y wqppT"^)Bu.382n`iyNwHXUE]]rLtD ~WbE4}$ip0Ԍ,VN`P@ԉ*;Q'E§@P+ȩ\ȫ!p4}8^dsZ3N[ΎCu﷤)w%8 :=N`L@}TU@^#ܿ{7o;)GQyzFqpll^Obk ,..!te V @! UV%W*Fh؛8@jT hyDo37Y p {؜PEdeKsx66\䓪{7EvՠiSCIHrfN*rY ^ِlMlPl.'+Ce~A UTjUUlH)U'0.G>}uܸ]>zɤ Tk:L4k 16ܽƥ-z}dYdYuOTC5jAGh&+D!g56=.2aKnB^: 6A[ImyL:!ClHw x<*Q,ϵtݸlzN%bmmkGxX]=ͭLQ^5< I'12<! EIAs3JuH߯.It Ww`v6uqeI];N]W\m$Ow?w]CjѼ)αߕZఽz=et37kt@BP]?rDuvJ05Ÿ?!$"tM l;JRI 'U |mܻN0=n%"dY`Nťe{=FC<[o1:'͋1ѨxTuuGS YHhx*#,d-1^"rْ0a[x6)۔ӃydbX׫S< DT^*.EbQ2.UC+]f{xeIL`*E~X0Ftƚqr|w6< )5vwwqxx=VBrPN[vZ>v/18tyӼ@J4O [ &szw { c2#sB5Lh9O<1prfS؏'ш_: 5 S K=dnZkܾ} qt|p1n·2g`4aww{89`늪vr{bѓX]]C><)QH6i~J]eT#Fj8 r׶՘eG} $(CGlJHcUf*TMقL|E 2ċjtr]ᴏÕ')SMt [ I#nc 6gba(>CqNrq<ʱhGƹa4ΫcKq|xncX5j'Z[vyP aف)Ns7P7I l-tt*-up%Q~#2f')^7e.sƒ1< J#@2s~0xgL0+aMAX4O3"]TQ,xr7U-JUMroT䊬js5ƚ)F`6ո9Њ(":RY:rf10**u&G!vq|t<O@-I+5nQ5Q$#2Rθvi7T ˑJ쓥˪Ŀȳ+ %%j|ZxCZA,VN$`TuUbm@  5sat5OBÉ(5&R5^~) آ)$I0X׎F QmSx4Xρr1dC_:8<ǻ*MkɂKӪTg9=C!+ q>޶dD5:(Q :`v(;g#K͉dEdQVf^3DHçpbiJG1|%T\LRռt75K!BwA%fԝ3Z+Z jvs֌It?qg3>L,̙3ȵΣ]F# c<Cw58Њ LCEcLqj`juS2/^4*8{ߖ苺'%' VUK yEroH@rUӌLtTV'.n{6UI[qbM+ӏХ,:4sFPreX\N/Y )T? K$u2yGDI e祵 ?կaaq+++e>BWqBy;t UI]qu ogjX~ |g Μ5.FܑS70;&Xe7$VFT0B6wL'%aṠUѩJ)Oӛ@)G*dVs՝+=iy9َ ,<g&6|*ML?D:~EyGu."%bgg^W>^x?άݻ+kK.auu{rg3prr<Y33-mpBT5}XDjM'B̊iy)c @33,m"CoZ!2lQ!ܨqh,'S 81q"Y{(# Cmi]0&Rlf Jæ`lDr&J$˙xf-Zp^m|,ɘODD8w> /`ow=cN`yed~O}i"S ___Ν;!S<Qx8ֹEAdP3V7FٙѥU**gYA{vz&9Pl ڑ٣Z)s!Is+f֖ !gm"d=U6KxcJ1]T t6nkF=F"sRqQyPiȣ}g>}x+swmy_0~*|++XXXDC`ggJGȣdv nktg:QQo;nl+03N+mXI#yfVT,hn+TqBLn 8O6kzDD4ȤJQ2cG3N wT C҃rQp5HrnԤnҦƇ[ϟK/{O]B.\c?yT5^xy|5~S?nf,ˠȏ~5~8|y>*fpI11wnt9VriZa9j*x5; Buu\*Ěn bmGmC ۙ1љMIa1*/ ޅ*zL8>CE\DI 6tWSUa f?x\2p uKF;:RP:ę S?)y8,lW׎@F">}S%49cpy6!RBٕSG6+R%pnk׮aooַW\R:8^\y O=OW|hgc\vys R}" 3ij5)фalPx搧#O\~P[`kG!xid-dp)P@9 eVD(9ҚQ;*&ü2ӟ %&X$塥g(k#fQ؄M|i胂\~QU-ԃ$n,Sv;t2}u\~G~ ',˰'/]իOayy~YWo|uݽ}7pxxs.>y("6=R+8\N8KgAaՈэsUn CE1nasSN-'BNI%5mC+@:4HI8^) 3de|4 ȼ)-s}ȄNI'yVkv,6%AL4 'UmL 2h2R: v 1_6!slmn@Q>~mG4cܼy q?sܻw`3xQ!PB_>aR+G{xJA\ ~i/2@qB9TW]wg 0ȮG$z <"7-4G<]d:H!,v 3t 9 L Kg$rE+*Kx_(9FM-doK_n~Ǟлg.),)8?d.oً_㓿o< Wo#C[_nx_L .2sFChhzv[~OSRA, "OhJ!>"X[J3i/is8j:ToeLb>mc3Dr"9@F §5lf9+P{P=P $~ YցRnܸW_}W7?g5`uUay8DFu'̰EҚb~KC|G;w=_{s ?3RHF89>.#zy =UڣATH4&$/vv63q:'P[\9SZgpu6ڽ К@'"Qm] Y&UiGySEKG M(<"(!S =:㹅ڇ8w$EFwQa"26C|y o+ǏsAXS =cJIg4h`END6; b*(Ƞ=qѩBSlhPkMȦ /i2@T79ϾsjhD% 93p9+jx P kfvN\ک_-HyXHqڽ!.l):@;AY6E,Rg@Xao|ws1 cl0ޣq܎'88؟lL&@,Nߜu/QNm;IQ`)̝CX_F!f*<< %IY2;һVHcI޸ Lc7> nT W7tGs5W3\c'㄂O(Ln2Q̡Ϊ{=5T\E~ o: 9^NGV]STAt@P]_5*Ca4d qM vmcx*=]͌|<62S QX`|+7$LgNք5Aؤ3+7O>hrSBO)d}@8#lda"?M1U7ju4Ӣ\{Gg3O~pS( SuE 9䘱q-g eup{7bX2\7q||#n``Lj2_EXiN8]++>vKpe.mUUgF ~ @ΐDžQ݆`#oLPIċhZI2('TZ$ jVi/"Xid;Ks}![dl?i^`DcBeh` =ҢiyztsYMW2eL+(:=PĚzdKz`o2k1¥x7wO*\~p:@у{CB< .0複1`0A\}r_wZkܺu K/__Wt{=dYZg o Sxigә>P| >\pOJbAp.*@kU9O6.ceW]5a70<[fvPG@˻.SދFȯ)鶜/-Y>?"R%5<6.<~0v^v 5GzdC =`au&irM8<" h=)tϽ >?W^y{{zϟ>m >zwn;(b󼺥y>Ki˖ yRUQ<'Qn(w=*vvـܟxD59p2#@k_8 ?$(Au:XZZ1K/᝛p2~+Wݻx󭷠5GClǽoayyYJgРzLv"F1W8S4Z!ګds~^tKjޘmx~}}pnAJ1:0,rǤ!Oe'#ܽvv"5HeX\ZĹsv8:<@?2V/|{{w11z,{>-]E?XZZ(ˤϞ]ǧ?i|cŝ?l8::'5a]C'Ht 9x q*O rcI ).Rv;7LٖFB&)@Uz| t=ͥ)t͝GNHGBB Nwf+"XW$Hg$F4qTR46<: <TYT! w6n`0,vww1 F/[Eꥏ`<<0uV@Ae=wX\er%nW\_~ 7ͷ߁ֱty gΡwy'"(EHjP rRu|uKdoCJ7]YJbz Jø/%gS5%je߅/npu5WԷ6S8!p.8emQiZC݂Z$ #A_X3?JMvGsR<<+9Gsݷqx5xq*ְhIe7[Y(XY=-pgϞBrq>g?Y,,,^֌xxc<!}g6ךbemHàsP-S'@8J/̊4"zB JAxoq, mI$pG*dmHf߉%3ӣDN'}g(I%r'>ŝ=C;jg䣧8tNy,̗YOM#RTE1ߔ$"f~iC#N0Pp?#Ϭ W ̭D?%]_XWzB_3He|R]FwnW <ܾQ>K}/RPJNdmL!!`T3xE\toauu^JQtpR /Q|sE׍/9$^ 6j562d $@ϵk NaB] /)}Ne 75%$jcPYyrG''*P-&t.+1h7^.޽DW7O\/2aqq߇֌^%,..aaW84ᢐO|G?|叒Vpx; z>U>4BoX JFTp_3z8XRb:72U VА^!!I]0[KlFy/2XHNQ,$fɰq5"L l: L⍥"?N$j"#= mTU$>=sP d6SE@_I䶒ތU!JM3J#%"^عW)iq!Q Rrf\nzs "ڵ9,,,LpD&D),S0^bR 27_CօA2fhkO)yvDEn51+L jܘ!ENs(oyna"ɽ:D9`Tg\5XxaEiWgN,ml.yc 8sKGZ+\(5ZWl.Xܒ{ )Ё* Y`Z xm̄E|砵Dd8΃׮='/?#B(1.TacB8*F(BB3N8#*{Y_1pVSjTbF y zHj&' V;y:lj)uZ1Ffv`^׽P4i4ϜݜI+-[sh;2PD#cΠHh1 \*!d#R6Gxn\.vv`<].?t:ݤWd38cN'CeP dx\2~^_2*xl&(#qF#c F#dY^Wa}m I5'G}Ia8 l1Be%M38J'"~EAAACU˕Z"`%n3ijyz:O#:ɑm=pt D6揨ɱ1KٕDOBu6< @eB*`\4Fn7H*S K3#S{3f fU %1߽A<^[x^[C}%pp,@E"^HqttA7ȧsΕ2>'>IܺuVR,h OpMo{*H!M9 1Jaœ-4s$HNI.h$Coכ8J좄# MTg Oiј"nr!B5<- @B&N=:Q3ƤuG6vSd2a{fČcO usF)"Ξ=,ːkh`^[VIu,[XZZ2,SJja_8 `4a4!'@&dRsX?{͗7|_70 G#?.1wױVPZғ!LxnY@h>_$8))뫢XWejD81T6;VՈJ|G+0F0)JR$*yUXLXzTU͵\s c y O=u.]d`a4bww/~eFC|$q+X__"iBȩ sNcVͲRQS&rtBQ:LfݰLia%&sMzp6I"w{k5 YiC2sf!A9K&FF%hRaMC2@9ɪ@^#r>~T( yGT#VI;Dw>xǻ~xά`aa`4' > .`yy Y<)*o0=nN@>r Qm'{XXcuugϮ!+++W'9?>1677Sfx8_ZݝGX^]Gu:V ,BVl%M8\/8M*q2#$Ϭ(yX埮 ;e ȉ 42gB4k''|a2M/MŻ"t'A۟jt]bɍ@ȈDR9QN,v3t[Jpp*.^cF#t:]g>/byyԱ2) dRT"f3k`UEc}} .9,,e| _j.1XEqkS|`In@(Ja9KPpvP*γN¦qHt1'#QI\M#%f5ϝ,(ۦY؟pix62'x8DC_۹22;)l@2K3ݼKcUc.exc9.F>v:>}E^ 6BͅR]B{ x t?5llaa<#p$8'5h>F|'D/i9]ρ%ʒ(y4Δ5FLQ7S8&8pBQ!L@i앑֦ {pmBޣttֆ.2$D {g}KjsF܇8P΃(pv>٢fB%5F!R5{rD5tICjαxwflnmb08  ++Lf%41u01 1J9igB̌"}Ybsxpv,q||}h46N.b/bz#  U90R@Y0Pa*DF,LhЍ Q?xMF{1̟&[26"A`?CjpdZxAaӜ 輴Hݕ@2$ {#x#O`x=G]'$9& 3߃GZ3'O|\_N9iU*KIo%bux񑏼>&>.1顤 ɱwSdEםvSKH^$DFQfTZvR$Iz0Y<1!F#{:8bkXoG@$N[ O;sATd> SoȩCJv?r2ǁKO+yܟ0L ʑ =;C5}QGsYs([4:JAc<ƣ8888駯_Ξ]^I ]L\0<4sYdKX^^x1ݻ] ח>>|ݝUup$ 6g|!lAJdR?\R(lOpQbi7FoqdvNyimrΩMRrBҒRh#Iȫ)^ǘzԤPj8WJ^Q)ID~ WՐ\Z ኻ΅ţ8L 5{ZShܛZWb;3)ޜ3kf(KDR۲[-jb~l m6MkDk"rμ7xӎqܼUV u3 k}ZQ[q?9]}ĄX8>>dr 0_>(YfA6irtZkK>)\m;eƕ2Q_YÐR˗8; cDQ8V`Aɤv(1` 7Hx̀ cˁAU!(ƲjLQTw B3 oKD*LyjV7[ܾZV}"wk+j)06gv),X|QBZ Zeɞ]/x6צVuaӘS'!4(Zx(%<Qe  ln5n[n-oMڛ IDATdʹ5@P9іHqtzMG-bY9fS&6Q^]:e+hҪ1$w+O\ӥk J!&DJFppJGټ>)* %#/Y`qQmr爚*,_-յz7X! ]N+.4dWjbd$ѩ9=I)A CH<}.\)5:ƸIqo o/:R'\ylgfFC| Ubh4:rd@.b2p5`*1Q)lj8p6j\.bE߸Áxa,C 2K,7V?AX\٨_ѡ[F;s#]|b̛Na8,>G0[UwRNFAFFbв,HTW- g>lv)k0G0;;/~`h<8/='Xdns]V(8-.A]~Oh4NE C^{5ήE"վz Zk(dK5QM EԺ7Mz!{7nymtݟ)ƚNN,F`ǀr@K^/u $5pUb,׸)U5_U&wB@Ԁ"Pemf +|iEژ8*=t)RT%hm+Tf)ef@+ꁧ qW%2ZUre\QeN&f) '2盫*ϕrDYUv?KXPk,3QX&QZsiWalS.Y'}6fA%L rLcKwVS&Z5GI]ؖ4fט AJ+%?)^S/ V52m=G̏غwqn_,Y.X)0ҍz MiZ/U*z%CzajN[,*0%47Jugf6.dB3tzD*靮[p[,v:shLՠ W$C@m~am$)w L- Ik{Wz K)YpE`Y1.M6s%zETaAW+mGG8=~gq| {o<{M~QPm1A%b 7-k*Δ4Z$vmp8A+0eLers+$muoe2mpwYW#`ր5kNw2ih.#]mK9^^3|D%G={_%yd_<^YiP굽~aelnLrQ$%YtCni\y)\T$jA1݇U%!u:RQW.6\R0pt D:^"8.Og?ba2(u1|ϵ2iDPLUd(R*H*Ky3G#}VB)v^../VoqKl#+% Le2},s=y0s AʫBN V3g18L&<ՂQ* J½\ ~+W(mwIV$A; CNN٣b㼘م)8e|X#*~MD*E `302z~u޿lnS|^C^Ç%0Bŝ?sfNvdżƜs,f)6q)dZK!":jvwYIzisB™\)' jZJ]A8F|ZEj %؊I%jsT(HEAeuBtU?Ǧ ,'^ĊoQ ?}@)Tbs VJK.|dS1ͰsS-I:vefR(=~6a^ }U' z>fyߴ[/$Wz I;(L%WFf@y4GO뮉˦ůR%q՜6PY(CFL} jO-M7m0qW]`$BA50;"[M4+3)jm4ɰfTe`)hux‘LW*AgR.W( βlJġ,@jߵ$zM7q[wa ws!/"!C-ɣa=3ůt TNL՟k²'^gV^i][*v ʍcyLBezV?3Dx aoogggyED<=_+p+1y%U5ߋ2nL e~#[T,ԓGE3cZ A?d铧>R*C?gϰ{}[7 IHv\/$[_8ʸ'R ׫h.xV)&[*sV.Z$R;*OܺKer*z&_EDۮG2R\&NHjj{uJ[V*\Gk+sz%hIvL%& f̡t<mCgsJj> ݾyI RpmɹD'UW^y _+AɃ9ҤT ljk=/'Ŷ7~w?W^$ )@B& {IlzК]7ۻ.]+(f3c1 xll7~o`8b`r5?G3( P<ϱsO! bĿ?qͽK.&pp D$H#!8j 8B0 ώ! ޯw ^yHqJ*51En jJh#F?ɧF^ҨۊY[U(/?&Aupږ<؂7 ډtITjol{%Zv\S wE$ QpE.ʟhxKR[Wۜ;>DX7W1s|MWf(f݇VJE6xM1>{o7pqί`ckW@/ݺ}6RBk0 EJ2% "  \!QY71b CS\wwvp:|R ڇP:B{p g# _G zcznlC-r[x7[=~*^B+i,dHA hZC8VTpQ0 RIDyB݈uuA} =u!G.u=&L%$pJ 5v7o;ē{O={ĖN\U (#n鷁Xx˜,X'G<uߗ`}?Ӓ Qy20宠T֧Yj `~RFSBFRH 궳m8 ]zġ܀gdUJP4n@>,ǮnXlSoʰ3Y*LzJ[+F۫6e3_6fr }9׏#\ރp"GTМl] Bi 8B7X#V T  JhΑ H)HB?pˏ1b31@@.@=ۇ@ Y_"N M r$c#wD IDATL~+M:szx6as|xtC@J`g ܹBs %`0LLgc O.'>H)'XdApIn{NS58'c.m-̨^=5M"#DdqxU Z5eWT5Nm>69F9pAvx.OdkX5&eSff`]*"A+$Eۀ@==15>y7;pMx>\vh ^.@z<|\h $T7iʇd ) u̩7fy`ĞGKCX'*q=׃#%HA2q"clB8xs~xos=$A>0$}psƀRIW:^M`4&|Hc߷Kʵgxt-hIC0假\M6rbF!lHZ:]9lewg&P KqP-P] m*^8[VD.dͩ1~)Gd_6Y$@\&ͫ]؂XfP_-ɣ6FP_~iWQ**Gfg@4S(B׿v6B/6ēGp= +J >@\q\te1mTA*0Ne:&NztRL)%$ uR\z:  ޯ&L9>=z=@ FZSBWYʤK{@O=BY,^=ǻ>&Kb@ 隃Ȼ1غT  .[;,EЧZ8OYS3ȊWX-#Z*–\6^l6D%\J:H%W:Y˼H.V+ V[ Gu.j6@2T*hxzU7QVѯwWN T W\0@Ol2_bNF}0$xmC)~ 8?bb[H@:Iy"YE97v&>(sRt,9JaMQm ?)BUZJY0MՒz3{7=USz"[i]UC c4YF+o5U>,;|]<.}J_d\!ë*u_IDX.>vwqpxzʕp'wL g@cfÛ$# O2|M8RɂaAubjPɶ$I@) H8}HnE:`@DK(.!a._•8NhŸ{ߊ?j|H/4E6YB:؝UXYZLfMcˍHYD 5}LoLAPU!xػ~{h~@  4"G&w'ACCX)L%X q5N~42쟠!DKGuQBWOlW dzCC@Ly=J^HZ NiIɁ2q(%~w2^>E<(#+Ne0ctKD>\V:ǰ9^I/՗EGL[:JITO$+]¨0.iRwZ}m_WרԙP >Gl%{UaK"h?]̄ZZP|1/{o6~2gKWS^KCk#V +eR(ƝJF^)-5k8Ou%+D;-T)( ZNqkR:ld<``sݘ1~6]EөXqrOTt dsXO%,5(.k5ah!o:nUcc]߹DDQKhh9/;C,-#e./bѐ|-HIBit2E!u*eQЎŬuI\xMēϱwc?w?;& B%i\e1R3x]f;FqwB&R*BI %H&{Mr# "HQI'=f@4c29_o~ {Kq=Ǹ-=}f\lW07 a\̕@`\(k7VAechuaxU}=դUuλ4T;T2CqXXZ;rKǍ@fkQCԱ<5]1!IT|YuM] 15@g?8 ^{:|y?_>n^e7\oưK 1Ӵ]zIcUe֬{Ouu C4GfKDߓJF6}%9f cӟ`yۛȆ" 'yd";%ƽG?S%^{v$+YmP&#B_QrLiK .GLrr-OE*߆ _mojBMap9^fPWWV/;v{BK#_ewx||GGD}zw1=,4S{ \\wnw`0qiguh$*V.Yf2&KVC(!*p8 fjP|1d2Ǐ3q[zNRB:iI3@'~%;VrhE FlgI0)o t."U+ңɗlnZ+jpc ]X)&5t,_BlCW=u[d:_|v>lv(lO0+peC`/!nܼv<sYLxz~ +lbwwׯ_]ܼy[p=Y;Z(H2גmʯ2- =̦b*q6gx ~ >ēp1$il\G'C\~w?i v.81_%ߣP@"(8pܔ!- x\"fQ|.naǢmZ܁+K6j+ijWmo|K i{.Z&5Ty]7*6=_D<ڒBm9ƣ.ocmHG88h/w DFxPWٿE8C p p{ܾ&]۷oc<b<b4<`בp 8kPJ%{! s!(F,K,%)&3|ygOb1sOAZAVp~w?Go}m+>P1~5-pɃoCd9Y 9GH[RbdBMԊeS F / tϭ]S)76Ev<sjuRŀ\Y5Bub<ʗEV~oօP ph L(" _a?~҈"xq:Qpiw`{Dx y}K|OB#ә|AJw m }lmn`sc-)Op6Mqvr!>姘O%h &''To]0@=Hw(Pgxr.xa|w^@CtJHH&~_M=[b'qsv V QukXEE߼S ft!T1w27Z#)͖Fe^1@8Jj]ѳeH^we΁׏u.\W6wKEW+ KOG$YU ^oKy^kl::8@%GpS ?Sl]{N&K\.3(pm)A FP=sPC:^χ0 .b0N17>B(@1菒]\=w8p=,^<}×`yxlN0%' h "I<;ekx %<BȔH>}tF.$HБ"|2,9$RÕ[ [H[,g\!Y iC#'a"&Dx~Cnn(ZW:ˮ] "EbW;aS@ 0Ԡ89e_ĎwK޹5ĻXWA>7^1?X_7]A1}>Clla8A%, »-hOt*vvp?av/o! -%bOl/# FBb XAӴ96 5DpFX<:%?e,~r<B:BH !E>FB[vb!)8NY4ռbծ:hyW0-F{cLOE\Cɞ"( JChc<)t-ٸNn8T,te3 A?Go.\Kd@J r ɲʍ)%CbI\'TkGJzYAQs yI yb΅# ',6Zn1VBG +M:\&Avlv=^Ub!SKqvuӫ&G:%s P0 G8[8[ɧ1>1 }T0M~V@R1)9~ß'!1TG:Cb)1;d"Oh xw3{|9?&bc߿+W09;ģ_ٳPQ`q0_ueglW"yaN|,ۦ"qpg"Mcy(mB*b<1(:|x@JB1DW)5ccc)H$(A@+@Otbh#xn#|ˏCg)%@=޵X?ObCā0#uL@BH B܀븼B&"+' P#XjKt!d_Oo$؂&'P]q#I"٤`jmߩ"Rlt!RJ8$WBE&7*1Zfpð\K@jWM,æť$HfqX;[6I6&I~[pBGrZbt%.AHgU|2끂ۄo~> 0߅"`;^vMܺu O=l2g*Su"*yJ% HN(Xb1ecF)Ę *Zb=9(24 tR.d%3bN4*:Ç?Aȸmw'Sa !NP?:%ƵF2Lh~5<^AO: ϑ%jȓ)ai).Rٍ]NŨ0+g}G^[<*I {TQvDKxjףm׸ikJc«',jȰ{~ľ^| P"l-`Ҋ@MMe E.I^^Τ@4tśgA`0Xbs&%=ybo}uH/?)?Vs˺TN_ M 5(LD`$mKIX,(o6kθ f $)WZ?uZgǫY=C0*:T]JHfH̓/Sã#lb ]p866FLS|y|2D)dfCf& V:oqL6pt&W཯iH/㰙|3$&3@Pb N|DQ(M#cp,WnQ{0Y<ηuhKJ8@*Ny`61v7n9!sSBFC 2Ypor@r^@R*i \UJZ7Tő0M鸮V1p =)ԗ#6 P3GjkˌȬ2ߧ֮d- |*Kk5_SrSK&aU"Cl܄[|v\-M،Ο;.y?dTJ\|?@G7.2EO"%5$ h!)D1bٜ.@.e#D1p=` O>jʖ]2JC.v.]~ [;[t:pW W6cwP`grI|B#K'MFNÈϧ|vvus}8 q SC&CQph:wv8%3,8# ߃](_SX꭭~LFPuFSȅUm5B$ B1C*NbK{;bsHe i!"'ym)\$Cz}`rA1b@ 82BR$ZbQ L/nb1ܴp'],`,qd \є; &RC8%(1m [*3j1lr]8h 'W6Z?6B!|[LDlF2^*w6΢%;~V>4Lvl* ڵR_j!6RUK-y4uUKv~.S 4W` Iۛpqd1P `@ 6;t6K rY41 &6*8#$~1+Dab:xn`2[).ƥ/d_V1=y[NW2˰SkmSz>%fhձPWi ݹg=IcA@ F l 0pXbr|+_U{g`No54 0I"B2R"'S9҂A}<1oBʌd1uN`1 @Hzp|m0S$\KSX#b0']B1 +O D }5U ڭiJ%ف] !)ɏnR2M\6 4gXLFp*^L믭ӹ& XQ$_L"8kn:[>4G}  -n6muvbi++2?_kJګNAİ$H;҅#:@ͱx~q0f|P:ImqD1$g@k]Bْs64_,qz|Ǐ  BCBAHK@@_ H=aυM"%i DX$)MrMxz I8ҁ47S9:Tflm$2v4(E8flUS*aJ; `U)CF\&UuAY0 o|b~H"[Jm. pfbM\ W~zu3HjgUB( el+]f4)1 Ь-/I͉/OV|@(e!`90 \A-Ib;3xa1 0gIJE7"Lܳn#7J|> ]'R$KAi76u!{.16`(CyY,\ D*?" D(#iQk>X?uώUA: G aM85J\+SBd:VT 8dD_9Q6JcI(OB`Ku<+,Pޜmvs׷6:Ўs+dbD7k$ue34*yjSE8;^U%^'[xS|B3xK6piKH0I2),  tdTicp쓴*G Kf>B1} SU.XdDu.$t!{>ΎA !| qMiRDZ:ośIiPa.>Cs hՒwsZQ:Gn *jZZ`Vu]l:AB'{+ܖF#Xqw. w?sAgFk:V֭{5lF-׊ޑoFjn:;^fձw/zbƜJ7)9w H%\8<>>G Bg̈xIvF<*A:.m)7R]WAh/{# = PRJ3oDiMp ߓHưaƐN!.Vɓ.Ld$jAFҊ.䪬v^٩+đE*F}$5^oHT 5m7=z j߆]|+`2.Mp:n\E.tht$-/mɶzOb&`d[B `"KZ'6(͚%3os2ukB UP $D)Evn;~r~a;~nYI " H 3jn՝33a}NP"pr𭵾%%(| *'RU>?/D1;+B@40Ĺ װs.ܲ2eA7I #ISt0 ˊB$ZERT*0Eٶm;_JSP.^w0X_-*ȝsq ,IT˰{,nٻ)$+y"MJLJhjIq,ŔzHWU82/,g=ʞ} =);n4UGU*)F|?P'XIN P"g77ae2ޘjnF AA1#Mpbpq ݲ~+Sr*.@9RR$ @EoVأ+BכY|qP)L&Л:iI1,JtD9 F CٙI"ܲ$z>tX :u r }~JX=#waHLdR]Mli sE<rXA˭u0n.ssTMI֔{U*:;(uPX(g3fQd)"AJ2Ͳ%g4%ˠVb ,W=2<%wRT6iEޢcH# B1&LijOH$'\g:Cw܃)^X") }2]@G&+k}:[vEadT]~7.]!("Q`JAЅB2$3)gqaIO_:WiUkt-T82ćZϦa,r4J|Aƻ Ӓ5u૵FeкW͊( MsM]: kКs~~ * _T5CXkYDua28[E3ŽXNך]lЪvJM*M٤b4y,"[Y"L!F/p:bEӋTW)_Tu֡a4{ppIx mu7P8gq;Sj 4k}d;{-x/blZqeaX+eAbvZ3 Tgƀz8$B4nD t3Ȇ\"IDYmmG:piNAU;B!c Ϙr .>IxoMҕz.:ҴSu`*- \">[Ja= {gCHc`7Q<' JO$g*VNVv("a F2N#Ceuʺ|/;,59R:Z1Cqff13'@g?"q23{a&(*AU0^=Q K]nc,9 0ՐP!y(ji4%@j9\3f2W0$` W@n?8x7_1XbmmLH(Jd @u_p ҃B./"T` ϞCb}@:},/.Bx̘י4~všrW^@znA)U@%e`-'چg.چ6JuSd2M 9EU+j9e;{X [LEs(uqnǬJΧNLLs{h~FHٕŖTUNFޠV0Qe'\H1i;q"`WB2(*efzĸ Qy懄2t?hƘ3e6[n乢|p0 =\Caulߊwmpwx2^k׮cye:#J8&Tu-LLz.Bg% 3]c$FgbLm[ 'WR''z32-asg_TB(tJ;HU>ANy y`:XNS:sثpz8Rs;I٫GYMe$(T CN@\yҚY΢I3O` PUT&DhX8Ge;HyƉICB7&X ,K*l56Zkg–GԪ\ZPb_ g88XăǾW\(08viElnHIJs )@عc++k8s 6-W_u ֗qc:VW Ȳ ,):InmcΝx7$I NS3S`֘Fw;2NLbn6Ρ;3޶]/a}"E^^@:yćI R Bܴ,Ȫof"(UsԄ!.cMBqi6VK-7h^PQKE&?'1'\*9Ȏ3VשּA(*RQHKDZ8S0Ec[$`Յ,,yLLb8;6IΰvVWCLMLĘ!L{`XՄ7߻ < +W'^//]CJ N/t4O[,QuAPΒ2]*hujV}2DRYLBfA)-`KQ}յȲ.j]Ɓ4[2atHJI(rQҒQ42;@WT(s>Z'Z0l(r`+2t%f8<;p0#g=6sUД΃FspO1 $سSGaS؉]UJf,9{(i(Vy H D,[~ iև#Gor ;0X_YΣ!ڕsX_]ŮIPݻwbǶyݵ&lǕؾs;:u1=5pߞ|;+ xZ/,bCu`mWz" iibV %QhlJ hG])@"USS_,5S,"Xu.;"iFA '` '@'Y$N4\"iIHPfpD^F5 ]sw "|l: }B֨ þjX-_eCnqe R*w p#el jR&aIwp>f化Yn+S((h( M$T:sP׮;3mabn;tAgn2KPŤJƍ $lx}UA_݂(l^euS1ڋ5Fv0\YΆa)tAM7Q)(3 ,A^qKi90]-!z}8&DUOœOJ̢8M KCYz<(6 n!+Q"spL*:+W:Qi4M1A nh9 fm"6J<=i[DA7g!GFٰ Xsrل"(f*"D`piotНHSNLeHzr~tЙ4n\Xů^|zpUtgo /a9߸ dY>H *!MsNiiEN,@,CZd/vw9 rZ+=lɣnGU`]JXj+#dEImp;6NwKp8]փ+l7560`~!iæFj6ػRi#f:0yw IDAT⼺VQ+aca0gy DLhI 8V0e>' *+籒b`9gHX-c7L::SbN!c5,Cpm- YޡC!Nyr-)X6"O͡ѝq0BPHM"eĶqTܼa%Ks/A[Ɉ4!( ΐj ] $EF1 iMf?J3#p͊3Wa rlԪXspK#S[*stͶfPKr /Nf-0ɜQ2zx׌ 5"P5qeڎjS[1.F3R>2s uY4?*ABTչ"UhsV8bN+ ױdE q{?J%DTyXysFyfbBdu#xco['?T#))tmNvQݽmՎDJ (!8fɱ`CH)FuDy&E׿,Zl̚W g!i"FbvBUa࠲Vi @!Q N HUJʶ_95  N,Awkt8@.,sP 0?l qP\ b"%!-ҙVl=2g6.2%JzZU@3->Ġp7`:(EM2d!#S"44u.aajp΂WٴgtaV*}dTyH]ef l#,vm\Jw oC ʻ.rb4UG`5` .l%Gt,EvSD j͚ϥmf$cTKxF{[&n}b8S~փuؠ .bi6k 6|W”,ː2@1k:nf1Oso}9QQjcL,?QմɉV1MoLr;M)>Mi,w $AdZKJ?ûbc?>խ `,6C9{q0k (0bјa9u.1!#C/2#SfRxٚcx$x ŕ4+8|i0zXξZk\(ދr[cdvYC5}EMb irs24y ^cn2Hd-Ɂt(*fS;\ 13Ax҂`$BRg>\DqěaiE:E.G FFj<B RkC0QY9V$&I6,t1 Cw3օ0w}8 TNʛE;1XN #\>Qc&S \b. "NAsbŤZg8o"Gt@&L# mbk6 [\^%{$KkTtٵzp4 StI0JNaԫ(OG-c6\Ǧv)OalZz3Qwc;6[>Xe 7s dG QFr pW;EcD`ʳIuKfTjP՗^Kj!g(k04,Qnj_dsr̄)쏥8|B(")T4=ĕf$^- \22*G('ة|;.>0`Y=V`7O83"װKBA pW܌zD| Njځ&!Y4ly wEF'RWؔ$aaסT] SQ@8#ʯ?zbxASiPޫ_!;۴=PxVa&-ұDiܧΕ^RS((Ȳ<+l;*xrnumz@/yf0ZpgZd)X m66sl.A8<Ğ!3GE- D9kAFi 2d}Ar"!.=kwYmlSC$q0 ,~d)8rؔ5 IT:2108}Se=ɚ7EgYٲLm &9b<ʈOKgR\e$e3.ɉshƔmYx@DW"\Sp24yqZۿ)G,-;-a4-e(:=G&\B*:r)wMa'B|TIE8 el̓5L70.6Lq$׀ ּӈħ áua4S1Y+idMQ$n I+LX\g\2R(j&EAU܉]#4FuFTĈ"(Ttk iڑ{) $<1A' 2RFkY䃄 4]ܚ8 PA4MCcI<%mR~(ސAoqn9Y33FQ$ѨA-o0lm2,+'5LV|EB\g^o$;ObֽkɃQ@ߣ` * d4Y{T~lASSŖa~o_2@~Nި#D\]涟ٔA/)SaaY>4DDsH5Q6H6WC Zvd9xEVkn?pR i0s( PD*̍ȏ s`0PRpQk ^32- KC][md'P+mKr|˘-!Sǽlph-n4pM$:`l2an؛$뙙ń{E٣'Fnfo c$G#6ю)0G!ֆ-Mji+2!|YLJ8IF2.S$wPSR@  HJ'\ mԂH=lqFjL;e0tTL\DnB@ e01I ?C$ȁEX2;LGIäx9| ؂ڹt2BTtpsA-Х-{jH ԌX2Wx[4sh;dm5enfJ{ABY02ՂvDn 3αn*{q!yRX$`Il!a_E )kl-sM(:e1ROWPlX">Wcъ0'ܙډDrBoL :cn<lZFqpĆl3]I"rE+n`ViB,Ṣɸ2͓%PN]+eeWIċ~{m(بل [X?9Fԧ%!*2[ /)}6evB~~sgG~?U? AWV*# Y6B)dC;öhZ[( Of$(ѐhZD^H0.Y01+a\c KS|YMfle6|J'A#QIڙ1XuIp^񷌞++72s]j =rVQJL`,U 1 HOa w' 6^)Ki 6AuA]\ *yXp0SM*j{%æplj80Ak.\"2V8|"y? ^י[]3S PLfwg!{j4$C,oe8 S4eY̪Vj%'L"io'rk82I# df(ߵw$稕8 6#sg)nJ Z8;2iC*Ѽ8iu5%t0r0m 3c*+$%,շLXr`۵&ӫXsO\,rQLxZ+U xaB-lK*H1EŘ}l犔H1t@%7'^cӨ T&G!s ’I5tZy"gHOJC,'U%O& 8Z:6I7q wnw\87Oo3@r`WK2ɡeSqȧswo(Z{Y5uLk6!m #eo)]`F7ҫ5k`Ol,4U>֟1H4|WuŹ/ l~Gedav K})Xz0ۢcQڧ@-ns _MٌR׀`gH&lŊHeT+BM:ِ]u ubrs n}@(̤#!aZ޼,z ?;3trŹ望!QUZ$аPTq`CW A'׉LGW@gE yŬZrѱ87 0-x^fn8V cٯ-I]]ç`V#(sGtܖ@T+0ּJ^ƬXĢh`$H3P#iV2*qMAD͵d"0'PĮv5XaNjqHsKNPndz[F (tpvjIyB568F02Jj [ ӵν3d ʈ)؇9Q: 9rАq^|?ܬEGh I[vi63Z8R߸I,+xrRJ-"м >1M*vQr6T6m7 ДW e;i<\:*2DÀ[ #Cp%~[\Ih4f vcqT r#еm*?n^6gv*;Lj+ڦYbcph":{Y$4J)DEj`U p (.]L)y( , |nEJj9Y?ҝXphLl_n-fcMc{&#gEF٥qϭ }En<>'3*v6BR0xm< a/[0Tf7؏9Ϣ4|^opNm;0*I6Y1JEz 2 :78hE&k28a~Ae]e)8{)T5r1_q_12 &%7dRea@ZN*q"'bm[>w2q7=Ex.Q>WgY.0qovۤh4dEX~69HHJz~4eWÃFv1*m7Nu-g䎹 ^8ipF)pWۄK]I&Ex#V&ahY;:QC> 5D՝eIRy?pXSFLK)TV'>JY4v8Br:172F1YTHg ,n F G֞GDt9h!xz%H`1c[;61"]$lAQ#a+akQ[/I:|D1?j.CݲB j@jt)PZ95I"5RԪj:r,\k ~V5lBA-4)F;;h#NsGsڟq=qppe4;bϱXM0u)bj\sٟ &׎[`FH>$C¹%{hIH+1aM\lqWY5M11/F(?7g ߀[ gr,X?]m0m8h1tmnWa'"I5j IDAT;rVVj~הӵGxV]qx2|6VwDI:I\FC!gQPP_2!|& ImPSC C pɺ .@nnU)l3^rc}qrذJH lFU Z|4odzD#<%H$ٹq56x= \Q#eu/^>kDk"J[/((䗼yLݰTT:7ߴppEfWޱ,QXqI8.+Eo#Ѩ49tuF0Թ5a8w$/.`.N'+"}8 ** PaKҼ`%2WVtR9)nY̨tr "Q٨27IŊ:/pHs+dE,'r+k.ƀ!p4?^*\~ s="^ONp2A(E{nP$y7MSsR;*EM*øf7InӰ΅slyɚ! PkϠ !O7ǮyDڐ\nZ{6ECvF-q@(`ԉG^/2hJҪצdH%>:nh2汊{+ßԌ _2ܞvjVl@^$r$rއ< Yaj j&2SɡmTW=ߍZ%sڼ!=>8DFŎ:.7EY֊9ol . 9XbHߔǼ|#U>C48W{ɯlfL\d)m9w噹q󦋝"cX՚*2u՛ $ HFD+@ 3' |ӰơCqy4ccյшV5ڠ5 @cP8a~~K˫p-B!kz$SQYat?p Eph=AjDd)d% v6 tܔbrH_ 9h7I6."O:n ^7=g,I$(:Mo"׋` Q-E?$Mz/EL…O0ʗN_1ܾ ( ~gX\Z?#wn;:VsfCp5[BUbae nJF361hļ,[1! lIׁLvN [u62V "ߌ>yU 8ev M 34Na?9BڬHgK|{w!ĝo^ '[`zz; _^á{sbѣqa8p`/@5y /u5;mő୷?83x*'?~So=Ȇ~-⍥w gq|o:W,thR)7M A.@m"2u$h SCHSaCL=n?kg(qȆ?my G.dhy1Gz!@fd#Ukvmi[rQ_}Ͻw8{9}F? .\_y?077;wOa۶3&'0;3^zzǏba.\cGz׻w;؃)|gp ~g1 159 q}a^^Y μ?y旸|H`p b(fr!ctŠDKyƑ3R9}x:03? Mƹ&IYaY jr/m!I?&<`ld7 H-md27 ~0b}<"jCr)QTJayiۓaޝѬ Ȳ!nx {ozg^t7 /)l>o_Ehf<ǼkPVYyq|Hȟ6#u#vOW_{ Ξ{:zs~}v۾K8y'N܎pS =w?i]4~G?cw}uIt;xч߮[ﱺz.Ek e0P\q?p hgAZcxmM3p5]ϵXl-&{dU1-elְ`p8pL$!sl">X mn"aB>S4ҭDnQju#nG ~aM1X>Q弶‹/con ևt VfP*}sgtv܊4M y<]; /WWlM/9ћz C|327:ڄ$iDf9&щFArM c!ʙH;Noݎ01 l(Eb\)4/iv΃LG6(X 9-IS[JfW[O .sX؇g $vҥK4/gMu{}l}p/:z\3ǐiWMH:)zUv%~x[Z6U 2±3$@6LB)=D|n#2eɞ|"uX_73c  6Qģ8*6r|#Ke X$~ۅO h$wd+tZ`vR Y d3M1j>pe&s$ F'z3^5: W}kxI137KJ)E^غPHU 5=ffpffGG`Kcw|).)e Z]f&3@LF6qaΣ%LBm>Ufk\ᦲ$#0 F{B}v`oh]uT[@ Dʺ W,xF_k,kvkg9nsG91mAMJsFlr+3#2 9e\Oab'u1/jHd$'64 ehuN׍X_8[)R"#.Ju.hDL'ֻjf?.^ޣعm+߮_gǗ1̯p%LOa׮'yO*7"ر O<{a|ࠊ#E F3n6}LpQe`5K;5cnnJ:Cm˜]qiؑVa?ݻnϟ}N^'O|~a_=5Ÿ;q3X^Y}0_}2X$G3:Ʊ,N~L5DT*be/*@cb#CմyxlӲסy)a 9hQ8oQ#.H7%된aza5N4d:lt)Hװ /N_[nنI3q~]LMM$hqi 硍LXZ^\YY6y#G?@WѼvrу~.]; n+Ğ=_Ʃ|~XZ^Νƺ 5~[ery1h鲡Bɬj9~_)WH 9DZ:q`+6_C5hA>l R%f/ &rk~k3Gp F~΅p'^ #w+,cٻ]'Mq뭻q!,.-G!%t50G$Μ9o(Ӊp 4s7^~ |MLcnvp>74M5c<~_[Wsg;w0.2!YN$JExs8~vuڟu7*7?}b0xxFqV}^qWVqN5 a^/2I,MM>4{A>V"OYC}{g??3_~ o>5޾mrlH [:"F%jHC[B!DW$S^pR$CXX8W JPKrBj:Gä!m?>L>D{NnCN4)B_Cd-) ](ǏxϜP' !{z>ܱ`HĻ^KçOkv9srJ{Dk7ι^}-(]pwnm?L~E 싟;bbgx?/173WMYQ3l1n h[ =qND.ߕtB"EXmy&{R8vd?NyPwyfN"?HG?ݿ2x:?;#jHP7C-&®;p'p߽q*p_ lu;Μ9 E {Mtȃwkx㸱J/mɓYw`eu/ ^~M<&^|5,//c}m/^='ƑAt?8^~cq{}l1=5Q*<18̱̃糬rAϴY΅F-gPMއ!Y:cE^΁4En=@1RQQ(iO"^&;/p|($%7:4VS޳1A1F6 E npm"CVS/#.Y#=О IDATצ*86< a:jc ViYe#Kaf̡g\vCB4|?Q!u`:cBilύwu-9Yrmgk ri[m5J!DkWn"w዗a}m]n˱a"^)LM0B%fM͝I34I033ɉ:iYūR)Ә Cciy嘚z.Rek X]]rXKCf'11CAH77kk},`mr^Sګ`:7<6 ɆZѡS 7u@Ƴ~L2.&NmX3i>;D8&fy6elė%_ #:fY lLJ[Y~ڔ[pX8vn;n'X3,/xǿWF*o:^(\8o,?;w>=2~JisͶsxⱇpۡ[13F{wWv܊{a߷ 3ӓvrDK+8{2?ŋWr'I{>O~^lkum KK+x_UӉ?Sxc133ɉx?s+W=O@!DCGĮ[cfz2s`x~4g#/5j2J^j*LH1V,#3q:Fǒr$rJc H47QgoLD\lt h|4Me l_;淯4-8~|3:6G))v/`ma%fw?Lc(m-ضu ؃W\ЃwK_uWٚO> >o}:;*2~b˖Y߷k:!&&D=>[ B$ls>AHPPI;|f \.hGF4ap/gcf sn6_BD42jhvtq^%(iz~J ]?'1359g۶9 Î>yH?G:lF`ax|~nL./]1z #Ӵ68J{ẒmwjnZ0?9ʣi!AWgy +/} חy%I[H5u~۶kȸ(}~KWrlm<=ؿo~IZ;!4^x ױZmK+XYY0`k!IiFp~|vֽ;11-2Ʈ[bffz+ 3ūȆva~,q=DYߋqSo^7ŕ ۅO=fgu6LOHyk}^Y]O~O炘w_/sB0|巟.nL-Il)W॓oo'|7OA07;N'c۶-2o?کHv{ob,U5"_o>>' h)\xc9k'/7öm[pp4=5^ՕVYH)3Z%T!]2묖,?\azLC1r H:$ڈM{l)6 8õdHZc.=7s_ߴܨӺqȊb*XZ^ ~oD61Bcrg,\_ĕk׃Σ ruA\lRd]sV z< j2;o;hE 9[=Xaffyy_nK+pjH)CR^s.]8zUckD2i8`fЬ+9_}4M tܔ%^BitʼnM6V9,\с7ЅG2׮,s[l''&@ hᡢPO}[ڪ}PUUAj-¥I '\;ׯ{]o滬M*5E2Zf7XD VKuЎD5 +ͳrr%EFX.ݹkwwN$@+).ipiDvv4H% tgX2^U0壑>C°(/Z6.@}ɹ5#<6 P@A2L`+R,N&e_p[Oҙ3//}̴w:}}т.]~@QYrBEZ#b Yy WVd : { .bP.azp+: b}}&J aedVMk9 FyiX@4V]WaMaXpHYolmC?$ek5Wied\Ρ:t>AϼD׮f{رm(@<ˑe$ۿ5"T[wWΊ1'\lGPB88_$pb+h['keFu^ƚ_^LWfθP0+$h0;ѩtĚ ?l;z NR%XxWJ5;~AP<'sf6}nt"RH^$ski4ߩ/7 P#4xИT.H6UYQB]qԐ.'j)P5[rQjHӟ~o|~}05|%UV1"O[H>+ RCrm:Hcãni `Js |$: $q:[шb(=fhg%>(hٰnKy[F EU͙"Q^ib;Z*s!dj]AHk"}k왗'ђ8Λb{F|cm,"kPzeOk ֋,R1jvƺx,*+ r[CmH^ SH?]K?;T@+]L '%DD/*}sL 7h޶AT'ƒ!a+%ATLzYM a8Ŵtkdq"nUÉۀvt:9dL*rs`'&gkt 89E!ʫ~iS}Coo:D{;4troq "ÇCK7ܰ^={?|jSv>ocGo"nMt#;~s #}_{mw Ncqŋ *st'his{6t%ۻ,B_n Ia9γL&%&h CD5|Yv M,WNBżc4}HʦΚ'mH{Hb..@uis,׍~ߦw$}?bҕmEߤ\'1~1?i𘛦}C/_UСНwzs.S1;]ڸJw'?N/tn!ծv:~0vzYw":w~ì_I/^V;NJm;W_DI_3ϟ]_3fw7s>Z34 ;C!,߆ $y=?2RΩVLBl>:8ϙ0 H-tJQ5qyƑH,9iɂ.Ev 䪧4v'Oщ['nNzKNn^\[2;?-e[d\ǷwO{:9[[?' mnm :t'e{=г*uz;}34< kss߾965'"M%Ѹ G1*r5$T) a$`rW*AX#vИ!/m4BjE{HLnq{Zݢ1982/GsPm5Gm!VSs%"s0IH3YWә9}KI/Vݳt5_KME3՞n[Sc&d^O}O"/}^}ucr/}xWGI;U{~2< _<~EzG*:َ.l01*E?K~x.b<:Cj$dΓtV >BRݬH#!h&:r(цg0, 2Jof%7U:SX2N"'s/.f"dD<w4bփȃg>O;9IGmmn-'ou_{nzS[#o}{6hc zbּ/?cthssN~>/;S~n8[{G-jkk+ ×Ϟ/ЩW?,6"fŮz$t[iR9YRD:VeŽc侀GwD 5fN),*`,BPT\d^0KD>A IԟGMEI#lY9% -5˶"QeAf$o k3j=CE!*e}}}؛;ATp'Q*VIm ?2 .42lZqjJPV2^6ˆF<žHDgόzz4/lF:>1z;#"G7*ڳY8x;tĂ"٦vA|/~VjpQZx4FAkEe+&БY}Mt o`=rjBd'1Ƨ9c;LRGRÏP5(3`l-#9'W?7jys w4+ ]t# U]ډ2-nUjۖ!(+9e%+U89vwwhS/!1DR r<"H\ͭq Pv*FND jٗ(lx&l0;z$TZW*2x%nfmm6 ꣜H<[F#mao`4M"A=HƵ5KiV0T-< 0ЍEMҫO%,+ n֣uHO,pjDpuUT 2YY -rCaV::IeBX8wFY4./#-~+]lnQEWlĖ u0 B.Cm,A񥼇T]x)ͽ 2Ji3H*q ho恆b^x2xstlv`>ڷ/Lڿ|1*Ϛ_I}9Je4'n/K(v\ 1 ގ$3Gxh=t5d '*rCB Lʳ܍nQ]85ճe)1L(l#RW"Y.  %͚馨̙%|`[!x韜G_t]:]p^x]ܸRtuQVMhei(-Y:r:OFo>N;sZq㼝:wa<9wlq2'ip"ឮo~}X(# Ytz[JFB'Q(:ΉyL)zˋ 7Mu#ł`ᆧerwFNIKUgX5zT\*.3]s2G?z 9+_Qvm7UxOiڱ 8.2nЅW/DtI|TiI=cP)^ua1zU*o2 H#r <8%g0{zJlF#2T s$35J(VSUH!u.xj9~*~<YIDAT1*]ElgUF%(* )ݧց4(z#@,zDI  4l"ղXs=K TZ $N$R(["[\s_T,40wVBns.R-T]z:-pKb`6>3,:NHw} k ! ՜JNT^?X\ IxP <'ʆH/1plN<. Ya.HBa?ktl4/92'h݈'8I-kCKFav/{*g2€ G$`Fٲǧ#|%Y~urQQ $iGx"&ǵ5rдBT!QW0].yica#+;T'%:q (of32#q)Ǭꑫ}L  A";o!Ƹ c)p3cH|HoIj+&fe4V'T;tRp`:h[DgK}H QI~jGSA k GF0y?򞐟70OMn@(b0.5 : h1K "7lګ` zhBАⲩJQ&?OI(0 NCHCh4QlYc eH}0Ȝ wSU h:81}Q̊p]_+r"ZhG YWגhtrՈ@аQXqU׬ -v(w٧cQęp(:(6r^<_:<= 䜖9o>p{8H^;AQ" ,DbX/Zg,LГ`09`TӅpP }[˕)ɮs4JPr$ƍl!<zn$,/ ԈYH$ƭnY5̋Kaii؞jF.),sЫPx@zM$h+.:>mUu gz?)cM$4T8bg8qϜN)׺EN768d!<=cO8$ʙ(HXxr8ຌ.)ؐS0VB08r<8(F,s@qYaɾYMOJv64eF0=\'qDF1< h r/e ݋vء2>H ᦰ'T.=Э KY lF}O.xή<W}[ccj`aÜ&}oaq" R x !NSP§ /sg$瑔E 𠚮=ەqW`W@EWVRB{,ىl n^dJj Ae=^ XbXBmXKM_F>1e>RR6Ŷ"Lywm7ڰu_S!usaiڻ؍[}ۡA0Pz,=JPy!iY>j9ڪ0Q3<υ>X-1FcrWv{, RpŃJT%ъ۸QWyU/GXR)|]! <9Fg _.?.$=*\;HI{>Ԣ%! /]DZS^; o̓p3B+ʆl+lѹOXXc[G Eɫ J`292),Vh45ҽUtM6P#& FڃdM8kkRݖe7&C2rZ5(mh԰v [8(DD܊u6! Jtjq`@1M(L#C*ЙnЙf T)hNuTU>RX) #P%<=&PDHԂ4&Uޓ\b1 t^uH;yN~Ulp;AP esߛO2@C- xB1y;}= o7Wq!sql1]iUvr5h6/P BQH#^Z G`2TR pz3.xh'H MO*(ޅȾZmX %3<%~5ItY?$N|u_ T\h*;@l:V?@)Y!Q TSb(le~^>mLl4OXsf"P^R\ǓE?vFtR$-z /{L\QD9ES(9v(-J-RP.L,x `Q*A<.q<:t#ߣ꯺Z7:$w196`?|oW%WԀraY/xb 2? s|%tEXtdate:create2017-07-13T19:36:16+02:00p啂%tEXtdate:modify2017-06-07T22:51:26+02:00ftEXtSoftwarewww.inkscape.org<IENDB`hydrogen-1.0.0-rc1/data/img/gray/warning.svg000066400000000000000000000072431366722712400206470ustar00rootroot00000000000000 image/svg+xml hydrogen-1.0.0-rc1/data/img/gray/waveDisplay/000077500000000000000000000000001366722712400207435ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/img/gray/waveDisplay/background.png000066400000000000000000000111731366722712400235730ustar00rootroot00000000000000PNG  IHDR<LsRGBbKGD pHYs  tIME 5-Ģ"tEXtCommentCreated with The GIMPd%nIDATx]k$ e`+h\;h=krFNzuoΫem]~wudV5FZP]ubCM-!;_(:b+ﴳ*Z*ǎň/Yիg|yGjGJmH>W){tYi~65޵b'g~\|m#00稷Vd #f.GkQqk&}ږo;{߉"{rpkr!CƉ Nig#G G 8)Q wu"z'b=> 7gl}ِ{/yU $7D9 ݡO/B"i oV huPhL&PVی!C`J~qkt#xM<$&sƘ6aȂ3oxų `xyzH[&ΟBsA&}vxcJÚ\.sײ^Zn|Kug3:H#Ryꧽk|/w炰_F[^]"#>˫^}ɺ*nLG`-T7κPDGa`q2wU ȣ0*0.pr#sKI2loµK9,J ,O -Yhx-eaڛo.|.XT}2¾DǿqR'>*ZWg+H ɞB)j1N&GBc|#LP Asg/\dr# =!ޯ>Lh_h8-:{=FB$;7%6o'E!oM)\%^rh\n~cRg&plmmJ2EkE&Q= ȔC-e`t=e&ʴطڼyX%# \v`}wZL*xN/W:qrti{ﶟk:G.tY+F%f@O~4)gw" Dgseei2d2 `bp={E) J 0}md@[R[FyʜD~A<1?kހ4 @!Xۅ\짐Rh<mS^"ԟd84y^I jI,Brm"AdxЙ,9c›ӷ#0}T@h$X:f!ުOT-4 !n@hY0d.l1 ݕhZ~M\%_@I7h,Er9% 0(5DkK{o^~vm䜓*ow mnXmRYAi&29~"4GdjlbWC@xGVxZ.юvm݆7g來[!Zj>) V4VUx?ZRmfiYHyԡXIfK`==|E-d =*`ȖԳ|O5F=E求f~%^a;4DmX0e.YF;-(kNYS2E+=O7RuBxuFuH~37LboeޢS<ٖG1Gz'x 5,;QAhVUF$22Ʊ+fE}4]&684b~y⤤s $2{R"(oDTExW2-p-UHhKeuhu7@䲉<R(aP (!OFT4-JXFP!6-Y$Җ 1Q?ذHS!-[ Pv+f^HN,"r^ONgUolw177*?(1z֟Io};Ӳ5"@Z{l{O(G̔Vߪ&lS/{O3f~ <uiEKf O-{;,Cudϵof-ZwZڹ۰\vm]>K˼꽦7UTc_KMW"2\홿"$6ޔR|,]VE kTChGr hգ+2weGѕ ^ 3cGKxh➫h#tG,hU=<ǬQ)Kro7# .da*BpdRBc\} sT(i)#W:J c&u0?eDVQ hQa.5MleẃILZ|ip'FJ`Bw'(Q3/)ׯZEc&o@0͎#l71&Vxvoluer%P]SޥqJ6h@5_x6'^z<"9ur#+0ıSZƞ|>ݯK];R !eTSݮfc?P0<"QnSOo^8n{/2\[}}}Hfq,.?,iڲ*#]8j^j-Yn[e%ނftQ.55URW%>gA*Vg T]3{$ir,CE8WҐ1K E ]-vC;em(ޓޑQP؈ˡi3׎Fm@lzDHMv tw[ % *xh`T z.>6 m>bAFh]*V('O>v'Go _ɛhr? GO$zA`=F_ür^3(657CcW&! $h, =ـo c82O hzq8il %:ho[$4 c88аyS(;>V1 ?Пw43VׁH3z8A2aOxN=-7*, m޳JUo 2l~6`žSQ MWe$_9Xz񣛯=ʉ^; rퟸh n|a8B#ؾ x2O6~ n4s #\:# r;'|_Ni3X )geh걼EVqG=K6mpSG<'xg.m1 tD`S8LGgO<GK\/"~czJ3y|*zTYZ^E}W1h;:yި-(orCc6sktbKHTco Z{ks&?o.=$iooMcF0λ.gʄ>Y#ӑH1qWULRdC37D#} uYg|R%ƉYFRmHL&{2nj)Naцǯ7Qh9e΋bǂ~iG(F6A=$ (Wu&6:~ 5!kT0r H'iwc: u+S%? ~!VB!,:7AOykJ ,*xE<&m>؁*z, }ﯠ_*"BT8d)XئT"yW:,"Nd%Ǣa#q\oOGz,z0 #4 dP&ГD/T2˦OƤp CRɣ`KJy5xOi.cl<;"\TKLa4Z˩$AY#i;+j-3kHN Y^-|~ ?;xa PԜ䒰 u}+ܵTھ՟|UVrH߽S{}ԏ4 xiӞ`B@|O} }nPѸq);c8wTTi=4w%QKpc[?Κa`) ( juWFréG MqGP cO-N.-FA*JN u-Hcf-vA8VIDCБ_yab>)@NjJFܳ rSU*|^ đFnGV9@Ls'~'xChP^p^qxo|oGw>4ڐЂt-2+#i`E <ѐf^Czea֍8Ȓ 0݊@#}\yaa]k[ ͨ$nyЕK0O)yh0 FxNF9 P.4#81a ,Pܖ;I3BW"&M`Dhhi=0X@o"dcb)r.uFEf#fsF'1F$hbkwui;4vE&Zb%2 PF^# $f%qO^KǺ6#5sUtrtYYɓs<3 X8$-0ibNwRGd]AOyV~t¶Yc K^"d-2 Zzw5^^g jU+:B/lw^|y4Ć6(Ie;}Î:rwiX`(edg-0\Ϥ-f<(4LA*sOl N ͖[aY;DŽ A^+Иb"DNS7 '0/c&X[UצQgsVEQ*48Jk*芄 [ъE}b"qv^.>듵P/ֶJ~-XvO_dP }5%%33R.^)Y=kۘZfjM?2yXg:tkYWcQ d. 6gId8$M'ZD[ٚPP-4b珬D\~\R: g=“!~p]WL'Y^[I+ -K 0H6ELb3XrJ?8νB lsgIXxw"0&DZ2gy¹0\`7>`Ћ^5n,gP]ʼڼ=Ы_ uw5/l#.JM 89Ҧu~sRtԶfEZ茵uhF;!Nݑs7{gM%3 P ѿϜ[ka>ўX9 1H-d/Ac򻃧>myx\pSJv)1/_'=F^U*cE[h7w8{M˫4a5s_} R9}pu_az\#6o}6q=k~W 4!:V S2wptj x9e|OϙAy ?5}dRWhڍ3Wr]>~]FUE!x&iݚwPWiJ>u-Rbo `y09q,#+oJ"sk{hT|b5aIG .`BoAC6ݸ"'>~Yu֕^юJFAk#kFv_Lĭ{ݻ 8 pK퓋%*W|Y ˂Ee91^nY9=CĄ2>9*r(0tEkYQ F|fӻMcR_Z陎7]q:*%OpJ0N!ϻTߺ2@΢UK(Xdb74QQ a#8e. hxF H_N2di U K+V,dueuɊ pvK6o| 'rlG%B3jڋQ;sQGLfHZ9wqKlVQ!Ӌ\(1y\LH$eA3ʼn3L/EJ֊7mc3NjRIu;^ͱ}@33J'gNZQN =;-8gУ PzwлbЏqsty^؃ywpf>M'R:z^a[l-]Mκh'8kqpx˕&ʥ4{L"_4V)FNʬE:1pu;ExplKIcz'^9/dE918Ghax)d` z/z}0ıñ)쑷i29,0%nԔkhӜt1]ѬNW@%6irx:%Cxs\'ss(qu>V䕛]?oGm/G珓q$VEWǺZ?d}biyxw{?~z2zɶϐ(DSLJJld3S#}HTL3Y)%rh?C`RJޓNJav$9p~Cm@$!Mp刉0ָ)NHJٶhZ8VCP<.O4pNg2UUX1~^A3:MѥSU:[textf;-ð%I>.Ly+xVN7әƑIh6;k݌ChwŹ,ynjL0GM !-A?FXSK$8oJ$V>-cü @S>e9'hs %)L#bƪ1O&&YJ8Q߬e/IlV!AW!왒h@O0Sx|Z5ѭ9q|`JhT2 i<a+]NB/Š b5"PjZo  b 7ұ4:\mNԬ`?z))XBr1rS; V^ftOQyAzʰA&wߘ+‰+3QI%7 _~z3 b ]Pyefa&ÈF >`aN0MW+<%%>aݠДG)C(>,e+鲦S Aaau f$Nnj_KqzWޕw=|xK^c}Ym2w\DJW#AԞ+S&YDLd V.IQ瓾92[BR< ;?)3mu3&:6V/C)w[YvYԅ+>“Z/]h7^6sLHw`i$߃v0vඎ'Dpv'7_QTABUzi~'*_1~Δs+ [{kWXnonL\)mIYkS}TN6zMh-qDS wHʕC,Kj'W:gk,#+8{aFbY)Y`EY\7R4isW ͱ3=xKd<1òE%9g( ą7\=n.BCmN6 󌞯i3zǎBԌ٣Dkt=BR;O{^B@\D,T$u1ԙi~twIXRJ[dN\܋[^ Z!>G܁ɯxLqtl qZvYlZ2 xd$Hcȼi4qTX宪A~-&ʮ^gXa."Ɣ+IRP١WTTG ]aF RR\~, %IUٔ;0ASCKxp]p;i N).E~R7p*_3!+ R-T[K QT%zwVQ,xMߙ%4KM+*$cvu0MHUX(FhNTh~ PtyX2dgjehm>t1u jV( ^WFK͓Q!OjNi,:6jE; Q%Jsl1Cv|D+98:DLimeMrf2O IDATF_uEO}0˺ʣ.H|! 4dBWk֞Hb!gY[CG@݈4T}:BFeJS+scasE9[R*1HʤV qۖQaPM9ta݋P972gѼ_ADxJ19Sn ؃N '7i~vvkvtԪp (ExmKq6(ס@ebE/# f#12khs hXxFJ¢%=:#=~9bJu)Q>A%:AnVq Ӗ>cNLՠD0a`슓UyoV;+4)=x@&FR+ HzWޢ4Nq$Ue?{ $3G^ζ~-g9I@JmLk8/=VCȨApmk><0~Jyq3f{%}}O!+!Ď橆'w$~V̖%b&%՘=Lsx$67o2ޣbB䏶fÂYSm3'xBr}v}lML֋VVN]/Zm3{RiZ!Y gcT;"Y} CZg%Aaa5zT7P,zv,GCaae.wd~ldE/" \ŠLGmܕTSĮE.XoL< vfqA xySuaUY;^G:jkGje^ 5ѱq$Xq&+vzک\ō4'hUo1!gL}8Sg㰾yzU5<kmbȲt$^F:ܛЪ0"XAZ&ıEQ =YMQa}hiۆ{/~[J,#bEC<8JeuxI}hZm]OJi!박ӻQ&hgj9[N6F];EqD2797m7jaYJRs\jh.Nw /b"ՠGVW bF(yZW9Vz. st?7'itB͙qdp›TV^48Q˺Eխ± &KRcSS"|`&ħe@k@=]Mx"=p/CeU%Wh=yZڞ- j1W}2}yjeYAr5/#X_gJTJ5Kv4VhV&mY_OWCImHsVT<׉l]o}x+Wgy8d g#z+%hR'┥”qdzFҧsT`p@pv0ΕQ$98V4s00z=,yUp "w-!*"K8DF_V5 ֮,\ -9zN14T6R+,,MN5l ,<Є q#Ēx VWUë<J 4嗩Ad8 Wib9$R5ZM@X6pHÊ߈Ƅ8Ѻ̧; 0s*خ3DȊ,p\9%j ,Pf.89?o㥑BRVߦom߶ Z;8? -wIle16(Δ7"G2BIc.!|e{4]&u[|",Uu(,3Ӎ^3_1yri\;=S?N@q 7uOQl8>nONNV$jgV`Y.l=ē/i.1,6zVkKmeWn|c7֍ޯ_c|T/ :Jljo~z?oo?'ZWFg':֪ s_C3 ~ׂ |IENDB`hydrogen-1.0.0-rc1/data/img/gray/waveDisplay/detailsamplewavedisplay.png000066400000000000000000000063411366722712400263720ustar00rootroot00000000000000PNG  IHDRϿsRGBbKGD pHYs  tIME h{etEXtCommentCreated with GIMPW (¶$3,K:m[ I)"AO"~Q/$ ۲}%f%I$F# bngVVM]D\xqq!Kp8omPU0SDhDU9h4"lXk rrh{a?y3JGD]bOV9Uz檺#3?.BoGlҶB^tfJRcʪ̇28@GWiImD9 ,-lF}nKH638D8Ggmw|OUڶҺM__lnnNZM,i͒nt[fffptcUg%m.I^}/jg!i(ikU̻2skw E]vGOG}m'шxӒJZo8nn|UO~03wqذ-d?>k#+EU]#|83qXpA$`zX+nRU}~pp~wmJZܬ5 I_ڶIU]q1UuU #HZ5yBMU~ܶ5>;MUMқN yvvVUJ430g\y=^t|17kxWU=;/.qھ]מ;W9N6UWd?+Ͷ%hp8ͧUնn;3Șo}@6N(31Eی>d{a0he̟yffFUuyU߶,杶'uIe۶}IOf4ͭʷcE)"TS]1VI\+ƴL!|1'1?ZU'rtEx= y& OVaf>xг\lo݌= ywA.>Ƃ>}U!{ z*# Wz6W$^E I{znodM=^UQϪj)>|MT,@C I3=7_ B dA! 2 dB! 2@ dB d2@! B dA! 2 dB 2@!B d2@! B dAȌ 2@!B d2@! B dB38l/2Ű}Q!GzшWz}jH:(sB=FT#@OG!g z3ڰf$#Oΰ: zcO0,'l/IR,,,HRJ:o3$% Ȳ}2"aDIȏ>i{ϒԭʭq1a#>$ik#w#iĸ0Fӵv4`0(IlXU ӦiWۣ?Yál} Ua"~>"5V[%iQқTյS/eD|ڮxՐ'1ÒtJ+飯͌cھ/"v{vībeNI%d{9F7߲}f!KxoȓaJzOVխk^`FM<ߝصXkqrh{Aaf{gU]q/G}.j'vz~ܜJtgf>8 Dc^>"mk;Ag%5|03wqX߈'mﯪSZ~[,-lF4e]CU=uo%$)JmjiiiC//777'Imj+%햴73oꪺ\ mlw#5-:m<lwIENDB`hydrogen-1.0.0-rc1/data/img/gray/waveDisplay/mainsamplewavedisplay.png000066400000000000000000000161111366722712400260500ustar00rootroot00000000000000PNG  IHDRnsRGBbKGD pHYs  tIME  40tEXtCommentCreated with GIMPWIDATx4Y][cAA23W1 WMdgDE 5hL6YI5 &#†Q0tgf̈́:?~t3>Oskv۷vpFLv=*-'$B^jpBw1J2]?ܖm !5i-1_<eъ< ݔ,3 DDl<&wx< !gJpYʹj6}p;)uహ_M)>b/-s)as+Jp2R 70jp)( @p  7n @p 7n @p  7n @p 7n @p  7n @p 7n @p  7n @p 7Hqp̤,KR|F܀sbv;3է( )RLTUܝ 8f&pu% ٌ,3 n7GQzv}RԾRnW.Kpcr ]"$dyw_{iU]]lmKk3Xc[_l[mf Z}7M(fX n@C@)ShBBK캭5Kڴbx ٮJKp[,2O>N ._nܺ/s\5.~oHY2 E>Ґl6 iO[rFumI#)mNm+kwOS/UcFYpU5?4I4-#,i[wY[Hy۵}ڪ;w}7rVrMڴ.ەfmqG`x\U?&rcrBEJu@mMNd+SX,dXta.r4vCEQl|^߶?;懨7퇶QmM׶2ac?.23sC }jZFٚP>CVӗ]EwNP/W95uҬ|T(u.m\k^]YkY;mwӺgmV/;h ݯ_X_Dd23KI:DA13xCkdW+h^6n{c{pP f$ n?ofHT3W:tfUh$p3: {?wa3OU?pudcs^33Ss݊X=Np!I]'&;m;ܖO,mX-eUriD"dzࢥ0u p.ek{L&WOE_TIJ[{G߷KaJ3I[2-7T+8yoyQ\ {3 3dh4hd291Rշހ ٤*p,{ulTf[䤵/j{`:NC."oq[)+iuԑc,%Ƹ6ZWm[t7;(t ºd<$~U lioNN[`08mhyu\sb{ 43}6wN_rתmU½"™8*mWRũ.ĝ_*$ݎi";?^ێ"nEgi}mZ6m< (7?XwxWpq[UUSU珪RsSp4ږ?KUhk!o׺KLg[a P_שּׂV#VkmNg˲_Unup[EUU{0|6p"}v15.V`{nefvV g ۖ{4-a~hۮ>m5W/3N. o."_f1O_)"u.eX,d8v.riLt8oׇ#׵uXg}SemGZk?-wv|HUa/- pa4`N35·ٝ~'pl].yN<ZvV~ؾb8u{y]!qS`A3{TUd7NUU"r12pޢwȋ]`k[FϺIm˶l϶}:G[R]w۷~'y/p \V!Ocyw('TAy!ѽZx{EU1;Sp~: ?VտVaOӝ.8SpF: o1޳<\C~v5JiEkqpB3#n_, 3ۃqp0rc7SFS?[,rrrBq`0`p*f];U<E=9nUUW1Y^?0 a᳎`܀KU*u9Jw|>iyVD*v p.R'g4wC׋+D;b$"FFl/ms+R~jaz]}`maADs sGཪP;'t11730eR') `>sn '''|SP.U*c<W!ujKZIQuг.T \_"rTDyoņ6!21}uгHQö e?G"rolVUյ& \~]  Հ+F'׍-1>8!tuҭE^ KEN]vS٬q‚66uX,/qYwԦnx(_44Y#n๋#=sw>9_vTp1drc7-f'5 o !CDG.KTK׮]l6[ FՖmouS+ Uݿ?KBQ+ ׮]{ ȍ1wa1|-*@yct.wXDHYw1ƻ) U?gQg^Yo ~UDWӟmykn[ӽN/=g㱖""n"c:tm@/;TN[機ӽ;5`VT#U{5V({ʁc*չj?^@ߦ:\6~aA얃l/*1S㪳k:lzn6=wH|}O;yvY>|=jDGPuj޶u/l{zkз۬Wt}~l[]8ݥA)p[֟ B.\ꁪ`>T6LsI=;ĜoKqoAi]K7t1<ߎAMz}>PQE^|_{?iymm.1R5u$y纩1:߶4IۨNBu[wvimI#MecDV!5Ex[Z>kloyH{=̞u;tm}Ӷ^mI4QFKmuv} p?R#};åhF~[c<篛 TQ7-ޙ5`m˺3z-˩:HVN<|ס~}z|~"i9>R]!<7D6ձ>]j>w[Scc|uJcm˃Vmh7uu3.CװۺWyj 4oyG4BS8D)suHkuﱶVP;[_:eo/?\_?-ˎGܞ[Jvy[[F5OHd>.6ʲ\eB>w}m';yO})oA\wf˾6Ze 82Kjc9[F;>Ha.S|~4zԧ s8F7MW;zPJz&(eYBNmy4է2 f!3k5._CλMj }{z&3v.i{( &&\~G{ԽMt]NP;}\6o-M5YF~l:)umE[뇳Ψ_ca~Iy5Qxm:n8F:Kƕ nΓjs=&Ni4XߖP4k*]wȲkm|mRIsڪ_cغml۟]iylrp 7n @p 7n @p  7n @p 7n @p  7n @p 7n @p  7n @p 7n \Vn"2on:MU'_ܾlf9JpsMU?naJp&"R f8Lf?m"x/%8LˬTD[g &WOEW,3S"ܫ4ٯPòha&_E0Eɍ;Zf0,ӫ,G>ZŇ(*C4v*-=?%"' œ,3ӧ\l&諪f,˷G&7piU)Ed6zL^PU1_Q0P/維 n1[ccR쏙=jfwCxffwE [ãwo m"  Éʄ(fUҦ&Pin9aa,"`0xOUMRx2xN;@wEQ|PUlfOȢkhRxsw"]1B>X2w>mPD^c[N0_OgEQľMDd4`0H#pc|XDToDmGX5IENDB`hydrogen-1.0.0-rc1/data/img/gray/waveDisplay/targetsamplewavedisplay.png000066400000000000000000000015361366722712400264170ustar00rootroot00000000000000PNG  IHDRFXnsRGBbKGD pHYs  tIME 2+tEXtCommentCreated with GIMPWIDATx!naSGmPt?YDZeiPY`@d\Ȧ9pOgfTUNc+TUd #At0D@@DRLG(de)to!'F@Jh͉ L#a 0F@#a 0F@#a 0F@#a 0hw91 a 0F$e3'F02 0F@#a 0F@#a 0F@#.~OI4sJvJf$Lh SU=%Yhh]UO2xMfW$UudeBU$c\$>%]r}nQOqz'sKr=O #༬7>cd~[$_lIn/ZXlcatHI>&S^$$$oycv4IENDB`hydrogen-1.0.0-rc1/data/img/h2-icon.bmp000066400000000000000000000040131366722712400174460ustar00rootroot00000000000000PNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAT8՚KlWOm7jymxD T`E6lxd芢,P+V5" *T @*4`&@Hb:=,g鄦Yx~{=e@{Cf ~c#Gw>LԇѬMx@P]dCC]YQ?oNT.\ oǖo}K(gX콫}öMmc0NqgfX` poﳗgخMQeǖ``?ߺ<.x}$eor1r# 9q5(F*kV}18*";H Y! aADQycìZ$ PW?y i`ȢK"~[F䩋x鷤i*ZpDEWսXgb`ڕ9$IG1*0:Pf%ěEtmH:ɜɪ %h7v7@^:X ",T D$!M%߱mH7N\VTZ;8xOs >m4bW׻U<KG> 3#'vdX |8Ny0Ci/o6ᥟ?gWs<<ؼK큕,%Ǚޢ"m=>rG7Y !^:xAhWh߀ciLv37nZx&TkGc(9MXdjN[ 3;7x>ٔײmڎ&Wr7$b㵿3"ӓdT0~ |e'»>v NGo7 G,t~ʒ!J7nV9sa&SUV,EyE.M^xkFK%&.Nq$ ~o^ǒ ܚaTI 7 # 4u{4T`hc5*a295sWIP5UvDC.UArȧ?9LM߰PoǶ2;[9OWvmdW8}υ|g/MNM4ͪn*H"̺GLIhd=R#Y87~ JPiYtu_ܺN3b(L3^j)W_j-v68xTY2t}K2urﰛZ͹i Y#c#TV@_2ĭj PBP#-&T0k{׿֬hm,2Fiֹ`SGx]ԻG?3sdTgfUi6>j:?ϝ9X,3;n66ܰ}J d~`eXR^1.>Xo6|Y=slq*N96n }mC>uxdؚhܰyD"1KDN̩Ot1q6ݤRk]yĭ v.+:MnqJhmxˮDtwNG uDa}?h#ler?f *hm~WPX{z=_9q? 1Bt 48 \>)t?{ GFN3}>??Tǿ?ؓO2Quՙ䔌M[w<2< Bz;w=:h``[Zv;bX"M?xCL&'Ĥ{Dcq yMgN4*J"%iY>s#  #q`i/NwԈvmh5ěK&W/En~c⨥ڼuSvCrL/R9l$"]Dr:'?ktᬷ ]Dty޷t3PQJj~yXSc.l%[Z*3B!4ҲX,HDIJnX::b5&;kCk6 `W)d ~{<[PKÙ釔C͍şݏ#"+$곞`%j V8QuśHTQ=5=SQ >wk(K"#"x 3+S`B!\{?8uJ7Q{[#q^LD6=Qcf}}>?0jZ g|slo_ʡu̟/[>)I"428w#V%"DHDE%"CB|Kca=W M4$䐶lH$&R$ J/!bZiY}?*q~LpK>P${ "5+r JG B"koi 3ņX8kW'3+9D~/?Pҁ.ޭ9VO cQ*3sͺ16myӖܼٲ/RWirE[d$cmCe[oFb|\HDpl6myͣ#V6voٵK"8?7C)"=˗h"DXFxa0*?_4*uHfZ!"+eD5[hcu8CC|%"d,嫙rsa .jG&\p9V)>YW  #|j,_km»h2sMAl6뚚w]ħ 9\0gŸu] 23`.Ox^.qS`~s"pi"՜g~$KG`o"WGħ 1x \':S`b y ~W1"dw8jHκS`jlj50 Tbtdټm29 Kܖw/ԮpDrkXQJ>}j 4pe/,,,~7m\{Emo]v{}N]Sh /ᭀyG/.*&px=m|ZP~^NsKu] uz鈏KJLGV,}BdBz 5՗*֔![,]vmjD;;5՗ݸٲęE,}7n"Vr\ =qs 70qfsߠﮩ(OMIC/^Gs"od~]-;_V[wn}IIN߼vp_["zx;';{??=^T@"$''ƑQ!++ii)UȓL& |b1q yĹn0or,4ܾmKA~nFz57.5u'?;;}np=Uk)kM7x<+xv>C?<0mC?˿2P&};O646 4\ɄFZW:<֨K<-ܹ*ϧѨW xZ YYbuAy]>#|h%|k*&"qef~o۶x;=-eO)mOS=BDSg9s\Z*-5|EGV*O?o~? pU]Ȋ%NR޸}77 q;5? Q|!E@_)%I7nZT*XW]]P\\ƹ}/??OavؖyKOskctZ"#E:)-z>zg&$_o߶p>ė?;oL?jkK 5Z r#*H$tKYd|ּ> *2XT*H&egg̪;j&h+yaGDlґgxx$6VDDii)S'Æ7zҥF~L.m F`0 cS+#~45cur:.*"8;UXYKmEI |,5;uoc1=y{sј35b{Oo9..v'%%fg=oѷx`]X~3c>X`1M,HT$B "0en5tZg1bvLKRnٺW]YC-er*eV+^Cl44dx[lٴw.joO:f떍ٯw߼=ϭܴuZ>DzVBͧO`tåa 5%޴ٲdښZ^P(2rr'K0Rf=,IRkܥ0Llllaa Fer:}o{o}bel^_6>oL<  @h0@ 4kLXܸ{v%z;l^#8y9p5(/z4ml662jjNE l^#2,{ u% ߲w5| [A ^B!,}f D{h8n9r㢈Œ~2F<J"EYpwCMD422t5B玞im}ݷ%>ZhSBvhxtX#xP5e邸XU$bSWDXz:K"4_A7BQN*Jr9hb?Ҳ rs'55|SaaX,A^#*''x_ņ,gKq?X[{ %%.\z:K&4s?8. D+3karr@ p:^DllBjj GN cc"<zk7#qB8?}wߊrEuRhу_~jv2P А%BHg0hpln#"f82nL }MٹH-"%-8"b8c (XLYQ` Ev;RyJJqCC3#H]d29Y 5K^UzJzLoKKK}/,qT*nAA bCyXB!vTl@007}- :@D GV@LL\JJ(6ζO$/aCN[P\o~<1e1!<,pq54~`LNdaw =))YqqbeYZ[_!tllfIOMO8ntԊ"mYã!c*"{-a.'~A(3othuVbhHD==~/11hL}}]K-~?>>Iq9͇BQJJfFF^[[XG%Ft} Ŭp}.~fTUթ%>3? CZ/>\;}}UU.^ qϋkhi/ByP^(/WRktN2FwU!"d@TleW>[E^/,*@4K7m, '#q~ +_~.iS+ O%b|])3 5bw7iafO}M_Ѯ¿r$ i%w`=l]Ŧzp\V(cqqEEEee⤕ٹ ByP^ V_z}%a2gF>( !,~ K_Ģ?(`@\ei?r>z/:+=YmAY.چSMeDt-2qv,?Y2tƲ$Lz6diͣwѡ#g:zKA{r|p}vfZMsyד$YxZ@h8ק&9v錉qpF10.7. 26vth"{kr5t"4CÔ":sE*ݓ:~W3=p-tA9;3yU~N8nx!IlXSiחQWwNJ ^0aͪcUw_=8RbE|7h5t"jl8r<<]͇M-m=F+44w>WGS)+֨CG_>aBj*\'2Chgz Y))FC~nz}S:J9 L37e*ZID=֋…e(>/wD.T!G\CCcR|oȐud~;H*Äo۝j">Vkj '+=i}Ez;(W$bܬ^c""kxl>ːe DIJ@R*de=Gڐk/6/.KW*d')! ,Xl(޼@^€$?ypˉhuAnftgVCê&cR|FZX,bYLe=_䳳5鴪f ;|~ 1B{gT"^:⣧{(iu: cij5Zf"(  #9YaKǗ/ uuW b2f0Ds[Z2ګ~I٪'?kw^(/ 3EVFdH/ENtn .\NdązO "+VQScc-}fO/ aBb `Ea}⩢2DLSyeB:a6k9nz!]8~@f}M_Ѯ¿ξkBgߜuuB&p IDATBp8S+***++'|#.ByEyP^(kF]0P0p G~H վ G]\=4 buج̔!?7oWd[b֔c4bDck TȈhmyLR94ǨVk5 p".=zlU;;Ǩʊ9Pnw?ey R vϔF'{7I@b~ڸi}B7^/qbOKOE,+cGE߷Y0&  YG[LR!ؾB!V4W׵oX*dVK5CD$ ǶnuL*ih67v%ҨW2 SY:4|y?j|Mi0U֑WYiO:xM!Jh_5x- +Vff bhxl>ːe DIJ@a8CDi ,=5qT[*JrSrSz9EO0D$IEDBåQc4y)y]yH$t8zR"ƖTY)IvVdN Vf&NxЮ;yP^(/ו-jNQ-64\"n^Q+ht>D5vy􉧊1owkh9l2Æ}<= _3K^S᦯hW_g_i5!ӳozغMR{USP8yTTTTVV.NZiiiP^(/ sQ۷߲3"Sn~KDz&0HbW) .ZJ.S'3Øj̻&/Ф̺|we$kj@Tx6GKm5ju^V4"4 c'7 "ˈNV!"Q'&7YN'BC(њ ;ܓO3 7} CCcR%jB$ݬ:CD=jqq1j kVe%z<셚p;/.ШN瓣N_FVL_3>V[*C! 5vx<>"sZ"j6i4*ŘQ},zy' zEq٦@nzaBÂ8rejy9Y)bБJ[{JNڸn{FD9Y^odUVDS∨ta6>É驆cH$8{%BVzBOU,ʊҬgiőz w W&8ɷ6Wkh;_՘yC>F3b)FܭfܹL&!"c5枡N ?./ΊkW0uXMj*LV9kZ]B "^~22Z jOQq& NvCa=xXV,ؕxC1", cR"⃳1[RB6u4F!N="0xq+8ʔJ˸bt hCM ?Jƚ ;Ng ùƵ bcUMSa^Ʀ%LnNB!jAw07+9'a8'T*ev{h;չ2lMO5Rʈ(e=rYiO:xM!Jh_5x-Hю#**䚌M_P(3ݨT2Ғ渕0sU~\.3­V[ߞQ+nimz}j<>Vֻ'f< cb\&MLTQѸ2Ud$ٝvY͓:)r"Z]h;CV.٫:e}N4h傦Ihp+d?{[:eƼ7kiuϭ눨?2kfx MMyM_Ѯ¿ξp0dz)=o[zGXz|lu勓ڵ{;/ By^|zor~Q˲NbLr2 ,,ĭa"/sG_2Y.dJ#ۃS`EŅzO "+VQScc-}fO/ aBb  Zp qEy􉧊1-ʳn_Y[Ww^*tϻn) cƏ\:;;yP^(/ʋI.({(;Yy{(3ϽH,Zƃ 45.s/3Ǘ0XQw ˻ ̛L&+ B DC^ҭKRe`tNemC)Բ\"Pz8;XpP&nX$IXfsU5ٜMݽ+B@{rTag1A4w=MB7YyXxZXfs vS[7G11nJ,qWN"O dl̫y2^KQ'->qODD'=n~f5{aJr9_WrR_W&ʋ I8ݘ~X%%m\[RE"wY"QdcN훇d%礪Ur3 \ie3whEwܶaJnwL<͘Q)lNSG_Op`$}fAsgwl $>tyfeމ 2\`\DZ CQm^_jL{,cƾYKy82#sҲ2"c[fttYlMY9kl0#'.;*a"8ntr'i)%YYȘ( =CDW\FDn7V1._4yXoVgP~ q!Б;ojTy9y9Dq ug+/߰29ąp} .E Ϯ5>+ rSY` )8?30.77^&N7g#`14{h'n/qa{n&kP6`u9X߾;3 Zͼl+XxZE0ZCË|\"ʰdlp^FDdw:Z =5p:~aI64<~? 66{de$c4 1ᱚKm==.T7&'ĨO-]sڮXSyZs4{(+=(s`pzJ~Rp%0n O׏9VNeމo&b?84X2r{ą]7n8͇;9vRX(ѫPb?{xŚlX]k1F0L^CDHVP1cEVgP~ K󉨦:"r8%JrCúꦒUk>E">Fku邼T"j6u\j'"2gttƝ.G&Rȥ1jP@DVǬ.!oY/?ˀZ;w|BCJNDCQuTJ0eFDKDvz' +UQ!Ȩstt䊉G &hb>kNW |h8GM &n8{l&\ YƃnIəE is|&ݩQ+cc-d&Xd]EV*e:LժaZJL*c'B!ۊYiO:xM!Jh_5x-TK{quaWWV׵lXVRTʈ(+#jMWyzEYi ͟5Wf%eR"J1Qi(]nŴqeg$;\G^* RN;ɠr9.L4؝Z9~W:d{{aZFmu&_Tf$"إ GRLs2ƤXhhm:]qK۝G &N4h傦Ihp-`!^#"]mSf{FZSwB3LѬT+UWL5_~qW<8wjIڽsH0iP^(/׵KG]hR\Qt^C@! `![ D+P)4^d(Lv Qa![ .\N)ązO "+0XPXaK K@|" `Zʏ>TQQX"&PʬX/]M ñHO\:;;yP^(/ʋI.4\s/"0x BÐW˹?}(8xwmDZ P `:Ln3#G;`ZMF9TtX`:,|7EDm֧}7g{Q ©mh0ZVKDꛛB/guQj[ Ţ򒼬F%06rt|}/|u&":SksܵUu-UVGo^MDU햁W9L?ܓ#$?Wo߇Vfd6 }5=;+#)^V/a8~J(nܸ~Ni!-Zᮨ0- B7CCL1:e:z<,-^=0wd,Q #th"{kr5t.`hz_Cf-rBZH Ps{).7&7>ikhhm3"ZL=#6a26޴$/=5e}|"&)1-ed$%;trR6/^SV)F~aH [q]av-3 IDATfSqDd;0/{N~N~N Yd" ]&YID?bwikZMcC*S9h5xJUVtZ(ʹm*2dW~w>oqS11ki!-ZXgDݧK4f1:L4f ?4醵v{{ɃC[+ri[gظ1)>3=pYLjݲIQuu[~\RC;SaVSD"JNQwZJVefp&H%P(Tx!^SB@Qj:ryQʄ\ρ@hXR .=P'}}0 ÐﯭJ$)) ~H i-~yV4BqrY^KD3/1 p J[Lf"Dd^~4"k4:$߲1jc6{zj56w5k5[oZ)S F+URB|OF^ADDB0k3"tGZHk%@"-iEGbktJZuMRND1!(ܥ5W6v9_ODJ֭.X xWc6\&!qƝM+w !KPỡ,c]6B* /wD.ÿIoܴ>!p^8XC^DZH i!-j4x}Nf^~Vt{X .marS 1vg}c;3jַw tLDLNQ"ַַwwZ{c>/+(C#2;Hp6,˾qϑdCLFV<>{MGclxNZ{ cbt)ښ:"z{i!-"aHk>V9_b44オauZ1)WYR %ŅY !L7Qm_z;FX,HNUQTȼ>ZkQ.Ka^Z~n\.]AWFEqAVJi<:ȑB.'_K|3/](;wEx#-VXikry'%yY)u_Km^ 3#5GlM]|\_5NM6!MVM^?/;%=56hn]&$$&ַ[xpNi8&IhpBٰqݢ/BZH i!--ཆ?{"^P:eƼ7k9n8r)\45啟 7}E :JS鹦/λꁇy`qV]W8i}]w.ByP^(/ŗ^B%Bhn>m -ཆ/Etn հDBH\!`[M'~r.iSKBP~􉧊1$Pf=l]Ŧz=jP(%****++'w^(/ }Ҩ 2 " ^0rO}*+J4^R\5p"TN&[o!{(#7!~ 0!LXg(/AܱNo鳆,s":WkQY` )8?30.77^&N7g}7BEDž=﹙8voDB6""\gY{r'"3Øj̻&oS ߕQ{hQ[ /6}wKsoll&{(_#y)|h(Q潏2 y0 2(^FDdw:Z =5p:DEm5<~? 66{de$c4 1ᱚKm==.T7&'ĨO-]sfLa 1rJxɔu4yAY gԵ>z&"*+ ^gD0gz}D|zöAhzZtZL!5@Dͦ 5Q9Z]¡>0 V<( ]n5|Ur"J)؈& Xq aSoj1XmwYm2N~De yDVZ.۔BZr[ _VëfԨ12Q^!Lt8n\:KrrGUJ*GAVsl'rR>x- z-q Zn,+)V*eDLDe;=EV/E}ՖW&@`X;B@'5$URf2SL75 ^AR15 Yd8` m!oeK^dk}{\-~\ߵ=}=,Q833W\4)tU%5FÊml~CmeiTjb2EdKmMEaRZLV5Jj [:e"2|yTkW\ȨSĥ̌Ң܂<{K{ߖMt,vnÑby٬6u"(f T'x(c:mw\4jSȌSX) ˜SenjM{'?lŗ~< Gmݶ99J"H/ҋ"%ՅYEݭ1mk.n3z ugasq=ET\״Zz@Xjook݃Caʏ{}|B IPZ2uEgSrH766&\eeew]Ez^T]hʚyABè~)H+jfA]_V'ZqhPxPnb6~ *Я!&ijrr>w;?cpoɼ8M/XYFDtttEWW*[UK  "~ˇ.\ ~sG -g/*Kv{nl8w$" +ky4;=xre[(_\ӿ-/.٬];U%D'xpo_yQb@TjXV^^Os:mw\4jSȌSX) ˜SenjM{'?lŗ~< Gmݶ99J"Tt]"^<_Wڵ˾ t0&⾙d8BSCCHMąHeamͪnÝJx'ox]6Wu3 9u˕%[6՜8|yV*˱'P2u2b,9hw @JIja 7g},".w㺪5SC斮UݰyF#o}$=;z#6chX\a߉%RCX< F\,RCKQD.]QyixDDiaʕ1"2M u:](P:/y~Ӛ2"/:}k¨~W;A\ec;V9'vZE$aSN{p66,{kJ򳕙78}@Kӷ۸l6Hey4tBQ"۩<h-5NK;9sXY h6tk+ˊEd֮/⺰mv5ӆ̋f٬A5S:q,5DDfi bV+:?Df J\X*s/POhz85?3=ǞEg}/#&h8rl9uW]Ez^x'/.4̲d/(:nP4Xj#H'ʀTw 9Ba&^*ij԰"*.|kZ-q,5Է|P0GVWPX}`g =>~}]Ɗ $Z(}m-:dr\y$sԻ.ҋ"H/K f.4c eSϼy aqs?|{5v^/ ZГ p-84}`g e&f`B<[(s7SLcSkkgKk*V֭-]UTqP8+44۶+[Yh2 5=w1 o?;q/|9qK"r%e};Hñ熆3svjDaqOfvtVRD}EyVG 5ZPaYymf(s,d4w۬Y+K VcCǙ>c7E"8 ""Nf>2<\n7!*Ro`2/ Cضq՟ؾ{  s"xmeI~vqxiMMٺ5V}|#_2g(/+ͱ r)=7[F:H)I-542EDFO4n<ȶv%apʺ 9zwtg>skQAݖ52:{dGuEkY}0?<1G'L!՟RCk2&Cd81\}kM"1dKb6EdǶ;li2E6|eLD|~h4CQ,}Flhsv?ƴL N_hZ瀬0j#jI-5Z]vuũ֮@0$"VpJd35+2#".'l 6kViI|xd0 =q}d(,+#cGDT[k׮^e6AŜk_[Sv*c5+ a1"0v)uɓ~}]Ɗ jE<4K.2m6C>{DϽon>֒.:L&˕G19*++M"H/ҋ"`BŅ×bO=>C0UCp8>=~ʳ?yIu9˒:]bD 3384}`K~ `BRPN>pщ k7ƶsM"r035+ֈіjUukueqC9#CyR5KՌ?tXZ;{poNB"4qOfvtVRD}EyVQjXRCaޑm>?'۶a]ᲕoDb?qDDnf}/ex2nBCT*xÆlrۃNKjQY^R:;۪Ѧ3gEdm8;x񍃇╷4C_S׽G×ǔX,O*GeScTWWX& pܥ͝R&Wt0&⾙d8BSCCdkXDDN6w EȘ2fm7o Ý"?NEj4\mt:^/_e򞾡̌\_HxuUM>t@^bUdx&e;aX-uRZjh4Ddl9-WSg54k4۳q]Uƚqc2r|Ӓe*"2t~8GbH8IDATYnvե"BWO߱5?nF\dXãKWGFRCc6-YfeEK#"e6*<7x Qϵ;t:D&wH$3Vɘ)"u5u5Wh675ejE&^8tBS:dQ w 03jRΞ78;( ;V9a=)") ^(,53BbV+"CŚeŤ5 z.^шF:jh\W;)Vfj*Kx:< 0BHjᏛJ/TO9oY7"r;6m\We6w ESE۲DD זsMXjW2 yvu*_Ǚj*K&C dٖzCr@ j+Kn2V0("[jk* nR<9sXY (捫++J+Kؘy2kn VSm{58]Qjuz F<7us[wIad4x`(iA+(,>ųG_.cEBy->sLwd2\I19*++MZ饏CI Ez%70-5O=>CO5QSǽS Vy^2fbUv`0 s8(DDž߽{-y%@m:xB w.\PJBqxy7/"9=7WD~o<4M/XYFDtttEWW*[SŭԨElWۏ~)2._;vg 5 \ .NkgM4 |6緪Dd'xpo_yQbN+5|gȟMCCEO߹1gaAn~nr/^ysd)"/"I#aq]6UDyyh2nBC Έ $94 ]-5O)넄ݝ+V|4ݖ_}2Yi?}SUyk8_kW[-&?;pc8 l6 : ]|{o7}$"7-g8 o&Hh8Y.#~ nj4\ —Gݠ~Ӛ5e@܅͛jZfy֎ނ}F1 \j5Jz݇GZDtYш ?;lx'J:{'Jdeq-#Vbvdh/Q__q ?}Mʌ{ NTU"rԙml-j 9zoa]7mYWF1NoPnݼ:?w]"RR[Y^?8ܢ,ojB x= sưG'L!)E?}|)Y^bef⾁ѱi1l[غ.Вe8UmYzD4۶-5pPCP5a*91uyӚ2JoKYaFBC+ij@*PV(\㶭;16kX-i\,DJ)^xi\nڶhXqxƫجj4Ímn[-Wk44b6 |\pW~_^x BC4 Ce_WԅTK_]"G'.KR𚊕ukkDhKGGWt5qժ5U:TN+|O_Afd7o\]Y^jfi1WNPkg։ ,".l֎ߪ]0y}EyVCP^;44Vv9smU]j5P|_jJ8 ""Nf>w5MMhCp5;4 v~ǝlD=ȱev{E0wǶ Yf^g]6VVg#-uoLk*?Ds@V qP{h}2vh'wrC1l2wy,no鹛G&C>ǒ>*m@hI;WÑcI;u^Ez^{'y|ϿM*BC$(.ҋ"H/KA2ʘtC2@hDE]Ez^Ez)PBZJŋU~=>p9FCArw e$ (.ҋ"H/KA2ʘ-! u]Ez^饠B e̊ e@B 4D"Q"H/ҋ"T(SYQ H7i^LH_)3y. s?Rh(qDhJΘ( Gmݶ99W;wݕs%ÏXk;::|p2. BY]" eWz^ojҖq?'l8-vյnjxϵaԢ{r0/GĽ09#C"oRrꍆBW/+Q -r)/ňU̹gODICQ.TP|^C2/Nk#g>q"˕ATj^w  At E"anBAϫL]w  燛*vf3s?h w TrѮooٖ#!5Rɖm>\^" w|e;'HoCoYvѼA8\V"rϙIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/Bridge3_3a_hh.png000066400000000000000000000762311366722712400252100ustar00rootroot00000000000000PNG  IHDR^ pHYsutIME E IDATxy|[՝7վKmٖݎ8JH$ei e-PJ0NW~ә_iCg50v:Sx P(&/"ے^Iڊ,[8e/ͽG{{eqOqQR!81 9f"BXe9huQqQѤP^Q=EԚ:aBR\TDDh07 ~1gskqQHabwz'ta %%2UL`fą1iR!B!Dqt7~w3H,B)}GoCw~~7LV&aנypQ6QRZ1:fG9+kcCn jš8uib0kZLyԪœWG4+;2D!5/ bwqAFp_cu hu!O ,J24d0VKq?x?-m Jks~}:ݸʪmC?}~L_=)HS5M3br?נ\}$^dԷE:)âsn'lw>VkJ,l?KX[֋V=7."h4<ϟ=LVT\[/4ՙ:w9RiL,K*&$&Og/˲gϞ+-Y+m'<$m#c֤d{%),_"rgO22xP(47wwݸHEcj;*\`FeGs'АPX?wݴ鏿uAQYp2{o:<4p89ud]B8-G>eOOܲF~BQks]SC7hsǍi@"m!\_J*7Ύ|/~&u\ң[5R^W4T^B9ud-w >sWpvQ YϜ:?Ö!I)iL6'?{abf[`v۸Za{fVD"uK:kϙ:'r&a{<e̟ĸU.WTb+*.<gGB%,̉1"]arghIelC}`<܉<]w/텅}fFD~ fyάC6Μt|oL&/):;/qV:VoĺM[P(w9|{%(AM[g slמDnks|}P %4?X/㟾1a6msf|Wv9x)_ >Wn˿Kχࡿn/+UM? >c՜MMڶs/c``pӡGpH,va%1))QCH4dr"JNI}_6Q=^\V~opldcB$"Xc4G9HE0ۯG =λ}HGoX׉"^C|adrŃP(lm핟ovcJoqo'/\ a]_:oůGp>y?$?z;>ec2Ĵ: kʳ/(_}a >Dt''}~X^&`2HdC#%"/܄1tIlѺfm!g S3h|z# }^.rRtQ 1\.&d(Eigמ^|+/só"[`""0=,EIƍ[vs'$R7ӽ_z|:BDrM1vyo;;|oCw?|ǝ+PQZzqyZS]bnb[Qz0B!5ӲX,HDIJX11n5f{:΅C Po)d  x^GP[#هm- '&" 9NJԒM'K'"x |j~?zaJso($^}yj~2Gnپ@eڛu[7jz zʳKlxh_Xɡu,̟?;>3i~q"1mdx>$'ƭ>KDRJM&x3\GܛhzI!}o~SHL~痤RIRX1CԼ3rn?qLtN*6gBX,Ljhޢ+()(* %` 8Z[`p!\o|B$I'f_!SI;x7<OJ6zo(drYr* h4ڸk]> >N|k`Kjև\ŋiQW>RnaU>ddb`}z仜o U >{Z۾\+Vk07YlySjv w9;4pi"X _Pk0 2'5V;'" ZyӃ$`NMD_ڽhW[X!&+F@|kZ )!_?F!2r*9.B4R!XZZ[1y `1w@A@$'?}R @42 @O_ %\0Ň"K }o Wm++olPIDz_QWp Gǎ^&~[lLN2ыz7s&޿wmޒ%.>:9TUz.&, dkkn$$bˊ58`zG*27/;.NbY8;wf߻o70(k>yP$99y톆:v}e{׶W~{k-C9ٙE:9VO8竝NWfF[E VRS +.,*+,E )I M(O(S(>RՆ ˊn_/@OXV8soh:ڀ=;DBZ.pmBp`ТhtZ톪.Fc'Ov^W?e&1!~?266Өu_i4F _yeJ/cFTQiIW!1A*LN:j_om6{LINNA~? SgB6ՐH$)IELbqFFZuu d%ɂX GB!Gpl/*.0ҀX EDO|dؽk۾wٽ0?+3LLe"zq!Fs1EGNĄӟ7aέRߞy.ʮ'?K2${'?/d@xU5j 18k4e(WKs[NNX|CiP_Wψ(11P$ZcDDBDNMJ2޵TՎOLW|0 USW85oZ~LĄ[/\ '$~dW8dgg.p4:j꭪*GQpJ=;^T\\2YF@R!/k2mJꚛKKKhhon"5-CSP޽OoOD(-,4|ٟ9{a}e߻#MO8cX[U(wnڣ>{.]YiK*r{z޿wWt Mk|^҈l.@+r=. (abhmFBq܅Z$IEyIZjJA~nk[Gw$'0wt]ZjʏNg1d]=|mMͭ!DRYQJD6"/oݼ!^ySU̗oț0e0uUTtZg qbL]KRع_t\߼ Cd^*e;;;Kt㞝Dt_=in%45xmm9''5ܲy@ Ho,-)"񉣟|ͷN竏9rq!EA3ֆb=4\H\HD޹(""ą0@BŽ-ֹd]аruu^MX*o}p氕7yF"zgmݵ-QtfVYp܌^×~o}>4 AVVFDzFǍƴ;CB8^^k޾>'ɠ?~+._)|{9IƟgH[oAumhk% aNNJz헼^56^ "O-XA!JFD461UuIԿ[DLFfzi:\`E_yCc/}W-0P([RinW[[#QIɆ MO>bKyIOϩV\\)KP׈J PaK38.gkh.[;D8.#E~S9-055K \&o`">>)==l1Tqa||RՓ7Vsoq' 8cY?p7^`,g;DrDt,44D4:j F"4;9)NrrL&w8&S3.@_S.Z!vY"@9!*rCyXAa`G({<.TqМi$)9kL&'"uqfq˷ 8<3z}CBV3YsddX8N*i9!<А[y zU*MBBrzz@ H2Be0ѡ:0͵{sOOSV/Rfm-LY(-]7sH^ w^C3 l %OKIHH%,˪ڦ6ۘ>qĄUx-ys&&iUDt;*#n]oG(;otlmbhHD݁?99h[GF,@ 11Eq\쬬f[G%Qfun~?}wD!sSft*>Ŗ y96Nr2T7>\Ah89jT7,Cc~˄OXl].-6cηgl\FD}C.'%9>t+Ж rRGx^U|h#z;Xeg٢ը 2 2 DtLtv'hn9sf(ը#GO\~aRQZ*\'2\@h8h}w% 9iiFCa~fSkeȺ J9 O37c*ZID]^և¥k( nuD.6!@BCCcJud~;H*a"w9.J5u)CcL\UIJd|kR qB~NڇτO^cLԢb2kxm7A˨e DIJ`V*dU=Gٹ7\2m\ZTTȜnoJR|<dbݱt@o`zJrR.橶‘B.'E7 iim /C-O^lTx. t3y7+%QV֬'N E­[7( q!k64ܿgsfznj0LBΘT!0KsaBd,Q0#rj"%z)tYG~J$%P |BhRƦN>J$ǿr'U6t61$'lXRE"nr{X"z[Rg1AUrR *9k;X< % T(xYDCs>{p5ܷ>lGVYeo.b} 44p-]w[GD^}o/| FqK>h89jT7,Cc~˄2 U*\UoZ{'H9]~@Pe|WIqVwf0/}Ce˶v qYFB~dmc˥no`a4cH(<{L݃| kH*2gja"b5 eW_ЊB=ǚk8q'hz^OW^ۿ-U󇆇ٿgV*,$'.5vTk{e^˯4utRsSMgQ%Sy{-I8Fi;eu R N'GI`b~ںmsRW|lj7#3%/ąR~̛˜80822:>jh7}"Jŗ#Tnb*\ZSV^e㺰w9nR944; i"q**]]!tZNqBIhp+M[nB!V VD2TJ,#O~Vd LgSAVߝz̖%R'HD~НuMYHaHMF|:#?ӷ?8{|ǪpxW|*';|w^/ uedbZœDT~G WTiJ"9&,a}z=uy5:a-cM]G"ą3bò^TiyDbQѷ"N?QkvECѸ B@ 9Y_s2rt֖SǏX́!?¤4@lٰeoq(G{B,\vg^[xb_m7ξNabHx"-_Ѯ"Οh5a-MRgMSP8TUUUWW/O^===P_/ 1tȻ3Ӳ"O?H,Z\pǹݮ~_">9\s O$,KO3&raNexS '˘j:%?إ̺G^JIԨ(=P{J+GYKxFX_QeFgeDDS(LM˅ qDa^L"-_И}sZk:sѣFD5m䄄xJƆ-{=.W% #wF\V]RSZ\msYx:ׅ[ˣPȴEwgI1v-Jޏq}L*ii72 eřa TJL] ('O^js>|&|c$XosOmh(`DiT*dY) |{8{]a\.3$"%khJJӨܸqbe}~J}s19^.&'UvfL*ǩhUJrR.r9/N68\NZ9~+xpx64d-Zek7oXw5ddcrBmCM%s&zß^5LMI5|]R)c}vSŒD\&9U}N4BIhp+ȅ2.uƊEq6 ]_oyUי̓R+U Önm^}?WqS{ܿ B}P_~Js=7r(cg>6eEJg(<=`UX[D>'Ͼd x(FX^؃S`MŅ~W (QkKөG,@O aRr VpKqEy'JJ*1#g^I*,m) s揬^222zzzVyP_/Kc.(G(yS}#}Q$k.n/~򃧾a5K VX4Ln4ąn?%K1y )5Qݥ*8fSMDt32qn0- -AL&ݹ"#-E&>l7k[]eoZ;,VfSwoR DzIZ|\úG^JIԨ(=5n l.kj2uq*=dbtT *2A|zO/e45cۢDH~Q_JDtas-o^& M-|,'HMN"mNM1$&lvգc6"JINغDDB9WD}QåTcN楫Ur7wAtŢo0Z%w8fLN֨ C6=?8|cj>;àR9OTy]Ajj\5mzoE!X$7~3h89jT7,Cc~˄WYVn2rV}k "Bt;Aa^FNQ$~rb]%Yݽ}+0/}Ce˶v qYFB~dmb&A!"&wfX_q\\?JD D4429BBbRh#z;X `mٿgV*,$'.5vTk{e^˯4ubӽcKYJR|n[{]l^R. KPg[ qZfcƭisQk$"S`cK/Ðd%eaNVG[z TH'l.6B"GoddW~^B.f4g6vYZ'eH y11!nCe>N#Me!9+ 7VW9CAҌ bȘoR" v" oLBDS;8.4:T*D?8|Z] $"7G >RtSGFFG&ADRaps{vV)Қ¼-ׅ%ft+Ρ b">!LlL7ڈ*RZaQ"ҪJ].W!jA+?8+7>x춊>yM!_IkZ|.(4mvǠe˲Ɇx"bY_0!dB;{Á@ +ݐG(m`h\$e4t jtiu: ME~|8LZFL^`-c~ӗi^gXm3qNh΀8_|E:`Bs-mҫ>tj6n\WyP_/^xܵCI)@iYfXH,BA@ǍB%K1l@Xv~r]@XSD-M erj"%z)tuaI64x]kMOMS_DB}:6EDf꫿EDnc,MOnL&iqjӭKFvnuYB#^~22z VFw O|BCJNDcSQuTJ0eND^GD7/ +UQ!$SHOM8:^жG] n8txg#\ Y'm)%I=]YE |&åQ+d&x_ 㮢(2V^jU0#-Q&XҌS}M5>yM!_IkZ|b> B%ʮ*4kl߹$WQNV*54Kr3?"vחeR"J3&Qij]Ŵsf%u8ݡG^JrR.頜r9/N68\NZ9~ (>W:jYxaFVѤ}욄M&?PRa$"Rsg荆V)flyFcJ>9ax|3f&?7ݐ7p5t1vGCSgGW19!!ApDe%qCSgCSWW`Wo`xj9YFXd9G5jenp|X}LMTC\FV~ܻ}l_1[i1QS^ø8]j|kF^ y!/䅼p^óҌ8C7wxN6$>R_ؾ8G1DٙF"jh2[sE[{* ҕ W z:0k).(O˥ kը*-IKqz9RD(?;p9kxK%;;k a䅼B^ u^C?,+NJ0lB]j%EY)D46nojj; zm1!Z'.ԶjjiIGIg[Ԝ M]28#-)9)k%,ģDū}tZNq4}LZFL^ʖ|B^ y!5n 5d~ӗ)噯3V,}o8r)R45_|E:`Bs-ҫ>t|$Οٸryz_}B}P_/s?{%B+ (!Ķ%|2BCض | yx. SRX Y)װ[^ODݽ6$MPF r0+#Yx]kMOMS1u"3#y]a&q(ǐf 6SzӹmhDdu nh_VUY>+ .>r]{ *9MNJ)ۉ tYq som7xmYm2&.~hDkzEVZ=^B}Z?'yp_Pj݇e|663!pf=eR5f3[.Ejv&Ä-Hj̎20aL8|Iiݲ%uWjRn~گ߫}R×ZjkƝnŜm~qYZXzsis$7nјvn |4l⨭,{g.K򳕉w>y6R5<44 2`"~4huVxPS7eZ(Oot9S]ej2\.WrnWYYYooo"^ċx/70-5?~%}kH ^=gO1@ZQc5 zP. =nd0_g e&f`R<[('{ldo`"ƾKyq[Z: ^Wn}hno&ZS\P8Ν O|9xd7v|vee΃*"GZ.\y+ц C,"Ov ^nGKgIPD/._l=߭]`Q8(jpkF *5,+ eowَ1gIQ}{n3d" +Vc; ~!0J-""Nd # snP*Zں; WWed;zDdMlV{&? ":*KlUaZ٨+OOLL׸]Rb8 G0<d~q,5\0Wz}"iCխ;xM-]95k,Y?׮./m܏dp'{ZMMUiyYNSs~5 rVhf\ZVβ02b,9hw @JYR/}Kxo`h͖ "rDsWy1URm\6V]Y*"͝'N9_ͻ{;+L\];68bVoʘ%##SjE ?`|'԰|jwd+c("mW]xM|ژɘ)"#"2:Un}ۖݢO(z|> E_-j EYz|}iMZPHDȥYeԆ} wVe{0jT9m25ju._k6l,Z͑-[MZ+Kwl%qT[Y[ѝהg+5>yMqz-ϳ7j<{7oZ_i2~5+?7_{GDuoXyCd(țVjDd2T[YZt;FV[SQtCRFPj8M`púPHFF϶v)Nn32+5nmזVm~bM-۶mv5 pjZl6fL oxRCO~L':mƢ7\kʟpNdƄ)dWejj׹WFM^|E_O<[wlM{xS︈[#EpAy8ty X!9ʤg ~yNRæS":/ZSm͟|xhh?d4Dh K9NÜ )ByߓOmX*Ch<ʾ _SөLwїdr\ɹ%^eeew\ċx/E@R8Pz:!5zx>?iEdYT2ۮ =nd09|l\n+!0 kJ +e ${E-.ș3u׈ȉj5u8uT[(ϝߚmo=Gq||o2[)";tp^Z:{x_N"4qfwnRD|}EyV%Tcvw˦[os?qDDnf}DxrI _HI-5J.Jj}>yMeyɖMՎlF4WGϜ=s^;'"'N.)ζ\t㣍[6T) Cg[ZtsP<d7 G025D^_!֬P(=w}?ѵ ecUgPX󵽷]^]mKͅWomŚ{ %S-#Vbvưu:9tM"r{7o\65w5nۼꦭ4yc~oܭٶSœE|#N^^"~(5(VRjh2ȕ#_ H8-M6&">;=>_DzN;s9J39C7CO5Q{_3 w=|e(FZ}72CVxPlb6<~ *Я!&ų2g344tF?bu9]M\n]cRCٸcۆՅ&_tdc pzNo&"G>op~AD6,N9~pz^-?Z'AQ|g[^\`Yۻ|JtF)">O<­`}ѧ:n׮bTjXV^ܩ%MFxs[͚`uio?G0V|O$ "tl6&kMj`ut;|w"n|&0|u! Ȯn^[:{@DN.q.c8)۰j1|O|y?3g; 9ظӣMWGƈn2I#J 必B"|7~y HIq,5JYi4vUϞC{x-sw߹C&pú/ܼhX3tZ}m"w|tLج}򲂭6UmmPyC "b2U\sfG}ڿk4FG>;TRC!SD.Ox=9m4\.tSGéVGiYrKWmۻ{;:ۋ r춬qeޓgګ+Jwn_mϚ3\~:xt2{``ȔXvz^Lu˯ IP#j_|c2NN{<ןZSpg4䊘FٵckZLծ^ ObJ3$oZ: EӚ2":'Kʨ >W3`_{B{lDl ^SlK?+E;tZx55+*"nGD\.Oxc2^F>r`r8,{kJ Vk*K}6< O+tUQQ#EdRRRK ~޴fuQͯ8f*-O ᡇ7o2 9"rmdm~kF?`ssm#7V9Nefef($&QDT;..yj琲XNi}VYPԓRÑ_mV_W_<7p1rSgJ -YKJj׮XS 蘳%nۭL=jY'^`ܵ#i[)&"2:kHK{OkG9_z> ~LȌBk?HrwlM{xS︈"^ċxc(`RP&5Px>k|_UT%2R$  "*/ZSRöO><44 2`"~4huV8j=ƍu2$̯ .5bynxcm,˴Wejj׹WaMܛ&|MMZ3uE_&r%疨ohhH{q/ERxK _exB!ǽ/S V٫Y)v̶+۠$+s ơ~+_k'ˏOP5h="g{/UD6\Wn m8[Z: ^Wn}hno&ZS\SJQjRV132[7,/YZؘo`# ux6wDl"+/ʳZ,=hRʸ ]vs~ɶmPEjb|"OeYED7^34unRCT*Ν|ӦlrCNKzQY^R:;۪sEd[vl:?xCG;{5ͣ߸[׽gWǔX,?Geg'h*/*M>+:qc]ƪ Z(&|MMZ3uE_&JҸ5 y;/}H'^@x%70-5?~%}kH ^=gO1@ZQc5"26zmlڜYvW>g184yDSyσsy7qS ~ $65O^("wp"C)QZ 1祦9xXWOy>ÆAihli~(x]5"r+jMqݺ*N mF-T>굱ۺzqH~nHc%.i}պ!qfwn W^gX8{@LHj=jw_mYJjo~Y*u:vn*/z'/gmk˭68 m6 :vb?t _D֨g"rQzx]2I#I ʅ^9h]-YCFST+"`+oY_uKMiki-sTfh4fz<}ZM嚢|^f:/"gg dIXgTZi7 ޴,δejYsL "!j}wߢLxӥtyTDΜ=pՑm}wm\W!"'δ v{kQAݖumM{/ *Q[NvsKDJr+ˋ|'G="RTSQV41%##Sj@ !y?<,YCwbuf⾁ѱi9l]7ھ!<Ӓe8[6TmYzd6ێm5PѱjzS]U(:v=r~Ӛ25""Ήi:dQN } BY|m@Z<翲 Rl>y\(_ycdzϯXopP;ypk~KMM<7'Qyju Rɜ$Z?`0 ڴZ]Aa)ЯfߓOmX*Cw̰b_c-V7VcұlL{Uf^Юf{DMϽot9S]e2\.WrnWYYYooo"^ċx/7|<]v?~qiᏟ{I0)Sj <g?4 5 w7/ʄ劝jnbZ2CjP0w2jKe|Yr1>~ 55?^?~(!@ yl_D nR~"gg.ڥhhli~(x]5"r+jMqݺ*N*O  >ZNfdn^[Y^jfi1WGNUDY/o{ˋ l6k{WV.x|}EyV%>uvLDHRjsêzW:urm6Tݘj5`_'r=٬"ϛ~ M].;aGǹÇ')(ȯ('"$#5 š_ùSÛoڔm:]7}hQzzɶO9y0n?/?).ݵcS٨.;1!"uv{NuFt"^V;sqg7_6NaO}3p#Sø8/-믽#0)kJDLSǸӭe("F"R{`dt23.V][]VY^>ADnhx& y9FwX[7e6X曶=x0/-#Vb#?^xݻeR#54 "26O=ٯN][ r&ND.^6NLmTٶ,b8^">2rK :F45! jDZ@{onyk?j_Rjv{f%c#}[#ۚTG??{u;+m;9ᵑ1|b ƴLADӞ+|{TwP[:Z( -^Wy zjS[P8/KL#Ju|ɤ,RchtPVZFsaByqT/|/rZ"Aθ~(#͟Rj72[~oaŕ BY]ˌ e,g .%Bh????)3^j8cwAh(~g{ː%ܘ&F {Á@ω{#C4wZ-]jPNPhEtjhKy/F.Eg =14T,B%J*|13. ϟm W&f{Q-|Rè?TglwO/tvĉٖl65^T,]^ _+qҼkR,h ?o/]?ge,%!<2} }8sT(~ .^.Յ.WyפH[:Z( -^Wy eRCLYC$#C ݮCy@ HdBkP;5P#*@jBx%-գEBY]hE!R(KGPAE e@@Y:*Յ J/8T(HT,B%J4Pk$VrF((MwlM{%ݝǕ0"^+$^\Ljbdu5GQ.TPrġ2z[:Z( -^WB 5DePV*(WP (KGPAE eT1GEC0E+UQAE e@@Y:*Յ J/8i^LI>t;$z,u5/Ͼ!ǜ!;9j?3",qT(g RCZ--Յ_+qh -BW/8PH *@Y:*Յ J/8T(GQ.TPrġBdr""/|qɶ8 pW]^cKmllEd+,,VjOзsURCĢ9w|V>ޛ"2ϕXʷUݔ'}m" F3!yσm sY\R$mo;>~ΖWCU `M-ݷT!"0&? `2gړaB$uλOtgo0ֶ4޸=Ɔ17J A^,=\Wef?4}wnco^덚)7. ϙqoDjB@T;;x<܄ YiA+P5#;*{{x(r7|nbz^C AnyWxm?S&_Ix:rJ _׃3|iRC)b>iDB$mAMTT?5!$y!;/YNx!Tp8YC@EnYm¿x2SQixH%'N6m@YC lqNjJD!!uu7{D8 @|?j7͋8!/֦ƅIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/C3_6+7.png000066400000000000000000000762041366722712400235230ustar00rootroot00000000000000PNG  IHDR^ pHYsutIME IDATxyx#ՙ/e[}k4@7khv!aI 1pgI3$LI @ i^˛ȋlK־ղlnXUGu)^ssEEre 0d;[Z@'',&PkT⢢)'3h"z5Jpx|g"|c_wiqQ@.ĿpmIZᣧz{Pt"UT`fąQ}~T. paY:;w_c駟3W^2Y\ơa@T#,©PRZ16nE9+Λ⦯jixe57"45瓏xG㟙twb9'v㿾BC(m- qJw宛* _l |=!S97z߆Mb?W'_00sp 2jnIgAnnv yӭ) Y2}e xo#.CU̕铇Ɋ+s zCge;w+@ ʪ- D&ohnrMኢX+v+ޞkv%pUl""o>a ?w; CC]Q`nuUo n>|!m|BD~t:TN{B y+8Kۏ>Evv474szRb2bThp29l8qs.49s0NL8v`a[|'PVXJn|A[K}scwhbz=5NOLL2Y(&]ۜMr8ŏrEn~I]||;~)%[%\n7|K*;՟H&SFN;[|~@h8(M'pi\h9{hRJ>5sb'??D̝]8kxhd^jp7l6{IQC)Cg7T*BD]W.rEX5s{79aJe!3Õت w?0Xp999ND.#d\\c/)Pw2'9u䣿L\3,Vkaa@jeL#k7ݤ>wmwD"-):.3/f:μ5fw_NNdvg:}0vm+c_HDOo~5WN^ݫ/Ͽ羇Nػk}]\b_a_p.}Opr2xѿy% wu&4wt8l6"vgdJLJUs6wFFu)So[Z#*{ΗX4А1Y.ɉH(g䘆0\Q0 n7÷Pow=9w"P;j9,D*m- oW}7xݕn~17q.4}k{^n<"-{OXhow5wSk)Ͻ| ~щ=q(װqICI64֟que|b0G6.x|77۔!Dj$\N58ЧO 5n (4FD~p4x" d "Ŧ-;O, #EpyC۬ sK0"ĐEkjKGyaFA[YyyOsyʐ3̜|CDW"JS(kJR]Yvӡ!*20ٳgvSձQ4?\Eoa*?|dB>ow%g  Q <{Rv'ב|UWxWBan(3 [ T-UJn'4aq]kݵPI:W򄷯*N5b ťt<ÿNz&]8qp\1a05D9ข`݆6b@!D"9:P@jmk5k䄅vnsQ+,תpDƛ`Mkyy8!+syQ`y !4w1Dr nޘy##cg~hUxu ZPp:>c_ $=w-/_''<[\p;~7sg~C,ݷ_}dppW^o:2/-)&gmɅ/pεZ&]W@Vα1d^BB|AaP(DZCͲPs4(UeSZ-֫aȪ5e:q ,))INN^RHKM'Ǒ=]ͅVID|]]bBU*mZK I?u ? LW snt{&'-}~(#=511>s,D.ha^ )I(Տ/e^\Ն ˪So_/ ~oWlCrƾ~L; \"[RS'~3s H7HP_ (yWw7+\v&bm%[N'3g^DğD}֟{[rA sDԔ)"*dqB0##eI$3+IQ&2 L4 jB胏? UD400Nէ\{N@P\Tp8? ר6WeE%&{?RIk[owv˔ C3mGo<y%ɣHKkńJyb߅.y|\R Wy^)ӵ>ORV/CZ[srJHGIDZ% "JID#ns 7p8'&-ឫ˭/33KW߸KT( h/$"w _>띾8';x?ω~9rٓO߿g/~bؘE+vnw=Mɪ52d]!׉Wxm4,*+Jhr>_J|H#AmoAr3^|<䩳۷m[2xX<}rCDb:T;c~ @*d4tWTj4jg2 kqBr :]dՒ+wTsSSڳ 7Wapv;.RxK@D֩蟸q7o񘑑>9oh,-)"Ƀ_}vǼkljɳ/uvlr;߯k$[nCD_:6>>׋7il޸uIˁG"e;<^<}6_ ؋O`tլaڳ 9;܁bY,N tɪ0L X,ƸϞkjq:] Cwq49F"=,(k wq @㭭{"yZ[];Dv!U,|t>Dpz K8C0-V!Q WOBC#@ 4(U/>D!rۯس\{M۷mpSz;7{PѸV˄2`2JTi"۷mǍ@͛󅗊QQf)~ K^q! !#ֆ=4\L\HDܸ( "ą0/߇Bs^BCXD eаr+uwML]LX.~|ɖo.DǧYz梽mD%`Y'v</+@xM.jsd˳as{f˶9I:-QwJ}-$˸_7\5b%X|ņ󭆯.:_0)*qvQS"ԂUD͛+$DDS\Qك.چ~L/-]|~`BÙ ʯipzEyy hooB"*)PRAj +*˫K'==rkqqP(B^" ;'x_ Y/,˲spŎX|2~DžH[ry^m5LMx?OJO!"eq+qa||Rœ;Ru[,Xx?s{Ǟ=ע^ &1/XА%{Ŭd!#1SNEDAq%f5ZpZd6Z x<DzDİ,0Q)Vo,[h_.C,,;66V?_l!)\72247%2l!"aCy$..!--bKE:Xj[,NNQ­mܶ>g|r*d~ZAD{ݸ2e/=wy<1/Аz~_rr^~bbJaYr8l!oiiYY]]-%Ki#DyrٳT)+y 7.ƔerYֳ5kk. 9\\lim;Q_qFGjk}0ӊګoX^?_1_/ ^JTi.*45B"jVk.2O߉p(z1 M fDN;z G< 9 ~{K!Cq/ <~Rr`Ma| HH3:k2i1;xzo9af~M_Ъ¿#);yxܞf1\dv}e㪪+##7 B}P_OLfؽ󚽋|g3Ͽ" !4BÅ]dhȲϞ~q|5__ˡ!O D'eD"5 Qk B *r`#X=|YZ7￉:7.w]KDP˨zSpavzEq>mno L(E¡D"ޱ"#-E"y^a06rKzPA7`7KVڻ%/qJIT)(= صssfzln1LBF >e|:'v氫*"$)ٙ#p 4Cô$":yE,q[gMį~g"k(rnvlF'BPj??\cwQ+I+N}j!SSvJms>94a=pv⋧FYע1@LZصZReeQk{#g؉z.4l5:K{tJSQRG&9G8:|frA;"B!0!^NK 3ۺMd KhdtbzYPr"p{h/\.}VL㊛lnR[?!QbP884::61f0f"i}6C%ƫ \;r2S6Wy<^0d<~58n"?'gC'Qnn5+-Vېi$ mv\&(LiY/O5aҢLLbwSÁC&mKE*-IK9lܳdR)/Nvy3-5nаM" <dM5_S 7hԊ8 [{|~,>wP,n\_cKCfEhei1l4*Z5= ) IDATy^0̥;;Ct '9}m}K!uTM+G߽gW B} eX"ڈ xQ0D!5:Ӂx|"hkm>viiOJNC9)̃?VRR! iv0LHGEe7.5bw"z!]Xn@|M_Ъ¿.h5! 45յ6%[2nq\UUUSS2yedd.{w+ B}]:.8ckz gvӲ†<@(XZ0VCCeNǾS)/zԆEȡ!O D'eD"5 Qk B DeƚƖCMDt+2qn0Epa_(XD"ޱ"#-E"y^a06~%{͗ї[Pyj1_8/NM*Ŷq4i HeB.ը۶"R$vgedURgX-KPYr{:,B&=x.Ib?80LVFR>A*ח,{2%qphttlbtD$ G<U20/z㺐~wN\5<2I P3[#oۦٟT.+Hm^0LM}( 9 6v'bFr2|?tT]7ɳ$YYw}^p `XmC1Ǔ'"h2 c(+#Y&d'/Kkg_UyA~nL*|J,^{#RSR(%YzC@ٝ86NI37U |ݥȵq "j*-IK9lܳgwID(?;Ygsع6Yr"EmGUo,Q)n\ʢȹ|l~Njfe:eo76nܺAg;+eR9PRH, H.dgH9\hȵwdLYtT[!i4jFŲbIVժp+M[6bB|.'ջڬH_r103t}oXk4M纸I"$a0bV ]fhtN7d23+b:+}A:?;K!yܽkqwL^OnT2y}{v~P_/ׅl}EG|R)D4iOZ#YZ 7T_v(t,FYD fņeݮ/BGٷtWD!5:vEFQQhCӑ Z>`2x~}iPeCUk#`| HH۝}xoK}<7νNf`pzM_Ъ¿.h5! 45յ6%2nǠfe퍽B}P_/G]88`y^"ns\O|O >+`iBX Yu:^O=_k94EkD"5 QQXCӑPn?" Wliaa1\NgV߱|?wq;i2Pili1\^QODgۻB/f+ sQt* P|;ώ9^"9p¼4}B.efwF pZ ?1?߳fjU{q#=N߁}}Y)*QiŶQ}I$^}zRG=^Z%#4L'o@DvZEDDw %;sQ% Wffnm˔ @w<ƁgN7=tߍDTЮONHW[#"x7Hv=gí8K98nn|R67ebl]L*ywxvk7Qa01AR,V{DžV9X!NCw?+*I  $(/˥b˦u|%z}u92MKI CQ$"<;&.OLץީ9ICf@Q˫slac7,R #,k..4LOw~gkϳm'''hj:SZT D]h(nv+HDDd/ܡ80k冼v8]9 ZUpC0TH/RKTJ٤jv)||h5,5'Da'40 Cj`zUch-DxǛ+G*YaC4-2ɂ( 3*?S6gp) cdb 6?xDR^ 4(Č WseRIM]kmC[qAe|nL&QdAqp4?'5/Gc49f%6[h;nLוg$P%D2]nOE9O:xM.Ikj|KTR9!Qv^.de,]uRD ;)1N]wA)x;w3R89)n3$b6NIDS6ghWUZbsظg5$Jh}Q~vsגgrK ʃËuGkUUrSرyúżC"ee$;n*7n\Ԕn\)k;eaXWkHJD[}S7i4jFŲ&[6hjZ Z<׈pQf,K}<ͽx&"7 O,"y^ES^p 'L/6'K/cW߸W8>}vʕ޳+ B}P_^|=ck: _zi*݁a-jDD'45vqX$=WQM]Kj.1AcQJr–% T ܞS5N:"j<וOШ{{?¼tB#u  ƄBMU3 THm駺sU Ð0 ޘ)ReS5!k^W]g ;J ;}GCDN"|-ph85eW6LӤWYVa0*RZmK{!"Lbw8zx<^a^FN^ ~l]%Y=}&u)0/}Cei4r Ѻp[0LVED,Nά$#M,eف!3铵U|~q`2RJ3hxtkƅ):JU #,k`9 .?xbjJQYID= $o ѱ1d7X,<<U20/z㺐~wN\5<2I P3[$^ɍ麾1 9nLVʌ4FDjɽtˤbZ?d9=`S4Ez74<GEQNƓ^&s>y6t}&Ć oJ6ds{<ɺx"x&px<2e2Ifz򂹴vUˤRϧT⵪?w8B^p^vF(O?`2x~}iPk ÏTEBBq{Z|ג-LfW8Y222z{{coP_/ qQMP.<˲{(3<@(5 C^NǾS7 _n,Bԉk#4 K"13 ુVԲ<@ 1h2 1x BXSb)0;86w^&W`%uph ]ޭ綫ƾҴzxc:߳fjU{q#WxRUJ%JV h ۹D7dLLeXtOpVBDdsj ݁`w8}aI74o?1@Ҝ>_Pt:f$"\:+L%)1^O y0L*!IIeӏLOMSkC82^в֎>+O&MphsO")/z f'vdd-S6J)Swjnfp6Ɏ;%K4j9yYVp3CÌDX4jYJOc5upd<~58n"?'gC'^ cаcǖ\\BD9YDl+/)\h싳Di\_*(M@D./#tʲLDNfw?9U夥6Y3A9ɤR"Z_9ܵ8'+CODq˹ F͝5xbwv sKNͩKlE &FhT,heIVժpW q![VC湟FD\"^gXi1;xzo7`b&8|M_Ъ¿.hv82؜|;/’^}^S7UL^}]eD ]B}.^|=BC2Ej ]нHE\.հtL!$.|<EE09c~?A_x4CaPkrP~JJ*"! P=MMumbkɇL&WUUU555+WFFFooo B}8.8Be<+ 4 yu:^O=bD54޵yak@(AsI$RӐ=QkrPFiB84d,kӖEn_?5"TWoך\ y!/MyiQ7YYK lH$m5f\nn\а0?s*T;8iҧ$fgN󸅈ᚭj4<4ZMUE tD"AjJB|0T.'?7ei`p43=I,F |V%jt8"$4y<1^֨>A.?oNB{<)sS9r> 0 Ɔ&H{P yEs^.>.Z ngU-|AY*uʶ`ʲ|"jl6deꮀ/`ffxm%?C] yx(C䅼o;d~Y:[jR\iR MDt}\0B^ yE  R{ n5,+NJ1jo k|%EY)D4>amnn䆆 Zu>'ԵqjniI,K){{̍0#-)9){e,ăD1z|h4jFŲ4s4MjJVMs^KM+ y!/䅼25xAyK~R_#-~O/s/( ES^p 'L/6'K/W߸W#qTM+G߽gW B}8/zԅLBCtn em5y=^(r9QQa9[ NBQrPnkm>viPpKrX?VRR! =gijkkm]K>Le2n_DUUUMM䕑{B}z)>_Ou2PfyPk:}/W1XSq2)v[O  $iȈrX2JQ}*tM;ę!sȢwWڎAym5--Л +ls{{WeL}Ea.>WQj{(/~;-wwjn񆁡Q"7* ƁQTd-ޘ'?q_߳fjU{q#MwJ!8}e$J@4ZVúvnyi> Y,S4C)MBìdᜎ2|zaȍ縄xi%DD6]V Hv!@ZV#rpak{{ 0xMNVjyi6Nc4}7Ԥ8ѓr2S~\KwSK׼9ݞ$]J)X9nW$_f.(xҜ4}=ڋt7@ԟWI];7%kzz{W] 7=8MyI$'߲gG\jdq7SuvQAnjrVz#lCq~ZfG& RqpZS }j|/#ZtCnrey!54u8t3"(Nun"bSz>"Ʃ߽qy23#y]a&˲ې#vé88䛝>3?5f<(o΃DzՋzQk_,kU '$@I I$SoP{SaB$SɐeLƐ&Y]d[?ԖRkkv?I5w>ܫ9vp 5dEdʨQ2g)WE& pz@8VBCvwo?ۯrl.ܱj3dfȄӭCDƵ>O?Սxu}3 uDaPk/,pYL8V9'vVE$aDik!f, \rFcfy"o4R,W,Vj*Kx::Kl,j>{ۮfTҬLp\uyx4vW辁KkJj*U9J"۩pbnc'ؚ:{ItQ^EyQ^gB,KֹN,縆l^F@Yk|q >Vh@k m-{xh?b4LѠ$xP7ez(Oon>֒.25L.+1D}}}cccbޫ7EyQ^Ey)LՅq졬3/3 ^Ch<]~ҊYx#C13\`d~eT =M̅OP5xPN'="{'zc4 \3u׈񖎎f5u{cRd\|HCӥW>w|fƶ ~9~ahDEWh: >տ[U NvJ{Y-n-hQe嵱,-{.>svlYRw (oCa: R=9n>ϧw3r9A}NX""r39jZCEk{wg!3~vUFF~oHD֯+ߴf5 Gt[vl,/|h~fQy}>ra(5p"a2 [F]RBCh4EʲMnݹ5v֬dHDn^,\zy&j55UeE:O֬.qX5ukYi~:bˈճX1)eWNwY8,ٲZDtu73J+Wǫ+KEvGs=rxw`gyei˻kdžB>CQ \?<:F08rmfdj da$W5\hhwatl^;l6mnUj1_:n2f؄9*7׾mKn'c n!A醢L[U醢l}`t>ƵLH8,"N_hV瀬2j#~W; K@\=k5dO  +kzݥWEM5KDVS}-Fcsͭ]Օ;RqT[Yуהg+ 5o<=xMq|@n@ᬚΜ͛WZL@fח_s][6VoPi2 f4k)+-0 e%g|o,-r\pXLFl(w]J[ae+PPk8SgІuU%ᰌMiR6?n0dV).-k<~ۮ-?tsz[mDnpx2S"e٬6u2(Nk 5?NuƊ%XN_^3O"La .,*Ks-/Tsοp0jy.2=ˏ>pbnc'ؚ:{ItQ^*JW{bK  ak@(' 9 -jy2UgasIs}5VGVCw B̟i?R)$D<{({2Ve=C77loky|L&˕[11UVVۛz颼(/ʋ`B8Pz!4zx.?iEdYզ:ש =g0_<{(7ZvSTq S,ˑ,s(']D>jhp`.MX]FDtttE7W)[WERq<hǿ4צ?⛰GpoK)";ppAZ;{NB"tqOfvtV肓RD}EyV@ZkxC黻eS MTDݛGE-7E"8 ""Nf>3!0&@j".D:Ig kkq[}8PĻ>yӻEٲd(,ܞۮM .߶+ןbMQ^=ᕒ͛ɖgAcRJBk cغen>wfq7Tm6t5j߼ꦭ4yc@/ܭٶYCœ%|3N^]#Oi3d,, _U9<2*"Yf0금pz&:vsn(J?? DkMZYeFBC+DR"i$Kmsmg_Dr6eZwX!eO=xMI~PSYу7+Yj O5mWUfAD*KD7V9Ne橠\LFl(w]ʏݩ VFRk 6,/++cgZ?hnp8RM,6fN׽ՉcG?> "4 xb.5fӗx̓ȬSX ˼\ˋ:ܯ43Z^;=>C5Q{OS qEw=2<ck>CE ơ~&`R<{()3u׈񖎎f5u:T* fmV?pҕM/\N@R"3' MD|:pa}BD6V>{48{ah$=/_(_\ӿ-/.٬]U%d'xx_yQb@UkXV^%1 c-6k҂եqHBH$ADvlV"{MhJ%6+F#vl޺y'vn4l[]]'pZWSa]b=Ch"ؗ?%"t;r GSq> ɸo6]Bk J E+ *c69uZCK޲\WUܹ?^c8ް|^0߱j% o-4 6yG}o3y9ȴ ӛ-#Vb~ "ty"k\ep᧚6lsd[~N͒]BD<^TceM(G8Q]Qsl{\ '',暘k#fFTOd5 f!d\x=D{h2ȰFٵc#{ZLݮ\/"Z#(P KQ[h4ܞ]\}ZSVdC/4}s@V cZBk V][q+ "/ _ffE^E2O68̫~T(DUV=j5%S5o<=xMq|Íw ,IBk ~ܼfuQ8f*-7o2 9"rutȨi뾹~k@ hssmx*po,-r\pXLFl(w]J[ae+p#R%ptlW9}ۆեUO6u \e,ӥWq%hn kT) elK4f[OflɠW: 5q?h4|\8q]vFdMoşдoމz"'} 3#"2멐`^|N{5;}ļsOꥋ(/ʋR/P8ΡLhn|034ϿFdC& q|P|q >V#+H~5lokCaڏ| űP'6nX!QghCf9p6+o c`{,͵S:N3Zp|%S]ej2\.WbnļWYYYoooꥋ(/ʋRx    "z)J" v~jDD}oyqf*';=ʋ SkXZCaޕm>?'۶iCa7E"8 ""Nf>3kXDDN7p EWIDAT踲fn Ý"?&Nej4\mt:^\u=}C61ڪm[}>ٮ[ŚBGM!v.92b,9w @JIhh [m^+"Ϝ;Ьh\n Uuk::G&\nhq cNK /[Ӌőp85[{Nʶggjv-#WVHSKwK]>}p6+gDf J\X}UZ^ԩ~`B}]ezŗ} Nl߱51uCܓz颼(/ʋ%ՅYEEݭsKMZCB%*' @rXԳXa Cq=C&$)=Y @)'=7厨Ci:?RZC}{[? ~4hu/==ƍu2SOdKLM&J-Q__ؘ*++Mt%cyPEzck'V70=5?|}k ^=>O1@ZQ5"2>vu|꼻YvW>g1 84O>q)Q+yy|WqsS ~ lhPD;v"U ݅R,c A9αٍ"=}\s PukDxKGGWt3q՚uUd mF+T "@ڻzV"I|nyHS%.ӥiպaqOfvtV肑 W^gX= x@C/h0>,,;On+o9E_^D|^?< ~k?eYEDv M].3B  Cj oݝV}4ݖ_}2ՠi?sKUyk8=^ז[-&?;p<8 m6 : ]ro7}$"7pql2!Hp^4=F1"5h4E" GƮߡ~˺ue@¥[joZnΛ6x֎ނFcj*ٮ"MA~vNքu NvML[F:H0$"?៣ֿ~[&.e骫JEs'Gdu"rtGOY{n-*ȱ۲:cioŞAe8jۻ}axN5wHIQney?hGD r* 42F<:F08rmfdj H0,"9"5z}U33WU d4؄ψLfھa ,S0aݲn'Ȃvl CGZƯMuUpG߸֔Uqf<UFm$4BKBhJHea^\Qhfb2O58Lrˎ Fê3=6_`f5ڱ^ml#":rd[4inKˢ~SmeiTjVd4ȶښ|ۥ%OMV5 58tۋ rK.}dѐYY^RZɶoljn *ʊawuDGl*HŽ~Z_Wc1`پ-*";2WHِUQQBCCfM5SoݗnWnۭp$'ӖflɠW@hˏK%hS^_?BD7M`xÓʚs}lm蛶B[0v{#ʫ_w"iq&9x^|N{5;}ļsOꥋ򢼒ܽ^ʋƦK&FrdCy=ڬ::1ruďy`),V{Ñ Bl 8}.`Ǯ.jѡ>3n|_7!P;ݻ=y['=7Ci:T2#=<4 -j4=Sǧ6VWPXJ>P5{2VeHT_{.Y\k//뛱e^f*Ks-/Tsοk?77loky|mL&˕11UVVۛz颼(/ʋ`w޻7h8VqiyA0)#4L0{,(4oݼfj5㮾 Pkg։ ,".l֎ߪ]0r=ʋ CP?44V]v9sm6T]j5Po|_ZI8 ""Nf>w\n7! qp6eۭNpz^a7=("'Nf-];6ezp-^OD u,Vr{N{Y-uX'&}rżC`2M#4=4&ְrMn>;t+cȲmf9jVUmo33{<_V!/gk+z|ֵigAc pL[GNEF8/"tߺkKQAd\׉K#WGc^ߌl:W]Q6ۖE/͈G'sG͌L!)b+w= G޲X nldcsfoVȶf'ϟ15яܴuݎ?klxut\D|h D}ZSV "Nߌ'ʨ~W@-dءMb.@2&bx@ZyTXG- rޫ؉d(/ʋ(/}ݗ_ 啪RWhP *h@Y> 啪RWhPT P^./ue@!._L&ktAE %iD\7L"gOjѤJZ8rij+ICɃyGJ$Cyjԕ.z(G%R5]_J=PY4, ^HZ2=e@h@Y> 啪RWhP *h@Y> 啪RWҼAP3AyEi¦Oؾck+ڽ瞔LW"+|_./ՕW:)be1湿HԅPգehB2WK]A?'>[uGуP^./u+{(O^/F#{֯-k7zcuh(".:UYY?/_<̾o_>gHe~SN5}}dX鎹.8_b_ N$%r"uŗV啪Y^./uKC5\AC '"Q4, ^HJtq+]4(#Mzcl%H[gEcgoQGy<dzg{gMj,z-=( d/= ȃ}ӟ,ӞAκ(#-Rk_ۿ(+7>Ɍ P^2\hPƲ6-prB;DW+׽}EYZYSԛ %޳/!n@s}8j {ˑ5q5uV&u@^~PNtq9YŅ\ʃ}1bx .<S{FQcЀ|4x!+UtѠ8ċ9qzeag?C,$4IUy~'Dmb/ǏkfSuLd(TMҕC^OԐ>O7GuehB2WK]Ai `VtCA*`cH^$Cyjԕ4 P^./u+ 0g \_ l( J@]zw7#?ɧAH![>zP"+UtCP=z-=( 啪RW "UЀ|4x!+UtѠ  (GR5]_J !R (GR5]_JW7(35VVbf5((M wlM{%2]ܓJdy%O+UJ6eBC,f5<邺0 z4, ^HJtq+]PTyGJ$Cyjԕ.z(H4, ^HJtq+]4(Gd(TME2eD!AY]AY]啪RWhPT P^./u+:H4'x T~y H4'fVc'C9: HJ5WKu H4, ^HJtq+]PHZd!8[>zP"+U 啪RWhP *hP^> 啪RWhPT P^./ue@!Nw5jy/ua6w8퉜Hk>U/nzTٟyjA 5#w]Dvh&4DB;8%U@)V+} Glx%lX}M"| !$0neIȰJNHBe,xL릝w][ϱ n ee[k'wmkm~SGGGc/B3~[H[joh}l^=1vz^7jW^Y3끱߈ąf-vtxo"R]~8ELhB@xP[0|_zz !n[Ctvi#^2Zÿ( Y\~yh֓ϺLhC E,B5\4H\J}-Y5"uVD>jYg z@".Ċ}Ŏ eG>z?kK xPѷBv򯠰VGe yuݵ@$!`>䓷{}=qߺ'k0K24\(@Ҳʱq;._E?㍻ȓ-AБCtF92*3Dt?9nhnsGUᡟ=Sg:[[>W?H?{;~hӖ9w4v;\{$p^f6G:e}'sհwZ ˱`&,o={/Zf{zwy͊K*szsg˵T`7%Uۓӈ'sΗeӧϔntS'<$䩓&mim;oH tr>yxtdHm *C5g߲PhhnaXԚޞ溛'#r9 Wn!"/7r-x!eCX?W;yCYugG~/ %}}ddH:LNIx<O3v6\0Rp^ W03''ljv-ֻCs~CNCЍkO3+߀wܙ)db""?XGds`ҡ{HNv9G&W#L8ub7Jb/&'lR(o﷿%<ޯGo [⨣޹kSv:rLӯRGͫ>(i;'t 5qaQP$7KD)Ǵ%06oI,x<3^gpϐED{QHtrJe.@_rtD6 3EɊ-w=}t_{?}}LĶC|jo|8vHx2J+6ovq@"y^~ձ>5mDK.sn=\V9AA~Z"2fcs]RҦR) iAbD*%"ޞ !#ەX&4$ڴS.WFz(D$S(NNX].gzvZ̮xC?=ƫv&"R(D4`U4D=+B}bIsD$F9`|jĭ2u#T;~(xs!uwr3C}(؇wXemZyK.pA4$"Ij1;i㦝66qo޼w9&dEh~>o||S g}qeFzƄ1E`V^Q˲RLK7Lte2,-:kk m•Ο%'>5Vm |9n4 sZm|d%-cjO/X(Xt?fS GAV|8ەOպԻj2sSquxxjھ薚݃]ħ@568hذu+@bmp",2P TcDph;hWSBZr1 ,`:v$ g ָk߷{ý#oLuE(C+ !\CC8u/z;oFEhXodoK"zN~qv)17u^:5igY=#Cָα1fARRbaQX,FYC֮qR)stȖ53gۧ7t0Ȑ5k>}9PYZZ~Õ% ~?*z،X"ayRZ/ToDYčb8X/\wNdg]P3ao|w,/ې;4dd "hpۿoSuU1~_s;n%;+a> &S?#55ȓL& ~h1q yy<eprbEmFGOs5uR3Woܽo_rN9uƔ7[7\+/Y,##cy[͑K5-"5jO1#ڪ6#xZ-&SX$BJZǎ~qȑ&oǯ͛n[Hnn6}7ёϏϿOk㼻n#w+'wvcQ?}ƛ2>h4LfD?WؘY)Uw_M撒Bɚ52<RRbr(^K*n߱ET^l}V݈m]=Dt:H$Z 흡&'%QOo{ "!ON/\V^j1A"f[p; c4bR "L7<kpQ^AO@nҧ6 ½7kr=Dtɒ$d0 _jd|bRw%Ņ@&Җ?;n%11vnBD[ %EDd tحhʇV ]_,}ʪ2uXOlNIAv)Ukvm秧nƈQku=jeٮ_a (zٶa޾?>t4te Ԟo.}.d˚55ioo|B(%%)5fjN-^sPȰOP[/ +b"4}E<|eH$ !X,Y><RBC"ڼEED 0v>W橑;7,ς5VU V;tK}f"zG筽vk[7#`ݒYpܜW~]0499Mz;:<7Zg.M)[K^rFSj~H$mD`X:,.˧Gv @h2TqQS9"L5D+dDD|jk9kWD]m[oCdegm@@[:Dg,v_\~PAҸݮ&>4$M4O>r[EŶ4UU()%(+D% ذ}8 376^@@܇Vaa0XW]zdm9rtv6| &"gYJ&&F \>9y)=W.?OoqB8O}{qi5<_Xtx2P ؘ5JTb !#夥edrn6Jࢵˊ+H,㈈8aH(P ^f gqIrqH$R"r:C LND6B+)px4#ŵ^g`җnggY8TB īլx"!T<@0224# 6BD Ä6HBBј0͕s'^0v[[?(}l|O փլx@p;X@J!##aa 4X²Zmn>\;55nOdgdgp79iC)^ wߺyFt߲kW*'@\:萈zZZ%B׎Z@rrF8ra/ EFcnNNaWWbIMG&ڕo(XWVMOMԮѦdm!  l#uuO7Pmɺ/ƽ瘟+oZZ=qy^(/ ]jO.7:C,i7_G>y;z2E%KO-s`~h{ 0.#/Z,7iFz<bf}u:g^ ;: lis\KU)G6G_< 65յ6K(Bp:SkjjV';/ By<~)ŚK/S9Ѣç{Y$-/Ctxբ68uय़++Ͽ:"1-d2uȂ|XoBD83o$=!@~;z"m}'(TbG(77w_/6T!`IѡL&ݵ2˘.IXnwv- ڿx.":xLWrs-h1|!"zs Z˲<mϬ@_NzFF[3ӝ.ws[at`t 0n*Rdlzj5D$JfkBtKDt\Ssk?T"W=gwF[_Dt=7Sȕ܌ E:qO%mSI)c<|T.^ "BCKZj CZux2`r6\,ߐGDݱˋ vn-'a˓ahۦ ^7_>8Z_c=jY>xԞ۴Ua~va~69vNöޮ Z{Om"b9Tiѱ#{Y?p%(op% Y^IDShH)*nnۖR)'щNQ+{jRTg79е~Z:1А<84::61f0[}N"Jš0ZHNԚ-CGj0eo.fY_eqMYO>MFJ?S`2~L6d- ֭xw~Ô1dlZJ"/pp YueQZ#Lc/wl-+.V*dN7=5:\?0:d]lֲ@pE{ˊMt?ypˉhcqAnZkC9~-amC!=9'+],?|>řJuZUNM E-=@`CQY۠wP*oXk{'l(ˤiu: Ӹyj5Zf&.7D8E-ak$wvwv-W ]atC0Dvu8+?3TNZ~pp=w^(/ F VkDX7! | yn}9n?vR(n߾YT /X[3ӝ.ws[atY0+EQIH IDAT?ˈ.V!"Q7%7[.uȑψԔd_tnY<:4fsMͭ]|8'HUDTSג;"KUJH$xف35nKD_V"jЕaHiU~ |SFQ~Z%g}~H]C'[WDr4W! /llzY"oi!}7m [8Ezo&[X!\ɋoQߺ /X[\k`_<:vj5[+ iIqˀur28 Uv-*\U^LjH9]@Pe1DG_UZgόZe:-)I y9B~x]c˥npaT!I$>FD!>MI*2gf"b5 eiѢj=c ;q4;ާkos6\ ֱţÃGNٽMQggQk{ϑc7uP\}Ϊ$_hh7[f[yzjbn:Μo B]TED ̽ᮞ}{$h5)#ʱYF{-.\nrSR_Kr2S}>v~ysR>\9 RvAM%_(bfvtC$`( 6u~KKI4n밍`6ID|#\''%l*'hĢ$s S檢UE*}JJ| R͇'G?I`-b~ھckjZ8>x_Vv&r/Xm<84::61f0[}N"JTnbj\Z^Qm 9r:Jkxd""H8fG?- eRIK?;+bCNpFغaαQ*L 6v&DMYO>MFJ?S`2~L6d- Vnn}ׯAD `Iݷ0ew YǼ,HD, 6F"0DPȲ3M /S!~Jݣ CDzL]mSH$t8>AMהTDBӣ) *"j.+6.<r9m,.MKq|C9~-={n|tťDG xltXfHOJE,ixDc'm.ըU^B詴\)#;3>l77q/A;+7(rwg7IDTrd>:[= i"y&0萈t:N`Fq!jZL\8o Ӷ[ !_WH]kV/jam&Nů\kZY"$aMb)I ojfwtt wGCvuq|z҈׈W_y_Ξݼju{퉿ByP^(K#iQk̯@tFܼZVc| < `riۍ^ItӪ<:2q> Bh0'<, #/XH,=q!x5y:Ǟ(-KĴPOyKx/\4jw_8u^" 3gE]E.Ql9eZBϲkBp:NYz{{P^(/ 1Xw߼߻¼S9Ѣç{Y$-/Ct!qnK?S?0XWu uIuL&[,P{DE  nE!eMn丈g*wzZv":EC__ktM !~pQnfeIono ^m,C:c_%>=içKEFCJ)gt[G(HZ̽?=_8zs Z˲<mˬ@_NzFFĴƺDTV3|lkH7]QV>(k5\RdDDzj5D$JfkBt8"ڴFN"_АskZk>uѣND 톴DydmbMrҼ^|C{h 5.tFV29Q[!G!  N5x~"DnLNhT)B㪡fkJrG04baqaNzZQCUJ6w |Q,>Gn\.U*d^*)j"L# C7vCMDu.PHD37:е~unqϯLtMoVe5u m%9;G ]u< LQPySFcfT*eGxk2nL)/@Q0xxŦ' &#%)0?~&|DC%XVpφxt(`DmP*d9YK|g$wCQ\.KIEڬ;59AVzA*yr/xDL0W٩2X&i;Je.+6.<r9m,.MKqEه@sZp\nt*5vlݴa)o$9YiƎ[Je~v0#=ﰳ{p5rJu6em5$S.o: \7 !"܊ KVhD n]ADz#qp:5--{r3+K |s{{WlCeQj@[ţCLk{e1]&>0[jZIk>nwuZmA-ݞ/@8Y3RZM{ey$suIO֨=X[ r8ۺ]qJ~y/: :BB "ce>̧2QMD}2(+ʼn~q_g9] qKYDt\SskI%~v7Եd$'#GkƧ(=-iRR. =^v`pLMᅰ/tetZկ:-ߔQVY20R7<04&u0jy!-1/7MR0 M]枡 3Y)*8TMG؞7fdNϹ:ʡfB@h5er)ģţiVڹd X'M~UfJ)i;W1"R)dNg@ gr "WY3 ZE<^ӒcP)GE:*a"8nrv'YƔ&lDdHWW ݖ1"H*+"IǗW-ڧ^Gk,ԣ'2J@h6:a.j*)gMC7ˡ!B.]|z2!k )Qh5 )Emᙾ cI"xY"fndLNJTUOЈE3I=260檢UE*|pj>!I,#r\JDD~F!.IhbrfDžJ}oZ RDB:I"C Pѡ!=yphttlb6az%Q6>]VY^Gb^TlO 6䦥8\N>,6ғsb,çk</Qh۶TVy s#ݼC~ZzV$'jGƦz@ا]ݽý|3ae$d$'j>a{ ٵ#c tZNq3ΓVj53q)s̳?{f/.a:g_i%pNh8ZtE]E.܈0l~)=ˮ[C߿:[V'?8wߞ;/ Byᵘ,ݻo/%=e'q#b u!45չx./덨C!K A05͈|XoG{R,,Be65յ6Ke-Bt:WWWWԬNZYYYw^(/ yҘf,E,3O?H,ˆ6ænK?S?/A"˰erj"%{[r5r!:52#I.xtxy~>:lm6wG1dT4 1 ]= }v":_ߖ?~b)';=.t7t]ұ ɅyZrLjȔVQ;2:yLZ%aW}ta7Uc'P2L>m9zc8G7^ a[g_pAk^L"j77\&"-0=}i$:21ApribZ Ѩέ&2[HOOF!@PktgO}`tVɉhl|&VMJ)L؉hfYE"Pp -*2"tNNN\1󬛑̌M^=8dKЩj[ R͇$ !P-=#"%+x+N;\21AA"Jkp! we4\R*Z_feRɨhH~|/|D~dm Zb>BCۘ5.+:oص4O)'͗y€O?;ODm LJDFCugzNŶL;Q^N^ W]Vl2;\yγq9)r"X\p9ʳkn#x\ۘu魆Y9+65@i)'@D -]7.Zk є=7̯uJ)v^f=^V&"Ni8.X˅̓Vj53qՆl!^%"um 9 N/swB LѢS~.%*tFaKM~_vM}zyW=SyK۳VM$[P^u^(/yb.:T.)@~ߡ vɐmb%wOL]$:>) 1anBȊ֭m;68z:d 5 1AW+gǞ(-KĄ>˳gMMumRg5UP8ꚚI+++7 ByP^<_sYf~eXmMnׁ~~/d64m}4lH,B=d2uȂ|uk,#C!܊Sr;Ve_EvF?lII -DLqa֖ba:(#=)1Ake*`*3r fgJ%(ѡP(T)ɺd]N FIN٤ ПkaJ 镊;޻a@cCT"13VLZ;iiMK Ceo_YeDdv,eUyD IDAT56O0)+1Uu-D$ :2>11=ix| 2l|)zF9ewdgQk{_SkVM%%ڗ$6"?uo2H(bfvmC$\H iCn҂5ѿ\nRV)Rm|s6ID*b&?{aƢ%m}5R!#-l,Ք!IhjIDi"~M۠7޹w[`a^)q.PHD37:е~uV0;[>8Xeeg^DZH i!-iڴj4d}Ne>~VxY -a 2Sn"fhl3%%%/\D"nljl٦~) #c2/@p1,˾yϑZRy>?*/4ss2 c;fcPZ|~iqnNf:O؛[:fa[^aH csumz|@a1;3>l[&gSRl,Z|ˏˬmjkkm =ˮ tλfu퍿ByP^(/\t}{Y$aDDaSuय़ +8JpI{[M P`>Ln ־ Hp+*@Lxpj?gy ]Dt\-l՝{ڎAm}֏Ɩs=E%Dt+zq^(o-}W#=pMѓ CD$ ػC,g-ѵ{t{Dqg>1j.HBĺ'kj@,Zúv7oEY MMMl+0G9Yiyf ÐOy E?ˈ.V!"Q7%7[.CmNG{ns@pDSNFEY>Acj3чn'm ꑑ+6rBKwSKׂ)zljJF; L^O"s_y ^YUe&!..w%ƺB9_;} ޒHJxݦ¼m*J'}4CVT"XQOX{ 2Rj3J ٙ)D4<2Q3a⪊h~د\ ]+?"_Gdض}/WJUE54u:DDN|C^eyA[g_p殚 y>9| 9f$"R>'R#8p8ODBA:,"09Q?8tE{L*&i?c^+y6>iOMqbkXtȂ˰.Z %@-;b"M˥m/n+IT~|/ˌ~d,5$kopuM .ﰾcTlLOJM5mΤiu: kyj5Zf&.7m̳?{1k0`/\4jw_8w'` q-:"_Ү"OhnD6Ԕw^|eW_y_w3TNZ~pp=w^(/ =k1  vD PeVϲB< Vv![!,4<|}@XVxöGY,!4#`[>ˏˬmjyp\՝_/zQ/j틵˒W&@`$vpq '5$U&d&7zoj&#ycj $ 0` m!oZlɋl-o+Zmվ[{ܿ>s[[R5_pħT罊zzz︈"^ċx)ԄcgYkShCvr9ٟZ:t:` ĸ2'3VT`R,C{p񞾁(=E 747wD#\Ufmkjkl/./ί$Ξ~ѯ^5\x9|WnO^Tso?w/ "G[ )Kuo8y]=?S(a^SoX,ξ])?$/l2QHD;,*Wߵܩ#=nҥ"VΛt>o M""v` ,Od~}Ɉ$x*[:u|˫RRm="drzk"Ѩoض|v%|W9kFVq{ꎷy<BKDQ b ,_lqߡJTnlXW~M.37'ؔf8pSټq͚"b͆ :3V* K4ɰUviQav<•ŒFOdʵ;7{_QmZW!"uǚ:|嶂tъBih8vՖnʗnm=uVpض.76ϐul+FfM>=C,XP-vz/]wl4E57 i6/_5SEdxdLDFF̴nTi4%EgPz(5ڗoXJQ޵kJDzGՆTH0("vO |_Vա/x#@q-;x4O ^Rj 6ts]}Mz}3͝e۶T.+zm ӕʲ·&?y q]p oܰ̔f|sZvf۴b2A5EXVHQa+*&U0+sVfbEdKueinP'TDtmu*-/-exdtKV.80/dM;6Hk&klڲƖjZx$b-x^x+H8;Tg/㨯Sf,xÅF[>= D͙JE\Pf}Uf׮f~}a\}Y /?)uGoݶ9>u̓vL"^ t\]"/Z2]heS`>g Cjn@Bqac g"25|jS>˭-Mphp/kݠr,ح"sq}>~}Mʪ,{=-MTp8S*jkk^EEE===w\ċx/Enjez)ZF!;xuO!?+J"hfJWrOWs)Z\MqXbgz-߮܊ @B`$XFY{YD>k?w`& WY[)"ǚ:#ۋˋk9u$Y=;_i=v|t2w*"=wpN;z~B#Qz8)ϱXm}S.xhoI^d]wxMͻiCtDx;GD]f?DDNbm'fp p8dV ;ch/Jvu64MYI tJTCGN>}V[c'[W䤧.\ёMJyw\/,7M' 9bE}/+o6 vt+m5gzClZ_}`d|eMWFVdoTyn屫w[Za{dDk(6oSg("{򚍕acSg֍ʯ\R;|vVcKLf,Dx*%D!,F\,CS^D.]VzihXDҌ)ʕQx}"2fwy>j5(Rz? c j@R{ҫC١BbXFucvdHKd,)egwĔi,겢_Ѧ ;],+|m,72;<~ӎˍFHCSAj7TٝvyyzR]Ymw:*K@"ZFuM~`ڲ|@_ A-<ŸG[&eUgy}oc֖T{W`p8)y;.E"^ ?5YV=-#ڐF\x'Od%GPC֦hp5N?8y`qeN(f­$;Y&{JW׬cMmm5U:Tlm[5u^ZϞݷ'GO}&9YsK_s"r%e]HsC+h DD z$?b1uNh}TD.%yYf>Dq}mUwXTRW١)p; zXSkŜ0guaΡ?ֵx,C:H(NDtX,ffyBk'Iv3UNNviiIl]wxu zC>@6n޸s7uto[DO.ΰY. c#;UU*5 ^o-^_D "rtGn-fs~r(E.7M'ojo3+/z%Z[%+0WDZ:} ψ.uUf5ڦCGFٙ;oݦ soV5vٝkWzӖ𝯯.s\ٸzPRycy͆ e}¬J6+ٸB+"%oY5R_kkmtLՇ~T*J~+?=[%xt"bwBsinr0'Zl_j1e,.]YW]*"Nu w}K7dX-i#cVM=OUnߺ6ݚ6gɈ s)S~@42shEѪT',PD*|ߡ6uF.4Ǡv&`SPڧ7zٱmmCk ._+Q#JQ#戥RT*|enڐ /*:z`vp}Nn+/`JJʃWT:ѷJt;\SQ\tskD^t%Ŝz%"+ͨ?>x~Hy^J6|@ګ.+zm &W+ ~*rD, מZ*@"(--{~+"2ko]wxy6˽_ŜVX-"9C'޸hdȕыC"rڵk>l2ffZwÞiP]Vgwڕ9+3A1"47t(*KkHqjռUwo~{pu sV|O4_ĩ\S蘒v46u}5ťy[z(TKjX`P&MbXyUےrCQJz _S5D _xМz`F~#?Ў~wఈL+ً/#ߺms|wޙ|E"^+qeLs[;y}b>s65IvqH1~VJc iEDj7j /u-Mphp/jݠrXb[wcפJ~ӿFv=&lh?ç32 0S^絫_g_i(6ӳoxO4j R O{$q/ER +548KvkS K5; .s/?`Ey/%gN3ϫq9ԋ쒲T|\טN<VT`Rӓ=}=7ȑs "rG}CssG=UkVȱrN jÎ梲X?g9%Ey㚲B9MV:z?:|`,C=?S(a^SoX,ξ])?$/l2qHDźP[˷[HlXWNvle"Ol:aED N'! *Ξ^݆tpCcv2Ku2(+)PnVjHCә"m\|%;ov{Jzkk7t?);=:6ΞtWj L? to:)@xv?ȩ1SPD *Uŷܸ% vtJM[GsE$;3]RfD$uUJդhZ|e4.J{SSS2mwl|ݣ"5[6Ux< KiqѠe+ ,)klD ĻP׉}ڥ[6SkTTk򚍕m}#cˠe,9ٶQ)͐hEdP0 ͭ'Ow[vn6mVЕ5"wBg/޶5;j6FF\.FfM>=C@NѨ7]KC#_/ HQ҂l[Nw ;Ӛmh4"ѿxd!"O[%"}TTNQOv]ڐ /*:z`zj%A;7ظLϘݥ4J6fwM CD$fQf*X^ZPQVhЧ %jZ>iSwIDATD/9 "fAm4Nt_4,h5h\#G)NW&* ~*rD, 0 R#5g[Bw9k{"r̍;6m\Wn4ECEZDDWu=X,ؕLeF t A NrƖLAwihӺ`P^_QZ ;(1g{YYY 'J81-b1WۺCO(^X }X3|zN݉L3L4=]:JS3ˆ鹾?s=+^~S*ߺms|wޙ|E"^K_J0͔>9xuq ۺC*a^2rf}^Ws]eJ)8JD)u'\.'GDj7j _l-Mphp/kݠrXbgyߣ__*E<>^DkKSƽ+`08qzMmmm}}}|ޫ'k9KkE۟pal,|ymm#^]._<'~2#ڈȕё+f2[Mf,͵)it>#ZԩwuyMÈ6Cj`iù"uV1RqV@RTy-"?o=GDw.n;"*]]RD5uFTs+VrN1X~=4._=~)ꁯ."n0=?S0[=%9owE]?^ޒ,b[ ;;Rw/?%ݽFG9ٙw]D^["q{ L|DDNbmg2N'!c&_'oReͭ]]V}둻T*ՒdEhYhԟ۾GgMkJ&?Vo;sҷl0t ^|=7F7>vmu+|tRl$Iv8Q5OƧ}**/7SDॡWTUUQ]ؼ2|ڪ׭sm=9Yʲ4?|TAVfkO6H{YQ*';=ͨs:&2KѠsJMKJ=H0 "z_"濴x ʄyucv2vB9uL[{n -Z_U*"Nu}c^NՒveM{w(#U;dgsSD 2J>G M"QZ׷cȥCOO$">CS^:5uUYI~o4ݐ z 蔴`ԉȎvl]iJ3D3lMJ4v< MHVeۖ`0pydt2[ʹ)G_9zGՆTr3U{ҫC١8 a ^}}}nek3g.FpŜ&"fq"+ͨ?xfRj/^e0Vnnn)-߲qrٸcZJ}bX3dvJDQՊ #G)NW&* ~*rD, % bÖ˳2ӷ֮D,mPi}Ѡɶ/jjV[]]Yd4|d̰ڡ{jJD 2ԂE7n_Ռ]6sfYDN[ZᲥM*46+vCuYaiW塶>>UTTӓ|E"^K&\^x;9cu/,>mIp%e`rų?y+Q_J WxFp9fٻո"t>? a` :bkeĬTb&\pCߜl{? !;X9a RD39u[Y.a?xNSb747wD#\Ufmkjkl/./ί*ᔪgNaJv5e%sZu~t$aX;z~B#ʏ8)ϱXm}S.eM& bs١NjoK=^ogYכnٰPRe"DDNbmg2N'!c3mHk;4fw)ÿ[3o[Dj-*M -";mH3Z={Ϛfjk4Zp {MoʹƜ~t^7M'@d;,+.Scv2ơ\ MH͆ʎdh;jzMEQYIVyz>w2<z}uiw`Qg6ۼDz,)klDp١^1{uNt}|dh@鎮>QTvr2SFD_2ls{g9+KI) ;-}*A|/} 裷xEY&;$< ;ђx|!㥥|aвLvd@Kx)hY&;! -)G(_/⥠eg`iY%q{hm^<]w&q3^)_/ⵤZdXZ<\/ Z hIY] wP[} -V+ή</ni 1Jj8{4wJ{~{7W+.g,-_Hxi)_{;,SkOs2o2,6 »{7o1;vh[EAJg+3{&:S ~wi '|Q>d}XZ<\/ C,x>7Xi< X g9hY! }>|Q>dH[r;zzGJP(_K`}KbKC$-}*A|/EY";R";D2%ehEMvd@Kx) LnsřLMNQ hؘj2:re.+V\&d.ѷD?EdF)<ޱw.+k"2Ǖ&o%vSV֦;|?ؖm76d_vx{[g]3<4=?jݶn]/unTDalo$;eKL6`}2[%Os2?IbMN_wgofwM3;ִ47\-ʆQ6!Aj\ )?MfkdO?ivox(+n1*W/ ͙voDvRC )r$[r\ՀmMpꘈTT _ g5Aj$ ;-JQq0|i7箛ڸ$nmN&ns;2wf;|d A\/yS9 Xoyw_P,"ݝ"xK+dj_;\OvDIK=5nt{Ջb"C,qC ڴU9d ?,"q!L;9-"7$;}@2ٲ JDa gzIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/PatternBase1.png000066400000000000000000001037101366722712400251510ustar00rootroot00000000000000PNG  IHDR^$6 pHYsutIME {1 IDATxw|י/gA wJz-۲-%%8xlMnnzgߛƻvzol9v8MeIVA X@ zǐlh}? 93̎'b)XVH!qNWcSX#c6n".N%+X#]`rYՆ@ӛS<}ԅhJJK8Vu fnDbsX(h8~v͸+}oz?ѿ~Gv뭷,u ,q~ ^D &? ^œKʇG\Mok~v[F[š?9qhe#P=QiUʊœ(7V_',N,D!xn[*?rġWdDMw>>v}* ͍š }_߿ˤ,t×,IE|s_t_',5iQH Tw7GjMܭ{>8{~~ВO{b'/<rm<*Gs~'C~e~zȺh;OA~Cnq{1S4aqol6|tDhuٹxsc{Ju(E"qE}21|.\,)^^찍Sh[%mc&%M,X"%"y챡~m\*Uj"T]:}B=F EX_{[*UjSW{sc{uJ7W?ud 5p+ ,_7ݱ/]AQihg%y}p_ۈߚH!܄ƿ=꭭.zkok265!`~66lܑ/K4qV#/}2O ɟx<g2wcVL11ZVT^[/OÅḴ"]oH򩏥tc]ͅP>pSޛH^+/u=fFD JnyƢ÷6%?st|T*+.)iW5}k_`>1E*QrJrm}bfMoN6 "9~,0Z(Fpmwe[(_=9}$ګŧ@79,T&ɿ -Muo}ou/||ȍ;kO?/< lNֆcמtGDLխZ?<S(dN8>뉯|oX'I]N*vrWhR!l@GAnwĶٚĦomKDK6f=n K ^.ztQ06].VOD 2,ؼm 'j.yQ૿!/<Ԑ#a6mz3q@,zO;n/>3b""mDv&?t᜗ ]DtGjRi(-=-H.Ojn-߰u,KLPH3, |HdjR3ͦ}r}|bLn6COH*;NN Z\.gz<2MIyϞ:\_Xr'}#" ]v\OΚh}V{՟ݮm_ ;3szM fP({H$eENN!3ħ@l|=uDT{c _资CBwnq۾5Yxk=Дi5Q.O@4>"F~$b!m͍.#&5v֓;_OXVD{%)'RX>ìegu}"R秗o>BV$=D4g( J{ aDB"G&Ff ө!E)Ʒ%|>1K_WHWҡ.ޝVЎO U:qPFw޾}x~A/'RuϽxS(KJ[[b8cmmƗt;va|^HDh\}cV&qy࡯ܱw9,f Ex<}?)_/uS SC©-0Kj*G¯`CFCI[iYYOwe(giF\T&MN%[՚8&Fgޯ1})_ #\r#\FAXh[T)?:6b"`%:V%)w1" ={Fqg髳/i] `n,ʳ s.O|jvjDƝ{?wϡvB0?'}Z.ħ@~IVPDyA|jv^U pF -k>{cp\ANc ǰ@,H^!YX;7E ӟ| R;oٷUp7^E`M $ky8! 5V`KDϿӳ.͹‚5^l|܂p-V0\HX}.qT*rⴱLw~73 x?Y('''pi @ #l-RO KKrZW{rc9²bi47Ģ`0h2^ ga' XnٽJrfH v7Ғyɯ]YDo}Ow7VV~ѯswlrwff3 u}Й/D}D"w6m6;E,U!''DiUUՈJ&>8\pl-ZW0ryр՚'N' O?ǿ{|t;rUMe b3.޶{`0xE"ڱm&K}rjΞ(vmH$$P =(:YGFTjbr;.]jbC)bjnj u:uB]O᫯ym7Ofgg_kG~}sw;}?wߵN?i~|hg\ZIvuvWV!+BeNPj\1Y`Rr"N d jkkJJJ^EDNXv^I4O'.SM3*,}2BgLd2)TztZF4VXY]]p j!RinnnMMڌCk9#S!F(3#3;+J7)*{y߄> gzl}Bon` \N|ĉ3jɳC̪0 A >>2:>uE`}%y<ؽwGD;m&w0KaY"ڶec.nJ+ZCg\vcgyEVA4V>e@DhLLL@LV,RsV~||Q}n˖Jty^ۣR)}>_GGGB}-85|wϧShЇG^ᄑ{nd#GK?W|4%%r/?qRǎ A+Yss0WBSvߺ aYlc֖v/ y9Ɋ0D"}^I$k5 Mnau ̎hh/"ٗ^BWt2K#,O'5{Ajp*Q@jH !lNJeBWa "|2) +.v8lw":~JWsU75M ѕ֎Ĺ\ FS)\|j@D?>ka»lHKv8\:5fGW& ?8"r6e4uky3$ ?܁Rjj _Sgp۶-X# cO"S; )zq|0y=>}HDDSQ^;V&˵a[[1IIYª<_p2)8x_wg\D|ロ )Q_>]iIy9i'sپgvRT u@ϔ_YϭxNlD^l<_0q0)8Ϸp׶  w ]ʈd8]nCrB\[sӭ#?f\?h;xSg;A]gϭ[q brx^DY|!GD|Yx! jsៃ2]Yq.56wP0`jWQZQ+F?>qG\?[He3 X׎. L6\3"ꆘ<_B!D;~ᒥcvFu`052JF?9ZAD=^7T]  DN9g!LJ }ΥT6 {r [7x&s?*)xkRƠ, zϿv "yGDfqT̝ޘ~ O vm+ֈꮶZ0K!\CJzw2|8DU%E9i)ݦq$ɈhCQ~vr% G?w ?M `/ y!(HM :߿rM%"x1|ncsg(^fH8:bX+[6yGSսCAhj  \8i4jF=N.6"`MYc/Ɛq؂g~Wi~y LX6>>nfL8 9Xm*p-/⢏W_y^.]޴byc>8wߞ)k9zk B}-ԋ?=3y6jsaZRkqkT`ٱ@LFw߱ mZ+k,JY8Pq#1%۵ӉCd>y# B`Ma[Ϝ9K?6e1?zeVĢCuW/)y"RC+M0Tf7#k .Ap)j~!'V+KDGO\ID'vXP KyQpavz|"y87P^ܩT*ٵ<#-E*~f4W5s]Jd4}/'ud~dKvgP`ުQ+ 2 2Dt|-:z{hj5@S)/UCcO] ¥`u g 5Re>H&'d 3[:-PȈhpht"vAJAD흽^K.K| uX&>g}_uh~H"/Dos8\*\1vK%ٛW컑פ i>yAA`^j;-^/91|>t+DGtb}W۷d*RۛN[;R JSeIQNZO8dD(?;9r'sZ )极 U ".mX(*)5lj  =r>XiCm%'[Q+IhjisaѨ5DR8mH gs\5aSN wwDL+Oi3ی=a"zCSۺ[ڻB x{)M+CٻoO B}bגvy k#3$G`:Ǎ ԰v!;@ D(ɣ~s0Aؗ0)9 qX ...ECXPpʭQPqyl\1뙺tN9sȏE_Ц^hj5sjZ%BϢD\t:砯Z222L&S B}x$f^s;s7lHb~ˬ]\0VSCnׁ_羋/[Ӄk95"_3Je~3 5h2mxVUd(0;|]>]ilmAk;QJr¶MJeobU#'vkoᷖZR|w6}8[.?84Vdz}Dt]?REDn11V:"H O [o'#ßǧB F7>Ԩ;,#^˘ UJLQVH):]^@Pe`Y᱓WBk]o(x}-Ą,R.;~f&IoO00YIiV(p]|"Qȥ_{"}Z.xثThZ}0ԩ3Ǐ~=~kس֭8 5{voըyyDu g޴"A'z[fpwn-MIlK[+M 3d۷gkRbF6sH&'d 3[:-V~ao^PE=8<B.%M* C 쩡.N0S‰te=:Ն\.U]ř]봏ßD@4q !LJ } kֶ[x-qH$zч22 ,%hАO=~I$kq3wUeچ¼̭G, NYt+1bDpjmP Zͭ=IeB* Tն\ێJ)X0Lu}ut<('w#;IMGs>|>^͚ßD-N Vo|ɉDCM ee$9Kin,+Md@@|-z!L*NIօںe[ũhT\:VSQs[o,heIQNZ<\&# Eɉ1g kkϞ[xAZ.Z )极 U hٚ*믻ھhRZLqdw#Bg~'/ݠ˵ hm-.-,H!fgLjȧ|{\.ɔ'J Hhj  'FѨ'iCXnی 0j>'cf2=H~qO;z[%߽~8|#!6yjSHL#nD|k:!7w_Ե-~(#5\!^}xyʺtz)G{B}P_/U;vWU "9F쳷Y}P (=ep-}Kh$o.'Ǎ 5ۅ@@D^xXSؖ3'Z a_¤4`Ma|"fow0y2Ê6>>ұK^ h T M&b|}^_CCMKsDY%˝NaUVVVUݷ< ɴQrye*%YrD(|![Cs {DD>}Zګ]N7+U'O}3!Sâ+2mEy9i"{eŹ흽 LQnۼQYIn^N?.]д"j3\E"X?LzAfzb!eLXVQT圾nZvgPRw[L|{iG!9!|;ԓ;kqZwnqRN/;l2]^ܞ:|cاRnڶNU13V+RړjI 'oCaB͕u;)>6"|D$L#IOl)$ tΗ*fhrV80|q;<˔E1\v\" uX&>go[6eҪ꺖uY۷FNܺ\\Q)ʵ^}xyK7mX}pd=_/ Ӄ1;w̹߱tcCZ OU} mzۜD}~VˏyKOÜ<7rp>bgrqv!d;@ D(V<ؖ3'Z a_¤4 VeMq `Z{,VzH{ }p6e4uky3$ LܔBsJѫU*D`[ 8[:=q䄥*~qO(X;qZ\ (K:_' 褁45o(> Y*Ӆn# !L}͙'9DD.746wD,g=)5%QOV ؈(%9aۦbBƲB7tEDW;R Z򵷎[I-KW)e>;XS|Dg@oH{VaTJ9jHNV+ C6?Z15ET8WEly}Ajj\1UZ:o1H sx%a/V[o ;6>p|ܩQ+wl)3$'XF̽1#hV*dZjǶw>8EDJrwt ¼, Zx]VWfh*KXQZ͉ qY\vtMf SqcHKPq\o ɺʲ\;LD %2h`h3q_uvgPy!#Gojx=jʂ̂L"jn:~rhچUW3oQ]F3tZٖWB 3d۷gkRbF_ҶMETrM< @Dn!Ǘ§9YIDd254w3 q.;7+I!ٜUu՜-k*W\ܩae>H&'d 3[:-7 [Lj@0[PE=8Cb A `a`kQIYR}CCãֱ6#"DZf-v杖$u my[7X V(d Mc"V8lk 6Ug'v ۈ*Jna"ҨD~-+I4yO?-7[E9ϾyMjb?g`A^@:wm|^j;-^/91|>0!d\3p~5[7UJ_w}SE4.?'53=>l5߆[uj}fpe 쌤8">4 zBy0 f'[eE¢ߒ/.z{9/]޴by:~P_/OLk}~K7=НWTR9ԷQWw6Nw(/'756RQ(#rj4j"bВt$n!gN Ow§ͭP59Ye%y85CuVw_!+-IqqdeզΆXA_Q+!j&3UJ٭ʼ>U 콽 No9'򾙈t`,3oUqOoy3–2eŹƮ>\}Fmkzj↲>ːud|eeg$oPqw [* jۺLjHb&^&"U |>\SvgPeDT~r9]aCcGUmK܍ Cyv4O ҉Sw_~07{>rRXQǩN\&S "ڹ58fu )z`zh5%K UJ [LjHMISFDhD`YP^2)9?ƉH&xXz>>NS[㴪xJ SCZn@.M\p:zH,RC3,Aj8pU8M(^'/Å5q|ry Vo^h0#M/ Gipؾj('w#;IMGs>|>^w\ojXжk[yiqB!%T"o4^k*+)'Wݼ,/?'U&Q!ڌ ѵVL;QnV2^|WYRp9g5O&$ɈhCQ~vr%O>Rkh4u9Y"خ6u_h8*|Ķ@0m03D6{r{nB:py>>;dx6ZVP3-6NZQO$ӆknP~fjͭ]ͭ]SÆDW Min5B3˱"㩛LiXa&|w?0cl^}xyʺtz)G{B}P_/ "B<ND-7.gYן_:q)b[k}isoRM@Z@RC@K$Ra^6ӹBvwz>eW'.4=x)hڱ!')QwBӗ,(vvnIJ-_cY3wߵ PBY( eR;5dY6/D*1k z}I !F0A&J)8S:P*]5uo'"d YPBY( 0/ZtTyZfckk}cc kee[ʶjU^mʜЬm%%s‰p0 ==lkqƸT<)ވA/g?8Wo PBY( HuQsB@6C#..133eEccVǥRi^ T66fu8l)^"SҲu@(j4:\922HD))z} qccָ8=ˊBeE$D$rZU *scR}|LD׫7d&k-,(\܈Mx؂J__B2i~~)ʺqe2!BY(k-LV`fys.q\oOJ eys?#))z{)IIVu8l.vK>GGXV\TTRiRD40-ʋg)][ijUvΊX@ 87Y(ƕ ( e5VVl>H,ϝO˸\9D"HILMF"DڔD"u|Vq^M?7XܬBrR'8Bb^gp gH_|I$o܈DY( e,`}BY"JT6::ZR"~'B!K{ IDAT1"OT(T^ghn@:hTZBi bX####ccV BId~B9|z^_n}9\?RZqz~~2RZ817bS8LDܼg1 O },PBYKnmPPV*5Rf LTԜXr`/--[O{P%%B!O08ؗ,ID"U(jLJJML4DbRD~>kӎ 9#cOK(hvVDTJJ?2QBY( e,+[L]%\P#5#PK%Ð7](+YVqr8dDqFL4qrVLy4SϜ8qq5\Ksv#tcCZּ MM5kj56^ ujX]}l(DzZkkkԜon Dp\mP^HDCC~Vss dj=pj(+d)υleʛV ?YL B}b7 x2 5!Hf®|80^jxe$0=/|CAt+ ưKKy a}iS5yo""bf [e;m6;||+Nq3 L:Ǣ/hSчs/2>>Q",ؒNsyʪ)+##d2~P_/?Q_+i< Ŋkls.qy ^fE2<rv<]|5şp|!MV Rߌ8) !*\~  <)Uj~kĬn%Km}ڬѪ&cEJckkGiLCya. 0wjm/ii_#Ώ<[?DDPx"KD.5{Pgk2Opv7MY$FaL. e;p@wV^R!zj>!/ԷQWw6Nw( i|j,v]d( tR""˩Ѩ{CKrGBj|ᩳW]԰&'+$Ofꮶwt+>=Dt%=5).N588rB}̔`1c^/)1NRT/Oyc3MP%9iل%"?D !uJQ~ݛ.S_7!^s r×)+{<X%bц|]T흽DTSƮY]HDyQ"҈Q@#>W ~X]6di֨ _n "S>4;LCcGUmK܍ Cyv4֑雵؇cj6cOQ~zאHDަVF-uW*Rړj03Rʈhxds:FDJlJ2j'.pD`YPͲͼcK>^ctf{VT""q>jD@4q;Cb "bj6|åV)4md&x&]"7{].L&iinO&R!P컑\ i>R^Z{_zSچ]Ks )dQ}OH$ٯ,M1Ȥxʒ?y2$ɈhCQ~vrϕL>@,II..K2u6edsx]aC10uv#B1fs9.nlHDi) IzmcK2tLZFUs\ 'FѨ'iCa 1?ɫDwO3 ^qfԍЌ 7q46MEνt0b|%=/_\+?s_Xisu#{퉽B}P_/şP[Pvhl3b"Z &e텺$"9ǃVŴ64Ը."cG굈VCɣ~s050)9 qXsO\$P;}^_CCMKsDY(˝NUUUSVFFdB}P_/Lj;2+by RÈ:~w ֔Xf!j8n"L',f`ZʈDOV5ks'GDOU,;nEFb@pEZrlŎ-'XqvĞzNnf9}NM!i|(hW2"j&.)̯&VS?Dh|n^n꘺= {[M㷅-ǏCDWnN?Wwѕ枛3GEDM}fS&pTF"89+,9,Q A)D%/+ &Q-٭v(lѷ`we;r2= սce+ Ϩ~o9\yY^ѯ+2 ´bVCAWИ2=?=4";h$%,r!MVOD2ƚbKQ9ƻ+5\&x^׋m} -kPu ^1FD"=jJ9Zss2* uZs_R]WS9&RIYbΓҶP+'HH^);Ȭ3Fˌw jMNޚ&*%q*o=Pef&"hc40CӇ'ƅINƪV~ ~EphAj ~#79{zveѨރu 4sv*haQ}{ʌz\QrV~aڒ|ވ0a#G}0bӥDDz%r,Nﳆuښ:XFiw> =եUj2'kEGT*!")GV U_SYls»TQ I-VCs!2/R Ub ޟˤRYN b|竫i %y93]vTN31~}}}sssb26M|ׅx!^8uW}E0BYkoN^Hpyw5n/^K?W.H)bF3DէlDruIP!JjrbH^PN Sy KDC9{}5v6掮ȇ+v.#nT0By>ޮu߷΃D厑)aODzctt ^8V* _mezGd"pzĒt=1Ka[G0vwOM L,,,DW[6BDDe"gyCGKwBj 2qi5/-.Bj;404Rh`$$]h?8<.Q]9njj+{-yk5=]|EPyZ@xjM aeY}\QnwtFvU bh5RjѨUwUJݚmy;ģ_oKDuݜ_!+=G ־3yt ^8V* 6D|h,;8zG%$qn#,FïV!/dURh<5iՏ=zXR/,v v)g)ŸzGP;P# ~dT9\NeH /}9p\H D&.wQ3|DBk֖@G{WAv=3Z *UENqk'gu"j1m02E_Xg6J_0[O @jh6Qg2ѿ\55+p4-Mi8|㿿g*,=ogpndNЇWWZme4}ru͟b` 2: Shd̈q)!.Je:9+R.O~m40ǿye٩鹪""j;d_гE[k{oi@n^ϐOm@W|EphAj nGRj*v/?&d{OV4i4*":X}:tN6;g'"/Tra’9wiD"o=`.UK:+ftrQJJ 9g5 Jqi5,/-,/5zw1y\0цDrtk5[3{ yYo$]Ze"')XjX-+6}J5Y,~y'.WY weǿ}xl|el"˕vzpmuF yy"=tWZ3:Mf&=G-[.F?e"Z μ<64MLYg?8wa]x$~Pޡ@by )ԛDxܨóRv "/R Ubi5҅ɉ@OeR,'ׄzH^1JN<|uu"MA^F4)kr׷xu&vYoKam>j&b}9/gtw<1ߎjt&֯onnNLYff/ B/ǟ.0pfzr>+y7 ylRC<ϻݮӿxg/_ |m\VgO6%cP@J( ya^CNx a^C;?DD~q6:4wݜ~&+=7'gp4wtu D>\QnwtFvUD&^PV({kˋ-&J926k±RH|h,;8zG%$qn#,FCI\Z ʴ|g78< [SUpVrD܏J""ɲ ɳ#;r!5޵ƠgN׻p 3iD``$$]'k'ntኞ>!%SyP.3vCt:׿Vh4f/7ݰ/_Rb/-)iԜ7~su қ|EPyZ@xjM jX\X@D־EKːzEY}y~`hHRlڡrw`tm"4H%l#) zL&e/7;gR]aLOWdCk?8//1Sr}cYlQaFE"1VbRB\Z U*%kW[ND7/7Y%宭*-_Xtj2dVeD4ykP3|ƠA=zhzBy::FǧӾ@CvѩN{-[3oFF!ťrk4*V^VED3 ?gHQ 91]RTm6Ldgs2"F/,:()iDVQ}]Y}]rRÍإt)QCwEcTPj9A Nqi5**-:FFEi2LQ6 O.)*(-6U铷fĒ/Jhbr:F&"Fv{h÷$$!L6 U_|/rlRVlkXĥʵS~A|ׇGnzezwDnڪZ)_U Dz5Ŧ1FoĕBk&LӦKam>jL#ַZҋ?}ԩ1ߎgzgḼtqob:#G/ B/7MjmC]x28jH IDAT@zИCDRCjbi5Zn"Oν/P+VCyOw.LNx,Je9&@egS)#`2ֶt'QV; zoM}}}sssb26M|ׅx!^x =evW_p],cYIQӵKTnؔT*).3r_vQ8IHmjnO%l`xb)kJOJ6gFˌw jV<?5-:”JKLD~h`}Ю""jiS=r =wlPmȄ0i[v]QA^f%?)l&"s._nIůn"Y~32Z ĜYC[R+==ؒ?2ƠcJID D`_5J":Pu*QUof=UEzV+ eex>pkfu%<_m ߞ:FRu(44r~sD)M=p_Ced|v1N[Vf.[Q]OޚZr鹍 JL5k+]`e4wK$+ݷzrDroz.I*/9yMAAX)+6}J5Y,~y'QwpmuIV~޿o`lOuF6n,3k4J/ԙ߽qT*!L* /3|=r٢Ýid23"j1LD*r6FN"!kHJ5Ŧ֭R[ Lں]e"sӂIʵ2F]}#{B+ӈHQj-BjLWF,.]*z$$N,˰,L W-@4bh53l b>qenNǟ4M:fW~0BO.֣2XjI/SN|;y띧y21~ֆƽ)=,B/ B'x[4aTyds!Źř9;|/)ƏAs{3<ϧb˳>'WW=V.1bh5Zmn+YP '*/R Ubi5҅ɉ@OeR,'ׄzH^P>u4[X$?BrVk[OwgVNgbnĔe6m6 B/ xI c,y7 N&mu쥟+1M^S uIw؁J( yI-g 9H ` bw(;LD~>26@~]]W]FD-%u%:ؙ@6BbbT*۝#c]߁l/+Q/Nʇ6K~2G~TB2pP _8=bbt:ĥPL; zq^05U%SCDepd+9HDDe"gyCGKwBj 2qi5kA8wpafz1iOp:(M% 3 VVna#,ؗ_H/v^R\6Tv &nj*sWMIQ~xj˪,6^5a+g7Kklz9=:;Eh+ܕV wzѯݺ=pryZ l۫ؔp9w5 y*,+vB_ ya/I\Z no~omyqR Hvs`S.}zek7 횸5id 2~zfz/¶zVgx> :,òL0)\+\1J^"FlabC'ƺh-Cḧ́xt)G`VKzϝ:u2[<̓64MLYg?8wa]x!^%8ۢI :CT١m C=)VCPYCcFI}~` ;UXZ 6ۅsK2T@P ޟˤRYN b|竫i %y93]ējt&֯onNffu!^x!^?]4a #%/\!5H #n/^K?W.H)b&g'RJ( y2BIm5Db('%sGLjK#wR}LܚKk ]uˈw00?"C'B7;go38< x;}~‚6:~ݺ Je'"'C%?e#?*!?8(s/e1:j@Lj54[*[2kxKv[GtV)h~a+r>FID6T65Si3rS~əf6bӥB-ûb̹cTPj9EͱAm1zPE5T[zG'";]nZ2Z"btnFu?ykFx)\.=l2³S.*55=GD.GVLYVKD.gtF4BwD"Fǧ Օ8_ܳT_|/rlRVlkX}aξ0wC7=G꒬LCC?)boh]MٞZm =X_YYfh>_ѩ33_{autȐmdw[.~JD=cjKʊU4"2gQR7j9*eKOu{}oeo}5Ŧm|bFUW[S>85-Pgz烙.2,UK@ $ ][Z.7-7|}'Z3a&86] kGQ/7?he:Ւ^sNF<;O?dbn {S9zX|ׅx!^x Nhѡ:o>Xl|>dČ_}_nVDj 0, |@Do"PeF%!5\r_maޔ+䘼av?{')E|8P.WqjJjrbzB ?HB- Ņ){0}Ee4wtu D>\QnwtFvU$s}[?xB![[^l1V*Α._O>!"k|b^S׀c`͒òLjZ G,yYN\T橡Rvǽa`kJVR$Mg6I#ZQIDp9Y!"y7t$r!5:#/~.m5=pÅE[Š?<(MDyFQ2yʵNKD ^+J.O[Be1:gE:g7ٲ2=EjUL&r]6#o~㮈?LDGEv`޷1I<5,., vkߢ%eHDs:Ք /39FtǥRiyؒ/>LDS҇G&nVЇU]Y4<2(FoLnR=ޱb1ge+-=D40|=4kX(I$u=y9D.#[S3sE9}#mEV6:~6zK(-`].$?`ٕ4 ;{F(7`6e|kmf2ZE?fdB^6m.[Q鴚 55ϬLCþJQȃXXʵV4?z3tܼg%1U,˂\dujKxoj_Xt2WA[W]|K}qKR^ "wwԐsb/ۄSXE VVna#,ؗ_H/v^R\6T/;M jU,箚0q_2=wМjctI$ӳiUK$֎͞eLFߋ >z%r,6M <=z_7O \0gw}xY]~^֩7)B_6;[ozreeS+zQ}ZFoܩS'cϼZv:뛛Sll. B/K);/涒DSï|xs嗈^7- :)$Y{}rQW-MC<3Z`秆r'y띄t5ae( B/ <éYC?)H !Ё\ׅx!^x vNe: ՠC!:P/ B/:ѡ 2ʷoF@R{yq\H ixD%@ӳ1@2 :P/ B/:ѡ eH5 l$H !^Ё\ׅx!^I/W$A2F2ljС  (u]x!^#ѡ B2PƔ/xJVm9"=*7yNhކ/g?83O& {v]Gu 6WR _%H;5xIX^HD`+/ BvuL?h5Oj Y#/ B#B/ .)ޡB/ .PHz@A/ B :0y މxWrP(1xELP:!F!^x!^#F!^x!^#XB/ .PHz@A/ B :XB/ .)ޡ)!3Ȕ 44MXY. B/KpTSFj/@J.x @C x!^]С ?|H]F!^x!^%G(Sc[L"? / .7wG?1N #b_ICG˛g_;7NQ/}QC7ndՍ7IDAT& %r" B/ <épg (<9&cUB/ .PJ4=`/ ep}D_ >gẅn>˓Wӿ<)J`D^ŋGx!^qʰ%G˛Ÿ _g7 <~JG:_YS?8_oܠ%%Ax!^q#e RÄ|mZcaIa78 4ȷͿjW&<'Px/K:bLXrR;%Y&7 >w~Ï|7e[ 9?BY( e,yTjat)`v 9^GGlAa+xTx:h5ܮ|1k m_ >']XYDa?a2l ` D}/<5ܾzIIfq'ωػnCZZZ˲,~ 0"5|ȋMAE@”אr!* ]Lޟ^I+S^_L:t$F`?2; CvsDzD)%`T6e;Zx߆"yaÌ( e,|&pC4mH @R*1{/D#Dʇ*@j+t(@:!.PRCcz fGY( e,\e9z8)ՠQBY( e%WYx @RAF($VH VB2C!JPPP_e,PVruWfGY( e,\eyTÍee `%P t( 5X e!*05fGY( eEA:DYw,  0#?BY( e*'I?P-`2hHf `%t(@:4@D$W`= fhOװ-e_/m`'- 鯞IQH a#o?~x0"_=`BrR?ؾCDۉ*!lsjxC{:7=2$vX5x[2-5t""Dj㾒ʾLD-X|P 156vwu|`ywW]ЉB! /Yt>?:ٿz{;Dl伜\+e7.! /6n۽۹y=-DTZ;5OTT#5;5Hzd?׫OÏ_wy"RC{; x GN!!;@NC-z[o5?X̿[\)CXH5D^x /z0rE/55D^*Wo㼐ydջ!$ * N!Dyl5뿢0BDz% ---[?e/y"RCy N ߾C/c8b>!l󟨋p0fIk|^U*M /5|b$ + Hoœ$V~h'HF/p} pF,FtIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/PatternBase2.png000066400000000000000000000755751366722712400251730ustar00rootroot00000000000000PNG  IHDR^p pHYsutIME(h IDATxwxם/ߠw `XE[d[KbَKlݛ;):ٻY:flۉ;N*۲(V ,`I`CB HEQ7_{~zo@N D/A0r Q ()#Wl~_ #Ob`ƍ a?:^u!b=3k[MWөU91h"6VwdVCX5$^{k_'N{Ş₌G'cu hu&̜O7 ,:N?ex8`t'8/x[U!\uDUG~SO5c;'>sn2)aGs ʥG3~E~~PqAFmC{2,*ȟxv;xf~j6,=obkjnx".S뾛cՊ+s zSgU*M0+Œʪm DY˲ٳJK6huL۔=4􉴷ynD:o K\.ӟ ߨRk2_s͇ )+zMwpPt6t0mLb yYWH#ϟd5rKj6Vuv4w*(* .]_f^"zWGFSv}ӡٻM_CWpm޾䤿Ύ#m_ 9}??BZ=Lf[Μ z.;·cgN}ynH2ԯ'V︑syeG"9gŅ> cZ&'D:{sH.?R/9|#4ݎI(6n=MD%m/~׿Pc#gN}|;Ba`h87+-gN}?Ö!I)iL6'?wbrvCC%Xmqmܴ#3+_":h%NOD uL-_r  =㉲t{nr*+fFʱUƋsPa2f8yܮo34'2_Rl0 ]܉<Mw/텅fFD~ fyޤC6Μt2ħ{<`DY-;XQZ/~69aBܽ!eu# Jhdw㟾w1al{f]W+;HDO}]*vx/1۽==)Gϱkn5FZ3᧕*u˷GV1kϦemu1]\|p`h|3FFƈpH,v%1))QCL4dr"JNINkG^+7h!s1]PX,Iȱ a` n}#P=>sDU#u! n_rX*\#+ Z^{go /7~H ku}>oK~=Go[7⨣ܱSv:rLӯRcjMzD!ENT*" }&ˡQ Lp%+l{񆺳so|&/܉jPDDKKo~^RysD*zkK[GH7]+s7\8:|w?jZ j-8 =9vZ+6VRҚ\) ibD*%"ޞ 15ەX.4ܴC.WXGzM'D$S(NNX\.gzy4q\_.Q^vJ,hCcמ{t]۾J5 3sz* E Px{^~9X>?IӏNΝW]W 5 pUp#'T|0@!uwrӣ=(czǾC35VXhk֭woi5W)ͱ߿j cfOlܼj=}'^_GGAR|rD$_dHJhmv9W=u$f=7W?Dw~I*dEA)~9DM+=#[ӛ/1N?b ?F({̊Q9;p ~bC\5()7!tN!_ybd(`CCCVN c1*3sӖ]1ܿ}~~:dn/RBWrEJK;d$k#mCn'|\HDHBܿqӎ Fޯt9,dEh~>oˬ kkh:DXCa͗0&?߅ ?,{i(U3̜tDIW&˒S(kF]YqCCU"l,嫙pa/vuE좧jF&\H9V)W ˞{#ݕ\5|h|/kmǞO~/sX&TgM\SWy+yjАí`mV~_@鮇L2ޮW+xj;'" Zyӝ$`MD{QbqX!+^k`k珐 zMm#B>I Tj@>@!kUk[z6fǞ"V7Z]y^F&"H P!;s`y !4\bݼ{zQy_=O~xHdoy[$P(X=[bv >;PWչD9y+KRS,,YbbBJrRcc3beeJkinoTٲjⴛ7%@ cnȖU/6`aNPs`:4ܳgP(h5V칋ѷdس{{eEN$kDjq=}fͻV&!1C7.{bƿ7sJ0L|B_}ARSLD~=26f*GVrJ;^T\\x?t'wώrp;=;{Yݖ}f!t}xSvRkiYFAnDY[[pe}uTdb'rssgI۶QFzZhG}{wa4@Qϻݲ-;d ϻO\rt9{᫏>HD }}Gb0$ƠB,Zчu8O ֏AK[kGY>Kl.@r=. ȜՏachzB!8BM $-5 ?3Җ)IDCz,+ݐzәjL)P8opFDٳ-mCaDRYQJD$4*c^CDr3}>|By[@ O@3W/s_T"7V?eXd6d^Jrj~zjQ{a* y^ۣVXJHX/э{wхy?s?fqwА񶷛~?Y]>5?aM322Gm}CSNvfiIMLLotuF|CDS+Չl>C'0j0Lņ˿n܅lYlN' ɪ0T*Y/KDRv RSa&>>xV{6D#^MK9JB4rvu=[B3B;J"W ~C@cr/XJnz `C\-Q%OBC#B 4(p`\C"V7Z];6Dx.|'O]ko XW+xvۄݶZܱI(dX֋@[狊1kM>@@$|~ąF,YXp1q!mqQDD a^ c½ /#޹d]аr;uwML]:\~cg[fZt-t֢÷lF%[gqZ _ſ>տ_04YYMz;:<7*jsl3 rpx}{eƜ$ٖ/< |o-;7$xE"n%JCyar˿||94 99E*uwt\z=Dt~` f*gRjeQW'b22KK7DXz:"4 #~/u" EyyT*jooB"*)TRI'WTTWOzzNeJX"FTo؟Хgٯ?8?|K(.qCyX5aqa0Rqb[ SSl&sfgYJ'E \=9y,)=.?ϯ{Bq,9tf BCWņ,QB:HDCfs1INNdj kEk9.iX$?qÐP DJZz:(4 `e%r8wDJDNTh$ɉjA\xY"Ϭc߰P ,cҟ-?|9e9J(**@JZz:(4Vp\>J+FFzRBZGajKHK}ٳWÇ)+H'vW9K SJK7#cpe%!<pe54`LMfp ##ii9 beYZ|1f'23339;oټccT8߼ygeĥx/ \#F+VQ`=D40Ӎ @04ttS4Ǒ|||T(egetuآ,ɠ2MСPpݭd=Dk6,Yxӵ>. [j՝?8wC>C\ӊKXZ?yP^(/+v5g>ZFwU!"d@L&tx+( "C]lno Mi(E¡L&ݵ"#-E&>0kZs]=ՠ~pg2&i.sI69n/e$jjBػ53=r7u &!AgLNzw2 cC7ˈ.V!"Q7&7S.BCX84LKM"[1^ s&|OW"Bn(fn(TǍ=r&,My965Nr2t7>\Ah85jT;,ˤplC.-6c 3vl-#a˓azӆ k^/?\"\ 8Zb֤|{UA^fA^&=qNCöޮQZ{Ϝo"bYTjѱɣ'.zY?p9X(o.g ."4wuɆ40?2l]LJFF'B5j%uvxY K] &"7O XXg9 )Cccч "TpUx_3t8̔UE,5<^QNƓo^j's>x&|cVh\;ofw YƼ,l'" NR!(L695mxɴ}kiQAR!s)I!ugu鎭@C*U夥8\]u#\ND >3/x-6S2Rbgk<"kغDU4_h6f|{捅;]?8dE\%Ni8f^ͅLVj5AO@hj :|?lV2!^ 8/t)/ݷ2i?WyKʤ޻G: ByP^@x2Z" Ic}Iq#ASSBFR IDAT@X\ɑw!`]6:eiA LJNC>+#=QRR!ivLXGEl2φK;tzwoH$?HWȟ 4{7glSS][kTYrR(NseqUUUMMʤۻaDU|^(:/ uxҘ{o:-|q;|dLˊ>"hiBõrv^Է ֕~J̆"BCgP 2C&[uq!DObɲ ^lZ ךƖSCDt+6qn0Ype?XL&ݵ"#-E&>0kZ}n"| o^-ޖ'jqDdϼߛeLj5]惏ʹ9n/e$jj޺uiHmVdb!.|`݆nLOqmIH+4dfynC% ~9\NVCDDopMn8].VGGѣ1II,d_t`Y84LKM"[XN*;%5ŐG׌ۈ(%9aR. =^v`p\MBDR :oZVY<0R-/VȥBFF'^n%;Gja?8Zƪ^曎#BCCeGG(ګo{ݸzˢk Cé)Vڱܘ`7X&mAdV):zǶ=AD*rw ¼,H$V%Y=}}z¼M/i6$fU ѓuяM.=1a2Ҍ "6"2 !AT<~F!J(R]{UH+R wkY\xĩq=}>߯_yq /X =s`oV*,$'.WoqbLGW͂kSFG&Ƭ&ADRr[UKk: 27o[!V*M-]#E1=mX JZI4j֍ w_ޏZ%T0LmcubjhQNƓo^j's>x&|c߄u+;;+[~,yۍ6c2edC</d@QVFB!LO^0ξt\*E^󻷎Go0 2IJ>tQBHpq*}fn%oNGSTD1J('-rj I!Ƣdۜg^Ka^'0nI{"Xа͘"Xg>[xEm'NUo.ѨU^Rʢ詴\~Njf>l77n4; i"q:*][!tZNqBIhp'O۶ *ą~]+n"wY'?c2af³ ^}]=՟z͖^%R?IDzНw;LIZÐ,!ufGLG@po6dWG),5*K>}+sTLZ{kP^(/lyŴ'|(W7ҨD4isOڣYz 7Uz=uz-:a-# Gh"ąbòʝ^tizDbQѷ*N?ߕ 덠vE\CӸ#Bd@ i=P{2ttS? ? B~4Iiزz_q(G{B,|v|w^&lhCv4ˬO~**+&lzY/T,z\5 \AUUUMMʤۻ ByP^<_s{Mx?1-+bh/ĢEx jhqz?S/XW+94DL& 1TC  ?! M8.4BC01;x. &eDZiubG$٨Q+Xpe^at;^FDp9Z 5t86U̼$5 );U H3n/=mDTnLNH6" [7mHzً v^ZQ+\nGj\./?FfblCB. ,5x~"DnLLhT Yzf<kEi`izyBârmEy9ibsKr;JNڶe;~FD她y9>`hlCNDRrya>5ω4cH$8w#BNfU,ʪg[iz w Wf;˷9;* +4t]m-Q]jF"jnk4T޼}ޝd"r8Pc5C^ܞҜ&tS4Vwo+V)eb\ju )rzh5X;8j?MDۉ"N/Oh8 aG 7$Tbijڈ˲D$L#Kl!˥JlTŅZB${D"a Swh)p Ro t$rA04d|֌M<.We #f\VSZV\}kYx:ߍ[ˣPȴExvgI1-JގycL*i03 eřa+2" F/V+DQNƓo^j's>x&|c_$Xowmh(`DiT*dY)3XZ0[.tVklNJӨܸybe}~J}19^.&'UvfL*ǩhTJrR.r9m,N68\N^ 9~)xpx64d͎rFu[7mXV2$+#٘Pر}KɼyO/$vv]|CR)c}Œ: ZL2as7pk!;Ni8.d˅LVj5AOXϘe!\KpNݼjMC AHjHԬO~**+æғnu^}V?WyKʤ޻G: ByP^~Js7v)cg>2eEZPix{$|O$^{ 덠ν ?9@ DV+S? ? B~4IiX-eǞ()KĴF{(/!z(dlSS][kTYrR(N YUUUSS2ieddByP^(/\PPv9 Pf~EXAhkn ?~,Kh(X}P`d2eȌ|XWBDx ,5Րn[NDz-#ktj[ZLfWĹƊ\ ͆ 2t׶L|vdmh.g|>nwuZ A-ޖ'@8Y3fZM{$s3u?~/+%QV#ֹo(ػ0?#gLNX!{pjSm*P*d(P/e>̯DDWn"_E~y*Ӆab? Z0-5^hjnc9D/z/$Cbfw=^36n#mKTJH$xفs5nKDw 5^J5&贪_q[^Nja^Z%g}~H]C'뛿DwИX,ja*9V7cr|nvF`]) J)8>:S )zsr{cfe 2>Z`DY k¡ԔSQZnLN ,6Ghc_eYAɬRuZmo{T y9YFHJz,6tSVa^Bm4r*ɺHG0L^CDM$#Ͱ,㸁!+UBay`2RJ3hxtUƅ):njz w  =s`oV*,$'.Wo~%Q:>UZ^VGm1Z)JrR.r9m,N68\N̼:phXfLIHE,3ixDƝ9qzsFz} :7WEOsR3 G)gi6.k#cK eg$$1)Wwpo(@k Yx C9lo"(X!{d,VCNi8n:#ij5Zf:( 󣟼L3wW9kƒ7\gߡӋpNhހ8Z𓟊4}EJŦw[rzW|辕nR2iByP^(/﹟s܀{MSg>2eEZP0Db2xucː9 G@|XWG{B,z(@e65յ6K%-Bt:WWUUԬLZkP^(/ 1MP/<q{(3O?H,5 >n ?Z$ :&B.Ĝf9BCd2eȼFNq!\ aE-˻+0x D):&C5a9Ah4 .N(']᷉s3:XIݸ*-~/FZ_/~y3}#(i1~_DB}:>EDnoMDnc,MOnL&iqjӭKFvn5YB"^~32Z FwG_ZjƧ1$Yaʄn1>_$ W0B.#I)"+_e326׫q:u^-mՏ>@!M?pO N RRKʓz[2yMB)KVi;LDz-?3t.Ɏ;ˣTtZ%yYU3CCÌDT2j8J3OcuU9r2|;|TC?3R.}ą1K]]UhXԱk[EYIR)#T"jl6]镗go4E"j4o,IˤDfL tI܊i8J&"pCߏU夥8\]3A9)r"Xlpִ Z;n%CݼjMCC7QmcedrUSwoR/NY$Ve>x. x }Y)zBp۶+pH i!-:wEYEQ,d÷i,3e8m%Y(k ceDDS(\NkCÎΣG?%b ׶ȑBZH i!-XVC[S!]vTWd87pn ?~רqWtO%Ү"!3`[MkVʫ]"3Za8XMDk;-Y9j[ZLfWĹƊ\|b2P^84c_^w'n%"Pxb>;lEGbmyB y7˘jڻ%S B_VJFFĢm5klQOߐ6E3=4>4H(·xKKH/#"rZDL p\ bԊ8}؅ [ۻMkrRKq븭RgWFDS##'6oL K-M-]I8Zi;sR^D28?w,*KsҌ ^w2t7>@_WI{$zz{l*M]$w|I?+.N3dJ%: 759IV+L=Q8?-3@D#yDbVrOR#EztCmCTQCS MDty6Vuijo+ېaO|/ qZ<7nNff$k4*:LE鑎!=@DvVqW9--~7#` X-j'Y'H S&DN9,8P1H(L:]&hAD}vWd;=ER/E}ՖW&@`X;BHH IRf2SL75&#ycj0 pVB$k˖қz{\jK@]_ߵ=}=xu#^]Bцwѭ5*RJ 'nŜc;-"밅3 n/^1<32x4l sU?J;9LmUOEҒ| Z)h9}MfTUHsk0 YY/n ?xaMuimUѐ렍4l*+vXSLFl,*p]J]!e-`Ѵ"AP+nXWUQ^""#NuGhcNfrZ;2ʊ [7u6 iCbYm6TPx8ąXXjя=3,yǥNcV_3"L!.$Nuo43_虞޷{%g}/ȣ%hų߰>#3Ch<ʾI_K,wd2\< MMM9Wyyy___]Ez^TƱO?y aq?x5v^G. ZГ p-8<@<[(s71^?@SB99xϗvßSD;?xd^涶藂V_W+"G[;;Wԯei*| yC.^N?Dց%{nj8>X0aՈfֵey+Ӌ-#VbvPj;o $ټFDv5>;JsWkDG35{OPWYi˻sBB>Cq͊ 䌩]":22XC VWK {ύM|.M26"r[vևZ̗Y"2:6!"ccCٷnu-zT-3(PaK>[*Pڑ\kҊB" FuJQvGȱm۷$\_;k]w]G]ҋJg~BEŅ#5`)c([5}~n(z BXE.I{{|Æ 4Z(&}--;[t%gSrH444455%\}}}w]Ez^R]hʚ>>CO5QSǽS VyM%gQu}=msJГ p-8<4}`g er)@-˱RPNw|6x"`.Mmm]/\UVDvvvGWW._[ͭ@By}aUwܝ"ޡ ʒ/|pYi5: oO'aq]6UD-C9vH)z.6ZjG]аl󚪊k9VhF.L8=>_DzN;{9J3}nxǵ, `Zd r`) bR j1Nˀ:l3 uUOyMiA2S[USѝה۸oJ)5Gȱm۷$\_;k]w]Ez^♟0ے谯mCxNC*c! +RѢ5t ;xnRÖ{jt" ıP;AOCď{{|Æ 4Z(&}--;[t%gSrH444455%\}}}w]Ez^R]hʚ>>CO5QSǽS Vy͢4k>CO& /-  k)lL1Mmm]/\UVDvvvGWW._[ͭ@Xjl6nߺ|Uh/\>q$\]D>8rj>[DGm.}ᦎC!"NI{ktSD w`c>_@D'D䩮G:>pqR7fF@ZjX^V$"@@˰ԙ-2r/Lz3y9wݾ?_c(ZbǶ ^dkGoQcM*K鍷PW7d6lV:2g(/˵ s ӛ-#Vbv Y"tyK\yjw'ZN7owXv%apJ9zotg>ukqaݖ=:6wdgMeَmrs} <1㧃G'sFL!՟RCk2&Cx85\}kM1dKb6Ed ;ooi67|e\D&}>jIGi XnZ; Egv$kMYZȵA4jájI-5^SnM婶n ("Uwwҕf6kvx*"nGD\.Oxe\ }^ VqVWU+ѝהNVTt5%6?S`IZjxիs?{ 6kvYi|pd =iCd(*+GFET{ύ ֭Ym6Ŝg_[Ӱv*c5+ C!1"v)ur';ˊ,٦ /ὣJ֬\] ظK4f[COfl֩)Pظh4}4r+N#3}/^/8__>}oY$KH]":22h6Ϻ6;("FƔ^lQ빡KՕGoPAD$5؄KD1)"&c46^=8KhH'<ǵ, sP2phsV栥EZj;i}ͦ5g&ebV j1:DDr6e١Օ5Ue&c`0T]QjEdhRY&ZL_=IqfT{K"ш^Ƶʟx%҂e;)ɷq .T n?79,%=9r杛76 ʻ"ڥ{n袈m"*D򌍻"F-5FCA]DƜJyfp˦ڪR,&G^Cƺb۩լ, d4ֺʢۥ%OR5Jj3zs˦5UeZf|2u*KDdة}FD.ؘj59= CF:7uK{OiQd42aP(H@0PSY $ $vn "?%jYk@uXjя-`:cw\4j8 2kRB2Tk~Q{:F3}Yr6K?7z=܄J-$RCRÖtGT\ցWZ+_K spxh d4Dh ʸ|l7lZ(Oor5K]r65L.+9DCCCSSSrU^^חz׵K"^@Jo Kua[(k~ =FM=ޟ>'O1@ZQc5"2>ve|ʼYvW>w1 8<4}D[~n/+\y @HlhPD3v"E S,k ~9эȽ";MC乤ijnk~)xmu"r;zuIjn mF-t| yݽ?wwtiںonydHD\S()٬Q-@8<{+ w'^/pF ?Go*zύ; rcNyWIX9 >?eYED?y5MMhq!$Jt:!a[GOW`VfOmJh?):c;6WWzGYSjݚ tk&N_|k9j߼ܷkGW^oL0d8!Hp\Ž#~nj4< CFƮݠaڵ5~`܅-k#W[z ^_[g_a,l|>јL^j5U zGZEtYш 'lxJºzJdeq-#Vbvdh?/Q__q ?yMʌ;'.H5e"rԙg-jJ9za7mWF1N7pHn۲ o-"RZWUQ?ܪ,on"?p# sƈG'sFL!)D?}|9YĻ^du媬̪Y1lܶ>Вm:WmzT4\PPcP5a: 9<}kMYZ%srKA4jáY B`RZ(+w /q۶5g]MF5[DU.OxP_4p.7m_o4djm쫬(ٺj+6yupSňmtcFӗF5iJ]UDw^SZVTt5%6'TޯaMr5D=5PvjPX\޻l6AŔkci)-3J"Wݼc}^79yV9yWDvnuNǑȱh4֟V٢ac]UYTj+b2Edk]meQR꒧x)kC$jlw׭Ņyf>thȪ(-+)x7ՇWu5š;;#6t_P_k1@+2E$lȮ,V(!+CD&CS[ΰmv5 PļlV:^3T6e:pח" |;Wtܱ?b&p*3g.޾@x_yiDEęD{G}(9jygt(3+vh ߋi`0 p|eC`葯uGʪ >b.|\pڗz_n(!@_"=0JKKDdv9ں_ ^[~]m쎮&^]R[CK8ȂBÌ Mk*llV3>~ `j5:Q~D p9FCAqw e$ (.ҋ"H/KA2ʘ-! u]Ez^饠B ẻ e@B 4D"Q"H/ҋ"T(S9Q H7i^LH_)3y. ̳?Rh(qDhJΘ(Gm۾%9Wvߕs%#>zו|sjz|^+$w g$$_WҾ|]*UӋZ  4DJEj TEW/+qҼ2!R(GPAEz%!R(GPAEz%ʀQ|T( <_WP 5ŋU>$jh(N#"_7X <Ѥʵq 8ҦEnthX}"oh.x"] -BW/+qh !FQ.TPF|aP (GPAEz%!R(GPAEz%NW(3 +9#CTT%mm۷$\ɼ]JJf>LR5xH^\Lhbd[>$jh(Q|T( <_WPcߥEBY]hEz%NP _Om {? ]|-_֡9ZW]`fyx<^=}O^<ޣ*ryx [ι2DAAAF$|xX~P@~('R 6y]*UӋZ u=s!&Pd(r8=vvv|d\(GPAEz%H@zk--zOl8s-vյnjxZ( -^y0~hg*"wcąn8c|SJ x+~/<Jŕ BY]ˌ e,g .'Ah~{/) ^jA/=쏾 q¸$|kȢ{b /Ľ09#C"oRrꍆBW/+Q -r)/ňU̻gO~ j BY]" e!^k>q˕AT*Յ J/+qPcm\r,:n+@Eט']-V,pc n\(Ow?~eY\ʷUݔGu"F3!~MnYRZ_$mom;lXK[M7Tv"~zX rdg2wZ(c)k nq}͜Y5|kWuvv1B! !8㷹jUYΦٗ6 nᵛocz&}U%D .ԏ:@nC\-뎄nm7! 7#\Gym᥆?Qfo<<\~y`փ:OhC E,B5\4HD}-]Ò"}ZD|Օ52w At F\}Ŏ eW^ez*5nGkm!ZWXT/\f+0ѣ f-sGBCHko}oDd;"I_Wow.|'HoCoZvѼA8nF IENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/Riff1b.png000066400000000000000000000735311366722712400240000ustar00rootroot00000000000000PNG  IHDR^ pHYsutIME6v IDATxy|?%˶l˶|_$  @ZB)~,v e[6lZ^3$ܗ3K>C>d#iȲ%;XCxf4yF[g=PsNWcSXecs.iDEn6xESkj IQa!Xe'OsnQaHabwz#twa %%2 @LGTE8Qp1"Qyz]_ 7\L DA QfQ\R>2jGo|_oiELb`H a?Z,a7̞nsc[>w'u7wov>gO\<+/77֚ۛݹ[\X,TTnMHL&"_eO>SRN'NLCSHk%'O886jKJ6nvD"ss .\'  \sJ!"@ocS(ۚ:[ou[Ptk^{nZXs}Dtw].gpC囈|SC]Q`߿vJ*߿/, _c^"z/o 'DGR%kJ&7?O]Eo{>Eĵ5~9d.1Br*44 \`ZN8ħ}}]SñSn|P${dlrqa?G"p }lՙcccƴ N "mKrOJUN^qc|?)u\ң]5v^~ W\=DPFN?;Ba`j8;־Sz=/u|j;XRJ15s|ID|D}. `5Vyjh>kx\7l̓HzIQ]s{׾\SDCUD5{7>fa#ElE养}uvv*4M\` ~ӭwFO}ťjNЅS+twܙ b "?Xd3y7퍒U @tz\/(vn"j֎״9OEDDI K|ȧ=0eϝ3WFGۯ%x*z|?sv߾o^{9tWֽ=v/͹#vuNBH\~0~s?1_Vԡ/<)FVNM˼fǮ_OFGtq_@e;SC' Qk[ "XtCVkbRRW5{m_P!E&QrJv'2*cg60`I6+J"%l%+ \[e[(C_]w?9[#u 7j79,L -Muo-}wnu{S~+w"5+RC׾|_}w= l^?Oֆ?xgێ]w V_zNy P(z#S'Y|QaUo3z}bWgP(=[  E>KWhfD$z/O8&.D&kb3zz&"^BRCQTr:(t].NODa 2YPlں#u5Go|$/BVC|kPDDMo_).۸qu TzYG?|W .n*r\pp."|w~}w=p_'^NZ%l <;bn|[QZ*BiY,HR"bYX,jS3, gB rmx}BD2t􉁀r^#W(^엔y%'}١'IZ2=ku>)#vmMDPҙ׭Ti(z(B/Œ(H"trv_`v|kZh5Ż|o8z@v} 7_LD[ݸg2 mw~wp)tgGlhp߿Së̟ۿSiYw"6exh>$l>KDRKYĶFx3\G\hIK~-D"1w_JeD$QPJA_Qnʾw׈ drs^Zi+ "X|׽Ѽ//, %` z;* ̕[`p!\=S v_c_!CIxZ ;Z)b12aӎFl7aů&RBamrEJJ[[d$m#mΗt}vl$2\4843 s߸y>s2>!Y,G Eh<Yw5V/T,ZHO_VØ1̟`FI[iYYO/^6*uXfvDٮL&%QXl6NYķN V/gzŅaΟ?V]A"T~|hBo5V}j8ڕO/s.[B07Z'&.Yu+|:SC y`ܲ"jw-3`*wxZ]׉o Ήév<ķc;߼U 5VmfkRp\5V-q:-#BV%ӅVCF*p5!Bo ժc͇ 953<5woޟdm8_]˲}!F}\u}C؜Oyt{Bĸeٛv]p-##60XX֎.qR)srt qܙ3oadŚO:uN('''Ԑwfhh /7'Ϸ'DwDDI~$C"}r'(rFMD}Im]Cm綶ul޴T_߈P|BtB|Mu*7#,+.N1~X"] ] aY,=lVwn ek9Sß;qB!~&Ҍ|j־`;>їyhm<̶0Ɣ4wt/84cD"IMMO"1!;;/b)1Yd7PX,}E 3|"]=sU5}>>yE XFrǏ~ .rOZEDQFm9&>vБa[Rpo5;;S,!GN>|[W^w{K~~x7ч~aJ{_1-͘fFFFl]=e T)߹e[[EEɊ548 1|"E@X+%I^IT^d [ U|zS*[l\7@D}:(V_XRZj 2f5TebXTL&\nuuo޸sǧoд^T_ZRT~{\/{Z[+&cz:x$ W6a]|ްaY&->O( yوɊ0T:sD$J1Jpn0EEEkvn h$\1wb`m]3iGXϿZ\}kM_Ꮢ2%W/XmVIj!/\un4cv 5KՂq !c pۯ߳T}۶o ;~7oͷ^G4`My7be'c.]p B!ò^ܼBmT/\XPD^}.yw1HBXd 6<BB"ڸ荋""B^s  5/%)$.1M$8꧆Qgg,KtS6qF"zóGfͽvs[7"tfV^p܌V~/>5 MAffFDz޶Ǎitӳ~VӶIM_IY@pL{4m_d#z*>[ 0p_=g=K BJ.x"jh8GD~?Zh3Rvht|OX3tP5c.DQS] bL%%pOhկ?~  ET*jmmB"*.P\A ˷m+슊k*b Q aBTl?Dlo/qq} sVXj@h^YagVL@r9}l"eYJ'E_ \>9y)=ѥ8Pqz|nI 9"k]J "FI # X,D'99]&;v '(EV"D>A 8"b8c sVPjXK*es722825H&6JEJKǾADqq@j2/,qT*ۿ{0|n J eװG$$$xTPl!"b&4;نҲ~Fr\؛Ӕk)ۼJJG?x_8 Xkht0ްҲb ˲j|pĨ>q Ux%qmG'æiUD+"΅y?B @jHDӍF@  ;;QE>9, Xn(DǎCw@Yo˿uA LJNC+..K4}k3&,)s ϴms)\й C[6NDB:zI"!@`1%`xxdl6fHKZU9`MXy^Q*,R(Nsyʪٖd^0" /Wl r<~is}Ν7q;gO}bLˌ>"hqR՚rvO=O1 H SCHN0Ln <D"0,58>Vզ~QpAVzyQolm?Ma,/A.guQ5d[Mi)2vgR]|U^nNmAͩ\ԷGDNݙ$VaH t3ߓQ=B^k65ܵssFznl0LBΘT!0KsbBd,Q0#rj"%zKrGBjue0-5Nkhls9DzwQUMSj!1A7aw>R52:AD) S9 IDAT[7rH}gV"БjLiUyԂtJv7O7xmYqB. ^74<^Dtۭ~@i}׮CH/M}s!XrK>j89jT6>#d@(o3[TJN޶/%"Bt;AA);( 9|VqQfWu>5hAnmir2*M.=a2MIiPx| D֐U*dH?=CD%k ˮCH+R wkr?5z.@mC ynHk殾VGtoRږ3盂CM䙈2տgז$CV;6Kpe_]_g54u1$b!dC)-1JEosY*֑7~~B.f4e4tZm#q"p6T4b&3SƊ*c( N^CuI C^+1%`xxdl6ft֖ "tT85MJT# N^ǩo5heIavZVW},z9:QKs#@O aRr[6l1x8R9 +..K4WY݇9hC |v4ˌG|I8B3 +t64Դ47JE t.۠jye2W~P_/Kc.tywy=>1eFL yUX jM 9s]_y/XS^x鍵 A5L&[,@ >^W}9GLn\.U*dO&4YZҢTJL]DawI5촏 Ƙ qDe׸H+ ee Y)e2we+Ȓe];4jŭ7lX_'ky؜/Ø/If*+#I&D4pGiu%i)WtN e%.'.y?b<9\~zjۖ2F5m7[ȳjd2I)٘PSvͦ9z5LMI5l쟽dUm[ٺ,R|mu; ZL26mVEv:Vp\ɖ )Vj5SIGX˘~:.qƄE?qfǽl"Zؼ۠`&5clj#_TUE~`Xy[z}lڛgToT<Z}B}P_/ /s\sܮOXOi=`  *,ťa"WsGgg2yyXqqX"UCy'G64Դ47JE[ \#+++g[&{ B}x4BwI2ĢU̧21}mQWx(/O%"r09@lo^&s |.'HY|"iJM1$&&GFF'(%9abR. =^LUJD:R :7oזZVY7TS370"nu 0j᜺19>'+YR0 M]殁SSY&J)8>:Uu)zsr{c|S\@1&RXuO ''Zj2crupgp6U淙-*\UoZJ!s]} הi>(:aj*MPQ-CB\NQ>VU1 q+1֗fs7`#"c,G()5DD/^3/O՘/v+U+ֳXGcfjx];h5܌ "jn:|\pچ3U 2V]}f toRږ3盂 LDTwm߳kK!NQNqBխ.;sDdhhaxܬ>5L"npCs0as2 弐ln!En.piu߽K6gg y-#q"xY".^LLPQӈES[{hdFw`z+ UJe}iXdLr)B>u[. 9  ) |1ߨc(~' uD.3jM>ƔᑱxT*29r;*riu]kmC[AnƖfxM!/e}l5D-M ޱ c:edC</d@Q)Ye'ϻʲt\*E^9se07+EUi ξuYٙ2z"2wY]%i2eGN56lF'KKD%i)WtN e%.'L7jX]bLI4"YzOW5x<^h=QecFz}u7VFJSKef8V7mhھ8^ILttY.˔G']݃ݽ|ae(d5|尵\cٺΡXu:Nḩ̏ˤjZTR82湟NgW8c¢hC |̕М 7q4#_TUE~`Xy[z}lڛgToT<Z}B}P_/ /s\sy>1eFZP0Dba<7Kۀs!7C>{E<" 5 {t]_y_ D \DB̉k"5 I&[,dgՁՒܻ@ 1h2XbMU}S9<":~8'X^ri{9Ҭ_Ҿ{)B,N©8"rg?4&iGrH`{2S5j57cGOE­[7#ύ˄0VSÚVnYIu LLLteX 26MY/#"rZDtΫO$CV>ˣ2HN.mjxy~`>5ln4wL-+iblu;'>t^":_ے=vl]vfFJ ]hlh긤ךfLIjĄ?BDeYC4UvyY߇}SH(8zq|¹v*U/M}s!,(֛o}ϗ)X4䅗z(eڹ)1^ݗ 9˔猎=69) {vi6D,O^L[7T}#}#:rseAFFƉHf&^!"XQ+H(`Y߄ݹ*U+k~йB?Oa|yS'O#2 X!&'Ɨd=IWQ]Cs DtyJ唗浴ih쨪m)]aCg|w$ qZKQB'=l^ 'g>r2DUǩNB.S "ٹ58fs )rvh5\D(bfzpC$`'8!>7`5>YW*5TD42:ƉHHSDe}D4p"Px)\FDcI"+ne342׫lq:u^Ϳmk R$ !xzd[o8_ݦtD+AJjVqYRwg)pW$5t4je|,DCBhs=OD-ey٩rҌ Df24zERÆF(.46:q#BQ'u,1%!;;z.wV)e!ìųDiu: i2iV3znٺ @ XiՐyg߮>FZ^gL8 yR%* L ғ?/޼{-qLM˳?{Ϯ_n"l [B}^z#RC:(@,!H b%]kOX yw$^QNIDܩըnaC'tQk觃[H[wFF!@^W9[ ].R)W.Rʉ6:9b'"Ry 6W>HDJ6/ܴ0tUv\&!I'']ѷwCojr-asPỡb=vB* uD.3w@L[VCsWouݓ7?QVNopj>N9utwTrF}KiNV*:nR^184_( GlDr{rF 7l IDAT"J_lӓ^j yi=>x1Q*jx\}ܽ~iƔė_cؒuڷm)-)V(dDTh}ǍCcK,I$bOon,MW*d>_R$o3kQ /].&#}Yʒ߫qˉh}a^Vr7x BX3O*JҲ2S c;P;|~qaVfz ;[{6՘FljZg5t$#}YS&Ғ;7/X &*ZLJN47tZVJ g=@YVC湟ND|>FZ^gL8 yR%* L ғ?/޼{-qLM˳?{Ϯշ_/ 1^R^hFI ѯ -=Ķ%Pc}( 5n 1Ё!B-eGZ,!?¤4`[>XqqX"&Pʬmhiin =>L \DeeeUUld2uwwB}P_/\j=gU$aank+/>)kJ,^R]9ΦH"0L&Xo){(# .? ,=W;oAD5 fݾ{ nQUd( +(7v&0}rYݱ{)/9Q70LD"׈"":y7ꏮ\!d~؝iLj5ݏ?)uLIԨՈ@,ZVÚVnYIu LLLt+$?'O 3MYe Ðq ceDDS(\>.RCGOvSNsg_pԲ\}!6:QwC%-Iqqꡡcegf܅Ά9I8Z9awez>d͛h@ (N3&xY߅Ŏ]Dw:|S;5>_+ra^Ʈu]} ېLYqa⿰gG\fjJqs7SwQ~Njr^Vt .rOUu|h~د\:W~ݐbJ\QV@Du ?;wsf"*/ ]N"bЙG}>?sި}6aJ^Wq\7kHO3Q|VDds mnHȿй~0glQ2@ljUm5TD42:9b'"R>#MM]8p8>5 "n" 㵽NW{ɤb"t `+yE6g4:z  ]l5|r[ /kIKViBDzm0K .vQ'rz6HKZU'_~aч믽y,[ꍛ*g[`]oP_/ {7b.5T.);l*C q [q }H@a)[ jnb ay   ,aK Aȏ0)9 qX?V\\. =2ejZBϢSBt:-QYYYUU<2LݫoP_/ 1.ae_EaأʋO?8~\x׶k!"&ɭ2@ Xʈ&DOb5)KCyy^_CDVw[,v7ѱS=Cũoj2_\^^GD[[;Od piX{2GO] ɳa~ʾۉtUso?w jLDgGd~boDwqg?4&iGrHBĺd$jjb%2 uCY&z.M){wI% ce>̧27Ax8/S. {ՐiI_6Xl0{DTTۻฮ- ` D% "Eʒ,E&#Y&ْhb{&9kgK&byO 5%"-QlU `Ѷ%vQX~?.o[{sN况56?t%Neۆ2]9nn7z _>zפ]Rb8,G(2d~Qjh]Lj("8_z"a]ͭ7y⢼U捫WVs6Fl2ݾaVSWS^YQĜEyF4.(/wX,,D-uVp4fWM ?y- E4Պc=}\Dmu4v;ȵ~ol;sNdض1$jŅv/ \RC,ZX!?y75??6>/]7l6m;nYj1_0Edl|RDǝѻϷoT[%Kߠ4CQ-nY4CQ>s{&_ZSVD$/9(+ȷE /=k3䘚N _VFEM5GDVs>~&1dٖm[hWW~}C֊,4Z(}:/SrRhllljjJ{UTTq/ERx٪K BY󃧟g鼆0qɳ}d5v^c]Pr_O[]iYz.\`0 pXBy-߆<~ *Яa:1p X.c(]D><6xAֽþޛ%egC AvE ",g Vq[c8TĻ>~;:Gٴd(.F'GVnTw~ȕkw[ ϞBaJԲX1i% l޴FDN=Qލj6E-M';6iFxH zw:Gm԰8oLHNG'J `4F\,RCKQD._SyydLDri脈tz&:vsf(J?s<К"S:}AYaFRC+ /IJ\J 'nŜk;#")3g|p61%R_]īה*u?yMiz-RÓ-gnѰq}l2in"B7P۩KEk _2[(s6 k)lL3Mmm]ZٰNDvvvV׬*mXSé@Xj8l6n۲beh.^9qSD>8rz}Sȡ_}M.+Kع]D?s~x$3/o_(_\S,-٬;^#T'xpoeIb-԰>A3SCKsc2'[;zl֜E+ˋh~ "OeYED_\n7!*RÛo`2F Cضq۾g0 mσ"t}eYavidiM]ź5UV tȣ_:U\sX'&n26Atp}Syl]JK +ʋE; *}6>yjClwTgmUks9aqa.Č/ \RC?d4MqjԚEr> l6Ȏmwl[YӒcvetBD|~hq{Q(|cN7Ch4];>'lN_(zsPV qP ]Ut[w kE_<Yf͉˓c6h>3|aDW/+KU(DUWW8|* F޸l2ĥ19ssڵW嘍@j1WoTiP_]^t;ᰘFR_WU\tRF"/Ji/}`u+ˋ֮ .hډSŖKW~1%hi WU* e|GnۭTdbYm6TRx+Ph4yk:cO#33}n___혷z72s?$" ) /?CyGoݶ95߁I"^ċx/^ )IC@ݒagy_T"# xNg --'<71y[^ju dvᡁPA+*.<%P竏_ߐ"KbZx̲b_-V== ӱK^f*Ss4Ú7--':[uE_&r#ԔK"^ċx/U.(/<(5H 55 {O kXLDNt EdtlB^S[ᮞAMue~^8wj5Bdʵ[t:^WF'"~MeopvvVz<"^]SeS?=XgZUl6Y΅-+Qbvtκt"rCG[4ٸac]g1 y[Qc|i1tz0#f[Gݹ]lZedt|um4 ؝wm-,[-kqUD]/ \RC@JK nlg]c#?/H٨嚪BGQ0^Tt"Ӛx|%"`X!"&c4656]}GqԐNxOhMZsPV"ġERZj;q]ug&ebVIj19gDD6eڹK5Ue&cP(\SYjEdhrXsL"bz<>qft{c"ш^Ƶ+x5\eb;)-q /T0nOv-"Z޺cu5fAyPD[m]-GDp}}\ WԨRzh(,S:nXSW]f6%ȵhP_]^t;ᰘFR_WU\tRF)-5x|77o\]]U^UYh&&\-_K[W ܰTDFn8ӧhD;Vظ _5Ѕؾ[{ʊ&Ue+ t>Gdvk8<)lV:^ T'EQ2yΘ hyn8s'2kV22ozA:J3s=^~чR8zmS^ع;.E"^g~RKþx"p RCREaA:kyN2@ !QJfaK Mu5Vǩ& _Xjho}C!GVWT\y`Kf =_}|YB iP--':[uE_yIDAT&r#ԔKZ'kx-o0[ua[(k~,=אƼzje:9[M\aM ңu]/Dщ';{"ޡ\kuS#"]_eif#_7Tjr|,)Y.c(V "c#2?ŰXG9Uڍohxpn|_WьpP;=5~K--'<7'1y[^ju ɜ$;[@( ޴Z]Qq9ЯfW_!kE45<6ež&Z7zz^[cxxUM/hW_^if51so[ZNtf뼋L&J͇)5UQQח~E"^K f.)<7s罻ɣ,-YD ?RLJ g73' wz45u>je:9[M\aM 3 yYYWWW۬9Zfb?8ޡ`j:Q~E>"=5 F.'xpoeIb0N ?uW{\ۆu5צZ& ADvlV^CW&5@ݩa8 Ν|ӆ\r򛃓NK}*ڞE\_"RZcۆQy}s/Hqaݞj]nb|urGWF' "8 o6YPtj%5LIa29rfV2ѱȴ4lf=jWVTWioi0{=_N ozs|n"̋`JԲX1M FLL:sC'#Fw Ftoݱ(o*/Dő17c3'Vnkϵ$~`pȔ,VousyЛRCc6-9\8ςܭ[,;>6ָVgف#M G&DVK:?5ek"x9(+Hjw8c=5TҾ85|;9'ע$]Hbz&xч8 CoNbI 5{S^GO{w -x/Eo5D"ϿId*RC,%*Pu\ċx/ET(SPd*RC,%*Pu\ċx/ET(SBҥK@*$sI5L"*T@Qq/ERPL2⢅2 B 5RE]E"^KA2ʈ e@B 5RE]E"^KA2ʈ e@ eRIPW&;"ogFCI"RC,,JiK p<BYTG~/zZALκ~(O?p~oÏW(.TVxIR/Ji~6ͯp V >/W~?>%efK r*zZDgPH $1fit}|1 #sXj߁x" - S3-^rBxq ^ |erVC 入\ʃ} rd .z?snvIBY]E%"^7 e$!_K#㭟`?Dg2oj+[vb/ѷsURC$|rw|V~WDd+pC(VK:v䝅a[."h4"EhmsҲ| ovۺjp%lX?疛Ddq&@RCX?df,CrTg*7LZ(c1>N\7mMw>?4T~g5gm߱E 6L aPjBFmn#uUiMH{wz^oLϯ^(2g ! P[xxH'[~m[Ȣ7$5D~㕭&c#N9nGiڍF5Nhȋ˚[(NIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/Riff1c.png000066400000000000000000000740361366722712400240020ustar00rootroot00000000000000PNG  IHDR^p pHYsutIMEʮ IDATxy|?%˶lmg#@I (GRZvZv[_~˲ e[m(,(gH/g|˗|ȇ|:G|[eKvDZь[o}f>a]DZHsgSs3yW4⢢)3`D"z5ujpz|0D'OwiqQHqbsx#ta%%2Ϋ =RB.…B'yWE,'|ۿ{ 'y7xb:1 ̓C@TGXvX@Ii qW^ݷɗoieh 1Xš8y~@E{0kZL㶩WөU9Q_xtVwfVCX5$^{jx|wqAFtcwqUIhtT0mS~W!EXt'/[ r{ _Z*.KksݘuXqU  gXD"~6ͺc\ri?|O(.Ȩo wP%} q붛vZ Xv1Kዏ~ fo/ED-nӟV+*--MuvV4V%U[&leӧϔtS'}KɉS'Y[$HBKDNC#Ã-ܨRk2W}خ=w BS{swWۍ;oSCnحRkz;Zjoٽ쨬byX7Hw?b<5mݲ낢/5!>>q6IDyb:U?@r;H/okk[ijD\G{Ӂ͜>C"PVOg+!K԰ܙ#|j8>>z!/9-}z}m7s.,655T'B/[}1-H½[N/R_R}XgGx"xOJot+o _?GD%Ο|{?R(TSNPg>{, ŐKw=l;}0Ο=fLt }ys O O emnsmYNw/tz"=ch7|jhHovKe&ƭr"dfp̉1"r!oHelC}@>re:yΟ;3imDаlu澥S9o%eUG?vKDղNx3o5ɉqO {gN8"dB 4_ٴuVp~; ˮ۱-u 5m/QQRC|%oó?gf5sel?]KDuR\.xW?з1˵-n#Gꚛgֹ`|~CT?=_xRDTWs:5-kw?2>67.`杻I D4<p;_/\ !M_o~m` B5~ۮ9iuU^ה^P` w":uб? ^7V>#='vw pk`2H499olnB_I)$6wksߒX,q[:=@15gvyܢT*9v"=&ӮQ Lr!8{H}ȑ_D{[jO MEDaT{Xw~\q@ He_tz{L~1 9 \ =o";|_;|y9jsÂ܈\Ζ[Vm-GhM\` BoeX"JebcbjL4t&$&7ԝ ·*7l֑S  á'x=GDWIg<NIԒEs 'ƭ^/KDRJE&{Գ\ؚhI[~7SHL~WRIfRX1C}g{D e21/ش "X|т+()(* %` {uSW/7ħ@p!\*uHf~CDدL&%QHl6NYħ@LDXʗ3?ϟ EOF.i~Eo0*GZp5Pjw%O O ^Ҷ]Vu Z憢5b;5piˆc/eZfpUvΉåt<_Eu' X=Cѷy/ΫA|jlfkR?p^>5b`kop^A.S+Ljdw8jH~ZZ[1x ,11>l~7`~ÞHz{?kP ]ˇ/H $\0͋RC其7U ["_|ɳDT^Vo>dHdGS\ToHL3=fV85?5O{ill|ޗ<_t)&*sB䄍eٛwހrmV0\XZnqR)st*qܙ3mnad՚M:uN(?$''Ԑwvxx0?/7_͓OZ٦Ւ DϏG˨&HRSSlSET b8##1Yd'PUvEc ԐAqQ|޹kO":W];hDnN>72j]wo>op:VVZ*% >Lֱ1F}٧g|>F] 1\jinV+ 2=r E1cw˯]{O M|jLJ.,awܾ>/hrJFG]UU*T)oرaLɪ5<4 Q|!E@_+%I^ITt 9W]ّ^WTlݲqevODmm&Gχ?%WX QA"gggZ-Ū: !ϿL,+ "dCCCkԽx^K?^}nqmɺ@%lG^2m`rBKYxD#9?^Nr;WUё#'GV9Z a汇^Dȉ/ޙuWew@y6 }7ڽ름xxYٺ=5ՉW_"0e0uUTtZDcX8XvM.!1Y*k){͛08jx\.ZbY3!a~fg⢂d @c$~!~q-+k8#n3 Ss/",䄭 "!!/?1YJ|D$J1js].70kk,8œ#"Z1_'D=.% Q_|W˵enJ¯@}Շn[3_3b9CHjư%̩a@`<k`~Þڔ{o߾mHz"{7[oG4`My7m&m ]p B!ò<mT/ZTPDE^㖽 yw1 HBXd4#6<bB"ڸȍ""B^} 5ex($n1E$8꧆QWWts7yF"zG,ns[7"tfb(8nVw˟'v +@cYO{{ɴ|~Jt{?zy$/x$ނǿD/|VV]jjW჏20'Hx< χ"Z]%#"?V^*TZ Կup58GןZP(S(T.z%%(b^"9N{[[Cvsng{ōR "֯bpG/}Cv,5ћ[7|S,@t;:s"cYJ7/|rznR~qP(8e=={v!8jRCړŦFG-R:HD##fs'1INNvdj+I"U]]X$~qÐP Dd`v;RyZZqC#H N]d29Y 4K .fYCBRÏ- _5##ߞeYREE Ԑ[q zU*MBBrzz@ Je j&"aCu8..!--b+EO:glb*d~VED{wm^v),wWB@jHDӍ @08tdS4C9cc#B(--;+y2#`ɒ #D^ s IJlG55'jjN.9|^jni=UWw*0rM:##55'jkO"/yo߭ؾ^|?cP_/ S.ZBl;nٻȕnC׋d`, ,6yܼ>`Hg5F^ ~4Ii<ؓ%%bfmq:k^2 :?L{iٳ|)\6~ʑ8_Ôak[[¥?pYP89Wf_===w\/ }D~s׎[.SӲ¦ϽH,ZZ𪥆 t!q.s/^O)/ZN "1:) rU747Bo .N('Mmms3,dkVdd&sM} [|>ݏhͦo?'˘j:ͻ%/̺|f$jjDv؜pZ 3&'Ry?0 rUaeDDvC(X9N'RCX85LKM"Z:1^ 9>n 辻n ʹ٩ u:qcc Ŗ y96ǡ#r2t7\Bj85jT6,Cc~ĤBGٺ\"1[&my_^ms 9 C[6I5lm5:_F"F NEiF8|1H %pv< v2E7~AB.f4g6vYفR)'JVQGWp 7=>Su1XljhLIN̏>tIu}vSR$kM]}1vtdl*bYoyqr2y/tTC_IkZ ڭиwv>hl!Xh2;\J0٠Niyy5K 2 II_ Z۷n\ ^/SUiQNZi<}pˉh}Q~vt9~)q 5ƔĬXIJ^sF{37贪8K ۺ}~,1BWπT"޸ڭV.N4G3ʤjZtR8g H #9v^0̥;:::Bn2f0D洴v/|辕357U̾>=;cP_/ g(ĊFfH/E$a.ۅ 5Zˉ@@H^xXSD-MǏ ~oq^w~ԧƴs/&!5Ԑ8˹/٧ ֔^y#jSCv#rj(I!-fbϳAx !,~ H ɲ ^xh55 ͦЛ +|S[[geLcEa.Bpi_P&^"#-E&^h7k[۽QT޼M=Oߖ''˘j:ͻ%isf]zR5j5X aю=! ncܱ93=t5v &!AgLNXԐa0A 2(^FDdw:Z =53t"5XvF$%bf_Sô$":} IDյͩ)ݤ~H7 IDAT$$'lXRE"nrY"z[Bg1AU~ky9yjõwnl\* dLJbR2t7BK 9oν}2Zr|/NM9նИ21i* MfRӪm-GH9~@Pe82i0/}Ceöv qYFB~Xm&K]nO(0YIiPx|+D֐U*dnH?]D%k ޙGJz;6 ѣfzoΝ7nW{Wr_N >sFUYID-m݇ PqBQ~u*Z~dQõ}KYJR|f[{Ϝo 5]ADL==;$ὙGzC&.x 1&e'ymV3%2^߹ZSU%->0\Wa 0" ]DY+/Ypj8h}$ 9iiFCa~fSkeʯ0j "-p"&&m,iĢ]g=<:R!#+ 3UJyPZW(DtG$r9;[19 SuI `mfsRzlj7#3=Y+/J )##։vч "T|1C-v\[Kk 2l\?UK76w OCD$ GmTfnH*_w7KVl^0Lu]U 9 4tYǧbFr2y/tTC_IkZ&,{7&+`wv>hl!Xh2 G `(+#Ye'/ުt\*E^?>EO0D$)E[6DBåS4s)ySeH$t8zR"XѪҢ?y&}'\ND vosy3/س0pUÝ;oVr_SÚVcJbVFX,bYotu!=QecFx:6VEKskf8lS6ShVtb]R)gY_[GIQF`eTLDJ,;CSCSf*J Ht  *Vj5I)Wݖbr_"zW|d 1 3M'i?ϝz̖%B'_$_QF:&]ZÐ>]# Z̆FM]}ܽzVf_glT2쌽B}P_K#juQʗҨD41iEn 7lqSr,:f-cM]Gh"ròt@je"(R]?~+v!kr]Eh^x"5kE.G&jmi:~eiA LJNCˆ-7+G<ؓ%%b;g}x/KFZ\^ ^3K^fMR%m*tfXR^嬇mlmmi K>5 X_WFFFOOO B}xn4~s׎[zq3>{ScZV_EKjjqSkKSCA>(drˠq"5kG.G&!  7l–|jO X3J+]VEWIDGO -U{oND[8M7fWĹƊ\ \[_<">~_=>9t:0 ?0/=͘R;\j.fSӷ =QO1Iմuw?KB_IuJIԨՈ@Tk=ND"D"FXOQeFf3eDDvC(X9N'RC(ц-7gf|SCcJejB$ݬԹFCD>xԷⵓ6uI" 7Hxm6^ZQ+.ϧW;~|Z1wxmٺ,\* X;42]4Ѩ6G݅n^9=!gA+J+ ˓d$'>X;.SW@ (*IE P^կTuZM$z}Ѳu9v@D>HDyL.l@ L7E"r2bHUV;nZGY,ԣ1\^j2Nsk{ߞg;ViLN^\MKAnƶ-8Lf$SN]̻qLBDvj=~k]Y`궴*u[UJFtjZ]B "^|22Z bG u'I g0 C]DxV,ޔxڣI", cR"⓳I[RBTŅZB${D"a SvWp)c R v?x$rA 5d~*Č [nr;ːs rYumKM}kqA5B.:nB((̽ikb&;Ni8.dIhp2慟'EMgX :?Oo۵LC փݷ2357U̾>=;cP_/ {7.7we˹EQ/˞=1-+ eX4<= &,ǭa"/c9A|s/Ânk]{p Ё!BZ[9h4x~}ih-eǞ,)K=|!z(ϝI*t/R( YUUU]]2鉽B}P_/F]RPv: z#Pf{5Xà 5\5.s/^OK);xͲK&-f`MA^aSh`kVCڵ.X'bpM7fWĹƊ\ Qn N e2[+2Rd2 lvw\({}>7`\h6<}[S'˘j:ͻ%9yXެDZq _P޹csa~G\Sk#Θ\_J-֎)WN@"dl̫y2^KSg-J>qODD'=n"-hVô$":} IDյͩ)ݤ~H$$'lXRE"nrY"z[Bg1AU~ky9yjõwn]Cb[0 V駺s5*Фi 05EaP)٦C 55Eow՚.OzwX>`\DZ 1gpjʡըm.7&'XI{pc_eYAɬRuZ(2/ 2r"БWguZ&mMYy* lH2jý+a"8nbf#ie9ZȘ* DPZADC#n7^7/M՚<7z+U+ԳXGc值fjx;h5̂L"ji>|\`Ǝ33V3Mm&3pmR3 3<=g$CV3x֍E|egkڜ'v50v9Yy)|jDD=Ɩ^aBef%)҉IGu}y!Y]B "^|22Z RA !^lNK3 3Z,Cӝ?FDD$L߼Pw!=+ 7VfySAzӌ bȘoR" 4"|\&! r*R"zQ&PHA^j#\H Y`9|N )##։vч "T|mp;Rȥ5muy[6 Y*åT;'!"Vۼophdbce~fxdtNR!ժf%"Z_tyrVҜ0c)I|# GYQ{פB~Nχ^cL R;oqfzX6OD, 4#0DP2ӓKKGoUyA~nB.|j"^?Ѓ<Ӫӏ6QGW윬dLBDd=-Ң̴DTq#[ڬcSe~hd2JOҢ?y&}'\ND v?yfK`[85o5$fe"NW7H=QecFx:6VEKskf8lS6ml޾$^INvv[~.;#)%)M9zzFJ7$k![Eyu5 ]ãњtZNqәΔIhp2慟Κ.ui1py/7a&8pKT+NCʋ3?sko=}+s=SqS޳3 B}P_^y#~s׎[ڧl gO}jL  H `6"B. ,GAcc˅Bh^xXSD-MǏ ~Ngg$oXSU" "}ax$bFj"e6ǚTا ?'ңŽ=o~zaۧNFd`X\V&]Y^HD5.[[QXl]BOzuH$icS.]TNDm ]Dr9ܴ!۔dV;\ 4>N- hjX%->'#p'B03Æ3"c?Ξt+_Pt:j "R>+MєŲ^"DB|*2"?NLL\1(щ8M^=0hөj{:Ώ^@!MphG lNJ6;^8Xfd#2f't5gd-rzER)SViLDz-?3x.Ɏ;ӭTtZ%yYU3SÌDT2b9J3O5urd<^58ZPvvֽoBXUZG-6uYa]c[+JrJdQC2$(?#pQky}y^~N\&%4c LVLQnV2\|WUZbwg5$夐ˉh}Q~vtגgKWDWsvsMVeYES+66|>IqNVc;o4\J1wf{g6SIkw_ty.R6ewz<,2ZLD:Vp\ *Vj5IvxvM22/t?jΚ.ui1py/7a&8pKT+NCʋ3?to=}++qLM+?8{r\." ]DžB}^y#RC:%@4!H %kOzY/ s. *,gaccDL!$/ojk Li(E2.*5Ee9YiZJ `l6Goة/\CD[,V~7ٚvm$:8t뉨2<{'G'"=QO1Iմuw?KB73כQ.0#(B7SCLtvv{X6>N[.wa3X@Gzj5D$JfӉ Jh q:|O.~8iDNl]>NMČO64u.4''o(Bt=/I-P,344㭿Љ_!N}!Dm5L%)3 ܇/e\8Sw?CiqzHn2TAˣRt 36V=lkِ6CGk8+;3[ 3"ό4C^ixNED3#H=z;Xf~eYm5eDd/feY>54N0.-)/SCHHD ۔_UADu=!S lM2͞DD-m-]Zj׍"=٠Ԑ]C_\B "^|22Z Bֵ⊶:.RV)\Sulq:AD* n*l=} mZ_i}Q&mvLBDS"M9#?[B0 wCa6Bf IDAT* /D.Ï_zuye:z.~F>nw }1^%"c:W:jT>5t8\JshxQ,Z'(RJADjE9ϼ:xM!/}|5D-1X+V4!NwiƔW_CȚ:m)+-Q(dDd{MCvS,I$boiﭪ((KW*d^OR$s^KqAFa~\.MG(UE9i)vV3?H!d\<䅰fhy珟Vdeg fs4$|.tz}"5tvy zm1Z'նjjiIG)G[tVCSL*HKJNkhڴpx8FNi8n:32iV3Ι@YVC慟'">{[t֌%pHˋ|м 7q/+_ҦO^iv:R^잞w_}%_[_gj6n\}}{vqP_/+oD]jxIyu!5D:趌PFjݖ^C"0Br66ֺ\NBC규=[[9h4x~}io9{(?ؓ%%bCyz(I*t/4U(ce~%Wf_===w\/ }ҨK 2܋" ^0dr9?רqtM9ܦ"'%-f`[ʈ&O5i+ Uۯ%S!ؽִXknhn6\^QOD:C/f+ s{©wJE?=ﺙ/9Q?8BD"׈"":y?ꏬmyB'˘j:ͻ%oS כQ=h m||"WHAnfe$ty3 C<% % ~ٝVCDDO`Mn p8H Ԋ=q؅O [ںL]krRKqd~>xkMOMS;P.'+3.4w56wλGM2iI#?'J$nD3AeiN1z/ ";GrQ~u=]= ڛPNyI؄f⿴ڸ8͠*חo'$Z0uDxi"/KADZO+i%/}"OG7dZz(WQ}c\C*il9tGD87fNdf$+8=t|N"Vp4_RU V<( ]l5|䪶Ur"NJ)ۈ Xq an ھ3ҳdR1MٝqrQM0Y="[hu {m k905@j^5SvFӶ@]1@r7trike>U)e89r2y/TC_IА@Z-5_$WQNV*/qJ%#B 2I}l('-j')r"Z_l;|x=Y;}FtN)"~Op߮ʒG 5SaEe}n(|ɞs'Nsܷ6C°hypC""tO7A_;Yy>/h,q9jVCEk{wg!;;?$+7$"+WTYYc}@wt[6,|m~"͍fQy}Kv|>⚴QZ E,/sPє+^_D֬u:U\W_̒cڳcYvڊ@ 8pbÚ1 nwHՔWVt>:6X(aՈfڥkŖgAc h5ݷD_Ѭ[U+"tu5]e%v+c"rvGsr{dM].My% W+.sfLt$~`pȴb1X4_o5;72:/^;l6m[nYj1_2f2f踈:*?߾a]n'r,n6A醢 [T醢,L>?ƴlH8,"N_(zs@ow+' @^ 0fT9m15ku.^k6lZOG37in.ߴ&Q}uœo޼0W.؛ה8n׍Z'OkVV[rL@f)Wvșuk׮6 ES ZFD*ʋL&CEY!L5%NSYh uUŅNK%OV5:|: ZQUSU.eёCv򒂦mYꃃ'on\i@skuuD4vn '2?%jY'k$P㟼$S ̘}LX3zzN}6a +MpaQ7=8JSپғ?;_éH>tty=n۾5xhE'^|ׂy/.5S^8|i( ,S%q eRCuKⵆڀ?ŵ^UHfas1sMVǡ`Kf74 1~~4huEv~ןX!kICy=>slwާdr\H466655***z{{o"^ċx)lեI졬3/ܼ0qsd5޼&ǒ;rowk`8%2GF[U྆!cb||uENxNv^ji:9[&YVڰCJ%̩_|K]{ wN \P|;ECϒJkgwIHD/.Vl֎m߬]pSܷjpP;١]NDzGGer*"O-aH$ADvlVR9\n7!a/d.Jj}6rʲukjVh/8u笲v'"G/-+͵\p'׭\V Ov7vifIYAYa$nH !Bdra}ݲ;nk ÝJxއ3}u֭9g2>+CK 7;7tqO[ ϞFaJԳX1i% _BDN49I޵jE-]M׮i F~P z w:Gm԰8oo&$ˆG'[W0bXZ -9FtyD1)WDȸD4@P:G醢Ԭ|3܆'oLk֊L\p􅢗:dQI G 惼bi5ws^Hæ̜b4H}uœo޼0W.؛ה8nbi5<|- kWט,-Dj\S_]^t;'r1"v)?v'x+K-V`0zeueE _=}!nf[H3m8jZl6fH yVC͏(p+FOréO"&La .,3>*STg^ij:3=Wz;zg}+;{85Çnܴ>5gm۷~/ER<ӗUXrv{*:o[[ I mN:?74^UHfas11EL^7Zn" $P{C!OCԏʏիd ='C77koky}L&˕DcccSSSj^7x/EV]jʚ=>KkH c==O1@FQktKC nyg9 p-84q`Kfe&ST`B2{(s4L؋WT-mXY'"GZ::b5JVpP$*546XZl2 l?{b vK)":vD'.}Oo,">74'GkgwIHD/.Vl֎m߬]pSܷj,BN۲lRsj5O eВcz&adtfYZ^hw|] ~H'٬"/E O.>}fߋh *t+Ji71 ×G?!FlZ~Om^= "tmiYavqxӊU+h8Y\sXl<2g !0M'N XykpXDBC?8E"b ڲ%W^s#An?|~4F x\.C8]{bhzͧ9r;>{fw.\JDTlBlv)m5Z^~yթ֮@0$"WVpJd55'("nGD\.OxʸzYYB!ڭ7bo^S6ٰZW]ӱ7)-qpiE`ʇ~/*"淕'˖9l_ցl֜B`0zxP\'"WF.ȩW\,l V9?o5^1qM}uyTjVfb2EdC}]UqRjɓ9 VP%հ B  Z]Qq9/ǿ YK$g41bYnxm5<΍]eʣ2ozNOq敦ް&fz>slwާdr\H466655***z{{o"^ċx)lեs / %J  ,2?/׶fU UhDr?qDDnf}/fx pݤTk8sjxMkrVo;=ʝ^rWӈʲ5Vh/l9}VDVeӚwny۽>hzͷ?<+cWYo(;;+a} /)߰(ȳU-+6 }|RΉ-+Qb~wNt"rԙ5Yam]Gg1 y[Qcti1tz:?#fk{S][7[f2|etyml?{+{gXX`ZLcS>Yu~xtE08|uddZ H)m5t=fђcviNQD. *4<""9fsjʊ E|{QCӉHLoqDr>a"PPwiRCnoLk֊L\pMIĨ~i5 -/VΞj׮8;(3;V9a=)")3^*.7BRV+"C_ŚcŤ5 z.^шF:pTתx؛ה*uo={ 0 BHiONڭtO9oYJK "r̭[֭]Uc6k EdK"b刈3:X/3 vu*_Ǚkk&C g@kKn2V23("몊 nRK9,jVC~2F36jL[;Օ"2|yT[w^F#"NgtiGFop8hޛ8l2\p8H`(X[U0,q鮳Fvn^4IDATNNf٬I5@ujO^%p+FOréO"&La .,3>*STg^ij:3=Wz;zg}+;{85Çnܴ>5gm۷~/ER<ӗUXrv{*oS7,Il5$5JXt#(Qj8 ,Rzd67x1y{ju ~/~Il5Է|޾PA+*.8%_bꆬ%YBIPZuy&r#ԔתMZ'kx-o0[ua{(k~ ,=7!5yxܻ~6?E7+cWf\b[DY\ӎi ơ~$zyqo$V5O!/lBٸč4LJֲP( 9_ojuĎnȻ5 rΥL؋WT-mXY'"GZ::b5JVp+= 85)2._;zg`!v/-"87pt~Z;{{_n{dXD\ӿ,-٬]۾Y#`{vUX-L\^ թV$?5Ts7#NyWO<B_ADvlVCg&5@SV×GJvk ak{wg@%_{~Fc(ᗿ,(tOm^WSY_ڥ+WZ-&?;p pnXWk6t:pN? ";5f_ܿms7:igE MRvwStVtsPєH(4:""ΊF4E9f;38V&7#3mYz; -SÐzJrjoQ&^;?KCjJIeraXL1h戈b17:?fM%Z{Z;z*K7zռeJF{bTuj1ܸ\|r1MƥR_]7)+U&z:56>N>5 m{֮)ظ7otgÚuk&CQ#zQK[Ϧ S~%nj5"RVo4fG/u,nwX"rTlX.#7Ǒkh/N5%NSy\("몊 nRK9,jN Sjq^R_VR0pn Օe奅kȢ֮`($1g[GlƦlOZ,fSl=ݷnUUdeC1rJ9JjhPx2̰mv5pԴlV:^H ~$mc_^Wf/:( ã}tLq/zö޶jod*g/Ytd'҈o35{Wv>pj^7Okٽw_ċx-xm=ċ׍/I,1of5ȕ+c2?X3Uڍoph3pfilʜVN>'xmoB3nA@-g, jyirj %ᾆǿ YK$[=g41bYnxm;΍]eʣ2ozNOq敦ް&fz>slwdr\0466655***z{{o"^ċx)l%ggG08s39~;qS=>K(aR#5̤0{<]?{O};ij2˳?}Ya ׮؟2qڙ𽘑 `?ǁP8 _Vfe-SpCSI_բߗpRC I C}D*zf8jFK9:/ G ?wzG5K?Y7>ɩ֯ԸRkCM- Sߘ֔U~>7,1j#PIffP?E<EXҮs4 2#?Ė> 5{WRZMkٽ7-x/E{o5D"ϿAd !u"^ċx/e ʈ2 PPH (k"^ċx)((SPF\SPx"ʯo=7tPP9Q㵆IDA x/E2eEe@2@jDE]E"^KAA2⢠ 4RC,$ (/E"^ e@2BIP~W&{!}Ǫ %H P޻SZݸi}*.5cr^z񕴌מ{mߚ~EZxe7e$BA9_LÞ+DPAeH{Cy|߾Ʃ#y#=+W[w>!G tZ31j ̏w/_~y_ɓ=LemB¾+%y'~SZ w|+@//=_JŹJJ*QJ'efKO|%e\Ϧ556 ?h xW_*3j`4;E)ܱDRC95Ѓ2)!=^"^sW&g5P[ʥ\ؗ LV ⼟g =S}z9:\յ_"^KAAI:x'x|e"5G (P[h(ꊷf;_g,x< ^׏%"^kR]ac *J ,  [^k%/"^ċx)2 exAVCLZC,/P ]1 R3^{H.52H 衬%"^ċx)LeEPGe "^ċx)((SPF\cPPGA 5BE"^ rw8= m6J9FCBa41 ((k(x/E2eEPGe "^ċx)((SPF\cPPGAHwkPBj=JE\QP((Ǡ i/ :"۴ %C2ٳXu$7YA2jo޻SZݸi}*.5r^z񕴌מ{mߚ~EZxerBAPPAA=nA*bpku=("^5^BD((Ǡ i2@jDAY]Ex/E)(#. 1((@ڣ pԸSd5ԈPg^f\j,(OzJ|  RC,z(kAI"^ PLCC9= C 5BE"^ nyMAqQPAAeR39Z HEA`<LSqkp^2-VrennMyrURC$|rglV"2˕!ovSVge9\؆M64ͤHQjx=;[f\&2=H=j6nw;[_5vrSo$^HjgL[~"dX"GOtrd2 u滮NtLHlVszz,ok=y&0Yh5y!p#6XZjoh~tRwz+x^3+.̙v/DjB@*vKz<j鎖ɜ{[hN+P5 ;i{[_v߼>xm>di]\ܐoٷ~L|o<2BV×~w'vd@5\k8g0G 6k K˖HOi˪jejy!-q^(q.㵋p$ZC@EnYmƿ~2]S)H'G6:7$5@:ٰ'JD!!Ru7n{D8 @|>j78!*\n`IENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/Riff1d.png000066400000000000000000000730071366722712400240000ustar00rootroot00000000000000PNG  IHDR^ pHYsutIMEz IDATxy|[՝7}l˶vYIB-PJKiJy~S:C7<haJ22! Wk˛ȋlKz%k+lɎ8y>{ι:sy{biIB.cYxdw8[Z[@}OMZ\AU KKJ]!Dϯ Ғ" }#@~>}v%%B\kIѩ8׋(J'JW1]{ L ґO}Kߺ  QJt|ɻoz?y=u-7LV'M#(%| ^ew5֝ I k܈֜?ɣF^ * 8i^t5JY]sMf jk}O.qg.e w>=q;K@s aMmoe8H^[qqrtV9pU[??LXF՚[vU]sO_zOk>W?%?}}dæ9w1vCW,o/=;qJ;eJOA.?nu/̼GT*MHl'Vbglix#ncۭ͕GVs鶖cW;w+@V5[Sls0ٳiL-8 f:s%%հeۭbd.(dDt:Ξ:<6:MHr-JOܱ>@`le]ኢpƛw+Uޮw##t:;DD=.x!(\vk:[?[TRXxv.{\&-2wԑU/X|>Rݦs:s۹T[T\qDin\isr mrzP !4?X><(۴u{21ޟ~KDLL>W\.݁_7~I˵-rw_0ˑKGֹ?B ^w\≧f"97xrb\Xovw64t8utv:v"D3j6'D8[HC4TFDi?Zg"*0 ,oxؔjȔD$3æG(x<ͷ~]28x1pGOX׍"0ؙVCa2#@ hom|_lᖠ{߻.Qˮ_K\ !M_=~O{m`~L,uv4v욟e}:4Z*k/(_}a g?DtG? ^׾5\DXVKM w|g` PhNz#!"%~vjv8HMb6D"= YD49e^~3:v6Bgb֝k?F7;}'¶S ~C!r-7,>_~j2FDڄt~톋5t~{౻7jZ U* ed9엇 sm- U뷬ZКH"X,øE"Q_oԤŐmNJNmj8Uo&-c#}"CKNxn\- gRASv5>_ "s+Īs`*JU8qCݙ삷rnmD$Whԓ?4اP(rQݟk/Dyy}D$:9?P>5Z S*}$pC!t,ցQKD豻eۭ{f;j֬\Mႂc:1)U$E(cOl{s D,ڷf9_™ ,^p/zaL.1.]}(3y aRLND!]՚&Zϒq!c)_ C\x;l=FpEÕXJ)Ë&~W|!׮m7~yuw a-憒ȈuڶwljO  Y\0ĸc=w 3E.Ox^]ħ@~Bbqi"9?͘$G`o"y5O 1x \':+@05D༂`=v'D9%ÉVCDw6w 񪭽"pzSV޶v }BX߼'Z"[o@!"Kr8!+sfxQ p"z񥟝:}*+ʾGS<'.-)W''s}9} `CC. ~3 g)u }OժꚚ[&&&|]va$*&vy9gD4qCIhƱe0Q NI@hr(k*=ڔK޵}7e^ o>5埽mNڬRkUjmp a?'HN`Oggɴ=|r=ݺm}^^wlW~X_Rqz߭u(= [ .:|䉿\| /TNx\M\\|:X=4| HD415-e$@0#AR/( ‚urrvu]b7l],钓ӤR˒ih Nff^bb켼.%?R  CC?ڿc]F|.[$&df:0R`\y#pd)4*("x Y"z+\F|"7Gz LDě;(NjjT*mFcE];vV@v;%YFF˲# #K]RY, 5K\_;"//8(1x ph_T'%ffxx?xؘ''Zr'&aFFnNNQww5#`RF^ h:,>a]ݩSK&n,XF44 \p]ݩӈ [}x+~ B}bJ=%ګ `b:}K\'Fh8zJ081bRm+O Dž!/@Q)7˿yPpK_rXSx?LYYH,GEΙ,N#-~¹!m7 3{KK_ѦOY담;Lz}0E"XrX󸦦veB}P_/틽'zv޾oϟԐ64|ׄ""<-4\l Yuʏ>?Xˡ!_(B'eXT*3Pk B *r`-X=|YZ?nGl0.zSpqnfUi!]lLm*G⡡T*ٱ*+#M*3^4۸x":x\w Js5h5=@@{CF6~*@3ߟVPz k4񒒴Ԥ@hr3(B/eo7INF&"a'&;{8NxhBDg/4uscHbnS_w6|%~?CNAsjJe'&l<-J ҭ6crtRLܷ\Ah8=Ш6WR#A xb]>V}fm\AD#N;-51x)G[6+K:VxpWӈ", .HGڹEVddQ[G.4l 5:[f"?g|J16>uE!,KY< ~"%7~AR6UafG,KفB!#ѱəcfBV)gx^-6\犛Re)8(1XjhhHKLuMOe=^5.Q񋡃5(7XB޻>l0L>h2;\ 8UcNk yy% KrIKI ,6[o)߶oE^򒼌4=y\aI.TNgNꝉ"' IDATCk~dY";>t{'c_1B/ bK1vH%bCj.A<pq 7/%nhxL&U NGDi)J382:''Ua (9Ik}&30s=(Ӓt ~s늳48fvQRF!'lZRRʥDtǾb |!_uEs}pqy;*lCeǫkLN_e=^5.Q񋡃5Q<ܜ7&kƾb |!_{oqäa&p|dE_SYT)|>J)Oԩ/"y<"JOɤT]-B%(u *:_(8nVKPQ[`Fk׭|>oWGVN#/ (u톴䜬4H0^fC)j;~~2Jx/um.>-KԳ,٦ƭBCWպB0RrinÅ\{\.ɖ'DVj,((6(MZQѲe/[v|]#.")kGuA}//1ww>d,m%o}.SC:x}Lokfdael{0ѿ|t6ks`|z Qwysu7U̾>=/_/k.) 4n_1 "\=BjCU5j)[6KX+2V\(9\-zI̅,f0}̧ /& !4АeY˹W)/썵#A5L*M(Xwdtd|"ObwpÖ[Y6l!@XLy69٪vӍ#KվۉlmB@mSk1̪B"z8?PU5T\'HD}z3gs dBytɈ sBX"r0?1h4nI 4)3.ߡ9ij ӚOQyն$niZ%g1ӨDD:)hD$LdgӉ ƱDa˭٧K_АmsJ) n7c9s%CjRRjs?`߼a]NV\lJty>=Ztze*55r2@gȘ;6Qq(9IVʭ6Gå^N== A/ʫn KrRB`TNgeeDƒGV,T(dZrur* ҽ>xźp;HK"NQ$".73043Dbg`aH(j5y'ζiDz tw Wfg-8ǵURWhnPVmK.A=ɘU~ܸT*&"c5>7.KҩW0;C*ƭJTOYZ·,VCRS)"*(l::l7G||}nSMiN#lJ4w q< CD|X92j \LK=s^9SCFN eGąh&2^(>>?1,v~sskiN5>>/@Q)M~?A_ @`qEϔU"ʋ=O\"}nrcƏ]}eee_P_/ q$1r=k=y/P$k.o˹WK);xMTBC~|AeJea`MA\aSXk05@!ݱ.G ;MЛs3J bKGGwelCUq>fCCTckUVFT*f^i45]ٜ]Cf ΅Vc߳{ "G}9FmT> |ø|%U*];7ĶXb IP2lt MO5E L/e^ԫtR_>maG}D0'K'"r819@lc[ 3S斶n.ܢz/ַ铓Vȱ +&mXTȄB mq"z;Rw!IQAnky*L]wn=#";x_\c ] 4l4edn.v{.>)!?ǠˎwT</I&"ef7__Dzఅ |48NDYIYD426v{uB۴BxcR5H=:;ą6CÃGڹEVddQ[G+44wTR}$i0vkͶw\\ED}ޡ=4jն[7p p:gQo "cps[?Gn7Zƅy9)Dgknx!ײsRrɔQr\HD·,VCp;0wŁJlpl0 CH$4&G'2\B.-hrjf,G 'ޘoT>I"{K$!mxhhHKLuMOJ)Oԩ/"`3i5cD3X.7/'U*!UGD^3w$3;#Y*{_XSm-'2~Is3=mDzlʼ^zM(b!S˹W7 >AQJ!5  JeaSdq!\ aEET`A!@\5 MmSk1̪B"z8?PUԃ+O~1ܢ_ctn#gFQ7j{vo`:ŏr )۴|+dJ0VCney![4CV! nSINF&"a'&;{8N*\eE膆O]vBöc``𚼜]G<˄RWw 'KD3ST'6UNK=ͭWttZAEDKԩH,Ur>/k9TjDz tw oS?4,&3tW˯(  [k+o.^& t KeQqRLa8?6tP _r&ܟSSD$=VK\D [B}P_?{#BC*ኢ bEl5Dhۮ^C]bJxQ0B!Ąh67׻\N)ą P1YQl5SVV%=g2aZ$OS\pӫkjjjkkWf_YYY}}}/ B}q>I̅Q{ׄ"!Ah2uʏ>\xזqs!B''&CAY졌҄ppiLAYfDU79;x}7Cc8 ©mjm5\YUZHD[::C/gQt1*K E"auEQ^NFy6|Lr' Dt}lܽ{3{F"m0LrKܶẓSwr[ ?q_ŏr )۴|AdJ@,VìP RnMЪ= ;aMe9kN/eDDvCQ0X=N'BC7'hv?^ y9uobМHU |=9i;|"0/0K148Z0>" 33R7*~;-Drx ĊeQcsxm nVͲwGmعcP(4d2IoQ*dIIZUŅYӤO DT^#uY3+CS{"D!QUQD}`µ2lE׬($ x<./ͫ,BCP@Dщ)۴^URED ]}csoM4jfL!Zy-"=UTYC_\|GDB+jt JXtMBFD +e 96/\SB )R"ڴdMYmvTLDi٦uCjr-!KPx< %r hC>@b?2?Q1mE[  *ttM]LJa>nwTr]3Q!"c&T*eZrt.4t8\ {dtQ$[Dty2Z)'"R_ &]% 2>~1t? IDATCq7g/4e ZxFeHK~?xkۖ<\kHDM-Fn:2:iw8E"X,rL\TJyNΟxo.-*.̔$I_$/#sjf,e2"Z_R;ܿ=/_/ 7b.42n_@l3Ķ(k2^(vP1!.e !qm-'2~-?F7cw8vqpx]oDt|ip Yٽ^/ǐѨ;M'oS ߟVPzhE[ :D?lNlk(? sRE:ʼ9^"О8qr]^Nv^jin^pOPV0/sso |>Ke|bh5(7صZ5lhܱ,_Q^N:q˲HcS-O/3ȤDRMyI^Fi<[$Ɉh}Iantp=PfrK h[>4/'@D drj'r /2ҒR-+1t3iVͲfZ6(MZQsjO7<sf,˝FZN/s7B L,ҢS..}E ?]|`Hz{z~՗}xG}hemT2슿|P_/ވPJ谯5ܦ eضZ5.z9XۍbC4[ ].'B16@ bCaߏAЗ %5EO>SVV%=g2aZ$OS\p8V-QSSS[[2닿|P_/Ib.4be /& 1x BÐW~U ֔Xƻ# y8 `>Tfb@4{(4!~ 0!̈f9ǿ3 GXn#gFQSj )87.ttt^&6T*O?@a#cg7MdDt|ipov":[604~n Cf ݛ|]Z;9Z}-/G}9FmT> |3RdJ@,VìHPKV==-yRհjLԫzuRNPٝ3&=BO%>Y:ÉabՊrZ{=R䫏%z]_JsK5j yp\՝_/zQ/je66&B $&&IL^0Iգ{^MM„*H=7ȐeL`!a-˛dmvْY[JV[Zj몿u9EDޱmCey;~-Pkf^CWNv|>⚴Qj gEZykh sy/"Uݹ}kn*,ȩYe2 ֭( etll[v!rUqiQ^vlѦZ-f?ڽeS M.f[Oflɤ)P$j~Wez;q qD?Ȍ SX ˬSe.:F3^za髯Sh8vrͩyڽsRyu|H|EO^S]j8pPy X")%q eRCuK⽆ڀ?@F^B@Yk|a\zKQ,}C!OCԏr`O))u+2SOd LM&JG15UVVۻ΋x/ET]jʚ<>CkH c{O_ 5Yy)v;V" `?җʔ歶t;s)s EnRC9}nu.xZ[;co ^Snmhm&ZU\@CyxH=E#M}%_y^ su|6׷D"+/ʳZ,jZSMJMjDopllBz(9*"~oM/aq]6UDyȖ+vXV"|] mON(vQRö TlPȶjD3|m]=8ݾ ;r򵏎6mZWY( mnni?B\~:yL2'BWװf=wՇ%Mﳷ}|_dM:{.L‚/kdlbphxeIM5 _r)\>lz;`YIia73oۻq]Uƚ԰tuUm^; BO|~^ȶ͘,̈́Dw$~`pz9Qk Q,KВeF^,qZ22.">@D&? zN9J7_woDkMZPZ瀬0j#`! d,Z j1dI8li!cV=fkJ򳕙ҷ}xMqr@Jsw۸l6Hey4t[~CmeiTjJd4Ȗښ|ۥ؝9jTj [:e"2|mlkW􍆸%vn #մy٬6u2)a T'UQO3 qD?Ȍ SX ˬSe.:F3^za髯Sh8vrͩyڽs"^ċx/ ?yMua%{^aowkCy@ݒXkHjnБS(5 0fz(T!ͧ<7eCoiCkH c{O_ 5zա3\`XCD<~ *\CLJfeJsiljm팽)xMʺ5"r+jUqݚ*JbRCٸm˺&\|dSWRp_y^ //%"G\?#"G/ ^U>k4տbEF~n{Ǜ ֔oߺ;VWdy!r]ff5o}c3[w㰈D=02,9w ZC!SD.Od=9o4\\s=_n:l;{uO.*ȱ۲F&Z{O騮(ݾum=+{(*I &t$~`pSYkzMFd,1'=w)^$3 rUfض~Ƕ--YfFEVI:J7eG;fT7F#_ܽo\kԊLp:dQI %ְ`hug[_[)"^Ցf6kVd*"nGD\.OxХae\ }^VIV[Y̛)X,}؇(7zZ~U+rǾse5$_D>9z& F޸l2Q9}{ڵWe@j1rWP[YZt;ᰘFR[SQtZV"/Jiį~shu+K ֮.j٩3e,+ %hn WU* elKnۭddSbYm6dRxNJk Edly4r?_d3-D\;#Kz/ׇvy?>?~LȌB{|<5pmSZڵ{;/E"^1I -}fK/&ˀP$kmn>)SzKQ,}ɬ5lokC!GVWPXJ9%PO__"CbzsLwdr\H766z{{y/ERxK _Jex55 {O_ T,jSnw(MAY,[`0 S,}i\C=QUๆ1{@D>to;Ehcū"r0GcSkkgMk*V֭-]UTQt,eIC9#CyR5KՌ>:rH,A{Z'!Q~[^\`Y;w}JtN)"~OɶmXWEjd"OeYEDl\n7!*Ξ~ۆlrNl4nCuvU#kcM-;/5wlpaۇmYm85i; +JV%<1>unpx2S2y٬6u2)a T'UQ29L-X &Z=?DfLJ\Xf*su7 L_}O>Dñ[mNk;b( ~/}I5Է|PA+(,XCy7^.cECy =>sLwdr\H766z{{y-xPEzkHE7*MuIDAT0=5?xe}אL=gO1@ZQkDd|ld|ld,VjO\=혁`$s( }`Ϭ[Jo^HB%/O\H!HweQ[ %6M 9эAcO \46vbe9L\nMEH[ˣu_"ͯDۻz㔞"ё\ u#"}oyqf*#<(jPz@2q{!Tj _?=Pwq|YX7sk~t"88 ""Nf>w\n7!dR/?PýOݝ+V<nRRï?yjP鴟پ5}^kW[-&?;p@`8 l6 : ]vȞ7o}*"ͷpyL2,p^?x<5h4E" ݸA5k`˛7DZfy֎ނ22,0,"O7syk*Vff,/ӱhѱ ٱuݎ" -Yĩaúi]ݖOf3˱mR4_OUsG߸֔UqݔFm$5B|Xa(%=ʽgk}lr{&͚%"Vy*'l<|~ҰR \e8;3Vmi(/޲VlVmk5ƶ+QVsW5iJme3o>$?[,}؇80ٸ*/7{k߾Asuj62 U-m=kkkfC ZL9_q8qV\1(7z՝euNOÚc3g{DdZ^tyYlF#ͭ}iuYo,-rXS׊FR[SQtZ0GuwQAnIQiOlj8vrͩyڽs"^K#^ukK&Fr2wڬ'1,jo87VAjm7zg·auym ;}ƭOCqKx =swHV|qS ;V(XNf%QCygMRE(j}2VdHLޙ= ;.thgw;΃]=eT7?CşξϾon>֒.2L.+5ԼVYYYoo;/E"^ o0SuI{ ^vN4y~#a^[F: 5\hjh4Dd|™`m9yjtg~h4N r&ND.]uMx}Fk;w|uEl[1^aNL!ˀj7n-ko*5t=fђeNͥ޺֑mO?cGmmk?qdt\D|hE<wm_C2 ʈe@A 5bE]E"^KA2 ʈf ֯?tX F, Pu^ċx/E4(Ӡ^>D_P4<٠Ka{GN]]o˷(1{ _rƬ7<{l_Yx}8'"n|~r呅'b겓g:]ɺ^}O>._ Nnݶ95ڽ35ײ;/E|w]ڦkSɥI#Y/4`8'/D$eRE"^K9/z(az^o5iKKx>/l8޸cx<=U*z뼈RuċWyeB?Sig_/y1A^8z4wJǾ~o,Oy+u"^xJq?VY8LfRD=}/}MYZCFC /Hu.-KILcj0|F$CSyуx/E"J笆KɪA\qf3vYE]E"^KA2/FuƵOpre&=G (PP?oKv#h@Qy/EKuI(1c(c(#cC7,"^ċx/HG^ӠDhP4oPPjh(ͥ$AXdSy/ERCʈtCeu"^ċx/ 4(#.eu"^ċx/ 4(#iPf4Z6J9FCba41 (h@Qy/ERРL2⢇2 C 5bE]E"^KA2 ʈe@AX;j@ %hRy/E|ѠL2AnҼAG^^$>gh(5zn4&+H@Z>xj^ɭ6v޹W^'^ċx/%` AР E),aP u 1_HRC,z뼈"^kƫ\衜B4(#eu"^ċx/ 4(#.e@G^ƽ"Y3 @ <\BP56(OyVٛ< ó7RC,z뼈"^ċx)LeEe@2@jD΋x/Ee tC2T)H$ۢX⮍u(yY.񱑹llEdpKXvվHnU]>HDl;o7PMXq}c[-" h4"Eioiu⒪\ ovۺ#vw^6kn Y؎I?0n5yKa<ӑXpB]Ǚol̰;V6ݸ# DvLj A^ i-V{bw4μ|yvgw ^Y鍫"Kf1 P?l%=s\Gdm:sBDkFo?㎳Ƥ /ԁ{ 5~%c*7no?~}>㎤g7!Hn~_xnɷk ?D C3|yRC\)^yӈ),ַۼ5,.Y%"=]D󯪨~kCXdXoyĹe*Wq!T$^C@Enslʿ~2SUiXNN85m6MHjɖmw?Z^"I ychϷ[Ñw-Vh^I ya?IENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/Verse8th.png000066400000000000000000000751671366722712400244060ustar00rootroot00000000000000PNG  IHDR_ז$ pHYsutIME1w IDATxy|[՝7վKmٖM5BIZ@;i;O;̯cg: ӁNÔBЅa HBv&/"ے/ڊ,[8%/뻝{9{eˤ,K!BD%%t}ͻZ)73h!bz5uJP=~y؝lȸ"-v7M:zL_oQ.Y$Q^u o@>=RL7{߸'0K<4\{El0PV^56nG>+weGo @†,CX{{~Nu_ =3ZMW(ƸKWC4;8 aU?pU;M|;eGx>8~;ILs3aMe}oɤ8]pN_N,q^8>=>DtWyu:R'ݸm#C>c':[Ck~~(}Мx`æYO4v;"/m;O}94sw^懔e5G;)ݒ.܉~ݺ}[1;P*9ē/ +}7N"l2v.?Ϟ$ZIiU^~17\ol~>BBfkJj:I|O)/[hB3mS'=$mԉ'ƭi-wDyӝWDDr9OhtdHeۍ ,Cg߼N>ohnqmѲX)ޞ 7;@DG>xrDD^_+_r#_<;q@"GܝecR~Mk:;_T}/^"z/ iS6"w%w5ЯWWpcm޾䤿LjΎQ/͜>g~9&)VO+ÖS'>ÁsgrةO?ܸz@ɇ2ԯզn~#7|A[K}scD4as 3g'&&'vHQ6\./S\_XV{xWgC_NxOȓ o>NDemϟ|?ֱS~;|~Pt87+->q·,COC2 Io;19;.j$,Y+ ǵ~BH'4-5\8clW+ʸ0U~x<Kg&'R,bf[U07@ ).cfNN튘;s~,Ce.D+מ9Lǯ\sglv{qq@nQe,#{7=S~r:D"-9;.V:Vo6'''O^n͡{D؏M|{|mnWnC_n:?s׼;Ǯ_xm+@OME?p? }6ם4n۱Ӊ1MRrh?y ohмw3ѡFFƈp@(t}#KjZZ422ːHDu׽_N6T=^w)Т,LNDB(+h28hY0v?R28!׹юWxׅ,hwK%_W^Ŗm7]Wdݍ{o{?)7qF4Ek:pC~w7 =|b-{?);o߱w);S9hWy)\{g3#S'>:ɻwUm J.jS{|Ac7Z/l&AvrDX cs6B3zD41gE~/=QXr:( \.FLD23YشuG.\KpCs'L!>_Vq㖝,x7P(DyBaoOUcJIMo?Uo.ʬ}W"dNSM -.3z=L-fRA6<'?~f]<H)Y4Wɺ㟼W_w*;Cv~qJ"0wg*"|>g>B(9" ;0_ +CBo+x p!uw,L>Dûe36VXxgo'|{Bsp^<7FxjafMx?9 6.?zW %3;>'U n|wdPs]ZaçgD˱8uaӎFۮ۳=taQl_ B+|B]zE_( ֕wIDBQ@FۼtӾwdO$iSАDтln ''*ukf{rӾNTrJP(yCߌ~ϳ2D$7z)\58>yW !,h/{a\1n $ m_>ߕ!W(#:0sҍ#]D*I$*uJtglj@ Vad~ăΟ?ӞZNLr,~3SG &=wE+?j$Ј6 B/gڶ2:VeZ %a۔}5U{qlj@"GAY5$!}yQk!3tk k 'z}g $$ӕE!D%湚:@jmk)*4C`;vbb|پsu㷑 u7_W!`M\M9?,; :-pK7n&?ί.д|?9z"޼u4;W/fޕ3WiIL&u-m~ٌx6i|{ހ Y:Ƭnax))EBٲj Zz^/˒B!/KJ [V9eϜ9ow0 2d՚O:usPV~y~@ {s,#ƼoWM]=pJCCf:}td߲'ZtwV>cttӓg6ܸ:##͏QkHjjJFzZcc3b droinoX ٲji E`0cnȖU/ 8`au ;!ZҨj*O9{#?qL&e&5%y wΐ1>>uG 5j5?~x];k4jRDS)dE\0s PmCfIŰdR*x恒Ңs p豓ios];+).&vSŖyW۲yА 5U2 bāi]!RDSgJ^_<\iBAy]cGOQjjjqq@vD "4UWkI"/w)t߆7L~bY]YR"bK"m~1kOw_MM%b+7556JK'h LKQpX"޺m\.y5[{y{v$>B};wnvM͞x_+_awͻND:]"oUow/j_+JUjr#.D¼ːYj΢>*2P(ˈH" ,ؾueg;#uuQLmlyR)]soٳ=|irzn2fQWw4uQNDH`p-m$F<] :^.;WGD,ѣ'JKRSS90\P&,{"̐QTm3Ì4"=}WXQΐzә([W:-sȍڎ.zʋV0  "0e4uWUW\X$PxLnq%Wȯ۱rԝoؼ#Ff^( ՕDt??Y?{ {n>Ft=wxMƬfp <322{F=܃ܽbύ;>>鋇^M܌OL}x4|f ԝoȖU6ioo|@K)(4"OV-ab17H,c,d/6aKKKt޾s|${dr@|q+zW˻kք'zUo].z>Ĉ׋k#Bv_0Foh <5\s:U/stxI%~~ʟ165Oxop7Uϕ"+"4uӁ<\{5@hBeȌ|x-{(@h @t?e{k$85M$`YvUDۈmbbJցƻg?91s;nHD{蜥o.9pFdY8 v/Uc;[R%|ގ&Ǎ|rt~8Ҳ}1M=zK? .2kui:2Ɵ?3%JCyaR_=<x|DPy^Q w"jެ]!!"?tY\kx7윬u(&Vg,t_//wWz!/((XPnW{{QYن *UVZ\\YUrKaadeV "Uy#~—eLۿeY 쉧/D+VQ`DA `[q9Effx<O$'eef znh{'p䍱/\y7Xy,|7\`Ŭd=DDtߗ{ZTthl#D4::d6w3{,DpM܉lvYC|</ ,1,2 y| Yx\b`0,;66<:"Ω6D":jrYaHvi\Ƥ?[~>eYX" Cve;S(T))YY<oddh:^G,d u ֑!/chg9fMEQ7q~2giq2@y޷'Yejl :>33a+  ƔtPJusRmn))dYvrҊReɩIjyuQ.pk X=D5@O0HOy_`0uu?X464.oBA5u)2mmN՝ 2ss0b:Z©Ss0::TWw… ?XZ^|uzHByP^(/WR4gO}Js!)d@&vt`+y<|> <O+a-fW<074|wx`M<з-C`0K_xt` bHH3ヒ9k6gå~Z> ghavgٳ?hӗ, Z7i mb_,ɜNT⚚ڕI+;;7 ByP^O@Lfܽ|zCZZE t!˲n)O%D!H-Cf>0?< ?k&=!@~ۈO E[{n&O>뷠8QmcK)⼬B":y8?G_UEEx֪lCD"vdkh?OD@V-Z`[x\}Zj2{$P۳`_nFJD]s2.ws[7aRR4Pt8>0n{M$G""˩VH Bt iDt\Ssk7X$=wD_ODt7Q؝uyeqۇOE$eCi1fw~tHV#ãCˋjbJ}zex<`9.vV'^fw̻yqaD?ry2ғ×2 mٰ9>ahCWN-טEOdR}9wJQTSTCD=G#OOsa[GoW@! -61<ެuUJc罾p9X$`/% ,c/dM.٘g0uŅ9mݖab.KhdtbYSr"h5\.}vL㲛`RG?P-91P:84::61f0~v"0R!KMV5Gj0dl)aƕ+1f?f6$nhxmj@[F1d|d"C-IjuZƈ/m./)ʑ$N7#-s4`tbnK`C Ք {tuaI&¼tjKYn)a]C>#57;C(|~s&g3 7iԊ$[{\>BwX$ܸxONYQ$WHQk4*qaӤVjt\8`:103/Iꏘ_/9|Naы_~{W&g6n^y{P^(/  Ԉ6C!3a.ǍLXxn G 5Hpg,C`/X/ <~Z1?P$|2]<.3bEn {q^Xn@䦢M_֮.Ql"55]hkm=KX2tL%]{{{=ȿ _ByO@w܀{M3n'= aF,˺ݮ?ǾO<6:-":t.&:DD" kFQTxmj@aBmli1E>#rs& IDAT\UUZHDۻ"諊uP"ZmȐHD>nwvu Xz":ye`h %7Sn-S&f/Ļ4ZeH>L`_nFJDYǏ [nFV* `UG{wmpmPGZ TUD$Hdgr!:\:::IK"Cuo0K7ъםCCf>Ņsb[_ADZ23t)qhظ2Sn,Sȥ mv{|DнQŮL}Fk3 0\h,˓I|>N6z>"oio%{GH}"?G GxDx|7X=ޅ $|h:[DZta¾@)'m\Mj5NuEѤmh[+ r7\Yc~Js'm^0kqADiv8붔/xRZ;Y Z|euڦ\hUe9,˞oOߒ_.|>0!tLAvTgɤ@ TȒhv=QfV*ekmP,N6IMR=Mh5rmZ;8kK y&'TJDK uk|y 4-5{ܻw7ҕvA.,G_ɭV{tXЦH >?| ܎ecJz ;7VN7` 9Y:%<Z+K}@{@YIvheXHDr$/[CS&RĊHQk4* e6MjJVMDžs>amڲu2!Q!4\:[7UiYKu\X0L67Bw  -5[z͖Ƌ]$wwi0g'1k ]fBGX,֙1]aǷ?8Oi$sġ_~{W&g6n^y{P^(/HZDT7Q)D4isOc\Zq5/\-^ŜNPVx<>xCs7!:g:6}ѡȿ*?~+q#&튺ЏYG 8Pwx|ː9 Kn@>ė [vn"G^S/EB'ŋd k1o"7{:h/ME]E\x٣DL/kj,{\;e2\ڕI+;;7 ByP^O@w္{Mx*=ސ@t䳇!:LeYug~% ֔C%H-Cf@iӋѡd(*@nnزeN#:DkU֐;b\/޽l^VnN׶ YQBjLeU9|dA?o~ D'Lܜ?|thU<8 ˠOUȥ 8nF-Sn-OE%"/Ļ4ZeH>e;܌TRk>%1H$ܳsJ)>@Ʀf= "J.Z""A7&;SN !@chÖݞDѡ>#u B&=y`Թ&KD?p+5SR6؉z넍< rӽ^h;//U)e.Oj]./7J)fjb]L*y>x֛7Qi05ERlvg˛UC+ԐyYEyնPmz٢Ò܌ȗ+Rmx%E9FP(8|Lhʲ\Q+nZ'<*%jH!SW$"<&_ Ɯ!P Ш5[čX}ZD+s2enZ۫)+4tk-޾\D}єQ|m\"ùpXy TSL=vӠR!~kB.Q)e6gͧ륷' qX+E^pW 0 ץj7Ք&kB~Y;ڈ7=zT*&".>٣FinW*eOQgU2:+L9ၦX$Lg<`RG?Pts06lqbO/Ot͞6ʤ u mE6WDFu<2DQ9BcfQcf%GdknUDK(hzD%Gߌ&SM =9>U%xUnsτѦztcxD$3X^8O*R4VklNKMR)eܸqbJ45Y= }zT"NOK4XMRє2Ք {LN2֗.'wSy%,<>\W~|vJJ.4vlްn1[7vH$t}zʅƎm]7afF 7ag5k;*aXWBgא.U-&l6heC l4*Z5`|׭df,ny6\gܿ7o"zĂiP(3Z@5듛6}YJ#ˆŦsO/bzwe*3u7ULZ}xw^(/ <.0w۵QwzCn=pI|ψ%xt{g;y n>s?}^_SӅf1߳%ɜWveMByP^(/]\Yv9 g9GAtmncW1XSwDe1 C"Z5#(*@<0r矿WDwИP(- (RsotB0dL=CC 33y:\ʲ}u#b233ʡ|`x5%r)$é)ZؾRb7X&m&ꊢY!j[+1"R$NgdsC[Yl€ ӬKI+d#/D;*aR*"bYvrf' #˲CV"ҧkk*negfO* SsL^?~KT-טEOdltxȩU"jm9r\h3K s^Us3M=&3wt_"#-9|m}gη-fQESygp-i$Jn3֍%܄?[rMϣ(_OD>!gM/CcnGZ&'mچn_T"", eb"iΓyI _'} ,3RFG&Ƭ&NDbґvȤ⺆ₜ-E tҦIb>!qNn. وebRf1"R+eLn++jYtHӔ}DVcoFhK& FFwzy}t]2|Pa4<CD2$'+}h쫩,*ϒI@@%kU}{y0XuvT3K$""ҧkc7 dR%bKNR=ۨn*/ͪ( ã85%FC<L*%%y:՟@Rú6}FjnvP(ӵM(`4N\زLTxKb̜,˒}nZ%M-=m)K֪R#cK0ee%1)Wwpo(Lk Ydg9bo!@_.{d,^DFѨXv:iRUjj:. cYv1}1 y>ncOo@<"/n\B܉m/:DD" dV2#@ Ih;7 ÄRb|F8/7wE/W#`%u*@tͯ}!ڢ<}w!GP0KbѭGX"rOۛOSU]}?vs><ؗR*{bqtx[Y^HD=}C6YUH'7.k%DDSV Z)~˅V+$O^谵=ƘYY^MR1Xm ;z ~V":_ߖ?~r17'#d/t7t]ցEjٜ1"2W卌N~zY޸a-0c'mεSZ:P V+fZIa ;jX5us~o SYo$iɟۿc65dfeWZFSP7/bY<0JD}ᑱI"&)I֪H$2'|>\S%kע'2@M谺:Ok""S.0<:ljoXa#Ij"oPeQb7=B87lr^DQ˓[&'')y|Zk"]0`d$Js_*FJƧc1$)Yʄ>?M9>ϻeR ML:_''H*~dVfjr*Y&iZ%EVE>ODmLDLD} u{NҥL;R~n:^WS^b4d8\}3q9ɤR"Z_RsM噗@U`\eٹ%S65`Y17[ODqŖF͝5 dfwvv sK]níK. o+FhT,jeæIVժp絆-{!䳇ֵE|ΚMpsO/r;yc&kciOn*e*+͎#ң?s=zŗxޕ8{nI띷ۿwHO>#\P1˂aW C"Zȇэ,XgVE+5 %gJ/y":|LW>nNmE=pq^VUi!ono_*Gĩeo;\8: E\Zo9~~)߽w>mDtmbܾo3DT[o߳-#W?ZL?OA"z8}'էժ.G`gHU)xǏ [n^SFZH i!՜ ܒ{,J$NҨ>_WπKNR_bttQ(#r*"zCk3t1:{ 8/۷Tde8p+L`HU*M]eW,Ó|)=+=Y!G޺,^}# [3 $/i!-VmZNicEɉ+o~H$k5f{<^n谸0g׎T;8igd8n븍M*E_ex< h.t1%EٛjJ4 Ď$ewab0408&> IDAT cD|>_QR5TMFEnzf^_0 KAǻ*Z=iH Yw\WC-K GK:n~NB.^ܰxsM)k[gsD$IhMKwe;٦Ddr-׶ Z\D, Ja땒߫k ie꒒TJB μiy®OUkz0)Ii764wUEZH i!Xk|^m5$7 z>ZH}?DpsRL&arDls % D"vTde TR PO(0K*$Q_hpYID0/]p93/f%//w<"-VT?/AuE1ϐc4Jr2h|5 [SL}J0Nm 9Yi,K)g{p͍0ېܽi}2"ZQ,<[ÆMZRUqe;_ZieyC1,5cq̳R?c- ^s,GT>hӗ 4;"^lJ[=k_~{W왺W&w>o;/ ByqKq^Vhh,@[,#:c!CF&ąo;t]V ?:GV~gX` 4i}HH<}}^_SӅf1߳*ɜNU֮LZٽw^(/ x⸋2FAt8ϧ:3?yBkJMVw=Ot";܌TRkǏ [nN`A+vx[Y^HD=}C6YJ \t΅z ÐGmN# 9\NZEDTohMv.CyDLZ.//7a҂Xc'spak{{ 417@b.vv p>Dt-+3-)I922~tc:cnNF0^lnj7EחKR)6ИEY6̝eW]n4S>֥^Xwſ@H'56~kD|dZK\RwצdMO`w@Jz EYTO=_zZHJR Ybp}e6iƪ"*LO*2S`c(-4dhxd sg$TQ ja@- ~ڀ@رO_~aa~o^z,*\]YLD M~rO560|'[a9VH ɜu9,vcCAGD 3Q?[+?VL w:0,D,Nj`.~ZYV*D46>:f$"\:+RM?#8p|~"|~a޾,5YmqbM"єɚEh/Zn IHINӐӦM{r=M)&}!o)&%KiY `[țdmvْZf?463}?p:y\f"m%9-Yl6f …qZ-VeMM?yalx}Rʣ=ɭ6'g_ٵ{g"^ċx/ž0Ӝ5%igbKC,%!RC@CnQ;G^j({aځQ ?K_,W m'f55jkmy}Fә!9*--I"^ċx/2Tƽ2=ڐN1t]^ç2m{æU 8,}YF(*@!mny=}1{ G{/ihli~F|5"r3rUѦO ZŽptW%]"Q}s߅+ʔ{nc >DXC!en.][nGKGT_ /o{ʊVK{g߮oU.0FE}0b6swFs*;,-OދgΞuu>cXl߮>Pbq;SHف@ZvP,"t#:jCEK[WGW>#~vEzz^wPDԔ_Si>WţM~@Dt:mW{ޏOFn ~k]dH<^^Er)ۃ' {l;h49ʸk+o߾6tgV2gHD6oX_i}UvLFj5Օ%e:]{ZmhD3Ғeˋ5=V[c);{/]l\[%"';. _=ŅY6U%"qt=^{ٱmmA}60by6.nL_.d1o!,E);8<2\3d2;6ݱcSxItѐ!"#c"22TNmj͜6fV)KM;*Rھ/Q1C+" m rSaH `X^;p̙ƆSWiiW1VKX,M}CM-U%۶8(}m󲔑ꊒ7Ѧ(y@Û5=ۭ֯0g}~Ւo}UmX[a4s'k)-7yD4V:\}PHl./sJKC\FSv8MښPHGζv*Nn3*V6ncZknlM-][6V٬6%O$pb\Vj oՉ{١FVN0UXqX?#gȔ9SH) ɌCel9mj Mg'zW}Onݶ99:|Ȯ;S︈K}Efߏ_V]v8p`|z,e=d*1I@_vv]Dy]q*Xf A^ Z]~A -.gHYѳ/H,OͲkj:ڜJ5N39wE]]]CCCrUZZӓzE"^K d.;{ez!;bvO}deE=dT{Jz@6)f6 QTTSSb g9ɾ"Q}K+\ihli~F|5"r3rUѦJN*63d/M7#_WD>8Y@F8+-=?S(aӿ)+ʷZ-}U)x;޲\@]vx]iͻq}tDd͛DsĖ?ED.j\oxD.!&d %;lmѦx*{E#k#gΞ쾠Gȉm+̗/_XƵe ٖ9*,?M% 5bY}/kWuG](W2{>y{е /q]eGEQ_w\ZYec+Cnll[ҋ&S5=V[cdưyci:&q<VnP65w6n۰5q?MKٳSfE0A <~u2}``yO?X*P١9 "W +:4,"&äLx}~s}>tک;QZ(_ݳ0t;5fhE>txs  g>g3Aj%c 9\);zND$nU&Nwn4(}m󲔑ꊒ7Ѧ(y@Pswشa]ɤbil Hn}mEIP<`-yS;2*;ljTе-bQlV kCbZVx^xN5MM?yalx}Rʣ=ɭ6'g_ٵ{g"^ċx/ž0Ӝ5%ibq/;$;P9=wh';|xKm$< *!nei*ihli~F|5"r3rUѦJN*ÙCɰmҕF_|dcۅWp_znپ g_?!". \U>kԟ; m1e涞gګKo]e˜3gyY\~@u2}``ۓ); \vxɨO1O) _83rUL&ضnǶu%͙b׮vھuV)LQs'Zh4\"ZcVdC79/+ pvs9cZWW]]~Ⱥ5"._^j Et4N54x/==-r`ҫ8(}m'W+Jx:G\+ O+Odilpj,) oXWi2 E蕡a9ukݚ5We ~b6Xo`ԭ()t R[]^p9J剗@b"5Jv/~ud떵+KԔ N5_\ԙҒskv45wիWB22hm!fYm6K(4)IĸX24CuFy/<\3%D\+7Sz.G"Vz7jw7L^ׇȔB|G{89?~rCGvޙzE"^Kx2n{Tl޳/*6)qsP?wu]VDy]q*X_vx} /XCď.C͏}1}ED+zxL|f+FrśŧeN`& 紩3/4Wy}MMZ3ty_Ft&箨khhHξJKK{zzR︈"^ċx)< esJ Μ>%ydB!u?|{ ,+~>s9kN=]-7$,8^o<-QTTpÒp}"G{.~{nc >DXC!ƖgkWnZS-"';+WmR3vV=i7(+Z2Z訳 =U:  <۞|ٷ[ Qo-+̵͜=hÊx+~,uv_|Yk+uADԔݶm+o}f|;=^^}K<{tеQe#fSʞe>v[*ˊ*&p@)\ Sۃ!PW;XU,"g΍9\J"r}xT^u[BPGW%Mkpdi5˺u\$d*w?7ZdԿQkaXmuvZ"R]vh0Edt1-Vș7i4˽am }#cNhgۭyQ9ӘӥॡP(N7[ںO̲e޹b1m#JDΌgk^b6:b]"nL_.dH.;t&irnfAD(:4,"&׋W+ˋyށ[~]ӉHT1>~ "RnS= djZ`\G0h١[B ]vݿamՆU{nelRR1b6e-:DDVe؅+U%FCॡ9IDAT`0TYVjEd`j^,F_n8]Qah$Mj+J|-G,e䍧{)ʵrS 5Td(/fOu^z}60%"g߾cㆵ&^yPD;u/\5SDp]m8Qgěv*Ak߼dsўeCrPr(sV&Bb4DdKmuyAT*'^R5Jv١ybF3:lZ:5eE"2tmlkW۹F#"{daGnwP(h.Ew[U\c2|T6 i4z7 T, IhluWl6f Ɠ?% bZ›@u^vy湃J27 [e;5[3r|+NވL38TƦӦμ0j|{zO8`i{!|q 0dIX8D~|.B#k:NNɗxa@_0 A/(<ſ}1}Efym}^_Sө gWht:V쫴'k)+-Ŀ^x%'0mцp:>=~5h#"#GGϸb3[lyD } Nxb@Sû;#^6˘Cj lRCٺ1Rv`Jq{yA7PD{; xt^Cw]44tD?#\SrӚj9]_\hSM%lFEDg/}~'Ouv'½"\=U!qO(jwV}0b6sxQC'zO&!١訣 ?'/'?g9<[z|dDn|ED.j\h"N3RCI7돔ouÖ+fTï>iY鴟ؾ֟Ggu5,f6;sl2:^v=G-?vmTHv8Q4L9O75MaAC#7/P]ycu55߲ګ+J2M~q= nVXUXZx "eenxyXGDfi3eYiMXg%2)E/KWg6e1S ;RUe9{T==wg)gڻ{}{a~͚y}c=}{.ͫrƻ9)"Ņ9e>ǚ"R]^Z6-ËcȭC7ޞL!)D?75=oeʌeES4C6"2<2&"#>I/";ݱumx9;;̶[6-Y3f[mG[FFod9v-*CӗQ1C\&"NzF/+ pvsH06 þܵvuY Wq&j4iӝi2n:?xiH) LKKruo۶֠_qhˆX-h4c W"-fu5ǧ],Pj+J|-G,e䍧{)ʵrG0ް27'kkݚ_^s}Wo\Wi2쑳[VLz?h1s?{{ZFDs œYo_ss얜l9-";֦N=+ӞehwY]uk+J .>El./sJKC\0eaG캳0?0^ Ne%EyjMYM-`0QGk{tҦ( ۱[6UMF/rw"ig*SP."&bUĮ{aYm6K(>qZ-VeiC&9|_zNξꏟܺmsruБ]wq/4/=.֖{wjыᱡ%~aꏾ5Ցf nw`pP fit1A\Oydg, I@-o,|Wg\Fv8J 9VTJfxbځszZoOmZ.ZqPg_L_.Q }F*S8aʟ\iz{ICel9mj M&j|}^_Sө ght:ɹҞ;.E"^ O Cuyᅾ\r}lʙSv nׁ-b^G ˾K?xOFq;3쐯eI7 q BУ~㯕Y)QTᄯ~FWPC<C6[Y~;E_& pMMkEDs{{gt}q媢M5:TN*|䏿;M͜mްjj5& KPKGTDq/o{ʊVK{g߮oU.~|z s-f3gg=,?Cvׯ{l}egYׯ9;j4/nkz:;- ;\@vh0Edtc]8z:ܡtGW>h4 S4\sK!K$m_O&m_I"^ċx/⥸CL;UN`YfY(;!u"^ċx/5B2bfP, GMx/Eef1,fʕ+@*>ps9ޕ$TG5HjRu\ċx/E, 5ˈ66B!pԤ븈"^ċx)Yj5冚edH8jRu\ċx/E, 5ˈerCͲ6/wl`]ڷս+%@ycJ[mN>tdW2K<éw\ɼTZ"zL5Oa+i_]I>T"^K~ !Bhpڦ2Ux%m IY8jՅJ/8,fY]"^C2!R5) GͲPSEeCLBoH+WpCy@xW25"!.EwTK:Ѥʱ=qM $Sa'BͲx%m8)P-mՅ6_+qh,YSIY8jՅ(i_{?,"Pp, 5_+qY&;!R 5) GͲPSEe])H7$i/غmsڵ{gJW2d+UEH\&;D,kP;ޕ",#Pp, 5_+qY?p>];(-mՅ6_+qV/9)b859"^k+8v֬.=y}!///חF$ɤ<|H~.'JҊ7y\*UEqaDfKkn{{{JAQp, 5_+qH [x<Oj9- ~ Y>vx󬛷v~ᄏ6D'Yj m6B(~/=,Hڼneg_~/iqx1Fj8򱷣=G=pC_?U&~o}k2jReuo2/=j8x]\хd1>Wo{21eI~%!vӕGT8}Cߵ;DMy}Y)S{Gd 5R6ʿb'nQ xF>49!"Uk"riaCsb$QE}k7G.?_|7>dXߵH[,8Ev}㏕? G.0]rSHyL#, Qnszxtw׷J&Å]d AH oةLQ7ϊs 1[*vbST~YDC 8qs[Hv)Te۝O7籖{EC$7_ݺٯ262VJϷ[ѷ`y qIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/VerseAll.png000066400000000000000000000220621366722712400243750ustar00rootroot00000000000000PNG  IHDR1! pHYsutIME \z'qtEXtCommentCreated with The GIMPd%n IDATxyT[׽ᅭ<1C8N{u>(ر #^>l>O5A*  ƌm @8B>LͱLp3ǾG}d^f2˲ZI`y^,&e!\{ǧQTAᮅ>k'b`0L cry_^N//E_`e?NF&T12s_ՅX,G|첬CO_vya$D?Uŀ0RAL&bL¡9 V///cA^p (]Le,c[?p"*ULk4 dCmrr1qFF?+A,bڊUUW27; ՜4|>Py\y3j}qA (VV}&G~x`!^l2?} M]ؚg5רBxx8C1X5u) 7H̃l!oI'p8ؾ Blkמ:Vg9v wmBբ 5{RRsAQNhmu rVz7H Uˡ>q>!}33VڣGhmkǣE;[}z>z]Wf{P(hmm[u{%}EVCVuvN?rz:>=CE9UZ;:ǝzwF$9ܟWv~vnĕku{m]yhJt^g:5#ry\ 'Ԍ >u1qGeerrVjJLg LLL΍? >|^ǷpWJF3#8Dn(̝)5UjUC1>嘳=ϓ> rTWV䷏(}0?]l8&&&lݼi1x&Rlk31O$?K?gbBx{{Gl$ (5fhSou5csOWHJIw: y /~5eOAls:(k&O,OWHe͛։ϻ?o:8 y41?(J~~U m/###ؔ Xʀ^e˝7jLV!g~`a/=Z1ni}|[(1>QFDB1w3 '?%#bV:]s~ާMy_|} ?+GBBXL,C``L͖T|ٲ/C"'AwݷaO*loj=Z(tB"mOB1׫ʸ gʋNXX,XL6`bjw188dgAwϚyxT*E+{BB|e ;tbxҽ04,oSyc{aiMNNQrl/~k{/v؎͛ekFPbaJJahH쬽 BR]]R@@inZYWW!DEEnNlmppƼcbbn=;ü#EK /lޭݻk+/0z,[/Z2 3u-IkyB5Xs?x-. W¢y-_{ ɲ|B" 苫~ {qX%ܭ~ϑ7/>zbNbBX(£/8xeiR? oyr~-缩 Xw9䑗F &|k`2`X*&dZRLN]pO e?*&ʭCl|2:Zpg2@\\UA+(;bێǩ&LFcsn'Yo;#Z(7_ ;tvS%0  yP$$P1A@{;Y&1kAIHH@j r0R_* <I=ֹ%;Y_Kr%Y//-[o 8#446,Z\ bqXuL&3 X t- QrMxGDB&/3$^soX| ׯ#%%!8u'E"l-DHh0`7Q_z x}IxoYWVV+W@nn.<0KXq%lٲPS]p ..}N@iY9`ll PTUW;W]}jjСÈvD1e!(} `b/gN}kaΈcv#$4 >>SF}r ,^5LdN'u3'B,PӶ\>2_G>o5" 1عDGG`0xطo? nwzH$2t&K)-5\Q!X+.9F! 2⊊[x4Kqe/`dxAABܸ P|khl{^}}iη UssslA,,WxIR# HP,8>#A! F*AF:"[kPUBW)?@5BBBaQ {jb5 UX"Aͣ!W~!HLR1<ظ=G?6mx.gzA,VFUX?sbbc0ƇyuŲZPҥbH6-ۧO u$;c9/%% ````w*o||< t@b S!G+K 4:O,b t6o T*]u:::PUUesl*< uKL$a F[[;Z["}!JO (p!B371!%PJ\+lܸ{A0&hhw8RSSWwN6*+p5BMy74;wB/xAAA DG- FPBJ_ճ(Lye).00 a 3uoFdc~T L [X.tK ai['gblt xۣcnh[)UJj=IJ0>A,Q*_[""<be;صkrssHII6ݱ#7|i044~j=Ċ5+(%׮a{v|[RSSNl$%%,jչ#xp\H$(Td݃Ak^P|kii{^sSiηssy-j-A+BYHw" HP,$A Ɛ 0qf=6ĪPzc#AX,*GDAsN@Ta\$᩠L֚FHz}ǎcC@e6Z(//Emm>>>VPԴTA`2Y ş9{7zを}AS,qHNJgdf, --(//Op6ojn/>, !(ii`0 hni,BbB"!c(|I=$}q⫈P W'& Stf9?)Ʈ J bҌ?M+'_EpHsVEwO7JW1*;R;40~rVkʶُlA,|_;]ah4\qzm 5bfO  HP2} AgX<6r6DWgyl$Z(*%yl$䱑 (?" QT 1[ACwO/A @_yl$OĄ fB7J8>mHHH0v+ܹk܊kkZd2TUU۔DbB. bكаPx`T*ڊ7oBxT|ɧ%muP(hoқA,:яA\\eCZLGitttR!!!ػ r/?lz.m{* Y.qF0L455 ~~޽{/4!@,.AC}p\;v)R Fm]H$pU$X( n0bi`2~v hiiۇW* \.)((@R?=1%w>B (^YEggZZZgkA|}}Q__˗/SK&by `B.TD"%=]HK$xiDc[MUpknGF䳮{ľ}LH׳1ؘhrIx@"Uة;d EP0f?J PTTdO,t&r8Fr|HHH@-6yu6d~:I S_{Pknc.SDD  g~wA̻PL d2P`HKOy ʧ~6@}}$>qU*#` χVŅ מ~̜˱jXf#,< ]]]njfЀ+Ww"""I  )~LN"EPN>2=:dⶵ#++ Yٙh`œDlL,r9.\0c/ bcbWQ&bu JRR >lFxy >n#PzRiRDEG#ljDGG4j5|DEE}`[sρz{{Ђrŋ/.( 1x D ==, B Z6ASPD^x&ĉDn y EA'AYiƜ3g)ɉHJJɂ\.GuukRSSm<:"66:())VUC|((( ܄k%סe:>Cp+Ze(-+8th|Z1AkGPVg! AY؛]EB>!Tanm yl$Z(}=䱑 LFX bNb^V :4{ ( Q_UJH Ā<6kcrO~qlH(ypϗ[omh108Rֺ >?L& ##23qss7akAx\V1 GYyfU 'N|pyZŚ7|T EcQ=6#9)ٲ&ӳ,4> S_P|2]BF$'ر݄;qWT ^ okmśo6,۷{<Hמ^s^2302<ڜ[}q(=3tVqmjANAHqy̤33k3?N6ݻ͛93Vt{|d-jhhll}KR!!88uMN` x&afm=In߮l V6zllnie!]DfC&'I".>B'_>ZZZ@ @l\5°l^^HJL(Jff)⒫\8t֣.O*?Ԓ X>Co )fUAc/Ǐj LtuvF2RF0A bb#" !(yT#V zl S3y饶BBB#C SA!1!FχE>w5k6Z2 UUhlt76!)9`XcG~۷@dDl5Z"GVAccqy dz֧с!IDATjHR`'dZ8sZ\:T*dggFzh5ԂXA,RQ6 a|;1d202< _?8'4 ~U0 p\BAA|( Y)>#}mgFDxOXxb0,DƦ{"--"#AIO!""&?> >v'1VSUc#& 5qv¶m C\\CI WÂ3ւ1X<6FPm5䱑 fkF0A bb#" OZWIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/VerseBridge.png000066400000000000000000000255521366722712400250700ustar00rootroot00000000000000PNG  IHDR pHYsutIME nK(7tEXtCommentCreated with The GIMPd%n IDATxyTWo,PP  "n11&jt;1i{n>s;};wwzͤ$14qaET(vdz(X*6~s<ֳ{~uz{[zxMKF# bkFMHFtZKc !O>x`fT*60Uh.8;)qqq3c9}4{w~O[m[RHa7g؊y^U~0a4mT>S.䌛}}}8;g`шiVůoNV15Auw0+prr?xg޻ǎ6ػ+j? pN ^^˶ 7] !''9`ggg\]XyZ0 !ĘAuTs/-?vXgk@eμ^>h/>B1=U_]S}>~ݘr.>n}*1]e e3KX:Ƣ}bZ/.q1&+BDE?uFNƔ|]TTD-?溺e;$N>mI#߳|C_] Czcw{AKYak`IQLO\߿lmT (x ===/G?84_sOos/[cKwG2L"##G-;I'sD܋@ cK8yʲNaHmz_G _o66ފMu}&S~96pˎT:C{]T{֮M8SprRZ^7[E 򢡡WWWV'sz|xzxAVON::##éݍII(7TKU6`1O6LOՑKmc}lnL8~r;ǯ+#^ϗUٲy 0PUUMP]B|*hnj!=,MsζwFÆɃ+QjNNs㛆T)=ill$$$)/=eԺl 6rQyENyTs/ҷzW Um헙yKYY9Ow-S Pk4G ?ʎ5kw3ԑ- !&Ǟ 4@y0aĵ,+9Jt<*3T5>:{ilh/h6Yz YctO*ʔoB{S@?{ƲlW);l ehge{qvvX!Ĭ7fPT*qrrҀ*& Ri7KߖBLmOu,J`m-","ΞH @xx4y'7?,-1hQ@(R`xki艹?wJZBQTTܐFBM)M BLaO,2R~? !&T###J{xف^w[CXP*Hz}=;vǩt5c>wӯO:^Kzp*ʫ;XZ!b̹JJ!ĽqO}3@ϦAPb_NWcSly?~9XHˑ#?GʆTP@דqO`磏ル ]]ݸɏO!g~mOuSfhoGѰ{˶̻\'3:KRȲ.1q5O=y@]ڵ"yɧX8nT޴_~6VZʙ#Ĝ AoT.\OHJJhv ֯@nNΘ^t'ܴy .ɩhkk#%e#c\NGxD9B!fgPVwXlYx1mm@ wwsu3G!y3G`4]bPظ ow |2nz)BBq<ʈB1zikoCPŖ-[ h4rqeddknR6l@p!qqqmΏc"B+V#bvTsiinFѐx.]ǨճbE 1+bx\tiǏ??5|r!=U#0_AAP99dOׯsz: B!yPyQsyY!:X% !p"eN#fBTVTjP|>@4sف^_/-"jLLqAubP BܳVZD +_ Bܻi!m@0jBǂѽ|J3z}=;vǩt֧lfCoM8s}%3Hd7!圫R!s\Y˪PyV^p%hhiiĉس1^{jŋϟ_ݲ_tt4IIkhP(7r%2׋]NZO?v:N 11a4^rvvqfiR4BBB}{Ϳ'+@W&- h5~ݍ?aa9?n.9hec&gB KK?XՒdWP5j0"= wZ[m7Os1YRazNKD尰pk B!f4_®<,lKoo/igHK?p[!yefoB!$cTB8JyLr!L*+*j5T>B{]"BZim`4:D! IIkE.K#!&TRU]#-" F_[^w[CXP*Hz}=;vǩt֧l$}:ߚpz-Lٷod]Bٳv{ MMMdggQT4q...]eQKIIkk+bǎ탓3픖ryz{{z:ܖ>>ޤnDP,p‚Bg(r&AxxeyyL J¡<ΡVΝ78X9lHBe\Ogg' sʕ(J)++ӋիWsQ{6,(( --t GR3^MSs3yyWtB{ĪPhƢT*hinO""")++;JJJqsuタB@R8fj;ѣ[O;PU]mYN^LT""'唔N8)((ԩSr& !l FXCl\E%&fqqq8HczGW*i.5]nε ]Ӿ CN-v|]Փv~[j>|WWtΤQ_/ !ĬN@{%5<=<`۶mVҬ#""g3Gdd$300`U^PX3DtRq~cw>:S\\FaqHO>W!4TK`/Ʀ&ZZ[͍X._6=h&nPZZFDDcժUՎ/xOFBAJJ  {7oZ?uoXo~nnRYYiw>C/nnnri<t:.d\f.6k׬eiR-[RDkk+99yPVXaѠOXXaa(//'==[yIIIa(^s ș-s5{cn{7Þ¶ 2.dq!ᴎa履~:%ܸq7nY,)9<ўB hwJPBEF0!0VAB8SVHc&զ'Ovqqaժx8B1jEyy}gՄDB,!0 **+*mY>8ŋ*׵F5kqrrfɒ%u27oV::IxxxNn^B1W!hMi PeQxyynG'mym4g3-M.o,au=:sYv x9))JR6pB2Bݠj[N&Y` \94p<{3$)i W3m{G;*||.Yi)/C܈O`׮0%Ս8@Ks3{{jMIHLѷGm3ח\,gbE} ...ŭL7 c5qjKPUdw\h3mk[̺u\˱Vij݃usuC顨]vz>Y{VȑG38ɺYPPղ#lLMKtwwBs(11a4^rz:84r) !!!ܾ=T~~Lv4?]JJJߟ0 qf%M88l2:::uCm1<`LHBB߻ƍ IDATT͗~\:j/H%11ɮjM`0PU]EzLo~TccXŋ=7 $<4c{[9;>+z7zyyY-s9_bB=hfoBqq$n[ B!HټY9&hT*i !=ծzi!4P60DCxPA"b,}/g®VZD +KFv}lGB޾:;RU]#-" F_[^w[CXP*Hz}=;vǩt֧l$5I#242Q֕+=kW_|j`0DvvEEO5kYoo_RQQIZ!~j6m`\5PS]͹shB R<=<,/Atyy99աjٹ;} )XRqW$11acݳz `%""<&g>"mL7Ba pXJ-͸{zADD$eeevQXX@II)nnP(T*=Ɣj;ѣ텪մF4=Ûq!xg{3TF%Nظ8KL  q/fVU6,]jܜkP4oԍGzzAB!lTC`` ~j$%5<=<`۶m--j9""K@}]=}6zxx:l6c}6UՄj*n޼IU*FOu Rhlj܈esi ~eDDDo>VZEAA>:]i;;Zʾ{ܹl޼xvoH!Ƞ:]\\^nĝqqkh֭eqJ[Vv)Vhu Ǜ=X溺: >TB!f8.[Fragg'–VDMʚS```:i222 OСR^^NoOj5!!yR7n$  B1A5ne,`zV:?qqqvUoCZ2.f3MWWG~kֲ4j)˖-Etqyf˖-rJVTY;B1 (bF{77|Ӯ<,l` B2Nɉ'Bq!S- ~B!AuB9<T!Z;`Car5/VJ%_=kEZRi !AuB!&TS 1ݸqCA1IVZDÓ:Y`P+ {CaQ^z}=;vǩt֧l$*Ox }r{  ///8$BՄBСZ&i/4&=ՙTRrf e/QSSC};J%F rՄHM̒%ar !թCaQ!nnnP(P__o͞;w(-rȏދhsrvfݬ[EWW'|zzıF)x=5k֐???zzzvS>g̶m۷?$gBQʙ>`Bb"<(y**+9lڔJ]]EEEcmVVNuϪDg|Aڙ3hi9 $$9o' |y}6OLgHi{X`o: B̟'AwߡZQQ>fӹss3ӓdΝyLrg~ݿI3t'Y'"n,PAbdQRRŢP@ssηNQ1l Il6aPčXfnX0OiKSDfC0}r=nj ܑ;m?`y _遷 7g[Kiނ%j ZaT^ܳKe~fцx//o:n>dlxz\&-}9+5q5ӡ| OOO7ozXnDm]l|Q_osKu\PMwO,IMe˖{-zm^2c;11|y6---o Pug+g32 3Xo!qhƓy^#mrGZ~2cM~ޘ_c쇫}Z?G[f<4:ϔ y񨯯/z][^gONx'^mko:zǮ绫 |痕IwL"nb4!88={>f``.N'3s Ik_0 ^1!""#f>-[@wOC>g]]ݜ>}3}w#}]=[^+|1>oqh.+8IZ:F7gd׾,d=1Uiϧ('Jtwf⾻߿>^EO[l-/(d۽[gLHϋ7g+f{?x)GAA[ރ &i|ߔG|;ߑ(7/i^%.;_߁;W:.{{"b8《?b}7ғ4/\^'ȨXiB8v.70|]'F7y$&&=C ͛={?qNMM2c4l600p 6E 8[ok{G0`0ϣN'c}>fھ߿>7'È{~༱__~y7ڛj_^42I~fzh׿HO`shOR=I?zn\ F-@:::Β%|g3ìY~؄\qOLRM-]gٲLUsMTT$3,8SVN ˓Kp߃<==p#d1`7횤;ݍfe=7ғ4wՓtmp}m|t]Iqy1rrmhHF ~[=m|nճۮDD w0>:.oIDDdR!)o;&Da~ a==7^}KqN6p3ӏߥH=H"""I!bwll6i빓mhoOL~Q7oxzzԀ$?;ǿ[^xjp}Qxӷ!gq ITUG:2D5X^Us2kb`.3k! %DFp\ADMy DDDDs61Q_TTIDD!iH@T[fϦKE5;$$,F6LWyWylt_)o&%%SVVDDDd2f܅]DDDnm}`Ql?? #~i_|Arrsyᅿr,J֚ubb!7'ܾmߎdۛ.VT=tvt m7ZxH"2.w[OCS3턅s.ǼÎΐwiQ__OiicZFF&|Q"8}NWcn106>|#GDDd#N ~ff6(ش+WZ0 {kk˘Ï3/ÇO_S%"""3tȶ6s}͛fc=ceǎdYqRSS;A^Z(#-#""&|1-/ƪU(#޻YXh1-bѣcwi|PBC8x71e=I컚VRZ2r'Ge*(ȧ R|iΜ94MAIDDD!-wt($XSHqol`깈Ulh41DDܔ'A-"a1j wICDDDDXlZD8qADD!Z@QXj^TcsHR@ٳ> ~@YYX, &Vgmty9***?MO78VDDDdy̸0]s)ԓd0f>|y0ž={8-k_z%G!11P^~er,[  M?q3ό{;y05SP޽{|˹Ԉ"r1ㆨv/T\:;; aMyמVYYI~~ӴkukRSSٹs's9{aܱԔ l*vxGwr"2G7wv}8dnܰydffPRR<5IE۷9ܬZ߿v/_ի).)?~\BƓ $$p3uPw5*ݮzH==xzzNaF7WO54;c\alj~nĀf;v aCzrmdi vL#wۤ?""ʴ8N@֬^CTd61?qM6lY&$'']w|/.q]|9DGGD]EGL[[Ddk]0TXXH__,X0l 8y丿8=B||FںZ{NM I컚VVV>rgN漼#:ZDDDƍG>*QHPH Ys9 Ѥgb=8RWҠ0ψ5_ """" IC$&&ED 5BҵtI"`l:;^TcsHR@bih47:kä樼ʫʫm*??n&/ A>q{ş:Zihl //16k/"88OZZ)/?޽,_#:&Cq~MJJK"DDDf)}e@@I җ1M(+;C^^uDFFCBX 18}tttjժ1å-""r8MiORP{hJJS㮣|}}y`0`2hh}!,4+Whr1/44tu?=07KDD I7EѭNBzz: IK32KDx5TrYfE9r) 466(c +9YLp=$-XD@@wvr{qzfaeـ\n;."""wVH|FZBCc͗Ϗ:tի׸ Io&JIJJwlrS]]3jvsG($ Mjîtɘl6*+ 7{eO:ʕXj%_8r Y=L""2Ӻ'dZUfL]]FLL /=p5I!!P[WLv> 㩧DYY=݄ /kJss3'(-=5fyoooV,_Akk+Uzɭ[)Є픗s!z{{'@Yy~d dڻ;??_;().P!%lc.13ߟ녋aPP__lf۶̚5O<518[Η_csɒ%x<8}4gϞe233ٶmۈˇ:!;; c4y$/Lec`{'`vKV8%-/3k?IHHٳ㮣r|}|yG`00455Z&++`;o<:zMkjW\ź֑?8wI_ŬY(..O>ё,""r+Cfs[!%5ӧ0x"RSS'RRRfn}ںZ.^vYf|B<:ZZZ'۶mgǥK&,.v`QzꩧihxW"""75$ʀA^g0CR||`ƍN岳^'$$8\#11UW300mC7 08M\cy+_Wޞq3OQQQ>}0cb _+%""".Bҭ:zfZZ[ח));f&33eH(/?KBB> iiinԲ!1 deej*V+>ϟw̿~Oܖ{5ǴKDdUUUjח>3g>,8wnnoo/&+%5^z1l\p-_}heϞ`ҥ,HT)7)pffbʻ; :/h J5<ںZbF^k_l,HFee;//Ob &22r\ ^.3o!<7`bbG !C=F.]DZZc=]cwMUU/nooҥ sQbŒ'aa475sFGtIKRӼ'|PRSSIZpa\W0?i> ÓV \`@XhӼ'OG\\<}}V*++jXυ yb…X8}4s```@GtIo^q1pXVr{8we'Q{>R@EE:EDDkH3nD{DDDD!iF2$eZݗEa&5r$YjX4Rlq4ADDDD!iDAT[fϦKE5;$$,F6Lܜ.7._oʫOS>cfaBrO?W_kkr)*{lfcEIKK3gٻ#e-[Κ,LF^^PopaJJJ&'&~MJJ'^2DIGDDd5: ()-חK &ч/ظBhk/_}+WBCC\5ka05vb{#6m6ݻwwooo8x蠎n2j]t̜PHZX"#\2 >ȑN Gа0V,_p1ΟP𾝷 IDATÏpB4Tf2iooPGtI1O,&8,H" voS=%IIɎm6:\ @Iodb5==wt`ن{,4mp[v܅#o} dpp.}}:EDDCH|6ZBCc͗Ϗzzhh) ֛*%))Ͳe?Nuuͨe;11b -//Kٱc'[Kyy} nKzRZ._f;-,7~;b;VߠԔLAAp1">ГHe$oooRS#+#3sGf`gqYS\VeQ)`]0@OO%رSzu5yO ϏX)(SPӴH`u;vn"o2ph-^/63egY&/o/'',4.^{kCBe}'$SO2z %.>ep|/ł j`` DDD:EDDKH,ɫ},Z}#GΊ "#"?؟sGڬ]kE*,*MGt IQ?W7:0boo/97ᲿZbwj"5V}u$Lǐ4\gܠ/$2d I"""ː~ O=sUa&5r$uuv`4ED>9"F!"!iF#eHZlZD8qB˸lN#6Od2eVP]sI-"ã`q琤$2ҀhbuֆIב**Ӵ?$&G>q89ܳ>jL~ JKOYۛW i>AxzzʹsUdg`28$ZOtT>ZTS_|ASS҄ 1+O||ŋ9J l6m}\}hf͚'`MT-/OIF1ɓX{{IHH]iD$Xl6-Y<< \̬'!!gώb=`h4"$8v~; glRs)..&55{w[JD?5dCfs[!%5ӧ0x"RSS'RRRfn}ںZ.^vYf|BXfdi&֮[KDD X}qt+RDD!>)OGg'7nt(NB]C}}.:mx"55Ǒ穮֝O"""nni6ԫH457JOO,NI14.C҇~@yYxIKK$ul' `;wNaa!_|7ti:;w䷿}CGLI  vZJj#$Kcgٸp΍V .]ҌtJO8r3iiq4xjz}_B4Bdlr`d|}|lTVV2_I\l!DFFrc5 ^.3o!<7`bby|ͥK̛úk g! .(iSR{=yO>$+$ ^dQ[Wô,-+`~|,'='w}7qqq,Y.Nc< rz{yi8WV+s=;ٻWGt$wbH3n$c%""$s$""2:Cm6?\D,*lhTqW$K] KZD0;#b""~15?,X[Oc-3thބmu IWqwjw$r>7aq,{kh@T[@?,z>?TPu-$M?ޤdˈҀhbuֆIבYߥ?:m7d?Wyw-G^n 0`Y{446KQQwG11' O>MT݄envU7q S>NRY/ɼyx?ҥK44 Ã^~FBXn=q:DDDFVXP@Ii <_b00L4448z ; /?~πk=0^^ܱ%ituu [װe>S=˗/gժ5éS|`hWTT7Cvٴi:icW4#ǟsUNu:)--6 P~,=l{6l/g+βa=ÖYz5v=@@@Gre˖G)?… U8p@G41=IIIɎm6:9z({|䲞 ${>s<3,]j_}p~çY: }|~G$$&2lbݹs~~~?`""7էf~MJOfٲƱLuط]d4l9446'0fvb]N󂃂n8$/evuwgiFo[""㦀$38$`}gq?fW 4  48d2mW0274ܹÖiJ)/p|c/ޜ1rLAAEFFQHfiFbc jj'\ɢBݵkacd޼arYn=!aDL9½ncLBTL4o'=2+W")~wq?IDDD!iD$YVkǕ ׳/'.ayٟM҈?~W=]Z 7V+WFSS#ǎf8}$""" I.]ߣ2e{{VPs^d`Ŏy--;vcǎжv7 IC@lbf*URWwr}Gwa"23u84ڼn*UWZ9UZJ}7u=WQHMifS@Ys\fsFI!"=I]X, jlQc{H """4IJe+"""" IRu%`RWCDĝCpKFY&]G^nʫʫOS2#>BLt ϜiOlɓ|駷q֭Gc 4EGG;:t^e}a8DDD) I'Ka@HHfs}Ia`` d8}4~̟?L̙|0-.p[DDDiH2 l7w԰3ܳi#>$''_8%f.]KKK#33Շ͖/ޚ#G@HH(/211k:BC}ڣKƪ7ߤƱXw:ǽURVVKDDdfAVkgN -j/Rff[lߟ\i%--5Ε+WDy0cv"#8w_~YDCch@eݶm;O8_DDD{nb҈"d"0D@l\ 18Kٙ3o~y訯}=^ FuEhjjgHHZǦf/^ n桯|_KGOLÐtzjkkijn&$8))SS̙c`Ml޴ɩ)0)[cs=iEEE|`0ŪUZ?~}^s^PPw]|}JGt IZIq1ׯ'%%???+buc7j(Vٙ3>u9s̶mI֬Yl߱8Z[[ywijjiz5hMMJKJX. ‚Bn2f`4Ρ ??R mW,??:::&TOADS$9^/cbPVv֞ڣiSړ~55751; 9}Ը(,(___{/1 L&=:7CXhmmW嫯zc^hhnsQPOFF&>c:@B|۶od2MWgg+*:!AGByVo@f#=})`5.CoIRy,[TW׌Z#ImWQ=zO?{Ɗ+WWjf˦͘#qQ&""42oooRS0lvZFf#$=OƬfQYymٳ,{)V\U+[pp0ͮ{"bZtf2<s搳?_|eپ}0-^/63egvu^OOXh111\8}$?@m]2OH ,4eeetwJ\|//^ !>M6Er /8s,ZXGBkΔ{iO=\e I$YVkǕVe:;;yEat1lz/ / 3s9]1{]߷P9x[l&""4^~s}dpvy.9s4gΜvva""" Iw qQHr+$"2 @Af>Cm6?\DUa6a4""nѓفŢO1j wICDDDDXlZD8qADD!Z@QXj^Tcp ,nPVV@ll,7o!0Ј`g?Qlذ1_Q4KFY&]G^nʫOꫩO 0~YV9v(ee.n޼)UϽ[2ߟJΟ@GG:vݿȈ a""r'SaI(ܵ~]^}ze$eee2|Ο??z###c9zEDDdb!`0`ݺ%%Ŕ3O?APp#$}{ ڵkװ~a^z%}_͋aƍɡSG$JAtT46G)??JZZZ$==rnv͙c3e< /IgѢEx{{hqא4i׮w磏h2zvP! 86Ϝ񺽭[2o<)"""niAtw/III;whHZsvLё"""f!"""nvԩR2330d[[oyK׷m6K32HHH?'FO{fLJJ"  qSk6/ :*_BJJuLt̰i| ±G'tD'v >rOIEENӎ3DDD=;qggg;%$MDDDFo"beQ!fsFI!"=I,`6FĨ1DD=$ bQH"11Q-"r7I\SgفCDĝCҝ^|֛\ pٹsAAA o8m1M_/ #/7GU^U^i)`0 ZoHvEpp0g+r>|AgϦ*++ioksYǣ~s B"""2)' /_f޼XxGhjn.G O___g϶'#yTTs111`\hԻ."""w^H*,(??? B!pgh#|mX}Ɠf8%k&&Ǵ9:Z#IDDd}; ##;QBCC?Ct2&v/Xz s&~_=W^\d}yYk2'H\\, \"""FnIg @ll, t}Kftiu\\isb2Q]S;l672e=I#ݢ_YQ1lH]?{[dz~Wb8}=zEDD}CP I"""r Ys:WhRc)GORWgKZD0?#b""~1($ l p15­tDnKeVPE0GaR{Q!"!N H>,~ee}͛h`0h6lبwTn #/7GU^U^i)`0 Z455sQ\ݼy &S U8WYE{ne??u a""""כq*++imm%**p3;w_sW_}G@#' ??ϏHj?uXH2 9e%%Ŕ3O?APp#$}{ ڵkװ~a^z%}_g IDAT-Z2 ef7{)"""l6#(JQ hh}||233{/TKK P^^N[[Mٮ4l@EE̛DDDCT]wÞ>!';;B ¢".txXB>0(qCC_l[z AJKח;1FO5i6%"""BII1{> 55;W\ 2"Z'Iڠ67 IN*bn-_߶mضmҌaGYNOOd|Q"r D6'vfŁ|ᇉb޼y\pᖭ/%%uLt د?~222s&""" IH_8~~ZOwϘg#)..XGḆqggg IC($ȍ2dfSEˢB0FCDM9z,u5X, jlQc{H """4DbbZDDDD!.֩EDYR{Q!"!IId8 #/7綗I}~U^U^'[~ʇx,L^@|'*?uzm@^^.EEEcam:-^Dpp4S^~{?6 |'[oRRZ4!""2MHZxmBY򨭫%22\_p6l܈SUV{֭'66NGҞДӧ]GaA%%s`d207CXhmmW嫯zc^hhƍG6m22 l۾Ʉ7]]`{&""2LiORNqi`QG4#ǟsU.,\#G:$1?… U8p`匁qAr000@ZZ4ʠ&AMpSLYORtt ab%'  !== 43W^dYPl0mNH s3颧{j'˫Խw*5]k^ޢMwW'=TCjRԄӃlf 6¶}!A&eMϛptY(я`-~u|淜h^g[X @ WHǾu6f͚Ż| 9sMMԴ4}D*@fruFFڝN::;ppǬY/ȑ^&`HG֐;vRT^S s%c/ mO{ذn='mg2&""tH0nIeFCݿ^/--N+WrJΝ=wbrMy($ dB@/W|o_v|o=ߧEK6L&:CDdIx?3]ydOI) aQHKQ p uBҷ5`b.ζ8W""39$) M_O?3 !tv`2Y]Lۨ(v1zޟu:#{>@ii):y򯾚T188墪55GFFb 22O << ŋ(+ iCw_?)nN/Z @ő|/&6F  AeegNDk"2/''ǵI1#I3S=:`٪SPX[ع%Zr⥀58v_@pw\KpnӃfcm!1m#I`.U%1|23͛8rV֢?{^mmܾs;`mlL,]\}-駟Ν!>@uG˿PTT$=RyBȈQIGg.5k9rի I>cNSUu֫`3am ϖ榠nRyBRdd$yyKcZe!i_N=KK˷eU\sgO]rX,^6?23qO{{`hh聴($b4z7ԃwxdg`HIIʕ'+(,dXsgG#`MYARҰYmk444ׇjeaB|sw?c+W(*Z>nH($mR[}C=~o+/¢B=I^m 75os 3I:v HK.[$S\ "؇w}guoF0 e']{?[[]S}gFIDdfG'F3Rt?"""6ɸ'CM^\D|.]nd23DDfё[^`&>'3DDfzHADDDD!.EE+#"S' "" I֫z8ۮt\Qg䐤4u^u>444Fفdfu3!o\Y!;D?!OpIʿjRac .SNXɊ+ >>0n7/^,K.eYQ8"""zg'hhhPy MbIMM]^CXaRhii4v6mL{3{lvkg2ȹsx<LOSnjkk9<=$ϝ֭[to$`;%;%,@׍̎&&:tFu1FyW1 L&_>nMqq1 ==|w/=,˄<|YxW0 2 ,$%%g96"""2=F*? zyPZ<6W];Su/ \kIPRRۿ[8u$W[_f5]n7DoXR94Hiǜ@NN6iDGPRRWWVV淜:;svXnwo2XlOT_:Ē%Kظq#slsBj#"""!$MHȈQgg'].n1ro^wO?3MQZZҥKp<G۸OqLJ|.^bϞ=ddn:֮]KKKKK}#}Ry!iDFFh"V=O卆={L=7\]~xMMPPOMm%79#LQQQ @? [6P#wHV7gjUVׯoBRh}ou^P1 Rqcdxg0$= >7bVDDD>7s?"""d(^ ϹgmLfu 5:l١v;I) ayu'ta@ IY$t9#"nyzq:3Dṍz!IijW?:62L&3 yI;rcOp=ݎ,^#/_L*h Ξx쨨(~P$9X,墱+c0 SRShDC^naaӹX2F6ChhGd^xlo8MuM5F7W f/()yFwM[o]gZܹs))yfݺ !5IOǘFD,GD˴$L}YgOAa!7oa玗hʥ,ر~ s}FEEoġCB>.AoO6۶FDDD޴$͛,V}D"666oWwg~YYFzqq퀵1tpt[nc֬Y'xސ(_~ؾ'Bj#"SSFFڝN::;ppǬY/ȑ^&`HG֐;vRT^S s%c/ mO{j;m}L$y!)22%̱yRpٲѐ{/'ܞ륥bbֲr*VZɹ.Y,\G >KNNT? =6"""򘄤\F#^zs@Ddج6RRRre `DXSVvԴ4lV/ aZY7~lҜF""" Iȥz>`ߺW^~9v;EA{iJyAnk<o{ <@ H"}IOƍ{TՋ{/gG'&r^ yc?""0CM^\D/^na2""3H-O/NgzD}ړR""3=$ """tԩoRUm~Ϩ 'lqE!"2C҃q?_OLCCcmq:;0̬.leEUPv1zޟU?} R8u$_}51bppEU)jjj'ddfe@xxn/QV2_aEDD16;&55mtyqNaaӴcٴi3qٳK)^CDsS#ΝPXXWXܹzIDDd&I2|Nrrs 3uc&--Q]}FQF^}U &ׯ[S\\LBOoKww:~xN8“O>mOᙒMDFFwK/SV^-'$$XxIJJ>;@{smDDD$MU8@M]-M- 6r())ym\i XỼw_@p\322ի?> qLxz=8q yf Aߚ5rx<$&&~úڈ}zS]0}HTHJJ"qxԦsB99٤MHKII_]YYrZZ_hΝkcp!0ɺ:G{{ظq#z_U!,YƍcRy!XݠtW*##F\wrh4ˉyi-[0$}ill"--R.]ʅ q8ƭxz#>>>cvazW\Ennӟ`2O!22r]TTTjoz@xxxHmDDDŋZ<73^/|syt9zs655SPP@Aa>5~x&a'dv[#&6Grq.]³>;y mDDDI0Fz02^ IXHNNڵjcy$$$k***H?D]~JKK $X,׿cxn"66L}DDDƗ$=~uvjTH'ip66G+֭[}}V,_AFVv9};/7b}B5ɸ0ӱy0 k7ys9w v ɬFGmWq:;#"n3I1@wDDDDf.E{R'tѦfGpӋqE!"2C_>ȃtv`2Y]Lۨ(WUzՇX!;?Sݎ,$}zIDAT^#/_L*H Ξx쨨(~P$9X,墱+`mQrc6v'G+R]"""8֐KVf z\$''3|^x\v̋g?lVߏV0$%$vs梁 . e֦Q8_@XX׉E3OS]Sh7lJJf}?7GY ׿oy˿``֬if3Qܢ7sK&?9)Rp\|p\taӹϞ?K]]0,)(,d-W[tR;v/ tvv_[غu;???Oő\۷)>n>LW tR|%\7fu۶ڈyRY}0U%1|23͛8rV֢?{^mmܾs;`mlL,]7\!lf5z8EDD{rrr1x^;23Ymp2,ܹ3 iiج6^~5j0u!o;`˗/qu232+6<)Dvv]""" I\jo{WcSXXTH'ipp֫[͓CvN6a| 6&""4w}guoF0 e']{'lS__G}}g ܪk,6""3mE!id܈7_/"_2QWkJ}2A޾(.yIIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/img_tutorial/warn.png000066400000000000000000000003331366722712400236240ustar00rootroot00000000000000PNG  IHDR('+ PLTE7^IDATx^ѱ a;%2QpC{QG`A .:>hf93NO`gflT =3L!F.Z0 RZYkTnxo-jEIENDB`hydrogen-1.0.0-rc1/data/new_tutorial/tutorial_en.html000066400000000000000000000356541366722712400227010ustar00rootroot00000000000000 Hydrogen Manual

Hydrogen Tutorial

Antonio Piraino

You've just downloaded the latest version of Hydrogen and have it installed successfully. Hydrogen may come in handy for these tasks:
  • It can be used as an advanced "click" machine helping you practicing (in speed, precision and rudiments) drums, maybe with a custom pattern you wrote.
  • You want to learn how to properly play a song: you can "write it down" inside Hydrogen (or just a few difficult parts of it). Doing the effort of finding, splitting and reproducing the different parts of the songs will improve your understanding of it. Also, using Hydrogen with your songs will ensure that in future a quick glance at the songfile you have created will bring the song up immediately to mind.
  • You can play H2 with other software (Ardour, ...)
This simple tutorial will guide you creating a complete song. We will work on "Georgy Porgy" of Toto which has a quite straight structure (therefore appropriate for a guide such as this) but this doesn't mean the song is actually easy to write down since the drummer (Jeff Porcaro) enriches the groove with his personal touch and fantasy. Remember that Hydrogen will not play better than the drummer working on the song since most of the task must be accomplished by the programmer's sensibility and experience.

Table of contents


Let's start
Before starting make sure you have a few things:
  • The song to study on: either an audio-cd or (better) an .ogg or .mp3 for optimal flexibility.
  • Optionally a rough layout of the song on paper: it may be useful to count bars and different parts of the song that eventually wii get into Hydrogen.
The song we will work on has the following structure:
  • Intro: 4 bars
  • Verse: 8 bars
  • Bridge: 8 bars
  • Verse: 8 bars
  • Bridge: 8 bars
  • Chorus: 8 bars
  • Riff: 4 bars
  • Verse (with guitar): 8 bars
  • Verse (with voice): 8 bars
  • Bridge: 8 bars
  • Chorus: 8 bars
  • Chorus: 8 bars
  • Chorus: 8 bars
  • Final Riff: 4 bars
Looking at this scheme we can see that some pattern repeats, so we'll use this symbols in Hydrogen's Song Editor:
  • Verse -> A
  • Bridge -> B
  • Chorus -> C
And to save up words on explanations we'll use two common TLA (Three Letters Acronym ^_^):
  • LMB: left mouse button
  • RMB: right mouse button
Well, now unplug your phone and launch Hydrogen from the shell: let's get to work!

Intro

The base pattern (Fig. 1 and 2) is 4 bars long (divided in 2 different bars, each repeated 2 times, so it's [2a*2]+[2b*2]) and lasts for the whole song, from the beginning to the end, riff included; most of the time (intro and riff excluded) this base pattern is repeated 2 times to reach the commonly used 8 bars for each part of the song (A,B,C).

Before starting let's set the speed to 98bpm (HINT HINT you can find out by yourself the speed of the song while playing it with your favourite media player and following the rhythm by clicking repeatedly the backslash key in Hydrogen) and from the menu "Grid Resolution" let's set '16'.

To create a new pattern select the instrument "Closed HH", click on RMB and choose "Fill Notes": the first two bars will be filled up. Then insert manually the beats on Snare Jazz and Kick as indicated in the 2 pictures below and there we have the base pattern for our song. Note how the beats on the hi-hat have different velocity: beats falling on the beginning of the bar are set around at 75% of the full velocity bar, the others around at half of it, in order to give groove the song.
Fig. x - Base pattern, first bar

Fig. x - Base pattern, second bar

Before we start writing down verses there are 4 intro bars, all equals to each other, except for the last one which at the end has an open hi-hat. We should do then:
  • Rename the first pattern in the Song Editor with RMB click on the name "Empty Pattern" and change it to "intro_a", for example.
  • Add two new patterns near the first one (second and third bars)
  • Create in Pattern Editor the base pattern (Fig. 1)
For the fourth bar we'll instead open the hi-hat (Fig. 3):
  • RMB in Song Editor on the newly created pattern, choose "copy", then choose a name (ex. "intro_b") and automagically you will have a new one right under.
  • Select the pattern you've just created (IMPORTANT!)
  • Delete the last 2 beats of "Closed HH" and move them on "Open HH".
  • Select '32' from "Grid Resolution" and add another 2 beats right near the previous ones.
  • Adjust the velocity of these 4 beats so that the first is around 75% while the other three are at 25% to simulate a longer opening.
Fig. x - Intro detail, fourth bar.

First verse

Since we have written the base pattern, now we should already know the basis. To create the first verse we just have to copy from the Song Editor the pattern "intro_a" and rename, say, to "A-B-C_1", because it is the first bar of the verse that eventually will also fit for the bridge (B) and the chorus (C).

Pay attention, why can't we just add two new more patterns next to this? Because in the first bar there is a "Crash" beat which ends the previous intro, therefore the two bars are not completely equal; you have to copy the pattern "A-B-C_1" and rename it to "A-B-C_2", cutting the "Crash" beat cited before.

Same thing for the following 2 bars: just copy into the Song Editor the pattern in Fig. 2, rename it according to the previous ones and add two patterns (because they're identical), you should reach number '8' as shown in Fig. 4.

The 4 remaining bars of the verse are more or less the same of what we've just written, so why redo everything from scratch? Bars number 5,6,7 are virtually identical to the previous ones so we just have to add two pattern "A-B-C_2" and one "A-B-C_3+4" taking care of renaming the patterns logically (so to understand how the song moves around the Song Editor), while in the eighth bar there is a fill which closes the verse. We have to copy+paste in a new line a pattern already written (ex. "A-B-C_3+4"), rename it to "A-B-C_8" and modify it as in Fig. 4.
Note how in this case too the three "Snare Jazz" beats on fourth bar have velocity properly tuned to a 10%, 20% and 75%; you can't see it in the picture but also the two final beats of "Tom Mid" are both 'touched' to 50%, after all it's only just a small fill, better not beat hard on the drums :)
Fig. x - Eighth bar of the first verse.

The result in the Song Editor should be something like Fig. X.
Fig. x - Intro and first verse in the Song Editor.

WARNING! if you reached this point without saving your work, NOW is the good time to do that. A simple [CTRL+S] followed by the name of the songfile and you'll be ok. If you want to add some more infos, LMB on 'S' button of the Song Editor and change the fields as you like: these infos will be shown upon opening of the file.

Bridge and following

Now that we're done with the first verse you should have an idea of how the whole thing works: the first bridge is made of the same 8 bars (4+4) with a slight change at the end of the fourth, which forces us to create a 'custom' fourth bar while the others are easily added adding patterns already defined.
Let's take the latest pattern created as sample ("A-B-C_8"), copy and rename it to "Bridge1_4" (i.e. fourth bar of first bridge) and modify it as in Fig. 6. We have quickly completed the bridge!
The Song Editor now should appear as follows in Fig. 7. Looking closely you may wonder why the fifth bar of the bridge (17th bar of the whole song) isn't assigned to the pattern "A-B-C_1"; the answer is that the pattern has also a "Crash" which is not present in "A-B-C_2+5+6".
Fig. x - Fourth bar of the first bridge.

Fig. x - The Song Editor with the first bridge.

The riff

Around at half song there are two riffs: each one is 2 bars long but actually the pattern is the same, just the other instruments play something that we will see in the last riff of this song (where drums too play the pattern of the riff).

In this riff the drums play the same pattern we already know for one bar (see Fig. 1) while in the second bar only beats two times (Fig. 8), then the pattern again and then again two beats with a small final fill (Fig. 9); again the open hi-hat is done with beats of different velocity: 75% and 20%.
Fig. x - Second bar of the riff.

Fig. x - Fourth bar of the riff.

The second half of the song

After the riff we have half job done. We just have to write down two verses, one bridge, a chorus repeated 3 times and the same riff at the end.

The second part of the song is slightly different from the previous one because we have a few hi-hat opening during the verses and every 4 bars there's a small fill almost everytime: it's easier to start from scratch a new set of pattern (i.e. "A-B-C-*") in the Song Editor copying them with a suffix like '_hh' to show the presence of the "Open HH".
As noted in the introduction of this guide, Jeff Porcaro puts much of his skills playing the song and this makes the difference between a song played from a raw and "cold" transcription on paper (or on Hydrogen): therefore the following parts of the song will try to be faithful to the original piece, but another 'ear' could give another written layout of the same part: after all this doesn't matter so much since we are showing how Hydrogen work, not to play like Porcaro :)

Fig. 10 shows the section in the Song Editor of the two verses and the bridge following the first riff; as you can see the first bars (48-50 according to the Song Editor's enumeration) are already written before while the others (51-71) are new. Moreover there a few pattern 'ad hoc' identified by "A-B-C-3a_hh" (Fig. 11 to see an example) and "A-B-C-4a_hh" since both have a few changes not present in any pattern written up to now.
Fig. x - Third and fourth bars in the Song Editor.

Fig. x - Seventh bar of the third bridge.

After the third bridge we repeat the chorus: the first time the "Stick" is used instead of the "Snare Jazz" and we don't play the "Kick" (even if it may sound the opposite since the bass guitar does play here, so we have put the same the kick beats softly at 50% velocity), while the second and third time the chorus goes on there are a few bars different, as shown from patterns "C3_*". In Fig. 12 the pattern "C3_6+7 & C4_3" (slightly different ...) which criptycally identify the sixth and seventh bar of the third chorus AND the third bar of the fourth chorus: if you think this is confusing, you may find out your own naming method :-)
Fig. x - Pattern "C3_6+7 &C4_3".

The final riff

The song ends repeating a slightly different riff we have met before: the first 2 bars are the same (i.e. pattern + 2 beats), while the in third bar the drum plays actually with the other instruments (Fig. 13) to finally end as always.
Fig. x - The final riff.

And this is the end. The goal of this little tutorial is giving a quick overview of the most common functions of Hydrogen: this piece of software can also run for other purposes, like an advanced 'click' played with the drum, or to loop playing some part of a song difficult to catch; however, as in other things, analyzing the song itself helps the comprehension and here too, Hydrogen can be helpful reducing the time needed to write down a pattern and tune it.

For comments, suggestions, corrections, you can use the Hydrogen mailing lists (http://www.hydrogen-music.org). hydrogen-1.0.0-rc1/data/xsd/000077500000000000000000000000001366722712400155335ustar00rootroot00000000000000hydrogen-1.0.0-rc1/data/xsd/drumkit.xsd000066400000000000000000000116231366722712400177350ustar00rootroot00000000000000 hydrogen-1.0.0-rc1/data/xsd/drumkit_pattern.xsd000066400000000000000000000052041366722712400214700ustar00rootroot00000000000000 hydrogen-1.0.0-rc1/data/xsd/playlist.xsd000066400000000000000000000021171366722712400201150ustar00rootroot00000000000000 hydrogen-1.0.0-rc1/linux/000077500000000000000000000000001366722712400151635ustar00rootroot00000000000000hydrogen-1.0.0-rc1/linux/debian/000077500000000000000000000000001366722712400164055ustar00rootroot00000000000000hydrogen-1.0.0-rc1/linux/debian/changelog000066400000000000000000000110641366722712400202610ustar00rootroot00000000000000hydrogen (1.0.0-rc1) unstable; urgency=low * Release 1.0 * QT5 support * Midi feedback * OSC support (incl. feedback) * Playback track * Menu redesign * Note probability property * Velocity automation * Full screen mode * Release 0.9.7 * The color of the SongEditors squares is now configurable * Added support for midi cymbal choking * Added support for midi hihat pressure control * Added hihat pressure groups * Added basic non session manager support * Added instrument components * Basic lilypond export * New windows cross compilation script * Support for soundlibrary images * Configurable sample selection algorithm * Support for soundlibraries with images * Donation dialog * New midi action: * SELECT_PREV_PATTERN_RELATIVE * Release 0.9.6 * new build system (cmake) * add undo for song/pattern editor * jack-session support * jack-midi * pulseaudio driver * some bug fixes * tabbed interface * Version 0.9.5 * load playlists at startup * midi-learn works now with shift-click on some gui elements * multi-track export * LADI support * maximum number of bars is now configurable * added czech translation * fixed serveral export song failures * added ogg, flac, aiff export support * added some new commandline parameter for no_gui version * added rubberband-cli support * several improvements on sample editor * added NO_GUI_SUPPORT to build a version of hydrogen without a gui * added support for app bundles on OSX * non destructive sample editor * piano roll editor * instrument midi out * destructive midi recording * support for midi "note off" messages * virtual patterns * time line to change song tempo and add tags * director * and at least several small changes * Xml handling is now done by QtXml instead of TinyXML * improved support for non-ascii filenames / strings * remove direct dependencies to libflac * added -k/--kit flag to hydrogen binary to open named drumkit on startup * Version 0.9.4 * added Catalonian translation * cleaned up the PlaylistBrowser and AudioFileBrowser UI's * fixed various issues with the AudioFileBrowser * fixed reading/saving instrument gain settings * Version 0.9.4 rc2 * fixed "fifth beat bug" * fixed jack zombifications on startup / drumkit loading * fixed segmentation fault after starting with alsa and a blocked audio device * fixed several smaller issues * added qmake files for building on windows / osx * improved scons for building on osx * Version 0.9.4 rc1 * fixed various buffer overflows * fixed segfault with jackdmp * fixed saving of layer filenames * fixed resizing of note durations * fixed several smaller gui annoyments * changed sort order in soundlibrary browser * added default pattern category * new manual / changed translation method for the new manual * Version 0.9.4 beta3 * over 39 bug fixes since beta2 * if file DefaultSong.h2song not accessible we create a simple default song * patternpropertiesdialog improvements * added portaudio v19 patch * added "patches" dir * added optflags option to Scons * change post masterfader fx_return to pre masterfader fx_return * Replace jack_client_new() with jack_client_open(). * added croation translation * added support for coreaudio / several osx improvements * keyboard now works with AZERTY and QWERTZ layouts * add desktop files * added new graphic: record icon for midi dialog * merge the audio-file-browser branch * add french translation files from Yan Morin * current loaded drumkit have different background color in soundlibrary * added label which displays the loaded soundlibrary * added "panic" midi event / shortcut (F12) * added russian translation * Version 0.9.4 beta2 * QT4 port * Autosave * Jack port follows instrument names * Mute groups for instruments * New drumkit manager (with downloadable drumkits) * Save and load patterns * Jack transport master * Beatcounter * Playlist editor * MMC * Lead / lag (pattern editor) * config option 'jack transport buffer offset' for ardour bug * fix broken lead / lag * several fixes into soundlibrary import * download class now supports http redirect correctly * config option 'adjust beatcounter offset' to get exact results with different hardware * new statusbar message to display longer messages than 30 chars setScrollStatusBarMessage( QString message, int ms ) -- Alessandro Cominu Mon, 15 Sep 2008 12:00:00 +0200 hydrogen-1.0.0-rc1/linux/debian/compat000066400000000000000000000000021366722712400176030ustar00rootroot000000000000009 hydrogen-1.0.0-rc1/linux/debian/control000066400000000000000000000014711366722712400200130ustar00rootroot00000000000000Source: hydrogen Section: Multimedia Priority: optional Maintainer: Sebastian Moors Build-Depends: debhelper (>= 4.0.0), libsndfile1-dev, libtar-dev, liblrdf-dev, cmake, librubberband-dev, qt5-default, libqt5xmlpatterns5-dev, libarchive-dev, libasound2-dev, libjack-jackd2-dev | libjack-dev, liblo-dev, libpulse-dev, libcppunit-dev, liblash-compat-dev Standards-Version: 3.6.2 Package: hydrogen Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Drum machine/step sequencer Hydrogen is an advanced drum machine. It's main goal is to bring professional yet simple and intuitive pattern-based drum programming. See http://www.hydrogen-music.org for details. . Warning: this package contains the development version (potentially unstable) released for testing purpose only. hydrogen-1.0.0-rc1/linux/debian/install000066400000000000000000000000571366722712400200000ustar00rootroot00000000000000../data/img/gray/h2-icon.svg usr/share/pixmaps hydrogen-1.0.0-rc1/linux/debian/rules000077500000000000000000000043571366722712400174760ustar00rootroot00000000000000#!/usr/bin/make -f # Debian 'rules' file for the Hydrogen Drum Machine. # # To make the build more verbose, uncomment the following line: #export DH_VERBOSE=1 # # To enable scons PARALLEL BUILDS (e.g. -j 4), run like this: # $ H2_PARALLEL=4 dpkg-buildpackage -rfakeroot # ...or uncomment the following line: H2_PARALLEL=4 # ...or invoke dpkg-buildpackage like this: # $ dpkg-buildpackage -j4 -rfakeroot # However, the -j4 here will run more than gcc in parallel. # Check for parallel builds. # NUMJOBS script goodie courtesy of http://lists.debian.org/debian-policy/2007/08/msg00005.html NUMJOBS=$(patsubst parallel=%,%,$(filter parallel=%,$(subst $(,), ,$(DEB_BUILD_OPTIONS)))) ifneq ("$(H2_PARALLEL)","") H2_PARALLEL_BUILDS=-j $(H2_PARALLEL) else ifneq ("$(NUMJOBS)","") H2_PARALLEL_BUILDS=-j $(NUMJOBS) endif endif configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. mkdir ../builddebian cd ../builddebian; cmake .. -DCMAKE_INSTALL_PREFIX=/usr touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. cd ../builddebian; $(MAKE) $(H2_PARALLEL_BUILDS) touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp -find . -name '*.py[co]' | xargs rm -f # Add here commands to clean up after the build process. rm -rf ../builddebian; dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs mkdir -p $(CURDIR)/debian/hydrogen/usr/bin cd ../builddebian; $(MAKE) install DESTDIR=../linux/debian/hydrogen #remove not used .git dirs find $(CURDIR)/debian/hydrogen/ -name '.git' | xargs rm -rf docs: docs_install: # Build architecture-independent files here. binary-indep: build install docs docs_install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_install dh_installchangelogs dh_installdocs dh_installman dh_link dh_compress dh_compress -X.py dh_fixperms dh_strip #dh_python dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure hydrogen-1.0.0-rc1/linux/hydrogen.1000066400000000000000000000044671366722712400170770ustar00rootroot00000000000000.TH HYDROGEN "1" "November 2016" "Hydrogen 0.9.7" "User Commands" .SH NAME hydrogen \- a simple drum machine/step sequencer. .SH SYNOPSIS .PP .B hydrogen [\fI-v\fR] [\fI-h\fR] \fI-s file\fR .SH DESCRIPTION .PP Hydrogen 0.9.7 [http://www.hydrogen\-music.org]. Copyright 2002\-2008 Alessandro Cominu, Copyright 2008\-2016 The hydrogen development team. .PP Hydrogen is an advanced drum machine for GNU/Linux. It's main goal is to bring professional yet simple and intuitive pattern-based drum programming. .PP Hydrogen comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. .SH OPTIONS .HP \fB\-P\fR, \fB\-\-data\fR PATH \- Use an alternate system data path .HP \fB\-d\fR, \fB\-\-driver\fR AUDIODRIVER \- Use the selected audio driver (jack, alsa, oss) .HP \fB\-s\fR, \fB\-\-song\fR FILE \- Load a song (*.h2song) at startup .HP \fB\-S\fR, \fB\-\-jacksessionid\fR ID \- Start a JackSessionHandler session .HP \fB\-p\fR, \fB\-\-playlist\fR FILE \- Load a playlist (*.h2playlist) at startup .HP \fB\-k\fR, \fB\-\-kit\fR drumkit_name - Load a drumkit at startup .HP \fB\-i\fR, \fB\-\-install\fR FILE - install a drumkit (*.h2drumkit) .HP \fB\-n\fR, \fB\-\-nosplash\fR \- Hide splash screen .HP \fB\-V[Level]\fR, \fB\-\-verbose\fR[=\fILevel\fR] \- Print a lot of debugging info .IP Level, if present, may be None, Error, Warning, Info, Debug or 0xHHHH .HP \fB\-v\fR, \fB\-\-version\fR \- Show version info .HP \fB\-h\fR, \fB\-\-help\fR \- Show this help message .SH FILES .TP .B hydrogen.conf .PP Defaults and startup settings for Hydrogen. .TP .B data/* .PP Can contains user's data such as drumkits, patterns, playlists, songs, ... .SH ENVIRONMENT .PP .B LADSPA_PATH .HP Path to LADSPA plugins. .SH BUGS & FEATURES REQUEST .PP If you find any bug or if you would like to propose a new feature, please report it to https://github.com/hydrogen-music/hydrogen/issues .SH AUTHORS .PP The hydrogen development team. See complete list at Hydrogen's "About" Dialog. You can contact them at . .TP Subscription to the mailing list can be done here : .br http://lists.sourceforge.net/lists/listinfo/hydrogen-devel . .SH MISC This manual page was written by Olivier Humbert as a part of the Hydrogen project. hydrogen-1.0.0-rc1/linux/org.hydrogenmusic.Hydrogen.appdata.xml000066400000000000000000000046561366722712400245550ustar00rootroot00000000000000 org.hydrogenmusic.Hydrogen GPL-2.0+ GPL-2.0+ Hydrogen Hydrogen Drum Machine Boîte à rythme Hydrogen

Hydrogen is an advanced drum machine. Its main goal is to bring professional yet simple and intuitive pattern-based drum programming.

Hydrogen est une boîte à rythme. Son but est d'apporter de facon simple et intuitive la programmation d'un motif rythmique.

http://hydrogen-music.org/images/screenshots/main-window.png The main window showing the application in action La fenêtre principale montrant l'application en action http://hydrogen-music.org/images/screenshots/audio-filebrowser.png Audio file browser with sample preview Navigateur de fichiers audio avec prévisualisation de l'échantillon http://hydrogen-music.org/images/screenshots/sample-editor.png Sample editor Éditeur d'échantillon http://www.hydrogen-music.org/ hydrogen-devel@lists.sourceforge.net hydrogen https://github.com/hydrogen-music/hydrogen/releases/tag/1.0.0-beta2

Second beta release ahead of 1.0. Changes since 0.9.7:

  • QT5 support
  • New default drumkit: GMRockKit
  • Probability note property
  • Velocity automation
  • OSC support
  • Midi feedback
  • Menu redesign
  • Fullscreen mode
http://hydrogen-music.org/release_100_beta1
hydrogen-1.0.0-rc1/linux/org.hydrogenmusic.Hydrogen.desktop000066400000000000000000000012741366722712400240060ustar00rootroot00000000000000[Desktop Entry] Name=Hydrogen Comment=Create drum sequences Comment[de]=Schlagzeugsequenzen erstellen Comment[ru]=Создание партий ударных инструментов Comment[hu]=Dobszekvenciákat lehet vele készíteni Comment[tr]=Davul partisyonu yaz Comment[fr]=Créer des séquences rythmiques GenericName=Drum Machine GenericName[de]=Drumsequencer GenericName[ru]=Драм-машина GenericName[tr]=Davul Makinası GenericName[fr]=Boîte à rythme Version=1.0 Type=Application Categories=AudioVideo;Audio;Qt; Keywords=audio;sound;jackd;sampler;drum; MimeType=text/xml; Exec=hydrogen %F TryExec=hydrogen Terminal=false StartupNotify=true Icon=org.hydrogenmusic.Hydrogen hydrogen-1.0.0-rc1/macos/000077500000000000000000000000001366722712400151265ustar00rootroot00000000000000hydrogen-1.0.0-rc1/macos/DS_Store000066400000000000000000000140041366722712400165320ustar00rootroot00000000000000Bud1 obbplist.bwspblobbplist00  ]ShowStatusBar[ShowSidebar[ShowPathbar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds\SidebarWidth_PreviewPaneVisibility_{{386, 446}, {367, 255}})5AMYp}.icvpblobbplist00 _backgroundColorBlue[gridSpacingXtextSize_backgroundColorRed^backgroundType_backgroundColorGreen[gridOffsetX[gridOffsetY\showItemInfo_viewOptionsVersionYarrangeBy]labelOnBottom_showIconPreviewXiconSize#?#@Y#@(#?#?Ǘ#Tnone #@`%;GPet '01678A.vSrnlong.vstltype ApplicationsIlocblobLW hydrogen.appIlocblob\LX  @ @ @ @ E DSDB ` @ @ @hydrogen-1.0.0-rc1/macos/Hydrogen.icns000066400000000000000000001060151366722712400175660ustar00rootroot00000000000000icns it32KdTdqTqÀZTZqT\zqYTqT]߂݀܂ڃ؁ׂՀԃӂϜYTTd߂݀܂ڃ؁ׂՀԃӃп]TdTŃ߂݀܂ڃ؁ׂՀԃӃрϤTdT|߂݀܂ڃ؁ׂՀԃӃрЀkT߂݀܂ڃ؁ׂՀԃӃрЀΆT߂݀܂ڃ؁ׂՀԃӃрЀΜT߂݀܂ڃ؁׃րԃӃрЀπT߂݀܂ڃ؁׃րԃӃрЀρT߂݀܂ڃ؁׃րԃӃрЀςT߂݀܂ڃ؁׃րԃӃрЀσT߂݀܂ڃ؁׃րԃӃрЀσ͟T߂݀܂ڃ؁׃րԃӃрЀσ̟T߂݀܂ڃ؁׃րԃӃрЀσ̟T믙ƃ̀T}1?߃1]́TT1Â1͂TT1Á1͂˟TT1ŀ࠺1͂˟TT1ߠ12͂̀TU1ߡ12͂́TU112́ʞTV112́ʝTV1ޣ1_P13́ɝTV1ȃޤ19Ȅ14́ɝTV1Ȃ߀1J14́ˀɝTW1Ɂ߁1J14ˀʀTW1ʀ߂1J14ˀʁTW1߂ݦ1J15ˀʂTW1߂ܧ1J15ˀʂȜTW1߂ܨ1J15ʂǜTX1߂݀1J16ʂǜTX1΁߂݀۩1J16ʂȀTX1̀߂۪݀1J17ȁTX1߂݀܀1D17ɂTY1߂݀܁117ɃTY1Ђ݀܂1FJ18ɃƛTY1Ё݀܃118ɃƛTY1р݀܃٬118ɃǀTZ1݀܃٭119ǁTZ1݀܃ۀ119ǁśT[1EFGHHIJD119ǁŚT[119ǁĚT[15jq1:ǁĚT[1ݧ1;ǁŀT\1I1;ŁT\1J1;łT\1J1;ŃT\1J1<ŃÙT]1J1<Ń™T]1J1<Ń™T]1J1=ÀT]1J1=ÁT]1J1=ÂT^1J1>ÂT^1JdR1>ÂT^1J1>€T^1J1>T_1J1?T_1J1?T`1J1?T_1J1@T`1J1@T`1MONE1J~p71@T߀a1̂ՀԂ1J1AT߁`1ˁՀԃ1J1AT߁a1ʀՀԃў1J1AT߁a1Հԃў1J1AT߁a1ՀԃӀ1J1BT߂a1ՀԃӁ1J1BT߂݀b1ǀԃӂ1J1BT݀b1ԃӃ1J1CT݀c1ԃӃО1J1CT݀܀c1ăӃО1J1CT݀܁c1ÂӃр1C1DT݀܂c1ÁӃрϝ11DT݀܂c1€Ӄрϝ1?D:1DT܂c1ӃрЀ1DT܂d1ӃрЀΜ1ET܂ڀd1рЀΜ1ETځd1рЀπ1ETڂe1рЀρ1FTڃj1рЀς1ITڃج61cрЀσF14Tڃ‚рЀσʴTڃ؁ׂՀԃӃрЀσ΃́ʃȂǁŃ‚T؁ׂՀԃӃрЀσ͂́ʃȂǁŃ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃÁ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃÁ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃÁ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃÁ‚T؁׃րԃӃрЀσ͂́ʃȂǁŃÁ‚T׃ųЀɢ˺rqponnxƸponmllsT׃УУuqKJwǀzJIIj€~oonT׃̄рutt̀cKKJeǁlJIYvonT׃̃ϙuttúcKJeǁmJIY‚unTր̂ϚutúdJeǁmJIYunTր́ЀutveJemJIYunTր̀ΙutufJemJIZvnmTրԀ͢ΚutvgJeŀnJJI[xnmmTրԁ΢πutvʀhJeŁoJI[xnmTրԂΆuutwʁiJełoJI[xnmTԃϣut~ʁxJoŃ}IfnmTԃѿ́ȓʂn`qn_l|{TԃӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńÁ‚TӃрЀσ͂́ˀʂȃǁńTрЀσ͂́ˀʃɃǁсTрЁς̓̀ˀʃɃǁсTрЁς̓̀ˀʃɃǁсTрЁς̓̀ˀʃɃǁсTрЁς̓̀ˀʃɃǁсoTdTT]ǀЁς̓̀ˀʃɃǁсXTTdT~Ѐς̓̀ˀʃɃǁсmTTɀς̓̀ˀʃɃǁсsTqTa\TqZTZÀqTqÃdTd ubu ;b;;ibi;bi|fb bjރ݀܀ۃق؂ւӤfb bqރ݀܀ۃق؂փjbubʃރ݀܀ۃق؂փՀӫbubރ݀܀ۃق؂փՀԀwbރ݀܀ۃق؂փՀԀҐbރ݀܀ۃق؂փՀԀҤbƀރ݀܀ۃق؂փՀԀӀbރ݀܀ۃق؂փՀԀӁbރ݀܀ۃق؂փՀԀӂbރ݀܀ۃق؂փՀԀӃbłރ݀܀ۃق؂փՀԀӃѧbŁރ݀܀ۃق؂փՀԀӃЧbŀރ݀܀ۃق؂փՀԀӃЧb 춡˃рbBOùBkсbŀbBBтbbB⧺BтϦbbBɃ⨺BтϦbĀbBɂBCтЀbcBʁBCтЁbcBʀBCЂbÀcBBCЂΥbcB᪆Bl^BDЂͥbdB̀ૅBĪBDЂͥbƒdBଅBYBDЂͥb‚eBBYBE΀bdBπBYBE΁b€dBBYBE΂beB߮BYBF΂̥beBЃ߯BYBF΂̥bƒfBЂBYBF΂̀bfBсBYBF΂́bfBҀBYBǴˤbfBޱBSBG̀ˤbgBݱBBG̀̀bgBݳBUYBH̀́bgBԂހBBH̀̂bgBԁށBBÌ̃bhBԀނBBĨʣbhBރBBĨʣbhBTUVWXXYSBBJ̃ˀbhBBJˁbhBEv}BJˁɢbhBߧBKˁɢbiBXBKˁȢbiBYBKˁȢbjBYBKˁɀbjBYBLɁbjBYBLɂbjBYBLɃbkBYBMɃǡbkBYBMɃǡbkBYBMɃơbkBYBNơbkBYqaBNǀblBYBNǁblBYBNǁŠblBYBOǁŠblBYBOǁƀbmBYBOǁƁbmBYBPǁƂbmBYBPƃbmB\^]TBY|GBPƃğbmBЀق؂BYBQƃğbmBق؂֦BYBQƃŀbnBق؂զBYBQŀßbnBق؂զBYBQŀßbnB͂؂րBYBQŀĀbnB́؂ցBYBRŀāboBˀ؂ւBYBRŀĂboB؂փBYBRŀăboB؂փԦBYBRăžboBɂփԦBYBSăbpBȁփՀBSBSăbpBȀփՀӥBBS€bހpBփՀӥBOSJBTbށpBփՀԀBT‚bނqBփՀԀҤBT‚bރqBŃՀԀҤBU‚bރqBÂՀԀӀBU‚bރqBÁՀԀӁBU‚bރ݀vBƀՀԀӂBXb݀۳FBpՀԀӃVBEb݀܀҃ƂłǀՀԀӃκb݀܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀă‚b݀܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀă‚b݀܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀă‚b݀܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀăb܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀăb܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀăb܀ۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀăbۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŀăbۃق؂փՀԀӃтЂ΃̀̃ˁɃǁƃŁĂ‚bۃ˹Ԁͪ~}|{zŷ|{zyxw~ǀ ¶bԫԫ}ỸYXvǁ{z¿bـуՀЀpYrxYYXfǁŁ{zzbفтӡЁqYqyYXeŁ{zbقсӡЂqYqˀzXfƀ{z€bقрԀqYqˁzXfƁ{zbقѪҢsYq˂yXgƂ{zbق؀ѪҢsYq˂yXh{zb؁ҩӀ΀tYqzXh{{zyb؂у΁vYq{XhĄ{zyyb؂ӫ΁Y{ɀXsČzyb؂ŲЁ͜΂{nm|Ɂzmlxŀb؂փՀԀӃтЂ΂̀̃˂ɄǁƄŀă‚bփՀԀӃтЂ΂̀̃˂ɄǁƄŀă‚bփՀԀӃтЂ΂̀̃˂Ƀǁƃŀă‚bփՀԀӃсЂ΂́̂˂Ƀǁƃŀă‚b׃ՀԀӃсЂ΂́̂˂Ƀǁƃŀă‚b׃ՀԀӃсЂ΂́̂˂Ƀǁƃŀă‚b׃ՀԀӃсЂ΂́̂˂Ƀǁƃŀă‚bՀԀӃсЂ΃̀̂˂Ƀǁƃŀă‚bՀԁӂтЁ΃̀̂˂Ƀǁƃŀă‚bՀԁӂтЁ΃̀̂˂Ƀǁƃŀă‚bՀԁӂтЁ΃̀̂˂Ƀǁƃŀă‚bՀԁӂтЁ΃̀̂˂Ƀǁƃŀă‚{bubbk̀ԁӂтЂ΃̀̃ˁɃǁƃŀă‚fbbubԀӂтЂ΃̀̃ˁɃǁƃŀă‚yb b΀ӂтЂ΃̀̃ˁɃǁƃŀă‚b bnib;ibi;;b; ubu એࣃ߾‎Ք઀ـ€փւցր߀߁߂߃Յ˼ ؂҄ـ߃ՄwԹw߃ݿՃww߃ހԂwwހܿԁwwހܿԀwwހ݀wلwހ݁wكwxހ݂ԃwڂ¹wxހ݃Ԃwځ†w˥Njwx݃۾ԁwۀÅw|ڄwy݃۾ԀwÅwwy݄۾wąwwy܀w܃ąwwy܁Ԇw܂ąwwy܂҅w݁Ņwwz܂ھ҄w݀Ņwwz܂ھ҃wƅwwz܂ۀ҂wƅwwz܂ہҁwƅwwzۂҀw߅Džww{ۃwބdžwѧw{ۄw߃ȇww{ۄٽҁwȥww{ۄٽҀwȥww|ڀwɥww|ځwʥww|ڂwww|ڃww|ڃؼц퓬wyw}ڃؼх퓬ww}ڃـфww}ـ׼у쓫ww}ـ׼Ђ쓫ww}ـ؀Ёww~ـ؁Ѐww~ـ؂ww~ـ؃ww؃ֻЀ딫ww~؃ֻ딫ww؃׀wwׁЃw™wׂςwwׂպρwwׂպπwwׂր镫wwׂց镫wwւwwփ΃wwք΂ww̙{wքԺ΁w݀῅wɄwքԺ΀wwwՀwwwՁwۄwwՂΆ藓wڃwwՃͅ藓wڂwwՄ̈́wځwwՄӹ̓wـwwՄӹ̂w࿅wwҹ́痓w࿅wwҹ̀瘓wwwӀw߾wʦwӁw׆߾w}wӂ̂易wՅwӃ́易wՄwӄ̀wԃwӅwԂwӆwԁ޽wѸ́wրwѸˀzw߀ۅwyҀނօԂ׀߂܀̓̃˃ʃɀȉǃƄʄҀз߃ހ݃܃ۃڃـ؃׃փՄӆҀз˃߃ހ݃܃ۃڃـ؃׃փՄӆҀр˂߃ހ݃܃ۃڃـ؃׃փՄӆҀсˁ߃ހ݃܃ۃڃـ؃׃փՄӆҀтˀ߃ހ݃܃ۃڃـ؃׃փՄӆҀу߃ހ݃܃ۃڃـ؃׃փՄӆҀф߃ހ݃܃ۃڃـ؃׃փՄӆҀхʀ߃ހ݃܃ۃڃـ؃׃փՄӆҀц߃ހ݃܃ۃڃـ؃׃փՄӆҀч̀ހЪ͂ЫׂʹϷʃÀ„‡ހܢڀѸƄϷɂހ…݀ځգӀ΂ÃЀɁ†Ҁ߻݁ڂդӁρÂЀζɀ‡߻݂ڃրπÁЀζ߇؞ց϶ÀЀπކсۚ؟ւ϶ЀρɅ݅сۚـЈЀςɄ݄с܀ـנψÀσɃ݃р޽܁ـןԦΈσͶɂÁă܁ـ؀ԬзσͶɁƀŀ߀ڸ܂̀͟؁ΠĀՀɬҁƻ΀ɀ߃ހ݄܂ۄڂـ؄ׂքՃԀӅҁцЀσ΁߃ހ݄܂ۄڂـ؄ׂքՃԀӆҀцЀσ΂߃ހ݄܂ۄڂف؃ׂքՃԀӆҀцЀσ΃߂ހ݄܂ۄڂف؃ׂքՃԀӆҀцЀσ΄Ȇ߂ހ݄܂ۄڂف؃ׂքՃԀӆҀцЀσ΄̵Dž߂ހ݄܂ۄڂف؃ׂքՃԀӆҀцЀσ΅̵DŽ߂ހ݄܂ۄڂف؃ׂքՃԀӆҀцЀσ΅̵ǃ߂ހ݄܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅̀ǂ߂ށ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́ǁ߂ށ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́˴߂ށ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́ˬ߂ށ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́̀ڀ߂ށ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́̀đ‎߃ހ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́́ࣁ܃߃ހ݃܂ۄڃـ؃ׂքՃԀӆҀцЀσ΅́̀ƢхҀуЂχ΁̂ͅ˄ʃɆȂLJƀņăÁએࣁt8mk@VӠVVVӟVVVӠVhydrogen-1.0.0-rc1/macos/Info.plist000066400000000000000000000043631366722712400171040ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable hydrogen CFBundleGetInfoString Hydrogen for Mac CFBundleIconFile icon.icns CFBundleIdentifier Hydrogen CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString 0.9.6 CFBundleName Hydrogen CFBundlePackageType APPL CFBundleShortVersionString 0.9.6-beta1 CFBundleSignature ???? CFBundleVersion 0.9.6-beta1 CSResourcesFileMapped LSRequiresCarbon NSHumanReadableCopyright Hydrogen Developers, 2012 CFBundleDocumentTypes CFBundleTypeIconFiles icon CFBundleTypeName Hydrogen song file CFBundleTypeRole Editor LSHandlerRank Owner LSItemContentTypes com.hydrogen.h2song UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeDescription Hydrogen song file UTTypeIdentifier com.hydrogen.h2song UTTypeTagSpecification public.filename-extension h2song public.mime-type application/octet-stream hydrogen-1.0.0-rc1/macos/build_dmg.sh000077500000000000000000000045441366722712400174220ustar00rootroot00000000000000#!/bin/bash # Default application bundle name SRC_APP="hydrogen.app" # Default dmg image name DMG_PATH="Hydrogen.dmg" # Option: enable verbosity VERBOSE=0 # Option: open image after creating it OPEN=0 # Option: Translation directory TRANSLATIONS="data/i18n" # Print message if verbose mode is enabled function verbose { if (( $VERBOSE )); then echo $@ fi } # Show error message and exit (with cleanup) function error { echo $@ >&2 clean_up exit 1 } # Show usage info function usage { echo "Usage: build_dmg.sh [-vho] [hydrogen.app] [hydrogen.dmg]" } # Print help message function show_help { cat< 0 )); then SRC_APP="$1" fi if (( $# > 1 )); then DMG_PATH="$2" fi if (( $# > 2 )); then usage; exit 1 fi # Real work if [ -f "$DMG_PATH" ]; then error "Output file exists" fi verify_app "$SRC_APP" DMG_ROOT=`mktemp -d` verbose "Copying application bundle" cp -r "$SRC_APP" "$DMG_ROOT/Hydrogen.app" || error "Can't copy $SRC_APP" verbose "Deploying Qt libraries" macdeployqt "$DMG_ROOT/Hydrogen.app" || error "macdeployqt failed" verbose "Deploying translations" I18N_DEST="$DMG_ROOT/Hydrogen.app/Contents/Resources/data/i18n" mkdir -p "$I18N_DEST" find "$TRANSLATIONS" -name '*.qm' -exec cp {} "$I18N_DEST" \; verbose "Deploying additional assets" ln -s /Applications "$DMG_ROOT/Applications" cp "${BASH_SOURCE%/*}/DS_Store" "$DMG_ROOT/.DS_Store" verbose "Creating dmg image" hdiutil create -srcfolder "$DMG_ROOT" -volname "Hydrogen" -fs HFS+ -format UDZO "$DMG_PATH" || error "Creating dmg image failed" verbose "Cleaning up" clean_up if (( $OPEN )); then open "$DMG_PATH" fi hydrogen-1.0.0-rc1/macos/fixlibs.sh000077500000000000000000000122641366722712400171320ustar00rootroot00000000000000#!/bin/sh # # This script will prepare the application (.app) bundle for Mac OS X. # (c)2006 Alessandro Cominu, Artemiy Pavlov # # prepare the .app package icon #echo " *** Copying icon" #mkdir -p hydrogen.app/Contents/Resources #cp macos/Hydrogen.icns hydrogen.app/Contents/Resources/Hydrogen.icns #sed -e "s/Hydrogen.icns #include #include #include #include #ifdef H2CORE_HAVE_LASH #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace H2Core; void showInfo(); void showUsage(); #define HAS_ARG 1 static struct option long_opts[] = { {"driver", required_argument, nullptr, 'd'}, {"song", required_argument, nullptr, 's'}, #ifdef H2CORE_HAVE_JACKSESSION {"jacksessionid", required_argument, nullptr, 'S'}, #endif {"playlist", required_argument, nullptr, 'p'}, {"bits", required_argument, nullptr, 'b'}, {"rate", required_argument, nullptr, 'r'}, {"outfile", required_argument, nullptr, 'o'}, {"interpolation", required_argument, nullptr, 'I'}, {"version", 0, nullptr, 'v'}, {"verbose", optional_argument, nullptr, 'V'}, {"help", 0, nullptr, 'h'}, {"install", required_argument, nullptr, 'i'}, {"drumkit", required_argument, nullptr, 'k'}, {nullptr, 0, nullptr, 0}, }; class Sleeper : public QThread { public: static void usleep(unsigned long usecs){QThread::usleep(usecs);} static void msleep(unsigned long msecs){QThread::msleep(msecs);} static void sleep(unsigned long secs){QThread::sleep(secs);} }; volatile bool quit = false; void signal_handler ( int signum ) { if ( signum == SIGINT ) { cout << "Terminate signal caught" << endl; quit = true; } } void show_playlist (uint active ) { /* Display playlist members */ Playlist* pPlaylist = Playlist::get_instance(); if ( pPlaylist->size() > 0) { for ( uint i = 0; i < pPlaylist->size(); ++i ) { cout << ( i + 1 ) << "." << pPlaylist->get( i )->filePath.toLocal8Bit().constData(); if ( i == active ) { cout << " *"; } cout << endl; } } cout << endl; } #define NELEM(a) ( sizeof(a)/sizeof((a)[0]) ) int main(int argc, char *argv[]) { try { // Options... char *cp; struct option *op; char opts[NELEM(long_opts) * 3 + 1]; // Build up the short option QString cp = opts; for (op = long_opts; op < &long_opts[NELEM(long_opts)]; op++) { *cp++ = op->val; if (op->has_arg) { *cp++ = ':'; } if (op->has_arg == optional_argument ) { *cp++ = ':'; // gets another one } } // Deal with the options QString songFilename; QString playlistFilename; QString outFilename = nullptr; QString sSelectedDriver; bool showVersionOpt = false; const char* logLevelOpt = "Error"; bool showHelpOpt = false; QString drumkitName; QString drumkitToLoad; short bits = 16; int rate = 44100; short interpolation = 0; #ifdef H2CORE_HAVE_JACKSESSION QString sessionId; #endif int c; while ( 1 ) { c = getopt_long(argc, argv, opts, long_opts, nullptr); if ( c == -1 ) break; switch(c) { case 'd': sSelectedDriver = QString::fromLocal8Bit(optarg); break; case 's': songFilename = QString::fromLocal8Bit(optarg); break; case 'p': playlistFilename = QString::fromLocal8Bit(optarg); break; case 'o': outFilename = QString::fromLocal8Bit(optarg); break; case 'i': //install h2drumkit drumkitName = QString::fromLocal8Bit(optarg); break; case 'k': //load Drumkit drumkitToLoad = QString::fromLocal8Bit(optarg); break; case 'r': rate = strtol(optarg, nullptr, 10); break; case 'b': bits = strtol(optarg, nullptr, 10); break; case 'v': showVersionOpt = true; break; case 'V': logLevelOpt = (optarg) ? optarg : "Warning"; break; #ifdef H2CORE_HAVE_JACKSESSION case 'S': sessionId = QString::fromLocal8Bit(optarg); break; #endif case 'h': case '?': showHelpOpt = true; break; } } if ( showVersionOpt ) { cout << get_version() << endl; exit(0); } showInfo(); if ( showHelpOpt ) { showUsage(); exit(0); } // Man your battle stations... this is not a drill. Logger* logger = Logger::bootstrap( Logger::parse_log_level( logLevelOpt ) ); Object::bootstrap( logger, logger->should_log( Logger::Debug ) ); Filesystem::bootstrap( logger ); MidiMap::create_instance(); Preferences::create_instance(); Preferences* preferences = Preferences::get_instance(); #ifdef H2CORE_HAVE_OSC preferences->setOscServerEnabled( true ); #endif // See below for Hydrogen. ___INFOLOG( QString("Using QT version ") + QString( qVersion() ) ); ___INFOLOG( "Using data path: " + Filesystem::sys_data_path() ); #ifdef H2CORE_HAVE_LASH LashClient::create_instance("hydrogen", "Hydrogen", &argc, &argv); LashClient* lashClient = LashClient::get_instance(); #endif if ( ! drumkitName.isEmpty() ){ Drumkit::install( drumkitName ); exit(0); } if (sSelectedDriver == "auto") { preferences->m_sAudioDriver = "Auto"; } else if (sSelectedDriver == "jack") { preferences->m_sAudioDriver = "Jack"; } else if ( sSelectedDriver == "oss" ) { preferences->m_sAudioDriver = "Oss"; } else if ( sSelectedDriver == "alsa" ) { preferences->m_sAudioDriver = "Alsa"; } else if (sSelectedDriver == "CoreAudio") { preferences->m_sAudioDriver = "CoreAudio"; } else if (sSelectedDriver == "PulseAudio") { preferences->m_sAudioDriver = "PulseAudio"; } #ifdef H2CORE_HAVE_LASH if ( preferences->useLash() && lashClient->isConnected() ) { lash_event_t* lash_event = lashClient->getNextEvent(); if (lash_event && lash_event_get_type(lash_event) == LASH_Restore_File) { // notify client that this project was not a new one lashClient->setNewProject(false); songFilename = ""; songFilename.append( QString::fromLocal8Bit(lash_event_get_string(lash_event)) ); songFilename.append("/hydrogen.h2song"); //Logger::get_instance()->log("[LASH] Restore file: " + songFilename); lash_event_destroy(lash_event); } else if (lash_event) { //Logger::get_instance()->log("[LASH] ERROR: Instead of restore file got event: " + lash_event_get_type(lash_event)); lash_event_destroy(lash_event); } } #endif #ifdef H2CORE_HAVE_JACKSESSION if (!sessionId.isEmpty()) { preferences->setJackSessionUUID ( sessionId ); /* imo, jack sessions use jack as default audio driver. * hydrogen remember last used audiodriver. * here we make it save that hydrogen start in a jacksession case * every time with jack as audio driver */ preferences->m_sAudioDriver = "Jack"; } /* the use of applicationFilePath() make it * possible to use different executables. * for example if you start hydrogen from a local * build directory. */ // QString path = pQApp->applicationFilePath(); // preferences->setJackSessionApplicationPath ( path ); #endif Hydrogen::create_instance(); Hydrogen *pHydrogen = Hydrogen::get_instance(); Song *pSong = nullptr; Playlist *pPlaylist = nullptr; // Load playlist if ( ! playlistFilename.isEmpty() ) { pPlaylist = Playlist::load ( playlistFilename, preferences->isPlaylistUsingRelativeFilenames() ); if ( ! pPlaylist ) { ___ERRORLOG( "Error loading the playlist" ); return 0; } /* Load first song */ preferences->setLastPlaylistFilename( playlistFilename ); QString FirstSongFilename; pPlaylist->getSongFilenameByNumber( 0, FirstSongFilename ); pSong = Song::load( FirstSongFilename ); if( pSong ){ pHydrogen->setSong( pSong ); preferences->setLastSongFilename( songFilename ); pPlaylist->activateSong( 0 ); } show_playlist( pPlaylist->getActiveSongNumber() ); } // Load song - if wasn't already loaded with playlist if ( ! pSong ) { if ( !songFilename.isEmpty() ) { pSong = Song::load( songFilename ); } else { /* Try load last song */ bool restoreLastSong = preferences->isRestoreLastSongEnabled(); QString filename = preferences->getLastSongFilename(); if ( restoreLastSong && ( !filename.isEmpty() )) { pSong = Song::load( filename ); } } /* Still not loaded */ if (! pSong) { ___INFOLOG("Starting with empty song"); pSong = Song::get_empty_song(); pSong->set_filename( "" ); } pHydrogen->setSong( pSong ); preferences->setLastSongFilename( songFilename ); } if ( ! drumkitToLoad.isEmpty() ){ Drumkit* drumkitInfo = Drumkit::load_by_name( drumkitToLoad, true ); if ( drumkitInfo ) { pHydrogen->loadDrumkit( drumkitInfo ); } else { ___ERRORLOG ( "Error loading the drumkit" ); } } AudioEngine* AudioEngine = AudioEngine::get_instance(); Sampler* sampler = AudioEngine->get_sampler(); switch ( interpolation ) { case 1: sampler->setInterpolateMode( Sampler::COSINE ); break; case 2: sampler->setInterpolateMode( Sampler::THIRD ); break; case 3: sampler->setInterpolateMode( Sampler::CUBIC ); break; case 4: sampler->setInterpolateMode( Sampler::HERMITE ); break; case 0: default: sampler->setInterpolateMode( Sampler::LINEAR ); } EventQueue *pQueue = EventQueue::get_instance(); signal(SIGINT, signal_handler); bool ExportMode = false; if ( ! outFilename.isEmpty() ) { InstrumentList *pInstrumentList = pSong->get_instrument_list(); for (auto i = 0; i < pInstrumentList->size(); i++) { pInstrumentList->get(i)->set_currently_exported( true ); } pHydrogen->startExportSession(rate, bits); pHydrogen->startExportSong( outFilename ); cout << "Export Progress ... "; ExportMode = true; } // Interactive mode while ( ! quit ) { /* FIXME: Someday here will be The Real CLI ;-) */ Event event = pQueue->pop_event(); // if ( event.type > 0) cout << "EVENT TYPE: " << event.type << endl; /* Event handler */ switch ( event.type ) { case EVENT_PROGRESS: /* event used only in export mode */ if ( ! ExportMode ) break; if ( event.value < 100 ) { cout << "\rExport Progress ... " << event.value << "%"; } else { pHydrogen->stopExportSession(); cout << "\rExport Progress ... DONE" << endl; quit = true; } break; case EVENT_PLAYLIST_LOADSONG: /* Load new song on MIDI event */ if( pPlaylist ){ QString FirstSongFilename; pPlaylist->getSongFilenameByNumber( event.value, FirstSongFilename ); pSong = Song::load( FirstSongFilename ); if( pSong ) { pHydrogen->setSong( pSong ); preferences->setLastSongFilename( songFilename ); pPlaylist->activateSong( event.value ); } } break; case EVENT_NONE: /* Sleep if there is no more events */ Sleeper::msleep ( 100 ); break; case EVENT_QUIT: // Shutdown if indicated by a // corresponding OSC message. quit = true; break; } } if ( pHydrogen->getState() == STATE_PLAYING ) { pHydrogen->sequencer_stop(); } delete pSong; delete pPlaylist; delete pQueue; delete pHydrogen; delete preferences; delete AudioEngine; delete MidiMap::get_instance(); delete MidiActionManager::get_instance(); ___INFOLOG( "Quitting..." ); delete Logger::get_instance(); int nObj = Object::objects_count(); if (nObj != 0) { cerr << "\n\n\n " << nObj << " alive objects\n\n" << endl << endl; Object::write_objects_map_to_cerr(); } } catch ( const H2Exception& ex ) { cerr << "[main] Exception: " << ex.what() << endl; } catch (...) { cerr << "[main] Unknown exception X-(" << endl; } return 0; } /* Show some information */ void showInfo() { cout << "\nHydrogen " + get_version() + " [" + __DATE__ + "] [http://www.hydrogen-music.org]" << endl; cout << "Copyright 2002-2008 Alessandro Cominu" << endl; if ( Object::count_active() ) { cout << "\nObject counting active" << endl; } cout << "\nHydrogen comes with ABSOLUTELY NO WARRANTY" << endl; cout << "This is free software, and you are welcome to redistribute it" << endl; cout << "under certain conditions. See the file COPYING for details\n" << endl; } /** * Show the correct usage */ void showUsage() { cout << "Usage: hydrogen [-v] [-h] -s file" << endl; cout << " -d, --driver AUDIODRIVER - Use the selected audio driver (jack, alsa, oss)" << endl; cout << " -s, --song FILE - Load a song (*.h2song) at startup" << endl; cout << " -p, --playlist FILE - Load a playlist (*.h2playlist) at startup" << endl; cout << " -o, --outfile FILE - Output to file (export)" << endl; cout << " -r, --rate RATE - Set bitrate while exporting file" << endl; cout << " -b, --bits BITS - Set bits depth while exporting file" << endl; cout << " -k, --kit drumkit_name - Load a drumkit at startup" << endl; cout << " -i, --install FILE - install a drumkit (*.h2drumkit)" << endl; cout << " -I, --interpolate INT - Interpolation" << endl; cout << " (0:linear [default],1:cosine,2:third,3:cubic,4:hermite)" << endl; #ifdef H2CORE_HAVE_JACKSESSION cout << " -S, --jacksessionid ID - Start a JackSessionHandler session" << endl; #endif #ifdef H2CORE_HAVE_LASH cout << " --lash-no-start-server - If LASH server not running, don't start" << endl << " it (LASH 0.5.3 and later)." << endl; cout << " --lash-no-autoresume - Tell LASH server not to assume I'm returning" << endl << " from a crash." << endl; #endif cout << " -V[Level], --verbose[=Level] - Print a lot of debugging info" << endl; cout << " Level, if present, may be None, Error, Warning, Info, Debug or 0xHHHH" << endl; cout << " -v, --version - Show version info" << endl; cout << " -h, --help - Show this help message" << endl; } hydrogen-1.0.0-rc1/src/core/000077500000000000000000000000001366722712400155435ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/CMakeLists.txt000066400000000000000000000043651366722712400203130ustar00rootroot00000000000000 CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/include/hydrogen/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/include/hydrogen/config.h" @ONLY) FILE(GLOB_RECURSE hydrogen_INCLUDES include/*.h) FILE(GLOB_RECURSE hydrogen_SOURCES src/*.cpp src/*.cc src/*.c) LIST(APPEND hydrogen_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/include/hydrogen/config.h) ADD_LIBRARY( hydrogen-core-${VERSION} ${H2CORE_LIBRARY_TYPE} ${hydrogen_SOURCES}) INCLUDE_DIRECTORIES( include ${CMAKE_SOURCE_DIR}/include # regular headers ${CMAKE_CURRENT_BINARY_DIR}/include # generated config.h ${QT_INCLUDES} ${LIBTAR_INCLUDE_DIRS} ${LIBARCHIVE_INCLUDE_DIRS} ${LIBSNDFILE_INCLUDE_DIRS} ${ALSA_INCLUDE_DIRS} ${OSS_INCLUDE_DIRS} ${JACK_INCLUDE_DIRS} ${PORTAUDIO_INCLUDE_DIRS} ${PORTMIDI_INCLUDE_DIRS} ${COREAUDIO_INCLUDE_DIRS} ${COREMIDI_INCLUDE_DIRS} ${LASH_INCLUDE_DIRS} ${LRDF_INCLUDE_DIRS} ${OSC_INCLUDE_DIRS} ${RUBBERBAND_INCLUDE_DIRS} ) TARGET_LINK_LIBRARIES(hydrogen-core-${VERSION} ${LIBTAR_LIBRARIES} ${LIBARCHIVE_LIBRARIES} ${LIBSNDFILE_LIBRARIES} ${ALSA_LIBRARIES} ${OSS_LIBRARIES} ${JACK_LIBRARIES} ${PORTAUDIO_LIBRARIES} ${PORTMIDI_LIBRARIES} ${AUDIOUNIT_LIBRARY} ${CORESERVICES_LIBRARY} ${COREAUDIO_LIBRARIES} ${COREMIDI_LIBRARIES} ${PULSEAUDIO_LIBRARIES} ${LASH_LIBRARIES} ${LRDF_LIBRARIES} ${RUBBERBAND_LIBRARIES} ${ZLIB_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${OSC_LIBRARIES} ) TARGET_LINK_LIBRARIES(hydrogen-core-${VERSION} Qt5::Core Qt5::Xml Qt5::XmlPatterns ) #SET_TARGET_PROPERTIES(hydrogen-core-${VERSION} PROPERTIES PUBLIC_HEADER "${hydrogen_INCLUDES}" ) SET_PROPERTY(TARGET hydrogen-core-${VERSION} PROPERTY CXX_STANDARD 14) INSTALL(TARGETS hydrogen-core-${VERSION} LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" # do not copy directory hierarchy #PUBLIC_HEADER DESTINATION include/hydrogen ) IF(NOT APPLE AND NOT WIN32) INSTALL(DIRECTORY include DESTINATION "${CMAKE_INSTALL_PREFIX}" FILES_MATCHING PATTERN "*.h" PATTERN ".svn" EXCLUDE) INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/hydrogen/config.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hydrogen" ) ENDIF() hydrogen-1.0.0-rc1/src/core/include/000077500000000000000000000000001366722712400171665ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/000077500000000000000000000000001366722712400210055ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/000077500000000000000000000000001366722712400213145ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/AlsaAudioDriver.h000066400000000000000000000041621366722712400245060ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ALSA_AUDIO_DRIVER_H #define ALSA_AUDIO_DRIVER_H #include #include #if defined(H2CORE_HAVE_ALSA) || _DOXYGEN_ #include #include namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); class AlsaAudioDriver : public AudioOutput { H2_OBJECT public: snd_pcm_t *m_pPlayback_handle; bool m_bIsRunning; unsigned long m_nBufferSize; float* m_pOut_L; float* m_pOut_R; int m_nXRuns; QString m_sAlsaAudioDevice; audioProcessCallback m_processCallback; AlsaAudioDriver( audioProcessCallback processCallback ); ~AlsaAudioDriver(); virtual int init( unsigned nBufferSize ); virtual int connect(); virtual void disconnect(); virtual unsigned getBufferSize(); virtual unsigned getSampleRate(); virtual float* getOut_L(); virtual float* getOut_R(); virtual void updateTransportInfo(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void setBpm( float fBPM ); private: unsigned int m_nSampleRate; }; #else namespace H2Core { class AlsaAudioDriver : public NullDriver { H2_OBJECT public: AlsaAudioDriver( audioProcessCallback processCallback ) : NullDriver( processCallback ) {} }; #endif // H2CORE_HAVE_ALSA }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/AlsaMidiDriver.h000066400000000000000000000035411366722712400243270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ALSA_MIDI_DRIVER_H #define ALSA_MIDI_DRIVER_H #include #include #if defined(H2CORE_HAVE_ALSA) || _DOXYGEN_ #include #include #include namespace H2Core { /// /// Alsa Midi Driver /// Based on Matthias Nagorni alsa sequencer example /// class AlsaMidiDriver : public virtual MidiInput, public virtual MidiOutput { H2_OBJECT public: AlsaMidiDriver(); virtual ~AlsaMidiDriver(); virtual void open(); virtual void close(); virtual std::vector getInputPortList(); virtual std::vector getOutputPortList(); void midi_action( snd_seq_t *seq_handle ); void getPortInfo( const QString& sPortName, int& nClient, int& nPort ); virtual void handleQueueNote(Note* pNote); virtual void handleQueueNoteOff( int channel, int key, int velocity ); virtual void handleQueueAllNoteOff(); virtual void handleOutgoingControlChange( int param, int value, int channel ); private: }; }; #endif // H2CORE_HAVE_ALSA #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/AudioOutput.h000066400000000000000000000044611366722712400237540ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_AUDIO_OUTPUT_H #define H2_AUDIO_OUTPUT_H #include "hydrogen/config.h" #include #include namespace H2Core { /// /// Base abstract class for audio output classes. /// class AudioOutput : public H2Core::Object { public: /** Local instance of the TransportInfo. */ TransportInfo m_transport; AudioOutput( const char* class_name ) : Object( class_name ) , __track_out_enabled( false ) { } virtual ~AudioOutput() { } virtual int init( unsigned nBufferSize ) = 0; virtual int connect() = 0; virtual void disconnect() = 0; virtual unsigned getBufferSize() = 0; virtual unsigned getSampleRate() = 0; virtual float* getOut_L() = 0; virtual float* getOut_R() = 0; virtual void updateTransportInfo() = 0; virtual void play() = 0; virtual void stop() = 0; virtual void locate( unsigned long nFrame ) = 0; virtual void setBpm( float fBPM ) = 0; /** Accesses the per-track output port settings of a driver. * \return __track_out_enabled */ bool has_track_outs() { return __track_out_enabled; } protected: /** * Whether the JackAudioDriver is ordered to create per-track * audio output ports (true). The order comes from the * variable Preferences::m_bJackTrackOuts. It will be used by * the Sampler and Hydrogen itself to probe the behavior of * the JackAudioDriver. * * In all other drivers this variable isn't used. It gets * initialized to false. */ bool __track_out_enabled; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/CoreAudioDriver.h000066400000000000000000000051671366722712400245240ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://hydrogen.sourceforge.net * * CoreAudio Driver for Hydrogen * Copyright(c) 2005 by Jonathan Dempsey [jonathandempsey@fastmail.fm] * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * * Rewrote CoreAudio driver, now using AUHAL (2005/03/02 Jonathan Dempsey) * Cleaned up the code a bit and updated (2005/11/29 Jonathan Dempsey) * More cleaning . . . (2005/12/31 Jonathan Dempsey) */ #ifndef COREAUDIO_DRIVER_H #define COREAUDIO_DRIVER_H #include #include #if defined(H2CORE_HAVE_COREAUDIO) || _DOXYGEN_ #include #include #include #endif #include #include typedef int ( *audioProcessCallback )( uint32_t, void * ); namespace H2Core { #if defined(H2CORE_HAVE_COREAUDIO) || _DOXYGEN_ class CoreAudioDriver : public AudioOutput { H2_OBJECT public: audioProcessCallback mProcessCallback; UInt32 m_nBufferSize; AudioUnit m_outputUnit; AudioDeviceID m_outputDevice; float* m_pOut_L; float* m_pOut_R; CoreAudioDriver( audioProcessCallback processCallback ); virtual ~CoreAudioDriver(); int init( unsigned bufferSize ); unsigned getSampleRate(); unsigned getBufferSize(); int connect(); void disconnect(); float* getOut_L(); float* getOut_R(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void updateTransportInfo(); virtual void setBpm( float fBPM ); private: void retrieveDefaultDevice(void); void retrieveBufferSize(void); void printStreamInfo(void); bool m_bIsRunning; unsigned m_nSampleRate; unsigned oSampleRate; }; #else class CoreAudioDriver : public NullDriver { H2_OBJECT public: CoreAudioDriver( audioProcessCallback processCallback ) : NullDriver ( processCallback ) {} }; #endif // H2CORE_HAVE_COREAUDIO } #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/CoreMidiDriver.h000066400000000000000000000041051366722712400243340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * CoreMidi driver for Hydrogen * Copyright(c) 2005-2006 by Jonathan Dempsey * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * * Some cleanup . . . (20060222 Jonathan Dempsey) * Removed some unused code (20060514 Jonathan Dempsey) */ #ifndef CORE_MIDI_DRIVER_H #define CORE_MIDI_DRIVER_H #include #include #if defined(H2CORE_HAVE_COREMIDI) || _DOXYGEN_ #include namespace H2Core { class CoreMidiDriver : public virtual MidiInput, public virtual MidiOutput { H2_OBJECT public: CoreMidiDriver(); ~CoreMidiDriver(); bool m_bRunning; virtual void open(); virtual void close(); virtual std::vector getInputPortList(); virtual std::vector getOutputPortList(); virtual void handleQueueNote(Note* pNote); virtual void handleQueueNoteOff( int channel, int key, int velocity ); virtual void handleQueueAllNoteOff(); virtual void handleOutgoingControlChange( int param, int value, int channel ); MIDIClientRef h2MIDIClient; ItemCount cmSources; MIDIEndpointRef cmH2Src; MIDIPortRef h2InputRef; MIDIPortRef h2OutputRef; MIDIEndpointRef cmH2Dst; MIDIEndpointRef h2VirtualOut; private: void sendMidiPacket (MIDIPacketList *packetList); }; } ; // namespace #endif // H2CORE_HAVE_COREMIDI #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/DiskWriterDriver.h000066400000000000000000000042421366722712400247320ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 DISK_WRITER_DRIVER_H #define DISK_WRITER_DRIVER_H #include #include #include #include namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); /// /// Driver for export audio to disk /// class DiskWriterDriver : public AudioOutput { H2_OBJECT public: unsigned m_nSampleRate; QString m_sFilename; unsigned m_nBufferSize; int m_nSampleDepth; audioProcessCallback m_processCallback; float* m_pOut_L; float* m_pOut_R; DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, int nSampleDepth ); ~DiskWriterDriver(); int init( unsigned nBufferSize ); int connect(); void disconnect(); void write( float* buffer_L, float* buffer_R, unsigned int bufferSize ); void audioEngine_process_checkBPMChanged(); unsigned getBufferSize() { return m_nBufferSize; } unsigned getSampleRate(); float* getOut_L() { return m_pOut_L; } float* getOut_R() { return m_pOut_R; } void setFileName( const QString& sFilename ){ m_sFilename = sFilename; } virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void updateTransportInfo(); virtual void setBpm( float fBPM ); private: }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/FakeDriver.h000066400000000000000000000032561366722712400235150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 FAKE_DRIVER_H #define FAKE_DRIVER_H #include #include namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); /** * Fake audio driver. Used only for profiling. */ class FakeDriver : public AudioOutput { H2_OBJECT public: FakeDriver( audioProcessCallback processCallback ); ~FakeDriver(); int init( unsigned nBufferSize ); int connect(); void disconnect(); unsigned getBufferSize() { return m_nBufferSize; } unsigned getSampleRate(); float* getOut_L(); float* getOut_R(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void updateTransportInfo(); virtual void setBpm( float fBPM ); private: audioProcessCallback m_processCallback; unsigned m_nBufferSize; float* m_pOut_L; float* m_pOut_R; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/JackMidiDriver.h000066400000000000000000000053631366722712400243230ustar00rootroot00000000000000/*- * Copyright (c) 2011 Hans Petter Selasky * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef JACK_MIDI_DRIVER_H #define JACK_MIDI_DRIVER_H #include #include #if defined(H2CORE_HAVE_JACK) || _DOXYGEN_ #include #include #include #include #include #include #define JACK_MIDI_BUFFER_MAX 64 /* events */ namespace H2Core { class JackMidiDriver : public virtual MidiInput, public virtual MidiOutput { H2_OBJECT public: JackMidiDriver(); virtual ~JackMidiDriver(); virtual void open(); virtual void close(); virtual std::vector getInputPortList(); virtual std::vector getOutputPortList(); void getPortInfo( const QString& sPortName, int& nClient, int& nPort ); void JackMidiWrite(jack_nframes_t nframes); void JackMidiRead(jack_nframes_t nframes); virtual void handleQueueNote(Note* pNote); virtual void handleQueueNoteOff( int channel, int key, int velocity ); virtual void handleQueueAllNoteOff(); virtual void handleOutgoingControlChange( int param, int value, int channel ); private: void JackMidiOutEvent(uint8_t *buf, uint8_t len); void lock(); void unlock(); jack_port_t *output_port; jack_port_t *input_port; jack_client_t *jack_client; pthread_mutex_t mtx; int running; uint8_t jack_buffer[JACK_MIDI_BUFFER_MAX * 4]; uint32_t rx_in_pos; uint32_t rx_out_pos; }; }; #endif /* H2CORE_HAVE_JACK */ #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/MidiCommon.h000066400000000000000000000031121366722712400235150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_MIDI_COMMON_H #define H2_MIDI_COMMON_H #include "hydrogen/config.h" #include #include #include namespace H2Core { class MidiMessage { public: enum MidiMessageType { UNKNOWN, SYSEX, NOTE_ON, NOTE_OFF, POLYPHONIC_KEY_PRESSURE, CONTROL_CHANGE, PROGRAM_CHANGE, CHANNEL_PRESSURE, PITCH_WHEEL, SYSTEM_EXCLUSIVE, START, CONTINUE, STOP, SONG_POS, QUARTER_FRAME }; MidiMessageType m_type; int m_nData1; int m_nData2; int m_nChannel; std::vector m_sysexData; MidiMessage() : m_type( UNKNOWN ) , m_nData1( -1 ) , m_nData2( -1 ) , m_nChannel( -1 ) {} }; class MidiPortInfo { public: QString m_sName; int m_nClient; int m_nPort; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/MidiInput.h000066400000000000000000000036171366722712400233760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_MIDI_INPUT_H #define H2_MIDI_INPUT_H #include #include #include #include "MidiCommon.h" namespace H2Core { /** * MIDI input base class */ class MidiInput : public virtual Object { public: MidiInput( const char* class_name ); virtual ~MidiInput(); virtual void open() = 0; virtual void close() = 0; virtual std::vector getOutputPortList() = 0; void setActive( bool isActive ) { m_bActive = isActive; } void handleMidiMessage( const MidiMessage& msg ); void handleSysexMessage( const MidiMessage& msg ); void handleControlChangeMessage( const MidiMessage& msg ); void handleProgramChangeMessage( const MidiMessage& msg ); void handlePolyphonicKeyPressureMessage( const MidiMessage& msg ); protected: bool m_bActive; void handleNoteOnMessage( const MidiMessage& msg ); void handleNoteOffMessage( const MidiMessage& msg, bool CymbalChoke ); private: unsigned long __noteOnTick; unsigned long __noteOffTick; unsigned long computeDeltaNoteOnOfftime(); int __hihat_cc_openess; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/MidiOutput.h000066400000000000000000000027321366722712400235740ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_MIDI_OUTPUT_H #define H2_MIDI_OUTPUT_H #include #include #include #include "MidiCommon.h" namespace H2Core { class Note; /** * MIDI input base class */ class MidiOutput : public virtual Object { public: MidiOutput( const char* class_name ); virtual ~MidiOutput(); virtual std::vector getInputPortList() = 0; virtual void handleQueueNote(Note* pNote) = 0; virtual void handleQueueNoteOff( int channel, int key, int velocity ) = 0; virtual void handleQueueAllNoteOff() = 0; virtual void handleOutgoingControlChange( int param, int value, int channel ) = 0; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/NullDriver.h000066400000000000000000000027711366722712400235620ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 NULL_AUDIO_DRIVER_H #define NULL_AUDIO_DRIVER_H #include #include namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); class NullDriver : public AudioOutput { H2_OBJECT public: NullDriver( audioProcessCallback processCallback ); ~NullDriver(); int init( unsigned nBufferSize ); int connect(); void disconnect(); unsigned getBufferSize(); unsigned getSampleRate(); float* getOut_L(); float* getOut_R(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void updateTransportInfo(); virtual void setBpm( float fBPM ); }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/OssDriver.h000066400000000000000000000045701366722712400234130ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 OSS_AUDIO_DRIVER_H #define OSS_AUDIO_DRIVER_H #include #include // check if OSS support is enabled #if defined(H2CORE_HAVE_OSS) || _DOXYGEN_ #ifdef __NetBSD__ #include #else #include #endif #include #include #include #include #include #include #include #include #include /* #ifdef __NetBSD__ #define AUDIO_DEVICE "/dev/audio" #else #define AUDIO_DEVICE "/dev/dsp" #endif */ namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); /// /// OSS Audio Driver /// class OssDriver : public AudioOutput { H2_OBJECT public: OssDriver( audioProcessCallback processCallback ); ~OssDriver(); int init( unsigned bufferSize ); int connect(); void disconnect(); void write(); unsigned getBufferSize(); unsigned getSampleRate(); float* getOut_L(); float* getOut_R(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void updateTransportInfo(); virtual void setBpm( float fBPM ); private: /** file descriptor, for writing to /dev/dsp */ int fd; short* audioBuffer; float* out_L; float* out_R; audioProcessCallback processCallback; int log2( int n ); }; #else namespace H2Core { class OssDriver : public NullDriver { H2_OBJECT public: OssDriver( audioProcessCallback processCallback ) : NullDriver( processCallback ) {} }; #endif // OSS support }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/PortAudioDriver.h000066400000000000000000000040571366722712400245550ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PORT_AUDIO_DRIVER_H #define PORT_AUDIO_DRIVER_H #include #include #include #if defined(H2CORE_HAVE_PORTAUDIO) || _DOXYGEN_ #include #include namespace H2Core { typedef int ( *audioProcessCallback )( uint32_t, void * ); class PortAudioDriver : public AudioOutput { H2_OBJECT public: audioProcessCallback m_processCallback; float* m_pOut_L; float* m_pOut_R; unsigned m_nBufferSize; PortAudioDriver( audioProcessCallback processCallback ); virtual ~PortAudioDriver(); virtual int init( unsigned nBufferSize ); virtual int connect(); virtual void disconnect(); virtual unsigned getBufferSize(); virtual unsigned getSampleRate(); virtual float* getOut_L(); virtual float* getOut_R(); virtual void updateTransportInfo(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void setBpm( float fBPM ); private: PaStream *m_pStream; unsigned m_nSampleRate; }; }; #else namespace H2Core { class PortAudioDriver : public NullDriver { H2_OBJECT public: PortAudioDriver( audioProcessCallback processCallback ) : NullDriver( processCallback ) {} }; }; #endif #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/PortMidiDriver.h000066400000000000000000000032401366722712400243670ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PORT_MIDI_DRIVER_H #define PORT_MIDI_DRIVER_H #include #include #if defined(H2CORE_HAVE_PORTMIDI) || _DOXYGEN_ #include namespace H2Core { class PortMidiDriver : public virtual MidiInput, public virtual MidiOutput { H2_OBJECT public: PmStream *m_pMidiIn; PmStream *m_pMidiOut; bool m_bRunning; PortMidiDriver(); virtual ~PortMidiDriver(); virtual void open(); virtual void close(); virtual std::vector getInputPortList(); virtual std::vector getOutputPortList(); virtual void handleQueueNote(Note* pNote); virtual void handleQueueNoteOff( int channel, int key, int velocity ); virtual void handleQueueAllNoteOff(); virtual void handleOutgoingControlChange( int param, int value, int channel ); private: }; }; #endif #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/PulseAudioDriver.h000066400000000000000000000053461366722712400247230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_PULSE_AUDIO_DRIVER_H #define H2_PULSE_AUDIO_DRIVER_H #include #if defined(H2CORE_HAVE_PULSEAUDIO) || _DOXYGEN_ #include #include #include namespace H2Core { /// /// PulseAudio driver. /// class PulseAudioDriver : public AudioOutput { H2_OBJECT public: typedef int (*audioProcessCallback)(uint32_t, void *); PulseAudioDriver(audioProcessCallback processCallback); ~PulseAudioDriver(); virtual int init( unsigned nBufferSize ); virtual int connect(); virtual void disconnect(); virtual unsigned getBufferSize(); virtual unsigned getSampleRate(); virtual float* getOut_L(); virtual float* getOut_R(); virtual void updateTransportInfo(); virtual void play(); virtual void stop(); virtual void locate( unsigned long nFrame ); virtual void setBpm( float fBPM ); private: pthread_t m_thread; pthread_mutex_t m_mutex; pthread_cond_t m_cond; int m_pipe[2]; audioProcessCallback m_callback; pa_mainloop* m_main_loop; pa_context* m_ctx; pa_stream* m_stream; bool m_connected; int m_ready; unsigned m_sample_rate; unsigned m_buffer_size; float* m_outL; float* m_outR; static void* s_thread_body(void*); int thread_body(); static void ctx_state_callback(pa_context* ctx, void* udata); static void stream_state_callback(pa_stream* stream, void* udata); static void stream_write_callback(pa_stream* stream, size_t bytes, void* udata); static void pipe_callback(pa_mainloop_api*, pa_io_event*, int fd, pa_io_event_flags_t events, void *udata); }; } //namespace H2Core #else #include namespace H2Core { class PulseAudioDriver : public NullDriver { H2_OBJECT public: PulseAudioDriver( audioProcessCallback processCallback ) : NullDriver( processCallback ) {} }; } #endif //H2CORE_HAVE_PULSEAUDIO #endif //H2_PULSE_AUDIO_DRIVER_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/TransportInfo.h000066400000000000000000000063441366722712400243040ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 TRANSPORT_INFO_H #define TRANSPORT_INFO_H #include namespace H2Core { /** * Object holding most of the information about the transport state of * the AudioEngine, like if it is playing or stopped or its current * transport position and speed. */ class TransportInfo : public H2Core::Object { H2_OBJECT public: enum { /** The audio engine is playing back or processing audio and the transport is stopped. */ STOPPED, /** The audio engine is playing back or processing audio and the transport is running. */ ROLLING, /** This option is not yet used in the source code. */ BAD }; /** * Current transport status of the audio engine. It can have * three (known) states: * - TransportInfo::STOPPED * - TransportInfo::ROLLING * - TransportInfo::BAD */ unsigned m_status; /** * Current transport position in number of frames since the * beginning of the song. * * A __frame__ is a single sample of an audio signal. Thus, * with a _sample rate_ of 48000Hz, 48000 frames will be * recorded in one second and, with a _buffer size_ = 1024, * 1024 consecutive frames will be accumulated before they are * handed over to the audio engine for processing. Internally, * a frame will be represented by a float. */ long long m_nFrames; /** * Number of frames that make up one tick. * * A tick is the most fine-grained time scale handled by the * AudioEngine. The notes won't be processed frame by frame but, * instead, tick by tick. Therefore, #m_nTickSize represents the * minimum duration of a Note as well as the minimum distance * between two of them. * * It will only be used by the JackAudioDriver and is * calculated by the sample rate * 60.0 / ( #m_fBPM * * Song::__resolution ). The factor 60.0 will be used to convert * the sample rate, which is given in second, into minutes (as * the #m_fBPM). */ float m_fTickSize; /** Current tempo in beats per minute. */ float m_fBPM; /** * Constructor of TransportInfo * * - Sets #m_status to TransportInfo::STOPPED * - Sets #m_nFrames and #m_fTickSize to 0 * - Sets #m_fBPM to 120 */ TransportInfo(); /** Destructor of TransportInfo */ ~TransportInfo(); /** Displays general information about the transport state in the #INFOLOG * * Prints out #m_status, #m_nFrames, and #m_fTickSize. */ void printInfo(); }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/IO/jack_audio_driver.h000066400000000000000000000766101366722712400251430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_JACK_OUTPUT_H #define H2_JACK_OUTPUT_H #include #include // check if jack support is disabled #if defined(H2CORE_HAVE_JACK) || _DOXYGEN_ // JACK support es enabled. #include #include #include #if defined(H2CORE_HAVE_JACKSESSION) || _DOXYGEN_ #include #endif #include #include #include namespace H2Core { class Song; class Instrument; class InstrumentComponent; /** * JACK (Jack Audio Connection Kit) server driver. * * __Transport Control__: * * Each JACK client can start and stop the transport or relocate the * current transport position. The request will take place in * cycles. During the first the status of the transport changes to * _JackTransportStarting_ to inform all clients a change is about to * happen. During the second the status is again * _JackTransportRolling_ and the transport position is updated * according to the request. The current timebase master (see below), * if present, needs another cycle to update the additional transport * information. * * Such a relocation request is also triggered when clicking on the * timeline or the player control buttons of Hydrogen. Internally, * audioEngine_stop() is called during the cycle in which the JACK * transport status is _JackTransportStarting_ and started again by * audioEngine_start() when in _JackTransportRolling_ in the next * cycle. Note that if there are slow synchronizing client in JACK's * connection graph, it can take multiple cycles until the JACK * transport is rolling again. * * Also note that Hydrogen overwrites its local TransportInfo stored * in AudioOutput::m_transport only with the transport position of the * JACK server if a relocation did happened or another timebase master * did change the speed. During normal transport the current position * TransportInfo::m_nFrames will be always the same as the one of JACK * during a cycle and incremented by the buffer size in * audioEngine_process() at the very end of the cycle. The same * happens for the transport information of the JACK server but in * parallel. * * __Timebase Master__: * * The timebase master is responsible to update additional information * in the transport information of the JACK server apart from the * transport position in frames (see TransportInfo::m_nFrames if you * aren't familiar with frames), like the current beat, bar, tick, * tick size, speed etc. Every client can be registered as timebase * master by supplying a callback (for Hydrogen this would be * JackTimebaseCallback()) but there can be at most one timebase * master at a time. Having none at all is perfectly fine too. Apart * from this additional responsibility, the registered client has no * other rights compared to others. * * After the status of the JACK transport has changed from * _JackTransportStarting_ to _JackTransportRolling_, the timebase * master needs an additional cycle to update its information. * * Having an external timebase master present will change the general * behavior of Hydrogen. All local tempo settings on the Timeline will * be disregarded and the tempo broadcasted by the JACK server will be * used instead. * * This object will only be accessible if #H2CORE_HAVE_JACK was defined * during the configuration and the user enables the support of the * JACK server. */ class JackAudioDriver : public AudioOutput { H2_OBJECT public: /** * Object holding the external client session with the JACK * server. * * It is set via init(). */ jack_client_t* m_pClient; /** * Constructor of the JACK server driver. * * @param m_processCallback Prototype for the client supplied function that is called by the engine anytime there is work to be done. It gets two input arguments _nframes_ of type jack_nframes_t, which specifies the number of frames to process, and a void pointer called _arg_, which points to a client supplied structure. Two preconditions do act on the _nframes_ argument: _nframes_ == getBufferSize() and _nframes_ == pow(2,x) It returns zero on success and non-zero on error. */ JackAudioDriver( JackProcessCallback m_processCallback ); /** * Destructor of the JACK server driver. * * Calling disconnect(). */ ~JackAudioDriver(); /** * Connects to output ports via the JACK server. * * Starts by telling the JACK server that Hydrogen is ready to * process audio using the jack_activate function (from the * jack/jack.h header) and overwriting the memory allocated by * #m_pTrackOutputPortsL and #m_pTrackOutputPortsR with zeros. If * the #m_bConnectDefaults variable is true or LashClient is used * and Hydrogen is not within a new Lash project, the function * attempts to connect the #m_pOutputPort1 port with * #m_sOutputPortName1 and the #m_pOutputPort2 port with * #m_sOutputPortName2. To establish the connection, * _jack_connect()_ (jack/jack.h) will be used. In case this was * not successful, the function will look up all ports containing * the _JackPortIsInput_ (jack/types.h) flag using * _jack_get_ports()_ (jack/jack.h) and attempts to connect to the * first two it found. * * @return * - __0__ : if either the connection of the output ports did * work, two ports having the _JackPortIsInput_ flag where * found and the #m_pOutputPort1 and #m_pOutputPort2 ports * where successfully connected to them, or the user enabled * Lash during compilation and an established project was * used. * - __1__ : The activation of the JACK client using * _jack_activate()_ (jack/jack.h) did fail. * - __2__ : The connections to #m_sOutputPortName1 and * #m_sOutputPortName2 could not be established and the * there were either no JACK ports holding the * JackPortIsInput flag found or no connection to them could * be established. */ int connect(); /** * Disconnects the JACK client of the Hydrogen from the JACK * server. * * Firstly, it calls deactivate(). Then, it closes the connection * between the JACK server and the local client using * jack_client_close (jack/jack.h), and sets the #m_pClient * pointer to nullptr. */ void disconnect(); /** * Deactivates the JACK client of Hydrogen and disconnects all * ports belonging to it. * * It calls the _jack_deactivate()_ (jack/jack.h) function on the * current client #m_pClient and overwrites the memory allocated * by #m_pTrackOutputPortsL and #m_pTrackOutputPortsR with zeros. */ void deactivate(); /** \return Global variable #jackServerBufferSize. */ unsigned getBufferSize(); /** \return Global variable #jackServerSampleRate. */ unsigned getSampleRate(); /** Accesses the number of output ports currently in use. * \return #m_nTrackPortCount */ int getNumTracks(); /** \return #m_JackTransportState */ jack_transport_state_t getTransportState() { return m_JackTransportState; } /** \return #m_JackTransportPos */ jack_position_t getTransportPos() { return m_JackTransportPos; } /** * Creates per component output ports for each instrument. * * Firstly, it resets #m_trackMap with zeros. Then, it loops * through all the instruments and their components, creates a new * output or resets an existing one for each of them using * setTrackOutput(), and stores the corresponding track number in * #m_trackMap. Finally, all ports in #m_pTrackOutputPortsL and * #m_pTrackOutputPortsR, which haven't been used in the previous * step, are unregistered using _jack_port_unregister()_ * (jack/jack.h) and overwritten with 0. #m_nTrackPortCount will * be set to biggest track number encountered during the * creation/reassignment step. * * The function will only perform its tasks if the * Preferences::m_bJackTrackOuts is set to true. */ void makeTrackOutputs( Song* pSong ); /** * Renames the @a n 'th port of JACK client and creates it if * it's not already present. * * If the track number @a n is bigger than the number of ports * currently in usage #m_nTrackPortCount, @a n + 1 - * #m_nTrackPortCount new stereo ports will be created using * _jack_port_register()_ (jack/jack.h) and #m_nTrackPortCount * updated to @a n + 1. * * Afterwards, the @a n 'th port is renamed to a concatenation of * "Track_", DrumkitComponent::__name, "_", @a n + 1, "_", * Instrument::__name, and "_L", or "_R" using either * _jack_port_rename()_ (if HAVE_JACK_PORT_RENAME is defined) or * _jack_port_set_name()_ (both jack/jack.h). The former renaming * function triggers a _PortRename_ notifications to clients that * have registered a port rename handler. * * \param n Track number for which a port should be renamed * (and created). * \param instr Pointer to the corresponding Instrument. * \param pCompo Pointer to the corresponding * InstrumentComponent. * \param pSong Pointer to the corresponding Song. */ void setTrackOutput( int n, Instrument* instr, InstrumentComponent* pCompo, Song* pSong ); /** \param flag Sets #m_bConnectDefaults*/ void setConnectDefaults( bool flag ) { m_bConnectDefaults = flag; } /** \return #m_bConnectDefaults */ bool getConnectDefaults() { return m_bConnectDefaults; } /** * Get content in the left stereo output port. * * It calls _jack_port_get_buffer()_ (jack/jack.h) with both the * port name #m_pOutputPort1 and buffer size * #jackServerBufferSize. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getOut_L(); /** * Get content in the right stereo output port. * * It calls _jack_port_get_buffer()_ (jack/jack.h) with both the * port name #m_pOutputPort2 and buffer size * #jackServerBufferSize. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getOut_R(); /** * Get content of left output port of a specific track. * * It calls _jack_port_get_buffer()_ (jack/jack.h) with the port * in the @a nTrack element of #m_pTrackOutputPortsL and buffer * size #jackServerBufferSize. * * \param nTrack Track number. Must not be bigger than * #m_nTrackPortCount. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getTrackOut_L( unsigned nTrack ); /** * Get content of right output port of a specific track. * * It calls _jack_port_get_buffer()_ (jack/jack.h) with the port * in the @a nTrack element of #m_pTrackOutputPortsR and buffer * size #jackServerBufferSize. * * \param nTrack Track number. Must not be bigger than * #m_nTrackPortCount. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getTrackOut_R( unsigned nTrack ); /** * Convenience function looking up the track number of a component * of an instrument using in #m_trackMap using their IDs * Instrument::__id and * InstrumentComponent::__related_drumkit_componentID. Using the * track number it then calls getTrackOut_L( unsigned ) and * returns its result. * * \param instr Pointer to an Instrument * \param pCompo Pointer to one of the instrument's components. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getTrackOut_L( Instrument* instr, InstrumentComponent* pCompo ); /** * Convenience function looking up the track number of a component * of an instrument using in #m_trackMap using their IDs * Instrument::__id and * InstrumentComponent::__related_drumkit_componentID. Using the * track number it then calls getTrackOut_R( unsigned ) and * returns its result. * * \param instr Pointer to an Instrument * \param pCompo Pointer to one of the instrument's components. * * \return Pointer to buffer content of type * _jack_default_audio_sample_t*_ (jack/types.h) */ float* getTrackOut_R( Instrument* instr, InstrumentComponent* pCompo ); /** * Initializes the JACK audio driver. * * Firstly, it determines the destination ports * #m_sOutputPortName1 and #m_sOutputPortName2 the output ports of * Hydrogen will be connected to in connect() from * Preferences::m_sJackPortName1 and * Preferences::m_sJackPortName2. The name of the JACK client is * either set to "Hydrogen" or, if #H2CORE_HAVE_OSC was defined * during compilation and OSC support is enabled, to * Preferences::m_sNsmClientId via Preferences::getNsmClientId(). * * Next, the function attempts to open an external client session * with the JACK server using _jack_client_open()_ (jack/jack.h) * and saves it to the pointer #m_pClient. In case this didn't * work properly, it will start two more attempts. Sometime JACK * doesn't stop and start fast enough. If the compiler flag * #H2CORE_HAVE_JACKSESSION was set and the user enabled the usage * of JACK session, the client will be opened using the * corresponding option and the sessionID Token * Preferences::jackSessionUUID, obtained via * Preferences::getJackSessionUUID(), will be provided so the * sessionmanager can identify the client again. * * If the client was opened properly, the function will get its * sample rate using _jack_get_sample_rate()_ and buffer size * using _jack_get_buffer_size()_ (both jack/jack.h) and stores * them in #jackServerSampleRate, Preferences::m_nSampleRate, * #jackServerBufferSize, and Preferences::m_nBufferSize. In * addition, it also registers JackAudioDriver::m_processCallback, * H2Core::jackDriverSampleRate, H2Core::jackDriverBufferSize, and * H2Core::jackDriverShutdown using _jack_set_process_callback()_, * _jack_set_sample_rate_callback()_, * _jack_set_buffer_size_callback()_, and _jack_on_shutdown()_ * (all in jack/jack.h). * * Next, two output ports called "out_L" and "out_R" are * registered for the client #m_pClient using * _jack_port_register()_. * * If everything worked properly, LASH is used * (Preferences::useLash()) by the user, and the LashClient is * LashClient::isConnected() the name of the client will be stored * in LashClient::jackClientName using * LashClient::setJackClientName. If JACK session was enabled, the * jack_session_callback() will be registered using * _jack_set_session_callback()_ (jack/session.h). * * Finally, the function will check whether Hydrogen should be the * JACK timebase master or not via Preferences::m_bJackMasterMode * and calls initTimebaseMaster() if its indeed the case. * * \param bufferSize Unused and only present to assure * compatibility with the JACK API. * * \return * - __0__ : on success. * - __-1__ : if the pointer #m_pClient obtained via * _jack_client_open()_ (jack/jack.h) is 0. * - __4__ : unable to register the "out_L" and/or "out_R" * output ports for the JACK client using * _jack_port_register()_ (jack/jack.h). */ int init( unsigned bufferSize ); /** * Starts the JACK transport. * * If the JACK transport was activated in the GUI by clicking * either the "J.TRANS" or "J.MASTER" button, the * _jack_transport_start()_ (jack/transport.h) function will be * called to start the JACK transport. Else, the internal * TransportInfo::m_status will be set to TransportInfo::ROLLING * instead. */ virtual void play(); /** * Stops the JACK transport. * * If the JACK transport was activated in the GUI by clicking * either the "J.TRANS" or "J.MASTER" button, the * _jack_transport_stop()_ (jack/transport.h) function will be * called to stop the JACK transport. Else, the internal * TransportInfo::m_status will be set to TransportInfo::STOPPED * instead. */ virtual void stop(); /** * Re-positions the transport position to @a nFrame. * * If the Preferences::USE_JACK_TRANSPORT mode is chosen in * Preferences::m_bJackTransportMode, the * _jack_transport_locate()_ (jack/transport.h) function will be * used to request the new transport position. If not, @a nFrame * will be assigned to TransportInfo::m_nFrames of the local * instance of the TransportInfo AudioOutput::m_transport. * * The new position takes effect in two process cycles during * which JACK's state will be in JackTransportStarting and the * transport won't be rolling. * * \param nFrame Requested new transport position. */ virtual void locate( unsigned long nFrame ); /** * Updating the local instance of the TransportInfo * AudioOutput::m_transport. * * The function queries the transport position and additional * information from the JACK server, writes them to * #m_JackTransportPos and in #m_JackTransportState, and updates * the information stored in AudioOutput::m_transport in case of a * mismatch. * * If #m_JackTransportState is either _JackTransportStopped_ or * _JackTransportStarting_, transport will be (temporarily) * stopped - TransportInfo::m_status will be set to * TransportInfo::STOPPED. If it's _JackTransportRolling_, * transport will be started - TransportInfo::m_status will be set * to TransportInfo::ROLLING. * * The function will check whether a relocation took place by the * JACK server and (afterwards) whether the current tempo did * change with respect to the last transport cycle. In case of a * relocation, #m_frameOffset will be reset to 0, * TransportInfo::m_nFrames updated to the new value provided by * JACK, and - if Hydrogen is in Song::PATTERN_MODE - the playback * moved to the beginning of the pattern. A change in speed, on * the other hand, depends on the local JACK setup. If there is a * timebase master, which broadcasts tempo information via JACK, * and it's not Hydrogen itself, all customizations in the * Timeline will be disregarded and the tempo of the master will * be used instead. If Hydrogen is the timebase master or there is * none at all, Hydrogen::setTimelineBpm() will be used to keep * the transport tempo aligned the settings in the Timeline. * * If Preferences::USE_JACK_TRANSPORT was not selected in * Preferences::m_bJackTransportMode, the function will return * without performing any action. */ virtual void updateTransportInfo(); /** Set the tempo stored TransportInfo::m_fBPM of the local * instance of the TransportInfo AudioOutput::m_transport. * * Only sets the tempo to @a fBPM if its value is at least * 1. Sometime (especially during the first cycle after locating * with transport stopped) the JACK server sends some artifacts * (6.95334e-310) which should not be assigned. * * \param fBPM new tempo. */ virtual void setBpm( float fBPM ); /** * Calculates the difference between the true transport position * and the internal one. * * The internal transport position used in most parts of Hydrogen * is given in ticks. But since the size of a tick is * tempo-dependent, passing a tempo marker in the Timeline will * cause the corresponding internal transport position in frames * to diverge from the external one by a constant offset. This * function will calculate and store it in #m_frameOffset. * * \param oldFrame Provides the previous transport position in * frames prior to the change in tick size. This is required if * transport is not rolling during the relocation into a region of * different speed since there is no up-to-date JACK query * providing these information. */ void calculateFrameOffset(long long oldFrame); /** * Registers Hydrogen as JACK timebase master. * * If for some reason registering Hydrogen as timebase master does * not work, the function sets Preferences::m_bJackMasterMode to * Preferences::NO_JACK_TIME_MASTER. * * If the function is called with Preferences::m_bJackMasterMode * set to Preferences::NO_JACK_TIME_MASTER, * releaseTimebaseMaster() will be called instead. */ void initTimebaseMaster(); /** * Calls _jack_release_timebase()_ (jack/transport.h) to release * Hydrogen from the JACK timebase master responsibilities. This * causes the JackTimebaseCallback() callback function to not be * called by the JACK server anymore. */ void releaseTimebaseMaster(); /** * \return #m_nIsTimebaseMaster */ int getIsTimebaseMaster() const; /** Stores the latest transport position (for both rolling and * stopped transport). * * In case the user is clicking on the * SongEditor::mousePressEvent() will trigger both a relocation * and a change in speed. The change in speed causes the * audioEngine_checkBPMChange() function to update the ticksize in * case transported got moved into a region of different tempo and * triggers the calculateFrameOffset() function. But the latter * can only work properly if transport is rolling since it has to * know the frame position prior to the change in tick size and * there is no up-to-date JACK query providing this information. */ int m_currentPos; protected: /** * Callback function registered to the JACK server in * initTimebaseMaster() if Hydrogen is set as JACK timebase master. * * It will update the current position not just in frames till * the beginning of the song, but also in terms of beat, bar, * and tick values. * * The function it will be called after the * audioEngine_process() function and only if the * #m_JackTransportState is _JackTransportRolling_. * * \param state Current transport state. Not used within the * function but to ensure compatibility. * \param nFrames Buffer size. Not used within the function but * to ensure compatibility. * \param pJackPosition Current transport position. * \param new_pos Updated transport position in frames. Not * used within the function but to ensure compatibility. * \param arg Pointer to a JackAudioDriver instance. */ static void JackTimebaseCallback( jack_transport_state_t state, jack_nframes_t nFrames, jack_position_t* pJackPosition, int new_pos, void* arg ); #if defined(H2CORE_HAVE_JACKSESSION) || _DOXYGEN_ /** * Function to call by the JACK server when a session event is * to be delivered. * * It is registered to the JACK client in init() using * _jack_set_session_callback()_ (jack/session.h) if * #H2CORE_HAVE_JACKSESSION was defined during compilation. * * Internally it hands the @a event to * jack_session_callback_impl(). * * \param event Jack session event (see jack/session.h) * \param arg Pointer to an instance of the JackAudioDriver. */ static void jack_session_callback( jack_session_event_t* event, void* arg ); void jack_session_callback_impl( jack_session_event_t* event ); #endif private: /** * Constant offset between the internal transport position in * TransportInfo::m_nFrames and the external one. * * Imagine the following setting: During the playback you decide * to change the speed of the song. This would cause a lot of * position information within Hydrogen, which are given in ticks, * to be off since the tick size depends on the speed and just got * changed too. Instead, TransportInfo::m_nFrames will scaled to * reflect the changes and everything will be still in place with * the user to not note a single thing. Unfortunately, now the * transport position in frames of the audio engine and of the * JACK server are off by a constant offset. To nevertheless be * able to identify relocation in updateTransportInfo(), this * constant offset is stored in this variable and used in * updateTransportInfo() to determine whether a relocation did * happen. * * Positive values correspond to a position ahead of the current * transport information. The variable is initialized with 0 in * JackAudioDriver() and updated in calculateFrameOffset(). */ long long m_frameOffset; /** * Function the JACK server will call whenever there is work to * do. * * The audioEngine_process() function will be used and registered * using _jack_set_process_callback()_ (jack/jack.h) in init(). * * The code must be suitable for real-time execution. That means * that it cannot call functions that might block for a long * time. This includes _malloc()_, _free()_, _printf()_, * _pthread_mutex_lock()_, _sleep()_, _wait()_, _poll()_, * _select()_, _pthread_join()_, _pthread_cond_wait()_, etc, etc. */ JackProcessCallback m_processCallback; /** * Left source port for which a connection to #m_sOutputPortName1 * will be established in connect() via the JACK server. */ jack_port_t* m_pOutputPort1; /** * Right source port for which a connection to #m_sOutputPortName2 * will be established in connect() via the JACK server. */ jack_port_t* m_pOutputPort2; /** * Destination of the left source port #m_pOutputPort1, for which * a connection will be established in connect(). It is set to * Preferences::m_sJackPortName1 during the call of init(). */ QString m_sOutputPortName1; /** * Destination of the right source port #m_pOutputPort2, for which * a connection will be established in connect(). It is set to * Preferences::m_sJackPortName2 during the call of init(). */ QString m_sOutputPortName2; /** * Matrix containing the track number of each component of of all * instruments. Its rows represent the instruments and its columns * their components. _m_trackMap[2][1]=6_ thus therefore mean the * output of the second component of the third instrument is * assigned the seventh output port. Since its total size is * defined by #MAX_INSTRUMENTS and #MAX_COMPONENTS, most of its * entries will be zero. * * It gets updated by makeTrackOutputs(). */ int m_trackMap[MAX_INSTRUMENTS][MAX_COMPONENTS]; /** * Total number of output ports currently in use. It gets updated * by makeTrackOutputs(). */ int m_nTrackPortCount; /** * Vector of all left audio output ports currently used by the * local JACK client. * * They will be initialized with all zeros in both * JackAudioDriver(), deactivate(), and connect(). Individual * components will be created, renamed, or reassigned in * setTrackOutput(), deleted in makeTrackOutputs(), and accessed * via getTrackOut_L(). It is set to a length of * #MAX_INSTRUMENTS. */ jack_port_t* m_pTrackOutputPortsL[MAX_INSTRUMENTS]; /** * Vector of all right audio output ports currently used by the * local JACK client. * * They will be initialized with all zeros in both * JackAudioDriver(), deactivate(), and connect(). Individual * components will be created, renamed, or reassigned in * setTrackOutput(), deleted in makeTrackOutputs(), and accessed * via getTrackOut_R(). It is set to a length of * #MAX_INSTRUMENTS. */ jack_port_t* m_pTrackOutputPortsR[MAX_INSTRUMENTS]; /** * Current transport state returned by * _jack_transport_query()_ (jack/transport.h). * * It is valid for the entire cycle and can have five * different values: * - _JackTransportStopped_ = 0 : Transport is halted * - _JackTransportRolling_ = 1 : Transport is playing * - _JackTransportLooping_ = 2 : For OLD_TRANSPORT, now * ignored * - _JackTransportStarting_ = 3 : Waiting for sync ready * - _JackTransportNetStarting_ = 4 : Waiting for sync ready * on the network * * The actual number of states depends on your JACK * version. The listing above was done for version 1.9.12. */ jack_transport_state_t m_JackTransportState; /** * Current transport position obtained using * _jack_transport_query()_ (jack/transport.h). * * It corresponds to the first frame of the current cycle. If it * is NULL, _jack_transport_query()_ won't return any position * information. * * The __valid__ member of #m_JackTransportPos will show which * fields contain valid data. Thus, if it is set to * _JackPositionBBT_, bar, beat, and tick information are * provided by the current timebase master in addition to the * transport information in frames. It is of class * _jack_position_bits_t_ (jack/types.h) and is an enumerator * with five different options: * - _JackPositionBBT_ = 0x10 : Bar, Beat, Tick * - _JackPositionTimecode_ = 0x20 : External timecode * - _JackBBTFrameOffset_ = 0x40 : Frame offset of BBT * information * - _JackAudioVideoRatio_ = 0x80 : audio frames per video * frame * - _JackVideoFrameOffset_ = 0x100 : frame offset of first * video frame * * The __frame__ member contains the current transport * position. * * It is set in updateTransportInfo(). Please see the * documentation of JackTimebaseCallback() for more information * about its different members. */ jack_position_t m_JackTransportPos; /** * Specifies whether the default left and right (master) audio * JACK ports will be automatically connected to the system's sink * when registering the JACK client in connect(). * * After the JackAudioDriver has been created by createDriver(), * the variable will be, again, set to * Preferences::m_bJackConnectDefaults. */ bool m_bConnectDefaults; /** * Whether Hydrogen or another program is Jack timebase master. * * - #m_nIsTimebaseMaster > 0 - Hydrogen itself is timebase master. * - #m_nIsTimebaseMaster == 0 - an external program is timebase master and Hydrogen will disregard all tempo marker on the Timeline and, instead, only use the BPM provided by JACK. * - #m_nIsTimebaseMaster < 0 - only normal clients registered. * * While Hydrogen can unregister as timebase master on its own, it * can not be observed directly whether another application has * taken over as timebase master. When the JACK server is * releasing Hydrogen in the later case, it won't advertise this * fact but simply won't call the JackTimebaseCallback() * anymore. But since this will be called in every cycle after * updateTransportInfo(), we can use this variable to determine if * Hydrogen is still timebase master. * * As Hydrogen registered as timebase master using * initTimebaseMaster() it will be initialized with 1, decremented * in updateTransportInfo(), and reset to 1 in * JackTimebaseCallback(). Whenever it is zero in * updateTransportInfo(), #m_nIsTimebaseMaster will be updated * accordingly. */ int m_nIsTimebaseMaster; }; inline int JackAudioDriver::getIsTimebaseMaster() const { return m_nIsTimebaseMaster; } inline int JackAudioDriver::getNumTracks() { return m_nTrackPortCount; } }; // H2Core namespace #else // H2CORE_HAVE_JACK // JACK is disabled namespace H2Core { class JackAudioDriver : public NullDriver { H2_OBJECT public: /** * Fallback version of the JackAudioDriver in case * #H2CORE_HAVE_JACK was not defined during the configuration * and the usage of the JACK audio server is not intended by * the user. */ JackAudioDriver( audioProcessCallback m_processCallback ) : NullDriver( m_processCallback ) {} }; }; // H2Core namespace #endif // H2CORE_HAVE_JACK #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/LashClient.h000066400000000000000000000043611366722712400232100ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/config.h" #if defined(H2CORE_HAVE_LASH) || _DOXYGEN_ #ifndef LASH_CLIENT #define LASH_CLIENT #include #include #include class LashClient { public: static LashClient* get_instance() { assert(__instance); return __instance;} static void create_instance( const char *lashClass, const char *viewName, int *argc, char ***argv ); LashClient(const char* lashClass, const char* viewName, int* argc, char ***argv); ~LashClient(); bool isConnected(); void sendEvent(LASH_Event_Type eventType, const char* value); void sendEvent(LASH_Event_Type eventType); /** * Set the name of the JACK client by modifying * #jackClientName. * * Called in H2Core::JackAudioDriver::init() after * successfully opening a client session. */ void setJackClientName( const std::string& jackClientName ); void sendJackClientName(); void setAlsaClientId(unsigned char id); void sendAlsaClientId(); lash_event_t* getNextEvent(); lash_client_t* getConnection(); void setNewProject(bool value); bool isNewProject(); private: bool newProject; lash_client_t* lashClient; /** * Name of the external JACK client Hydrogen is using to * communicate with the JACK server. It can be modified via * setJackClientName(). */ std::string jackClientName; unsigned char alsaClientId; static LashClient* __instance; }; #endif // LASH_CLIENT #endif // H2CORE_HAVE_LASH hydrogen-1.0.0-rc1/src/core/include/hydrogen/LocalFileMng.h000066400000000000000000000052401366722712400234530ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LFILEMNG_H #define LFILEMNG_H #include #include #include #include #include #include namespace H2Core { class Note; class Instrument; class InstrumentList; class Sequence; class Pattern; class Song; class Drumkit; /** * */ class LocalFileMng : public H2Core::Object { H2_OBJECT public: LocalFileMng(); ~LocalFileMng(); QString getDrumkitNameForPattern( const QString& patternDir ); static void writeXmlString( QDomNode parent, const QString& name, const QString& text ); static void writeXmlBool( QDomNode parent, const QString& name, bool value ); static QString readXmlString( QDomNode , const QString& nodeName, const QString& defaultValue, bool bCanBeEmpty = false, bool bShouldExists = true , bool tinyXmlCompatMode = false); static float readXmlFloat( QDomNode , const QString& nodeName, float defaultValue, bool bCanBeEmpty = false, bool bShouldExists = true , bool tinyXmlCompatMode = false); static int readXmlInt( QDomNode , const QString& nodeName, int defaultValue, bool bCanBeEmpty = false, bool bShouldExists = true , bool tinyXmlCompatMode = false); static bool readXmlBool( QDomNode , const QString& nodeName, bool defaultValue, bool bShouldExists = true , bool tinyXmlCompatMode = false ); static void convertFromTinyXMLString( QByteArray* str ); static bool checkTinyXMLCompatMode( const QString& filename ); static QDomDocument openXmlDocument( const QString& filename ); private: static QString processNode( QDomNode node, const QString& nodeName, bool bCanBeEmpty, bool bShouldExists ); }; /** * Write XML file of a song */ class SongWriter : public H2Core::Object { H2_OBJECT public: SongWriter(); ~SongWriter(); // Returns 0 on success. int writeSong( Song *song, const QString& filename ); }; }; #endif //LFILEMNG_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/Preferences.h000066400000000000000000000766601366722712400234360ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PREFERENCES_H #define PREFERENCES_H #include #include #include #include #include #include #include #include namespace H2Core { const float FALLOFF_SLOW = 1.08f; const float FALLOFF_NORMAL= 1.1f; const float FALLOFF_FAST = 1.5f; /** \ingroup H2CORE */ class WindowProperties : public H2Core::Object { H2_OBJECT public: int x; int y; int width; int height; bool visible; WindowProperties(); ~WindowProperties(); void set(int _x, int _y, int _width, int _height, bool _visible) { x = _x; y = _y; width = _width; height = _height; visible = _visible; } }; /** \ingroup H2CORE */ class H2RGBColor : public H2Core::Object { H2_OBJECT public: H2RGBColor( int r = -1, int g = -1, int b = -1 ); H2RGBColor( const QString& sColor ); ~H2RGBColor(); QString toStringFmt(); int getRed() const { return m_red; } int getGreen() const { return m_green; } int getBlue() const { return m_blue; } private: int m_red; int m_green; int m_blue; }; /** \ingroup H2CORE \brief Colors for hydrogen */ class UIStyle : public H2Core::Object { H2_OBJECT public: UIStyle(); H2RGBColor m_songEditor_backgroundColor; H2RGBColor m_songEditor_alternateRowColor; H2RGBColor m_songEditor_selectedRowColor; H2RGBColor m_songEditor_lineColor; H2RGBColor m_songEditor_textColor; H2RGBColor m_songEditor_pattern1Color; H2RGBColor m_patternEditor_backgroundColor; H2RGBColor m_patternEditor_alternateRowColor; H2RGBColor m_patternEditor_selectedRowColor; H2RGBColor m_patternEditor_textColor; H2RGBColor m_patternEditor_noteColor; H2RGBColor m_patternEditor_noteoffColor; H2RGBColor m_patternEditor_lineColor; H2RGBColor m_patternEditor_line1Color; H2RGBColor m_patternEditor_line2Color; H2RGBColor m_patternEditor_line3Color; H2RGBColor m_patternEditor_line4Color; H2RGBColor m_patternEditor_line5Color; }; /** \ingroup H2CORE \brief Manager for User Preferences File (singleton) */ class Preferences : public H2Core::Object { H2_OBJECT public: enum { /** * Specifies whether or not to use JACK transport * capabilities. If set, Hydrogen will start playing as * soon as any over JACK client using its transport * system is starting to play. Its counterpart is * #NO_JACK_TRANSPORT. */ USE_JACK_TRANSPORT = 0, /** * Specifies that Hydrogen is using in the time master * mode and will thus control specific aspects of the * transport like the overall tempo. Its counterpart is * #NO_JACK_TIME_MASTER. */ USE_JACK_TIME_MASTER = 0, POST_FADER = 0, SET_PLAY_ON = 0, BC_ON = 0,/** * Specifies whether or not to use JACK transport * capabilities. If set, Hydrogen can be used * independent of the JACK system while still using the * JackAudioDriver. Its counterpart is * #USE_JACK_TRANSPORT. */ NO_JACK_TRANSPORT = 1, /** * Specifies that Hydrogen is note using in the time * master mode. Its counterpart is * #USE_JACK_TIME_MASTER. */ NO_JACK_TIME_MASTER = 1, PRE_FADER = 1, SET_PLAY_OFF = 1, BC_OFF = 1 }; enum UI_LAYOUT_TYPES { UI_LAYOUT_SINGLE_PANE, UI_LAYOUT_TABBED }; QString __lastspatternDirectory; QString __lastsampleDirectory; // audio file browser bool __playsamplesonclicking; // audio file browser bool __playselectedinstrument; // midi keys and keys play instrument or drumset int m_nRecPreDelete; //index of record note pre delete function 0 = off int m_nRecPostDelete; bool m_bFollowPlayhead; // switch to enable / disable lash, only on h2 startup bool m_brestartLash; bool m_bsetLash; //soundlibrarypanel expand song and pattern item bool __expandSongItem; bool __expandPatternItem; //beatcounter bool m_bbc; bool m_mmcsetplay; int m_countOffset; int m_startOffset; //~ beatcounter std::list sServerList; std::list m_patternCategories; // audio engine properties ___ /** * Audio driver * * Used in the audioEngine_startAudioDrivers() to create an * audio driver using createDriver(). * * These choices are support: * - "Auto" : audioEngine_startAudioDrivers() will try * different drivers itself. * - "Jack" : createDriver() will create a JackAudioDriver. * - "Alsa" : createDriver() will create a AlsaAudioDriver. * - "CoreAudio" : createDriver() will create a CoreAudioDriver. * - "PortAudio" : createDriver() will create a PortAudioDriver. * - "Oss" : createDriver() will create a OssDriver. * - "PulseAudio" : createDriver() will create a PulseAudioDriver. * - "Fake" : createDriver() will create a FakeDriver. */ QString m_sAudioDriver; /** If set to true, samples of the metronome will be added to * #m_songNoteQueue in audioEngine_updateNoteQueue() and thus * played back on a regular basis.*/ bool m_bUseMetronome; /// Metronome volume FIXME: remove this volume!! float m_fMetronomeVolume; /// max notes unsigned m_nMaxNotes; /** * Buffer size of the audio. * * It is set e.g. by JackAudioDriver::init() to the buffer * size of the freshly opened JACK client. */ unsigned m_nBufferSize; /** * Sample rate of the audio. * * It is set e.g. by JackAudioDriver::init() to the sample * rate of the freshly opened JACK client. */ unsigned m_nSampleRate; // OSS driver properties ___ QString m_sOSSDevice; ///< Device used for output // MIDI Driver properties /** * MIDI driver * * Used in the audioEngine_startAudioDrivers() to create an * MIDI driver. * * These choices are support: * - "JackMidi" : A JackMidiDriver will be called. * - "ALSA" : An AlsaMidiDriver will be called. * - "CoreMidi" : A CoreMidiDriver will be called. * - "PortMidi" : A PortMidiDriver will be called. */ QString m_sMidiDriver; QString m_sMidiPortName; QString m_sMidiOutputPortName; int m_nMidiChannelFilter; bool m_bMidiNoteOffIgnore; bool m_bMidiFixedMapping; bool m_bMidiDiscardNoteAfterAction; bool m_bEnableMidiFeedback; // OSC Server properties /** * Whether to start the OscServer thread. * * If set to true, the OscServer::start() function of the * OscServer singleton will be called in * Hydrogen::Hydrogen(). This will register all OSC message * handlers and makes the server listen to port * #m_nOscServerPort. * * Set by setOscServerEnabled() and queried by * getOscServerEnabled(). */ bool m_bOscServerEnabled; /** * Whether to send the current state of Hydrogen to the OSC * clients. * * If set to true, the current state of Hydrogen will be sent to * \e all known OSC clients using * CoreActionController::initExternalControlInterfaces() and * OscServer::handleAction() via OSC messages each time it gets * updated.. * Set by setOscFeedbackEnabled() and queried by * getOscFeedbackEnabled(). */ bool m_bOscFeedbackEnabled; /** * Port number the OscServer will be started at. * Set by setOscServerPort() and queried by * getOscServerPort(). */ int m_nOscServerPort; // alsa audio driver properties ___ QString m_sAlsaAudioDevice; // jack driver properties ___ QString m_sJackPortName1; QString m_sJackPortName2; /** * Specifies whether or not Hydrogen will use the JACK * transport system. It has two different states: * #USE_JACK_TRANSPORT and #NO_JACK_TRANSPORT. */ int m_bJackTransportMode; bool m_bJackConnectDefaults; /** * If set to _true_, JackAudioDriver::makeTrackOutputs() will * create two individual left and right output ports for every * component of each instrument. If _false_, one usual stereo * output will be created. */ bool m_bJackTrackOuts; int m_nJackTrackOutputMode; //jack time master /** * Specifies if Hydrogen should run as JACK time master. It * has two states: Preferences::USE_JACK_TIME_MASTER and * Preferences::NO_JACK_TIME_MASTER. It is set to * Preferences::NO_JACK_TIME_MASTER by the * JackAudioDriver::initTimebaseMaster() if Hydrogen couldn't be * registered as time master. */ int m_bJackMasterMode; //~ jack driver properties ///Default text editor (used by Playlisteditor) QString m_sDefaultEditor; ///Rubberband CLI QString m_rubberBandCLIexecutable; /** * If #__instance equals 0, a new Preferences singleton will * be created and stored in it. * * It is called in Hydrogen::create_instance(). */ static void create_instance(); /** * Returns a pointer to the current Preferences singleton * stored in #__instance. */ static Preferences* get_instance(){ assert(__instance); return __instance; } ~Preferences(); /// Load the preferences file void loadPreferences( bool bGlobal ); /// Save the preferences file void savePreferences(); const QString& getDataDirectory(); const QString& getDefaultEditor(); void setDefaultEditor( QString editor); int getDefaultUILayout(); void setDefaultUILayout( int layout); // General void setRestoreLastSongEnabled( bool restore ); void setRestoreLastPlaylistEnabled( bool restore ); void setUseRelativeFilenamesForPlaylists( bool value ); void setShowDevelWarning( bool value ); bool getShowDevelWarning(); bool isRestoreLastSongEnabled(); bool isRestoreLastPlaylistEnabled(); bool isPlaylistUsingRelativeFilenames(); void setLastSongFilename( const QString& filename ); const QString& getLastSongFilename(); void setLastPlaylistFilename( const QString& filename ); const QString& getLastPlaylistFilename(); void setHearNewNotes( bool value ); bool getHearNewNotes(); void setRecordEvents( bool value ); bool getRecordEvents(); void setDestructiveRecord ( bool value ); bool getDestructiveRecord(); void setPunchInPos ( unsigned pos ); int getPunchInPos(); void setPunchOutPos ( unsigned pos ); int getPunchOutPos(); bool inPunchArea (int pos); void unsetPunchArea (); void setQuantizeEvents( bool value ); bool getQuantizeEvents(); std::vector getRecentFiles(); void setRecentFiles( std::vector recentFiles ); QStringList getRecentFX(); void setMostRecentFX( QString ); // GUI Properties const QString& getQTStyle(); void setQTStyle( const QString& sStyle ); const QString& getApplicationFontFamily(); void setApplicationFontFamily( const QString& family ); int getApplicationFontPointSize(); void setApplicationFontPointSize( int size ); QString getMixerFontFamily(); void setMixerFontFamily( const QString& family ); int getMixerFontPointSize(); void setMixerFontPointSize( int size ); float getMixerFalloffSpeed(); void setMixerFalloffSpeed( float value ); bool showInstrumentPeaks(); void setInstrumentPeaks( bool value ); int getPatternEditorGridResolution(); void setPatternEditorGridResolution( int value ); bool isPatternEditorUsingTriplets(); void setPatternEditorUsingTriplets( bool value ); bool isFXTabVisible(); void setFXTabVisible( bool value ); bool getShowAutomationArea(); void setShowAutomationArea( bool value ); unsigned getPatternEditorGridHeight(); void setPatternEditorGridHeight( unsigned value ); unsigned getPatternEditorGridWidth(); void setPatternEditorGridWidth( unsigned value ); void setColoringMethodAuxValue( int value ); int getColoringMethodAuxValue() const; void setColoringMethod( int value ); int getColoringMethod() const; WindowProperties getMainFormProperties(); void setMainFormProperties( const WindowProperties& prop ); WindowProperties getMixerProperties(); void setMixerProperties( const WindowProperties& prop ); WindowProperties getPatternEditorProperties(); void setPatternEditorProperties( const WindowProperties& prop ); WindowProperties getSongEditorProperties(); void setSongEditorProperties( const WindowProperties& prop ); WindowProperties getAudioEngineInfoProperties(); void setAudioEngineInfoProperties( const WindowProperties& prop ); WindowProperties getLadspaProperties( unsigned nFX ); void setLadspaProperties( unsigned nFX, const WindowProperties& prop ); UIStyle* getDefaultUIStyle(); /** \return #m_bPatternModePlaysSelected*/ bool patternModePlaysSelected(); /** \param b Sets #m_bPatternModePlaysSelected*/ void setPatternModePlaysSelected( bool b ); bool useLash(); void setUseLash( bool b ); /** @param bars Sets #m_nMaxBars.*/ void setMaxBars( const int bars ); /** @return #m_nMaxBars.*/ int getMaxBars() const; /** @param layers Sets #m_nMaxLayers.*/ void setMaxLayers( const int layers ); /** @return #m_nMaxLayers.*/ int getMaxLayers() const; void setWaitForSessionHandler(bool value); bool getWaitForSessionHandler(); #if defined(H2CORE_HAVE_JACKSESSION) || _DOXYGEN_ QString getJackSessionUUID(); void setJackSessionUUID( QString uuid ); QString getJackSessionApplicationPath(); void setJackSessionApplicationPath( QString path ); #endif #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ void setNsmClientId(const QString& nsmClientId); QString getNsmClientId(void); void setNsmSongName(const QString& nsmSongName); QString getNsmSongName(void); #endif /** \return #m_bOscServerEnabled*/ bool getOscServerEnabled(); /** \param val Sets #m_bOscServerEnabled*/ void setOscServerEnabled( bool val ); /** \return #m_bOscFeedbackEnabled*/ bool getOscFeedbackEnabled(); /** \param val Sets #m_bOscFeedbackEnabled*/ void setOscFeedbackEnabled( bool val ); /** \return #m_nOscServerPort*/ int getOscServerPort(); /** \param oscPort Sets #m_nOscServerPort*/ void setOscServerPort( int oscPort ); /** Whether to use the bpm of the timeline. * \return #__useTimelineBpm */ bool getUseTimelineBpm(); /** Setting #__useTimelineBpm. * \param val New choice. */ void setUseTimelineBpm( bool val ); void setShowPlaybackTrack( bool val); bool getShowPlaybackTrack() const; int getRubberBandCalcTime(); void setRubberBandCalcTime( int val ); int getRubberBandBatchMode(); void setRubberBandBatchMode( int val ); int getLastOpenTab(); void setLastOpenTab(int n); void setH2ProcessName(const QString& processName); QString getH2ProcessName(); int getExportSampleDepthIdx() const; void setExportSampleDepthIdx( int nExportSampleDepthIdx ); int getExportSampleRateIdx() const; void setExportSampleRateIdx( int nExportSampleRateIdx ); int getExportModeIdx() const; void setExportModeIdx(int nExportMode); QString getExportDirectory() const; void setExportDirectory( const QString &sExportDirectory ); int getExportTemplateIdx() const; void setExportTemplateIdx( int nExportTemplateIdx ); int getMidiExportMode() const; void setMidiExportMode(int nExportMode); QString getMidiExportDirectory() const; void setMidiExportDirectory( const QString &sExportDirectory ); private: /** * Object holding the current Preferences singleton. It is * initialized with NULL, set with create_instance(), and * accessed with get_instance(). */ static Preferences * __instance; //___ General properties ___ QString m_sH2ProcessName; //Name of hydrogen's main process int __rubberBandCalcTime; ///rubberband bpm change queue bool m_useTheRubberbandBpmChangeEvent; /** * When transport is in Song::PATTERN_MODE and this variable is * set to true, the currently focused Pattern will be used for * playback. * * It is set by setPatternModePlaysSelected() and queried by * patternModePlaysSelected(). */ bool m_bPatternModePlaysSelected; ///< Restore last song? bool m_brestoreLastSong; bool m_brestoreLastPlaylist; bool m_bUseLash; ///< Show development version warning? bool m_bShowDevelWarning; ///< Last song used QString m_lastSongFilename; QString m_lastPlaylistFilename; bool quantizeEvents; bool recordEvents; bool destructiveRecord; bool readPrefFileforotherplaces; int punchInPos; int punchOutPos; /** Maximum number of bars shown in the Song Editor at * once. * * It is set by setMaxBars() and queried by * getMaxBars(). In order to change this value, you have to * manually edit the \ tag in the configuration file * of Hydrogen in your home folder. Default value assigned in * constructor: 400.*/ int m_nMaxBars; /** Maximum number of layers to be used in the Instrument * editor. * * It is set by setMaxLayers() and queried by * getMaxLayers(). It is setIn order to change this value, you * have to manually edit the \ tag in the * configuration file of Hydrogen in your home folder. Default * value assigned in constructor: 16. */ int m_nMaxLayers; bool hearNewNotes; QStringList m_recentFX; std::vector m_recentFiles; #if defined(H2CORE_HAVE_JACKSESSION) || _DOXYGEN_ QString jackSessionUUID; QString jackSessionApplicationPath; #endif #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ QString m_sNsmClientId; QString m_sNsmSongName; #endif bool waitingForSessionHandler; /** * Whether to use local speeds specified along the Timeline or * a constant tempo for the whole Song in * Hydrogen::getTimelineBpm() and Hydrogen::getTimelineBpm(). * * It is set using setUseTimelineBpm() and accessed via * getUseTimelineBpm(). */ bool __useTimelineBpm; //___ GUI properties ___ QString m_sQTStyle; int m_nLastOpenTab; int m_nDefaultUILayout; bool m_bShowPlaybackTrack; QString applicationFontFamily; int applicationFontPointSize; QString mixerFontFamily; int mixerFontPointSize; float mixerFalloffSpeed; int m_nPatternEditorGridResolution; bool m_bPatternEditorUsingTriplets; bool m_bShowInstrumentPeaks; bool m_bIsFXTabVisible; bool m_bShowAutomationArea; bool m_bUseRelativeFilenamesForPlaylists; unsigned m_nPatternEditorGridHeight; unsigned m_nPatternEditorGridWidth; WindowProperties mainFormProperties; WindowProperties mixerProperties; WindowProperties patternEditorProperties; WindowProperties songEditorProperties; WindowProperties drumkitManagerProperties; WindowProperties audioEngineInfoProperties; WindowProperties m_ladspaProperties[MAX_FX]; UIStyle* m_pDefaultUIStyle; //Appearance: SongEditor coloring int m_nColoringMethod; int m_nColoringMethodAuxValue; //Export dialog QString m_sExportDirectory; int m_nExportModeIdx; int m_nExportSampleRateIdx; int m_nExportSampleDepthIdx; int m_nExportTemplateIdx; //~ Export dialog // Export midi dialog QString m_sMidiExportDirectory; int m_nMidiExportMode; //~ Export midi dialog Preferences(); WindowProperties readWindowProperties( QDomNode parent, const QString& windowName, WindowProperties defaultProp ); void writeWindowProperties( QDomNode parent, const QString& windowName, const WindowProperties& prop ); void writeUIStyle( QDomNode parent ); void readUIStyle( QDomNode parent ); }; inline QString Preferences::getMidiExportDirectory() const { return m_sMidiExportDirectory; } inline void Preferences::setMidiExportDirectory(const QString &ExportDirectory) { m_sMidiExportDirectory = ExportDirectory; } inline int Preferences::getMidiExportMode() const { return m_nMidiExportMode; } inline void Preferences::setMidiExportMode(int ExportMode) { m_nMidiExportMode = ExportMode; } inline int Preferences::getExportSampleDepthIdx() const { return m_nExportSampleDepthIdx; } inline void Preferences::setExportSampleDepthIdx(int ExportSampleDepth) { m_nExportSampleDepthIdx = ExportSampleDepth; } inline int Preferences::getExportSampleRateIdx() const { return m_nExportSampleRateIdx; } inline int Preferences::getExportModeIdx() const { return m_nExportModeIdx; } inline void Preferences::setExportModeIdx(int ExportModeIdx) { m_nExportModeIdx = ExportModeIdx; } inline QString Preferences::getExportDirectory() const { return m_sExportDirectory; } inline void Preferences::setExportDirectory(const QString &ExportDirectory) { m_sExportDirectory = ExportDirectory; } inline void Preferences::setExportSampleRateIdx(int ExportSampleRate) { m_nExportSampleRateIdx = ExportSampleRate; } inline int Preferences::getExportTemplateIdx() const { return m_nExportTemplateIdx; } inline void Preferences::setExportTemplateIdx(int ExportTemplateIdx) { m_nExportTemplateIdx = ExportTemplateIdx; } inline const QString& Preferences::getDefaultEditor() { return m_sDefaultEditor; } inline void Preferences::setDefaultEditor( QString editor){ m_sDefaultEditor = editor; } inline int Preferences::getDefaultUILayout(){ return m_nDefaultUILayout; } inline void Preferences::setDefaultUILayout( int layout){ m_nDefaultUILayout = layout; } // General inline void Preferences::setRestoreLastSongEnabled( bool restore ) { m_brestoreLastSong = restore; } inline void Preferences::setRestoreLastPlaylistEnabled( bool restore ) { m_brestoreLastPlaylist = restore; } inline void Preferences::setUseRelativeFilenamesForPlaylists( bool value ) { m_bUseRelativeFilenamesForPlaylists= value; } inline void Preferences::setShowDevelWarning( bool value ) { m_bShowDevelWarning = value; } inline bool Preferences::getShowDevelWarning() { return m_bShowDevelWarning; } inline bool Preferences::isRestoreLastSongEnabled() { return m_brestoreLastSong; } inline bool Preferences::isRestoreLastPlaylistEnabled() { return m_brestoreLastPlaylist; } inline bool Preferences::isPlaylistUsingRelativeFilenames() { return m_bUseRelativeFilenamesForPlaylists; } inline void Preferences::setLastSongFilename( const QString& filename ) { m_lastSongFilename = filename; } inline const QString& Preferences::getLastSongFilename() { return m_lastSongFilename; } inline void Preferences::setLastPlaylistFilename( const QString& filename ) { m_lastPlaylistFilename = filename; } inline const QString& Preferences::getLastPlaylistFilename() { return m_lastPlaylistFilename; } inline void Preferences::setHearNewNotes( bool value ) { hearNewNotes = value; } inline bool Preferences::getHearNewNotes() { return hearNewNotes; } inline void Preferences::setRecordEvents( bool value ) { recordEvents = value; } inline bool Preferences::getRecordEvents() { return recordEvents; } inline void Preferences::setDestructiveRecord ( bool value ) { destructiveRecord = value; } inline bool Preferences::getDestructiveRecord() { return destructiveRecord; } inline void Preferences::setPunchInPos ( unsigned pos ) { punchInPos = pos; } inline int Preferences::getPunchInPos() { return punchInPos; } inline void Preferences::setPunchOutPos ( unsigned pos ) { punchOutPos = pos; } inline int Preferences::getPunchOutPos() { return punchOutPos; } inline bool Preferences::inPunchArea (int pos) { // Return true if punch area not defined if ( punchInPos <= punchOutPos ) { if ( pos < punchInPos || punchOutPos < pos ) { return false; } } return true; } inline void Preferences::unsetPunchArea () { punchInPos = 0; punchOutPos = -1; } inline void Preferences::setQuantizeEvents( bool value ) { quantizeEvents = value; } inline bool Preferences::getQuantizeEvents() { return quantizeEvents; } inline std::vector Preferences::getRecentFiles() { return m_recentFiles; } inline QStringList Preferences::getRecentFX() { return m_recentFX; } // GUI Properties inline const QString& Preferences::getQTStyle() { return m_sQTStyle; } inline void Preferences::setQTStyle( const QString& sStyle ) { m_sQTStyle = sStyle; } inline const QString& Preferences::getApplicationFontFamily() { return applicationFontFamily; } inline void Preferences::setApplicationFontFamily( const QString& family ) { applicationFontFamily = family; } inline int Preferences::getApplicationFontPointSize() { return applicationFontPointSize; } inline void Preferences::setApplicationFontPointSize( int size ) { applicationFontPointSize = size; } inline QString Preferences::getMixerFontFamily() { return mixerFontFamily; } inline void Preferences::setMixerFontFamily( const QString& family ) { mixerFontFamily = family; } inline int Preferences::getMixerFontPointSize() { return mixerFontPointSize; } inline void Preferences::setMixerFontPointSize( int size ) { mixerFontPointSize = size; } inline float Preferences::getMixerFalloffSpeed() { return mixerFalloffSpeed; } inline void Preferences::setMixerFalloffSpeed( float value ) { mixerFalloffSpeed = value; } inline bool Preferences::showInstrumentPeaks() { return m_bShowInstrumentPeaks; } inline void Preferences::setInstrumentPeaks( bool value ) { m_bShowInstrumentPeaks = value; } inline int Preferences::getPatternEditorGridResolution() { return m_nPatternEditorGridResolution; } inline void Preferences::setPatternEditorGridResolution( int value ) { m_nPatternEditorGridResolution = value; } inline bool Preferences::isPatternEditorUsingTriplets() { return m_bPatternEditorUsingTriplets; } inline void Preferences::setPatternEditorUsingTriplets( bool value ) { m_bPatternEditorUsingTriplets = value; } inline bool Preferences::isFXTabVisible() { return m_bIsFXTabVisible; } inline void Preferences::setFXTabVisible( bool value ) { m_bIsFXTabVisible = value; } inline bool Preferences::getShowAutomationArea() { return m_bShowAutomationArea; } inline void Preferences::setShowAutomationArea( bool value ) { m_bShowAutomationArea = value; } inline unsigned Preferences::getPatternEditorGridHeight() { return m_nPatternEditorGridHeight; } inline void Preferences::setPatternEditorGridHeight( unsigned value ) { m_nPatternEditorGridHeight = value; } inline unsigned Preferences::getPatternEditorGridWidth() { return m_nPatternEditorGridWidth; } inline void Preferences::setPatternEditorGridWidth( unsigned value ) { m_nPatternEditorGridWidth = value; } inline void Preferences::setColoringMethodAuxValue( int value ){ m_nColoringMethodAuxValue = value; } inline int Preferences::getColoringMethodAuxValue() const{ return m_nColoringMethodAuxValue; } inline void Preferences::setColoringMethod( int value ){ m_nColoringMethod = value; } inline int Preferences::getColoringMethod() const{ return m_nColoringMethod; } inline WindowProperties Preferences::getMainFormProperties() { return mainFormProperties; } inline void Preferences::setMainFormProperties( const WindowProperties& prop ) { mainFormProperties = prop; } inline WindowProperties Preferences::getMixerProperties() { return mixerProperties; } inline void Preferences::setMixerProperties( const WindowProperties& prop ) { mixerProperties = prop; } inline WindowProperties Preferences::getPatternEditorProperties() { return patternEditorProperties; } inline void Preferences::setPatternEditorProperties( const WindowProperties& prop ) { patternEditorProperties = prop; } inline WindowProperties Preferences::getSongEditorProperties() { return songEditorProperties; } inline void Preferences::setSongEditorProperties( const WindowProperties& prop ) { songEditorProperties = prop; } inline WindowProperties Preferences::getAudioEngineInfoProperties() { return audioEngineInfoProperties; } inline void Preferences::setAudioEngineInfoProperties( const WindowProperties& prop ) { audioEngineInfoProperties = prop; } inline WindowProperties Preferences::getLadspaProperties( unsigned nFX ) { return m_ladspaProperties[nFX]; } inline void Preferences::setLadspaProperties( unsigned nFX, const WindowProperties& prop ) { m_ladspaProperties[nFX] = prop; } inline UIStyle* Preferences::getDefaultUIStyle() { return m_pDefaultUIStyle; } inline bool Preferences::patternModePlaysSelected() { return m_bPatternModePlaysSelected; } inline void Preferences::setPatternModePlaysSelected( bool b ) { m_bPatternModePlaysSelected = b; } inline bool Preferences::useLash(){ return m_bUseLash; } inline void Preferences::setUseLash( bool b ){ m_bUseLash = b; } inline void Preferences::setMaxBars( const int bars ){ m_nMaxBars = bars; } inline int Preferences::getMaxBars() const { return m_nMaxBars; } inline void Preferences::setMaxLayers( const int layers ){ m_nMaxLayers = layers; } inline int Preferences::getMaxLayers() const { return m_nMaxLayers; } inline void Preferences::setWaitForSessionHandler(bool value){ waitingForSessionHandler = value; } inline bool Preferences::getWaitForSessionHandler(){ return waitingForSessionHandler; } #if defined(H2CORE_HAVE_JACKSESSION) || _DOXYGEN_ inline QString Preferences::getJackSessionUUID(){ return jackSessionUUID; } inline void Preferences::setJackSessionUUID( QString uuid ){ jackSessionUUID = uuid; } inline QString Preferences::getJackSessionApplicationPath(){ return jackSessionApplicationPath; } inline void Preferences::setJackSessionApplicationPath( QString path ){ jackSessionApplicationPath = path; } #endif #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ inline void Preferences::setNsmClientId(const QString& nsmClientId){ m_sNsmClientId = nsmClientId; } inline QString Preferences::getNsmClientId(void){ return m_sNsmClientId; } inline void Preferences::setNsmSongName(const QString& nsmSongName){ m_sNsmSongName = nsmSongName; } inline QString Preferences::getNsmSongName(void){ return m_sNsmSongName; } #endif inline bool Preferences::getOscServerEnabled(){ return m_bOscServerEnabled; } inline void Preferences::setOscServerEnabled( bool val ){ m_bOscServerEnabled = val; } inline bool Preferences::getOscFeedbackEnabled(){ return m_bOscFeedbackEnabled; } inline void Preferences::setOscFeedbackEnabled( bool val ){ m_bOscFeedbackEnabled = val; } inline int Preferences::getOscServerPort(){ return m_nOscServerPort; } inline void Preferences::setOscServerPort( int oscPort ){ m_nOscServerPort = oscPort; } inline bool Preferences::getUseTimelineBpm(){ return __useTimelineBpm; } inline void Preferences::setUseTimelineBpm( bool val ){ __useTimelineBpm = val; } inline void Preferences::setShowPlaybackTrack( bool val ) { m_bShowPlaybackTrack = val; } inline bool Preferences::getShowPlaybackTrack() const { return m_bShowPlaybackTrack; } inline int Preferences::getRubberBandCalcTime(){ return __rubberBandCalcTime; } inline void Preferences::setRubberBandCalcTime( int val ){ __rubberBandCalcTime = val; } inline int Preferences::getRubberBandBatchMode(){ return m_useTheRubberbandBpmChangeEvent; } inline void Preferences::setRubberBandBatchMode( int val ){ m_useTheRubberbandBpmChangeEvent = val; } inline int Preferences::getLastOpenTab(){ return m_nLastOpenTab; } inline void Preferences::setLastOpenTab(int n){ m_nLastOpenTab = n; } inline void Preferences::setH2ProcessName(const QString& processName){ m_sH2ProcessName = processName; } inline QString Preferences::getH2ProcessName() { return m_sH2ProcessName; } }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/audio_engine.h000066400000000000000000000150271366722712400236110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AUDIO_ENGINE_H #define AUDIO_ENGINE_H #include "hydrogen/config.h" #include #include #include #include #include #include /** \def RIGHT_HERE * Macro intended to be used for the logging of the locking of the * H2Core::AudioEngine. But this feature is not implemented yet. * * It combines two standard macros of the C language \_\_FILE\_\_ and * \_\_LINE\_\_ and one macro introduced by the GCC compiler called * \_\_PRETTY_FUNCTION\_\_. */ #ifndef RIGHT_HERE #define RIGHT_HERE __FILE__, __LINE__, __PRETTY_FUNCTION__ #endif namespace H2Core { /** * Audio Engine main class (Singleton). * * It serves as a container for the Sampler and Synth stored in the * #__sampler and #__synth member objects and provides a mutex * #__engine_mutex enabling the user to synchronize the access of the * Song object and the AudioEngine itself. lock() and try_lock() can * be called by a thread to lock the engine and unlock() to make it * accessible for other threads once again. */ class AudioEngine : public H2Core::Object { H2_OBJECT public: /** * If #__instance equals 0, a new AudioEngine singleton will * be created and stored in it. * * It is called in Hydrogen::audioEngine_init(). */ static void create_instance(); /** * Returns a pointer to the current AudioEngine singleton * stored in #__instance. */ static AudioEngine* get_instance() { assert(__instance); return __instance; } /** * Destructor of the AudioEngine. * * Deletes the Effects singleton and the #__sampler and * #__synth objects. */ ~AudioEngine(); /** Mutex locking of the AudioEngine. * * It passes the address of the #__engine_mutex object to * _pthread_mutex_lock()_ (pthread.h) to lock the AudioEngine * and transfer ownership of the #__engine_mutex to the * calling thread. Only this very thread can unlock() the * engine again. * * The documentation below may serve as a guide for future * implementations. At the moment the logging of the locking * is __not supported yet__ and the arguments will be just * stored in the #__locker variable, which itself won't be * ever used. * * Easy usage: Use the #RIGHT_HERE macro like this... * \code{.cpp} * AudioEngine::get_instance()->lock( RIGHT_HERE ); * \endcode * * More complex usage: The parameters @a file and @a function * need to be pointers to null-terminated strings that are * persistent for the entire session. This does *not* include * the return value of std::string::c_str(), or * QString::toLocal8Bit().data(). * * Tracing the locks: Enable the Logger::AELockTracing * logging level. When you do, there will be a performance * penalty because the strings will be converted to a * QString. At the moment, you'll have to do that with * your debugger. * * Notes: The order of the parameters match GCC's * implementation of the assert() macros. * * \param file File the locking occurs in. * \param line Line of the file the locking occurs in. * \param function Function the locking occurs in. */ void lock( const char* file, unsigned int line, const char* function ); /** * Mutex locking of the AudioEngine. * * This function is equivalent to lock() but calls * _pthread_mutex_trylock()_ (pthread.h) instead and returns a * bool depending on its results. * * \param file File the locking occurs in. * \param line Line of the file the locking occurs in. * \param function Function the locking occurs in. * * \return * - true : On success (if _pthread_mutex_lock()_ returns * 0) * - false : Else */ bool try_lock( const char* file, unsigned int line, const char* function ); /** * Mutex unlocking of the AudioEngine. * * Calls _pthread_mutex_unlock()_ (pthread.h) on the address * of #__engine_mutex and leaves #__locker untouched. */ void unlock(); static float compute_tick_size(int sampleRate, int bpm, int resolution); /** Returns #__sampler */ Sampler* get_sampler(); /** Returns #__synth */ Synth* get_synth(); private: /** * Object holding the current AudioEngine singleton. It is * initialized with NULL, set with create_instance(), and * accessed with get_instance(). */ static AudioEngine* __instance; /** Local instance of the Sampler. */ Sampler* __sampler; /** Local instance of the Synth. */ Synth* __synth; /** Mutex for synchronizing the access to the Song object and the AudioEngine. * * It can be used lock the access using either lock() or * try_lock() and to unlock it via unlock(). It is * initialized in AudioEngine() and not explicitly exited. */ pthread_mutex_t __engine_mutex; /** * This struct is most probably intended to be used for * logging the locking of the AudioEngine. But neither it nor * the Logger::AELockTracing state is ever used. */ struct _locker_struct { const char* file; unsigned int line; const char* function; } __locker; ///< This struct is most probably intended to be ///< used for logging the locking of the ///< AudioEngine. But neither it nor the ///< Logger::AELockTracing state is ever used. /** * Constructor of the AudioEngine. * * - Assigns #__instance to itself. * - Initializes the Mutex of the AudioEngine #__engine_mutex * by calling _pthread_mutex_init()_ (pthread.h) on its * address. * - Assigns a new instance of the Sampler to #__sampler and of * the Synth to #__synth. * - Creates an instance of the Effects singleton. This call * should not be necessary since this singleton was created * right before creating the AudioEngine. But its costs are * cheap, so I just keep it. */ AudioEngine(); }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/automation_path_serializer.h000066400000000000000000000023741366722712400266110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AUTOMATION_PATH_SERIALIZER_H #define AUTOMATION_PATH_SERIALIZER_H #include #include #include namespace H2Core { class AutomationPathSerializer : private Object { H2_OBJECT public: AutomationPathSerializer(); void read_automation_path(const QDomNode &node, AutomationPath &path); void write_automation_path(QDomNode &node, const AutomationPath &path); }; } #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/000077500000000000000000000000001366722712400222515ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/adsr.h000066400000000000000000000070021366722712400233520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_ADSR_H #define H2C_ADSR_H #include namespace H2Core { /** * Attack Decay Sustain Release envelope. */ class ADSR : private Object { H2_OBJECT public: /** * constructor * \param attack tick duration * \param decay tick duration * \param sustain level * \param release tick duration */ ADSR ( unsigned int attack = 0, unsigned int decay = 0, float sustain = 1.0, unsigned int release = 1000 ); /** copy constructor */ ADSR( const ADSR* other ); /** destructor */ ~ADSR(); /** * __attack setter * \param value the new value */ void set_attack( unsigned int value ); /** __attack accessor */ unsigned int get_attack(); /** * __decay setter * \param value the new value */ void set_decay( unsigned int value ); /** __decay accessor */ unsigned int get_decay(); /** * __sustain setter * \param value the new value */ void set_sustain( float value ); /** __sustain accessor */ float get_sustain(); /** * __release setter * \param value the new value */ void set_release( unsigned int value ); /** __release accessor */ unsigned int get_release(); /** * sets state to ATTACK */ void attack(); /** * compute the value and return it * \param step the increment to be added to __ticks */ float get_value( float step ); /** * sets state to RELEASE, * returns 0 if the state is IDLE, * __value if the state is RELEASE, * set state to RELEASE, save __release_value and return it. * */ float release(); private: unsigned int __attack; ///< Attack tick count unsigned int __decay; ///< Decay tick count float __sustain; ///< Sustain level unsigned int __release; ///< Release tick count /** possible states */ enum ADSRState { ATTACK=0, DECAY, SUSTAIN, RELEASE, IDLE }; ADSRState __state; ///< current state float __ticks; ///< current tick count float __value; ///< current value float __release_value; ///< value when the release state was entered void normalise(); }; // DEFINITIONS inline void ADSR::set_attack( unsigned int value ) { __attack = value; } inline unsigned int ADSR::get_attack() { return __attack; } inline void ADSR::set_decay( unsigned int value ) { __decay = value; } inline unsigned int ADSR::get_decay() { return __decay; } inline void ADSR::set_sustain( float value ) { __sustain = value; } inline float ADSR::get_sustain() { return __sustain; } inline void ADSR::set_release( unsigned int value ) { __release = value; } inline unsigned int ADSR::get_release() { return __release; } }; #endif // H2C_ADRS_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/automation_path.h000066400000000000000000000041571366722712400256250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_AUTOMATION_PATH_H #define H2C_AUTOMATION_PATH_H #include #include #if __cplusplus <= 199711L # define noexcept #endif namespace H2Core { class AutomationPath : private Object { H2_OBJECT public: typedef std::map::iterator iterator; typedef std::map::const_iterator const_iterator; private: float _min; float _max; float _def; std::map _points; public: AutomationPath(float min, float max, float def); bool empty() const noexcept { return _points.empty(); } float get_min() const noexcept { return _min; } float get_max() const noexcept { return _max; } float get_default() const noexcept { return _def; } float get_value(float x) const noexcept; void add_point(float x, float y); void remove_point(float x); friend bool operator==(const AutomationPath &lhs, const AutomationPath &rhs); friend bool operator!=(const AutomationPath &lhs, const AutomationPath &rhs); iterator begin() { return _points.begin(); } iterator end() { return _points.end(); } const_iterator begin() const { return _points.begin(); } const_iterator end() const { return _points.end(); } iterator find(float x); iterator move(iterator &in, float x, float y); }; std::ostream &operator<< (std::ostream &o, const AutomationPath &p); }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/drumkit.h000066400000000000000000000235531366722712400241110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_DRUMKIT_H #define H2C_DRUMKIT_H #include namespace H2Core { class XMLNode; class InstrumentList; class DrumkitComponent; /** * Drumkit info */ class Drumkit : public H2Core::Object { H2_OBJECT public: /** drumkit constructor, does nothing */ Drumkit(); /** copy constructor */ Drumkit( Drumkit* other ); /** drumkit destructor, delete #__instruments */ ~Drumkit(); /** * Load drumkit information from a directory. * * This function is a wrapper around load_file(). The * provided drumkit directory @a dk_dir is converted * by Filesystem::drumkit_file() internally. * * \param dk_dir A directory containing a drumkit, * like those returned by * Filesystem::drumkit_dir_search(). * \param load_samples Automatically load sample data * if set to true. * * \return A Drumkit on success, nullptr otherwise. */ static Drumkit* load( const QString& dk_dir, const bool load_samples = false ); /** * Simple wrapper for load() used with the drumkit's * name instead of its directory. * * Uses Filesystem::drumkit_path_search() to determine * the directory of the Drumkit from @a dk_name. * * \param dk_name Name of the Drumkit. * \param load_samples Automatically load sample data * if set to true. * * \return A Drumkit on success, nullptr otherwise. */ static Drumkit* load_by_name( const QString& dk_name, const bool load_samples = false ); /** * Load a Drumkit from a file. * * If the drumkit in @a dk_name can not be validated * against the current XML Schema definition in * Filesystem::drumkit_xsd_path(), it will be loaded * using Legacy::load_drumkit() and, if successful, * saved again using save_file() to update the drumkit * file to the newest version. If, instead, the * Drumkit is valid, it is loaded using load_from() * and load_samples() is triggered if @a load_samples * is true. * * \param dk_path is a path to an xml file * \param load_samples automatically load sample data if set to true * * \return A Drumkit on success, nullptr otherwise. */ static Drumkit* load_file( const QString& dk_path, const bool load_samples = false ); /** Calls the InstrumentList::load_samples() member * function of #__instruments. */ void load_samples(); /** Calls the InstrumentList::unload_samples() member * function of #__instruments. */ void unload_samples(); /** * Saves the current drumkit to dk_path, but makes a backup. * This is used when the drumkit did not comply to * our xml schema. */ static void upgrade_drumkit( Drumkit* pDrumkit, const QString& dk_path ); /** * check if a user drumkit with the given name * already exists * \param dk_path Drumkit path * \return true on success */ static bool user_drumkit_exists( const QString& dk_path ); /** * save a drumkit, xml file and samples * \param overwrite allows to write over existing drumkit files * \return true on success */ bool save( bool overwrite=false ); /** * save a drumkit, xml file and samples * neither #__path nor #__name are updated * \param dk_dir the directory to save the drumkit into * \param overwrite allows to write over existing drumkit files * \return true on success */ bool save( const QString& dk_dir, bool overwrite=false ); /** * save a drumkit into an xml file * \param dk_path the path to save the drumkit into * \param overwrite allows to write over existing drumkit file * \param component_id to chose the component to save or -1 for all * \return true on success */ bool save_file( const QString& dk_path, bool overwrite=false, int component_id=-1 ); /** * save a drumkit instruments samples into a directory * \param dk_dir the directory to save the samples into * \param overwrite allows to write over existing drumkit samples files * \return true on success */ bool save_samples( const QString& dk_dir, bool overwrite=false ); /** * save the drumkit image into the new directory * \param dk_dir the directory to save the image into * \param overwrite allows to write over existing drumkit image file * \return true on success */ bool save_image( const QString& dk_dir, bool overwrite=false ); /** * save a drumkit using given parameters and an instrument list * \param name the name of the drumkit * \param author the author of the drumkit * \param info the info of the drumkit * \param license the license of the drumkit * \param image the image filename (with full path) of the drumkit * \param imageLicense license of the supplied image * \param instruments the instruments to be saved within the drumkit * \param components * \param overwrite allows to write over existing drumkit files * \return true on success */ static bool save( const QString& name, const QString& author, const QString& info, const QString& license, const QString& image, const QString& imageLicense, InstrumentList* instruments, std::vector* components, bool overwrite=false ); /** * install a drumkit from a filename * \param path the path to the new drumkit archive * \return true on success */ static bool install( const QString& path ); /** * remove a drumkit from the disk * \param dk_name the drumkit name * \return true on success */ static bool remove( const QString& dk_name ); /** set __instruments, delete existing one */ void set_instruments( InstrumentList* instruments ); /** returns #__instruments */ InstrumentList* get_instruments() const; /** #__path setter */ void set_path( const QString& path ); /** #__path accessor */ const QString& get_path() const; /** #__name setter */ void set_name( const QString& name ); /** #__name accessor */ const QString& get_name() const; /** #__author setter */ void set_author( const QString& author ); /** #__author accessor */ const QString& get_author() const; /** #__info setter */ void set_info( const QString& info ); /** #__info accessor */ const QString& get_info() const; /** #__license setter */ void set_license( const QString& license ); /** #__license accessor */ const QString& get_license() const; /** #__image setter */ void set_image( const QString& image ); /** #__image accessor */ const QString& get_image() const; /** #__imageLicense setter */ void set_image_license( const QString& imageLicense ); /** #__imageLicense accessor */ const QString& get_image_license() const; /** return true if the samples are loaded */ const bool samples_loaded() const; void dump(); std::vector* get_components(); void set_components( std::vector* components ); private: QString __path; ///< absolute drumkit path QString __name; ///< drumkit name QString __author; ///< drumkit author QString __info; ///< drumkit free text QString __license; ///< drumkit license description QString __image; ///< drumkit image filename QString __imageLicense; ///< drumkit image license bool __samples_loaded; ///< true if the instrument samples are loaded InstrumentList* __instruments; ///< the list of instruments /* * save the drumkit within the given XMLNode * \param node the XMLNode to feed */ void save_to( XMLNode* node, int component_id=-1 ); /** * load a drumkit from an XMLNode * \param node the XMLDode to read from * \param dk_path the directory holding the drumkit data */ static Drumkit* load_from( XMLNode* node, const QString& dk_path ); std::vector* __components; ///< list of drumkit component }; // DEFINITIONS inline InstrumentList* Drumkit::get_instruments() const { return __instruments; } inline void Drumkit::set_path( const QString& path ) { __path = path; } inline const QString& Drumkit::get_path() const { return __path; } inline void Drumkit::set_name( const QString& name ) { __name = name; } inline const QString& Drumkit::get_name() const { return __name; } inline void Drumkit::set_author( const QString& author ) { __author = author; } inline const QString& Drumkit::get_author() const { return __author; } inline void Drumkit::set_info( const QString& info ) { __info = info; } inline const QString& Drumkit::get_info() const { return __info; } inline void Drumkit::set_license( const QString& license ) { __license = license; } inline const QString& Drumkit::get_license() const { return __license; } inline void Drumkit::set_image( const QString& image ) { __image = image; } inline const QString& Drumkit::get_image() const { return __image; } inline void Drumkit::set_image_license( const QString& imageLicense ) { __imageLicense = imageLicense; } inline const QString& Drumkit::get_image_license() const { return __imageLicense; } inline const bool Drumkit::samples_loaded() const { return __samples_loaded; } inline std::vector* Drumkit::get_components() { return __components; } }; #endif // H2C_DRUMKIT_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/drumkit_component.h000066400000000000000000000071201366722712400261630ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_DRUMKITCOMPONENT_H #define H2C_DRUMKITCOMPONENT_H #include #include #include namespace H2Core { class XMLNode; class ADSR; class Drumkit; class InstrumentLayer; class DrumkitComponent : public H2Core::Object { H2_OBJECT public: DrumkitComponent( const int id, const QString& name ); DrumkitComponent( DrumkitComponent* other ); ~DrumkitComponent(); void save_to( XMLNode* node ); static DrumkitComponent* load_from( XMLNode* node, const QString& dk_path ); void load_from( DrumkitComponent* component, bool is_live = true ); void set_name( const QString& name ); const QString& get_name() const; void set_id( const int id ); int get_id() const; void set_volume( float volume ); float get_volume() const; void set_muted( bool active ); bool is_muted() const; void set_soloed( bool soloed ); bool is_soloed() const; void set_peak_l( float val ); float get_peak_l() const; void set_peak_r( float val ); float get_peak_r() const; void reset_outs( uint32_t nFrames ); void set_outs( int nBufferPos, float valL, float valR ); float get_out_L( int nBufferPos ); float get_out_R( int nBufferPos ); private: int __id; /** Name of the DrumkitComponent. It is set by set_name() and accessed via get_name().*/ QString __name; float __volume; bool __muted; bool __soloed; float __peak_l; float __peak_r; float * __out_L; float * __out_R; }; // DEFINITIONS /** Sets the name of the DrumkitComponent #__name. * \param name New name. */ inline void DrumkitComponent::set_name( const QString& name ) { __name = name; } /** Access the name of the DrumkitComponent. * \return #__name */ inline const QString& DrumkitComponent::get_name() const { return __name; } inline void DrumkitComponent::set_id( const int id ) { __id = id; } inline int DrumkitComponent::get_id() const { return __id; } inline void DrumkitComponent::set_volume( float volume ) { __volume = volume; } inline float DrumkitComponent::get_volume() const { return __volume; } inline void DrumkitComponent::set_muted( bool muted ) { __muted = muted; } inline bool DrumkitComponent::is_muted() const { return __muted; } inline void DrumkitComponent::set_soloed( bool soloed ) { __soloed = soloed; } inline bool DrumkitComponent::is_soloed() const { return __soloed; } inline void DrumkitComponent::set_peak_l( float val ) { __peak_l = val; } inline float DrumkitComponent::get_peak_l() const { return __peak_l; } inline void DrumkitComponent::set_peak_r( float val ) { __peak_r = val; } inline float DrumkitComponent::get_peak_r() const { return __peak_r; } }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/instrument.h000066400000000000000000000405421366722712400246370ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_INSTRUMENT_H #define H2C_INSTRUMENT_H #include #include #include #define EMPTY_INSTR_ID -1 /** Created Instrument will be used as metronome. */ #define METRONOME_INSTR_ID -2 #define PLAYBACK_INSTR_ID -3 namespace H2Core { class XMLNode; class ADSR; class Drumkit; class DrumkitComponent; class InstrumentLayer; class InstrumentComponent; /** Instrument class */ class Instrument : public H2Core::Object { H2_OBJECT public: enum SampleSelectionAlgo { VELOCITY, ROUND_ROBIN, RANDOM }; /** * constructor * \param id the id of this instrument * \param name the name of the instrument * \param adsr attack decay sustain release instance */ Instrument( const int id=EMPTY_INSTR_ID, const QString& name="Empty Instrument", ADSR* adsr=nullptr ); /** copy constructor */ Instrument( Instrument* other ); /** destructor */ ~Instrument(); /** * creates a new Instrument, loads samples from a given instrument within a given drumkit * \param drumkit_name the drumkit to search the instrument in * \param instrument_name the instrument within the drumkit to load samples from * \return a new Instrument instance */ static Instrument* load_instrument( const QString& drumkit_name, const QString& instrument_name ); /** * loads instrument from a given instrument within a given drumkit into a `live` Instrument object. * \param drumkit_name the drumkit to search the instrument in * \param instrument_name the instrument within the drumkit to load samples from * \param is_live is it performed while playing */ void load_from( const QString& drumkit_name, const QString& instrument_name, bool is_live = true ); /** * loads instrument from a given instrument into a `live` Instrument object. * \param drumkit the drumkit the instrument belongs to * \param instrument to load samples and members from * \param is_live is it performed while playing */ void load_from( Drumkit* drumkit, Instrument* instrument, bool is_live = true ); /** * Calls the InstrumentLayer::load_sample() member * function of all layers of each component of the * Instrument. */ void load_samples(); /** * Calls the InstrumentLayer::unload_sample() member * function of all layers of each component of the * Instrument. */ void unload_samples(); /** * save the instrument within the given XMLNode * \param node the XMLNode to feed * \param component_id Identifier of the corresponding * component. */ void save_to( XMLNode* node, int component_id ); /** * load an instrument from an XMLNode * \param node the XMLDode to read from * \param dk_path the directory holding the drumkit data * \param dk_name the name of the drumkit * \return a new Instrument instance */ static Instrument* load_from( XMLNode* node, const QString& dk_path, const QString& dk_name ); ///< set the name of the instrument void set_name( const QString& name ); ///< get the name of the instrument const QString& get_name() const; ///< set the id of the instrument void set_id( const int id ); ///< get the id of the instrument int get_id() const; /** set the ADSR of the instrument */ void set_adsr( ADSR* adsr ); /** get the ADSR of the instrument */ ADSR* get_adsr() const; /** get a copy of the ADSR of the instrument */ ADSR* copy_adsr() const; /** set the mute group of the instrument */ void set_mute_group( int group ); /** get the mute group of the instrument */ int get_mute_group() const; /** set the midi out channel of the instrument */ void set_midi_out_channel( int channel ); /** get the midi out channel of the instrument */ int get_midi_out_channel() const; /** set the midi out note of the instrument */ void set_midi_out_note( int note ); /** get the midi out note of the instrument */ int get_midi_out_note() const; /** set muted status of the instrument */ void set_muted( bool muted ); /** get muted status of the instrument */ bool is_muted() const; /** set left pan of the instrument */ void set_pan_l( float val ); /** get left pan of the instrument */ float get_pan_l() const; /** set right pan of the instrument */ void set_pan_r( float val ); /** get right pan of the instrument */ float get_pan_r() const; /** set gain of the instrument */ void set_gain( float gain ); /** get gain of the instrument */ float get_gain() const; /** set the volume of the instrument */ void set_volume( float volume ); /** get the volume of the instrument */ float get_volume() const; /** activate the filter of the instrument */ void set_filter_active( bool active ); /** get the status of the filter of the instrument */ bool is_filter_active() const; /** set the filter resonance of the instrument */ void set_filter_resonance( float val ); /** get the filter resonance of the instrument */ float get_filter_resonance() const; /** set the filter cutoff of the instrument */ void set_filter_cutoff( float val ); /** get the filter cutoff of the instrument */ float get_filter_cutoff() const; /** set the left peak of the instrument */ void set_peak_l( float val ); /** get the left peak of the instrument */ float get_peak_l() const; /** set the right peak of the instrument */ void set_peak_r( float val ); /** get the right peak of the instrument */ float get_peak_r() const; /** set the fx level of the instrument */ void set_fx_level( float level, int index ); /** get the fx level of the instrument */ float get_fx_level( int index ) const; /** set the random pitch factor of the instrument */ void set_random_pitch_factor( float val ); /** get the random pitch factor of the instrument */ float get_random_pitch_factor() const; /** set the active status of the instrument */ void set_active( bool active ); /** get the active status of the instrument */ bool is_active() const; /** set the soloed status of the instrument */ void set_soloed( bool soloed ); /** get the soloed status of the instrument */ bool is_soloed() const; /** enqueue the instrument */ void enqueue(); /** dequeue the instrument */ void dequeue(); /** get the queued status of the instrument */ bool is_queued() const; /** set the stop notes status of the instrument */ void set_stop_notes( bool stopnotes ); /** get the stop notes of the instrument */ bool is_stop_notes() const; void set_sample_selection_alg( SampleSelectionAlgo selected_algo); SampleSelectionAlgo sample_selection_alg() const; void set_hihat_grp( int hihat_grp ); int get_hihat_grp() const; void set_lower_cc( int message ); int get_lower_cc() const; void set_higher_cc( int message ); int get_higher_cc() const; ///< set the name of the related drumkit void set_drumkit_name( const QString& name ); ///< get the name of the related drumkits const QString& get_drumkit_name() const; /** Mark the instrument as hydrogen's preview instrument */ void set_is_preview_instrument(bool isPreview); bool is_preview_instrument() const; /** Mark the instrument as metronome instrument */ void set_is_metronome_instrument(bool isMetronome); bool is_metronome_instrument() const; std::vector* get_components(); InstrumentComponent* get_component( int DrumkitComponentID ); void set_apply_velocity( bool apply_velocity ); bool get_apply_velocity() const; bool is_currently_exported() const; void set_currently_exported( bool isCurrentlyExported ); private: /** Identifier of an instrument, which should be unique. It is set by set_id() and accessed via get_id().*/ int __id; /** Name of the Instrument. It is set by set_name() and accessed via get_name().*/ QString __name; QString __drumkit_name; ///< the name of the drumkit this instrument belongs to float __gain; ///< gain of the instrument float __volume; ///< volume of the instrument float __pan_l; ///< left pan of the instrument float __pan_r; ///< right pan of the instrument float __peak_l; ///< left current peak value float __peak_r; ///< right current peak value ADSR* __adsr; ///< attack delay sustain release instance bool __filter_active; ///< is filter active? float __filter_cutoff; ///< filter cutoff (0..1) float __filter_resonance; ///< filter resonant frequency (0..1) float __random_pitch_factor; ///< random pitch factor int __midi_out_note; ///< midi out note int __midi_out_channel; ///< midi out channel bool __stop_notes; ///< will the note automatically generate a note off after being on SampleSelectionAlgo __sample_selection_alg; ///< how Hydrogen will chose the sample to use bool __active; ///< is the instrument active? bool __soloed; ///< is the instrument in solo mode? bool __muted; ///< is the instrument muted? int __mute_group; ///< mute group of the instrument int __queued; ///< count the number of notes queued within Sampler::__playing_notes_queue or std::priority_queue m_songNoteQueue float __fx_level[MAX_FX]; ///< Ladspa FX level array int __hihat_grp; ///< the instrument is part of a hihat int __lower_cc; ///< lower cc level int __higher_cc; ///< higher cc level bool __is_preview_instrument; ///< is the instrument an hydrogen preview instrument? bool __is_metronome_instrument; ///< is the instrument an metronome instrument? std::vector* __components; ///< InstrumentLayer array bool __apply_velocity; ///< change the sample gain based on velocity bool __current_instr_for_export; ///< is the instrument currently being exported? }; // DEFINITIONS /** Sets the name of the Instrument #__name. * \param name New name. */ inline void Instrument::set_name( const QString& name ) { __name = name; } /** Access the name of the Instrument. * \return #__name */ inline const QString& Instrument::get_name() const { return __name; } /** Sets #__id to @a id. * \param id Unique identifier of the instrument. */ inline void Instrument::set_id( const int id ) { __id = id; } /** Returns #__id. * \return #__id. */ inline int Instrument::get_id() const { return __id; } inline ADSR* Instrument::get_adsr() const { return __adsr; } inline ADSR* Instrument::copy_adsr() const { return new ADSR( __adsr ); } inline void Instrument::set_mute_group( int group ) { __mute_group = ( group<-1 ? -1 : group ); } inline int Instrument::get_mute_group() const { return __mute_group; } inline int Instrument::get_midi_out_channel() const { return __midi_out_channel; } inline void Instrument::set_midi_out_channel( int channel ) { if ( ( channel >= MIDI_OUT_CHANNEL_MIN ) && ( channel <= MIDI_OUT_CHANNEL_MAX ) ) { __midi_out_channel = channel; } else { ERRORLOG( QString( "midi out channel %1 out of bounds" ).arg( channel ) ); } } inline int Instrument::get_midi_out_note() const { return __midi_out_note; } inline void Instrument::set_midi_out_note( int note ) { if ( ( note >= MIDI_OUT_NOTE_MIN ) && ( note <= MIDI_OUT_NOTE_MAX ) ) { __midi_out_note = note; } else { ERRORLOG( QString( "midi out note %1 out of bounds" ).arg( note ) ); } } inline void Instrument::set_muted( bool muted ) { __muted = muted; } inline bool Instrument::is_muted() const { return __muted; } inline void Instrument::set_pan_l( float val ) { __pan_l = val; } inline float Instrument::get_pan_l() const { return __pan_l; } inline void Instrument::set_pan_r( float val ) { __pan_r = val; } inline float Instrument::get_pan_r() const { return __pan_r; } inline void Instrument::set_gain( float gain ) { __gain = gain; } inline float Instrument::get_gain() const { return __gain; } inline void Instrument::set_volume( float volume ) { __volume = volume; } inline float Instrument::get_volume() const { return __volume; } inline void Instrument::set_filter_active( bool active ) { __filter_active = active; } inline bool Instrument::is_filter_active() const { return __filter_active; } inline void Instrument::set_filter_resonance( float val ) { __filter_resonance = val; } inline float Instrument::get_filter_resonance() const { return __filter_resonance; } inline void Instrument::set_filter_cutoff( float val ) { __filter_cutoff = val; } inline float Instrument::get_filter_cutoff() const { return __filter_cutoff; } inline void Instrument::set_peak_l( float val ) { __peak_l = val; } inline float Instrument::get_peak_l() const { return __peak_l; } inline void Instrument::set_peak_r( float val ) { __peak_r = val; } inline float Instrument::get_peak_r() const { return __peak_r; } inline void Instrument::set_fx_level( float level, int index ) { __fx_level[index] = level; } inline float Instrument::get_fx_level( int index ) const { return __fx_level[index]; } inline void Instrument::set_random_pitch_factor( float val ) { __random_pitch_factor = val; } inline float Instrument::get_random_pitch_factor() const { return __random_pitch_factor; } inline void Instrument::set_active( bool active ) { __active = active; } inline bool Instrument::is_active() const { return __active; } inline void Instrument::set_soloed( bool soloed ) { __soloed = soloed; } inline bool Instrument::is_soloed() const { return __soloed; } inline void Instrument::enqueue() { __queued++; } inline void Instrument::dequeue() { assert( __queued > 0 ); __queued--; } inline bool Instrument::is_queued() const { return ( __queued > 0 ); } inline void Instrument::set_stop_notes( bool stopnotes ) { __stop_notes = stopnotes; } inline bool Instrument::is_stop_notes() const { return __stop_notes; } inline void Instrument::set_sample_selection_alg( SampleSelectionAlgo selected_algo) { __sample_selection_alg = selected_algo; } inline Instrument::SampleSelectionAlgo Instrument::sample_selection_alg() const { return __sample_selection_alg; } inline void Instrument::set_hihat_grp( int hihat_grp ) { __hihat_grp = hihat_grp; } inline int Instrument::get_hihat_grp() const { return __hihat_grp; } inline void Instrument::set_lower_cc( int message ) { __lower_cc = message; } inline int Instrument::get_lower_cc() const { return __lower_cc; } inline void Instrument::set_higher_cc( int message ) { __higher_cc = message; } inline int Instrument::get_higher_cc() const { return __higher_cc; } inline void Instrument::set_drumkit_name( const QString& name ) { __drumkit_name = name; } inline const QString& Instrument::get_drumkit_name() const { return __drumkit_name; } inline bool Instrument::is_preview_instrument() const { return __is_preview_instrument; } inline void Instrument::set_is_preview_instrument(bool isPreview) { __is_preview_instrument = isPreview; } inline bool Instrument::is_metronome_instrument() const { return __is_metronome_instrument; } inline void Instrument::set_is_metronome_instrument(bool isMetronome) { __is_metronome_instrument = isMetronome; } inline std::vector* Instrument::get_components() { return __components; } inline void Instrument::set_apply_velocity( bool apply_velocity ) { __apply_velocity = apply_velocity; } inline bool Instrument::get_apply_velocity() const { return __apply_velocity; } inline bool Instrument::is_currently_exported() const { return __current_instr_for_export; } inline void Instrument::set_currently_exported( bool isCurrentlyExported ) { __current_instr_for_export = isCurrentlyExported; } }; #endif // H2C_INSTRUMENT_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/instrument_component.h000066400000000000000000000064721366722712400267250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_INSTRUMENTCOMPONENT_H #define H2C_INSTRUMENTCOMPONENT_H #include #include #include namespace H2Core { class XMLNode; class ADSR; class Drumkit; class InstrumentLayer; class DrumkitComponent; class InstrumentComponent : public H2Core::Object { H2_OBJECT public: InstrumentComponent( int related_drumkit_componentID ); InstrumentComponent( InstrumentComponent* other ); ~InstrumentComponent(); void save_to( XMLNode* node, int component_id ); static InstrumentComponent* load_from( XMLNode* node, const QString& dk_path ); InstrumentLayer* operator[]( int ix ); InstrumentLayer* get_layer( int idx ); void set_layer( InstrumentLayer* layer, int idx ); void set_drumkit_componentID( int related_drumkit_componentID ); int get_drumkit_componentID(); void set_gain( float gain ); float get_gain() const; /** @return #m_nMaxLayers.*/ static int getMaxLayers(); /** @param layers Sets #m_nMaxLayers.*/ static void setMaxLayers( int layers ); private: /** Component ID of the drumkit. It is set by set_drumkit_componentID() and accessed via get_drumkit_componentID(). */ int __related_drumkit_componentID; float __gain; /** Maximum number of layers to be used in the * Instrument editor. * * It is set by setMaxLayers(), queried by * getMaxLayers(), and inferred from * Preferences::m_nMaxLayers. Default value assigned in * Preferences::Preferences(): 16. */ static int m_nMaxLayers; std::vector __layers; }; // DEFINITIONS /** Sets the component ID #__related_drumkit_componentID * \param related_drumkit_componentID New value for the component ID */ inline void InstrumentComponent::set_drumkit_componentID( int related_drumkit_componentID ) { __related_drumkit_componentID = related_drumkit_componentID; } /** Returns the component ID of the drumkit. * \return #__related_drumkit_componentID */ inline int InstrumentComponent::get_drumkit_componentID() { return __related_drumkit_componentID; } inline void InstrumentComponent::set_gain( float gain ) { __gain = gain; } inline float InstrumentComponent::get_gain() const { return __gain; } inline InstrumentLayer* InstrumentComponent::operator[]( int idx ) { assert( idx >= 0 && idx < m_nMaxLayers ); return __layers[ idx ]; } inline InstrumentLayer* InstrumentComponent::get_layer( int idx ) { assert( idx >= 0 && idx < m_nMaxLayers ); return __layers[ idx ]; } }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/instrument_layer.h000066400000000000000000000112061366722712400260260ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_INSTRUMENT_LAYER_H #define H2C_INSTRUMENT_LAYER_H #include namespace H2Core { class XMLNode; class Sample; /** * InstrumentLayer is part of an instrument *
each layer has it's own : *
gain which is the ration between the input sample and the output signal, *
pitch which allows you to play the sample at a faster or lower frequency, *
start velocity and end velocity which allows you to chose between a layer or another within an instrument * by changing the velocity of the played note. so the only layer of an instrument should start at 0.0 and end at 1.0. */ class InstrumentLayer : public H2Core::Object { H2_OBJECT public: /** constructor * \param sample the sample to use * */ InstrumentLayer( Sample* sample ); /** copy constructor, will be initialized with an empty sample * \param other the instrument layer to copy from */ InstrumentLayer( InstrumentLayer* other ); /** copy constructor * \param other the instrument layer to copy from * \param sample the sample to use */ InstrumentLayer( InstrumentLayer* other, Sample* sample ); /** destructor */ ~InstrumentLayer(); /** set the gain of the layer */ void set_gain( float gain ); /** get the gain of the layer */ float get_gain() const; /** set the pitch of the layer */ void set_pitch( float pitch ); /** get the pitch of the layer */ float get_pitch() const; /** set the start ivelocity of the layer */ void set_start_velocity( float start ); /** get the start velocity of the layer */ float get_start_velocity() const; /** set the end velocity of the layer */ void set_end_velocity( float end ); /** get the end velocity of the layer */ float get_end_velocity() const; /** set the sample of the layer */ void set_sample( Sample* sample ); /** get the sample of the layer */ Sample* get_sample() const; /** * Calls the #H2Core::Sample::load() * member function of #__sample. */ void load_sample(); /* * unload sample and replace it with an empty one */ void unload_sample(); /** * save the instrument layer within the given XMLNode * \param node the XMLNode to feed */ void save_to( XMLNode* node ); /** * load an instrument layer from an XMLNode * \param node the XMLDode to read from * \param dk_path the directory holding the drumkit data * \return a new InstrumentLayer instance */ static InstrumentLayer* load_from( XMLNode* node, const QString& dk_path ); private: float __gain; ///< ratio between the input sample and the output signal, 1.0 by default float __pitch; ///< the frequency of the sample, 0.0 by default which means output pitch is the same as input pitch float __start_velocity; ///< the start velocity of the sample, 0.0 by default float __end_velocity; ///< the end velocity of the sample, 1.0 by default Sample* __sample; ///< the underlaying sample }; // DEFINITIONS inline void InstrumentLayer::set_gain( float gain ) { __gain = gain; } inline float InstrumentLayer::get_gain() const { return __gain; } inline void InstrumentLayer::set_pitch( float pitch ) { __pitch = pitch; } inline float InstrumentLayer::get_pitch() const { return __pitch; } inline void InstrumentLayer::set_start_velocity( float start ) { __start_velocity = start; } inline float InstrumentLayer::get_start_velocity() const { return __start_velocity; } inline void InstrumentLayer::set_end_velocity( float end ) { __end_velocity = end; } inline float InstrumentLayer::get_end_velocity() const { return __end_velocity; } inline Sample* InstrumentLayer::get_sample() const { return __sample; } }; #endif // H2C_INSTRUMENT_LAYER_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/instrument_list.h000066400000000000000000000126401366722712400256700ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_INSTRUMENT_LIST_H #define H2C_INSTRUMENT_LIST_H #include #include namespace H2Core { class XMLNode; class Instrument; /** * InstrumentList is a collection of instruments used within a song, a drumkit, ... */ class InstrumentList : public H2Core::Object { H2_OBJECT public: /** constructor */ InstrumentList(); /** destructor */ ~InstrumentList(); /** * copy constructor * \param other */ InstrumentList( InstrumentList* other ); /** returns the numbers of instruments */ int size() const; /** * add an instrument to the list * \param instrument a pointer to the instrument to add */ void operator<<( Instrument* instrument ); /** * get an instrument from the list * \param idx the index to get the instrument from */ Instrument* operator[]( int idx ); /** * add an instrument to the list * \param instrument a pointer to the instrument to add */ void add( Instrument* instrument ); /** * insert an instrument into the list * \param idx the index to insert the instrument at * \param instrument a pointer to the instrument to add */ void insert( int idx, Instrument* instrument ); /** * check if there is a idx is a valid index for this list * without throwing an error messaage * \param idx the index of the instrument */ bool is_valid_index( int idx ) const; /** * get an instrument from the list * \param idx the index to get the instrument from */ Instrument* get( int idx ); /** * remove the instrument at a given index, does not delete it * \param idx the index * \return a pointer to the removed instrument */ Instrument* del( int idx ); /** * remove an instrument from the list, does not delete it * \param instrument the instrument to be removed * \return a pointer to the removed instrument, 0 if not found */ Instrument* del( Instrument* instrument ); /** * get the index of an instrument within the instruments * \param instrument a pointer to the instrument to find * \return -1 if not found */ int index( Instrument* instrument ); /** * find an instrument within the instruments * \param i the id of the instrument to find * \return 0 if not found */ Instrument* find( const int i ); /** * find an instrument within the instruments * \param name the name of the instrument to find * \return 0 if not found */ Instrument* find( const QString& name ); /** * find an instrument which play the given midi note * \param note the Midi note of the instrument to find * \return 0 if not found */ Instrument* findMidiNote( const int note ); /** * swap the instruments of two different indexes * \param idx_a the first index * \param idx_b the second index */ void swap( int idx_a, int idx_b ); /** * move an instrument from a position to another * \param idx_a the start index * \param idx_b the finish index */ void move( int idx_a, int idx_b ); /** Calls the Instrument::load_samples() member * function of all Instruments in #__instruments. */ void load_samples(); /** Calls the Instrument::unload_samples() member * function of all Instruments in #__instruments. */ void unload_samples(); /** * save the instrument list within the given XMLNode * \param node the XMLNode to feed * \param component_id Identifier of the corresponding * component. */ void save_to( XMLNode* node, int component_id ); /** * load an instrument list from an XMLNode * \param node the XMLDode to read from * \param dk_path the directory holding the drumkit * data * \param dk_name * \return a new InstrumentList instance */ static InstrumentList* load_from( XMLNode* node, const QString& dk_path, const QString& dk_name ); /** * Fix GitHub issue #307, so called "Hi Bongo fiasco". * * Check whether the same MIDI note is assignedto every * instrument - that condition makes MIDI export unusable. * When so, assign each instrument consecutive MIDI note * starting from 36. */ void fix_issue_307(); /** * Check if all instruments have assigned the same * MIDI out note */ bool has_all_midi_notes_same() const; /** * Set each instrument consecuteve MIDI * out notes, starting from 36 */ void set_default_midi_out_notes(); private: std::vector __instruments; ///< the list of instruments }; // DEFINITIONS inline int InstrumentList::size() const { return __instruments.size(); } }; #endif // H2C_INSTRUMENT_LIST_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/note.h000066400000000000000000000343521366722712400233760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_NOTE_H #define H2C_NOTE_H #include #include #define KEY_MIN 0 #define KEY_MAX 11 #define OCTAVE_MIN -3 #define OCTAVE_MAX 3 #define OCTAVE_OFFSET 3 #define OCTAVE_DEFAULT 0 #define KEYS_PER_OCTAVE 12 #define MIDI_MIDDLE_C 60 #define MIDI_FACTOR 127 #define VELOCITY_MIN 0.0f #define VELOCITY_MAX 1.0f #define PAN_MIN 0.0f #define PAN_MAX 0.5f #define LEAD_LAG_MIN -1.0f #define LEAD_LAG_MAX 1.0f /* Should equal (default __octave + OCTAVE_OFFSET) * KEYS_PER_OCTAVE + default __key */ #define MIDI_DEFAULT_OFFSET 36 namespace H2Core { class XMLNode; class ADSR; class Instrument; class InstrumentList; struct SelectedLayerInfo { int SelectedLayer; ///< selected layer during layer selection float SamplePosition; ///< place marker for overlapping process() cycles }; /** * A note plays an associated instrument with a velocity left and right pan */ class Note : public H2Core::Object { H2_OBJECT public: /** possible keys */ enum Key { C=KEY_MIN, Cs, D, Ef, E, F, Fs, G, Af, A, Bf, B }; /** possible octaves */ enum Octave { P8Z=-3, P8Y=-2, P8X=-1, P8=OCTAVE_DEFAULT, P8A=1, P8B=2, P8C=3 }; /** * constructor * \param instrument the instrument played by this note * \param position the position of the note within the pattern * \param velocity it's velocity * \param pan_l left pan * \param pan_r right pan * \param length it's length * \param pitch it's pitch */ Note( Instrument* instrument, int position, float velocity, float pan_l, float pan_r, int length, float pitch ); /** * copy constructor with an optional parameter * \param other * \param instrument if set will be used as note instrument */ Note( Note* other, Instrument* instrument=nullptr ); /** destructor */ ~Note(); /* * save the note within the given XMLNode * \param node the XMLNode to feed */ void save_to( XMLNode* node ); /** * load a note from an XMLNode * \param node the XMLDode to read from * \param instruments the current instrument list to search instrument into * \return a new Note instance */ static Note* load_from( XMLNode* node, InstrumentList* instruments ); /** output details through logger with DEBUG severity */ void dump(); /** * find the corresponding instrument and point to it, or an empty instrument * \param instruments the list of instrument to look into */ void map_instrument( InstrumentList* instruments ); /** #__instrument accessor */ Instrument* get_instrument(); /** return true if #__instrument is set */ bool has_instrument() const; /** * #__instrument_id setter * \param value the new value */ void set_instrument_id( int value ); /** #__instrument_id accessor */ int get_instrument_id() const; /** * #__specific_compo_id setter * \param value the new value */ void set_specific_compo_id( int value ); /** #__specific_compo_id accessor */ int get_specific_compo_id() const; /** * #__position setter * \param value the new value */ void set_position( int value ); /** #__position accessor */ int get_position() const; /** * #__velocity setter * \param value the new value */ void set_velocity( float value ); /** #__velocity accessor */ float get_velocity() const; /** * #__pan_l setter * \param value the new value */ void set_pan_l( float value ); /** #__pan_l accessor */ float get_pan_l() const; /** * #__pan_r setter * \param value the new value */ void set_pan_r( float value ); /** #__pan_r accessor */ float get_pan_r() const; /** * #__lead_lag setter * \param value the new value */ void set_lead_lag( float value ); /** #__lead_lag accessor */ float get_lead_lag() const; /** * #__length setter * \param value the new value */ void set_length( int value ); /** #__length accessor */ int get_length() const; /** * #__pitch setter * \param value the new value */ void set_pitch( float value ); /** #__pitch accessor */ float get_pitch() const; /** * #__note_off setter * \param value the new value */ void set_note_off( bool value ); /** #__note_off accessor */ bool get_note_off() const; /** #__midi_msg accessor */ int get_midi_msg() const; /** * #__pattern_idx setter * \param value the new value */ void set_pattern_idx( int value ); /** #__pattern_idx accessor */ int get_pattern_idx() const; /** * #__just_recorded setter * \param value the new value */ void set_just_recorded( bool value ); /** #__just_recorded accessor */ bool get_just_recorded() const; /* * selected sample * */ SelectedLayerInfo* get_layer_selected( int CompoID ); void set_probability( float value ); float get_probability() const; /** * #__humanize_delay setter * \param value the new value */ void set_humanize_delay( int value ); /** #__humanize_delay accessor */ int get_humanize_delay() const; /** #__cut_off accessor */ float get_cut_off() const; /** #__resonance accessor */ float get_resonance() const; /** #__bpfb_l accessor */ float get_bpfb_l() const; /** #__bpfb_r accessor */ float get_bpfb_r() const; /** #__lpfb_l accessor */ float get_lpfb_l() const; /** #__lpfb_r accessor */ float get_lpfb_r() const; /** #__key accessor */ Key get_key(); /** #__octave accessor */ Octave get_octave(); /** return scaled key for midi output, !!! DO NOT CHECK IF INSTRUMENT IS SET !!! */ int get_midi_key() const; /** midi velocity accessor * \code{.cpp} * __velocity * #MIDI_FACTOR * \endcode */ int get_midi_velocity() const; /** note key pitch accessor * \code{.cpp} * __octave * KEYS_PER_OCTAVE + __key * \endcode */ float get_notekey_pitch() const; /** returns * \code{.cpp} * __octave * 12 + __key + __pitch * \endcode*/ float get_total_pitch() const; /** return a string representation of key-octave */ QString key_to_string(); /** * parse str and set #__key and #__octave * \param str the string to be parsed */ void set_key_octave( const QString& str ); /** * set #__key and #__octave only if within acceptable range * \param key the key to set * \param octave the octave to be set */ void set_key_octave( Key key, Octave octave ); /** * set #__key, #__octave and #__midi_msg only if within acceptable range * \param key the key to set * \param octave the octave to be set * \param msg */ void set_midi_info( Key key, Octave octave, int msg ); /** get the ADSR of the note */ ADSR* get_adsr() const; /** call release on adsr */ //float release_adsr() const { return __adsr->release(); } /** call get value on adsr */ //float get_adsr_value(float v) const { return __adsr->get_value( v ); } /** return true if instrument, key and octave matches with internal * \param instrument the instrument to match with #__instrument * \param key the key to match with #__key * \param octave the octave to match with #__octave */ bool match( Instrument* instrument, Key key, Octave octave ) const; /** * compute left and right output based on filters * \param val_l the left channel value * \param val_r the right channel value */ void compute_lr_values( float* val_l, float* val_r ); private: Instrument* __instrument; ///< the instrument to be played by this note int __instrument_id; ///< the id of the instrument played by this note int __specific_compo_id; ///< play a specific component, -1 if playing all int __position; ///< note position inside the pattern float __velocity; ///< velocity (intensity) of the note [0;1] float __pan_l; ///< pan of the note (left volume) [0;0.5] float __pan_r; ///< pan of the note (right volume) [0;0.5] int __length; ///< the length of the note float __pitch; ///< the frequency of the note Key __key; ///< the key, [0;11]==[C;B] Octave __octave; ///< the octave [-3;3] ADSR* __adsr; ///< attack decay sustain release float __lead_lag; ///< lead or lag offset of the note float __cut_off; ///< filter cutoff [0;1] float __resonance; ///< filter resonant frequency [0;1] int __humanize_delay; ///< used in "humanize" function std::map< int, SelectedLayerInfo* > __layers_selected; float __bpfb_l; ///< left band pass filter buffer float __bpfb_r; ///< right band pass filter buffer float __lpfb_l; ///< left low pass filter buffer float __lpfb_r; ///< right low pass filter buffer int __pattern_idx; ///< index of the pattern holding this note for undo actions int __midi_msg; ///< TODO bool __note_off; ///< note type on|off bool __just_recorded; ///< used in record+delete float __probability; ///< note probability static const char* __key_str[]; ///< used to build QString from #__key an #__octave }; // DEFINITIONS inline ADSR* Note::get_adsr() const { return __adsr; } inline Instrument* Note::get_instrument() { return __instrument; } inline bool Note::has_instrument() const { return __instrument!=nullptr; } inline void Note::set_instrument_id( int value ) { __instrument_id = value; } inline int Note::get_instrument_id() const { return __instrument_id; } inline void Note::set_specific_compo_id( int value ) { __specific_compo_id = value; } inline int Note::get_specific_compo_id() const { return __specific_compo_id; } inline void Note::set_position( int value ) { __position = value; } inline int Note::get_position() const { return __position; } inline float Note::get_velocity() const { return __velocity; } inline float Note::get_pan_l() const { return __pan_l; } inline float Note::get_pan_r() const { return __pan_r; } inline float Note::get_lead_lag() const { return __lead_lag; } inline void Note::set_length( int value ) { __length = value; } inline int Note::get_length() const { return __length; } inline void Note::set_pitch( float value ) { __pitch = value; } inline float Note::get_pitch() const { return __pitch; } inline void Note::set_note_off( bool value ) { __note_off = value; } inline bool Note::get_note_off() const { return __note_off; } inline int Note::get_midi_msg() const { return __midi_msg; } inline void Note::set_pattern_idx( int value ) { __pattern_idx = value; } inline int Note::get_pattern_idx() const { return __pattern_idx; } inline void Note::set_just_recorded( bool value ) { __just_recorded = value; } inline bool Note::get_just_recorded() const { return __just_recorded; } inline float Note::get_probability() const { return __probability; } inline void Note::set_probability( float value ) { __probability = value; } inline SelectedLayerInfo* Note::get_layer_selected( int CompoID ) { return __layers_selected[ CompoID ]; } inline void Note::set_humanize_delay( int value ) { __humanize_delay = value; } inline int Note::get_humanize_delay() const { return __humanize_delay; } inline float Note::get_cut_off() const { return __cut_off; } inline float Note::get_resonance() const { return __resonance; } inline float Note::get_bpfb_l() const { return __bpfb_l; } inline float Note::get_bpfb_r() const { return __bpfb_r; } inline float Note::get_lpfb_l() const { return __lpfb_l; } inline float Note::get_lpfb_r() const { return __lpfb_r; } inline Note::Key Note::get_key() { return __key; } inline Note::Octave Note::get_octave() { return __octave; } inline int Note::get_midi_key() const { /* TODO ??? if( !has_instrument() ) { return (__octave + OCTAVE_OFFSET ) * KEYS_PER_OCTAVE + __key; } */ return ( __octave + OCTAVE_OFFSET ) * KEYS_PER_OCTAVE + __key + __instrument->get_midi_out_note() - MIDI_DEFAULT_OFFSET; } inline int Note::get_midi_velocity() const { return __velocity * MIDI_FACTOR; } inline float Note::get_notekey_pitch() const { return __octave * KEYS_PER_OCTAVE + __key; } inline float Note::get_total_pitch() const { return __octave * KEYS_PER_OCTAVE + __key + __pitch; } inline void Note::set_key_octave( Key key, Octave octave ) { if( key>=KEY_MIN && key<=KEY_MAX ) __key = key; if( octave>=OCTAVE_MIN && octave<=OCTAVE_MAX ) __octave = octave; } inline void Note::set_midi_info( Key key, Octave octave, int msg ) { if( key>=KEY_MIN && key<=KEY_MAX ) __key = key; if( octave>=OCTAVE_MIN && octave<=OCTAVE_MAX ) __octave = octave; __midi_msg = msg; } inline bool Note::match( Instrument* instrument, Key key, Octave octave ) const { return ( ( __instrument==instrument ) && ( __key==key ) && ( __octave==octave ) ); } inline void Note::compute_lr_values( float* val_l, float* val_r ) { /* TODO ??? if( !has_instrument() ) { *val_l = 0.0f; *val_r = 0.0f; return; } */ float cut_off = __instrument->get_filter_cutoff(); float resonance = __instrument->get_filter_resonance(); __bpfb_l = resonance * __bpfb_l + cut_off * ( *val_l - __lpfb_l ); __lpfb_l += cut_off * __bpfb_l; __bpfb_r = resonance * __bpfb_r + cut_off * ( *val_r - __lpfb_r ); __lpfb_r += cut_off * __bpfb_r; *val_l = __lpfb_l; *val_r = __lpfb_r; } }; #endif // H2C_NOTE_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/pattern.h000066400000000000000000000243641366722712400241100ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_PATTERN_H #define H2C_PATTERN_H #include #include #include namespace H2Core { class XMLNode; class Instrument; class InstrumentList; class PatternList; /** Pattern class is a Note container */ class Pattern : public H2Core::Object { H2_OBJECT public: ///< multimap note type typedef std::multimap notes_t; ///< multimap note iterator type typedef notes_t::iterator notes_it_t; ///< multimap note const iterator type typedef notes_t::const_iterator notes_cst_it_t; ///< note set type; typedef std::set virtual_patterns_t; ///< note set iterator type; typedef virtual_patterns_t::iterator virtual_patterns_it_t; ///< note set const iterator type; typedef virtual_patterns_t::const_iterator virtual_patterns_cst_it_t; /** * constructor * \param name the name of the pattern * \param info Initialized with an empty string. * \param category the name of the pattern * \param length the length of the pattern */ Pattern( const QString& name="Pattern", const QString& info="", const QString& category="not_categorized", int length=MAX_NOTES ); /** copy constructor */ Pattern( Pattern* other ); /** destructor */ ~Pattern(); /** * load a pattern from a file * \param pattern_path the path to the file to load the pattern from * \param instruments the current instrument list to search instrument into */ static Pattern* load_file( const QString& pattern_path, InstrumentList* instruments ); /** * save a pattern into an xml file * \param drumkit_name the name of the drumkit it is supposed to play with * \param author the name of the author * \param license the license that applies to it * \param pattern_path the path to save the pattern into * \param overwrite allows to write over existing pattern file * \return true on success */ bool save_file( const QString& drumkit_name, const QString& author, const QString& license, const QString& pattern_path, bool overwrite=false ) const; ///< set the name of the pattern void set_name( const QString& name ); ///< get the name of the pattern const QString& get_name() const; ///< set the category of the pattern void set_category( const QString& category ); ///< set the info of the pattern void set_info( const QString& info ); ///< get the info of the pattern const QString& get_info() const; ///< get the category of the pattern const QString& get_category() const; ///< set the length of the pattern void set_length( int length ); ///< get the length of the pattern int get_length() const; ///< get the note multimap const notes_t* get_notes() const; ///< get the virtual pattern set const virtual_patterns_t* get_virtual_patterns() const; ///< get the flattened virtual pattern set const virtual_patterns_t* get_flattened_virtual_patterns() const; /** * insert a new note within __notes * \param note the note to be inserted * \param position if not -1 will be used as std::pair first element, otherwise note position will be used */ void insert_note( Note* note, int position=-1 ); /** * search for a note at a given index within __notes which correspond to the given arguments * \param idx_a the first __notes index to search in * \param idx_b the second __notes index to search in, will be omitted if is -1 * \param instrument the instrument the note should be playing * \param strict if set to false, will search for a note around the given idx * \return the note if found, 0 otherwise */ Note* find_note( int idx_a, int idx_b, Instrument* instrument, bool strict=true ) const; /** * search for a note at a given index within __notes which correspond to the given arguments * \param idx_a the first __notes index to search in * \param idx_b the second __notes index to search in, will be omitted if is -1 * \param instrument the instrument the note should be playing * \param key the key that should be set to the note * \param octave the octave that should be set to the note * \param strict if set to false, will search for a note around the given idx * \return the note if found, 0 otherwise */ Note* find_note( int idx_a, int idx_b, Instrument* instrument, Note::Key key, Note::Octave octave, bool strict=true) const; /** * removes a given note from __notes, it's not deleted * \param note the note to be removed */ void remove_note( Note* note ); /** * check if this pattern contains a note referencing the given instrument * \param instr the instrument */ bool references( Instrument* instr ); /** * delete the notes referencing the given instrument * The function is thread safe (it locks the audio data while deleting notes) * \param instr the instrument */ void purge_instrument( Instrument* instr ); /** * mark all notes as old */ void set_to_old(); ///< return true if __virtual_patterns is empty bool virtual_patterns_empty() const; ///< clear __virtual_patterns void virtual_patterns_clear(); /** * add a pattern to __virtual_patterns * \param pattern the pattern to add */ void virtual_patterns_add( Pattern* pattern ); /** * remove a pattern from virtual_pattern set, flattened virtual patterns have to be rebuilt * */ void virtual_patterns_del( Pattern* pattern ); ///< clear flattened_virtual_patterns void flattened_virtual_patterns_clear(); /** * compute virtual_pattern_transitive_closure_set based on virtual_pattern_transitive_closure_set * virtual_pattern_transitive_closure_set must have been cleared before which is the case is called * from PatternList::compute_flattened_virtual_patterns */ void flattened_virtual_patterns_compute(); /** * add content of __flatteened_virtual_patterns into patterns * \param patterns the pattern list to feed */ void extand_with_flattened_virtual_patterns( PatternList* patterns ); /** * save the pattern within the given XMLNode * \param node the XMLNode to feed * \param instrumentOnly export only the notes of that instrument if given */ void save_to( XMLNode* node, const Instrument* instrumentOnly = nullptr ) const; private: int __length; ///< the length of the pattern QString __name; ///< the name of thepattern QString __category; ///< the category of the pattern QString __info; ///< a description of the pattern notes_t __notes; ///< a multimap (hash with possible multiple values for one key) of note virtual_patterns_t __virtual_patterns; ///< a list of patterns directly referenced by this one virtual_patterns_t __flattened_virtual_patterns; ///< the complete list of virtual patterns /** * load a pattern from an XMLNode * \param node the XMLDode to read from * \param instruments the current instrument list to search instrument into * \return a new Pattern instance */ static Pattern* load_from( XMLNode* node, InstrumentList* instruments ); }; #define FOREACH_NOTE_CST_IT_BEGIN_END(_notes,_it) \ for( Pattern::notes_cst_it_t (_it)=(_notes)->begin(); (_it)!=(_notes)->end(); (_it)++ ) #define FOREACH_NOTE_CST_IT_BOUND(_notes,_it,_bound) \ for( Pattern::notes_cst_it_t (_it)=(_notes)->lower_bound((_bound)); (_it)!=(_notes)->upper_bound((_bound)); (_it)++ ) #define FOREACH_NOTE_IT_BEGIN_END(_notes,_it) \ for( Pattern::notes_it_t (_it)=(_notes)->begin(); (_it)!=(_notes)->end(); (_it)++ ) #define FOREACH_NOTE_IT_BOUND(_notes,_it,_bound) \ for( Pattern::notes_it_t (_it)=(_notes)->lower_bound((_bound)); (_it)!=(_notes)->upper_bound((_bound)); (_it)++ ) // DEFINITIONS inline void Pattern::set_name( const QString& name ) { __name = name; } inline const QString& Pattern::get_name() const { return __name; } inline void Pattern::set_info( const QString& info ) { __info = info; } inline const QString& Pattern::get_info() const { return __info; } inline void Pattern::set_category( const QString& category ) { __category = category; } inline const QString& Pattern::get_category() const { return __category; } inline void Pattern::set_length( int length ) { __length = length; } inline int Pattern::get_length() const { return __length; } inline const Pattern::notes_t* Pattern::get_notes() const { return &__notes; } inline const Pattern::virtual_patterns_t* Pattern::get_virtual_patterns() const { return &__virtual_patterns; } inline const Pattern::virtual_patterns_t* Pattern::get_flattened_virtual_patterns() const { return &__flattened_virtual_patterns; } inline void Pattern::insert_note( Note* note, int position ) { __notes.insert( std::make_pair( ( position==-1 ? note->get_position() : position ), note ) ); } inline bool Pattern::virtual_patterns_empty() const { return __virtual_patterns.empty(); } inline void Pattern::virtual_patterns_clear() { __virtual_patterns.clear(); } inline void Pattern::virtual_patterns_add( Pattern* pattern ) { __virtual_patterns.insert( pattern ); } inline void Pattern::virtual_patterns_del( Pattern* pattern ) { virtual_patterns_cst_it_t it = __virtual_patterns.find( pattern ); if ( it!=__virtual_patterns.end() ) __virtual_patterns.erase( it ); } inline void Pattern::flattened_virtual_patterns_clear() { __flattened_virtual_patterns.clear(); } }; #endif // H2C_PATTERN_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/pattern_list.h000066400000000000000000000105461366722712400251400ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_PATTERN_LIST_H #define H2C_PATTERN_LIST_H #include #include namespace H2Core { class Pattern; /** * PatternList is a collection of patterns */ class PatternList : public H2Core::Object { H2_OBJECT public: /** constructor */ PatternList(); /** destructor */ ~PatternList(); /** * copy constructor * \param other */ PatternList( PatternList* other ); /** returns the numbers of patterns */ int size() const; /** * add a pattern to the list * \param new_pattern a pointer to the pattern to add */ void operator<<( Pattern* new_pattern ); /** * get a pattern from the list * \param idx the index to get the pattern from */ Pattern* operator[]( int idx ); /** * add a pattern to the list * \param pattern a pointer to the pattern to add */ void add( Pattern* pattern ); /** * insert a pattern into the list * \param idx the index to insert the pattern at * \param pattern a pointer to the pattern to add */ void insert( int idx, Pattern* pattern ); /** * get a pattern from the list * \param idx the index to get the pattern from */ Pattern* get( int idx ); const Pattern* get( int idx ) const; /** * remove the pattern at a given index, does not delete it * \param idx the index * \return a pointer to the removed pattern */ Pattern* del( int idx ); /** * remove a pattern from the list, does not delete it * \param pattern the pattern to be removed * \return a pointer to the removed pattern, 0 if not found */ Pattern* del( Pattern* pattern ); /** * get the index of the pattern within the patterns * \param pattern a pointer to the pattern to find * \return -1 if not found */ int index( Pattern* pattern ); /** * replace the pattern at a given index with a new one * \param idx the index * \param pattern the new pattern to insert * \return a pointer to the removed pattern, 0 if index out of bounds */ Pattern* replace( int idx, Pattern* pattern ); /** * empty the pattern list */ void clear(); /** * mark all patterns as old */ void set_to_old(); /** * find a pattern within the patterns * \param name the name of the pattern to find * \return 0 if not found */ Pattern* find( const QString& name ); /** * swap the patterns of two different indexes * \param idx_a the first index * \param idx_b the second index */ void swap( int idx_a, int idx_b ); /** * move a pattern from a position to another * \param idx_a the start index * \param idx_b the finish index */ void move( int idx_a, int idx_b ); /** * call compute_flattened_virtual_patterns on each pattern */ void flattened_virtual_patterns_compute(); /** * call del_virtual_pattern on each pattern * \param pattern the pattern to remove where it's found */ void virtual_pattern_del( Pattern* pattern ); /** * check if a pattern with name patternName already exists in this list * \param patternName name of a pattern to check */ bool check_name( QString patternName ); /** * find unused patternName * \param sourceName base name to start with */ QString find_unused_pattern_name( QString sourceName ); private: std::vector __patterns; ///< the list of patterns }; // DEFINITIONS inline int PatternList::size() const { return __patterns.size(); } inline void PatternList::clear() { __patterns.clear(); } }; #endif // H2C_PATTERN_LIST_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/playlist.h000066400000000000000000000074241366722712400242720ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_PLAYLIST_H #define H2C_PLAYLIST_H #include namespace H2Core { /** * Drumkit info */ class Playlist : public H2Core::Object { H2_OBJECT public: struct Entry { QString filePath; bool fileExists; QString scriptPath; bool scriptEnabled; }; /** * If #__instance equals 0, a new Playlist singleton * will be created and stored in it. * * It is called in Hydrogen::audioEngine_init(). */ static void create_instance(); /** * Returns a pointer to the current Playlist singleton * stored in #__instance. */ static Playlist* get_instance() { assert(__instance); return __instance; } ~Playlist(); void activateSong (int SongNumber ); int size() const; Entry* get( int idx ); void clear(); void add( Entry* entry ); void setNextSongByNumber( int SongNumber ); int getSelectedSongNr(); void setSelectedSongNr( int songNumber ); int getActiveSongNumber(); void setActiveSongNumber( int ActiveSongNumber ); bool getSongFilenameByNumber( int songNumber, QString& fileName); const QString& getFilename(); void setFilename( const QString& filename ); bool getIsModified(); void setIsModified( bool IsModified ); static Playlist* load( const QString& filename, bool useRelativePaths ); static Playlist* load_file( const QString& pl_path, bool useRelativePaths ); bool save_file( const QString& pl_path, const QString& name, bool overwrite, bool useRelativePaths ); private: /** * Object holding the current Playlist singleton. It is * initialized with NULL, set with create_instance(), and * accessed with get_instance(). */ static Playlist* __instance; QString __filename; std::vector __entries; int m_nSelectedSongNumber; int m_nActiveSongNumber; bool m_bIsModified; Playlist(); void execScript( int index ); void save_to( XMLNode* node, bool useRelativePaths ); static Playlist* load_from( XMLNode* root, QFileInfo& fileInfo, bool useRelativePaths ); }; inline int Playlist::size() const { return __entries.size(); } inline Playlist::Entry* Playlist::get( int idx ) { assert( idx >= 0 && idx < size() ); return __entries[ idx ]; } inline void Playlist::add( Entry* entry ) { __entries.push_back( entry ); } inline int Playlist::getSelectedSongNr() { return m_nSelectedSongNumber; } inline void Playlist::setSelectedSongNr( int songNumber ) { m_nSelectedSongNumber = songNumber; } inline int Playlist::getActiveSongNumber() { return m_nActiveSongNumber; } inline void Playlist::setActiveSongNumber( int ActiveSongNumber ) { m_nActiveSongNumber = ActiveSongNumber ; } inline const QString& Playlist::getFilename() { return __filename; } inline void Playlist::setFilename( const QString& filename ) { __filename = filename; } inline bool Playlist::getIsModified() { return m_bIsModified; } inline void Playlist::setIsModified( bool IsModified ) { m_bIsModified = IsModified; } }; #endif // H2C_PLAYLIST_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/sample.h000066400000000000000000000312251366722712400237060ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_SAMPLE_H #define H2C_SAMPLE_H #include #include #include #include namespace H2Core { /** * A container for a sample, being able to apply modifications on it */ /** an envelope point within a frame */ class EnvelopePoint : public H2Core::Object { H2_OBJECT public: int frame; ///< frame index int value; ///< value /** to be able to sort velocity points vectors */ struct Comparator { bool operator()( std::unique_ptr& a, std::unique_ptr& b ) { return a->frame < b->frame; } }; /** default constructor */ EnvelopePoint(); /** * constructor * \param f the frame index * \param v the value associated with the frame */ EnvelopePoint( int f, int v ); /** copy constructor */ EnvelopePoint( EnvelopePoint* other ); }; class Sample : public H2Core::Object { H2_OBJECT public: /** define the type used to store pan envelope points */ using PanEnvelope = std::vector>; /** define the type used to store velocity envelope points */ using VelocityEnvelope = std::vector>; /** set of loop configuration flags */ class Loops { public: /** possible sample editing loop mode */ enum LoopMode { FORWARD=0, REVERSE, PINGPONG }; int start_frame; ///< the frame index where to start the new sample from int loop_frame; ///< the frame index where to start the loop from int end_frame; ///< the frame index where to end the new sample to int count; ///< the counts of loops to apply LoopMode mode; ///< one of the possible loop modes /** constructor */ Loops() : start_frame( 0 ), loop_frame( 0 ), end_frame( 0 ), count( 0 ), mode( FORWARD ) { }; /** copy constructor */ Loops( const Loops* other ) : start_frame( other->start_frame ), loop_frame( other->loop_frame ), end_frame( other->end_frame ), count( other->count ), mode( other->mode ) { }; /** equal to operator */ bool operator ==( const Loops& b ) const { return ( start_frame==b.start_frame && loop_frame==b.loop_frame && end_frame==b.end_frame && count==b.count && mode==b.mode ); } }; /** set of rubberband configuration flags */ class Rubberband { public: bool use; ///< is rubberband enabled float divider; ///< TODO should be ratio : desired time ratio float pitch; ///< desired pitch int c_settings; ///< TODO should be crispness, see rubberband -h /** constructor */ Rubberband() : use( false ), divider ( 1.0 ), pitch( 1.0 ), c_settings( 4 ) { }; /** copy constructor */ Rubberband( const Rubberband* other ) : use( other->use ), divider ( other->divider ), c_settings( other->c_settings ), pitch( other->pitch ) { }; /** equal to operator */ bool operator ==( const Rubberband& b ) const { return ( use==b.use && divider==b.divider && c_settings==b.c_settings && pitch==b.pitch ); } }; /** * Sample constructor * \param filepath the path to the sample * \param frames the number of frames per channel in the sample * \param sample_rate the sample rate of the sample * \param data_l the left channel array of data * \param data_r the right channel array of data */ Sample( const QString& filepath, int frames=0, int sample_rate=0, float* data_l=nullptr, float* data_r=nullptr ); /** copy constructor */ Sample( Sample* other ); /** destructor */ ~Sample(); /** * write sample to a file * \param path the path to write the sample to * \param format the format of the output */ bool write( const QString& path, int format= ( SF_FORMAT_WAV|SF_FORMAT_PCM_16 ) ); /** * Load a sample from a file. * * This function checks whether the @a filepath is * readable, initializes a new Sample, and calls the * load() member on it. * * \param filepath the file to load audio data from * * \return Pointer to the newly initialized Sample. If * the provided @a filepath is not readable, a nullptr * is returned instead. * * \fn load(const QString& filepath) */ static Sample* load( const QString& filepath); /** * Load a sample from a file and apply the * transformations to the sample data. * * Wrapper around #load(const QString& filepath), * which calls apply() with @a loops, @a rubber, @a * velocity, and @a pan as arguments after * successfully loading the sample. * * \param filepath the file to load audio data from * \param loops transformation parameters * \param rubber band transformation parameters * \param velocity envelope points * \param pan envelope points * * \return Pointer to the newly initialized Sample. If * the provided @a filepath is not readable, a nullptr * is returned instead. * * \overload load(const QString& filepath, const Loops& loops, const Rubberband& rubber, const VelocityEnvelope& velocity, const PanEnvelope& pan) */ static Sample* load( const QString& filepath, const Loops& loops, const Rubberband& rubber, const VelocityEnvelope& velocity, const PanEnvelope& pan ); /** * Load the sample stored in #__filepath into * #__data_l and #__data_r. * * It uses libsndfile for reading both the content and * the metadata of the sample file. The latter is * stored in #__frames and #__sample_rate. * * Hydrogen does only support up to #SAMPLE_CHANNELS * (two per default) channels in the audio file. If * there are more, Hydrogen will _NOT_ downmix its * content but simply extract the first two channels * and display a warning message. For mono file the * same content will be assigned to both the left * (#__data_l) and right channel (#__data_r). * * If the total number of frames in the file is larger * than the maximum value of an `int', the content is * truncated and a warning log message will be * displayed. * * \fn load() */ bool load(); /** * Flush the current content of the left and right * channel and the current metadata. */ void unload(); /** * Apply transformations to the sample data. * * The function is a wrapper around a specific apply_* * functions. * * \param loops Loops transformation parameters handed * over to apply_loops(). * \param rubber Rubber Band transformation parameters * handed over to apply_rubberband() in case Hydrogen * was compiled to use the Rubber Band library for * audio time-stretching and pitch-shifting * (#H2CORE_HAVE_RUBBERBAND) or exec_rubberband_cli() * if is wasn't. * \param velocity Velocity envelope points handed * over to apply_velocity(). * \param pan Pan envelope points handed over to * apply_pan(). */ void apply( const Loops& loops, const Rubberband& rubber, const VelocityEnvelope& velocity, const PanEnvelope& pan ); /** * apply loop transformation to the sample * \param lo loops parameters */ bool apply_loops( const Loops& lo ); /** * apply velocity transformation to the sample * \param v the velocity vector */ void apply_velocity( const VelocityEnvelope& v ); /** * apply velocity transformation to the sample * \param p the pan vector */ void apply_pan( const PanEnvelope& p ); /** * apply rubberband transformation to the sample * \param rb rubberband parameters */ void apply_rubberband( const Rubberband& rb ); /** * call rubberband cli to modify the sample * \param rb rubberband parameters */ bool exec_rubberband_cli( const Rubberband& rb ); /** \return true if both data channels are null pointers */ bool is_empty() const; /** \return #__filepath */ const QString get_filepath() const; /** \return Filename part of #__filepath */ const QString get_filename() const; /** \param filename Filename part of #__filepath*/ void set_filename( const QString& filename ); /** * #__frames setter * \param value the new value for #__frames */ void set_frames( int value ); /** \return #__frames accessor */ int get_frames() const; /** * \param sampleRate Sets #__sample_rate. */ void set_sample_rate( const int sampleRate ); /** \return #__sample_rate */ int get_sample_rate() const; /** \return sample duration in seconds */ double get_sample_duration( ) const; /** \return data size, which is calculated by * #__frames time sizeof( float ) * 2 */ int get_size() const; /** \return #__data_l*/ float* get_data_l() const; /** \return #__data_r*/ float* get_data_r() const; /** * #__is_modified setter * \param value the new value for #__is_modified */ void set_is_modified( bool value ); /** \return #__is_modified */ bool get_is_modified() const; /** \return #__pan_envelope */ PanEnvelope* get_pan_envelope(); /** \return #__velocity_envelope */ VelocityEnvelope* get_velocity_envelope(); /** \return #__loops parameters */ Loops get_loops() const; /** \return #__rubberband parameters */ Rubberband get_rubberband() const; /** * parse the given string and rturn the corresponding loop_mode * \param string the loop mode text to be parsed */ static Loops::LoopMode parse_loop_mode( const QString& string ); /** \return mode member of #__loops as a string */ QString get_loop_mode_string() const; private: QString __filepath; ///< filepath of the sample int __frames; ///< number of frames in this sample int __sample_rate; ///< samplerate for this sample float* __data_l; ///< left channel data float* __data_r; ///< right channel data bool __is_modified; ///< true if sample is modified PanEnvelope __pan_envelope; ///< pan envelope vector VelocityEnvelope __velocity_envelope; ///< velocity envelope vector Loops __loops; ///< set of loop parameters Rubberband __rubberband; ///< set of rubberband parameters /** loop modes string */ static const char* __loop_modes[]; }; // DEFINITIONS inline void Sample::unload() { if( __data_l ) delete [] __data_l; if( __data_r ) delete [] __data_r; __frames = __sample_rate = 0; /** #__is_modified = false; leave this unchanged as pan, velocity, loop and rubberband are kept unchanged */ __data_l = __data_r = nullptr; } inline bool Sample::is_empty() const { return ( __data_l==__data_r==0 ); } inline const QString Sample::get_filepath() const { return __filepath; } inline const QString Sample::get_filename() const { return __filepath.section( "/", -1 ); } inline void Sample::Sample::set_frames( int frames ) { __frames = frames; } inline int Sample::get_frames() const { return __frames; } inline int Sample::get_sample_rate() const { return __sample_rate; } inline void Sample::set_sample_rate( const int sampleRate ) { __sample_rate = sampleRate; } inline double Sample::get_sample_duration() const { return ( double )__frames / ( double )__sample_rate; } inline int Sample::get_size() const { return __frames * sizeof( float ) * 2; } inline float* Sample::get_data_l() const { return __data_l; } inline float* Sample::get_data_r() const { return __data_r; } inline void Sample::set_is_modified( bool is_modified ) { __is_modified = is_modified; } inline bool Sample::get_is_modified() const { return __is_modified; } inline QString Sample::get_loop_mode_string() const { return __loop_modes[__loops.mode]; } inline Sample::PanEnvelope* Sample::get_pan_envelope() { return &__pan_envelope; } inline Sample::VelocityEnvelope* Sample::get_velocity_envelope() { return &__velocity_envelope; } inline Sample::Loops Sample::get_loops() const { return __loops; } inline Sample::Rubberband Sample::get_rubberband() const { return __rubberband; } }; #endif // H2C_SAMPLE_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/basics/song.h000066400000000000000000000247701366722712400234020ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_H #define SONG_H #include #include #include #include #include class TiXmlNode; namespace H2Core { class ADSR; class Sample; class Note; class Instrument; class InstrumentList; class Pattern; class Song; class DrumkitComponent; class PatternList; class AutomationPath; /** \ingroup H2CORE \brief Song class */ class Song : public H2Core::Object { H2_OBJECT public: enum SongMode { PATTERN_MODE, SONG_MODE }; bool __is_muted; unsigned __resolution; ///< Resolution of the song (number of ticks per quarter) /** * Current speed in beats per minutes. * * One of its purposes is an intermediate storage of the * tempo at the current transport position in * Hydrogen::setTimelineBpm() in order to detect local changes * in speed (set by the user). */ float __bpm; QString __name; ///< song name QString __author; ///< author of the song static Song* get_empty_song(); static Song* get_default_song(); Song( const QString& name, const QString& author, float bpm, float volume ); ~Song(); /** Remove all the notes in the song that play on instrument I. The function is real-time safe (it locks the audio data while deleting notes) */ void purge_instrument( Instrument* I ); void set_volume( float volume ) { __volume = volume; } float get_volume() const { return __volume; } void set_metronome_volume( float volume ) { __metronome_volume = volume; } float get_metronome_volume() const { return __metronome_volume; } PatternList* get_pattern_list() const { return __pattern_list; } void set_pattern_list( PatternList* pattern_list ) { __pattern_list = pattern_list; } /** Return a pointer to a vector storing all Pattern * present in the Song. * \return #__pattern_group_sequence */ std::vector* get_pattern_group_vector() { return __pattern_group_sequence; } /** Return a pointer to a vector storing all Pattern * present in the Song. * \return #__pattern_group_sequence */ const std::vector* get_pattern_group_vector() const { return __pattern_group_sequence; } /** Sets the vector storing all Pattern present in the * Song #__pattern_group_sequence. * \param vect Pointer to a vector containing all * Pattern of the Song.*/ void set_pattern_group_vector( std::vector* vect ) { __pattern_group_sequence = vect; } static Song* load( const QString& sFilename ); bool save( const QString& sFilename ); InstrumentList* get_instrument_list() const; void set_instrument_list( InstrumentList* list ); void set_notes( const QString& notes ); const QString& get_notes(); void set_license( const QString& license ); const QString& get_license(); const QString& get_author(); const QString& get_filename(); void set_filename( const QString& filename ); bool is_loop_enabled() const; void set_loop_enabled( bool enabled ); float get_humanize_time_value() const; void set_humanize_time_value( float value ); float get_humanize_velocity_value() const; void set_humanize_velocity_value( float value ); float get_swing_factor() const; void set_swing_factor( float factor ); SongMode get_mode() const; void set_mode( SongMode mode ); void set_is_modified(bool is_modified); bool get_is_modified() const; std::vector* get_components() const; AutomationPath * get_velocity_automation_path() const; DrumkitComponent* get_component( int ID ); void readTempPatternList( const QString& filename ); bool writeTempPatternList( const QString& filename ); QString copyInstrumentLineToString( int selectedPattern, int selectedInstrument ); bool pasteInstrumentLineFromString( const QString& serialized, int selectedPattern, int selectedInstrument, std::list& patterns ); int get_latest_round_robin( float start_velocity ); void set_latest_round_robin( float start_velocity, int latest_round_robin ); /** \return #__playback_track_filename */ QString& get_playback_track_filename(); /** \param filename Sets #__playback_track_filename. */ void set_playback_track_filename( const QString filename ); /** \return #__playback_track_enabled */ bool get_playback_track_enabled() const; /** Specifies whether a playback track should be used. * * If #__playback_track_filename is set to nullptr, * #__playback_track_enabled will be set to false * regardless of the choice in @a enabled. * * \param enabled Sets #__playback_track_enabled. */ bool set_playback_track_enabled( const bool enabled ); /** \return #__playback_track_volume */ float get_playback_track_volume() const; /** \param volume Sets #__playback_track_volume. */ void set_playback_track_volume( const float volume ); private: ///< volume of the song (0.0..1.0) float __volume; ///< Metronome volume float __metronome_volume; QString __notes; ///< Pattern list PatternList* __pattern_list; ///< Sequence of pattern groups std::vector* __pattern_group_sequence; ///< Instrument list InstrumentList* __instrument_list; ///< list of drumkit component std::vector* __components; QString __filename; bool __is_loop_enabled; float __humanize_time_value; float __humanize_velocity_value; float __swing_factor; bool __is_modified; std::map< float, int> __latest_round_robins; SongMode __song_mode; /** Name of the file to be loaded as playback track. * * It is set by set_playback_track_filename() and * queried by get_playback_track_filename(). * * The playback track itself is loaded in * Sampler::reinitialize_playback_track(). */ QString __playback_track_filename; /** Whether the playback track should be used at all. * * It is set by set_playback_track_enabled() and * queried by get_playback_track_enabled(). * * The playback track itself is loaded in * Sampler::reinitialize_playback_track(). */ bool __playback_track_enabled; /** Volume of the playback track. * * It is set by set_playback_track_volume() and * queried by get_playback_track_volume(). * * The playback track itself is loaded in * Sampler::reinitialize_playback_track(). */ float __playback_track_volume; AutomationPath* __velocity_automation_path; ///< license of the song QString __license; }; inline bool Song::get_is_modified() const { return __is_modified; } inline InstrumentList* Song::get_instrument_list() const { return __instrument_list; } inline void Song::set_instrument_list( InstrumentList* list ) { __instrument_list = list; } inline void Song::set_notes( const QString& notes ) { __notes = notes; } inline const QString& Song::get_notes() { return __notes; } inline void Song::set_license( const QString& license ) { __license = license; } inline const QString& Song::get_license() { return __license; } inline const QString& Song::get_author() { return __author; } inline const QString& Song::get_filename() { return __filename; } inline void Song::set_filename( const QString& filename ) { __filename = filename; } inline bool Song::is_loop_enabled() const { return __is_loop_enabled; } inline void Song::set_loop_enabled( bool enabled ) { __is_loop_enabled = enabled; } inline float Song::get_humanize_time_value() const { return __humanize_time_value; } inline void Song::set_humanize_time_value( float value ) { __humanize_time_value = value; } inline float Song::get_humanize_velocity_value() const { return __humanize_velocity_value; } inline void Song::set_humanize_velocity_value( float value ) { __humanize_velocity_value = value; } inline float Song::get_swing_factor() const { return __swing_factor; } inline Song::SongMode Song::get_mode() const { return __song_mode; } inline void Song::set_mode( Song::SongMode mode ) { __song_mode = mode; } inline std::vector* Song::get_components() const { return __components; } inline AutomationPath * Song::get_velocity_automation_path() const { return __velocity_automation_path; } inline int Song::get_latest_round_robin( float start_velocity ) { if ( __latest_round_robins.find(start_velocity) == __latest_round_robins.end() ) return 0; else return __latest_round_robins[start_velocity]; } inline void Song::set_latest_round_robin( float start_velocity, int latest_round_robin ) { __latest_round_robins[start_velocity] = latest_round_robin; } inline QString& Song::get_playback_track_filename() { return __playback_track_filename; } inline void Song::set_playback_track_filename( const QString filename ) { __playback_track_filename = filename; } inline bool Song::get_playback_track_enabled() const { return __playback_track_enabled; } inline bool Song::set_playback_track_enabled( const bool enabled ) { if ( __playback_track_filename == nullptr ) { return false; } __playback_track_enabled = enabled; return enabled; } inline float Song::get_playback_track_volume() const { return __playback_track_volume; } inline void Song::set_playback_track_volume( const float volume ) { __playback_track_volume = volume; } /** \ingroup H2CORE \brief Read XML file of a song */ class SongReader : public H2Core::Object { H2_OBJECT public: SongReader(); ~SongReader(); const QString getPath( const QString& filename ); Song* readSong( const QString& filename ); private: QString m_sSongVersion; /// Dato un XmlNode restituisce un oggetto Pattern Pattern* getPattern( QDomNode pattern, InstrumentList* instrList ); }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/config.dox000066400000000000000000000113031366722712400227640ustar00rootroot00000000000000/*! \file config.h.in * Documentation for the macros defined in the config.h.in file (which is not properly read by Doxygen). */ /** * Beginning clause of Qt's namespace wrapper and counterpart of * #QT_END_NAMESPACE. */ #define QT_BEGIN_NAMESPACE /** * Ending clause of Qt's namespace wrapper and counterpart of * #QT_BEGIN_NAMESPACE. */ #define QT_END_NAMESPACE /** * Path of the configuration files of Hydrogen in the user home. Set * by __cmake__ ".hydrogen". */ #define H2_USR_PATH "@H2_USR_PATH@" /** * Path of the configuration files of Hydrogen in the system. Set by * __cmake__ a concatenation of #CONFIG_PREFIX and "/share/hydrogen". */ #define H2_SYS_PATH "@H2_SYS_PATH@" /** * Prefix of the directory Hydrogen will be installed into. Set by * __cmake__ to * - "/usr/local" : on Linux * - "/usr" : on Mac * - "c:/Program Files" : on Windows */ #define CONFIG_PREFIX "@CMAKE_INSTALL_PREFIX@" /** * Will contain the current major version number of Hydrogen and is * set by __cmake__. */ #define H2CORE_VERSION_MAJOR @VERSION_MAJOR@ /** * Will contain the current minor version number of Hydrogen and is * set by __cmake__. */ #define H2CORE_VERSION_MINOR @VERSION_MINOR@ /** * Will contain the current patch version number of Hydrogen and is * set by __cmake__. */ #define H2CORE_VERSION_PATCH @VERSION_PATCH@ /** * Will contain the current git revision version number suffix of * Hydrogen and is set by __cmake__. */ #define H2CORE_GIT_REVISION @GIT_REVISION@ /** * A concatenation of #H2CORE_VERSION_MAJOR, #H2CORE_VERSION_MINOR, * #H2CORE_VERSION_PATCH, and #H2CORE_GIT_REVISION. */ #define H2CORE_VERSION "@DISPLAY_VERSION@" /** \def MAX_INSTRUMENTS * Maximum number of instruments allowed in Hydrogen. Set by __cmake__ * to 1000 (currently). */ #define MAX_INSTRUMENTS @MAX_INSTRUMENTS@ /** \def MAX_COMPONENTS * Maximum number of components each Instrument is allowed to * have. Set by __cmake__ to 32 (currently). */ #define MAX_COMPONENTS @MAX_COMPONENTS@ /** * Maximum number of notes. Set by __cmake__ to 192 (currently). */ #define MAX_NOTES @MAX_NOTES@ /** * Maximum number of effects. Set by __cmake__ to 4 (currently). */ #define MAX_FX @MAX_FX@ /** * Maximum buffer size. Set by __cmake__ to 8192 (currently). */ #define MAX_BUFFER_SIZE @MAX_BUFFER_SIZE@ /** * Check whether _sscanf.c_ is present. */ #define HAVE_SSCANF /** * Check whether the realtime clock _rtclock.c_ is present. */ #define HAVE_RTCLOCK /** * Check whether a library called _jack_port_rename_ is present. */ #define HAVE_JACK_PORT_RENAME /** Checks whether the user enabled debugging. Default: TRUE */ #define H2CORE_HAVE_DEBUG /** Whether a Max OSC bundle application should be generated. Default (on Apple): TRUE. */ #define H2CORE_HAVE_BUNDLE /** Specifies whether the sndfile.h header could be found in the sndfile library. */ #define H2CORE_HAVE_LIBSNDFILE /** Specifies whether the archive.h header could be found in the archive library. */ #define H2CORE_HAVE_LIBARCHIVE /** Specifies whether the sys/soundcard.h header could be found in the ossaudio (on NetBSD) or OSSlib library (else). */ #define H2CORE_HAVE_OSS /** Specifies whether the alsa/asoundlib.h header could be found in the alsa library. */ #define H2CORE_HAVE_ALSA /** Specifies whether the jack/jack.h header could be found in the jack library. */ #define H2CORE_HAVE_JACK /** Specifies whether the lash/lash.h header could be found in the lash library. */ #define H2CORE_HAVE_LASH /** Specifies whether the jack/session.h header could be found in the jack library. */ #define H2CORE_HAVE_JACKSESSION /** Specifies whether the lo/lo.h header could be found in the lo library. */ #define H2CORE_HAVE_OSC /** Specifies whether the portaudio.h header could be found in the portaudio-2.0 library. */ #define H2CORE_HAVE_PORTAUDIO /** Specifies whether the portmidi.h header could be found in the portmidi library. */ #define H2CORE_HAVE_PORTMIDI /** Specifies whether the coreaudio.h header could be found in the coreaudio library (Apple only). */ #define H2CORE_HAVE_COREAUDIO /** Specifies whether the coremidi.h header could be found in the coremidi library (Apple only). */ #define H2CORE_HAVE_COREMIDI /** Specifies whether the pulse/pulseaudio.h header could be found in the pulse library. */ #define H2CORE_HAVE_PULSEAUDIO /** Specifies whether the lrdf.h header could be found in the lrdf library. */ #define H2CORE_HAVE_LRDF /** Specifies whether the ladspa.h header could be found in the noise library. */ #define H2CORE_HAVE_LADSPA /** Specifies whether the rubberband/RubberBandStretcher.h header could be found in the rubberband library. */ #define H2CORE_HAVE_RUBBERBAND hydrogen-1.0.0-rc1/src/core/include/hydrogen/config.h.in000066400000000000000000000037741366722712400230430ustar00rootroot00000000000000#ifndef HYD_CONFIG_H #define HYD_CONFIG_H #include #ifndef QT_BEGIN_NAMESPACE # define QT_BEGIN_NAMESPACE #endif #ifndef QT_END_NAMESPACE # define QT_END_NAMESPACE #endif #define H2_USR_PATH "@H2_USR_PATH@" #define H2_SYS_PATH "@H2_SYS_PATH@" #define CONFIG_PREFIX "@CMAKE_INSTALL_PREFIX@" #define H2CORE_VERSION_MAJOR @VERSION_MAJOR@ #define H2CORE_VERSION_MINOR @VERSION_MINOR@ #define H2CORE_VERSION_PATCH @VERSION_PATCH@ #define H2CORE_GIT_REVISION @GIT_REVISION@ #define H2CORE_VERSION "@DISPLAY_VERSION@" #define MAX_INSTRUMENTS @MAX_INSTRUMENTS@ #define MAX_COMPONENTS @MAX_COMPONENTS@ #define MAX_NOTES @MAX_NOTES@ #define MAX_FX @MAX_FX@ #define MAX_BUFFER_SIZE @MAX_BUFFER_SIZE@ #cmakedefine HAVE_SSCANF #cmakedefine HAVE_RTCLOCK #cmakedefine HAVE_JACK_PORT_RENAME #ifndef H2CORE_HAVE_DEBUG #cmakedefine H2CORE_HAVE_DEBUG #endif #ifndef H2CORE_HAVE_BUNDLE #cmakedefine H2CORE_HAVE_BUNDLE #endif #ifndef H2CORE_HAVE_LIBSNDFILE #cmakedefine H2CORE_HAVE_LIBSNDFILE #endif #ifndef H2CORE_HAVE_LIBARCHIVE #cmakedefine H2CORE_HAVE_LIBARCHIVE #endif #ifndef H2CORE_HAVE_OSS #cmakedefine H2CORE_HAVE_OSS #endif #ifndef H2CORE_HAVE_ALSA #cmakedefine H2CORE_HAVE_ALSA #endif #ifndef H2CORE_HAVE_JACK #cmakedefine H2CORE_HAVE_JACK #endif #ifndef H2CORE_HAVE_LASH #cmakedefine H2CORE_HAVE_LASH #endif #ifndef H2CORE_HAVE_JACKSESSION #cmakedefine H2CORE_HAVE_JACKSESSION #endif #ifndef H2CORE_HAVE_OSC #cmakedefine H2CORE_HAVE_OSC #endif #ifndef H2CORE_HAVE_PORTAUDIO #cmakedefine H2CORE_HAVE_PORTAUDIO #endif #ifndef H2CORE_HAVE_PORTMIDI #cmakedefine H2CORE_HAVE_PORTMIDI #endif #ifndef H2CORE_HAVE_COREAUDIO #cmakedefine H2CORE_HAVE_COREAUDIO #endif #ifndef H2CORE_HAVE_COREMIDI #cmakedefine H2CORE_HAVE_COREMIDI #endif #ifndef H2CORE_HAVE_PULSEAUDIO #cmakedefine H2CORE_HAVE_PULSEAUDIO #endif #ifndef H2CORE_HAVE_LRDF #cmakedefine H2CORE_HAVE_LRDF #endif #ifndef H2CORE_HAVE_LADSPA #cmakedefine H2CORE_HAVE_LADSPA #endif #ifndef H2CORE_HAVE_RUBBERBAND #cmakedefine H2CORE_HAVE_RUBBERBAND #endif #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/core_action_controller.h000066400000000000000000000104101366722712400257020ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2017 by Sebastian Moors * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 CORE_ACTION_CONTROLLER_H #define CORE_ACTION_CONTROLLER_H #include namespace H2Core { class CoreActionController : public H2Core::Object { H2_OBJECT public: CoreActionController(); ~CoreActionController(); void setMasterVolume( float masterVolumeValue ); void setStripVolume( int nStrip, float masterVolumeValue ); void setStripPan( int nStrip, float panValue ); void setMetronomeIsActive( bool isActive ); void setMasterIsMuted( bool isMuted ); void setStripIsMuted( int nStrip, bool isMuted ); void setStripIsSoloed( int nStrip, bool isSoloed ); void initExternalControlInterfaces(); void handleOutgoingControlChange( int param, int value); // ----------------------------------------------------------- // Actions required for session management. /** * Create an empty #Song, which will be stored in @a songPath. * * This will be done immediately and without saving * the current #Song. All unsaved changes will be lost! In * addition, the new song won't be saved by this function. You * can do so using saveSong(). * * The intended use of this function for session * management. Therefore, the function will *not* store the * provided @a songPath in Preferences::m_lastSongFilename and * Hydrogen won't resume with the corresponding song on * restarting. * * \param songPath Absolute path to the .h2song file to be * opened. * \return true on success */ bool newSong( const QString& songPath ); /** * Opens the #Song specified in @a songPath. * * This will be done immediately and without saving * the current #Song. All unsaved changes will be lost! * * The intended use of this function for session * management. Therefore, the function will *not* store the * provided @a songPath in Preferences::m_lastSongFilename and * Hydrogen won't resume with the corresponding song on * restarting. * * \param songPath Absolute path to the .h2song file to be * opened. * \return true on success */ bool openSong( const QString& songPath ); /** * Saves the current #Song. * * \return true on success */ bool saveSong(); /** * Saves the current #Song to the path provided in @a songPath. * * The intended use of this function for session * management. Therefore, the function will *not* store the * provided @a songPath in Preferences::m_lastSongFilename and * Hydrogen won't resume with the corresponding song on * restarting. * * \param songPath Absolute path to the file to store the * current #Song in. * \return true on success */ bool saveSongAs( const QString& songPath ); /** * Triggers the shutdown of Hydrogen. * * This will be done immediately and without saving the * current #Song. All unsaved changes will be lost! * * The shutdown will be triggered in both the CLI and the GUI * via the #H2Core::EVENT_QUIT event. * * \return true on success */ bool quit(); // ----------------------------------------------------------- // Helper functions /** * Checks the path of the .h2song provided via OSC. * * It will be checked whether @a songPath * - is absolute * - has the '.h2song' suffix * - is writable (if it exists) * * \param songPath Absolute path to an .h2song file. * \return true - if valid. */ bool isSongPathValid( const QString& songPath ); private: const int m_nDefaultMidiFeedbackChannel; }; } #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/event_queue.h000066400000000000000000000212261366722712400235060ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 EVENT_QUEUE_H #define EVENT_QUEUE_H #include #include #include /** Maximum number of events to be stored in the H2Core::EventQueue::__events_buffer.*/ #define MAX_EVENTS 1024 namespace H2Core { /** Basic types of communication between the core part of Hydrogen and its GUI.*/ enum EventType { /** Fallback event*/ EVENT_NONE, EVENT_STATE, /** The current pattern changed during the processing of the * AudioEngine with respect to the previous process cycle. * * It is handled by EventListener::patternChangedEvent(). */ EVENT_PATTERN_CHANGED, EVENT_PATTERN_MODIFIED, /** Another pattern was selected via MIDI or the GUI without * affecting the audio transport (e.g in Song::PATTERN_MODE when * Preferences::m_bPatternModePlaysSelected is set to true). While * the selection in the former case already happens in the GUI, * this event will be used to tell it the selection was successful * and had been done. * * Handled by EventListener::selectedPatternChangedEvent(). */ EVENT_SELECTED_PATTERN_CHANGED, EVENT_SELECTED_INSTRUMENT_CHANGED, EVENT_PARAMETERS_INSTRUMENT_CHANGED, EVENT_MIDI_ACTIVITY, EVENT_XRUN, EVENT_NOTEON, EVENT_ERROR, /** Event indicating the triggering of the * #m_pMetronomeInstrument. * * In audioEngine_updateNoteQueue() the pushing of this Event is * decoupled from the creation and queuing of the corresponding * Note itself. * * In Director it triggers a change in the displayed number, * color, tag, and triggers Director::update(). In case the * provided value is 3, instead of performing the changes above, * the Director loads the metadata a the current Song. * * The associated values do correspond to the following actions: * - 0: Beat at the beginning of a Pattern in * audioEngine_updateNoteQueue(). The corresponding Note will * be created with a pitch of 3 and velocity of 1.0. * Sets MetronomeWidget::m_state to * MetronomeWidget::METRO_ON and triggers * MetronomeWidget::updateWidget(). * - 1: Beat in the remainder of a Pattern in * audioEngine_updateNoteQueue(). The corresponding Note will * be created with a pitch of 0 and velocity of 0.8. In * addition, it will be also pushed by * Hydrogen::setPatternPos() without creating a Note. * Sets MetronomeWidget::m_state to * MetronomeWidget::METRO_FIRST and triggers * MetronomeWidget::updateWidget(). * - 2: Signals MetronomeWidget to neither update nor setting * MetronomeWidget::m_state. * - 3: Tells the Director that a new Song was loaded and triggers * its Director::update(). * Sets MetronomeWidget::m_state to * MetronomeWidget::METRO_ON and triggers * MetronomeWidget::updateWidget(). * * Handled by EventListener::metronomeEvent(). */ EVENT_METRONOME, EVENT_RECALCULATERUBBERBAND, EVENT_PROGRESS, EVENT_JACK_SESSION, EVENT_PLAYLIST_LOADSONG, EVENT_UNDO_REDO, EVENT_SONG_MODIFIED, EVENT_TEMPO_CHANGED, /** * Event triggering HydrogenApp::updateSongEvent() whenever the * Song was changed outside of the GUI, e.g. by session management * or and OSC command. * * If the value of the event is * - 0 - Hydrogen::m_pNextSong will be loaded. * - 1 - triggered whenever the #Song was saved via the core part * (updated the title and status bar). */ EVENT_UPDATE_SONG, /** * Triggering HydrogenApp::quitEvent() and enables a shutdown of * the entire application via the command line. */ EVENT_QUIT }; /** Basic building block for the communication between the core of * Hydrogen and its GUI. The individual Events will be enlisted in * the EventQueue singleton.*/ class Event { public: /** Specifies the context the event is create in and which function should be triggered to handle it.*/ EventType type; /** Additional information to describe the actual context of the engine.*/ int value; }; /** Object handling the communication between the core of Hydrogen and * its GUI. * * Whenever a specific condition is met or occasion happens within the * core part of Hydrogen (its engine), an Event will be added to the * EventQueue singleton. The GUI checks the content of this queue on a * regular basis using HydrogenApp::onEventQueueTimer(). The actual * frequency is set in the constructor HydrogenApp::HydrogenApp() to * 20 times per second. Now, whenever an Event of a certain EventType * is encountered, the corresponding function in the EventListener * will be invoked to respond to the condition of the engine. For * details about the mapping of EventTypes to functions please see the * documentation of HydrogenApp::onEventQueueTimer().*/ class EventQueue : public H2Core::Object { H2_OBJECT public:/** * If #__instance equals 0, a new EventQueue singleton will be * created and stored in it. * * It is called in Hydrogen::create_instance(). */ static void create_instance(); /** * Returns a pointer to the current EventQueue singleton * stored in #__instance. */ static EventQueue* get_instance() { assert(__instance); return __instance; } ~EventQueue(); /** * Queues the next event into the EventQueue. * * The event itself will be constructed inside the function * and will be two properties: an EventType @a type and a * value @a nValue. Since the event written to the queue most * recently is indexed with #__write_index, this variable is * incremented once and its modulo with respect to #MAX_EVENTS * is calculated to determine the position of insertion into * #__events_buffer. * * The modulo operation is necessary because #__write_index * will be only incremented and does not respect the actual * length of #__events_buffer itself. * * \param type Type of the event, which will be queued. * \param nValue Value specifying the content of the new event. */ void push_event( const EventType type, const int nValue ); /** * Reads out the next event of the EventQueue. * * Since the event read out most recently is indexed with * #__read_index, this variable is incremented once and its * modulo with respect to #MAX_EVENTS is calculated to * determine the event returned from #__events_buffer. * * The modulo operation is necessary because #__read_index * will be only incremented and does not respect the actual * length of #__events_buffer itself. * * \return Next event in line. */ Event pop_event(); struct AddMidiNoteVector { int m_column; //position int m_row; //instrument row int m_pattern; // pattern number int m_length; float f_velocity; float f_pan_L; float f_pan_R; Note::Key nk_noteKeyVal; Note::Octave no_octaveKeyVal; bool b_isMidi; bool b_isInstrumentMode; bool b_noteExist; }; std::vector m_addMidiNoteVector; private: /** * Constructor of the EventQueue class. * * It fills all #MAX_EVENTS slots of the #__events_buffer with * #H2Core::EVENT_NONE and assigns itself to #__instance. Called by * create_instance(). */ EventQueue(); /** * Object holding the current EventQueue singleton. It is * initialized with nullptr, set in EventQueue(), and * accessed via get_instance(). */ static EventQueue *__instance; /** * Continuously growing number indexing the event, which has * been read from the EventQueue most recently. * * It is incremented with each call to pop_event(). */ unsigned int __read_index; /** * Continuously growing number indexing the event, which has * been written to the EventQueue most recently. * * It is incremented with each call to push_event(). */ unsigned int __write_index; /** * Array of all events contained in the EventQueue. * * Its length is set to #MAX_EVENTS and it gets initialized * with #H2Core::EVENT_NONE in EventQueue(). */ Event __events_buffer[ MAX_EVENTS ]; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/fx/000077500000000000000000000000001366722712400214225ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/fx/Effects.h000066400000000000000000000043621366722712400231570ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 EFFECTS_H #define EFFECTS_H #include "hydrogen/config.h" #if defined(H2CORE_HAVE_LADSPA) || _DOXYGEN_ #include #include #include #include #include namespace H2Core { class Effects : public H2Core::Object { H2_OBJECT public: /** * If #__instance equals 0, a new Effects * singleton will be created and stored in it. * * It is called in Hydrogen::audioEngine_init(). */ static void create_instance(); /** * Returns a pointer to the current Effects singleton * stored in #__instance. */ static Effects* get_instance() { assert(__instance); return __instance; } ~Effects(); LadspaFX* getLadspaFX( int nFX ); void setLadspaFX( LadspaFX* pFX, int nFX ); std::vector getPluginList(); LadspaFXGroup* getLadspaFXGroup(); private: /** * Object holding the current Effects singleton. It is * initialized with NULL, set with create_instance(), and * accessed with get_instance(). */ static Effects* __instance; std::vector m_pluginList; LadspaFXGroup* m_pRootGroup; LadspaFXGroup* m_pRecentGroup; void updateRecentGroup(); LadspaFX* m_FXList[ MAX_FX ]; Effects(); void RDFDescend( const QString& sBase, LadspaFXGroup *pGroup, std::vector pluginList ); void getRDF( LadspaFXGroup *pGroup, std::vector pluginList ); }; }; #endif #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/fx/LadspaFX.h000066400000000000000000000102011366722712400232270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LADSPA_FX_H #define LADSPA_FX_H #include "hydrogen/config.h" #if defined(H2CORE_HAVE_LADSPA) || _DOXYGEN_ #include #include #include #include "ladspa.h" #include namespace H2Core { class LadspaFXInfo : public H2Core::Object { H2_OBJECT public: LadspaFXInfo( const QString& sName ); ~LadspaFXInfo(); QString m_sFilename; ///< plugin filename QString m_sID; QString m_sLabel; QString m_sName; QString m_sMaker; QString m_sCopyright; unsigned m_nICPorts; ///< input control port unsigned m_nOCPorts; ///< output control port unsigned m_nIAPorts; ///< input audio port unsigned m_nOAPorts; ///< output audio port static bool alphabeticOrder( LadspaFXInfo* a, LadspaFXInfo* b ); }; class LadspaFXGroup : public H2Core::Object { H2_OBJECT public: LadspaFXGroup( const QString& sName ); ~LadspaFXGroup(); const QString& getName() { return m_sName; } void addLadspaInfo( LadspaFXInfo *pInfo ); std::vector getLadspaInfo() { return m_ladspaList; } void addChild( LadspaFXGroup *pChild ); std::vector getChildList() { return m_childGroups; } void clear() { m_childGroups.clear(); m_ladspaList.clear(); } static bool alphabeticOrder( LadspaFXGroup*, LadspaFXGroup* ); void sort(); private: QString m_sName; std::vector m_ladspaList; std::vector m_childGroups; }; class LadspaControlPort : public H2Core::Object { H2_OBJECT public: QString sName; bool isToggle; bool m_bIsInteger; LADSPA_Data fDefaultValue; LADSPA_Data fControlValue; LADSPA_Data fLowerBound; LADSPA_Data fUpperBound; LadspaControlPort() : Object( "LadspaControlPort" ) { } }; class LadspaFX : public H2Core::Object { H2_OBJECT public: enum { MONO_FX, STEREO_FX, UNDEFINED }; //unsigned m_nBufferSize; float* m_pBuffer_L; float* m_pBuffer_R; std::vector inputControlPorts; std::vector outputControlPorts; ~LadspaFX(); void connectAudioPorts( float* pIn_L, float* pIn_R, float* pOut_L, float* pOut_R ); void activate(); void deactivate(); void processFX( unsigned nFrames ); const QString& getPluginLabel() { return m_sLabel; } const QString& getPluginName() { return m_sName; } void setPluginName( const QString& sName ) { m_sName = sName; } const QString& getLibraryPath() { return m_sLibraryPath; } bool isEnabled() { return m_bEnabled; } void setEnabled( bool value ) { m_bEnabled = value; } static LadspaFX* load( const QString& sLibraryPath, const QString& sPluginLabel, long nSampleRate ); int getPluginType() { return m_pluginType; } void setVolume( float fValue ); float getVolume() { return m_fVolume; } private: bool m_pluginType; bool m_bEnabled; bool m_bActivated; // Guard against plugins that can't be deactivated before being activated ( QString m_sLabel; QString m_sName; QString m_sLibraryPath; QLibrary *m_pLibrary; const LADSPA_Descriptor * m_d; LADSPA_Handle m_handle; float m_fVolume; unsigned m_nICPorts; ///< input control port unsigned m_nOCPorts; ///< output control port unsigned m_nIAPorts; ///< input audio port unsigned m_nOAPorts; ///< output audio port LadspaFX( const QString& sLibraryPath, const QString& sPluginLabel ); }; }; #endif #endif // H2CORE_HAVE_LADSPA hydrogen-1.0.0-rc1/src/core/include/hydrogen/globals.h000066400000000000000000000025471366722712400226110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_GLOBALS_H #define H2C_GLOBALS_H #define MIDI_OUT_NOTE_MIN 0 #define MIDI_OUT_NOTE_MAX 127 #define MIDI_OUT_CHANNEL_MIN -1 #define MIDI_OUT_CHANNEL_MAX 15 #define MIN_BPM 10 #define MAX_BPM 400 #define SAMPLE_CHANNELS 2 #define TWOPI 6.28318530717958647692 #define UNUSED( v ) (v = v) // m_nBeatCounter //100,000 ms in 1 second. #define US_DIVIDER .000001 // ~m_nBeatCounter #endif // H2C_GLOBALS_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/h2_exception.h000066400000000000000000000021701366722712400235450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2EXCEPTION_H #define H2EXCEPTION_H #include #include #include namespace H2Core { class H2Exception : public std::runtime_error { public: H2Exception( const QString& msg ) : std::runtime_error( msg.toLocal8Bit().constData() ) { } }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/helpers/000077500000000000000000000000001366722712400224475ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/helpers/files.h000066400000000000000000000072461366722712400237330ustar00rootroot00000000000000 #ifndef H2C_FILES_H #define H2C_FILES_H #include #include namespace H2Core { class Pattern; class Playlist; class Song; /** * Files is in charge of writing and reading Patterns, Drumkits, Songs to the filesystem */ class Files : public H2Core::Object { H2_OBJECT public: enum SaveMode { SAVE_NEW, // construct regular path, do not overwrite SAVE_OVERWRITE, // construct regular path, overwrite existing file SAVE_PATH, // given filename is the path SAVE_TMP, // construct the path in save }; /** * save the given pattern to \/pattern/\/\.h2pattern * will NOT overwrite an existing file * \param fileName to build filePath from * \param pattern the one to be saved * \param song to access license, author info * \param drumkitName to build filePath from and to access name info * \return filePath on success, NULL on failure */ static inline QString savePatternNew( const QString& fileName, Pattern* pattern, Song* song, const QString& drumkitName ) { return savePattern( SAVE_NEW, fileName, pattern, song, drumkitName ); } /** * save the given pattern to \/pattern/\/\.h2pattern * will overwrite an existing file * \param fileName to build filePath from * \param pattern the one to be saved * \param song to access license, author info * \param drumkitName to build filePath from and to access name info * \return filePath on success, NULL on failure */ static inline QString savePatternOver( const QString& fileName, Pattern* pattern, Song* song, const QString& drumkitName ) { return savePattern( SAVE_OVERWRITE, fileName, pattern, song, drumkitName ); } /** * save the given pattern to @a filePath * will overwrite an existing file * \param filePath to write the pattern to * \param pattern the one to be saved * \param song to access license, author info * \param drumkitName to access name info * \return @a filePath on success, NULL on failure */ static inline QString savePatternPath( const QString& filePath, Pattern* pattern, Song* song, const QString& drumkitName ) { return savePattern( SAVE_PATH, filePath, pattern, song, drumkitName ); } /** * save the given pattern under \ with a unique filename built from \ * will overwrite an existing file * \param fileName to build filePath from * \param pattern the one to be saved * \param song to access license, author info * \param drumkitName to access name info * \return filePath on success, NULL on failure */ static inline QString savePatternTmp( const QString& fileName, Pattern* pattern, Song* song, const QString& drumkitName ) { return savePattern( SAVE_TMP, fileName, pattern, song, drumkitName ); } /** * save the given playlist to filePath * will overwrite an existing file * \param filePath to write the playlist to * \param playlist the one to be saved * \param relativePaths should the path to the songs be relative to the playlist instead of absolute * \return filePath on success, NULL on failure */ static inline QString savePlaylistPath( const QString& filePath, Playlist* playlist, bool relativePaths ) { return savePlaylist( SAVE_PATH, filePath, playlist, relativePaths ); } private: static QString savePattern( SaveMode mode, const QString& fileName, const Pattern* pattern, Song* song, const QString& drumkitName ); static QString savePlaylist( SaveMode mode, const QString& fileName, Playlist* playlist, bool relativePaths ); }; }; #endif // H2C_FILES_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/helpers/filesystem.h000066400000000000000000000270041366722712400250070ustar00rootroot00000000000000 #ifndef H2C_FILESYSTEM_H #define H2C_FILESYSTEM_H #include #include namespace H2Core { /** * Filesystem is a thin layer over QDir, QFile and QFileInfo */ class Filesystem : public H2Core::Object { H2_OBJECT public: /** flags available for check_permissions() */ enum file_perms { is_dir =0x01, is_file=0x02, is_readable=0x04, is_writable=0x08, is_executable=0x10 }; static const QString songs_ext; static const QString scripts_ext; static const QString patterns_ext; static const QString playlist_ext; static const QString songs_filter_name; static const QString scripts_filter_name; static const QString patterns_filter_name; static const QString playlists_filter_name; /** * check user and system filesystem usability * \param logger is a pointer to the logger instance which will be used * \param sys_path an alternate system data path */ static bool bootstrap( Logger* logger, const QString& sys_path=nullptr ); /** returns system data path */ static QString sys_data_path(); /** returns user data path */ static QString usr_data_path(); /** returns user ladspa paths */ static QStringList ladspa_paths(); /** returns system config path */ static QString sys_config_path(); /** returns user config path */ static QString usr_config_path(); /** returns system empty sample file path */ static QString empty_sample_path(); /** returns system empty song file path */ static QString empty_song_path(); /** returns untitled song file name */ static QString untitled_song_file_name(); /** Returns a string containing the path to the _click.wav_ file used in the metronome. * * It is a concatenation of #__sys_data_path and * #CLICK_SAMPLE. */ static QString click_file_path(); /** returns click file path from user directory if exists, otherwise from system */ static QString usr_click_file_path(); /** returns the path to the drumkit XSD (xml schema definition) file */ static QString drumkit_xsd_path( ); /** returns the path to the pattern XSD (xml schema definition) file */ static QString pattern_xsd_path( ); /** returns the path to the playlist pattern XSD (xml schema definition) file */ static QString playlist_xsd_path( ); /** returns gui image path */ static QString img_dir(); /** returns documentation path */ static QString doc_dir(); /** returns internationalization path */ static QString i18n_dir(); /** returns user scripts path */ static QString scripts_dir(); /** returns user songs path */ static QString songs_dir(); /** returns user song path, add file extension */ static QString song_path( const QString& sg_name ); /** returns user patterns path */ static QString patterns_dir(); /** returns user patterns path for a specific drumkit */ static QString patterns_dir( const QString& dk_name ); /** returns user patterns path, add file extension*/ static QString pattern_path( const QString& dk_name, const QString& p_name ); /** returns user plugins path */ static QString plugins_dir(); /** returns system drumkits path */ static QString sys_drumkits_dir(); /** returns user drumkits path */ static QString usr_drumkits_dir(); /** returns user playlist path */ static QString playlists_dir(); /** returns user playlist path, add file extension */ static QString playlist_path( const QString& pl_name ); /** returns untitled playlist file name */ static QString untitled_playlist_file_name(); /** returns user cache path */ static QString cache_dir(); /** returns user repository cache path */ static QString repositories_cache_dir(); /** returns system demos path */ static QString demos_dir(); /** returns system xsd path */ static QString xsd_dir(); /** returns temp path */ static QString tmp_dir(); /** * touch a temporary file under tmp_dir() and return it's path. * if base has a suffix it will be preserved, spaces will be replaced by underscores. * \param base part of the path */ static QString tmp_file_path( const QString& base ); /* DRUMKIT */ /** Returns the basename if the given path is under an existing user or system drumkit path, otherwise the given fname */ static QString prepare_sample_path( const QString& fname ); /** Checks if the given filepath is under an existing user or system drumkit path, not the existence of the file */ static bool file_is_under_drumkit( const QString& fname); /** Returns the index of the basename if the given path is under an existing user or system drumkit path, otherwise -1 */ static int get_basename_idx_under_drumkit( const QString& fname); /** returns list of usable system drumkits ( see Filesystem::drumkit_list ) */ static QStringList sys_drumkit_list( ); /** returns list of usable user drumkits ( see Filesystem::drumkit_list ) */ static QStringList usr_drumkit_list( ); /** * returns true if the drumkit exists within usable system or user drumkits * \param dk_name the drumkit name */ static bool drumkit_exists( const QString& dk_name ); /** * returns path for a drumkit within user drumkit path * \param dk_name the drumkit name */ static QString drumkit_usr_path( const QString& dk_name ); /** * returns path for a drumkit searching within user then system drumkits * \param dk_name the drumkit name */ static QString drumkit_path_search( const QString& dk_name ); /** * returns the directory holding the named drumkit searching within user then system drumkits * \param dk_name the drumkit name */ static QString drumkit_dir_search( const QString& dk_name ); /** * returns true if the path contains a usable drumkit * \param dk_path the root drumkit location */ static bool drumkit_valid( const QString& dk_path ); /** * returns the path to the xml file within a supposed drumkit path * \param dk_path the path to the drumkit */ static QString drumkit_file( const QString& dk_path ); /* PATTERNS */ /** * returns a list of existing drumkit sub dir into the patterns directory */ static QStringList pattern_drumkits(); /** * returns a list of existing patterns */ static QStringList pattern_list(); /** * returns a list of existing patterns * \param path the path to look for patterns in */ static QStringList pattern_list( const QString& path ); /* SONGS */ /** returns a list of existing songs */ static QStringList song_list( ); /** returns a list of existing songs, excluding the autosaved one */ static QStringList song_list_cleared( ); /** * returns true if the song file exists * \param sg_name the song name */ static bool song_exists( const QString& sg_name ); /** send current settings information to logger with INFO severity */ static void info(); /* PLAYLISTS */ /** returns a list of existing playlists */ static QStringList playlist_list( ); /** * returns true if the given path is an existing regular file * \param path the path to the file to check * \param silent output not messages if set to true */ static bool file_exists( const QString& path, bool silent=false ); /** * returns true if the given path is an existing readable regular file * \param path the path to the file to check * \param silent output not messages if set to true */ static bool file_readable( const QString& path, bool silent=false ); /** * returns true if the given path is a possibly writable file (may exist or not) * \param path the path to the file to check * \param silent output not messages if set to true */ static bool file_writable( const QString& path, bool silent=false ); /** * returns true if the given path is an existing executable regular file * \param path the path to the file to check * \param silent output not messages if set to true */ static bool file_executable( const QString& path, bool silent=false ); /** * returns true if the given path is a readable regular directory * \param path the path to the file to check * \param silent output not messages if set to true */ static bool dir_readable( const QString& path, bool silent=false ); /** * returns true if the given path is a writable regular directory * \param path the path to the file to check * \param silent output not messages if set to true */ static bool dir_writable( const QString& path, bool silent=false ); /** * returns true if the path is a readable and writable regular directory, create if it not exists * \param path the path to the file to check * \param create will try to create path if not exists and set to true * \param silent output not messages if set to true */ static bool path_usable( const QString& path, bool create=true, bool silent=false ); /** * writes to a file * \param dst the destination path * \param content then string to write */ static bool write_to_file( const QString& dst, const QString& content ); /** * copy a source file to a destination * \param src source file path * \param dst destination file path * \param overwrite allow to overwrite an existing file if set to true */ static bool file_copy( const QString& src, const QString& dst, bool overwrite=false ); /** * remove a path * \param path the path to be removed * \param recursive perform recursive removal if set to true */ static bool rm( const QString& path, bool recursive=false ); /** * create a path * \param path the path to the directory to be created */ static bool mkdir( const QString& path ); private: static Logger* __logger; ///< a pointer to the logger static bool check_sys_paths(); ///< returns true if the system path is consistent static bool check_usr_paths(); ///< returns true if the user path is consistent static bool rm_fr( const QString& path ); ///< recursively remove a path /** * \return a list of usable drumkits, which means having a readable drumkit.xml file * \param path the path to search in for drumkits */ static QStringList drumkit_list( const QString& path ); /** * \return true if all the asked permissions are ok * \param path the path to the file to check * \param perms bit mask of file_perms * \param silent output not messages if set to true */ static bool check_permissions( const QString& path, const int perms, bool silent ); /** * Path to the system files set in Filesystem::bootstrap(). * * If Q_OSMACX is set, it will be a concatenation of * QCoreApplication::applicationDirPath() and * "/../Resources/data/" (H2CORE_HAVE_BUNDLE defined) * or "/data/" (else). If, instead, WIN32 is set, it * is a concatenation of * QCoreApplication::applicationDirPath() and * "/data/". In case the application is neither run on * Mac or Windows, it is set to a concatenation of * H2_SYS_PATH and "/data/". * * If Filesystem::bootstrap() was called with the @a * sys_path argument preset, it will overwrite all the * choices above. * * Finally, if the variable doesn't point to a * readable directory afterwards, it is set to a * concatenation of * QCoreApplication::applicationDirPath(), "/", and * LOCAL_DATA_PATH. */ static QString __sys_data_path; ///< the path to the system files static QString __usr_data_path; ///< the path to the user files static QString __usr_cfg_path; ///< the path to the user config file static QStringList __ladspa_paths; ///< paths to laspa plugins }; }; #endif // H2C_FILESYSTEM_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/helpers/legacy.h000066400000000000000000000020751366722712400240700ustar00rootroot00000000000000 #ifndef H2C_LEGACY_H #define H2C_LEGACY_H #include namespace H2Core { class Drumkit; class Playlist; class Pattern; class InstrumentList; /** * Legacy is a container for legacy code which should be once removed */ class Legacy : public H2Core::Object { H2_OBJECT public: /** * load drumkit information from a file * \param dk_path is a path to an xml file * \return a Drumkit on success, 0 otherwise */ static Drumkit* load_drumkit( const QString& dk_path ); /** * load pattern from a file * \param pattern_path is a path to an xml file * \param instrList * \return a Pattern on success, 0 otherwise */ static Pattern* load_drumkit_pattern( const QString& pattern_path, InstrumentList* instrList ); /** * load playlist from a file * \param pl the playlist to feed * \param pl_path is a path to an xml file * \return a Playlist on success, 0 otherwise */ static Playlist* load_playlist( Playlist* pl, const QString& pl_path ); }; }; #endif // H2C_LEGACY_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/helpers/xml.h000066400000000000000000000131261366722712400234230ustar00rootroot00000000000000 #ifndef H2C_XML_H #define H2C_XML_H #include #include #include namespace H2Core { /** * XMLNode is a subclass of QDomNode with read and write values methods */ class XMLNode : public H2Core::Object, public QDomNode { H2_OBJECT public: /** basic constructor */ XMLNode( ); /** to wrap a QDomNode */ XMLNode( QDomNode node ); /** * create a new XMLNode that has to be appended into de XMLDoc * \param name the name of the node to create * \return the newly created node */ XMLNode createNode( const QString& name ); /** * reads an integer stored into a child node * \param node the name of the child node to read into * \param default_value the value returned if something goes wrong * \param inexistent_ok if set to false output a DEBUG log line if the node doesn't exists * \param empty_ok if set to false output a DEBUG log line if the child node is empty */ int read_int( const QString& node, int default_value, bool inexistent_ok=true, bool empty_ok=true ); /** * reads a boolean stored into a child node * \param node the name of the child node to read into * \param default_value the value returned if something goes wrong * \param inexistent_ok if set to false output a DEBUG log line if the node doesn't exists * \param empty_ok if set to false output a DEBUG log line if the child node is empty */ bool read_bool( const QString& node, bool default_value, bool inexistent_ok=true, bool empty_ok=true ); /** * reads a float stored into a child node * \param node the name of the child node to read into * \param default_value the value returned if something goes wrong * \param inexistent_ok if set to false output a DEBUG log line if the node doesn't exists * \param empty_ok if set to false output a DEBUG log line if the child node is empty */ float read_float( const QString& node, float default_value, bool inexistent_ok=true, bool empty_ok=true ); /** * reads a string stored into a child node * \param node the name of the child node to read into * \param default_value the value returned if something goes wrong * \param inexistent_ok if set to false output a DEBUG log line if the node doesn't exists * \param empty_ok if set to false output a DEBUG log line if the child node is empty */ QString read_string( const QString& node, const QString& default_value, bool inexistent_ok=true, bool empty_ok=true ); /** * reads an attribute from the node * \param attribute the name of the attribute to read * \param default_value the value returned if something goes wrong * \param inexistent_ok if set to false output a DEBUG log line if the attribute doesn't exists * \param empty_ok if set to false output a DEBUG log line if the attribute is empty */ QString read_attribute( const QString& attribute, const QString& default_value, bool inexistent_ok, bool empty_ok ); /** * reads the text (content) from the node * \param empty_ok if set to false output a DEBUG log line if the node is empty */ QString read_text( bool empty_ok ); /** * write an integer into a child node * \param node the name of the child node to create * \param value the value to write */ void write_int( const QString& node, const int value ); /** * write a boolean into a child node * \param node the name of the child node to create * \param value the value to write */ void write_bool( const QString& node, const bool value ); /** * write a float into a child node * \param node the name of the child node to create * \param value the value to write */ void write_float( const QString& node, const float value ); /** * write a string into a child node * \param node the name of the child node to create * \param value the value to write */ void write_string( const QString& node, const QString& value ); /** * write a string as an attribute of the node * \param attribute the name of the attribute to create * \param value the value to write in the attribute */ void write_attribute( const QString& attribute, const QString& value ); private: /** * reads a string stored into a child node * \param node the name of the child node to read into * \param inexistent_ok if set to false output a DEBUG log line if the node doesn't exists * \param empty_ok if set to false output a DEBUG log line if the child node is empty */ QString read_child_node( const QString& node, bool inexistent_ok, bool empty_ok ); /** * write a string into a child node * \param node the name of the child node to create * \param text the text to write */ void write_child_node( const QString& node, const QString& text ); }; /** * XMLDoc is a subclass of QDomDocument with read and write methods */ class XMLDoc : public H2Core::Object, public QDomDocument { H2_OBJECT public: /** basic constructor */ XMLDoc( ); /** * read the content of an xml file * \param filepath the path to the file to read from * \param schemapath the path to the XML Schema file */ bool read( const QString& filepath, const QString& schemapath=nullptr ); /** * write itself into a file * \param filepath the path to the file to write to */ bool write( const QString& filepath ); /** * create the xml header and root node * \param node_name the name of the rootnode to build * \param xmlns the xml namespace prefix to add after XMLNS_BASE */ XMLNode set_root( const QString& node_name, const QString& xmlns = nullptr ); }; }; #endif // H2C_XML_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/hydrogen.h000066400000000000000000000633751366722712400230130ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 HYDROGEN_H #define HYDROGEN_H #include // for uint32_t et al #include "hydrogen/config.h" #include #include #include #include #include #include #include #include #include #include #include #include // Engine states (It's ok to use ==, <, and > when testing) /** * State of the H2Core::AudioEngine H2Core::m_audioEngineState. Not even the * constructors have been called. */ #define STATE_UNINITIALIZED 1 /** * State of the H2Core::AudioEngine H2Core::m_audioEngineState. Not ready, * but most pointers are now valid or NULL. */ #define STATE_INITIALIZED 2 /** * State of the H2Core::AudioEngine H2Core::m_audioEngineState. Drivers are * set up, but not ready to process audio. */ #define STATE_PREPARED 3 /** * State of the H2Core::AudioEngine H2Core::m_audioEngineState. Ready to * process audio. */ #define STATE_READY 4 /** * State of the H2Core::AudioEngine H2Core::m_audioEngineState. Currently * playing a sequence. */ #define STATE_PLAYING 5 inline int randomValue( int max ); namespace H2Core { /// /// Hydrogen Audio Engine. /// class Hydrogen : public H2Core::Object { H2_OBJECT public: /** * Creates all the instances used within Hydrogen in the right * order. * * -# H2Core::Logger::create_instance() * -# MidiMap::create_instance() * -# Preferences::create_instance() * -# EventQueue::create_instance() * -# MidiActionManager::create_instance() * * If #H2CORE_HAVE_OSC was set during compilation, the * following instances will be created as well. * * -# NsmClient::create_instance() * -# OscServer::create_instance() using * Preferences::get_instance() as input * * If all instances are created and the actual Hydrogen * instance #__instance is still 0, it will be properly * constructed via Hydrogen(). * * The AudioEngine::create_instance(), * Effects::create_instance(), and Playlist::create_instance() * functions will be called from within audioEngine_init(). */ static void create_instance(); /** * Returns the current Hydrogen instance #__instance. */ static Hydrogen* get_instance(){ assert(__instance); return __instance; }; /** * Destructor taking care of most of the clean up. * * -# Shuts down the NsmClient using NsmClient::shutdown() and deletes it. * -# Deletes the OscServer object. * -# Stops the AudioEngine if playing via audioEngine_stop(). * -# Calls removeSong(), audioEngine_stopAudioDrivers(), audioEngine_destroy(), __kill_instruments() * -# Deletes the #m_pCoreActionController and #m_pTimeline object * -# Sets #__instance to NULL. */ ~Hydrogen(); // ***** SEQUENCER ******** /// Start the internal sequencer void sequencer_play(); /// Stop the internal sequencer void sequencer_stop(); void midi_noteOn( Note *note ); ///Last received midi message QString lastMidiEvent; int lastMidiEventParameter; // TODO: more descriptive name since it is able to both delete and // add a pattern. Possibly without the sequencer_ prefix for // consistency. /** * Adding and removing a Pattern from #m_pNextPatterns. * * After locking the AudioEngine the function retrieves the * particular pattern @a pos from the Song::__pattern_list and * either deletes it from #m_pNextPatterns if already present or * add it to the same pattern list if not present yet. * * If the Song is not in Song::PATTERN_MODE or @a pos is not * within the range of Song::__pattern_list, #m_pNextPatterns will * be cleared instead. * * \param pos Index of a particular pattern in * Song::__pattern_list, which should be added to * #m_pNextPatterns. */ void sequencer_setNextPattern( int pos ); // TODO: Possibly without the sequencer_ prefix for consistency. /** * Clear #m_pNextPatterns and add one Pattern. * * After locking the AudioEngine the function clears * #m_pNextPatterns, fills it with all currently played one in * #m_pPlayingPatterns, and appends the particular pattern @a pos * from the Song::__pattern_list. * * If the Song is not in Song::PATTERN_MODE or @a pos is not * within the range of Song::__pattern_list, #m_pNextPatterns will * be just cleared. * * \param pos Index of a particular pattern in * Song::__pattern_list, which should be added to * #m_pNextPatterns. */ void sequencer_setOnlyNextPattern( int pos ); /** * Switches playback to focused pattern. * * If the current Song is in Song::PATTERN_MODE, the AudioEngine * will be locked and Preferences::m_bPatternModePlaysSelected * negated. If the latter was true before calling this function, * #m_pPlayingPatterns will be cleared and replaced by the * Pattern indexed with #m_nSelectedPatternNumber. * * This function will be called either by MainForm::eventFilter() * when pressing Qt::Key_L or by * SongEditorPanel::modeActionBtnPressed(). */ void togglePlaysSelected(); /** * Get the current song. * \return #__song */ Song* getSong(){ return __song; } /** * Sets the current song #__song to @a newSong. * \param newSong Pointer to the new Song object. */ void setSong ( Song *newSong ); void removeSong(); void addRealtimeNote ( int instrument, float velocity, float pan_L=1.0, float pan_R=1.0, float pitch=0.0, bool noteoff=false, bool forcePlay=false, int msg1=0 ); float getMasterPeak_L(); void setMasterPeak_L( float value ); float getMasterPeak_R(); void setMasterPeak_R( float value ); void getLadspaFXPeak( int nFX, float *fL, float *fR ); void setLadspaFXPeak( int nFX, float fL, float fR ); /** \return #m_nPatternTickPosition */ unsigned long getTickPosition(); /** Keep track of the tick position in realtime. * * Firstly, it gets the current transport position in frames * #m_nRealtimeFrames and converts it into ticks using * TransportInfo::m_fTickSize. Afterwards, it accesses how * much time passed since the last update of * #m_currentTickTime, converts the time difference + * AudioOutput::getBufferSize()/ AudioOutput::getSampleRate() * in frames, and adds the result to the first value to * support keyboard and MIDI events as well. * * \return Current position in ticks. */ unsigned long getRealtimeTickPosition(); unsigned long getTotalFrames(); /** Sets #m_nRealtimeFrames * \param frames Current transport realtime position*/ void setRealtimeFrames( unsigned long frames ); /** Returns the current realtime transport position * TransportInfo::m_nFrames. * \return #m_nRealtimeFrames */ unsigned long getRealtimeFrames(); /** \return #m_pPlayingPatterns*/ PatternList * getCurrentPatternList(); /** * Sets #m_pPlayingPatterns. * * Before setting the variable it first locks the AudioEngine. In * addition, it also pushes the Event #EVENT_PATTERN_CHANGED with * the value -1 to the EventQueue. * * \param pPatternList Sets #m_pPlayingPatterns.*/ void setCurrentPatternList( PatternList * pPatternList ); /** \return #m_pNextPatterns*/ PatternList * getNextPatterns(); /** Get the position of the current Pattern in the Song. * \return #m_nSongPos */ int getPatternPos(); /** * Relocate the position to another Pattern in the Song. * * The position of a Pattern in frames (see * TransportInfo::m_nFrames for details) will be determined by * retrieving the tick number the Pattern is located at using * getTickForPosition() and multiplying it with * TransportInfo::m_fTickSize. The resulting value will be * used by the AudioOutput::locate() function of your audio * driver to relocate the playback position. * * If #m_audioEngineState is not #STATE_PLAYING, the variables * #m_nSongPos and #m_nPatternTickPosition will be set to @a * pos and 0 right away. * * \param pos Position of the Pattern to relocate at. All * values smaller than -1 will be set to -1, which marks the * beginning of the Song. */ void setPatternPos( int pos ); /** Returns the pattern number corresponding to the tick * position @a TickPos. * * Wrapper around function findPatternInTick() (globally defined * in hydrogen.cpp). * * \param TickPos Position in ticks. * \param nPatternStartTick Pointer to an int the starting * position (in ticks) of the corresponding pattern will be * written to. * * \return * - __0__ : if the Song isn't specified yet. * - the output of the findPatternInTick() function called * with @a TickPos and Song::is_loop_enabled() as input * arguments. */ int getPosForTick( unsigned long TickPos, int* nPatternStartTick ); /** Move playback in Pattern mode to the beginning of the pattern. * * Resetting the global variable #m_nPatternStartTick to -1 if the * current Song mode is Song::PATTERN_MODE. */ void resetPatternStartTick(); /** * Get the total number of ticks passed up to a Pattern at * position @a pos. * * The function will loop over all and sums up their * Pattern::__length. If one of the Pattern is NULL or no * Pattern is present one of the PatternList, #MAX_NOTES will * be added instead. * * The driver should be LOCKED when calling this! * * \param pos Position of the Pattern in the * Song::__pattern_group_sequence. * \return * - -1 : if @a pos is bigger than the number of patterns in * the Song and Song::__is_loop_enabled is set to false or * no Patterns could be found at all. * - >= 0 : the total number of ticks passed. */ long getTickForPosition( int pos ); void restartDrivers(); AudioOutput* getAudioOutput(); MidiInput* getMidiInput(); MidiOutput* getMidiOutput(); /** Returns the current state of the audio engine. * \return #m_audioEngineState*/ int getState(); float getProcessTime(); float getMaxProcessTime(); int loadDrumkit( Drumkit *pDrumkitInfo ); int loadDrumkit( Drumkit *pDrumkitInfo, bool conditional ); /** Test if an Instrument has some Note in the Pattern (used to test before deleting an Instrument)*/ bool instrumentHasNotes( Instrument *pInst ); /** Delete an Instrument. If @a conditional is true, and there are some Pattern that are using this Instrument, it's not deleted anyway.*/ void removeInstrument( int instrumentnumber, bool conditional ); /** Return the name of the current Drumkit.*/ QString m_currentDrumkit; const QString& getCurrentDrumkitname(); void setCurrentDrumkitname( const QString& currentdrumkitname ); void raiseError( unsigned nErrorCode ); void previewSample( Sample *pSample ); void previewInstrument( Instrument *pInstr ); enum ErrorMessages { /** * The provided input string in createDriver() does * not match any of the choices for * Preferences::m_sAudioDriver. */ UNKNOWN_DRIVER, /** * Unable to connect the audio driver stored in * #m_pAudioDriver in * audioEngine_startAudioDrivers(). The NullDriver * will be used as a fallback instead. */ ERROR_STARTING_DRIVER, JACK_SERVER_SHUTDOWN, JACK_CANNOT_ACTIVATE_CLIENT, /** * Unable to connect either the * JackAudioDriver::output_port_1 and the * JackAudioDriver::output_port_name_1 as well as the * JackAudioDriver::output_port_2 and the * JackAudioDriver::output_port_name_2 port using * _jack_connect()_ (jack/jack.h) or the fallback * version using the first two input ports in * JackAudioDriver::connect(). */ JACK_CANNOT_CONNECT_OUTPUT_PORT, /** * The client of Hydrogen can not be disconnected from * the JACK server using _jack_client_close()_ * (jack/jack.h). Used within JackAudioDriver::disconnect(). */ JACK_CANNOT_CLOSE_CLIENT, /** * Unable to register output ports for the JACK client * using _jack_port_register()_ (jack/jack.h) in * JackAudioDriver::init() or * JackAudioDriver::setTrackOutput(). */ JACK_ERROR_IN_PORT_REGISTER, /** * Unable to start the OSC server with the given * port number. */ OSC_CANNOT_CONNECT_TO_PORT }; void onTapTempoAccelEvent(); void setTapTempo( float fInterval ); /** * Updates the speed. * * It calls AudioOutput::setBpm() and setNewBpmJTM() with @a * fBPM as input argument and sets Song::__bpm to @a fBPM. * * This function will be called with the AudioEngine in LOCKED * state. * \param fBPM New speed in beats per minute. */ void setBPM( float fBPM ); void restartLadspaFX(); /** * Same as getSelectedPatternNumber() without pushing an event. * \param nPat Sets #m_nSelectedPatternNumber*/ void setSelectedPatternNumberWithoutGuiEvent( int nPat ); /** \return #m_nSelectedPatternNumber*/ int getSelectedPatternNumber(); /** * Sets #m_nSelectedPatternNumber. * * If Preferences::m_pPatternModePlaysSelected is set to true, the * AudioEngine is locked before @a nPat will be assigned. But in * any case the function will push the * #EVENT_SELECTED_PATTERN_CHANGED Event to the EventQueue. * * If @a nPat is equal to #m_nSelectedPatternNumber, the function * will return right away. * *\param nPat Sets #m_nSelectedPatternNumber*/ void setSelectedPatternNumber( int nPat ); int getSelectedInstrumentNumber(); void setSelectedInstrumentNumber( int nInstrument ); void refreshInstrumentParameters( int nInstrument ); #if defined(H2CORE_HAVE_JACK) || _DOXYGEN_ /** * Calls audioEngine_renameJackPorts() if * Preferences::m_bJackTrackOuts is set to true. * \param pSong Handed to audioEngine_renameJackPorts(). */ void renameJackPorts(Song* pSong); #endif #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ void startOscServer(); void startNsmClient(); #endif // beatconter void setbeatsToCount( int beatstocount); int getbeatsToCount(); void setNoteLength( float notelength); float getNoteLength(); int getBcStatus(); void handleBeatCounter(); void setBcOffsetAdjust(); /** Calling JackAudioDriver::releaseTimebaseMaster() directly from the GUI*/ void offJackMaster(); /** Calling JackAudioDriver::initTimebaseMaster() directly from the GUI*/ void onJackMaster(); /** * Get the length (in ticks) of the @a nPattern th pattern. * * Access the length of the first Pattern found in the * PatternList at @a nPattern - 1. * * This function should also work if the loop mode is enabled * in Song::is_loop_enabled(). * * \param nPattern Position + 1 of the desired PatternList. * \return * - __-1__ : if not Song was initialized yet. * - #MAX_NOTES : if @a nPattern was smaller than 1, larger * than the length of the vector of the PatternList in * Song::__pattern_group_sequence or no Pattern could be found * in the PatternList at @a nPattern - 1. * - __else__ : length of first Pattern found at @a nPattern. */ long getPatternLength( int nPattern ); /** Returns the fallback speed. * \return #m_fNewBpmJTM */ float getNewBpmJTM(); /** Set the fallback speed #m_fNewBpmJTM. * \param bpmJTM New default tempo. */ void setNewBpmJTM( float bpmJTM); void __panic(); unsigned int __getMidiRealtimeNoteTickPosition(); /** * Updates Song::__bpm, TransportInfo::m_fBPM, and #m_fNewBpmJTM * to the local speed. * * The local speed will be obtained by calling getTimelineBpm() * with getPatternPos() as input argument and set for the current * song and transport. For setting the * fallback speed #m_fNewBpmJTM, getRealtimeTickPosition() will be * used instead. * * If Preferences::__useTimelineBpm is set to false or Hydrogen * uses JACK transport in the presence of an external timebase * master, the function will return without performing any * actions. */ void setTimelineBpm(); /** * Returns the local speed at a specific @a nBar in the * Timeline. * * Timeline::HTimelineVector::m_htimelinebpm of the first * Timeline::HTimelineVector::m_htimelinebeat bigger than @a * nBar will be returned. * * If Hydrogen is in Song::PATTERN_MODE or * Preferences::__useTimelineBpm is set to false, the global * speed of the current Song Song::__bpm or, if no Song is * present yet, the result of getNewBpmJTM() will be * returned. * * Its counterpart is setTimelineBpm(). * * \param nBar Position (in whole patterns) along the Timeline to * access the tempo at. * * \return Speed in beats per minute. */ float getTimelineBpm( int nBar ); Timeline* getTimeline() const; //export management bool getIsExportSessionActive() const; void startExportSession( int rate, int depth ); void stopExportSession(); void startExportSong( const QString& filename ); void stopExportSong(); CoreActionController* getCoreActionController() const; /************************************************************/ /********************** Playback track **********************/ /** * Wrapper around Song::set_playback_track_enabled(). * * \param state Whether the playback track is enabled. It will * be replaced by false, if no Song was selected (getSong() * return nullptr). */ bool setPlaybackTrackState( const bool state ); /** * Wrapper around Song::get_playback_track_enabled(). * * \return Whether the playback track is enabled or false, if * no Song was selected (getSong() return nullptr). */ bool getPlaybackTrackState(); /** * Wrapper function for loading the playback track. * * Calls Song::set_playback_track_filename() and * Sampler::reinitialize_playback_track(). While the former * one is responsible to store metadata about the playback * track, the latter one does load it to a new * InstrumentLayer. The function is called by * SongEditorPanel::editPlaybackTrackBtnPressed() * * \param filename Name of the file to load as the playback * track */ void loadPlaybackTrack( const QString filename ); /**\return #m_bActiveGUI*/ bool getActiveGUI() const; /**\param bActiveGUI Specifies whether the Qt5 GUI is active. Sets #m_bActiveGUI.*/ void setActiveGUI( const bool bActiveGUI ); /**\return #m_pNextSong*/ Song* getNextSong() const; /**\param pNextSong Sets #m_pNextSong. #Song which is about to be loaded by the GUI.*/ void setNextSong( Song* pNextSong ); /** Calculates the lookahead for a specific tick size. * * During the humanization the onset of a Note will be moved * Note::__lead_lag times the value calculated by this function. * * Since the size of a tick is tempo dependent, @a fTickSize * allows you to calculate the lead-lag factor for an arbitrary * position on the Timeline. * * \param fTickSize Number of frames that make up one tick. * * \return Five times the current size of a tick * (TransportInfo::m_fTickSize) (in frames) */ int calculateLeadLagFactor( float fTickSize ); /** Calculates time offset (in frames) used to determine the notes * process by the audio engine. * * Due to the humanization there might be negative offset in the * position of a particular note. To be able to still render it * appropriately, we have to look into and handle notes from the * future. * * The Lookahead is the sum of the #m_nMaxTimeHumanize and * calculateLeadLagFactor() plus one (since it has to be larger * than that). * * \param fTickSize Number of frames that make up one tick. Passed * to calculateLeadLagFactor(). * * \return Frame offset*/ int calculateLookahead( float fTickSize ); /** * \return Whether JackAudioDriver is used as current audio * driver. */ bool haveJackAudioDriver() const; /** * \return Whether JackAudioDriver is used as current audio driver * and JACK transport was activated via the GUI * (#Preferences::m_bJackTransportMode). */ bool haveJackTransport() const; /** * \return Whether we haveJackTransport() and there is an external * JACK timebase master broadcasting us tempo information and * making use disregard Hydrogen's Timeline information (see * #JackAudioDriver::m_nIsTimebaseMaster). */ bool haveJackTimebaseClient() const; ///midi lookuptable int m_nInstrumentLookupTable[MAX_INSTRUMENTS]; /** * Maximum time (in frames) a note's position can be off due to * the humanization (lead-lag). * * Required to calculateLookahead(). Set to 2000. */ int m_nMaxTimeHumanize; private: /** * Static reference to the Hydrogen singleton. * * It is created using the Hydrogen::Hydrogen() constructor, * initialized with NULL and assigned a new Hydrogen instance * if still 0 in create_instance(). */ static Hydrogen* __instance; /** * Pointer to the current song. It is initialized with NULL in * the Hydrogen() constructor, set via setSong(), and accessed * via getSong(). */ Song* __song; /** * Auxiliary function setting a bunch of global variables. * * - #m_ntaktoMeterCompute = 1; * - #m_nbeatsToCount = 4; * - #m_nEventCount = 1; * - #m_nTempoChangeCounter = 0; * - #m_nBeatCount = 1; * - #m_nCoutOffset = 0; * - #m_nStartOffset = 0; */ void initBeatcounter(); // beatcounter float m_ntaktoMeterCompute; ///< beatcounter note length int m_nbeatsToCount; ///< beatcounter beats to count int m_nEventCount; ///< beatcounter event int m_nTempoChangeCounter; ///< count tempochanges for timeArray int m_nBeatCount; ///< beatcounter beat to count double m_nBeatDiffs[16]; ///< beat diff timeval m_CurrentTime; ///< timeval timeval m_LastTime; ///< timeval double m_nLastBeatTime; ///< timediff double m_nCurrentBeatTime; ///< timediff double m_nBeatDiff; ///< timediff float m_fBeatCountBpm; ///< bpm int m_nCoutOffset; ///ms default 0 int m_nStartOffset; ///ms default 0 //~ beatcounter // used for song export Song::SongMode m_oldEngineMode; bool m_bOldLoopEnabled; bool m_bExportSessionIsActive; /** * Specifies whether the Qt5 GUI is active. * * When a new #Song is set via the core part of Hydrogen, e.g. in * the context of session management, the #Song *must* be set via * the GUI if active. Else the GUI will freeze. * * Set by setActiveGUI() and accessed via getActiveGUI(). */ bool m_bActiveGUI; /** * Stores a new #Song which is about of the loaded by the GUI. * * If #m_bActiveGUI is true, the core part of must not load a new * #Song itself. Instead, the new #Song is prepared and stored in * this object to be loaded by HydrogenApp::updateSongEvent() if * H2Core::EVENT_UPDATE_SONG is pushed with a '1'. * * Set by setNextSong() and accessed via getNextSong(). */ Song* m_pNextSong; /** * Local instance of the Timeline object. */ Timeline* m_pTimeline; /** * Local instance of the CoreActionController object. */ CoreActionController* m_pCoreActionController; /// Deleting instruments too soon leads to potential crashes. std::list __instrument_death_row; /** * Constructor, entry point, and initialization of the * Hydrogen application. * * It is called by the main() function after setting up a * bunch of Qt5 stuff and creating an instance of the Logger * and Preferences. * * Only one Hydrogen object is allowed to exist. If the * #__instance object is present, the constructor will throw * an error. * * - Sets the current #__song to NULL * - Sets #m_bExportSessionIsActive to false * - Creates a new Timeline #m_pTimeline * - Creates a new CoreActionController * #m_pCoreActionController, * - Calls initBeatcounter(), audioEngine_init(), and * audioEngine_startAudioDrivers() * - Sets InstrumentComponent::m_nMaxLayers to * Preferences::m_nMaxLayers via * InstrumentComponent::setMaxLayers() and * Preferences::getMaxLayers() * - Starts the OscServer using OscServer::start() if * #H2CORE_HAVE_OSC was set during compilation. * - Fills #m_nInstrumentLookupTable with the corresponding * index of each element. */ Hydrogen(); void __kill_instruments(); }; /* * inline methods */ inline Timeline* Hydrogen::getTimeline() const { return m_pTimeline; } inline CoreActionController* Hydrogen::getCoreActionController() const { return m_pCoreActionController; } inline const QString& Hydrogen::getCurrentDrumkitname() { return m_currentDrumkit; } inline bool Hydrogen::getIsExportSessionActive() const { return m_bExportSessionIsActive; } inline void Hydrogen::setCurrentDrumkitname( const QString& currentdrumkitname ) { this->m_currentDrumkit = currentdrumkitname; } inline bool Hydrogen::getPlaybackTrackState() { Song* pSong = getSong(); bool bState; if(!pSong){ bState = false; } else { bState = pSong->get_playback_track_enabled(); } return bState; } inline bool Hydrogen::getActiveGUI() const { return m_bActiveGUI; } inline void Hydrogen::setActiveGUI( const bool bActiveGUI ) { m_bActiveGUI = bActiveGUI; } inline Song* Hydrogen::getNextSong() const { return m_pNextSong; } inline void Hydrogen::setNextSong( Song* pNextSong ) { m_pNextSong = pNextSong; } }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/lilypond/000077500000000000000000000000001366722712400226375ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/lilypond/lilypond.h000066400000000000000000000061421366722712400246450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015 by Sacha Delanoue * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LILYPOND_H #define LILYPOND_H #include #include #include #include namespace H2Core { class Pattern; class PatternList; class Song; /// A class to convert a Hydrogen song to LilyPond format class LilyPond { public: LilyPond(); /* * Retrieve all needed data from an Hydrogen song * @param song the Hydrogen song to convert */ void extractData( const Song &song ); /* * Write the LilyPond format into a file * @param sFilename name of output file */ void write( const QString &sFilename ) const; private: /* * This structure represents the notes in a measure. * A measure is a vector containing the notes in it. * The index in the main vector is 1/48th of a beat. * An element in the main vector is the list of notes at this moment. * A note is represented by its instrument and its velocity. */ typedef std::vector > > notes_t; /* * Retrieve the information in a PatternList * @param list the PatternList where the information is * @param notes where to store the information to */ static void addPatternList( const PatternList &list, notes_t ¬es ); /* * Retrieve the information in a Pattern * @param pattern the Pattern where the information is * @param notes where to store the information to */ static void addPattern( const Pattern &pattern, notes_t ¬es ); /// Write measures in LilyPond format to stream void writeMeasures( std::ofstream &stream ) const; /// Write upper voice of given measure to stream void writeUpper( std::ofstream &stream, unsigned nMeasure ) const; /// Write lower voice of given measure to stream void writeLower( std::ofstream &stream, unsigned nMeasure ) const; /* * Write voice of given measure to stream, ignore certain notes * @param stream the stream to write to * @param nMeasure the measure to write * @param whiteList the list of notes to consider, the other are ignored */ void writeVoice( std::ofstream &stream, unsigned nMeasure, const std::vector &whiteList ) const; std::vector m_Measures; ///< Representation of the song QString m_sName; ///< Name of the song QString m_sAuthor; ///< Author of the song float m_fBPM; ///< BPM of the song }; } #endif // LILYPOND_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/logger.h000066400000000000000000000106111366722712400224340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_LOGGER_H #define H2C_LOGGER_H #include #include #include #include "hydrogen/config.h" class QString; class QStringList; namespace H2Core { /** * Class for writing logs to the console */ class Logger { public: /** possible logging bits */ enum log_levels { None = 0x00, Error = 0x01, Warning = 0x02, Info = 0x04, Debug = 0x08, Constructors = 0x10, /** Intended to be used log the locking of the AudioEngine. But this feature isn't implemented yet. */ AELockTracing = 0x20 }; /** message queue type */ typedef std::list queue_t; /** * create the logger instance if not exists, set the log level and return the instance * \param msk the logging level bitmask */ static Logger* bootstrap( unsigned msk ); /** * If #__instance equals 0, a new H2Core::Logger * singleton will be created and stored in it. * * It is called in Hydrogen::create_instance(). */ static Logger* create_instance(); /** * Returns a pointer to the current H2Core::Logger * singleton stored in #__instance. */ static Logger* get_instance(){ assert(__instance); return __instance; } /** destructor */ ~Logger(); /** * return true if the level is set in the bitmask * \param lvl the level to check */ bool should_log( unsigned lvl ) const { return (lvl&__bit_msk); } /** * set the bitmask * \param msk the new bitmask to set */ static void set_bit_mask( unsigned msk ) { __bit_msk = msk; } /** return the current log level bit mask */ static unsigned bit_mask() { return __bit_msk; } /** * set use file flag * \param use the flag status */ void set_use_file( bool use ) { __use_file = use; } /** return __use_file */ bool use_file() const { return __use_file; } /** * parse a log level string and return the corresponding bit mask * \param lvl the log level string */ static unsigned parse_log_level( const char* lvl ); /** * the log function * \param level used to output the corresponding level string * \param class_name the name of the calling class * \param func_name the name of the calling function/method * \param msg the message to log */ void log( unsigned level, const QString& class_name, const char* func_name, const QString& msg ); /** * needed for being able to access logger internal * \param param is a pointer to the logger instance */ friend void* loggerThread_func( void* param ); private: /** * Object holding the current H2Core::Logger * singleton. It is initialized with NULL, set with * create_instance(), and accessed with * get_instance(). */ static Logger* __instance; bool __use_file; ///< write log to file if set to true bool __running; ///< set to true when the logger thread is running pthread_mutex_t __mutex; ///< lock for adding or removing elements only queue_t __msg_queue; ///< the message queue static unsigned __bit_msk; ///< the bitmask of log_level_t static const char* __levels[]; ///< levels strings /** constructor */ Logger(); #ifndef HAVE_SSCANF /** * convert an hex string to an integer. * returns -1 on failure. * \param str the hex string to convert * \param len the length of the string */ static int hextoi( const char* str, long len ); #endif // HAVE_SSCANF }; }; #endif // H2C_LOGGER_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/midi_action.h000066400000000000000000000253701366722712400234440ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ACTION_H #define ACTION_H #include #include #include #include using namespace std; class Action : public H2Core::Object { H2_OBJECT public: Action( QString ); void setParameter1( QString text ){ parameter1 = text; } void setParameter2( QString text ){ parameter2 = text; } QString getParameter1(){ return parameter1; } QString getParameter2(){ return parameter2; } QString getType(){ return type; } private: QString type; QString parameter1; QString parameter2; }; namespace H2Core { class Hydrogen; } class MidiActionManager : public H2Core::Object { H2_OBJECT private: /** * Object holding the current MidiActionManager * singleton. It is initialized with NULL, set with * create_instance(), and accessed with * get_instance(). */ static MidiActionManager *__instance; /** * Holds the names of all Action identfiers which Hydrogen is * able to interpret. */ QStringList actionList; /** * Contains all information to find a particular object in a * list of objects, like an effect among all LADSPA effects * present or an individual sample. */ struct targeted_element { /**First level index, like the ID of an Effect or and InstrumentComponent.*/ int _id; /**Second level index, like the ID of an InstrumentLayer.*/ int _subId; }; typedef bool (MidiActionManager::*action_f)(Action * , H2Core::Hydrogen * , targeted_element ); /** * Holds all Action identifiers which Hydrogen is able to * interpret. * * It holds pointer to member function. */ map > actionMap; bool play(Action * , H2Core::Hydrogen * , targeted_element ); bool play_stop_pause_toggle(Action * , H2Core::Hydrogen * , targeted_element ); bool stop(Action * , H2Core::Hydrogen * , targeted_element ); bool pause(Action * , H2Core::Hydrogen * , targeted_element ); bool record_ready(Action * , H2Core::Hydrogen * , targeted_element ); bool record_strobe_toggle(Action * , H2Core::Hydrogen * , targeted_element ); bool record_strobe(Action * , H2Core::Hydrogen * , targeted_element ); bool record_exit(Action * , H2Core::Hydrogen * , targeted_element ); bool mute(Action * , H2Core::Hydrogen * , targeted_element ); bool unmute(Action * , H2Core::Hydrogen * , targeted_element ); bool mute_toggle(Action * , H2Core::Hydrogen * , targeted_element ); bool strip_mute_toggle(Action * , H2Core::Hydrogen * , targeted_element ); bool strip_solo_toggle(Action * , H2Core::Hydrogen * , targeted_element ); bool next_bar(Action * , H2Core::Hydrogen * , targeted_element ); bool previous_bar(Action * , H2Core::Hydrogen * , targeted_element ); bool bpm_increase(Action * , H2Core::Hydrogen * , targeted_element ); bool bpm_decrease(Action * , H2Core::Hydrogen * , targeted_element ); bool bpm_cc_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool bpm_fine_cc_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool master_volume_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool master_volume_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool strip_volume_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool strip_volume_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool effect_level_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool effect_level_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool select_next_pattern(Action * , H2Core::Hydrogen * , targeted_element ); bool select_only_next_pattern(Action * , H2Core::Hydrogen * , targeted_element ); bool select_next_pattern_cc_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool select_next_pattern_promptly(Action * , H2Core::Hydrogen * , targeted_element ); bool select_next_pattern_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool select_and_play_pattern(Action * , H2Core::Hydrogen * , targeted_element ); bool pan_relative(Action * , H2Core::Hydrogen * , targeted_element ); bool pan_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool filter_cutoff_level_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool beatcounter(Action * , H2Core::Hydrogen * , targeted_element ); bool tap_tempo(Action * , H2Core::Hydrogen * , targeted_element ); bool playlist_song(Action * , H2Core::Hydrogen * , targeted_element ); bool playlist_next_song(Action * , H2Core::Hydrogen * , targeted_element ); bool playlist_previous_song(Action * , H2Core::Hydrogen * , targeted_element ); bool toggle_metronome(Action * , H2Core::Hydrogen * , targeted_element ); bool select_instrument(Action * , H2Core::Hydrogen * , targeted_element ); bool undo_action(Action * , H2Core::Hydrogen * , targeted_element ); bool redo_action(Action * , H2Core::Hydrogen * , targeted_element ); bool gain_level_absolute(Action * , H2Core::Hydrogen * , targeted_element ); bool pitch_level_absolute(Action * , H2Core::Hydrogen * , targeted_element ); // Actions required for session management. /** * Create an empty Song which will be stored at to the path * provided in @a pAction. * * This will be done without immediately and without saving * the current #Song. All unsaved changes will be lost! In * addition, the new Song won't be saved by this function. You * can do so using save_song(). * * The intended use of this function for session * management. Therefore the function will *not* store the * provided in Preferences::m_lastSongFilename and thus * Hydrogen does not resumes with the particular #Song upon * restarting. * * Right now the function is only able to handle the provided * path as is. Therefore it is important to provide an absolute * path to a .h2song file. * * \param pAction Action "NEW_SONG" uniquely triggering this function. * \param pHydrogen Pointer to the instance of the Hydrogen singleton. * \param element Unused. * \return true on success */ bool new_song(Action* pAction, H2Core::Hydrogen* pHydrogen, targeted_element element); /** * Opens the Song specified in the path provided in @a * pAction. * * This will be done without immediately and without saving * the current #Song. All unsaved changes will be lost! * * The intended use of this function for session * management. Therefore the function will *not* store the * provided in Preferences::m_lastSongFilename and thus * Hydrogen does not resumes with the particular #Song upon * restarting. * * Right now the function is only able to handle the provided * path as is. Therefore it is important to provide an absolute * path to a .h2song file. * * \param pAction Action "OPEN_SONG" uniquely triggering this function. * \param pHydrogen Pointer to the instance of the Hydrogen singleton. * \param element Unused. * \return true on success */ bool open_song(Action* pAction, H2Core::Hydrogen* pHydrogen, targeted_element element); /** * Saves the current #Song. * * The intended use of this function for session * management. Therefore the function will *not* store the * provided in Preferences::m_lastSongFilename and thus * Hydrogen does not resumes with the particular #Song upon * restarting. * * \param pAction Action "SAVE_SONG" uniquely triggering this function. * \param pHydrogen Pointer to the instance of the Hydrogen singleton. * \param element Unused. * \return true on success */ bool save_song(Action* pAction, H2Core::Hydrogen* pHydrogen, targeted_element element); /** * Saves the current Song to the path provided in @a pAction. * * The intended use of this function for session * management. Therefore the function will *not* store the * provided in Preferences::m_lastSongFilename and thus * Hydrogen does not resumes with the particular #Song upon * restarting. * * \param pAction Action "SAVE_SONG_AS" uniquely triggering this function. * \param pHydrogen Pointer to the instance of the Hydrogen singleton. * \param element Unused. * \return true on success */ bool save_song_as(Action* pAction, H2Core::Hydrogen* pHydrogen, targeted_element element); /** * Triggers the shutdown of Hydrogen. * * This will be done without immediately and without saving * the current #Song. All unsaved changes will be lost! * * The shutdown will only be triggered if * Hydrogen::m_bActiveGUI is true and the Qt5 GUI is present. * * \param pAction Action "QUIT" uniquely triggering this function. * \param pHydrogen Pointer to the instance of the Hydrogen singleton. * \param element Unused. * \return true on success */ bool quit(Action* pAction, H2Core::Hydrogen* pHydrogen, targeted_element element); QStringList eventList; int m_nLastBpmChangeCCParameter; /** * Checks the path of the .h2song provided via OSC. * * It will be checked whether @a songPath * - is absolute * - has the '.h2song' suffix * - is writable (if it exists) * * \param songPath Absolute path to an .h2song file. * \return true - if valid. */ bool isSongPathValid( const QString& songPath ); public: /** * The handleAction method is the heart of the * MidiActionManager class. It executes the operations that * are needed to carry the desired action. */ bool handleAction( Action * ); /** * If #__instance equals 0, a new MidiActionManager * singleton will be created and stored in it. * * It is called in H2Core::Hydrogen::create_instance(). */ static void create_instance(); /** * Returns a pointer to the current MidiActionManager * singleton stored in #__instance. */ static MidiActionManager* get_instance() { assert(__instance); return __instance; } QStringList getActionList(){ return actionList; } QStringList getEventList(){ return eventList; } MidiActionManager(); ~MidiActionManager(); }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/midi_map.h000066400000000000000000000046631366722712400227460ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIDIMAP_H #define MIDIMAP_H #include #include #include #include class Action; class MidiMap : public H2Core::Object { H2_OBJECT public: typedef std::map< QString, Action* > map_t; /** * Object holding the current MidiMap singleton. It is * initialized with NULL, set with create_instance(), * and accessed with get_instance(). */ static MidiMap* __instance; ~MidiMap(); /** * If #__instance equals 0, a new MidiMap singleton will * be created and stored in it. * * It is called in Hydrogen::create_instance(). */ static void create_instance(); /** * Convenience function calling reset() on the current * MidiMap #__instance. */ static void reset_instance(); /** * Returns a pointer to the current MidiMap singleton * stored in #__instance. */ static MidiMap* get_instance() { assert(__instance); return __instance; } void reset(); ///< Reinitializes the object. void registerMMCEvent( QString, Action* ); void registerNoteEvent( int , Action* ); void registerCCEvent( int , Action* ); void registerPCEvent( Action* ); map_t getMMCMap(); Action* getMMCAction( QString ); Action* getNoteAction( int note ); Action* getCCAction( int parameter ); Action* getPCAction(); int findCCValueByActionParam1( QString actionType, QString param1 ); int findCCValueByActionType( QString actionType ); void setupNoteArray(); private: MidiMap(); Action* __note_array[ 128 ]; Action* __cc_array[ 128 ]; Action* __pc_action; map_t mmcMap; QMutex __mutex; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/nsm.h000066400000000000000000000401371366722712400217600ustar00rootroot00000000000000 /*************************************************************************/ /* Copyright (C) 2012 Jonathan Moore Liles */ /* */ /* Permission to use, copy, modify, and/or distribute this software for */ /* any purpose with or without fee is hereby granted, provided that the */ /* above copyright notice and this permission notice appear in all */ /* copies. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL */ /* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED */ /* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE */ /* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL */ /* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR */ /* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER */ /* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR */ /* PERFORMANCE OF THIS SOFTWARE. */ /*************************************************************************/ /*************************************************************/ /* A simple, callback based C API for NSM clients. */ /* */ /* Simplified Example: */ /* */ /* #include "nsm.h" */ /* */ /* int */ /* cb_nsm_open ( const char *name, */ /* const char *display_name, */ /* const char *client_id, */ /* char **out_msg, */ /* void *userdata ) */ /* { */ /* do_open_stuff(); */ /* return ERR_OK; */ /* } */ /* */ /* int */ /* cb_nsm_save ( char **out_msg, */ /* void *userdata ) */ /* { */ /* do_save_stuff(); */ /* return ERR_OK; */ /* } */ /* */ /* static nsm_client_t *nsm = 0 */ /* */ /* int main( int argc, char **argv ) */ /* { */ /* const char *nsm_url = getenv( "NSM_URL" ); */ /* */ /* if ( nsm_url ) */ /* { */ /* nsm = nsm_new(); */ /* */ /* nsm_set_open_callback( nsm, cb_nsm_open, 0 ); */ /* nsm_set_save_callback( nsm, cb_nsm_save, 0 ); */ /* */ /* if ( 0 == nsm_init( nsm, nsm_url ) ) */ /* { */ /* nsm_send_announce( nsm, "FOO", "", argv[0] ); */ /* } */ /* else */ /* { */ /* nsm_free( nsm ); */ /* nsm = 0; */ /* } */ /* } */ /* } */ /*************************************************************/ #ifndef _NSM_H #define _NSM_H #define NSM_API_VERSION_MAJOR 1 #define NSM_API_VERSION_MINOR 0 #include #include #include #include #include #include typedef void * nsm_client_t; typedef int (nsm_open_callback)( const char *name, const char *display_name, const char *client_id, char **out_msg, void *userdata ); typedef int (nsm_save_callback)( char **out_msg, void *userdata ); typedef void (nsm_active_callback)( int b, void *userdata ); typedef void (nsm_session_is_loaded_callback)( void *userdata ); typedef int (nsm_broadcast_callback)( const char *, lo_message m, void *userdata ); #define _NSM() ((struct _nsm_client_t*)nsm) #define NSM_EXPORT __attribute__((unused)) static /* private parts */ struct _nsm_client_t { const char *nsm_url; lo_server _server; lo_server_thread _st; lo_address nsm_addr; int nsm_is_active; char *nsm_client_id; char *_session_manager_name; nsm_open_callback *open; void *open_userdata; nsm_save_callback *save; void *save_userdata; nsm_active_callback *active; void *active_userdata; nsm_session_is_loaded_callback *session_is_loaded; void *session_is_loaded_userdata; nsm_broadcast_callback *broadcast; void *broadcast_userdata; }; enum { ERR_OK = 0, ERR_GENERAL = -1, ERR_INCOMPATIBLE_API = -2, ERR_BLACKLISTED = -3, ERR_LAUNCH_FAILED = -4, ERR_NO_SUCH_FILE = -5, ERR_NO_SESSION_OPEN = -6, ERR_UNSAVED_CHANGES = -7, ERR_NOT_NOW = -8 }; NSM_EXPORT int nsm_is_active ( nsm_client_t *nsm ) { return _NSM()->nsm_is_active; } NSM_EXPORT const char * nsm_get_session_manager_name ( nsm_client_t *nsm ) { return _NSM()->_session_manager_name; } NSM_EXPORT nsm_client_t * nsm_new ( void ) { struct _nsm_client_t *nsm = (struct _nsm_client_t*)malloc( sizeof( struct _nsm_client_t ) ); nsm->nsm_url = 0; nsm->nsm_is_active = 0; nsm->nsm_client_id = 0; nsm->_server = 0; nsm->_st = 0; nsm->nsm_addr = 0; nsm->_session_manager_name = 0; nsm->open = 0; nsm->save = 0; nsm->active = 0; nsm->session_is_loaded = 0; nsm->broadcast = 0; return (nsm_client_t *)nsm; } /*******************************************/ /* CLIENT TO SERVER INFORMATIONAL MESSAGES */ /*******************************************/ NSM_EXPORT void nsm_send_is_dirty ( nsm_client_t *nsm ) { if ( _NSM()->nsm_is_active ) lo_send_from( _NSM()->nsm_addr, _NSM()->_server, LO_TT_IMMEDIATE, "/nsm/client/is_dirty", "" ); } NSM_EXPORT void nsm_send_is_clean ( nsm_client_t *nsm ) { if ( _NSM()->nsm_is_active ) lo_send_from( _NSM()->nsm_addr, _NSM()->_server, LO_TT_IMMEDIATE, "/nsm/client/is_clean", "" ); } NSM_EXPORT void nsm_send_progress ( nsm_client_t *nsm, float p ) { if ( _NSM()->nsm_is_active ) lo_send_from( _NSM()->nsm_addr, _NSM()->_server, LO_TT_IMMEDIATE, "/nsm/client/progress", "f", p ); } NSM_EXPORT void nsm_send_message ( nsm_client_t *nsm, int priority, const char *msg ) { if ( _NSM()->nsm_is_active ) lo_send_from( _NSM()->nsm_addr, _NSM()->_server, LO_TT_IMMEDIATE, "/nsm/client/message", "is", priority, msg ); } NSM_EXPORT void nsm_send_announce ( nsm_client_t *nsm, const char *app_name, const char *capabilities, const char *process_name ) { lo_address to = lo_address_new_from_url( _NSM()->nsm_url ); if ( ! to ) { fprintf( stderr, "NSM: Bad address!" ); return; } int pid = (int)getpid(); lo_send_from( to, _NSM()->_server, LO_TT_IMMEDIATE, "/nsm/server/announce", "sssiii", app_name, capabilities, process_name, NSM_API_VERSION_MAJOR, NSM_API_VERSION_MINOR, pid ); lo_address_free( to ); } NSM_EXPORT void nsm_send_broadcast ( nsm_client_t *nsm, lo_message msg ) { if ( _NSM()->nsm_is_active ) lo_send_message_from( _NSM()->nsm_addr, _NSM()->_server, "/nsm/server/broadcast", msg ); } NSM_EXPORT void nsm_check_wait ( nsm_client_t *nsm, int timeout ) { if ( lo_server_wait( _NSM()->_server, timeout ) ) while ( lo_server_recv_noblock( _NSM()->_server, 0 ) ) {} } NSM_EXPORT void nsm_check_nowait (nsm_client_t *nsm ) { nsm_check_wait( nsm, 0 ); } NSM_EXPORT void nsm_thread_start ( nsm_client_t *nsm ) { lo_server_thread_start( _NSM()->_st ); } NSM_EXPORT void nsm_thread_stop ( nsm_client_t *nsm ) { lo_server_thread_stop( _NSM()->_st ); } NSM_EXPORT void nsm_free ( nsm_client_t *nsm ) { if ( _NSM()->_st ) nsm_thread_stop( nsm ); if ( _NSM()->_st ) lo_server_thread_free( _NSM()->_st ); else lo_server_free( _NSM()->_server ); free( _NSM() ); } /*****************/ /* SET CALLBACKS */ /*****************/ NSM_EXPORT void nsm_set_open_callback( nsm_client_t *nsm, nsm_open_callback *open_callback, void *userdata ) { _NSM()->open = open_callback; _NSM()->open_userdata = userdata; } NSM_EXPORT void nsm_set_save_callback( nsm_client_t *nsm, nsm_save_callback *save_callback, void *userdata ) { _NSM()->save = save_callback; _NSM()->save_userdata = userdata; } NSM_EXPORT void nsm_set_active_callback( nsm_client_t *nsm, nsm_active_callback *active_callback, void *userdata ) { _NSM()->active = active_callback; _NSM()->active_userdata = userdata; } NSM_EXPORT void nsm_set_session_is_loaded_callback( nsm_client_t *nsm, nsm_session_is_loaded_callback *session_is_loaded_callback, void *userdata ) { _NSM()->session_is_loaded = session_is_loaded_callback; _NSM()->session_is_loaded_userdata = userdata; } NSM_EXPORT void nsm_set_broadcast_callback( nsm_client_t *nsm, nsm_broadcast_callback *broadcast_callback, void *userdata ) { _NSM()->broadcast = broadcast_callback; _NSM()->broadcast_userdata = userdata; } /****************/ /* OSC HANDLERS */ /****************/ #undef OSC_REPLY #undef OSC_REPLY_ERR #define OSC_REPLY( value ) lo_send_from( ((struct _nsm_client_t*)user_data)->nsm_addr, ((struct _nsm_client_t*)user_data)->_server, LO_TT_IMMEDIATE, "/reply", "ss", path, value ) #define OSC_REPLY_P( path, value ) lo_send_from( ((struct _nsm_client_t*)user_data)->nsm_addr, ((struct _nsm_client_t*)user_data)->_server, LO_TT_IMMEDIATE, "/reply", "ss", path, value ) #define OSC_REPLY_ERR( errcode, value ) lo_send_from( ((struct _nsm_client_t*)user_data)->nsm_addr, ((struct _nsm_client_t*)user_data)->_server, LO_TT_IMMEDIATE, "/error", "sis", path, errcode, value ) NSM_EXPORT int _nsm_osc_open ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) types; (void) argc; (void) msg; char *out_msg = NULL; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; nsm->nsm_client_id = strdup( &argv[2]->s ); if ( ! nsm->open ) return 0; int r = nsm->open( &argv[0]->s, &argv[1]->s, &argv[2]->s, &out_msg, nsm->open_userdata ); if ( r ) OSC_REPLY_ERR( r, ( out_msg ? out_msg : "") ); else OSC_REPLY( "OK" ); if ( out_msg ) free( out_msg ); return 0; } NSM_EXPORT int _nsm_osc_save ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) types; (void) argv; (void) argc; (void) msg; char *out_msg = NULL; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; if ( ! nsm->save ) return 0; int r = nsm->save(&out_msg, nsm->save_userdata ); if ( r ) { OSC_REPLY_ERR( r, ( out_msg ? out_msg : "") ); } else { OSC_REPLY( "OK" ); } if ( out_msg ) free( out_msg ); return 0; } NSM_EXPORT int _nsm_osc_announce_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) path; (void) types; (void) argc; if ( strcmp( &argv[0]->s, "/nsm/server/announce" ) ) return -1; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; fprintf( stderr, "NSM: Successfully registered. NSM says: %s", &argv[1]->s ); nsm->nsm_is_active = 1; nsm->_session_manager_name = strdup( &argv[2]->s ); nsm->nsm_addr = lo_address_new_from_url( lo_address_get_url( lo_message_get_source( msg ) )); if ( nsm->active ) nsm->active( nsm->nsm_is_active, nsm->active_userdata ); return 0; } NSM_EXPORT int _nsm_osc_error ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) path; (void) types; (void) argc; (void) msg; if ( strcmp( &argv[0]->s, "/nsm/server/announce" ) ) return -1; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; fprintf( stderr, "NSM: Failed to register with NSM server: %s", &argv[2]->s ); nsm->nsm_is_active = 0; if ( nsm->active ) nsm->active( nsm->nsm_is_active, nsm->active_userdata ); return 0; } NSM_EXPORT int _nsm_osc_session_is_loaded ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) path; (void) types; (void) argv; (void) argc; (void) msg; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; if ( ! nsm->session_is_loaded ) return 0; nsm->session_is_loaded( nsm->session_is_loaded_userdata ); return 0; } NSM_EXPORT int _nsm_osc_broadcast ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) { (void) types; (void) argv; (void) argc; struct _nsm_client_t *nsm = (struct _nsm_client_t*)user_data; if ( ! nsm->broadcast ) return 0; return nsm->broadcast( path, msg, nsm->broadcast_userdata ); } NSM_EXPORT int nsm_init ( nsm_client_t *nsm, const char *nsm_url ) { _NSM()->nsm_url = nsm_url; lo_address addr = lo_address_new_from_url( nsm_url ); int proto = lo_address_get_protocol( addr ); lo_address_free( addr ); _NSM()->_server = lo_server_new_with_proto( NULL, proto, NULL ); if ( ! _NSM()->_server ) return -1; lo_server_add_method( _NSM()->_server, "/error", "sis", _nsm_osc_error, _NSM() ); lo_server_add_method( _NSM()->_server, "/reply", "ssss", _nsm_osc_announce_reply, _NSM() ); lo_server_add_method( _NSM()->_server, "/nsm/client/open", "sss", _nsm_osc_open, _NSM() ); lo_server_add_method( _NSM()->_server, "/nsm/client/save", "", _nsm_osc_save, _NSM() ); lo_server_add_method( _NSM()->_server, "/nsm/client/session_is_loaded", "", _nsm_osc_session_is_loaded, _NSM() ); lo_server_add_method( _NSM()->_server, NULL, NULL, _nsm_osc_broadcast, _NSM() ); return 0; } NSM_EXPORT int nsm_init_thread ( nsm_client_t *nsm, const char *nsm_url ) { _NSM()->nsm_url = nsm_url; lo_address addr = lo_address_new_from_url( nsm_url ); int proto = lo_address_get_protocol( addr ); lo_address_free( addr ); _NSM()->_st = lo_server_thread_new_with_proto( NULL, proto, NULL ); _NSM()->_server = lo_server_thread_get_server( _NSM()->_st ); if ( ! _NSM()->_server ) return -1; lo_server_thread_add_method( _NSM()->_st, "/error", "sis", _nsm_osc_error, _NSM() ); lo_server_thread_add_method( _NSM()->_st, "/reply", "ssss", _nsm_osc_announce_reply, _NSM() ); lo_server_thread_add_method( _NSM()->_st, "/nsm/client/open", "sss", _nsm_osc_open, _NSM() ); lo_server_thread_add_method( _NSM()->_st, "/nsm/client/save", "", _nsm_osc_save, _NSM() ); lo_server_thread_add_method( _NSM()->_st, "/nsm/client/session_is_loaded", "", _nsm_osc_session_is_loaded, _NSM() ); lo_server_thread_add_method( _NSM()->_st, NULL, NULL, _nsm_osc_broadcast, _NSM() ); return 0; } #endif /* NSM_H */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/nsm_client.h000066400000000000000000000043521366722712400233150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 NSM_CLIENT_H #define NSM_CLIENT_H #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ #include #include /** * @class NsmClient * * @brief Non session manager client implementation * * * @author Sebastian Moors * */ class NsmClient : public H2Core::Object { H2_OBJECT public: /** * Object holding the current NsmClient singleton. It * is initialized with NULL, set with * create_instance(), and accessed with * get_instance(). */ static NsmClient* __instance; ~NsmClient(); pthread_t m_NsmThread; /** * If #__instance equals 0, a new NsmClient singleton * will be created and stored in it. * * It is called in * H2Core::Hydrogen::create_instance(). */ static void create_instance(); /** * Returns a pointer to the current NsmClient * singleton stored in #__instance. */ static NsmClient* get_instance() { assert(__instance); return __instance; } void createInitialClient(); void shutdown(); /** * To determine whether Hydrogen is under Non session management, * it is not sufficient to check whether the NSM_URL environmental * variable is set but also whether the NSM server did respond * to the announce message appropriately. Therefore, * createInitialClient() has to be called first. */ bool m_bUnderSessionManagement; private: NsmClient(); }; #endif /* H2CORE_HAVE_OSC */ #endif // NSM_CLIENT_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/object.h000066400000000000000000000136361366722712400224350ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2C_OBJECT_H #define H2C_OBJECT_H #include "hydrogen/logger.h" #include "hydrogen/config.h" #include "hydrogen/globals.h" #include #include #include namespace H2Core { /** * Base class. */ class Object { public: /** destructor */ ~Object(); /** copy constructor */ Object( const Object& obj ); /** constructor */ Object( const char* class_name ); const char* class_name( ) const { return __class_name; } ///< return the class name /** * enable/disable class instances counting * \param flag the counting status to set */ static void set_count( bool flag ); static bool count_active() { return __count; } ///< return true if class instances counting is enabled static unsigned objects_count() { return __objects_count; } ///< return the number of objects /** * output the full objects map to a given ostream * \param out the ostream to write to */ static void write_objects_map_to( std::ostream& out ); static void write_objects_map_to_cerr() { Object::write_objects_map_to( std::cerr ); } ///< output objects map to stderr /** * must be called before any Object instantiation ! * \param logger the logger instance used to send messages to * \param count should we count objects instances or not */ static int bootstrap( Logger* logger, bool count=false ); static Logger* logger() { return __logger; } ///< return the logger instance private: /** * search for the class name within __objects_map, decrease class and global counts * \param obj the object to be taken into account */ static void del_object( const Object* obj ); /** * search for the class name within __objects_map, create it if doesn't exists, increase class and global counts * \param obj the object to be taken into account * \param copy is it called from a copy constructor */ static void add_object( const Object* obj, bool copy ); /** an objects class map item type */ typedef struct { unsigned constructed; unsigned destructed; } obj_cpt_t; /** the objects class map type */ typedef std::map object_map_t; const char* __class_name; ///< the object class name static bool __count; ///< should we count class instances static unsigned __objects_count; ///< total objects count static object_map_t __objects_map; ///< objects classes and instances count structure static pthread_mutex_t __mutex; ///< yeah this has to be thread safe protected: static Logger* __logger; ///< logger instance pointer }; // Object inherited class declaration macro #define H2_OBJECT \ public: static const char* class_name() { return __class_name; } \ private: static const char* __class_name; \ // LOG MACROS #define __LOG_METHOD( lvl, msg ) if( __logger->should_log( (lvl) ) ) { __logger->log( (lvl), class_name(), __FUNCTION__, msg ); } #define __LOG_CLASS( lvl, msg ) if( logger()->should_log( (lvl) ) ) { logger()->log( (lvl), class_name(), __FUNCTION__, msg ); } #define __LOG_OBJ( lvl, msg ) if( __object->logger()->should_log( (lvl) ) ) { __object->logger()->log( (lvl), 0, __PRETTY_FUNCTION__, msg ); } #define __LOG_STATIC( lvl, msg ) if( H2Core::Logger::get_instance()->should_log( (lvl) ) ) { H2Core::Logger::get_instance()->log( (lvl), 0, __PRETTY_FUNCTION__, msg ); } #define __LOG( logger, lvl, msg ) if( (logger)->should_log( (lvl) ) ) { (logger)->log( (lvl), 0, 0, msg ); } // Object instance method logging macros #define DEBUGLOG(x) __LOG_METHOD( H2Core::Logger::Debug, (x) ); #define INFOLOG(x) __LOG_METHOD( H2Core::Logger::Info, (x) ); #define WARNINGLOG(x) __LOG_METHOD( H2Core::Logger::Warning, (x) ); #define ERRORLOG(x) __LOG_METHOD( H2Core::Logger::Error, (x) ); // Object class method logging macros #define _DEBUGLOG(x) __LOG_CLASS( H2Core::Logger::Debug, (x) ); #define _INFOLOG(x) __LOG_CLASS( H2Core::Logger::Info, (x) ); #define _WARNINGLOG(x) __LOG_CLASS( H2Core::Logger::Warning, (x) ); #define _ERRORLOG(x) __LOG_CLASS( H2Core::Logger::Error, (x) ); // logging macros using an Object *__object ( thread : Object* __object = ( Object* )param; ) #define __DEBUGLOG(x) __LOG_OBJ( H2Core::Logger::Debug, (x) ); #define __INFOLOG(x) __LOG_OBJ( H2Core::Logger::Info, (x) ); #define __WARNINGLOG(x) __LOG_OBJ( H2Core::Logger::Warning, (x) ); #define __ERRORLOG(x) __LOG_OBJ( H2Core::Logger::Error, (x) ); // logging macros using ( thread : Object* __object = ( Object* )param; ) #define ___DEBUGLOG(x) __LOG_STATIC( H2Core::Logger::Debug, (x) ); #define ___INFOLOG(x) __LOG_STATIC( H2Core::Logger::Info, (x) ); #define ___WARNINGLOG(x) __LOG_STATIC(H2Core::Logger::Warning, (x) ); #define ___ERRORLOG(x) __LOG_STATIC( H2Core::Logger::Error, (x) ); }; #endif // H2C_OBJECT_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/include/hydrogen/osc_server.h000066400000000000000000000627421366722712400233430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 OSC_SERVER_H #define OSC_SERVER_H #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ #include #include #include #include namespace lo { class ServerThread; } /** * @class OscServer * * @brief OSC Server implementation * * Open Sound Control (OSC) is a protocol for communication among * programs, computers, and hardware, like synthesizers or multimedia * devices, via networking protocols such as UDP or TCP. It can be * thought of as a replacement for the MIDI protocol with rich * benefits, like supporting symbolic and high-resolution numerical * argument data, providing an URL-style naming scheme in combination * with a pattern matching language, and allowing to bundle messages * for a better handling of timing and simultaneous processing. * * The OscServer class provides an implementation of an OSC server * running in a separate thread and handling all incoming and outgoing * OSC messages send to or from Hydrogen. Its naming scheme starts with * the prefix \e /Hydrogen/ followed by the name of one of the handler * functions implemented as members of this class without the \e * _Handler() prefix. Sending an OSC message to the path \e * /Hydrogen/PAUSE will thus trigger the PAUSE_Handler() to pause the * playback. You can play with these features using the command line * program \b oscsend on UNIX-based systems. * * Internally, the OscServer is implemented as a singleton and will be * created using create_instance() and queried using * get_instance(). Using start() all handler functions will be * registered to their corresponding paths and the OSC server thread * will start to listen for incoming messages. But this will only * happen if H2Core::Preferences::m_bOscServerEnabled is set to * true. In addition, Hydrogen will send OSC messages about its current * state to all clients each time its state changes if * H2Core::Preferences::m_bOscFeedbackEnabled is set to * true. H2Core::Preferences::m_nOscServerPort contains the port number * the OSC server will be started at. * * @author Sebastian Moors * */ class OscServer : public H2Core::Object { H2_OBJECT public: /** * Object holding the current OscServer singleton. It is * initialized with nullptr, set with create_instance(), and * accessed with get_instance(). */ static OscServer* __instance; /** * Destructor freeing all addresses in #m_pClientRegistry and * setting #__instance to nullptr. */ ~OscServer(); /** * If #__instance equals nullptr, a new OscServer singleton * will be created by calling the OscServer() constructor and * stored in #__instance. * * It is called in * H2Core::Hydrogen::create_instance(). * * \param pPreferences Pointer to the H2Core::Preferences * singleton. Although it could be accessed internally using * H2Core::Preferences::get_instance(), this is an appetizer * for internal changes happening after the 1.0 release. */ static void create_instance( H2Core::Preferences* pPreferences ); /** * Returns a pointer to the current OscServer * singleton stored in #__instance. */ static OscServer* get_instance() { assert(__instance); return __instance; } /** * Converts a data @a data of type @a type into a printable * QString. * * Apart from the basic OSC types LO_INT32, LO_FLOAT, and * LO_STRING the following extended OSC types are supported: * - LO_INT64 * - LO_TIMETAG * - LO_DOUBLE * - LO_SYMBOL * - LO_CHAR * - LO_TRUE * - LO_FALSE * - LO_NIL * - LO_INFINITUM * * LO_BLOB and LO_MIDI are, however, NOT supported. * * \param type Liblo class @a data will be cast to. * \param data Data to be converted to string. * * \return QString representation of @a data. */ static QString qPrettyPrint(lo_type type,void * data); /** * Registers all handler functions defined for this class * starts the OscServer. * * The path the handlers will be registered at always starts * with \e /Hydrogen/ followed by the name of the handler * function without the suffix \e _Handler. PLAY_Handler() * will thus be registered to \e /Hydrogen/PLAY. * * Most handler will be registered for both types "" and "f" * (floats). But the following handlers will be registered for * floats only: * - BPM_DECR_Handler() * - BPM_INCR_Handler() * - MASTER_VOLUME_ABSOLUTE_Handler() * - MASTER_VOLUME_RELATIVE_Handler() * - STRIP_VOLUME_RELATIVE_Handler() * - SELECT_NEXT_PATTERN_Handler() * - SELECT_NEXT_PATTERN_PROMPTLY_Handler() * - SELECT_AND_PLAY_PATTERN_Handler() * - PLAYLIST_SONG_Handler() * - SELECT_INSTRUMENT_Handler() * * In case of the session managing handlers the following ones * only work with no argument present * - SAVE_SONG_Handler() * - QUIT_Handler() * and others only work by supplying a string "s" type message * - NEW_SONG_Handler() * - OPEN_SONG_Handler() * - SAVE_SONG_AS_Handler() * * The generic_handler() will be registered to match all paths * and types. * * In addition, a lambda function will be registered to match * all types and paths too. If the client has not sent any * message to Hydrogen yet, it will take care of its * registration to #m_pClientRegistry using the address of the * received OSC message. More importantly, it also will call * H2Core::CoreActionController::initExternalControlInterfaces(), * which, apart from MIDI related stuff, use handleAction() to * push the current state of Hydrogen to the registered OSC * clients. This will happen each time the state of Hydrogen * does change. * * This function will only be processed if the created server * thread #m_pServerThread is valid. * * \return `true` if #m_pServerThread could be successfully * created.. */ bool start(); /** * Function called by * H2Core::CoreActionController::initExternalControlInterfaces() * to inform all clients about the current state of Hydrogen * using OSC messages send by Hydrogen itself. * * The following feedback functions will be used to describe * the aforementioned state: * - H2Core::CoreActionController::setMasterVolume() * - H2Core::CoreActionController::setMetronomeIsActive() * - H2Core::CoreActionController::setMasterIsMuted() * - H2Core::CoreActionController::setStripVolume() [*] * - H2Core::CoreActionController::setStripPan() [*] * - H2Core::CoreActionController::setStripIsMuted() [*] * - H2Core::CoreActionController::setStripIsSoloed() [*] * * [*] Function will be called for all Instruments in * H2Core::Song::__instrument_list. * * The constructed messages will contain the * Action::parameter2 of @a pAction as float types (or * Action::parameter1 for the actions @b TOGGLE_METRONOME and * @b MUTE_TOGGLE) and will be associated with one of the * following paths: * - \e /Hydrogen/MASTER_VOLUME_ABSOLUTE * - \e /Hydrogen/TOGGLE_METRONOME * - \e /Hydrogen/MUTE_TOGGLE * - \e /Hydrogen/STRIP_VOLUME_ABSOLUTE/[x] * - \e /Hydrogen/PAN_ABSOLUTE/[x] * - \e /Hydrogen/STRIP_MUTE_TOGGLE/[x] * - \e /Hydrogen/STRIP_SOLO_TOGGLE/[x] * * [x] The last part of the URI is determined by * Action::parameter1 and specifies an individual strip. * * Only called if H2Core::Preferences::m_bOscServerEnabled is * true. * * \param pAction Action to be sent to all registered * clients. */ static void handleAction(Action* pAction); /** * Creates an Action of type @b PLAY and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAY_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PLAY/STOP_TOGGLE and passes * its references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAY_STOP_TOGGLE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PLAY/PAUSE_TOGGLE and passes * its references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAY_PAUSE_TOGGLE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b STOP and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void STOP_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PAUSE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PAUSE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b RECORD_READY and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void RECORD_READY_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b RECORD/STROBE_TOGGLE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void RECORD_STROBE_TOGGLE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b RECORD_STROBE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void RECORD_STROBE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b EXIT and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void RECORD_EXIT_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b MUTE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void MUTE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b UNMUTE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void UNMUTE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b MUTE_TOGGLE and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void MUTE_TOGGLE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b >>_NEXT_BAR and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void NEXT_BAR_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b <<_PREVIOUS_BAR and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PREVIOUS_BAR_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b BPM_INCR and passes its * references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void BPM_INCR_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b BPM_DECR and passes its * references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void BPM_DECR_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b MASTER_VOLUME_RELATIVE and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter2. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void MASTER_VOLUME_RELATIVE_Handler(lo_arg **argv, int i); /** * Calls H2Core::CoreActionController::setMasterVolume() with * the first argument in @a argv. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void MASTER_VOLUME_ABSOLUTE_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b STRIP_VOLUME_RELATIVE and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter2. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void STRIP_VOLUME_RELATIVE_Handler(lo_arg **argv, int i); /** * Calls H2Core::CoreActionController::setStripVolume() with * both @a param1 and @a param2. * * \param param1 Passed as first argument to * H2Core::CoreActionController::setStripVolume(). * \param param2 Passed as second argument to * H2Core::CoreActionController::setStripVolume().*/ static void STRIP_VOLUME_ABSOLUTE_Handler(int param1, float param2); /** * Creates an Action of type @b SELECT_NEXT_PATTERN and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void SELECT_NEXT_PATTERN_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b SELECT_NEXT_PATTERN_PROMPTLY * and passes its references to * MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void SELECT_NEXT_PATTERN_PROMPTLY_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b SELECT_AND_PLAY_PATTERN and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void SELECT_AND_PLAY_PATTERN_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PAN_RELATIVE and * passes its references to MidiActionManager::handleAction(). * * \param param1 Sets Action::parameter1 of the newly created * Action. * \param param2 Sets Action::parameter2 of the newly created * Action.*/ static void PAN_RELATIVE_Handler(QString param1, QString param2); /** * Creates an Action of type @b PAN_ABSOLTUE and * passes its references to MidiActionManager::handleAction(). * * \param param1 Sets Action::parameter1 of the newly created * Action. * \param param2 Sets Action::parameter2 of the newly created * Action.*/ static void PAN_ABSOLUTE_Handler(QString param1, QString param2); /** * Creates an Action of type @b FILTER_CUTOFF_LEVEL_ABSOLUTE * and passes its references to * MidiActionManager::handleAction(). * * \param param1 Sets Action::parameter1 of the newly created * Action. * \param param2 Sets Action::parameter2 of the newly created * Action.*/ static void FILTER_CUTOFF_LEVEL_ABSOLUTE_Handler(QString param1, QString param2); /** * Creates an Action of type @b BEATCOUNTER and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void BEATCOUNTER_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b TAP_TEMPO and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void TAP_TEMPO_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PLAYLIST_SONG and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter1. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAYLIST_SONG_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PLAYLIST_NEXT_SONG and passes * its references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAYLIST_NEXT_SONG_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b PLAYLIST_PREV_SONG and passes * its references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void PLAYLIST_PREV_SONG_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b TOGGLE_METRONOME and passes * its references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void TOGGLE_METRONOME_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b SELECT_INSTRUMENT and * passes its references to MidiActionManager::handleAction(). * * The first argument in @a argv will be used to set * Action::parameter2. * * \param argv Pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void SELECT_INSTRUMENT_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b UNDO_ACTION and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param i Unused number of arguments passed by the OSC * message.*/ static void UNDO_ACTION_Handler(lo_arg **argv, int i); /** * Creates an Action of type @b REDO_ACTION and passes its * references to MidiActionManager::handleAction(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Number of arguments passed by the OSC * message.*/ static void REDO_ACTION_Handler(lo_arg **argv, int argc); /** * Triggers CoreActionController::newSong(). * * The handler expects the user to provide an absolute path to * a .h2song file. If another file already exists with the * same name, it will be overwritten. * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Number of arguments passed by the OSC message. */ static void NEW_SONG_Handler(lo_arg **argv, int argc); /** * Triggers CoreActionController::openSong(). * * The handler expects the user to provide an absolute path to * a .h2song file. * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Number of arguments passed by the OSC message. */ static void OPEN_SONG_Handler(lo_arg **argv, int argc); /** * Triggers CoreActionController::saveSong(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Unused number of arguments passed by the OSC * message.*/ static void SAVE_SONG_Handler(lo_arg **argv, int argc); /** * Triggers CoreActionController::saveSongAs(). * * The handler expects the user to provide an absolute path to * a .h2song file. If another file already exists with the * same name, it will be overwritten. * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Number of arguments passed by the OSC * message.*/ static void SAVE_SONG_AS_Handler(lo_arg **argv, int argc); /** * Triggers CoreActionController::quit(). * * \param argv Unused pointer to a vector of arguments passed * by the OSC message. * \param argc Unused number of arguments passed by the OSC * message.*/ static void QUIT_Handler(lo_arg **argv, int argc); /** * Catches any incoming messages and display them. * * It is also responsible for catching OSC messages at the * following paths and invoking the corresponding functions * (if only a single argument is present.) * - \e /Hydrogen/STRIP_VOLUME_ABSOLUTE/[x] * - \e /Hydrogen/PAN_ABSOLUTE/[x] * - \e /Hydrogen/PAN_RELATIVE/[x] * - \e /Hydrogen/FILTER_CUTOFF_LEVEL_ABSOLUTE/[x] * - \e /Hydrogen/STRIP_MUTE_TOGGLE/[x] * - \e /Hydrogen/STRIP_SOLO_TOGGLE/[x] * * [x] Digit specifying a particular instrument. * * \param path The OSC path to register the method to. If NULL * is passed the method will match all paths. * \param types The typespec the method accepts. In Hydrogen * handler functions are registered to listen for floats. * \param argv Pointer to a vector of arguments passed by the * OSC message. * \param argc Number of arguments passed by the OSC message. * \param data Unused. * \param user_data Unused. * * \return 1 - means that the message has not been fully * handled and the server should try other methods */ static int generic_handler(const char *path, const char *types, lo_arg ** argv, int argc, void *data, void *user_data); private: /** * Private constructor creating a new OSC server thread using * the port H2Core::Preferences::m_nOscServerPort and * assigning the object to #m_pServerThread. * * \param pPreferences Pointer to the H2Core::Preferences * singleton. Although it could be accessed internally using * H2Core::Preferences::get_instance(), this is an appetizer * for internal changes happening after the 1.0 release. */ OscServer( H2Core::Preferences* pPreferences ); /** Pointer to the H2Core::Preferences singleton. Although it * could be accessed internally using * H2Core::Preferences::get_instance(), this is an appetizer * for internal changes happening after the 1.0 release.*/ H2Core::Preferences* m_pPreferences; /** * Object containing the actual thread with an OSC server * running in. * * It is created in OscServer() and both assigned handlers and * started in start(). */ lo::ServerThread* m_pServerThread; /** * List of all OSC clients known to Hydrogen. * * Whenever an OSC client sends a message to the started OSC * server of Hydrogen, a lambda handler registered in start() * will check whether the address of this client is already * present in #m_pClientRegistry. If this is not the case it * will be added to it and the current state Hydrogen will be * propagated to all registered clients. */ static std::list m_pClientRegistry; }; #endif /* H2CORE_HAVE_OSC */ #endif // OSC_SERVER_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/rt_clock.h000066400000000000000000000037271366722712400227670ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_RTCLOCK_H #define H2_RTCLOCK_H #include "hydrogen/config.h" /* RTCLOCK_SETUP RTCLOCK_START ... code to be benchmarked ... RTCLOCK_STOP DEBUGLOG(QString("elapsed time : %1 [ns]").arg(RTCLOCK_NS)) DEBUGLOG(QString("elapsed time : %1 [us]").arg(RTCLOCK_US)) DEBUGLOG(QString("elapsed time : %1 [ms]").arg(RTCLOCK_MS)) */ #if defined(H2CORE_HAVE_DEBUG) and defined(HAVE_RTCLOCK) #include //#include #define RTCLOCK_SETUP struct timespec __t0,__t1; //uint64_t __dt; #define RTCLOCK_START clock_gettime(CLOCK_MONOTONIC, &__t0); #define RTCLOCK_STOP clock_gettime(CLOCK_MONOTONIC, &__t1); #define RTCLOCK_NS (((__t1.tv_sec * 1000000000) + __t1.tv_nsec) - ((__t0.tv_sec * 1000000000) + __t0.tv_nsec)) #define RTCLOCK_US (((__t1.tv_sec * 1000000000) + __t1.tv_nsec) - ((__t0.tv_sec * 1000000000) + __t0.tv_nsec))/1000 #define RTCLOCK_MS (((__t1.tv_sec * 1000000000) + __t1.tv_nsec) - ((__t0.tv_sec * 1000000000) + __t0.tv_nsec))/1000000 #else #define RTCLOCK_SETUP #define RTCLOCK_START #define RTCLOCK_STOP #define RTCLOCK_NS -1 #define RTCLOCK_US -1 #define RTCLOCK_MS -1 #endif #endif // H2_RTCLOCK_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/sampler/000077500000000000000000000000001366722712400224505ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/sampler/Sampler.h000066400000000000000000000153601366722712400242310ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SAMPLER_H #define SAMPLER_H #include #include #include #include namespace H2Core { class Note; class Song; class Sample; class DrumkitComponent; class Instrument; struct SelectedLayerInfo; class InstrumentComponent; class AudioOutput; /// /// Waveform based sampler. /// class Sampler : public H2Core::Object { H2_OBJECT public: float *__main_out_L; ///< sampler main out (left channel) float *__main_out_R; ///< sampler main out (right channel) /** * Constructor of the Sampler. * * It is called by AudioEngine::AudioEngine() and stored in * AudioEngine::__sampler. */ Sampler(); ~Sampler(); void process( uint32_t nFrames, Song* pSong ); /// Start playing a note void note_on( Note *note ); /// Stop playing a note. void note_off( Note *note ); void midi_keyboard_note_off( int key ); void stop_playing_notes( Instrument *instr = nullptr ); int get_playing_notes_number() { return __playing_notes_queue.size(); } void preview_sample( Sample* sample, int length ); void preview_instrument( Instrument* instr ); void setPlayingNotelength( Instrument* instrument, unsigned long ticks, unsigned long noteOnTick ); bool is_instrument_playing( Instrument* pInstr ); enum InterpolateMode { LINEAR, COSINE, THIRD, CUBIC, HERMITE }; void setInterpolateMode( InterpolateMode mode ){ __interpolateMode = mode; } InterpolateMode getInterpolateMode(){ return __interpolateMode; } /// Instrument used for the playback track feature. Instrument* __playback_instrument; /// Instrument used for the preview feature. Instrument* __preview_instrument; /** * Loading of the playback track. * * The playback track is added to * #__playback_instrument as a new InstrumentLayer * containing the loaded Sample. If * Song::__playback_track_filename is empty, the * layer will be loaded with a nullptr instead. */ void reinitialize_playback_track(); private: std::vector __playing_notes_queue; std::vector __queuedNoteOffs; /** Maximum number of layers to be used in the Instrument editor. It will be inferred from InstrumentComponent::m_nMaxLayers, which itself is inferred from Preferences::m_nMaxLayers. Default value assigned in Preferences::Preferences(): 16.*/ int m_nMaxLayers; bool processPlaybackTrack(int nBufferSize); int __playBackSamplePosition; bool __render_note( Note* pNote, unsigned nBufferSize, Song* pSong ); InterpolateMode __interpolateMode; /* double Interpolate( float y0, float y1, float y2, float y3, double mu ) { switch( __interpolateMode ){ case LINEAR: return linear_Interpolate( y1, y2, (float) mu ); case COSINE: return cosine_Interpolate( y1, y2, mu ); case THIRD: return third_Interpolate( y0, y1, y2, y3, mu ); case CUBIC: return cubic_Interpolate( y0, y1, y2, y3, mu ); case HERMITE: return hermite_Interpolate( y0, y1, y2, y3, mu ); } };*/ inline static float linear_Interpolate( float y1, float y2, float mu ) { /* * mu defines where to estimate the value on the interpolated line * y1 = buffervalue on position * y2 = buffervalue on position +1 */ return y1 * ( 1 - mu ) + y2 * mu; }; inline static float cosine_Interpolate( float y1, float y2, double mu ) { /* * mu defines where to estimate the value on the interpolated line * y1 = buffervalue on position * y2 = buffervalue on position +1 */ double mu2; mu2 = ( 1 - cos ( mu * 3.14159 ) ) / 2; return( y1 * (1 - mu2 ) + y2 * mu2 ); }; inline static float third_Interpolate( float y0, float y1, float y2, float y3, double mu ) { /* * mu defines where to estimate the value on the interpolated line * y0 = buffervalue on position -1 * y1 = buffervalue on position * y2 = buffervalue on position +1 * y3 = buffervalue on position +2 */ float c0 = y1; float c1 = 0.5f * ( y2 - y0 ); float c3 = 1.5f * ( y1 - y2 ) + 0.5f * ( y3 - y0 ); float c2 = y0 - y1 + c1 - c3; return ( ( c3 * mu + c2 ) * mu + c1 ) * mu + c0; }; inline static float cubic_Interpolate( float y0, float y1, float y2, float y3, double mu) { /* * mu defines where to estimate the value on the interpolated line * y0 = buffervalue on position -1 * y1 = buffervalue on position * y2 = buffervalue on position +1 * y3 = buffervalue on position +2 */ double a0, a1, a2, a3, mu2; mu2 = mu * mu; a0 = y3 - y2 - y0 + y1; a1 = y0 - y1 - a0; a2 = y2 - y0; a3 = y1; return( a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3 ); }; inline static float hermite_Interpolate( float y0, float y1, float y2, float y3, double mu ) { /* * mu defines where to estimate the value on the interpolated line * y0 = buffervalue on position -1 * y1 = buffervalue on position * y2 = buffervalue on position +1 * y3 = buffervalue on position +2 */ double a0, a1, a2, a3, mu2; mu2 = mu * mu; a0 = -0.5 * y0 + 1.5 * y1 - 1.5 * y2 + 0.5 * y3; a1 = y0 - 2.5 * y1 + 2 * y2 - 0.5 * y3; a2 = -0.5 * y0 + 0.5 * y2; a3 = y1; return( a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3 ); }; bool __render_note_no_resample( Sample *pSample, Note *pNote, SelectedLayerInfo *pSelectedLayerInfo, InstrumentComponent *pCompo, DrumkitComponent *pDrumCompo, int nBufferSize, int nInitialSilence, float cost_L, float cost_R, float cost_track_L, float cost_track_R, Song* pSong ); bool __render_note_resample( Sample *pSample, Note *pNote, SelectedLayerInfo *pSelectedLayerInfo, InstrumentComponent *pCompo, DrumkitComponent *pDrumCompo, int nBufferSize, int nInitialSilence, float cost_L, float cost_R, float cost_track_L, float cost_track_R, float fLayerPitch, Song* pSong ); }; } // namespace #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/smf/000077500000000000000000000000001366722712400215725ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/smf/SMF.h000066400000000000000000000074341366722712400224000ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2004 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SMF_H #define SMF_H #include #include #include #include #include #include namespace H2Core { class SMFHeader : public SMFBase, public H2Core::Object { H2_OBJECT public: SMFHeader( int nFormat, int nTracks, int nTPQN ); ~SMFHeader(); void addTrack(); virtual std::vector getBuffer(); private: int m_nFormat; ///< SMF format int m_nTracks; ///< number of tracks int m_nTPQN; ///< ticks per quarter note }; class SMFTrack : public SMFBase, public H2Core::Object { H2_OBJECT public: SMFTrack(); ~SMFTrack(); void addEvent( SMFEvent *pEvent ); virtual std::vector getBuffer(); private: std::vector m_eventList; }; class SMF : public SMFBase, public H2Core::Object { H2_OBJECT public: SMF( int nFormat, int nTPQN ); ~SMF(); void addTrack( SMFTrack *pTrack ); virtual std::vector getBuffer(); private: std::vector m_trackList; SMFHeader* m_pHeader; }; typedef std::vector EventList; class SMFWriter : public H2Core::Object { H2_OBJECT public: SMFWriter( const char* sWriterName ); virtual ~SMFWriter(); void save( const QString& sFilename, Song *pSong ); protected: void sortEvents( EventList* pEventList ); SMFTrack* createTrack0( Song* pSong ); virtual SMF* createSMF( Song* pSong )=0; virtual void prepareEvents( Song* pSong, SMF* pSmf )=0; virtual EventList* getEvents( Song* pSong, Instrument* pInstr ) = 0; virtual void packEvents( Song* pSong, SMF* pSmf ) = 0; private: void saveSMF( const QString& sFilename, SMF* pSmf ); }; //------- class SMF1Writer : public SMFWriter { H2_OBJECT public: SMF1Writer( const char* sWriterName ); virtual ~SMF1Writer(); protected: virtual SMF* createSMF( Song* pSong ); }; class SMF1WriterSingle : public SMF1Writer { H2_OBJECT public: SMF1WriterSingle(); virtual ~SMF1WriterSingle(); protected: virtual void prepareEvents( Song* pSong, SMF* pSmf ); virtual void packEvents( Song* pSong, SMF* pSmf ); virtual EventList* getEvents( Song* pSong, Instrument* pInstr ); private: EventList m_eventList; }; class SMF1WriterMulti : public SMF1Writer { H2_OBJECT public: SMF1WriterMulti(); virtual ~SMF1WriterMulti(); protected: virtual void prepareEvents( Song* pSong, SMF* pSmf ); virtual void packEvents( Song* pSong, SMF* pSmf ); virtual EventList* getEvents( Song* pSong, Instrument* pInstr ); private: // contains events for each instrument in separate vector std::vector m_eventLists; }; //------- class SMF0Writer : public SMFWriter { H2_OBJECT public: SMF0Writer(); virtual ~SMF0Writer(); protected: virtual SMF* createSMF( Song* pSong ); virtual void prepareEvents( Song* pSong, SMF* pSmf ); virtual void packEvents( Song* pSong, SMF* pSmf ); virtual EventList* getEvents( Song* pSong, Instrument* pInstr ); private: SMFTrack* m_track; EventList m_eventList; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/smf/SMFEvent.h000066400000000000000000000065771366722712400234110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SMF_EVENT_H #define SMF_EVENT_H #include #include namespace H2Core { class SMFBuffer : public H2Core::Object { H2_OBJECT public: std::vector getBuffer() { return m_buffer; } void writeByte( short int nByte ); void writeWord( int nVal ); void writeDWord( long nVal ); void writeString( const QString& sMsg ); void writeVarLen( long nVal ); std::vector m_buffer; SMFBuffer(); }; enum SMFEventType { NOTE_OFF = 128, NOTE_ON = 144 }; enum SMFMetaEventType { SEQUENCE_NUMBER = 0, TEXT_EVENT, COPYRIGHT_NOTICE, TRACK_NAME, INSTRUMENT_NAME, LYRIC, MARKER, CUE_POINT, END_OF_TRACK = 0x2f, SET_TEMPO = 0x51, TIME_SIGNATURE = 0x58, KEY_SIGNATURE }; class SMFBase { public: virtual ~SMFBase() {} virtual std::vector getBuffer() = 0; }; class SMFEvent : public SMFBase, public H2Core::Object { H2_OBJECT public: SMFEvent( const char* sEventName, unsigned nTicks ); virtual ~SMFEvent(); int m_nTicks; int m_nDeltaTime; }; class SMFTrackNameMetaEvent : public SMFEvent { H2_OBJECT public: SMFTrackNameMetaEvent( const QString& sTrackName, unsigned nDeltaTime ); virtual std::vector getBuffer(); private: QString m_sTrackName; }; class SMFSetTempoMetaEvent : public SMFEvent { H2_OBJECT public: SMFSetTempoMetaEvent( float fBPM, unsigned nDeltaTime ); virtual std::vector getBuffer(); private: unsigned m_fBPM; }; class SMFCopyRightNoticeMetaEvent : public SMFEvent { H2_OBJECT public: SMFCopyRightNoticeMetaEvent( const QString& sAuthor, unsigned nDeltaTime ); virtual std::vector getBuffer(); private: QString m_sAuthor; }; class SMFTimeSignatureMetaEvent : public SMFEvent { H2_OBJECT public: SMFTimeSignatureMetaEvent( unsigned nBeats, unsigned nNote , unsigned nMTPMC , unsigned nTSNP24 , unsigned nTicks ); virtual std::vector getBuffer(); // MTPMC = MIDI ticks per metronome click // TSNP24 = Thirty Second Notes Per 24 MIDI Ticks. private: unsigned m_nBeats, m_nNote, m_nMTPMC , m_nTSNP24 , m_nTicks; }; class SMFNoteOnEvent : public SMFEvent { H2_OBJECT public: SMFNoteOnEvent( unsigned nTicks, int nChannel, int nPitch, int nVelocity ); virtual std::vector getBuffer(); protected: unsigned m_nChannel; unsigned m_nPitch; unsigned m_nVelocity; }; class SMFNoteOffEvent : public SMFEvent { H2_OBJECT public: SMFNoteOffEvent( unsigned nTicks, int nChannel, int nPitch, int nVelocity ); virtual std::vector getBuffer(); protected: unsigned m_nChannel; unsigned m_nPitch; unsigned m_nVelocity; }; }; #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/synth/000077500000000000000000000000001366722712400221525ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/include/hydrogen/synth/Synth.h000066400000000000000000000034231366722712400234320ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SYNTH_H #define SYNTH_H #include // For uint32_t et al #include #include #include #include #include namespace H2Core { /// /// A simple synthetizer... /// class Synth : public H2Core::Object { H2_OBJECT public: float *m_pOut_L; float *m_pOut_R; /** * Constructor of the Synth. * * It is called by AudioEngine::AudioEngine() and stored in * AudioEngine::__synth. */ Synth(); ~Synth(); /// Start playing a note void noteOn( Note* pNote ); /// Stop playing a note. void noteOff( Note* pNote ); void process( uint32_t nFrames ); void setAudioOutput( AudioOutput* pAudioOutput ); int getPlayingNotesNumber() { return m_playingNotesQueue.size(); } private: std::vector m_playingNotesQueue; float m_fTheta; AudioOutput *m_pAudioOutput; }; } // namespace H2Core #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/timehelper.h000066400000000000000000000023631366722712400233200ustar00rootroot00000000000000#if defined(WIN32) || _DOXYGEN_ #include #include #ifndef TIMEHELPER_H #define TIMEHELPER_H #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 #else #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL #endif #ifndef timersub # define timersub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ if ((result)->tv_usec < 0) { \ --(result)->tv_sec; \ (result)->tv_usec += 1000000; \ } \ } while (0) #endif #ifndef _TIMEZONE_DEFINED /* also in sys/time.h and time.h */ /* * Maybe I should #define _TIMEZONE_DEFINED but more care is needed. * It will be OK for now, if this file is included last. * Investigate what else is defined/declared in the other files. * Investigate the declaration of function gettimeofday below. */ struct timezone { int tz_minuteswest; /* minutes W of Greenwich */ int tz_dsttime; /* type of dst correction */ }; #endif /* _TIMEZONE_DEFINED */ int gettimeofday(struct timeval *tv, struct timezone *tz); #endif #endif hydrogen-1.0.0-rc1/src/core/include/hydrogen/timeline.h000066400000000000000000000036541366722712400227740ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { class Timeline : public H2Core::Object { H2_OBJECT public: Timeline(); ///sample editor vectors void sortTimelineVector(); void sortTimelineTagVector(); /// timeline vector struct HTimelineVector { int m_htimelinebeat; //beat position in timeline float m_htimelinebpm; //BPM }; /// timeline tag vector struct HTimelineTagVector { int m_htimelinetagbeat; //beat position in timeline QString m_htimelinetag; // tag }; std::vector m_timelinevector; std::vector m_timelinetagvector; struct TimelineComparator { bool operator()( HTimelineVector const& lhs, HTimelineVector const& rhs) { return lhs.m_htimelinebeat < rhs.m_htimelinebeat; } }; struct TimelineTagComparator { bool operator()( HTimelineTagVector const& lhs, HTimelineTagVector const& rhs) { return lhs.m_htimelinetagbeat < rhs.m_htimelinetagbeat; } }; private: }; }; #endif // TIMELINE_H hydrogen-1.0.0-rc1/src/core/include/hydrogen/version.h000066400000000000000000000005601366722712400226440ustar00rootroot00000000000000 #ifndef H2C_VERSION_H #define H2C_VERSION_H #include namespace H2Core { /// Returns the current Hydrogen version string std::string get_version(); /** * return true of the current version is older than the given values */ bool version_older_than( int major, int minor, int patch ); #endif // H2C_VERSION }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/000077500000000000000000000000001366722712400163325ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/IO/000077500000000000000000000000001366722712400166415ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/IO/alsa_audio_driver.cpp000066400000000000000000000227431366722712400230310ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_ALSA) || _DOXYGEN_ #include #include #include namespace H2Core { pthread_t alsaAudioDriverThread; static int alsa_xrun_recovery( snd_pcm_t *handle, int err ) { if ( err == -EPIPE ) { /* under-run */ err = snd_pcm_prepare( handle ); } else if ( err == -ESTRPIPE ) { while ( ( err = snd_pcm_resume( handle ) ) == -EAGAIN ) { sleep( 1 ); /* wait until the suspend flag is released */ } if ( err < 0 ) { err = snd_pcm_prepare( handle ); if ( err < 0 ) { std::cerr << "Can't recover from suspend, prepare failed: " << snd_strerror( err ) << std::endl; } } return 0; } return err; } void* alsaAudioDriver_processCaller( void* param ) { Object *__object = (Object*)param; AlsaAudioDriver *pDriver = ( AlsaAudioDriver* )param; // stolen from amSynth struct sched_param sched; sched.sched_priority = 50; int res = sched_setscheduler( 0, SCHED_FIFO, &sched ); sched_getparam( 0, &sched ); if ( res ) { __ERRORLOG( "Can't set realtime scheduling for ALSA Driver" ); } __INFOLOG( QString( "Scheduling priority = %1" ).arg( sched.sched_priority ) ); sleep( 1 ); int err; if ( ( err = snd_pcm_prepare( pDriver->m_pPlayback_handle ) ) < 0 ) { __ERRORLOG( QString( "Cannot prepare audio interface for use: %1" ).arg( snd_strerror ( err ) ) ); } int nFrames = pDriver->m_nBufferSize; __INFOLOG( QString( "nFrames: %1" ).arg( nFrames ) ); short pBuffer[ nFrames * 2 ]; float *pOut_L = pDriver->m_pOut_L; float *pOut_R = pDriver->m_pOut_R; while ( pDriver->m_bIsRunning ) { // prepare the audio data pDriver->m_processCallback( nFrames, nullptr ); for ( int i = 0; i < nFrames; ++i ) { pBuffer[ i * 2 ] = ( short )( pOut_L[ i ] * 32768.0 ); pBuffer[ i * 2 + 1 ] = ( short )( pOut_R[ i ] * 32768.0 ); } if ( ( err = snd_pcm_writei( pDriver->m_pPlayback_handle, pBuffer, nFrames ) ) < 0 ) { __ERRORLOG( "XRUN" ); if ( alsa_xrun_recovery( pDriver->m_pPlayback_handle, err ) < 0 ) { __ERRORLOG( "Can't recover from XRUN" ); } // retry if ( ( err = snd_pcm_writei( pDriver->m_pPlayback_handle, pBuffer, nFrames ) ) < 0 ) { __ERRORLOG( "XRUN 2" ); if ( alsa_xrun_recovery( pDriver->m_pPlayback_handle, err ) < 0 ) { __ERRORLOG( "Can't recover from XRUN" ); } } pDriver->m_nXRuns++; } } return nullptr; } const char* AlsaAudioDriver::__class_name = "AlsaAudioDriver"; AlsaAudioDriver::AlsaAudioDriver( audioProcessCallback processCallback ) : AudioOutput( __class_name ) , m_bIsRunning( false ) , m_pOut_L( nullptr ) , m_pOut_R( nullptr ) , m_nXRuns( 0 ) , m_nBufferSize( 0 ) , m_pPlayback_handle( nullptr ) , m_processCallback( processCallback ) { INFOLOG( "INIT" ); m_nSampleRate = Preferences::get_instance()->m_nSampleRate; m_sAlsaAudioDevice = Preferences::get_instance()->m_sAlsaAudioDevice; } AlsaAudioDriver::~AlsaAudioDriver() { if ( m_nXRuns > 0 ) { WARNINGLOG( QString( "%1 xruns" ).arg( m_nXRuns ) ); } INFOLOG( "DESTROY" ); } int AlsaAudioDriver::init( unsigned nBufferSize ) { INFOLOG( "init" ); m_nBufferSize = nBufferSize; return 0; // ok } int AlsaAudioDriver::connect() { INFOLOG( "alsa device: " + m_sAlsaAudioDevice ); int nChannels = 2; int err; // provo ad aprire il device per verificare se e' libero ( non bloccante ) if ( ( err = snd_pcm_open( &m_pPlayback_handle, m_sAlsaAudioDevice.toLocal8Bit(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ) ) < 0 ) { ERRORLOG( QString( "ALSA: cannot open audio device %1:%2" ).arg( m_sAlsaAudioDevice ).arg( snd_strerror( err ) ) ); // il dispositivo e' occupato..provo con "default" m_sAlsaAudioDevice = "default"; if ( ( err = snd_pcm_open( &m_pPlayback_handle, m_sAlsaAudioDevice.toLocal8Bit(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ) ) < 0 ) { ERRORLOG( QString( "ALSA: cannot open audio device %1:%2" ).arg( m_sAlsaAudioDevice ) .arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } WARNINGLOG( "Using alsa device: " + m_sAlsaAudioDevice ); } snd_pcm_close( m_pPlayback_handle ); // Apro il device ( bloccante ) if ( ( err = snd_pcm_open( &m_pPlayback_handle, m_sAlsaAudioDevice.toLocal8Bit(), SND_PCM_STREAM_PLAYBACK, 0 ) ) < 0 ) { ERRORLOG( QString( "ALSA: cannot open audio device %1:%2" ).arg( m_sAlsaAudioDevice ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca( &hw_params ); if ( hw_params == nullptr ) { ERRORLOG( "error in snd_pcm_hw_params_alloca" ); return 1; } if ( ( err = snd_pcm_hw_params_any( m_pPlayback_handle, hw_params ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_any: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } // snd_pcm_hw_params_set_access( m_pPlayback_handle, hw_params, SND_PCM_ACCESS_MMAP_INTERLEAVED ); if ( ( err = snd_pcm_hw_params_set_access( m_pPlayback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_set_access: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } if ( ( err = snd_pcm_hw_params_set_format( m_pPlayback_handle, hw_params, SND_PCM_FORMAT_S16_LE ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_set_format: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } snd_pcm_hw_params_set_rate_near( m_pPlayback_handle, hw_params, &m_nSampleRate, nullptr ); if ( ( err = snd_pcm_hw_params_set_channels( m_pPlayback_handle, hw_params, nChannels ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_set_channels: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } // Configure buffer size, periods and period size. The user // "BufferSize" setting defines the user's intention for the // number of frames processed in a callback period. In ALSA, this // is the "period", whereas the actual buffer (as reported by // *_get_buffer_size) is sized to keep at least 2 periods' worth // of data. // unsigned nPeriods = 2; if ( ( err = snd_pcm_hw_params_set_periods_near( m_pPlayback_handle, hw_params, &nPeriods, nullptr ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_set_periods: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } INFOLOG( QString( "nPeriods: %1" ).arg( nPeriods ) ); snd_pcm_uframes_t period_size = m_nBufferSize; if ( ( err = snd_pcm_hw_params_set_period_size_near( m_pPlayback_handle, hw_params, &period_size, 0 ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params_set_period_size: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } m_nBufferSize = period_size; if ( ( err = snd_pcm_hw_params( m_pPlayback_handle, hw_params ) ) < 0 ) { ERRORLOG( QString( "error in snd_pcm_hw_params: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); return 1; } snd_pcm_hw_params_get_rate( hw_params, &m_nSampleRate, nullptr ); INFOLOG( QString( "*** PERIOD SIZE: %1" ).arg( period_size ) ); INFOLOG( QString( "*** SAMPLE RATE: %1" ).arg( m_nSampleRate ) ); INFOLOG( QString( "*** BUFFER SIZE: %1" ).arg( nPeriods * m_nBufferSize ) ); //snd_pcm_hw_params_free( hw_params ); m_pOut_L = new float[ m_nBufferSize ]; m_pOut_R = new float[ m_nBufferSize ]; memset( m_pOut_L, 0, m_nBufferSize * sizeof( float ) ); memset( m_pOut_R, 0, m_nBufferSize * sizeof( float ) ); m_bIsRunning = true; // start the main thread pthread_attr_t attr; pthread_attr_init( &attr ); pthread_create( &alsaAudioDriverThread, &attr, alsaAudioDriver_processCaller, this ); return 0; // OK } void AlsaAudioDriver::disconnect() { INFOLOG( "[disconnect]" ); m_bIsRunning = false; pthread_join( alsaAudioDriverThread, nullptr ); snd_pcm_close( m_pPlayback_handle ); delete[] m_pOut_L; m_pOut_L = nullptr; delete[] m_pOut_R; m_pOut_R = nullptr; } unsigned AlsaAudioDriver::getBufferSize() { return m_nBufferSize; } unsigned AlsaAudioDriver::getSampleRate() { return m_nSampleRate; } float* AlsaAudioDriver::getOut_L() { return m_pOut_L; } float* AlsaAudioDriver::getOut_R() { return m_pOut_R; } void AlsaAudioDriver::updateTransportInfo() { //errorLog( "[updateTransportInfo] not implemented yet" ); } void AlsaAudioDriver::play() { INFOLOG( "play" ); m_transport.m_status = TransportInfo::ROLLING; } void AlsaAudioDriver::stop() { INFOLOG( "stop" ); m_transport.m_status = TransportInfo::STOPPED; } void AlsaAudioDriver::locate( unsigned long nFrame ) { // infoLog( "[locate] " + to_string( nFrame ) ); m_transport.m_nFrames = nFrame; // m_transport.printInfo(); } void AlsaAudioDriver::setBpm( float fBPM ) { // warningLog( "[setBpm] " + to_string(fBPM) ); m_transport.m_fBPM = fBPM; } }; #endif // H2CORE_HAVE_ALSA hydrogen-1.0.0-rc1/src/core/src/IO/alsa_midi_driver.cpp000066400000000000000000000414071366722712400226500ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_ALSA) || _DOXYGEN_ #include #include #include #include #include #include #include #include #ifdef H2CORE_HAVE_LASH #include #endif using namespace std; namespace H2Core { pthread_t midiDriverThread; bool isMidiDriverRunning = false; snd_seq_t *seq_handle = nullptr; int npfd; struct pollfd *pfd; int portId; int clientId; int outPortId; void* alsaMidiDriver_thread( void* param ) { Object* __object = ( Object* )param; AlsaMidiDriver *pDriver = ( AlsaMidiDriver* )param; __INFOLOG( "starting" ); if ( seq_handle != nullptr ) { __ERRORLOG( "seq_handle != NULL" ); pthread_exit( nullptr ); } int err; if ( ( err = snd_seq_open( &seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0 ) ) < 0 ) { __ERRORLOG( QString( "Error opening ALSA sequencer: %1" ).arg( QString::fromLocal8Bit(snd_strerror(err)) ) ); pthread_exit( nullptr ); } snd_seq_set_client_name( seq_handle, "Hydrogen" ); if ( ( portId = snd_seq_create_simple_port( seq_handle, "Hydrogen Midi-In", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION ) ) < 0 ) { __ERRORLOG( "Error creating sequencer port." ); pthread_exit( nullptr ); } if ( ( outPortId = snd_seq_create_simple_port( seq_handle, "Hydrogen Midi-Out", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_APPLICATION ) ) < 0 ) { __ERRORLOG( "Error creating sequencer port." ); pthread_exit( nullptr ); } clientId = snd_seq_client_id( seq_handle ); #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if (lashClient && lashClient->isConnected()) { lashClient->setAlsaClientId((unsigned char) clientId); } } #endif int m_local_addr_inport = portId; int m_local_addr_outport = outPortId; int m_local_addr_client = clientId; QString sPortName = Preferences::get_instance()->m_sMidiPortName; int m_dest_addr_port = -1; int m_dest_addr_client = -1; pDriver->getPortInfo( sPortName, m_dest_addr_client, m_dest_addr_port ); __INFOLOG( "MIDI input port name: " + sPortName ); __INFOLOG( QString( "MIDI input addr client: %1").arg( m_dest_addr_client ) ); __INFOLOG( QString( "MIDI input addr port: %1").arg( m_dest_addr_port ) ); if ( ( m_dest_addr_port != -1 ) && ( m_dest_addr_client != -1 ) ) { snd_seq_port_subscribe_t *subs; snd_seq_port_subscribe_alloca( &subs ); snd_seq_addr_t sender, dest; sender.client = m_dest_addr_client; sender.port = m_dest_addr_port; dest.client = m_local_addr_client; dest.port = m_local_addr_inport; /* set in and out ports */ snd_seq_port_subscribe_set_sender( subs, &sender ); snd_seq_port_subscribe_set_dest( subs, &dest ); /* subscribe */ int ret = snd_seq_subscribe_port( seq_handle, subs ); if ( ret < 0 ) { __ERRORLOG( QString( "snd_seq_subscribe_port(%1:%2) error" ).arg( m_dest_addr_client ).arg( m_dest_addr_port ) ); } } __INFOLOG( QString( "Midi input port at %1:%2" ).arg( clientId ).arg( portId ) ); //Connect output port to predefined output sPortName = Preferences::get_instance()->m_sMidiOutputPortName; m_dest_addr_port = -1; m_dest_addr_client = -1; pDriver->getPortInfo( sPortName, m_dest_addr_client, m_dest_addr_port ); __INFOLOG( "MIDI output port name: " + sPortName ); __INFOLOG( QString( "MIDI output addr client: %1").arg( m_dest_addr_client ) ); __INFOLOG( QString( "MIDI output addr port: %1").arg( m_dest_addr_port ) ); if ( ( m_dest_addr_port != -1 ) && ( m_dest_addr_client != -1 ) ) { snd_seq_port_subscribe_t *subs; snd_seq_port_subscribe_alloca( &subs ); snd_seq_addr_t sender, dest; sender.client = m_local_addr_client; sender.port = m_local_addr_outport; dest.client = m_dest_addr_client; dest.port = m_dest_addr_port; /* set in and out ports */ snd_seq_port_subscribe_set_sender( subs, &sender ); snd_seq_port_subscribe_set_dest( subs, &dest ); /* subscribe */ int ret = snd_seq_subscribe_port( seq_handle, subs ); if ( ret < 0 ) { __ERRORLOG( QString( "snd_seq_subscribe_port(%1:%2) error" ).arg( m_dest_addr_client ).arg( m_dest_addr_port ) ); } } __INFOLOG( QString( "Midi output port at %1:%2" ).arg( clientId ).arg( outPortId ) ); npfd = snd_seq_poll_descriptors_count( seq_handle, POLLIN ); pfd = ( struct pollfd* )alloca( npfd * sizeof( struct pollfd ) ); snd_seq_poll_descriptors( seq_handle, pfd, npfd, POLLIN ); __INFOLOG( "MIDI Thread INIT" ); while ( isMidiDriverRunning ) { if ( poll( pfd, npfd, 100 ) > 0 ) { pDriver->midi_action( seq_handle ); } } snd_seq_close ( seq_handle ); seq_handle = nullptr; __INFOLOG( "MIDI Thread DESTROY" ); pthread_exit( nullptr ); return nullptr; } const char* AlsaMidiDriver::__class_name = "AlsaMidiDriver"; AlsaMidiDriver::AlsaMidiDriver() : MidiInput( __class_name ), MidiOutput( __class_name ), Object( __class_name ) { // infoLog("INIT"); } AlsaMidiDriver::~AlsaMidiDriver() { if ( isMidiDriverRunning ) { close(); } // infoLog("DESTROY"); } void AlsaMidiDriver::open() { // start main thread isMidiDriverRunning = true; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_create( &midiDriverThread, &attr, alsaMidiDriver_thread, ( void* )this ); } void AlsaMidiDriver::close() { isMidiDriverRunning = false; pthread_join( midiDriverThread, nullptr ); } void AlsaMidiDriver::midi_action( snd_seq_t *seq_handle ) { Hydrogen *engine = Hydrogen::get_instance(); int nState = engine->getState(); if ( ( nState != STATE_READY ) && ( nState != STATE_PLAYING ) ) { // ERRORLOG( "Skipping midi event! Audio engine not ready." ); return; } // bool useMidiTransport = true; snd_seq_event_t *ev; do { if ( !seq_handle ) { break; } snd_seq_event_input( seq_handle, &ev ); if ( m_bActive && ev != nullptr ) { MidiMessage msg; switch ( ev->type ) { case SND_SEQ_EVENT_NOTEON: msg.m_type = MidiMessage::NOTE_ON; msg.m_nData1 = ev->data.note.note; msg.m_nData2 = ev->data.note.velocity; msg.m_nChannel = ev->data.control.channel; break; case SND_SEQ_EVENT_NOTEOFF: msg.m_type = MidiMessage::NOTE_OFF; msg.m_nData1 = ev->data.note.note; msg.m_nData2 = ev->data.note.velocity; msg.m_nChannel = ev->data.control.channel; break; case SND_SEQ_EVENT_CONTROLLER: msg.m_type = MidiMessage::CONTROL_CHANGE; msg.m_nData1 = ev->data.control.param; msg.m_nData2 = ev->data.control.value; msg.m_nChannel = ev->data.control.channel; break; case SND_SEQ_EVENT_KEYPRESS: msg.m_type = MidiMessage::POLYPHONIC_KEY_PRESSURE; msg.m_nData1 = ev->data.note.note; msg.m_nData2 = ev->data.note.velocity; msg.m_nChannel = ev->data.control.channel; break; case SND_SEQ_EVENT_SYSEX: { msg.m_type = MidiMessage::SYSEX; snd_midi_event_t *seq_midi_parser; if ( snd_midi_event_new( 32, &seq_midi_parser ) ) { ERRORLOG( "Error creating midi event parser" ); } unsigned char midi_event_buffer[ 256 ]; int _bytes_read = snd_midi_event_decode( seq_midi_parser, midi_event_buffer, 32, ev ); for ( int i = 0; i < _bytes_read; ++i ) { msg.m_sysexData.push_back( midi_event_buffer[ i ] ); } } break; case SND_SEQ_EVENT_QFRAME: msg.m_type = MidiMessage::QUARTER_FRAME; break; case SND_SEQ_EVENT_CLOCK: //cout << "!!! Midi CLock" << endl; break; case SND_SEQ_EVENT_SONGPOS: msg.m_type = MidiMessage::SONG_POS; break; case SND_SEQ_EVENT_START: msg.m_type = MidiMessage::START; break; case SND_SEQ_EVENT_CONTINUE: msg.m_type = MidiMessage::CONTINUE; break; case SND_SEQ_EVENT_STOP: msg.m_type = MidiMessage::STOP; break; case SND_SEQ_EVENT_PITCHBEND: break; case SND_SEQ_EVENT_PGMCHANGE: msg.m_type = MidiMessage::PROGRAM_CHANGE; msg.m_nData1 = ev->data.control.value; msg.m_nChannel = ev->data.control.channel; break; case SND_SEQ_EVENT_CLIENT_EXIT: INFOLOG( "SND_SEQ_EVENT_CLIENT_EXIT" ); break; case SND_SEQ_EVENT_PORT_SUBSCRIBED: INFOLOG( "SND_SEQ_EVENT_PORT_SUBSCRIBED" ); break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: INFOLOG( "SND_SEQ_EVENT_PORT_UNSUBSCRIBED" ); break; case SND_SEQ_EVENT_SENSING: break; default: WARNINGLOG( QString( "Unknown MIDI Event. type = %1" ).arg( ( int )ev->type ) ); } if ( msg.m_type != MidiMessage::UNKNOWN ) { handleMidiMessage( msg ); } } snd_seq_free_event( ev ); } while ( snd_seq_event_input_pending( seq_handle, 0 ) > 0 ); } std::vector AlsaMidiDriver::getInputPortList() { vector inputList; if ( seq_handle == nullptr ) { return inputList; } snd_seq_client_info_t *cinfo; // client info snd_seq_port_info_t *pinfo; // port info snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); /* while the next client one the sequencer is available */ while ( snd_seq_query_next_client( seq_handle, cinfo ) >= 0 ) { // get client from cinfo int client = snd_seq_client_info_get_client( cinfo ); // fill pinfo snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); // while the next port is available while ( snd_seq_query_next_port( seq_handle, pinfo ) >= 0 ) { /* get its capability */ int cap = snd_seq_port_info_get_capability( pinfo ); if ( snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) && snd_seq_port_info_get_client( pinfo ) != 0 ) { // output ports if ( ( cap & SND_SEQ_PORT_CAP_SUBS_WRITE ) != 0 && snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) ) { INFOLOG( snd_seq_port_info_get_name( pinfo ) ); inputList.push_back( snd_seq_port_info_get_name( pinfo ) ); //info.m_nClient = snd_seq_port_info_get_client(pinfo); //info.m_nPort = snd_seq_port_info_get_port(pinfo); } } } } return inputList; } std::vector AlsaMidiDriver::getOutputPortList() { vector outputList; if ( seq_handle == nullptr ) { return outputList; } snd_seq_client_info_t *cinfo; // client info snd_seq_port_info_t *pinfo; // port info snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); /* while the next client one the sequencer is available */ while ( snd_seq_query_next_client( seq_handle, cinfo ) >= 0 ) { // get client from cinfo int client = snd_seq_client_info_get_client( cinfo ); // fill pinfo snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); // while the next port is available while ( snd_seq_query_next_port( seq_handle, pinfo ) >= 0 ) { /* get its capability */ int cap = snd_seq_port_info_get_capability( pinfo ); if ( snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) && snd_seq_port_info_get_client( pinfo ) != 0 ) { // output ports if ( ( cap & SND_SEQ_PORT_CAP_SUBS_READ ) != 0 && snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) ) { INFOLOG( snd_seq_port_info_get_name( pinfo ) ); outputList.push_back( snd_seq_port_info_get_name( pinfo ) ); //info.m_nClient = snd_seq_port_info_get_client(pinfo); //info.m_nPort = snd_seq_port_info_get_port(pinfo); } } } } return outputList; } void AlsaMidiDriver::getPortInfo( const QString& sPortName, int& nClient, int& nPort ) { if ( seq_handle == nullptr ) { ERRORLOG( "seq_handle = NULL " ); return; } if ( sPortName == "None" ) { nClient = -1; nPort = -1; return; } snd_seq_client_info_t *cinfo; // client info snd_seq_port_info_t *pinfo; // port info snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); /* while the next client one the sequencer is available */ while ( snd_seq_query_next_client( seq_handle, cinfo ) >= 0 ) { // get client from cinfo int client = snd_seq_client_info_get_client( cinfo ); // fill pinfo snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); // while the next port is avail while ( snd_seq_query_next_port( seq_handle, pinfo ) >= 0 ) { int cap = snd_seq_port_info_get_capability( pinfo ); if ( snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) && snd_seq_port_info_get_client( pinfo ) != 0 ) { // output ports if ( ( cap & SND_SEQ_PORT_CAP_SUBS_READ ) != 0 && snd_seq_client_id( seq_handle ) != snd_seq_port_info_get_client( pinfo ) ) { QString sName = snd_seq_port_info_get_name( pinfo ); if ( sName == sPortName ) { nClient = snd_seq_port_info_get_client( pinfo ); nPort = snd_seq_port_info_get_port( pinfo ); INFOLOG( QString( "nClient %1" ).arg( nClient ) ); INFOLOG( QString( "nPort %1" ).arg( nPort ) ); return; } } } } } ERRORLOG( "Midi port " + sPortName + " not found" ); } void AlsaMidiDriver::handleQueueNote(Note* pNote) { if ( seq_handle == nullptr ) { ERRORLOG( "seq_handle = NULL " ); return; } int channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } int key = pNote->get_midi_key(); int velocity = pNote->get_midi_velocity(); snd_seq_event_t ev; //Note off snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, outPortId); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); snd_seq_ev_set_noteoff(&ev, channel, key, velocity); snd_seq_event_output(seq_handle, &ev); snd_seq_drain_output(seq_handle); //Note on //snd_seq_event_input(seq_handle, &ev); snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, outPortId); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); //snd_seq_event_output_direct( seq_handle, ev ); snd_seq_ev_set_noteon(&ev, channel, key, velocity); snd_seq_event_output(seq_handle, &ev); //snd_seq_free_event(ev); snd_seq_drain_output(seq_handle); } void AlsaMidiDriver::handleOutgoingControlChange( int param, int value, int channel ) { snd_seq_event_t ev; snd_seq_ev_clear(&ev); ev.type = SND_SEQ_EVENT_CONTROLLER; snd_seq_ev_set_source(&ev, outPortId); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); ev.data.control.param = param; ev.data.control.value = value; ev.data.control.channel = channel; snd_seq_event_output_direct(seq_handle, &ev); } void AlsaMidiDriver::handleQueueNoteOff( int channel, int key, int velocity ) { if ( seq_handle == nullptr ) { ERRORLOG( "seq_handle = NULL " ); return; } // channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } // key = (pNote->m_noteKey.m_nOctave +3 ) * 12 + pNote->m_noteKey.m_key; // int velocity = pNote->get_midi_velocity(); snd_seq_event_t ev; //Note off snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, outPortId); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); snd_seq_ev_set_noteoff(&ev, channel, key, velocity); snd_seq_event_output(seq_handle, &ev); snd_seq_drain_output(seq_handle); } void AlsaMidiDriver::handleQueueAllNoteOff() { if ( seq_handle == nullptr ) { ERRORLOG( "seq_handle = NULL " ); return; } InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list(); unsigned int numInstruments = instList->size(); for (int index = 0; index < numInstruments; ++index) { Instrument *curInst = instList->get(index); int channel = curInst->get_midi_out_channel(); if (channel < 0) { continue; } int key = curInst->get_midi_out_note(); snd_seq_event_t ev; //Note off snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, outPortId); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); snd_seq_ev_set_noteoff(&ev, channel, key, 0); snd_seq_event_output(seq_handle, &ev); snd_seq_drain_output(seq_handle); } } }; #endif // H2CORE_HAVE_ALSA hydrogen-1.0.0-rc1/src/core/src/IO/coreaudio_driver.cpp000066400000000000000000000213121366722712400226710ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://hydrogen.sourceforge.net * * CoreAudio Driver for Hydrogen * Copyright(c) 2005 by Jonathan Dempsey [jonathandempsey@fastmail.fm] * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * * Rewrote CoreAudio driver, now using AUHAL (2005/03/02 Jonathan Dempsey) * Set Hydrogen to detect hardware device buffer size (2005/03/06 Jonathan Dempsey) * Cleaned up the code a bit (2005/11/29 Jonathan Dempsey) * More cleaning . . . (2005/12/28 Jonathan Dempsey) */ #include #if defined(H2CORE_HAVE_COREAUDIO) || _DOXYGEN_ #include "CoreServices/CoreServices.h" /// /// The Render Callback /// static OSStatus renderProc( void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData ) { H2Core::CoreAudioDriver* pDriver = ( H2Core::CoreAudioDriver * )inRefCon; pDriver->mProcessCallback( pDriver->m_nBufferSize, NULL ); for ( unsigned i = 0; i < ioData->mNumberBuffers; i++ ) { AudioBuffer &outData = ioData->mBuffers[ i ]; Float32* pOutData = ( float* )( outData.mData ); float *pAudioSource; if ( i == 0 ) { pAudioSource = pDriver->m_pOut_L; } else { pAudioSource = pDriver->m_pOut_R; } for ( unsigned j = 0; j < inNumberFrames; ++j ) { pOutData[ j ] = pAudioSource[ j ]; } } return noErr; } namespace H2Core { const char* CoreAudioDriver::__class_name = "CoreAudioDriver"; void CoreAudioDriver::retrieveDefaultDevice(void) { UInt32 dataSize = 0; OSStatus err = 0; AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; dataSize = sizeof(AudioDeviceID); err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, &m_outputDevice); if ( err != noErr ) { ERRORLOG( "Could not get Default Output Device" ); } } void CoreAudioDriver::retrieveBufferSize(void) { UInt32 dataSize = 0; OSStatus err = 0; AudioObjectPropertyAddress propertyAddress = { kAudioDevicePropertyBufferFrameSize, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; dataSize = sizeof( m_nBufferSize ); err = AudioObjectGetPropertyData(m_outputDevice, &propertyAddress, 0, NULL, &dataSize, ( void * )&m_nBufferSize ); if ( err != noErr ) { ERRORLOG( "get BufferSize error" ); } INFOLOG( QString( "Buffersize: %1" ).arg( m_nBufferSize ) ); } void CoreAudioDriver::printStreamInfo(void) { AudioStreamBasicDescription outputStreamBasicDescription; UInt32 propertySize = sizeof( outputStreamBasicDescription ); OSStatus err = 0; AudioObjectPropertyAddress propertyAddress = { kAudioDevicePropertyStreamFormat, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; err = AudioObjectGetPropertyData(m_outputDevice, &propertyAddress, 0, NULL, &propertySize, &outputStreamBasicDescription ); if ( err ) { ERRORLOG( QString("AudioDeviceGetProperty: returned %1 when getting kAudioDevicePropertyStreamFormat").arg(err) ); } INFOLOG( QString("SampleRate: %1").arg( outputStreamBasicDescription.mSampleRate ) ); INFOLOG( QString("BytesPerPacket: %1").arg( outputStreamBasicDescription.mBytesPerPacket ) ); INFOLOG( QString("FramesPerPacket: %1").arg( outputStreamBasicDescription.mFramesPerPacket ) ); INFOLOG( QString("BytesPerFrame: %1").arg( outputStreamBasicDescription.mBytesPerFrame ) ); INFOLOG( QString("ChannelsPerFrame: %1").arg( outputStreamBasicDescription.mChannelsPerFrame ) ); INFOLOG( QString("BitsPerChannel: %1").arg( outputStreamBasicDescription.mBitsPerChannel ) ); } CoreAudioDriver::CoreAudioDriver( audioProcessCallback processCallback ) : H2Core::AudioOutput( __class_name ) , m_bIsRunning( false ) , mProcessCallback( processCallback ) , m_pOut_L( NULL ) , m_pOut_R( NULL ) { //INFOLOG( "INIT" ); m_nSampleRate = Preferences::get_instance()->m_nSampleRate; //Get the default playback device and store it in m_outputDevice retrieveDefaultDevice(); //Get the buffer size of the previously detected device and store it in m_nBufferSize retrieveBufferSize(); // print some info printStreamInfo(); } CoreAudioDriver::~CoreAudioDriver() { //INFOLOG( "DESTROY" ); disconnect(); } int CoreAudioDriver::init( unsigned bufferSize ) { OSStatus err = noErr; m_pOut_L = new float[ m_nBufferSize ]; m_pOut_R = new float[ m_nBufferSize ]; memset ( m_pOut_L, 0, m_nBufferSize * sizeof( float ) ); memset ( m_pOut_R, 0, m_nBufferSize * sizeof( float ) ); // Get Component AudioComponent compOutput; AudioComponentDescription descAUHAL; descAUHAL.componentType = kAudioUnitType_Output; descAUHAL.componentSubType = kAudioUnitSubType_HALOutput; descAUHAL.componentManufacturer = kAudioUnitManufacturer_Apple; descAUHAL.componentFlags = 0; descAUHAL.componentFlagsMask = 0; compOutput = AudioComponentFindNext( NULL, &descAUHAL ); if ( compOutput == NULL ) { ERRORLOG( "Error in FindNextComponent" ); //exit (-1); } err = AudioComponentInstanceNew( compOutput, &m_outputUnit ); if ( err != noErr ) { ERRORLOG( "Error Opening Component" ); } // Get Current Output Device retrieveDefaultDevice(); // Set AUHAL to Current Device err = AudioUnitSetProperty( m_outputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &m_outputDevice, sizeof( m_outputDevice ) ); if ( err != noErr ) { ERRORLOG( "Could not set Current Device" ); } AudioStreamBasicDescription asbdesc; asbdesc.mSampleRate = ( Float64 )m_nSampleRate; asbdesc.mFormatID = kAudioFormatLinearPCM; asbdesc.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved; asbdesc.mBytesPerPacket = sizeof( Float32 ); asbdesc.mFramesPerPacket = 1; asbdesc.mBytesPerFrame = sizeof( Float32 ); asbdesc.mChannelsPerFrame = 2; // comix: was set to 1 asbdesc.mBitsPerChannel = 32; err = AudioUnitSetProperty( m_outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &asbdesc, sizeof( AudioStreamBasicDescription ) ); // Set Render Callback AURenderCallbackStruct out; out.inputProc = renderProc; out.inputProcRefCon = ( void * )this; err = AudioUnitSetProperty( m_outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &out, sizeof( out ) ); if ( err != noErr ) { ERRORLOG( "Could not Set Render Callback" ); } //Initialize AUHAL err = AudioUnitInitialize( m_outputUnit ); if ( err != noErr ) { ERRORLOG( "Could not Initialize AudioUnit" ); } return 0; } int CoreAudioDriver::connect() { OSStatus err; err = AudioOutputUnitStart( m_outputUnit ); if ( err != noErr ) { ERRORLOG( "Could not start AudioUnit" ); } m_bIsRunning = true; return 0; } void CoreAudioDriver::disconnect() { OSStatus err = noErr; err = AudioOutputUnitStop( m_outputUnit ); err = AudioUnitUninitialize( m_outputUnit ); err = AudioComponentInstanceDispose( m_outputUnit ); } void CoreAudioDriver::play() { //INFOLOG( "play" ); m_transport.m_status = TransportInfo::ROLLING; } void CoreAudioDriver::stop() { //INFOLOG( "stop" ); m_transport.m_status = TransportInfo::STOPPED; } float* CoreAudioDriver::getOut_L() { return m_pOut_L; } float* CoreAudioDriver::getOut_R() { return m_pOut_R; } unsigned CoreAudioDriver::getBufferSize() { return m_nBufferSize; } unsigned CoreAudioDriver::getSampleRate() { return m_nSampleRate; } void CoreAudioDriver::updateTransportInfo() { // INFOLOG( "nothing"); } void CoreAudioDriver::locate( unsigned long nFrame ) { //INFOLOG( "locate: " + to_string( nFrame ) ); m_transport.m_nFrames = nFrame; //fprintf ( stderr, "m_transport.m_nFrames = %lu\n", m_transport.m_nFrames ); } void CoreAudioDriver::setBpm( float fBPM ) { //INFOLOG( "[setBpm]" + to_string( fBPM )); m_transport.m_fBPM = fBPM; } } #endif // H2CORE_HAVE_COREAUDIO hydrogen-1.0.0-rc1/src/core/src/IO/coremidi_driver.cpp000066400000000000000000000260751366722712400225250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * CoreMidi driver for Hydrogen * Copyright(c) 2005-2006 by Jonathan Dempsey * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * * Code cleanup (20060222 Jonathan Dempsey) * More cleaning (20060511 Jonathan Dempsey) * ... and a little bit more cleaning . . . (20060512 Jonathan Dempsey) * Added CFRelease code (20060514 Jonathan Dempsey) */ #include #include #include #include #include #include #if defined(H2CORE_HAVE_COREMIDI) || _DOXYGEN_ namespace H2Core { static void midiProc ( const MIDIPacketList * pktlist, void * readProcRefCon, void * srcConnRefCon ) { UNUSED( srcConnRefCon ); MIDIPacket* packet = ( MIDIPacket * )pktlist->packet; //_ERRORLOG( QString( "MIDIPROC packets # %1" ).arg( pktlist->numPackets ) ); CoreMidiDriver *instance = ( CoreMidiDriver * )readProcRefCon; MidiMessage msg; for ( uint i = 0; i < pktlist->numPackets; i++ ) { int nEventType = packet->data[0]; if ( ( nEventType >= 128 ) && ( nEventType < 144 ) ) { // note off msg.m_nChannel = nEventType - 128; msg.m_type = MidiMessage::NOTE_OFF; } else if ( ( nEventType >= 144 ) && ( nEventType < 160 ) ) { // note on msg.m_nChannel = nEventType - 144; msg.m_type = MidiMessage::NOTE_ON; } else if ( ( nEventType >= 160 ) && ( nEventType < 176 ) ) { // Polyphonic Key Pressure (After-touch) msg.m_nChannel = nEventType - 160; msg.m_type = MidiMessage::POLYPHONIC_KEY_PRESSURE; } else if ( ( nEventType >= 176 ) && ( nEventType < 192 ) ) { // Control Change msg.m_nChannel = nEventType - 176; msg.m_type = MidiMessage::CONTROL_CHANGE; } else if ( ( nEventType >= 192 ) && ( nEventType < 208 ) ) { // Program Change msg.m_nChannel = nEventType - 192; msg.m_type = MidiMessage::PROGRAM_CHANGE; } else if ( ( nEventType >= 208 ) && ( nEventType < 224 ) ) { // Channel Pressure (After-touch) msg.m_nChannel = nEventType - 208; msg.m_type = MidiMessage::CHANNEL_PRESSURE; } else if ( ( nEventType >= 224 ) && ( nEventType < 240 ) ) { // Pitch Wheel Change msg.m_nChannel = nEventType - 224; msg.m_type = MidiMessage::PITCH_WHEEL; } else if ( ( nEventType >= 240 ) && ( nEventType < 256 ) ) { // System Exclusive msg.m_type = MidiMessage::SYSEX; for(int i = 0; i< packet->length;i++){ msg.m_sysexData.push_back(packet->data[i]); } instance->handleMidiMessage( msg ); packet = MIDIPacketNext( packet ); return; } else { ___ERRORLOG( QString( "Unhandled midi message type: %1" ).arg( nEventType ) ); ___INFOLOG( "MIDI msg: " ); // instance->errorLog( "Unhandled midi message type: " + to_string( nEventType ) ); // instance->infoLog( "MIDI msg: " ); } msg.m_nData1 = packet->data[1]; msg.m_nData2 = packet->data[2]; instance->handleMidiMessage( msg ); packet = MIDIPacketNext( packet ); } } const char* CoreMidiDriver::__class_name = "CoreMidiDriver"; CoreMidiDriver::CoreMidiDriver() : MidiInput( __class_name ) ,MidiOutput( __class_name ), Object( __class_name ) , m_bRunning( false ) { INFOLOG( "INIT" ); OSStatus err = noErr; QString sMidiPortName = Preferences::get_instance()->m_sMidiPortName; err = MIDIClientCreate ( CFSTR( "h2MIDIClient" ), NULL, NULL, &h2MIDIClient ); if ( err != noErr ) { ERRORLOG( QString( "Cannot create CoreMIDI client: %1" ).arg( err )); } err = MIDIInputPortCreate ( h2MIDIClient, CFSTR( "h2InputPort" ), midiProc, this, &h2InputRef ); if ( err != noErr ) { ERRORLOG( QString( "Cannot create CoreMIDI input port: %1" ).arg( err )); } err = MIDIOutputPortCreate ( h2MIDIClient, CFSTR( "h2OutputPort" ), &h2OutputRef ); if ( err != noErr ) { ERRORLOG( QString( "Cannot create CoreMIDI output port: %1" ).arg( err )); } err = MIDISourceCreate ( h2MIDIClient, CFSTR( "Hydrogen" ), &h2VirtualOut ); if ( err != noErr ) { ERRORLOG( QString( "Cannot create CoreMIDI virtual output: %1" ).arg( err )); } } CoreMidiDriver::~CoreMidiDriver() { /*if ( isMidiDriverRunning ) { close(); } */ close(); INFOLOG( "DESTROY" ); } void CoreMidiDriver::open() { INFOLOG( "open" ); OSStatus err = noErr; QString sMidiPortName = Preferences::get_instance()->m_sMidiPortName; cmSources = MIDIGetNumberOfSources(); unsigned i; for ( i = 0; i < cmSources; i++ ) { CFStringRef H2MidiNames; cmH2Src = MIDIGetSource( i ); if ( cmH2Src ) { err = MIDIObjectGetStringProperty( cmH2Src, kMIDIPropertyName, &H2MidiNames ); char cmName[64]; err = CFStringGetCString( H2MidiNames, cmName, 64, kCFStringEncodingASCII ); QString h2MidiPortName = cmName; if ( h2MidiPortName == sMidiPortName ) { MIDIPortConnectSource ( h2InputRef, cmH2Src, NULL ); m_bRunning = true; } } CFRelease ( H2MidiNames ); } int n = MIDIGetNumberOfDestinations(); if (n > 0) { cmH2Dst = MIDIGetDestination(0); } if (cmH2Dst != 0) { CFStringRef H2MidiNames; MIDIObjectGetStringProperty(cmH2Dst, kMIDIPropertyName, &H2MidiNames); //CFStringGetCString(pname, name, sizeof(name), 0); //MIDIPortConnectSource ( h2OutputRef, cmH2Dst, NULL ); MIDIPortConnectSource ( h2OutputRef, cmH2Dst, NULL ); if( H2MidiNames != NULL){ CFRelease( H2MidiNames ); } } } void CoreMidiDriver::close() { OSStatus err = noErr; err = MIDIPortDisconnectSource( h2InputRef, cmH2Src ); err = MIDIPortDispose( h2InputRef ); err = MIDIEndpointDispose( h2VirtualOut ); //err = MIDIPortDisconnectSource( h2OutputRef, cmH2Dst ); //err = MIDIPortDispose( h2OutputRef ); err = MIDIClientDispose( h2MIDIClient ); } std::vector CoreMidiDriver::getInputPortList() { INFOLOG( "retrieving output list" ); OSStatus err = noErr; std::vector cmPortList; cmSources = MIDIGetNumberOfDestinations(); INFOLOG ( "Getting number of MIDI sources . . .\n" ); unsigned i; for ( i = 0; i < cmSources; i++ ) { CFStringRef H2MidiNames; cmH2Src = MIDIGetDestination( i ); if ( cmH2Src == 0 ) { ERRORLOG( "Could not open output device" ); } if ( cmH2Src ) { err = MIDIObjectGetStringProperty( cmH2Src, kMIDIPropertyName, &H2MidiNames ); INFOLOG ( "Getting MIDI object string property . . .\n" ); char cmName[ 64 ]; CFStringGetCString( H2MidiNames, cmName, 64, kCFStringEncodingASCII ); INFOLOG ( "Getting MIDI object name . . .\n" ); QString h2MidiPortName = cmName; cmPortList.push_back( h2MidiPortName ); } CFRelease( H2MidiNames ); } return cmPortList; } std::vector CoreMidiDriver::getOutputPortList() { INFOLOG( "retrieving output list" ); OSStatus err = noErr; std::vector cmPortList; cmSources = MIDIGetNumberOfSources(); INFOLOG ( "Getting number of MIDI sources . . .\n" ); unsigned i; for ( i = 0; i < cmSources; i++ ) { CFStringRef H2MidiNames; cmH2Src = MIDIGetSource( i ); if ( cmH2Src == 0 ) { ERRORLOG( "Could not open input device" ); } if ( cmH2Src ) { err = MIDIObjectGetStringProperty( cmH2Src, kMIDIPropertyName, &H2MidiNames ); INFOLOG ( "Getting MIDI object string property . . .\n" ); char cmName[ 64 ]; CFStringGetCString( H2MidiNames, cmName, 64, kCFStringEncodingASCII ); INFOLOG ( "Getting MIDI object name . . .\n" ); QString h2MidiPortName = cmName; cmPortList.push_back( h2MidiPortName ); } CFRelease( H2MidiNames ); } return cmPortList; } void CoreMidiDriver::handleQueueNote(Note* pNote) { if (cmH2Dst == 0 ) { ERRORLOG( "cmH2Dst = 0 " ); return; } int channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } int key = pNote->get_midi_key(); int velocity = pNote->get_midi_velocity(); MIDIPacketList packetList; packetList.numPackets = 1; packetList.packet->timeStamp = 0; packetList.packet->length = 3; packetList.packet->data[0] = 0x80 | channel; packetList.packet->data[1] = key; packetList.packet->data[2] = velocity; sendMidiPacket ( &packetList ); packetList.packet->data[0] = 0x90 | channel; packetList.packet->data[1] = key; packetList.packet->data[2] = velocity; sendMidiPacket ( &packetList ); } void CoreMidiDriver::handleQueueNoteOff( int channel, int key, int velocity ) { if (cmH2Dst == 0 ) { ERRORLOG( "cmH2Dst = 0 " ); return; } // int channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } // int key = pNote->get_instrument()->get_midi_out_note(); // int velocity = pNote->get_velocity() * 127; MIDIPacketList packetList; packetList.numPackets = 1; packetList.packet->timeStamp = 0; packetList.packet->length = 3; packetList.packet->data[0] = 0x80 | channel; packetList.packet->data[1] = key; packetList.packet->data[2] = velocity; sendMidiPacket ( &packetList ); } void CoreMidiDriver::handleQueueAllNoteOff() { if (cmH2Dst == 0 ) { ERRORLOG( "cmH2Dst = 0 " ); return; } InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list(); unsigned int numInstruments = instList->size(); for (int index = 0; index < numInstruments; ++index) { Instrument *curInst = instList->get(index); int channel = curInst->get_midi_out_channel(); if (channel < 0) { continue; } int key = curInst->get_midi_out_note(); MIDIPacketList packetList; packetList.numPackets = 1; packetList.packet->timeStamp = 0; packetList.packet->length = 3; packetList.packet->data[0] = 0x80 | channel; packetList.packet->data[1] = key; packetList.packet->data[2] = 0; sendMidiPacket ( &packetList ); } } void CoreMidiDriver::handleOutgoingControlChange( int param, int value, int channel ) { if (cmH2Dst == 0 ) { ERRORLOG( "cmH2Dst = 0 " ); return; } if (channel < 0) { return; } MIDIPacketList packetList; packetList.numPackets = 1; packetList.packet->timeStamp = 0; packetList.packet->length = 3; packetList.packet->data[0] = 0xB0 | channel; packetList.packet->data[1] = param; packetList.packet->data[2] = value; sendMidiPacket ( &packetList ); } void CoreMidiDriver::sendMidiPacket (MIDIPacketList *packetList) { OSStatus err = noErr; err = MIDISend(h2OutputRef, cmH2Dst, packetList); if ( err != noErr ) { ERRORLOG( QString( "Cannot send MIDI packet to output port: %1" ).arg( err )); } err = MIDIReceived(h2VirtualOut, packetList); if ( err != noErr ) { ERRORLOG( QString( "Cannot send MIDI packet to virtual output: %1" ).arg( err )); } } } // namespace H2CORE #endif hydrogen-1.0.0-rc1/src/core/src/IO/disk_writer_driver.cpp000066400000000000000000000302211366722712400232440ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #if defined(WIN32) || _DOXYGEN_ #include /* * In Windows the unistd function sleep( seconds ) is not available. * Treat sleep( SECONDS ) as a macro that uses SleepEx. * Convert seconds to milliseconds for the first argument of SleepEx. * Use false for the second argument of SleepEx. * This way SleepEx always returns 0, after the specified time has passed. */ #define sleep( SECONDS ) SleepEx( SECONDS * 1000, false ) #endif namespace H2Core { pthread_t diskWriterDriverThread; void* diskWriterDriver_thread( void* param ) { Object* __object = ( Object* )param; DiskWriterDriver *pDriver = ( DiskWriterDriver* )param; EventQueue::get_instance()->push_event( EVENT_PROGRESS, 0 ); pDriver->setBpm( Hydrogen::get_instance()->getSong()->__bpm ); pDriver->audioEngine_process_checkBPMChanged(); __INFOLOG( "DiskWriterDriver thread start" ); // always rolling, no user interaction pDriver->m_transport.m_status = TransportInfo::ROLLING; SF_INFO soundInfo; soundInfo.samplerate = pDriver->m_nSampleRate; // soundInfo.frames = -1;//getNFrames(); ///\todo: da terminare soundInfo.channels = 2; //default format int sfformat = 0x010000; //wav format (default) int bits = 0x0002; //16 bit PCM (default) //sf_format switch if( pDriver->m_sFilename.endsWith(".aiff") || pDriver->m_sFilename.endsWith(".AIFF") ){ sfformat = 0x020000; //Apple/SGI AIFF format (big endian) } if( pDriver->m_sFilename.endsWith(".flac") || pDriver->m_sFilename.endsWith(".FLAC") ){ sfformat = 0x170000; //FLAC lossless file format } if( ( pDriver->m_nSampleDepth == 8 ) && ( pDriver->m_sFilename.endsWith(".aiff") || pDriver->m_sFilename.endsWith(".AIFF") ) ){ bits = 0x0001; //Signed 8 bit data works with aiff } if( ( pDriver->m_nSampleDepth == 8 ) && ( pDriver->m_sFilename.endsWith(".wav") || pDriver->m_sFilename.endsWith(".WAV") ) ){ bits = 0x0005; //Unsigned 8 bit data needed for Microsoft WAV format } if( pDriver->m_nSampleDepth == 16 ){ bits = 0x0002; //Signed 16 bit data } if( pDriver->m_nSampleDepth == 24 ){ bits = 0x0003; //Signed 24 bit data } if( pDriver->m_nSampleDepth == 32 ){ bits = 0x0004; ////Signed 32 bit data } soundInfo.format = sfformat|bits; // #ifdef HAVE_OGGVORBIS //ogg vorbis option if( pDriver->m_sFilename.endsWith( ".ogg" ) | pDriver->m_sFilename.endsWith( ".OGG" ) ) { soundInfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS; } // #endif ///formats // SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian). */ // SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ // SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ // SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ // SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ // SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ // SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ // SF_FORMAT_VOC = 0x080000, /* VOC files. */ // SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ // SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ // SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ // SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ // SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ // SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ // SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ // SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ // SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ // SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ // SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ // SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ // SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ // SF_FORMAT_OGG ///bits // SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ // SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ // SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ // SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ ///used for ogg // SF_FORMAT_VORBIS if ( !sf_format_check( &soundInfo ) ) { __ERRORLOG( "Error in soundInfo" ); return nullptr; } SNDFILE* m_file = sf_open( pDriver->m_sFilename.toLocal8Bit(), SFM_WRITE, &soundInfo ); float *pData = new float[ pDriver->m_nBufferSize * 2 ]; // always stereo float *pData_L = pDriver->m_pOut_L; float *pData_R = pDriver->m_pOut_R; Hydrogen* pEngine = Hydrogen::get_instance(); std::vector *pPatternColumns = Hydrogen::get_instance()->getSong()->get_pattern_group_vector(); int nColumns = pPatternColumns->size(); int nPatternSize; int validBpm = pEngine->getSong()->__bpm; float oldBPM = 0; float fTicksize = 0; for ( int patternPosition = 0; patternPosition < nColumns; ++patternPosition ) { PatternList *pColumn = ( *pPatternColumns )[ patternPosition ]; if ( pColumn->size() != 0 ) { nPatternSize = pColumn->get( 0 )->get_length(); } else { nPatternSize = MAX_NOTES; } fTicksize = pDriver->m_nSampleRate * 60.0 / pEngine->getSong()->__bpm / pEngine->getSong()->__resolution; // check pattern bpm if timeline bpm is in use Timeline* pTimeline = pEngine->getTimeline(); if(Preferences::get_instance()->getUseTimelineBpm() ){ if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if(pTimeline->m_timelinevector[t].m_htimelinebeat == patternPosition && pTimeline->m_timelinevector[t].m_htimelinebpm != validBpm){ validBpm = pTimeline->m_timelinevector[t].m_htimelinebpm; } } } pDriver->setBpm(validBpm); fTicksize = pDriver->m_nSampleRate * 60.0 / validBpm / Hydrogen::get_instance()->getSong()->__resolution; pDriver->audioEngine_process_checkBPMChanged(); pEngine->setPatternPos(patternPosition); // delay needed time to calculate all rubberband samples if( Preferences::get_instance()->getRubberBandBatchMode() && validBpm != oldBPM ){ EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); int sleepTime = Preferences::get_instance()->getRubberBandCalcTime()+1; while ((sleepTime = sleep(sleepTime)) > 0); } oldBPM = validBpm; } else { fTicksize = pDriver->m_nSampleRate * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / Hydrogen::get_instance()->getSong()->__resolution; //pDriver->m_transport.m_fTickSize = ticksize; } //here we have the pattern length in frames dependent from bpm and samplerate unsigned patternLengthInFrames = fTicksize * nPatternSize; unsigned frameNumber = 0; int lastRun = 0; while ( frameNumber < patternLengthInFrames ) { int usedBuffer = pDriver->m_nBufferSize; //this will calculate the size from -last- (end of pattern) used frame buffer, //which is mostly smaller than pDriver->m_nBufferSize if( patternLengthInFrames - frameNumber < pDriver->m_nBufferSize ){ lastRun = patternLengthInFrames - frameNumber; usedBuffer = lastRun; }; frameNumber += usedBuffer; //pDriver->m_transport.m_nFrames = frameNumber; int ret = pDriver->m_processCallback( usedBuffer, nullptr ); while( ret != 0) { ret = pDriver->m_processCallback( usedBuffer, nullptr ); } for ( unsigned i = 0; i < usedBuffer; i++ ) { if(pData_L[i] > 1){ pData[i * 2] = 1; } else if(pData_L[i] < -1){ pData[i * 2] = -1; }else { pData[i * 2] = pData_L[i]; } if(pData_R[i] > 1){ pData[i * 2 + 1] = 1; } else if(pData_R[i] < -1){ pData[i * 2 + 1] = -1; }else { pData[i * 2 + 1] = pData_R[i]; } } int res = sf_writef_float( m_file, pData, usedBuffer ); if ( res != ( int )usedBuffer ) { __ERRORLOG( "Error during sf_write_float" ); } } // this progress bar method is not exact but ok enough to give users a usable visible progress feedback float fPercent = ( float )(patternPosition +1) / ( float )nColumns * 100.0; EventQueue::get_instance()->push_event( EVENT_PROGRESS, ( int )fPercent ); } delete[] pData; pData = nullptr; sf_close( m_file ); __INFOLOG( "DiskWriterDriver thread end" ); pthread_exit( nullptr ); return nullptr; } const char* DiskWriterDriver::__class_name = "DiskWriterDriver"; DiskWriterDriver::DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, int nSampleDepth ) : AudioOutput( __class_name ) , m_nSampleRate( nSamplerate ) , m_nSampleDepth ( nSampleDepth ) , m_processCallback( processCallback ) , m_nBufferSize( 0 ) , m_pOut_L( nullptr ) , m_pOut_R( nullptr ) { INFOLOG( "INIT" ); } DiskWriterDriver::~DiskWriterDriver() { INFOLOG( "DESTROY" ); } int DiskWriterDriver::init( unsigned nBufferSize ) { INFOLOG( QString( "Init, %1 samples" ).arg( nBufferSize ) ); m_nBufferSize = nBufferSize; m_pOut_L = new float[nBufferSize]; m_pOut_R = new float[nBufferSize]; return 0; } /// /// Connect /// return 0: Ok /// int DiskWriterDriver::connect() { INFOLOG( "[startExport]" ); pthread_attr_t attr; pthread_attr_init( &attr ); pthread_create( &diskWriterDriverThread, &attr, diskWriterDriver_thread, this ); return 0; } /// disconnect void DiskWriterDriver::disconnect() { INFOLOG( "[disconnect]" ); delete[] m_pOut_L; m_pOut_L = nullptr; delete[] m_pOut_R; m_pOut_R = nullptr; } unsigned DiskWriterDriver::getSampleRate() { return m_nSampleRate; } void DiskWriterDriver::play() { m_transport.m_status = TransportInfo::ROLLING; } void DiskWriterDriver::stop() { m_transport.m_status = TransportInfo::STOPPED; } void DiskWriterDriver::locate( unsigned long nFrame ) { INFOLOG( QString( "Locate: %1" ).arg( nFrame ) ); m_transport.m_nFrames = nFrame; } void DiskWriterDriver::updateTransportInfo() { // errorLog( "[updateTransportInfo] not implemented yet" ); } void DiskWriterDriver::setBpm( float fBPM ) { INFOLOG( QString( "SetBpm: %1" ).arg( fBPM ) ); m_transport.m_fBPM = fBPM; } void DiskWriterDriver::audioEngine_process_checkBPMChanged() { float fNewTickSize = getSampleRate() * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / Hydrogen::get_instance()->getSong()->__resolution; if ( fNewTickSize != m_transport.m_fTickSize ) { // cerco di convertire ... float fTickNumber = ( float )m_transport.m_nFrames / ( float )m_transport.m_fTickSize; m_transport.m_fTickSize = fNewTickSize; if ( m_transport.m_fTickSize == 0 ) { return; } // update frame position m_transport.m_nFrames = ( long long )( fTickNumber * fNewTickSize ); // currently unuseble here //EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); } } }; hydrogen-1.0.0-rc1/src/core/src/IO/fake_driver.cpp000066400000000000000000000045501366722712400216320ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* FakeDriver::__class_name = "FakeDiskDriver"; FakeDriver::FakeDriver( audioProcessCallback processCallback ) : AudioOutput( __class_name ) , m_processCallback( processCallback ) , m_pOut_L( nullptr ) , m_pOut_R( nullptr ) , m_nBufferSize( 0 ) { INFOLOG( "INIT" ); } FakeDriver::~FakeDriver() { INFOLOG( "DESTROY" ); } int FakeDriver::init( unsigned nBufferSize ) { INFOLOG( QString( "Init, %1 samples" ).arg( nBufferSize ) ); m_nBufferSize = nBufferSize; m_pOut_L = new float[nBufferSize]; m_pOut_R = new float[nBufferSize]; return 0; } int FakeDriver::connect() { INFOLOG( "connect" ); // // always rolling, no user interaction m_transport.m_status = TransportInfo::ROLLING; return 0; } void FakeDriver::disconnect() { INFOLOG( "disconnect" ); delete[] m_pOut_L; m_pOut_L = nullptr; delete[] m_pOut_R; m_pOut_R = nullptr; } unsigned FakeDriver::getSampleRate() { return 44100; } float* FakeDriver::getOut_L() { return m_pOut_L; } float* FakeDriver::getOut_R() { return m_pOut_R; } void FakeDriver::play() { m_transport.m_status = TransportInfo::ROLLING; while ( m_processCallback( m_nBufferSize, nullptr ) == 0 ) { // process... } } void FakeDriver::stop() { m_transport.m_status = TransportInfo::STOPPED; } void FakeDriver::locate( unsigned long nFrame ) { m_transport.m_nFrames = nFrame; } void FakeDriver::updateTransportInfo() { // not used } void FakeDriver::setBpm( float fBPM ) { m_transport.m_fBPM = fBPM; } }; hydrogen-1.0.0-rc1/src/core/src/IO/jack_audio_driver.cpp000066400000000000000000001114701366722712400230150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_JACK) || _DOXYGEN_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef H2CORE_HAVE_LASH #include #endif #ifdef H2CORE_HAVE_JACKSESSION #include #endif namespace H2Core { /** * Sample rate of the JACK audio server. * * It is set by the callback function jackDriverSampleRate() * registered in the JACK server and accessed via * JackAudioDriver::getSampleRate(). Its initialization is handled by * JackAudioDriver::init(), which sets it to the sample rate of the * Hydrogen's external JACK client via _jack_get_sample_rate()_ * (jack/jack.h). */ unsigned long jackServerSampleRate = 0; /** * Buffer size of the JACK audio server. * * It is set by the callback function jackDriverBufferSize() * registered in the JACK server and accessed via * JackAudioDriver::getBufferSize(). Its initialization is handled by * JackAudioDriver::init(), which sets it to the buffer size of the * Hydrogen's external JACK client via _jack_get_buffer_size()_ * (jack/jack.h). */ jack_nframes_t jackServerBufferSize = 0; /** * Instance of the JackAudioDriver. */ JackAudioDriver* pJackDriverInstance = nullptr; /** * Callback function for the JACK audio server to set the sample rate * #H2Core::jackServerSampleRate and prints a message to * the #__INFOLOG, which has to be included via a Logger instance in * the provided @a param. * * It gets registered as a callback function of the JACK server in * JackAudioDriver::init() using _jack_set_sample_rate_callback()_. * * \param nframes New sample rate. The object has to be of type * _jack_nframes_t_, which is defined in the jack/types.h header. * \param param Object containing a Logger member to display the * change in the sample rate in its INFOLOG. * * @return 0 on success */ int jackDriverSampleRate( jack_nframes_t nframes, void* param ){ // Used for logging. Object* __object = ( Object* )param; QString msg = QString("Jack SampleRate changed: the sample rate is now %1/sec").arg( QString::number( (int) nframes ) ); // The __INFOLOG macro uses the Object *__object and not the // Object instance as INFOLOG does. It will call // __object->logger()->log( H2Core::Logger::Info, ..., msg ) // (see object.h). __INFOLOG( msg ); jackServerSampleRate = nframes; return 0; } /** * Callback function for the JACK audio server to set the buffer size * #H2Core::jackServerBufferSize. * * It gets registered as a callback function of the JACK server in * JackAudioDriver::init() using _jack_set_buffer_size_callback()_. * * \param nframes New buffer size. The object has to be of type @a * jack_nframes_t, which is defined in the jack/types.h header. * \param arg Not used within the function but kept for compatibility * reasons since the _JackBufferSizeCallback_ (jack/types.h) requires a * second input argument @a arg of type _void_, which is a pointer * supplied by the jack_set_buffer_size_callback() function. * * @return 0 on success */ int jackDriverBufferSize( jack_nframes_t nframes, void* arg ){ // This function does _NOT_ have to be realtime safe. jackServerBufferSize = nframes; return 0; } /** * Callback function for the JACK audio server to shutting down the * JACK driver. * * The JackAudioDriver::m_pClient pointer stored in the current * instance of the JACK audio driver #pJackDriverInstance is set to * the nullptr and a Hydrogen::JACK_SERVER_SHUTDOWN error is raised * using Hydrogen::raiseError(). * * It gets registered as a callback function of the JACK server in * JackAudioDriver::init() using _jack_on_shutdown()_. * * \param arg Not used within the function but kept for compatibility * reasons since _jack_shutdown()_ (jack/jack.h) the argument @a arg * of type void. */ void jackDriverShutdown( void* arg ) { UNUSED( arg ); pJackDriverInstance->m_pClient = nullptr; Hydrogen::get_instance()->raiseError( Hydrogen::JACK_SERVER_SHUTDOWN ); } /** * Required in JackTimebaseCallback() to keep the sync between the * timebase master and all other JACK clients. * * Whenever a relocation takes place in Hydrogen as timebase master, * the speed of the timeline at the destination frame must not be sent * in the timebase callback. Instead, Hydrogen must wait two full * cycles of the audioEngine before broadcasting the new tempo * again. This is because the Hydrogen (as timebase master) requires * two full cycles to set the tempo itself and there is a rather * intricate dependence on values calculate in various other * functions. * * TODO: Kill this variable and make the relocation behavior way more * straight forward. */ int nWaits = 0; const char* JackAudioDriver::__class_name = "JackAudioDriver"; JackAudioDriver::JackAudioDriver( JackProcessCallback m_processCallback ) : AudioOutput( __class_name ) { INFOLOG( "INIT" ); auto pPreferences = Preferences::get_instance(); // __track_out_enabled is inherited from AudioOutput and // instantiated with false. It will be used by the Sampler and // Hydrogen itself to check whether JackAudioDriver does create // per-track audio output ports. __track_out_enabled = pPreferences->m_bJackTrackOuts; pJackDriverInstance = this; this->m_processCallback = m_processCallback; m_frameOffset = 0; m_nTrackPortCount = 0; m_pClient = nullptr; m_pOutputPort1 = nullptr; m_pOutputPort2 = nullptr; m_bConnectDefaults = pPreferences->m_bJackConnectDefaults; m_nIsTimebaseMaster = -1; // Destination ports the output of Hydrogen will be connected // to. m_sOutputPortName1 = pPreferences->m_sJackPortName1; m_sOutputPortName2 = pPreferences->m_sJackPortName2; memset( m_pTrackOutputPortsL, 0, sizeof(m_pTrackOutputPortsL) ); memset( m_pTrackOutputPortsR, 0, sizeof(m_pTrackOutputPortsR) ); } JackAudioDriver::~JackAudioDriver() { INFOLOG( "DESTROY" ); disconnect(); } int JackAudioDriver::connect() { INFOLOG( "connect" ); // The `jack_activate' function is defined in the jack/jack.h // header files and tells the JACK server that the program is // ready to start processing audio. It returns 0 on success // and a non-zero error code otherwise. if ( jack_activate( m_pClient ) ) { Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_ACTIVATE_CLIENT ); return 1; } bool bConnectDefaults = m_bConnectDefaults; memset( m_pTrackOutputPortsL, 0, sizeof(m_pTrackOutputPortsL) ); memset( m_pTrackOutputPortsR, 0, sizeof(m_pTrackOutputPortsR) ); #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if (lashClient && lashClient->isConnected()){ // INFOLOG( "[LASH] Sending JACK client name to LASH server" ); lashClient->sendJackClientName(); if (!lashClient->isNewProject()){ bConnectDefaults = false; } } } #endif if ( bConnectDefaults ) { // Connect the left and right default ports of Hydrogen. // // The `jack_connect' function is defined in the // jack/jack.h file. It establishes a connection between // two ports. When a connection exists, data written // to the source port will be available to be read at // the destination port. Returns 0 on success, exits // if the connection is already made, and returns a // non-zero error code otherwise. // Syntax: jack_connect( jack_client_t jack_client, // const char *source_port ) // const char *destination_port // ) // The `jack_port_name' function is also defined in // the jack/jack.h header returns the full name of a // provided port of type jack_port_t. if ( jack_connect( m_pClient, jack_port_name( m_pOutputPort1 ), m_sOutputPortName1.toLocal8Bit() ) == 0 && jack_connect( m_pClient, jack_port_name( m_pOutputPort2 ), m_sOutputPortName2.toLocal8Bit() ) == 0 ) { return 0; } WARNINGLOG( "Could not connect to the saved output ports. Connect to the first pair of input ports instead." ); // The `jack_get_ports' is defined in the jack/jack.h // header file and performs a lookup of ports of the // JACK server based on their e.g. flags. It returns a // NULL-terminated array of ports that match the // specified arguments. The caller is responsible for // calling jack_free() any non-NULL returned // value. const char ** portnames = jack_get_ports( m_pClient, nullptr, nullptr, JackPortIsInput ); if ( !portnames || !portnames[0] || !portnames[1] ) { ERRORLOG( "Couldn't locate two Jack input ports" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } if ( jack_connect( m_pClient, jack_port_name( m_pOutputPort1 ), portnames[0] ) != 0 || jack_connect( m_pClient, jack_port_name( m_pOutputPort2 ), portnames[1] ) != 0 ) { ERRORLOG( "Couldn't connect to first pair of Jack input ports" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } free( portnames ); } return 0; } void JackAudioDriver::disconnect() { INFOLOG( "disconnect" ); deactivate(); jack_client_t* pOldClient = m_pClient; m_pClient = nullptr; if ( pOldClient != nullptr ) { INFOLOG( "calling jack_client_close" ); int nReturnCode = jack_client_close( pOldClient ); if ( nReturnCode != 0 ) { ERRORLOG( "Error in jack_client_close" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CLOSE_CLIENT ); } } m_pClient = nullptr; } void JackAudioDriver::deactivate() { if ( m_pClient != nullptr ) { INFOLOG( "calling jack_deactivate" ); int nReturnCode = jack_deactivate( m_pClient ); if ( nReturnCode != 0 ) { ERRORLOG( "Error in jack_deactivate" ); } } memset( m_pTrackOutputPortsL, 0, sizeof(m_pTrackOutputPortsL) ); memset( m_pTrackOutputPortsR, 0, sizeof(m_pTrackOutputPortsR) ); } unsigned JackAudioDriver::getBufferSize() { return jackServerBufferSize; } unsigned JackAudioDriver::getSampleRate() { return jackServerSampleRate; } void JackAudioDriver::calculateFrameOffset(long long oldFrame) { if ( Hydrogen::get_instance()->getState() == STATE_PLAYING ) { m_frameOffset = m_JackTransportPos.frame - m_transport.m_nFrames; } else { m_frameOffset = oldFrame - m_transport.m_nFrames; } } void JackAudioDriver::updateTransportInfo() { if ( Preferences::get_instance()->m_bJackTransportMode != Preferences::USE_JACK_TRANSPORT ){ return; } // jack_transport_query() (jack/transport.h) queries the // current transport state and position. If called from the // process thread, the second argument, which is a pointer to // a structure for returning current transport, corresponds to // the first frame of the current cycle and the state returned // is valid for the entire cycle. #m_JackTransportPos->valid // will show which fields contain valid data. If // #m_JackTransportPos is NULL, do not return position // information. m_JackTransportState = jack_transport_query( m_pClient, &m_JackTransportPos ); switch ( m_JackTransportState ) { case JackTransportStopped: // Transport is halted m_transport.m_status = TransportInfo::STOPPED; return; case JackTransportRolling: // Transport is playing m_transport.m_status = TransportInfo::ROLLING; break; case JackTransportStarting: // Waiting for sync ready. If there are slow-sync clients, // this can take more than one cycle. m_transport.m_status = TransportInfo::STOPPED; break; default: ERRORLOG( "Unknown jack transport state" ); } m_currentPos = m_JackTransportPos.frame; // Update the status regrading JACK timebase master. if ( m_JackTransportState != JackTransportStopped ) { if ( m_nIsTimebaseMaster > 1 ) { m_nIsTimebaseMaster--; } else if ( m_nIsTimebaseMaster == 1 ) { // JackTimebaseCallback not called anymore -> timebase client m_nIsTimebaseMaster = 0; } } if ( m_nIsTimebaseMaster == 0 && !(m_JackTransportPos.valid & JackPositionBBT) ) { // No external timebase master anymore -> regular client m_nIsTimebaseMaster = -1; } else if ( m_nIsTimebaseMaster < 0 && (m_JackTransportPos.valid & JackPositionBBT) ) { // External timebase master detected -> timebase client m_nIsTimebaseMaster = 0; } Hydrogen* pHydrogen = Hydrogen::get_instance(); // The relocation could be either triggered by an user interaction // (e.g. clicking the forward button or clicking somewhere on the // timeline) or by a different JACK client. if ( m_transport.m_nFrames + m_frameOffset != m_JackTransportPos.frame ) { m_transport.m_nFrames = m_JackTransportPos.frame; // Reset playback to the beginning of the pattern if Hydrogen // is in pattern mode. pHydrogen->resetPatternStartTick(); // There maybe was an offset introduced when passing a tempo // marker. m_frameOffset = 0; } if ( m_nIsTimebaseMaster == 0 ){ // There is a JACK timebase master and it's not us. If it // provides a tempo that differs from the local one, we will // use the former instead. float fBPM = ( float )m_JackTransportPos.beats_per_minute; if ( m_transport.m_fBPM != fBPM ) { setBpm( fBPM ); pHydrogen->getSong()->__bpm = fBPM; pHydrogen->setNewBpmJTM( fBPM ); } } else { // Checks for local changes in speed (introduced by the user // using BPM markers on the timeline) and update tempo // accordingly. pHydrogen->setTimelineBpm(); } } float* JackAudioDriver::getOut_L() { /** * This returns a pointer to the memory area associated with * the specified port. For an output port, it will be a memory * area that can be written to; for an input port, it will be * an area containing the data from the port's connection(s), * or zero-filled. if there are multiple inbound connections, * the data will be mixed appropriately. */ jack_default_audio_sample_t *out = ( jack_default_audio_sample_t * ) jack_port_get_buffer ( m_pOutputPort1, jackServerBufferSize ); return out; } float* JackAudioDriver::getOut_R() { jack_default_audio_sample_t *out = ( jack_default_audio_sample_t * ) jack_port_get_buffer ( m_pOutputPort2, jackServerBufferSize ); return out; } float* JackAudioDriver::getTrackOut_L( unsigned nTrack ) { if ( nTrack > (unsigned)m_nTrackPortCount ) { return nullptr; } jack_port_t* pPort = m_pTrackOutputPortsL[nTrack]; jack_default_audio_sample_t* out = nullptr; if( pPort ) { out = (jack_default_audio_sample_t*) jack_port_get_buffer( pPort, jackServerBufferSize); } return out; } float* JackAudioDriver::getTrackOut_R( unsigned nTrack ) { if( nTrack > (unsigned)m_nTrackPortCount ) { return nullptr; } jack_port_t* pPort = m_pTrackOutputPortsR[nTrack]; jack_default_audio_sample_t* out = nullptr; if( pPort ) { out = (jack_default_audio_sample_t*) jack_port_get_buffer( pPort, jackServerBufferSize); } return out; } float* JackAudioDriver::getTrackOut_L( Instrument* instr, InstrumentComponent* pCompo) { return getTrackOut_L(m_trackMap[instr->get_id()][pCompo->get_drumkit_componentID()]); } float* JackAudioDriver::getTrackOut_R( Instrument* instr, InstrumentComponent* pCompo) { return getTrackOut_R(m_trackMap[instr->get_id()][pCompo->get_drumkit_componentID()]); } #define CLIENT_FAILURE(msg) { \ ERRORLOG("Could not connect to JACK server (" msg ")"); \ if ( m_pClient != nullptr ) { \ ERRORLOG("...but JACK returned a non-null pointer?"); \ m_pClient = nullptr; \ } \ if (nTries) ERRORLOG("...trying again."); \ } #define CLIENT_SUCCESS(msg) { \ assert(m_pClient); \ INFOLOG(msg); \ nTries = 0; \ } int JackAudioDriver::init( unsigned bufferSize ) { auto pPreferences = Preferences::get_instance(); QString sClientName = "Hydrogen"; #ifdef H2CORE_HAVE_OSC QString sNsmClientId = pPreferences->getNsmClientId(); if( !sNsmClientId.isEmpty() ){ sClientName = sNsmClientId; } #endif // The address of the status object will be used by JACK to // return information from the open operation. jack_status_t status; // Sometimes jackd doesn't stop and start fast enough. int nTries = 2; while ( nTries > 0 ) { --nTries; // Open an external client session with the JACK // server. The `jack_client_open' function is defined // in the jack/jack.h header. With it, clients may // choose which of several servers to connect, and // control whether and how to start the server // automatically, if it was not already running. Its // first argument _client_name_ of is at most // jack_client_name_size() characters. The name scope // is local to each server. Unless forbidden by the // JackUseExactName option, the server will modify // this name to create a unique variant, if // needed. The second argument _options_ is formed by // OR-ing together JackOptions bits. Only the // JackOpenOptions bits are allowed. _status_ (if // non-NULL) is an address for JACK to return // information from the open operation. This status // word is formed by OR-ing together the relevant // JackStatus bits. Depending on the _status_, an // optional argument _server_name_ selects from among // several possible concurrent server // instances. Server names are unique to each user. It // returns an opaque client handle if successful. If // this is NULL, the open operation failed, *status // includes JackFailure and the caller is not a JACK // client. #ifdef H2CORE_HAVE_JACKSESSION if ( pPreferences->getJackSessionUUID().isEmpty() ){ m_pClient = jack_client_open( sClientName.toLocal8Bit(), JackNullOption, &status); } else { // Unique name of the JACK server used within // the JACK session. const QByteArray uuid = pPreferences->getJackSessionUUID().toLocal8Bit(); // Using the JackSessionID option and the // supplied SessionID Token the sessionmanager // is able to identify the client again. m_pClient = jack_client_open( sClientName.toLocal8Bit(), JackSessionID, &status, uuid.constData()); } #else m_pClient = jack_client_open( sClientName.toLocal8Bit(), JackNullOption, &status); #endif // Check what did happen during the opening of the // client. CLIENT_SUCCESS sets the nTries variable // to 0 while CLIENT_FAILURE resets m_pClient to the // nullptr. switch(status) { case JackFailure: CLIENT_FAILURE("unknown error"); break; case JackInvalidOption: CLIENT_FAILURE("invalid option"); break; case JackNameNotUnique: if ( m_pClient != nullptr ) { sClientName = jack_get_client_name(m_pClient); CLIENT_SUCCESS(QString("Jack assigned the client name '%1'").arg(sClientName)); } else { CLIENT_FAILURE("name not unique"); } break; case JackServerStarted: CLIENT_SUCCESS("JACK Server started for Hydrogen."); break; case JackServerFailed: CLIENT_FAILURE("unable to connect"); break; case JackServerError: CLIENT_FAILURE("communication error"); break; case JackNoSuchClient: CLIENT_FAILURE("unknown client type"); break; case JackLoadFailure: CLIENT_FAILURE("can't load internal client"); break; case JackInitFailure: CLIENT_FAILURE("can't initialize client"); break; case JackShmFailure: CLIENT_FAILURE("unable to access shared memory"); break; case JackVersionError: CLIENT_FAILURE("client/server protocol version mismatch"); break; default: if (status) { ERRORLOG("Unknown status with JACK server."); if ( m_pClient != nullptr ) { CLIENT_SUCCESS("Client pointer is *not* null..." " assuming we're OK"); } } else { CLIENT_SUCCESS("Connected to JACK server"); } } } if ( m_pClient == nullptr ) { return -1; } jackServerSampleRate = jack_get_sample_rate( m_pClient ); jackServerBufferSize = jack_get_buffer_size( m_pClient ); pPreferences->m_nSampleRate = jackServerSampleRate; pPreferences->m_nBufferSize = jackServerBufferSize; /* tell the JACK server to call `process()' whenever there is work to be done. */ jack_set_process_callback( m_pClient, this->m_processCallback, nullptr ); /* tell the JACK server to call `srate()' whenever the sample rate of the system changes. */ jack_set_sample_rate_callback( m_pClient, jackDriverSampleRate, this ); /* tell JACK server to update us if the buffer size (frames per process cycle) changes. */ jack_set_buffer_size_callback( m_pClient, jackDriverBufferSize, nullptr ); /* tell the JACK server to call `jack_shutdown()' if it ever shuts down, either entirely, or if it just decides to stop calling us. */ jack_on_shutdown( m_pClient, jackDriverShutdown, nullptr ); // Create two new ports for Hydrogen's client. These are // objects used for moving data of any type in or out of the // client. Ports may be connected in various ways. The // function `jack_port_register' (jack/jack.h) is called like // jack_port_register( jack_client_t *client, // const char *port_name, // const char *port_type, // unsigned long flags, // unsigned long buffer_size) // // All ports have a type, which may be any non-NULL and non-zero // length string, passed as an argument. Some port types are built // into the JACK API, currently only JACK_DEFAULT_AUDIO_TYPE. // It returns a _jack_port_t_ pointer on success, otherwise NULL. m_pOutputPort1 = jack_port_register( m_pClient, "out_L", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); m_pOutputPort2 = jack_port_register( m_pClient, "out_R", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); Hydrogen* pHydrogen = Hydrogen::get_instance(); if ( ( m_pOutputPort1 == nullptr ) || ( m_pOutputPort2 == nullptr ) ) { pHydrogen->raiseError( Hydrogen::JACK_ERROR_IN_PORT_REGISTER ); return 4; } #ifdef H2CORE_HAVE_LASH if ( pPreferences->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if ( lashClient->isConnected() ) { lashClient->setJackClientName(sClientName.toLocal8Bit().constData()); } } #endif #ifdef H2CORE_HAVE_JACKSESSION jack_set_session_callback(m_pClient, jack_session_callback, (void*)this); #endif if ( pPreferences->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT && pPreferences->m_bJackMasterMode == Preferences::USE_JACK_TIME_MASTER ){ initTimebaseMaster(); } return 0; } void JackAudioDriver::makeTrackOutputs( Song* pSong ) { if( Preferences::get_instance()->m_bJackTrackOuts == false ) { return; } InstrumentList* pInstrumentList = pSong->get_instrument_list(); Instrument* pInstrument; int nInstruments = ( int ) pInstrumentList->size(); WARNINGLOG( QString( "Creating / renaming %1 ports" ).arg( nInstruments ) ); int nTrackCount = 0; for( int i = 0 ; i < MAX_INSTRUMENTS ; i++ ){ for ( int j = 0 ; j < MAX_COMPONENTS ; j++ ){ m_trackMap[i][j] = 0; } } // Creates a new output track or reassigns an existing one for // each component of each instrument and stores the result in // the `m_trackMap'. InstrumentComponent* pInstrumentComponent; for ( int n = 0; n <= nInstruments - 1; n++ ) { pInstrument = pInstrumentList->get( n ); for ( auto it = pInstrument->get_components()->begin(); it != pInstrument->get_components()->end(); ++it) { pInstrumentComponent = *it; setTrackOutput( nTrackCount, pInstrument, pInstrumentComponent, pSong); m_trackMap[pInstrument->get_id()][pInstrumentComponent->get_drumkit_componentID()] = nTrackCount; nTrackCount++; } } // clean up unused ports jack_port_t *pPortL, *pPortR; for ( int n = nTrackCount; n < m_nTrackPortCount; n++ ) { pPortL = m_pTrackOutputPortsL[n]; pPortR = m_pTrackOutputPortsR[n]; m_pTrackOutputPortsL[n] = nullptr; jack_port_unregister( m_pClient, pPortL ); m_pTrackOutputPortsR[n] = nullptr; jack_port_unregister( m_pClient, pPortR ); } m_nTrackPortCount = nTrackCount; } void JackAudioDriver::setTrackOutput( int n, Instrument* pInstrument, InstrumentComponent *pInstrumentComponent, Song* pSong ) { QString sComponentName; // The function considers `m_nTrackPortCount' as the number of // ports already present. If it's smaller than `n', new ports // have to be created. if ( m_nTrackPortCount <= n ) { for ( int m = m_nTrackPortCount; m <= n; m++ ) { sComponentName = QString( "Track_%1_" ).arg( m + 1 ); m_pTrackOutputPortsL[m] = jack_port_register( m_pClient, ( sComponentName + "L" ).toLocal8Bit(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); m_pTrackOutputPortsR[m] = jack_port_register( m_pClient, ( sComponentName + "R" ).toLocal8Bit(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); if ( ! m_pTrackOutputPortsR[m] || ! m_pTrackOutputPortsL[m] ) { Hydrogen::get_instance()->raiseError( Hydrogen::JACK_ERROR_IN_PORT_REGISTER ); } } m_nTrackPortCount = n + 1; } // Now that we're sure there is an n'th port, rename it. DrumkitComponent* pDrumkitComponent = pSong->get_component( pInstrumentComponent->get_drumkit_componentID() ); sComponentName = QString( "Track_%1_%2_%3_" ).arg( n + 1 ) .arg( pInstrument->get_name() ).arg( pDrumkitComponent->get_name() ); #ifdef HAVE_JACK_PORT_RENAME // This differs from jack_port_set_name() by triggering // PortRename notifications to clients that have registered a // port rename handler. jack_port_rename( m_pClient, m_pTrackOutputPortsL[n], ( sComponentName + "L" ).toLocal8Bit() ); jack_port_rename( m_pClient, m_pTrackOutputPortsR[n], ( sComponentName + "R" ).toLocal8Bit() ); #else jack_port_set_name( m_pTrackOutputPortsL[n], ( sComponentName + "L" ).toLocal8Bit() ); jack_port_set_name( m_pTrackOutputPortsR[n], ( sComponentName + "R" ).toLocal8Bit() ); #endif } void JackAudioDriver::play() { Preferences* pPreferences = Preferences::get_instance(); if ( pPreferences->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT ) { if ( m_pClient != nullptr ) { INFOLOG( "jack_transport_start()" ); jack_transport_start( m_pClient ); } } else { m_transport.m_status = TransportInfo::ROLLING; } } void JackAudioDriver::stop() { Preferences* pPreferences = Preferences::get_instance(); if ( pPreferences->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT ) { if ( m_pClient != nullptr ) { INFOLOG( "jack_transport_stop()" ); jack_transport_stop( m_pClient ); } } else { m_transport.m_status = TransportInfo::STOPPED; } } void JackAudioDriver::locate( unsigned long frame ) { if ( ( Preferences::get_instance() )->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT ) { if ( m_pClient != nullptr ) { // jack_transport_locate() (jack/transport.h ) // re-positions the transport to a new frame number. May // be called at any time by any client. jack_transport_locate( m_pClient, frame ); } } else { m_transport.m_nFrames = (long long)frame; } } void JackAudioDriver::setBpm( float fBPM ) { if ( fBPM >= 1 ) { m_transport.m_fBPM = fBPM; } } #ifdef H2CORE_HAVE_JACKSESSION void JackAudioDriver::jack_session_callback(jack_session_event_t *event, void *arg) { JackAudioDriver* pDriver = static_cast(arg); if ( pDriver != nullptr ) { pDriver->jack_session_callback_impl( event ); } } static QString baseName( QString sPath ) { return QFileInfo( sPath ).fileName(); } void JackAudioDriver::jack_session_callback_impl(jack_session_event_t* event) { enum session_events{ SAVE_SESSION, SAVE_AND_QUIT, SAVE_TEMPLATE }; Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); Preferences* pPreferences = Preferences::get_instance(); EventQueue* pEventQueue = EventQueue::get_instance(); jack_session_event_t* ev = (jack_session_event_t *) event; QString sJackSessionDirectory = (QString) ev->session_dir; QString sRetval = pPreferences->getJackSessionApplicationPath() + " --jacksessionid " + ev->client_uuid; /* Playlist mode */ Playlist* pPlaylist = Playlist::get_instance(); if ( pPlaylist->size() > 0 ) { if ( pPlaylist->getFilename().isEmpty() ) { pPlaylist->setFilename( Filesystem::untitled_playlist_file_name() ); } QString sFileName = baseName( pPlaylist->getFilename() ); sFileName.replace( QString(" "), QString("_") ); sRetval += " -p \"${SESSION_DIR}" + sFileName + "\""; /* Copy all songs to Session Directory and update playlist */ SongReader reader; for ( uint i = 0; i < pPlaylist->size(); ++i ) { QString sBaseName = baseName( pPlaylist->get( i )->filePath ); QString sNewName = sJackSessionDirectory + sBaseName; QString sSongPath = reader.getPath( pPlaylist->get( i )->filePath ); if ( sSongPath != nullptr && QFile::copy( sSongPath, sNewName ) ) { /* Keep only filename on list for relative read */ pPlaylist->get( i )->filePath = sBaseName; } else { /* Note - we leave old path in playlist */ ERRORLOG( "Can't copy " + pPlaylist->get( i )->filePath + " to " + sNewName ); ev->flags = JackSessionSaveError; } } /* Save updated playlist */ bool bRelativePaths = Preferences::get_instance()->isPlaylistUsingRelativeFilenames(); if ( Files::savePlaylistPath( sJackSessionDirectory + sFileName, pPlaylist, bRelativePaths ) == nullptr ) { ev->flags = JackSessionSaveError; } /* Song Mode */ } else { /* Valid Song is needed */ if ( pSong->get_filename().isEmpty() ) { pSong->set_filename( Filesystem::untitled_song_file_name() ); } QString sFileName = baseName( pSong->get_filename() ); sFileName.replace( QString(" "), QString("_") ); pSong->set_filename( sJackSessionDirectory + sFileName); /* SongReader will look into SESSION DIR anyway */ sRetval += " -s \"" + sFileName + "\""; switch (ev->type) { case JackSessionSave: pEventQueue->push_event(EVENT_JACK_SESSION, SAVE_SESSION); break; case JackSessionSaveAndQuit: pEventQueue->push_event(EVENT_JACK_SESSION, SAVE_SESSION); pEventQueue->push_event(EVENT_JACK_SESSION, SAVE_AND_QUIT); break; default: ERRORLOG( "JackSession: Unknown event type" ); ev->flags = JackSessionSaveError; } } ev->command_line = strdup( sRetval.toUtf8().constData() ); jack_session_reply( m_pClient, ev ); jack_session_event_free( ev ); } #endif void JackAudioDriver::initTimebaseMaster() { if ( m_pClient == nullptr ) { return; } Preferences* pPreferences = Preferences::get_instance(); if ( pPreferences->m_bJackMasterMode == Preferences::USE_JACK_TIME_MASTER) { // Defined in jack/transport.h // Register as timebase master for the JACK // subsystem. // // The timebase master registers a callback that // updates extended position information such as // beats or timecode whenever necessary. Without // this extended information, there is no need for // this function. // // There is never more than one master at a time. // When a new client takes over, the former @a // timebase_callback is no longer called. Taking // over the timebase may be done conditionally, so // it fails if there was a master already. // // @param client the JACK client structure. // @param conditional non-zero for a conditional // request. // @param timebase_callback is a realtime function // that returns position information. // @param arg an argument for the @a timebase_callback // function. // @return // - 0 on success; // - EBUSY if a conditional request fails because // there was already a timebase master; // - other non-zero error code. int nReturnValue = jack_set_timebase_callback(m_pClient, 0, JackTimebaseCallback, this); if ( nReturnValue != 0 ){ pPreferences->m_bJackMasterMode = Preferences::NO_JACK_TIME_MASTER; } else { m_nIsTimebaseMaster = 2; } } else { releaseTimebaseMaster(); } } void JackAudioDriver::releaseTimebaseMaster() { if ( m_pClient == nullptr ) { return; } jack_release_timebase( m_pClient ); if ( m_JackTransportPos.valid & JackPositionBBT ) { m_nIsTimebaseMaster = 0; } else { m_nIsTimebaseMaster = -1; } } void JackAudioDriver::JackTimebaseCallback(jack_transport_state_t state, jack_nframes_t nFrames, jack_position_t* pJackPosition, int new_pos, void *arg) { JackAudioDriver* pDriver = static_cast(arg); if ( pDriver == nullptr ){ return; } Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if ( pSong == nullptr ) { return; } // --------------------------------------------------------------- // What is the BBT information? // // There is no formal definition in the JACK API but the way it is // interpreted by Hydrogen is the following: // // bar: Number of patterns played since the beginning of the song. // beat: Number of quarters passed since the beginning of the the // pattern. // tick: Number of ticks passed since the last beat (with respect // to the current frame). // // A tick is an internal measure representing the smallest // resolution of the transport position in terms of the // patterns. It consist of m_transport.m_fTickSize frames, which // changes depending on the current tempo. // --------------------------------------------------------------- // First tick covered during the next cycle. float fTickSize = pDriver->m_transport.m_fTickSize; unsigned long nextTick = floor(( pJackPosition->frame - pDriver->m_frameOffset ) / fTickSize ); int nNextPatternStartTick; int nNextPattern = pHydrogen->getPosForTick( nextTick, &nNextPatternStartTick ); // In order to determine the tempo, which will be set by Hydrogen // during the next transport cycle, we have to look at the last // tick handled in audioEngine_updateNoteQueue() (during this // cycle and after the updateTransportInfo() returns. unsigned long nextTickInternal = floor(( pJackPosition->frame - pDriver->m_frameOffset + pHydrogen->calculateLookahead( fTickSize ) ) / fTickSize) - 1; int nNextPatternStartTickInternal; int nNextPatternInternal = pHydrogen->getPosForTick( nextTickInternal, &nNextPatternStartTickInternal ); // Calculate the length of the next pattern in ticks == number // of ticks in the next bar. long ticksPerBar = pHydrogen->getPatternLength( nNextPattern ); if ( ticksPerBar < 1 ) { return; } pJackPosition->ticks_per_beat = (double)ticksPerBar / 4; pJackPosition->valid = JackPositionBBT; // Time signature "numerator" pJackPosition->beats_per_bar = ((float)ticksPerBar / (float)pSong->__resolution); // Time signature "denominator" pJackPosition->beat_type = 4.0; if ( pDriver->m_transport.m_nFrames + pDriver->m_frameOffset != pJackPosition->frame ) { // In case of a relocation, wait two full cycles till the new // tempo will be broadcast. nWaits = 2; } if ( nWaits == 0 ) { // Average tempo in BPM for the block corresponding to // pJackPosition. In Hydrogen is guaranteed to be constant within // a block. pJackPosition->beats_per_minute = (double)pHydrogen->getTimelineBpm( nNextPatternInternal ); } else { pJackPosition->beats_per_minute = (double)pDriver->m_transport.m_fBPM; } nWaits = max( int(0), nWaits - 1); if ( pDriver->m_transport.m_nFrames < 1 ) { pJackPosition->bar = 0; pJackPosition->beat = 1; pJackPosition->tick = 0; pJackPosition->bar_start_tick = 0; } else { // +1 since the counting bars starts at 1. pJackPosition->bar = nNextPattern + 1; /* how many ticks elapsed from last bar ( where bar == pattern ) */ int32_t nTicksFromBar = ( nextTick % (int32_t) ticksPerBar ); // Number of ticks that have elapsed between frame 0 and the // first beat of the next measure. pJackPosition->bar_start_tick = nextTick - nTicksFromBar; pJackPosition->beat = nTicksFromBar / pJackPosition->ticks_per_beat; // +1 since the counting beats starts at 1. pJackPosition->beat++; // Counting ticks starts at 0. pJackPosition->tick = nTicksFromBar % (int32_t) pJackPosition->ticks_per_beat; } // Tell Hydrogen it is still timebase master. pDriver->m_nIsTimebaseMaster = 2; } } #endif // H2CORE_HAVE_JACK hydrogen-1.0.0-rc1/src/core/src/IO/jack_midi_driver.cpp000066400000000000000000000263311366722712400226370ustar00rootroot00000000000000/*- * Copyright (c) 2011 Hans Petter Selasky * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #if defined(H2CORE_HAVE_JACK) || _DOXYGEN_ #include #include #include #include #include #include #include #ifdef H2CORE_HAVE_LASH #include #endif using namespace std; namespace H2Core { const char* JackMidiDriver::__class_name = "JackMidiDriver"; void JackMidiDriver::lock(void) { pthread_mutex_lock(&mtx); } void JackMidiDriver::unlock(void) { pthread_mutex_unlock(&mtx); } void JackMidiDriver::JackMidiWrite(jack_nframes_t nframes) { int error; int events; int i; void *buf; jack_midi_event_t event; uint8_t buffer[13];// 13 is needed if we get sysex goto messages if (input_port == nullptr) { return; } buf = jack_port_get_buffer(input_port, nframes); if (buf == nullptr) { return; } #ifdef JACK_MIDI_NEEDS_NFRAMES events = jack_midi_get_event_count(buf, nframes); #else events = jack_midi_get_event_count(buf); #endif for (i = 0; i < events; i++) { MidiMessage msg; #ifdef JACK_MIDI_NEEDS_NFRAMES error = jack_midi_event_get(&event, buf, i, nframes); #else error = jack_midi_event_get(&event, buf, i); #endif if (error) { continue; } if (running < 1) { continue; } error = event.size; if (error > (int)sizeof(buffer)) { error = (int)sizeof(buffer); } memset(buffer, 0, sizeof(buffer)); memcpy(buffer, event.buffer, error); switch (buffer[0] >> 4) { case 0x8: /* note off */ msg.m_type = MidiMessage::NOTE_OFF; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = buffer[0] & 0xF; handleMidiMessage(msg); break; case 0x9: /* note on */ msg.m_type = MidiMessage::NOTE_ON; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = buffer[0] & 0xF; handleMidiMessage(msg); break; case 0xA: /* aftertouch */ msg.m_type = MidiMessage::POLYPHONIC_KEY_PRESSURE; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = buffer[0] & 0xF; handleMidiMessage(msg); break; case 0xB: /* control change */ msg.m_type = MidiMessage::CONTROL_CHANGE; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = buffer[0] & 0xF; handleMidiMessage(msg); break; case 0xC: /* program change */ msg.m_type = MidiMessage::PROGRAM_CHANGE; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = buffer[0] & 0xF; handleMidiMessage(msg); break; case 0xF: switch (buffer[0]) { case 0xF0: /* system exclusive */ msg.m_type = MidiMessage::SYSEX; if(buffer[3] == 06 ){// MMC message for ( int i = 0; i < sizeof(buffer) && i<6; i++ ) { msg.m_sysexData.push_back( buffer[i] ); } }else { for ( int i = 0; i < sizeof(buffer); i++ ) { msg.m_sysexData.push_back( buffer[i] ); } } handleMidiMessage(msg); break; case 0xF1: msg.m_type = MidiMessage::QUARTER_FRAME; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = 0; handleMidiMessage(msg); break; case 0xF2: msg.m_type = MidiMessage::SONG_POS; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = 0; handleMidiMessage(msg); break; case 0xFA: msg.m_type = MidiMessage::START; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = 0; handleMidiMessage(msg); break; case 0xFB: msg.m_type = MidiMessage::CONTINUE; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = 0; handleMidiMessage(msg); break; case 0xFC: msg.m_type = MidiMessage::STOP; msg.m_nData1 = buffer[1]; msg.m_nData2 = buffer[2]; msg.m_nChannel = 0; handleMidiMessage(msg); break; default: break; } default: break; } } } void JackMidiDriver::handleOutgoingControlChange( int param, int value, int channel ) { uint8_t buffer[4]; if (channel < 0 || channel > 15) { return; } if (param < 0 || param > 127) { return; } if (value < 0 || value > 127) { return; } buffer[0] = 0xB0 | channel; /* note off */ buffer[1] = param; buffer[2] = value; buffer[3] = 0; JackMidiOutEvent(buffer, 3); } void JackMidiDriver::JackMidiRead(jack_nframes_t nframes) { uint8_t *buffer; void *buf; jack_nframes_t t; uint8_t data[1]; uint8_t len; if (output_port == nullptr) { return; } buf = jack_port_get_buffer(output_port, nframes); if (buf == nullptr) { return; } #ifdef JACK_MIDI_NEEDS_NFRAMES jack_midi_clear_buffer(buf, nframes); #else jack_midi_clear_buffer(buf); #endif t = 0; lock(); while ((t < nframes) && (rx_out_pos != rx_in_pos)) { len = jack_buffer[4 * rx_in_pos]; if (len == 0) { rx_in_pos++; if (rx_in_pos >= JACK_MIDI_BUFFER_MAX) { rx_in_pos = 0; } continue; } #ifdef JACK_MIDI_NEEDS_NFRAMES buffer = jack_midi_event_reserve(buf, t, len, nframes); #else buffer = jack_midi_event_reserve(buf, t, len); #endif if (buffer == nullptr) { break; } t++; rx_in_pos++; if (rx_in_pos >= JACK_MIDI_BUFFER_MAX) { rx_in_pos = 0; } memcpy(buffer, jack_buffer + (4 * rx_in_pos) + 1, len); } unlock(); } void JackMidiDriver::JackMidiOutEvent(uint8_t buf[4], uint8_t len) { uint32_t next_pos; lock(); next_pos = rx_out_pos + 1; if (next_pos >= JACK_MIDI_BUFFER_MAX) { next_pos = 0; } if (next_pos == rx_in_pos) { /* buffer is full */ unlock(); return; } if (len > 3) { len = 3; } jack_buffer[(4 * next_pos)] = len; jack_buffer[(4 * next_pos) + 1] = buf[0]; jack_buffer[(4 * next_pos) + 2] = buf[1]; jack_buffer[(4 * next_pos) + 3] = buf[2]; rx_out_pos = next_pos; unlock(); } static int JackMidiProcessCallback(jack_nframes_t nframes, void *arg) { JackMidiDriver *jmd = (JackMidiDriver *)arg; if (nframes <= 0) { return (0); } jmd->JackMidiRead(nframes); jmd->JackMidiWrite(nframes); return (0); } static void JackMidiShutdown(void *arg) { UNUSED(arg); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_SERVER_SHUTDOWN ); } JackMidiDriver::JackMidiDriver() : MidiInput( __class_name ), MidiOutput( __class_name ), Object( __class_name ) { pthread_mutex_init(&mtx, nullptr); running = 0; rx_in_pos = 0; rx_out_pos = 0; output_port = nullptr; input_port = nullptr; QString jackMidiClientId = "Hydrogen"; #ifdef H2CORE_HAVE_OSC Preferences* pref = Preferences::get_instance(); QString nsmClientId = pref->getNsmClientId(); if(!nsmClientId.isEmpty()){ jackMidiClientId = nsmClientId; } #endif jackMidiClientId.append("-midi"); jack_client = jack_client_open(jackMidiClientId.toLocal8Bit(), JackNoStartServer, nullptr); if (jack_client == nullptr) { return; } jack_set_process_callback(jack_client, JackMidiProcessCallback, this); jack_on_shutdown(jack_client, JackMidiShutdown, nullptr); output_port = jack_port_register( jack_client, "TX", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); input_port = jack_port_register( jack_client, "RX", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); jack_activate(jack_client); } JackMidiDriver::~JackMidiDriver() { if (jack_client != nullptr) { if( jack_port_unregister( jack_client, input_port) != 0){ ERRORLOG("Failed to unregister jack midi input out"); } if( jack_port_unregister( jack_client, output_port) != 0){ ERRORLOG("Failed to unregister jack midi input out"); } //jack_port_unregister( jack_client, output_port); if( jack_deactivate(jack_client) != 0){ ERRORLOG("Failed to unregister jack midi input out"); } if( jack_client_close(jack_client) != 0){ ERRORLOG("Failed close jack midi client"); } } pthread_mutex_destroy(&mtx); } void JackMidiDriver::open() { running ++; } void JackMidiDriver::close() { running --; } std::vector JackMidiDriver::getInputPortList() { vector inputList; inputList.push_back("Default"); return inputList; } std::vector JackMidiDriver::getOutputPortList() { vector outputList; outputList.push_back("Default"); return outputList; } void JackMidiDriver::getPortInfo(const QString& sPortName, int& nClient, int& nPort) { if (sPortName == "None") { nClient = -1; nPort = -1; return; } nClient = 0; nPort = 0; } void JackMidiDriver::handleQueueNote(Note* pNote) { uint8_t buffer[4]; int channel; int key; int vel; channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0 || channel > 15) { return; } key = pNote->get_midi_key(); if (key < 0 || key > 127) { return; } vel = pNote->get_midi_velocity(); if (vel < 0 || vel > 127) { return; } buffer[0] = 0x80 | channel; /* note off */ buffer[1] = key; buffer[2] = 0; buffer[3] = 0; JackMidiOutEvent(buffer, 3); buffer[0] = 0x90 | channel; /* note on */ buffer[1] = key; buffer[2] = vel; buffer[3] = 0; JackMidiOutEvent(buffer, 3); } void JackMidiDriver::handleQueueNoteOff(int channel, int key, int vel) { uint8_t buffer[4]; if (channel < 0 || channel > 15) { return; } if (key < 0 || key > 127) { return; } if (vel < 0 || vel > 127) { return; } buffer[0] = 0x80 | channel; /* note off */ buffer[1] = key; buffer[2] = 0; buffer[3] = 0; JackMidiOutEvent(buffer, 3); } void JackMidiDriver::handleQueueAllNoteOff() { InstrumentList * pInstrList = Hydrogen::get_instance()->getSong()->get_instrument_list(); Instrument * pCurInstr; unsigned int numInstruments = pInstrList->size(); unsigned int i = 0; int channel = 0; int key = 0; for (i = 0; i < numInstruments; i++) { pCurInstr = pInstrList->get(i); channel = pCurInstr->get_midi_out_channel(); if (channel < 0 || channel > 15) { continue; } key = pCurInstr->get_midi_out_note(); if (key < 0 || key > 127) { continue; } handleQueueNoteOff(channel, key, 0); } } }; #endif /* H2CORE_HAVE_JACK */ hydrogen-1.0.0-rc1/src/core/src/IO/midi_input.cpp000066400000000000000000000352521366722712400215150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include namespace H2Core { MidiInput::MidiInput( const char* class_name ) : Object( class_name ) , m_bActive( false ) , __hihat_cc_openess ( 127 ) , __noteOffTick( 0 ) , __noteOnTick( 0 ) { //INFOLOG( "INIT" ); } MidiInput::~MidiInput() { //INFOLOG( "DESTROY" ); } void MidiInput::handleMidiMessage( const MidiMessage& msg ) { EventQueue::get_instance()->push_event( EVENT_MIDI_ACTIVITY, -1 ); INFOLOG( "[start of handleMidiMessage]" ); INFOLOG( QString("[handleMidiMessage] channel: %1").arg(msg.m_nChannel) ); INFOLOG( QString("[handleMidiMessage] val1: %1").arg( msg.m_nData1 ) ); INFOLOG( QString("[handleMidiMessage] val2: %1").arg( msg.m_nData2 ) ); // midi channel filter for all messages bool bIsChannelValid = true; Preferences* pPref = Preferences::get_instance(); if ( pPref->m_nMidiChannelFilter != -1 && pPref->m_nMidiChannelFilter != msg.m_nChannel ) { bIsChannelValid = false; } // exclude all midi channel filter independent messages int type = msg.m_type; if ( MidiMessage::SYSEX == type || MidiMessage::SYSTEM_EXCLUSIVE == type || MidiMessage::START == type || MidiMessage::CONTINUE == type || MidiMessage::STOP == type || MidiMessage::SONG_POS == type || MidiMessage::QUARTER_FRAME == type ) { bIsChannelValid = true; } if ( !bIsChannelValid) { return; } Hydrogen* pHydrogen = Hydrogen::get_instance(); if ( ! pHydrogen->getSong() ) { ERRORLOG( "No song loaded, skipping note" ); return; } switch ( type ) { case MidiMessage::SYSEX: handleSysexMessage( msg ); break; case MidiMessage::NOTE_ON: INFOLOG("This is a NOTE ON message."); handleNoteOnMessage( msg ); break; case MidiMessage::NOTE_OFF: INFOLOG("This is a NOTE OFF message."); handleNoteOffMessage( msg, false ); break; case MidiMessage::POLYPHONIC_KEY_PRESSURE: //ERRORLOG( "POLYPHONIC_KEY_PRESSURE event not handled yet" ); INFOLOG( QString( "[handleMidiMessage] POLYPHONIC_KEY_PRESSURE Parameter: %1, Value: %2") .arg( msg.m_nData1 ).arg( msg.m_nData2 ) ); handlePolyphonicKeyPressureMessage( msg ); break; case MidiMessage::CONTROL_CHANGE: INFOLOG( QString( "[handleMidiMessage] CONTROL_CHANGE Parameter: %1, Value: %2") .arg( msg.m_nData1 ).arg( msg.m_nData2 ) ); handleControlChangeMessage( msg ); break; case MidiMessage::PROGRAM_CHANGE: INFOLOG( QString( "[handleMidiMessage] PROGRAM_CHANGE Value: %1" ) .arg( msg.m_nData1 ) ); handleProgramChangeMessage( msg ); break; case MidiMessage::CHANNEL_PRESSURE: ERRORLOG( "CHANNEL_PRESSURE event not handled yet" ); break; case MidiMessage::PITCH_WHEEL: ERRORLOG( "PITCH_WHEEL event not handled yet" ); break; case MidiMessage::SYSTEM_EXCLUSIVE: ERRORLOG( "SYSTEM_EXCLUSIVE event not handled yet" ); break; case MidiMessage::START: /* Start from position 0 */ INFOLOG( "START event" ); if ( pHydrogen->getState() != STATE_PLAYING ) { pHydrogen->setPatternPos( 0 ); pHydrogen->setTimelineBpm(); pHydrogen->sequencer_play(); } break; case MidiMessage::CONTINUE: /* Just start */ ERRORLOG( "CONTINUE event" ); if ( pHydrogen->getState() != STATE_PLAYING ) { pHydrogen->sequencer_play(); } break; case MidiMessage::STOP: /* Stop in current position i.e. Pause */ INFOLOG( "STOP event" ); if ( pHydrogen->getState() == STATE_PLAYING ) { pHydrogen->sequencer_stop(); } break; case MidiMessage::SONG_POS: ERRORLOG( "SONG_POS event not handled yet" ); break; case MidiMessage::QUARTER_FRAME: WARNINGLOG( "QUARTER_FRAME event not handled yet" ); break; case MidiMessage::UNKNOWN: ERRORLOG( "Unknown midi message" ); break; default: ERRORLOG( QString( "unhandled midi message type: %1" ).arg( msg.m_type ) ); } INFOLOG("[end of handleMidiMessage]"); } void MidiInput::handleControlChangeMessage( const MidiMessage& msg ) { //INFOLOG( QString( "[handleMidiMessage] CONTROL_CHANGE Parameter: %1, Value: %2" ).arg( msg.m_nData1 ).arg( msg.m_nData2 ) ); Hydrogen *pEngine = Hydrogen::get_instance(); MidiActionManager *pMidiActionManager = MidiActionManager::get_instance(); MidiMap *pMidiMap = MidiMap::get_instance(); Action *pAction = pMidiMap->getCCAction( msg.m_nData1 ); pAction->setParameter2( QString::number( msg.m_nData2 ) ); pMidiActionManager->handleAction( pAction ); if(msg.m_nData1 == 04){ __hihat_cc_openess = msg.m_nData2; } pEngine->lastMidiEvent = "CC"; pEngine->lastMidiEventParameter = msg.m_nData1; } void MidiInput::handleProgramChangeMessage( const MidiMessage& msg ) { Hydrogen *pEngine = Hydrogen::get_instance(); MidiActionManager *pMidiActionManager = MidiActionManager::get_instance(); MidiMap *pMidiMap = MidiMap::get_instance(); Action *pAction = pMidiMap->getPCAction(); pAction->setParameter2( QString::number( msg.m_nData1 ) ); pMidiActionManager->handleAction( pAction ); pEngine->lastMidiEvent = "PROGRAM_CHANGE"; pEngine->lastMidiEventParameter = 0; } void MidiInput::handleNoteOnMessage( const MidiMessage& msg ) { // INFOLOG( "handleNoteOnMessage" ); int nNote = msg.m_nData1; float fVelocity = msg.m_nData2 / 127.0; if ( fVelocity == 0 ) { handleNoteOffMessage( msg, false ); return; } MidiActionManager * pMidiActionManager = MidiActionManager::get_instance(); MidiMap * pMidiMap = MidiMap::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->lastMidiEvent = "NOTE"; pEngine->lastMidiEventParameter = msg.m_nData1; bool bActionSuccess = pMidiActionManager->handleAction( pMidiMap->getNoteAction( msg.m_nData1 ) ); if ( bActionSuccess && Preferences::get_instance()->m_bMidiDiscardNoteAfterAction) { return; } bool bPatternSelect = false; if ( bPatternSelect ) { int patternNumber = nNote - 36; //INFOLOG( QString( "next pattern = %1" ).arg( patternNumber ) ); pEngine->sequencer_setNextPattern( patternNumber ); } else { static const float fPan_L = 0.5f; static const float fPan_R = 0.5f; int nInstrument = nNote - 36; InstrumentList *pInstrList = pEngine->getSong()->get_instrument_list(); Instrument *pInstr = nullptr; if ( Preferences::get_instance()->__playselectedinstrument ){ nInstrument = pEngine->getSelectedInstrumentNumber(); pInstr= pInstrList->get( pEngine->getSelectedInstrumentNumber()); } else if(Preferences::get_instance()->m_bMidiFixedMapping ){ pInstr = pInstrList->findMidiNote( nNote ); if(pInstr == nullptr) { WARNINGLOG( QString( "Can't find corresponding Instrument for note %1" ).arg( nNote )); return; } nInstrument = pInstrList->index( pInstr ); } else { if(nInstrument < 0) { //Drop everything < 36 return; } if( nInstrument >= pInstrList->size()) { WARNINGLOG( QString( "Can't find corresponding Instrument for note %1" ).arg( nNote )); return; } pInstr = pInstrList->get( static_cast(nInstrument) ); } /* Only look to change instrument if the current note is actually of hihat and hihat openness is outside the instrument selected */ if ( pInstr != nullptr && pInstr->get_hihat_grp() >= 0 && ( __hihat_cc_openess < pInstr->get_lower_cc() || __hihat_cc_openess > pInstr->get_higher_cc() ) ) { for(int i=0 ; i<=pInstrList->size() ; i++) { Instrument *instr_contestant = pInstrList->get( i ); if( instr_contestant != nullptr && pInstr->get_hihat_grp() == instr_contestant->get_hihat_grp() && __hihat_cc_openess >= instr_contestant->get_lower_cc() && __hihat_cc_openess <= instr_contestant->get_higher_cc() ) { nInstrument = i; break; } } } pEngine->addRealtimeNote( nInstrument, fVelocity, fPan_L, fPan_R, 0.0, false, true, nNote ); } __noteOnTick = pEngine->__getMidiRealtimeNoteTickPosition(); } /* EDrums (at least Roland TD-6V) uses PolyphonicKeyPressure for cymbal choke. If the message is 127 (choked) we send a NoteOff */ void MidiInput::handlePolyphonicKeyPressureMessage( const MidiMessage& msg ) { if( msg.m_nData2 == 127 ) { handleNoteOffMessage( msg, true ); } } void MidiInput::handleNoteOffMessage( const MidiMessage& msg, bool CymbalChoke ) { // INFOLOG( "handleNoteOffMessage" ); if ( !CymbalChoke && Preferences::get_instance()->m_bMidiNoteOffIgnore ) { return; } Hydrogen *pEngine = Hydrogen::get_instance(); InstrumentList* pInstrList = pEngine->getSong()->get_instrument_list(); __noteOffTick = pEngine->getTickPosition(); unsigned long notelength = computeDeltaNoteOnOfftime(); int nNote = msg.m_nData1; //float fVelocity = msg.m_nData2 / 127.0; //we need this in future to control release velocity int nInstrument = nNote - 36; Instrument *pInstr = nullptr; if ( Preferences::get_instance()->__playselectedinstrument ){ nInstrument = pEngine->getSelectedInstrumentNumber(); pInstr = pInstrList->get( pEngine->getSelectedInstrumentNumber()); } else if( Preferences::get_instance()->m_bMidiFixedMapping ) { pInstr = pInstrList->findMidiNote( nNote ); if( pInstr == nullptr ) { WARNINGLOG( QString( "Can't find corresponding Instrument for note %1" ).arg( nNote )); return; } nInstrument = pInstrList->index(pInstr); } else { if( nInstrument < 0 ) { //Drop everything < 36 return; } if( nInstrument >= pInstrList->size()) { WARNINGLOG( QString( "Can't find corresponding Instrument for note %1" ).arg( nNote )); return; } pInstr = pInstrList->get(nInstrument); } float fStep = pow( 1.0594630943593, (nNote) ); if ( !Preferences::get_instance()->__playselectedinstrument ) { fStep = 1; } bool use_note_off = AudioEngine::get_instance()->get_sampler()->is_instrument_playing( pInstr ); if(use_note_off){ if ( Preferences::get_instance()->__playselectedinstrument ){ AudioEngine::get_instance()->get_sampler()->midi_keyboard_note_off( msg.m_nData1 ); } else { if ( pInstrList->size() < nInstrument +1 ) { return; } Note *pOffNote = new Note( pInstr, 0.0, 0.0, 0.0, 0.0, -1, 0 ); pOffNote->set_note_off( true ); AudioEngine::get_instance()->get_sampler()->note_on( pOffNote ); delete pOffNote; } if(Preferences::get_instance()->getRecordEvents()) { AudioEngine::get_instance()->get_sampler()->setPlayingNotelength( pInstr, notelength * fStep, __noteOnTick ); } } } unsigned long MidiInput::computeDeltaNoteOnOfftime() { unsigned long __notelengthTicks = __noteOffTick - __noteOnTick; return __notelengthTicks; } void MidiInput::handleSysexMessage( const MidiMessage& msg ) { /* General MMC message 0 1 2 3 4 5 F0 7F id 6 cmd 247 cmd: 1 stop 2 play 3 Deferred play 4 Fast Forward 5 Rewind 6 Record strobe (punch in) 7 Record exit (punch out) 8 Record ready 9 Pause Goto MMC message 0 1 2 3 4 5 6 7 8 9 10 11 12 240 127 id 6 68 6 1 hr mn sc fr ff 247 */ MidiActionManager * pMidiActionManager = MidiActionManager::get_instance(); MidiMap * pMidiMap = MidiMap::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->lastMidiEventParameter = msg.m_nData1; if ( msg.m_sysexData.size() == 6 ) { if ( ( msg.m_sysexData[0] == 240 ) && ( msg.m_sysexData[1] == 127 ) && //( msg.m_sysexData[2] == 0 ) && ( msg.m_sysexData[3] == 6 ) ) { switch ( msg.m_sysexData[4] ) { case 1: // STOP { pEngine->lastMidiEvent = "MMC_STOP"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_STOP")); break; } case 2: // PLAY { pEngine->lastMidiEvent = "MMC_PLAY"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_PLAY")); break; } case 3: //DEFERRED PLAY { pEngine->lastMidiEvent = "MMC_PLAY"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_PLAY")); break; } case 4: // FAST FWD pEngine->lastMidiEvent = "MMC_FAST_FORWARD"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_FAST_FORWARD")); break; case 5: // REWIND pEngine->lastMidiEvent = "MMC_REWIND"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_REWIND")); break; case 6: // RECORD STROBE (PUNCH IN) pEngine->lastMidiEvent = "MMC_RECORD_STROBE"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_RECORD_STROBE")); break; case 7: // RECORD EXIT (PUNCH OUT) pEngine->lastMidiEvent = "MMC_RECORD_EXIT"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_RECORD_EXIT")); break; case 8: // RECORD READY pEngine->lastMidiEvent = "MMC_RECORD_READY"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_RECORD_READY")); break; case 9: //PAUSE pEngine->lastMidiEvent = "MMC_PAUSE"; pMidiActionManager->handleAction(pMidiMap->getMMCAction("MMC_PAUSE")); break; default: WARNINGLOG( "Unknown MMC Command" ); // midiDump( buf, nBytes ); } } } else if ( msg.m_sysexData.size() == 13 ) { ERRORLOG( "MMC GOTO Message not implemented yet" ); // midiDump( buf, nBytes ); //int id = buf[2]; int hr = msg.m_sysexData[7]; int mn = msg.m_sysexData[8]; int sc = msg.m_sysexData[9]; int fr = msg.m_sysexData[10]; int ff = msg.m_sysexData[11]; char tmp[200]; sprintf( tmp, "[handleSysexMessage] GOTO %d:%d:%d:%d:%d", hr, mn, sc, fr, ff ); INFOLOG( tmp ); } else { // sysex dump QString sDump; char tmpChar[64]; for ( int i = 0; i < ( int )msg.m_sysexData.size(); ++i ) { sprintf( tmpChar, "%X ", ( int )msg.m_sysexData[ i ] ); sDump += tmpChar; } WARNINGLOG( QString( "Unknown SysEx message: (%1) [%2]" ).arg( msg.m_sysexData.size() ).arg( sDump ) ); } } }; hydrogen-1.0.0-rc1/src/core/src/IO/midi_output.cpp000066400000000000000000000024361366722712400217140ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { MidiOutput::MidiOutput( const char* class_name ) : Object( class_name ) { //INFOLOG( "INIT" ); } MidiOutput::~MidiOutput() { //INFOLOG( "DESTROY" ); } }; hydrogen-1.0.0-rc1/src/core/src/IO/null_driver.cpp000066400000000000000000000042341366722712400216750ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* NullDriver::__class_name = "NullDriver"; NullDriver::NullDriver( audioProcessCallback processCallback ) : AudioOutput( __class_name ) { UNUSED( processCallback ); // INFOLOG( "INIT" ); } NullDriver::~NullDriver() { // INFOLOG( "DESTROY" ); } int NullDriver::init( unsigned nBufferSize ) { UNUSED( nBufferSize ); return 0; } int NullDriver::connect() { INFOLOG( "connect" ); return 0; } void NullDriver::disconnect() { INFOLOG( "disconnect" ); } unsigned NullDriver::getBufferSize() { // infoLog( "[getBufferSize()] not implemented yet"); return 0; } unsigned NullDriver::getSampleRate() { // infoLog("[getSampleRate()] not implemented yet"); return 0; } float* NullDriver::getOut_L() { INFOLOG( "not implemented yet" ); return nullptr; } float* NullDriver::getOut_R() { INFOLOG( "not implemented yet" ); return nullptr; } void NullDriver::play() { INFOLOG( "not implemented" ); } void NullDriver::stop() { INFOLOG( "not implemented" ); } void NullDriver::locate( unsigned long nFrame ) { UNUSED( nFrame ); INFOLOG( "not implemented" ); } void NullDriver::updateTransportInfo() { INFOLOG( "not implemented" ); } void NullDriver::setBpm( float fBPM ) { UNUSED( fBPM ); ERRORLOG( "not implemented yet" ); } }; hydrogen-1.0.0-rc1/src/core/src/IO/oss_driver.cpp000066400000000000000000000146511366722712400215330ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 // check if OSS support is enabled #if defined(H2CORE_HAVE_OSS) || _DOXYGEN_ #include #include namespace H2Core { audioProcessCallback ossDriver_audioProcessCallback; bool ossDriver_running; pthread_t ossDriverThread; int oss_driver_bufferSize = -1; OssDriver *m_pOssDriverInstance = NULL; unsigned nNextFrames = 0; void* ossDriver_processCaller( void* param ) { Object* __object = ( Object* )param; // stolen from amSynth struct sched_param sched; sched.sched_priority = 50; int res = sched_setscheduler( 0, SCHED_FIFO, &sched ); sched_getparam( 0, &sched ); if ( res ) { __WARNINGLOG( "Can't set realtime scheduling for OSS Driver" ); } __INFOLOG( QString( "Scheduling priority = %1" ).arg( sched.sched_priority ) ); OssDriver *ossDriver = ( OssDriver* )param; sleep( 1 ); while ( ossDriver_running ) { ossDriver_audioProcessCallback( oss_driver_bufferSize, NULL ); ossDriver->write(); } pthread_exit( NULL ); return NULL; } const char* OssDriver::__class_name = "OssDriver"; OssDriver::OssDriver( audioProcessCallback processCallback ) : AudioOutput( __class_name ) { INFOLOG( "INIT" ); audioBuffer = NULL; ossDriver_running = false; this->processCallback = processCallback; ossDriver_audioProcessCallback = processCallback; m_pOssDriverInstance = this; } OssDriver::~OssDriver() { INFOLOG( "DESTROY" ); } int OssDriver::init( unsigned nBufferSize ) { oss_driver_bufferSize = nBufferSize; delete[] audioBuffer; audioBuffer = NULL; audioBuffer = new short[nBufferSize * 2]; out_L = new float[nBufferSize]; out_R = new float[nBufferSize]; // clear buffers memset( out_L, 0, nBufferSize * sizeof( float ) ); memset( out_R, 0, nBufferSize * sizeof( float ) ); return 0; } /// Connect /// return 0: Ok /// return 1: Generic error int OssDriver::connect() { INFOLOG( "connect" ); Preferences *preferencesMng = Preferences::get_instance(); // initialize OSS int bits = 16; int speed = preferencesMng->m_nSampleRate; int stereo = 1; int bs; QString audioDevice; #ifdef __NetBSD__ audioDevice = "/dev/audio"; #else audioDevice = preferencesMng->m_sOSSDevice; #endif // Non blocking OSS open code stolen from GLAME fd = open( audioDevice.toLocal8Bit(), O_WRONLY | O_NONBLOCK ); // test with non blocking open int arg = fcntl( fd, F_GETFL, 0 ); if ( arg != -1 ) { // back to blocking mode... fcntl( fd, F_SETFL, arg & ~O_NONBLOCK ); } if ( fd == -1 ) { ERRORLOG( "DSP ERROR_OPEN" ); return 1; } if ( ioctl( fd, SNDCTL_DSP_SYNC, NULL ) < 0 ) { ERRORLOG( "ERROR_IOCTL" ); close( fd ); return 1; } if ( ioctl( fd, SNDCTL_DSP_SAMPLESIZE, &bits ) < 0 ) { ERRORLOG( "ERROR_IOCTL" ); close( fd ); return 1; } if ( ioctl( fd, SNDCTL_DSP_SPEED, &speed ) < 0 ) { ERRORLOG( "ERROR_IOCTL" ); close( fd ); return 1; } if ( ioctl( fd, SNDCTL_DSP_STEREO, &stereo ) < 0 ) { ERRORLOG( "ERROR_IOCTL" ); close( fd ); return 1; } unsigned bufferBits = log2( speed / 60 ); int fragSize = 0x00200000 | bufferBits; ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &fragSize ); if ( ioctl( fd, SNDCTL_DSP_GETBLKSIZE, &bs ) < 0 ) { ERRORLOG( "ERROR_IOCTL" ); close( fd ); return 1; } INFOLOG( QString( "Blocksize audio = %1" ).arg( bs ) ); /* commenting this is a fix against buffersize problems described in ticket 119 if ( bs != ( 1 << bufferBits ) ) { ERRORLOG( "ERROR_IOCTL: unable to set BlockSize" ); close( fd ); return 1; } */// end comment int format = AFMT_S16_LE; if ( ioctl( fd, SNDCTL_DSP_SETFMT, &format ) == -1 ) { ERRORLOG( "ERROR_IOCTL unable to set format" ); close( fd ); return 1; } // start main thread ossDriver_running = true; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_create( &ossDriverThread, &attr, ossDriver_processCaller, this ); return 0; } void OssDriver::disconnect() { INFOLOG( "disconnect" ); ossDriver_running = false; // join ossDriverThread pthread_join( ossDriverThread, NULL ); if ( fd != -1 ) { if ( close( fd ) ) { ERRORLOG( "Error closing audio device" ); } } delete [] out_L; out_L = NULL; delete [] out_R; out_R = NULL; delete[] audioBuffer; audioBuffer = NULL; } /// Write the audio data void OssDriver::write() { // infoLog("write"); unsigned size = oss_driver_bufferSize * 2; // prepare the 2-channel array of short for ( unsigned i = 0; i < ( unsigned )oss_driver_bufferSize; ++i ) { audioBuffer[i * 2] = ( short )( out_L[i] * 32768.0 ); audioBuffer[i * 2 + 1] = ( short )( out_R[i] * 32768.0 ); } unsigned long written = ::write( fd, audioBuffer, size * 2 ); if ( written != ( size * 2 ) ) { ERRORLOG( "OssDriver: Error writing samples to audio device." ); // std::cerr << "written = " << written << " of " << (size*2) << endl; } } int OssDriver::log2( int n ) { int result = 0; while ( ( n >>= 1 ) > 0 ) result++; return result; } unsigned OssDriver::getBufferSize() { return oss_driver_bufferSize; } unsigned OssDriver::getSampleRate() { Preferences *preferencesMng = Preferences::get_instance(); return preferencesMng->m_nSampleRate; } float* OssDriver::getOut_L() { return out_L; } float* OssDriver::getOut_R() { return out_R; } void OssDriver::play() { m_transport.m_status = TransportInfo::ROLLING; } void OssDriver::stop() { m_transport.m_status = TransportInfo::STOPPED; } void OssDriver::locate( unsigned long nFrame ) { m_transport.m_nFrames = nFrame; } void OssDriver::updateTransportInfo() { // not used } void OssDriver::setBpm( float fBPM ) { INFOLOG( QString( "setBpm: %1" ).arg( fBPM ) ); m_transport.m_fBPM = fBPM; } }; #endif // OSS support hydrogen-1.0.0-rc1/src/core/src/IO/portaudio_driver.cpp000066400000000000000000000065071366722712400227360ustar00rootroot00000000000000 #include #if defined(H2CORE_HAVE_PORTAUDIO) || _DOXYGEN_ #include #include namespace H2Core { int portAudioCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData ) { PortAudioDriver *pDriver = ( PortAudioDriver* )userData; pDriver->m_processCallback( pDriver->m_nBufferSize, nullptr ); float *out = ( float* )outputBuffer; for ( unsigned i = 0; i < framesPerBuffer; i++ ) { *out++ = pDriver->m_pOut_L[ i ]; *out++ = pDriver->m_pOut_R[ i ]; } return 0; } const char* PortAudioDriver::__class_name = "PortAudioDriver"; PortAudioDriver::PortAudioDriver( audioProcessCallback processCallback ) : AudioOutput( __class_name ) , m_processCallback( processCallback ) , m_pOut_L( nullptr ) , m_pOut_R( nullptr ) , m_pStream( nullptr ) { INFOLOG( "INIT" ); m_nBufferSize = Preferences::get_instance()->m_nBufferSize; m_nSampleRate = Preferences::get_instance()->m_nSampleRate; } PortAudioDriver::~PortAudioDriver() { INFOLOG( "DESTROY" ); } int PortAudioDriver::init( unsigned nBufferSize ) { return 0; } // // Connect // return 0: Ok // return 1: Generic error // int PortAudioDriver::connect() { INFOLOG( "[connect]" ); m_pOut_L = new float[ m_nBufferSize ]; m_pOut_R = new float[ m_nBufferSize ]; int err = Pa_Initialize(); if ( err != paNoError ) { ERRORLOG( "Portaudio error in Pa_Initialize: " + QString( Pa_GetErrorText( err ) ) ); return 1; } err = Pa_OpenDefaultStream( &m_pStream, /* passes back stream pointer */ 0, /* no input channels */ 2, /* stereo output */ paFloat32, /* 32 bit floating point output */ m_nSampleRate, // sample rate m_nBufferSize, // frames per buffer portAudioCallback, /* specify our custom callback */ this ); /* pass our data through to callback */ if ( err != paNoError ) { ERRORLOG( "Portaudio error in Pa_OpenDefaultStream: " + QString( Pa_GetErrorText( err ) ) ); return 1; } err = Pa_StartStream( m_pStream ); if ( err != paNoError ) { ERRORLOG( "Portaudio error in Pa_StartStream: " + QString( Pa_GetErrorText( err ) ) ); return 1; } return 0; } void PortAudioDriver::disconnect() { int err = Pa_StopStream( m_pStream ); if ( err != paNoError ) { ERRORLOG( "Err: " + QString( Pa_GetErrorText( err ) ) ); } err = Pa_CloseStream( m_pStream ); if ( err != paNoError ) { ERRORLOG( "Err: " + QString( Pa_GetErrorText( err ) ) ); } Pa_Terminate(); delete[] m_pOut_L; m_pOut_L = nullptr; delete[] m_pOut_R; m_pOut_R = nullptr; } unsigned PortAudioDriver::getBufferSize() { return m_nBufferSize; } unsigned PortAudioDriver::getSampleRate() { return m_nSampleRate; } float* PortAudioDriver::getOut_L() { return m_pOut_L; } float* PortAudioDriver::getOut_R() { return m_pOut_R; } void PortAudioDriver::updateTransportInfo() { } void PortAudioDriver::play() { m_transport.m_status = TransportInfo::ROLLING; } void PortAudioDriver::stop() { m_transport.m_status = TransportInfo::STOPPED; } void PortAudioDriver::locate( unsigned long nFrame ) { m_transport.m_nFrames = nFrame; } void PortAudioDriver::setBpm( float fBPM ) { m_transport.m_fBPM = fBPM; } }; #endif hydrogen-1.0.0-rc1/src/core/src/IO/portmidi_driver.cpp000066400000000000000000000221671366722712400225570ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #ifdef WIN32 #include #endif #if defined(H2CORE_HAVE_PORTMIDI) || _DOXYGEN_ #include #define TIME_PROC ((int32_t (*)(void *)) Pt_Time) #define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */ #include namespace H2Core { pthread_t PortMidiDriverThread; void* PortMidiDriver_thread( void* param ) { Object *__object = (Object*)param; PortMidiDriver *instance = ( PortMidiDriver* )param; __INFOLOG( "PortMidiDriver_thread starting" ); PmError status; int length; PmEvent buffer[1]; while ( instance->m_bRunning ) { status = Pm_Poll( instance->m_pMidiIn ); if ( status == TRUE ) { length = Pm_Read( instance->m_pMidiIn, buffer, 1 ); if ( length > 0 ) { MidiMessage msg; int nEventType = Pm_MessageStatus( buffer[0].message ); if ( ( nEventType >= 128 ) && ( nEventType < 144 ) ) { // note off msg.m_nChannel = nEventType - 128; msg.m_type = MidiMessage::NOTE_OFF; } else if ( ( nEventType >= 144 ) && ( nEventType < 160 ) ) { // note on msg.m_nChannel = nEventType - 144; msg.m_type = MidiMessage::NOTE_ON; } else if ( ( nEventType >= 160 ) && ( nEventType < 176 ) ) { // Polyphonic Key Pressure (After-touch) msg.m_nChannel = nEventType - 160; msg.m_type = MidiMessage::POLYPHONIC_KEY_PRESSURE; } else if ( ( nEventType >= 176 ) && ( nEventType < 192 ) ) { // Control Change msg.m_nChannel = nEventType - 176; msg.m_type = MidiMessage::CONTROL_CHANGE; } else if ( ( nEventType >= 192 ) && ( nEventType < 208 ) ) { // Program Change msg.m_nChannel = nEventType - 192; msg.m_type = MidiMessage::PROGRAM_CHANGE; } else if ( ( nEventType >= 208 ) && ( nEventType < 224 ) ) { // Channel Pressure (After-touch) msg.m_nChannel = nEventType - 208; msg.m_type = MidiMessage::CHANNEL_PRESSURE; } else if ( ( nEventType >= 224 ) && ( nEventType < 240 ) ) { // Pitch Wheel Change msg.m_nChannel = nEventType - 224; msg.m_type = MidiMessage::PITCH_WHEEL; } else if ( ( nEventType >= 240 ) && ( nEventType < 256 ) ) { // System Exclusive msg.m_nChannel = nEventType - 240; msg.m_type = MidiMessage::SYSTEM_EXCLUSIVE; } else { __ERRORLOG( "Unhandled midi message type: " + QString::number( nEventType ) ); __INFOLOG( "MIDI msg: " ); __INFOLOG( QString::number( buffer[0].timestamp ) ); __INFOLOG( QString::number( Pm_MessageStatus( buffer[0].message ) ) ); __INFOLOG( QString::number( Pm_MessageData1( buffer[0].message ) ) ); __INFOLOG( QString::number( Pm_MessageData2( buffer[0].message ) ) ); } msg.m_nData1 = Pm_MessageData1( buffer[0].message ); msg.m_nData2 = Pm_MessageData2( buffer[0].message ); instance->handleMidiMessage( msg ); } } else { #ifdef WIN32 Sleep( 1 ); #else usleep( 100 ); #endif } } __INFOLOG( "MIDI Thread DESTROY" ); pthread_exit( nullptr ); return nullptr; } const char* PortMidiDriver::__class_name = "PortMidiDriver"; PortMidiDriver::PortMidiDriver() : MidiInput( __class_name ), MidiOutput( __class_name ), Object( __class_name ) , m_bRunning( false ) , m_pMidiIn( nullptr ) , m_pMidiOut( nullptr ) { Pm_Initialize(); } PortMidiDriver::~PortMidiDriver() { Pm_Terminate(); } void PortMidiDriver::handleOutgoingControlChange( int param, int value, int channel ) { if ( m_pMidiOut == nullptr ) { ERRORLOG( "m_pMidiOut = nullptr " ); return; } if (channel < 0) { return; } PmEvent event; event.timestamp = 0; //Control change event.message = Pm_Message(0xB0 | channel, param, value); Pm_Write(m_pMidiOut, &event, 1); } void PortMidiDriver::open() { INFOLOG( "[open]" ); int nInputBufferSize = 100; int nDeviceId = -1; int nOutDeviceId = -1; QString sMidiPortName = Preferences::get_instance()->m_sMidiPortName; int nDevices = Pm_CountDevices(); for ( int i = 0; i < nDevices; i++ ) { const PmDeviceInfo *pInfo = Pm_GetDeviceInfo( i ); if ( pInfo == nullptr ) { ERRORLOG( "Could not open input device" ); } else { if ( pInfo->input == TRUE ) { if ( strcmp( pInfo->name, sMidiPortName.toLocal8Bit().constData() ) == 0 ) { nDeviceId = i; } } if ( pInfo->output == TRUE ) { if ( strcmp( pInfo->name, sMidiPortName.toLocal8Bit().constData() ) == 0 ) { nOutDeviceId = i; } } } } if ( nDeviceId == -1 ) { INFOLOG( "Midi input device not found." ); return; } if ( nOutDeviceId == -1 ) { INFOLOG( "Midi output device not found." ); return; } const PmDeviceInfo *info = Pm_GetDeviceInfo( nDeviceId ); if ( info == nullptr ) { ERRORLOG( "Error opening midi input device" ); } //INFOLOG( string( "Device: " ).append( info->interf ).append( " " ).append( info->name ) ); TIME_START; PmError err = Pm_OpenInput( &m_pMidiIn, nDeviceId, nullptr, nInputBufferSize, TIME_PROC, nullptr ); if ( err != pmNoError ) { ERRORLOG( "Error in Pm_OpenInput" ); } err = Pm_OpenOutput( &m_pMidiOut, nOutDeviceId, nullptr, nInputBufferSize, TIME_PROC, nullptr, 0 ); if ( err != pmNoError ) { ERRORLOG( "Error in Pm_OpenInput" ); } m_bRunning = true; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_create( &PortMidiDriverThread, &attr, PortMidiDriver_thread, ( void* )this ); } void PortMidiDriver::close() { INFOLOG( "[close]" ); if ( m_bRunning ) { m_bRunning = false; pthread_join( PortMidiDriverThread, nullptr ); PmError err = Pm_Close( m_pMidiIn ); if ( err != pmNoError ) { ERRORLOG( "Error in Pm_OpenInput" ); } } } std::vector PortMidiDriver::getInputPortList() { std::vector portList; int nDevices = Pm_CountDevices(); for ( int i = 0; i < nDevices; i++ ) { const PmDeviceInfo *pInfo = Pm_GetDeviceInfo( i ); if ( pInfo == nullptr ) { ERRORLOG( "Could not open output device" ); } else if ( pInfo->output == TRUE ) { INFOLOG( pInfo->name ); portList.push_back( pInfo->name ); } } return portList; } std::vector PortMidiDriver::getOutputPortList() { std::vector portList; int nDevices = Pm_CountDevices(); for ( int i = 0; i < nDevices; i++ ) { const PmDeviceInfo *pInfo = Pm_GetDeviceInfo( i ); if ( pInfo == nullptr ) { ERRORLOG( "Could not open input device" ); } else if ( pInfo->input == TRUE ) { INFOLOG( pInfo->name ); portList.push_back( pInfo->name ); } } return portList; } void PortMidiDriver::handleQueueNote(Note* pNote) { if ( m_pMidiOut == nullptr ) { ERRORLOG( "m_pMidiOut = nullptr " ); return; } int channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } int key = pNote->get_midi_key(); int velocity = pNote->get_midi_velocity(); PmEvent event; event.timestamp = 0; //Note off event.message = Pm_Message(0x80 | channel, key, velocity); Pm_Write(m_pMidiOut, &event, 1); //Note on event.message = Pm_Message(0x90 | channel, key, velocity); Pm_Write(m_pMidiOut, &event, 1); } void PortMidiDriver::handleQueueNoteOff( int channel, int key, int velocity ) { if ( m_pMidiOut == nullptr ) { ERRORLOG( "m_pMidiOut = nullptr " ); return; } // int channel = pNote->get_instrument()->get_midi_out_channel(); if (channel < 0) { return; } // int velocity = pNote->get_midi_velocity(); PmEvent event; event.timestamp = 0; //Note off event.message = Pm_Message(0x80 | channel, key, velocity); Pm_Write(m_pMidiOut, &event, 1); } void PortMidiDriver::handleQueueAllNoteOff() { if ( m_pMidiOut == nullptr ) { ERRORLOG( "m_pMidiOut = nullptr " ); return; } InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list(); unsigned int numInstruments = instList->size(); for (int index = 0; index < numInstruments; ++index) { Instrument *pCurInst = instList->get(index); int channel = pCurInst->get_midi_out_channel(); if (channel < 0) { continue; } int key = pCurInst->get_midi_out_note(); PmEvent event; event.timestamp = 0; //Note off event.message = Pm_Message(0x80 | channel, key, 0); Pm_Write(m_pMidiOut, &event, 1); } } }; #endif // H2CORE_HAVE_PORTMIDI hydrogen-1.0.0-rc1/src/core/src/IO/pulse_audio_driver.cpp000066400000000000000000000152111366722712400232310ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_PULSEAUDIO) || _DOXYGEN_ #include #include namespace H2Core { PulseAudioDriver::PulseAudioDriver(audioProcessCallback processCallback) : AudioOutput("PulseAudioDriver"), m_callback(processCallback), m_main_loop(nullptr), m_ctx(nullptr), m_stream(nullptr), m_connected(false), m_outL(nullptr), m_outR(nullptr) { pthread_mutex_init(&m_mutex, nullptr); pthread_cond_init(&m_cond, nullptr); } PulseAudioDriver::~PulseAudioDriver() { pthread_cond_destroy(&m_cond); pthread_mutex_destroy(&m_mutex); delete []m_outL; delete []m_outR; } int PulseAudioDriver::init( unsigned nBufferSize ) { delete []m_outL; delete []m_outR; m_buffer_size = nBufferSize; m_sample_rate = Preferences::get_instance()->m_nSampleRate; m_outL = new float[m_buffer_size]; m_outR = new float[m_buffer_size]; return 0; } int PulseAudioDriver::connect() { if (m_connected) { return 1; } if (pipe(m_pipe)) { return 1; } fcntl(m_pipe[0], F_SETFL, fcntl(m_pipe[0], F_GETFL) | O_NONBLOCK); m_ready = 0; if (pthread_create(&m_thread, nullptr, s_thread_body, this)) { close(m_pipe[0]); close(m_pipe[1]); return 1; } pthread_mutex_lock(&m_mutex); while (!m_ready) { pthread_cond_wait(&m_cond, &m_mutex); } pthread_mutex_unlock(&m_mutex); if (m_ready < 0) { pthread_join(m_thread, nullptr); close(m_pipe[0]); close(m_pipe[1]); return 1; } m_connected = true; return 0; } void PulseAudioDriver::disconnect() { if (m_connected) { int junk = 0; while (write(m_pipe[1], &junk, 1) != 1) { ; } pthread_join(m_thread, nullptr); close(m_pipe[0]); close(m_pipe[1]); } } unsigned PulseAudioDriver::getBufferSize() { return m_buffer_size; } unsigned PulseAudioDriver::getSampleRate() { return m_sample_rate; } float* PulseAudioDriver::getOut_L() { return m_outL; } float* PulseAudioDriver::getOut_R() { return m_outR; } void PulseAudioDriver::updateTransportInfo() { } void PulseAudioDriver::play() { m_transport.m_status = TransportInfo::ROLLING; } void PulseAudioDriver::stop() { m_transport.m_status = TransportInfo::STOPPED; } void PulseAudioDriver::locate( unsigned long nFrame ) { m_transport.m_nFrames = nFrame; } void PulseAudioDriver::setBpm( float fBPM ) { m_transport.m_fBPM = fBPM; } void* PulseAudioDriver::s_thread_body(void* arg) { PulseAudioDriver* self = (PulseAudioDriver*)arg; int r = self->thread_body(); if (r) { pthread_mutex_lock(&self->m_mutex); self->m_ready = -r; pthread_cond_signal(&self->m_cond); pthread_mutex_unlock(&self->m_mutex); } return nullptr; } int PulseAudioDriver::thread_body() { m_main_loop = pa_mainloop_new(); pa_mainloop_api* api = pa_mainloop_get_api(m_main_loop); pa_io_event* ioev = api->io_new(api, m_pipe[0], PA_IO_EVENT_INPUT, pipe_callback, this); m_ctx = pa_context_new(api, "Hydrogen"); pa_context_set_state_callback(m_ctx, ctx_state_callback, this); pa_context_connect(m_ctx, nullptr, pa_context_flags_t(0), nullptr); int retval; pa_mainloop_run(m_main_loop, &retval); if (m_stream) { pa_stream_set_state_callback(m_stream, nullptr, nullptr); pa_stream_set_write_callback(m_stream, nullptr, nullptr); pa_stream_unref(m_stream); m_stream = nullptr; } api->io_free(ioev); pa_context_unref(m_ctx); pa_mainloop_free(m_main_loop); return retval; } void PulseAudioDriver::ctx_state_callback(pa_context* ctx, void* udata) { PulseAudioDriver* self = (PulseAudioDriver*)udata; pa_context_state s = pa_context_get_state(ctx); if (s == PA_CONTEXT_READY) { pa_sample_spec spec; spec.format = PA_SAMPLE_S16LE; spec.rate = self->m_sample_rate; spec.channels = 2; self->m_stream = pa_stream_new(ctx, "Hydrogen", &spec, nullptr); pa_stream_set_state_callback(self->m_stream, stream_state_callback, self); pa_stream_set_write_callback(self->m_stream, stream_write_callback, self); pa_buffer_attr bufattr; bufattr.fragsize = (uint32_t)-1; bufattr.maxlength = self->m_buffer_size * 4; bufattr.minreq = 0; bufattr.prebuf = (uint32_t)-1; bufattr.tlength = self->m_buffer_size * 4; pa_stream_connect_playback(self->m_stream, nullptr, &bufattr, pa_stream_flags_t(0), nullptr, nullptr); } else if (s == PA_CONTEXT_FAILED) { pa_mainloop_quit(self->m_main_loop, 1); } } void PulseAudioDriver::stream_state_callback(pa_stream* stream, void* udata) { PulseAudioDriver* self = (PulseAudioDriver*)udata; pa_stream_state s = pa_stream_get_state(stream); if ( s == PA_STREAM_FAILED ) { pa_mainloop_quit(self->m_main_loop, 1); } else if ( s == PA_STREAM_READY ) { pthread_mutex_lock(&self->m_mutex); self->m_ready = 1; pthread_cond_signal(&self->m_cond); pthread_mutex_unlock(&self->m_mutex); } } #define FLOAT_TO_SHORT(x) short(round((std::min(std::max((x), -1.0f), 1.0f)) * 32767.0f)) void PulseAudioDriver::stream_write_callback(pa_stream* stream, size_t bytes, void* udata) { PulseAudioDriver* self = (PulseAudioDriver*)udata; void* vdata; pa_stream_begin_write(stream, &vdata, &bytes); if (!vdata) return; short* out = (short*)vdata; unsigned num_samples = bytes / 4; while (num_samples) { int n = std::min(self->m_buffer_size, num_samples); self->m_callback(n, nullptr); for (int i = 0; i < n; ++i) { *out++ = FLOAT_TO_SHORT(self->m_outL[i]); *out++ = FLOAT_TO_SHORT(self->m_outR[i]); } num_samples -= n; } pa_stream_write(stream, vdata, (bytes / 4) * 4, nullptr, 0, PA_SEEK_RELATIVE); } void PulseAudioDriver::pipe_callback(pa_mainloop_api*, pa_io_event*, int fd, pa_io_event_flags_t events, void *udata) { if (!(events & PA_IO_EVENT_INPUT)) { return; } char buf[16]; int bytes = read(fd, buf, 16); if ( bytes > 0 ) { PulseAudioDriver* self = (PulseAudioDriver*)udata; pa_mainloop_quit(self->m_main_loop, 0); } } } //namespace H2Core #endif //H2CORE_HAVE_PULSEAUDIO hydrogen-1.0.0-rc1/src/core/src/IO/transport_info.cpp000066400000000000000000000030771366722712400224230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* TransportInfo::__class_name = "TransportInfo"; TransportInfo::TransportInfo() : Object( __class_name ) { // INFOLOG( "INIT" ); m_status = STOPPED; m_nFrames = 0; m_fTickSize = 0; m_fBPM = 120; } TransportInfo::~TransportInfo() { // INFOLOG( "DESTROY" ); } void TransportInfo::printInfo() { switch ( m_status ) { case STOPPED: INFOLOG( "status = STOPPED" ); break; case ROLLING: INFOLOG( "status = ROLLING" ); break; case BAD: INFOLOG( "status = BAD" ); break; default: ERRORLOG( "status = unknown" ); } INFOLOG( QString( "frames = %1" ).arg( m_nFrames ) ); INFOLOG( QString( "tickSize = %1" ).arg( m_fTickSize ) ); } }; hydrogen-1.0.0-rc1/src/core/src/audio_engine.cpp000066400000000000000000000054031366722712400214660ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 // TODO: remove this line as soon as possible #include namespace H2Core { AudioEngine* AudioEngine::__instance = nullptr; const char* AudioEngine::__class_name = "AudioEngine"; void AudioEngine::create_instance() { if( __instance == nullptr ) { __instance = new AudioEngine; } } AudioEngine::AudioEngine() : Object( __class_name ) , __sampler( nullptr ) , __synth( nullptr ) { __instance = this; INFOLOG( "INIT" ); pthread_mutex_init( &__engine_mutex, nullptr ); __sampler = new Sampler; __synth = new Synth; #ifdef H2CORE_HAVE_LADSPA Effects::create_instance(); #endif } AudioEngine::~AudioEngine() { INFOLOG( "DESTROY" ); #ifdef H2CORE_HAVE_LADSPA delete Effects::get_instance(); #endif // delete Sequencer::get_instance(); delete __sampler; delete __synth; } Sampler* AudioEngine::get_sampler() { assert(__sampler); return __sampler; } Synth* AudioEngine::get_synth() { assert(__synth); return __synth; } void AudioEngine::lock( const char* file, unsigned int line, const char* function ) { pthread_mutex_lock( &__engine_mutex ); __locker.file = file; __locker.line = line; __locker.function = function; } bool AudioEngine::try_lock( const char* file, unsigned int line, const char* function ) { int res = pthread_mutex_trylock( &__engine_mutex ); if ( res != 0 ) { // Lock not obtained return false; } __locker.file = file; __locker.line = line; __locker.function = function; return true; } float AudioEngine::compute_tick_size(int sampleRate, int bpm, int resolution) { float tickSize = sampleRate * 60.0 / bpm / resolution; return tickSize; } void AudioEngine::unlock() { // Leave "__locker" dirty. pthread_mutex_unlock( &__engine_mutex ); } }; // namespace H2Core hydrogen-1.0.0-rc1/src/core/src/automation_path_serializer.cpp000066400000000000000000000034311366722712400244640ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* AutomationPathSerializer::__class_name = "AutomationPathSerializer"; AutomationPathSerializer::AutomationPathSerializer() : Object(__class_name) { } void AutomationPathSerializer::read_automation_path(const QDomNode &node, AutomationPath &path) { auto point = node.firstChildElement(); while (! point.isNull()) { if (point.tagName() == "point") { bool hasX = false; bool hasY = false; float x = point.attribute("x").toFloat(&hasX); float y = point.attribute("y").toFloat(&hasY); if (hasX && hasY) { path.add_point(x, y); } } point = point.nextSiblingElement(); } } void AutomationPathSerializer::write_automation_path(QDomNode &node, const AutomationPath &path) { for (auto point : path) { auto element = node.ownerDocument().createElement("point"); element.setAttribute("x", point.first); element.setAttribute("y", point.second); node.appendChild(element); } } } hydrogen-1.0.0-rc1/src/core/src/basics/000077500000000000000000000000001366722712400175765ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/basics/adsr.cpp000066400000000000000000000070541366722712400212410ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "exponential_tables.h" namespace H2Core { const char* ADSR::__class_name = "ADSR"; inline static float linear_interpolation( float fVal_A, float fVal_B, double fVal ) { return fVal_A * ( 1 - fVal ) + fVal_B * fVal; //return fVal_A + fVal * ( fVal_B - fVal_A ); //return fVal_A + ((fVal_B - fVal_A) * fVal); } void ADSR::normalise() { if (__attack < 0.0) { __attack = 0.0; } if (__decay < 0.0) { __decay = 0.0; } if (__sustain < 0.0) { __sustain = 0.0; } if (__release < 256) { __release = 256; } if (__attack > 100000) { __attack = 100000; } if (__decay > 100000) { __decay = 100000; } if (__sustain > 1.0) { __sustain = 1.0; } if (__release > 100256) { __release = 100256; } } ADSR::ADSR( unsigned int attack, unsigned int decay, float sustain, unsigned int release ) : Object( __class_name ), __attack( attack ), __decay( decay ), __sustain( sustain ), __release( release ), __state( ATTACK ), __ticks( 0.0 ), __value( 0.0 ), __release_value( 0.0 ) { normalise(); } ADSR::ADSR( const ADSR* other ) : Object( __class_name ), __attack( other->__attack ), __decay( other->__decay ), __sustain( other->__sustain ), __release( other->__release ), __state( other->__state ), __ticks( other->__ticks ), __value( other->__value ), __release_value( other->__release_value ) { normalise(); } ADSR::~ADSR() { } //#define convex_exponant //#define concave_exponant float ADSR::get_value( float step ) { switch ( __state ) { case ATTACK: if ( __attack == 0 ) { __value = 1.0; } else { __value = convex_exponant( linear_interpolation( 0.0, 1.0, ( __ticks * 1.0 / __attack ) ) ); } __ticks += step; if ( __ticks > __attack ) { __state = DECAY; __ticks = 0; } break; case DECAY: if ( __decay == 0 ) { __value = __sustain; } else { __value = concave_exponant( linear_interpolation( 1.0, 0.0, ( __ticks * 1.0 / __decay ) ) ) * (1 - __sustain) + __sustain; } __ticks += step; if ( __ticks > __decay ) { __state = SUSTAIN; __ticks = 0; } break; case SUSTAIN: __value = __sustain; break; case RELEASE: if ( __release < 256 ) { __release = 256; } __value = concave_exponant( linear_interpolation( 1.0, 0.0, ( __ticks * 1.0 / __release ) ) ) * __release_value; __ticks += step; if ( __ticks > __release ) { __state = IDLE; __ticks = 0; } break; case IDLE: default: __value = 0; }; return __value; } void ADSR::attack() { __state = ATTACK; __ticks = 0; } float ADSR::release() { if ( __state == IDLE ) return 0; if ( __state == RELEASE ) return __value; __release_value = __value; __state = RELEASE; __ticks = 0; return __release_value; } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/automation_path.cpp000066400000000000000000000072061366722712400235030ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* AutomationPath::__class_name = "AutomationPath"; AutomationPath::AutomationPath(float min, float max, float def) : Object(__class_name), _min(min), _max(max), _def(def) { } /** * \brief Get value at given location * \param x Location * * If location is between points, value is computed **/ float AutomationPath::get_value(float x) const noexcept { if (_points.empty()) { return _def; } auto f = _points.begin(); if(x <= f->first) { return f->second; } auto l = _points.rbegin(); if(x >= l->first) { return l->second; } auto i = _points.lower_bound(x); auto p1 = *i; auto p0 = *(--i); float x1 = p0.first; float y1 = p0.second; float x2 = p1.first; float y2 = p1.second; float d = (x-x1)/(x2 - x1); return y1 + (y2-y1)*d; } /** * \brief Add a point to path * \param x X coordinate * \param y Y coordinate **/ void AutomationPath::add_point(float x, float y) { _points[x] = y; } /** * \brief Compare two paths * * Two paths are considered equal, if they have the same settings * (min, max, default) and points in the same places. */ bool operator==(const AutomationPath &lhs, const AutomationPath &rhs) { return lhs._min == rhs._min && lhs._max == rhs._max && lhs._def == rhs._def && lhs._points == rhs._points; } bool operator!=(const AutomationPath &lhs, const AutomationPath &rhs) { return !(lhs==rhs); } std::ostream &operator<< (std::ostream &o, const AutomationPath &p) { o << "first << "," << i->second << "),"; } o << "]>"; return o; } /** * \brief Find point near specific location * * If point is faound, iterator pointing to it is returned. * Otherwise, AutomationPath::end() is returned. **/ AutomationPath::iterator AutomationPath::find(float x) { const float limit = 0.5f; if (_points.empty()) { return _points.end(); } auto i = _points.lower_bound(x); if (i != _points.end()) { if( i->first - x <= limit) { return i; } } /* If there is a point before, check whether * it is a close match */ if (i != _points.begin()) { --i; if( x - i->first <= limit) { return i; } } return _points.end(); } /** * \brief Move point to other location * \param in Iterator pointing to point to be moved * \param x Destination X coordinate * \param y Destination Y coordinate **/ AutomationPath::iterator AutomationPath::move(iterator &in, float x, float y) { _points.erase(in); auto rv = _points.insert(std::make_pair(x,y)); return rv.first; } /** * \brief Remove point from path * \param x Point location **/ void AutomationPath::remove_point(float x) { auto it = find(x); if (it != _points.end()) { _points.erase(it); } } } //namespace H2Core hydrogen-1.0.0-rc1/src/core/src/basics/drumkit.cpp000066400000000000000000000436511366722712400217720ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #ifdef H2CORE_HAVE_LIBARCHIVE #include #include #else #ifndef WIN32 #include #include #include #include #endif #endif #include #include #include #include #include #include #include #include #include namespace H2Core { const char* Drumkit::__class_name = "Drumkit"; Drumkit::Drumkit() : Object( __class_name ), __samples_loaded( false ), __instruments( nullptr ), __components( nullptr ) { __components = new std::vector (); } Drumkit::Drumkit( Drumkit* other ) : Object( __class_name ), __path( other->get_path() ), __name( other->get_name() ), __author( other->get_author() ), __info( other->get_info() ), __license( other->get_license() ), __image( other->get_image() ), __imageLicense( other->get_image_license() ), __samples_loaded( other->samples_loaded() ), __components( nullptr ) { __instruments = new InstrumentList( other->get_instruments() ); __components = new std::vector (); for (auto it = other->get_components()->begin(); it != other->get_components()->end(); ++it) { __components->push_back(new DrumkitComponent(*it)); } } Drumkit::~Drumkit() { for (std::vector::iterator it = __components->begin() ; it != __components->end(); ++it) { delete *it; } delete __components; if( __instruments ) { delete __instruments; } } Drumkit* Drumkit::load_by_name ( const QString& dk_name, const bool load_samples ) { QString dir = Filesystem::drumkit_path_search( dk_name ); if ( dir.isEmpty() ) { return nullptr; } return load( dir, load_samples ); } Drumkit* Drumkit::load( const QString& dk_dir, const bool load_samples ) { INFOLOG( QString( "Load drumkit %1" ).arg( dk_dir ) ); if( !Filesystem::drumkit_valid( dk_dir ) ) { ERRORLOG( QString( "%1 is not valid drumkit" ).arg( dk_dir ) ); return nullptr; } return load_file( Filesystem::drumkit_file( dk_dir ), load_samples ); } Drumkit* Drumkit::load_file( const QString& dk_path, const bool load_samples ) { XMLDoc doc; if( !doc.read( dk_path, Filesystem::drumkit_xsd_path() ) ) { //Something went wrong. Lets see how old this drumkit is.. //Do we have any components? doc.read( dk_path ); auto nodeList = doc.elementsByTagName( "instrumentComponent" ); if( nodeList.size() == 0 ) { //No components. That drumkit seems to be quite old. Use legacy code.. Drumkit* pDrumkit = Legacy::load_drumkit( dk_path ); upgrade_drumkit(pDrumkit, dk_path); return pDrumkit; } else { //If the drumkit does not comply witht the current xsd, but has components, it may suffer from // problems with invalid values (for example float ADSR values, see #658). Lets try to load it // with our current drumkit. XMLNode root = doc.firstChildElement( "drumkit_info" ); if ( root.isNull() ) { ERRORLOG( "drumkit_info node not found" ); return nullptr; } Drumkit* pDrumkit = Drumkit::load_from( &root, dk_path.left( dk_path.lastIndexOf( "/" ) ) ); upgrade_drumkit(pDrumkit, dk_path); if( load_samples ){ pDrumkit->load_samples(); } } } XMLNode root = doc.firstChildElement( "drumkit_info" ); if ( root.isNull() ) { ERRORLOG( "drumkit_info node not found" ); return nullptr; } Drumkit* pDrumkit = Drumkit::load_from( &root, dk_path.left( dk_path.lastIndexOf( "/" ) ) ); if( load_samples ){ pDrumkit->load_samples(); } return pDrumkit; } Drumkit* Drumkit::load_from( XMLNode* node, const QString& dk_path ) { QString drumkit_name = node->read_string( "name", "", false, false ); if ( drumkit_name.isEmpty() ) { ERRORLOG( "Drumkit has no name, abort" ); return nullptr; } Drumkit* pDrumkit = new Drumkit(); pDrumkit->__path = dk_path; pDrumkit->__name = drumkit_name; pDrumkit->__author = node->read_string( "author", "undefined author" ); pDrumkit->__info = node->read_string( "info", "No information available." ); pDrumkit->__license = node->read_string( "license", "undefined license" ); pDrumkit->__image = node->read_string( "image", "" ); pDrumkit->__imageLicense = node->read_string( "imageLicense", "undefined license" ); XMLNode componentListNode = node->firstChildElement( "componentList" ); if ( ! componentListNode.isNull() ) { XMLNode componentNode = componentListNode.firstChildElement( "drumkitComponent" ); while ( ! componentNode.isNull() ) { int id = componentNode.read_int( "id", -1 ); // instrument id QString sName = componentNode.read_string( "name", "" ); // name float fVolume = componentNode.read_float( "volume", 1.0 ); // volume DrumkitComponent* pDrumkitComponent = new DrumkitComponent( id, sName ); pDrumkitComponent->set_volume( fVolume ); pDrumkit->get_components()->push_back(pDrumkitComponent); componentNode = componentNode.nextSiblingElement( "drumkitComponent" ); } } else { WARNINGLOG( "componentList node not found" ); DrumkitComponent* pDrumkitComponent = new DrumkitComponent( 0, "Main" ); pDrumkit->get_components()->push_back(pDrumkitComponent); } XMLNode instruments_node = node->firstChildElement( "instrumentList" ); if ( instruments_node.isNull() ) { WARNINGLOG( "instrumentList node not found" ); pDrumkit->set_instruments( new InstrumentList() ); } else { pDrumkit->set_instruments( InstrumentList::load_from( &instruments_node, dk_path, drumkit_name ) ); } return pDrumkit; } void Drumkit::load_samples() { INFOLOG( QString( "Loading drumkit %1 instrument samples" ).arg( __name ) ); if( !__samples_loaded ) { __instruments->load_samples(); __samples_loaded = true; } } void Drumkit::upgrade_drumkit(Drumkit* pDrumkit, const QString& dk_path) { if(pDrumkit != nullptr) { WARNINGLOG( QString( "ugrade drumkit %1" ).arg( dk_path ) ); Filesystem::file_copy( dk_path, dk_path + ".bak", false /* do not overwrite existing files */ ); pDrumkit->save_file( dk_path, true, -1 ); } } void Drumkit::unload_samples() { INFOLOG( QString( "Unloading drumkit %1 instrument samples" ).arg( __name ) ); if( __samples_loaded ) { __instruments->unload_samples(); __samples_loaded = false; } } bool Drumkit::save( const QString& name, const QString& author, const QString& info, const QString& license, const QString& image, const QString& imageLicense, InstrumentList* pInstruments, std::vector* pComponents, bool overwrite ) { Drumkit* pDrumkit = new Drumkit(); pDrumkit->set_name( name ); pDrumkit->set_author( author ); pDrumkit->set_info( info ); pDrumkit->set_license( license ); // Before storing the absolute path to the image of the drumkit it // has to be checked whether an actual path was supplied. If not, // the construction of QFileInfo will fail. if ( !image.isEmpty() ) { QFileInfo fi( image ); pDrumkit->set_path( fi.absolutePath() ); pDrumkit->set_image( fi.fileName() ); } pDrumkit->set_image_license( imageLicense ); pDrumkit->set_instruments( new InstrumentList( pInstruments ) ); // FIXME: why must we do that ? there is something weird with updateInstrumentLines std::vector* pCopiedVector = new std::vector (); for (std::vector::iterator it = pComponents->begin() ; it != pComponents->end(); ++it) { DrumkitComponent* pSrcComponent = *it; pCopiedVector->push_back( new DrumkitComponent( pSrcComponent ) ); } pDrumkit->set_components( pCopiedVector ); bool ret = pDrumkit->save( overwrite ); delete pDrumkit; return ret; } bool Drumkit::user_drumkit_exists( const QString& name) { return Filesystem::file_exists( Filesystem::drumkit_file( Filesystem::usr_drumkits_dir() + name ), true /*silent*/ ); } bool Drumkit::save( bool overwrite ) { return save( QString( Filesystem::usr_drumkits_dir() + __name ), overwrite ); } bool Drumkit::save( const QString& dk_dir, bool overwrite ) { INFOLOG( QString( "Saving drumkit %1 into %2" ).arg( __name ).arg( dk_dir ) ); if( !Filesystem::mkdir( dk_dir ) ) { return false; } bool ret = save_samples( dk_dir, overwrite ); if ( ret ) { ret = save_file( Filesystem::drumkit_file( dk_dir ), overwrite ); } return ret; } bool Drumkit::save_file( const QString& dk_path, bool overwrite, int component_id ) { INFOLOG( QString( "Saving drumkit definition into %1" ).arg( dk_path ) ); if( !overwrite && Filesystem::file_exists( dk_path, true ) ) { ERRORLOG( QString( "drumkit %1 already exists" ).arg( dk_path ) ); return false; } XMLDoc doc; XMLNode root = doc.set_root( "drumkit_info", "drumkit" ); save_to( &root, component_id ); return doc.write( dk_path ); } void Drumkit::save_to( XMLNode* node, int component_id ) { node->write_string( "name", __name ); node->write_string( "author", __author ); node->write_string( "info", __info ); node->write_string( "license", __license ); node->write_string( "image", __image ); node->write_string( "imageLicense", __imageLicense ); if( component_id == -1 ) { XMLNode components_node = node->createNode( "componentList" ); for (std::vector::iterator it = __components->begin() ; it != __components->end(); ++it) { DrumkitComponent* pComponent = *it; pComponent->save_to( &components_node ); } } __instruments->save_to( node, component_id ); } bool Drumkit::save_samples( const QString& dk_dir, bool overwrite ) { INFOLOG( QString( "Saving drumkit %1 samples into %2" ).arg( __name ).arg( dk_dir ) ); if( !Filesystem::mkdir( dk_dir ) ) { return false; } InstrumentList* pInstrList = get_instruments(); for( int i = 0; i < pInstrList->size(); i++ ) { Instrument* pInstrument = ( *pInstrList )[i]; for (std::vector::iterator it = pInstrument->get_components()->begin() ; it != pInstrument->get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; for ( int n = 0; n < InstrumentComponent::getMaxLayers(); n++ ) { InstrumentLayer* pLayer = pComponent->get_layer( n ); if( pLayer ) { QString src = pLayer->get_sample()->get_filepath(); QString dst = dk_dir + "/" + pLayer->get_sample()->get_filename(); if( src != dst ) { QString original_dst = dst; // If the destination path does not have an extension and there is a dot in the path, hell will break loose. QFileInfo maybe? int insertPosition = original_dst.length(); if( original_dst.lastIndexOf(".") > 0 ) { insertPosition = original_dst.lastIndexOf("."); } if(overwrite == false) { // If the destination path already exists, try to use basename_1, basename_2, etc. instead of basename. int tries = 0; while( Filesystem::file_exists( dst, true )) { tries++; dst = original_dst; dst.insert( insertPosition, QString("_%1").arg(tries) ); } } pLayer->get_sample()->set_filename( dst ); if( !Filesystem::file_copy( src, dst ) ) { return false; } } } } } } if ( !save_image( dk_dir, overwrite ) ) { return false; } return true; } bool Drumkit::save_image( const QString& dk_dir, bool overwrite ) { if ( __image.length() > 0 ) { QString src = __path + "/" + __image; QString dst = dk_dir + "/" + __image; if ( Filesystem::file_exists ( src ) ) { if( !Filesystem::file_copy( src, dst ) ) { ERRORLOG( QString( "Error copying %1 to %2").arg( src ).arg( dst ) ); return false; } } } return true; } void Drumkit::set_instruments( InstrumentList* instruments ) { if( __instruments != nullptr ) { delete __instruments; } __instruments = instruments; } void Drumkit::set_components( std::vector* components ) { for (std::vector::iterator it = __components->begin() ; it != __components->end(); ++it) { delete *it; } delete __components; __components = components; } bool Drumkit::remove( const QString& dk_name ) { QString dk_dir = Filesystem::drumkit_path_search( dk_name ); if( !Filesystem::drumkit_valid( dk_dir ) ) { ERRORLOG( QString( "%1 is not valid drumkit" ).arg( dk_dir ) ); return false; } _INFOLOG( QString( "Removing drumkit: %1" ).arg( dk_dir ) ); if( !Filesystem::rm( dk_dir, true ) ) { _ERRORLOG( QString( "Unable to remove drumkit: %1" ).arg( dk_dir ) ); return false; } return true; } void Drumkit::dump() { DEBUGLOG( "Drumkit dump" ); DEBUGLOG( " |- Path = " + __path ); DEBUGLOG( " |- Name = " + __name ); DEBUGLOG( " |- Author = " + __author ); DEBUGLOG( " |- Info = " + __info ); DEBUGLOG( " |- Image = " + __image ); DEBUGLOG( " |- Image = " + __imageLicense ); DEBUGLOG( " |- Instrument list" ); for ( int i=0; i<__instruments->size(); i++ ) { Instrument* instrument = ( *__instruments )[i]; DEBUGLOG( QString( " |- (%1 of %2) Name = %3" ) .arg( i ) .arg( __instruments->size()-1 ) .arg( instrument->get_name() ) ); for (std::vector::iterator it = instrument->get_components()->begin() ; it != instrument->get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; for ( int j = 0; j < InstrumentComponent::getMaxLayers(); j++ ) { InstrumentLayer* pLayer = pComponent->get_layer( j ); if ( pLayer ) { Sample* pSample = pLayer->get_sample(); if ( pSample ) { DEBUGLOG( QString( " |- %1 [%2]" ).arg( pSample->get_filepath() ).arg( pSample->is_empty() ) ); } else { DEBUGLOG( " |- NULL sample" ); } } } } } } bool Drumkit::install( const QString& path ) { _INFOLOG( QString( "Install drumkit %1" ).arg( path ) ); #ifdef H2CORE_HAVE_LIBARCHIVE int r; struct archive* arch; struct archive_entry* entry; arch = archive_read_new(); #if ARCHIVE_VERSION_NUMBER < 3000000 archive_read_support_compression_all( arch ); #else archive_read_support_filter_all( arch ); #endif archive_read_support_format_all( arch ); #if ARCHIVE_VERSION_NUMBER < 3000000 if ( ( r = archive_read_open_file( arch, path.toLocal8Bit(), 10240 ) ) ) { #else if ( ( r = archive_read_open_filename( arch, path.toLocal8Bit(), 10240 ) ) ) { #endif _ERRORLOG( QString( "archive_read_open_file() [%1] %2" ).arg( archive_errno( arch ) ).arg( archive_error_string( arch ) ) ); archive_read_close( arch ); #if ARCHIVE_VERSION_NUMBER < 3000000 archive_read_finish( arch ); #else archive_read_free( arch ); #endif return false; } bool ret = true; QString dk_dir = Filesystem::usr_drumkits_dir() + "/"; while ( ( r = archive_read_next_header( arch, &entry ) ) != ARCHIVE_EOF ) { if ( r != ARCHIVE_OK ) { _ERRORLOG( QString( "archive_read_next_header() [%1] %2" ).arg( archive_errno( arch ) ).arg( archive_error_string( arch ) ) ); ret = false; break; } QString np = dk_dir + archive_entry_pathname( entry ); QByteArray newpath = np.toLocal8Bit(); archive_entry_set_pathname( entry, newpath.data() ); r = archive_read_extract( arch, entry, 0 ); if ( r == ARCHIVE_WARN ) { _WARNINGLOG( QString( "archive_read_extract() [%1] %2" ).arg( archive_errno( arch ) ).arg( archive_error_string( arch ) ) ); } else if ( r != ARCHIVE_OK ) { _ERRORLOG( QString( "archive_read_extract() [%1] %2" ).arg( archive_errno( arch ) ).arg( archive_error_string( arch ) ) ); ret = false; break; } } archive_read_close( arch ); #if ARCHIVE_VERSION_NUMBER < 3000000 archive_read_finish( arch ); #else archive_read_free( arch ); #endif return ret; #else // H2CORE_HAVE_LIBARCHIVE #ifndef WIN32 // GUNZIP QString gzd_name = path.left( path.indexOf( "." ) ) + ".tar"; FILE* gzd_file = fopen( gzd_name.toLocal8Bit(), "wb" ); gzFile gzip_file = gzopen( path.toLocal8Bit(), "rb" ); if ( !gzip_file ) { _ERRORLOG( QString( "Error reading drumkit file: %1" ).arg( path ) ); gzclose( gzip_file ); fclose( gzd_file ); return false; } uchar buf[4096]; while ( gzread( gzip_file, buf, 4096 ) > 0 ) { fwrite( buf, sizeof( uchar ), 4096, gzd_file ); } gzclose( gzip_file ); fclose( gzd_file ); // UNTAR TAR* tar_file; QByteArray tar_path = gzd_name.toLocal8Bit(); if ( tar_open( &tar_file, tar_path.data(), NULL, O_RDONLY, 0, TAR_GNU ) == -1 ) { _ERRORLOG( QString( "tar_open(): %1" ).arg( QString::fromLocal8Bit( strerror( errno ) ) ) ); return false; } bool ret = true; char dst_dir[1024]; QString dk_dir = Filesystem::usr_drumkits_dir() + "/"; strncpy( dst_dir, dk_dir.toLocal8Bit(), 1024 ); if ( tar_extract_all( tar_file, dst_dir ) != 0 ) { _ERRORLOG( QString( "tar_extract_all(): %1" ).arg( QString::fromLocal8Bit( strerror( errno ) ) ) ); ret = false; } if ( tar_close( tar_file ) != 0 ) { _ERRORLOG( QString( "tar_close(): %1" ).arg( QString::fromLocal8Bit( strerror( errno ) ) ) ); ret = false; } return ret; #else // WIN32 _ERRORLOG( "WIN32 NOT IMPLEMENTED" ); return false; #endif #endif } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/drumkit_component.cpp000066400000000000000000000071621366722712400240510ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include namespace H2Core { const char* DrumkitComponent::__class_name = "DrumkitComponent"; DrumkitComponent::DrumkitComponent( const int id, const QString& name ) : Object( __class_name ) , __id( id ) , __name( name ) , __volume( 1.0 ) , __muted( false ) , __soloed( false ) , __out_L( nullptr ) , __out_R( nullptr ) , __peak_l( 0.0 ) , __peak_r( 0.0 ) { __out_L = new float[ MAX_BUFFER_SIZE ]; __out_R = new float[ MAX_BUFFER_SIZE ]; } DrumkitComponent::DrumkitComponent( DrumkitComponent* other ) : Object( __class_name ) , __id( other->get_id() ) , __name( other->get_name() ) , __volume( other->__volume ) , __muted( other->__muted ) , __soloed( other->__soloed ) , __out_L( nullptr ) , __out_R( nullptr ) , __peak_l( 0.0 ) , __peak_r( 0.0 ) { __out_L = new float[ MAX_BUFFER_SIZE ]; __out_R = new float[ MAX_BUFFER_SIZE ]; } DrumkitComponent::~DrumkitComponent() { delete[] __out_L; delete[] __out_R; } void DrumkitComponent::reset_outs( uint32_t nFrames ) { memset( __out_L, 0, nFrames * sizeof( float ) ); memset( __out_R, 0, nFrames * sizeof( float ) ); } void DrumkitComponent::set_outs( int nBufferPos, float valL, float valR ) { __out_L[nBufferPos] += valL; __out_R[nBufferPos] += valR; } float DrumkitComponent::get_out_L( int nBufferPos ) { return __out_L[nBufferPos]; } float DrumkitComponent::get_out_R( int nBufferPos ) { return __out_R[nBufferPos]; } void DrumkitComponent::load_from( DrumkitComponent* component, bool is_live ) { if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } this->set_id( component->get_id() ); this->set_name( component->get_name() ); this->set_muted( component->is_muted() ); this->set_volume( component->get_volume() ); if ( is_live ) { AudioEngine::get_instance()->unlock(); } } DrumkitComponent* DrumkitComponent::load_from( XMLNode* node, const QString& dk_path ) { int id = node->read_int( "id", EMPTY_INSTR_ID, false, false ); if ( id==EMPTY_INSTR_ID ) { return nullptr; } DrumkitComponent* pDrumkitComponent = new DrumkitComponent( id, node->read_string( "name", "" ) ); pDrumkitComponent->set_volume( node->read_float( "volume", 1.0f, true, false ) ); return pDrumkitComponent; } void DrumkitComponent::save_to( XMLNode* node ) { XMLNode ComponentNode = node->createNode( "drumkitComponent" ); ComponentNode.write_int( "id", __id ); ComponentNode.write_string( "name", __name ); ComponentNode.write_float( "volume", __volume ); } }; hydrogen-1.0.0-rc1/src/core/src/basics/exponential_tables.h000066400000000000000000004513741366722712400236450ustar00rootroot00000000000000 #ifndef H2C_EXPONENTIAL_TABLES_H #define H2C_EXPONENTIAL_TABLES_H static inline float compute_exponant( const float input, const float* table, const int table_size ) { int idx = ( int )( input * table_size ); if ( idx < 0 ) { idx = 0; } else if ( idx >= table_size ) { idx = table_size-1; } return ( table[idx] * input ) / ( ( float )(idx+1) / ( float )table_size ); }; static int concave_exponant_table_size = 4096; static float concave_exponant_table[4096] = { 1.5156104658808E-10, 9.9740596827554E-10, 3.0028776133939E-09, 6.5638149639822E-09, 1.2038851488192E-08, 1.9761595218725E-08, 3.0047077767325E-08, 4.3195717944104E-08, 5.9495986363365E-08, 7.9226309106588E-08, 1.02656489298E-07, 1.3004880513507E-07, 1.6165888092569E-07, 1.9773639315002E-07, 2.3852565311928E-07, 2.8426609509032E-07, 3.3519269046365E-07, 3.9153630318046E-07, 4.5352399763331E-07, 5.213793077196E-07, 5.9532247372657E-07, 6.7557065230827E-07, 7.6233810374495E-07, 8.5583635986203E-07, 9.5627437535876E-07, 1.0638586648075E-06, 1.1787934271983E-06, 1.3012806595954E-06, 1.4315202612247E-06, 1.5697101291111E-06, 1.7160462462169E-06, 1.8707227629012E-06, 2.0339320724036E-06, 2.2058648809638E-06, 2.3867102731093E-06, 2.5766557725752E-06, 2.7758873992656E-06, 2.9845897226155E-06, 3.2029459116722E-06, 3.4311377821785E-06, 3.6693458409091E-06, 3.9177493274853E-06, 4.1765262538692E-06, 4.4458534417183E-06, 4.7259065577629E-06, 5.0168601473543E-06, 5.3188876663161E-06, 5.6321615112198E-06, 5.956853048194E-06, 6.2931326403679E-06, 6.64116967404E-06, 7.0011325836549E-06, 7.3731888756662E-06, 7.7575051513535E-06, 8.154247128661E-06, 8.5635796631137E-06, 8.9856667678688E-06, 9.420671632952E-06, 9.8687566437245E-06, 1.0330083398626E-05, 1.0804812726233E-05, 1.1293104701668E-05, 1.1795118662398E-05, 1.2311013223455E-05, 1.2840946292098E-05, 1.3385075081963E-05, 1.3943556126712E-05, 1.4516545293213E-05, 1.5104197794269E-05, 1.5706668200924E-05, 1.6324110454361E-05, 1.6956677877416E-05, 1.7604523185716E-05, 1.826779849847E-05, 1.8946655348926E-05, 1.9641244694497E-05, 2.0351716926584E-05, 2.1078221880112E-05, 2.182090884277E-05, 2.2579926563991E-05, 2.3355423263671E-05, 2.4147546640639E-05, 2.4956443880884E-05, 2.5782261665568E-05, 2.6625146178798E-05, 2.7485243115207E-05, 2.8362697687318E-05, 2.9257654632723E-05, 3.0170258221064E-05, 3.1100652260842E-05, 3.2048980106047E-05, 3.301538466262E-05, 3.4000008394759E-05, 3.5002993331058E-05, 3.6024481070506E-05, 3.7064612788337E-05, 3.8123529241735E-05, 3.9201370775412E-05, 4.029827732705E-05, 4.1414388432615E-05, 4.2549843231552E-05, 4.3704780471863E-05, 4.4879338515063E-05, 4.6073655341034E-05, 4.7287868552767E-05, 4.8522115381001E-05, 4.9776532688759E-05, 5.1051256975792E-05, 5.2346424382923E-05, 5.3662170696303E-05, 5.4998631351575E-05, 5.6355941437951E-05, 5.7734235702213E-05, 5.9133648552623E-05, 6.0554314062759E-05, 6.1996365975273E-05, 6.3459937705577E-05, 6.4945162345451E-05, 6.6452172666588E-05, 6.7981101124065E-05, 6.9532079859749E-05, 7.1105240705638E-05, 7.2700715187144E-05, 7.4318634526304E-05, 7.5959129644943E-05, 7.7622331167772E-05, 7.9308369425429E-05, 8.1017374457472E-05, 8.2749476015308E-05, 8.450480356508E-05, 8.6283486290497E-05, 8.8085653095613E-05, 8.9911432607564E-05, 9.1760953179253E-05, 9.363434289199E-05, 9.5531729558084E-05, 9.7453240723402E-05, 9.9399003669869E-05, 0.00010136914541794, 0.00010336379272903, 0.00010538307210788, 0.00010742710980493, 0.00010949603181864, 0.00011158996389769, 0.00011370903154331, 0.00011585336001143, 0.00011802307431483, 0.00012021829922532, 0.00012243915927582, 0.00012468577876239, 0.00012695828174634, 0.00012925679205617, 0.00013158143328955, 0.00013393232881532, 0.00013630960177533, 0.0001387133750864, 0.0001411437714421, 0.00014360091331466, 0.00014608492295674, 0.00014859592240318, 0.00015113403347283, 0.00015369937777019, 0.00015629207668719, 0.00015891225140483, 0.00016156002289484, 0.00016423551192134, 0.0001669388390424, 0.00016967012461169, 0.00017242948878002, 0.00017521705149686, 0.00017803293251191, 0.00018087725137658, 0.0001837501274455, 0.00018665167987795, 0.00018958202763931, 0.00019254128950253, 0.00019552958404948, 0.00019854702967239, 0.0002015937445752, 0.00020466984677489, 0.00020777545410288, 0.00021091068420629, 0.00021407565454928, 0.00021727048241431, 0.00022049528490343, 0.00022375017893956, 0.00022703528126767, 0.00023035070845605, 0.00023369657689752, 0.00023707300281058, 0.00024048010224068, 0.00024391799106127, 0.00024738678497506, 0.00025088659951509, 0.0002544175500459, 0.00025797975176461, 0.00026157331970202, 0.00026519836872374, 0.0002688550135312, 0.00027254336866277, 0.00027626354849477, 0.00028001566724253, 0.00028379983896141, 0.0002876161775478, 0.00029146479674014, 0.00029534581011993, 0.00029925933111265, 0.0003032054729888, 0.0003071843488648, 0.000311196071704, 0.00031524075431755, 0.00031931850936538, 0.0003234294493571, 0.0003275736866529, 0.00033175133346446, 0.00033596250185584, 0.00034020730374436, 0.00034448585090146, 0.00034879825495356, 0.00035314462738292, 0.00035752507952849, 0.00036193972258674, 0.00036638866761246, 0.00037087202551964, 0.00037538990708219, 0.00037994242293482, 0.0003845296835738, 0.00038915179935773, 0.00039380888050836, 0.00039850103711131, 0.00040322837911686, 0.0004079910163407, 0.00041278905846467, 0.0004176226150375, 0.00042249179547557, 0.00042739670906357, 0.00043233746495528, 0.00043731417217426, 0.00044232693961454, 0.00044737587604133, 0.00045246109009173, 0.00045758269027536, 0.00046274078497509, 0.00046793548244769, 0.00047316689082449, 0.00047843511811206, 0.00048374027219282, 0.00048908246082574, 0.00049446179164693, 0.00049987837217032, 0.00050533230978826, 0.00051082371177214, 0.00051635268527304, 0.00052191933732228, 0.00052752377483211, 0.00053316610459623, 0.00053884643329044, 0.00054456486747321, 0.00055032151358626, 0.00055611647795516, 0.00056194986678986, 0.00056782178618532, 0.00057373234212203, 0.00057968164046658, 0.00058566978697224, 0.00059169688727947, 0.00059776304691649, 0.0006038683712998, 0.00061001296573476, 0.00061619693541606, 0.00062242038542831, 0.00062868342074651, 0.00063498614623659, 0.00064132866665593, 0.00064771108665387, 0.00065413351077218, 0.00066059604344562, 0.00066709878900238, 0.00067364185166462, 0.00068022533554893, 0.0006868493446668, 0.00069351398292516, 0.00070021935412679, 0.00070696556197084, 0.00071375271005326, 0.00072058090186731, 0.00072745024080399, 0.0007343608301525, 0.00074131277310071, 0.0007483061727356, 0.0007553411320437, 0.00076241775391155, 0.00076953614112613, 0.00077669639637532, 0.00078389862224827, 0.00079114292123592, 0.00079842939573135, 0.00080575814803024, 0.00081312928033128, 0.0008205428947366, 0.00082799909325218, 0.00083549797778822, 0.00084303965015963, 0.00085062421208635, 0.0008582517651938, 0.00086592241101328, 0.00087363625098232, 0.00088139338644514, 0.00088919391865298, 0.00089703794876453, 0.00090492557784626, 0.00091285690687288, 0.00092083203672763, 0.00092885106820274, 0.00093691410199974, 0.00094502123872984, 0.00095317257891433, 0.00096136822298491, 0.00096960827128409, 0.00097789282406548, 0.00098622198149424, 0.00099459584364735, 0.001003014510514, 0.001011478081996, 0.001019986657908, 0.0010285403379778, 0.0010371392218471, 0.0010457834090712, 0.0010544729991198, 0.0010632080913772, 0.0010719887851427, 0.0010808151796308, 0.0010896873739715, 0.0010986054672109, 0.0011075695583113, 0.0011165797461514, 0.0011256361295269, 0.0011347388071508, 0.0011438878776535, 0.0011530834395831, 0.0011623255914062, 0.0011716144315074, 0.0011809500581905, 0.001190332569678, 0.0011997620641119, 0.0012092386395539, 0.0012187623939855, 0.0012283334253088, 0.0012379518313459, 0.0012476177098403, 0.0012573311584563, 0.0012670922747797, 0.001276901156318, 0.0012867579005008, 0.0012966626046798, 0.0013066153661293, 0.0013166162820465, 0.0013266654495518, 0.0013367629656887, 0.0013469089274247, 0.001357103431651, 0.0013673465751831, 0.0013776384547609, 0.0013879791670492, 0.0013983688086377, 0.0014088074760413, 0.0014192952657007, 0.001429832273982, 0.0014404185971777, 0.0014510543315065, 0.0014617395731136, 0.0014724744180711, 0.0014832589623782, 0.0014940933019612, 0.0015049775326744, 0.0015159117502995, 0.0015268960505465, 0.0015379305290537, 0.0015490152813879, 0.0015601504030447, 0.0015713359894489, 0.0015825721359542, 0.0015938589378443, 0.0016051964903323, 0.0016165848885615, 0.0016280242276053, 0.0016395146024676, 0.001651056108083, 0.001662648839317, 0.0016742928909662, 0.0016859883577586, 0.001697735334354, 0.0017095339153436, 0.0017213841952511, 0.0017332862685321, 0.0017452402295748, 0.0017572461727003, 0.0017693041921624, 0.0017814143821481, 0.0017935768367776, 0.0018057916501051, 0.0018180589161181, 0.0018303787287384, 0.0018427511818219, 0.0018551763691589, 0.0018676543844743, 0.0018801853214278, 0.0018927692736144, 0.001905406334564, 0.0019180965977421, 0.0019308401565498, 0.0019436371043241, 0.0019564875343379, 0.0019693915398006, 0.0019823492138579, 0.0019953606495919, 0.002008425940022, 0.0020215451781044, 0.0020347184567323, 0.0020479458687367, 0.0020612275068859, 0.0020745634638863, 0.002087953832382, 0.0021013987049554, 0.0021148981741272, 0.0021284523323568, 0.0021420612720421, 0.0021557250855201, 0.0021694438650669, 0.0021832177028978, 0.0021970466911675, 0.0022109309219705, 0.002224870487341, 0.0022388654792533, 0.0022529159896218, 0.0022670221103013, 0.0022811839330872, 0.0022954015497153, 0.0023096750518628, 0.0023240045311475, 0.0023383900791285, 0.0023528317873066, 0.0023673297471238, 0.002381884049964, 0.0023964947871529, 0.0024111620499586, 0.002425885929591, 0.0024406665172026, 0.0024555039038886, 0.0024703981806867, 0.0024853494385776, 0.0025003577684852, 0.0025154232612763, 0.0025305460077614, 0.0025457260986943, 0.0025609636247727, 0.0025762586766381, 0.0025916113448759, 0.0026070217200159, 0.0026224898925319, 0.0026380159528426, 0.002653599991311, 0.0026692420982451, 0.0026849423638977, 0.0027007008784668, 0.0027165177320956, 0.0027323930148728, 0.0027483268168326, 0.0027643192279548, 0.0027803703381652, 0.0027964802373355, 0.0028126490152836, 0.0028288767617737, 0.0028451635665164, 0.0028615095191689, 0.0028779147093352, 0.002894379226566, 0.0029109031603591, 0.0029274866001596, 0.0029441296353598, 0.0029608323552992, 0.0029775948492654, 0.0029944172064931, 0.0030112995161654, 0.0030282418674131, 0.0030452443493152, 0.003062307050899, 0.0030794300611402, 0.0030966134689631, 0.0031138573632404, 0.0031311618327941, 0.0031485269663946, 0.0031659528527619, 0.0031834395805649, 0.0032009872384219, 0.0032185959149007, 0.0032362656985186, 0.0032539966777429, 0.0032717889409905, 0.0032896425766285, 0.003307557672974, 0.0033255343182943, 0.0033435726008072, 0.0033616726086811, 0.0033798344300347, 0.0033980581529378, 0.0034163438654109, 0.0034346916554256, 0.0034531016109044, 0.0034715738197215, 0.0034901083697021, 0.0035087053486229, 0.0035273648442125, 0.003546086944151, 0.0035648717360705, 0.003583719307555, 0.0036026297461406, 0.0036216031393156, 0.0036406395745208, 0.0036597391391493, 0.0036789019205468, 0.0036981280060118, 0.0037174174827953, 0.0037367704381017, 0.0037561869590881, 0.0037756671328647, 0.0037952110464953, 0.0038148187869968, 0.0038344904413397, 0.0038542260964481, 0.0038740258391998, 0.0038938897564264, 0.0039138179349135, 0.0039338104614009, 0.0039538674225822, 0.0039739889051057, 0.0039941749955737, 0.0040144257805432, 0.0040347413465258, 0.0040551217799877, 0.0040755671673502, 0.0040960775949892, 0.0041166531492357, 0.0041372939163759, 0.0041579999826514, 0.0041787714342588, 0.0041996083573505, 0.0042205108380342, 0.0042414789623735, 0.0042625128163874, 0.0042836124860512, 0.004304778057296, 0.0043260096160088, 0.0043473072480331, 0.0043686710391684, 0.0043901010751708, 0.0044115974417526, 0.0044331602245831, 0.0044547895092878, 0.0044764853814494, 0.0044982479266072, 0.0045200772302576, 0.0045419733778541, 0.0045639364548072, 0.004585966546485, 0.0046080637382126, 0.0046302281152729, 0.004652459762906, 0.00467475876631, 0.0046971252106406, 0.0047195591810113, 0.0047420607624937, 0.0047646300401172, 0.0047872670988696, 0.0048099720236968, 0.0048327448995029, 0.0048555858111506, 0.0048784948434611, 0.0049014720812141, 0.0049245176091479, 0.0049476315119599, 0.004970813874306, 0.0049940647808013, 0.0050173843160198, 0.0050407725644949, 0.005064229610719, 0.0050877555391437, 0.0051113504341804, 0.0051350143801997, 0.0051587474615319, 0.0051825497624669, 0.0052064213672545, 0.0052303623601041, 0.0052543728251853, 0.0052784528466277, 0.0053026025085207, 0.0053268218949143, 0.0053511110898186, 0.005375470177204, 0.0053998992410014, 0.0054243983651023, 0.0054489676333588, 0.0054736071295836, 0.0054983169375503, 0.0055230971409934, 0.0055479478236082, 0.0055728690690511, 0.0055978609609397, 0.0056229235828528, 0.0056480570183303, 0.0056732613508737, 0.0056985366639457, 0.0057238830409708, 0.005749300565335, 0.0057747893203858, 0.0058003493894327, 0.0058259808557469, 0.0058516838025617, 0.0058774583130723, 0.0059033044704359, 0.005929222357772, 0.0059552120581623, 0.0059812736546507, 0.0060074072302437, 0.0060336128679101, 0.0060598906505814, 0.0060862406611516, 0.0061126629824775, 0.0061391576973785, 0.0061657248886372, 0.0061923646389988, 0.0062190770311716, 0.0062458621478271, 0.0062727200715997, 0.0062996508850874, 0.0063266546708512, 0.0063537315114156, 0.0063808814892685, 0.0064081046868615, 0.0064354011866095, 0.0064627710708913, 0.0064902144220494, 0.00651773132239, 0.0065453218541835, 0.0065729860996639, 0.0066007241410294, 0.0066285360604423, 0.0066564219400292, 0.0066843818618806, 0.0067124159080517, 0.0067405241605619, 0.0067687067013951, 0.0067969636124997, 0.0068252949757887, 0.0068537008731398, 0.0068821813863954, 0.0069107365973627, 0.006939366587814, 0.0069680714394861, 0.0069968512340812, 0.0070257060532664, 0.007054635978674, 0.0070836410919015, 0.0071127214745117, 0.0071418772080328, 0.0071711083739583, 0.0072004150537472, 0.0072297973288241, 0.0072592552805793, 0.0072887889903685, 0.0073183985395136, 0.0073480840093018, 0.0073778454809866, 0.0074076830357872, 0.0074375967548889, 0.007467586719443, 0.0074976530105671, 0.0075277957093448, 0.0075580148968261, 0.0075883106540273, 0.0076186830619311, 0.0076491322014865, 0.0076796581536093, 0.0077102609991818, 0.0077409408190527, 0.0077716976940377, 0.0078025317049192, 0.0078334429324463, 0.0078644314573351, 0.0078954973602688, 0.0079266407218972, 0.0079578616228377, 0.0079891601436744, 0.0080205363649589, 0.0080519903672099, 0.0080835222309134, 0.008115132036523, 0.0081468198644594, 0.0081785857951111, 0.008210429908834, 0.0082423522859517, 0.0082743530067554, 0.0083064321515042, 0.0083385898004248, 0.0083708260337119, 0.0084031409315279, 0.0084355345740035, 0.0084680070412373, 0.0085005584132957, 0.0085331887702138, 0.0085658981919944, 0.0085986867586089, 0.0086315545499967, 0.008664501646066, 0.008697528126693, 0.0087306340717227, 0.0087638195609685, 0.0087970846742124, 0.0088304294912051, 0.0088638540916661, 0.0088973585552834, 0.0089309429617142, 0.0089646073905843, 0.0089983519214885, 0.0090321766339906, 0.0090660816076236, 0.0091000669218893, 0.0091341326562588, 0.0091682788901726, 0.0092025057030402, 0.0092368131742405, 0.0092712013831217, 0.0093056704090017, 0.0093402203311676, 0.0093748512288761, 0.0094095631813535, 0.0094443562677958, 0.0094792305673686, 0.0095141861592073, 0.0095492231224171, 0.009584341536073, 0.0096195414792199, 0.0096548230308728, 0.0096901862700164, 0.0097256312756059, 0.0097611581265662, 0.0097967669017925, 0.0098324576801504, 0.0098682305404754, 0.0099040855615735, 0.0099400228222213, 0.0099760424011654, 0.010012144377123, 0.010048328828782, 0.010084595834801, 0.010120945473808, 0.010157377824404, 0.010193892965158, 0.010230490974612, 0.010267171931278, 0.010303935913638, 0.010340783000146, 0.010377713269227, 0.010414726799276, 0.010451823668661, 0.010489003955718, 0.010526267738758, 0.010563615096059, 0.010601046105874, 0.010638560846426, 0.010676159395908, 0.010713841832486, 0.010751608234296, 0.010789458679448, 0.010827393246022, 0.010865412012068, 0.01090351505561, 0.010941702454643, 0.010979974287134, 0.01101833063102, 0.011056771564213, 0.011095297164593, 0.011133907510016, 0.011172602678306, 0.011211382747263, 0.011250247794655, 0.011289197898225, 0.011328233135688, 0.011367353584728, 0.011406559323006, 0.011445850428153, 0.01148522697777, 0.011524689049434, 0.011564236720693, 0.011603870069068, 0.011643589172051, 0.011683394107107, 0.011723284951676, 0.011763261783167, 0.011803324678964, 0.011843473716424, 0.011883708972874, 0.011924030525617, 0.011964438451927, 0.012004932829052, 0.012045513734212, 0.0120861812446, 0.012126935437383, 0.012167776389701, 0.012208704178665, 0.012249718881362, 0.01229082057485, 0.012332009336161, 0.012373285242302, 0.01241464837025, 0.012456098796958, 0.012497636599352, 0.012539261854329, 0.012580974638763, 0.0126227750295, 0.012664663103359, 0.012706638937133, 0.01274870260759, 0.012790854191469, 0.012833093765485, 0.012875421406326, 0.012917837190653, 0.012960341195103, 0.013002933496285, 0.013045614170783, 0.013088383295153, 0.013131240945928, 0.013174187199613, 0.013217222132688, 0.013260345821607, 0.013303558342797, 0.013346859772661, 0.013390250187575, 0.013433729663891, 0.013477298277932, 0.013520956106, 0.013564703224366, 0.013608539709281, 0.013652465636967, 0.013696481083621, 0.013740586125415, 0.013784780838495, 0.013829065298984, 0.013873439582976, 0.013917903766543, 0.01396245792573, 0.014007102136556, 0.014051836475018, 0.014096661017084, 0.0141415758387, 0.014186581015785, 0.014231676624235, 0.014276862739919, 0.014322139438681, 0.014367506796342, 0.014412964888697, 0.014458513791516, 0.014504153580545, 0.014549884331504, 0.014595706120089, 0.014641619021971, 0.014687623112798, 0.014733718468191, 0.014779905163748, 0.014826183275042, 0.014872552877621, 0.01491901404701, 0.014965566858707, 0.015012211388188, 0.015058947710905, 0.015105775902283, 0.015152696037724, 0.015199708192608, 0.015246812442286, 0.015294008862091, 0.015341297527325, 0.015388678513272, 0.015436151895189, 0.015483717748308, 0.015531376147839, 0.015579127168967, 0.015626970886854, 0.015674907376637, 0.01572293671343, 0.015771058972322, 0.01581927422838, 0.015867582556647, 0.015915984032139, 0.015964478729853, 0.016013066724759, 0.016061748091805, 0.016110522905915, 0.01615939124199, 0.016208353174906, 0.016257408779517, 0.016306558130653, 0.01635580130312, 0.016405138371701, 0.016454569411157, 0.016504094496223, 0.016553713701614, 0.016603427102018, 0.016653234772103, 0.016703136786512, 0.016753133219866, 0.016803224146762, 0.016853409641773, 0.016903689779452, 0.016954064634326, 0.0170045342809, 0.017055098793657, 0.017105758247056, 0.017156512715532, 0.0172073622735, 0.01725830699535, 0.017309346955449, 0.017360482228144, 0.017411712887755, 0.017463039008584, 0.017514460664906, 0.017565977930976, 0.017617590881026, 0.017669299589265, 0.017721104129879, 0.017773004577032, 0.017825001004866, 0.0178770934875, 0.01792928209903, 0.017981566913532, 0.018033948005056, 0.018086425447632, 0.018138999315268, 0.018191669681949, 0.018244436621637, 0.018297300208273, 0.018350260515775, 0.018403317618039, 0.01845647158894, 0.01850972250233, 0.018563070432038, 0.018616515451873, 0.018670057635619, 0.018723697057042, 0.018777433789883, 0.018831267907863, 0.018885199484679, 0.018939228594008, 0.018993355309505, 0.019047579704801, 0.019101901853509, 0.019156321829217, 0.019210839705493, 0.019265455555883, 0.019320169453911, 0.01937498147308, 0.01942989168687, 0.019484900168741, 0.019540006992132, 0.019595212230457, 0.019650515957114, 0.019705918245474, 0.019761419168889, 0.019817018800692, 0.01987271721419, 0.019928514482673, 0.019984410679406, 0.020040405877635, 0.020096500150584, 0.020152693571457, 0.020208986213434, 0.020265378149677, 0.020321869453325, 0.020378460197496, 0.020435150455288, 0.020491940299777, 0.020548829804018, 0.020605819041044, 0.020662908083871, 0.020720097005489, 0.02077738587887, 0.020834774776964, 0.020892263772702, 0.020949852938992, 0.021007542348721, 0.021065332074758, 0.021123222189948, 0.021181212767117, 0.021239303879071, 0.021297495598593, 0.021355787998447, 0.021414181151377, 0.021472675130105, 0.021531270007332, 0.02158996585574, 0.021648762747991, 0.021707660756723, 0.021766659954558, 0.021825760414095, 0.021884962207912, 0.021944265408569, 0.022003670088604, 0.022063176320534, 0.022122784176858, 0.022182493730053, 0.022242305052575, 0.022302218216863, 0.022362233295333, 0.02242235036038, 0.022482569484383, 0.022542890739696, 0.022603314198656, 0.02266383993358, 0.022724468016762, 0.02278519852048, 0.02284603151699, 0.022906967078526, 0.022968005277307, 0.023029146185526, 0.023090389875362, 0.02315173641897, 0.023213185888487, 0.02327473835603, 0.023336393893695, 0.02339815257356, 0.023460014467682, 0.023521979648099, 0.023584048186829, 0.02364622015587, 0.023708495627201, 0.023770874672781, 0.023833357364549, 0.023895943774425, 0.02395863397431, 0.024021428036083, 0.024084326031608, 0.024147328032724, 0.024210434111256, 0.024273644339004, 0.024336958787754, 0.024400377529269, 0.024463900635293, 0.024527528177553, 0.024591260227754, 0.024655096857582, 0.024719038138707, 0.024783084142775, 0.024847234941416, 0.02491149060624, 0.024975851208838, 0.02504031682078, 0.025104887513619, 0.02516956335889, 0.025234344428105, 0.02529923079276, 0.025364222524331, 0.025429319694275, 0.025494522374031, 0.025559830635017, 0.025625244548635, 0.025690764186264, 0.025756389619267, 0.025822120918989, 0.025887958156753, 0.025953901403865, 0.026019950731614, 0.026086106211265, 0.026152367914071, 0.02621873591126, 0.026285210274045, 0.026351791073619, 0.026418478381158, 0.026485272267816, 0.026552172804732, 0.026619180063024, 0.026686294113793, 0.02675351502812, 0.026820842877068, 0.026888277731681, 0.026955819662987, 0.027023468741991, 0.027091225039685, 0.027159088627038, 0.027227059575002, 0.027295137954512, 0.027363323836483, 0.027431617291813, 0.02750001839138, 0.027568527206045, 0.02763714380665, 0.027705868264019, 0.027774700648959, 0.027843641032256, 0.027912689484681, 0.027981846076984, 0.028051110879898, 0.028120483964139, 0.028189965400404, 0.028259555259371, 0.028329253611701, 0.028399060528036, 0.028468976079001, 0.028539000335204, 0.028609133367232, 0.028679375245656, 0.028749726041029, 0.028820185823886, 0.028890754664744, 0.028961432634102, 0.02903221980244, 0.029103116240224, 0.029174122017897, 0.029245237205887, 0.029316461874606, 0.029387796094444, 0.029459239935777, 0.029530793468961, 0.029602456764335, 0.02967422989222, 0.029746112922921, 0.029818105926724, 0.029890208973896, 0.029962422134689, 0.030034745479337, 0.030107179078054, 0.03017972300104, 0.030252377318474, 0.030325142100521, 0.030398017417326, 0.030471003339016, 0.030544099935704, 0.030617307277483, 0.030690625434428, 0.030764054476598, 0.030837594474034, 0.030911245496762, 0.030985007614786, 0.031058880898097, 0.031132865416667, 0.03120696124045, 0.031281168439385, 0.03135548708339, 0.031429917242371, 0.031504458986212, 0.031579112384782, 0.031653877507934, 0.031728754425501, 0.031803743207302, 0.031878843923136, 0.031954056642787, 0.03202938143602, 0.032104818372586, 0.032180367522217, 0.032256028954627, 0.032331802739515, 0.032407688946563, 0.032483687645434, 0.032559798905776, 0.032636022797219, 0.032712359389378, 0.032788808751848, 0.032865370954211, 0.032942046066029, 0.033018834156848, 0.033095735296198, 0.033172749553592, 0.033249876998526, 0.033327117700479, 0.033404471728913, 0.033481939153275, 0.033559520042993, 0.033637214467481, 0.033715022496134, 0.033792944198332, 0.033870979643437, 0.033949128900795, 0.034027392039735, 0.034105769129572, 0.034184260239601, 0.034262865439101, 0.034341584797338, 0.034420418383557, 0.034499366266989, 0.034578428516847, 0.034657605202331, 0.034736896392621, 0.034816302156881, 0.034895822564261, 0.034975457683891, 0.035055207584889, 0.035135072336354, 0.035215052007368, 0.035295146666999, 0.035375356384296, 0.035455681228296, 0.035536121268014, 0.035616676572455, 0.035697347210602, 0.035778133251427, 0.035859034763881, 0.035940051816903, 0.036021184479413, 0.036102432820316, 0.036183796908501, 0.036265276812842, 0.036346872602194, 0.036428584345399, 0.036510412111281, 0.036592355968649, 0.036674415986295, 0.036756592232997, 0.036838884777514, 0.036921293688592, 0.03700381903496, 0.03708646088533, 0.0371692193084, 0.037252094372851, 0.037335086147348, 0.037418194700541, 0.037501420101062, 0.037584762417532, 0.03766822171855, 0.037751798072704, 0.037835491548564, 0.037919302214686, 0.038003230139607, 0.038087275391851, 0.038171438039927, 0.038255718152326, 0.038340115797524, 0.038424631043982, 0.038509263960145, 0.038594014614443, 0.038678883075289, 0.038763869411083, 0.038848973690205, 0.038934195981024, 0.039019536351892, 0.039104994871144, 0.039190571607101, 0.039276266628068, 0.039362080002335, 0.039448011798176, 0.03953406208385, 0.039620230927601, 0.039706518397655, 0.039792924562226, 0.039879449489512, 0.039966093247693, 0.040052855904936, 0.040139737529393, 0.0402267381892, 0.040313857952476, 0.040401096887328, 0.040488455061846, 0.040575932544103, 0.04066352940216, 0.040751245704062, 0.040839081517837, 0.040927036911498, 0.041015111953046, 0.041103306710464, 0.04119162125172, 0.041280055644768, 0.041368609957545, 0.041457284257975, 0.041546078613967, 0.041634993093413, 0.041724027764191, 0.041813182694164, 0.04190245795118, 0.041991853603073, 0.042081369717659, 0.042171006362743, 0.042260763606112, 0.042350641515538, 0.042440640158782, 0.042530759603584, 0.042620999917675, 0.042711361168767, 0.042801843424559, 0.042892446752735, 0.042983171220964, 0.0430740168969, 0.043164983848181, 0.043256072142434, 0.043347281847266, 0.043438613030274, 0.043530065759038, 0.043621640101122, 0.043713336124078, 0.043805153895442, 0.043897093482735, 0.043989154953464, 0.044081338375121, 0.044173643815184, 0.044266071341114, 0.04435862102036, 0.044451292920356, 0.04454408710852, 0.044637003652258, 0.044730042618958, 0.044823204075996, 0.044916488090733, 0.045009894730514, 0.045103424062673, 0.045197076154525, 0.045290851073374, 0.045384748886507, 0.045478769661199, 0.045572913464709, 0.045667180364283, 0.045761570427149, 0.045856083720526, 0.045950720311614, 0.046045480267601, 0.04614036365566, 0.046235370542951, 0.046330500996616, 0.046425755083787, 0.046521132871579, 0.046616634427094, 0.046712259817419, 0.046808009109627, 0.046903882370777, 0.046999879667913, 0.047096001068067, 0.047192246638253, 0.047288616445475, 0.047385110556719, 0.04748172903896, 0.047578471959157, 0.047675339384256, 0.047772331381187, 0.047869448016868, 0.047966689358202, 0.048064055472078, 0.048161546425371, 0.048259162284942, 0.048356903117637, 0.04845476899029, 0.04855275996972, 0.04865087612273, 0.048749117516113, 0.048847484216645, 0.048945976291089, 0.049044593806193, 0.049143336828694, 0.049242205425312, 0.049341199662754, 0.049440319607715, 0.049539565326872, 0.049638936886893, 0.049738434354428, 0.049838057796116, 0.04993780727858, 0.050037682868432, 0.050137684632268, 0.05023781263667, 0.050338066948207, 0.050438447633435, 0.050538954758894, 0.050639588391114, 0.050740348596607, 0.050841235441875, 0.050942248993403, 0.051043389317664, 0.051144656481119, 0.051246050550212, 0.051347571591376, 0.051449219671028, 0.051550994855574, 0.051652897211405, 0.051754926804897, 0.051857083702416, 0.051959367970312, 0.05206177967492, 0.052164318882566, 0.052266985659557, 0.052369780072192, 0.052472702186751, 0.052575752069506, 0.052678929786711, 0.052782235404608, 0.052885668989427, 0.052989230607383, 0.053092920324678, 0.0531967382075, 0.053300684322025, 0.053404758734415, 0.053508961510817, 0.053613292717367, 0.053717752420187, 0.053822340685385, 0.053927057579055, 0.05403190316728, 0.054136877516128, 0.054241980691654, 0.0543472127599, 0.054452573786894, 0.054558063838652, 0.054663682981175, 0.054769431280453, 0.054875308802461, 0.054981315613161, 0.055087451778502, 0.055193717364422, 0.055300112436841, 0.055406637061671, 0.055513291304807, 0.055620075232133, 0.055726988909519, 0.055834032402823, 0.055941205777888, 0.056048509100544, 0.056155942436611, 0.056263505851893, 0.056371199412182, 0.056479023183256, 0.05658697723088, 0.056695061620809, 0.05680327641878, 0.056911621690522, 0.057020097501747, 0.057128703918157, 0.057237441005438, 0.057346308829267, 0.057455307455304, 0.057564436949198, 0.057673697376586, 0.057783088803091, 0.057892611294323, 0.058002264915879, 0.058112049733343, 0.058221965812288, 0.058332013218272, 0.058442192016841, 0.058552502273528, 0.058662944053854, 0.058773517423325, 0.058884222447437, 0.058995059191672, 0.059106027721498, 0.059217128102373, 0.059328360399739, 0.059439724679028, 0.059551221005658, 0.059662849445035, 0.059774610062551, 0.059886502923587, 0.059998528093509, 0.060110685637673, 0.060222975621421, 0.060335398110082, 0.060447953168974, 0.0605606408634, 0.060673461258652, 0.060786414420009, 0.060899500412738, 0.061012719302092, 0.061126071153313, 0.061239556031629, 0.061353174002258, 0.061466925130402, 0.061580809481252, 0.061694827119988, 0.061808978111775, 0.061923262521767, 0.062037680415106, 0.06215223185692, 0.062266916912325, 0.062381735646425, 0.062496688124312, 0.062611774411064, 0.062726994571748, 0.062842348671419, 0.062957836775118, 0.063073458947874, 0.063189215254704, 0.063305105760614, 0.063421130530595, 0.063537289629628, 0.063653583122679, 0.063770011074705, 0.063886573550649, 0.064003270615441, 0.064120102333999, 0.06423706877123, 0.064354169992028, 0.064471406061274, 0.064588777043839, 0.064706283004578, 0.064823924008337, 0.064941700119949, 0.065059611404235, 0.065177657926002, 0.065295839750047, 0.065414156941154, 0.065532609564095, 0.06565119768363, 0.065769921364506, 0.065888780671458, 0.06600777566921, 0.066126906422474, 0.066246172995948, 0.066365575454319, 0.066485113862263, 0.066604788284441, 0.066724598785507, 0.066844545430097, 0.066964628282838, 0.067084847408347, 0.067205202871224, 0.067325694736062, 0.067446323067438, 0.06756708792992, 0.067687989388062, 0.067809027506407, 0.067930202349486, 0.068051513981819, 0.068172962467911, 0.068294547872258, 0.068416270259343, 0.068538129693637, 0.0686601262396, 0.06878225996168, 0.068904530924311, 0.069026939191918, 0.069149484828912, 0.069272167899694, 0.069394988468652, 0.069517946600161, 0.069641042358588, 0.069764275808283, 0.06988764701359, 0.070011156038835, 0.070134802948338, 0.070258587806404, 0.070382510677326, 0.070506571625386, 0.070630770714856, 0.070755108009994, 0.070879583575047, 0.071004197474249, 0.071128949771825, 0.071253840531987, 0.071378869818934, 0.071504037696856, 0.071629344229929, 0.071754789482318, 0.071880373518177, 0.072006096401648, 0.072131958196862, 0.072257958967936, 0.072384098778979, 0.072510377694085, 0.072636795777339, 0.072763353092813, 0.072890049704567, 0.073016885676652, 0.073143861073105, 0.073270975957952, 0.073398230395208, 0.073525624448875, 0.073653158182946, 0.073780831661401, 0.073908644948208, 0.074036598107325, 0.074164691202697, 0.074292924298259, 0.074421297457933, 0.074549810745631, 0.074678464225253, 0.074807257960687, 0.07493619201581, 0.075065266454488, 0.075194481340576, 0.075323836737916, 0.07545333271034, 0.075582969321668, 0.075712746635709, 0.07584266471626, 0.075972723627108, 0.076102923432027, 0.076233264194781, 0.076363745979122, 0.076494368848791, 0.076625132867517, 0.07675603809902, 0.076887084607005, 0.077018272455169, 0.077149601707196, 0.077281072426759, 0.077412684677521, 0.077544438523132, 0.077676334027232, 0.077808371253449, 0.0779405502654, 0.078072871126692, 0.078205333900919, 0.078337938651665, 0.078470685442502, 0.078603574336991, 0.078736605398683, 0.078869778691116, 0.079003094277819, 0.079136552222308, 0.079270152588089, 0.079403895438656, 0.079537780837494, 0.079671808848073, 0.079805979533856, 0.079940292958292, 0.080074749184821, 0.080209348276871, 0.080344090297859, 0.080478975311191, 0.080614003380261, 0.080749174568455, 0.080884488939144, 0.081019946555691, 0.081155547481447, 0.081291291779752, 0.081427179513934, 0.081563210747312, 0.081699385543193, 0.081835703964873, 0.081972166075638, 0.08210877193876, 0.082245521617505, 0.082382415175124, 0.082519452674859, 0.082656634179941, 0.082793959753588, 0.082931429459011, 0.083069043359407, 0.083206801517964, 0.083344703997857, 0.083482750862252, 0.083620942174304, 0.083759277997156, 0.083897758393941, 0.084036383427782, 0.08417515316179, 0.084314067659066, 0.084453126982699, 0.084592331195767, 0.084731680361341, 0.084871174542476, 0.08501081380222, 0.085150598203609, 0.085290527809667, 0.08543060268341, 0.08557082288784, 0.085711188485952, 0.085851699540728, 0.085992356115139, 0.086133158272145, 0.086274106074699, 0.086415199585739, 0.086556438868193, 0.086697823984982, 0.086839354999011, 0.086981031973179, 0.087122854970371, 0.087264824053464, 0.087406939285322, 0.087549200728801, 0.087691608446744, 0.087834162501984, 0.087976862957345, 0.088119709875638, 0.088262703319666, 0.088405843352219, 0.088549130036079, 0.088692563434014, 0.088836143608785, 0.08897987062314, 0.089123744539819, 0.089267765421549, 0.089411933331047, 0.08955624833102, 0.089700710484166, 0.089845319853169, 0.089990076500706, 0.090134980489442, 0.090280031882031, 0.090425230741117, 0.090570577129335, 0.090716071109307, 0.090861712743646, 0.091007502094956, 0.091153439225827, 0.091299524198842, 0.091445757076573, 0.091592137921579, 0.091738666796412, 0.091885343763611, 0.092032168885707, 0.092179142225219, 0.092326263844657, 0.092473533806518, 0.092620952173292, 0.092768519007456, 0.092916234371479, 0.093064098327818, 0.093212110938921, 0.093360272267223, 0.093508582375153, 0.093657041325126, 0.093805649179549, 0.093954406000817, 0.094103311851316, 0.094252366793422, 0.0944015708895, 0.094550924201904, 0.09470042679298, 0.094850078725061, 0.094999880060473, 0.095149830861529, 0.095299931190534, 0.09545018110978, 0.095600580681553, 0.095751129968124, 0.095901829031758, 0.096052677934707, 0.096203676739214, 0.096354825507513, 0.096506124301826, 0.096657573184365, 0.096809172217334, 0.096960921462923, 0.097112820983317, 0.097264870840686, 0.097417071097193, 0.09756942181499, 0.097721923056219, 0.097874574883012, 0.09802737735749, 0.098180330541766, 0.098333434497941, 0.098486689288107, 0.098640094974346, 0.098793651618729, 0.098947359283318, 0.099101218030164, 0.09925522792131, 0.099409389018787, 0.099563701384617, 0.099718165080812, 0.099872780169372, 0.10002754671229, 0.10018246477155, 0.10033753440912, 0.10049275568697, 0.10064812866704, 0.10080365341127, 0.10095932998161, 0.10111515843998, 0.10127113884827, 0.10142727126841, 0.10158355576227, 0.10173999239175, 0.10189658121871, 0.10205332230503, 0.10221021571254, 0.1023672615031, 0.10252445973854, 0.10268181048068, 0.10283931379134, 0.10299696973232, 0.10315477836541, 0.10331273975241, 0.10347085395507, 0.10362912103518, 0.10378754105447, 0.10394611407471, 0.10410484015762, 0.10426371936493, 0.10442275175836, 0.1045819373996, 0.10474127635037, 0.10490076867234, 0.10506041442719, 0.10522021367659, 0.1053801664822, 0.10554027290566, 0.10570053300862, 0.1058609468527, 0.10602151449951, 0.10618223601068, 0.10634311144779, 0.10650414087244, 0.10666532434621, 0.10682666193067, 0.10698815368738, 0.10714979967788, 0.10731159996373, 0.10747355460646, 0.10763566366757, 0.1077979272086, 0.10796034529104, 0.10812291797638, 0.10828564532611, 0.10844852740171, 0.10861156426463, 0.10877475597634, 0.10893810259827, 0.10910160419187, 0.10926526081856, 0.10942907253975, 0.10959303941687, 0.10975716151129, 0.10992143888441, 0.11008587159762, 0.11025045971227, 0.11041520328974, 0.11058010239136, 0.11074515707848, 0.11091036741243, 0.11107573345454, 0.11124125526611, 0.11140693290845, 0.11157276644285, 0.1117387559306, 0.11190490143296, 0.11207120301121, 0.11223766072661, 0.11240427464038, 0.11257104481379, 0.11273797130804, 0.11290505418437, 0.11307229350397, 0.11323968932804, 0.11340724171779, 0.11357495073438, 0.11374281643899, 0.11391083889278, 0.11407901815691, 0.11424735429251, 0.11441584736071, 0.11458449742266, 0.11475330453945, 0.11492226877219, 0.11509139018198, 0.11526066882991, 0.11543010477706, 0.11559969808449, 0.11576944881326, 0.11593935702443, 0.11610942277903, 0.11627964613809, 0.11645002716264, 0.11662056591369, 0.11679126245224, 0.11696211683929, 0.11713312913581, 0.1173042994028, 0.11747562770121, 0.117647114092, 0.11781875863613, 0.11799056139452, 0.11816252242811, 0.11833464179781, 0.11850691956455, 0.11867935578922, 0.11885195053271, 0.11902470385591, 0.1191976158197, 0.11937068648493, 0.11954391591247, 0.11971730416316, 0.11989085129785, 0.12006455737735, 0.12023842246248, 0.12041244661407, 0.12058662989291, 0.12076097235979, 0.1209354740755, 0.12111013510081, 0.12128495549648, 0.12145993532328, 0.12163507464194, 0.12181037351321, 0.12198583199782, 0.12216145015648, 0.1223372280499, 0.1225131657388, 0.12268926328385, 0.12286552074574, 0.12304193818516, 0.12321851566275, 0.12339525323919, 0.12357215097511, 0.12374920893116, 0.12392642716796, 0.12410380574614, 0.1242813447263, 0.12445904416906, 0.12463690413499, 0.1248149246847, 0.12499310587874, 0.1251714477777, 0.12534995044212, 0.12552861393256, 0.12570743830956, 0.12588642363364, 0.12606556996533, 0.12624487736514, 0.12642434589357, 0.12660397561113, 0.12678376657829, 0.12696371885554, 0.12714383250334, 0.12732410758215, 0.12750454415242, 0.1276851422746, 0.12786590200912, 0.1280468234164, 0.12822790655685, 0.12840915149089, 0.12859055827891, 0.1287721269813, 0.12895385765844, 0.1291357503707, 0.12931780517844, 0.12950002214202, 0.12968240132178, 0.12986494277806, 0.13004764657118, 0.13023051276146, 0.13041354140921, 0.13059673257474, 0.13078008631833, 0.13096360270026, 0.13114728178082, 0.13133112362026, 0.13151512827885, 0.13169929581683, 0.13188362629444, 0.13206811977191, 0.13225277630947, 0.13243759596732, 0.13262257880568, 0.13280772488473, 0.13299303426466, 0.13317850700566, 0.13336414316789, 0.13354994281151, 0.13373590599668, 0.13392203278354, 0.13410832323222, 0.13429477740285, 0.13448139535555, 0.13466817715042, 0.13485512284758, 0.1350422325071, 0.13522950618907, 0.13541694395357, 0.13560454586066, 0.1357923119704, 0.13598024234284, 0.13616833703801, 0.13635659611595, 0.13654501963669, 0.13673360766023, 0.13692236024658, 0.13711127745574, 0.13730035934769, 0.13748960598243, 0.13767901741991, 0.1378685937201, 0.13805833494295, 0.13824824114841, 0.13843831239643, 0.13862854874691, 0.1388189502598, 0.13900951699499, 0.13920024901239, 0.13939114637189, 0.13958220913339, 0.13977343735675, 0.13996483110185, 0.14015639042855, 0.14034811539669, 0.14054000606613, 0.1407320624967, 0.14092428474822, 0.14111667288051, 0.14130922695338, 0.14150194702664, 0.14169483316008, 0.14188788541347, 0.1420811038466, 0.14227448851923, 0.14246803949112, 0.14266175682203, 0.14285564057169, 0.14304969079984, 0.1432439075662, 0.1434382909305, 0.14363284095243, 0.1438275576917, 0.14402244120801, 0.14421749156102, 0.14441270881043, 0.14460809301589, 0.14480364423707, 0.14499936253361, 0.14519524796516, 0.14539130059135, 0.1455875204718, 0.14578390766613, 0.14598046223395, 0.14617718423485, 0.14637407372844, 0.14657113077429, 0.14676835543198, 0.14696574776107, 0.14716330782113, 0.1473610356717, 0.14755893137232, 0.14775699498253, 0.14795522656186, 0.14815362616982, 0.14835219386591, 0.14855092970965, 0.14874983376051, 0.14894890607799, 0.14914814672157, 0.1493475557507, 0.14954713322485, 0.14974687920346, 0.14994679374599, 0.15014687691187, 0.15034712876051, 0.15054754935135, 0.15074813874378, 0.15094889699722, 0.15114982417105, 0.15135092032467, 0.15155218551743, 0.15175361980873, 0.15195522325791, 0.15215699592433, 0.15235893786734, 0.15256104914627, 0.15276332982044, 0.15296577994918, 0.1531683995918, 0.15337118880761, 0.15357414765589, 0.15377727619594, 0.15398057448704, 0.15418404258845, 0.15438768055945, 0.15459148845928, 0.15479546634718, 0.15499961428241, 0.1552039323242, 0.15540842053175, 0.15561307896429, 0.15581790768103, 0.15602290674116, 0.15622807620387, 0.15643341612835, 0.15663892657376, 0.15684460759928, 0.15705045926407, 0.15725648162726, 0.15746267474802, 0.15766903868546, 0.15787557349872, 0.15808227924691, 0.15828915598914, 0.15849620378452, 0.15870342269213, 0.15891081277107, 0.15911837408041, 0.15932610667922, 0.15953401062657, 0.1597420859815, 0.15995033280307, 0.16015875115031, 0.16036734108225, 0.16057610265791, 0.16078503593631, 0.16099414097645, 0.16120341783734, 0.16141286657795, 0.16162248725728, 0.1618322799343, 0.16204224466797, 0.16225238151725, 0.1624626905411, 0.16267317179845, 0.16288382534825, 0.16309465124941, 0.16330564956085, 0.1635168203415, 0.16372816365024, 0.16393967954598, 0.1641513680876, 0.16436322933399, 0.164575263344, 0.16478747017652, 0.16499984989039, 0.16521240254446, 0.16542512819757, 0.16563802690855, 0.16585109873624, 0.16606434373943, 0.16627776197696, 0.1664913535076, 0.16670511839016, 0.16691905668343, 0.16713316844618, 0.16734745373717, 0.16756191261518, 0.16777654513895, 0.16799135136724, 0.16820633135878, 0.1684214851723, 0.16863681286652, 0.16885231450016, 0.16906799013193, 0.16928383982052, 0.16949986362464, 0.16971606160295, 0.16993243381414, 0.17014898031688, 0.17036570116983, 0.17058259643164, 0.17079966616096, 0.17101691041642, 0.17123432925665, 0.17145192274028, 0.17166969092592, 0.17188763387218, 0.17210575163765, 0.17232404428093, 0.17254251186061, 0.17276115443525, 0.17297997206342, 0.17319896480369, 0.17341813271461, 0.17363747585473, 0.17385699428257, 0.17407668805668, 0.17429655723557, 0.17451660187776, 0.17473682204175, 0.17495721778605, 0.17517778916914, 0.17539853624951, 0.17561945908564, 0.175840557736, 0.17606183225904, 0.17628328271322, 0.17650490915699, 0.17672671164878, 0.17694869024702, 0.17717084501014, 0.17739317599655, 0.17761568326467, 0.17783836687288, 0.17806122687959, 0.17828426334318, 0.17850747632202, 0.17873086587449, 0.17895443205894, 0.17917817493374, 0.17940209455723, 0.17962619098775, 0.17985046428363, 0.1800749145032, 0.18029954170477, 0.18052434594666, 0.18074932728716, 0.18097448578457, 0.18119982149717, 0.18142533448326, 0.18165102480109, 0.18187689250893, 0.18210293766504, 0.18232916032767, 0.18255556055506, 0.18278213840545, 0.18300889393706, 0.18323582720811, 0.18346293827681, 0.18369022720137, 0.18391769403998, 0.18414533885084, 0.18437316169213, 0.18460116262201, 0.18482934169867, 0.18505769898025, 0.18528623452491, 0.1855149483908, 0.18574384063605, 0.18597291131879, 0.18620216049715, 0.18643158822923, 0.18666119457316, 0.18689097958702, 0.18712094332891, 0.18735108585692, 0.18758140722913, 0.1878119075036, 0.1880425867384, 0.18827344499158, 0.18850448232119, 0.18873569878528, 0.18896709444188, 0.18919866934901, 0.1894304235647, 0.18966235714695, 0.18989447015377, 0.19012676264315, 0.19035923467309, 0.19059188630157, 0.19082471758656, 0.19105772858603, 0.19129091935795, 0.19152428996025, 0.1917578404509, 0.19199157088782, 0.19222548132896, 0.19245957183222, 0.19269384245553, 0.1929282932568, 0.19316292429393, 0.19339773562482, 0.19363272730734, 0.19386789939939, 0.19410325195883, 0.19433878504353, 0.19457449871134, 0.19481039302012, 0.19504646802772, 0.19528272379196, 0.19551916037067, 0.19575577782169, 0.19599257620282, 0.19622955557186, 0.19646671598663, 0.19670405750491, 0.19694158018449, 0.19717928408314, 0.19741716925864, 0.19765523576876, 0.19789348367124, 0.19813191302384, 0.19837052388429, 0.19860931631035, 0.19884829035972, 0.19908744609014, 0.19932678355931, 0.19956630282495, 0.19980600394475, 0.2000458869764, 0.20028595197759, 0.20052619900599, 0.20076662811929, 0.20100723937513, 0.20124803283118, 0.20148900854508, 0.20173016657447, 0.201971506977, 0.20221302981029, 0.20245473513195, 0.20269662299961, 0.20293869347087, 0.20318094660332, 0.20342338245456, 0.20366600108217, 0.20390880254373, 0.20415178689681, 0.20439495419898, 0.20463830450779, 0.20488183788079, 0.20512555437552, 0.20536945404952, 0.20561353696031, 0.20585780316542, 0.20610225272236, 0.20634688568863, 0.20659170212174, 0.20683670207917, 0.20708188561842, 0.20732725279696, 0.20757280367226, 0.2078185383018, 0.20806445674301, 0.20831055905336, 0.20855684529029, 0.20880331551123, 0.20904996977361, 0.20929680813486, 0.20954383065239, 0.20979103738361, 0.21003842838592, 0.21028600371671, 0.21053376343337, 0.21078170759328, 0.21102983625381, 0.21127814947233, 0.2115266473062, 0.21177532981277, 0.21202419704938, 0.21227324907337, 0.21252248594208, 0.21277190771283, 0.21302151444293, 0.2132713061897, 0.21352128301044, 0.21377144496244, 0.21402179210299, 0.21427232448938, 0.21452304217888, 0.21477394522876, 0.21502503369628, 0.2152763076387, 0.21552776711326, 0.2157794121772, 0.21603124288777, 0.21628325930217, 0.21653546147765, 0.2167878494714, 0.21704042334063, 0.21729318314255, 0.21754612893434, 0.21779926077319, 0.21805257871628, 0.21830608282078, 0.21855977314386, 0.21881364974267, 0.21906771267436, 0.21932196199608, 0.21957639776497, 0.21983102003816, 0.22008582887276, 0.2203408243259, 0.22059600645469, 0.22085137531622, 0.2211069309676, 0.22136267346591, 0.22161860286824, 0.22187471923167, 0.22213102261325, 0.22238751307005, 0.22264419065914, 0.22290105543755, 0.22315810746232, 0.2234153467905, 0.22367277347911, 0.22393038758517, 0.22418818916569, 0.22444617827769, 0.22470435497816, 0.2249627193241, 0.22522127137249, 0.22548001118031, 0.22573893880455, 0.22599805430215, 0.22625735773009, 0.22651684914532, 0.22677652860479, 0.22703639616542, 0.22729645188416, 0.22755669581794, 0.22781712802366, 0.22807774855825, 0.22833855747861, 0.22859955484164, 0.22886074070423, 0.22912211512327, 0.22938367815563, 0.22964542985819, 0.22990737028781, 0.23016949950136, 0.23043181755568, 0.23069432450762, 0.23095702041402, 0.23121990533171, 0.23148297931752, 0.23174624242825, 0.23200969472074, 0.23227333625177, 0.23253716707816, 0.23280118725668, 0.23306539684413, 0.23332979589729, 0.23359438447292, 0.23385916262779, 0.23412413041866, 0.23438928790228, 0.2346546351354, 0.23492017217476, 0.23518589907707, 0.23545181589909, 0.23571792269751, 0.23598421952905, 0.23625070645042, 0.23651738351831, 0.23678425078942, 0.23705130832044, 0.23731855616803, 0.23758599438888, 0.23785362303965, 0.23812144217699, 0.23838945185757, 0.23865765213802, 0.23892604307498, 0.23919462472509, 0.23946339714498, 0.23973236039125, 0.24000151452053, 0.24027085958942, 0.24054039565452, 0.24081012277242, 0.24108004099971, 0.24135015039297, 0.24162045100878, 0.24189094290369, 0.24216162613427, 0.24243250075707, 0.24270356682864, 0.24297482440552, 0.24324627354424, 0.24351791430133, 0.24378974673332, 0.2440617708967, 0.24433398684801, 0.24460639464372, 0.24487899434035, 0.24515178599437, 0.24542476966227, 0.24569794540053, 0.24597131326561, 0.24624487331397, 0.24651862560207, 0.24679257018636, 0.24706670712328, 0.24734103646927, 0.24761555828076, 0.24789027261416, 0.24816517952591, 0.2484402790724, 0.24871557131004, 0.24899105629522, 0.24926673408435, 0.2495426047338, 0.24981866829995, 0.25009492483917, 0.25037137440782, 0.25064801706228, 0.25092485285887, 0.25120188185396, 0.25147910410388, 0.25175651966497, 0.25203412859354, 0.25231193094593, 0.25258992677844, 0.25286811614737, 0.25314649910904, 0.25342507571973, 0.25370384603573, 0.25398281011333, 0.25426196800879, 0.25454131977839, 0.25482086547839, 0.25510060516504, 0.2553805388946, 0.2556606667233, 0.25594098870738, 0.25622150490307, 0.2565022153666, 0.25678312015418, 0.25706421932203, 0.25734551292634, 0.25762700102332, 0.25790868366916, 0.25819056092004, 0.25847263283214, 0.25875489946164, 0.25903736086469, 0.25932001709747, 0.25960286821613, 0.2598859142768, 0.26016915533564, 0.26045259144878, 0.26073622267234, 0.26102004906245, 0.26130407067522, 0.26158828756677, 0.26187269979319, 0.26215730741058, 0.26244211047503, 0.26272710904263, 0.26301230316946, 0.26329769291158, 0.26358327832505, 0.26386905946595, 0.26415503639032, 0.26444120915421, 0.26472757781365, 0.26501414242469, 0.26530090304334, 0.26558785972563, 0.26587501252758, 0.26616236150519, 0.26644990671446, 0.26673764821139, 0.26702558605198, 0.26731372029219, 0.26760205098802, 0.26789057819543, 0.26817930197039, 0.26846822236885, 0.26875733944677, 0.26904665326009, 0.26933616386475, 0.26962587131669, 0.26991577567184, 0.2702058769861, 0.27049617531541, 0.27078667071566, 0.27107736324276, 0.27136825295261, 0.27165933990109, 0.27195062414409, 0.27224210573749, 0.27253378473716, 0.27282566119896, 0.27311773517875, 0.27341000673238, 0.27370247591571, 0.27399514278457, 0.27428800739479, 0.27458106980221, 0.27487433006264, 0.2751677882319, 0.2754614443658, 0.27575529852014, 0.27604935075072, 0.27634360111334, 0.27663804966377, 0.27693269645779, 0.27722754155118, 0.2775225849997, 0.27781782685912, 0.27811326718518, 0.27840890603364, 0.27870474346023, 0.27900077952069, 0.27929701427076, 0.27959344776615, 0.27989008006258, 0.28018691121576, 0.2804839412814, 0.2807811703152, 0.28107859837285, 0.28137622551003, 0.28167405178242, 0.28197207724571, 0.28227030195556, 0.28256872596762, 0.28286734933757, 0.28316617212104, 0.28346519437368, 0.28376441615112, 0.28406383750901, 0.28436345850296, 0.2846632791886, 0.28496329962154, 0.28526351985738, 0.28556393995173, 0.28586455996018, 0.28616537993832, 0.28646639994174, 0.28676762002601, 0.2870690402467, 0.28737066065938, 0.2876724813196, 0.28797450228293, 0.2882767236049, 0.28857914534106, 0.28888176754694, 0.28918459027807, 0.28948761358997, 0.28979083753816, 0.29009426217816, 0.29039788756545, 0.29070171375556, 0.29100574080395, 0.29130996876613, 0.29161439769758, 0.29191902765376, 0.29222385869015, 0.2925288908622, 0.29283412422539, 0.29313955883514, 0.29344519474692, 0.29375103201616, 0.29405707069829, 0.29436331084873, 0.29466975252292, 0.29497639577626, 0.29528324066416, 0.29559028724203, 0.29589753556525, 0.29620498568923, 0.29651263766935, 0.29682049156098, 0.29712854741951, 0.29743680530028, 0.29774526525868, 0.29805392735004, 0.29836279162973, 0.29867185815308, 0.29898112697543, 0.29929059815212, 0.29960027173846, 0.29991014778978, 0.30022022636139, 0.3005305075086, 0.3008409912867, 0.30115167775101, 0.3014625669568, 0.30177365895935, 0.30208495381396, 0.30239645157588, 0.30270815230039, 0.30302005604275, 0.3033321628582, 0.30364447280201, 0.3039569859294, 0.30426970229563, 0.30458262195591, 0.30489574496547, 0.30520907137954, 0.30552260125332, 0.30583633464203, 0.30615027160086, 0.30646441218501, 0.30677875644966, 0.30709330445002, 0.30740805624124, 0.30772301187851, 0.30803817141698, 0.30835353491183, 0.3086691024182, 0.30898487399124, 0.3093008496861, 0.30961702955791, 0.30993341366181, 0.31025000205291, 0.31056679478634, 0.31088379191722, 0.31120099350065, 0.31151839959172, 0.31183601024555, 0.31215382551721, 0.3124718454618, 0.31279007013439, 0.31310849959006, 0.31342713388386, 0.31374597307087, 0.31406501720614, 0.31438426634472, 0.31470372054165, 0.31502337985197, 0.31534324433071, 0.3156633140329, 0.31598358901356, 0.31630406932771, 0.31662475503035, 0.31694564617648, 0.31726674282111, 0.31758804501923, 0.31790955282582, 0.31823126629587, 0.31855318548434, 0.31887531044621, 0.31919764123644, 0.31952017790998, 0.3198429205218, 0.32016586912682, 0.32048902378001, 0.32081238453628, 0.32113595145056, 0.32145972457779, 0.32178370397287, 0.32210788969072, 0.32243228178624, 0.32275688031434, 0.32308168532991, 0.32340669688783, 0.32373191504299, 0.32405733985026, 0.32438297136452, 0.32470880964064, 0.32503485473347, 0.32536110669786, 0.32568756558867, 0.32601423146073, 0.32634110436889, 0.32666818436797, 0.32699547151281, 0.32732296585822, 0.32765066745901, 0.32797857637, 0.32830669264598, 0.32863501634176, 0.32896354751213, 0.32929228621186, 0.32962123249575, 0.32995038641856, 0.33027974803507, 0.33060931740004, 0.33093909456822, 0.33126907959438, 0.33159927253324, 0.33192967343956, 0.33226028236807, 0.3325910993735, 0.33292212451057, 0.33325335783399, 0.3335847993985, 0.33391644925878, 0.33424830746954, 0.33458037408548, 0.33491264916128, 0.33524513275163, 0.33557782491121, 0.33591072569469, 0.33624383515674, 0.33657715335202, 0.33691068033519, 0.33724441616089, 0.33757836088377, 0.33791251455847, 0.33824687723963, 0.33858144898187, 0.33891622983982, 0.33925121986808, 0.33958641912128, 0.33992182765402, 0.3402574455209, 0.34059327277651, 0.34092930947544, 0.34126555567227, 0.34160201142159, 0.34193867677797, 0.34227555179597, 0.34261263653014, 0.34294993103506, 0.34328743536527, 0.34362514957531, 0.34396307371972, 0.34430120785303, 0.34463955202978, 0.34497810630448, 0.34531687073165, 0.3456558453658, 0.34599503026144, 0.34633442547307, 0.34667403105518, 0.34701384706226, 0.34735387354879, 0.34769411056926, 0.34803455817813, 0.34837521642987, 0.34871608537894, 0.3490571650798, 0.3493984555869, 0.34973995695468, 0.35008166923759, 0.35042359249004, 0.35076572676648, 0.35110807212133, 0.351450628609, 0.35179339628391, 0.35213637520045, 0.35247956541304, 0.35282296697607, 0.35316657994392, 0.35351040437098, 0.35385444031163, 0.35419868782024, 0.35454314695118, 0.35488781775882, 0.35523270029751, 0.35557779462159, 0.35592310078542, 0.35626861884334, 0.35661434884968, 0.35696029085877, 0.35730644492494, 0.35765281110249, 0.35799938944576, 0.35834618000904, 0.35869318284664, 0.35904039801284, 0.35938782556196, 0.35973546554826, 0.36008331802603, 0.36043138304955, 0.36077966067308, 0.36112815095089, 0.36147685393724, 0.36182576968638, 0.36217489825256, 0.36252423969002, 0.362873794053, 0.36322356139573, 0.36357354177243, 0.36392373523733, 0.36427414184463, 0.36462476164857, 0.36497559470332, 0.3653266410631, 0.3656779007821, 0.36602937391451, 0.3663810605145, 0.36673296063627, 0.36708507433397, 0.36743740166178, 0.36778994267385, 0.36814269742435, 0.36849566596742, 0.36884884835721, 0.36920224464786, 0.3695558548935, 0.36990967914827, 0.37026371746628, 0.37061796990165, 0.3709724365085, 0.37132711734094, 0.37168201245306, 0.37203712189897, 0.37239244573275, 0.37274798400849, 0.37310373678028, 0.37345970410218, 0.37381588602827, 0.37417228261261, 0.37452889390927, 0.37488571997229, 0.37524276085572, 0.37560001661362, 0.37595748730001, 0.37631517296893, 0.3766730736744, 0.37703118947046, 0.37738952041111, 0.37774806655036, 0.37810682794223, 0.37846580464072, 0.37882499669981, 0.37918440417351, 0.37954402711578, 0.37990386558063, 0.38026391962201, 0.38062418929389, 0.38098467465025, 0.38134537574504, 0.38170629263222, 0.38206742536572, 0.38242877399949, 0.38279033858748, 0.38315211918361, 0.38351411584181, 0.383876328616, 0.3842387575601, 0.38460140272801, 0.38496426417365, 0.38532734195091, 0.38569063611369, 0.38605414671587, 0.38641787381135, 0.38678181745401, 0.38714597769771, 0.38751035459632, 0.38787494820372, 0.38823975857375, 0.38860478576027, 0.38897002981712, 0.38933549079816, 0.38970116875722, 0.39006706374812, 0.39043317582471, 0.39079950504079, 0.39116605145018, 0.3915328151067, 0.39189979606415, 0.39226699437633, 0.39263441009704, 0.39300204328007, 0.3933698939792, 0.39373796224821, 0.39410624814088, 0.39447475171098, 0.39484347301227, 0.3952124120985, 0.39558156902344, 0.39595094384084, 0.39632053660442, 0.39669034736794, 0.39706037618513, 0.39743062310971, 0.39780108819541, 0.39817177149594, 0.39854267306501, 0.39891379295634, 0.39928513122363, 0.39965668792057, 0.40002846310085, 0.40040045681815, 0.40077266912617, 0.40114510007858, 0.40151774972904, 0.40189061813123, 0.4022637053388, 0.40263701140541, 0.40301053638471, 0.40338428033034, 0.40375824329594, 0.40413242533516, 0.40450682650161, 0.40488144684892, 0.40525628643071, 0.40563134530061, 0.4060066235122, 0.4063821211191, 0.40675783817491, 0.40713377473322, 0.40750993084762, 0.4078863065717, 0.40826290195902, 0.40863971706316, 0.4090167519377, 0.40939400663619, 0.40977148121219, 0.41014917571926, 0.41052709021094, 0.41090522474077, 0.4112835793623, 0.41166215412905, 0.41204094909454, 0.41241996431232, 0.41279919983588, 0.41317865571874, 0.4135583320144, 0.41393822877638, 0.41431834605816, 0.41469868391324, 0.41507924239511, 0.41546002155723, 0.4158410214531, 0.41622224213618, 0.41660368365993, 0.41698534607783, 0.41736722944331, 0.41774933380984, 0.41813165923087, 0.41851420575982, 0.41889697345014, 0.41927996235525, 0.41966317252859, 0.42004660402357, 0.4204302568936, 0.42081413119211, 0.42119822697248, 0.42158254428813, 0.42196708319245, 0.42235184373882, 0.42273682598064, 0.42312202997128, 0.42350745576412, 0.42389310341253, 0.42427897296987, 0.4246650644895, 0.42505137802478, 0.42543791362905, 0.42582467135567, 0.42621165125797, 0.42659885338928, 0.42698627780293, 0.42737392455226, 0.42776179369058, 0.4281498852712, 0.42853819934743, 0.42892673597259, 0.42931549519996, 0.42970447708284, 0.43009368167452, 0.43048310902829, 0.43087275919743, 0.4312626322352, 0.43165272819489, 0.43204304712975, 0.43243358909304, 0.43282435413803, 0.43321534231795, 0.43360655368605, 0.43399798829558, 0.43438964619976, 0.43478152745183, 0.43517363210501, 0.43556596021252, 0.43595851182758, 0.4363512870034, 0.43674428579317, 0.43713750825011, 0.4375309544274, 0.43792462437823, 0.4383185181558, 0.43871263581327, 0.43910697740383, 0.43950154298065, 0.43989633259688, 0.4402913463057, 0.44068658416025, 0.44108204621369, 0.44147773251916, 0.44187364312981, 0.44226977809876, 0.44266613747915, 0.4430627213241, 0.44345952968674, 0.44385656262017, 0.44425382017752, 0.44465130241189, 0.44504900937637, 0.44544694112407, 0.44584509770807, 0.44624347918146, 0.44664208559733, 0.44704091700875, 0.44743997346879, 0.44783925503051, 0.44823876174698, 0.44863849367126, 0.4490384508564, 0.44943863335544, 0.44983904122143, 0.4502396745074, 0.45064053326639, 0.45104161755143, 0.45144292741553, 0.45184446291171, 0.45224622409299, 0.45264821101237, 0.45305042372286, 0.45345286227746, 0.45385552672916, 0.45425841713094, 0.45466153353579, 0.4550648759967, 0.45546844456662, 0.45587223929854, 0.45627626024541, 0.4566805074602, 0.45708498099586, 0.45748968090533, 0.45789460724157, 0.45829976005752, 0.4587051394061, 0.45911074534024, 0.45951657791288, 0.45992263717694, 0.46032892318532, 0.46073543599094, 0.46114217564671, 0.46154914220552, 0.46195633572028, 0.46236375624386, 0.46277140382917, 0.46317927852908, 0.46358738039647, 0.46399570948421, 0.46440426584516, 0.4648130495322, 0.46522206059817, 0.46563129909593, 0.46604076507833, 0.46645045859821, 0.46686037970841, 0.46727052846176, 0.46768090491109, 0.46809150910922, 0.46850234110898, 0.46891340096318, 0.46932468872462, 0.46973620444612, 0.47014794818046, 0.47055991998046, 0.47097211989889, 0.47138454798854, 0.47179720430219, 0.47221008889263, 0.47262320181261, 0.47303654311491, 0.47345011285228, 0.47386391107749, 0.47427793784329, 0.47469219320242, 0.47510667720762, 0.47552138991164, 0.4759363313672, 0.47635150162704, 0.47676690074387, 0.47718252877042, 0.4775983857594, 0.47801447176352, 0.47843078683548, 0.47884733102798, 0.47926410439372, 0.47968110698539, 0.48009833885567, 0.48051580005724, 0.48093349064278, 0.48135141066496, 0.48176956017644, 0.4821879392299, 0.48260654787797, 0.48302538617333, 0.4834444541686, 0.48386375191645, 0.48428327946949, 0.48470303688038, 0.48512302420173, 0.48554324148617, 0.48596368878631, 0.48638436615478, 0.48680527364418, 0.48722641130712, 0.4876477791962, 0.488069377364, 0.48849120586313, 0.48891326474617, 0.4893355540657, 0.48975807387429, 0.49018082422452, 0.49060380516896, 0.49102701676017, 0.4914504590507, 0.49187413209311, 0.49229803593995, 0.49272217064376, 0.49314653625707, 0.49357113283243, 0.49399596042237, 0.4944210190794, 0.49484630885605, 0.49527182980484, 0.49569758197827, 0.49612356542885, 0.49654978020909, 0.49697622637147, 0.4974029039685, 0.49782981305266, 0.49825695367642, 0.49868432589228, 0.4991119297527, 0.49953976531016, 0.49996783261711, 0.50039613172602, 0.50082466268933, 0.50125342555951, 0.501682420389, 0.50211164723024, 0.50254110613565, 0.50297079715769, 0.50340072034877, 0.50383087576131, 0.50426126344773, 0.50469188346045, 0.50512273585188, 0.50555382067441, 0.50598513798045, 0.50641668782239, 0.50684847025262, 0.50728048532353, 0.5077127330875, 0.5081452135969, 0.5085779269041, 0.50901087306148, 0.50944405212138, 0.50987746413618, 0.51031110915823, 0.51074498723987, 0.51117909843344, 0.51161344279129, 0.51204802036574, 0.51248283120914, 0.5129178753738, 0.51335315291205, 0.5137886638762, 0.51422440831856, 0.51466038629144, 0.51509659784714, 0.51553304303796, 0.5159697219162, 0.51640663453413, 0.51684378094405, 0.51728116119824, 0.51771877534896, 0.5181566234485, 0.51859470554911, 0.51903302170305, 0.51947157196259, 0.51991035637997, 0.52034937500744, 0.52078862789725, 0.52122811510162, 0.52166783667281, 0.52210779266303, 0.52254798312451, 0.52298840810946, 0.52342906767012, 0.52386996185867, 0.52431109072734, 0.52475245432832, 0.52519405271381, 0.52563588593601, 0.52607795404709, 0.52652025709925, 0.52696279514466, 0.5274055682355, 0.52784857642394, 0.52829181976214, 0.52873529830226, 0.52917901209646, 0.52962296119689, 0.5300671456557, 0.53051156552503, 0.53095622085702, 0.5314011117038, 0.53184623811751, 0.53229160015026, 0.53273719785417, 0.53318303128137, 0.53362910048396, 0.53407540551404, 0.53452194642373, 0.53496872326512, 0.53541573609029, 0.53586298495135, 0.53631046990037, 0.53675819098943, 0.53720614827061, 0.53765434179597, 0.53810277161759, 0.53855143778752, 0.53900034035783, 0.53944947938056, 0.53989885490776, 0.54034846699147, 0.54079831568374, 0.5412484010366, 0.54169872310208, 0.5421492819322, 0.54260007757898, 0.54305111009445, 0.54350237953061, 0.54395388593946, 0.54440562937303, 0.54485760988329, 0.54530982752225, 0.5457622823419, 0.54621497439422, 0.54666790373118, 0.54712107040478, 0.54757447446698, 0.54802811596974, 0.54848199496503, 0.54893611150481, 0.54939046564103, 0.54984505742564, 0.55029988691059, 0.55075495414782, 0.55121025918926, 0.55166580208684, 0.55212158289249, 0.55257760165814, 0.5530338584357, 0.55349035327709, 0.55394708623421, 0.55440405735898, 0.55486126670328, 0.55531871431903, 0.5557764002581, 0.55623432457239, 0.55669248731377, 0.55715088853414, 0.55760952828536, 0.55806840661929, 0.55852752358782, 0.55898687924279, 0.55944647363606, 0.55990630681949, 0.56036637884492, 0.5608266897642, 0.56128723962916, 0.56174802849164, 0.56220905640347, 0.56267032341647, 0.56313182958246, 0.56359357495327, 0.5640555595807, 0.56451778351656, 0.56498024681266, 0.56544294952078, 0.56590589169274, 0.56636907338031, 0.56683249463529, 0.56729615550945, 0.56776005605458, 0.56822419632244, 0.5686885763648, 0.56915319623344, 0.56961805598009, 0.57008315565653, 0.5705484953145, 0.57101407500575, 0.57147989478202, 0.57194595469505, 0.57241225479657, 0.57287879513832, 0.573345575772, 0.57381259674935, 0.57427985812208, 0.57474735994191, 0.57521510226053, 0.57568308512966, 0.57615130860098, 0.5766197727262, 0.577088477557, 0.57755742314508, 0.5780266095421, 0.57849603679975, 0.57896570496969, 0.57943561410361, 0.57990576425315, 0.58037615546998, 0.58084678780576, 0.58131766131213, 0.58178877604074, 0.58226013204324, 0.58273172937125, 0.58320356807642, 0.58367564821037, 0.58414796982473, 0.58462053297111, 0.58509333770113, 0.58556638406641, 0.58603967211855, 0.58651320190916, 0.58698697348982, 0.58746098691214, 0.58793524222771, 0.58840973948811, 0.58888447874493, 0.58935946004973, 0.5898346834541, 0.5903101490096, 0.5907858567678, 0.59126180678025, 0.59173799909851, 0.59221443377413, 0.59269111085866, 0.59316803040364, 0.59364519246061, 0.59412259708111, 0.59460024431666, 0.59507813421878, 0.59555626683901, 0.59603464222885, 0.59651326043982, 0.59699212152342, 0.59747122553117, 0.59795057251456, 0.59843016252508, 0.59890999561423, 0.59939007183349, 0.59987039123435, 0.60035095386828, 0.60083175978676, 0.60131280904126, 0.60179410168324, 0.60227563776417, 0.6027574173355, 0.60323944044868, 0.60372170715517, 0.6042042175064, 0.60468697155381, 0.60516996934885, 0.60565321094295, 0.60613669638752, 0.60662042573399, 0.60710439903379, 0.60758861633832, 0.608073077699, 0.60855778316724, 0.60904273279442, 0.60952792663196, 0.61001336473124, 0.61049904714365, 0.61098497392058, 0.6114711451134, 0.61195756077351, 0.61244422095225, 0.61293112570101, 0.61341827507115, 0.61390566911402, 0.61439330788099, 0.61488119142339, 0.61536931979259, 0.61585769303991, 0.61634631121671, 0.61683517437431, 0.61732428256403, 0.61781363583722, 0.61830323424519, 0.61879307783925, 0.61928316667072, 0.61977350079091, 0.62026408025111, 0.62075490510265, 0.62124597539679, 0.62173729118485, 0.62222885251811, 0.62272065944784, 0.62321271202534, 0.62370501030187, 0.6241975543287, 0.62469034415711, 0.62518337983835, 0.62567666142368, 0.62617018896436, 0.62666396251164, 0.62715798211676, 0.62765224783096, 0.62814675970548, 0.62864151779155, 0.62913652214041, 0.62963177280327, 0.63012726983136, 0.6306230132759, 0.63111900318809, 0.63161523961915, 0.63211172262027, 0.63260845224266, 0.63310542853751, 0.63360265155602, 0.63410012134937, 0.63459783796874, 0.63509580146532, 0.63559401189028, 0.63609246929478, 0.63659117373, 0.63709012524709, 0.63758932389722, 0.63808876973154, 0.6385884628012, 0.63908840315734, 0.63958859085111, 0.64008902593364, 0.64058970845606, 0.64109063846951, 0.64159181602511, 0.64209324117399, 0.64259491396724, 0.643096834456, 0.64359900269137, 0.64410141872445, 0.64460408260634, 0.64510699438813, 0.64561015412093, 0.64611356185582, 0.64661721764387, 0.64712112153618, 0.64762527358381, 0.64812967383784, 0.64863432234933, 0.64913921916935, 0.64964436434895, 0.6501497579392, 0.65065539999113, 0.6511612905558, 0.65166742968425, 0.65217381742752, 0.65268045383664, 0.65318733896264, 0.65369447285655, 0.65420185556939, 0.65470948715217, 0.65521736765592, 0.65572549713163, 0.65623387563033, 0.65674250320299, 0.65725137990063, 0.65776050577424, 0.65826988087481, 0.65877950525331, 0.65928937896074, 0.65979950204806, 0.66030987456626, 0.6608204965663, 0.66133136809914, 0.66184248921574, 0.66235385996707, 0.66286548040406, 0.66337735057768, 0.66388947053887, 0.66440184033856, 0.66491446002769, 0.66542732965719, 0.665940449278, 0.66645381894103, 0.6669674386972, 0.66748130859743, 0.66799542869264, 0.66850979903372, 0.66902441967159, 0.66953929065713, 0.67005441204126, 0.67056978387485, 0.6710854062088, 0.67160127909398, 0.67211740258129, 0.67263377672158, 0.67315040156574, 0.67366727716463, 0.67418440356911, 0.67470178083004, 0.67521940899828, 0.67573728812468, 0.67625541826008, 0.67677379945533, 0.67729243176127, 0.67781131522872, 0.67833044990852, 0.67884983585151, 0.67936947310849, 0.67988936173029, 0.68040950176772, 0.68092989327159, 0.68145053629271, 0.68197143088189, 0.68249257708991, 0.68301397496758, 0.68353562456568, 0.68405752593501, 0.68457967912633, 0.68510208419044, 0.6856247411781, 0.68614765014009, 0.68667081112717, 0.6871942241901, 0.68771788937965, 0.68824180674656, 0.68876597634159, 0.68929039821548, 0.68981507241897, 0.69033999900281, 0.69086517801772, 0.69139060951444, 0.69191629354369, 0.6924422301562, 0.69296841940269, 0.69349486133386, 0.69402155600042, 0.69454850345309, 0.69507570374257, 0.69560315691955, 0.69613086303473, 0.6966588221388, 0.69718703428244, 0.69771549951635, 0.69824421789118, 0.69877318945763, 0.69930241426635, 0.69983189236803, 0.70036162381331, 0.70089160865286, 0.70142184693733, 0.70195233871737, 0.70248308404363, 0.70301408296675, 0.70354533553737, 0.70407684180613, 0.70460860182365, 0.70514061564056, 0.70567288330749, 0.70620540487505, 0.70673818039385, 0.70727120991452, 0.70780449348765, 0.70833803116385, 0.70887182299372, 0.70940586902785, 0.70994016931683, 0.71047472391125, 0.7110095328617, 0.71154459621875, 0.71207991403298, 0.71261548635496, 0.71315131323526, 0.71368739472443, 0.71422373087305, 0.71476032173166, 0.71529716735082, 0.71583426778107, 0.71637162307296, 0.71690923327704, 0.71744709844382, 0.71798521862386, 0.71852359386766, 0.71906222422577, 0.71960110974869, 0.72014025048695, 0.72067964649106, 0.72121929781153, 0.72175920449885, 0.72229936660354, 0.72283978417608, 0.72338045726698, 0.72392138592671, 0.72446257020577, 0.72500401015464, 0.72554570582379, 0.72608765726369, 0.72662986452482, 0.72717232765764, 0.72771504671262, 0.7282580217402, 0.72880125279085, 0.72934473991501, 0.72988848316313, 0.73043248258565, 0.73097673823301, 0.73152125015565, 0.73206601840399, 0.73261104302846, 0.73315632407948, 0.73370186160748, 0.73424765566286, 0.73479370629604, 0.73534001355743, 0.73588657749742, 0.73643339816642, 0.73698047561482, 0.73752780989302, 0.73807540105139, 0.73862324914034, 0.73917135421023, 0.73971971631144, 0.74026833549434, 0.7408172118093, 0.74136634530669, 0.74191573603687, 0.74246538405019, 0.74301528939701, 0.74356545212767, 0.74411587229252, 0.7446665499419, 0.74521748512615, 0.7457686778956, 0.74632012830059, 0.74687183639143, 0.74742380221845, 0.74797602583196, 0.74852850728229, 0.74908124661974, 0.74963424389462, 0.75018749915723, 0.75074101245787, 0.75129478384684, 0.75184881337442, 0.7524031010909, 0.75295764704657, 0.75351245129171, 0.75406751387658, 0.75462283485148, 0.75517841426665, 0.75573425217237, 0.7562903486189, 0.75684670365648, 0.75740331733539, 0.75796018970586, 0.75851732081814, 0.75907471072247, 0.75963235946909, 0.76019026710824, 0.76074843369013, 0.761306859265, 0.76186554388308, 0.76242448759457, 0.76298369044969, 0.76354315249866, 0.76410287379168, 0.76466285437895, 0.76522309431068, 0.76578359363705, 0.76634435240827, 0.76690537067451, 0.76746664848597, 0.76802818589281, 0.76858998294523, 0.76915203969339, 0.76971435618745, 0.7702769324776, 0.77083976861397, 0.77140286464675, 0.77196622062607, 0.77252983660208, 0.77309371262494, 0.77365784874479, 0.77422224501176, 0.77478690147599, 0.77535181818761, 0.77591699519674, 0.77648243255352, 0.77704813030805, 0.77761408851046, 0.77818030721085, 0.77874678645935, 0.77931352630604, 0.77988052680103, 0.78044778799442, 0.78101530993629, 0.78158309267675, 0.78215113626588, 0.78271944075374, 0.78328800619044, 0.78385683262603, 0.7844259201106, 0.78499526869419, 0.78556487842689, 0.78613474935875, 0.78670488153982, 0.78727527502015, 0.7878459298498, 0.7884168460788, 0.7889880237572, 0.78955946293504, 0.79013116366234, 0.79070312598914, 0.79127534996546, 0.79184783564132, 0.79242058306674, 0.79299359229174, 0.79356686336632, 0.79414039634049, 0.79471419126426, 0.79528824818762, 0.79586256716057, 0.7964371482331, 0.7970119914552, 0.79758709687685, 0.79816246454804, 0.79873809451873, 0.79931398683891, 0.79989014155853, 0.80046655872758, 0.801043238396, 0.80162018061376, 0.80219738543082, 0.80277485289711, 0.80335258306259, 0.8039305759772, 0.80450883169089, 0.80508735025358, 0.80566613171521, 0.8062451761257, 0.80682448353499, 0.80740405399299, 0.80798388754962, 0.80856398425479, 0.80914434415841, 0.80972496731039, 0.81030585376063, 0.81088700355903, 0.81146841675549, 0.81205009339988, 0.81263203354211, 0.81321423723206, 0.8137967045196, 0.81437943545461, 0.81496243008697, 0.81554568846654, 0.81612921064319, 0.81671299666678, 0.81729704658716, 0.8178813604542, 0.81846593831774, 0.81905078022763, 0.81963588623371, 0.82022125638583, 0.82080689073381, 0.82139278932749, 0.82197895221669, 0.82256537945125, 0.82315207108098, 0.8237390271557, 0.82432624772523, 0.82491373283936, 0.82550148254792, 0.8260894969007, 0.8266777759475, 0.82726631973811, 0.82785512832233, 0.82844420174995, 0.82903354007075, 0.82962314333451, 0.830213011591, 0.83080314489, 0.83139354328128, 0.83198420681461, 0.83257513553975, 0.83316632950645, 0.83375778876447, 0.83434951336356, 0.83494150335347, 0.83553375878394, 0.83612627970472, 0.83671906616554, 0.83731211821613, 0.83790543590622, 0.83849901928554, 0.83909286840381, 0.83968698331074, 0.84028136405606, 0.84087601068947, 0.84147092326068, 0.8420661018194, 0.84266154641532, 0.84325725709814, 0.84385323391755, 0.84444947692325, 0.84504598616491, 0.84564276169222, 0.84623980355487, 0.84683711180251, 0.84743468648483, 0.84803252765149, 0.84863063535215, 0.84922900963648, 0.84982765055413, 0.85042655815475, 0.851025732488, 0.85162517360351, 0.85222488155094, 0.85282485637992, 0.85342509814007, 0.85402560688105, 0.85462638265246, 0.85522742550394, 0.85582873548511, 0.85643031264558, 0.85703215703497, 0.85763426870288, 0.85823664769892, 0.8588392940727, 0.8594422078738, 0.86004538915184, 0.86064883795639, 0.86125255433704, 0.86185653834339, 0.86246079002501, 0.86306530943147, 0.86367009661236, 0.86427515161723, 0.86488047449566, 0.86548606529721, 0.86609192407144, 0.8666980508679, 0.86730444573615, 0.86791110872573, 0.86851803988619, 0.86912523926706, 0.86973270691789, 0.87034044288821, 0.87094844722756, 0.87155671998544, 0.8721652612114, 0.87277407095495, 0.8733831492656, 0.87399249619287, 0.87460211178626, 0.87521199609529, 0.87582214916945, 0.87643257105824, 0.87704326181115, 0.87765422147768, 0.87826545010732, 0.87887694774954, 0.87948871445382, 0.88010075026965, 0.8807130552465, 0.88132562943383, 0.88193847288112, 0.88255158563782, 0.88316496775339, 0.88377861927729, 0.88439254025897, 0.88500673074788, 0.88562119079346, 0.88623592044515, 0.88685091975239, 0.88746618876462, 0.88808172753126, 0.88869753610175, 0.88931361452549, 0.88992996285193, 0.89054658113046, 0.8911634694105, 0.89178062774147, 0.89239805617276, 0.89301575475378, 0.89363372353393, 0.8942519625626, 0.89487047188919, 0.89548925156308, 0.89610830163365, 0.89672762215028, 0.89734721316236, 0.89796707471926, 0.89858720687034, 0.89920760966498, 0.89982828315253, 0.90044922738236, 0.90107044240382, 0.90169192826626, 0.90231368501904, 0.90293571271149, 0.90355801139296, 0.9041805811128, 0.90480342192032, 0.90542653386487, 0.90604991699577, 0.90667357136235, 0.90729749701392, 0.90792169399981, 0.90854616236932, 0.90917090217177, 0.90979591345647, 0.91042119627271, 0.91104675066981, 0.91167257669704, 0.91229867440371, 0.9129250438391, 0.91355168505251, 0.91417859809321, 0.91480578301048, 0.91543323985359, 0.91606096867182, 0.91668896951444, 0.91731724243071, 0.91794578746989, 0.91857460468124, 0.91920369411401, 0.91983305581745, 0.92046268984082, 0.92109259623335, 0.92172277504428, 0.92235322632286, 0.92298395011831, 0.92361494647986, 0.92424621545674, 0.92487775709817, 0.92550957145338, 0.92614165857157, 0.92677401850196, 0.92740665129376, 0.92803955699618, 0.92867273565841, 0.92930618732965, 0.9299399120591, 0.93057390989595, 0.93120818088939, 0.9318427250886, 0.93247754254276, 0.93311263330105, 0.93374799741265, 0.93438363492672, 0.93501954589243, 0.93565573035895, 0.93629218837543, 0.93692891999104, 0.93756592525492, 0.93820320421622, 0.9388407569241, 0.93947858342768, 0.94011668377613, 0.94075505801856, 0.94139370620411, 0.94203262838191, 0.94267182460109, 0.94331129491077, 0.94395103936006, 0.94459105799809, 0.94523135087395, 0.94587191803677, 0.94651275953565, 0.94715387541968, 0.94779526573797, 0.94843693053961, 0.94907886987369, 0.9497210837893, 0.95036357233552, 0.95100633556143, 0.95164937351612, 0.95229268624865, 0.95293627380809, 0.95358013624352, 0.95422427360399, 0.95486868593856, 0.9555133732963, 0.95615833572626, 0.95680357327747, 0.957449085999, 0.95809487393989, 0.95874093714916, 0.95938727567587, 0.96003388956904, 0.9606807788777, 0.96132794365088, 0.9619753839376, 0.96262309978687, 0.96327109124772, 0.96391935836916, 0.96456790120019, 0.96521671978982, 0.96586581418706, 0.96651518444089, 0.96716483060032, 0.96781475271434, 0.96846495083193, 0.96911542500208, 0.96976617527377, 0.97041720169599, 0.97106850431769, 0.97172008318786, 0.97237193835547, 0.97302406986947, 0.97367647777883, 0.97432916213251, 0.97498212297945, 0.97563536036862, 0.97628887434896, 0.9769426649694, 0.9775967322789, 0.97825107632639, 0.9789056971608, 0.97956059483107, 0.98021576938612, 0.98087122087487, 0.98152694934625, 0.98218295484916, 0.98283923743254, 0.98349579714528, 0.98415263403628, 0.98480974815447, 0.98546713954873, 0.98612480826796, 0.98678275436105, 0.9874409778769, 0.98809947886439, 0.98875825737241, 0.98941731344982, 0.99007664714552, 0.99073625850836, 0.99139614758723, 0.99205631443099, 0.9927167590885, 0.99337748160862, 0.9940384820402, 0.9946997604321, 0.99536131683317, 0.99602315129226, 0.9966852638582, 0.99734765457984, 0.998010323506, 0.99867327068553, 0.99933649616726, 1, }; inline float concave_exponant( float value ) { return compute_exponant( value, concave_exponant_table, concave_exponant_table_size ); } static int convex_exponant_table_size = 4096; static float convex_exponant_table[4096] = { 0.046890735084968, 0.060510367089532, 0.070244146759565, 0.078085884528682, 0.084766399299554, 0.090646885757071, 0.095935918022615, 0.10076629271815, 0.10522846666912, 0.10938719406252, 0.11329063214116, 0.11697569515052, 0.12047138381695, 0.12380095142677, 0.12698336637053, 0.13003433090946, 0.13296700988896, 0.13579256402953, 0.13852054804987, 0.14115921312863, 0.1437157402818, 0.14619642294463, 0.14860681160019, 0.15095182963725, 0.15323586711087, 0.1554628573286, 0.15763633994212, 0.15975951333014, 0.16183527840461, 0.16386627548964, 0.16585491556127, 0.16780340686311, 0.16971377770443, 0.17158789608648, 0.17342748667809, 0.17523414556343, 0.17700935310772, 0.17875448522512, 0.18047082328378, 0.18215956284339, 0.18382182138835, 0.18545864519372, 0.18707101543914, 0.18865985366887, 0.19022602668079, 0.19177035091555, 0.19329359640666, 0.19479649034366, 0.19627972029366, 0.1977439371202, 0.19918975763326, 0.20061776700013, 0.20202852094263, 0.20342254774346, 0.20480035008141, 0.20616240671285, 0.20750917401484, 0.20884108740361, 0.2101585626402, 0.21146199703427, 0.21275177055533, 0.21402824686007, 0.21529177424328, 0.21654268651924, 0.21778130383952, 0.21900793345289, 0.2202228704121, 0.22142639823195, 0.22261878950286, 0.22380030646332, 0.22497120153468, 0.22613171782122, 0.2272820895781, 0.22842254264984, 0.2295532948814, 0.23067455650401, 0.23178653049755, 0.23288941293122, 0.23398339328412, 0.23506865474701, 0.23614537450672, 0.23721372401435, 0.23827386923838, 0.23932597090372, 0.24037018471754, 0.24140666158298, 0.24243554780127, 0.24345698526318, 0.24447111163043, 0.24547806050768, 0.24647796160566, 0.24747094089613, 0.24845712075893, 0.24943662012184, 0.2504095545935, 0.25137603658992, 0.25233617545488, 0.25329007757457, 0.2542378464869, 0.25517958298564, 0.25611538521981, 0.25704534878847, 0.25796956683127, 0.25888813011489, 0.2598011271157, 0.26070864409871, 0.26161076519316, 0.26250757246479, 0.26339914598504, 0.26428556389732, 0.26516690248049, 0.26604323620968, 0.26691463781467, 0.26778117833578, 0.26864292717761, 0.26949995216049, 0.27035231957004, 0.27120009420461, 0.27204333942098, 0.27288211717822, 0.27371648807992, 0.27454651141474, 0.27537224519548, 0.27619374619664, 0.27701106999062, 0.27782427098256, 0.27863340244388, 0.27943851654466, 0.2802396643848, 0.28103689602406, 0.28183026051108, 0.28261980591135, 0.28340557933416, 0.28418762695871, 0.28496599405919, 0.28574072502914, 0.28651186340489, 0.28727945188822, 0.28804353236828, 0.28880414594282, 0.28956133293859, 0.29031513293125, 0.29106558476448, 0.29181272656855, 0.29255659577828, 0.2932972291504, 0.29403466278042, 0.29476893211889, 0.29550007198725, 0.29622811659308, 0.29695309954495, 0.29767505386682, 0.29839401201195, 0.29911000587644, 0.29982306681234, 0.30053322564037, 0.30124051266227, 0.30194495767279, 0.30264658997128, 0.30334543837304, 0.30404153122028, 0.30473489639272, 0.305425561318, 0.30611355298169, 0.30679889793711, 0.30748162231476, 0.30816175183163, 0.3088393118001, 0.30951432713675, 0.31018682237079, 0.31085682165234, 0.31152434876047, 0.31218942711103, 0.31285207976424, 0.31351232943213, 0.31417019848572, 0.31482570896207, 0.3154788825711, 0.3161297407023, 0.31677830443114, 0.31742459452547, 0.31806863145166, 0.31871043538058, 0.31935002619349, 0.31998742348773, 0.32062264658228, 0.3212557145232, 0.32188664608892, 0.32251545979539, 0.32314217390113, 0.32376680641214, 0.32438937508668, 0.32500989743996, 0.32562839074873, 0.32624487205568, 0.32685935817386, 0.32747186569086, 0.32808241097303, 0.32869101016948, 0.32929767921605, 0.3299024338392, 0.33050528955976, 0.33110626169664, 0.33170536537043, 0.33230261550691, 0.33289802684053, 0.33349161391775, 0.33408339110036, 0.33467337256866, 0.33526157232465, 0.33584800419508, 0.3364326818345, 0.33701561872814, 0.33759682819487, 0.33817632338997, 0.33875411730788, 0.33933022278497, 0.3399046525021, 0.34047741898725, 0.34104853461804, 0.34161801162422, 0.3421858620901, 0.3427520979569, 0.34331673102509, 0.34387977295669, 0.34444123527747, 0.34500112937915, 0.34555946652156, 0.3461162578347, 0.34667151432084, 0.34722524685648, 0.34777746619439, 0.34832818296549, 0.34887740768077, 0.34942515073316, 0.34997142239933, 0.35051623284148, 0.35105959210911, 0.35160151014072, 0.35214199676549, 0.35268106170497, 0.35321871457465, 0.35375496488559, 0.35428982204593, 0.35482329536248, 0.35535539404219, 0.35588612719361, 0.35641550382837, 0.35694353286255, 0.35747022311812, 0.35799558332429, 0.35851962211881, 0.35904234804937, 0.3595637695748, 0.36008389506641, 0.3606027328092, 0.36112029100309, 0.36163657776411, 0.36215160112561, 0.36266536903939, 0.36317788937685, 0.36368916993009, 0.36419921841305, 0.36470804246253, 0.36521564963931, 0.36572204742913, 0.36622724324378, 0.36673124442203, 0.3672340582307, 0.36773569186555, 0.36823615245229, 0.36873544704751, 0.36923358263959, 0.36973056614959, 0.37022640443218, 0.37072110427648, 0.37121467240697, 0.37170711548426, 0.37219844010601, 0.37268865280768, 0.37317776006336, 0.3736657682866, 0.37415268383112, 0.37463851299161, 0.37512326200452, 0.37560693704872, 0.37608954424632, 0.37657108966331, 0.37705157931033, 0.37753101914332, 0.37800941506421, 0.37848677292164, 0.37896309851155, 0.37943839757789, 0.37991267581323, 0.38038593885941, 0.38085819230815, 0.38132944170167, 0.38179969253328, 0.382268950248, 0.38273722024311, 0.38320450786875, 0.38367081842848, 0.38413615717984, 0.38460052933487, 0.38506394006072, 0.3855263944801, 0.38598789767187, 0.38644845467151, 0.38690807047168, 0.38736675002267, 0.38782449823291, 0.38828131996948, 0.38873722005856, 0.38919220328593, 0.3896462743974, 0.39009943809931, 0.39055169905894, 0.39100306190499, 0.39145353122801, 0.39190311158081, 0.39235180747892, 0.39279962340099, 0.39324656378921, 0.39369263304972, 0.394137835553, 0.39458217563428, 0.39502565759394, 0.39546828569788, 0.39591006417789, 0.39635099723204, 0.39679108902508, 0.39723034368872, 0.3976687653221, 0.39810635799203, 0.39854312573345, 0.39897907254969, 0.39941420241284, 0.3998485192641, 0.40028202701409, 0.40071472954319, 0.40114663070185, 0.40157773431091, 0.40200804416193, 0.40243756401747, 0.40286629761141, 0.40329424864928, 0.40372142080848, 0.40414781773867, 0.40457344306197, 0.4049983003733, 0.40542239324066, 0.40584572520538, 0.40626829978239, 0.40669012046055, 0.40711119070284, 0.40753151394667, 0.40795109360413, 0.40836993306225, 0.40878803568324, 0.40920540480476, 0.40962204374014, 0.41003795577865, 0.41045314418572, 0.41086761220321, 0.4112813630496, 0.41169439992025, 0.41210672598763, 0.41251834440153, 0.4129292582893, 0.41333947075604, 0.41374898488486, 0.41415780373708, 0.41456593035241, 0.41497336774921, 0.41538011892465, 0.41578618685496, 0.41619157449558, 0.41659628478141, 0.41700032062698, 0.41740368492665, 0.41780638055478, 0.41820841036598, 0.41860977719522, 0.41901048385807, 0.41941053315088, 0.41980992785092, 0.42020867071661, 0.42060676448765, 0.42100421188524, 0.42140101561222, 0.42179717835324, 0.42219270277495, 0.42258759152616, 0.42298184723798, 0.42337547252401, 0.4237684699805, 0.4241608421865, 0.42455259170399, 0.4249437210781, 0.42533423283721, 0.42572412949311, 0.42611341354115, 0.42650208746043, 0.42689015371388, 0.42727761474844, 0.42766447299521, 0.42805073086956, 0.42843639077132, 0.42882145508485, 0.42920592617925, 0.42958980640844, 0.42997309811132, 0.43035580361188, 0.43073792521938, 0.4311194652284, 0.43150042591905, 0.43188080955705, 0.43226061839384, 0.43263985466676, 0.43301852059911, 0.43339661840033, 0.43377415026607, 0.43415111837833, 0.43452752490558, 0.43490337200286, 0.43527866181192, 0.4356533964613, 0.43602757806647, 0.43640120872993, 0.43677429054132, 0.43714682557752, 0.43751881590278, 0.43789026356879, 0.43826117061483, 0.43863153906783, 0.43900137094251, 0.43937066824143, 0.43973943295517, 0.44010766706235, 0.44047537252978, 0.44084255131254, 0.44120920535405, 0.44157533658622, 0.4419409469295, 0.442306038293, 0.44267061257457, 0.44303467166088, 0.44339821742753, 0.44376125173914, 0.44412377644942, 0.44448579340128, 0.44484730442689, 0.44520831134779, 0.44556881597498, 0.44592882010897, 0.4462883255399, 0.44664733404759, 0.44700584740166, 0.44736386736156, 0.44772139567671, 0.44807843408653, 0.44843498432055, 0.44879104809845, 0.44914662713019, 0.44950172311605, 0.44985633774669, 0.45021047270328, 0.45056412965752, 0.45091731027174, 0.45127001619897, 0.45162224908301, 0.45197401055849, 0.45232530225096, 0.45267612577693, 0.45302648274399, 0.45337637475082, 0.4537258033873, 0.45407477023455, 0.45442327686502, 0.45477132484252, 0.45511891572233, 0.45546605105124, 0.4558127323676, 0.45615896120143, 0.45650473907442, 0.45685006750004, 0.45719494798358, 0.45753938202222, 0.45788337110509, 0.45822691671331, 0.45857002032009, 0.45891268339075, 0.45925490738277, 0.45959669374592, 0.45993804392221, 0.46027895934605, 0.46061944144423, 0.460959491636, 0.46129911133316, 0.46163830194005, 0.46197706485365, 0.46231540146362, 0.46265331315235, 0.46299080129501, 0.46332786725963, 0.4636645124071, 0.46400073809126, 0.46433654565894, 0.46467193645002, 0.46500691179744, 0.46534147302732, 0.46567562145893, 0.46600935840479, 0.46634268517071, 0.46667560305582, 0.46700811335262, 0.46734021734706, 0.46767191631853, 0.46800321153995, 0.4683341042778, 0.46866459579217, 0.46899468733679, 0.46932438015909, 0.46965367550024, 0.46998257459518, 0.47031107867269, 0.47063918895541, 0.47096690665987, 0.47129423299659, 0.47162116917004, 0.47194771637876, 0.47227387581533, 0.47259964866646, 0.47292503611303, 0.47325003933009, 0.47357465948692, 0.4738988977471, 0.4742227552685, 0.47454623320333, 0.47486933269822, 0.47519205489418, 0.47551440092673, 0.47583637192585, 0.47615796901608, 0.47647919331652, 0.47680004594088, 0.47712052799752, 0.47744064058947, 0.47776038481448, 0.47807976176506, 0.47839877252847, 0.47871741818683, 0.4790356998171, 0.4793536184911, 0.4796711752756, 0.47998837123232, 0.48030520741795, 0.4806216848842, 0.48093780467785, 0.48125356784075, 0.48156897540986, 0.48188402841729, 0.48219872789033, 0.48251307485147, 0.48282707031846, 0.4831407153043, 0.48345401081729, 0.48376695786107, 0.48407955743463, 0.48439181053237, 0.48470371814407, 0.48501528125501, 0.4853265008459, 0.48563737789297, 0.485947913368, 0.48625810823832, 0.48656796346684, 0.48687748001209, 0.48718665882827, 0.48749550086522, 0.48780400706849, 0.48811217837937, 0.48842001573489, 0.48872752006785, 0.48903469230687, 0.48934153337639, 0.48964804419673, 0.48995422568406, 0.49026007875049, 0.49056560430403, 0.49087080324867, 0.49117567648439, 0.49148022490715, 0.49178444940896, 0.49208835087789, 0.49239193019808, 0.49269518824979, 0.49299812590937, 0.49330074404936, 0.49360304353847, 0.49390502524158, 0.49420669001982, 0.49450803873055, 0.4948090722274, 0.49510979136027, 0.49541019697541, 0.49571028991536, 0.49601007101904, 0.49630954112173, 0.49660870105513, 0.49690755164733, 0.4972060937229, 0.49750432810282, 0.49780225560459, 0.4980998770422, 0.49839719322618, 0.49869420496357, 0.498990913058, 0.49928731830969, 0.49958342151544, 0.4998792234687, 0.50017472495954, 0.50046992677472, 0.50076482969765, 0.50105943450848, 0.50135374198405, 0.50164775289795, 0.50194146802055, 0.50223488811897, 0.50252801395713, 0.50282084629578, 0.5031133858925, 0.5034056335017, 0.5036975898747, 0.50398925575966, 0.50428063190168, 0.50457171904277, 0.50486251792189, 0.50515302927493, 0.50544325383479, 0.50573319233134, 0.50602284549147, 0.50631221403909, 0.50660129869514, 0.50689010017766, 0.50717861920172, 0.5074668564795, 0.50775481272031, 0.50804248863054, 0.50832988491376, 0.50861700227068, 0.50890384139919, 0.50919040299435, 0.50947668774845, 0.50976269635099, 0.51004842948868, 0.51033388784553, 0.51061907210276, 0.51090398293892, 0.51118862102982, 0.51147298704859, 0.5117570816657, 0.51204090554894, 0.51232445936345, 0.51260774377177, 0.51289075943379, 0.51317350700682, 0.51345598714556, 0.51373820050215, 0.51402014772616, 0.51430182946463, 0.51458324636205, 0.5148643990604, 0.51514528819914, 0.51542591441526, 0.51570627834325, 0.51598638061514, 0.51626622186053, 0.51654580270654, 0.51682512377789, 0.51710418569688, 0.51738298908342, 0.51766153455502, 0.51793982272681, 0.51821785421157, 0.51849562961973, 0.51877314955937, 0.51905041463625, 0.51932742545382, 0.51960418261324, 0.51988068671335, 0.52015693835075, 0.52043293811974, 0.5207086866124, 0.52098418441855, 0.52125943212578, 0.52153443031947, 0.52180917958278, 0.52208368049669, 0.52235793363999, 0.5226319395893, 0.52290569891908, 0.52317921220163, 0.52345248000712, 0.5237255029036, 0.52399828145699, 0.5242708162311, 0.52454310778766, 0.5248151566863, 0.5250869634846, 0.52535852873806, 0.52562985300011, 0.52590093682218, 0.52617178075363, 0.52644238534181, 0.52671275113208, 0.52698287866777, 0.52725276849023, 0.52752242113882, 0.52779183715096, 0.52806101706207, 0.52832996140564, 0.52859867071322, 0.52886714551442, 0.52913538633692, 0.52940339370652, 0.52967116814708, 0.52993871018059, 0.53020602032715, 0.53047309910498, 0.53073994703044, 0.53100656461803, 0.53127295238041, 0.53153911082841, 0.531805040471, 0.53207074181537, 0.53233621536687, 0.53260146162906, 0.53286648110371, 0.5331312742908, 0.53339584168853, 0.53366018379335, 0.53392430109994, 0.53418819410123, 0.53445186328842, 0.53471530915096, 0.53497853217659, 0.53524153285134, 0.5355043116595, 0.53576686908371, 0.53602920560487, 0.53629132170224, 0.53655321785338, 0.53681489453419, 0.5370763522189, 0.53733759138012, 0.53759861248879, 0.53785941601422, 0.5381200024241, 0.53838037218451, 0.53864052575988, 0.53890046361309, 0.53916018620538, 0.53941969399642, 0.53967898744431, 0.53993806700554, 0.54019693313509, 0.54045558628632, 0.54071402691109, 0.54097225545968, 0.54123027238085, 0.54148807812184, 0.54174567312834, 0.54200305784455, 0.54226023271316, 0.54251719817534, 0.54277395467077, 0.54303050263768, 0.54328684251276, 0.54354297473128, 0.54379889972702, 0.54405461793229, 0.54431012977796, 0.54456543569347, 0.54482053610679, 0.54507543144448, 0.54533012213166, 0.54558460859203, 0.5458388912479, 0.54609297052015, 0.54634684682827, 0.54660052059034, 0.54685399222308, 0.5471072621418, 0.54736033076047, 0.54761319849166, 0.5478658657466, 0.54811833293515, 0.54837060046582, 0.54862266874578, 0.54887453818088, 0.54912620917561, 0.54937768213314, 0.54962895745535, 0.54988003554276, 0.55013091679463, 0.55038160160888, 0.55063209038215, 0.55088238350979, 0.55113248138587, 0.55138238440318, 0.55163209295323, 0.55188160742626, 0.55213092821126, 0.55238005569596, 0.55262899026685, 0.55287773230915, 0.55312628220686, 0.55337464034275, 0.55362280709834, 0.55387078285396, 0.55411856798868, 0.55436616288041, 0.5546135679058, 0.55486078344034, 0.5551078098583, 0.55535464753278, 0.55560129683566, 0.55584775813768, 0.55609403180839, 0.55634011821614, 0.55658601772817, 0.55683173071051, 0.55707725752808, 0.5573225985446, 0.55756775412269, 0.5578127246238, 0.55805751040827, 0.55830211183529, 0.55854652926293, 0.55879076304815, 0.55903481354678, 0.55927868111355, 0.55952236610207, 0.55976586886487, 0.56000918975337, 0.56025232911789, 0.56049528730769, 0.56073806467093, 0.56098066155468, 0.56122307830496, 0.56146531526671, 0.56170737278381, 0.56194925119908, 0.56219095085428, 0.56243247209012, 0.56267381524627, 0.56291498066136, 0.56315596867298, 0.56339677961767, 0.56363741383097, 0.56387787164739, 0.56411815340039, 0.56435825942246, 0.56459819004504, 0.56483794559858, 0.56507752641254, 0.56531693281535, 0.56555616513448, 0.56579522369638, 0.56603410882653, 0.56627282084942, 0.56651136008858, 0.56674972686654, 0.56698792150488, 0.56722594432419, 0.56746379564414, 0.5677014757834, 0.56793898505971, 0.56817632378984, 0.56841349228965, 0.56865049087401, 0.56888731985689, 0.56912397955132, 0.56936047026937, 0.56959679232221, 0.5698329460201, 0.57006893167234, 0.57030474958734, 0.57054040007261, 0.57077588343472, 0.57101119997936, 0.5712463500113, 0.57148133383445, 0.57171615175177, 0.57195080406539, 0.57218529107651, 0.57241961308546, 0.5726537703917, 0.57288776329381, 0.57312159208949, 0.57335525707559, 0.57358875854806, 0.57382209680204, 0.57405527213176, 0.57428828483063, 0.57452113519119, 0.57475382350515, 0.57498635006337, 0.57521871515585, 0.57545091907177, 0.57568296209947, 0.57591484452648, 0.57614656663946, 0.57637812872429, 0.576609531066, 0.5768407739488, 0.57707185765611, 0.57730278247053, 0.57753354867383, 0.57776415654699, 0.57799460637021, 0.57822489842285, 0.57845503298351, 0.57868501032997, 0.57891483073924, 0.57914449448754, 0.5793740018503, 0.57960335310217, 0.57983254851703, 0.58006158836799, 0.58029047292737, 0.58051920246673, 0.58074777725689, 0.58097619756787, 0.58120446366895, 0.58143257582865, 0.58166053431474, 0.58188833939424, 0.58211599133342, 0.5823434903978, 0.58257083685217, 0.58279803096057, 0.58302507298631, 0.58325196319197, 0.58347870183939, 0.58370528918969, 0.58393172550327, 0.5841580110398, 0.58438414605822, 0.58461013081678, 0.584835965573, 0.58506165058368, 0.58528718610493, 0.58551257239215, 0.58573780970002, 0.58596289828256, 0.58618783839304, 0.58641263028408, 0.58663727420757, 0.58686177041475, 0.58708611915613, 0.58731032068158, 0.58753437524025, 0.58775828308063, 0.58798204445053, 0.58820565959709, 0.58842912876676, 0.58865245220535, 0.58887563015797, 0.5890986628691, 0.58932155058253, 0.5895442935414, 0.5897668919882, 0.58998934616477, 0.59021165631227, 0.59043382267124, 0.59065584548155, 0.59087772498246, 0.59109946141254, 0.59132105500977, 0.59154250601144, 0.59176381465425, 0.59198498117425, 0.59220600580685, 0.59242688878684, 0.59264763034839, 0.59286823072503, 0.5930886901497, 0.59330900885468, 0.59352918707167, 0.59374922503172, 0.5939691229653, 0.59418888110226, 0.59440849967183, 0.59462797890264, 0.59484731902273, 0.59506652025952, 0.59528558283985, 0.59550450698994, 0.59572329293543, 0.59594194090138, 0.59616045111223, 0.59637882379185, 0.59659705916352, 0.59681515744994, 0.59703311887322, 0.5972509436549, 0.59746863201593, 0.59768618417671, 0.59790360035702, 0.59812088077612, 0.59833802565267, 0.59855503520476, 0.59877190964993, 0.59898864920516, 0.59920525408685, 0.59942172451085, 0.59963806069245, 0.5998542628464, 0.60007033118687, 0.6002862659275, 0.60050206728137, 0.60071773546102, 0.60093327067843, 0.60114867314505, 0.60136394307179, 0.60157908066901, 0.60179408614653, 0.60200895971366, 0.60222370157913, 0.60243831195119, 0.60265279103751, 0.60286713904528, 0.60308135618111, 0.60329544265114, 0.60350939866094, 0.60372322441559, 0.60393692011965, 0.60415048597713, 0.60436392219156, 0.60457722896594, 0.60479040650276, 0.605003455004, 0.60521637467114, 0.60542916570514, 0.60564182830645, 0.60585436267504, 0.60606676901036, 0.60627904751136, 0.60649119837651, 0.60670322180376, 0.60691511799058, 0.60712688713394, 0.60733852943032, 0.60755004507572, 0.60776143426563, 0.60797269719509, 0.60818383405862, 0.60839484505026, 0.6086057303636, 0.60881649019172, 0.60902712472723, 0.60923763416227, 0.6094480186885, 0.6096582784971, 0.6098684137788, 0.61007842472383, 0.61028831152197, 0.61049807436255, 0.61070771343439, 0.61091722892589, 0.61112662102497, 0.61133588991908, 0.61154503579523, 0.61175405883996, 0.61196295923936, 0.61217173717906, 0.61238039284424, 0.61258892641964, 0.61279733808953, 0.61300562803775, 0.61321379644768, 0.61342184350227, 0.613629769384, 0.61383757427494, 0.61404525835669, 0.61425282181043, 0.61446026481691, 0.61466758755641, 0.61487479020881, 0.61508187295354, 0.61528883596959, 0.61549567943554, 0.61570240352953, 0.61590900842926, 0.61611549431204, 0.61632186135471, 0.61652810973372, 0.61673423962509, 0.6169402512044, 0.61714614464684, 0.61735192012716, 0.61755757781971, 0.61776311789841, 0.61796854053677, 0.6181738459079, 0.61837903418448, 0.6185841055388, 0.61878906014272, 0.61899389816771, 0.61919861978482, 0.61940322516472, 0.61960771447765, 0.61981208789347, 0.62001634558161, 0.62022048771113, 0.62042451445068, 0.62062842596851, 0.62083222243249, 0.62103590401009, 0.62123947086836, 0.621442923174, 0.62164626109329, 0.62184948479215, 0.62205259443607, 0.62225559019019, 0.62245847221926, 0.62266124068763, 0.62286389575928, 0.6230664375978, 0.62326886636641, 0.62347118222793, 0.62367338534484, 0.62387547587921, 0.62407745399274, 0.62427931984677, 0.62448107360226, 0.62468271541978, 0.62488424545956, 0.62508566388144, 0.62528697084491, 0.62548816650906, 0.62568925103265, 0.62589022457405, 0.62609108729128, 0.626291839342, 0.62649248088349, 0.62669301207269, 0.62689343306617, 0.62709374402015, 0.62729394509048, 0.62749403643267, 0.62769401820186, 0.62789389055286, 0.62809365364009, 0.62829330761765, 0.62849285263929, 0.62869228885839, 0.62889161642799, 0.6290908355008, 0.62928994622917, 0.62948894876509, 0.62968784326024, 0.62988662986593, 0.63008530873314, 0.63028388001252, 0.63048234385435, 0.6306807004086, 0.63087894982489, 0.63107709225251, 0.63127512784041, 0.63147305673721, 0.6316708790912, 0.63186859505031, 0.63206620476219, 0.63226370837411, 0.63246110603304, 0.63265839788561, 0.63285558407814, 0.63305266475659, 0.63324964006664, 0.63344651015361, 0.6336432751625, 0.63383993523802, 0.63403649052451, 0.63423294116604, 0.63442928730632, 0.63462552908877, 0.63482166665648, 0.63501770015222, 0.63521362971845, 0.63540945549733, 0.63560517763068, 0.63580079626002, 0.63599631152656, 0.63619172357121, 0.63638703253455, 0.63658223855687, 0.63677734177813, 0.636972342338, 0.63716724037585, 0.63736203603072, 0.63755672944138, 0.63775132074627, 0.63794581008353, 0.63814019759103, 0.63833448340628, 0.63852866766656, 0.6387227505088, 0.63891673206965, 0.63911061248547, 0.63930439189231, 0.63949807042594, 0.63969164822183, 0.63988512541515, 0.64007850214078, 0.64027177853332, 0.64046495472706, 0.64065803085603, 0.64085100705394, 0.64104388345422, 0.64123666019003, 0.64142933739423, 0.64162191519939, 0.6418143937378, 0.64200677314148, 0.64219905354214, 0.64239123507123, 0.64258331785991, 0.64277530203907, 0.6429671877393, 0.64315897509092, 0.64335066422399, 0.64354225526827, 0.64373374835326, 0.64392514360816, 0.64411644116192, 0.64430764114321, 0.64449874368043, 0.64468974890169, 0.64488065693484, 0.64507146790748, 0.6452621819469, 0.64545279918014, 0.645643319734, 0.64583374373496, 0.64602407130926, 0.64621430258289, 0.64640443768154, 0.64659447673066, 0.64678441985543, 0.64697426718077, 0.64716401883133, 0.6473536749315, 0.64754323560542, 0.64773270097697, 0.64792207116974, 0.6481113463071, 0.64830052651215, 0.64848961190773, 0.64867860261642, 0.64886749876055, 0.64905630046219, 0.64924500784317, 0.64943362102505, 0.64962214012916, 0.64981056527654, 0.64999889658802, 0.65018713418415, 0.65037527818525, 0.65056332871138, 0.65075128588235, 0.65093914981774, 0.65112692063686, 0.65131459845879, 0.65150218340236, 0.65168967558616, 0.65187707512851, 0.65206438214753, 0.65225159676106, 0.65243871908672, 0.65262574924189, 0.65281268734368, 0.652999533509, 0.65318628785449, 0.65337295049657, 0.65355952155141, 0.65374600113496, 0.65393238936291, 0.65411868635073, 0.65430489221366, 0.65449100706668, 0.65467703102456, 0.65486296420184, 0.6550488067128, 0.65523455867151, 0.65542022019182, 0.65560579138731, 0.65579127237136, 0.65597666325712, 0.6561619641575, 0.65634717518519, 0.65653229645265, 0.65671732807211, 0.65690227015558, 0.65708712281484, 0.65727188616145, 0.65745656030674, 0.65764114536181, 0.65782564143755, 0.65801004864464, 0.65819436709349, 0.65837859689435, 0.6585627381572, 0.65874679099183, 0.6589307555078, 0.65911463181445, 0.65929842002089, 0.65948212023605, 0.6596657325686, 0.65984925712702, 0.66003269401957, 0.66021604335429, 0.660399305239, 0.66058247978131, 0.66076556708864, 0.66094856726816, 0.66113148042685, 0.66131430667147, 0.66149704610858, 0.66167969884451, 0.6618622649854, 0.66204474463717, 0.66222713790553, 0.66240944489599, 0.66259166571384, 0.66277380046418, 0.66295584925189, 0.66313781218164, 0.66331968935791, 0.66350148088497, 0.66368318686688, 0.66386480740751, 0.66404634261049, 0.6642277925793, 0.66440915741718, 0.66459043722718, 0.66477163211215, 0.66495274217473, 0.66513376751739, 0.66531470824236, 0.6654955644517, 0.66567633624726, 0.66585702373069, 0.66603762700345, 0.6662181461668, 0.6663985813218, 0.66657893256933, 0.66675920001005, 0.66693938374444, 0.66711948387279, 0.66729950049519, 0.66747943371154, 0.66765928362153, 0.66783905032469, 0.66801873392034, 0.6681983345076, 0.66837785218541, 0.66855728705253, 0.66873663920752, 0.66891590874874, 0.66909509577437, 0.66927420038242, 0.66945322267069, 0.6696321627368, 0.66981102067818, 0.66998979659209, 0.67016849057557, 0.67034710272551, 0.6705256331386, 0.67070408191136, 0.67088244914009, 0.67106073492095, 0.67123893934989, 0.67141706252268, 0.67159510453493, 0.67177306548205, 0.67195094545927, 0.67212874456163, 0.67230646288402, 0.67248410052113, 0.67266165756747, 0.67283913411737, 0.673016530265, 0.67319384610433, 0.67337108172917, 0.67354823723315, 0.67372531270971, 0.67390230825213, 0.67407922395351, 0.67425605990677, 0.67443281620467, 0.67460949293979, 0.67478609020452, 0.67496260809109, 0.67513904669157, 0.67531540609784, 0.67549168640162, 0.67566788769444, 0.67584401006768, 0.67602005361255, 0.67619601842007, 0.67637190458111, 0.67654771218636, 0.67672344132635, 0.67689909209143, 0.6770746645718, 0.67725015885747, 0.67742557503831, 0.67760091320399, 0.67777617344405, 0.67795135584784, 0.67812646050455, 0.67830148750322, 0.6784764369327, 0.6786513088817, 0.67882610343874, 0.67900082069221, 0.67917546073032, 0.6793500236411, 0.67952450951246, 0.67969891843211, 0.67987325048761, 0.68004750576638, 0.68022168435565, 0.68039578634251, 0.68056981181388, 0.68074376085653, 0.68091763355707, 0.68109143000193, 0.68126515027742, 0.68143879446967, 0.68161236266464, 0.68178585494817, 0.68195927140592, 0.68213261212339, 0.68230587718594, 0.68247906667876, 0.6826521806869, 0.68282521929524, 0.68299818258852, 0.68317107065132, 0.68334388356808, 0.68351662142305, 0.68368928430038, 0.68386187228402, 0.6840343854578, 0.68420682390539, 0.68437918771031, 0.68455147695592, 0.68472369172543, 0.68489583210192, 0.68506789816831, 0.68523989000736, 0.6854118077017, 0.68558365133379, 0.68575542098597, 0.6859271167404, 0.68609873867912, 0.68627028688402, 0.68644176143682, 0.68661316241913, 0.68678448991238, 0.68695574399787, 0.68712692475676, 0.68729803227007, 0.68746906661865, 0.68764002788323, 0.68781091614438, 0.68798173148255, 0.68815247397802, 0.68832314371095, 0.68849374076134, 0.68866426520907, 0.68883471713384, 0.68900509661526, 0.68917540373276, 0.68934563856564, 0.68951580119307, 0.68968589169407, 0.68985591014752, 0.69002585663216, 0.69019573122662, 0.69036553400934, 0.69053526505866, 0.69070492445277, 0.69087451226973, 0.69104402858745, 0.69121347348372, 0.69138284703617, 0.69155214932232, 0.69172138041953, 0.69189054040506, 0.69205962935598, 0.69222864734929, 0.6923975944618, 0.69256647077021, 0.6927352763511, 0.69290401128089, 0.69307267563589, 0.69324126949224, 0.693409792926, 0.69357824601306, 0.69374662882919, 0.69391494145003, 0.69408318395109, 0.69425135640773, 0.69441945889521, 0.69458749148864, 0.694755454263, 0.69492334729315, 0.69509117065382, 0.6952589244196, 0.69542660866496, 0.69559422346424, 0.69576176889166, 0.69592924502129, 0.69609665192708, 0.69626398968288, 0.69643125836238, 0.69659845803916, 0.69676558878667, 0.69693265067823, 0.69709964378703, 0.69726656818615, 0.69743342394854, 0.69760021114702, 0.69776692985428, 0.69793358014291, 0.69810016208534, 0.69826667575391, 0.69843312122081, 0.69859949855814, 0.69876580783783, 0.69893204913173, 0.69909822251155, 0.69926432804888, 0.69943036581519, 0.69959633588183, 0.69976223832001, 0.69992807320085, 0.70009384059533, 0.70025954057432, 0.70042517320856, 0.70059073856867, 0.70075623672516, 0.70092166774842, 0.70108703170871, 0.70125232867619, 0.70141755872088, 0.7015827219127, 0.70174781832144, 0.70191284801678, 0.70207781106829, 0.7022427075454, 0.70240753751744, 0.70257230105362, 0.70273699822304, 0.70290162909468, 0.7030661937374, 0.70323069221994, 0.70339512461095, 0.70355949097893, 0.7037237913923, 0.70388802591934, 0.70405219462822, 0.70421629758702, 0.70438033486367, 0.70454430652602, 0.70470821264178, 0.70487205327857, 0.70503582850388, 0.7051995383851, 0.7053631829895, 0.70552676238424, 0.70569027663637, 0.70585372581284, 0.70601710998047, 0.70618042920598, 0.70634368355597, 0.70650687309695, 0.70666999789529, 0.70683305801729, 0.7069960535291, 0.70715898449678, 0.7073218509863, 0.70748465306348, 0.70764739079407, 0.70781006424368, 0.70797267347784, 0.70813521856195, 0.70829769956132, 0.70846011654114, 0.7086224695665, 0.70878475870239, 0.70894698401368, 0.70910914556513, 0.70927124342142, 0.70943327764709, 0.70959524830661, 0.70975715546431, 0.70991899918444, 0.71008077953115, 0.71024249656845, 0.71040415036028, 0.71056574097046, 0.71072726846272, 0.71088873290066, 0.71105013434781, 0.71121147286758, 0.71137274852327, 0.71153396137808, 0.71169511149513, 0.71185619893741, 0.71201722376781, 0.71217818604914, 0.7123390858441, 0.71249992321527, 0.71266069822514, 0.71282141093612, 0.71298206141048, 0.71314264971043, 0.71330317589806, 0.71346364003534, 0.71362404218419, 0.71378438240638, 0.71394466076361, 0.71410487731747, 0.71426503212946, 0.71442512526098, 0.71458515677331, 0.71474512672767, 0.71490503518515, 0.71506488220675, 0.71522466785339, 0.71538439218587, 0.7155440552649, 0.71570365715109, 0.71586319790498, 0.71602267758697, 0.71618209625739, 0.71634145397648, 0.71650075080436, 0.71665998680107, 0.71681916202656, 0.71697827654067, 0.71713733040316, 0.71729632367369, 0.71745525641181, 0.71761412867699, 0.71777294052862, 0.71793169202596, 0.71809038322821, 0.71824901419446, 0.71840758498371, 0.71856609565487, 0.71872454626675, 0.71888293687807, 0.71904126754746, 0.71919953833345, 0.7193577492945, 0.71951590048895, 0.71967399197506, 0.719832023811, 0.71998999605485, 0.7201479087646, 0.72030576199814, 0.72046355581327, 0.72062129026771, 0.72077896541909, 0.72093658132493, 0.72109413804269, 0.72125163562971, 0.72140907414326, 0.72156645364051, 0.72172377417855, 0.72188103581438, 0.7220382386049, 0.72219538260694, 0.72235246787722, 0.72250949447239, 0.722666462449, 0.72282337186352, 0.72298022277233, 0.72313701523172, 0.72329374929789, 0.72345042502697, 0.72360704247497, 0.72376360169785, 0.72392010275146, 0.72407654569158, 0.72423293057388, 0.72438925745397, 0.72454552638735, 0.72470173742946, 0.72485789063564, 0.72501398606114, 0.72517002376114, 0.72532600379071, 0.72548192620487, 0.72563779105853, 0.72579359840652, 0.72594934830359, 0.7261050408044, 0.72626067596354, 0.7264162538355, 0.7265717744747, 0.72672723793547, 0.72688264427204, 0.7270379935386, 0.72719328578921, 0.72734852107788, 0.72750369945853, 0.72765882098498, 0.727813885711, 0.72796889369024, 0.7281238449763, 0.72827873962269, 0.72843357768282, 0.72858835921005, 0.72874308425764, 0.72889775287877, 0.72905236512654, 0.72920692105397, 0.72936142071401, 0.72951586415951, 0.72967025144325, 0.72982458261793, 0.72997885773619, 0.73013307685054, 0.73028724001347, 0.73044134727734, 0.73059539869447, 0.73074939431708, 0.73090333419731, 0.73105721838724, 0.73121104693885, 0.73136481990405, 0.73151853733467, 0.73167219928247, 0.73182580579913, 0.73197935693625, 0.73213285274535, 0.73228629327787, 0.73243967858518, 0.73259300871857, 0.73274628372926, 0.73289950366838, 0.733052668587, 0.7332057785361, 0.73335883356658, 0.73351183372928, 0.73366477907497, 0.73381766965431, 0.73397050551791, 0.7341232867163, 0.73427601329995, 0.73442868531922, 0.73458130282443, 0.7347338658658, 0.73488637449349, 0.73503882875758, 0.73519122870807, 0.73534357439491, 0.73549586586794, 0.73564810317696, 0.73580028637167, 0.73595241550172, 0.73610449061666, 0.73625651176599, 0.73640847899912, 0.7365603923654, 0.73671225191411, 0.73686405769444, 0.73701580975552, 0.7371675081464, 0.73731915291607, 0.73747074411343, 0.73762228178734, 0.73777376598654, 0.73792519675974, 0.73807657415556, 0.73822789822256, 0.73837916900921, 0.73853038656393, 0.73868155093505, 0.73883266217084, 0.73898372031951, 0.73913472542917, 0.73928567754789, 0.73943657672364, 0.73958742300436, 0.73973821643789, 0.739888957072, 0.7400396449544, 0.74019028013272, 0.74034086265455, 0.74049139256737, 0.74064186991862, 0.74079229475567, 0.74094266712579, 0.74109298707622, 0.74124325465411, 0.74139346990655, 0.74154363288056, 0.74169374362309, 0.74184380218102, 0.74199380860117, 0.74214376293029, 0.74229366521505, 0.74244351550207, 0.74259331383789, 0.74274306026899, 0.74289275484178, 0.74304239760261, 0.74319198859775, 0.74334152787341, 0.74349101547575, 0.74364045145083, 0.74378983584466, 0.7439391687032, 0.74408845007233, 0.74423767999785, 0.74438685852551, 0.74453598570101, 0.74468506156994, 0.74483408617788, 0.74498305957029, 0.74513198179261, 0.74528085289019, 0.74542967290832, 0.74557844189224, 0.74572715988709, 0.74587582693798, 0.74602444308995, 0.74617300838797, 0.74632152287693, 0.74646998660168, 0.746618399607, 0.74676676193761, 0.74691507363815, 0.74706333475321, 0.74721154532731, 0.74735970540492, 0.74750781503044, 0.74765587424819, 0.74780388310246, 0.74795184163745, 0.7480997498973, 0.7482476079261, 0.74839541576788, 0.7485431734666, 0.74869088106614, 0.74883853861035, 0.74898614614301, 0.74913370370781, 0.74928121134843, 0.74942866910843, 0.74957607703136, 0.74972343516068, 0.7498707435398, 0.75001800221205, 0.75016521122073, 0.75031237060905, 0.75045948042018, 0.75060654069723, 0.75075355148322, 0.75090051282115, 0.75104742475394, 0.75119428732444, 0.75134110057545, 0.75148786454973, 0.75163457928994, 0.75178124483872, 0.75192786123862, 0.75207442853215, 0.75222094676175, 0.75236741596981, 0.75251383619865, 0.75266020749053, 0.75280652988768, 0.75295280343223, 0.75309902816628, 0.75324520413185, 0.75339133137094, 0.75353740992544, 0.75368343983721, 0.75382942114807, 0.75397535389974, 0.75412123813391, 0.75426707389222, 0.75441286121622, 0.75455860014743, 0.7547042907273, 0.75484993299723, 0.75499552699856, 0.75514107277258, 0.7552865703605, 0.75543201980349, 0.75557742114268, 0.7557227744191, 0.75586807967378, 0.75601333694763, 0.75615854628156, 0.75630370771639, 0.7564488212929, 0.7565938870518, 0.75673890503376, 0.75688387527939, 0.75702879782923, 0.75717367272378, 0.75731850000348, 0.75746327970872, 0.75760801187982, 0.75775269655706, 0.75789733378067, 0.75804192359079, 0.75818646602755, 0.758330961131, 0.75847540894114, 0.75861980949791, 0.75876416284122, 0.75890846901088, 0.75905272804669, 0.75919693998839, 0.75934110487563, 0.75948522274804, 0.7596292936452, 0.75977331760661, 0.75991729467174, 0.76006122487999, 0.76020510827071, 0.76034894488321, 0.76049273475673, 0.76063647793046, 0.76078017444356, 0.76092382433509, 0.76106742764411, 0.76121098440959, 0.76135449467047, 0.76149795846561, 0.76164137583385, 0.76178474681396, 0.76192807144465, 0.7620713497646, 0.76221458181243, 0.76235776762669, 0.76250090724591, 0.76264400070854, 0.76278704805298, 0.76293004931761, 0.76307300454073, 0.76321591376058, 0.76335877701539, 0.76350159434328, 0.76364436578238, 0.76378709137073, 0.76392977114633, 0.76407240514714, 0.76421499341103, 0.76435753597588, 0.76450003287947, 0.76464248415955, 0.76478488985382, 0.76492724999992, 0.76506956463545, 0.76521183379796, 0.76535405752495, 0.76549623585385, 0.76563836882207, 0.76578045646696, 0.76592249882581, 0.76606449593587, 0.76620644783434, 0.76634835455837, 0.76649021614505, 0.76663203263145, 0.76677380405456, 0.76691553045134, 0.76705721185869, 0.76719884831346, 0.76734043985247, 0.76748198651247, 0.76762348833017, 0.76776494534223, 0.76790635758527, 0.76804772509585, 0.76818904791049, 0.76833032606566, 0.76847155959778, 0.76861274854321, 0.7687538929383, 0.7688949928193, 0.76903604822246, 0.76917705918396, 0.76931802573992, 0.76945894792645, 0.76959982577957, 0.76974065933529, 0.76988144862954, 0.77002219369823, 0.77016289457721, 0.77030355130228, 0.77044416390921, 0.77058473243369, 0.77072525691141, 0.77086573737798, 0.77100617386896, 0.77114656641989, 0.77128691506625, 0.77142721984346, 0.77156748078693, 0.77170769793197, 0.77184787131391, 0.77198800096797, 0.77212808692937, 0.77226812923326, 0.77240812791476, 0.77254808300894, 0.77268799455081, 0.77282786257535, 0.77296768711749, 0.77310746821212, 0.77324720589408, 0.77338690019817, 0.77352655115912, 0.77366615881166, 0.77380572319044, 0.77394524433008, 0.77408472226514, 0.77422415703017, 0.77436354865963, 0.77450289718796, 0.77464220264957, 0.7747814650788, 0.77492068450995, 0.77505986097729, 0.77519899451503, 0.77533808515736, 0.77547713293838, 0.77561613789221, 0.77575510005286, 0.77589401945435, 0.77603289613063, 0.77617173011561, 0.77631052144316, 0.7764492701471, 0.77658797626121, 0.77672663981923, 0.77686526085487, 0.77700383940176, 0.77714237549353, 0.77728086916373, 0.77741932044589, 0.77755772937349, 0.77769609597997, 0.77783442029872, 0.77797270236311, 0.77811094220643, 0.77824913986196, 0.77838729536293, 0.77852540874251, 0.77866348003386, 0.77880150927006, 0.77893949648419, 0.77907744170925, 0.77921534497822, 0.77935320632403, 0.77949102577958, 0.77962880337771, 0.77976653915123, 0.7799042331329, 0.78004188535546, 0.78017949585158, 0.78031706465392, 0.78045459179506, 0.78059207730757, 0.78072952122397, 0.78086692357674, 0.78100428439831, 0.78114160372108, 0.78127888157741, 0.78141611799961, 0.78155331301996, 0.7816904666707, 0.781827578984, 0.78196464999204, 0.78210167972691, 0.7822386682207, 0.78237561550543, 0.7825125216131, 0.78264938657567, 0.78278621042503, 0.78292299319308, 0.78305973491163, 0.78319643561248, 0.78333309532739, 0.78346971408806, 0.78360629192618, 0.78374282887337, 0.78387932496124, 0.78401578022133, 0.78415219468517, 0.78428856838423, 0.78442490134995, 0.78456119361372, 0.78469744520692, 0.78483365616085, 0.78496982650681, 0.78510595627603, 0.78524204549973, 0.78537809420906, 0.78551410243515, 0.7856500702091, 0.78578599756194, 0.7859218845247, 0.78605773112835, 0.78619353740383, 0.78632930338202, 0.78646502909379, 0.78660071456996, 0.78673635984132, 0.7868719649386, 0.78700752989252, 0.78714305473374, 0.78727853949289, 0.78741398420058, 0.78754938888734, 0.78768475358371, 0.78782007832017, 0.78795536312715, 0.78809060803506, 0.78822581307428, 0.78836097827512, 0.7884961036679, 0.78863118928286, 0.78876623515022, 0.78890124130017, 0.78903620776286, 0.78917113456839, 0.78930602174683, 0.78944086932823, 0.78957567734257, 0.78971044581982, 0.78984517478992, 0.78997986428274, 0.79011451432814, 0.79024912495593, 0.79038369619591, 0.7905182280778, 0.79065272063132, 0.79078717388613, 0.79092158787189, 0.79105596261817, 0.79119029815455, 0.79132459451056, 0.79145885171568, 0.79159306979938, 0.79172724879106, 0.79186138872012, 0.79199548961591, 0.79212955150774, 0.79226357442488, 0.79239755839658, 0.79253150345204, 0.79266540962044, 0.79279927693092, 0.79293310541257, 0.79306689509446, 0.79320064600562, 0.79333435817505, 0.79346803163171, 0.79360166640453, 0.79373526252239, 0.79386882001416, 0.79400233890865, 0.79413581923465, 0.79426926102091, 0.79440266429616, 0.79453602908908, 0.79466935542831, 0.79480264334247, 0.79493589286014, 0.79506910400987, 0.79520227682016, 0.7953354113195, 0.79546850753634, 0.79560156549907, 0.79573458523607, 0.79586756677569, 0.79600051014624, 0.79613341537598, 0.79626628249317, 0.79639911152599, 0.79653190250264, 0.79666465545124, 0.79679737039991, 0.79693004737671, 0.79706268640969, 0.79719528752684, 0.79732785075615, 0.79746037612554, 0.79759286366294, 0.7977253133962, 0.79785772535317, 0.79799009956165, 0.79812243604942, 0.79825473484422, 0.79838699597376, 0.79851921946571, 0.7986514053477, 0.79878355364736, 0.79891566439226, 0.79904773760994, 0.79917977332792, 0.79931177157366, 0.79944373237462, 0.79957565575822, 0.79970754175183, 0.79983939038281, 0.79997120167846, 0.80010297566608, 0.80023471237292, 0.80036641182619, 0.8004980740531, 0.80062969908078, 0.80076128693638, 0.80089283764698, 0.80102435123964, 0.80115582774139, 0.80128726717923, 0.80141866958013, 0.80155003497101, 0.80168136337879, 0.80181265483032, 0.80194390935247, 0.80207512697202, 0.80220630771576, 0.80233745161043, 0.80246855868274, 0.80259962895939, 0.80273066246702, 0.80286165923225, 0.80299261928168, 0.80312354264185, 0.8032544293393, 0.80338527940053, 0.803516092852, 0.80364686972014, 0.80377761003137, 0.80390831381204, 0.80403898108852, 0.8041696118871, 0.80430020623408, 0.80443076415569, 0.80456128567817, 0.8046917708277, 0.80482221963044, 0.80495263211253, 0.80508300830006, 0.80521334821909, 0.80534365189568, 0.80547391935582, 0.8056041506255, 0.80573434573067, 0.80586450469724, 0.8059946275511, 0.80612471431811, 0.80625476502411, 0.80638477969488, 0.8065147583562, 0.80664470103381, 0.80677460775342, 0.8069044785407, 0.80703431342132, 0.80716411242088, 0.80729387556499, 0.80742360287921, 0.80755329438906, 0.80768295012005, 0.80781257009766, 0.80794215434733, 0.80807170289448, 0.80820121576449, 0.80833069298273, 0.80846013457451, 0.80858954056515, 0.80871891097991, 0.80884824584402, 0.80897754518272, 0.80910680902117, 0.80923603738454, 0.80936523029795, 0.80949438778651, 0.80962350987527, 0.80975259658928, 0.80988164795355, 0.81001066399306, 0.81013964473278, 0.81026859019762, 0.81039750041249, 0.81052637540226, 0.81065521519176, 0.81078401980582, 0.8109127892692, 0.81104152360669, 0.81117022284299, 0.81129888700282, 0.81142751611084, 0.81155611019171, 0.81168466927003, 0.8118131933704, 0.81194168251738, 0.8120701367355, 0.81219855604927, 0.81232694048317, 0.81245529006164, 0.81258360480911, 0.81271188474998, 0.8128401299086, 0.81296834030933, 0.81309651597647, 0.81322465693431, 0.81335276320711, 0.8134808348191, 0.81360887179448, 0.81373687415743, 0.81386484193209, 0.81399277514259, 0.81412067381303, 0.81424853796746, 0.81437636762993, 0.81450416282446, 0.81463192357502, 0.81475964990559, 0.81488734184009, 0.81501499940242, 0.81514262261648, 0.8152702115061, 0.81539776609512, 0.81552528640733, 0.81565277246651, 0.8157802242964, 0.81590764192072, 0.81603502536317, 0.81616237464741, 0.81628968979708, 0.81641697083579, 0.81654421778713, 0.81667143067467, 0.81679860952193, 0.81692575435243, 0.81705286518965, 0.81717994205703, 0.81730698497803, 0.81743399397603, 0.81756096907441, 0.81768791029653, 0.81781481766572, 0.81794169120527, 0.81806853093846, 0.81819533688853, 0.81832210907872, 0.81844884753221, 0.81857555227218, 0.81870222332177, 0.8188288607041, 0.81895546444227, 0.81908203455935, 0.81920857107838, 0.81933507402238, 0.81946154341434, 0.81958797927722, 0.81971438163398, 0.81984075050752, 0.81996708592074, 0.8200933878965, 0.82021965645765, 0.82034589162699, 0.82047209342733, 0.82059826188142, 0.82072439701201, 0.82085049884181, 0.82097656739352, 0.82110260268979, 0.82122860475327, 0.82135457360657, 0.82148050927229, 0.82160641177299, 0.82173228113122, 0.82185811736948, 0.82198392051028, 0.82210969057608, 0.82223542758932, 0.82236113157242, 0.82248680254777, 0.82261244053775, 0.8227380455647, 0.82286361765094, 0.82298915681877, 0.82311466309045, 0.82324013648824, 0.82336557703436, 0.82349098475101, 0.82361635966036, 0.82374170178456, 0.82386701114575, 0.82399228776601, 0.82411753166744, 0.82424274287209, 0.82436792140198, 0.82449306727913, 0.82461818052551, 0.82474326116309, 0.8248683092138, 0.82499332469955, 0.82511830764223, 0.8252432580637, 0.8253681759858, 0.82549306143036, 0.82561791441916, 0.82574273497397, 0.82586752311654, 0.82599227886859, 0.82611700225181, 0.8262416932879, 0.82636635199848, 0.82649097840521, 0.82661557252967, 0.82674013439346, 0.82686466401813, 0.82698916142521, 0.82711362663623, 0.82723805967266, 0.82736246055598, 0.82748682930762, 0.82761116594902, 0.82773547050155, 0.82785974298661, 0.82798398342553, 0.82810819183965, 0.82823236825028, 0.82835651267868, 0.82848062514614, 0.82860470567387, 0.8287287542831, 0.82885277099501, 0.82897675583078, 0.82910070881155, 0.82922462995845, 0.82934851929257, 0.82947237683499, 0.82959620260677, 0.82971999662894, 0.82984375892252, 0.82996748950849, 0.83009118840781, 0.83021485564144, 0.83033849123029, 0.83046209519525, 0.83058566755722, 0.83070920833704, 0.83083271755554, 0.83095619523354, 0.83107964139182, 0.83120305605115, 0.83132643923228, 0.83144979095591, 0.83157311124277, 0.83169640011351, 0.83181965758881, 0.83194288368929, 0.83206607843556, 0.83218924184822, 0.83231237394784, 0.83243547475495, 0.8325585442901, 0.83268158257377, 0.83280458962646, 0.83292756546861, 0.83305051012068, 0.83317342360308, 0.8332963059362, 0.83341915714041, 0.83354197723608, 0.83366476624353, 0.83378752418306, 0.83391025107498, 0.83403294693954, 0.83415561179699, 0.83427824566755, 0.83440084857143, 0.83452342052882, 0.83464596155986, 0.8347684716847, 0.83489095092346, 0.83501339929623, 0.83513581682309, 0.8352582035241, 0.83538055941929, 0.83550288452867, 0.83562517887224, 0.83574744246996, 0.83586967534178, 0.83599187750764, 0.83611404898745, 0.83623618980108, 0.83635829996842, 0.83648037950929, 0.83660242844354, 0.83672444679096, 0.83684643457133, 0.83696839180443, 0.83709031850999, 0.83721221470774, 0.83733408041738, 0.83745591565859, 0.83757772045102, 0.83769949481433, 0.83782123876812, 0.83794295233201, 0.83806463552557, 0.83818628836835, 0.8383079108799, 0.83842950307973, 0.83855106498734, 0.83867259662221, 0.8387940980038, 0.83891556915155, 0.83903701008487, 0.83915842082315, 0.83927980138578, 0.83940115179212, 0.83952247206149, 0.83964376221322, 0.8397650222666, 0.83988625224092, 0.84000745215542, 0.84012862202935, 0.84024976188192, 0.84037087173233, 0.84049195159976, 0.84061300150337, 0.84073402146229, 0.84085501149565, 0.84097597162254, 0.84109690186204, 0.84121780223321, 0.84133867275509, 0.8414595134467, 0.84158032432705, 0.84170110541511, 0.84182185672985, 0.84194257829021, 0.84206327011511, 0.84218393222346, 0.84230456463414, 0.84242516736601, 0.84254574043793, 0.84266628386871, 0.84278679767717, 0.84290728188209, 0.84302773650224, 0.84314816155637, 0.84326855706321, 0.84338892304148, 0.84350925950986, 0.84362956648702, 0.84374984399163, 0.84387009204232, 0.8439903106577, 0.84411049985637, 0.8442306596569, 0.84435079007786, 0.84447089113779, 0.84459096285521, 0.84471100524862, 0.8448310183365, 0.84495100213733, 0.84507095666954, 0.84519088195156, 0.84531077800181, 0.84543064483867, 0.84555048248051, 0.84567029094569, 0.84579007025254, 0.84590982041937, 0.8460295414645, 0.84614923340618, 0.84626889626268, 0.84638853005225, 0.84650813479311, 0.84662771050346, 0.84674725720149, 0.84686677490536, 0.84698626363324, 0.84710572340323, 0.84722515423347, 0.84734455614205, 0.84746392914704, 0.84758327326649, 0.84770258851846, 0.84782187492096, 0.847941132492, 0.84806036124956, 0.84817956121161, 0.8482987323961, 0.84841787482096, 0.84853698850411, 0.84865607346343, 0.84877512971681, 0.84889415728211, 0.84901315617717, 0.84913212641982, 0.84925106802785, 0.84936998101906, 0.84948886541122, 0.84960772122208, 0.84972654846937, 0.84984534717081, 0.84996411734411, 0.85008285900694, 0.85020157217697, 0.85032025687184, 0.85043891310918, 0.8505575409066, 0.85067614028171, 0.85079471125206, 0.85091325383523, 0.85103176804875, 0.85115025391014, 0.85126871143692, 0.85138714064657, 0.85150554155656, 0.85162391418434, 0.85174225854736, 0.85186057466303, 0.85197886254875, 0.85209712222191, 0.85221535369987, 0.85233355699999, 0.8524517321396, 0.85256987913602, 0.85268799800653, 0.85280608876843, 0.85292415143898, 0.85304218603542, 0.85316019257499, 0.8532781710749, 0.85339612155234, 0.85351404402449, 0.85363193850852, 0.85374980502157, 0.85386764358077, 0.85398545420323, 0.85410323690605, 0.8542209917063, 0.85433871862104, 0.85445641766732, 0.85457408886216, 0.85469173222257, 0.85480934776555, 0.85492693550808, 0.85504449546711, 0.85516202765959, 0.85527953210245, 0.85539700881259, 0.8555144578069, 0.85563187910228, 0.85574927271557, 0.85586663866362, 0.85598397696325, 0.85610128763129, 0.85621857068451, 0.85633582613971, 0.85645305401364, 0.85657025432304, 0.85668742708465, 0.85680457231518, 0.85692169003132, 0.85703878024975, 0.85715584298714, 0.85727287826013, 0.85738988608536, 0.85750686647944, 0.85762381945896, 0.85774074504051, 0.85785764324066, 0.85797451407595, 0.85809135756292, 0.85820817371809, 0.85832496255796, 0.858441724099, 0.85855845835771, 0.85867516535051, 0.85879184509386, 0.85890849760418, 0.85902512289786, 0.85914172099131, 0.85925829190089, 0.85937483564296, 0.85949135223386, 0.85960784168992, 0.85972430402746, 0.85984073926275, 0.85995714741209, 0.86007352849173, 0.86018988251793, 0.86030620950691, 0.86042250947489, 0.86053878243806, 0.86065502841262, 0.86077124741474, 0.86088743946056, 0.86100360456622, 0.86111974274785, 0.86123585402154, 0.8613519384034, 0.8614679959095, 0.8615840265559, 0.86170003035863, 0.86181600733374, 0.86193195749723, 0.8620478808651, 0.86216377745334, 0.86227964727791, 0.86239549035477, 0.86251130669984, 0.86262709632906, 0.86274285925832, 0.86285859550353, 0.86297430508055, 0.86308998800524, 0.86320564429345, 0.86332127396102, 0.86343687702374, 0.86355245349743, 0.86366800339787, 0.86378352674083, 0.86389902354206, 0.8640144938173, 0.86412993758228, 0.8642453548527, 0.86436074564426, 0.86447610997264, 0.8645914478535, 0.86470675930249, 0.86482204433525, 0.8649373029674, 0.86505253521453, 0.86516774109224, 0.86528292061611, 0.86539807380169, 0.86551320066453, 0.86562830122016, 0.86574337548409, 0.86585842347183, 0.86597344519887, 0.86608844068066, 0.86620340993268, 0.86631835297036, 0.86643326980913, 0.8665481604644, 0.86666302495157, 0.86677786328602, 0.86689267548313, 0.86700746155825, 0.86712222152671, 0.86723695540384, 0.86735166320496, 0.86746634494536, 0.86758100064032, 0.86769563030511, 0.86781023395498, 0.86792481160517, 0.8680393632709, 0.86815388896739, 0.86826838870983, 0.8683828625134, 0.86849731039326, 0.86861173236458, 0.86872612844249, 0.86884049864211, 0.86895484297855, 0.86906916146691, 0.86918345412226, 0.86929772095969, 0.86941196199423, 0.86952617724093, 0.86964036671481, 0.86975453043089, 0.86986866840416, 0.86998278064959, 0.87009686718217, 0.87021092801685, 0.87032496316855, 0.87043897265222, 0.87055295648277, 0.87066691467508, 0.87078084724405, 0.87089475420455, 0.87100863557143, 0.87112249135954, 0.8712363215837, 0.87135012625873, 0.87146390539943, 0.87157765902059, 0.87169138713698, 0.87180508976336, 0.87191876691448, 0.87203241860507, 0.87214604484984, 0.87225964566351, 0.87237322106075, 0.87248677105626, 0.8726002956647, 0.8727137949007, 0.87282726877892, 0.87294071731397, 0.87305414052046, 0.87316753841299, 0.87328091100614, 0.87339425831447, 0.87350758035255, 0.87362087713492, 0.87373414867609, 0.8738473949906, 0.87396061609293, 0.87407381199758, 0.87418698271901, 0.8743001282717, 0.87441324867008, 0.8745263439286, 0.87463941406167, 0.8747524590837, 0.87486547900908, 0.87497847385219, 0.87509144362741, 0.87520438834908, 0.87531730803156, 0.87543020268915, 0.87554307233618, 0.87565591698696, 0.87576873665576, 0.87588153135687, 0.87599430110454, 0.87610704591302, 0.87621976579655, 0.87633246076936, 0.87644513084564, 0.8765577760396, 0.87667039636542, 0.87678299183727, 0.87689556246931, 0.87700810827568, 0.87712062927052, 0.87723312546793, 0.87734559688203, 0.87745804352691, 0.87757046541664, 0.8776828625653, 0.87779523498694, 0.8779075826956, 0.8780199057053, 0.87813220403006, 0.87824447768389, 0.87835672668077, 0.87846895103468, 0.87858115075959, 0.87869332586943, 0.87880547637817, 0.87891760229971, 0.87902970364797, 0.87914178043685, 0.87925383268024, 0.87936586039202, 0.87947786358604, 0.87958984227616, 0.87970179647622, 0.87981372620003, 0.87992563146141, 0.88003751227415, 0.88014936865206, 0.88026120060889, 0.88037300815841, 0.88048479131438, 0.88059655009052, 0.88070828450056, 0.88081999455822, 0.88093168027718, 0.88104334167115, 0.88115497875379, 0.88126659153877, 0.88137818003973, 0.88148974427031, 0.88160128424414, 0.88171279997484, 0.88182429147599, 0.88193575876119, 0.88204720184402, 0.88215862073803, 0.88227001545679, 0.88238138601382, 0.88249273242266, 0.88260405469681, 0.88271535284979, 0.88282662689509, 0.88293787684617, 0.88304910271651, 0.88316030451955, 0.88327148226875, 0.88338263597754, 0.88349376565931, 0.8836048713275, 0.88371595299548, 0.88382701067664, 0.88393804438435, 0.88404905413196, 0.88416003993282, 0.88427100180027, 0.88438193974762, 0.88449285378818, 0.88460374393526, 0.88471461020214, 0.88482545260208, 0.88493627114836, 0.88504706585422, 0.88515783673289, 0.88526858379762, 0.8853793070616, 0.88549000653805, 0.88560068224015, 0.88571133418109, 0.88582196237402, 0.88593256683211, 0.88604314756849, 0.88615370459631, 0.88626423792867, 0.88637474757869, 0.88648523355947, 0.88659569588409, 0.88670613456562, 0.88681654961713, 0.88692694105166, 0.88703730888225, 0.88714765312194, 0.88725797378373, 0.88736827088062, 0.88747854442563, 0.88758879443171, 0.88769902091184, 0.88780922387898, 0.88791940334608, 0.88802955932606, 0.88813969183186, 0.88824980087638, 0.88835988647252, 0.88846994863318, 0.88857998737123, 0.88869000269953, 0.88879999463094, 0.8889099631783, 0.88901990835445, 0.8891298301722, 0.88923972864437, 0.88934960378375, 0.88945945560313, 0.88956928411528, 0.88967908933297, 0.88978887126895, 0.88989862993595, 0.89000836534672, 0.89011807751397, 0.89022776645041, 0.89033743216873, 0.89044707468162, 0.89055669400175, 0.89066629014179, 0.89077586311439, 0.89088541293218, 0.89099493960781, 0.89110444315387, 0.891213923583, 0.89132338090777, 0.89143281514078, 0.89154222629459, 0.89165161438178, 0.89176097941489, 0.89187032140647, 0.89197964036904, 0.89208893631513, 0.89219820925724, 0.89230745920786, 0.8924166861795, 0.89252589018461, 0.89263507123567, 0.89274422934513, 0.89285336452543, 0.892962476789, 0.89307156614826, 0.89318063261563, 0.8932896762035, 0.89339869692426, 0.89350769479029, 0.89361666981395, 0.8937256220076, 0.89383455138359, 0.89394345795425, 0.89405234173191, 0.89416120272887, 0.89427004095743, 0.8943788564299, 0.89448764915855, 0.89459641915565, 0.89470516643345, 0.89481389100422, 0.89492259288018, 0.89503127207357, 0.8951399285966, 0.89524856246147, 0.89535717368039, 0.89546576226553, 0.89557432822908, 0.89568287158319, 0.89579139234002, 0.89589989051172, 0.8960083661104, 0.89611681914821, 0.89622524963724, 0.89633365758959, 0.89644204301737, 0.89655040593265, 0.89665874634749, 0.89676706427396, 0.8968753597241, 0.89698363270996, 0.89709188324355, 0.89720011133691, 0.89730831700203, 0.89741650025092, 0.89752466109555, 0.8976327995479, 0.89774091561995, 0.89784900932364, 0.89795708067092, 0.89806512967373, 0.89817315634399, 0.89828116069361, 0.8983891427345, 0.89849710247855, 0.89860503993764, 0.89871295512366, 0.89882084804845, 0.89892871872388, 0.89903656716179, 0.89914439337401, 0.89925219737236, 0.89935997916865, 0.89946773877469, 0.89957547620227, 0.89968319146317, 0.89979088456917, 0.89989855553201, 0.90000620436347, 0.90011383107527, 0.90022143567915, 0.90032901818684, 0.90043657861003, 0.90054411696044, 0.90065163324976, 0.90075912748966, 0.90086659969183, 0.90097404986791, 0.90108147802956, 0.90118888418844, 0.90129626835615, 0.90140363054434, 0.9015109707646, 0.90161828902855, 0.90172558534777, 0.90183285973385, 0.90194011219836, 0.90204734275286, 0.9021545514089, 0.90226173817804, 0.90236890307179, 0.90247604610169, 0.90258316727925, 0.90269026661597, 0.90279734412334, 0.90290439981286, 0.90301143369599, 0.90311844578421, 0.90322543608895, 0.90333240462168, 0.90343935139383, 0.90354627641682, 0.90365317970207, 0.90376006126098, 0.90386692110496, 0.90397375924538, 0.90408057569364, 0.90418737046109, 0.9042941435591, 0.90440089499901, 0.90450762479217, 0.9046143329499, 0.90472101948352, 0.90482768440435, 0.90493432772368, 0.90504094945281, 0.90514754960302, 0.90525412818559, 0.90536068521176, 0.90546722069281, 0.90557373463997, 0.90568022706448, 0.90578669797757, 0.90589314739044, 0.90599957531431, 0.90610598176037, 0.90621236673981, 0.90631873026381, 0.90642507234354, 0.90653139299016, 0.90663769221481, 0.90674397002864, 0.90685022644278, 0.90695646146835, 0.90706267511647, 0.90716886739823, 0.90727503832474, 0.90738118790707, 0.90748731615631, 0.90759342308351, 0.90769950869974, 0.90780557301604, 0.90791161604346, 0.90801763779301, 0.90812363827573, 0.90822961750262, 0.90833557548469, 0.90844151223292, 0.90854742775831, 0.90865332207181, 0.90875919518441, 0.90886504710706, 0.90897087785069, 0.90907668742626, 0.90918247584469, 0.90928824311689, 0.90939398925379, 0.90949971426627, 0.90960541816524, 0.90971110096157, 0.90981676266615, 0.90992240328983, 0.91002802284347, 0.91013362133792, 0.91023919878401, 0.91034475519258, 0.91045029057445, 0.91055580494043, 0.91066129830131, 0.9107667706679, 0.91087222205097, 0.91097765246131, 0.91108306190968, 0.91118845040683, 0.91129381796352, 0.91139916459048, 0.91150449029845, 0.91160979509815, 0.91171507900029, 0.91182034201557, 0.91192558415469, 0.91203080542834, 0.9121360058472, 0.91224118542193, 0.9123463441632, 0.91245148208165, 0.91255659918793, 0.91266169549267, 0.91276677100651, 0.91287182574004, 0.91297685970389, 0.91308187290864, 0.9131868653649, 0.91329183708324, 0.91339678807424, 0.91350171834845, 0.91360662791644, 0.91371151678875, 0.91381638497592, 0.91392123248848, 0.91402605933694, 0.91413086553183, 0.91423565108365, 0.91434041600288, 0.91444516030002, 0.91454988398555, 0.91465458706992, 0.91475926956361, 0.91486393147707, 0.91496857282074, 0.91507319360505, 0.91517779384043, 0.9152823735373, 0.91538693270607, 0.91549147135713, 0.91559598950089, 0.91570048714772, 0.915804964308, 0.9159094209921, 0.91601385721037, 0.91611827297317, 0.91622266829084, 0.9163270431737, 0.91643139763209, 0.91653573167633, 0.91664004531671, 0.91674433856353, 0.9168486114271, 0.91695286391769, 0.91705709604558, 0.91716130782103, 0.9172654992543, 0.91736967035564, 0.91747382113529, 0.91757795160349, 0.91768206177045, 0.9177861516464, 0.91789022124154, 0.91799427056606, 0.91809829963018, 0.91820230844405, 0.91830629701787, 0.9184102653618, 0.91851421348599, 0.91861814140059, 0.91872204911576, 0.91882593664161, 0.91892980398828, 0.91903365116588, 0.91913747818453, 0.91924128505432, 0.91934507178534, 0.91944883838769, 0.91955258487143, 0.91965631124664, 0.91976001752337, 0.91986370371169, 0.91996736982162, 0.92007101586321, 0.92017464184649, 0.92027824778147, 0.92038183367817, 0.92048539954659, 0.92058894539672, 0.92069247123856, 0.92079597708208, 0.92089946293726, 0.92100292881405, 0.92110637472242, 0.92120980067231, 0.92131320667366, 0.9214165927364, 0.92151995887045, 0.92162330508573, 0.92172663139216, 0.92182993779962, 0.92193322431801, 0.92203649095721, 0.9221397377271, 0.92224296463755, 0.92234617169842, 0.92244935891955, 0.9225525263108, 0.922655673882, 0.92275880164297, 0.92286190960355, 0.92296499777353, 0.92306806616273, 0.92317111478095, 0.92327414363797, 0.92337715274357, 0.92348014210753, 0.92358311173962, 0.92368606164958, 0.92378899184718, 0.92389190234216, 0.92399479314424, 0.92409766426317, 0.92420051570864, 0.92430334749039, 0.9244061596181, 0.92450895210149, 0.92461172495023, 0.924714478174, 0.92481721178249, 0.92491992578535, 0.92502262019224, 0.92512529501282, 0.92522795025672, 0.92533058593358, 0.92543320205302, 0.92553579862467, 0.92563837565814, 0.92574093316303, 0.92584347114894, 0.92594598962546, 0.92604848860216, 0.92615096808863, 0.92625342809442, 0.9263558686291, 0.92645828970222, 0.92656069132331, 0.92666307350193, 0.92676543624759, 0.92686777956982, 0.92697010347813, 0.92707240798202, 0.92717469309099, 0.92727695881454, 0.92737920516215, 0.92748143214329, 0.92758363976743, 0.92768582804404, 0.92778799698256, 0.92789014659245, 0.92799227688313, 0.92809438786405, 0.92819647954462, 0.92829855193427, 0.92840060504239, 0.9285026388784, 0.92860465345169, 0.92870664877163, 0.92880862484762, 0.92891058168903, 0.92901251930521, 0.92911443770553, 0.92921633689934, 0.92931821689598, 0.92942007770478, 0.92952191933507, 0.92962374179617, 0.92972554509741, 0.92982732924807, 0.92992909425746, 0.93003084013488, 0.9301325668896, 0.93023427453091, 0.93033596306807, 0.93043763251034, 0.93053928286699, 0.93064091414726, 0.93074252636038, 0.9308441195156, 0.93094569362213, 0.93104724868921, 0.93114878472604, 0.93125030174182, 0.93135179974575, 0.93145327874703, 0.93155473875483, 0.93165617977833, 0.93175760182671, 0.93185900490912, 0.93196038903471, 0.93206175421265, 0.93216310045205, 0.93226442776207, 0.93236573615182, 0.93246702563043, 0.932568296207, 0.93266954789064, 0.93277078069045, 0.93287199461552, 0.93297318967494, 0.93307436587777, 0.9331755232331, 0.93327666174997, 0.93337778143746, 0.9334788823046, 0.93357996436044, 0.93368102761401, 0.93378207207435, 0.93388309775046, 0.93398410465137, 0.93408509278608, 0.93418606216359, 0.93428701279289, 0.93438794468298, 0.93448885784282, 0.93458975228139, 0.93469062800766, 0.93479148503057, 0.9348923233591, 0.93499314300217, 0.93509394396873, 0.9351947262677, 0.93529548990801, 0.93539623489858, 0.93549696124832, 0.93559766896612, 0.93569835806089, 0.93579902854151, 0.93589968041687, 0.93600031369584, 0.9361009283873, 0.93620152450009, 0.93630210204308, 0.93640266102512, 0.93650320145505, 0.9366037233417, 0.9367042266939, 0.93680471152047, 0.93690517783022, 0.93700562563197, 0.93710605493451, 0.93720646574664, 0.93730685807715, 0.93740723193481, 0.93750758732841, 0.9376079242667, 0.93770824275844, 0.9378085428124, 0.93790882443732, 0.93800908764194, 0.93810933243499, 0.9382095588252, 0.93830976682128, 0.93840995643197, 0.93851012766595, 0.93861028053194, 0.93871041503862, 0.93881053119468, 0.9389106290088, 0.93901070848966, 0.93911076964593, 0.93921081248626, 0.9393108370193, 0.93941084325372, 0.93951083119813, 0.9396108008612, 0.93971075225152, 0.93981068537774, 0.93991060024847, 0.9400104968723, 0.94011037525785, 0.94021023541371, 0.94031007734847, 0.9404099010707, 0.94050970658899, 0.9406094939119, 0.940709263048, 0.94080901400584, 0.94090874679398, 0.94100846142094, 0.94110815789528, 0.94120783622552, 0.94130749642018, 0.94140713848778, 0.94150676243684, 0.94160636827585, 0.94170595601331, 0.94180552565772, 0.94190507721756, 0.94200461070131, 0.94210412611743, 0.94220362347441, 0.94230310278068, 0.94240256404472, 0.94250200727496, 0.94260143247985, 0.94270083966781, 0.94280022884728, 0.94289960002668, 0.94299895321441, 0.9430982884189, 0.94319760564854, 0.94329690491173, 0.94339618621685, 0.9434954495723, 0.94359469498644, 0.94369392246764, 0.94379313202428, 0.94389232366471, 0.94399149739727, 0.94409065323033, 0.94418979117221, 0.94428891123124, 0.94438801341576, 0.94448709773409, 0.94458616419453, 0.9446852128054, 0.94478424357499, 0.94488325651161, 0.94498225162354, 0.94508122891906, 0.94518018840646, 0.945279130094, 0.94537805398994, 0.94547696010255, 0.94557584844007, 0.94567471901076, 0.94577357182285, 0.94587240688457, 0.94597122420415, 0.94607002378982, 0.94616880564979, 0.94626756979226, 0.94636631622544, 0.94646504495753, 0.94656375599672, 0.94666244935118, 0.94676112502911, 0.94685978303866, 0.94695842338802, 0.94705704608533, 0.94715565113875, 0.94725423855643, 0.94735280834651, 0.94745136051713, 0.94754989507642, 0.94764841203249, 0.94774691139347, 0.94784539316747, 0.9479438573626, 0.94804230398695, 0.94814073304861, 0.94823914455569, 0.94833753851624, 0.94843591493836, 0.94853427383011, 0.94863261519955, 0.94873093905475, 0.94882924540375, 0.94892753425459, 0.94902580561533, 0.94912405949399, 0.94922229589859, 0.94932051483717, 0.94941871631774, 0.9495169003483, 0.94961506693687, 0.94971321609143, 0.94981134781998, 0.94990946213052, 0.950007559031, 0.95010563852943, 0.95020370063375, 0.95030174535193, 0.95039977269194, 0.95049778266171, 0.9505957752692, 0.95069375052235, 0.95079170842908, 0.95088964899733, 0.95098757223502, 0.95108547815006, 0.95118336675036, 0.95128123804383, 0.95137909203837, 0.95147692874186, 0.9515747481622, 0.95167255030726, 0.95177033518493, 0.95186810280306, 0.95196585316953, 0.95206358629219, 0.95216130217889, 0.95225900083748, 0.9523566822758, 0.95245434650169, 0.95255199352296, 0.95264962334746, 0.95274723598299, 0.95284483143737, 0.95294240971839, 0.95303997083387, 0.9531375147916, 0.95323504159936, 0.95333255126494, 0.95343004379612, 0.95352751920067, 0.95362497748635, 0.95372241866092, 0.95381984273215, 0.95391724970777, 0.95401463959553, 0.95411201240318, 0.95420936813844, 0.95430670680903, 0.95440402842269, 0.95450133298712, 0.95459862051003, 0.95469589099913, 0.95479314446212, 0.95489038090669, 0.95498760034053, 0.95508480277131, 0.95518198820672, 0.95527915665442, 0.95537630812208, 0.95547344261736, 0.95557056014791, 0.95566766072138, 0.95576474434541, 0.95586181102765, 0.95595886077571, 0.95605589359723, 0.95615290949983, 0.95624990849112, 0.95634689057871, 0.95644385577021, 0.95654080407321, 0.95663773549531, 0.95673465004409, 0.95683154772713, 0.95692842855202, 0.95702529252632, 0.9571221396576, 0.95721896995341, 0.95731578342131, 0.95741258006886, 0.95750935990359, 0.95760612293304, 0.95770286916475, 0.95779959860623, 0.95789631126502, 0.95799300714863, 0.95808968626457, 0.95818634862035, 0.95828299422346, 0.9583796230814, 0.95847623520165, 0.95857283059172, 0.95866940925906, 0.95876597121115, 0.95886251645547, 0.95895904499947, 0.95905555685061, 0.95915205201634, 0.95924853050412, 0.95934499232136, 0.95944143747553, 0.95953786597403, 0.95963427782431, 0.95973067303377, 0.95982705160984, 0.95992341355991, 0.9600197588914, 0.96011608761171, 0.96021239972821, 0.96030869524831, 0.96040497417938, 0.96050123652881, 0.96059748230395, 0.96069371151219, 0.96078992416087, 0.96088612025736, 0.96098229980901, 0.96107846282315, 0.96117460930714, 0.96127073926831, 0.96136685271398, 0.96146294965147, 0.96155903008812, 0.96165509403123, 0.96175114148811, 0.96184717246606, 0.96194318697238, 0.96203918501437, 0.96213516659931, 0.96223113173449, 0.96232708042718, 0.96242301268465, 0.96251892851417, 0.962614827923, 0.96271071091841, 0.96280657750763, 0.96290242769792, 0.96299826149652, 0.96309407891066, 0.96318987994757, 0.96328566461449, 0.96338143291862, 0.96347718486719, 0.9635729204674, 0.96366863972647, 0.96376434265158, 0.96386002924994, 0.96395569952874, 0.96405135349515, 0.96414699115636, 0.96424261251955, 0.96433821759188, 0.96443380638051, 0.96452937889261, 0.96462493513533, 0.96472047511582, 0.96481599884123, 0.96491150631868, 0.96500699755532, 0.96510247255827, 0.96519793133466, 0.96529337389161, 0.96538880023623, 0.96548421037563, 0.96557960431691, 0.96567498206717, 0.9657703436335, 0.965865689023, 0.96596101824274, 0.96605633129981, 0.96615162820128, 0.96624690895422, 0.96634217356568, 0.96643742204274, 0.96653265439244, 0.96662787062183, 0.96672307073795, 0.96681825474785, 0.96691342265855, 0.9670085744771, 0.9671037102105, 0.96719882986578, 0.96729393344996, 0.96738902097003, 0.96748409243302, 0.96757914784591, 0.96767418721569, 0.96776921054937, 0.96786421785392, 0.96795920913633, 0.96805418440356, 0.96814914366259, 0.96824408692038, 0.96833901418389, 0.96843392546008, 0.9685288207559, 0.96862370007829, 0.96871856343419, 0.96881341083054, 0.96890824227427, 0.96900305777231, 0.96909785733157, 0.96919264095898, 0.96928740866143, 0.96938216044585, 0.96947689631914, 0.96957161628818, 0.96966632035987, 0.9697610085411, 0.96985568083875, 0.9699503372597, 0.97004497781082, 0.97013960249898, 0.97023421133104, 0.97032880431387, 0.9704233814543, 0.9705179427592, 0.97061248823541, 0.97070701788977, 0.97080153172911, 0.97089602976025, 0.97099051199004, 0.97108497842528, 0.97117942907279, 0.97127386393939, 0.97136828303187, 0.97146268635705, 0.97155707392171, 0.97165144573265, 0.97174580179666, 0.97184014212052, 0.971934466711, 0.97202877557488, 0.97212306871893, 0.97221734614991, 0.97231160787458, 0.9724058538997, 0.97250008423201, 0.97259429887825, 0.97268849784518, 0.97278268113953, 0.97287684876801, 0.97297100073737, 0.97306513705433, 0.97315925772559, 0.97325336275788, 0.9733474521579, 0.97344152593235, 0.97353558408794, 0.97362962663134, 0.97372365356927, 0.97381766490839, 0.97391166065539, 0.97400564081695, 0.97409960539973, 0.9741935544104, 0.97428748785563, 0.97438140574206, 0.97447530807636, 0.97456919486516, 0.97466306611512, 0.97475692183287, 0.97485076202504, 0.97494458669827, 0.97503839585917, 0.97513218951438, 0.9752259676705, 0.97531973033415, 0.97541347751193, 0.97550720921044, 0.97560092543629, 0.97569462619606, 0.97578831149635, 0.97588198134374, 0.9759756357448, 0.97606927470611, 0.97616289823425, 0.97625650633577, 0.97635009901725, 0.97644367628523, 0.97653723814627, 0.97663078460692, 0.97672431567372, 0.9768178313532, 0.97691133165191, 0.97700481657638, 0.97709828613312, 0.97719174032867, 0.97728517916953, 0.97737860266222, 0.97747201081325, 0.97756540362911, 0.97765878111632, 0.97775214328136, 0.97784549013072, 0.97793882167089, 0.97803213790835, 0.97812543884957, 0.97821872450103, 0.9783119948692, 0.97840524996054, 0.97849848978151, 0.97859171433856, 0.97868492363814, 0.9787781176867, 0.97887129649068, 0.97896446005652, 0.97905760839065, 0.9791507414995, 0.97924385938948, 0.97933696206703, 0.97943004953856, 0.97952312181047, 0.97961617888918, 0.97970922078108, 0.97980224749258, 0.97989525903006, 0.97998825539992, 0.98008123660853, 0.98017420266229, 0.98026715356757, 0.98036008933073, 0.98045300995815, 0.98054591545619, 0.9806388058312, 0.98073168108955, 0.98082454123758, 0.98091738628164, 0.98101021622807, 0.9811030310832, 0.98119583085337, 0.98128861554492, 0.98138138516415, 0.9814741397174, 0.98156687921097, 0.98165960365119, 0.98175231304435, 0.98184500739677, 0.98193768671473, 0.98203035100453, 0.98212300027247, 0.98221563452484, 0.9823082537679, 0.98240085800794, 0.98249344725123, 0.98258602150405, 0.98267858077265, 0.9827711250633, 0.98286365438225, 0.98295616873576, 0.98304866813008, 0.98314115257144, 0.98323362206609, 0.98332607662026, 0.98341851624018, 0.98351094093209, 0.9836033507022, 0.98369574555673, 0.9837881255019, 0.98388049054392, 0.98397284068898, 0.98406517594331, 0.98415749631309, 0.98424980180451, 0.98434209242377, 0.98443436817705, 0.98452662907054, 0.9846188751104, 0.98471110630281, 0.98480332265395, 0.98489552416998, 0.98498771085705, 0.98507988272132, 0.98517203976895, 0.98526418200608, 0.98535630943885, 0.98544842207342, 0.98554051991591, 0.98563260297245, 0.98572467124917, 0.9858167247522, 0.98590876348766, 0.98600078746165, 0.9860927966803, 0.98618479114971, 0.98627677087598, 0.98636873586521, 0.98646068612349, 0.98655262165692, 0.98664454247159, 0.98673644857357, 0.98682833996895, 0.9869202166638, 0.98701207866418, 0.98710392597618, 0.98719575860584, 0.98728757655923, 0.98737937984241, 0.98747116846142, 0.98756294242231, 0.98765470173112, 0.98774644639389, 0.98783817641665, 0.98792989180544, 0.98802159256628, 0.9881132787052, 0.9882049502282, 0.98829660714132, 0.98838824945055, 0.9884798771619, 0.98857149028138, 0.98866308881498, 0.98875467276871, 0.98884624214854, 0.98893779696046, 0.98902933721047, 0.98912086290453, 0.98921237404863, 0.98930387064872, 0.98939535271079, 0.98948682024078, 0.98957827324467, 0.9896697117284, 0.98976113569793, 0.9898525451592, 0.98994394011816, 0.99003532058075, 0.99012668655289, 0.99021803804053, 0.99030937504959, 0.99040069758599, 0.99049200565565, 0.99058329926449, 0.99067457841843, 0.99076584312336, 0.99085709338519, 0.99094832920983, 0.99103955060316, 0.99113075757109, 0.99122195011949, 0.99131312825426, 0.99140429198128, 0.99149544130641, 0.99158657623554, 0.99167769677454, 0.99176880292926, 0.99185989470558, 0.99195097210934, 0.9920420351464, 0.99213308382262, 0.99222411814383, 0.99231513811589, 0.99240614374462, 0.99249713503587, 0.99258811199546, 0.99267907462922, 0.99277002294297, 0.99286095694254, 0.99295187663373, 0.99304278202236, 0.99313367311425, 0.99322454991518, 0.99331541243097, 0.9934062606674, 0.99349709463028, 0.99358791432538, 0.9936787197585, 0.99376951093542, 0.99386028786191, 0.99395105054375, 0.99404179898671, 0.99413253319655, 0.99422325317903, 0.99431395893992, 0.99440465048497, 0.99449532781994, 0.99458599095056, 0.99467663988258, 0.99476727462174, 0.99485789517378, 0.99494850154443, 0.99503909373943, 0.99512967176448, 0.99522023562532, 0.99531078532766, 0.99540132087722, 0.99549184227971, 0.99558234954083, 0.99567284266629, 0.99576332166178, 0.99585378653299, 0.99594423728564, 0.99603467392539, 0.99612509645793, 0.99621550488895, 0.99630589922412, 0.99639627946911, 0.99648664562959, 0.99657699771124, 0.9966673357197, 0.99675765966065, 0.99684796953972, 0.99693826536259, 0.99702854713488, 0.99711881486225, 0.99720906855034, 0.99729930820478, 0.99738953383121, 0.99747974543525, 0.99756994302253, 0.99766012659867, 0.99775029616929, 0.99784045174, 0.99793059331643, 0.99802072090416, 0.99811083450881, 0.99820093413598, 0.99829101979126, 0.99838109148024, 0.99847114920852, 0.99856119298169, 0.99865122280531, 0.99874123868498, 0.99883124062626, 0.99892122863473, 0.99901120271595, 0.99910116287549, 0.99919110911892, 0.99928104145177, 0.99937095987962, 0.99946086440801, 0.99955075504248, 0.99964063178859, 0.99973049465185, 0.99982034363783, 0.99991017875203, 1, }; inline float convex_exponant( float value ) { return compute_exponant( value, convex_exponant_table, convex_exponant_table_size ); } #endif //H2C_EXPONENTIAL_TABLES_H /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/instrument.cpp000066400000000000000000000345261366722712400225240ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include #include namespace H2Core { const char* Instrument::__class_name = "Instrument"; Instrument::Instrument( const int id, const QString& name, ADSR* adsr ) : Object( __class_name ) , __id( id ) , __name( name ) , __gain( 1.0 ) , __volume( 1.0 ) , __pan_l( 1.0 ) , __pan_r( 1.0 ) , __peak_l( 0.0 ) , __peak_r( 0.0 ) , __adsr( adsr ) , __filter_active( false ) , __filter_cutoff( 1.0 ) , __filter_resonance( 0.0 ) , __random_pitch_factor( 0.0 ) , __midi_out_note( 36 + id ) , __midi_out_channel( -1 ) , __stop_notes( false ) , __sample_selection_alg( VELOCITY ) , __active( true ) , __soloed( false ) , __muted( false ) , __mute_group( -1 ) , __queued( 0 ) , __hihat_grp( -1 ) , __lower_cc( 0 ) , __higher_cc( 127 ) , __components( nullptr ) , __is_preview_instrument(false) , __is_metronome_instrument(false) , __apply_velocity( true ) , __current_instr_for_export(false) { if ( __adsr == nullptr ) { __adsr = new ADSR(); } if( __midi_out_note < MIDI_OUT_NOTE_MIN ){ __midi_out_note = MIDI_OUT_NOTE_MIN; } if( __midi_out_note > MIDI_OUT_NOTE_MAX ){ __midi_out_note = MIDI_OUT_NOTE_MAX; } for ( int i=0; i (); } Instrument::Instrument( Instrument* other ) : Object( __class_name ) , __id( other->get_id() ) , __name( other->get_name() ) , __gain( other->__gain ) , __volume( other->get_volume() ) , __pan_l( other->get_pan_l() ) , __pan_r( other->get_pan_r() ) , __peak_l( other->get_peak_l() ) , __peak_r( other->get_peak_r() ) , __adsr( new ADSR( *( other->get_adsr() ) ) ) , __filter_active( other->is_filter_active() ) , __filter_cutoff( other->get_filter_cutoff() ) , __filter_resonance( other->get_filter_resonance() ) , __random_pitch_factor( other->get_random_pitch_factor() ) , __midi_out_note( other->get_midi_out_note() ) , __midi_out_channel( other->get_midi_out_channel() ) , __stop_notes( other->is_stop_notes() ) , __sample_selection_alg( other->sample_selection_alg() ) , __active( other->is_active() ) , __soloed( other->is_soloed() ) , __muted( other->is_muted() ) , __mute_group( other->get_mute_group() ) , __queued( other->is_queued() ) , __hihat_grp( other->get_hihat_grp() ) , __lower_cc( other->get_lower_cc() ) , __higher_cc( other->get_higher_cc() ) , __components( nullptr ) , __is_preview_instrument(false) , __is_metronome_instrument(false) , __apply_velocity( other->get_apply_velocity() ) , __current_instr_for_export(false) { for ( int i=0; iget_fx_level( i ); } __components = new std::vector (); for (auto it = other->get_components()->begin(); it != other->get_components()->end(); ++it) { __components->push_back(new InstrumentComponent(*it)); } } Instrument::~Instrument() { for(auto& pComponent : *this->get_components()){ delete pComponent; } delete __components; delete __adsr; __adsr = nullptr; } Instrument* Instrument::load_instrument( const QString& drumkit_name, const QString& instrument_name ) { Instrument* pInstrument = new Instrument(); pInstrument->load_from( drumkit_name, instrument_name, false ); return pInstrument; } void Instrument::load_from( Drumkit* pDrumkit, Instrument* pInstrument, bool is_live ) { if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } for(auto& pComponent : *this->get_components()){ delete pComponent; } this->get_components()->clear(); if ( is_live ) { AudioEngine::get_instance()->unlock(); } for (std::vector::iterator it = pInstrument->get_components()->begin() ; it != pInstrument->get_components()->end(); ++it) { InstrumentComponent* pSrcComponent = *it; InstrumentComponent* pMyComponent = new InstrumentComponent( pSrcComponent->get_drumkit_componentID() ); pMyComponent->set_gain( pSrcComponent->get_gain() ); this->get_components()->push_back( pMyComponent ); for ( int i = 0; i < InstrumentComponent::getMaxLayers(); i++ ) { InstrumentLayer* src_layer = pSrcComponent->get_layer( i ); InstrumentLayer* my_layer = pMyComponent->get_layer( i ); if( src_layer == nullptr ) { if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } pMyComponent->set_layer( nullptr, i ); if ( is_live ) { AudioEngine::get_instance()->unlock(); } } else { QString sample_path = pDrumkit->get_path() + "/" + src_layer->get_sample()->get_filename(); Sample* pSample = Sample::load( sample_path ); if ( pSample == nullptr ) { _ERRORLOG( QString( "Error loading sample %1. Creating a new empty layer." ).arg( sample_path ) ); if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } pMyComponent->set_layer( nullptr, i ); if ( is_live ) { AudioEngine::get_instance()->unlock(); } } else { if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } pMyComponent->set_layer( new InstrumentLayer( src_layer, pSample ), i ); if ( is_live ) { AudioEngine::get_instance()->unlock(); } } } delete my_layer; } } if ( is_live ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } this->set_id( pInstrument->get_id() ); this->set_name( pInstrument->get_name() ); this->set_drumkit_name( pDrumkit->get_name() ); this->set_gain( pInstrument->get_gain() ); this->set_volume( pInstrument->get_volume() ); this->set_pan_l( pInstrument->get_pan_l() ); this->set_pan_r( pInstrument->get_pan_r() ); this->set_adsr( new ADSR( *( pInstrument->get_adsr() ) ) ); this->set_filter_active( pInstrument->is_filter_active() ); this->set_filter_cutoff( pInstrument->get_filter_cutoff() ); this->set_filter_resonance( pInstrument->get_filter_resonance() ); this->set_random_pitch_factor( pInstrument->get_random_pitch_factor() ); this->set_muted( pInstrument->is_muted() ); this->set_mute_group( pInstrument->get_mute_group() ); this->set_midi_out_channel( pInstrument->get_midi_out_channel() ); this->set_midi_out_note( pInstrument->get_midi_out_note() ); this->set_stop_notes( pInstrument->is_stop_notes() ); this->set_sample_selection_alg( pInstrument->sample_selection_alg() ); this->set_hihat_grp( pInstrument->get_hihat_grp() ); this->set_lower_cc( pInstrument->get_lower_cc() ); this->set_higher_cc( pInstrument->get_higher_cc() ); this->set_apply_velocity ( pInstrument->get_apply_velocity() ); if ( is_live ) { AudioEngine::get_instance()->unlock(); } } void Instrument::load_from( const QString& dk_name, const QString& instrument_name, bool is_live ) { Drumkit* pDrumkit = Drumkit::load_by_name( dk_name ); if ( !pDrumkit ) { return; } assert( pDrumkit ); Instrument* pInstrument = pDrumkit->get_instruments()->find( instrument_name ); if ( pInstrument!=nullptr ) { load_from( pDrumkit, pInstrument, is_live ); } delete pDrumkit; } Instrument* Instrument::load_from( XMLNode* node, const QString& dk_path, const QString& dk_name ) { int id = node->read_int( "id", EMPTY_INSTR_ID, false, false ); if ( id == EMPTY_INSTR_ID ) { return nullptr; } Instrument* pInstrument = new Instrument( id, node->read_string( "name", "" ), nullptr ); pInstrument->set_drumkit_name( dk_name ); pInstrument->set_volume( node->read_float( "volume", 1.0f ) ); pInstrument->set_muted( node->read_bool( "isMuted", false ) ); pInstrument->set_pan_l( node->read_float( "pan_L", 1.0f ) ); pInstrument->set_pan_r( node->read_float( "pan_R", 1.0f ) ); // may not exist, but can't be empty pInstrument->set_apply_velocity( node->read_bool( "applyVelocity", true, false ) ); pInstrument->set_filter_active( node->read_bool( "filterActive", true, false ) ); pInstrument->set_filter_cutoff( node->read_float( "filterCutoff", 1.0f, true, false ) ); pInstrument->set_filter_resonance( node->read_float( "filterResonance", 0.0f, true, false ) ); pInstrument->set_random_pitch_factor( node->read_float( "randomPitchFactor", 0.0f, true, false ) ); float attack = node->read_float( "Attack", 0.0f, true, false ); float decay = node->read_float( "Decay", 0.0f, true, false ); float sustain = node->read_float( "Sustain", 1.0f, true, false ); float release = node->read_float( "Release", 1000.0f, true, false ); pInstrument->set_adsr( new ADSR( attack, decay, sustain, release ) ); pInstrument->set_gain( node->read_float( "gain", 1.0f, true, false ) ); pInstrument->set_mute_group( node->read_int( "muteGroup", -1, true, false ) ); pInstrument->set_midi_out_channel( node->read_int( "midiOutChannel", -1, true, false ) ); pInstrument->set_midi_out_note( node->read_int( "midiOutNote", pInstrument->__midi_out_note, true, false ) ); pInstrument->set_stop_notes( node->read_bool( "isStopNote", true,false ) ); QString sRead_sample_select_algo = node->read_string( "sampleSelectionAlgo", "VELOCITY" ); if ( sRead_sample_select_algo.compare("VELOCITY") == 0 ) { pInstrument->set_sample_selection_alg( VELOCITY ); } else if ( sRead_sample_select_algo.compare("ROUND_ROBIN") == 0 ) { pInstrument->set_sample_selection_alg( ROUND_ROBIN ); } else if ( sRead_sample_select_algo.compare("RANDOM") == 0 ) { pInstrument->set_sample_selection_alg( RANDOM ); } pInstrument->set_hihat_grp( node->read_int( "isHihat", -1, true ) ); pInstrument->set_lower_cc( node->read_int( "lower_cc", 0, true ) ); pInstrument->set_higher_cc( node->read_int( "higher_cc", 127, true ) ); for ( int i=0; iset_fx_level( node->read_float( QString( "FX%1Level" ).arg( i+1 ), 0.0 ), i ); } XMLNode ComponentNode = node->firstChildElement( "instrumentComponent" ); while ( !ComponentNode.isNull() ) { pInstrument->get_components()->push_back( InstrumentComponent::load_from( &ComponentNode, dk_path ) ); ComponentNode = ComponentNode.nextSiblingElement( "instrumentComponent" ); } return pInstrument; } void Instrument::load_samples() { for (std::vector::iterator it = get_components()->begin() ; it != get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; for ( int i = 0; i < InstrumentComponent::getMaxLayers(); i++ ) { InstrumentLayer* pLayer = pComponent->get_layer( i ); if( pLayer ) { pLayer->load_sample(); } } } } void Instrument::unload_samples() { for (std::vector::iterator it = get_components()->begin() ; it != get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; for ( int i = 0; i < InstrumentComponent::getMaxLayers(); i++ ) { InstrumentLayer* pLayer = pComponent->get_layer( i ); if( pLayer ){ pLayer->unload_sample(); } } } } void Instrument::save_to( XMLNode* node, int component_id ) { XMLNode InstrumentNode = node->createNode( "instrument" ); InstrumentNode.write_int( "id", __id ); InstrumentNode.write_string( "name", __name ); InstrumentNode.write_float( "volume", __volume ); InstrumentNode.write_bool( "isMuted", __muted ); InstrumentNode.write_float( "pan_L", __pan_l ); InstrumentNode.write_float( "pan_R", __pan_r ); InstrumentNode.write_float( "randomPitchFactor", __random_pitch_factor ); InstrumentNode.write_float( "gain", __gain ); InstrumentNode.write_bool( "applyVelocity", __apply_velocity ); InstrumentNode.write_bool( "filterActive", __filter_active ); InstrumentNode.write_float( "filterCutoff", __filter_cutoff ); InstrumentNode.write_float( "filterResonance", __filter_resonance ); InstrumentNode.write_float( "Attack", __adsr->get_attack() ); InstrumentNode.write_float( "Decay", __adsr->get_decay() ); InstrumentNode.write_float( "Sustain", __adsr->get_sustain() ); InstrumentNode.write_float( "Release", __adsr->get_release() ); InstrumentNode.write_int( "muteGroup", __mute_group ); InstrumentNode.write_int( "midiOutChannel", __midi_out_channel ); InstrumentNode.write_int( "midiOutNote", __midi_out_note ); InstrumentNode.write_bool( "isStopNote", __stop_notes ); switch ( __sample_selection_alg ) { case VELOCITY: InstrumentNode.write_string( "sampleSelectionAlgo", "VELOCITY" ); break; case RANDOM: InstrumentNode.write_string( "sampleSelectionAlgo", "RANDOM" ); break; case ROUND_ROBIN: InstrumentNode.write_string( "sampleSelectionAlgo", "ROUND_ROBIN" ); break; } InstrumentNode.write_int( "isHihat", __hihat_grp ); InstrumentNode.write_int( "lower_cc", __lower_cc ); InstrumentNode.write_int( "higher_cc", __higher_cc ); for ( int i=0; i::iterator it = __components->begin() ; it != __components->end(); ++it) { InstrumentComponent* pComponent = *it; if( component_id == -1 || pComponent->get_drumkit_componentID() == component_id ) { pComponent->save_to( &InstrumentNode, component_id ); } } } void Instrument::set_adsr( ADSR* adsr ) { if( __adsr ) { delete __adsr; } __adsr = adsr; } InstrumentComponent* Instrument::get_component( int DrumkitComponentID ) { for (std::vector::iterator it = get_components()->begin() ; it != get_components()->end(); ++it) { if( (*it)->get_drumkit_componentID() == DrumkitComponentID ) { return *it; } } return nullptr; } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/instrument_component.cpp000066400000000000000000000077541366722712400246110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include namespace H2Core { const char* InstrumentComponent::__class_name = "InstrumentComponent"; int InstrumentComponent::m_nMaxLayers; InstrumentComponent::InstrumentComponent( int related_drumkit_componentID ) : Object( __class_name ) , __related_drumkit_componentID( related_drumkit_componentID ) , __gain( 1.0 ) { __layers.resize( m_nMaxLayers ); for ( int i = 0; i < m_nMaxLayers; i++ ) { __layers[i] = nullptr; } } InstrumentComponent::InstrumentComponent( InstrumentComponent* other ) : Object( __class_name ) , __related_drumkit_componentID( other->__related_drumkit_componentID ) , __gain( other->__gain ) { __layers.resize( m_nMaxLayers ); for ( int i = 0; i < m_nMaxLayers; i++ ) { InstrumentLayer* other_layer = other->get_layer( i ); if ( other_layer ) { __layers[i] = new InstrumentLayer( other_layer, other_layer->get_sample()); } else { __layers[i] = nullptr; } } } InstrumentComponent::~InstrumentComponent() { for ( int i = 0; i < m_nMaxLayers; i++ ) { delete __layers[i]; __layers[i] = nullptr; } } void InstrumentComponent::set_layer( InstrumentLayer* layer, int idx ) { assert( idx >= 0 && idx < m_nMaxLayers ); if ( __layers[ idx ] ) { delete __layers[ idx ]; } __layers[ idx ] = layer; } void InstrumentComponent::setMaxLayers( int layers ) { m_nMaxLayers = layers; } int InstrumentComponent::getMaxLayers() { return m_nMaxLayers; } InstrumentComponent* InstrumentComponent::load_from( XMLNode* node, const QString& dk_path ) { int id = node->read_int( "component_id", EMPTY_INSTR_ID, false, false ); if ( id==EMPTY_INSTR_ID ) { return nullptr; } InstrumentComponent* pInstrumentComponent = new InstrumentComponent( id ); pInstrumentComponent->set_gain( node->read_float( "gain", 1.0f, true, false ) ); XMLNode layer_node = node->firstChildElement( "layer" ); int n = 0; while ( !layer_node.isNull() ) { if ( n >= m_nMaxLayers ) { ERRORLOG( QString( "n (%1) >= m_nMaxLayers (%2)" ).arg( n ).arg( m_nMaxLayers ) ); break; } pInstrumentComponent->set_layer( InstrumentLayer::load_from( &layer_node, dk_path ), n ); n++; layer_node = layer_node.nextSiblingElement( "layer" ); } return pInstrumentComponent; } void InstrumentComponent::save_to( XMLNode* node, int component_id ) { XMLNode component_node; if( component_id == -1 ) { component_node = node->createNode( "instrumentComponent" ); component_node.write_int( "component_id", __related_drumkit_componentID ); component_node.write_float( "gain", __gain ); } for ( int n = 0; n < m_nMaxLayers; n++ ) { InstrumentLayer* pLayer = get_layer( n ); if( pLayer ) { if( component_id == -1 ) { pLayer->save_to( &component_node ); } else { pLayer->save_to( node ); } } } } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/instrument_layer.cpp000066400000000000000000000060241366722712400237100ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* InstrumentLayer::__class_name = "InstrumentLayer"; InstrumentLayer::InstrumentLayer( Sample* sample ) : Object( __class_name ), __start_velocity( 0.0 ), __end_velocity( 1.0 ), __pitch( 0.0 ), __gain( 1.0 ), __sample( sample ) { } InstrumentLayer::InstrumentLayer( InstrumentLayer* other ) : Object( __class_name ), __start_velocity( other->get_start_velocity() ), __end_velocity( other->get_end_velocity() ), __pitch( other->get_pitch() ), __gain( other->get_gain() ), __sample( new Sample( other->get_sample() ) ) { } InstrumentLayer::InstrumentLayer( InstrumentLayer* other, Sample* sample ) : Object( __class_name ), __start_velocity( other->get_start_velocity() ), __end_velocity( other->get_end_velocity() ), __pitch( other->get_pitch() ), __gain( other->get_gain() ), __sample( new Sample( sample ) ) { } InstrumentLayer::~InstrumentLayer() { delete __sample; __sample = nullptr; } void InstrumentLayer::set_sample( Sample* sample ) { if ( __sample ) { delete __sample; } __sample = sample; } void InstrumentLayer::load_sample() { if( __sample ) __sample->load(); } void InstrumentLayer::unload_sample() { if( __sample ) __sample->unload(); } InstrumentLayer* InstrumentLayer::load_from( XMLNode* node, const QString& dk_path ) { Sample* sample = new Sample( dk_path+"/"+node->read_string( "filename", "" ) ); InstrumentLayer* layer = new InstrumentLayer( sample ); layer->set_start_velocity( node->read_float( "min", 0.0 ) ); layer->set_end_velocity( node->read_float( "max", 1.0 ) ); layer->set_gain( node->read_float( "gain", 1.0, true, false ) ); layer->set_pitch( node->read_float( "pitch", 0.0, true, false ) ); return layer; } void InstrumentLayer::save_to( XMLNode* node ) { XMLNode layer_node = node->createNode( "layer" ); layer_node.write_string( "filename", get_sample()->get_filename() ); layer_node.write_float( "min", __start_velocity ); layer_node.write_float( "max", __end_velocity ); layer_node.write_float( "gain", __gain ); layer_node.write_float( "pitch", __pitch ); } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/instrument_list.cpp000066400000000000000000000155041366722712400235520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* InstrumentList::__class_name = "InstrumentList"; InstrumentList::InstrumentList() : Object( __class_name ) { } InstrumentList::InstrumentList( InstrumentList* other ) : Object( __class_name ) { assert( __instruments.size() == 0 ); for ( int i=0; isize(); i++ ) { ( *this ) << ( new Instrument( ( *other )[i] ) ); } } InstrumentList::~InstrumentList() { for ( int i = 0; i < __instruments.size(); ++i ) { delete __instruments[i]; } } void InstrumentList::load_samples() { for( int i=0; i<__instruments.size(); i++ ) { __instruments[i]->load_samples(); } } void InstrumentList::unload_samples() { for( int i=0; i<__instruments.size(); i++ ) { __instruments[i]->unload_samples(); } } InstrumentList* InstrumentList::load_from( XMLNode* node, const QString& dk_path, const QString& dk_name ) { InstrumentList* instruments = new InstrumentList(); XMLNode instrument_node = node->firstChildElement( "instrument" ); int count = 0; while ( !instrument_node.isNull() ) { count++; if ( count > MAX_INSTRUMENTS ) { ERRORLOG( QString( "instrument count >= %2, stop reading instruments" ).arg( MAX_INSTRUMENTS ) ); break; } Instrument* instrument = Instrument::load_from( &instrument_node, dk_path, dk_name ); if( instrument ) { ( *instruments ) << instrument; } else { ERRORLOG( QString( "Empty ID for instrument %1. The drumkit is corrupted. Skipping instrument" ).arg( count ) ); count--; } instrument_node = instrument_node.nextSiblingElement( "instrument" ); } return instruments; } void InstrumentList::save_to( XMLNode* node, int component_id ) { XMLNode instruments_node = node->createNode( "instrumentList" ); for ( int i = 0; i < size(); i++ ) { ( *this )[i]->save_to( &instruments_node, component_id ); } } void InstrumentList::operator<<( Instrument* instrument ) { // do nothing if already in __instruments for( int i=0; i<__instruments.size(); i++ ) { if( __instruments[i]==instrument ) return; } __instruments.push_back( instrument ); } void InstrumentList::add( Instrument* instrument ) { // do nothing if already in __instruments for( int i=0; i<__instruments.size(); i++ ) { if( __instruments[i]==instrument ) return; } __instruments.push_back( instrument ); } void InstrumentList::insert( int idx, Instrument* instrument ) { // do nothing if already in __instruments for( int i=0; i<__instruments.size(); i++ ) { if( __instruments[i]==instrument ) return; } __instruments.insert( __instruments.begin() + idx, instrument ); } Instrument* InstrumentList::operator[]( int idx ) { if ( idx < 0 || idx >= __instruments.size() ) { ERRORLOG( QString( "idx %1 out of [0;%2]" ).arg( idx ).arg( size() ) ); return nullptr; } assert( idx >= 0 && idx < __instruments.size() ); return __instruments[idx]; } bool InstrumentList::is_valid_index( int idx ) const { bool is_valid_index = true; if ( idx < 0 || idx >= __instruments.size() ) { is_valid_index = false; } return is_valid_index; } Instrument* InstrumentList::get( int idx ) { if ( !is_valid_index( idx ) ) { ERRORLOG( QString( "idx %1 out of [0;%2]" ).arg( idx ).arg( size() ) ); return nullptr; } assert( idx >= 0 && idx < __instruments.size() ); return __instruments[idx]; } int InstrumentList::index( Instrument* instr ) { for( int i=0; i<__instruments.size(); i++ ) { if ( __instruments[i]==instr ) return i; } return -1; } Instrument* InstrumentList::find( const int id ) { for( int i=0; i<__instruments.size(); i++ ) { if ( __instruments[i]->get_id()==id ) return __instruments[i]; } return nullptr; } Instrument* InstrumentList::find( const QString& name ) { for( int i=0; i<__instruments.size(); i++ ) { if ( __instruments[i]->get_name()==name ) return __instruments[i]; } return nullptr; } Instrument* InstrumentList::findMidiNote( const int note ) { for( int i=0; i<__instruments.size(); i++ ) { if ( __instruments[i]->get_midi_out_note()==note ) return __instruments[i]; } return nullptr; } Instrument* InstrumentList::del( int idx ) { assert( idx >= 0 && idx < __instruments.size() ); Instrument* instrument = __instruments[idx]; __instruments.erase( __instruments.begin() + idx ); return instrument; } Instrument* InstrumentList::del( Instrument* instrument ) { for( int i=0; i<__instruments.size(); i++ ) { if( __instruments[i]==instrument ) { __instruments.erase( __instruments.begin() + i ); return instrument; } } return nullptr; } void InstrumentList::swap( int idx_a, int idx_b ) { assert( idx_a >= 0 && idx_a < __instruments.size() ); assert( idx_b >= 0 && idx_b < __instruments.size() ); if( idx_a == idx_b ) return; //DEBUGLOG(QString("===>> SWAP %1 %2").arg(idx_a).arg(idx_b) ); Instrument* tmp = __instruments[idx_a]; __instruments[idx_a] = __instruments[idx_b]; __instruments[idx_b] = tmp; } void InstrumentList::move( int idx_a, int idx_b ) { assert( idx_a >= 0 && idx_a < __instruments.size() ); assert( idx_b >= 0 && idx_b < __instruments.size() ); if( idx_a == idx_b ) return; //DEBUGLOG(QString("===>> MOVE %1 %2").arg(idx_a).arg(idx_b) ); Instrument* tmp = __instruments[idx_a]; __instruments.erase( __instruments.begin() + idx_a ); __instruments.insert( __instruments.begin() + idx_b, tmp ); } void InstrumentList::fix_issue_307() { if ( has_all_midi_notes_same() ) { WARNINGLOG( "Same MIDI note assigned to every instrument. Assigning default values." ); set_default_midi_out_notes(); } } bool InstrumentList::has_all_midi_notes_same() const { if (__instruments.size() < 2) { return false; } std::set notes; for( int i=0; i<__instruments.size(); i++ ) { auto instr = __instruments[i]; notes.insert( instr->get_midi_out_note() ); } return notes.size() == 1; } void InstrumentList::set_default_midi_out_notes() { for( int i=0; i<__instruments.size(); i++ ) { __instruments[i]->set_midi_out_note( i + 36 ); } } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/note.cpp000066400000000000000000000162131366722712400212520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* Note::__class_name = "Note"; const char* Note::__key_str[] = { "C", "Cs", "D", "Ef", "E", "F", "Fs", "G", "Af", "A", "Bf", "B" }; Note::Note( Instrument* instrument, int position, float velocity, float pan_l, float pan_r, int length, float pitch ) : Object( __class_name ), __instrument( instrument ), __instrument_id( 0 ), __specific_compo_id( -1 ), __position( position ), __velocity( velocity ), __pan_l( PAN_MAX ), __pan_r( PAN_MAX ), __length( length ), __pitch( pitch ), __key( C ), __octave( P8 ), __adsr( nullptr ), __lead_lag( 0.0 ), __cut_off( 1.0 ), __resonance( 0.0 ), __humanize_delay( 0 ), __bpfb_l( 0.0 ), __bpfb_r( 0.0 ), __lpfb_l( 0.0 ), __lpfb_r( 0.0 ), __pattern_idx( 0 ), __midi_msg( -1 ), __note_off( false ), __just_recorded( false ), __probability( 1.0f ) { if ( __instrument != nullptr ) { __adsr = __instrument->copy_adsr(); __instrument_id = __instrument->get_id(); for (std::vector::iterator it = __instrument->get_components()->begin() ; it !=__instrument->get_components()->end(); ++it) { InstrumentComponent *pCompo = *it; SelectedLayerInfo *sampleInfo = new SelectedLayerInfo; sampleInfo->SelectedLayer = -1; sampleInfo->SamplePosition = 0; __layers_selected[ pCompo->get_drumkit_componentID() ] = sampleInfo; } } set_pan_l(pan_l); set_pan_r(pan_r); } Note::Note( Note* other, Instrument* instrument ) : Object( __class_name ), __instrument( other->get_instrument() ), __instrument_id( 0 ), __specific_compo_id( -1 ), __position( other->get_position() ), __velocity( other->get_velocity() ), __pan_l( other->get_pan_l() ), __pan_r( other->get_pan_r() ), __length( other->get_length() ), __pitch( other->get_pitch() ), __key( other->get_key() ), __octave( other->get_octave() ), __adsr( nullptr ), __lead_lag( other->get_lead_lag() ), __cut_off( other->get_cut_off() ), __resonance( other->get_resonance() ), __humanize_delay( other->get_humanize_delay() ), __bpfb_l( other->get_bpfb_l() ), __bpfb_r( other->get_bpfb_r() ), __lpfb_l( other->get_lpfb_l() ), __lpfb_r( other->get_lpfb_r() ), __pattern_idx( other->get_pattern_idx() ), __midi_msg( other->get_midi_msg() ), __note_off( other->get_note_off() ), __just_recorded( other->get_just_recorded() ), __probability( other->get_probability() ) { if ( instrument != nullptr ) __instrument = instrument; if ( __instrument != nullptr ) { __adsr = __instrument->copy_adsr(); __instrument_id = __instrument->get_id(); for (std::vector::iterator it = __instrument->get_components()->begin() ; it !=__instrument->get_components()->end(); ++it) { InstrumentComponent *pCompo = *it; SelectedLayerInfo *sampleInfo = new SelectedLayerInfo; sampleInfo->SelectedLayer = -1; sampleInfo->SamplePosition = 0; __layers_selected[ pCompo->get_drumkit_componentID() ] = sampleInfo; } } } Note::~Note() { delete __adsr; __adsr = nullptr; } static inline float check_boundary( float v, float min, float max ) { if ( v>max ) return max; if ( vfind( __instrument_id ); if( !instr ) { ERRORLOG( QString( "Instrument with ID: '%1' not found. Using empty instrument." ).arg( __instrument_id ) ); __instrument = new Instrument(); } else { __instrument = instr; } } QString Note::key_to_string() { return QString( "%1%2" ).arg( __key_str[__key] ).arg( __octave ); } void Note::set_key_octave( const QString& str ) { int l = str.length(); QString s_key = str.left( l-1 ); QString s_oct = str.mid( l-1, l ); if ( s_key.endsWith( "-" ) ) { s_key.replace( "-", "" ); s_oct.insert( 0, "-" ); } __octave = ( Octave )s_oct.toInt(); for( int i=KEY_MIN; i<=KEY_MAX; i++ ) { if( __key_str[i]==s_key ) { __key = ( Key )i; return; } } ___ERRORLOG( "Unhandled key: " + s_key ); } void Note::dump() { INFOLOG( QString( "Note : pos: %1\t humanize offset%2\t instr: %3\t key: %4\t pitch: %5" ) .arg( __position ) .arg( __humanize_delay ) .arg( __instrument->get_name() ) .arg( key_to_string() ) .arg( __pitch ) .arg( __note_off ) ); } void Note::save_to( XMLNode* node ) { node->write_int( "position", __position ); node->write_float( "leadlag", __lead_lag ); node->write_float( "velocity", __velocity ); node->write_float( "pan_L", __pan_l ); node->write_float( "pan_R", __pan_r ); node->write_float( "pitch", __pitch ); node->write_string( "key", key_to_string() ); node->write_int( "length", __length ); node->write_int( "instrument", get_instrument()->get_id() ); node->write_bool( "note_off", __note_off ); node->write_float( "probability", __probability ); } Note* Note::load_from( XMLNode* node, InstrumentList* instruments ) { Note* note = new Note( nullptr, node->read_int( "position", 0 ), node->read_float( "velocity", 0.8f ), node->read_float( "pan_L", 0.5f ), node->read_float( "pan_R", 0.5f ), node->read_int( "length", -1 ), node->read_float( "pitch", 0.0f ) ); note->set_lead_lag( node->read_float( "leadlag", 0, false, false ) ); note->set_key_octave( node->read_string( "key", "C0", false, false ) ); note->set_note_off( node->read_bool( "note_off", false, false, false ) ); note->set_instrument_id( node->read_int( "instrument", EMPTY_INSTR_ID ) ); note->map_instrument( instruments ); note->set_probability( node->read_float( "probability", 1.0f )); return note; } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/pattern.cpp000066400000000000000000000221031366722712400217550ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* Pattern::__class_name = "Pattern"; Pattern::Pattern( const QString& name, const QString& info, const QString& category, int length ) : Object( __class_name ) , __length( length ) , __name( name ) , __info( info ) , __category( category ) { } Pattern::Pattern( Pattern* other ) : Object( __class_name ) , __length( other->get_length() ) , __name( other->get_name() ) , __info( other->get_info() ) , __category( other->get_category() ) { FOREACH_NOTE_CST_IT_BEGIN_END( other->get_notes(),it ) { __notes.insert( std::make_pair( it->first, new Note( it->second ) ) ); } } Pattern::~Pattern() { for( notes_cst_it_t it=__notes.begin(); it!=__notes.end(); it++ ) { delete it->second; } } Pattern* Pattern::load_file( const QString& pattern_path, InstrumentList* instruments ) { INFOLOG( QString( "Load pattern %1" ).arg( pattern_path ) ); if ( !Filesystem::file_readable( pattern_path ) ) return nullptr; XMLDoc doc; if( !doc.read( pattern_path, Filesystem::pattern_xsd_path() ) ) { return Legacy::load_drumkit_pattern( pattern_path, instruments ); } XMLNode root = doc.firstChildElement( "drumkit_pattern" ); if ( root.isNull() ) { ERRORLOG( "drumkit_pattern node not found" ); return nullptr; } XMLNode pattern_node = root.firstChildElement( "pattern" ); if ( pattern_node.isNull() ) { ERRORLOG( "pattern node not found" ); return nullptr; } return load_from( &pattern_node, instruments ); } Pattern* Pattern::load_from( XMLNode* node, InstrumentList* instruments ) { Pattern* pattern = new Pattern( node->read_string( "name", nullptr, false, false ), node->read_string( "info", "", false, false ), node->read_string( "category", "unknown", false, false ), node->read_int( "size", -1, false, false ) ); // FIXME support legacy xml element pattern_name, should once be removed if ( pattern->get_name().isEmpty() ) { pattern->set_name( node->read_string( "pattern_name", "unknown", false, false ) ); } XMLNode note_list_node = node->firstChildElement( "noteList" ); if ( !note_list_node.isNull() ) { XMLNode note_node = note_list_node.firstChildElement( "note" ); while ( !note_node.isNull() ) { Note* note = Note::load_from( ¬e_node, instruments ); if( note ) { pattern->insert_note( note ); } note_node = note_node.nextSiblingElement( "note" ); } } return pattern; } bool Pattern::save_file( const QString& drumkit_name, const QString& author, const QString& license, const QString& pattern_path, bool overwrite ) const { INFOLOG( QString( "Saving pattern into %1" ).arg( pattern_path ) ); if( !overwrite && Filesystem::file_exists( pattern_path, true ) ) { ERRORLOG( QString( "pattern %1 already exists" ).arg( pattern_path ) ); return false; } XMLDoc doc; XMLNode root = doc.set_root( "drumkit_pattern", "drumkit_pattern" ); root.write_string( "drumkit_name", drumkit_name ); // FIXME loaded with LocalFileMng::getDrumkitNameForPattern(…) root.write_string( "author", author ); // FIXME this is never loaded back root.write_string( "license", license ); // FIXME this is never loaded back save_to( &root ); return doc.write( pattern_path ); } void Pattern::save_to( XMLNode* node, const Instrument* instrumentOnly ) const { XMLNode pattern_node = node->createNode( "pattern" ); pattern_node.write_string( "name", __name ); pattern_node.write_string( "info", __info ); pattern_node.write_string( "category", __category ); pattern_node.write_int( "size", __length ); XMLNode note_list_node = pattern_node.createNode( "noteList" ); int id = ( instrumentOnly == nullptr ? -1 : instrumentOnly->get_id() ); for( auto it=__notes.cbegin(); it!=__notes.cend(); ++it ) { Note* note = it->second; if( note && ( instrumentOnly == nullptr || note->get_instrument()->get_id() == id ) ) { XMLNode note_node = note_list_node.createNode( "note" ); note->save_to( ¬e_node ); } } } Note* Pattern::find_note( int idx_a, int idx_b, Instrument* instrument, Note::Key key, Note::Octave octave, bool strict ) const { for( notes_cst_it_t it=__notes.lower_bound( idx_a ); it!=__notes.upper_bound( idx_a ); it++ ) { Note* note = it->second; assert( note ); if ( note->match( instrument, key, octave ) ) return note; } if( idx_b==-1 ) return nullptr; for( notes_cst_it_t it=__notes.lower_bound( idx_b ); it!=__notes.upper_bound( idx_b ); it++ ) { Note* note = it->second; assert( note ); if ( note->match( instrument, key, octave ) ) return note; } if( strict ) return nullptr; // TODO maybe not start from 0 but idx_b-X for ( int n=0; nsecond; assert( note ); if ( note->match( instrument, key, octave ) && ( ( idx_b<=note->get_position()+note->get_length() ) && idx_b>=note->get_position() ) ) return note; } } return nullptr; } Note* Pattern::find_note( int idx_a, int idx_b, Instrument* instrument, bool strict ) const { notes_cst_it_t it; for( it=__notes.lower_bound( idx_a ); it!=__notes.upper_bound( idx_a ); it++ ) { Note* note = it->second; assert( note ); if ( note->get_instrument() == instrument ) return note; } if( idx_b==-1 ) return nullptr; for( it=__notes.lower_bound( idx_b ); it!=__notes.upper_bound( idx_b ); it++ ) { Note* note = it->second; assert( note ); if ( note->get_instrument() == instrument ) return note; } if ( strict ) return nullptr; // TODO maybe not start from 0 but idx_b-X for ( int n=0; nsecond; assert( note ); if ( note->get_instrument() == instrument && ( ( idx_b<=note->get_position()+note->get_length() ) && idx_b>=note->get_position() ) ) return note; } } return nullptr; } void Pattern::remove_note( Note* note ) { for( notes_it_t it=__notes.begin(); it!=__notes.end(); ++it ) { if( it->second==note ) { __notes.erase( it ); break; } } } bool Pattern::references( Instrument* instr ) { for( notes_cst_it_t it=__notes.begin(); it!=__notes.end(); it++ ) { Note* note = it->second; assert( note ); if ( note->get_instrument() == instr ) { return true; } } return false; } void Pattern::purge_instrument( Instrument* instr ) { bool locked = false; std::list< Note* > slate; for( notes_it_t it=__notes.begin(); it!=__notes.end(); ) { Note* note = it->second; assert( note ); if ( note->get_instrument() == instr ) { if ( !locked ) { H2Core::AudioEngine::get_instance()->lock( RIGHT_HERE ); locked = true; } slate.push_back( note ); __notes.erase( it++ ); } else { ++it; } } if ( locked ) { H2Core::AudioEngine::get_instance()->unlock(); while ( slate.size() ) { delete slate.front(); slate.pop_front(); } } } void Pattern::set_to_old() { for( notes_cst_it_t it=__notes.begin(); it!=__notes.end(); it++ ) { Note* note = it->second; assert( note ); note->set_just_recorded( false ); } } void Pattern::flattened_virtual_patterns_compute() { // __flattened_virtual_patterns must have been cleared before if( __flattened_virtual_patterns.size() >= __virtual_patterns.size() ) return; // for each virtual pattern for( virtual_patterns_cst_it_t it0=__virtual_patterns.begin(); it0!=__virtual_patterns.end(); ++it0 ) { __flattened_virtual_patterns.insert( *it0 ); // add it ( *it0 )->flattened_virtual_patterns_compute(); // build it's flattened virtual patterns set // for each pattern of it's flattened virtual pattern set for( virtual_patterns_cst_it_t it1=( *it0 )->get_flattened_virtual_patterns()->begin(); it1!=( *it0 )->get_flattened_virtual_patterns()->end(); ++it1 ) { // add the pattern __flattened_virtual_patterns.insert( *it1 ); } } } void Pattern::extand_with_flattened_virtual_patterns( PatternList* patterns ) { for( virtual_patterns_cst_it_t it=__flattened_virtual_patterns.begin(); it!=__flattened_virtual_patterns.end(); ++it ) { patterns->add( *it ); } } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/pattern_list.cpp000066400000000000000000000142571366722712400230230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* PatternList::__class_name = "PatternList"; PatternList::PatternList() : Object( __class_name ) { } PatternList::PatternList( PatternList* other ) : Object( __class_name ) { assert( __patterns.size() == 0 ); for ( int i=0; isize(); i++ ) { ( *this ) << ( new Pattern( ( *other )[i] ) ); } } PatternList::~PatternList() { for ( int i = 0; i < __patterns.size(); ++i ) { assert ( __patterns[i] ); delete __patterns[i]; } } void PatternList::operator<<( Pattern* pattern ) { // do nothing if already in __patterns for( int i=0; i<__patterns.size(); i++ ) { if( __patterns[i]==pattern ) return; } __patterns.push_back( pattern ); } void PatternList::add( Pattern* pattern ) { // do nothing if already in __patterns for( int i=0; i<__patterns.size(); i++ ) { if( __patterns[i]==pattern ) return; } __patterns.push_back( pattern ); } void PatternList::insert( int idx, Pattern* pattern ) { // do nothing if already in __patterns for( int i=0; i<__patterns.size(); i++ ) { if( __patterns[i]==pattern ) return; } __patterns.insert( __patterns.begin() + idx, pattern ); } Pattern* PatternList::operator[]( int idx ) { if ( idx < 0 || idx >= __patterns.size() ) { ERRORLOG( QString( "idx %1 out of [0;%2]" ).arg( idx ).arg( size() ) ); return nullptr; } assert( idx >= 0 && idx < __patterns.size() ); return __patterns[idx]; } Pattern* PatternList::get( int idx ) { if ( idx < 0 || idx >= __patterns.size() ) { ERRORLOG( QString( "idx %1 out of [0;%2]" ).arg( idx ).arg( size() ) ); return nullptr; } assert( idx >= 0 && idx < __patterns.size() ); return __patterns[idx]; } const Pattern* PatternList::get( int idx ) const { if ( idx < 0 || idx >= __patterns.size() ) { ERRORLOG( QString( "idx %1 out of [0;%2]" ).arg( idx ).arg( size() ) ); return nullptr; } assert( idx >= 0 && idx < __patterns.size() ); return __patterns[idx]; } int PatternList::index( Pattern* pattern ) { for( int i=0; i<__patterns.size(); i++ ) { if ( __patterns[i]==pattern ) return i; } return -1; } Pattern* PatternList::del( int idx ) { assert( idx >= 0 && idx < __patterns.size() ); Pattern* pattern = __patterns[idx]; __patterns.erase( __patterns.begin() + idx ); return pattern; } Pattern* PatternList::del( Pattern* pattern ) { for( int i=0; i<__patterns.size(); i++ ) { if( __patterns[i]==pattern ) { __patterns.erase( __patterns.begin() + i ); return pattern; } } return nullptr; } Pattern* PatternList::replace( int idx, Pattern* pattern ) { /* * if we insert a new pattern (copy, add new pattern, undo delete pattern and so on will do this) * idx is > __pattern.size(). that's why i add +1 to assert expression */ assert( idx >= 0 && idx <= __patterns.size() +1 ); if( idx < 0 || idx >= __patterns.size() ) { ERRORLOG( QString( "index out of bounds %1 (size:%2)" ).arg( idx ).arg( __patterns.size() ) ); return nullptr; } __patterns.insert( __patterns.begin() + idx, pattern ); __patterns.erase( __patterns.begin() + idx + 1 ); //create return pattern after patternlist tätatä to return the right one Pattern* ret = __patterns[idx]; return ret; } void PatternList::set_to_old() { for( int i=0; i<__patterns.size(); i++ ) { __patterns[i]->set_to_old(); } } Pattern* PatternList::find( const QString& name ) { for( int i=0; i<__patterns.size(); i++ ) { if ( __patterns[i]->get_name()==name ) return __patterns[i]; } return nullptr; } void PatternList::swap( int idx_a, int idx_b ) { assert( idx_a >= 0 && idx_a < __patterns.size() ); assert( idx_b >= 0 && idx_b < __patterns.size() ); if( idx_a == idx_b ) return; //DEBUGLOG(QString("===>> SWAP %1 %2").arg(idx_a).arg(idx_b) ); Pattern* tmp = __patterns[idx_a]; __patterns[idx_a] = __patterns[idx_b]; __patterns[idx_b] = tmp; } void PatternList::move( int idx_a, int idx_b ) { assert( idx_a >= 0 && idx_a < __patterns.size() ); assert( idx_b >= 0 && idx_b < __patterns.size() ); if( idx_a == idx_b ) return; //DEBUGLOG(QString("===>> MOVE %1 %2").arg(idx_a).arg(idx_b) ); Pattern* tmp = __patterns[idx_a]; __patterns.erase( __patterns.begin() + idx_a ); __patterns.insert( __patterns.begin() + idx_b, tmp ); } void PatternList::flattened_virtual_patterns_compute() { for ( int i=0 ; i<__patterns.size() ; i++ ) __patterns[i]->flattened_virtual_patterns_clear(); for ( int i=0 ; i<__patterns.size() ; i++ ) __patterns[i]->flattened_virtual_patterns_compute(); } void PatternList::virtual_pattern_del( Pattern* pattern ) { for( int i=0; i<__patterns.size(); i++ ) __patterns[i]->virtual_patterns_del( pattern ); } bool PatternList::check_name( QString patternName ) { if (patternName == "") { return false; } for (uint i = 0; i < __patterns.size(); i++) { if ( __patterns[i]->get_name() == patternName) { return false; } } return true; } QString PatternList::find_unused_pattern_name( QString sourceName ) { QString unusedPatternNameCandidate; if( sourceName.isEmpty() ) { sourceName = "Pattern 11"; } int i = 1; QString suffix = ""; unusedPatternNameCandidate = sourceName; while( !check_name( unusedPatternNameCandidate + suffix ) ) { suffix = " #" + QString::number(i); i++; } unusedPatternNameCandidate += suffix; return unusedPatternNameCandidate; } } /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/playlist.cpp000066400000000000000000000135171366722712400221520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { Playlist* Playlist::__instance = nullptr; const char* Playlist::__class_name = "Playlist"; Playlist::Playlist() : Object( __class_name ) { __filename = ""; m_nSelectedSongNumber = -1; m_nActiveSongNumber = -1; m_bIsModified = false; } Playlist::~Playlist() { clear(); __instance = nullptr; } void Playlist::create_instance() { if ( __instance == nullptr ) { __instance = new Playlist(); } } void Playlist::clear() { for ( int i = 0; i < __entries.size(); i++ ) { delete __entries[i]; } __entries.clear(); } Playlist* Playlist::load_file( const QString& pl_path, bool useRelativePaths ) { XMLDoc doc; if ( !doc.read( pl_path, Filesystem::playlist_xsd_path() ) ) { Playlist* pl = new Playlist(); Playlist* ret = Legacy::load_playlist( pl, pl_path ); if ( ret == nullptr ) { delete pl; // __instance = 0; return nullptr; } WARNINGLOG( QString( "update playlist %1" ).arg( pl_path ) ); pl->save_file( pl_path, pl->getFilename(), true, useRelativePaths ); return pl; } XMLNode root = doc.firstChildElement( "playlist" ); if ( root.isNull() ) { ERRORLOG( "playlist node not found" ); return nullptr; } QFileInfo fileInfo = QFileInfo( pl_path ); return Playlist::load_from( &root, fileInfo, useRelativePaths ); } Playlist* Playlist::load_from( XMLNode* node, QFileInfo& fileInfo, bool useRelativePaths ) { QString filename = node->read_string( "name", "", false, false ); if ( filename.isEmpty() ) { ERRORLOG( "Playlist has no name, abort" ); return nullptr; } Playlist* pPlaylist = new Playlist(); pPlaylist->setFilename( fileInfo.absoluteFilePath() ); XMLNode songsNode = node->firstChildElement( "songs" ); if ( !songsNode.isNull() ) { XMLNode nextNode = songsNode.firstChildElement( "song" ); while ( !nextNode.isNull() ) { QString songPath = nextNode.read_string( "path", "", false, false ); if ( !songPath.isEmpty() ) { Playlist::Entry* pEntry = new Playlist::Entry(); QFileInfo songPathInfo( fileInfo.absoluteDir(), songPath ); pEntry->filePath = songPathInfo.absoluteFilePath(); pEntry->fileExists = songPathInfo.isReadable(); pEntry->scriptPath = nextNode.read_string( "scriptPath", "" ); pEntry->scriptEnabled = nextNode.read_bool( "scriptEnabled", false ); pPlaylist->add( pEntry ); } nextNode = nextNode.nextSiblingElement( "song" ); } } else { WARNINGLOG( "songs node not found" ); } return pPlaylist; } bool Playlist::save_file( const QString& pl_path, const QString& name, bool overwrite, bool useRelativePaths ) { INFOLOG( QString( "Saving palylist to %1" ).arg( pl_path ) ); if( !overwrite && Filesystem::file_exists( pl_path, true ) ) { ERRORLOG( QString( "palylist %1 already exists" ).arg( pl_path ) ); return false; } setFilename( pl_path ); XMLDoc doc; XMLNode root = doc.set_root( "playlist", "playlist" ); root.write_string( "name", name); XMLNode songs = root.createNode( "songs" ); save_to( &songs, useRelativePaths ); return doc.write( pl_path ); } void Playlist::save_to( XMLNode* node, bool useRelativePaths ) { for (int i = 0; i < size(); i++ ) { Entry* entry = get( i ); QString path = entry->filePath; if ( useRelativePaths ) { path = QDir( Filesystem::playlists_dir() ).relativeFilePath( path ); } XMLNode song_node = node->createNode( "song" ); song_node.write_string( "path", path ); song_node.write_string( "scriptPath", entry->scriptPath ); song_node.write_bool( "scriptEnabled", entry->scriptEnabled); } } Playlist* Playlist::load( const QString& filename, bool useRelativePaths ) { // load_file might set __instance = 0; Playlist* prev = __instance; Playlist* playlist = Playlist::load_file( filename, useRelativePaths ); if ( playlist != nullptr ) { delete prev; __instance = playlist; } else { __instance = prev; } return playlist; } /* This method is called by Event dispatcher thread ( GUI ) */ void Playlist::activateSong( int songNumber ) { setSelectedSongNr( songNumber ); setActiveSongNumber( songNumber ); execScript( songNumber ); } bool Playlist::getSongFilenameByNumber( int songNumber, QString& filename) { bool Success = true; if ( size() == 0 || songNumber >= size() ) { Success = false; } if( Success) { filename = get( songNumber )->filePath; } return Success; } /* This method is called by MIDI thread */ void Playlist::setNextSongByNumber( int songNumber ) { if ( size() == 0 || songNumber >= size() ) { return; } /* NOTE: we are in MIDI thread and can't just call loadSong from here :( */ EventQueue::get_instance()->push_event( EVENT_PLAYLIST_LOADSONG, songNumber ); } void Playlist::execScript( int index) { QString file = get( index )->scriptPath; if ( !get( index )->scriptEnabled || !QFile( file ).exists() ) { return; } std::system( file.toLocal8Bit() ); return; } }; hydrogen-1.0.0-rc1/src/core/src/basics/sample.cpp000066400000000000000000000600501366722712400215640ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_RUBBERBAND) || _DOXYGEN_ #include #define RUBBERBAND_BUFFER_OVERSIZE 500 #define RUBBERBAND_DEBUG 0 #endif namespace H2Core { const char* Sample::__class_name = "Sample"; const char* EnvelopePoint::__class_name = "EnvolopePoint"; const char* Sample::__loop_modes[] = { "forward", "reverse", "pingpong" }; #if defined(H2CORE_HAVE_RUBBERBAND) || _DOXYGEN_ static double compute_pitch_scale( const Sample::Rubberband& r ); static RubberBand::RubberBandStretcher::Options compute_rubberband_options( const Sample::Rubberband& r ); #endif /* EnvelopePoint */ EnvelopePoint::EnvelopePoint() : Object( EnvelopePoint::__class_name ), frame( 0 ), value( 0 ) { } EnvelopePoint::EnvelopePoint( int f, int v ) : Object( EnvelopePoint::__class_name ), frame( f ), value( v ) { } EnvelopePoint::EnvelopePoint( EnvelopePoint* other ) : Object( EnvelopePoint::__class_name ) { frame = other->frame; value = other->value; } /* EnvelopePoint */ Sample::Sample( const QString& filepath, int frames, int sample_rate, float* data_l, float* data_r ) : Object( Sample::__class_name ), __filepath( filepath ), __frames( frames ), __sample_rate( sample_rate ), __data_l( data_l ), __data_r( data_r ), __is_modified( false ) { assert( filepath.lastIndexOf( "/" ) >0 ); } Sample::Sample( Sample* pOther ): Object( __class_name ), __filepath( pOther->get_filepath() ), __frames( pOther->get_frames() ), __sample_rate( pOther->get_sample_rate() ), __data_l( nullptr ), __data_r( nullptr ), __is_modified( pOther->get_is_modified() ), __loops( pOther->__loops ), __rubberband( pOther->__rubberband ) { __data_l = new float[__frames]; __data_r = new float[__frames]; // Since the third argument of memcpy takes the number of bytes, // which are about to be copied, and the data is given in float, // which are four bytes each, the number of copied frames // `__frames` has to be multiplied by four. memcpy( __data_l, pOther->get_data_l(), __frames * 4 ); memcpy( __data_r, pOther->get_data_r(), __frames * 4 ); PanEnvelope* pPan = pOther->get_pan_envelope(); for( int i=0; isize(); i++ ) { __pan_envelope.push_back( std::make_unique( pPan->at(i).get() ) ); } PanEnvelope* pVelocity = pOther->get_velocity_envelope(); for( int i=0; isize(); i++ ) { __velocity_envelope.push_back( std::make_unique( pVelocity->at(i).get() ) ); } } Sample::~Sample() { if( __data_l!=nullptr ) delete[] __data_l; if( __data_r!=nullptr ) delete[] __data_r; } void Sample::set_filename( const QString& filename ) { QFileInfo Filename = QFileInfo( filename ); QFileInfo Dest = QFileInfo( __filepath ); __filepath = QDir(Dest.absolutePath()).filePath( Filename.fileName() ); } Sample* Sample::load( const QString& filepath ) { Sample* pSample = nullptr; if( !Filesystem::file_readable( filepath ) ) { ERRORLOG( QString( "Unable to read %1" ).arg( filepath ) ); } else { pSample = new Sample( filepath ); if( !pSample->load() ) { delete pSample; pSample = nullptr; } } return pSample; } Sample* Sample::load( const QString& filepath, const Loops& loops, const Rubberband& rubber, const VelocityEnvelope& velocity, const PanEnvelope& pan ) { Sample* pSample = Sample::load( filepath ); if( pSample ){ pSample->apply( loops, rubber, velocity, pan ); } return pSample; } void Sample::apply( const Loops& loops, const Rubberband& rubber, const VelocityEnvelope& velocity, const PanEnvelope& pan ) { apply_loops( loops ); apply_velocity( velocity ); apply_pan( pan ); #ifdef H2CORE_HAVE_RUBBERBAND apply_rubberband( rubber ); #else exec_rubberband_cli( rubber ); #endif } bool Sample::load() { // Will contain a bunch of metadata about the loaded sample. SF_INFO sound_info = {0}; // Opens file in read-only mode. SNDFILE* file = sf_open( __filepath.toLocal8Bit(), SFM_READ, &sound_info ); if ( !file ) { ERRORLOG( QString( "[Sample::load] Error loading file %1" ).arg( __filepath ) ); return false; } // Sanity check. SAMPLE_CHANNELS is defined in // core/include/hydrogen/globals.h and set to 2. if ( sound_info.channels > SAMPLE_CHANNELS ) { WARNINGLOG( QString( "can't handle %1 channels, only 2 will be used" ).arg( sound_info.channels ) ); sound_info.channels = SAMPLE_CHANNELS; } if ( sound_info.frames > ( std::numeric_limits::max()/sound_info.channels ) ) { WARNINGLOG( QString( "sample frames count (%1) and channels (%2) are too much, truncate it." ).arg( sound_info.frames ).arg( sound_info.channels ) ); sound_info.frames = ( std::numeric_limits::max()/sound_info.channels ); } // Create an array, which will hold the block of samples read // from file. float* buffer = new float[ sound_info.frames * sound_info.channels ]; //memset( buffer, 0, sound_info.frames *sound_info.channels ); // Read all frames into `buffer'. Libsndfile does seamlessly // convert the format of the underlying data on the fly. The // output will be an array of floats regardless of file's // encoding (e.g. 16 bit PCM). sf_count_t count = sf_read_float( file, buffer, sound_info.frames * sound_info.channels ); if( count==0 ){ WARNINGLOG( QString( "%1 is an empty sample" ).arg( __filepath ) ); } // Deallocate the handler. if ( sf_close( file ) != 0 ){ WARNINGLOG( QString( "Unable to close sample file %1" ).arg( __filepath ) ); } // Flush the current content of the left and right channel and // the current metadata. unload(); // Save the metadata of the loaded file into private members // of the Sample class. __frames = sound_info.frames; __sample_rate = sound_info.samplerate; // Split the loaded frames into left and right channel. // If only one channels was present in the underlying data, // duplicate its content. __data_l = new float[ sound_info.frames ]; __data_r = new float[ sound_info.frames ]; if ( sound_info.channels == 1 ) { memcpy( __data_l, buffer, __frames * sizeof( float ) ); memcpy( __data_r, buffer, __frames * sizeof( float ) ); } else if ( sound_info.channels == SAMPLE_CHANNELS ) { for ( int i = 0; i < __frames; i++ ) { __data_l[i] = buffer[i * SAMPLE_CHANNELS]; __data_r[i] = buffer[i * SAMPLE_CHANNELS + 1]; } } delete[] buffer; return true; } bool Sample::apply_loops( const Loops& lo ) { if( __loops == lo ) return true; if( lo.start_frame<0 ) { ERRORLOG( QString( "start_frame %1 < 0 is not allowed" ).arg( lo.start_frame ) ); return false; } if( lo.loop_frame__frames ) { ERRORLOG( QString( "end_frame %1 > __frames %2 is not allowed" ).arg( lo.end_frame ).arg( __frames ) ); return false; } if( lo.count<0 ) { ERRORLOG( QString( "count %1 < 0 is not allowed" ).arg( lo.count ) ); return false; } //if( lo == __loops ) return true; bool full_loop = lo.start_frame==lo.loop_frame; int full_length = lo.end_frame - lo.start_frame; int loop_length = lo.end_frame - lo.loop_frame; int new_length = full_length + loop_length * lo.count; float* new_data_l = new float[ new_length ]; float* new_data_r = new float[ new_length ]; // copy full_length frames to new_data if ( lo.mode==Loops::REVERSE && ( lo.count==0 || full_loop ) ) { if( full_loop ) { // copy end => start for( int i=0, j=lo.end_frame; i loop int to_loop = lo.loop_frame - lo.start_frame; memcpy( new_data_l, __data_l+lo.start_frame, sizeof( float )*to_loop ); memcpy( new_data_r, __data_r+lo.start_frame, sizeof( float )*to_loop ); // copy end => loop for( int i=to_loop, j=lo.end_frame; i end memcpy( new_data_l, __data_l+lo.start_frame, sizeof( float )*full_length ); memcpy( new_data_r, __data_r+lo.start_frame, sizeof( float )*full_length ); } // copy the loops if( lo.count>0 ) { int x = full_length; bool forward = ( lo.mode==Loops::FORWARD ); bool ping_pong = ( lo.mode==Loops::PINGPONG ); for( int i=0; i end memcpy( &new_data_l[x], __data_l+lo.loop_frame, sizeof( float )*loop_length ); memcpy( &new_data_r[x], __data_r+lo.loop_frame, sizeof( float )*loop_length ); } else { // copy end => loop for( int i=lo.end_frame, y=x; i>lo.loop_frame; i--, y++ ) new_data_l[y]=__data_l[i]; for( int i=lo.end_frame, y=x; i>lo.loop_frame; i--, y++ ) new_data_r[y]=__data_r[i]; } x+=loop_length; if( ping_pong ) forward=!forward; } assert( x==new_length ); } __loops = lo; delete [] __data_l; delete [] __data_r; __data_l = new_data_l; __data_r = new_data_r; __frames = new_length; __is_modified = true; return true; } void Sample::apply_velocity( const VelocityEnvelope& v ) { // TODO frame width (841) and height (91) should go out of here // the VelocityEnvelope should be processed within TargetWaveDisplay // so that we here have ( int frame_idx, float scale ) points // but that will break the xml storage if( v.empty() && __velocity_envelope.empty() ) { return; } __velocity_envelope.clear(); if ( v.size() > 0 ) { float inv_resolution = __frames / 841.0F; for ( int i = 1; i < v.size(); i++ ) { float y = ( 91 - v[i - 1]->value ) / 91.0F; float k = ( 91 - v[i]->value ) / 91.0F; int start_frame = v[i - 1]->frame * inv_resolution; int end_frame = v[i]->frame * inv_resolution; if ( i == v.size() -1 ) end_frame = __frames; int length = end_frame - start_frame ; float step = ( y - k ) / length;; for ( int z = start_frame ; z < end_frame; z++ ) { __data_l[z] = __data_l[z] * y; __data_r[z] = __data_r[z] * y; y-=step; } } for(auto& pEnvPtr : v){ __velocity_envelope.emplace_back( std::make_unique( pEnvPtr.get() ) ); } } __is_modified = true; } void Sample::apply_pan( const PanEnvelope& p ) { // TODO see apply_velocity if( p.empty() && __pan_envelope.empty() ) { return; } __pan_envelope.clear(); if ( p.size() > 0 ) { float inv_resolution = __frames / 841.0F; for ( int i = 1; i < p.size(); i++ ) { float y = ( 45 - p[i - 1]->value ) / 45.0F; float k = ( 45 - p[i]->value ) / 45.0F; int start_frame = p[i - 1]->frame * inv_resolution; int end_frame = p[i]->frame * inv_resolution; if ( i == p.size() -1 ) end_frame = __frames; int length = end_frame - start_frame ; float step = ( y - k ) / length;; for ( int z = start_frame ; z < end_frame; z++ ) { // seems wrong to modify only one channel ?!?! if( y < 0 ) { float k = 1 + y; __data_l[z] = __data_l[z] * k; __data_r[z] = __data_r[z]; } else if ( y > 0 ) { float k = 1 - y; __data_l[z] = __data_l[z]; __data_r[z] = __data_r[z] * k; } else if( y==0 ) { __data_l[z] = __data_l[z]; __data_r[z] = __data_r[z]; } y-=step; } } for(auto& pEnvPtr : p){ __pan_envelope.emplace_back( std::make_unique( pEnvPtr.get() ) ); } } __is_modified = true; } void Sample::apply_rubberband( const Rubberband& rb ) { // TODO see Rubberband declaration in sample.h #ifdef H2CORE_HAVE_RUBBERBAND //if( __rubberband == rb ) return; if( !rb.use ) return; // compute rubberband options double output_duration = 60.0 / Hydrogen::get_instance()->getNewBpmJTM() * rb.divider; double time_ratio = output_duration / get_sample_duration(); RubberBand::RubberBandStretcher::Options options = compute_rubberband_options( rb ); double pitch_scale = compute_pitch_scale( rb ); // output buffer int out_buffer_size = ( int )( __frames* time_ratio + 0.1 ); // instantiate rubberband RubberBand::RubberBandStretcher* rubber = new RubberBand::RubberBandStretcher( __sample_rate, 2, options, time_ratio, pitch_scale ); rubber->setDebugLevel( RUBBERBAND_DEBUG ); rubber->setExpectedInputDuration( __frames ); //DEBUGLOG( QString( "on %1\n\toptions\t\t: %2\n\ttime ratio\t: %3\n\tpitch\t\t: %4" ).arg( get_filename() ).arg( options ).arg( time_ratio ).arg( pitch_scale ) ); int block_size = Hydrogen::get_instance()->getAudioOutput()->getBufferSize(); float* ibuf[2]; int studied = 0; while( studied < __frames ) { bool final = (studied + block_size >= __frames); int ibs = (final ? (__frames-studied) : block_size ); //___DEBUGLOG( QString(" ibs : %1").arg( ibs ) ); float tempIbufL[ibs]; float tempIbufR[ibs]; for(int i = 0 ; i < ibs; i++) { tempIbufL[i] = __data_l[i + studied]; tempIbufR[i] = __data_r[i + studied]; } ibuf[0] = tempIbufL; ibuf[1] = tempIbufR; rubber->study( ibuf, ibs, final ); studied += ibs; if( final ) break; } //int buffer_free = out_buffer_size; float* out_data_l= new float[ out_buffer_size ]; float* out_data_r = new float[ out_buffer_size ]; // retrieve data float* obuf[2]; int processed = 0; int available = 0; int retrieved = 0; while( processed < __frames ) { bool final = (processed + block_size >= __frames); int ibs = (final ? (__frames-processed) : block_size ); float tempIbufL[ibs]; float tempIbufR[ibs]; for(int i = 0 ; i < ibs; i++) { tempIbufL[i] = __data_l[i + processed]; tempIbufR[i] = __data_r[i + processed]; } ibuf[0] = tempIbufL; ibuf[1] = tempIbufR; rubber->process( ibuf, ibs, final ); processed += ibs; // first run of stretcher.retrieve() frames. // we retrieve audio frames from stretcher until // available is >0. but important here is that stretcher // is not finished processing even available is 0. // stretcher finished with -1. but this status we // cannot reach here, because stretcher becomes new // inputbuffer in this while loop. // we need a final run of stretcher after input processing loop // is finished while( (available=rubber->available())>0) { obuf[0] = &out_data_l[retrieved]; obuf[1] = &out_data_r[retrieved]; int n = rubber->retrieve( obuf, available); retrieved += n; //buffer_free -= n; } if( final ) break; } // second run of stretcher to retrieve all last // frames until stretcher returns -1. while( (available=rubber->available())!= -1) { obuf[0] = &out_data_l[retrieved]; obuf[1] = &out_data_r[retrieved]; int n = rubber->retrieve( obuf, available); retrieved += n; //buffer_free -= n; } // qDebug()<<"outputbuffersize"<available(); // DEBUGLOG( QString( "%1 frames processed, %2 frames retrieved" ).arg( __frames ).arg( retrieved ) ); // final data buffers delete [] __data_l; delete [] __data_r; __data_l = new float[ retrieved ]; __data_r = new float[ retrieved ]; memcpy( __data_l, out_data_l, retrieved*sizeof( float ) ); memcpy( __data_r, out_data_r, retrieved*sizeof( float ) ); delete [] out_data_l; delete [] out_data_r; // update sample __rubberband = rb; __frames = retrieved; __is_modified = true; #endif } bool Sample::exec_rubberband_cli( const Rubberband& rb ) { //set the path to rubberband-cli QString program = Preferences::get_instance()->m_rubberBandCLIexecutable; //test the path. if test fails return NULL if ( QFile( program ).exists() == false && rb.use ) { ERRORLOG( QString( "Rubberband executable: File %1 not found" ).arg( program ) ); return false; } if( rb.use ) { QString outfilePath = QDir::tempPath() + "/tmp_rb_outfile.wav"; if( !write( outfilePath ) ) { ERRORLOG( "unable to write sample" ); return false; }; unsigned rubberoutframes = 0; double ratio = 1.0; double durationtime = 60.0 / Hydrogen::get_instance()->getNewBpmJTM() * rb.divider/*beats*/; double induration = get_sample_duration(); if ( induration != 0.0 ) ratio = durationtime / induration; rubberoutframes = int( __frames * ratio + 0.1 ); _INFOLOG( QString( "ratio: %1, rubberoutframes: %2, rubberinframes: %3" ).arg( ratio ).arg ( rubberoutframes ).arg ( __frames ) ); QObject* pParent = nullptr; QProcess* pRrubberbandProc = new QProcess( pParent ); QStringList arguments; QString rCs = QString( " %1" ).arg( rb.c_settings ); float pitch = pow( 1.0594630943593, ( double )rb.pitch ); QString rPs = QString( " %1" ).arg( pitch ); QString rubberResultPath = QDir::tempPath() + "/tmp_rb_result_file.wav"; arguments << "-D" << QString( " %1" ).arg( durationtime ) //stretch or squash to make output file X seconds long << "--threads" //assume multi-CPU even if only one CPU is identified << "-P" //aim for minimal time distortion << "-f" << rPs //pitch << "-c" << rCs //"crispness" levels << outfilePath //infile << rubberResultPath; //outfile pRrubberbandProc->start( program, arguments ); while( ! pRrubberbandProc->waitForFinished() ) { //_ERRORLOG( QString( "prozessing" )); } if ( QFile( rubberResultPath ).exists() == false ) { _ERRORLOG( QString( "Rubberband reimporter File %1 not found" ).arg( rubberResultPath ) ); return false; } Sample* p_Rubberbanded = Sample::load( rubberResultPath.toLocal8Bit() ); if( p_Rubberbanded==nullptr ) { return false; } QFile( outfilePath ).remove(); QFile( rubberResultPath ).remove(); __frames = p_Rubberbanded->get_frames(); __data_l = p_Rubberbanded->get_data_l(); __data_r = p_Rubberbanded->get_data_r(); p_Rubberbanded->__data_l = nullptr; p_Rubberbanded->__data_r = nullptr; __is_modified = true; __rubberband = rb; delete p_Rubberbanded; } return true; } Sample::Loops::LoopMode Sample::parse_loop_mode( const QString& string ) { QByteArray byteArray = string.toLocal8Bit(); char* mode = byteArray.data(); for( int i=Loops::FORWARD; i<=Loops::PINGPONG; i++ ) { if( 0 == strncasecmp( mode, __loop_modes[i], sizeof( __loop_modes[i] ) ) ) return ( Loops::LoopMode )i; } return Loops::FORWARD; } bool Sample::write( const QString& path, int format ) { float* obuf = new float[ SAMPLE_CHANNELS * __frames ]; for ( int i = 0; i < __frames; ++i ) { float value_l = __data_l[i]; float value_r = __data_r[i]; if ( value_l > 1.f ) { value_l = 1.f; } else if ( value_l < -1.f ) { value_l = -1.f; } else if ( value_r > 1.f ) { value_r = 1.f; } else if ( value_r < -1.f ) { value_r = -1.f; } obuf[ i* SAMPLE_CHANNELS + 0 ] = value_l; obuf[ i* SAMPLE_CHANNELS + 1 ] = value_r; } SF_INFO sf_info; sf_info.channels = SAMPLE_CHANNELS; sf_info.frames = __frames; sf_info.samplerate = __sample_rate; sf_info.format = format; if ( !sf_format_check( &sf_info ) ) { ___ERRORLOG( "SF_INFO error" ); delete[] obuf; return false; } SNDFILE* sf_file = sf_open( path.toLocal8Bit().data(), SFM_WRITE, &sf_info ) ; if ( sf_file==nullptr ) { ___ERRORLOG( QString( "sf_open error : %1" ).arg( sf_strerror( sf_file ) ) ); delete[] obuf; return false; } sf_count_t res = sf_writef_float( sf_file, obuf, __frames ); if ( res<=0 ) { ___ERRORLOG( QString( "sf_writef_float error : %1" ).arg( sf_strerror( sf_file ) ) ); delete[] obuf; return false; } sf_close( sf_file ); delete[] obuf; return true; } #ifdef H2CORE_HAVE_RUBBERBAND static double compute_pitch_scale( const Sample::Rubberband& rb ) { double pitchshift = rb.pitch; double frequencyshift = 1.0; if ( pitchshift != 0.0 ) { frequencyshift *= pow( 2.0, pitchshift / 12 ); } //float pitch = pow( 1.0594630943593, ( double )rb.pitch ); return frequencyshift; } static RubberBand::RubberBandStretcher::Options compute_rubberband_options( const Sample::Rubberband& rb ) { // default settings enum { CompoundDetector, PercussiveDetector, SoftDetector } detector = CompoundDetector; enum { NoTransients, BandLimitedTransients, Transients } transients = Transients; bool lamination = true; bool longwin = false; bool shortwin = false; RubberBand::RubberBandStretcher::Options options = RubberBand::RubberBandStretcher::DefaultOptions; // apply our settings int crispness = rb.c_settings; // compute result options switch ( crispness ) { case -1: crispness = 5; break; case 0: detector = CompoundDetector; transients = NoTransients; lamination = false; longwin = true; shortwin = false; break; case 1: detector = SoftDetector; transients = Transients; lamination = false; longwin = true; shortwin = false; break; case 2: detector = CompoundDetector; transients = NoTransients; lamination = false; longwin = false; shortwin = false; break; case 3: detector = CompoundDetector; transients = NoTransients; lamination = true; longwin = false; shortwin = false; break; case 4: detector = CompoundDetector; transients = BandLimitedTransients; lamination = true; longwin = false; shortwin = false; break; case 5: detector = CompoundDetector; transients = Transients; lamination = true; longwin = false; shortwin = false; break; case 6: detector = CompoundDetector; transients = Transients; lamination = false; longwin = false; shortwin = true; break; }; //if (realtime) options |= RubberBand::RubberBandStretcher::OptionProcessRealTime; //if (precise) options |= RubberBand::RubberBandStretcher::OptionStretchPrecise; if ( !lamination ) options |= RubberBand::RubberBandStretcher::OptionPhaseIndependent; if ( longwin ) options |= RubberBand::RubberBandStretcher::OptionWindowLong; if ( shortwin ) options |= RubberBand::RubberBandStretcher::OptionWindowShort; options |= RubberBand::RubberBandStretcher::OptionProcessOffline; options |= RubberBand::RubberBandStretcher::OptionStretchPrecise; //if (smoothing) options |= RubberBand::RubberBandStretcher::OptionSmoothingOn; //if (formant) options |= RubberBand::RubberBandStretcher::OptionFormantPreserved; //if (hqpitch) options |= RubberBand::RubberBandStretcher::OptionPitchHighQuality; options |= RubberBand::RubberBandStretcher::OptionPitchHighQuality; /* switch (threading) { case 0: options |= RubberBand::RubberBandStretcher::OptionThreadingAuto; break; case 1: options |= RubberBand::RubberBandStretcher::OptionThreadingNever; break; case 2: options |= RubberBand::RubberBandStretcher::OptionThreadingAlways; break; } */ switch ( transients ) { case NoTransients: options |= RubberBand::RubberBandStretcher::OptionTransientsSmooth; break; case BandLimitedTransients: options |= RubberBand::RubberBandStretcher::OptionTransientsMixed; break; case Transients: options |= RubberBand::RubberBandStretcher::OptionTransientsCrisp; break; } /* switch (detector) { case CompoundDetector: options |= RubberBand::RubberBandStretcher::OptionDetectorCompound; break; case PercussiveDetector: options |= RubberBand::RubberBandStretcher::OptionDetectorPercussive; break; case SoftDetector: options |= RubberBand::RubberBandStretcher::OptionDetectorSoft; break; } */ return options; } #endif }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/basics/song.cpp000066400000000000000000001435111366722712400212550ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/version.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { }//anonymous namespace namespace H2Core { const char* Song::__class_name = "Song"; Song::Song( const QString& name, const QString& author, float bpm, float volume ) : Object( __class_name ) , __is_muted( false ) , __resolution( 48 ) , __bpm( bpm ) , __is_modified( false ) , __name( name ) , __author( author ) , __volume( volume ) , __metronome_volume( 0.5 ) , __pattern_list( nullptr ) , __pattern_group_sequence( nullptr ) , __instrument_list( nullptr ) , __filename( "" ) , __is_loop_enabled( false ) , __humanize_time_value( 0.0 ) , __humanize_velocity_value( 0.0 ) , __swing_factor( 0.0 ) , __song_mode( PATTERN_MODE ) , __components( nullptr ) , __playback_track_enabled( false ) , __playback_track_volume( 0.0 ) , __velocity_automation_path( nullptr ) { INFOLOG( QString( "INIT '%1'" ).arg( __name ) ); __components = new std::vector (); __velocity_automation_path = new AutomationPath(0.0f, 1.5f, 1.0f); } Song::~Song() { /* * Warning: it is not safe to delete a song without having a lock on the audio engine. * Following the current design, the caller has to care for the lock. */ delete __pattern_list; for (std::vector::iterator it = __components->begin() ; it != __components->end(); ++it) { delete *it; } delete __components; if ( __pattern_group_sequence ) { for ( unsigned i = 0; i < __pattern_group_sequence->size(); ++i ) { PatternList* pPatternList = ( *__pattern_group_sequence )[i]; pPatternList->clear(); // pulisco tutto, i pattern non vanno distrutti qua delete pPatternList; } delete __pattern_group_sequence; } delete __instrument_list; delete __velocity_automation_path; INFOLOG( QString( "DESTROY '%1'" ).arg( __name ) ); } void Song::purge_instrument( Instrument* I ) { for ( int nPattern = 0; nPattern < ( int )__pattern_list->size(); ++nPattern ) { __pattern_list->get( nPattern )->purge_instrument( I ); } } ///Load a song from file Song* Song::load( const QString& filename ) { SongReader reader; return reader.readSong( filename ); } /// Save a song to file bool Song::save( const QString& filename ) { SongWriter writer; int err; err = writer.writeSong( this, filename ); if( err ) { return false; } return QFile::exists( filename ); } /// Create default song Song* Song::get_default_song() { Song* pSong = new Song( "empty", "hydrogen", 120, 0.5 ); pSong->set_metronome_volume( 0.5 ); pSong->set_notes( "..." ); pSong->set_license( "" ); pSong->set_loop_enabled( false ); pSong->set_mode( Song::PATTERN_MODE ); pSong->set_humanize_time_value( 0.0 ); pSong->set_humanize_velocity_value( 0.0 ); pSong->set_swing_factor( 0.0 ); InstrumentList* pInstrList = new InstrumentList(); Instrument* pNewInstr = new Instrument( EMPTY_INSTR_ID, "New instrument" ); pInstrList->add( pNewInstr ); pSong->set_instrument_list( pInstrList ); #ifdef H2CORE_HAVE_JACK Hydrogen::get_instance()->renameJackPorts( pSong ); #endif PatternList* pPatternList = new PatternList(); Pattern* pEmptyPattern = new Pattern(); pEmptyPattern->set_name( QString( "Pattern 1" ) ); pEmptyPattern->set_category( QString( "not_categorized" ) ); pPatternList->add( pEmptyPattern ); pSong->set_pattern_list( pPatternList ); std::vector* pPatternGroupVector = new std::vector; PatternList* patternSequence = new PatternList(); patternSequence->add( pEmptyPattern ); pPatternGroupVector->push_back( patternSequence ); pSong->set_pattern_group_vector( pPatternGroupVector ); pSong->set_is_modified( false ); pSong->set_filename( "empty_song" ); return pSong; } /// Return an empty song Song* Song::get_empty_song() { Song* pSong = Song::load( Filesystem::empty_song_path() ); /* * If file DefaultSong.h2song is not accessible, * create a simple default song. */ if( !pSong ) { pSong = Song::get_default_song(); } return pSong; } DrumkitComponent* Song::get_component( int ID ) { for (std::vector::iterator it = __components->begin() ; it != __components->end(); ++it) { if( (*it)->get_id() == ID ) { return *it; } } return nullptr; } void Song::set_swing_factor( float factor ) { if ( factor < 0.0 ) { factor = 0.0; } else if ( factor > 1.0 ) { factor = 1.0; } __swing_factor = factor; } void Song::set_is_modified(bool is_modified) { bool Notify = false; if(__is_modified != is_modified) { Notify = true; } __is_modified = is_modified; if(Notify) { EventQueue::get_instance()->push_event( EVENT_SONG_MODIFIED, -1 ); } } void Song::readTempPatternList( const QString& filename ) { XMLDoc doc; if( !doc.read( filename ) ) { return; } XMLNode root = doc.firstChildElement( "sequence" ); if ( root.isNull() ) { ERRORLOG( "sequence node not found" ); return; } XMLNode virtualsNode = root.firstChildElement( "virtuals" ); if ( !virtualsNode.isNull() ) { XMLNode virtualNode = virtualsNode.firstChildElement( "virtual" ); while ( !virtualNode.isNull() ) { QString patternName = virtualNode.read_attribute( "pattern", nullptr, false, false ); XMLNode patternNode = virtualNode.firstChildElement( "pattern" ); Pattern* pPattern = nullptr; while ( !patternName.isEmpty() && !patternNode.isNull() ) { QString virtualName = patternNode.read_text( false ); if ( !virtualName.isEmpty() ) { Pattern* pVirtualPattern = nullptr; for ( unsigned i = 0; i < get_pattern_list()->size(); i++ ) { Pattern* pat = get_pattern_list()->get( i ); if ( pPattern == nullptr && pat->get_name() == patternName ) { pPattern = pat; } if ( pVirtualPattern == nullptr && pat->get_name() == virtualName ) { pVirtualPattern = pat; } if ( pPattern != nullptr && pVirtualPattern != nullptr) { break; } } if ( pPattern == nullptr ) { ERRORLOG( QString( "Invalid pattern name %1" ).arg( patternName ) ); } if ( pVirtualPattern == nullptr ) { ERRORLOG( QString( "Invalid virtual pattern name %1" ).arg( virtualName ) ); } if ( pPattern != nullptr && pVirtualPattern != nullptr ) { pPattern->virtual_patterns_add( pVirtualPattern ); } } patternNode = patternNode.nextSiblingElement( "pattern" ); } virtualNode = virtualNode.nextSiblingElement( "virtual" ); } } else { WARNINGLOG( "no virtuals node not found" ); } get_pattern_list()->flattened_virtual_patterns_compute(); get_pattern_group_vector()->clear(); XMLNode sequenceNode = root.firstChildElement( "groups" ); if ( !sequenceNode.isNull() ) { XMLNode groupNode = sequenceNode.firstChildElement( "group" ); while ( !groupNode.isNull() ) { PatternList* patternSequence = new PatternList(); XMLNode patternNode = groupNode.firstChildElement( "pattern" ); while ( !patternNode.isNull() ) { QString patternName = patternNode.read_text( false ); if( !patternName.isEmpty() ) { Pattern* p = nullptr; for ( unsigned i = 0; i < get_pattern_list()->size(); i++ ) { Pattern* pat = get_pattern_list()->get( i ); if ( pat->get_name() == patternName ) { p = pat; break; } } if ( p == nullptr ) { ERRORLOG( QString( "Invalid pattern name %1" ).arg( patternName ) ); } else { patternSequence->add( p ); } } patternNode = patternNode.nextSiblingElement( "pattern" ); } get_pattern_group_vector()->push_back( patternSequence ); groupNode = groupNode.nextSiblingElement( "group" ); } } else { WARNINGLOG( "no sequence node not found" ); } } bool Song::writeTempPatternList( const QString& filename ) { XMLDoc doc; XMLNode root = doc.set_root( "sequence" ); XMLNode virtualPatternListNode = root.createNode( "virtuals" ); for ( unsigned i = 0; i < get_pattern_list()->size(); i++ ) { Pattern *pPattern = get_pattern_list()->get( i ); if ( !pPattern->get_virtual_patterns()->empty() ) { XMLNode node = virtualPatternListNode.createNode( "virtual" ); node.write_attribute( "pattern", pPattern->get_name() ); for ( Pattern::virtual_patterns_it_t virtIter = pPattern->get_virtual_patterns()->begin(); virtIter != pPattern->get_virtual_patterns()->end(); ++virtIter ) { node.write_string( "pattern", (*virtIter)->get_name() ); } } } XMLNode patternSequenceNode = root.createNode( "groups" ); for ( unsigned i = 0; i < get_pattern_group_vector()->size(); i++ ) { XMLNode node = patternSequenceNode.createNode( "group" ); PatternList *pList = ( *get_pattern_group_vector() )[i]; for ( unsigned j = 0; j < pList->size(); j++ ) { Pattern *pPattern = pList->get( j ); node.write_string( "pattern", pPattern->get_name() ); } } return doc.write( filename ); } QString Song::copyInstrumentLineToString( int selectedPattern, int selectedInstrument ) { Instrument *pInstr = get_instrument_list()->get( selectedInstrument ); assert( pInstr ); QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild( header ); QDomNode rootNode = doc.createElement( "instrument_line" ); //LIB_ID just in work to get better usability //LocalFileMng::writeXmlString( &rootNode, "LIB_ID", "in_work" ); LocalFileMng::writeXmlString( rootNode, "author", get_author() ); LocalFileMng::writeXmlString( rootNode, "license", get_license() ); QDomNode patternList = doc.createElement( "patternList" ); unsigned nPatterns = get_pattern_list()->size(); for ( unsigned i = 0; i < nPatterns; i++ ) { if (( selectedPattern >= 0) && (selectedPattern != i) ) { continue; } // Export pattern Pattern *pPattern = get_pattern_list()->get( i ); QDomNode patternNode = doc.createElement( "pattern" ); LocalFileMng::writeXmlString( patternNode, "pattern_name", pPattern->get_name() ); QString category; if ( pPattern->get_category().isEmpty() ) { category = "No category"; } else { category = pPattern->get_category(); } LocalFileMng::writeXmlString( patternNode, "info", pPattern->get_info() ); LocalFileMng::writeXmlString( patternNode, "category", category ); LocalFileMng::writeXmlString( patternNode, "size", QString("%1").arg( pPattern->get_length() ) ); QDomNode noteListNode = doc.createElement( "noteList" ); const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); // Export only specified instrument if (pNote->get_instrument() == pInstr) { QDomNode noteNode = doc.createElement( "note" ); LocalFileMng::writeXmlString( noteNode, "position", QString("%1").arg( pNote->get_position() ) ); LocalFileMng::writeXmlString( noteNode, "leadlag", QString("%1").arg( pNote->get_lead_lag() ) ); LocalFileMng::writeXmlString( noteNode, "velocity", QString("%1").arg( pNote->get_velocity() ) ); LocalFileMng::writeXmlString( noteNode, "pan_L", QString("%1").arg( pNote->get_pan_l() ) ); LocalFileMng::writeXmlString( noteNode, "pan_R", QString("%1").arg( pNote->get_pan_r() ) ); LocalFileMng::writeXmlString( noteNode, "pitch", QString("%1").arg( pNote->get_pitch() ) ); LocalFileMng::writeXmlString( noteNode, "probability", QString("%1").arg( pNote->get_probability() ) ); LocalFileMng::writeXmlString( noteNode, "key", pNote->key_to_string() ); LocalFileMng::writeXmlString( noteNode, "length", QString("%1").arg( pNote->get_length() ) ); noteListNode.appendChild( noteNode ); } } patternNode.appendChild( noteListNode ); patternList.appendChild( patternNode ); } rootNode.appendChild(patternList); doc.appendChild( rootNode ); // Serialize document & return return doc.toString(); } bool Song::pasteInstrumentLineFromString( const QString& serialized, int selectedPattern, int selectedInstrument, std::list& patterns ) { QDomDocument doc; if (!doc.setContent(serialized)) { return false; } // Get current instrument Instrument *pInstr = get_instrument_list()->get( selectedInstrument ); assert( pInstr ); // Get pattern list PatternList *pList = get_pattern_list(); Pattern *pSelected = (selectedPattern >= 0) ? pList->get(selectedPattern) : nullptr; // Check if document has correct structure QDomNode rootNode = doc.firstChildElement( "instrument_line" ); // root element if ( rootNode.isNull() ) { ERRORLOG( "Error pasting Clipboard:Instrument_line_info node not found "); return false; } // Find pattern list QDomNode patternList = rootNode.firstChildElement( "patternList" ); if ( patternList.isNull() ) { return false; } // Parse each pattern if needed QDomNode patternNode = patternList.firstChildElement( "pattern" ); bool is_single = true; if (!patternNode.isNull()) { is_single = (( QDomNode )patternNode.nextSiblingElement( "pattern" )).isNull(); } while (!patternNode.isNull()) { QString patternName(LocalFileMng::readXmlString(patternNode, "pattern_name", "")); // Check if pattern name specified if (patternName.length() > 0) { // Try to find pattern by name Pattern* pat = pList->find(patternName); // If OK - check if need to add this pattern to result // If there is only one pattern, we always add it to list // If there is no selected pattern, we add all existing patterns to list (match by name) // Otherwise we add only existing selected pattern to list (match by name) if ((is_single) || ((pat != nullptr) && ((selectedPattern < 0) || (pat == pSelected)))) { // Load additional pattern info & create pattern QString sInfo; sInfo = LocalFileMng::readXmlString(patternNode, "info", sInfo, false, false); QString sCategory; sCategory = LocalFileMng::readXmlString(patternNode, "category", sCategory, false, false); int nSize = -1; nSize = LocalFileMng::readXmlInt(patternNode, "size", nSize, false, false); // Change name of pattern to selected pattern if (pSelected != nullptr) { patternName = pSelected->get_name(); } pat = new Pattern( patternName, sInfo, sCategory, nSize ); // Parse pattern data QDomNode pNoteListNode = patternNode.firstChildElement( "noteList" ); if ( ! pNoteListNode.isNull() ) { // Parse note-by-note QDomNode noteNode = pNoteListNode.firstChildElement( "note" ); while ( ! noteNode.isNull() ) { Note* pNote = nullptr; unsigned nPosition = LocalFileMng::readXmlInt( noteNode, "position", 0 ); float fLeadLag = LocalFileMng::readXmlFloat( noteNode, "leadlag", 0.0 , false , false ); float fVelocity = LocalFileMng::readXmlFloat( noteNode, "velocity", 0.8f ); float fPan_L = LocalFileMng::readXmlFloat( noteNode, "pan_L", 0.5 ); float fPan_R = LocalFileMng::readXmlFloat( noteNode, "pan_R", 0.5 ); int nLength = LocalFileMng::readXmlInt( noteNode, "length", -1, true ); float nPitch = LocalFileMng::readXmlFloat( noteNode, "pitch", 0.0, false, false ); float fProbability = LocalFileMng::readXmlFloat( noteNode, "probability", 1.0 , false , false ); QString sKey = LocalFileMng::readXmlString( noteNode, "key", "C0", false, false ); QString nNoteOff = LocalFileMng::readXmlString( noteNode, "note_off", "false", false, false ); bool noteoff = ( nNoteOff == "true" ); pNote = new Note( pInstr, nPosition, fVelocity, fPan_L, fPan_R, nLength, nPitch ); pNote->set_key_octave( sKey ); pNote->set_lead_lag( fLeadLag ); pNote->set_note_off( noteoff ); pNote->set_probability( fProbability ); pat->insert_note( pNote ); // Add note to created pattern noteNode = ( QDomNode ) noteNode.nextSiblingElement( "note" ); } } // Add loaded pattern to apply-list patterns.push_back(pat); } } patternNode = ( QDomNode ) patternNode.nextSiblingElement( "pattern" ); } return true; } //----------------------------------------------------------------------------- // Implementation of SongReader class //----------------------------------------------------------------------------- const char* SongReader::__class_name = "SongReader"; SongReader::SongReader() : Object( __class_name ) { // infoLog("init"); } SongReader::~SongReader() { // infoLog("destroy"); } const QString SongReader::getPath ( const QString& filename ) { /* Try direct path */ if ( QFile( filename ).exists() ) { return QFileInfo ( filename ).absoluteFilePath(); } /* Try search in Session Directory */ char* sesdir = getenv ( "SESSION_DIR" ); if ( sesdir ) { INFOLOG ( "Try SessionDirectory " + QString( sesdir ) ); QDir SesDir( sesdir ); QString BaseFileName = QFileInfo( filename ).fileName(); QString SesFileName = SesDir.filePath( BaseFileName ); if ( QFile( SesFileName ).exists() ) { return QFileInfo( SesFileName ).absoluteFilePath(); } } ERRORLOG( "Song file " + filename + " not found." ); return nullptr; } /// /// Reads a song. /// return nullptr = error reading song file. /// Song* SongReader::readSong( const QString& filename ) { QString FileName = getPath ( filename ); if ( FileName.isEmpty() ) { return nullptr; } INFOLOG( "Reading " + FileName ); Song* pSong = nullptr; QDomDocument doc = LocalFileMng::openXmlDocument( FileName ); QDomNodeList nodeList = doc.elementsByTagName( "song" ); if( nodeList.isEmpty() ) { ERRORLOG( "Error reading song: song node not found" ); return nullptr; } QDomNode songNode = nodeList.at( 0 ); m_sSongVersion = LocalFileMng::readXmlString( songNode, "version", "Unknown version" ); if ( m_sSongVersion != QString( get_version().c_str() ) ) { WARNINGLOG( "Trying to load a song created with a different version of hydrogen." ); WARNINGLOG( "Song [" + FileName + "] saved with version " + m_sSongVersion ); } float fBpm = LocalFileMng::readXmlFloat( songNode, "bpm", 120 ); Hydrogen::get_instance()->setNewBpmJTM( fBpm ); float fVolume = LocalFileMng::readXmlFloat( songNode, "volume", 0.5 ); float fMetronomeVolume = LocalFileMng::readXmlFloat( songNode, "metronomeVolume", 0.5 ); QString sName( LocalFileMng::readXmlString( songNode, "name", "Untitled Song" ) ); QString sAuthor( LocalFileMng::readXmlString( songNode, "author", "Unknown Author" ) ); QString sNotes( LocalFileMng::readXmlString( songNode, "notes", "..." ) ); QString sLicense( LocalFileMng::readXmlString( songNode, "license", "Unknown license" ) ); bool bLoopEnabled = LocalFileMng::readXmlBool( songNode, "loopEnabled", false ); Preferences::get_instance()->setPatternModePlaysSelected( LocalFileMng::readXmlBool( songNode, "patternModeMode", true ) ); Song::SongMode nMode = Song::PATTERN_MODE; // Mode (song/pattern) QString sMode = LocalFileMng::readXmlString( songNode, "mode", "pattern" ); if ( sMode == "song" ) { nMode = Song::SONG_MODE; } QString sPlaybackTrack( LocalFileMng::readXmlString( songNode, "playbackTrackFilename", "" ) ); bool bPlaybackTrackEnabled = LocalFileMng::readXmlBool( songNode, "playbackTrackEnabled", false ); float fPlaybackTrackVolume = LocalFileMng::readXmlFloat( songNode, "playbackTrackVolume", 0.0 ); float fHumanizeTimeValue = LocalFileMng::readXmlFloat( songNode, "humanize_time", 0.0 ); float fHumanizeVelocityValue = LocalFileMng::readXmlFloat( songNode, "humanize_velocity", 0.0 ); float fSwingFactor = LocalFileMng::readXmlFloat( songNode, "swing_factor", 0.0 ); pSong = new Song( sName, sAuthor, fBpm, fVolume ); pSong->set_metronome_volume( fMetronomeVolume ); pSong->set_notes( sNotes ); pSong->set_license( sLicense ); pSong->set_loop_enabled( bLoopEnabled ); pSong->set_mode( nMode ); pSong->set_humanize_time_value( fHumanizeTimeValue ); pSong->set_humanize_velocity_value( fHumanizeVelocityValue ); pSong->set_swing_factor( fSwingFactor ); pSong->set_playback_track_filename( sPlaybackTrack ); pSong->set_playback_track_enabled( bPlaybackTrackEnabled ); pSong->set_playback_track_volume( fPlaybackTrackVolume ); QDomNode componentListNode = songNode.firstChildElement( "componentList" ); if ( ( ! componentListNode.isNull() ) ) { QDomNode componentNode = componentListNode.firstChildElement( "drumkitComponent" ); while ( ! componentNode.isNull() ) { int id = LocalFileMng::readXmlInt( componentNode, "id", -1 ); // instrument id QString sName = LocalFileMng::readXmlString( componentNode, "name", "" ); // name float fVolume = LocalFileMng::readXmlFloat( componentNode, "volume", 1.0 ); // volume DrumkitComponent* pDrumkitComponent = new DrumkitComponent( id, sName ); pDrumkitComponent->set_volume( fVolume ); pSong->get_components()->push_back(pDrumkitComponent); componentNode = ( QDomNode ) componentNode.nextSiblingElement( "drumkitComponent" ); } } else { DrumkitComponent* pDrumkitComponent = new DrumkitComponent( 0, "Main" ); pSong->get_components()->push_back(pDrumkitComponent); } // Instrument List InstrumentList* pInstrList = new InstrumentList(); QDomNode instrumentListNode = songNode.firstChildElement( "instrumentList" ); if ( ( ! instrumentListNode.isNull() ) ) { // INSTRUMENT NODE int instrumentList_count = 0; QDomNode instrumentNode; instrumentNode = instrumentListNode.firstChildElement( "instrument" ); while ( ! instrumentNode.isNull() ) { instrumentList_count++; int id = LocalFileMng::readXmlInt( instrumentNode, "id", -1 ); // instrument id QString sDrumkit = LocalFileMng::readXmlString( instrumentNode, "drumkit", "" ); // drumkit Hydrogen::get_instance()->setCurrentDrumkitname( sDrumkit ); QString sName = LocalFileMng::readXmlString( instrumentNode, "name", "" ); // name float fVolume = LocalFileMng::readXmlFloat( instrumentNode, "volume", 1.0 ); // volume bool bIsMuted = LocalFileMng::readXmlBool( instrumentNode, "isMuted", false ); // is muted float fPan_L = LocalFileMng::readXmlFloat( instrumentNode, "pan_L", 0.5 ); // pan L float fPan_R = LocalFileMng::readXmlFloat( instrumentNode, "pan_R", 0.5 ); // pan R float fFX1Level = LocalFileMng::readXmlFloat( instrumentNode, "FX1Level", 0.0 ); // FX level float fFX2Level = LocalFileMng::readXmlFloat( instrumentNode, "FX2Level", 0.0 ); // FX level float fFX3Level = LocalFileMng::readXmlFloat( instrumentNode, "FX3Level", 0.0 ); // FX level float fFX4Level = LocalFileMng::readXmlFloat( instrumentNode, "FX4Level", 0.0 ); // FX level float fGain = LocalFileMng::readXmlFloat( instrumentNode, "gain", 1.0, false, false ); // instrument gain int fAttack = LocalFileMng::readXmlInt( instrumentNode, "Attack", 0, false, false ); // Attack int fDecay = LocalFileMng::readXmlInt( instrumentNode, "Decay", 0, false, false ); // Decay float fSustain = LocalFileMng::readXmlFloat( instrumentNode, "Sustain", 1.0, false, false ); // Sustain int fRelease = LocalFileMng::readXmlFloat( instrumentNode, "Release", 1000.0, false, false ); // Release float fRandomPitchFactor = LocalFileMng::readXmlFloat( instrumentNode, "randomPitchFactor", 0.0f, false, false ); bool bApplyVelocity = LocalFileMng::readXmlBool( instrumentNode, "applyVelocity", true ); bool bFilterActive = LocalFileMng::readXmlBool( instrumentNode, "filterActive", false ); float fFilterCutoff = LocalFileMng::readXmlFloat( instrumentNode, "filterCutoff", 1.0f, false ); float fFilterResonance = LocalFileMng::readXmlFloat( instrumentNode, "filterResonance", 0.0f, false ); QString sMuteGroup = LocalFileMng::readXmlString( instrumentNode, "muteGroup", "-1", false ); QString sMidiOutChannel = LocalFileMng::readXmlString( instrumentNode, "midiOutChannel", "-1", false, false ); QString sMidiOutNote = LocalFileMng::readXmlString( instrumentNode, "midiOutNote", "60", false, false ); int nMuteGroup = sMuteGroup.toInt(); bool isStopNote = LocalFileMng::readXmlBool( instrumentNode, "isStopNote", false ); QString sRead_sample_select_algo = LocalFileMng::readXmlString( instrumentNode, "sampleSelectionAlgo", "VELOCITY" ); int nMidiOutChannel = sMidiOutChannel.toInt(); int nMidiOutNote = sMidiOutNote.toInt(); if ( id==-1 ) { ERRORLOG( "Empty ID for instrument '" + sName + "'. skipping." ); instrumentNode = ( QDomNode ) instrumentNode.nextSiblingElement( "instrument" ); continue; } int iIsHiHat = LocalFileMng::readXmlInt( instrumentNode, "isHihat", -1, true ); int iLowerCC = LocalFileMng::readXmlInt( instrumentNode, "lower_cc", 0, true ); int iHigherCC = LocalFileMng::readXmlInt( instrumentNode, "higher_cc", 127, true ); // create a new instrument Instrument* pInstrument = new Instrument( id, sName, new ADSR( fAttack, fDecay, fSustain, fRelease ) ); pInstrument->set_volume( fVolume ); pInstrument->set_muted( bIsMuted ); pInstrument->set_pan_l( fPan_L ); pInstrument->set_pan_r( fPan_R ); pInstrument->set_drumkit_name( sDrumkit ); pInstrument->set_apply_velocity( bApplyVelocity ); pInstrument->set_fx_level( fFX1Level, 0 ); pInstrument->set_fx_level( fFX2Level, 1 ); pInstrument->set_fx_level( fFX3Level, 2 ); pInstrument->set_fx_level( fFX4Level, 3 ); pInstrument->set_random_pitch_factor( fRandomPitchFactor ); pInstrument->set_filter_active( bFilterActive ); pInstrument->set_filter_cutoff( fFilterCutoff ); pInstrument->set_filter_resonance( fFilterResonance ); pInstrument->set_gain( fGain ); pInstrument->set_mute_group( nMuteGroup ); pInstrument->set_stop_notes( isStopNote ); pInstrument->set_hihat_grp( iIsHiHat ); pInstrument->set_lower_cc( iLowerCC ); pInstrument->set_higher_cc( iHigherCC ); if ( sRead_sample_select_algo.compare("VELOCITY") == 0 ) { pInstrument->set_sample_selection_alg( Instrument::VELOCITY ); } else if ( sRead_sample_select_algo.compare("ROUND_ROBIN") == 0 ) { pInstrument->set_sample_selection_alg( Instrument::ROUND_ROBIN ); } else if ( sRead_sample_select_algo.compare("RANDOM") == 0 ) { pInstrument->set_sample_selection_alg( Instrument::RANDOM ); } pInstrument->set_midi_out_channel( nMidiOutChannel ); pInstrument->set_midi_out_note( nMidiOutNote ); QString drumkitPath; if ( ( !sDrumkit.isEmpty() ) && ( sDrumkit != "-" ) ) { drumkitPath = Filesystem::drumkit_path_search( sDrumkit ); } QDomNode filenameNode = instrumentNode.firstChildElement( "filename" ); // back compatibility code ( song version <= 0.9.0 ) if ( ! filenameNode.isNull() ) { WARNINGLOG( "Using back compatibility code. filename node found" ); QString sFilename = LocalFileMng::readXmlString( instrumentNode, "filename", "" ); if ( !QFile( sFilename ).exists() && !drumkitPath.isEmpty() ) { sFilename = drumkitPath + "/" + sFilename; } Sample* pSample = Sample::load( sFilename ); if ( pSample == nullptr ) { // nel passaggio tra 0.8.2 e 0.9.0 il drumkit di default e' cambiato. // Se fallisce provo a caricare il corrispettivo file in formato flac // warningLog( "[readSong] Error loading sample: " + sFilename + " not found. Trying to load a flac..." ); sFilename = sFilename.left( sFilename.length() - 4 ); sFilename += ".flac"; pSample = Sample::load( sFilename ); } if ( pSample == nullptr ) { ERRORLOG( "Error loading sample: " + sFilename + " not found" ); pInstrument->set_muted( true ); } InstrumentComponent* pCompo = new InstrumentComponent ( 0 ); InstrumentLayer* pLayer = new InstrumentLayer( pSample ); pCompo->set_layer( pLayer, 0 ); pInstrument->get_components()->push_back( pCompo ); } //~ back compatibility code else { bool bFoundAtLeastOneComponent = false; QDomNode componentNode = instrumentNode.firstChildElement( "instrumentComponent" ); while ( ! componentNode.isNull() ) { bFoundAtLeastOneComponent = true; int id = LocalFileMng::readXmlInt( componentNode, "component_id", 0 ); InstrumentComponent* pCompo = new InstrumentComponent( id ); float fGainCompo = LocalFileMng::readXmlFloat( componentNode, "gain", 1.0 ); pCompo->set_gain( fGainCompo ); unsigned nLayer = 0; QDomNode layerNode = componentNode.firstChildElement( "layer" ); while ( ! layerNode.isNull() ) { if ( nLayer >= InstrumentComponent::getMaxLayers() ) { ERRORLOG( QString( "nLayer (%1) > m_nMaxLayers (%2)" ).arg ( nLayer ).arg( InstrumentComponent::getMaxLayers() ) ); continue; } //bool sIsModified = false; QString sFilename = LocalFileMng::readXmlString( layerNode, "filename", "" ); bool sIsModified = LocalFileMng::readXmlBool( layerNode, "ismodified", false ); Sample::Loops lo; lo.mode = Sample::parse_loop_mode( LocalFileMng::readXmlString( layerNode, "smode", "forward" ) ); lo.start_frame = LocalFileMng::readXmlInt( layerNode, "startframe", 0 ); lo.loop_frame = LocalFileMng::readXmlInt( layerNode, "loopframe", 0 ); lo.count = LocalFileMng::readXmlInt( layerNode, "loops", 0 ); lo.end_frame = LocalFileMng::readXmlInt( layerNode, "endframe", 0 ); Sample::Rubberband ro; ro.use = LocalFileMng::readXmlInt( layerNode, "userubber", 0, false ); ro.divider = LocalFileMng::readXmlFloat( layerNode, "rubberdivider", 0.0 ); ro.c_settings = LocalFileMng::readXmlInt( layerNode, "rubberCsettings", 1 ); ro.pitch = LocalFileMng::readXmlFloat( layerNode, "rubberPitch", 0.0 ); float fMin = LocalFileMng::readXmlFloat( layerNode, "min", 0.0 ); float fMax = LocalFileMng::readXmlFloat( layerNode, "max", 1.0 ); float fGain = LocalFileMng::readXmlFloat( layerNode, "gain", 1.0 ); float fPitch = LocalFileMng::readXmlFloat( layerNode, "pitch", 0.0, false, false ); if ( !QFile( sFilename ).exists() && !drumkitPath.isEmpty() && !sFilename.startsWith("/")) { sFilename = drumkitPath + "/" + sFilename; } QString program = Preferences::get_instance()->m_rubberBandCLIexecutable; //test the path. if test fails, disable rubberband if ( QFile( program ).exists() == false ) { ro.use = false; } Sample* pSample = nullptr; if ( !sIsModified ) { pSample = Sample::load( sFilename ); } else { EnvelopePoint pt; int Frame = 0; int Value = 0; Sample::VelocityEnvelope velocity; QDomNode volumeNode = layerNode.firstChildElement( "volume" ); while ( ! volumeNode.isNull() ) { Frame = LocalFileMng::readXmlInt( volumeNode, "volume-position", 0 ); Value = LocalFileMng::readXmlInt( volumeNode, "volume-value", 0 ); velocity.push_back( std::make_unique(Frame, Value) ); volumeNode = volumeNode.nextSiblingElement( "volume" ); //ERRORLOG( QString("volume-posi %1").arg(LocalFileMng::readXmlInt( volumeNode, "volume-position", 0)) ); } Sample::VelocityEnvelope pan; QDomNode panNode = layerNode.firstChildElement( "pan" ); while ( ! panNode.isNull() ) { Frame = LocalFileMng::readXmlInt( panNode, "pan-position", 0 ); Value = LocalFileMng::readXmlInt( panNode, "pan-value", 0 ); pan.push_back( std::make_unique(Frame, Value) ); panNode = panNode.nextSiblingElement( "pan" ); } pSample = Sample::load( sFilename, lo, ro, velocity, pan ); } if ( pSample == nullptr ) { ERRORLOG( "Error loading sample: " + sFilename + " not found" ); pInstrument->set_muted( true ); } InstrumentLayer* pLayer = new InstrumentLayer( pSample ); pLayer->set_start_velocity( fMin ); pLayer->set_end_velocity( fMax ); pLayer->set_gain( fGain ); pLayer->set_pitch( fPitch ); pCompo->set_layer( pLayer, nLayer ); nLayer++; layerNode = ( QDomNode ) layerNode.nextSiblingElement( "layer" ); } pInstrument->get_components()->push_back( pCompo ); componentNode = ( QDomNode ) componentNode.nextSiblingElement( "instrumentComponent" ); } if(!bFoundAtLeastOneComponent) { InstrumentComponent* pCompo = new InstrumentComponent( 0 ); float fGainCompo = LocalFileMng::readXmlFloat( componentNode, "gain", 1.0 ); pCompo->set_gain( fGainCompo ); unsigned nLayer = 0; QDomNode layerNode = instrumentNode.firstChildElement( "layer" ); while ( ! layerNode.isNull() ) { if ( nLayer >= InstrumentComponent::getMaxLayers() ) { ERRORLOG( QString( "nLayer (%1) > m_nMaxLayers (%2)" ).arg ( nLayer ).arg( InstrumentComponent::getMaxLayers() ) ); continue; } QString sFilename = LocalFileMng::readXmlString( layerNode, "filename", "" ); bool sIsModified = LocalFileMng::readXmlBool( layerNode, "ismodified", false ); Sample::Loops lo; lo.mode = Sample::parse_loop_mode( LocalFileMng::readXmlString( layerNode, "smode", "forward" ) ); lo.start_frame = LocalFileMng::readXmlInt( layerNode, "startframe", 0 ); lo.loop_frame = LocalFileMng::readXmlInt( layerNode, "loopframe", 0 ); lo.count = LocalFileMng::readXmlInt( layerNode, "loops", 0 ); lo.end_frame = LocalFileMng::readXmlInt( layerNode, "endframe", 0 ); Sample::Rubberband ro; ro.use = LocalFileMng::readXmlInt( layerNode, "userubber", 0, false ); ro.divider = LocalFileMng::readXmlFloat( layerNode, "rubberdivider", 0.0 ); ro.c_settings = LocalFileMng::readXmlInt( layerNode, "rubberCsettings", 1 ); ro.pitch = LocalFileMng::readXmlFloat( layerNode, "rubberPitch", 0.0 ); float fMin = LocalFileMng::readXmlFloat( layerNode, "min", 0.0 ); float fMax = LocalFileMng::readXmlFloat( layerNode, "max", 1.0 ); float fGain = LocalFileMng::readXmlFloat( layerNode, "gain", 1.0 ); float fPitch = LocalFileMng::readXmlFloat( layerNode, "pitch", 0.0, false, false ); if ( !QFile( sFilename ).exists() && !drumkitPath.isEmpty() ) { sFilename = drumkitPath + "/" + sFilename; } QString program = Preferences::get_instance()->m_rubberBandCLIexecutable; //test the path. if test fails, disable rubberband if ( QFile( program ).exists() == false ) { ro.use = false; } Sample* pSample = nullptr; if ( !sIsModified ) { pSample = Sample::load( sFilename ); } else { int Frame = 0; int Value = 0; Sample::VelocityEnvelope velocity; QDomNode volumeNode = layerNode.firstChildElement( "volume" ); while ( ! volumeNode.isNull() ) { Frame = LocalFileMng::readXmlInt( volumeNode, "volume-position", 0 ); Value = LocalFileMng::readXmlInt( volumeNode, "volume-value", 0 ); velocity.push_back( std::make_unique(Frame, Value) ); volumeNode = volumeNode.nextSiblingElement( "volume" ); //ERRORLOG( QString("volume-posi %1").arg(LocalFileMng::readXmlInt( volumeNode, "volume-position", 0)) ); } Sample::VelocityEnvelope pan; QDomNode panNode = layerNode.firstChildElement( "pan" ); while ( ! panNode.isNull() ) { Frame = LocalFileMng::readXmlInt( panNode, "pan-position", 0 ); Value = LocalFileMng::readXmlInt( panNode, "pan-value", 0 ); pan.push_back( std::make_unique(Frame, Value) ); panNode = panNode.nextSiblingElement( "pan" ); } pSample = Sample::load( sFilename, lo, ro, velocity, pan ); } if ( pSample == nullptr ) { ERRORLOG( "Error loading sample: " + sFilename + " not found" ); pInstrument->set_muted( true ); } InstrumentLayer* pLayer = new InstrumentLayer( pSample ); pLayer->set_start_velocity( fMin ); pLayer->set_end_velocity( fMax ); pLayer->set_gain( fGain ); pLayer->set_pitch( fPitch ); pCompo->set_layer( pLayer, nLayer ); nLayer++; layerNode = ( QDomNode ) layerNode.nextSiblingElement( "layer" ); } pInstrument->get_components()->push_back( pCompo ); } } pInstrList->add( pInstrument ); instrumentNode = ( QDomNode ) instrumentNode.nextSiblingElement( "instrument" ); } if ( instrumentList_count == 0 ) { WARNINGLOG( "0 instruments?" ); } pSong->set_instrument_list( pInstrList ); } else { ERRORLOG( "Error reading song: instrumentList node not found" ); delete pSong; delete pInstrList; return nullptr; } // Pattern list QDomNode patterns = songNode.firstChildElement( "patternList" ); PatternList* pPatternList = new PatternList(); int pattern_count = 0; QDomNode patternNode = patterns.firstChildElement( "pattern" ); while ( !patternNode.isNull() ) { pattern_count++; Pattern* pPattern = getPattern( patternNode, pInstrList ); if ( pPattern ) { pPatternList->add( pPattern ); } else { ERRORLOG( "Error loading pattern" ); delete pPatternList; delete pSong; return nullptr; } patternNode = ( QDomNode ) patternNode.nextSiblingElement( "pattern" ); } if ( pattern_count == 0 ) { WARNINGLOG( "0 patterns?" ); } pSong->set_pattern_list( pPatternList ); // Virtual Patterns QDomNode virtualPatternListNode = songNode.firstChildElement( "virtualPatternList" ); QDomNode virtualPatternNode = virtualPatternListNode.firstChildElement( "pattern" ); if ( !virtualPatternNode.isNull() ) { while ( ! virtualPatternNode.isNull() ) { QString sName = ""; sName = LocalFileMng::readXmlString( virtualPatternNode, "name", sName ); Pattern* pCurPattern = nullptr; unsigned nPatterns = pPatternList->size(); for ( unsigned i = 0; i < nPatterns; i++ ) { Pattern* pPattern = pPatternList->get( i ); if ( pPattern->get_name() == sName ) { pCurPattern = pPattern; break; }//if }//for if ( pCurPattern != nullptr ) { QDomNode virtualNode = virtualPatternNode.firstChildElement( "virtual" ); while ( !virtualNode.isNull() ) { QString virtName = virtualNode.firstChild().nodeValue(); Pattern* virtPattern = nullptr; for ( unsigned i = 0; i < nPatterns; i++ ) { Pattern* pat = pPatternList->get( i ); if ( pat->get_name() == virtName ) { virtPattern = pat; break; }//if }//for if ( virtPattern != nullptr ) { pCurPattern->virtual_patterns_add( virtPattern ); } else { ERRORLOG( "Song had invalid virtual pattern list data (virtual)" ); }//if virtualNode = ( QDomNode ) virtualNode.nextSiblingElement( "virtual" ); }//while } else { ERRORLOG( "Song had invalid virtual pattern list data (name)" ); }//if virtualPatternNode = ( QDomNode ) virtualPatternNode.nextSiblingElement( "pattern" ); }//while }//if pPatternList->flattened_virtual_patterns_compute(); // Pattern sequence QDomNode patternSequenceNode = songNode.firstChildElement( "patternSequence" ); std::vector* pPatternGroupVector = new std::vector; // back-compatibility code.. QDomNode pPatternIDNode = patternSequenceNode.firstChildElement( "patternID" ); while ( ! pPatternIDNode.isNull() ) { WARNINGLOG( "Using old patternSequence code for back compatibility" ); PatternList* pPatternSequence = new PatternList(); QString patId = pPatternIDNode.firstChildElement().text(); ERRORLOG( patId ); Pattern* pPattern = nullptr; for ( unsigned i = 0; i < pPatternList->size(); i++ ) { Pattern* pTmpPattern = pPatternList->get( i ); if ( pTmpPattern ) { if ( pTmpPattern->get_name() == patId ) { pPattern = pTmpPattern; break; } } } if ( pPattern == nullptr ) { WARNINGLOG( "patternid not found in patternSequence" ); pPatternIDNode = ( QDomNode ) pPatternIDNode.nextSiblingElement( "patternID" ); delete pPatternSequence; continue; } pPatternSequence->add( pPattern ); pPatternGroupVector->push_back( pPatternSequence ); pPatternIDNode = ( QDomNode ) pPatternIDNode.nextSiblingElement( "patternID" ); } QDomNode groupNode = patternSequenceNode.firstChildElement( "group" ); while ( !groupNode.isNull() ) { PatternList* patternSequence = new PatternList(); QDomNode patternId = groupNode.firstChildElement( "patternID" ); while ( !patternId.isNull() ) { QString patId = patternId.firstChild().nodeValue(); Pattern* pPattern = nullptr; for ( unsigned i = 0; i < pPatternList->size(); i++ ) { Pattern* pTmpPattern = pPatternList->get( i ); if ( pTmpPattern ) { if ( pTmpPattern->get_name() == patId ) { pPattern = pTmpPattern; break; } } } if ( pPattern == nullptr ) { WARNINGLOG( "patternid not found in patternSequence" ); patternId = ( QDomNode ) patternId.nextSiblingElement( "patternID" ); continue; } patternSequence->add( pPattern ); patternId = ( QDomNode ) patternId.nextSiblingElement( "patternID" ); } pPatternGroupVector->push_back( patternSequence ); groupNode = groupNode.nextSiblingElement( "group" ); } pSong->set_pattern_group_vector( pPatternGroupVector ); #ifdef H2CORE_HAVE_LADSPA // reset FX for ( int fx = 0; fx < MAX_FX; ++fx ) { //LadspaFX* pFX = Effects::get_instance()->getLadspaFX( fx ); //delete pFX; Effects::get_instance()->setLadspaFX( nullptr, fx ); } #endif // LADSPA FX QDomNode ladspaNode = songNode.firstChildElement( "ladspa" ); if ( !ladspaNode.isNull() ) { int nFX = 0; QDomNode fxNode = ladspaNode.firstChildElement( "fx" ); while ( !fxNode.isNull() ) { QString sName = LocalFileMng::readXmlString( fxNode, "name", "" ); QString sFilename = LocalFileMng::readXmlString( fxNode, "filename", "" ); bool bEnabled = LocalFileMng::readXmlBool( fxNode, "enabled", false ); float fVolume = LocalFileMng::readXmlFloat( fxNode, "volume", 1.0 ); if ( sName != "no plugin" ) { // FIXME: il caricamento va fatto fare all'engine, solo lui sa il samplerate esatto #ifdef H2CORE_HAVE_LADSPA LadspaFX* pFX = LadspaFX::load( sFilename, sName, 44100 ); Effects::get_instance()->setLadspaFX( pFX, nFX ); if ( pFX ) { pFX->setEnabled( bEnabled ); pFX->setVolume( fVolume ); QDomNode inputControlNode = fxNode.firstChildElement( "inputControlPort" ); while ( !inputControlNode.isNull() ) { QString sName = LocalFileMng::readXmlString( inputControlNode, "name", "" ); float fValue = LocalFileMng::readXmlFloat( inputControlNode, "value", 0.0 ); for ( unsigned nPort = 0; nPort < pFX->inputControlPorts.size(); nPort++ ) { LadspaControlPort* port = pFX->inputControlPorts[ nPort ]; if ( QString( port->sName ) == sName ) { port->fControlValue = fValue; } } inputControlNode = ( QDomNode ) inputControlNode.nextSiblingElement( "inputControlPort" ); } } #endif } nFX++; fxNode = ( QDomNode ) fxNode.nextSiblingElement( "fx" ); } } else { WARNINGLOG( "ladspa node not found" ); } Timeline* pTimeline = Hydrogen::get_instance()->getTimeline(); pTimeline->m_timelinevector.clear(); Timeline::HTimelineVector tlvector; QDomNode bpmTimeLine = songNode.firstChildElement( "BPMTimeLine" ); if ( !bpmTimeLine.isNull() ) { QDomNode newBPMNode = bpmTimeLine.firstChildElement( "newBPM" ); while( !newBPMNode.isNull() ) { tlvector.m_htimelinebeat = LocalFileMng::readXmlInt( newBPMNode, "BAR", 0 ); tlvector.m_htimelinebpm = LocalFileMng::readXmlFloat( newBPMNode, "BPM", 120.0 ); pTimeline->m_timelinevector.push_back( tlvector ); pTimeline->sortTimelineVector(); newBPMNode = newBPMNode.nextSiblingElement( "newBPM" ); } } else { WARNINGLOG( "bpmTimeLine node not found" ); } pTimeline->m_timelinetagvector.clear(); Timeline::HTimelineTagVector tltagvector; QDomNode timeLineTag = songNode.firstChildElement( "timeLineTag" ); if ( !timeLineTag.isNull() ) { QDomNode newTAGNode = timeLineTag.firstChildElement( "newTAG" ); while( !newTAGNode.isNull() ) { tltagvector.m_htimelinetagbeat = LocalFileMng::readXmlInt( newTAGNode, "BAR", 0 ); tltagvector.m_htimelinetag = LocalFileMng::readXmlString( newTAGNode, "TAG", "" ); pTimeline->m_timelinetagvector.push_back( tltagvector ); pTimeline->sortTimelineTagVector(); newTAGNode = newTAGNode.nextSiblingElement( "newTAG" ); } } else { WARNINGLOG( "TagTimeLine node not found" ); } // Automation Paths QDomNode automationPathsNode = songNode.firstChildElement( "automationPaths" ); if ( !automationPathsNode.isNull() ) { AutomationPathSerializer pathSerializer; QDomElement pathNode = automationPathsNode.firstChildElement( "path" ); while( !pathNode.isNull()) { QString sAdjust = pathNode.attribute( "adjust" ); // Select automation path to be read based on "adjust" attribute AutomationPath *pPath = nullptr; if (sAdjust == "velocity") { pPath = pSong->get_velocity_automation_path(); } if (pPath) { pathSerializer.read_automation_path( pathNode, *pPath ); } pathNode = pathNode.nextSiblingElement( "path" ); } } pSong->set_is_modified( false ); pSong->set_filename( FileName ); return pSong; } Pattern* SongReader::getPattern( QDomNode pattern, InstrumentList* instrList ) { Pattern* pPattern = nullptr; QString sName; // name sName = LocalFileMng::readXmlString( pattern, "name", sName ); QString sInfo; sInfo = LocalFileMng::readXmlString( pattern, "info", sInfo,false,false ); QString sCategory; // category sCategory = LocalFileMng::readXmlString( pattern, "category", sCategory,false,false ); int nSize = -1; nSize = LocalFileMng::readXmlInt( pattern, "size", nSize, false, false ); pPattern = new Pattern( sName, sInfo, sCategory, nSize ); QDomNode pNoteListNode = pattern.firstChildElement( "noteList" ); if ( ! pNoteListNode.isNull() ) { // new code :) QDomNode noteNode = pNoteListNode.firstChildElement( "note" ); while ( ! noteNode.isNull() ) { Note* pNote = nullptr; unsigned nPosition = LocalFileMng::readXmlInt( noteNode, "position", 0 ); float fLeadLag = LocalFileMng::readXmlFloat( noteNode, "leadlag", 0.0, false, false ); float fVelocity = LocalFileMng::readXmlFloat( noteNode, "velocity", 0.8f ); float fPan_L = LocalFileMng::readXmlFloat( noteNode, "pan_L", 0.5 ); float fPan_R = LocalFileMng::readXmlFloat( noteNode, "pan_R", 0.5 ); int nLength = LocalFileMng::readXmlInt( noteNode, "length", -1, true ); float nPitch = LocalFileMng::readXmlFloat( noteNode, "pitch", 0.0, false, false ); float fProbability = LocalFileMng::readXmlFloat( noteNode, "probability", 1.0, false, false ); QString sKey = LocalFileMng::readXmlString( noteNode, "key", "C0", false, false ); QString nNoteOff = LocalFileMng::readXmlString( noteNode, "note_off", "false", false, false ); int instrId = LocalFileMng::readXmlInt( noteNode, "instrument", -1 ); Instrument* pInstrumentRef = nullptr; // search instrument by ref pInstrumentRef = instrList->find( instrId ); if ( !pInstrumentRef ) { ERRORLOG( QString( "Instrument with ID: '%1' not found. Note skipped." ).arg( instrId ) ); noteNode = ( QDomNode ) noteNode.nextSiblingElement( "note" ); continue; } //assert( instrRef ); bool noteoff = false; if ( nNoteOff == "true" ) { noteoff = true; } pNote = new Note( pInstrumentRef, nPosition, fVelocity, fPan_L, fPan_R, nLength, nPitch ); pNote->set_key_octave( sKey ); pNote->set_lead_lag( fLeadLag ); pNote->set_note_off( noteoff ); pNote->set_probability( fProbability ); pPattern->insert_note( pNote ); noteNode = ( QDomNode ) noteNode.nextSiblingElement( "note" ); } } else { // Back compatibility code. Version < 0.9.4 QDomNode sequenceListNode = pattern.firstChildElement( "sequenceList" ); int sequence_count = 0; QDomNode sequenceNode = sequenceListNode.firstChildElement( "sequence" ); while ( ! sequenceNode.isNull() ) { sequence_count++; QDomNode noteListNode = sequenceNode.firstChildElement( "noteList" ); QDomNode noteNode = noteListNode.firstChildElement( "note" ); while ( !noteNode.isNull() ) { Note* pNote = nullptr; unsigned nPosition = LocalFileMng::readXmlInt( noteNode, "position", 0 ); float fLeadLag = LocalFileMng::readXmlFloat( noteNode, "leadlag", 0.0, false, false ); float fVelocity = LocalFileMng::readXmlFloat( noteNode, "velocity", 0.8f ); float fPan_L = LocalFileMng::readXmlFloat( noteNode, "pan_L", 0.5 ); float fPan_R = LocalFileMng::readXmlFloat( noteNode, "pan_R", 0.5 ); int nLength = LocalFileMng::readXmlInt( noteNode, "length", -1, true ); float nPitch = LocalFileMng::readXmlFloat( noteNode, "pitch", 0.0, false, false ); int instrId = LocalFileMng::readXmlInt( noteNode, "instrument", -1 ); Instrument* instrRef = instrList->find( instrId ); assert( instrRef ); pNote = new Note( instrRef, nPosition, fVelocity, fPan_L, fPan_R, nLength, nPitch ); pNote->set_lead_lag( fLeadLag ); //infoLog( "new note!! pos: " + toString( pNote->m_nPosition ) + "\t instr: " + instrId ); pPattern->insert_note( pNote ); noteNode = ( QDomNode ) noteNode.nextSiblingElement( "note" ); } sequenceNode = ( QDomNode ) sequenceNode.nextSiblingElement( "sequence" ); } } return pPattern; } }; hydrogen-1.0.0-rc1/src/core/src/core_action_controller.cpp000066400000000000000000000323011366722712400235650ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2017 by Sebastian Moors * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include namespace H2Core { const char* CoreActionController::__class_name = "CoreActionController"; CoreActionController::CoreActionController() : Object( __class_name ), m_nDefaultMidiFeedbackChannel(0) { //nothing } CoreActionController::~CoreActionController() { //nothing } void CoreActionController::setMasterVolume( float masterVolumeValue ) { Hydrogen* pEngine = Hydrogen::get_instance(); pEngine->getSong()->set_volume( masterVolumeValue ); #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "MASTER_VOLUME_ABSOLUTE" ); FeedbackAction.setParameter2( QString("%1").arg( masterVolumeValue ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionType( QString("MASTER_VOLUME_ABSOLUTE")); handleOutgoingControlChange( ccParamValue, (masterVolumeValue / 1.5) * 127 ); } void CoreActionController::setStripVolume( int nStrip, float masterVolumeValue ) { Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setSelectedInstrumentNumber( nStrip ); Song *pSong = pEngine->getSong(); InstrumentList *instrList = pSong->get_instrument_list(); Instrument *pInstr = instrList->get( nStrip ); pInstr->set_volume( masterVolumeValue ); #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "STRIP_VOLUME_ABSOLUTE" ); FeedbackAction.setParameter1( QString("%1").arg( nStrip + 1 ) ); FeedbackAction.setParameter2( QString("%1").arg( masterVolumeValue ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionParam1( QString("STRIP_VOLUME_ABSOLUTE"), QString("%1").arg( nStrip ) ); handleOutgoingControlChange( ccParamValue, (masterVolumeValue / 1.5) * 127 ); } void CoreActionController::setMetronomeIsActive( bool isActive ) { Preferences::get_instance()->m_bUseMetronome = isActive; #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "TOGGLE_METRONOME" ); FeedbackAction.setParameter1( QString("%1").arg( (int) isActive ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionType( QString("TOGGLE_METRONOME")); handleOutgoingControlChange( ccParamValue, (int) isActive * 127 ); } void CoreActionController::setMasterIsMuted( bool isMuted ) { Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->getSong()->__is_muted = isMuted; #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "MUTE_TOGGLE" ); FeedbackAction.setParameter1( QString("%1").arg( (int) isMuted ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionType( QString("MUTE_TOGGLE") ); handleOutgoingControlChange( ccParamValue, (int) isMuted * 127 ); } void CoreActionController::setStripIsMuted( int nStrip, bool isMuted ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get( nStrip ); pInstr->set_muted( isMuted ); #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "STRIP_MUTE_TOGGLE" ); FeedbackAction.setParameter1( QString("%1").arg( nStrip + 1 ) ); FeedbackAction.setParameter2( QString("%1").arg( (int) isMuted ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionParam1( QString("STRIP_MUTE_TOGGLE"), QString("%1").arg( nStrip ) ); handleOutgoingControlChange( ccParamValue, ((int) isMuted) * 127 ); } void CoreActionController::setStripIsSoloed( int nStrip, bool isSoloed ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( isSoloed ) { for ( int i = 0; i < pInstrList->size(); ++i ) { setStripIsMuted( i, true ); } setStripIsMuted( nStrip, false ); } else { for ( int i = 0; i < pInstrList->size(); ++i ) { setStripIsMuted( i, false ); } } #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "STRIP_SOLO_TOGGLE" ); FeedbackAction.setParameter1( QString("%1").arg( nStrip + 1 ) ); FeedbackAction.setParameter2( QString("%1").arg( (int) isSoloed ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionParam1( QString("STRIP_SOLO_TOGGLE"), QString("%1").arg( nStrip ) ); handleOutgoingControlChange( ccParamValue, ((int) isSoloed) * 127 ); } void CoreActionController::setStripPan( int nStrip, float panValue ) { float pan_L; float pan_R; if (panValue >= 0.5) { pan_L = (1.0 - panValue) * 2; pan_R = 1.0; } else { pan_L = 1.0; pan_R = panValue * 2; } Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setSelectedInstrumentNumber( nStrip ); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get( nStrip ); pInstr->set_pan_l( pan_L ); pInstr->set_pan_r( pan_R ); pEngine->setSelectedInstrumentNumber( nStrip ); #ifdef H2CORE_HAVE_OSC Action FeedbackAction( "PAN_ABSOLUTE" ); FeedbackAction.setParameter1( QString("%1").arg( nStrip + 1 ) ); FeedbackAction.setParameter2( QString("%1").arg( panValue ) ); OscServer::handleAction( &FeedbackAction ); #endif MidiMap* pMidiMap = MidiMap::get_instance(); int ccParamValue = pMidiMap->findCCValueByActionParam1( QString("PAN_ABSOLUTE"), QString("%1").arg( nStrip ) ); handleOutgoingControlChange( ccParamValue, panValue * 127 ); } void CoreActionController::handleOutgoingControlChange(int param, int value) { Preferences *pPref = Preferences::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); MidiOutput *pMidiDriver = pEngine->getMidiOutput(); if( pMidiDriver && pPref->m_bEnableMidiFeedback && param >= 0 ){ pMidiDriver->handleOutgoingControlChange( param, value, m_nDefaultMidiFeedbackChannel ); } } void CoreActionController::initExternalControlInterfaces() { /* * Push the current state of Hydrogen to the attached control interfaces (e.g. OSC clients) */ //MASTER_VOLUME_ABSOLUTE Hydrogen* pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); setMasterVolume( pSong->get_volume() ); //PER-INSTRUMENT/STRIP STATES InstrumentList *pInstrList = pSong->get_instrument_list(); for(int i=0; i < pInstrList->size(); i++){ //STRIP_VOLUME_ABSOLUTE Instrument *pInstr = pInstrList->get( i ); setStripVolume( i, pInstr->get_volume() ); float fPan_L = pInstr->get_pan_l(); float fPan_R = pInstr->get_pan_r(); //PAN_ABSOLUTE float fPanValue = 0.0; if (fPan_R == 1.0) { fPanValue = 1.0 - (fPan_L / 2.0); } else { fPanValue = fPan_R / 2.0; } setStripPan( i, fPanValue ); //STRIP_MUTE_TOGGLE setStripIsMuted( i, pInstr->is_muted() ); //SOLO setStripIsSoloed( i, pInstr->is_soloed() ); } //TOGGLE_METRONOME setMetronomeIsActive( Preferences::get_instance()->m_bUseMetronome ); //MUTE_TOGGLE setMasterIsMuted( Hydrogen::get_instance()->getSong()->__is_muted ); } bool CoreActionController::newSong( const QString& songPath ) { auto pHydrogen = Hydrogen::get_instance(); if ( pHydrogen->getState() == STATE_PLAYING ) { // Stops recording, all queued MIDI notes, and the playback of // the audio driver. pHydrogen->sequencer_stop(); } // Remove all BPM tags on the Timeline. pHydrogen->getTimeline()->m_timelinevector.clear(); // Create an empty Song. auto pSong = Song::get_empty_song(); // Check whether the provided path is valid. if ( !isSongPathValid( songPath ) ) { // isSongPathValid takes care of the error log message. return false; } pSong->set_filename( songPath ); if ( pHydrogen->getActiveGUI() ) { // Store the prepared Song for the GUI to access after the // EVENT_UPDATE_SONG event was triggered. pHydrogen->setNextSong( pSong ); // If the GUI is active, the Song *must not* be set by the // core part itself. // Triggers an update of the Qt5 GUI and tells it to update // the song itself. EventQueue::get_instance()->push_event( EVENT_UPDATE_SONG, 0 ); } else { // Update the Song. pHydrogen->setSong( pSong ); } return true; } bool CoreActionController::openSong (const QString& songPath ) { auto pHydrogen = Hydrogen::get_instance(); if ( pHydrogen->getState() == STATE_PLAYING ) { // Stops recording, all queued MIDI notes, and the playback of // the audio driver. pHydrogen->sequencer_stop(); } // Remove all BPM tags on the Timeline. pHydrogen->getTimeline()->m_timelinevector.clear(); // Check whether the provided path is valid. if ( !isSongPathValid( songPath ) ) { // isSongPathValid takes care of the error log message. return false; } QFileInfo songFileInfo = QFileInfo( songPath ); if ( !songFileInfo.exists() ) { ERRORLOG( QString( "Selected song [%1] does not exist." ) .arg( songPath ) ); return false; } // Create an empty Song. auto pSong = Song::load( songPath ); if ( pSong == nullptr ) { ERRORLOG( QString( "Unable to open song [%1]." ) .arg( songPath ) ); return false; } if ( pHydrogen->getActiveGUI() ) { // Store the prepared Song for the GUI to access after the // EVENT_UPDATE_SONG event was triggered. pHydrogen->setNextSong( pSong ); // If the GUI is active, the Song *must not* be set by the // core part itself. // Triggers an update of the Qt5 GUI and tells it to update // the song itself. EventQueue::get_instance()->push_event( EVENT_UPDATE_SONG, 0 ); } else { // Update the Song. pHydrogen->setSong( pSong ); } return true; } bool CoreActionController::saveSong() { auto pHydrogen = Hydrogen::get_instance(); // Get the current Song which is about to be saved. auto pSong = pHydrogen->getSong(); // Extract the path to the associate .h2song file. QString songPath = pSong->get_filename(); if ( songPath.isEmpty() ) { ERRORLOG( "Unable to save song. Empty filename!" ); return false; } // Actual saving bool saved = pSong->save( songPath ); if ( !saved ) { ERRORLOG( QString( "Current song [%1] could not be saved!" ) .arg( songPath ) ); return false; } // Update the status bar. if ( pHydrogen->getActiveGUI() ) { EventQueue::get_instance()->push_event( EVENT_UPDATE_SONG, 1 ); } return true; } bool CoreActionController::saveSongAs( const QString& songPath ) { auto pHydrogen = Hydrogen::get_instance(); // Get the current Song which is about to be saved. auto pSong = pHydrogen->getSong(); // Check whether the provided path is valid. if ( !isSongPathValid( songPath ) ) { // isSongPathValid takes care of the error log message. return false; } if ( songPath.isEmpty() ) { ERRORLOG( "Unable to save song. Empty filename!" ); return false; } // Actual saving bool saved = pSong->save( songPath ); if ( !saved ) { ERRORLOG( QString( "Current song [%1] could not be saved!" ) .arg( songPath ) ); return false; } // Update the status bar. if ( pHydrogen->getActiveGUI() ) { EventQueue::get_instance()->push_event( EVENT_UPDATE_SONG, 1 ); } return true; } bool CoreActionController::quit() { EventQueue::get_instance()->push_event( EVENT_QUIT, 0 ); return true; } bool CoreActionController::isSongPathValid( const QString& songPath ) { QFileInfo songFileInfo = QFileInfo( songPath ); if ( !songFileInfo.isAbsolute() ) { ERRORLOG( QString( "Error: Unable to handle path [%1]. Please provide an absolute file path!" ) .arg( songPath.toLocal8Bit().data() )); return false; } if ( songFileInfo.exists() ) { if ( !songFileInfo.isWritable() ) { ERRORLOG( QString( "Error: Unable to handle path [%1]. You must have permissions to write the file!" ) .arg( songPath.toLocal8Bit().data() )); return false; } } if ( songFileInfo.suffix() != "h2song" ) { ERRORLOG( QString( "Error: Unable to handle path [%1]. The provided file must have the suffix '.h2song'!" ) .arg( songPath.toLocal8Bit().data() )); return false; } return true; } } hydrogen-1.0.0-rc1/src/core/src/event_queue.cpp000066400000000000000000000041251366722712400213650ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { EventQueue* EventQueue::__instance = nullptr; void EventQueue::create_instance() { if ( __instance == nullptr ) { __instance = new EventQueue; } } const char* EventQueue::__class_name = "EventQueue"; EventQueue::EventQueue() : Object( __class_name ) , __read_index( 0 ) , __write_index( 0 ) { __instance = this; for ( int i = 0; i < MAX_EVENTS; ++i ) { __events_buffer[ i ].type = EVENT_NONE; __events_buffer[ i ].value = 0; } } EventQueue::~EventQueue() { // infoLog( "DESTROY" ); } void EventQueue::push_event( const EventType type, const int nValue ) { unsigned int nIndex = ++__write_index; nIndex = nIndex % MAX_EVENTS; Event ev; ev.type = type; ev.value = nValue; // INFOLOG( QString( "[pushEvent] %1 : %2 %3" ).arg( nIndex ).arg( ev.type ).arg( ev.value ) ); __events_buffer[ nIndex ] = ev; } Event EventQueue::pop_event() { if ( __read_index == __write_index ) { Event ev; ev.type = EVENT_NONE; ev.value = 0; return ev; } unsigned int nIndex = ++__read_index; nIndex = nIndex % MAX_EVENTS; // INFOLOG( QString( "[popEvent] %1 : %2 %3" ).arg( nIndex ).arg( __events_buffer[ nIndex ].type ).arg( __events_buffer[ nIndex ].value ) ); return __events_buffer[ nIndex ]; } }; hydrogen-1.0.0-rc1/src/core/src/fx/000077500000000000000000000000001366722712400167475ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/fx/effects.cpp000066400000000000000000000237031366722712400210770ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_LADSPA) || _DOXYGEN_ #include #include #include #include #include #include #include #include #ifdef H2CORE_HAVE_LRDF #include #endif using namespace std; namespace H2Core { // static data Effects* Effects::__instance = nullptr; const char* Effects::__class_name = "Effects"; Effects::Effects() : Object( __class_name ) , m_pRootGroup( nullptr ) , m_pRecentGroup( nullptr ) { __instance = this; for ( int nFX = 0; nFX < MAX_FX; ++nFX ) { m_FXList[ nFX ] = nullptr; } getPluginList(); } void Effects::create_instance() { if ( __instance == nullptr ) { __instance = new Effects; } } Effects::~Effects() { //INFOLOG( "DESTROY" ); if ( m_pRootGroup != nullptr ) delete m_pRootGroup; //INFOLOG( "destroying " + to_string( m_pluginList.size() ) + " LADSPA plugins" ); for ( unsigned i = 0; i < m_pluginList.size(); i++ ) { delete m_pluginList[i]; } m_pluginList.clear(); for ( int nFX = 0; nFX < MAX_FX; ++nFX ) { delete m_FXList[ nFX ]; } } LadspaFX* Effects::getLadspaFX( int nFX ) { assert( nFX < MAX_FX ); return m_FXList[ nFX ]; } void Effects::setLadspaFX( LadspaFX* pFX, int nFX ) { assert( nFX < MAX_FX ); //INFOLOG( "[setLadspaFX] FX: " + pFX->getPluginLabel() + ", " + to_string( nFX ) ); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_FXList[ nFX ] ) { ( m_FXList[ nFX ] )->deactivate(); delete m_FXList[ nFX ]; } m_FXList[ nFX ] = pFX; if ( pFX != nullptr ) { Preferences::get_instance()->setMostRecentFX( pFX->getPluginName() ); updateRecentGroup(); } AudioEngine::get_instance()->unlock(); } /// /// Loads only usable plugins /// std::vector Effects::getPluginList() { if ( m_pluginList.size() != 0 ) { return m_pluginList; } foreach ( const QString& sPluginDir, Filesystem::ladspa_paths() ) { INFOLOG( "*** [getPluginList] reading directory: " + sPluginDir ); QDir dir( sPluginDir ); if ( !dir.exists() ) { INFOLOG( "Directory " + sPluginDir + " not found" ); continue; } QFileInfoList list = dir.entryInfoList(); for ( int i = 0; i < list.size(); ++i ) { QString sPluginName = list.at( i ).fileName(); if ( ( sPluginName == "." ) || ( sPluginName == ".." ) ) { continue; } // if the file ends with .so or .dll is a plugin, else... #ifdef WIN32 int pos = sPluginName.indexOf( ".dll" ); #else #ifdef Q_OS_MACX int pos = sPluginName.indexOf( ".dylib" ); #else int pos = sPluginName.indexOf( ".so" ); #endif #endif if ( pos == -1 ) { continue; } //warningLog( "[getPluginList] Loading: " + sPluginName ); QString sAbsPath = QString( "%1/%2" ).arg( sPluginDir ).arg( sPluginName ); QLibrary lib( sAbsPath ); LADSPA_Descriptor_Function desc_func = ( LADSPA_Descriptor_Function )lib.resolve( "ladspa_descriptor" ); if ( desc_func == nullptr ) { ERRORLOG( "Error loading the library. (" + sAbsPath + ")" ); continue; } const LADSPA_Descriptor * d; if ( desc_func ) { for ( unsigned i = 0; ( d = desc_func ( i ) ) != nullptr; i++ ) { LadspaFXInfo* pFX = new LadspaFXInfo( QString::fromLocal8Bit(d->Name) ); pFX->m_sFilename = sAbsPath; pFX->m_sLabel = QString::fromLocal8Bit(d->Label); pFX->m_sID = QString::number(d->UniqueID); pFX->m_sMaker = QString::fromLocal8Bit(d->Maker); pFX->m_sCopyright = QString::fromLocal8Bit(d->Copyright); //INFOLOG( "Loading: " + pFX->m_sLabel ); for ( unsigned j = 0; j < d->PortCount; j++ ) { LADSPA_PortDescriptor pd = d->PortDescriptors[j]; if ( LADSPA_IS_PORT_INPUT( pd ) && LADSPA_IS_PORT_CONTROL( pd ) ) { pFX->m_nICPorts++; } else if ( LADSPA_IS_PORT_INPUT( pd ) && LADSPA_IS_PORT_AUDIO( pd ) ) { pFX->m_nIAPorts++; } else if ( LADSPA_IS_PORT_OUTPUT( pd ) && LADSPA_IS_PORT_CONTROL( pd ) ) { pFX->m_nOCPorts++; } else if ( LADSPA_IS_PORT_OUTPUT( pd ) && LADSPA_IS_PORT_AUDIO( pd ) ) { pFX->m_nOAPorts++; } else { // string sPortName = d->PortNames[ j ]; QString sPortName; ERRORLOG( QString( "%1::%2 unknown port type" ).arg( pFX->m_sLabel ).arg( sPortName ) ); } } if ( ( pFX->m_nIAPorts == 2 ) && ( pFX->m_nOAPorts == 2 ) ) { // Stereo plugin m_pluginList.push_back( pFX ); } else if ( ( pFX->m_nIAPorts == 1 ) && ( pFX->m_nOAPorts == 1 ) ) { // Mono plugin m_pluginList.push_back( pFX ); } else { // not supported plugin //WARNINGLOG( "Plugin not supported: " + sPluginName ); delete pFX; } } } else { ERRORLOG( "Error loading: " + sPluginName ); } } } INFOLOG( QString( "Loaded %1 LADSPA plugins" ).arg( m_pluginList.size() ) ); std::sort( m_pluginList.begin(), m_pluginList.end(), LadspaFXInfo::alphabeticOrder ); return m_pluginList; } LadspaFXGroup* Effects::getLadspaFXGroup() { INFOLOG( "[getLadspaFXGroup]" ); // LadspaFX::getPluginList(); // load the list if ( m_pRootGroup ) { return m_pRootGroup; } m_pRootGroup = new LadspaFXGroup( "Root" ); // Adding recent FX. m_pRecentGroup = new LadspaFXGroup( "Recently Used" ); m_pRootGroup->addChild( m_pRecentGroup ); updateRecentGroup(); LadspaFXGroup *pUncategorizedGroup = new LadspaFXGroup( "Uncategorized" ); m_pRootGroup->addChild( pUncategorizedGroup ); char C = 0; LadspaFXGroup* pGroup = nullptr; for ( std::vector::iterator i = m_pluginList.begin(); i < m_pluginList.end(); i++ ) { char ch = (*i)->m_sName.toLocal8Bit().at(0); if ( ch != C ) { C = ch; pGroup = new LadspaFXGroup( QString( C ) ); pUncategorizedGroup->addChild( pGroup ); } if(pGroup){ pGroup->addLadspaInfo( *i ); } } #ifdef H2CORE_HAVE_LRDF LadspaFXGroup *pLRDFGroup = new LadspaFXGroup( "Categorized(LRDF)" ); m_pRootGroup->addChild( pLRDFGroup ); getRDF( pLRDFGroup, m_pluginList ); #endif return m_pRootGroup; } void Effects::updateRecentGroup() { if ( m_pRecentGroup == nullptr ) { return; // Too early :s } m_pRecentGroup->clear(); QString sRecent; // The recent fx names sit in the preferences object foreach ( sRecent, Preferences::get_instance()->getRecentFX() ) { for ( std::vector::iterator i = m_pluginList.begin(); i < m_pluginList.end(); i++ ) { if ( sRecent == (*i)->m_sName ) { m_pRecentGroup->addLadspaInfo( *i ); break; } } } } #ifdef H2CORE_HAVE_LRDF void Effects::getRDF( LadspaFXGroup *pGroup, vector pluginList ) { lrdf_init(); QString sDir = "/usr/share/ladspa/rdf"; QDir dir( sDir ); if ( !dir.exists() ) { WARNINGLOG( QString( "Directory %1 not found" ).arg( sDir ) ); return; } QFileInfoList list = dir.entryInfoList(); for ( int i = 0; i < list.size(); ++i ) { QString sFilename = list.at( i ).fileName(); int pos = sFilename.indexOf( ".rdf" ); if ( pos == -1 ) { continue; } QString sRDFFile = QString( "file://%1/%2" ).arg( sDir ).arg( sFilename ); int err = lrdf_read_file( sRDFFile.toLocal8Bit() ); if ( err ) { ERRORLOG( "Error parsing rdf file " + sFilename ); } QString sBase = "http://ladspa.org/ontology#Plugin"; RDFDescend( sBase, pGroup, pluginList ); } } // funzione ricorsiva void Effects::RDFDescend( const QString& sBase, LadspaFXGroup *pGroup, vector pluginList ) { //cout << "LadspaFX::RDFDescend " << sBase.toLocal8Bit().constData() << endl; lrdf_uris* uris = lrdf_get_subclasses( sBase.toLocal8Bit() ); if ( uris ) { for ( int i = 0; i < ( int )uris->count; i++ ) { QString sGroup = QString::fromLocal8Bit(lrdf_get_label( uris->items[ i ] )); LadspaFXGroup *pNewGroup = nullptr; // verifico se esiste gia una categoria con lo stesso nome vector childGroups = pGroup-> getChildList(); for ( unsigned nGroup = 0; nGroup < childGroups.size(); nGroup++ ) { LadspaFXGroup *pOldGroup = childGroups[nGroup]; if ( pOldGroup->getName() == sGroup ) { pNewGroup = pOldGroup; break; } } if ( pNewGroup == nullptr ) { // il gruppo non esiste, lo creo pNewGroup = new LadspaFXGroup( sGroup ); pGroup->addChild( pNewGroup ); } RDFDescend( QString::fromLocal8Bit(uris->items[i]), pNewGroup, pluginList ); } lrdf_free_uris ( uris ); } uris = lrdf_get_instances( sBase.toLocal8Bit() ); if ( uris ) { for ( int i = 0; i < ( int )uris->count; i++ ) { int uid = lrdf_get_uid ( uris->items[i] ); // verifico che il plugin non sia gia nella lista bool bExists = false; vector fxVect = pGroup->getLadspaInfo(); for ( unsigned nFX = 0; nFX < fxVect.size(); nFX++ ) { LadspaFXInfo *pFX = fxVect[nFX]; if ( pFX->m_sID.toInt() == uid ) { bExists = true; continue; } } if ( bExists == false ) { // find the ladspaFXInfo for ( unsigned i = 0; i < pluginList.size(); i++ ) { LadspaFXInfo *pInfo = pluginList[i]; if ( pInfo->m_sID.toInt() == uid ) { pGroup->addLadspaInfo( pInfo ); // copy the LadspaFXInfo } } } } lrdf_free_uris ( uris ); } pGroup->sort(); } #endif // H2CORE_HAVE_LRDF }; #endif // H2CORE_HAVE_LADSPA hydrogen-1.0.0-rc1/src/core/src/fx/ladspa_fx.cpp000066400000000000000000000316251366722712400214230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if defined(H2CORE_HAVE_LADSPA) || _DOXYGEN_ #include #include #include #include #include using namespace std; #define LADSPA_IS_CONTROL_INPUT(x) (LADSPA_IS_PORT_INPUT(x) && LADSPA_IS_PORT_CONTROL(x)) #define LADSPA_IS_AUDIO_INPUT(x) (LADSPA_IS_PORT_INPUT(x) && LADSPA_IS_PORT_AUDIO(x)) #define LADSPA_IS_CONTROL_OUTPUT(x) (LADSPA_IS_PORT_OUTPUT(x) && LADSPA_IS_PORT_CONTROL(x)) #define LADSPA_IS_AUDIO_OUTPUT(x) (LADSPA_IS_PORT_OUTPUT(x) && LADSPA_IS_PORT_AUDIO(x)) namespace H2Core { const char* LadspaFXGroup::__class_name = "LadspaFXGroup"; LadspaFXGroup::LadspaFXGroup( const QString& sName ) : Object( __class_name ) { // infoLog( "INIT - " + sName ); m_sName = sName; } LadspaFXGroup::~LadspaFXGroup() { // infoLog( "DESTROY - " + m_sName ); for ( int i = 0; i < ( int )m_childGroups.size(); ++i ) { delete m_childGroups[ i ]; } } void LadspaFXGroup::addLadspaInfo( LadspaFXInfo *pInfo ) { m_ladspaList.push_back( pInfo ); } void LadspaFXGroup::addChild( LadspaFXGroup *pChild ) { m_childGroups.push_back( pChild ); } bool LadspaFXGroup::alphabeticOrder( LadspaFXGroup* a, LadspaFXGroup* b ) { return ( a->getName() < b->getName() ); } void LadspaFXGroup::sort() { std::sort( m_ladspaList.begin(), m_ladspaList.end(), LadspaFXInfo::alphabeticOrder ); std::sort( m_childGroups.begin(), m_childGroups.end(), LadspaFXGroup::alphabeticOrder ); } //////////////// const char* LadspaFXInfo::__class_name = "LadspaFXInfo"; LadspaFXInfo::LadspaFXInfo( const QString& sName ) : Object( __class_name ) { // infoLog( "INIT - " + sName ); m_sFilename = ""; m_sLabel = ""; m_sName = sName; m_nICPorts = 0; m_nOCPorts = 0; m_nIAPorts = 0; m_nOAPorts = 0; } LadspaFXInfo::~LadspaFXInfo() { // infoLog( "DESTROY " + m_sName ); } bool LadspaFXInfo::alphabeticOrder( LadspaFXInfo* a, LadspaFXInfo* b ) { return ( a->m_sName < b->m_sName ); } /////////////////// const char* LadspaFX::__class_name = "LadspaFX"; // ctor LadspaFX::LadspaFX( const QString& sLibraryPath, const QString& sPluginLabel ) : Object( __class_name ) //, m_nBufferSize( 0 ) , m_pBuffer_L( nullptr ) , m_pBuffer_R( nullptr ) , m_pluginType( UNDEFINED ) , m_bEnabled( false ) , m_bActivated( false ) , m_sLabel( sPluginLabel ) , m_sLibraryPath( sLibraryPath ) , m_pLibrary( nullptr ) , m_d( nullptr ) , m_handle( nullptr ) , m_fVolume( 1.0f ) , m_nICPorts( 0 ) , m_nOCPorts( 0 ) , m_nIAPorts( 0 ) , m_nOAPorts( 0 ) { INFOLOG( QString( "INIT - %1 - %2" ).arg( sLibraryPath ).arg( sPluginLabel ) ); m_pBuffer_L = new float[MAX_BUFFER_SIZE]; m_pBuffer_R = new float[MAX_BUFFER_SIZE]; // Touch all the memory (is this really necessary?) for ( unsigned i = 0; i < MAX_BUFFER_SIZE; ++i ) { m_pBuffer_L[ i ] = 0; m_pBuffer_R[ i ] = 0; } } // dtor LadspaFX::~LadspaFX() { // dealloca il plugin INFOLOG( QString( "DESTROY - %1 - %2" ).arg( m_sLibraryPath ).arg( m_sLabel ) ); if ( m_d ) { /* if ( m_d->deactivate ) { if ( m_handle ) { INFOLOG( "deactivate" ); m_d->deactivate( m_handle ); } }*/ deactivate(); if ( m_d->cleanup ) { if ( m_handle ) { INFOLOG( "Cleanup" ); m_d->cleanup( m_handle ); } } } delete m_pLibrary; for ( unsigned i = 0; i < inputControlPorts.size(); i++ ) { delete inputControlPorts[i]; } for ( unsigned i = 0; i < outputControlPorts.size(); i++ ) { delete outputControlPorts[i]; } delete[] m_pBuffer_L; delete[] m_pBuffer_R; } // Static LadspaFX* LadspaFX::load( const QString& sLibraryPath, const QString& sPluginLabel, long nSampleRate ) { LadspaFX* pFX = new LadspaFX( sLibraryPath, sPluginLabel ); _INFOLOG( "INIT - " + sLibraryPath + " - " + sPluginLabel ); pFX->m_pLibrary = new QLibrary( sLibraryPath ); LADSPA_Descriptor_Function desc_func = ( LADSPA_Descriptor_Function )pFX->m_pLibrary->resolve( "ladspa_descriptor" ); if ( desc_func == nullptr ) { _ERRORLOG( "Error loading the library. (" + sLibraryPath + ")" ); delete pFX; return nullptr; } if ( desc_func ) { for ( unsigned i = 0; ( pFX->m_d = desc_func( i ) ) != nullptr; i++ ) { QString sName = QString::fromLocal8Bit(pFX->m_d->Name); QString sLabel = QString::fromLocal8Bit(pFX->m_d->Label); if ( sLabel != sPluginLabel ) { continue; } pFX->setPluginName( sName ); for ( unsigned j = 0; j < pFX->m_d->PortCount; j++ ) { LADSPA_PortDescriptor pd = pFX->m_d->PortDescriptors[j]; if ( LADSPA_IS_PORT_INPUT( pd ) && LADSPA_IS_PORT_CONTROL( pd ) ) { pFX->m_nICPorts++; } else if ( LADSPA_IS_PORT_INPUT( pd ) && LADSPA_IS_PORT_AUDIO( pd ) ) { pFX->m_nIAPorts++; } else if ( LADSPA_IS_PORT_OUTPUT( pd ) && LADSPA_IS_PORT_CONTROL( pd ) ) { pFX->m_nOCPorts++; } else if ( LADSPA_IS_PORT_OUTPUT( pd ) && LADSPA_IS_PORT_AUDIO( pd ) ) { pFX->m_nOAPorts++; } else { _ERRORLOG( "Unknown port type" ); } } break; } } else { _ERRORLOG( "Error in dlsym" ); delete pFX; return nullptr; } if ( ( pFX->m_nIAPorts == 2 ) && ( pFX->m_nOAPorts == 2 ) ) { // Stereo plugin pFX->m_pluginType = STEREO_FX; } else if ( ( pFX->m_nIAPorts == 1 ) && ( pFX->m_nOAPorts == 1 ) ) { // Mono plugin pFX->m_pluginType = MONO_FX; } else { _ERRORLOG( "Wrong number of ports" ); _ERRORLOG( QString( "in audio = %1" ).arg( pFX->m_nIAPorts ) ); _ERRORLOG( QString( "out audio = %1" ).arg( pFX->m_nOAPorts ) ); } //pFX->infoLog( "[LadspaFX::load] instantiate " + pFX->getPluginName() ); pFX->m_handle = pFX->m_d->instantiate( pFX->m_d, nSampleRate ); for ( unsigned nPort = 0; nPort < pFX->m_d->PortCount; nPort++ ) { LADSPA_PortDescriptor pd = pFX->m_d->PortDescriptors[ nPort ]; if ( LADSPA_IS_CONTROL_INPUT( pd ) ) { QString sName = QString::fromLocal8Bit(pFX->m_d->PortNames[ nPort ]); float fMin = 0.0; float fMax = 0.0; float fDefault = 0.0; bool isToggle = false; bool isInteger = false; LADSPA_PortRangeHint rangeHints = pFX->m_d->PortRangeHints[ nPort ]; if ( LADSPA_IS_HINT_BOUNDED_BELOW( rangeHints.HintDescriptor ) ) { fMin = ( pFX->m_d->PortRangeHints[ nPort ] ).LowerBound; } if ( LADSPA_IS_HINT_BOUNDED_ABOVE( rangeHints.HintDescriptor ) ) { fMax = ( pFX->m_d->PortRangeHints[ nPort ] ).UpperBound; } if ( LADSPA_IS_HINT_TOGGLED( rangeHints.HintDescriptor ) ) { isToggle = true; // this way the fader will act like a toggle (0, 1) isInteger = true; fMin = 0.0; fMax = 1.0; } if ( LADSPA_IS_HINT_SAMPLE_RATE( rangeHints.HintDescriptor ) ) { _WARNINGLOG( "samplerate hint not implemented yet" ); } if ( LADSPA_IS_HINT_LOGARITHMIC( rangeHints.HintDescriptor ) ) { _WARNINGLOG( "logarithmic hint not implemented yet" ); } if ( LADSPA_IS_HINT_INTEGER( rangeHints.HintDescriptor ) ) { isInteger = true; } if ( LADSPA_IS_HINT_HAS_DEFAULT( rangeHints.HintDescriptor ) ) { if ( LADSPA_IS_HINT_DEFAULT_MINIMUM( rangeHints.HintDescriptor ) ) { fDefault = fMin; } if ( LADSPA_IS_HINT_DEFAULT_LOW( rangeHints.HintDescriptor ) ) { // TODO: bisogna gestire diversamente se viene specificato di usare la scala logaritmica fDefault = ( fMin * 0.75 + fMax * 0.25 ); } if ( LADSPA_IS_HINT_DEFAULT_MIDDLE( rangeHints.HintDescriptor ) ) { fDefault = ( fMax - fMin ) / 2.0; } if ( LADSPA_IS_HINT_DEFAULT_HIGH( rangeHints.HintDescriptor ) ) { // TODO: bisogna gestire diversamente se viene specificato di usare la scala logaritmica fDefault = ( fMin * 0.25 + fMax * 0.75 ); } if ( LADSPA_IS_HINT_DEFAULT_MAXIMUM( rangeHints.HintDescriptor ) ) { fDefault = fMax; } if ( LADSPA_IS_HINT_DEFAULT_0( rangeHints.HintDescriptor ) ) { fDefault = 0.0; } if ( LADSPA_IS_HINT_DEFAULT_1( rangeHints.HintDescriptor ) ) { fDefault = 1.0; } if ( LADSPA_IS_HINT_DEFAULT_100( rangeHints.HintDescriptor ) ) { fDefault = 100.0; } if ( LADSPA_IS_HINT_DEFAULT_440( rangeHints.HintDescriptor ) ) { fDefault = 440.0; } } LadspaControlPort* pControl = new LadspaControlPort(); pControl->sName = sName; pControl->fLowerBound = fMin; pControl->fUpperBound = fMax; pControl->fControlValue = fDefault; pControl->fDefaultValue = fDefault; pControl->isToggle = isToggle; pControl->m_bIsInteger = isInteger; _INFOLOG( QString( "Input control port\t[%1]\tmin=%2,\tmax=%3,\tcontrolValue=%4" ).arg( sName ).arg( fMin ).arg( fMax ).arg( pControl->fControlValue ) ); pFX->inputControlPorts.push_back( pControl ); pFX->m_d->connect_port( pFX->m_handle, nPort, &( pControl->fControlValue ) ); } else if ( LADSPA_IS_CONTROL_OUTPUT( pd ) ) { QString sName = QString::fromLocal8Bit(pFX->m_d->PortNames[ nPort ]); float fMin = 0.0; float fMax = 0.0; float fDefault = 0.0; LADSPA_PortRangeHint rangeHints = pFX->m_d->PortRangeHints[ nPort ]; if ( LADSPA_IS_HINT_BOUNDED_BELOW( rangeHints.HintDescriptor ) ) { fMin = ( pFX->m_d->PortRangeHints[ nPort ] ).LowerBound; } if ( LADSPA_IS_HINT_BOUNDED_ABOVE( rangeHints.HintDescriptor ) ) { fMax = ( pFX->m_d->PortRangeHints[ nPort ] ).UpperBound; } /* LadspaControlPort* pControl = new LadspaControlPort(); pControl->sName = pFX->m_d->PortNames[ nPort ]; pControl->fLowerBound = ( pFX->m_d->PortRangeHints[ nPort ] ).LowerBound; pControl->fUpperBound = ( pFX->m_d->PortRangeHints[ nPort ] ).UpperBound; pControl->fControlValue = pControl->fUpperBound / 2.0; */ // always middle fDefault = ( fMax - fMin ) / 2.0; LadspaControlPort* pControl = new LadspaControlPort(); pControl->sName = sName; pControl->fLowerBound = fMin; pControl->fUpperBound = fMax; pControl->fControlValue = fDefault; pControl->fDefaultValue = fDefault; //pFX->infoLog( "[LadspaFX::load] Output control port\t[" + sName + "]\tmin=" + to_string(fMin) + ",\tmax=" + to_string(fMax) + ",\tcontrolValue=" + to_string(pControl->fControlValue) ); pFX->outputControlPorts.push_back( pControl ); pFX->m_d->connect_port( pFX->m_handle, nPort, &( pControl->fControlValue ) ); } else if ( LADSPA_IS_AUDIO_INPUT( pd ) ) { } else if ( LADSPA_IS_AUDIO_OUTPUT( pd ) ) { } else { _ERRORLOG( "unknown port" ); } } return pFX; } void LadspaFX::connectAudioPorts( float* pIn_L, float* pIn_R, float* pOut_L, float* pOut_R ) { INFOLOG( "[connectAudioPorts]" ); unsigned nAIConn = 0; unsigned nAOConn = 0; for ( unsigned nPort = 0; nPort < m_d->PortCount; nPort++ ) { LADSPA_PortDescriptor pd = m_d->PortDescriptors[ nPort ]; if ( LADSPA_IS_CONTROL_INPUT( pd ) ) { } else if ( LADSPA_IS_CONTROL_OUTPUT( pd ) ) { } else if ( LADSPA_IS_AUDIO_INPUT( pd ) ) { if ( nAIConn == 0 ) { m_d->connect_port( m_handle, nPort, pIn_L ); //infoLog( "connect input port (L): " + string( m_d->PortNames[ nPort ] ) ); } else if ( nAIConn == 1 ) { m_d->connect_port( m_handle, nPort, pIn_R ); //infoLog( "connect input port (R): " + string( m_d->PortNames[ nPort ] ) ); } else { ERRORLOG( "too many input ports.." ); } nAIConn++; } else if ( LADSPA_IS_AUDIO_OUTPUT( pd ) ) { if ( nAOConn == 0 ) { m_d->connect_port( m_handle, nPort, pOut_L ); //infoLog( "connect output port (L): " + string( m_d->PortNames[ nPort ] ) ); } else if ( nAOConn == 1 ) { m_d->connect_port( m_handle, nPort, pOut_R ); //infoLog( "connect output port (R): " + string( m_d->PortNames[ nPort ] ) ); } else { ERRORLOG( "too many output ports.." ); } nAOConn++; } else { ERRORLOG( "unknown port" ); } } } void LadspaFX::processFX( unsigned nFrames ) { // infoLog( "[LadspaFX::applyFX()]" ); if( m_bActivated ) m_d->run( m_handle, nFrames ); } void LadspaFX::activate() { if ( m_d->activate ) { INFOLOG( "activate " + getPluginName() ); m_bActivated = true; m_d->activate( m_handle ); } } void LadspaFX::deactivate() { if ( m_d->deactivate && m_bActivated ) { INFOLOG( "deactivate " + getPluginName() ); m_bActivated = false; m_d->deactivate( m_handle ); } } void LadspaFX::setVolume( float fValue ) { if ( fValue > 2.0 ) { fValue = 2.0; } else if ( fValue < 0.0 ) { fValue = 0.0; } m_fVolume = fValue; } }; #endif // H2CORE_HAVE_LADSPA hydrogen-1.0.0-rc1/src/core/src/helpers/000077500000000000000000000000001366722712400177745ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/helpers/files.cpp000066400000000000000000000041631366722712400216060ustar00rootroot00000000000000 #include #include #include #include #include #include namespace H2Core { const char* Files::__class_name = "Files"; QString Files::savePattern( SaveMode mode, const QString& fileName, const Pattern* pPattern, Song* pSong, const QString& drumkitName ) { QFileInfo fileInfo; switch ( mode ) { case SAVE_NEW: case SAVE_OVERWRITE: fileInfo = Filesystem::pattern_path( drumkitName, fileName ); break; case SAVE_PATH: fileInfo = fileName; break; case SAVE_TMP: fileInfo = Filesystem::tmp_file_path( fileName ); break; default: ERRORLOG( QString( "unknown mode : %1" ).arg( mode ) ); return nullptr; break; } if ( mode == SAVE_NEW && Filesystem::file_exists( fileInfo.absoluteFilePath(), false ) ) { return nullptr; } if ( !Filesystem::path_usable( fileInfo.path(), true, false ) ) { return nullptr; } if ( !pPattern->save_file( drumkitName, pSong->get_author(), pSong->get_license(), fileInfo.absoluteFilePath(), true ) ) { return nullptr; } return fileInfo.absoluteFilePath(); } QString Files::savePlaylist( SaveMode mode, const QString& fileName, Playlist* playlist, bool relativePaths ) { QFileInfo fileInfo; switch ( mode ) { case SAVE_NEW: case SAVE_OVERWRITE: fileInfo = Filesystem::playlist_path( fileName ); break; case SAVE_PATH: fileInfo = fileName; break; case SAVE_TMP: fileInfo = Filesystem::tmp_file_path( fileName ); break; default: ERRORLOG( QString( "unknown mode : %1" ).arg( mode ) ); return nullptr; break; } if ( mode == SAVE_NEW && Filesystem::file_exists( fileInfo.absoluteFilePath(), false ) ) { return nullptr; } if ( !Filesystem::path_usable( fileInfo.path(), true, false ) ) { return nullptr; } if ( !playlist->save_file( fileInfo.absoluteFilePath(), fileInfo.fileName(), true, relativePaths) ) { return nullptr; } return fileInfo.absoluteFilePath(); } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/helpers/filesystem.cpp000066400000000000000000000511151366722712400226670ustar00rootroot00000000000000 #include #include #include #include #include #include // directories #define LOCAL_DATA_PATH "data/" #define CACHE "cache/" #define DEMOS "demo_songs/" #define DOC "doc/" #define DRUMKITS "drumkits/" #define I18N "i18n/" #define IMG "img/" #define PATTERNS "patterns/" #define PLAYLISTS "playlists/" #define PLUGINS "plugins/" #define REPOSITORIES "repositories/" #define SCRIPTS "scripts/" #define SONGS "songs/" #define TMP "hydrogen/" #define XSD "xsd/" // files /** Sound of metronome beat */ #define CLICK_SAMPLE "click.wav" #define EMPTY_SAMPLE "emptySample.wav" #define EMPTY_SONG "DefaultSong.h2song" #define USR_CONFIG "hydrogen.conf" #define SYS_CONFIG "hydrogen.default.conf" #define DRUMKIT_XML "drumkit.xml" #define DRUMKIT_XSD "drumkit.xsd" #define DRUMPAT_XSD "drumkit_pattern.xsd" #define PLAYLIST_XSD "playlist.xsd" #define AUTOSAVE "autosave" #define UNTITLED_SONG "untitled.h2song" #define UNTITLED_PLAYLIST "untitled.h2playlist" // filters #define PATTERN_FILTER "*.h2pattern" #define PLAYLIST_FILTER "*.h2playlist" #define SONG_FILTER "*.h2song" namespace H2Core { Logger* Filesystem::__logger = nullptr; const char* Filesystem::__class_name = "Filesystem"; const QString Filesystem::scripts_ext = ".sh"; const QString Filesystem::songs_ext = ".h2song"; const QString Filesystem::patterns_ext = ".h2pattern"; const QString Filesystem::playlist_ext = ".h2playlist"; const QString Filesystem::scripts_filter_name = "Hydrogen Scripts (*.sh)"; const QString Filesystem::songs_filter_name = "Hydrogen Songs (*.h2song)"; const QString Filesystem::patterns_filter_name = "Hydrogen Patterns (*.h2pattern)"; const QString Filesystem::playlists_filter_name = "Hydrogen Playlists (*.h2playlist)"; QString Filesystem::__sys_data_path; QString Filesystem::__usr_data_path; QString Filesystem::__usr_cfg_path; QStringList Filesystem::__ladspa_paths; /* TODO QCoreApplication is not instantiated */ bool Filesystem::bootstrap( Logger* logger, const QString& sys_path ) { if( __logger==nullptr && logger!=nullptr ) { __logger = logger; } else { return false; } #ifdef Q_OS_MACX #ifdef H2CORE_HAVE_BUNDLE // Bundle: Prepare hydrogen to use path names which are used in app bundles: http://en.wikipedia.org/wiki/Application_Bundle __sys_data_path = QCoreApplication::applicationDirPath().append( "/../Resources/data/" ) ; #else __sys_data_path = QCoreApplication::applicationDirPath().append( "/data/" ) ; #endif __usr_data_path = QDir::homePath().append( "/Library/Application Support/Hydrogen/data/" ); __usr_cfg_path = QDir::homePath().append( "/Library/Application Support/Hydrogen/" USR_CONFIG ); #elif WIN32 __sys_data_path = QCoreApplication::applicationDirPath().append( "/data/" ) ; __usr_data_path = QDir::homePath().append( "/.hydrogen/data/" ) ; __usr_cfg_path = QDir::homePath().append( "/.hydrogen/" USR_CONFIG ) ; #else __sys_data_path = H2_SYS_PATH "/data/"; __usr_data_path = QDir::homePath().append( "/" H2_USR_PATH "/data/" ); __usr_cfg_path = QDir::homePath().append( "/" H2_USR_PATH "/" USR_CONFIG ); #endif if( sys_path!=nullptr ) __sys_data_path = sys_path; if( !dir_readable( __sys_data_path ) ) { __sys_data_path = QCoreApplication::applicationDirPath().append( "/" LOCAL_DATA_PATH ); ERRORLOG( QString( "will use local data path : %1" ).arg( __sys_data_path ) ); } char* ladspaPath = getenv( "LADSPA_PATH" ); if ( ladspaPath ) { INFOLOG( "Found LADSPA_PATH environment variable" ); QString sLadspaPath = QString::fromLocal8Bit( ladspaPath ); int pos; while ( ( pos = sLadspaPath.indexOf( ":" ) ) != -1 ) { QString sPath = sLadspaPath.left( pos ); __ladspa_paths << QFileInfo(sPath).canonicalFilePath(); sLadspaPath = sLadspaPath.mid( pos + 1, sLadspaPath.length() ); } __ladspa_paths << QFileInfo( sLadspaPath ).canonicalFilePath(); } else { #ifdef Q_OS_MACX __ladspa_paths << QFileInfo( QCoreApplication::applicationDirPath(), "/../Resources/plugins" ).canonicalFilePath(); __ladspa_paths << QFileInfo( "/Library/Audio/Plug-Ins/LADSPA/" ).canonicalFilePath(); __ladspa_paths << QFileInfo( QDir::homePath(), "/Library/Audio/Plug-Ins/LADSPA" ).canonicalFilePath(); #else __ladspa_paths << QFileInfo( "/usr/lib/ladspa" ).canonicalFilePath(); __ladspa_paths << QFileInfo( "/usr/local/lib/ladspa" ).canonicalFilePath(); __ladspa_paths << QFileInfo( "/usr/lib64/ladspa" ).canonicalFilePath(); __ladspa_paths << QFileInfo( "/usr/local/lib64/ladspa" ).canonicalFilePath(); #endif } __ladspa_paths.sort(); __ladspa_paths.removeDuplicates(); if ( !__ladspa_paths.isEmpty() && __ladspa_paths.at( 0 ).isEmpty() ) { __ladspa_paths.removeFirst(); } // we want this first __ladspa_paths << Filesystem::plugins_dir(); __ladspa_paths.removeDuplicates(); bool ret = check_sys_paths(); ret &= check_usr_paths(); info(); return ret; } bool Filesystem::check_permissions( const QString& path, const int perms, bool silent ) { QFileInfo fi( path ); if( ( perms & is_file ) && ( perms & is_writable ) && !fi.exists() ) { QFileInfo folder( path.left( path.lastIndexOf( "/" ) ) ); if( !folder.isDir() ) { if( !silent ) ERRORLOG( QString( "%1 is not a directory" ).arg( folder.fileName() ) ); return false; } if( !folder.isWritable() ) { if( !silent ) ERRORLOG( QString( "%1 is not writable" ).arg( folder.fileName() ) ); return false; } return true; } if( ( perms & is_dir ) && !fi.isDir() ) { if( !silent ) ERRORLOG( QString( "%1 is not a directory" ).arg( path ) ); return false; } if( ( perms & is_file ) && !fi.isFile() ) { if( !silent ) ERRORLOG( QString( "%1 is not a file" ).arg( path ) ); return false; } if( ( perms & is_readable ) && !fi.isReadable() ) { if( !silent ) ERRORLOG( QString( "%1 is not readable" ).arg( path ) ); return false; } if( ( perms & is_writable ) && !fi.isWritable() ) { if( !silent ) ERRORLOG( QString( "%1 is not writable" ).arg( path ) ); return false; } if( ( perms & is_executable ) && !fi.isExecutable() ) { if( !silent ) ERRORLOG( QString( "%1 is not executable" ).arg( path ) ); return false; } return true; } bool Filesystem::file_exists( const QString& path, bool silent ) { return check_permissions( path, is_file, silent ); } bool Filesystem::file_readable( const QString& path, bool silent ) { return check_permissions( path, is_file|is_readable, silent ); } bool Filesystem::file_writable( const QString& path, bool silent ) { return check_permissions( path, is_file|is_readable|is_writable, silent ); } bool Filesystem::file_executable( const QString& path, bool silent ) { return check_permissions( path, is_file|is_executable, silent ); } bool Filesystem::dir_readable( const QString& path, bool silent ) { return check_permissions( path, is_dir|is_readable|is_executable, silent ); } bool Filesystem::dir_writable( const QString& path, bool silent ) { return check_permissions( path, is_dir|is_writable, silent ); } bool Filesystem::mkdir( const QString& path ) { if ( !QDir( "/" ).mkpath( QDir( path ).absolutePath() ) ) { ERRORLOG( QString( "unable to create directory : %1" ).arg( path ) ); return false; } return true; } bool Filesystem::path_usable( const QString& path, bool create, bool silent ) { if( !QDir( path ).exists() ) { if( !silent ) INFOLOG( QString( "create user directory : %1" ).arg( path ) ); if( create && !QDir( "/" ).mkpath( path ) ) { if( !silent ) ERRORLOG( QString( "unable to create user directory : %1" ).arg( path ) ); return false; } } return dir_readable( path, silent ) && dir_writable( path, silent ); } bool Filesystem::write_to_file( const QString& dst, const QString& content ) { if ( !file_writable( dst ) ) { ERRORLOG( QString( "unable to write to %1" ).arg( dst ) ); return false; } QFile file( dst ); if ( !file.open( QIODevice::WriteOnly ) ) { ERRORLOG( QString( "unable to write to %1" ).arg( dst ) ); return false; } file.write( content.toUtf8().data() ); file.close(); return true; } bool Filesystem::file_copy( const QString& src, const QString& dst, bool overwrite ) { if( !overwrite && file_exists( dst, true ) ) { WARNINGLOG( QString( "do not overwrite %1 with %2 as it already exists" ).arg( dst ).arg( src ) ); return true; } if ( !file_readable( src ) ) { ERRORLOG( QString( "unable to copy %1 to %2, %1 is not readable" ).arg( src ).arg( dst ) ); return false; } if ( !file_writable( dst ) ) { ERRORLOG( QString( "unable to copy %1 to %2, %2 is not writable" ).arg( src ).arg( dst ) ); return false; } INFOLOG( QString( "copy %1 to %2" ).arg( src ).arg( dst ) ); return QFile::copy( src,dst ); } bool Filesystem::rm( const QString& path, bool recursive ) { if ( check_permissions( path, is_file, true ) ) { QFile file( path ); bool ret = file.remove(); if( !ret ) { ERRORLOG( QString( "unable to remove file %1" ).arg( path ) ); } return ret; } if ( !check_permissions( path, is_dir, true ) ) { ERRORLOG( QString( "%1 is neither a file nor a directory ?!?!" ).arg( path ) ); return false; } if ( !recursive ) { QDir dir; bool ret = dir.rmdir( path ); if( !ret ) { ERRORLOG( QString( "unable to remove dir %1 without recursive argument, maybe it is not empty?" ).arg( path ) ); } return ret; } return rm_fr( path ); } bool Filesystem::rm_fr( const QString& path ) { bool ret = true; QDir dir( path ); QFileInfoList entries = dir.entryInfoList( QDir::NoDotAndDotDot | QDir::AllEntries ); for ( int idx = 0; ( ( idx < entries.size() ) && ret ); idx++ ) { QFileInfo entryInfo = entries[idx]; if ( entryInfo.isDir() && !entryInfo.isSymLink() ) { ret = rm_fr( entryInfo.absoluteFilePath() ); } else { QFile file( entryInfo.absoluteFilePath() ); if ( !file.remove() ) { ERRORLOG( QString( "unable to remove %1" ).arg( entryInfo.absoluteFilePath() ) ); ret = false; } } } if ( !dir.rmdir( dir.absolutePath() ) ) { ERRORLOG( QString( "unable to remove %1" ).arg( dir.absolutePath() ) ); ret = false; } return ret; } bool Filesystem::check_sys_paths() { bool ret = true; if( !dir_readable( __sys_data_path ) ) ret = false; if( !file_readable( click_file_path() ) ) ret = false; if( !file_readable( empty_song_path() ) ) ret = false; if( !dir_readable( demos_dir() ) ) ret = false; /* if( !dir_readable( doc_dir() ) ) ret = false; */ // FIXME if( !dir_readable( sys_drumkits_dir() ) ) ret = false; if( !file_readable( empty_sample_path() ) ) ret = false; if( !file_readable( sys_config_path() ) ) ret = false; if( !dir_readable( i18n_dir() ) ) ret = false; if( !dir_readable( img_dir() ) ) ret = false; if( !dir_readable( xsd_dir() ) ) ret = false; if( !file_readable( pattern_xsd_path() ) ) ret = false; if( !file_readable( drumkit_xsd_path() ) ) ret = false; if( !file_readable( playlist_xsd_path() ) ) ret = false; if ( ret ) INFOLOG( QString( "system wide data path %1 is usable." ).arg( __sys_data_path ) ); return ret; } bool Filesystem::check_usr_paths() { bool ret = true; if( !path_usable( tmp_dir() ) ) ret = false; if( !path_usable( __usr_data_path ) ) ret = false; if( !path_usable( cache_dir() ) ) ret = false; if( !path_usable( repositories_cache_dir() ) ) ret = false; if( !path_usable( usr_drumkits_dir() ) ) ret = false; if( !path_usable( patterns_dir() ) ) ret = false; if( !path_usable( playlists_dir() ) ) ret = false; if( !path_usable( plugins_dir() ) ) ret = false; if( !path_usable( scripts_dir() ) ) ret = false; if( !path_usable( songs_dir() ) ) ret = false; if( !file_writable( usr_config_path() ) ) ret = false; if ( ret ) INFOLOG( QString( "user path %1 is usable." ).arg( __usr_data_path ) ); return ret; } QString Filesystem::sys_data_path() { return __sys_data_path; } QString Filesystem::usr_data_path() { return __usr_data_path; } QStringList Filesystem::ladspa_paths() { return __ladspa_paths; } // FILES QString Filesystem::sys_config_path() { return __sys_data_path + SYS_CONFIG; } QString Filesystem::usr_config_path() { return __usr_cfg_path; } QString Filesystem::empty_sample_path() { return __sys_data_path + EMPTY_SAMPLE; } QString Filesystem::empty_song_path() { return __sys_data_path + EMPTY_SONG; } QString Filesystem::untitled_song_file_name() { return UNTITLED_SONG; } QString Filesystem::untitled_playlist_file_name() { return UNTITLED_PLAYLIST; } QString Filesystem::click_file_path() { return __sys_data_path + CLICK_SAMPLE; } QString Filesystem::usr_click_file_path() { if( file_readable( __usr_data_path + CLICK_SAMPLE, true ) ) return __usr_data_path + CLICK_SAMPLE; return click_file_path(); } QString Filesystem::drumkit_xsd_path( ) { return xsd_dir() + DRUMKIT_XSD; } QString Filesystem::pattern_xsd_path( ) { return xsd_dir() + DRUMPAT_XSD; } QString Filesystem::playlist_xsd_path( ) { return xsd_dir() + PLAYLIST_XSD; } // DIRS QString Filesystem::img_dir() { return __sys_data_path + IMG; } QString Filesystem::doc_dir() { return __sys_data_path + DOC; } QString Filesystem::i18n_dir() { return __sys_data_path + I18N; } QString Filesystem::scripts_dir() { return __usr_data_path + SCRIPTS; } QString Filesystem::songs_dir() { return __usr_data_path + SONGS; } QString Filesystem::song_path( const QString& sg_name ) { return QString( songs_dir() + sg_name + songs_ext ); } QString Filesystem::patterns_dir() { return __usr_data_path + PATTERNS; } QString Filesystem::patterns_dir( const QString& dk_name ) { return __usr_data_path + PATTERNS + dk_name + "/"; } QString Filesystem::pattern_path( const QString& dk_name, const QString& p_name ) { if ( dk_name.isEmpty() ) { return patterns_dir() + p_name + patterns_ext; } else { return patterns_dir( dk_name ) + p_name + patterns_ext; } } QString Filesystem::plugins_dir() { return __usr_data_path + PLUGINS; } QString Filesystem::sys_drumkits_dir() { return __sys_data_path + DRUMKITS; } QString Filesystem::usr_drumkits_dir() { return __usr_data_path + DRUMKITS; } QString Filesystem::playlists_dir() { return __usr_data_path + PLAYLISTS; } QString Filesystem::playlist_path( const QString& pl_name ) { return patterns_dir() + pl_name + playlist_ext; } QString Filesystem::cache_dir() { return __usr_data_path + CACHE; } QString Filesystem::repositories_cache_dir() { return __usr_data_path + CACHE + REPOSITORIES; } QString Filesystem::demos_dir() { return __sys_data_path + DEMOS; } QString Filesystem::xsd_dir() { return __sys_data_path + XSD; } QString Filesystem::tmp_dir() { return QDir::tempPath() + "/" + TMP; } QString Filesystem::tmp_file_path( const QString& base ) { QFileInfo f( base ); QString templateName(tmp_dir() + "/"); if ( f.suffix().isEmpty() ) { templateName += base; } else { templateName += f.completeBaseName() + "-XXXXXX." + f.suffix(); } QTemporaryFile file( templateName.replace( " ", "_" ) ); file.setAutoRemove( false ); file.open(); file.close(); return file.fileName(); } // DRUMKITS QStringList Filesystem::drumkit_list( const QString& path ) { QStringList ok; QStringList possible = QDir( path ).entryList( QDir::Dirs | QDir::Readable | QDir::NoDotAndDotDot ); foreach ( const QString& dk, possible ) { if ( drumkit_valid( path + dk ) ) { ok << dk; } else { ERRORLOG( QString( "drumkit %1 is not usable" ).arg( dk ) ); } } return ok; } QStringList Filesystem::sys_drumkit_list( ) { return drumkit_list( sys_drumkits_dir() ) ; } QStringList Filesystem::usr_drumkit_list( ) { return drumkit_list( usr_drumkits_dir() ) ; } QString Filesystem::prepare_sample_path( const QString& fname ) { int idx = get_basename_idx_under_drumkit( fname ); if ( idx >= 0 ) { return fname.midRef( idx ).toString(); } return fname; } bool Filesystem::file_is_under_drumkit( const QString& fname ) { return get_basename_idx_under_drumkit( fname ) != -1; } int Filesystem::get_basename_idx_under_drumkit( const QString& fname ) { if( fname.startsWith( usr_drumkits_dir() ) ) { int start = usr_drumkits_dir().size(); int index = fname.indexOf( "/", start ); QString dk_name = fname.midRef( start , index - start).toString(); if ( usr_drumkit_list().contains( dk_name ) ) { return index + 1; } } if( fname.startsWith( sys_drumkits_dir() ) ) { int start = sys_drumkits_dir().size(); int index = fname.indexOf( "/", start); QString dk_name = fname.midRef( start, index - start).toString(); if ( sys_drumkit_list().contains( dk_name ) ) { return index + 1; } } return -1; } bool Filesystem::drumkit_exists( const QString& dk_name ) { if( usr_drumkit_list().contains( dk_name ) ) return true; return sys_drumkit_list().contains( dk_name ); } QString Filesystem::drumkit_usr_path( const QString& dk_name ) { return usr_drumkits_dir() + dk_name; } QString Filesystem::drumkit_path_search( const QString& dk_name ) { if( usr_drumkit_list().contains( dk_name ) ) return usr_drumkits_dir() + dk_name; if( sys_drumkit_list().contains( dk_name ) ) return sys_drumkits_dir() + dk_name; ERRORLOG( QString( "drumkit %1 not found" ).arg( dk_name ) ); return ""; } QString Filesystem::drumkit_dir_search( const QString& dk_name ) { if( usr_drumkit_list().contains( dk_name ) ) return usr_drumkits_dir(); if( sys_drumkit_list().contains( dk_name ) ) return sys_drumkits_dir(); ERRORLOG( QString( "drumkit %1 not found" ).arg( dk_name ) ); return ""; } bool Filesystem::drumkit_valid( const QString& dk_path ) { return file_readable( dk_path + "/" + DRUMKIT_XML, true); } QString Filesystem::drumkit_file( const QString& dk_path ) { return dk_path + "/" + DRUMKIT_XML; } // PATTERNS QStringList Filesystem::pattern_drumkits() { return QDir( patterns_dir() ).entryList( QDir::Dirs | QDir::Readable | QDir::NoDotAndDotDot ); } QStringList Filesystem::pattern_list() { return pattern_list( patterns_dir() ); } QStringList Filesystem::pattern_list( const QString& path) { return QDir( path ).entryList( QStringList( PATTERN_FILTER ), QDir::Files | QDir::Readable | QDir::NoDotAndDotDot ); } // SONGS QStringList Filesystem::song_list( ) { return QDir( songs_dir() ).entryList( QStringList( SONG_FILTER ), QDir::Files | QDir::Readable | QDir::NoDotAndDotDot ); } QStringList Filesystem::song_list_cleared( ) { QStringList result; foreach ( const QString& str, song_list() ) { if ( !str.contains( AUTOSAVE ) ) { result += str; } } return result; } bool Filesystem::song_exists( const QString& sg_name ) { return QDir( songs_dir() ).exists( sg_name ); } // PLAYLISTS QStringList Filesystem::playlist_list( ) { return QDir( playlists_dir() ).entryList( QStringList( PLAYLIST_FILTER ), QDir::Files | QDir::Readable | QDir::NoDotAndDotDot ); } void Filesystem::info() { INFOLOG( QString( "Tmp dir : %1" ).arg( tmp_dir() ) ); // SYS INFOLOG( QString( "Click file : %1" ).arg( click_file_path() ) ); INFOLOG( QString( "Empty song : %1" ).arg( empty_song_path() ) ); INFOLOG( QString( "Demos dir : %1" ).arg( demos_dir() ) ); INFOLOG( QString( "Documentation dir : %1" ).arg( doc_dir() ) ); // FIXME must be created even if no doc deployed INFOLOG( QString( "System drumkit dir : %1" ).arg( sys_drumkits_dir() ) ); INFOLOG( QString( "Empty sample : %1" ).arg( empty_sample_path() ) ); INFOLOG( QString( "Default config : %1" ).arg( sys_config_path() ) ); INFOLOG( QString( "Internationalization dir : %1" ).arg( i18n_dir() ) ); INFOLOG( QString( "Images dir : %1" ).arg( img_dir() ) ); // new_tutorial INFOLOG( QString( "XSD dir : %1" ).arg( xsd_dir() ) ); INFOLOG( QString( "drumkit pattern XSD : %1" ).arg( pattern_xsd_path() ) ); INFOLOG( QString( "drumkit XSD : %1" ).arg( drumkit_xsd_path() ) ); INFOLOG( QString( "drumkit XSD : %1" ).arg( playlist_xsd_path() ) ); // USR INFOLOG( QString( "User config : %1" ).arg( usr_config_path() ) ); // FIXME INFOLOG( QString( "User Click file : %1" ).arg( usr_click_file_path() ) ); INFOLOG( QString( "Cache dir : %1" ).arg( cache_dir() ) ); INFOLOG( QString( "Reporitories Cache dir : %1" ).arg( repositories_cache_dir() ) ); INFOLOG( QString( "User drumkit dir : %1" ).arg( usr_drumkits_dir() ) ); INFOLOG( QString( "Patterns dir : %1" ).arg( patterns_dir() ) ); INFOLOG( QString( "Playlist dir : %1" ).arg( playlists_dir() ) ); INFOLOG( QString( "Plugins dir : %1" ).arg( plugins_dir() ) ); INFOLOG( QString( "Scripts dir : %1" ).arg( scripts_dir() ) ); INFOLOG( QString( "Songs dir : %1" ).arg( songs_dir() ) ); } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/helpers/legacy.cpp000066400000000000000000000310141366722712400217430ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace H2Core { const char* Legacy::__class_name = "Legacy"; Drumkit* Legacy::load_drumkit( const QString& dk_path ) { if ( version_older_than( 0, 9, 8 ) ) { WARNINGLOG( QString( "this code should not be used anymore, it belongs to 0.9.6" ) ); } else { WARNINGLOG( QString( "loading drumkit with legacy code" ) ); } XMLDoc doc; if( !doc.read( dk_path ) ) { return nullptr; } XMLNode root = doc.firstChildElement( "drumkit_info" ); if ( root.isNull() ) { ERRORLOG( "drumkit_info node not found" ); return nullptr; } QString drumkit_name = root.read_string( "name", "", false, false ); if ( drumkit_name.isEmpty() ) { ERRORLOG( "Drumkit has no name, abort" ); return nullptr; } Drumkit* pDrumkit = new Drumkit(); pDrumkit->set_path( dk_path.left( dk_path.lastIndexOf( "/" ) ) ); pDrumkit->set_name( drumkit_name ); pDrumkit->set_author( root.read_string( "author", "undefined author" ) ); pDrumkit->set_info( root.read_string( "info", "defaultInfo" ) ); pDrumkit->set_license( root.read_string( "license", "undefined license" ) ); pDrumkit->set_image( root.read_string( "image", "" ) ); pDrumkit->set_image_license( root.read_string( "imageLicense", "undefined license" ) ); XMLNode instruments_node = root.firstChildElement( "instrumentList" ); if ( instruments_node.isNull() ) { WARNINGLOG( "instrumentList node not found" ); pDrumkit->set_instruments( new InstrumentList() ); } else { InstrumentList* pInstruments = new InstrumentList(); XMLNode instrument_node = instruments_node.firstChildElement( "instrument" ); int count = 0; while ( !instrument_node.isNull() ) { count++; if ( count > MAX_INSTRUMENTS ) { ERRORLOG( QString( "instrument count >= %2, stop reading instruments" ).arg( MAX_INSTRUMENTS ) ); break; } Instrument* pInstrument = nullptr; int id = instrument_node.read_int( "id", EMPTY_INSTR_ID, false, false ); if ( id!=EMPTY_INSTR_ID ) { pInstrument = new Instrument( id, instrument_node.read_string( "name", "" ), nullptr ); pInstrument->set_drumkit_name( drumkit_name ); pInstrument->set_volume( instrument_node.read_float( "volume", 1.0f ) ); pInstrument->set_muted( instrument_node.read_bool( "isMuted", false ) ); pInstrument->set_pan_l( instrument_node.read_float( "pan_L", 1.0f ) ); pInstrument->set_pan_r( instrument_node.read_float( "pan_R", 1.0f ) ); // may not exist, but can't be empty pInstrument->set_apply_velocity( instrument_node.read_bool( "applyVelocity", true, false ) ); pInstrument->set_filter_active( instrument_node.read_bool( "filterActive", true, false ) ); pInstrument->set_filter_cutoff( instrument_node.read_float( "filterCutoff", 1.0f, true, false ) ); pInstrument->set_filter_resonance( instrument_node.read_float( "filterResonance", 0.0f, true, false ) ); pInstrument->set_random_pitch_factor( instrument_node.read_float( "randomPitchFactor", 0.0f, true, false ) ); float attack = instrument_node.read_float( "Attack", 0.0f, true, false ); float decay = instrument_node.read_float( "Decay", 0.0f, true, false ); float sustain = instrument_node.read_float( "Sustain", 1.0f, true, false ); float release = instrument_node.read_float( "Release", 1000.0f, true, false ); pInstrument->set_adsr( new ADSR( attack, decay, sustain, release ) ); pInstrument->set_gain( instrument_node.read_float( "gain", 1.0f, true, false ) ); pInstrument->set_mute_group( instrument_node.read_int( "muteGroup", -1, true, false ) ); pInstrument->set_midi_out_channel( instrument_node.read_int( "midiOutChannel", -1, true, false ) ); pInstrument->set_midi_out_note( instrument_node.read_int( "midiOutNote", MIDI_MIDDLE_C, true, false ) ); pInstrument->set_stop_notes( instrument_node.read_bool( "isStopNote", true ,false ) ); QString read_sample_select_algo = instrument_node.read_string( "sampleSelectionAlgo", "VELOCITY" ); if ( read_sample_select_algo.compare("VELOCITY") == 0) { pInstrument->set_sample_selection_alg( Instrument::VELOCITY ); } else if ( read_sample_select_algo.compare("ROUND_ROBIN") == 0 ) { pInstrument->set_sample_selection_alg( Instrument::ROUND_ROBIN ); } else if ( read_sample_select_algo.compare("RANDOM") == 0 ) { pInstrument->set_sample_selection_alg( Instrument::RANDOM ); } pInstrument->set_hihat_grp( instrument_node.read_int( "isHihat", -1, true ) ); pInstrument->set_lower_cc( instrument_node.read_int( "lower_cc", 0, true ) ); pInstrument->set_higher_cc( instrument_node.read_int( "higher_cc", 127, true ) ); for ( int i=0; iset_fx_level( instrument_node.read_float( QString( "FX%1Level" ).arg( i+1 ), 0.0 ), i ); } QDomNode filename_node = instrument_node.firstChildElement( "filename" ); if ( !filename_node.isNull() ) { DEBUGLOG( "Using back compatibility code. filename node found" ); QString sFilename = instrument_node.read_string( "filename", "" ); if( sFilename.isEmpty() ) { ERRORLOG( "filename back compatibility node is empty" ); } else { Sample* pSample = new Sample( dk_path+"/"+sFilename ); bool bFoundMainCompo = false; for (std::vector::iterator it = pDrumkit->get_components()->begin() ; it != pDrumkit->get_components()->end(); ++it) { DrumkitComponent* pExistingComponent = *it; if( pExistingComponent->get_name().compare("Main") == 0) { bFoundMainCompo = true; break; } } if ( !bFoundMainCompo ) { DrumkitComponent* pDrumkitCompo = new DrumkitComponent( 0, "Main" ); pDrumkit->get_components()->push_back( pDrumkitCompo ); } InstrumentComponent* pComponent = new InstrumentComponent( 0 ); InstrumentLayer* pLayer = new InstrumentLayer( pSample ); pComponent->set_layer( pLayer, 0 ); pInstrument->get_components()->push_back( pComponent ); } } else { int n = 0; bool bFoundMainCompo = false; for (std::vector::iterator it = pDrumkit->get_components()->begin() ; it != pDrumkit->get_components()->end(); ++it) { DrumkitComponent* pExistingComponent = *it; if( pExistingComponent->get_name().compare("Main") == 0) { bFoundMainCompo = true; break; } } if ( !bFoundMainCompo ) { DrumkitComponent* pDrumkitComponent = new DrumkitComponent( 0, "Main" ); pDrumkit->get_components()->push_back(pDrumkitComponent); } InstrumentComponent* pComponent = new InstrumentComponent( 0 ); XMLNode layer_node = instrument_node.firstChildElement( "layer" ); while ( !layer_node.isNull() ) { if ( n >= InstrumentComponent::getMaxLayers() ) { ERRORLOG( QString( "n (%1) > m_nMaxLayers (%2)" ).arg ( n ).arg( InstrumentComponent::getMaxLayers() ) ); break; } Sample* pSample = new Sample( dk_path+"/"+layer_node.read_string( "filename", "" ) ); InstrumentLayer* pLayer = new InstrumentLayer( pSample ); pLayer->set_start_velocity( layer_node.read_float( "min", 0.0 ) ); pLayer->set_end_velocity( layer_node.read_float( "max", 1.0 ) ); pLayer->set_gain( layer_node.read_float( "gain", 1.0, true, false ) ); pLayer->set_pitch( layer_node.read_float( "pitch", 0.0, true, false ) ); pComponent->set_layer( pLayer, n ); n++; layer_node = layer_node.nextSiblingElement( "layer" ); } pInstrument->get_components()->push_back( pComponent ); } } if( pInstrument ) { ( *pInstruments ) << pInstrument; } else { ERRORLOG( QString( "Empty ID for instrument %1. The drumkit is corrupted. Skipping instrument" ).arg( count ) ); count--; } instrument_node = instrument_node.nextSiblingElement( "instrument" ); } pDrumkit->set_instruments( pInstruments ); } return pDrumkit; } Pattern* Legacy::load_drumkit_pattern( const QString& pattern_path, InstrumentList* instrList ) { Pattern* pPattern = nullptr; if ( version_older_than( 0, 9, 8 ) ) { WARNINGLOG( QString( "this code should not be used anymore, it belongs to 0.9.6" ) ); } else { WARNINGLOG( QString( "loading pattern with legacy code" ) ); } XMLDoc doc; if( !doc.read( pattern_path ) ) { return nullptr; } XMLNode root = doc.firstChildElement( "drumkit_pattern" ); if ( root.isNull() ) { ERRORLOG( "drumkit_pattern node not found" ); return nullptr; } XMLNode pattern_node = root.firstChildElement( "pattern" ); if ( pattern_node.isNull() ) { WARNINGLOG( "pattern node not found" ); return nullptr; } else { QString sName = pattern_node.read_string( "pattern_name", "" ); QString sInfo = pattern_node.read_string( "info", "" ); QString sCategory = pattern_node.read_string( "category", "" ); int nSize = pattern_node.read_int( "size", -1, false, false ); pPattern = new Pattern( sName, sInfo, sCategory, nSize ); XMLNode note_list_node = pattern_node.firstChildElement( "noteList" ); XMLNode note_node = note_list_node.firstChildElement( "note" ); while ( !note_node.isNull() ) { Note* pNote = nullptr; unsigned nPosition = note_node.read_int( "position", 0 ); float fLeadLag = note_node.read_float( "leadlag", 0.0 , false , false); float fVelocity = note_node.read_float( "velocity", 0.8f ); float fPan_L = note_node.read_float( "pan_L", 0.5 ); float fPan_R = note_node.read_float( "pan_R", 0.5 ); int nLength = note_node.read_int( "length", -1, true ); float nPitch = note_node.read_float( "pitch", 0.0, false, false ); float fProbability = note_node.read_float( "probability", 1.0 , false , false ); QString sKey = note_node.read_string( "key", "C0", false, false ); QString nNoteOff = note_node.read_string( "note_off", "false", false, false ); int instrId = note_node.read_int( "instrument", 0, true ); Instrument *instrRef = instrList->find( instrId ); if ( !instrRef ) { ERRORLOG( QString( "Instrument with ID: '%1' not found. Note skipped." ).arg( instrId ) ); note_node = note_node.nextSiblingElement( "note" ); continue; } //assert( instrRef ); bool noteoff = false; if ( nNoteOff == "true" ) { noteoff = true; } pNote = new Note( instrRef, nPosition, fVelocity, fPan_L, fPan_R, nLength, nPitch); pNote->set_key_octave( sKey ); pNote->set_lead_lag(fLeadLag); pNote->set_note_off( noteoff ); pNote->set_probability( fProbability ); pPattern->insert_note( pNote ); note_node = note_node.nextSiblingElement( "note" ); } } return pPattern; } Playlist* Legacy::load_playlist( Playlist* pPlaylist, const QString& pl_path ) { if ( version_older_than( 0, 9, 8 ) ) { WARNINGLOG( QString( "this code should not be used anymore, it belongs to 0.9.6" ) ); } else { WARNINGLOG( QString( "loading playlist with legacy code" ) ); } XMLDoc doc; if( !doc.read( pl_path ) ) { return nullptr; } XMLNode root = doc.firstChildElement( "playlist" ); if ( root.isNull() ) { ERRORLOG( "playlist node not found" ); return nullptr; } QFileInfo fileInfo = QFileInfo( pl_path ); QString filename = root.read_string( "Name", "", false, false ); if ( filename.isEmpty() ) { ERRORLOG( "Playlist has no name, abort" ); return nullptr; } pPlaylist->setFilename( pl_path ); XMLNode songsNode = root.firstChildElement( "Songs" ); if ( !songsNode.isNull() ) { XMLNode nextNode = songsNode.firstChildElement( "next" ); while ( !nextNode.isNull() ) { QString songPath = nextNode.read_string( "song", "", false, false ); if ( !songPath.isEmpty() ) { Playlist::Entry* entry = new Playlist::Entry(); QFileInfo songPathInfo( fileInfo.absoluteDir(), songPath ); entry->filePath = songPathInfo.absoluteFilePath(); entry->fileExists = songPathInfo.isReadable(); entry->scriptPath = nextNode.read_string( "script", "" ); entry->scriptEnabled = nextNode.read_bool( "enabled", false ); pPlaylist->add( entry ); } nextNode = nextNode.nextSiblingElement( "next" ); } } else { WARNINGLOG( "Songs node not found" ); } return pPlaylist; } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/helpers/xml.cpp000066400000000000000000000162601366722712400213050ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #define XMLNS_BASE "http://www.hydrogen-music.org/" #define XMLNS_XSI "http://www.w3.org/2001/XMLSchema-instance" namespace H2Core { class SilentMessageHandler : public QAbstractMessageHandler { public: SilentMessageHandler() : QAbstractMessageHandler(nullptr) { } protected: virtual void handleMessage(QtMsgType type, const QString &description, const QUrl &identifier, const QSourceLocation &sourceLocation) { Q_UNUSED(type); Q_UNUSED(identifier); } }; const char* XMLNode::__class_name ="XMLNode"; XMLNode::XMLNode() : Object( __class_name ) { } XMLNode::XMLNode( QDomNode node ) : Object( __class_name ), QDomNode( node ) { } XMLNode XMLNode::createNode( const QString& name ) { XMLNode node = this->ownerDocument().createElement( name ); appendChild( node ); return node; } QString XMLNode::read_child_node( const QString& node, bool inexistent_ok, bool empty_ok ) { if( isNull() ) { DEBUGLOG( QString( "try to read %1 XML node from an empty parent %2." ).arg( node ).arg( nodeName() ) ); return nullptr; } QDomElement el = firstChildElement( node ); if( el.isNull() ) { if( !inexistent_ok ) DEBUGLOG( QString( "XML node %1->%2 should exists." ).arg( nodeName() ).arg( node ) ); return nullptr; } if( el.text().isEmpty() ) { if( !empty_ok ) DEBUGLOG( QString( "XML node %1->%2 should not be empty." ).arg( nodeName() ).arg( node ) ); return nullptr; } return el.text(); } QString XMLNode::read_string( const QString& node, const QString& default_value, bool inexistent_ok, bool empty_ok ) { QString ret = read_child_node( node, inexistent_ok, empty_ok ); if( ret.isNull() ) { DEBUGLOG( QString( "Using default value %1 for %2" ).arg( default_value ).arg( node ) ); return default_value; } return ret; } float XMLNode::read_float( const QString& node, float default_value, bool inexistent_ok, bool empty_ok ) { QString ret = read_child_node( node, inexistent_ok, empty_ok ); if( ret.isNull() ) { DEBUGLOG( QString( "Using default value %1 for %2" ).arg( default_value ).arg( node ) ); return default_value; } QLocale c_locale = QLocale::c(); return c_locale.toFloat( ret ); } int XMLNode::read_int( const QString& node, int default_value, bool inexistent_ok, bool empty_ok ) { QString ret = read_child_node( node, inexistent_ok, empty_ok ); if( ret.isNull() ) { DEBUGLOG( QString( "Using default value %1 for %2" ).arg( default_value ).arg( node ) ); return default_value; } QLocale c_locale = QLocale::c(); return c_locale.toInt( ret ); } bool XMLNode::read_bool( const QString& node, bool default_value, bool inexistent_ok, bool empty_ok ) { QString ret = read_child_node( node, inexistent_ok, empty_ok ); if( ret.isNull() ) { DEBUGLOG( QString( "Using default value %1 for %2" ).arg( default_value ).arg( node ) ); return default_value; } if( ret=="true" ) { return true; } else { return false; } } QString XMLNode::read_text( bool empty_ok ) { QString text = toElement().text(); if ( !empty_ok && text.isEmpty() ) { DEBUGLOG( QString( "XML node %1 should not be empty." ).arg( nodeName() ) ); } return text; } QString XMLNode::read_attribute( const QString& attribute, const QString& default_value, bool inexistent_ok, bool empty_ok ) { QDomElement el = toElement(); if ( !inexistent_ok && !el.hasAttribute( attribute ) ) { DEBUGLOG( QString( "XML node %1 attribute %2 should exists." ).arg( nodeName() ).arg( attribute ) ); return default_value; } QString attr = el.attribute( attribute ); if ( attr.isEmpty() ) { if( !empty_ok ) DEBUGLOG( QString( "XML node %1 attribute %2 should not be empty." ).arg( nodeName() ).arg( attribute ) ); DEBUGLOG( QString( "Using default value %1 for attribute %2" ).arg( default_value ).arg( attribute ) ); return default_value; } return attr; } void XMLNode::write_attribute( const QString& attribute, const QString& value ) { toElement().setAttribute( attribute, value ); } void XMLNode::write_child_node( const QString& node, const QString& text ) { QDomDocument doc = this->ownerDocument(); QDomElement el = doc.createElement( node ); QDomText txt = doc.createTextNode( text ); el.appendChild( txt ); this->appendChild( el ); } void XMLNode::write_string( const QString& node, const QString& value ) { write_child_node( node, value ); } void XMLNode::write_float( const QString& node, const float value ) { write_child_node( node, QString::number( value ) ); } void XMLNode::write_int( const QString& node, const int value ) { write_child_node( node, QString::number( value ) ); } void XMLNode::write_bool( const QString& name, const bool value ) { write_child_node( name, QString( ( value ? "true" : "false" ) ) ); } const char* XMLDoc::__class_name ="XMLDoc"; XMLDoc::XMLDoc( ) : Object( __class_name ) { } bool XMLDoc::read( const QString& filepath, const QString& schemapath ) { SilentMessageHandler Handler; QXmlSchema schema; schema.setMessageHandler( &Handler ); bool schema_usable = false; if( schemapath!=nullptr ) { QFile file( schemapath ); if ( !file.open( QIODevice::ReadOnly ) ) { ERRORLOG( QString( "Unable to open XML schema %1 for reading" ).arg( schemapath ) ); } else { schema.load( &file, QUrl::fromLocalFile( file.fileName() ) ); file.close(); if ( schema.isValid() ) { schema_usable = true; } else { ERRORLOG( QString( "%2 XML schema is not valid" ).arg( schemapath ) ); } } } QFile file( filepath ); if ( !file.open( QIODevice::ReadOnly ) ) { ERRORLOG( QString( "Unable to open %1 for reading" ).arg( filepath ) ); return false; } if ( schema_usable ) { QXmlSchemaValidator validator( schema ); if ( !validator.validate( &file, QUrl::fromLocalFile( file.fileName() ) ) ) { WARNINGLOG( QString( "XML document %1 is not valid (%2), loading may fail" ).arg( filepath ).arg( schemapath ) ); file.close(); return false; } else { INFOLOG( QString( "XML document %1 is valid (%2)" ).arg( filepath ).arg( schemapath ) ); } file.seek( 0 ); } if( !setContent( &file ) ) { ERRORLOG( QString( "Unable to read XML document %1" ).arg( filepath ) ); file.close(); return false; } file.close(); return true; } bool XMLDoc::write( const QString& filepath ) { QFile file( filepath ); if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) ) { ERRORLOG( QString( "Unable to open %1 for writing" ).arg( filepath ) ); return false; } QTextStream out( &file ); out << toString().toUtf8(); out.flush(); bool rv = true; if ( !toString().isEmpty() && file.size() == 0 ) { rv = false; } file.close(); return rv; } XMLNode XMLDoc::set_root( const QString& node_name, const QString& xmlns ) { QDomProcessingInstruction header = createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ); appendChild( header ); XMLNode root = createElement( node_name ); if ( !xmlns.isEmpty() ) { QDomElement el = root.toElement(); el.setAttribute( "xmlns",XMLNS_BASE+xmlns ); el.setAttribute( "xmlns:xsi",XMLNS_XSI ); } appendChild( root ); return root; } }; hydrogen-1.0.0-rc1/src/core/src/hydrogen.cpp000066400000000000000000003667161366722712400207000ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/config.h" #ifdef WIN32 # include "hydrogen/timehelper.h" #else # include # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef H2CORE_HAVE_OSC #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace H2Core { // GLOBALS // info float m_fMasterPeak_L = 0.0f; ///< Master peak (left channel) float m_fMasterPeak_R = 0.0f; ///< Master peak (right channel) float m_fProcessTime = 0.0f; ///< time used in process function float m_fMaxProcessTime = 0.0f; ///< max ms usable in process with no xrun //~ info /** * Fallback speed in beats per minute. * * It is set by Hydrogen::setNewBpmJTM() and accessed via * Hydrogen::getNewBpmJTM(). */ float m_fNewBpmJTM = 120; /** * Pointer to the current instance of the audio driver. * * Initialized with NULL inside audioEngine_init(). Inside * audioEngine_startAudioDrivers() either the audio driver specified * in Preferences::m_sAudioDriver and created via createDriver() or * the NullDriver, in case the former failed, will be assigned. */ AudioOutput * m_pAudioDriver = nullptr; /** * Mutex for locking the pointer to the audio output buffer, allowing * multiple readers. * * When locking this __and__ the AudioEngine, always lock the * AudioEngine first using AudioEngine::lock() or * AudioEngine::try_lock(). Always use a QMutexLocker to lock this * mutex. */ QMutex mutex_OutputPointer; /** * MIDI input * * In audioEngine_startAudioDrivers() it is assigned the midi driver * specified in Preferences::m_sMidiDriver. */ MidiInput * m_pMidiDriver = nullptr; /** * MIDI output * * In audioEngine_startAudioDrivers() it is assigned the midi driver * specified in Preferences::m_sMidiDriver. */ MidiOutput * m_pMidiDriverOut = nullptr; // overload the > operator of Note objects for priority_queue struct compare_pNotes { bool operator() (Note* pNote1, Note* pNote2) { return (pNote1->get_humanize_delay() + pNote1->get_position() * m_pAudioDriver->m_transport.m_fTickSize) > (pNote2->get_humanize_delay() + pNote2->get_position() * m_pAudioDriver->m_transport.m_fTickSize); } }; /// Song Note FIFO std::priority_queue, compare_pNotes > m_songNoteQueue; std::deque m_midiNoteQueue; ///< Midi Note FIFO /** * Patterns to be played next in Song::PATTERN_MODE. * * In audioEngine_updateNoteQueue() whenever the end of the current * pattern is reached the content of #m_pNextPatterns will be added to * #m_pPlayingPatterns. * * Queried with Hydrogen::getNextPatterns(), set by * Hydrogen::sequencer_setNextPattern() and * Hydrogen::sequencer_setOnlyNextPattern(), initialized with an empty * PatternList in audioEngine_init(), destroyed and set to NULL in * audioEngine_destroy(), cleared in audioEngine_remove_Song(), and * updated in audioEngine_updateNoteQueue(). Please note that ALL of * these functions do access the variable directly! */ PatternList* m_pNextPatterns; bool m_bAppendNextPattern; ///< Add the next pattern to the list instead of replace. bool m_bDeleteNextPattern; ///< Delete the next pattern from the list. /** * PatternList containing all Patterns currently played back. * * Queried using Hydrogen::getCurrentPatternList(), set using * Hydrogen::setCurrentPatternList(), initialized with an empty * PatternList in audioEngine_init(), destroyed and set to NULL in * audioEngine_destroy(), set to the first pattern list of the new * song in audioEngine_setSong(), cleared in * audioEngine_removeSong(), reset in Hydrogen::togglePlaysSelected() * and processed in audioEngine_updateNoteQueue(). Please note that * ALL of these functions do access the variable directly! */ PatternList* m_pPlayingPatterns; /** * Index of the current PatternList in the * Song::__pattern_group_sequence. * * A value of -1 corresponds to "pattern list could not be found". * * Assigned using findPatternInTick() in * audioEngine_updateNoteQueue(), queried using * Hydrogen::getPatternPos() and set using Hydrogen::setPatternPos() * if it AudioEngine is playing. * * It is initialized with -1 value in audioEngine_init(), and reset to * the same value in audioEngine_start(), and * Hydrogen::stopExportSong(). In Hydrogen::startExportSong() it will * be set to 0. Please note that ALL of these functions do access the * variable directly! */ int m_nSongPos; // TODO: rename it to something more // accurate, like m_nPatternListNumber /** * Index of the pattern selected in the GUI or by a MIDI event. * * If Preferences::m_bPatternModePlaysSelected is set to true and the * playback is in Song::PATTERN_MODE, the corresponding pattern will * be assigned to #m_pPlayingPatterns in * audioEngine_updateNoteQueue(). This way the user can specify to * play back the pattern she is currently viewing/editing. * * Queried using Hydrogen::getSelectedPatternNumber() and set by * Hydrogen::setSelectedPatternNumber(). * * Initialized to 0 in audioEngine_init(). */ int m_nSelectedPatternNumber; /** * * * Initialized to 0 in audioEngine_init(). */ int m_nSelectedInstrumentNumber; /** * Pointer to the metronome. * * Initialized in audioEngine_init(). */ Instrument * m_pMetronomeInstrument = nullptr; // Buffers used in the process function unsigned m_nBufferSize = 0; /** * Pointer to the audio buffer of the left stereo output returned by * AudioOutput::getOut_L(). * * Initialized to NULL in audioEngine_init(), assigned in * audioEngine_startAudioDrivers(), reset in * audioEngine_process_clearAudioBuffers(), and populated with the * actual audio in audioEngine_process(). */ float * m_pMainBuffer_L = nullptr; /** * Pointer to the audio buffer of the right stereo output returned by * AudioOutput::getOut_R(). * * Initialized to NULL in audioEngine_init(), assigned in * audioEngine_startAudioDrivers(), reset in * audioEngine_process_clearAudioBuffers(), and populated with the * actual audio in audioEngine_process(). */ float * m_pMainBuffer_R = nullptr; /** * Current state of the H2Core::AudioEngine. * * It is supposed to take five different states: * * - #STATE_UNINITIALIZED: 1 Not even the constructors have been called. * - #STATE_INITIALIZED: 2 Not ready, but most pointers are now valid or NULL * - #STATE_PREPARED: 3 Drivers are set up, but not ready to process audio. * - #STATE_READY: 4 Ready to process audio * - #STATE_PLAYING: 5 Currently playing a sequence. * * It gets initialized with #STATE_UNINITIALIZED. */ int m_audioEngineState = STATE_UNINITIALIZED; #if defined(H2CORE_HAVE_LADSPA) || _DOXYGEN_ float m_fFXPeak_L[MAX_FX]; float m_fFXPeak_R[MAX_FX]; #endif /** * Beginning of the current pattern in ticks. * * It is set using finPatternInTick() and reset to -1 in * audioEngine_start(), audioEngine_stop(), * Hydrogen::startExportSong(), and * Hydrogen::triggerRelocateDuringPlay() (if the playback it in * Song::PATTERN_MODE). */ int m_nPatternStartTick = -1; /** * Ticks passed since the beginning of the current pattern. * * Queried using Hydrogen::getTickPosition(). * * Initialized to 0 in audioEngine_init() and reset to 0 in * Hydrogen::setPatternPos(), if the AudioEngine is not playing, in * audioEngine_start(), Hydrogen::startExportSong() and * Hydrogen::stopExportSong(), which marks the beginning of a Song. */ unsigned int m_nPatternTickPosition = 0; /** Set to the total number of ticks in a Song in findPatternInTick() if Song::SONG_MODE is chosen and playback is at least in the second loop.*/ int m_nSongSizeInTicks = 0; /** Updated in audioEngine_updateNoteQueue().*/ struct timeval m_currentTickTime; /** * Variable keeping track of the transport position in realtime. * * Even if the audio engine is stopped, the variable will be * incremented by #m_nBufferSize (as audioEngine_process() would do at * the end of each cycle) to support realtime keyboard and MIDI event * timing. It is set using Hydrogen::setRealtimeFrames(), accessed via * Hydrogen::getRealtimeFrames(), and updated in * audioEngine_process_transport() using the current transport * position TransportInfo::m_nFrames. */ unsigned long m_nRealtimeFrames = 0; unsigned int m_naddrealtimenotetickposition = 0; // PROTOTYPES /** * Initialization of the H2Core::AudioEngine called in Hydrogen::Hydrogen(). * * -# It creates two new instances of the H2Core::PatternList and stores them in #m_pPlayingPatterns and #m_pNextPatterns. * -# It sets #m_nSongPos = -1. * -# It sets #m_nSelectedPatternNumber, #m_nSelectedInstrumentNumber, and #m_nPatternTickPosition to 0. * -# It sets #m_pMetronomeInstrument, #m_pAudioDriver, #m_pMainBuffer_L, #m_pMainBuffer_R to NULL. * -# It uses the current time to a random seed via std::srand(). This way the states of the pseudo-random number generator are not cross-correlated between different runs of Hydrogen. * -# It initializes the metronome with the sound stored in H2Core::Filesystem::click_file_path() by creating a new Instrument with #METRONOME_INSTR_ID as first argument. * -# It sets the H2Core::AudioEngine state #m_audioEngineState to #STATE_INITIALIZED. * -# It calls H2Core::Effects::create_instance() (if the #H2CORE_HAVE_LADSPA is set), H2Core::AudioEngine::create_instance(), and H2Core::Playlist::create_instance(). * -# Finally, it pushes the H2Core::EVENT_STATE, #STATE_INITIALIZED on the H2Core::EventQueue using H2Core::EventQueue::push_event(). * * If the current state of the H2Core::AudioEngine #m_audioEngineState is not * ::STATE_UNINITIALIZED, it will thrown an error and * H2Core::AudioEngine::unlock() it. */ void audioEngine_init(); void audioEngine_destroy(); /** * If the audio engine is in state #m_audioEngineState #STATE_READY, * this function will * - sets #m_fMasterPeak_L and #m_fMasterPeak_R to 0.0f * - sets TransportInfo::m_nFrames to @a nTotalFrames * - sets m_nSongPos and m_nPatternStartTick to -1 * - m_nPatternTickPosition to 0 * - calls updateTickSize() * - sets #m_audioEngineState to #STATE_PLAYING * - pushes the #EVENT_STATE #STATE_PLAYING using EventQueue::push_event() * * \param bLockEngine Whether or not to lock the audio engine before * performing any actions. The audio engine __must__ be locked! This * option should only be used, if the process calling this function * did already locked it. * \param nTotalFrames New value of the transport position. * \return 0 regardless what happens inside the function. */ int audioEngine_start( bool bLockEngine = false, unsigned nTotalFrames = 0 ); /** * If the audio engine is in state #m_audioEngineState #STATE_PLAYING, * this function will * - sets #m_fMasterPeak_L and #m_fMasterPeak_R to 0.0f * - sets #m_audioEngineState to #STATE_READY * - sets #m_nPatternStartTick to -1 * - deletes all copied Note in song notes queue #m_songNoteQueue and * MIDI notes queue #m_midiNoteQueue * - calls the _clear()_ member of #m_midiNoteQueue * * \param bLockEngine Whether or not to lock the audio engine before * performing any actions. The audio engine __must__ be locked! This * option should only be used, if the process calling this function * did already locked it. */ void audioEngine_stop( bool bLockEngine = false ); /** * Updates the global objects of the audioEngine according to new #Song. * * Calls audioEngine_setupLadspaFX() on * m_pAudioDriver->getBufferSize(), * audioEngine_process_checkBPMChanged(), * audioEngine_renameJackPorts(), adds its first pattern to * #m_pPlayingPatterns, relocates the audio driver to the beginning of * the #Song, and updates the BPM. * * \param pNewSong #Song to load. */ void audioEngine_setSong(Song *pNewSong ); /** * Does the necessary cleanup of the global objects in the audioEngine. * * Class the clear() member of #m_pPlayingPatterns and * #m_pNextPatterns as well as audioEngine_clearNoteQueue(); */ void audioEngine_removeSong(); static void audioEngine_noteOn( Note *note ); /** * Main audio processing function called by the audio drivers whenever * there is work to do. * * In short, it resets the audio buffers, checks the current transport * position and configuration, updates the queue of notes, which are * about to be played, plays those notes and writes their output to * the audio buffers, and, finally, increment the transport position * in order to move forward in time. * * In detail the function * - calls audioEngine_process_clearAudioBuffers() to reset all audio * buffers with zeros. * - calls audioEngine_process_transport() to verify the current * TransportInfo stored in AudioOutput::m_transport. If e.g. the * JACK server is used, an external JACK client might have changed the * speed of the transport (as JACK timebase master) or the transport * position. In such cases, Hydrogen has to sync its internal transport * state AudioOutput::m_transport to reflect these changes. Else our * playback would be off. * - calls audioEngine_process_checkBPMChanged() to check whether the * tick size, the number of frames per bar (size of a pattern), has * changed (see TransportInfo::m_nFrames in case you are unfamiliar * with the term _frames_). This is necessary because the transport * position is often given in ticks within Hydrogen and changing the * speed of the Song, e.g. via Hydrogen::setBPM(), would thus result * in a(n unintended) relocation of the transport location. * - calls audioEngine_updateNoteQueue() and * audioEngine_process_playNotes(), two functions which handle the * selection and playback of notes and will documented at a later * point in time * - If audioEngine_updateNoteQueue() returns with 2, the * EVENT_PATTERN_CHANGED event will be pushed to the EventQueue. * - writes the audio output of the Sampler, Synth, and the LadspaFX * (if #H2CORE_HAVE_LADSPA is defined) to #m_pMainBuffer_L and * #m_pMainBuffer_R and sets we peak values for #m_fFXPeak_L, * #m_fFXPeak_R, #m_fMasterPeak_L, and #m_fMasterPeak_R. * - finally increments the transport position * TransportInfo::m_nFrames with the buffersize @a nframes. So, if * this function is called during the next cycle, the transport is * already in the correct position. * * If the H2Core::m_audioEngineState is neither in #STATE_READY nor * #STATE_PLAYING or the locking of the AudioEngine failed, the * function will return 0 without performing any actions. * * \param nframes Buffersize. If it doesn't match #m_nBufferSize, the latter will be set to @a nframes. * \param arg Unused. * \return * - __2__ : Failed to aquire the audio engine lock, no processing took place. * - __1__ : kill the audio driver thread. This will be used if either * the DiskWriterDriver or FakeDriver are used and the end of the Song * is reached (audioEngine_updateNoteQueue() returned -1 ). * - __0__ : else */ int audioEngine_process( uint32_t nframes, void *arg ); inline void audioEngine_clearNoteQueue(); /** * Update the tick size based on the current tempo without affecting * the current transport position. * * To access a change in the tick size, the value stored in * TransportInfo::m_fTickSize will be compared to the one calculated * from the AudioOutput::getSampleRate(), Song::__bpm, and * Song::__resolution. Thus, if any of those quantities did change, * the transport position will be recalculated. * * The new transport position gets calculated by * \code{.cpp} * ceil( m_pAudioDriver->m_transport.m_nFrames/ * m_pAudioDriver->m_transport.m_fTickSize ) * * m_pAudioDriver->getSampleRate() * 60.0 / Song::__bpm / Song::__resolution * \endcode * * If the JackAudioDriver is used and the audio engine is playing, a * potential mismatch in the transport position is determined by * JackAudioDriver::calculateFrameOffset() and covered by * JackAudioDriver::updateTransportInfo() in the next cycle. * * Finally, EventQueue::push_event() is called with * #EVENT_RECALCULATERUBBERBAND and -1 as arguments. * * Called in audioEngine_process() and audioEngine_setSong(). The * function will only perform actions if #m_audioEngineState is in * either #STATE_READY or #STATE_PLAYING. */ inline void audioEngine_process_checkBPMChanged(Song *pSong); inline void audioEngine_process_playNotes( unsigned long nframes ); /** * Updating the TransportInfo of the audio driver. * * Firstly, it calls AudioOutput::updateTransportInfo() and then * updates the state of the audio engine #m_audioEngineState depending * on the status of the audio driver. E.g. if the JACK transport was * started by another client, the audio engine has to be started as * well. If TransportInfo::m_status is TransportInfo::ROLLING, * audioEngine_start() is called with * TransportInfo::m_nFrames as argument if the engine is in * #STATE_READY. If #m_audioEngineState is then still not in * #STATE_PLAYING, the function will return. Otherwise, the current * speed is getting updated by calling Hydrogen::setBPM using * TransportInfo::m_fBPM and #m_nRealtimeFrames is set to * TransportInfo::m_nFrames. * * If the status is TransportInfo::STOPPED but the engine is still * running, audioEngine_stop() will be called. In any case, * #m_nRealtimeFrames will be incremented by #m_nBufferSize to support * realtime keyboard and MIDI event timing. * * If the H2Core::m_audioEngineState is neither in #STATE_READY nor * #STATE_PLAYING the function will immediately return. */ inline void audioEngine_process_transport(); inline unsigned audioEngine_renderNote( Note* pNote, const unsigned& nBufferSize ); // TODO: Add documentation of doErase, inPunchArea, and // m_addMidiNoteVector /** * Takes all notes from the current patterns, from the MIDI queue * #m_midiNoteQueue, and those triggered by the metronome and pushes * them onto #m_songNoteQueue for playback. * * Apart from the MIDI queue, the extraction of all notes will be * based on their position measured in ticks. Since Hydrogen does * support humanization, which also involves triggering a Note * earlier or later than its actual position, the loop over all ticks * won't be done starting from the current position but at some * position in the future. This value, also called @e lookahead, is * set to the sum of the maximum offsets introduced by both the random * humanization (2000 frames) and the deterministic lead-lag offset (5 * times TransportInfo::m_nFrames) plus 1 (note that it's not given in * ticks but in frames!). Hydrogen thus loops over @a nFrames frames * starting at the current position + the lookahead (or at 0 when at * the beginning of the Song). * * Within this loop all MIDI notes in #m_midiNoteQueue with a * Note::__position smaller or equal the current tick will be popped * and added to #m_songNoteQueue and the #EVENT_METRONOME Event is * pushed to the EventQueue at a periodic rate. If in addition * Preferences::m_bUseMetronome is set to true, * #m_pMetronomeInstrument will be used to push a 'click' to the * #m_songNoteQueue too. All patterns enclosing the current tick will * be added to #m_pPlayingPatterns and all their containing notes, * which position enclose the current tick too, will be added to the * #m_songNoteQueue. If the Song is in Song::PATTERN_MODE, the * patterns used are not chosen by the actual position but by * #m_nSelectedPatternNumber and #m_pNextPatterns. * * All notes obtained by the current patterns (and only those) are * also subject to humanization in the onset position of the created * Note. For now Hydrogen does support three options of altering * these: * - @b Swing - A deterministic offset determined by Song::__swing_factor * will be added for some notes in a periodic way. * - @b Humanize - A random offset drawn from Gaussian white noise * with a variance proportional to Song::__humanize_time_value will be * added to every Note. * - @b Lead/Lag - A deterministic offset determined by * Note::__lead_lag will be added for every note. * * If the AudioEngine it not in #STATE_PLAYING, the loop jumps right * to the next tick. * * \return * - -1 if in Song::SONG_MODE and no patterns left. * - 2 if the current pattern changed with respect to the last * cycle. */ inline int audioEngine_updateNoteQueue( unsigned nFrames ); inline void audioEngine_prepNoteQueue(); /** * Find a PatternList corresponding to the supplied tick position @a * nTick. * * Adds up the lengths of all pattern columns until @a nTick lies in * between the bounds of a Pattern. * * \param nTick Position in ticks. * \param bLoopMode Whether looping is enabled in the Song, see * Song::is_loop_enabled(). If true, @a nTick is allowed to be * larger than the total length of the Song. * \param pPatternStartTick Pointer to an integer the beginning of the * found pattern list will be stored in (in ticks). * \return * - -1 : pattern list couldn't be found. * - >=0 : PatternList index in Song::__pattern_group_sequence. */ inline int findPatternInTick( int nTick, bool bLoopMode, int* pPatternStartTick ); void audioEngine_seek( long long nFrames, bool bLoopMode = false ); void audioEngine_restartAudioDrivers(); /** * Creation and initialization of all audio and MIDI drivers called in * Hydrogen::Hydrogen(). * * Which audio driver to use is specified in * Preferences::m_sAudioDriver. If "Auto" is selected, it will try to * initialize drivers using createDriver() in the following order: * - Windows: "PortAudio", "Alsa", "CoreAudio", "Jack", "Oss", * and "PulseAudio" * - all other systems: "Jack", "Alsa", "CoreAudio", "PortAudio", * "Oss", and "PulseAudio". * If all of them return NULL, #m_pAudioDriver will be initialized * with the NullDriver instead. If a specific choice is contained in * Preferences::m_sAudioDriver and createDriver() returns NULL, the * NullDriver will be initialized too. * * It probes Preferences::m_sMidiDriver to create a midi driver using * either AlsaMidiDriver::AlsaMidiDriver(), * PortMidiDriver::PortMidiDriver(), CoreMidiDriver::CoreMidiDriver(), * or JackMidiDriver::JackMidiDriver(). Afterwards, it sets * #m_pMidiDriverOut and #m_pMidiDriver to the freshly created midi * driver and calls their open() and setActive( true ) functions. * * If a Song is already present, the state of the AudioEngine * #m_audioEngineState will be set to #STATE_READY, the bpm of the * #m_pAudioDriver will be set to the tempo of the Song Song::__bpm * using AudioOutput::setBpm(), and #STATE_READY is pushed on the * EventQueue. If no Song is present, the state will be * #STATE_PREPARED and no bpm will be set. * * All the actions mentioned so far will be performed after locking * both the AudioEngine using AudioEngine::lock() and the mutex of the * audio output buffer #mutex_OutputPointer. When they are completed * both mutex are unlocked and the audio driver is connected via * AudioOutput::connect(). If this is not successful, the audio driver * will be overwritten with the NullDriver and this one is connected * instead. * * Finally, audioEngine_renameJackPorts() (if #H2CORE_HAVE_JACK is set) * and audioEngine_setupLadspaFX() are called. * * The state of the AudioEngine #m_audioEngineState must not be in * #STATE_INITIALIZED or the function will just unlock both mutex and * returns. */ void audioEngine_startAudioDrivers(); /** * Stops all audio and MIDI drivers. * * Uses audioEngine_stop() if the AudioEngine is still in state * #m_audioEngineState #STATE_PLAYING, sets its state to * #STATE_INITIALIZED, locks the AudioEngine using * AudioEngine::lock(), deletes #m_pMidiDriver and #m_pAudioDriver and * reinitializes them to NULL. * * If #m_audioEngineState is neither in #STATE_PREPARED or * #STATE_READY, the function returns before deleting anything. */ void audioEngine_stopAudioDrivers(); /** Gets the current time. * \return Current time obtained by gettimeofday()*/ inline timeval currentTime2() { struct timeval now; gettimeofday( &now, nullptr ); return now; } inline int randomValue( int max ) { return rand() % max; } inline float getGaussian( float z ) { // gaussian distribution -- dimss float x1, x2, w; do { x1 = 2.0 * ( ( ( float ) rand() ) / RAND_MAX ) - 1.0; x2 = 2.0 * ( ( ( float ) rand() ) / RAND_MAX ) - 1.0; w = x1 * x1 + x2 * x2; } while ( w >= 1.0 ); w = sqrtf( ( -2.0 * logf( w ) ) / w ); return x1 * w * z + 0.0; // tunable } void audioEngine_raiseError( unsigned nErrorCode ) { EventQueue::get_instance()->push_event( EVENT_ERROR, nErrorCode ); } /** Function calculating the tick size by * \code{.cpp} * m_pAudioDriver->getSampleRate() * 60.0 / Song::__bpm / Song::__resolution * \endcode * and storing it in TransportInfo::m_fTickSize */ void updateTickSize() { Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); float sampleRate = ( float ) m_pAudioDriver->getSampleRate(); m_pAudioDriver->m_transport.m_fTickSize = ( sampleRate * 60.0 / pSong->__bpm / pSong->__resolution ); } void audioEngine_init() { ___INFOLOG( "*** Hydrogen audio engine init ***" ); // check current state if ( m_audioEngineState != STATE_UNINITIALIZED ) { ___ERRORLOG( "Error the audio engine is not in UNINITIALIZED state" ); AudioEngine::get_instance()->unlock(); return; } m_pPlayingPatterns = new PatternList(); m_pNextPatterns = new PatternList(); m_nSongPos = -1; m_nSelectedPatternNumber = 0; m_nSelectedInstrumentNumber = 0; m_nPatternTickPosition = 0; m_pMetronomeInstrument = nullptr; m_pAudioDriver = nullptr; m_pMainBuffer_L = nullptr; m_pMainBuffer_R = nullptr; srand( time( nullptr ) ); // Create metronome instrument // Get the path to the file of the metronome sound. QString sMetronomeFilename = Filesystem::click_file_path(); m_pMetronomeInstrument = new Instrument( METRONOME_INSTR_ID, "metronome" ); InstrumentLayer* pLayer = new InstrumentLayer( Sample::load( sMetronomeFilename ) ); InstrumentComponent* pCompo = new InstrumentComponent( 0 ); pCompo->set_layer(pLayer, 0); m_pMetronomeInstrument->get_components()->push_back( pCompo ); m_pMetronomeInstrument->set_is_metronome_instrument(true); // Change the current audio engine state m_audioEngineState = STATE_INITIALIZED; #ifdef H2CORE_HAVE_LADSPA Effects::create_instance(); #endif AudioEngine::create_instance(); Playlist::create_instance(); EventQueue::get_instance()->push_event( EVENT_STATE, STATE_INITIALIZED ); } void audioEngine_destroy() { // check current state if ( m_audioEngineState != STATE_INITIALIZED ) { ___ERRORLOG( "Error the audio engine is not in INITIALIZED state" ); return; } AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); AudioEngine::get_instance()->lock( RIGHT_HERE ); ___INFOLOG( "*** Hydrogen audio engine shutdown ***" ); // delete all copied notes in the song notes queue while ( !m_songNoteQueue.empty() ) { m_songNoteQueue.top()->get_instrument()->dequeue(); delete m_songNoteQueue.top(); m_songNoteQueue.pop(); } // delete all copied notes in the midi notes queue for ( unsigned i = 0; i < m_midiNoteQueue.size(); ++i ) { delete m_midiNoteQueue[i]; } m_midiNoteQueue.clear(); // change the current audio engine state m_audioEngineState = STATE_UNINITIALIZED; EventQueue::get_instance()->push_event( EVENT_STATE, STATE_UNINITIALIZED ); delete m_pPlayingPatterns; m_pPlayingPatterns = nullptr; delete m_pNextPatterns; m_pNextPatterns = nullptr; delete m_pMetronomeInstrument; m_pMetronomeInstrument = nullptr; AudioEngine::get_instance()->unlock(); } int audioEngine_start( bool bLockEngine, unsigned nTotalFrames ) { if ( bLockEngine ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } ___INFOLOG( "[audioEngine_start]" ); // check current state if ( m_audioEngineState != STATE_READY ) { ___ERRORLOG( "Error the audio engine is not in READY state" ); if ( bLockEngine ) { AudioEngine::get_instance()->unlock(); } return 0; // FIXME!! } m_fMasterPeak_L = 0.0f; m_fMasterPeak_R = 0.0f; // Reset the current transport position. m_pAudioDriver->m_transport.m_nFrames = nTotalFrames; m_nSongPos = -1; m_nPatternStartTick = -1; m_nPatternTickPosition = 0; // prepare the tick size for this song updateTickSize(); // change the current audio engine state m_audioEngineState = STATE_PLAYING; EventQueue::get_instance()->push_event( EVENT_STATE, STATE_PLAYING ); if ( bLockEngine ) { AudioEngine::get_instance()->unlock(); } return 0; } void audioEngine_stop( bool bLockEngine ) { if ( bLockEngine ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); } ___INFOLOG( "[audioEngine_stop]" ); // check current state if ( m_audioEngineState != STATE_PLAYING ) { ___ERRORLOG( "Error the audio engine is not in PLAYING state" ); if ( bLockEngine ) { AudioEngine::get_instance()->unlock(); } return; } // change the current audio engine state m_audioEngineState = STATE_READY; EventQueue::get_instance()->push_event( EVENT_STATE, STATE_READY ); m_fMasterPeak_L = 0.0f; m_fMasterPeak_R = 0.0f; // m_nPatternTickPosition = 0; m_nPatternStartTick = -1; // delete all copied notes in the song notes queue while(!m_songNoteQueue.empty()){ m_songNoteQueue.top()->get_instrument()->dequeue(); delete m_songNoteQueue.top(); m_songNoteQueue.pop(); } // delete all copied notes in the midi notes queue for ( unsigned i = 0; i < m_midiNoteQueue.size(); ++i ) { delete m_midiNoteQueue[i]; } m_midiNoteQueue.clear(); if ( bLockEngine ) { AudioEngine::get_instance()->unlock(); } } inline void audioEngine_process_checkBPMChanged(Song* pSong) { if ( m_audioEngineState != STATE_READY && m_audioEngineState != STATE_PLAYING ) { return; } long long oldFrame; #ifdef H2CORE_HAVE_JACK if ( Hydrogen::get_instance()->haveJackTransport() && m_audioEngineState != STATE_PLAYING ) { oldFrame = static_cast< JackAudioDriver* >( m_pAudioDriver )->m_currentPos; } else { oldFrame = m_pAudioDriver->m_transport.m_nFrames; } #else oldFrame = m_pAudioDriver->m_transport.m_nFrames; #endif float fOldTickSize = m_pAudioDriver->m_transport.m_fTickSize; float fNewTickSize = AudioEngine::compute_tick_size( m_pAudioDriver->getSampleRate(), pSong->__bpm, pSong->__resolution ); // Nothing changed - avoid recomputing if ( fNewTickSize == fOldTickSize ) { return; } m_pAudioDriver->m_transport.m_fTickSize = fNewTickSize; if ( fNewTickSize == 0 || fOldTickSize == 0 ) { return; } float fTickNumber = (float)oldFrame / fOldTickSize; // update frame position in transport class m_pAudioDriver->m_transport.m_nFrames = ceil(fTickNumber) * fNewTickSize; ___WARNINGLOG( QString( "Tempo change: Recomputing ticksize and frame position. Old TS: %1, new TS: %2, new pos: %3" ) .arg( fOldTickSize ).arg( fNewTickSize ) .arg( m_pAudioDriver->m_transport.m_nFrames ) ); #ifdef H2CORE_HAVE_JACK if ( Hydrogen::get_instance()->haveJackTransport() ) { static_cast< JackAudioDriver* >( m_pAudioDriver )->calculateFrameOffset(oldFrame); } #endif EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); } inline void audioEngine_process_playNotes( unsigned long nframes ) { Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); unsigned int framepos; if ( m_audioEngineState == STATE_PLAYING ) { framepos = m_pAudioDriver->m_transport.m_nFrames; } else { // use this to support realtime events when not playing framepos = pHydrogen->getRealtimeFrames(); } AutomationPath *vp = pSong->get_velocity_automation_path(); // reading from m_songNoteQueue while ( !m_songNoteQueue.empty() ) { Note *pNote = m_songNoteQueue.top(); float velocity_adjustment = 1.0f; if ( pSong->get_mode() == Song::SONG_MODE ) { float fPos = m_nSongPos + (pNote->get_position()%192) / 192.f; velocity_adjustment = vp->get_value(fPos); } // verifico se la nota rientra in questo ciclo unsigned int noteStartInFrames = (int)( pNote->get_position() * m_pAudioDriver->m_transport.m_fTickSize ); // if there is a negative Humanize delay, take into account so // we don't miss the time slice. ignore positive delay, or we // might end the queue processing prematurely based on NoteQueue // placement. the sampler handles positive delay. if (pNote->get_humanize_delay() < 0) { noteStartInFrames += pNote->get_humanize_delay(); } // m_nTotalFrames <= NotePos < m_nTotalFrames + bufferSize bool isNoteStart = ( ( noteStartInFrames >= framepos ) && ( noteStartInFrames < ( framepos + nframes ) ) ); bool isOldNote = noteStartInFrames < framepos; if ( isNoteStart || isOldNote ) { // Humanize - Velocity parameter pNote->set_velocity( pNote->get_velocity() * velocity_adjustment ); float rnd = (float)rand()/(float)RAND_MAX; if (pNote->get_probability() < rnd) { m_songNoteQueue.pop(); pNote->get_instrument()->dequeue(); continue; } if ( pSong->get_humanize_velocity_value() != 0 ) { float random = pSong->get_humanize_velocity_value() * getGaussian( 0.2 ); pNote->set_velocity( pNote->get_velocity() + ( random - ( pSong->get_humanize_velocity_value() / 2.0 ) ) ); if ( pNote->get_velocity() > 1.0 ) { pNote->set_velocity( 1.0 ); } else if ( pNote->get_velocity() < 0.0 ) { pNote->set_velocity( 0.0 ); } } // Random Pitch ;) const float fMaxPitchDeviation = 2.0; pNote->set_pitch( pNote->get_pitch() + ( fMaxPitchDeviation * getGaussian( 0.2 ) - fMaxPitchDeviation / 2.0 ) * pNote->get_instrument()->get_random_pitch_factor() ); /* * Check if the current instrument has the property "Stop-Note" set. * If yes, a NoteOff note is generated automatically after each note. */ Instrument * noteInstrument = pNote->get_instrument(); if ( noteInstrument->is_stop_notes() ){ Note *pOffNote = new Note( noteInstrument, 0.0, 0.0, 0.0, 0.0, -1, 0 ); pOffNote->set_note_off( true ); AudioEngine::get_instance()->get_sampler()->note_on( pOffNote ); delete pOffNote; } AudioEngine::get_instance()->get_sampler()->note_on( pNote ); m_songNoteQueue.pop(); // rimuovo la nota dalla lista di note pNote->get_instrument()->dequeue(); // raise noteOn event int nInstrument = pSong->get_instrument_list()->index( pNote->get_instrument() ); if( pNote->get_note_off() ){ delete pNote; } EventQueue::get_instance()->push_event( EVENT_NOTEON, nInstrument ); continue; } else { // this note will not be played break; } } } void audioEngine_seek( long long nFrames, bool bLoopMode ) { Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if ( m_pAudioDriver->m_transport.m_nFrames == nFrames ) { return; } if ( nFrames < 0 ) { ___ERRORLOG( "nFrames < 0" ); } char tmp[200]; sprintf( tmp, "seek in %lld (old pos = %d)", nFrames, ( int )m_pAudioDriver->m_transport.m_nFrames ); ___INFOLOG( tmp ); m_pAudioDriver->m_transport.m_nFrames = nFrames; int tickNumber_start = ( unsigned )( m_pAudioDriver->m_transport.m_nFrames / m_pAudioDriver->m_transport.m_fTickSize ); // sprintf(tmp, "[audioEngine_seek()] tickNumber_start = %d", tickNumber_start); // __instance->infoLog(tmp); bool loop = pSong->is_loop_enabled(); if ( bLoopMode ) { loop = true; } m_nSongPos = findPatternInTick( tickNumber_start, loop, &m_nPatternStartTick ); // sprintf(tmp, "[audioEngine_seek()] m_nSongPos = %d", m_nSongPos); // __instance->infoLog(tmp); audioEngine_clearNoteQueue(); } inline void audioEngine_process_transport() { if ( m_audioEngineState != STATE_READY && m_audioEngineState != STATE_PLAYING ) return; // Considering JackAudioDriver: // Compares the current transport state, speed in bpm, and // transport position with a query request to the JACK // server. It will only overwrite m_transport.m_nFrames, if // the transport position was changed by the user by // e.g. clicking on the timeline. m_pAudioDriver->updateTransportInfo(); Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); // Update the state of the audio engine depending on the // status of the audio driver. E.g. if the JACK transport was // started by another client, the audio engine has to be // started as well. switch ( m_pAudioDriver->m_transport.m_status ) { case TransportInfo::ROLLING: if ( m_audioEngineState == STATE_READY ) { // false == no engine lock. Already locked // this should set STATE_PLAYING audioEngine_start( false, m_pAudioDriver->m_transport.m_nFrames ); } // So, we are not playing even after attempt to start engine if ( m_audioEngineState != STATE_PLAYING ) { return; } /* Now we're playing | Update BPM */ if ( pSong->__bpm != m_pAudioDriver->m_transport.m_fBPM ) { ___INFOLOG( QString( "song bpm: (%1) gets transport bpm: (%2)" ) .arg( pSong->__bpm ) .arg( m_pAudioDriver->m_transport.m_fBPM ) ); pHydrogen->setBPM( m_pAudioDriver->m_transport.m_fBPM ); } // Update the variable m_nRealtimeFrames keeping track // of the current transport position. pHydrogen->setRealtimeFrames( m_pAudioDriver->m_transport.m_nFrames ); break; case TransportInfo::STOPPED: // So, we are not playing even after attempt to start engine if ( m_audioEngineState == STATE_PLAYING ) { // false == no engine lock. Already locked audioEngine_stop( false ); } // go ahead and increment the realtimeframes by buffersize // to support our realtime keyboard and midi event timing // TODO: use method like setRealtimeFrames m_nRealtimeFrames += m_nBufferSize; break; } } void audioEngine_clearNoteQueue() { //___INFOLOG( "clear notes..."); // delete all copied notes in the song notes queue while (!m_songNoteQueue.empty()) { m_songNoteQueue.top()->get_instrument()->dequeue(); delete m_songNoteQueue.top(); m_songNoteQueue.pop(); } AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); // delete all copied notes in the midi notes queue for ( unsigned i = 0; i < m_midiNoteQueue.size(); ++i ) { delete m_midiNoteQueue[i]; } m_midiNoteQueue.clear(); } /** Clear all audio buffers. * * It locks the audio output buffer using #mutex_OutputPointer, gets * fresh pointers to the output buffers #m_pMainBuffer_L and * #m_pMainBuffer_R using AudioOutput::getOut_L() and * AudioOutput::getOut_R() of the current instance of the audio driver * #m_pAudioDriver, and overwrites their memory with * \code{.cpp} * nFrames * sizeof( float ) * \endcode * zeros. * * If the JACK driver is used and Preferences::m_bJackTrackOuts is set * to true, the stereo buffers for all tracks of the components of * each instrument will be reset as well. If LadspaFX are used, the * output buffers of all effects LadspaFX::m_pBuffer_L and * LadspaFX::m_pBuffer_L have to be reset as well. * * If the audio driver #m_pAudioDriver isn't set yet, it will just * unlock and return. */ inline void audioEngine_process_clearAudioBuffers( uint32_t nFrames ) { QMutexLocker mx( &mutex_OutputPointer ); // clear main out Left and Right if ( m_pAudioDriver ) { m_pMainBuffer_L = m_pAudioDriver->getOut_L(); m_pMainBuffer_R = m_pAudioDriver->getOut_R(); } else { m_pMainBuffer_L = m_pMainBuffer_R = nullptr; } if ( m_pMainBuffer_L ) { memset( m_pMainBuffer_L, 0, nFrames * sizeof( float ) ); } if ( m_pMainBuffer_R ) { memset( m_pMainBuffer_R, 0, nFrames * sizeof( float ) ); } #ifdef H2CORE_HAVE_JACK JackAudioDriver * jo = dynamic_cast(m_pAudioDriver); // Check whether the Preferences::m_bJackTrackOuts option was // set. It enables a per-track creation of the output // ports. All of them have to be reset as well. if( jo && jo->has_track_outs() ) { float* buf; int k; for( k=0 ; kgetNumTracks() ; ++k ) { buf = jo->getTrackOut_L(k); if( buf ) { memset( buf, 0, nFrames * sizeof( float ) ); } buf = jo->getTrackOut_R(k); if( buf ) { memset( buf, 0, nFrames * sizeof( float ) ); } } } #endif mx.unlock(); #ifdef H2CORE_HAVE_LADSPA if ( m_audioEngineState >= STATE_READY ) { Effects* pEffects = Effects::get_instance(); for ( unsigned i = 0; i < MAX_FX; ++i ) { // clear FX buffers LadspaFX* pFX = pEffects->getLadspaFX( i ); if ( pFX ) { assert( pFX->m_pBuffer_L ); assert( pFX->m_pBuffer_R ); memset( pFX->m_pBuffer_L, 0, nFrames * sizeof( float ) ); memset( pFX->m_pBuffer_R, 0, nFrames * sizeof( float ) ); } } } #endif } int audioEngine_process( uint32_t nframes, void* /*arg*/ ) { // ___INFOLOG( QString( "[begin] status: %1, frame: %2, ticksize: %3, bpm: %4" ) // .arg( m_pAudioDriver->m_transport.m_status ) // .arg( m_pAudioDriver->m_transport.m_nFrames ) // .arg( m_pAudioDriver->m_transport.m_fTickSize ) // .arg( m_pAudioDriver->m_transport.m_fBPM ) ); timeval startTimeval = currentTime2(); // Resetting all audio output buffers with zeros. audioEngine_process_clearAudioBuffers( nframes ); /* * The "try_lock" was introduced for Bug #164 (Deadlock after during * alsa driver shutdown). The try_lock *should* only fail in rare circumstances * (like shutting down drivers). In such cases, it seems to be ok to interrupt * audio processing. Returning the special return value "2" enables the disk * writer driver to repeat the processing of the current data. */ if(!AudioEngine::get_instance()->try_lock( RIGHT_HERE )) { if ( m_pAudioDriver->class_name() == DiskWriterDriver::class_name() ) { return 2; // inform the caller that we could not aquire the lock } return 0; } if ( m_audioEngineState < STATE_READY) { AudioEngine::get_instance()->unlock(); return 0; } if ( m_nBufferSize != nframes ) { ___INFOLOG( QString( "Buffer size changed. Old size = %1, new size = %2" ) .arg( m_nBufferSize ) .arg( nframes ) ); m_nBufferSize = nframes; } Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); // In case of the JackAudioDriver: // Query the JACK server for the current status of the // transport, start or stop the audio engine depending the // results, update the speed of the current song according to // the one used by the JACK server, and adjust the current // transport position if it was changed by an user interaction // (e.g. clicking on the timeline). audioEngine_process_transport(); // ___INFOLOG( QString( "[after process] status: %1, frame: %2, ticksize: %3, bpm: %4" ) // .arg( m_pAudioDriver->m_transport.m_status ) // .arg( m_pAudioDriver->m_transport.m_nFrames ) // .arg( m_pAudioDriver->m_transport.m_fTickSize ) // .arg( m_pAudioDriver->m_transport.m_fBPM ) ); // Check whether the tick size has changed. audioEngine_process_checkBPMChanged(pSong); bool bSendPatternChange = false; // always update note queue.. could come from pattern or realtime input // (midi, keyboard) int nResNoteQueue = audioEngine_updateNoteQueue( nframes ); if ( nResNoteQueue == -1 ) { // end of song ___INFOLOG( "End of song received, calling engine_stop()" ); AudioEngine::get_instance()->unlock(); m_pAudioDriver->stop(); m_pAudioDriver->locate( 0 ); // locate 0, reposition from start of the song if ( ( m_pAudioDriver->class_name() == DiskWriterDriver::class_name() ) || ( m_pAudioDriver->class_name() == FakeDriver::class_name() ) ) { ___INFOLOG( "End of song." ); return 1; // kill the audio AudioDriver thread } return 0; } else if ( nResNoteQueue == 2 ) { // send pattern change bSendPatternChange = true; } // play all notes audioEngine_process_playNotes( nframes ); // SAMPLER AudioEngine::get_instance()->get_sampler()->process( nframes, pSong ); float* out_L = AudioEngine::get_instance()->get_sampler()->__main_out_L; float* out_R = AudioEngine::get_instance()->get_sampler()->__main_out_R; for ( unsigned i = 0; i < nframes; ++i ) { m_pMainBuffer_L[ i ] += out_L[ i ]; m_pMainBuffer_R[ i ] += out_R[ i ]; } // SYNTH AudioEngine::get_instance()->get_synth()->process( nframes ); out_L = AudioEngine::get_instance()->get_synth()->m_pOut_L; out_R = AudioEngine::get_instance()->get_synth()->m_pOut_R; for ( unsigned i = 0; i < nframes; ++i ) { m_pMainBuffer_L[ i ] += out_L[ i ]; m_pMainBuffer_R[ i ] += out_R[ i ]; } timeval renderTime_end = currentTime2(); timeval ladspaTime_start = renderTime_end; #ifdef H2CORE_HAVE_LADSPA // Process LADSPA FX if ( m_audioEngineState >= STATE_READY ) { for ( unsigned nFX = 0; nFX < MAX_FX; ++nFX ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); if ( ( pFX ) && ( pFX->isEnabled() ) ) { pFX->processFX( nframes ); float *buf_L, *buf_R; if ( pFX->getPluginType() == LadspaFX::STEREO_FX ) { buf_L = pFX->m_pBuffer_L; buf_R = pFX->m_pBuffer_R; } else { // MONO FX buf_L = pFX->m_pBuffer_L; buf_R = buf_L; } for ( unsigned i = 0; i < nframes; ++i ) { m_pMainBuffer_L[ i ] += buf_L[ i ]; m_pMainBuffer_R[ i ] += buf_R[ i ]; if ( buf_L[ i ] > m_fFXPeak_L[nFX] ) { m_fFXPeak_L[nFX] = buf_L[ i ]; } if ( buf_R[ i ] > m_fFXPeak_R[nFX] ) { m_fFXPeak_R[nFX] = buf_R[ i ]; } } } } } #endif timeval ladspaTime_end = currentTime2(); // update master peaks float val_L, val_R; if ( m_audioEngineState >= STATE_READY ) { for ( unsigned i = 0; i < nframes; ++i ) { val_L = m_pMainBuffer_L[i]; val_R = m_pMainBuffer_R[i]; if ( val_L > m_fMasterPeak_L ) { m_fMasterPeak_L = val_L; } if ( val_R > m_fMasterPeak_R ) { m_fMasterPeak_R = val_R; } for (std::vector::iterator it = pSong->get_components()->begin() ; it != pSong->get_components()->end(); ++it) { DrumkitComponent* drumkit_component = *it; float compo_val_L = drumkit_component->get_out_L(i); float compo_val_R = drumkit_component->get_out_R(i); if( compo_val_L > drumkit_component->get_peak_l() ) { drumkit_component->set_peak_l( compo_val_L ); } if( compo_val_R > drumkit_component->get_peak_r() ) { drumkit_component->set_peak_r( compo_val_R ); } } } } // update total frames number if ( m_audioEngineState == STATE_PLAYING ) { m_pAudioDriver->m_transport.m_nFrames += nframes; } timeval finishTimeval = currentTime2(); m_fProcessTime = ( finishTimeval.tv_sec - startTimeval.tv_sec ) * 1000.0 + ( finishTimeval.tv_usec - startTimeval.tv_usec ) / 1000.0; float sampleRate = ( float )m_pAudioDriver->getSampleRate(); m_fMaxProcessTime = 1000.0 / ( sampleRate / nframes ); #ifdef CONFIG_DEBUG if ( m_fProcessTime > m_fMaxProcessTime ) { ___WARNINGLOG( "" ); ___WARNINGLOG( "----XRUN----" ); ___WARNINGLOG( QString( "XRUN of %1 msec (%2 > %3)" ) .arg( ( m_fProcessTime - m_fMaxProcessTime ) ) .arg( m_fProcessTime ).arg( m_fMaxProcessTime ) ); ___WARNINGLOG( QString( "Ladspa process time = %1" ).arg( fLadspaTime ) ); ___WARNINGLOG( "------------" ); ___WARNINGLOG( "" ); // raise xRun event EventQueue::get_instance()->push_event( EVENT_XRUN, -1 ); } #endif // ___INFOLOG( QString( "[end] status: %1, frame: %2, ticksize: %3, bpm: %4" ) // .arg( m_pAudioDriver->m_transport.m_status ) // .arg( m_pAudioDriver->m_transport.m_nFrames ) // .arg( m_pAudioDriver->m_transport.m_fTickSize ) // .arg( m_pAudioDriver->m_transport.m_fBPM ) ); AudioEngine::get_instance()->unlock(); if ( bSendPatternChange ) { EventQueue::get_instance()->push_event( EVENT_PATTERN_CHANGED, -1 ); } return 0; } void audioEngine_setupLadspaFX( unsigned nBufferSize ) { //___INFOLOG( "buffersize=" + to_string(nBufferSize) ); Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if ( ! pSong ) { return; } if ( nBufferSize == 0 ) { ___ERRORLOG( "nBufferSize=0" ); return; } #ifdef H2CORE_HAVE_LADSPA for ( unsigned nFX = 0; nFX < MAX_FX; ++nFX ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); if ( pFX == nullptr ) { return; } pFX->deactivate(); Effects::get_instance()->getLadspaFX( nFX )->connectAudioPorts( pFX->m_pBuffer_L, pFX->m_pBuffer_R, pFX->m_pBuffer_L, pFX->m_pBuffer_R ); pFX->activate(); } #endif } /** * Hands the provided Song to JackAudioDriver::makeTrackOutputs() if * @a pSong is not a null pointer and the audio driver #m_pAudioDriver * is an instance of the JackAudioDriver. * \param pSong Song for which per-track output ports should be generated. */ void audioEngine_renameJackPorts(Song * pSong) { #ifdef H2CORE_HAVE_JACK // renames jack ports if ( ! pSong ) return; if ( Hydrogen::get_instance()->haveJackAudioDriver() ) { static_cast< JackAudioDriver* >( m_pAudioDriver )->makeTrackOutputs( pSong ); } #endif } void audioEngine_setSong( Song* pNewSong ) { ___WARNINGLOG( QString( "Set song: %1" ).arg( pNewSong->__name ) ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // check current state // should be set by removeSong called earlier if ( m_audioEngineState != STATE_PREPARED ) { ___ERRORLOG( "Error the audio engine is not in PREPARED state" ); } // setup LADSPA FX audioEngine_setupLadspaFX( m_pAudioDriver->getBufferSize() ); // update tick size audioEngine_process_checkBPMChanged( pNewSong ); // find the first pattern and set as current if ( pNewSong->get_pattern_list()->size() > 0 ) { m_pPlayingPatterns->add( pNewSong->get_pattern_list()->get( 0 ) ); } audioEngine_renameJackPorts( pNewSong ); m_pAudioDriver->setBpm( pNewSong->__bpm ); // change the current audio engine state m_audioEngineState = STATE_READY; m_pAudioDriver->locate( 0 ); AudioEngine::get_instance()->unlock(); EventQueue::get_instance()->push_event( EVENT_STATE, STATE_READY ); } void audioEngine_removeSong() { AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_audioEngineState == STATE_PLAYING ) { m_pAudioDriver->stop(); audioEngine_stop( false ); } // check current state if ( m_audioEngineState != STATE_READY ) { ___ERRORLOG( "Error the audio engine is not in READY state" ); AudioEngine::get_instance()->unlock(); return; } m_pPlayingPatterns->clear(); m_pNextPatterns->clear(); audioEngine_clearNoteQueue(); // change the current audio engine state m_audioEngineState = STATE_PREPARED; AudioEngine::get_instance()->unlock(); EventQueue::get_instance()->push_event( EVENT_STATE, STATE_PREPARED ); } inline int audioEngine_updateNoteQueue( unsigned nFrames ) { Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); // Indicates whether the current pattern list changed with respect // to the last cycle. bool bSendPatternChange = false; float fTickSize = m_pAudioDriver->m_transport.m_fTickSize; int nLeadLagFactor = pHydrogen->calculateLeadLagFactor( fTickSize ); unsigned int framepos; if ( m_audioEngineState == STATE_PLAYING ) { // Current transport position. framepos = m_pAudioDriver->m_transport.m_nFrames; } else { // Use this to support realtime events, like MIDI, when not // playing. framepos = pHydrogen->getRealtimeFrames(); } int lookahead = pHydrogen->calculateLookahead( fTickSize ); int tickNumber_start = 0; if ( framepos == 0 || ( m_audioEngineState == STATE_PLAYING && pSong->get_mode() == Song::SONG_MODE && m_nSongPos == -1 ) ) { tickNumber_start = framepos / fTickSize; } else { tickNumber_start = ( framepos + lookahead) / fTickSize; } int tickNumber_end = ( framepos + nFrames + lookahead ) /fTickSize; // Get initial timestamp for first tick gettimeofday( &m_currentTickTime, nullptr ); // A tick is the most fine-grained time scale within Hydrogen. for ( int tick = tickNumber_start; tick < tickNumber_end; tick++ ) { // MIDI events now get put into the `m_songNoteQueue` as well, // based on their timestamp (which is given in terms of its // transport position and not in terms of the date-time as // above). while ( m_midiNoteQueue.size() > 0 ) { Note *pNote = m_midiNoteQueue[0]; if ( pNote->get_position() > tick ) break; m_midiNoteQueue.pop_front(); pNote->get_instrument()->enqueue(); m_songNoteQueue.push( pNote ); } if ( m_audioEngineState != STATE_PLAYING ) { // only keep going if we're playing continue; } bool doErase = m_audioEngineState == STATE_PLAYING && Preferences::get_instance()->getRecordEvents() && Preferences::get_instance()->getDestructiveRecord() && Preferences::get_instance()->m_nRecPreDelete == 0; ////////////////////////////////////////////////////////////// // SONG MODE if ( pSong->get_mode() == Song::SONG_MODE ) { if ( pSong->get_pattern_group_vector()->size() == 0 ) { // there's no song!! ___ERRORLOG( "no patterns in song." ); m_pAudioDriver->stop(); return -1; } m_nSongPos = findPatternInTick( tick, pSong->is_loop_enabled(), &m_nPatternStartTick ); // The `m_nSongSizeInTicks` variable is only set to some // value other than zero in `findPatternInTick()` if // either the pattern list was not found of loop mode was // enabled and will contain the total size of the song in // ticks. if ( m_nSongSizeInTicks != 0 ) { // When using the JACK audio driver the overall // transport position will be managed by an external // server. Since it is agnostic of all the looping in // its clients, it will only increment time and // Hydrogen has to take care of the looping itself. m_nPatternTickPosition = ( tick - m_nPatternStartTick ) % m_nSongSizeInTicks; } else { m_nPatternTickPosition = tick - m_nPatternStartTick; } // Since we are located at the very beginning of the // pattern list, it had to change with respect to the last // cycle. if ( m_nPatternTickPosition == 0 ) { bSendPatternChange = true; } // If no pattern list could not be found, either choose // the first one if loop mode is activate or the // function returns indicating that the end of the song is // reached. if ( m_nSongPos == -1 ) { ___INFOLOG( "song pos = -1" ); if ( pSong->is_loop_enabled() == true ) { // TODO: This function call should be redundant // since `findPatternInTick()` is deterministic // and was already invoked with // `pSong->is_loop_enabled()` as second argument. m_nSongPos = findPatternInTick( 0, true, &m_nPatternStartTick ); } else { ___INFOLOG( "End of Song" ); if( Hydrogen::get_instance()->getMidiOutput() != nullptr ){ Hydrogen::get_instance()->getMidiOutput()->handleQueueAllNoteOff(); } return -1; } } // Obtain the current PatternList and use it to overwrite // the on in `m_pPlayingPatterns. // TODO: Why overwriting it for each and every tick // without check if it did changed? This is highly // inefficient. PatternList *pPatternList = ( *( pSong->get_pattern_group_vector() ) )[m_nSongPos]; m_pPlayingPatterns->clear(); for ( int i=0; i< pPatternList->size(); ++i ) { Pattern* pPattern = pPatternList->get(i); m_pPlayingPatterns->add( pPattern ); pPattern->extand_with_flattened_virtual_patterns( m_pPlayingPatterns ); } // Set destructive record depending on punch area doErase = doErase && Preferences::get_instance()->inPunchArea(m_nSongPos); } ////////////////////////////////////////////////////////////// // PATTERN MODE else if ( pSong->get_mode() == Song::PATTERN_MODE ) { int nPatternSize = MAX_NOTES; // If the user chose to playback the pattern she focuses, // use it to overwrite `m_pPlayingPatterns`. if ( Preferences::get_instance()->patternModePlaysSelected() ) { // TODO: Again, a check whether the pattern did change // would be more efficient. m_pPlayingPatterns->clear(); Pattern * pattern = pSong->get_pattern_list()->get(m_nSelectedPatternNumber); m_pPlayingPatterns->add( pattern ); pattern->extand_with_flattened_virtual_patterns( m_pPlayingPatterns ); } if ( m_pPlayingPatterns->size() != 0 ) { const Pattern *pFirstPattern = m_pPlayingPatterns->get( 0 ); nPatternSize = pFirstPattern->get_length(); } if ( nPatternSize == 0 ) { ___ERRORLOG( "nPatternSize == 0" ); } // If either the beginning of the current pattern was not // specified yet or if its end is reached, write the // content of `m_pNextPatterns` to `m_pPlayingPatterns` // and clear the former one. if ( ( tick == m_nPatternStartTick + nPatternSize ) || ( m_nPatternStartTick == -1 ) ) { if ( m_pNextPatterns->size() > 0 ) { Pattern* pPattern; for ( uint i = 0; i < m_pNextPatterns->size(); i++ ) { pPattern = m_pNextPatterns->get( i ); // If `pPattern is already present in // `m_pPlayingPatterns`, it will be removed // from the latter and its `del()` method will // return a pointer to the very pattern. The // if clause is therefore only entered if the // `pPattern` was not already present. if ( ( m_pPlayingPatterns->del( pPattern ) ) == nullptr ) { m_pPlayingPatterns->add( pPattern ); } } m_pNextPatterns->clear(); bSendPatternChange = true; } if ( m_nPatternStartTick == -1 && nPatternSize > 0 ) { m_nPatternStartTick = tick - (tick % nPatternSize); } else { m_nPatternStartTick = tick; } } // Since the starting position of the Pattern may have // been updated, update the number of ticks passed since // the beginning of the pattern too. m_nPatternTickPosition = tick - m_nPatternStartTick; if ( m_nPatternTickPosition > nPatternSize && nPatternSize > 0 ) { m_nPatternTickPosition = tick % nPatternSize; } } ////////////////////////////////////////////////////////////// // Metronome // Only trigger the metronome at a predefined rate. if ( m_nPatternTickPosition % 48 == 0 ) { float fPitch; float fVelocity; // Depending on whether the metronome beat will be issued // at the beginning or in the remainder of the pattern, // two different sounds and events will be used. if ( m_nPatternTickPosition == 0 ) { fPitch = 3; fVelocity = 1.0; EventQueue::get_instance()->push_event( EVENT_METRONOME, 1 ); } else { fPitch = 0; fVelocity = 0.8; EventQueue::get_instance()->push_event( EVENT_METRONOME, 0 ); } // Only trigger the sounds if the user enabled the // metronome. if ( Preferences::get_instance()->m_bUseMetronome ) { m_pMetronomeInstrument->set_volume( Preferences::get_instance()->m_fMetronomeVolume ); Note *pMetronomeNote = new Note( m_pMetronomeInstrument, tick, fVelocity, 0.5, 0.5, -1, fPitch ); m_pMetronomeInstrument->enqueue(); m_songNoteQueue.push( pMetronomeNote ); } } ////////////////////////////////////////////////////////////// // Update the notes queue. // if ( m_pPlayingPatterns->size() != 0 ) { for ( unsigned nPat = 0 ; nPat < m_pPlayingPatterns->size() ; ++nPat ) { Pattern *pPattern = m_pPlayingPatterns->get( nPat ); assert( pPattern != nullptr ); Pattern::notes_t* notes = (Pattern::notes_t*)pPattern->get_notes(); // Delete notes before attempting to play them if ( doErase ) { FOREACH_NOTE_IT_BOUND(notes,it,m_nPatternTickPosition) { Note* pNote = it->second; assert( pNote != nullptr ); if ( pNote->get_just_recorded() == false ) { EventQueue::AddMidiNoteVector noteAction; noteAction.m_column = pNote->get_position(); noteAction.m_row = pNote->get_instrument_id(); noteAction.m_pattern = nPat; noteAction.f_velocity = pNote->get_velocity(); noteAction.f_pan_L = pNote->get_pan_l(); noteAction.f_pan_R = pNote->get_pan_r(); noteAction.m_length = -1; noteAction.no_octaveKeyVal = pNote->get_octave(); noteAction.nk_noteKeyVal = pNote->get_key(); noteAction.b_isInstrumentMode = false; noteAction.b_isMidi = false; noteAction.b_noteExist = false; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); } } } // Perform a loop over all notes, which are enclose // the position of the current tick, using a constant // iterator (notes won't be altered!). After some // humanization was applied to onset of each note, it // will be added to `m_songNoteQueue` for playback. FOREACH_NOTE_CST_IT_BOUND(notes,it,m_nPatternTickPosition) { Note *pNote = it->second; if ( pNote ) { pNote->set_just_recorded( false ); int nOffset = 0; // Swing // // Add a constant and periodic offset at // predefined positions to the note position. // TODO: incorporate the factor of 6.0 either // in Song::__swing_factor or make it a member // variable. float fSwingFactor = pSong->get_swing_factor(); if ( ( ( m_nPatternTickPosition % 12 ) == 0 ) && ( ( m_nPatternTickPosition % 24 ) != 0 ) ) { // da l'accento al tick 4, 12, 20, 36... nOffset += (int)( 6.0 * fTickSize * fSwingFactor ); } // Humanize - Time parameter // // Add a random offset to each note. Due to // the nature of the Gaussian distribution, // the factor Song::__humanize_time_value will // also scale the variance of the generated // random variable. if ( pSong->get_humanize_time_value() != 0 ) { nOffset += ( int )( getGaussian( 0.3 ) * pSong->get_humanize_time_value() * pHydrogen->m_nMaxTimeHumanize ); } // Lead or Lag - timing parameter // // Add a constant offset to all notes. nOffset += (int) ( pNote->get_lead_lag() * nLeadLagFactor ); // No note is allowed to start prior to the // beginning of the song. if((tick == 0) && (nOffset < 0)) { nOffset = 0; } // Generate a copy of the current note, assign // it the new offset, and push it to the list // of all notes, which are about to be played // back. // TODO: Why a copy? Note *pCopiedNote = new Note( pNote ); pCopiedNote->set_position( tick ); pCopiedNote->set_humanize_delay( nOffset ); pNote->get_instrument()->enqueue(); m_songNoteQueue.push( pCopiedNote ); } } } } } // audioEngine_process() must send the pattern change event after // mutex unlock if ( bSendPatternChange ) { return 2; } return 0; } inline int findPatternInTick( int nTick, bool bLoopMode, int* pPatternStartTick ) { Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); assert( pSong ); int nTotalTick = 0; m_nSongSizeInTicks = 0; std::vector *pPatternColumns = pSong->get_pattern_group_vector(); int nColumns = pPatternColumns->size(); // Sum the lengths of all pattern columns and use the macro // MAX_NOTES in case some of them are of size zero. If the // supplied value nTick is bigger than this and doesn't belong to // the next pattern column, we just found the pattern list we were // searching for. int nPatternSize; for ( int i = 0; i < nColumns; ++i ) { PatternList *pColumn = ( *pPatternColumns )[ i ]; if ( pColumn->size() != 0 ) { nPatternSize = pColumn->get( 0 )->get_length(); } else { nPatternSize = MAX_NOTES; } if ( ( nTick >= nTotalTick ) && ( nTick < nTotalTick + nPatternSize ) ) { ( *pPatternStartTick ) = nTotalTick; return i; } nTotalTick += nPatternSize; } // If the song is played in loop mode, the tick numbers of the // second turn are added on top of maximum tick number of the // song. Therefore, we will introduced periodic boundary // conditions and start the search again. if ( bLoopMode ) { m_nSongSizeInTicks = nTotalTick; int nLoopTick = 0; if ( m_nSongSizeInTicks != 0 ) { nLoopTick = nTick % m_nSongSizeInTicks; } nTotalTick = 0; for ( int i = 0; i < nColumns; ++i ) { PatternList *pColumn = ( *pPatternColumns )[ i ]; if ( pColumn->size() != 0 ) { nPatternSize = pColumn->get( 0 )->get_length(); } else { nPatternSize = MAX_NOTES; } if ( ( nLoopTick >= nTotalTick ) && ( nLoopTick < nTotalTick + nPatternSize ) ) { ( *pPatternStartTick ) = nTotalTick; return i; } nTotalTick += nPatternSize; } } QString err = QString( "[findPatternInTick] tick = %1. No pattern list found" ).arg( QString::number(nTick) ); ___ERRORLOG( err ); return -1; } void audioEngine_noteOn( Note *note ) { // check current state if ( ( m_audioEngineState != STATE_READY ) && ( m_audioEngineState != STATE_PLAYING ) ) { ___ERRORLOG( "Error the audio engine is not in READY state" ); delete note; return; } m_midiNoteQueue.push_back( note ); } /** * Create an audio driver using audioEngine_process() as its argument * based on the provided choice and calling their _init()_ function to * trigger their initialization. * * For a listing of all possible choices, please see * Preferences::m_sAudioDriver. * * \param sDriver String specifying which audio driver should be * created. * \return Pointer to the freshly created audio driver. If the * creation resulted in a NullDriver, the corresponding object will be * deleted and a null pointer returned instead. */ AudioOutput* createDriver( const QString& sDriver ) { ___INFOLOG( QString( "Driver: '%1'" ).arg( sDriver ) ); Preferences *pPref = Preferences::get_instance(); AudioOutput *pDriver = nullptr; if ( sDriver == "Oss" ) { pDriver = new OssDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } } else if ( sDriver == "Jack" ) { pDriver = new JackAudioDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } else { #ifdef H2CORE_HAVE_JACK static_cast(pDriver)->setConnectDefaults( Preferences::get_instance()->m_bJackConnectDefaults ); #endif } } else if ( sDriver == "Alsa" ) { pDriver = new AlsaAudioDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } } else if ( sDriver == "PortAudio" ) { pDriver = new PortAudioDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } } //#ifdef Q_OS_MACX else if ( sDriver == "CoreAudio" ) { ___INFOLOG( "Creating CoreAudioDriver" ); pDriver = new CoreAudioDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } } //#endif else if ( sDriver == "PulseAudio" ) { pDriver = new PulseAudioDriver( audioEngine_process ); if ( pDriver->class_name() == NullDriver::class_name() ) { delete pDriver; pDriver = nullptr; } } else if ( sDriver == "Fake" ) { ___WARNINGLOG( "*** Using FAKE audio driver ***" ); pDriver = new FakeDriver( audioEngine_process ); } else { ___ERRORLOG( "Unknown driver " + sDriver ); audioEngine_raiseError( Hydrogen::UNKNOWN_DRIVER ); } if ( pDriver ) { // initialize the audio driver int res = pDriver->init( pPref->m_nBufferSize ); if ( res != 0 ) { ___ERRORLOG( "Error starting audio driver [audioDriver::init()]" ); delete pDriver; pDriver = nullptr; } } return pDriver; } void audioEngine_startAudioDrivers() { Preferences *preferencesMng = Preferences::get_instance(); // Lock both the AudioEngine and the audio output buffers. AudioEngine::get_instance()->lock( RIGHT_HERE ); QMutexLocker mx(&mutex_OutputPointer); ___INFOLOG( "[audioEngine_startAudioDrivers]" ); // check current state if ( m_audioEngineState != STATE_INITIALIZED ) { ___ERRORLOG( QString( "Error the audio engine is not in INITIALIZED" " state. state=%1" ) .arg( m_audioEngineState ) ); AudioEngine::get_instance()->unlock(); return; } if ( m_pAudioDriver ) { // check if the audio m_pAudioDriver is still alive ___ERRORLOG( "The audio driver is still alive" ); } if ( m_pMidiDriver ) { // check if midi driver is still alive ___ERRORLOG( "The MIDI driver is still active" ); } QString sAudioDriver = preferencesMng->m_sAudioDriver; if ( sAudioDriver == "Auto" ) { #ifndef WIN32 if ( ( m_pAudioDriver = createDriver( "Jack" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "Alsa" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "CoreAudio" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "PortAudio" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "Oss" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "PulseAudio" ) ) == nullptr ) { audioEngine_raiseError( Hydrogen::ERROR_STARTING_DRIVER ); ___ERRORLOG( "Error starting audio driver" ); ___ERRORLOG( "Using the NULL output audio driver" ); // use the NULL output driver m_pAudioDriver = new NullDriver( audioEngine_process ); m_pAudioDriver->init( 0 ); } } } } } } #else //On Windows systems, use PortAudio is the prioritized backend if ( ( m_pAudioDriver = createDriver( "PortAudio" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "Alsa" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "CoreAudio" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "Jack" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "Oss" ) ) == nullptr ) { if ( ( m_pAudioDriver = createDriver( "PulseAudio" ) ) == nullptr ) { audioEngine_raiseError( Hydrogen::ERROR_STARTING_DRIVER ); ___ERRORLOG( "Error starting audio driver" ); ___ERRORLOG( "Using the NULL output audio driver" ); // use the NULL output driver m_pAudioDriver = new NullDriver( audioEngine_process ); m_pAudioDriver->init( 0 ); } } } } } } #endif } else { m_pAudioDriver = createDriver( sAudioDriver ); if ( m_pAudioDriver == nullptr ) { audioEngine_raiseError( Hydrogen::ERROR_STARTING_DRIVER ); ___ERRORLOG( "Error starting audio driver" ); ___ERRORLOG( "Using the NULL output audio driver" ); // use the NULL output driver m_pAudioDriver = new NullDriver( audioEngine_process ); m_pAudioDriver->init( 0 ); } } if ( preferencesMng->m_sMidiDriver == "ALSA" ) { #ifdef H2CORE_HAVE_ALSA // Create MIDI driver AlsaMidiDriver *alsaMidiDriver = new AlsaMidiDriver(); m_pMidiDriverOut = alsaMidiDriver; m_pMidiDriver = alsaMidiDriver; m_pMidiDriver->open(); m_pMidiDriver->setActive( true ); #endif } else if ( preferencesMng->m_sMidiDriver == "PortMidi" ) { #ifdef H2CORE_HAVE_PORTMIDI PortMidiDriver* pPortMidiDriver = new PortMidiDriver(); m_pMidiDriver = pPortMidiDriver; m_pMidiDriverOut = pPortMidiDriver; m_pMidiDriver->open(); m_pMidiDriver->setActive( true ); #endif } else if ( preferencesMng->m_sMidiDriver == "CoreMidi" ) { #ifdef H2CORE_HAVE_COREMIDI CoreMidiDriver *coreMidiDriver = new CoreMidiDriver(); m_pMidiDriver = coreMidiDriver; m_pMidiDriverOut = coreMidiDriver; m_pMidiDriver->open(); m_pMidiDriver->setActive( true ); #endif } else if ( preferencesMng->m_sMidiDriver == "JackMidi" ) { #ifdef H2CORE_HAVE_JACK JackMidiDriver *jackMidiDriver = new JackMidiDriver(); m_pMidiDriverOut = jackMidiDriver; m_pMidiDriver = jackMidiDriver; m_pMidiDriver->open(); m_pMidiDriver->setActive( true ); #endif } // change the current audio engine state Hydrogen* pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if ( pSong ) { m_audioEngineState = STATE_READY; m_pAudioDriver->setBpm( pSong->__bpm ); } else { m_audioEngineState = STATE_PREPARED; } if ( m_audioEngineState == STATE_PREPARED ) { EventQueue::get_instance()->push_event( EVENT_STATE, STATE_PREPARED ); } else if ( m_audioEngineState == STATE_READY ) { EventQueue::get_instance()->push_event( EVENT_STATE, STATE_READY ); } // Unlocking earlier might execute the jack process() callback before we // are fully initialized. mx.unlock(); AudioEngine::get_instance()->unlock(); if ( m_pAudioDriver ) { int res = m_pAudioDriver->connect(); if ( res != 0 ) { audioEngine_raiseError( Hydrogen::ERROR_STARTING_DRIVER ); ___ERRORLOG( "Error starting audio driver [audioDriver::connect()]" ); ___ERRORLOG( "Using the NULL output audio driver" ); mx.relock(); delete m_pAudioDriver; m_pAudioDriver = new NullDriver( audioEngine_process ); mx.unlock(); m_pAudioDriver->init( 0 ); m_pAudioDriver->connect(); } if ( ( m_pMainBuffer_L = m_pAudioDriver->getOut_L() ) == nullptr ) { ___ERRORLOG( "m_pMainBuffer_L == NULL" ); } if ( ( m_pMainBuffer_R = m_pAudioDriver->getOut_R() ) == nullptr ) { ___ERRORLOG( "m_pMainBuffer_R == NULL" ); } #ifdef H2CORE_HAVE_JACK audioEngine_renameJackPorts( pSong ); #endif audioEngine_setupLadspaFX( m_pAudioDriver->getBufferSize() ); } } void audioEngine_stopAudioDrivers() { ___INFOLOG( "[audioEngine_stopAudioDrivers]" ); // check current state if ( m_audioEngineState == STATE_PLAYING ) { audioEngine_stop(); } if ( ( m_audioEngineState != STATE_PREPARED ) && ( m_audioEngineState != STATE_READY ) ) { ___ERRORLOG( QString( "Error: the audio engine is not in PREPARED" " or READY state. state=%1" ) .arg( m_audioEngineState ) ); return; } // change the current audio engine state m_audioEngineState = STATE_INITIALIZED; EventQueue::get_instance()->push_event( EVENT_STATE, STATE_INITIALIZED ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // delete MIDI driver if ( m_pMidiDriver ) { m_pMidiDriver->close(); delete m_pMidiDriver; m_pMidiDriver = nullptr; m_pMidiDriverOut = nullptr; } // delete audio driver if ( m_pAudioDriver ) { m_pAudioDriver->disconnect(); QMutexLocker mx( &mutex_OutputPointer ); delete m_pAudioDriver; m_pAudioDriver = nullptr; mx.unlock(); } AudioEngine::get_instance()->unlock(); } /// Restart all audio and midi drivers by calling first /// audioEngine_stopAudioDrivers() and then /// audioEngine_startAudioDrivers(). void audioEngine_restartAudioDrivers() { audioEngine_stopAudioDrivers(); audioEngine_startAudioDrivers(); } //---------------------------------------------------------------------------- // // Implementation of Hydrogen class // //---------------------------------------------------------------------------- Hydrogen* Hydrogen::__instance = nullptr; const char* Hydrogen::__class_name = "Hydrogen"; Hydrogen::Hydrogen() : Object( __class_name ) { if ( __instance ) { ERRORLOG( "Hydrogen audio engine is already running" ); throw H2Exception( "Hydrogen audio engine is already running" ); } INFOLOG( "[Hydrogen]" ); __song = nullptr; m_bExportSessionIsActive = false; m_pTimeline = new Timeline(); m_pCoreActionController = new CoreActionController(); m_bActiveGUI = false; m_nMaxTimeHumanize = 2000; initBeatcounter(); InstrumentComponent::setMaxLayers( Preferences::get_instance()->getMaxLayers() ); audioEngine_init(); // Prevent double creation caused by calls from MIDI thread __instance = this; audioEngine_startAudioDrivers(); for(int i = 0; i< MAX_INSTRUMENTS; i++){ m_nInstrumentLookupTable[i] = i; } #ifdef H2CORE_HAVE_OSC if( Preferences::get_instance()->getOscServerEnabled() ) { OscServer* pOscServer = OscServer::get_instance(); pOscServer->start(); } #endif } Hydrogen::~Hydrogen() { INFOLOG( "[~Hydrogen]" ); #ifdef H2CORE_HAVE_OSC NsmClient* pNsmClient = NsmClient::get_instance(); if( pNsmClient ) { pNsmClient->shutdown(); delete pNsmClient; } OscServer* pOscServer = OscServer::get_instance(); if( pOscServer ) { delete pOscServer; } #endif if ( m_audioEngineState == STATE_PLAYING ) { audioEngine_stop(); } removeSong(); audioEngine_stopAudioDrivers(); audioEngine_destroy(); __kill_instruments(); delete m_pCoreActionController; delete m_pTimeline; __instance = nullptr; } void Hydrogen::create_instance() { // Create all the other instances that we need // ....and in the right order Logger::create_instance(); MidiMap::create_instance(); Preferences::create_instance(); EventQueue::create_instance(); MidiActionManager::create_instance(); #ifdef H2CORE_HAVE_OSC NsmClient::create_instance(); OscServer::create_instance( Preferences::get_instance() ); #endif if ( __instance == nullptr ) { __instance = new Hydrogen; } // See audioEngine_init() for: // AudioEngine::create_instance(); // Effects::create_instance(); // Playlist::create_instance(); } void Hydrogen::initBeatcounter() { m_ntaktoMeterCompute = 1; m_nbeatsToCount = 4; m_nEventCount = 1; m_nTempoChangeCounter = 0; m_nBeatCount = 1; m_nCoutOffset = 0; m_nStartOffset = 0; } /// Start the internal sequencer void Hydrogen::sequencer_play() { Song* pSong = getSong(); pSong->get_pattern_list()->set_to_old(); m_pAudioDriver->play(); } /// Stop the internal sequencer void Hydrogen::sequencer_stop() { if( Hydrogen::get_instance()->getMidiOutput() != nullptr ){ Hydrogen::get_instance()->getMidiOutput()->handleQueueAllNoteOff(); } m_pAudioDriver->stop(); Preferences::get_instance()->setRecordEvents(false); } bool Hydrogen::setPlaybackTrackState( const bool state ) { Song* pSong = getSong(); if ( pSong == nullptr ) { return false; } return pSong->set_playback_track_enabled(state); } void Hydrogen::loadPlaybackTrack( const QString filename ) { Song* pSong = getSong(); pSong->set_playback_track_filename(filename); AudioEngine::get_instance()->get_sampler()->reinitialize_playback_track(); } void Hydrogen::setSong( Song *pSong ) { assert ( pSong ); // Move to the beginning. setSelectedPatternNumber( 0 ); Song* pCurrentSong = getSong(); if ( pSong == pCurrentSong ) { DEBUGLOG( "pSong == pCurrentSong" ); return; } if ( pCurrentSong ) { /* NOTE: * - this is actually some kind of cleanup * - removeSong cares itself for acquiring a lock */ removeSong(); AudioEngine::get_instance()->lock( RIGHT_HERE ); delete pCurrentSong; pCurrentSong = nullptr; AudioEngine::get_instance()->unlock(); } /* Reset GUI */ EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); EventQueue::get_instance()->push_event( EVENT_PATTERN_CHANGED, -1 ); EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); // In order to allow functions like audioEngine_setupLadspaFX() to // load the settings of the new song, like whether the LADSPA FX // are activated, __song has to be set prior to the call of // audioEngine_setSong(). __song = pSong; // Update the audio engine to work with the new song. audioEngine_setSong( pSong ); // load new playback track information AudioEngine::get_instance()->get_sampler()->reinitialize_playback_track(); // Push current state of Hydrogen to attached control interfaces, // like OSC clients. m_pCoreActionController->initExternalControlInterfaces(); } /* Mean: remove current song from memory */ void Hydrogen::removeSong() { __song = nullptr; audioEngine_removeSong(); } void Hydrogen::midi_noteOn( Note *note ) { audioEngine_noteOn( note ); } void Hydrogen::addRealtimeNote( int instrument, float velocity, float pan_L, float pan_R, float pitch, bool noteOff, bool forcePlay, int msg1 ) { UNUSED( pitch ); Preferences *pPreferences = Preferences::get_instance(); unsigned int nRealColumn = 0; unsigned res = pPreferences->getPatternEditorGridResolution(); int nBase = pPreferences->isPatternEditorUsingTriplets() ? 3 : 4; int scalar = ( 4 * MAX_NOTES ) / ( res * nBase ); bool hearnote = forcePlay; int currentPatternNumber; AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = getSong(); if ( !pPreferences->__playselectedinstrument ) { if ( instrument >= ( int ) pSong->get_instrument_list()->size() ) { // unused instrument AudioEngine::get_instance()->unlock(); return; } } // Get current partern and column, compensating for "lookahead" if required const Pattern* currentPattern = nullptr; unsigned int column = 0; float fTickSize = m_pAudioDriver->m_transport.m_fTickSize; unsigned int lookaheadTicks = calculateLookahead( fTickSize ) / fTickSize; bool doRecord = pPreferences->getRecordEvents(); if ( pSong->get_mode() == Song::SONG_MODE && doRecord && m_audioEngineState == STATE_PLAYING ) { // Recording + song playback mode + actually playing PatternList *pPatternList = pSong->get_pattern_list(); int ipattern = getPatternPos(); // playlist index if ( ipattern < 0 || ipattern >= (int) pPatternList->size() ) { AudioEngine::get_instance()->unlock(); // unlock the audio engine return; } // Locate column -- may need to jump back in the pattern list column = getTickPosition(); while ( column < lookaheadTicks ) { ipattern -= 1; if ( ipattern < 0 || ipattern >= (int) pPatternList->size() ) { AudioEngine::get_instance()->unlock(); // unlock the audio engine return; } // Convert from playlist index to actual pattern index std::vector *pColumns = pSong->get_pattern_group_vector(); for ( int i = 0; i <= ipattern; ++i ) { PatternList *pColumn = ( *pColumns )[i]; currentPattern = pColumn->get( 0 ); currentPatternNumber = i; } column = column + currentPattern->get_length(); // WARNINGLOG( "Undoing lookahead: corrected (" + to_string( ipattern+1 ) + // "," + to_string( (int) ( column - currentPattern->get_length() ) - // (int) lookaheadTicks ) + ") -> (" + to_string(ipattern) + // "," + to_string( (int) column - (int) lookaheadTicks ) + ")." ); } column -= lookaheadTicks; // Convert from playlist index to actual pattern index (if not already done above) if ( currentPattern == nullptr ) { std::vector *pColumns = pSong->get_pattern_group_vector(); for ( int i = 0; i <= ipattern; ++i ) { PatternList *pColumn = ( *pColumns )[i]; currentPattern = pColumn->get( 0 ); currentPatternNumber = i; } } // Cancel recording if punch area disagrees doRecord = pPreferences->inPunchArea( ipattern ); } else { // Not song-record mode PatternList *pPatternList = pSong->get_pattern_list(); if ( ( m_nSelectedPatternNumber != -1 ) && ( m_nSelectedPatternNumber < ( int )pPatternList->size() ) ) { currentPattern = pPatternList->get( m_nSelectedPatternNumber ); currentPatternNumber = m_nSelectedPatternNumber; } if ( ! currentPattern ) { AudioEngine::get_instance()->unlock(); // unlock the audio engine return; } // Locate column -- may need to wrap around end of pattern column = getTickPosition(); if ( column >= lookaheadTicks ) { column -= lookaheadTicks; } else { lookaheadTicks %= currentPattern->get_length(); column = (column + currentPattern->get_length() - lookaheadTicks) % currentPattern->get_length(); } } nRealColumn = getRealtimeTickPosition(); if ( pPreferences->getQuantizeEvents() ) { // quantize it to scale unsigned qcolumn = ( unsigned )::round( column / ( double )scalar ) * scalar; //we have to make sure that no beat is added on the last displayed note in a bar //for example: if the pattern has 4 beats, the editor displays 5 beats, so we should avoid adding beats an note 5. if ( qcolumn == currentPattern->get_length() ) qcolumn = 0; column = qcolumn; } unsigned position = column; m_naddrealtimenotetickposition = column; Instrument *instrRef = nullptr; if ( pSong ) { //getlookuptable index = instrument+36, ziel wert = der entprechende wert -36 instrRef = pSong->get_instrument_list()->get( m_nInstrumentLookupTable[ instrument ] ); } if ( currentPattern && ( getState() == STATE_PLAYING ) ) { if ( doRecord && pPreferences->getDestructiveRecord() && pPreferences->m_nRecPreDelete>0 ) { // Delete notes around current note if option toggled int postdelete = 0; int predelete = 0; int prefpredelete = pPreferences->m_nRecPreDelete-1; int prefpostdelete = pPreferences->m_nRecPostDelete; int length = currentPattern->get_length(); bool fp = false; postdelete = column; switch (prefpredelete) { case 0: predelete = length ; postdelete = 0; fp = true; break; case 1: predelete = length ; fp = true; break; case 2: predelete = length / 2; fp = true; break; case 3: predelete = length / 4; fp = true; break; case 4: predelete = length / 8; fp = true; break; case 5: predelete = length / 16; fp = true; break; case 6: predelete = length / 32; fp = true; break; case 7: predelete = length / 64; fp = true; break; case 8: predelete = length / 64; break; case 9: predelete = length / 32; break; case 10: predelete = length / 16; break; case 11: predelete = length / 8; break; case 12: predelete = length / 4; break; case 13: predelete = length / 2; break; case 14: predelete = length; break; case 15: break; default : predelete = 1; break; } if (!fp ) { switch (prefpostdelete) { case 0: postdelete = column; break; case 1: postdelete -= length / 64; break; case 2: postdelete -= length / 32; break; case 3: postdelete -= length / 16; break; case 4: postdelete -= length / 8; break; case 5: postdelete -= length / 4; break; case 6: postdelete -= length / 2; break; case 7: postdelete -= length ; break; default : postdelete = column; break; } if (postdelete<0) postdelete = 0; } Pattern::notes_t* notes = (Pattern::notes_t*)currentPattern->get_notes(); FOREACH_NOTE_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); int currentPosition = pNote->get_position(); if ( pPreferences->__playselectedinstrument ) {//fix me if ( pSong->get_instrument_list()->get( getSelectedInstrumentNumber()) == pNote->get_instrument() ) { if (prefpredelete>=1 && prefpredelete <=14 ) pNote->set_just_recorded( false ); if ( (prefpredelete == 15) && (pNote->get_just_recorded() == false)) { bool replaceExisting = false; if (column == currentPosition) replaceExisting = true; EventQueue::AddMidiNoteVector noteAction; noteAction.m_column = currentPosition; noteAction.m_row = pNote->get_instrument_id(); //getSelectedInstrumentNumber(); noteAction.m_pattern = currentPatternNumber; noteAction.f_velocity = velocity; noteAction.f_pan_L = pan_L; noteAction.f_pan_R = pan_R; noteAction.m_length = -1; int divider = msg1 / 12; noteAction.no_octaveKeyVal = (Note::Octave)(divider -3); noteAction.nk_noteKeyVal = (Note::Key)(msg1 - (12 * divider)); noteAction.b_isInstrumentMode = replaceExisting; noteAction.b_isMidi = true; noteAction.b_noteExist = replaceExisting; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); continue; } if ( ( pNote->get_just_recorded() == false ) && (static_cast( pNote->get_position() ) >= postdelete && pNote->get_position() < column + predelete +1 ) ) { bool replaceExisting = false; if ( column == currentPosition ) { replaceExisting = true; } EventQueue::AddMidiNoteVector noteAction; noteAction.m_column = currentPosition; noteAction.m_row = pNote->get_instrument_id(); //getSelectedInstrumentNumber(); noteAction.m_pattern = currentPatternNumber; noteAction.f_velocity = velocity; noteAction.f_pan_L = pan_L; noteAction.f_pan_R = pan_R; noteAction.m_length = -1; int divider = msg1 / 12; noteAction.no_octaveKeyVal = (Note::Octave)(divider -3); noteAction.nk_noteKeyVal = (Note::Key)(msg1 - (12 * divider)); noteAction.b_isInstrumentMode = replaceExisting; noteAction.b_isMidi = true; noteAction.b_noteExist = replaceExisting; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); } } continue; } if ( !fp && pNote->get_instrument() != instrRef ) { continue; } if (prefpredelete>=1 && prefpredelete <=14 ) { pNote->set_just_recorded( false ); } if ( (prefpredelete == 15) && (pNote->get_just_recorded() == false)) { bool replaceExisting = false; if (column == currentPosition) replaceExisting = true; EventQueue::AddMidiNoteVector noteAction; noteAction.m_column = currentPosition; noteAction.m_row = pNote->get_instrument_id();//m_nInstrumentLookupTable[ instrument ]; noteAction.m_pattern = currentPatternNumber; noteAction.f_velocity = velocity; noteAction.f_pan_L = pan_L; noteAction.f_pan_R = pan_R; noteAction.m_length = -1; noteAction.no_octaveKeyVal = (Note::Octave)0; noteAction.nk_noteKeyVal = (Note::Key)0; noteAction.b_isInstrumentMode = false; noteAction.b_isMidi = false; noteAction.b_noteExist = replaceExisting; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); continue; } if ( ( pNote->get_just_recorded() == false ) && ( static_cast( pNote->get_position() ) >= postdelete && pNote->get_position() get_instrument_id();//m_nInstrumentLookupTable[ instrument ]; noteAction.m_pattern = currentPatternNumber; noteAction.f_velocity = velocity; noteAction.f_pan_L = pan_L; noteAction.f_pan_R = pan_R; noteAction.m_length = -1; noteAction.no_octaveKeyVal = (Note::Octave)0; noteAction.nk_noteKeyVal = (Note::Key)0; noteAction.b_isInstrumentMode = false; noteAction.b_isMidi = false; noteAction.b_noteExist = replaceExisting; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); } } /* FOREACH */ } /* if dorecord ... */ assert( currentPattern ); if ( doRecord ) { EventQueue::AddMidiNoteVector noteAction; noteAction.m_column = column; noteAction.m_pattern = currentPatternNumber; noteAction.f_velocity = velocity; noteAction.f_pan_L = pan_L; noteAction.f_pan_R = pan_R; noteAction.m_length = -1; noteAction.b_isMidi = true; if ( pPreferences->__playselectedinstrument ) { instrRef = pSong->get_instrument_list()->get( getSelectedInstrumentNumber() ); int divider = msg1 / 12; noteAction.m_row = getSelectedInstrumentNumber(); noteAction.no_octaveKeyVal = (Note::Octave)(divider -3); noteAction.nk_noteKeyVal = (Note::Key)(msg1 - (12 * divider)); noteAction.b_isInstrumentMode = true; } else { instrRef = pSong->get_instrument_list()->get( m_nInstrumentLookupTable[ instrument ] ); noteAction.m_row = m_nInstrumentLookupTable[ instrument ]; noteAction.no_octaveKeyVal = (Note::Octave)0; noteAction.nk_noteKeyVal = (Note::Key)0; noteAction.b_isInstrumentMode = false; } Note* pNoteold = currentPattern->find_note( noteAction.m_column, -1, instrRef, noteAction.nk_noteKeyVal, noteAction.no_octaveKeyVal ); noteAction.b_noteExist = ( pNoteold ) ? true : false; EventQueue::get_instance()->m_addMidiNoteVector.push_back(noteAction); // hear note if its not in the future if ( pPreferences->getHearNewNotes() && position <= getTickPosition() ) { hearnote = true; } } /* if doRecord */ } else if ( pPreferences->getHearNewNotes() ) { hearnote = true; } /* if .. STATE_PLAYING */ if ( !pPreferences->__playselectedinstrument ) { if ( hearnote && instrRef ) { Note *pNote2 = new Note( instrRef, nRealColumn, velocity, pan_L, pan_R, -1, 0 ); midi_noteOn( pNote2 ); } } else if ( hearnote ) { Instrument* pInstr = pSong->get_instrument_list()->get( getSelectedInstrumentNumber() ); Note *pNote2 = new Note( pInstr, nRealColumn, velocity, pan_L, pan_R, -1, 0 ); int divider = msg1 / 12; Note::Octave octave = (Note::Octave)(divider -3); Note::Key notehigh = (Note::Key)(msg1 - (12 * divider)); //ERRORLOG( QString( "octave: %1, note: %2, instrument %3" ).arg( octave ).arg(notehigh).arg(instrument)); pNote2->set_midi_info( notehigh, octave, msg1 ); midi_noteOn( pNote2 ); } AudioEngine::get_instance()->unlock(); // unlock the audio engine } float Hydrogen::getMasterPeak_L() { return m_fMasterPeak_L; } float Hydrogen::getMasterPeak_R() { return m_fMasterPeak_R; } unsigned long Hydrogen::getTickPosition() { return m_nPatternTickPosition; } unsigned long Hydrogen::getRealtimeTickPosition() { // Get the realtime transport position in frames and convert // it into ticks. unsigned int initTick = ( unsigned int )( getRealtimeFrames() / m_pAudioDriver->m_transport.m_fTickSize ); unsigned long retTick; struct timeval currtime; struct timeval deltatime; double sampleRate = ( double ) m_pAudioDriver->getSampleRate(); gettimeofday ( &currtime, nullptr ); // Definition macro from timehelper.h calculating the time // difference between `currtime` and `m_currentTickTime` // (`currtime`-`m_currentTickTime`) and storing the results in // `deltatime`. It uses both the .tv_sec (seconds) and // .tv_usec (microseconds) members of the timeval struct. timersub( &currtime, &m_currentTickTime, &deltatime ); // add a buffers worth for jitter resistance double deltaSec = ( double ) deltatime.tv_sec + ( deltatime.tv_usec / 1000000.0 ) + ( m_pAudioDriver->getBufferSize() / ( double )sampleRate ); retTick = ( unsigned long ) ( ( sampleRate / ( double ) m_pAudioDriver->m_transport.m_fTickSize ) * deltaSec ); retTick += initTick; return retTick; } // TODO: make this function inline in the header PatternList* Hydrogen::getCurrentPatternList() { return m_pPlayingPatterns; } // TODO: make this function inline in the header PatternList * Hydrogen::getNextPatterns() { return m_pNextPatterns; } void Hydrogen::sequencer_setNextPattern( int pos ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); Song* pSong = getSong(); if ( pSong && pSong->get_mode() == Song::PATTERN_MODE ) { PatternList* pPatternList = pSong->get_pattern_list(); // Check whether `pos` is in range of the pattern list. if ( ( pos >= 0 ) && ( pos < ( int )pPatternList->size() ) ) { Pattern* pPattern = pPatternList->get( pos ); // If the pattern is already in the `m_pNextPatterns`, it // will be removed from the latter and its `del()` method // will return a pointer to the very pattern. The if // clause is therefore only entered if the `pPattern` was // not already present. if ( m_pNextPatterns->del( pPattern ) == nullptr ) { m_pNextPatterns->add( pPattern ); } } else { ERRORLOG( QString( "pos not in patternList range. pos=%1 patternListSize=%2" ) .arg( pos ).arg( pPatternList->size() ) ); m_pNextPatterns->clear(); } } else { ERRORLOG( "can't set next pattern in song mode" ); m_pNextPatterns->clear(); } AudioEngine::get_instance()->unlock(); } void Hydrogen::sequencer_setOnlyNextPattern( int pos ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); Song* pSong = getSong(); if ( pSong && pSong->get_mode() == Song::PATTERN_MODE ) { PatternList* pPatternList = pSong->get_pattern_list(); // Clear the list of all patterns scheduled to be processed // next and fill them with those currently played. m_pNextPatterns->clear( ); Pattern* pPattern; for ( int nPattern = 0 ; nPattern < (int)m_pPlayingPatterns->size() ; ++nPattern ) { pPattern = m_pPlayingPatterns->get( nPattern ); m_pNextPatterns->add( pPattern ); } // Appending the requested pattern. pPattern = pPatternList->get( pos ); m_pNextPatterns->add( pPattern ); } else { ERRORLOG( "can't set next pattern in song mode" ); m_pNextPatterns->clear(); } AudioEngine::get_instance()->unlock(); } // TODO: make variable name and getter/setter consistent. int Hydrogen::getPatternPos() { return m_nSongPos; } /* Return pattern for selected song tick position */ int Hydrogen::getPosForTick( unsigned long TickPos, int* nPatternStartTick ) { Song* pSong = getSong(); if ( pSong == nullptr ) { return 0; } return findPatternInTick( TickPos, pSong->is_loop_enabled(), nPatternStartTick ); } int Hydrogen::calculateLeadLagFactor( float fTickSize ){ return fTickSize * 5; } int Hydrogen::calculateLookahead( float fTickSize ){ // Introduce a lookahead of 5 ticks. Since the ticksize is // depending of the current tempo of the song, this component does // make the lookahead dynamic. int nLeadLagFactor = calculateLeadLagFactor( fTickSize ); // We need to look ahead in the song for notes with negative offsets // from LeadLag or Humanize. return nLeadLagFactor + m_nMaxTimeHumanize + 1; } void Hydrogen::restartDrivers() { audioEngine_restartAudioDrivers(); } void Hydrogen::startExportSession(int sampleRate, int sampleDepth ) { if ( getState() == STATE_PLAYING ) { sequencer_stop(); } unsigned nSamplerate = (unsigned) sampleRate; AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); Song* pSong = getSong(); m_oldEngineMode = pSong->get_mode(); m_bOldLoopEnabled = pSong->is_loop_enabled(); pSong->set_mode( Song::SONG_MODE ); pSong->set_loop_enabled( true ); /* * Currently an audio driver is loaded * which is not the DiskWriter driver. * Stop the current driver and fire up the DiskWriter. */ audioEngine_stopAudioDrivers(); m_pAudioDriver = new DiskWriterDriver( audioEngine_process, nSamplerate, sampleDepth ); m_bExportSessionIsActive = true; } void Hydrogen::stopExportSession() { m_bExportSessionIsActive = false; audioEngine_stopAudioDrivers(); delete m_pAudioDriver; m_pAudioDriver = nullptr; Song* pSong = getSong(); pSong->set_mode( m_oldEngineMode ); pSong->set_loop_enabled( m_bOldLoopEnabled ); audioEngine_startAudioDrivers(); if ( m_pAudioDriver ) { m_pAudioDriver->setBpm( pSong->__bpm ); } else { ERRORLOG( "m_pAudioDriver = NULL" ); } } /// Export a song to a wav file void Hydrogen::startExportSong( const QString& filename) { // reset m_pAudioDriver->m_transport.m_nFrames = 0; // reset total frames // TODO: not -1 instead? m_nSongPos = 0; m_nPatternTickPosition = 0; m_audioEngineState = STATE_PLAYING; m_nPatternStartTick = -1; Preferences *pPref = Preferences::get_instance(); int res = m_pAudioDriver->init( pPref->m_nBufferSize ); if ( res != 0 ) { ERRORLOG( "Error starting disk writer driver [DiskWriterDriver::init()]" ); } m_pMainBuffer_L = m_pAudioDriver->getOut_L(); m_pMainBuffer_R = m_pAudioDriver->getOut_R(); audioEngine_setupLadspaFX( m_pAudioDriver->getBufferSize() ); audioEngine_seek( 0, false ); DiskWriterDriver* pDiskWriterDriver = (DiskWriterDriver*) m_pAudioDriver; pDiskWriterDriver->setFileName( filename ); res = m_pAudioDriver->connect(); if ( res != 0 ) { ERRORLOG( "Error starting disk writer driver [DiskWriterDriver::connect()]" ); } } void Hydrogen::stopExportSong() { if ( m_pAudioDriver->class_name() != DiskWriterDriver::class_name() ) { return; } AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); m_pAudioDriver->disconnect(); m_nSongPos = -1; m_nPatternTickPosition = 0; } /// Used to display audio driver info AudioOutput* Hydrogen::getAudioOutput() { return m_pAudioDriver; } /// Used to display midi driver info MidiInput* Hydrogen::getMidiInput() { return m_pMidiDriver; } MidiOutput* Hydrogen::getMidiOutput() { return m_pMidiDriverOut; } void Hydrogen::setMasterPeak_L( float value ) { m_fMasterPeak_L = value; } void Hydrogen::setMasterPeak_R( float value ) { m_fMasterPeak_R = value; } int Hydrogen::getState() { return m_audioEngineState; } void Hydrogen::setCurrentPatternList( PatternList *pPatternList ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); m_pPlayingPatterns = pPatternList; EventQueue::get_instance()->push_event( EVENT_PATTERN_CHANGED, -1 ); AudioEngine::get_instance()->unlock(); } float Hydrogen::getProcessTime() { return m_fProcessTime; } float Hydrogen::getMaxProcessTime() { return m_fMaxProcessTime; } // Setting conditional to true will keep instruments that have notes if new kit has less instruments than the old one int Hydrogen::loadDrumkit( Drumkit *pDrumkitInfo ) { return loadDrumkit( pDrumkitInfo, true ); } int Hydrogen::loadDrumkit( Drumkit *pDrumkitInfo, bool conditional ) { assert ( pDrumkitInfo ); int old_ae_state = m_audioEngineState; if( m_audioEngineState >= STATE_READY ) { m_audioEngineState = STATE_PREPARED; } INFOLOG( pDrumkitInfo->get_name() ); m_currentDrumkit = pDrumkitInfo->get_name(); std::vector* pSongCompoList= getSong()->get_components(); std::vector* pDrumkitCompoList = pDrumkitInfo->get_components(); AudioEngine::get_instance()->lock( RIGHT_HERE ); for( auto &pComponent : *pSongCompoList ){ delete pComponent; } pSongCompoList->clear(); AudioEngine::get_instance()->unlock(); for (std::vector::iterator it = pDrumkitCompoList->begin() ; it != pDrumkitCompoList->end(); ++it) { DrumkitComponent* pSrcComponent = *it; DrumkitComponent* pNewComponent = new DrumkitComponent( pSrcComponent->get_id(), pSrcComponent->get_name() ); pNewComponent->load_from( pSrcComponent ); pSongCompoList->push_back( pNewComponent ); } //current instrument list InstrumentList *pSongInstrList = getSong()->get_instrument_list(); //new instrument list InstrumentList *pDrumkitInstrList = pDrumkitInfo->get_instruments(); /* * If the old drumkit is bigger then the new drumkit, * delete all instruments with a bigger pos then * pDrumkitInstrList->size(). Otherwise the instruments * from our old instrumentlist with * pos > pDrumkitInstrList->size() stay in the * new instrumentlist * * wolke: info! * this has moved to the end of this function * because we get lost objects in memory * now: * 1. the new drumkit will loaded * 2. all not used instruments will complete deleted * old function: * while ( pDrumkitInstrList->size() < songInstrList->size() ) * { * songInstrList->del(songInstrList->size() - 1); * } */ //needed for the new delete function int instrumentDiff = pSongInstrList->size() - pDrumkitInstrList->size(); for ( unsigned nInstr = 0; nInstr < pDrumkitInstrList->size(); ++nInstr ) { Instrument *pInstr = nullptr; if ( nInstr < pSongInstrList->size() ) { //instrument exists already pInstr = pSongInstrList->get( nInstr ); assert( pInstr ); } else { pInstr = new Instrument(); // The instrument isn't playing yet; no need for locking // :-) - Jakob Lund. AudioEngine::get_instance()->lock( // "Hydrogen::loadDrumkit" ); pSongInstrList->add( pInstr ); // AudioEngine::get_instance()->unlock(); } Instrument *pNewInstr = pDrumkitInstrList->get( nInstr ); assert( pNewInstr ); INFOLOG( QString( "Loading instrument (%1 of %2) [%3]" ) .arg( nInstr + 1 ) .arg( pDrumkitInstrList->size() ) .arg( pNewInstr->get_name() ) ); // Moved code from here right into the Instrument class - Jakob Lund. pInstr->load_from( pDrumkitInfo, pNewInstr ); } //wolke: new delete function if ( instrumentDiff >= 0 ) { for ( int i = 0; i < instrumentDiff ; i++ ){ removeInstrument( getSong()->get_instrument_list()->size() - 1, conditional ); } } #ifdef H2CORE_HAVE_JACK AudioEngine::get_instance()->lock( RIGHT_HERE ); renameJackPorts( getSong() ); AudioEngine::get_instance()->unlock(); #endif m_audioEngineState = old_ae_state; m_pCoreActionController->initExternalControlInterfaces(); return 0; //ok } // This will check if an instrument has any notes bool Hydrogen::instrumentHasNotes( Instrument *pInst ) { Song* pSong = getSong(); PatternList* pPatternList = pSong->get_pattern_list(); for ( int nPattern = 0 ; nPattern < (int)pPatternList->size() ; ++nPattern ) { if( pPatternList->get( nPattern )->references( pInst ) ) { DEBUGLOG("Instrument " + pInst->get_name() + " has notes" ); return true; } } // no notes for this instrument return false; } //this is also a new function and will used from the new delete function in //Hydrogen::loadDrumkit to delete the instruments by number void Hydrogen::removeInstrument( int instrumentNumber, bool conditional ) { Song* pSong = getSong(); Instrument *pInstr = pSong->get_instrument_list()->get( instrumentNumber ); PatternList* pPatternList = pSong->get_pattern_list(); if ( conditional ) { // new! this check if a pattern has an active note if there is an note //inside the pattern the instrument would not be deleted for ( int nPattern = 0 ; nPattern < (int)pPatternList->size() ; ++nPattern ) { if( pPatternList ->get( nPattern ) ->references( pInstr ) ) { DEBUGLOG("Keeping instrument #" + QString::number( instrumentNumber ) ); return; } } } else { getSong()->purge_instrument( pInstr ); } InstrumentList* pList = pSong->get_instrument_list(); if ( pList->size()==1 ){ AudioEngine::get_instance()->lock( RIGHT_HERE ); Instrument* pInstr = pList->get( 0 ); pInstr->set_name( (QString( "Instrument 1" )) ); for (std::vector::iterator it = pInstr->get_components()->begin() ; it != pInstr->get_components()->end(); ++it) { InstrumentComponent* pCompo = *it; // remove all layers for ( int nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { pCompo->set_layer( nullptr, nLayer ); } } AudioEngine::get_instance()->unlock(); EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); INFOLOG("clear last instrument to empty instrument 1 instead delete the last instrument"); return; } // if the instrument was the last on the instruments list, select the // next-last if ( instrumentNumber >= (int)getSong()->get_instrument_list()->size() - 1 ) { Hydrogen::get_instance()->setSelectedInstrumentNumber( std::max(0, instrumentNumber - 1 ) ); } // // delete the instrument from the instruments list AudioEngine::get_instance()->lock( RIGHT_HERE ); getSong()->get_instrument_list()->del( instrumentNumber ); // Ensure the selected instrument is not a deleted one setSelectedInstrumentNumber( instrumentNumber - 1 ); getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // At this point the instrument has been removed from both the // instrument list and every pattern in the song. Hence there's no way // (NOTE) to play on that instrument, and once all notes have stopped // playing it will be save to delete. // the ugly name is just for debugging... QString xxx_name = QString( "XXX_%1" ) . arg( pInstr->get_name() ); pInstr->set_name( xxx_name ); __instrument_death_row.push_back( pInstr ); __kill_instruments(); // checks if there are still notes. // this will force a GUI update. EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } void Hydrogen::raiseError( unsigned nErrorCode ) { audioEngine_raiseError( nErrorCode ); } unsigned long Hydrogen::getTotalFrames() { return m_pAudioDriver->m_transport.m_nFrames; } void Hydrogen::setRealtimeFrames( unsigned long frames ) { m_nRealtimeFrames = frames; } unsigned long Hydrogen::getRealtimeFrames() { return m_nRealtimeFrames; } long Hydrogen::getTickForPosition( int pos ) { Song* pSong = getSong(); int nPatternGroups = pSong->get_pattern_group_vector()->size(); if ( nPatternGroups == 0 ) { return -1; } if ( pos >= nPatternGroups ) { // The position is beyond the end of the Song, we // set periodic boundary conditions or return the // beginning of the Song as a fallback. if ( pSong->is_loop_enabled() ) { pos = pos % nPatternGroups; } else { WARNINGLOG( QString( "patternPos > nPatternGroups. pos:" " %1, nPatternGroups: %2") .arg( pos ) .arg( nPatternGroups ) ); return -1; } } std::vector *pColumns = pSong->get_pattern_group_vector(); long totalTick = 0; int nPatternSize; Pattern *pPattern = nullptr; for ( int i = 0; i < pos; ++i ) { PatternList *pColumn = ( *pColumns )[ i ]; if( pColumn->size() > 0) { pPattern = pColumn->get( 0 ); if ( pPattern ) { nPatternSize = pPattern->get_length(); } else { nPatternSize = MAX_NOTES; } } else { nPatternSize = MAX_NOTES; } totalTick += nPatternSize; } return totalTick; } void Hydrogen::setPatternPos( int pos ) { if ( pos < -1 ) { pos = -1; } AudioEngine::get_instance()->lock( RIGHT_HERE ); // TODO: why? EventQueue::get_instance()->push_event( EVENT_METRONOME, 1 ); long totalTick = getTickForPosition( pos ); if ( totalTick < 0 ) { AudioEngine::get_instance()->unlock(); return; } if ( getState() != STATE_PLAYING ) { // find pattern immediately when not playing // int dummy; // m_nSongPos = findPatternInTick( totalTick, // pSong->is_loop_enabled(), // &dummy ); m_nSongPos = pos; m_nPatternTickPosition = 0; } m_pAudioDriver->locate( ( int ) ( totalTick * m_pAudioDriver->m_transport.m_fTickSize ) ); AudioEngine::get_instance()->unlock(); } void Hydrogen::getLadspaFXPeak( int nFX, float *fL, float *fR ) { #ifdef H2CORE_HAVE_LADSPA ( *fL ) = m_fFXPeak_L[nFX]; ( *fR ) = m_fFXPeak_R[nFX]; #else ( *fL ) = 0; ( *fR ) = 0; #endif } void Hydrogen::setLadspaFXPeak( int nFX, float fL, float fR ) { #ifdef H2CORE_HAVE_LADSPA m_fFXPeak_L[nFX] = fL; m_fFXPeak_R[nFX] = fR; #endif } void Hydrogen::onTapTempoAccelEvent() { #ifndef WIN32 INFOLOG( "tap tempo" ); static timeval oldTimeVal; struct timeval now; gettimeofday(&now, nullptr); float fInterval = (now.tv_sec - oldTimeVal.tv_sec) * 1000.0 + (now.tv_usec - oldTimeVal.tv_usec) / 1000.0; oldTimeVal = now; if ( fInterval < 1000.0 ) { setTapTempo( fInterval ); } #endif } void Hydrogen::setTapTempo( float fInterval ) { // infoLog( "set tap tempo" ); static float fOldBpm1 = -1; static float fOldBpm2 = -1; static float fOldBpm3 = -1; static float fOldBpm4 = -1; static float fOldBpm5 = -1; static float fOldBpm6 = -1; static float fOldBpm7 = -1; static float fOldBpm8 = -1; float fBPM = 60000.0 / fInterval; if ( fabs( fOldBpm1 - fBPM ) > 20 ) { // troppa differenza, niente media fOldBpm1 = fBPM; fOldBpm2 = fBPM; fOldBpm3 = fBPM; fOldBpm4 = fBPM; fOldBpm5 = fBPM; fOldBpm6 = fBPM; fOldBpm7 = fBPM; fOldBpm8 = fBPM; } if ( fOldBpm1 == -1 ) { fOldBpm1 = fBPM; fOldBpm2 = fBPM; fOldBpm3 = fBPM; fOldBpm4 = fBPM; fOldBpm5 = fBPM; fOldBpm6 = fBPM; fOldBpm7 = fBPM; fOldBpm8 = fBPM; } fBPM = ( fBPM + fOldBpm1 + fOldBpm2 + fOldBpm3 + fOldBpm4 + fOldBpm5 + fOldBpm6 + fOldBpm7 + fOldBpm8 ) / 9.0; INFOLOG( QString( "avg BPM = %1" ).arg( fBPM ) ); fOldBpm8 = fOldBpm7; fOldBpm7 = fOldBpm6; fOldBpm6 = fOldBpm5; fOldBpm5 = fOldBpm4; fOldBpm4 = fOldBpm3; fOldBpm3 = fOldBpm2; fOldBpm2 = fOldBpm1; fOldBpm1 = fBPM; AudioEngine::get_instance()->lock( RIGHT_HERE ); setBPM( fBPM ); AudioEngine::get_instance()->unlock(); } void Hydrogen::setBPM( float fBPM ) { Song* pSong = getSong(); if ( ! m_pAudioDriver || ! pSong ){ return; } if ( haveJackTimebaseClient() ) { ERRORLOG( "Unable to change tempo directly in the presence of an external JACK timebase master. Press 'J.MASTER' get tempo control." ); return; } m_pAudioDriver->setBpm( fBPM ); pSong->__bpm = fBPM; setNewBpmJTM ( fBPM ); } void Hydrogen::restartLadspaFX() { if ( m_pAudioDriver ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); audioEngine_setupLadspaFX( m_pAudioDriver->getBufferSize() ); AudioEngine::get_instance()->unlock(); } else { ERRORLOG( "m_pAudioDriver = NULL" ); } } int Hydrogen::getSelectedPatternNumber() { return m_nSelectedPatternNumber; } void Hydrogen::setSelectedPatternNumberWithoutGuiEvent( int nPat ) { Song* pSong = getSong(); if ( nPat == m_nSelectedPatternNumber || ( nPat + 1 > pSong->get_pattern_list()->size() ) ) return; if ( Preferences::get_instance()->patternModePlaysSelected() ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); m_nSelectedPatternNumber = nPat; AudioEngine::get_instance()->unlock(); } else { m_nSelectedPatternNumber = nPat; } } void Hydrogen::setSelectedPatternNumber( int nPat ) { if ( nPat == m_nSelectedPatternNumber ) return; if ( Preferences::get_instance()->patternModePlaysSelected() ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); m_nSelectedPatternNumber = nPat; AudioEngine::get_instance()->unlock(); } else { m_nSelectedPatternNumber = nPat; } EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); } int Hydrogen::getSelectedInstrumentNumber() { return m_nSelectedInstrumentNumber; } void Hydrogen::setSelectedInstrumentNumber( int nInstrument ) { if ( m_nSelectedInstrumentNumber == nInstrument ) return; m_nSelectedInstrumentNumber = nInstrument; EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } void Hydrogen::refreshInstrumentParameters( int nInstrument ) { EventQueue::get_instance()->push_event( EVENT_PARAMETERS_INSTRUMENT_CHANGED, -1 ); } #ifdef H2CORE_HAVE_JACK void Hydrogen::renameJackPorts( Song *pSong ) { if( Preferences::get_instance()->m_bJackTrackOuts == true ){ audioEngine_renameJackPorts(pSong); } } #endif /** Updates #m_nbeatsToCount * \param beatstocount New value*/ void Hydrogen::setbeatsToCount( int beatstocount) { m_nbeatsToCount = beatstocount; } /** \return #m_nbeatsToCount*/ int Hydrogen::getbeatsToCount() { return m_nbeatsToCount; } void Hydrogen::setNoteLength( float notelength) { m_ntaktoMeterCompute = notelength; } float Hydrogen::getNoteLength() { return m_ntaktoMeterCompute; } int Hydrogen::getBcStatus() { return m_nEventCount; } void Hydrogen::setBcOffsetAdjust() { //individual fine tuning for the m_nBeatCounter //to adjust ms_offset from different people and controller Preferences *pPreferences = Preferences::get_instance(); m_nCoutOffset = pPreferences->m_countOffset; m_nStartOffset = pPreferences->m_startOffset; } void Hydrogen::handleBeatCounter() { // Get first time value: if (m_nBeatCount == 1) { gettimeofday(&m_CurrentTime,nullptr); } m_nEventCount++; // Set wm_LastTime to wm_CurrentTime to remind the time: m_LastTime = m_CurrentTime; // Get new time: gettimeofday(&m_CurrentTime,nullptr); // Build doubled time difference: m_nLastBeatTime = (double)( m_LastTime.tv_sec + (double)(m_LastTime.tv_usec * US_DIVIDER) + (int)m_nCoutOffset * .0001 ); m_nCurrentBeatTime = (double)( m_CurrentTime.tv_sec + (double)(m_CurrentTime.tv_usec * US_DIVIDER) ); m_nBeatDiff = m_nBeatCount == 1 ? 0 : m_nCurrentBeatTime - m_nLastBeatTime; //if differences are to big reset the beatconter if( m_nBeatDiff > 3.001 * 1/m_ntaktoMeterCompute ) { m_nEventCount = 1; m_nBeatCount = 1; return; } // Only accept differences big enough if (m_nBeatCount == 1 || m_nBeatDiff > .001) { if (m_nBeatCount > 1) { m_nBeatDiffs[m_nBeatCount - 2] = m_nBeatDiff ; } // Compute and reset: if (m_nBeatCount == m_nbeatsToCount){ // unsigned long currentframe = getRealtimeFrames(); double beatTotalDiffs = 0; for(int i = 0; i < (m_nbeatsToCount - 1); i++) { beatTotalDiffs += m_nBeatDiffs[i]; } double m_nBeatDiffAverage = beatTotalDiffs / (m_nBeatCount - 1) * m_ntaktoMeterCompute ; m_fBeatCountBpm = (float) ((int) (60 / m_nBeatDiffAverage * 100)) / 100; AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_fBeatCountBpm > MAX_BPM) { m_fBeatCountBpm = MAX_BPM; } setBPM( m_fBeatCountBpm ); AudioEngine::get_instance()->unlock(); if (Preferences::get_instance()->m_mmcsetplay == Preferences::SET_PLAY_OFF) { m_nBeatCount = 1; m_nEventCount = 1; }else{ if ( m_audioEngineState != STATE_PLAYING ){ unsigned bcsamplerate = m_pAudioDriver->getSampleRate(); unsigned long rtstartframe = 0; if ( m_ntaktoMeterCompute <= 1){ rtstartframe = bcsamplerate * m_nBeatDiffAverage * ( 1/ m_ntaktoMeterCompute ); }else { rtstartframe = bcsamplerate * m_nBeatDiffAverage / m_ntaktoMeterCompute ; } int sleeptime = ( (float) rtstartframe / (float) bcsamplerate * (int) 1000 ) + (int)m_nCoutOffset + (int) m_nStartOffset; #ifdef WIN32 Sleep( sleeptime ); #else usleep( 1000 * sleeptime ); #endif sequencer_play(); } m_nBeatCount = 1; m_nEventCount = 1; return; } } else { m_nBeatCount ++; } } return; } //~ m_nBeatCounter #ifdef H2CORE_HAVE_JACK void Hydrogen::offJackMaster() { if ( haveJackTransport() ) { static_cast< JackAudioDriver* >( m_pAudioDriver )->releaseTimebaseMaster(); } } void Hydrogen::onJackMaster() { if ( haveJackTransport() ) { static_cast< JackAudioDriver* >( m_pAudioDriver )->initTimebaseMaster(); } } #endif long Hydrogen::getPatternLength( int nPattern ) { Song* pSong = getSong(); if ( pSong == nullptr ){ return -1; } std::vector< PatternList* > *pColumns = pSong->get_pattern_group_vector(); int nPatternGroups = pColumns->size(); if ( nPattern >= nPatternGroups ) { if ( pSong->is_loop_enabled() ) { nPattern = nPattern % nPatternGroups; } else { return MAX_NOTES; } } if ( nPattern < 1 ){ return MAX_NOTES; } PatternList* pPatternList = pColumns->at( nPattern - 1 ); Pattern* pPattern = pPatternList->get( 0 ); if ( pPattern ) { return pPattern->get_length(); } else { return MAX_NOTES; } } float Hydrogen::getNewBpmJTM() { return m_fNewBpmJTM; } void Hydrogen::setNewBpmJTM( float bpmJTM ) { m_fNewBpmJTM = bpmJTM; } //~ jack transport master void Hydrogen::resetPatternStartTick() { // This forces the barline position if ( getSong()->get_mode() == Song::PATTERN_MODE ) { m_nPatternStartTick = -1; } } void Hydrogen::togglePlaysSelected() { Song* pSong = getSong(); if ( pSong->get_mode() != Song::PATTERN_MODE ) { return; } AudioEngine::get_instance()->lock( RIGHT_HERE ); Preferences* pPref = Preferences::get_instance(); bool isPlaysSelected = pPref->patternModePlaysSelected(); if (isPlaysSelected) { m_pPlayingPatterns->clear(); Pattern* pSelectedPattern = pSong->get_pattern_list()->get(m_nSelectedPatternNumber); m_pPlayingPatterns->add( pSelectedPattern ); } pPref->setPatternModePlaysSelected( !isPlaysSelected ); AudioEngine::get_instance()->unlock(); } void Hydrogen::__kill_instruments() { int c = 0; Instrument * pInstr = nullptr; while ( __instrument_death_row.size() && __instrument_death_row.front()->is_queued() == 0 ) { pInstr = __instrument_death_row.front(); __instrument_death_row.pop_front(); INFOLOG( QString( "Deleting unused instrument (%1). " "%2 unused remain." ) . arg( pInstr->get_name() ) . arg( __instrument_death_row.size() ) ); delete pInstr; c++; } if ( __instrument_death_row.size() ) { pInstr = __instrument_death_row.front(); INFOLOG( QString( "Instrument %1 still has %2 active notes. " "Delaying 'delete instrument' operation." ) . arg( pInstr->get_name() ) . arg( pInstr->is_queued() ) ); } } void Hydrogen::__panic() { sequencer_stop(); AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); } unsigned int Hydrogen::__getMidiRealtimeNoteTickPosition() { return m_naddrealtimenotetickposition; } float Hydrogen::getTimelineBpm( int nBar ) { Song* pSong = getSong(); // We need return something if ( pSong == nullptr ) { return getNewBpmJTM(); } float fBPM = pSong->__bpm; // Pattern mode don't use timeline and will have a constant // speed. if ( pSong->get_mode() == Song::PATTERN_MODE ) { return fBPM; } // Check whether the user wants Hydrogen to determine the // speed by local setting along the timeline or whether she // wants to use a global speed instead. if ( ! Preferences::get_instance()->getUseTimelineBpm() ) { return fBPM; } // Determine the speed at the supplied beat. for ( int i = 0; i < static_cast(m_pTimeline->m_timelinevector.size()); i++) { if ( m_pTimeline->m_timelinevector[i].m_htimelinebeat > nBar ) { break; } fBPM = m_pTimeline->m_timelinevector[i].m_htimelinebpm; } return fBPM; } void Hydrogen::setTimelineBpm() { if ( ! Preferences::get_instance()->getUseTimelineBpm() || haveJackTimebaseClient() ) { return; } Song* pSong = getSong(); // Obtain the local speed specified for the current Pattern. float fBPM = getTimelineBpm( getPatternPos() ); if ( fBPM != pSong->__bpm ) { setBPM( fBPM ); } // Get the realtime pattern position. This also covers // keyboard and MIDI input events in case the audio engine is // not playing. unsigned long PlayTick = getRealtimeTickPosition(); int nStartPos; int nRealtimePatternPos = getPosForTick( PlayTick, &nStartPos ); float fRealtimeBPM = getTimelineBpm( nRealtimePatternPos ); // FIXME: this was already done in setBPM but for "engine" time // so this is actually forcibly overwritten here setNewBpmJTM( fRealtimeBPM ); } bool Hydrogen::haveJackAudioDriver() const { #ifdef H2CORE_HAVE_JACK if ( m_pAudioDriver != nullptr ) { if ( JackAudioDriver::class_name() == m_pAudioDriver->class_name() ){ return true; } } return false; #else return false; #endif } bool Hydrogen::haveJackTransport() const { #ifdef H2CORE_HAVE_JACK if ( m_pAudioDriver != nullptr ) { if ( JackAudioDriver::class_name() == m_pAudioDriver->class_name() && Preferences::get_instance()->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT ){ return true; } } return false; #else return false; #endif } bool Hydrogen::haveJackTimebaseClient() const { #ifdef H2CORE_HAVE_JACK if ( haveJackTransport() ) { if ( static_cast(m_pAudioDriver)->getIsTimebaseMaster() == 0 ) { return true; } } return false; #else return false; #endif } #ifdef H2CORE_HAVE_OSC void startOscServer() { OscServer* pOscServer = OscServer::get_instance(); if( pOscServer ){ pOscServer->start(); } } void Hydrogen::startNsmClient() { //NSM has to be started before jack driver gets created NsmClient* pNsmClient = NsmClient::get_instance(); if(pNsmClient){ pNsmClient->createInitialClient(); } } #endif }; /* Namespace */ hydrogen-1.0.0-rc1/src/core/src/lash/000077500000000000000000000000001366722712400172615ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/lash/LashClient.cpp000066400000000000000000000056201366722712400220160ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2005 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * */ /** * LASH support for Hydrogen 0.9.3. * * Created by Jaakko Sipari (jaakko.sipari@gmail.com) */ #include #if defined(H2CORE_HAVE_LASH) || _DOXYGEN_ #include #include #include using namespace H2Core; LashClient* LashClient::__instance = NULL; /// static reference of LashClient class (Singleton) void LashClient::create_instance( const char *lashClass, const char *viewName, int *argc, char ***argv ) { __instance = new LashClient(lashClass, viewName, argc, argv); } LashClient::LashClient(const char* lashClass, const char* viewName, int* argc, char*** argv) { __instance = this; if ( H2Core::Preferences::get_instance()->useLash() ){ newProject = true; lash_args_t *lash_args = lash_extract_args(argc, argv); lashClient = lash_init(lash_args, lashClass, LASH_Config_File, LASH_PROTOCOL(2, 0)); if (isConnected()) { sendEvent(LASH_Client_Name, viewName); } } } LashClient::~LashClient() { } bool LashClient::isConnected() { return lash_enabled(lashClient); } void LashClient::setNewProject(bool value) { newProject = value; } bool LashClient::isNewProject() { return newProject; } lash_client_t* LashClient::getConnection() { return lashClient; } lash_event_t* LashClient::getNextEvent() { lash_event_t* event = lash_get_event(lashClient); return event; } void LashClient::sendEvent(LASH_Event_Type eventType) { sendEvent(eventType, NULL); } void LashClient::sendEvent(LASH_Event_Type eventType, const char* value) { lash_event_t *event = lash_event_new_with_type(eventType); if (value != NULL) { lash_event_set_string(event, value); } lash_send_event(lashClient, event); } void LashClient::setJackClientName( const std::string& name ) { jackClientName = name; } void LashClient::sendJackClientName() { lash_jack_client_name(lashClient, jackClientName.c_str()); } void LashClient::setAlsaClientId(unsigned char id) { alsaClientId = id; } void LashClient::sendAlsaClientId() { lash_alsa_client_id(lashClient, alsaClientId); } #endif hydrogen-1.0.0-rc1/src/core/src/lilypond/000077500000000000000000000000001366722712400201645ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/lilypond/lilypond.cpp000066400000000000000000000230701366722712400225240ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015 by Sacha Delanoue * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 /* * Header of LilyPond file * It contains the notation style (states the position of notes), and for this * it follows the "Guide to Standardized Drumset Notation" by Norman Weinberg. * * Note that the GM-kit uses two unconventionnal instruments: "Stick" and * "Hand Clap", so for those I did what I could and used the recommended * triangle notehead to distinguish them for drum and cymbal notation. */ static const char *sHeader = "\\version \"2.16.2\"\n" // Current version on Ubuntu LTS "\n" "#(define gmStyle\n" " '(\n" " (bassdrum default #f -3) ; Kick\n" " (lowoodblock triangle #f 0) ; Stick\n" " (snare default #f 1) ; Snare\n" " (maracas triangle #f -3) ; Hand Clap\n" " (highfloortom default #f -1) ; Tom Low\n" " (hihat cross #f 5) ; Closed HH\n" " (lowtom default #f 2) ; Tom Mid\n" " (pedalhihat cross #f -5) ; Pedal HH\n" " (hightom default #f 3) ; Tom Hi\n" " (openhihat cross \"open\" 5) ; Open HH\n" " (cowbell triangle #f 3) ; Cowbell\n" " (ridecymbal cross #f 4) ; Main Ride\n" " (crashcymbal cross #f 6) ; Main Crash\n" " (ridecymbala cross #f 4) ; Additional Ride\n" " (crashcymbala cross #f 7) ; Additional Crash\n" " ))\n" "\n"; H2Core::LilyPond::LilyPond() : m_fBPM( 0 ) { } void H2Core::LilyPond::extractData( const Song &song ) { // Retrieve metadata m_sName = song.__name; m_sAuthor = song.__author; m_fBPM = song.__bpm; // Get the main information about the music const std::vector *group = song.get_pattern_group_vector(); if ( !group ) { m_Measures.clear(); return; } unsigned nSize = group->size(); m_Measures = std::vector( nSize ); for ( unsigned nPatternList = 0; nPatternList < nSize; nPatternList++ ) { if ( PatternList *pPatternList = ( *group )[ nPatternList ] ) { addPatternList( *pPatternList, m_Measures[ nPatternList ] ); } } } void H2Core::LilyPond::write( const QString &sFilename ) const { std::ofstream file( sFilename.toLocal8Bit() ); if ( !file ) { return; } file << sHeader; file << "\\header {\n"; file << " title = \"" << m_sName.toUtf8().constData() << "\"\n"; file << " composer = \"" << m_sAuthor.toUtf8().constData() << "\"\n"; file << " tagline = \"Generated by Hydrogen " H2CORE_VERSION "\"\n"; file << "}\n\n"; file << "\\score {\n"; file << " \\new DrumStaff <<\n"; file << " \\set DrumStaff.drumStyleTable = #(alist->hash-table " "gmStyle)\n"; file << " \\override Staff.TimeSignature #'style = #'() % Display " "4/4 signature\n"; file << " \\set Staff.beamExceptions = #'() % Beam " "quavers two by two\n"; file << " \\drummode {\n"; file << " \\tempo 4 = " << static_cast( m_fBPM ) << "\n\n"; writeMeasures( file ); file << "\n }\n"; file << " >>\n"; file << "}\n"; } void H2Core::LilyPond::addPatternList( const PatternList &list, notes_t &to ) { to.clear(); for ( unsigned nPattern = 0; nPattern < list.size(); nPattern++ ) { if ( const Pattern *pPattern = list.get( nPattern ) ) { addPattern( *pPattern, to ); } } } void H2Core::LilyPond::addPattern( const Pattern &pattern, notes_t ¬es ) { notes.reserve( pattern.get_length() ); for ( unsigned nNote = 0; nNote < pattern.get_length(); nNote++ ) { if ( nNote >= notes.size() ) { notes.push_back( std::vector >() ); } const Pattern::notes_t *pPatternNotes = pattern.get_notes(); if ( !pPatternNotes ) { continue; } FOREACH_NOTE_CST_IT_BOUND( pPatternNotes, it, nNote ) { if ( Note *pNote = it->second ) { int nId = pNote->get_instrument_id(); float fVelocity = pNote->get_velocity(); notes[ nNote ].push_back( std::make_pair( nId, fVelocity ) ); } } } } void H2Core::LilyPond::writeMeasures( std::ofstream &stream ) const { unsigned nSignature = 0; ///< Numerator of the time signature for ( unsigned nMeasure = 0; nMeasure < m_Measures.size(); nMeasure++ ) { // Start a new measure stream << "\n % Measure " << nMeasure + 1 << "\n"; unsigned nNewSignature = m_Measures[ nMeasure ].size() / 48; if ( nSignature != nNewSignature ) { // Display time signature change nSignature = nNewSignature; stream << " \\time " << nSignature << "/4\n"; } // Display the notes stream << " << {\n"; writeUpper( stream, nMeasure ); stream << " } \\\\ {\n"; writeLower( stream, nMeasure ); stream << " } >>\n"; } } void H2Core::LilyPond::writeUpper( std::ofstream &stream, unsigned nMeasure ) const { // On the upper voice, we want only cymbals and mid and high toms std::vector whiteList; whiteList.push_back( 6 ); // Closed HH whiteList.push_back( 7 ); // Tom Mid whiteList.push_back( 9 ); // Tom Hi whiteList.push_back( 10 ); // Open HH whiteList.push_back( 11 ); // Cowbell whiteList.push_back( 12 ); // Ride Jazz whiteList.push_back( 13 ); // Crash whiteList.push_back( 14 ); // Ride Rock whiteList.push_back( 15 ); // Crash Jazz writeVoice( stream, nMeasure, whiteList ); } void H2Core::LilyPond::writeLower( std::ofstream &stream, unsigned nMeasure ) const { std::vector whiteList; whiteList.push_back( 0 ); // Kick whiteList.push_back( 1 ); // Stick whiteList.push_back( 2 ); // Snare Jazz whiteList.push_back( 3 ); // Hand Clap whiteList.push_back( 4 ); // Snare Jazz whiteList.push_back( 5 ); // Tom Low whiteList.push_back( 8 ); // Pedal HH writeVoice( stream, nMeasure, whiteList ); } ///< Mapping of GM-kit instrument to LilyPond names static const char *const sNames[] = { "bd", "wbl", "sn", "mar", "sn", "tomfh", "hh", "toml", "hhp", "tomh", "hho", "cb", "cymr", "cymc", "cymra", "cymca" }; ///< Write group of note (may also be a rest or a single note) static void writeNote( std::ofstream &stream, const std::vector ¬es ) { switch ( notes.size() ) { case 0: stream << "r"; break; case 1: stream << sNames[ notes[ 0 ] ]; break; default: stream << "<"; for ( unsigned i = 0; i < notes.size(); i++ ) { stream << sNames[ notes[ i ] ] << " "; } stream << ">"; } } ///< Write duration in LilyPond format, from number of 1/48th of a beat static void writeDuration( std::ofstream &stream, unsigned duration ) { if ( 48 % duration == 0 ) { // This is a basic note if ( duration % 2 ) { return; // TODO Triplet, unsupported yet } stream << 4 * 48 / duration; } else if ( duration % 3 == 0 && 48 % ( duration * 2 / 3 ) == 0 ) { // This is a dotted note if ( duration % 2 ) { return; // TODO Triplet, unsupported yet } stream << 4 * 48 / ( duration * 2 / 3 ) << "."; } else { // Neither basic nor dotted, we have to split it and add a rest for ( int pow = 3; pow >= 0; --pow ) { if ( 3 * ( 1 << pow ) < duration ) { stream << 8 * ( 3 - pow ) << " r"; writeDuration( stream, duration - 3 * ( 1 << pow ) ); break; } } } } void H2Core::LilyPond::writeVoice( std::ofstream &stream, unsigned nMeasure, const std::vector &whiteList ) const { stream << " "; const notes_t &measure = m_Measures[ nMeasure ]; for ( unsigned nStart = 0; nStart < measure.size(); nStart += 48 ) { unsigned lastNote = nStart; for ( unsigned nTime = nStart; nTime < nStart + 48; nTime++ ) { // Get notes played at this current time std::vector notes; const std::vector > &input = measure[ nTime ]; for ( unsigned nNote = 0; nNote < input.size(); nNote++ ) { if ( std::find( whiteList.begin(), whiteList.end(), input[ nNote ].first ) != whiteList.end() ) { notes.push_back( input[ nNote ].first ); } } // Write them if there are any if ( !notes.empty() || nTime == nStart ) { // First write duration of last note if ( nTime != nStart ) { writeDuration( stream, nTime - lastNote ); lastNote = nTime; } // Then write next note stream << " "; writeNote( stream, notes ); } } writeDuration( stream, nStart + 48 - lastNote ); } stream << "\n"; } hydrogen-1.0.0-rc1/src/core/src/local_file_mgr.cpp000066400000000000000000000651211366722712400220010ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/version.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include namespace H2Core { const char* LocalFileMng::__class_name = "LocalFileMng"; LocalFileMng::LocalFileMng() : Object( __class_name ) { // infoLog("INIT"); } LocalFileMng::~LocalFileMng() { // infoLog("DESTROY"); } QString LocalFileMng::getDrumkitNameForPattern( const QString& patternDir ) { QDomDocument doc = openXmlDocument( patternDir ); QDomNode rootNode = doc.firstChildElement( "drumkit_pattern" ); // root element if ( rootNode.isNull() ) { ERRORLOG( "Error reading Pattern: Pattern_drumkit_infonode not found " + patternDir); return nullptr; } QString dk_name = LocalFileMng::readXmlString( rootNode,"drumkit_name", "" ); if ( dk_name.isEmpty() ) { dk_name = LocalFileMng::readXmlString( rootNode,"pattern_for_drumkit", "" ); } return dk_name; } /* New QtXml based methods */ QString LocalFileMng::processNode( QDomNode node, const QString& nodeName, bool bCanBeEmpty, bool bShouldExists ) { QDomElement element = node.firstChildElement( nodeName ); if ( !node.isNull() && !element.isNull() ) { QString text = element.text(); if( !text.isEmpty() ) { return text; } else { if ( !bCanBeEmpty ) { _WARNINGLOG( "node '" + nodeName + "' is empty" ); } } } else { if ( bShouldExists ) { _WARNINGLOG( "node '" + nodeName + "' is not found" ); } } return nullptr; } QString LocalFileMng::readXmlString( QDomNode node , const QString& nodeName, const QString& defaultValue, bool bCanBeEmpty, bool bShouldExists, bool tinyXmlCompatMode) { QString text = processNode( node, nodeName, bCanBeEmpty, bShouldExists ); if ( text == nullptr ) { _WARNINGLOG( QString( "\tusing default value : '%1' for node '%2'" ).arg( defaultValue ).arg( nodeName ) ); return defaultValue; } else { return text; } } float LocalFileMng::readXmlFloat( QDomNode node , const QString& nodeName, float defaultValue, bool bCanBeEmpty, bool bShouldExists, bool tinyXmlCompatMode) { QString text = processNode( node, nodeName, bCanBeEmpty, bShouldExists ); if ( text == nullptr ) { _WARNINGLOG( QString( "\tusing default value : '%1' for node '%2'" ).arg( defaultValue ).arg( nodeName )); return defaultValue; } else { return QLocale::c().toFloat( text ); } } int LocalFileMng::readXmlInt( QDomNode node , const QString& nodeName, int defaultValue, bool bCanBeEmpty, bool bShouldExists, bool tinyXmlCompatMode) { QString text = processNode( node, nodeName, bCanBeEmpty, bShouldExists ); if ( text == nullptr ) { _WARNINGLOG( QString( "\tusing default value : '%1' for node '%2'" ).arg( defaultValue ).arg( nodeName )); return defaultValue; } else { return QLocale::c().toInt( text ); } } bool LocalFileMng::readXmlBool( QDomNode node , const QString& nodeName, bool defaultValue, bool bShouldExists, bool tinyXmlCompatMode) { QString text = processNode( node, nodeName, bShouldExists, bShouldExists ); if ( text == nullptr ) { _WARNINGLOG( QString( "\tusing default value : '%1' for node '%2'" ).arg( defaultValue ? "true" : "false" ).arg( nodeName ) ); return defaultValue; } else { if ( text == "true") { return true; } else { return false; } } } void LocalFileMng::writeXmlString( QDomNode parent, const QString& name, const QString& text ) { QDomDocument doc; QDomElement elem = doc.createElement( name ); QDomText t = doc.createTextNode( text ); elem.appendChild( t ); parent.appendChild( elem ); } void LocalFileMng::writeXmlBool( QDomNode parent, const QString& name, bool value ) { if ( value ) { writeXmlString( parent, name, QString( "true" ) ); } else { writeXmlString( parent, name, QString( "false" ) ); } } /* Convert (in-place) an XML escape sequence into a literal byte, * rather than the character it actually refers to. */ void LocalFileMng::convertFromTinyXMLString( QByteArray* str ) { /* When TinyXML encountered a non-ASCII character, it would * simply write the character as "&#xx;" -- where "xx" is * the hex character code. However, this doesn't respect * any encodings (e.g. UTF-8, UTF-16). In XML, &#xx; literally * means "the Unicode character # xx." However, in a UTF-8 * sequence, this could be an escape character that tells * whether we have a 2, 3, or 4-byte UTF-8 sequence. * * For example, the UTF-8 sequence 0xD184 was being written * by TinyXML as "Ñ„". However, this is the UTF-8 * sequence for the cyrillic small letter EF (which looks * kind of like a thorn or a greek phi). This letter, in * XML, should be saved as ф, or even literally * (no escaping). As a consequence, when Ñ is read * by an XML parser, it will be interpreted as capital N * with a tilde (~). Then „ will be interpreted as * an unknown or control character. * * So, when we know that TinyXML wrote the file, we can * simply exchange these hex sequences to literal bytes. */ int pos = 0; pos = str->indexOf("&#x"); while( pos != -1 ) { if( isxdigit(str->at(pos+3)) && isxdigit(str->at(pos+4)) && (str->at(pos+5) == ';') ) { char w1 = str->at(pos+3); char w2 = str->at(pos+4); w1 = tolower(w1) - 0x30; // '0' = 0x30 if( w1 > 9 ) w1 -= 0x27; // '9' = 0x39, 'a' = 0x61 w1 = (w1 & 0xF); w2 = tolower(w2) - 0x30; // '0' = 0x30 if( w2 > 9 ) w2 -= 0x27; // '9' = 0x39, 'a' = 0x61 w2 = (w2 & 0xF); char ch = (w1 << 4) | w2; (*str)[pos] = ch; ++pos; str->remove(pos, 5); } pos = str->indexOf("&#x"); } } bool LocalFileMng::checkTinyXMLCompatMode( const QString& filename ) { /* Check if filename was created with TinyXml or QtXml TinyXML: return true QtXml: return false */ QFile file( filename ); if ( !file.open(QIODevice::ReadOnly) ) { return false; } QString line = file.readLine(); file.close(); if ( line.startsWith( "name(); if( enc == QString("System") ) { enc = "UTF-8"; } QByteArray line; QByteArray buf = QString("\n") .arg( enc ) .toLocal8Bit(); while( !file.atEnd() ) { line = file.readLine(); LocalFileMng::convertFromTinyXMLString( &line ); buf += line; } if( ! doc.setContent( buf ) ) { file.close(); return QDomDocument(); } } else { if( ! doc.setContent( &file ) ) { file.close(); return QDomDocument(); } } file.close(); return doc; } //----------------------------------------------------------------------------- // Implementation of SongWriter class //----------------------------------------------------------------------------- const char* SongWriter::__class_name = "SongWriter"; SongWriter::SongWriter() : Object( __class_name ) { // infoLog("init"); } SongWriter::~SongWriter() { // infoLog("destroy"); } // Returns 0 on success, passes the TinyXml error code otherwise. int SongWriter::writeSong( Song * pSong, const QString& filename ) { INFOLOG( "Saving song " + filename ); int rv = 0; // return value // FIXME: has the file write-permssion? // FIXME: verificare che il file non sia gia' esistente // FIXME: effettuare copia di backup per il file gia' esistente QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild( header ); QDomNode songNode = doc.createElement( "song" ); LocalFileMng::writeXmlString( songNode, "version", QString( get_version().c_str() ) ); LocalFileMng::writeXmlString( songNode, "bpm", QString("%1").arg( pSong->__bpm ) ); LocalFileMng::writeXmlString( songNode, "volume", QString("%1").arg( pSong->get_volume() ) ); LocalFileMng::writeXmlString( songNode, "metronomeVolume", QString("%1").arg( pSong->get_metronome_volume() ) ); LocalFileMng::writeXmlString( songNode, "name", pSong->__name ); LocalFileMng::writeXmlString( songNode, "author", pSong->__author ); LocalFileMng::writeXmlString( songNode, "notes", pSong->get_notes() ); LocalFileMng::writeXmlString( songNode, "license", pSong->get_license() ); LocalFileMng::writeXmlBool( songNode, "loopEnabled", pSong->is_loop_enabled() ); LocalFileMng::writeXmlBool( songNode, "patternModeMode", Preferences::get_instance()->patternModePlaysSelected()); LocalFileMng::writeXmlString( songNode, "playbackTrackFilename", QString("%1").arg( pSong->get_playback_track_filename() ) ); LocalFileMng::writeXmlBool( songNode, "playbackTrackEnabled", pSong->get_playback_track_enabled() ); LocalFileMng::writeXmlString( songNode, "playbackTrackVolume", QString("%1").arg( pSong->get_playback_track_volume() ) ); if ( pSong->get_mode() == Song::SONG_MODE ) { LocalFileMng::writeXmlString( songNode, "mode", QString( "song" ) ); } else { LocalFileMng::writeXmlString( songNode, "mode", QString( "pattern" ) ); } LocalFileMng::writeXmlString( songNode, "humanize_time", QString("%1").arg( pSong->get_humanize_time_value() ) ); LocalFileMng::writeXmlString( songNode, "humanize_velocity", QString("%1").arg( pSong->get_humanize_velocity_value() ) ); LocalFileMng::writeXmlString( songNode, "swing_factor", QString("%1").arg( pSong->get_swing_factor() ) ); // component List QDomNode componentListNode = doc.createElement( "componentList" ); for (std::vector::iterator it = pSong->get_components()->begin() ; it != pSong->get_components()->end(); ++it) { DrumkitComponent* pCompo = *it; QDomNode componentNode = doc.createElement( "drumkitComponent" ); LocalFileMng::writeXmlString( componentNode, "id", QString("%1").arg( pCompo->get_id() ) ); LocalFileMng::writeXmlString( componentNode, "name", pCompo->get_name() ); LocalFileMng::writeXmlString( componentNode, "volume", QString("%1").arg( pCompo->get_volume() ) ); componentListNode.appendChild( componentNode ); } songNode.appendChild( componentListNode ); // instrument list QDomNode instrumentListNode = doc.createElement( "instrumentList" ); unsigned nInstrument = pSong->get_instrument_list()->size(); // INSTRUMENT NODE for ( unsigned i = 0; i < nInstrument; i++ ) { Instrument * pInstr = pSong->get_instrument_list()->get( i ); assert( pInstr ); QDomNode instrumentNode = doc.createElement( "instrument" ); LocalFileMng::writeXmlString( instrumentNode, "id", QString("%1").arg( pInstr->get_id() ) ); LocalFileMng::writeXmlString( instrumentNode, "name", pInstr->get_name() ); LocalFileMng::writeXmlString( instrumentNode, "drumkit", pInstr->get_drumkit_name() ); LocalFileMng::writeXmlString( instrumentNode, "volume", QString("%1").arg( pInstr->get_volume() ) ); LocalFileMng::writeXmlBool( instrumentNode, "isMuted", pInstr->is_muted() ); LocalFileMng::writeXmlString( instrumentNode, "pan_L", QString("%1").arg( pInstr->get_pan_l() ) ); LocalFileMng::writeXmlString( instrumentNode, "pan_R", QString("%1").arg( pInstr->get_pan_r() ) ); LocalFileMng::writeXmlString( instrumentNode, "gain", QString("%1").arg( pInstr->get_gain() ) ); LocalFileMng::writeXmlBool( instrumentNode, "applyVelocity", pInstr->get_apply_velocity() ); LocalFileMng::writeXmlBool( instrumentNode, "filterActive", pInstr->is_filter_active() ); LocalFileMng::writeXmlString( instrumentNode, "filterCutoff", QString("%1").arg( pInstr->get_filter_cutoff() ) ); LocalFileMng::writeXmlString( instrumentNode, "filterResonance", QString("%1").arg( pInstr->get_filter_resonance() ) ); LocalFileMng::writeXmlString( instrumentNode, "FX1Level", QString("%1").arg( pInstr->get_fx_level( 0 ) ) ); LocalFileMng::writeXmlString( instrumentNode, "FX2Level", QString("%1").arg( pInstr->get_fx_level( 1 ) ) ); LocalFileMng::writeXmlString( instrumentNode, "FX3Level", QString("%1").arg( pInstr->get_fx_level( 2 ) ) ); LocalFileMng::writeXmlString( instrumentNode, "FX4Level", QString("%1").arg( pInstr->get_fx_level( 3 ) ) ); assert( pInstr->get_adsr() ); LocalFileMng::writeXmlString( instrumentNode, "Attack", QString("%1").arg( pInstr->get_adsr()->get_attack() ) ); LocalFileMng::writeXmlString( instrumentNode, "Decay", QString("%1").arg( pInstr->get_adsr()->get_decay() ) ); LocalFileMng::writeXmlString( instrumentNode, "Sustain", QString("%1").arg( pInstr->get_adsr()->get_sustain() ) ); LocalFileMng::writeXmlString( instrumentNode, "Release", QString("%1").arg( pInstr->get_adsr()->get_release() ) ); LocalFileMng::writeXmlString( instrumentNode, "randomPitchFactor", QString("%1").arg( pInstr->get_random_pitch_factor() ) ); LocalFileMng::writeXmlString( instrumentNode, "muteGroup", QString("%1").arg( pInstr->get_mute_group() ) ); LocalFileMng::writeXmlBool( instrumentNode, "isStopNote", pInstr->is_stop_notes() ); switch ( pInstr->sample_selection_alg() ) { case Instrument::VELOCITY: LocalFileMng::writeXmlString( instrumentNode, "sampleSelectionAlgo", "VELOCITY" ); break; case Instrument::RANDOM: LocalFileMng::writeXmlString( instrumentNode, "sampleSelectionAlgo", "RANDOM" ); break; case Instrument::ROUND_ROBIN: LocalFileMng::writeXmlString( instrumentNode, "sampleSelectionAlgo", "ROUND_ROBIN" ); break; } LocalFileMng::writeXmlString( instrumentNode, "midiOutChannel", QString("%1").arg( pInstr->get_midi_out_channel() ) ); LocalFileMng::writeXmlString( instrumentNode, "midiOutNote", QString("%1").arg( pInstr->get_midi_out_note() ) ); LocalFileMng::writeXmlString( instrumentNode, "isHihat", QString("%1").arg( pInstr->get_hihat_grp() ) ); LocalFileMng::writeXmlString( instrumentNode, "lower_cc", QString("%1").arg( pInstr->get_lower_cc() ) ); LocalFileMng::writeXmlString( instrumentNode, "higher_cc", QString("%1").arg( pInstr->get_higher_cc() ) ); for (std::vector::iterator it = pInstr->get_components()->begin() ; it != pInstr->get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; QDomNode componentNode = doc.createElement( "instrumentComponent" ); LocalFileMng::writeXmlString( componentNode, "component_id", QString("%1").arg( pComponent->get_drumkit_componentID() ) ); LocalFileMng::writeXmlString( componentNode, "gain", QString("%1").arg( pComponent->get_gain() ) ); for ( unsigned nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { InstrumentLayer *pLayer = pComponent->get_layer( nLayer ); if ( pLayer == nullptr ) { continue; } Sample *pSample = pLayer->get_sample(); if ( pSample == nullptr ) { continue; } bool sIsModified = pSample->get_is_modified(); Sample::Loops lo = pSample->get_loops(); Sample::Rubberband ro = pSample->get_rubberband(); QString sMode = pSample->get_loop_mode_string(); QDomNode layerNode = doc.createElement( "layer" ); LocalFileMng::writeXmlString( layerNode, "filename", Filesystem::prepare_sample_path( pSample->get_filepath() ) ); LocalFileMng::writeXmlBool( layerNode, "ismodified", sIsModified); LocalFileMng::writeXmlString( layerNode, "smode", pSample->get_loop_mode_string() ); LocalFileMng::writeXmlString( layerNode, "startframe", QString("%1").arg( lo.start_frame ) ); LocalFileMng::writeXmlString( layerNode, "loopframe", QString("%1").arg( lo.loop_frame ) ); LocalFileMng::writeXmlString( layerNode, "loops", QString("%1").arg( lo.count ) ); LocalFileMng::writeXmlString( layerNode, "endframe", QString("%1").arg( lo.end_frame ) ); LocalFileMng::writeXmlString( layerNode, "userubber", QString("%1").arg( ro.use ) ); LocalFileMng::writeXmlString( layerNode, "rubberdivider", QString("%1").arg( ro.divider ) ); LocalFileMng::writeXmlString( layerNode, "rubberCsettings", QString("%1").arg( ro.c_settings ) ); LocalFileMng::writeXmlString( layerNode, "rubberPitch", QString("%1").arg( ro.pitch ) ); LocalFileMng::writeXmlString( layerNode, "min", QString("%1").arg( pLayer->get_start_velocity() ) ); LocalFileMng::writeXmlString( layerNode, "max", QString("%1").arg( pLayer->get_end_velocity() ) ); LocalFileMng::writeXmlString( layerNode, "gain", QString("%1").arg( pLayer->get_gain() ) ); LocalFileMng::writeXmlString( layerNode, "pitch", QString("%1").arg( pLayer->get_pitch() ) ); Sample::VelocityEnvelope* velocity = pSample->get_velocity_envelope(); for (int y = 0; y < velocity->size(); y++){ QDomNode volumeNode = doc.createElement( "volume" ); LocalFileMng::writeXmlString( volumeNode, "volume-position", QString("%1").arg( velocity->at(y)->frame ) ); LocalFileMng::writeXmlString( volumeNode, "volume-value", QString("%1").arg( velocity->at(y)->value ) ); layerNode.appendChild( volumeNode ); } Sample::PanEnvelope* pan = pSample->get_pan_envelope(); for (int y = 0; y < pan->size(); y++){ QDomNode panNode = doc.createElement( "pan" ); LocalFileMng::writeXmlString( panNode, "pan-position", QString("%1").arg( pan->at(y)->frame ) ); LocalFileMng::writeXmlString( panNode, "pan-value", QString("%1").arg( pan->at(y)->value ) ); layerNode.appendChild( panNode ); } componentNode.appendChild( layerNode ); } instrumentNode.appendChild( componentNode ); } instrumentListNode.appendChild( instrumentNode ); } songNode.appendChild( instrumentListNode ); // pattern list QDomNode patternListNode = doc.createElement( "patternList" ); unsigned nPatterns = pSong->get_pattern_list()->size(); for ( unsigned i = 0; i < nPatterns; i++ ) { const Pattern *pPattern = pSong->get_pattern_list()->get( i ); // pattern QDomNode patternNode = doc.createElement( "pattern" ); LocalFileMng::writeXmlString( patternNode, "name", pPattern->get_name() ); LocalFileMng::writeXmlString( patternNode, "category", pPattern->get_category() ); LocalFileMng::writeXmlString( patternNode, "size", QString("%1").arg( pPattern->get_length() ) ); LocalFileMng::writeXmlString( patternNode, "info", pPattern->get_info() ); QDomNode noteListNode = doc.createElement( "noteList" ); const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); QDomNode noteNode = doc.createElement( "note" ); LocalFileMng::writeXmlString( noteNode, "position", QString("%1").arg( pNote->get_position() ) ); LocalFileMng::writeXmlString( noteNode, "leadlag", QString("%1").arg( pNote->get_lead_lag() ) ); LocalFileMng::writeXmlString( noteNode, "velocity", QString("%1").arg( pNote->get_velocity() ) ); LocalFileMng::writeXmlString( noteNode, "pan_L", QString("%1").arg( pNote->get_pan_l() ) ); LocalFileMng::writeXmlString( noteNode, "pan_R", QString("%1").arg( pNote->get_pan_r() ) ); LocalFileMng::writeXmlString( noteNode, "pitch", QString("%1").arg( pNote->get_pitch() ) ); LocalFileMng::writeXmlString( noteNode, "probability", QString("%1").arg( pNote->get_probability() ) ); LocalFileMng::writeXmlString( noteNode, "key", pNote->key_to_string() ); LocalFileMng::writeXmlString( noteNode, "length", QString("%1").arg( pNote->get_length() ) ); LocalFileMng::writeXmlString( noteNode, "instrument", QString("%1").arg( pNote->get_instrument()->get_id() ) ); QString noteoff = "false"; if ( pNote->get_note_off() ) noteoff = "true"; LocalFileMng::writeXmlString( noteNode, "note_off", noteoff ); noteListNode.appendChild( noteNode ); } patternNode.appendChild( noteListNode ); patternListNode.appendChild( patternNode ); } songNode.appendChild( patternListNode ); QDomNode virtualPatternListNode = doc.createElement( "virtualPatternList" ); for ( unsigned i = 0; i < nPatterns; i++ ) { const Pattern *pat = pSong->get_pattern_list()->get( i ); // pattern if (pat->get_virtual_patterns()->empty() == false) { QDomNode patternNode = doc.createElement( "pattern" ); LocalFileMng::writeXmlString( patternNode, "name", pat->get_name() ); for (Pattern::virtual_patterns_it_t virtIter = pat->get_virtual_patterns()->begin(); virtIter != pat->get_virtual_patterns()->end(); ++virtIter) { LocalFileMng::writeXmlString( patternNode, "virtual", (*virtIter)->get_name() ); }//for virtualPatternListNode.appendChild( patternNode ); }//if }//for songNode.appendChild(virtualPatternListNode); // pattern sequence QDomNode patternSequenceNode = doc.createElement( "patternSequence" ); unsigned nPatternGroups = pSong->get_pattern_group_vector()->size(); for ( unsigned i = 0; i < nPatternGroups; i++ ) { QDomNode groupNode = doc.createElement( "group" ); PatternList *pList = ( *pSong->get_pattern_group_vector() )[i]; for ( unsigned j = 0; j < pList->size(); j++ ) { const Pattern *pPattern = pList->get( j ); LocalFileMng::writeXmlString( groupNode, "patternID", pPattern->get_name() ); } patternSequenceNode.appendChild( groupNode ); } songNode.appendChild( patternSequenceNode ); // LADSPA FX QDomNode ladspaFxNode = doc.createElement( "ladspa" ); for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) { QDomNode fxNode = doc.createElement( "fx" ); #ifdef H2CORE_HAVE_LADSPA LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); if ( pFX ) { LocalFileMng::writeXmlString( fxNode, "name", pFX->getPluginLabel() ); LocalFileMng::writeXmlString( fxNode, "filename", pFX->getLibraryPath() ); LocalFileMng::writeXmlBool( fxNode, "enabled", pFX->isEnabled() ); LocalFileMng::writeXmlString( fxNode, "volume", QString("%1").arg( pFX->getVolume() ) ); for ( unsigned nControl = 0; nControl < pFX->inputControlPorts.size(); nControl++ ) { LadspaControlPort *pControlPort = pFX->inputControlPorts[ nControl ]; QDomNode controlPortNode = doc.createElement( "inputControlPort" ); LocalFileMng::writeXmlString( controlPortNode, "name", pControlPort->sName ); LocalFileMng::writeXmlString( controlPortNode, "value", QString("%1").arg( pControlPort->fControlValue ) ); fxNode.appendChild( controlPortNode ); } for ( unsigned nControl = 0; nControl < pFX->outputControlPorts.size(); nControl++ ) { LadspaControlPort *pControlPort = pFX->inputControlPorts[ nControl ]; QDomNode controlPortNode = doc.createElement( "outputControlPort" ); LocalFileMng::writeXmlString( controlPortNode, "name", pControlPort->sName ); LocalFileMng::writeXmlString( controlPortNode, "value", QString("%1").arg( pControlPort->fControlValue ) ); fxNode.appendChild( controlPortNode ); } } #else if ( false ) { } #endif else { LocalFileMng::writeXmlString( fxNode, "name", QString( "no plugin" ) ); LocalFileMng::writeXmlString( fxNode, "filename", QString( "-" ) ); LocalFileMng::writeXmlBool( fxNode, "enabled", false ); LocalFileMng::writeXmlString( fxNode, "volume", "0.0" ); } ladspaFxNode.appendChild( fxNode ); } songNode.appendChild( ladspaFxNode ); doc.appendChild( songNode ); //bpm time line Timeline * pTimeline = Hydrogen::get_instance()->getTimeline(); QDomNode bpmTimeLine = doc.createElement( "BPMTimeLine" ); if(pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < static_cast(pTimeline->m_timelinevector.size()); t++){ QDomNode newBPMNode = doc.createElement( "newBPM" ); LocalFileMng::writeXmlString( newBPMNode, "BAR",QString("%1").arg( pTimeline->m_timelinevector[t].m_htimelinebeat )); LocalFileMng::writeXmlString( newBPMNode, "BPM", QString("%1").arg( pTimeline->m_timelinevector[t].m_htimelinebpm ) ); bpmTimeLine.appendChild( newBPMNode ); } } songNode.appendChild( bpmTimeLine ); //time line tag QDomNode timeLineTag = doc.createElement( "timeLineTag" ); if(pTimeline->m_timelinetagvector.size() >= 1 ){ for ( int t = 0; t < static_cast(pTimeline->m_timelinetagvector.size()); t++){ QDomNode newTAGNode = doc.createElement( "newTAG" ); LocalFileMng::writeXmlString( newTAGNode, "BAR",QString("%1").arg( pTimeline->m_timelinetagvector[t].m_htimelinetagbeat )); LocalFileMng::writeXmlString( newTAGNode, "TAG", QString("%1").arg( pTimeline->m_timelinetagvector[t].m_htimelinetag ) ); timeLineTag.appendChild( newTAGNode ); } } songNode.appendChild( timeLineTag ); // Automation Paths QDomNode automationPathsTag = doc.createElement( "automationPaths" ); AutomationPath *pPath = pSong->get_velocity_automation_path(); if (pPath) { QDomElement pathNode = doc.createElement("path"); pathNode.setAttribute("adjust", "velocity"); AutomationPathSerializer serializer; serializer.write_automation_path(pathNode, *pPath); automationPathsTag.appendChild(pathNode); } songNode.appendChild( automationPathsTag ); QFile file(filename); if ( !file.open(QIODevice::WriteOnly) ) { rv = 1; } QTextStream TextStream( &file ); doc.save( TextStream, 1 ); if( file.size() == 0) { rv = 1; } file.close(); if( rv ) { WARNINGLOG("File save reported an error."); } else { pSong->set_is_modified( false ); INFOLOG("Save was successful."); } pSong->set_filename( filename ); return rv; } }; hydrogen-1.0.0-rc1/src/core/src/logger.cpp000066400000000000000000000137321366722712400203230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/logger.h" #include #include #include #ifdef WIN32 #include #define LOGGER_SLEEP Sleep( 100 ) #else #include #define LOGGER_SLEEP do { usleep( 500000 ); usleep( 500000 ); } while (0) #endif namespace H2Core { unsigned Logger::__bit_msk = 0; Logger* Logger::__instance=nullptr; const char* Logger::__levels[] = { "None", "Error", "Warning", "Info", "Debug" }; pthread_t loggerThread; void* loggerThread_func( void* param ) { if ( param == nullptr ) return nullptr; Logger* logger = ( Logger* )param; #ifdef WIN32 # ifdef H2CORE_HAVE_DEBUG ::AllocConsole(); // ::SetConsoleTitle( "Hydrogen debug log" ); freopen( "CONOUT$", "wt", stdout ); # endif #endif FILE* log_file = nullptr; if ( logger->__use_file ) { #ifdef Q_OS_MACX QString sLogFilename = QDir::homePath().append( "/Library/Hydrogen/hydrogen.log" ); #else QString sLogFilename = QDir::homePath().append( "/.hydrogen/hydrogen.log" ); #endif log_file = fopen( sLogFilename.toLocal8Bit(), "w" ); if ( log_file ) { fprintf( log_file, "Start logger" ); } else { fprintf( stderr, "Error: can't open log file for writing...\n" ); } } Logger::queue_t* queue = &logger->__msg_queue; Logger::queue_t::iterator it, last; //QString tmpString; while ( logger->__running ) { LOGGER_SLEEP; if( !queue->empty() ) { for( it = last = queue->begin() ; it != queue->end() ; ++it ) { last = it; fprintf( stdout, "%s", it->toLocal8Bit().data() ); if( log_file ) { fprintf( log_file, "%s", it->toLocal8Bit().data() ); fflush( log_file ); } } // remove all in front of last queue->erase( queue->begin(), last ); // lock before removing last pthread_mutex_lock( &logger->__mutex ); queue->pop_front(); pthread_mutex_unlock( &logger->__mutex ); } } if ( log_file ) { fprintf( log_file, "Stop logger" ); fclose( log_file ); } #ifdef WIN32 ::FreeConsole(); #endif LOGGER_SLEEP; pthread_exit( nullptr ); return nullptr; } Logger* Logger::bootstrap( unsigned msk ) { Logger::set_bit_mask( msk ); return Logger::create_instance(); } Logger* Logger::create_instance() { if ( __instance == nullptr ) __instance = new Logger; return __instance; } Logger::Logger() : __use_file( false ), __running( true ) { __instance = this; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_mutex_init( &__mutex, nullptr ); pthread_create( &loggerThread, &attr, loggerThread_func, this ); } Logger::~Logger() { __running = false; pthread_join( loggerThread, nullptr ); } void Logger::log( unsigned level, const QString& class_name, const char* func_name, const QString& msg ) { if( level == None ){ return; } const char* prefix[] = { "", "(E) ", "(W) ", "(I) ", "(D) " }; #ifdef WIN32 const char* color[] = { "", "", "", "", "" }; #else const char* color[] = { "", "\033[31m", "\033[36m", "\033[32m", "\033[35m" }; #endif // WIN32 int i; switch( level ) { case Error: i = 1; break; case Warning: i = 2; break; case Info: i = 3; break; case Debug: i = 4; break; default: i = 0; break; } QString tmp = QString( "%1%2%3::%4 %5\033[0m\n" ) .arg( color[i] ) .arg( prefix[i] ) .arg( class_name ) .arg( func_name ) .arg( msg ); pthread_mutex_lock( &__mutex ); __msg_queue.push_back( tmp ); pthread_mutex_unlock( &__mutex ); } unsigned Logger::parse_log_level( const char* level ) { unsigned log_level = Logger::None; if( 0 == strncasecmp( level, __levels[0], sizeof( __levels[0] ) ) ) { log_level = Logger::None; } else if ( 0 == strncasecmp( level, __levels[1], sizeof( __levels[1] ) ) ) { log_level = Logger::Error; } else if ( 0 == strncasecmp( level, __levels[2], sizeof( __levels[2] ) ) ) { log_level = Logger::Error | Logger::Warning; } else if ( 0 == strncasecmp( level, __levels[3], sizeof( __levels[3] ) ) ) { log_level = Logger::Error | Logger::Warning | Logger::Info; } else if ( 0 == strncasecmp( level, __levels[4], sizeof( __levels[4] ) ) ) { log_level = Logger::Error | Logger::Warning | Logger::Info | Logger::Debug; } else { #ifdef HAVE_SSCANF int val = sscanf( level,"%x",&log_level ); if( val != 1 ) { log_level = Logger::Error; } #else int log_level = hextoi( level, -1 ); if( log_level==-1 ) { log_level = Logger::Error; } #endif } return log_level; } #ifndef HAVE_SSCANF int Logger::hextoi( const char* str, long len ) { long pos = 0; char c = 0; int v = 0; int res = 0; bool leading_zero = false; while( 1 ) { if( ( len!=-1 ) && ( pos>=len ) ) { break; } c = str[pos]; if( c==0 ) { break; } else if( c=='x' || c=='X' ) { if ( ( pos==1 ) && leading_zero ) { assert( res == 0 ); pos++; continue; } else { return -1; } } else if( c>='a' ) { v = c-'a'+10; } else if( c>='A' ) { v = c-'A'+10; } else if( c>='0' ) { if ( ( c=='0' ) && ( pos==0 ) ) { leading_zero = true; } v = c-'0'; } else { return -1; } if( v>15 ) { return -1; } //assert( v == (v & 0xF) ); res = ( res << 4 ) | v; assert( ( res & 0xF ) == ( v & 0xF ) ); pos++; } return res; } #endif // HAVE_SSCANF }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/midi_action.cpp000066400000000000000000000735101366722712400213230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include #include #include #include // #include #include using namespace H2Core; /** * @class MidiAction * * @brief This class represents a midi action. * * This class represents actions which can be executed * after a midi event occurred. An example is the "MUTE" * action, which mutes the outputs of hydrogen. * * An action can be linked to an event. If this event occurs, * the action gets triggered. The handling of events takes place * in midi_input.cpp . * * Each action has two independent parameters. The two parameters are optional and * can be used to carry additional information, which mean * only something to this very Action. They can have totally different meanings for other Actions. * Example: parameter1 is the Mixer strip and parameter 2 a multiplier for the volume change on this strip * * @author Sebastian Moors * */ const char* Action::__class_name = "MidiAction"; Action::Action( QString typeString ) : Object( __class_name ) { type = typeString; QString parameter1 = "0"; QString parameter2 = "0" ; } /** * @class MidiActionManager * * @brief The MidiActionManager cares for the execution of MidiActions * * * The MidiActionManager handles the execution of midi actions. The class * includes the names and implementations of all possible actions. * * * @author Sebastian Moors * */ MidiActionManager* MidiActionManager::__instance = nullptr; const char* MidiActionManager::__class_name = "ActionManager"; MidiActionManager::MidiActionManager() : Object( __class_name ) { __instance = this; m_nLastBpmChangeCCParameter = -1; /* the actionMap holds all Action identifiers which hydrogen is able to interpret. it holds pointer to member function */ targeted_element empty = {0,0}; actionMap.insert(make_pair("PLAY", make_pair(&MidiActionManager::play, empty))); actionMap.insert(make_pair("PLAY/STOP_TOGGLE", make_pair(&MidiActionManager::play_stop_pause_toggle, empty))); actionMap.insert(make_pair("PLAY/PAUSE_TOGGLE", make_pair(&MidiActionManager::play_stop_pause_toggle, empty))); actionMap.insert(make_pair("STOP", make_pair(&MidiActionManager::stop, empty))); actionMap.insert(make_pair("PAUSE", make_pair(&MidiActionManager::pause, empty))); actionMap.insert(make_pair("RECORD_READY", make_pair(&MidiActionManager::record_ready, empty))); actionMap.insert(make_pair("RECORD/STROBE_TOGGLE", make_pair(&MidiActionManager::record_strobe_toggle, empty))); actionMap.insert(make_pair("RECORD_STROBE", make_pair(&MidiActionManager::record_strobe, empty))); actionMap.insert(make_pair("RECORD_EXIT", make_pair(&MidiActionManager::record_exit, empty))); actionMap.insert(make_pair("MUTE", make_pair(&MidiActionManager::mute, empty))); actionMap.insert(make_pair("UNMUTE", make_pair(&MidiActionManager::unmute, empty))); actionMap.insert(make_pair("MUTE_TOGGLE", make_pair(&MidiActionManager::mute_toggle, empty))); actionMap.insert(make_pair("STRIP_MUTE_TOGGLE", make_pair(&MidiActionManager::strip_mute_toggle, empty))); actionMap.insert(make_pair("STRIP_SOLO_TOGGLE", make_pair(&MidiActionManager::strip_solo_toggle, empty))); actionMap.insert(make_pair(">>_NEXT_BAR", make_pair(&MidiActionManager::next_bar, empty))); actionMap.insert(make_pair("<<_PREVIOUS_BAR", make_pair(&MidiActionManager::previous_bar, empty))); actionMap.insert(make_pair("BPM_INCR", make_pair(&MidiActionManager::bpm_increase, empty))); actionMap.insert(make_pair("BPM_DECR", make_pair(&MidiActionManager::bpm_decrease, empty))); actionMap.insert(make_pair("BPM_CC_RELATIVE", make_pair(&MidiActionManager::bpm_cc_relative, empty))); actionMap.insert(make_pair("BPM_FINE_CC_RELATIVE", make_pair(&MidiActionManager::bpm_fine_cc_relative, empty))); actionMap.insert(make_pair("MASTER_VOLUME_RELATIVE", make_pair(&MidiActionManager::master_volume_relative, empty))); actionMap.insert(make_pair("MASTER_VOLUME_ABSOLUTE", make_pair(&MidiActionManager::master_volume_absolute, empty))); actionMap.insert(make_pair("STRIP_VOLUME_RELATIVE", make_pair(&MidiActionManager::strip_volume_relative, empty))); actionMap.insert(make_pair("STRIP_VOLUME_ABSOLUTE", make_pair(&MidiActionManager::strip_volume_absolute, empty))); for(int i = 0; i < MAX_FX; ++i) { targeted_element effect = {i,0}; ostringstream toChar; toChar << (i+1); string keyAbsolute("EFFECT"); string keyRelative("EFFECT"); keyAbsolute += toChar.str(); keyRelative += toChar.str(); keyAbsolute += "_LEVEL_ABSOLUTE"; keyRelative += "_LEVEL_RELATIVE"; actionMap.insert(make_pair(keyAbsolute, make_pair(&MidiActionManager::effect_level_absolute, effect))); actionMap.insert(make_pair(keyRelative, make_pair(&MidiActionManager::effect_level_relative, effect))); } for(int i = 0; i < MAX_COMPONENTS; ++i) { ostringstream componentToChar; componentToChar << (i+1); for(int j = 0; j < InstrumentComponent::getMaxLayers(); ++j ) { targeted_element sample = {i,j}; ostringstream toChar; toChar << (j+1); string keyGain("GAIN_C"); string keyPitch("PITCH_C"); keyGain += componentToChar.str(); keyPitch += componentToChar.str(); keyGain += "_L"; keyPitch += "_L"; keyGain += toChar.str(); keyPitch += toChar.str(); keyGain += "_LEVEL_ABSOLUTE"; keyPitch += "_LEVEL_ABSOLUTE"; actionMap.insert(make_pair(keyGain, make_pair(&MidiActionManager::gain_level_absolute, sample))); actionMap.insert(make_pair(keyPitch, make_pair(&MidiActionManager::pitch_level_absolute, sample))); } } actionMap.insert(make_pair("SELECT_NEXT_PATTERN", make_pair(&MidiActionManager::select_next_pattern, empty))); actionMap.insert(make_pair("SELECT_ONLY_NEXT_PATTERN", make_pair(&MidiActionManager::select_only_next_pattern, empty))); actionMap.insert(make_pair("SELECT_NEXT_PATTERN_CC_ABSOLUTE", make_pair(&MidiActionManager::select_next_pattern_cc_absolute, empty))); actionMap.insert(make_pair("SELECT_NEXT_PATTERN_PROMPTLY", make_pair(&MidiActionManager::select_next_pattern_promptly, empty))); actionMap.insert(make_pair("SELECT_NEXT_PATTERN_RELATIVE", make_pair(&MidiActionManager::select_next_pattern_relative, empty))); actionMap.insert(make_pair("SELECT_AND_PLAY_PATTERN", make_pair(&MidiActionManager::select_and_play_pattern, empty))); actionMap.insert(make_pair("PAN_RELATIVE", make_pair(&MidiActionManager::pan_relative, empty))); actionMap.insert(make_pair("PAN_ABSOLUTE", make_pair(&MidiActionManager::pan_absolute, empty))); actionMap.insert(make_pair("FILTER_CUTOFF_LEVEL_ABSOLUTE", make_pair(&MidiActionManager::filter_cutoff_level_absolute, empty))); actionMap.insert(make_pair("BEATCOUNTER", make_pair(&MidiActionManager::beatcounter, empty))); actionMap.insert(make_pair("TAP_TEMPO", make_pair(&MidiActionManager::tap_tempo, empty))); actionMap.insert(make_pair("PLAYLIST_SONG", make_pair(&MidiActionManager::playlist_song, empty))); actionMap.insert(make_pair("PLAYLIST_NEXT_SONG", make_pair(&MidiActionManager::playlist_next_song, empty))); actionMap.insert(make_pair("PLAYLIST_PREV_SONG", make_pair(&MidiActionManager::playlist_previous_song, empty))); actionMap.insert(make_pair("TOGGLE_METRONOME", make_pair(&MidiActionManager::toggle_metronome, empty))); actionMap.insert(make_pair("SELECT_INSTRUMENT", make_pair(&MidiActionManager::select_instrument, empty))); actionMap.insert(make_pair("UNDO_ACTION", make_pair(&MidiActionManager::undo_action, empty))); actionMap.insert(make_pair("REDO_ACTION", make_pair(&MidiActionManager::redo_action, empty))); /* the actionList holds all Action identfiers which hydrogen is able to interpret. */ actionList <<""; for(map >::const_iterator actionIterator = actionMap.begin(); actionIterator != actionMap.end(); ++actionIterator) { actionList << actionIterator->first.c_str(); } eventList << "" << "MMC_PLAY" << "MMC_DEFERRED_PLAY" << "MMC_STOP" << "MMC_FAST_FORWARD" << "MMC_REWIND" << "MMC_RECORD_STROBE" << "MMC_RECORD_EXIT" << "MMC_RECORD_READY" << "MMC_PAUSE" << "NOTE" << "CC" << "PROGRAM_CHANGE"; } MidiActionManager::~MidiActionManager() { //INFOLOG( "ActionManager delete" ); __instance = nullptr; } void MidiActionManager::create_instance() { if ( __instance == nullptr ) { __instance = new MidiActionManager; } } bool MidiActionManager::play(Action * , Hydrogen* pEngine, targeted_element ) { int nState = pEngine->getState(); if ( nState == STATE_READY ) { pEngine->sequencer_play(); } return true; } bool MidiActionManager::pause(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->sequencer_stop(); return true; } bool MidiActionManager::stop(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->sequencer_stop(); pEngine->setPatternPos( 0 ); pEngine->setTimelineBpm(); return true; } bool MidiActionManager::play_stop_pause_toggle(Action * pAction, Hydrogen* pEngine, targeted_element ) { QString sActionString = pAction->getType(); int nState = pEngine->getState(); switch ( nState ) { case STATE_READY: pEngine->sequencer_play(); break; case STATE_PLAYING: if( sActionString == "PLAY/STOP_TOGGLE" ) { pEngine->setPatternPos( 0 ); } pEngine->sequencer_stop(); pEngine->setTimelineBpm(); break; default: ERRORLOG( "[Hydrogen::ActionManager(PLAY): Unhandled case" ); break; } return true; } //mutes the master, not a single strip bool MidiActionManager::mute(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->getCoreActionController()->setMasterIsMuted( true ); return true; } bool MidiActionManager::unmute(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->getCoreActionController()->setMasterIsMuted( false ); return true; } bool MidiActionManager::mute_toggle(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->getCoreActionController()->setMasterIsMuted( !Hydrogen::get_instance()->getSong()->__is_muted ); return true; } bool MidiActionManager::strip_mute_toggle(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; bool bSucccess = true; int nLine = pAction->getParameter1().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( pInstrList->is_valid_index( nLine ) ) { Instrument *pInstr = pInstrList->get( nLine ); if ( pInstr ) { pEngine->getCoreActionController()->setStripIsMuted( nLine, !pInstr->is_muted() ); } else { bSucccess = false; } } else { bSucccess = false; } return bSucccess; } bool MidiActionManager::strip_solo_toggle(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; bool bSucccess = true; int nLine = pAction->getParameter1().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( pInstrList->is_valid_index( nLine ) ) { Instrument *pInstr = pInstrList->get( nLine ); if ( pInstr ) { pEngine->getCoreActionController()->setStripIsSoloed( nLine, !pInstr->is_soloed() ); } else { bSucccess = false; } } else { bSucccess = false; } return bSucccess; } bool MidiActionManager::beatcounter(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->handleBeatCounter(); return true; } bool MidiActionManager::tap_tempo(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->onTapTempoAccelEvent(); return true; } bool MidiActionManager::select_next_pattern(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int row = pAction->getParameter1().toInt(&ok,10); if( row > pEngine->getSong()->get_pattern_list()->size() -1 ) { return false; } if(Preferences::get_instance()->patternModePlaysSelected()) { pEngine->setSelectedPatternNumber( row ); } else { pEngine->sequencer_setNextPattern( row ); } return true; } bool MidiActionManager::select_only_next_pattern(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int row = pAction->getParameter1().toInt(&ok,10); if( row > pEngine->getSong()->get_pattern_list()->size() -1 ) { return false; } if(Preferences::get_instance()->patternModePlaysSelected()) { return true; } pEngine->sequencer_setOnlyNextPattern( row ); return true; } bool MidiActionManager::select_next_pattern_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; if(!Preferences::get_instance()->patternModePlaysSelected()) { return true; } int row = pEngine->getSelectedPatternNumber() + pAction->getParameter1().toInt(&ok,10); if( row > pEngine->getSong()->get_pattern_list()->size() -1 ) { return false; } pEngine->setSelectedPatternNumber( row ); return true; } bool MidiActionManager::select_next_pattern_cc_absolute(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int row = pAction->getParameter2().toInt(&ok,10); if( row > pEngine->getSong()->get_pattern_list()->size() -1 ) { return false; } if(Preferences::get_instance()->patternModePlaysSelected()) { pEngine->setSelectedPatternNumber( row ); } else { return true;// only usefully in normal pattern mode } return true; } // obsolete, use SELECT_NEXT_PATTERN_CC_ABSOLUT instead bool MidiActionManager::select_next_pattern_promptly(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int row = pAction->getParameter2().toInt(&ok,10); pEngine->setSelectedPatternNumberWithoutGuiEvent( row ); return true; } bool MidiActionManager::select_and_play_pattern(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int row = pAction->getParameter1().toInt(&ok,10); pEngine->setSelectedPatternNumber( row ); pEngine->sequencer_setNextPattern( row ); int nState = pEngine->getState(); if ( nState == STATE_READY ) { pEngine->sequencer_play(); } return true; } bool MidiActionManager::select_instrument(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int instrument_number = pAction->getParameter2().toInt(&ok,10) ; if ( pEngine->getSong()->get_instrument_list()->size() < instrument_number ) { instrument_number = pEngine->getSong()->get_instrument_list()->size() -1; } pEngine->setSelectedInstrumentNumber( instrument_number ); return true; } bool MidiActionManager::effect_level_absolute(Action * pAction, Hydrogen* pEngine, targeted_element nEffect) { bool ok; bool bSuccess = true; int nLine = pAction->getParameter1().toInt(&ok,10); int fx_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( pInstrList->is_valid_index( nLine) ) { Instrument *pInstr = pInstrList->get( nLine ); if ( pInstr ) { if( fx_param != 0 ) { pInstr->set_fx_level( ( (float) (fx_param / 127.0 ) ), nEffect._id ); } else { pInstr->set_fx_level( 0 , nEffect._id ); } pEngine->setSelectedInstrumentNumber( nLine ); } else { bSuccess = false; } } return bSuccess; } bool MidiActionManager::effect_level_relative(Action * , Hydrogen* , targeted_element ) { //empty ? return true; } //sets the volume of a master output to a given level (percentage) bool MidiActionManager::master_volume_absolute(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int vol_param = pAction->getParameter2().toInt(&ok,10); Song *song = pEngine->getSong(); if( vol_param != 0 ){ song->set_volume( 1.5* ( (float) (vol_param / 127.0 ) )); } else { song->set_volume( 0 ); } return true; } //increments/decrements the volume of the whole song bool MidiActionManager::master_volume_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int vol_param = pAction->getParameter2().toInt(&ok,10); Song *song = pEngine->getSong(); if( vol_param != 0 ) { if ( vol_param == 1 && song->get_volume() < 1.5 ) { song->set_volume( song->get_volume() + 0.05 ); } else { if( song->get_volume() >= 0.0 ) { song->set_volume( song->get_volume() - 0.05 ); } } } else { song->set_volume( 0 ); } return true; } //sets the volume of a mixer strip to a given level (percentage) bool MidiActionManager::strip_volume_absolute(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int vol_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( pInstrList->is_valid_index( nLine) ) { Instrument *pInstr = pInstrList->get( nLine ); if ( pInstr == nullptr) { return false; } if( vol_param != 0 ) { pInstr->set_volume( 1.5* ( (float) (vol_param / 127.0 ) )); } else { pInstr->set_volume( 0 ); } pEngine->setSelectedInstrumentNumber(nLine); } return true; } //increments/decrements the volume of one mixer strip bool MidiActionManager::strip_volume_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int vol_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if ( pInstrList->is_valid_index( nLine) ) { Instrument *pInstr = pInstrList->get( nLine ); if ( pInstr == nullptr) { return false; } if( vol_param != 0 ) { if ( vol_param == 1 && pInstr->get_volume() < 1.5 ) { pInstr->set_volume( pInstr->get_volume() + 0.1 ); } else { if( pInstr->get_volume() >= 0.0 ){ pInstr->set_volume( pInstr->get_volume() - 0.1 ); } } } else { pInstr->set_volume( 0 ); } pEngine->setSelectedInstrumentNumber(nLine); } return true; } // sets the absolute panning of a given mixer channel bool MidiActionManager::pan_absolute(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int pan_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if( pInstrList->is_valid_index( nLine ) ) { float pan_L; float pan_R; pEngine->setSelectedInstrumentNumber( nLine ); Instrument *pInstr = pInstrList->get( nLine ); if( pInstr == nullptr ) { return false; } pan_L = pInstr->get_pan_l(); pan_R = pInstr->get_pan_r(); // pan float fPanValue = 0.0; if (pan_R == 1.0) { fPanValue = 1.0 - (pan_L / 2.0); } else { fPanValue = pan_R / 2.0; } fPanValue = 1 * ( ((float) pan_param) / 127.0 ); if (fPanValue >= 0.5) { pan_L = (1.0 - fPanValue) * 2; pan_R = 1.0; } else { pan_L = 1.0; pan_R = fPanValue * 2; } pInstr->set_pan_l( pan_L ); pInstr->set_pan_r( pan_R ); pEngine->setSelectedInstrumentNumber(nLine); } return true; } // changes the panning of a given mixer channel // this is useful if the panning is set by a rotary control knob bool MidiActionManager::pan_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int pan_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if( pInstrList->is_valid_index( nLine ) ) { float pan_L; float pan_R; pEngine->setSelectedInstrumentNumber( nLine ); Instrument *pInstr = pInstrList->get( nLine ); if( pInstr == nullptr ) { return false; } pan_L = pInstr->get_pan_l(); pan_R = pInstr->get_pan_r(); // pan float fPanValue = 0.0; if (pan_R == 1.0) { fPanValue = 1.0 - (pan_L / 2.0); } else { fPanValue = pan_R / 2.0; } if( pan_param == 1 && fPanValue < 1 ) { fPanValue += 0.05; } if( pan_param != 1 && fPanValue > 0 ) { fPanValue -= 0.05; } if (fPanValue >= 0.5) { pan_L = (1.0 - fPanValue) * 2; pan_R = 1.0; } else { pan_L = 1.0; pan_R = fPanValue * 2; } pInstr->set_pan_l( pan_L ); pInstr->set_pan_r( pan_R ); pEngine->setSelectedInstrumentNumber(nLine); } return true; } bool MidiActionManager::gain_level_absolute(Action * pAction, Hydrogen* pEngine, targeted_element nSample) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int gain_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if( pInstrList->is_valid_index( nLine ) ) { Instrument *pInstr = pInstrList->get( nLine ); if( pInstr == nullptr ) { return false; } InstrumentComponent* pComponent = pInstr->get_component( nSample._id ); if( pComponent == nullptr) { return false; } InstrumentLayer* pLayer = pComponent->get_layer( nSample._subId ); if( pLayer == nullptr ) { return false; } if( gain_param != 0 ) { pLayer->set_gain( 5.0* ( (float) (gain_param / 127.0 ) ) ); } else { pLayer->set_gain( 0 ); } pEngine->setSelectedInstrumentNumber( nLine ); pEngine->refreshInstrumentParameters( nLine ); } return true; } bool MidiActionManager::pitch_level_absolute(Action * pAction, Hydrogen* pEngine, targeted_element nSample) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int pitch_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if( pInstrList->is_valid_index( nLine ) ) { Instrument *pInstr = pInstrList->get( nLine ); if( pInstr == nullptr ) { return false; } InstrumentComponent* pComponent = pInstr->get_component( nSample._id ); if( pComponent == nullptr) { return false; } InstrumentLayer* pLayer = pComponent->get_layer( nSample._subId ); if( pLayer == nullptr ) { return false; } if( pitch_param != 0 ){ pLayer->set_pitch( 49* ( (float) (pitch_param / 127.0 ) ) -24.5 ); } else { pLayer->set_pitch( -24.5 ); } pEngine->setSelectedInstrumentNumber( nLine ); pEngine->refreshInstrumentParameters( nLine ); } return true; } bool MidiActionManager::filter_cutoff_level_absolute(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int nLine = pAction->getParameter1().toInt(&ok,10); int filter_cutoff_param = pAction->getParameter2().toInt(&ok,10); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); if( pInstrList->is_valid_index( nLine ) ) { Instrument *pInstr = pInstrList->get( nLine ); if( pInstr == nullptr ) { return false; } pInstr->set_filter_active( true ); if( filter_cutoff_param != 0 ) { pInstr->set_filter_cutoff( ( (float) (filter_cutoff_param / 127.0 ) ) ); } else { pInstr->set_filter_cutoff( 0 ); } pEngine->setSelectedInstrumentNumber( nLine ); pEngine->refreshInstrumentParameters( nLine ); } return true; } /* * increments/decrements the BPM * this is useful if the bpm is set by a rotary control knob */ bool MidiActionManager::bpm_cc_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); //this Action should be triggered only by CC commands bool ok; int mult = pAction->getParameter1().toInt(&ok,10); //this value should be 1 to decrement and something other then 1 to increment the bpm int cc_param = pAction->getParameter2().toInt(&ok,10); if( m_nLastBpmChangeCCParameter == -1) { m_nLastBpmChangeCCParameter = cc_param; } Song* pSong = pEngine->getSong(); if ( m_nLastBpmChangeCCParameter >= cc_param && pSong->__bpm < 300) { pEngine->setBPM( pSong->__bpm - 1*mult ); } if ( m_nLastBpmChangeCCParameter < cc_param && pSong->__bpm > 40 ) { pEngine->setBPM( pSong->__bpm + 1*mult ); } m_nLastBpmChangeCCParameter = cc_param; AudioEngine::get_instance()->unlock(); return true; } /* * increments/decrements the BPM * this is useful if the bpm is set by a rotary control knob */ bool MidiActionManager::bpm_fine_cc_relative(Action * pAction, Hydrogen* pEngine, targeted_element ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); //this Action should be triggered only by CC commands bool ok; int mult = pAction->getParameter1().toInt(&ok,10); //this value should be 1 to decrement and something other then 1 to increment the bpm int cc_param = pAction->getParameter2().toInt(&ok,10); if( m_nLastBpmChangeCCParameter == -1) { m_nLastBpmChangeCCParameter = cc_param; } Song* pSong = pEngine->getSong(); if ( m_nLastBpmChangeCCParameter >= cc_param && pSong->__bpm < 300) { pEngine->setBPM( pSong->__bpm - 0.01*mult ); } if ( m_nLastBpmChangeCCParameter < cc_param && pSong->__bpm > 40 ) { pEngine->setBPM( pSong->__bpm + 0.01*mult ); } m_nLastBpmChangeCCParameter = cc_param; AudioEngine::get_instance()->unlock(); return true; } bool MidiActionManager::bpm_increase(Action * pAction, Hydrogen* pEngine, targeted_element ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); bool ok; int mult = pAction->getParameter1().toInt(&ok,10); Song* pSong = pEngine->getSong(); if (pSong->__bpm < 300) { pEngine->setBPM( pSong->__bpm + 1*mult ); } AudioEngine::get_instance()->unlock(); EventQueue::get_instance()->push_event( EVENT_TEMPO_CHANGED, -1 ); return true; } bool MidiActionManager::bpm_decrease(Action * pAction, Hydrogen* pEngine, targeted_element ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); bool ok; int mult = pAction->getParameter1().toInt(&ok,10); Song* pSong = pEngine->getSong(); if (pSong->__bpm > 40 ) { pEngine->setBPM( pSong->__bpm - 1*mult ); } AudioEngine::get_instance()->unlock(); EventQueue::get_instance()->push_event( EVENT_TEMPO_CHANGED, -1 ); return true; } bool MidiActionManager::next_bar(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->setPatternPos(pEngine->getPatternPos() +1 ); pEngine->setTimelineBpm(); return true; } bool MidiActionManager::previous_bar(Action * , Hydrogen* pEngine, targeted_element ) { pEngine->setPatternPos(pEngine->getPatternPos() -1 ); pEngine->setTimelineBpm(); return true; } bool setSong( int songnumber, Hydrogen * pEngine ) { int asn = Playlist::get_instance()->getActiveSongNumber(); if(asn != songnumber && songnumber >= 0 && songnumber <= Playlist::get_instance()->size() - 1 ) { Playlist::get_instance()->setNextSongByNumber( songnumber ); } return true; } bool MidiActionManager::playlist_song(Action * pAction, Hydrogen* pEngine, targeted_element ) { bool ok; int songnumber = pAction->getParameter1().toInt(&ok,10); return setSong( songnumber, pEngine ); } bool MidiActionManager::playlist_next_song(Action * pAction, Hydrogen* pEngine, targeted_element ) { int songnumber = Playlist::get_instance()->getActiveSongNumber(); return setSong( ++songnumber, pEngine ); } bool MidiActionManager::playlist_previous_song(Action * pAction, Hydrogen* pEngine, targeted_element ) { int songnumber = Playlist::get_instance()->getActiveSongNumber(); return setSong( --songnumber, pEngine ); } bool MidiActionManager::record_ready(Action * pAction, Hydrogen* pEngine, targeted_element ) { if ( pEngine->getState() != STATE_PLAYING ) { if (!Preferences::get_instance()->getRecordEvents()) { Preferences::get_instance()->setRecordEvents(true); } else { Preferences::get_instance()->setRecordEvents(false); } } return true; } bool MidiActionManager::record_strobe_toggle(Action * , Hydrogen* , targeted_element ) { if (!Preferences::get_instance()->getRecordEvents()) { Preferences::get_instance()->setRecordEvents(true); } else { Preferences::get_instance()->setRecordEvents(false); } return true; } bool MidiActionManager::record_strobe(Action * , Hydrogen* , targeted_element ) { if (!Preferences::get_instance()->getRecordEvents()) { Preferences::get_instance()->setRecordEvents(true); } return true; } bool MidiActionManager::record_exit(Action * , Hydrogen* , targeted_element ) { if (Preferences::get_instance()->getRecordEvents()) { Preferences::get_instance()->setRecordEvents(false); } return true; } bool MidiActionManager::toggle_metronome(Action * , Hydrogen* , targeted_element ) { Preferences::get_instance()->m_bUseMetronome = !Preferences::get_instance()->m_bUseMetronome; return true; } bool MidiActionManager::undo_action(Action * , Hydrogen* , targeted_element ) { EventQueue::get_instance()->push_event( EVENT_UNDO_REDO, 0);// 0 = undo return true; } bool MidiActionManager::redo_action(Action * , Hydrogen* , targeted_element ) { EventQueue::get_instance()->push_event( EVENT_UNDO_REDO, 1);// 1 = redo return true; } bool MidiActionManager::handleAction( Action * pAction ) { Hydrogen *pEngine = Hydrogen::get_instance(); /* return false if action is null (for example if no Action exists for an event) */ if( pAction == nullptr ) { return false; } QString sActionString = pAction->getType(); map >::const_iterator foundAction = actionMap.find(sActionString.toStdString()); if( foundAction != actionMap.end() ) { action_f action = foundAction->second.first; targeted_element nElement = foundAction->second.second; return (this->*action)(pAction, pEngine, nElement); } return false; } hydrogen-1.0.0-rc1/src/core/src/midi_map.cpp000066400000000000000000000117631366722712400206250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 /** * @class MidiMap * * @brief The MidiMap maps MidiActions to MidiEvents * * * The MidiMap stores the mapping between midi events * and midi actions. Each event relates to at most 1 * midi action. Several events can relate to the same action. * Midi events are note, mmc or cc messages. * * * @author Sebastian Moors * */ MidiMap * MidiMap::__instance = nullptr; const char* MidiMap::__class_name = "MidiMap"; MidiMap::MidiMap() : Object( __class_name ) { __instance = this; QMutexLocker mx(&__mutex); //constructor for(int note = 0; note < 128; note++ ) { __note_array[ note ] = new Action("NOTHING"); __cc_array[ note ] = new Action("NOTHING"); } __pc_action = new Action("NOTHING"); } MidiMap::~MidiMap() { QMutexLocker mx(&__mutex); map_t::iterator dIter( mmcMap.begin() ); for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ) { delete dIter->second; } for( int i = 0; i < 128; i++ ) { delete __note_array[ i ]; delete __cc_array[ i ]; } delete __pc_action; __instance = nullptr; } void MidiMap::create_instance() { if( __instance == nullptr ) { __instance = new MidiMap; } } void MidiMap::reset_instance() { create_instance(); __instance->reset(); } /** * Clears the complete midi map and releases the memory * of the contained actions */ void MidiMap::reset() { QMutexLocker mx(&__mutex); map_t::iterator iter; for( iter = mmcMap.begin() ; iter != mmcMap.end() ; ++iter ) { delete iter->second; } mmcMap.clear(); int i; for( i = 0 ; i < 128 ; ++i ) { delete __note_array[ i ]; delete __cc_array[ i ]; __note_array[ i ] = new Action("NOTHING"); __cc_array[ i ] = new Action("NOTHING"); } } std::map< QString, Action* > MidiMap::getMMCMap() { return mmcMap; } /** * Sets up the relation between a mmc event and an action */ void MidiMap::registerMMCEvent( QString eventString , Action* pAction ) { QMutexLocker mx(&__mutex); if( mmcMap[ eventString ] != nullptr){ delete mmcMap[ eventString ]; } mmcMap[ eventString ] = pAction; } /** * Sets up the relation between a note event and an action */ void MidiMap::registerNoteEvent( int note, Action* pAction ) { QMutexLocker mx(&__mutex); if( note >= 0 && note < 128 ) { delete __note_array[ note ]; __note_array[ note ] = pAction; } } /** * Sets up the relation between a cc event and an action */ void MidiMap::registerCCEvent( int parameter , Action * pAction ){ QMutexLocker mx(&__mutex); if( parameter >= 0 and parameter < 128 ) { delete __cc_array[ parameter ]; __cc_array[ parameter ] = pAction; } } int MidiMap::findCCValueByActionParam1( QString actionType, QString param1 ) { int nParam = -1; for(int i=0; i < 128; i++) { Action* pTmpAction = __cc_array[i]; if( pTmpAction->getType() == actionType && pTmpAction->getParameter1() == param1 ){ nParam = i; } } return nParam; } int MidiMap::findCCValueByActionType( QString actionType ) { int nParam = -1; for(int i=0; i < 128; i++) { Action* pTmpAction = __cc_array[i]; if( pTmpAction->getType() == actionType ){ nParam = i; } } return nParam; } /** * Sets up the relation between a program change and an action */ void MidiMap::registerPCEvent( Action * pAction ){ QMutexLocker mx(&__mutex); delete __pc_action; __pc_action = pAction; } /** * Returns the mmc action which was linked to the given event. */ Action* MidiMap::getMMCAction( QString eventString ) { QMutexLocker mx(&__mutex); std::map< QString, Action *>::iterator dIter = mmcMap.find( eventString ); if ( dIter == mmcMap.end() ){ return nullptr; } return mmcMap[eventString]; } /** * Returns the note action which was linked to the given event. */ Action* MidiMap::getNoteAction( int note ) { QMutexLocker mx(&__mutex); return __note_array[ note ]; } /** * Returns the cc action which was linked to the given event. */ Action * MidiMap::getCCAction( int parameter ) { QMutexLocker mx(&__mutex); return __cc_array[ parameter ]; } /** * Returns the pc action which was linked to the given event. */ Action * MidiMap::getPCAction() { QMutexLocker mx(&__mutex); return __pc_action; } hydrogen-1.0.0-rc1/src/core/src/nsm_client.cpp000066400000000000000000000073141366722712400211760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/helpers/filesystem.h" #include "hydrogen/Preferences.h" #include #include #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ #include "hydrogen/nsm_client.h" #include "hydrogen/nsm.h" #include "hydrogen/event_queue.h" #include "hydrogen/hydrogen.h" #include "hydrogen/basics/song.h" NsmClient * NsmClient::__instance = nullptr; const char* NsmClient::__class_name = "NsmClient"; bool NsmShutdown = false; static int nsm_open_cb (const char *name, const char *display_name, const char *client_id, char **out_msg, void *userdata ) { H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); if(pPref){ if(client_id){ // setup JACK here, client_id gets the JACK client name pPref->setNsmClientId(QString(client_id)); } if(name){ /* * the hydrogen core is not responsible for managing * song loading on startup. Therefore we use store * the desired song name and let the GUIs do the actual work. */ pPref->setNsmSongName(QString(name)); } } return ERR_OK; } static int nsm_save_cb ( char **out_msg, void *userdata ) { H2Core::Song *pSong = H2Core::Hydrogen::get_instance()->getSong(); QString fileName = pSong->get_filename(); pSong->save( fileName ); return ERR_OK; } void* nsm_processEvent(void* data) { nsm_client_t* nsm = (nsm_client_t*) data; while(!NsmShutdown && nsm){ nsm_check_wait( nsm, 1000); } return nullptr; } NsmClient::NsmClient() : Object( __class_name ) { m_NsmThread = 0; m_bUnderSessionManagement = false; } void NsmClient::create_instance() { if( __instance == nullptr ) { __instance = new NsmClient; } } NsmClient::~NsmClient() { __instance = nullptr; } void NsmClient::shutdown() { NsmShutdown = true; } void NsmClient::createInitialClient() { /* * Make first contact with NSM server. */ nsm_client_t* nsm = nullptr; H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); QString H2ProcessName = pPref->getH2ProcessName(); QByteArray byteArray = H2ProcessName.toLatin1(); const char *nsm_url = getenv( "NSM_URL" ); if ( nsm_url ) { nsm = nsm_new(); if ( nsm ) { nsm_set_open_callback( nsm, nsm_open_cb, (void*) nullptr ); nsm_set_save_callback( nsm, nsm_save_cb, (void*) nullptr ); if ( nsm_init( nsm, nsm_url ) == 0 ) { nsm_send_announce( nsm, "Hydrogen", "", byteArray.data() ); nsm_check_wait( nsm, 10000 ); if(pthread_create(&m_NsmThread, nullptr, nsm_processEvent, nsm)) { ___ERRORLOG("Error creating NSM thread\n "); return; } // Everything worked fine and H2 can now be considered // under session management. m_bUnderSessionManagement = true; } else { ___ERRORLOG("failed, freeing NSM client"); nsm_free( nsm ); nsm = nullptr; } } } else { ___WARNINGLOG("No NSM URL available: no NSM management\n"); } } #endif /* H2CORE_HAVE_OSC */ hydrogen-1.0.0-rc1/src/core/src/object.cpp000066400000000000000000000121401366722712400203020ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/object.h" #include #include #include #include /** * @class Object * * @brief Base class of all components of hydrogen. * * Every component of hydrogen is inherited from the * Object class. Each object has a qualified name * and gets registered in a memory map at creation. * This memory map helps to debug memory leaks and * can be printed at any time. * */ namespace H2Core { Logger* Object::__logger = nullptr; bool Object::__count = false; unsigned Object::__objects_count = 0; pthread_mutex_t Object::__mutex; Object::object_map_t Object::__objects_map; int Object::bootstrap( Logger* logger, bool count ) { if( __logger==nullptr && logger!=nullptr ) { __logger = logger; __count = count; pthread_mutex_init( &__mutex, nullptr ); return 0; } return 1; } Object::~Object( ) { #ifdef H2CORE_HAVE_DEBUG if( __count ) del_object( this ); #endif } Object::Object( const Object& obj ) : __class_name( obj.__class_name ) { #ifdef H2CORE_HAVE_DEBUG if( __count ) add_object( this, true ); #endif } Object::Object( const char* class_name ) :__class_name( class_name ) { #ifdef H2CORE_HAVE_DEBUG if( __count ) add_object( this, false ); #endif } void Object::set_count( bool flag ) { #ifdef H2CORE_HAVE_DEBUG __count = flag; #else if( __logger!=0 && __logger->should_log( Logger::Error ) ) { __logger->log( Logger::Error, "set_count", "Object", "not compiled with H2CORE_HAVE_DEBUG flag set" ); } #endif } inline void Object::add_object( const Object* obj, bool copy ) { #ifdef H2CORE_HAVE_DEBUG const char* class_name = ( ( Object* )obj )->class_name(); if( __logger && __logger->should_log( Logger::Constructors ) ) __logger->log( Logger::Debug, nullptr, class_name, ( copy ? "Copy Constructor" : "Constructor" ) ); pthread_mutex_lock( &__mutex ); //if( __objects_map.size()==0) atexit( Object::write_objects_map_to_cerr ); __objects_count++; __objects_map[ class_name ].constructed++; pthread_mutex_unlock( &__mutex ); #endif } inline void Object::del_object( const Object* obj ) { #ifdef H2CORE_HAVE_DEBUG const char* class_name = ( ( Object* )obj )->class_name(); if( __logger && __logger->should_log( Logger::Constructors ) ) __logger->log( Logger::Debug, nullptr, class_name, "Destructor" ); object_map_t::iterator it_count = __objects_map.find( class_name ); if ( it_count==__objects_map.end() ) { if( __logger!=nullptr && __logger->should_log( Logger::Error ) ) { std::stringstream msg; msg << "the class " << class_name << " is not registered ! [" << obj << "]"; __logger->log( Logger::Error,"del_object", "Object", QString::fromStdString( msg.str() ) ); } return; } assert( ( *it_count ).first == class_name ); pthread_mutex_lock( &__mutex ); assert( __objects_map[class_name].constructed > ( __objects_map[class_name].destructed ) ); __objects_count--; assert( __objects_count>=0 ); __objects_map[ ( *it_count ).first ].destructed++; pthread_mutex_unlock( &__mutex ); #endif } void Object::write_objects_map_to( std::ostream& out ) { #ifdef H2CORE_HAVE_DEBUG if( !__count ) { #ifdef WIN32 out << "level must be Debug or higher"<< std::endl; #else out << "\033[35mlog level must be \033[31mDebug\033[35m or higher\033[0m"<< std::endl; #endif return; } std::ostringstream o; pthread_mutex_lock( &__mutex ); object_map_t::iterator it = __objects_map.begin(); while ( it != __objects_map.end() ) { o << "\t[ " << std::setw( 30 ) << ( *it ).first << " ]\t" << std::setw( 6 ) << ( *it ).second.constructed << "\t" << std::setw( 6 ) << ( *it ).second.destructed << "\t" << std::setw( 6 ) << ( *it ).second.constructed - ( *it ).second.destructed << std::endl; it++; } pthread_mutex_unlock( &__mutex ); #ifndef WIN32 out << std::endl << "\033[35m"; #endif out << "Objects map :" << std::setw( 30 ) << "class\t" << "constr destr alive" << std::endl << o.str() << "Total : " << std::setw( 6 ) << __objects_count << " objects."; #ifndef WIN32 out << "\033[0m"; #endif out << std::endl << std::endl; #else #ifdef WIN32 out << "Object::write_objects_map_to :: not compiled with H2CORE_HAVE_DEBUG flag set" << std::endl; #else out << "\033[35mObject::write_objects_map_to :: \033[31mnot compiled with H2CORE_HAVE_DEBUG flag set\033[0m" << std::endl; #endif #endif } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/core/src/osc_server.cpp000066400000000000000000000702631366722712400212200ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/helpers/filesystem.h" #include "hydrogen/Preferences.h" #include #include //currently H2CORE_HAVE_OSC means: liblo is present.. #if defined(H2CORE_HAVE_OSC) || _DOXYGEN_ #include #include #include "hydrogen/osc_server.h" #include "hydrogen/core_action_controller.h" #include "hydrogen/event_queue.h" #include "hydrogen/hydrogen.h" #include "hydrogen/basics/song.h" #include "hydrogen/midi_action.h" OscServer * OscServer::__instance = nullptr; const char* OscServer::__class_name = "OscServer"; std::list OscServer::m_pClientRegistry; QString OscServer::qPrettyPrint(lo_type type,void * data) { QString formattedString; typedef union { int32_t i; float f; char c; uint32_t nl; } h2_pcast32; typedef union { int64_t i; double f; uint64_t nl; } h2_pcast64; h2_pcast32 val32 = {0}; h2_pcast64 val64 = {0}; int size; size = lo_arg_size(type, data); if (size == 4 || type == LO_BLOB) { val32.nl = *(int32_t *)data; } else if (size == 8) { val64.nl = *(int64_t *)data; } else { //error case formattedString = QString("Unhandled size:").arg(size); return formattedString; } switch (type) { case LO_INT32: formattedString = QString("%1").arg(val32.i); break; case LO_FLOAT: formattedString = QString("%1").arg(val32.f); break; case LO_STRING: formattedString = QString("%1").arg( (char *) data ); break; case LO_BLOB: //not supported by Hydrogen formattedString = QString("BLOB"); break; case LO_INT64: formattedString = QString("%1").arg(val64.i); break; case LO_DOUBLE: formattedString = QString("%1").arg(val64.f); break; case LO_SYMBOL: formattedString = QString("%1").arg( (char *) data ); break; case LO_CHAR: formattedString = QString("%1").arg( QLatin1Char((char) val32.c )); break; case LO_MIDI: //not supported by Hydrogen formattedString = QString("MIDI"); break; case LO_TRUE: formattedString = QString("#T"); break; case LO_FALSE: formattedString = QString("#F"); break; case LO_NIL: formattedString = QString("#NIL"); break; case LO_INFINITUM: formattedString = QString("#INF"); break; case LO_TIMETAG: default: formattedString = QString("Unhandled type:").arg(type); break; } return formattedString; } /* catch any incoming messages and display them. returning 1 means that the * message has not been fully handled and the server should try other methods */ int OscServer::generic_handler(const char * path, const char * types, lo_arg ** argv, int argc, void * data, void * user_data) { INFOLOG("GENERIC HANDLER"); //First we're trying to map TouchOSC messages from multi-fader widgets QString oscPath( path ); QRegExp rxStripVol( "/Hydrogen/STRIP_VOLUME_ABSOLUTE/(\\d+)" ); int pos = rxStripVol.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripVol.cap(1).toInt() -1; STRIP_VOLUME_ABSOLUTE_Handler( value , argv[0]->f ); } } QRegExp rxStripPanAbs( "/Hydrogen/PAN_ABSOLUTE/(\\d+)" ); pos = rxStripPanAbs.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripPanAbs.cap(1).toInt() - 1; H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); pController->setStripPan( value, argv[0]->f ); } } QRegExp rxStripPanRel( "/Hydrogen/PAN_RELATIVE/(\\d+)" ); pos = rxStripPanRel.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripPanRel.cap(1).toInt() - 1; PAN_RELATIVE_Handler( QString::number( value ) , QString::number( argv[0]->f, 'f', 0) ); } } QRegExp rxStripFilterCutoffAbs( "/Hydrogen/FILTER_CUTOFF_LEVEL_ABSOLUTE/(\\d+)" ); pos = rxStripFilterCutoffAbs.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripFilterCutoffAbs.cap(1).toInt() - 1; FILTER_CUTOFF_LEVEL_ABSOLUTE_Handler( QString::number( value ) , QString::number( argv[0]->f, 'f', 0) ); } } QRegExp rxStripMute( "/Hydrogen/STRIP_MUTE_TOGGLE/(\\d+)" ); pos = rxStripMute.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripMute.cap(1).toInt() - 1; H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); bool isMuted = false; if(argv[0]->f != 0){ isMuted = true; } pController->setStripIsMuted( value, isMuted ); } } QRegExp rxStripSolo( "/Hydrogen/STRIP_SOLO_TOGGLE/(\\d+)" ); pos = rxStripSolo.indexIn( oscPath ); if ( pos > -1 ) { if( argc == 1 ){ int value = rxStripSolo.cap(1).toInt() - 1; H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); bool isSoloed = false; if(argv[0]->f != 0){ isSoloed = true; } pController->setStripIsSoloed( value, isSoloed ); } } INFOLOG( QString( "Incoming OSC Message for path %1" ).arg( path ) ); int i; for (i = 0; i < argc; i++) { QString formattedArgument = qPrettyPrint( (lo_type)types[i], argv[i] ); INFOLOG(QString("Argument %1: %2 %3").arg(i).arg(types[i]).arg(formattedArgument)); } // Returning 1 means that the message has not been fully handled // and the server should try other methods. return 1; } OscServer::OscServer( H2Core::Preferences* pPreferences ) : Object( __class_name ) { m_pPreferences = pPreferences; if( m_pPreferences->getOscServerEnabled() ) { int port = m_pPreferences->getOscServerPort(); m_pServerThread = new lo::ServerThread( port ); // If there is already another service registered to the same // port, the OSC server is not valid an can not be started. if ( !m_pServerThread->is_valid() ) { int tmpPort; delete m_pServerThread; // Instead, let the liblo library choose a working // port on their own (nullptr argument). m_pServerThread = new lo::ServerThread( nullptr ); tmpPort = m_pServerThread->port(); ERRORLOG( QString("Could not start OSC server on port %1, using port %2 instead.").arg(port).arg(tmpPort)); H2Core::EventQueue::get_instance()->push_event( H2Core::EVENT_ERROR, H2Core::Hydrogen::OSC_CANNOT_CONNECT_TO_PORT ); } else { INFOLOG( QString( "OSC server running on port %1" ).arg( port ) ); } } else { m_pServerThread = nullptr; } } OscServer::~OscServer(){ for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address_free( *it ); } __instance = nullptr; } void OscServer::create_instance( H2Core::Preferences* pPreferences ) { if( __instance == nullptr ) { __instance = new OscServer( pPreferences ); } } // ------------------------------------------------------------------- // Handler functions void OscServer::PLAY_Handler(lo_arg **argv,int i) { Action currentAction("PLAY"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PLAY_STOP_TOGGLE_Handler(lo_arg **argv,int i) { Action currentAction("PLAY/STOP_TOGGLE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PLAY_PAUSE_TOGGLE_Handler(lo_arg **argv,int i) { Action currentAction("PLAY/PAUSE_TOGGLE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::STOP_Handler(lo_arg **argv,int i) { Action currentAction("STOP"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PAUSE_Handler(lo_arg **argv,int i) { Action currentAction("PAUSE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::RECORD_READY_Handler(lo_arg **argv,int i) { Action currentAction("RECORD_READY"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::RECORD_STROBE_TOGGLE_Handler(lo_arg **argv,int i) { Action currentAction("RECORD/STROBE_TOGGLE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::RECORD_STROBE_Handler(lo_arg **argv,int i) { Action currentAction("RECORD_STROBE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::RECORD_EXIT_Handler(lo_arg **argv,int i) { Action currentAction("RECORD_EXIT"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::MUTE_Handler(lo_arg **argv,int i) { Action currentAction("MUTE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::UNMUTE_Handler(lo_arg **argv,int i) { Action currentAction("UNMUTE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::MUTE_TOGGLE_Handler(lo_arg **argv,int i) { Action currentAction("MUTE_TOGGLE"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::NEXT_BAR_Handler(lo_arg **argv,int i) { Action currentAction(">>_NEXT_BAR"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PREVIOUS_BAR_Handler(lo_arg **argv,int i) { Action currentAction("<<_PREVIOUS_BAR"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::BPM_INCR_Handler(lo_arg **argv,int i) { Action currentAction("BPM_INCR"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0)); pActionManager->handleAction( ¤tAction ); } void OscServer::BPM_DECR_Handler(lo_arg **argv,int i) { Action currentAction("BPM_DECR"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0)); pActionManager->handleAction( ¤tAction ); } void OscServer::MASTER_VOLUME_ABSOLUTE_Handler(lo_arg **argv,int i) { H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); pController->setMasterVolume( argv[0]->f ); } void OscServer::MASTER_VOLUME_RELATIVE_Handler(lo_arg **argv,int i) { Action currentAction("MASTER_VOLUME_RELATIVE"); currentAction.setParameter2( QString::number( argv[0]->f, 'f', 0)); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::STRIP_VOLUME_ABSOLUTE_Handler(int param1, float param2) { H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); pController->setStripVolume( param1, param2 ); } void OscServer::STRIP_VOLUME_RELATIVE_Handler(lo_arg **argv,int i) { Action currentAction("STRIP_VOLUME_RELATIVE"); currentAction.setParameter2( QString::number( argv[0]->f, 'f', 0)); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::SELECT_NEXT_PATTERN_Handler(lo_arg **argv,int i) { Action currentAction("SELECT_NEXT_PATTERN"); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0 ) ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::SELECT_NEXT_PATTERN_PROMPTLY_Handler(lo_arg **argv,int i) { Action currentAction("SELECT_NEXT_PATTERN_PROMPTLY"); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0 ) ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::SELECT_AND_PLAY_PATTERN_Handler(lo_arg **argv,int i) { Action currentAction("SELECT_AND_PLAY_PATTERN"); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0 ) ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PAN_ABSOLUTE_Handler(QString param1, QString param2) { Action currentAction("PAN_ABSOLUTE"); currentAction.setParameter1( param1 ); currentAction.setParameter2( param2 ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PAN_RELATIVE_Handler(QString param1, QString param2) { Action currentAction("PAN_RELATIVE"); currentAction.setParameter1( param1 ); currentAction.setParameter2( param2 ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::FILTER_CUTOFF_LEVEL_ABSOLUTE_Handler(QString param1, QString param2) { Action currentAction("FILTER_CUTOFF_LEVEL_ABSOLUTE"); currentAction.setParameter1( param1 ); currentAction.setParameter2( param2 ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::BEATCOUNTER_Handler(lo_arg **argv,int i) { Action currentAction("BEATCOUNTER"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::TAP_TEMPO_Handler(lo_arg **argv,int i) { Action currentAction("TAP_TEMPO"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PLAYLIST_SONG_Handler(lo_arg **argv,int i) { Action currentAction("PLAYLIST_SONG"); currentAction.setParameter1( QString::number( argv[0]->f, 'f', 0 ) ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PLAYLIST_NEXT_SONG_Handler(lo_arg **argv,int i) { Action currentAction("PLAYLIST_NEXT_SONG"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::PLAYLIST_PREV_SONG_Handler(lo_arg **argv,int i) { Action currentAction("PLAYLIST_PREV_SONG"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::TOGGLE_METRONOME_Handler(lo_arg **argv,int i) { Action currentAction("TOGGLE_METRONOME"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::SELECT_INSTRUMENT_Handler(lo_arg **argv,int i) { Action currentAction("SELECT_INSTRUMENT"); currentAction.setParameter2( QString::number( argv[0]->f, 'f', 0 ) ); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::UNDO_ACTION_Handler(lo_arg **argv,int i) { Action currentAction("UNDO_ACTION"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } void OscServer::REDO_ACTION_Handler(lo_arg **argv,int i) { Action currentAction("REDO_ACTION"); MidiActionManager* pActionManager = MidiActionManager::get_instance(); pActionManager->handleAction( ¤tAction ); } // ------------------------------------------------------------------- // Actions required for session management. void OscServer::NEW_SONG_Handler(lo_arg **argv, int argc) { auto pController = H2Core::Hydrogen::get_instance()->getCoreActionController(); pController->newSong( QString::fromUtf8( &argv[0]->s ) ); } void OscServer::OPEN_SONG_Handler(lo_arg **argv, int argc) { auto pController = H2Core::Hydrogen::get_instance()->getCoreActionController(); pController->openSong( QString::fromUtf8( &argv[0]->s ) ); } void OscServer::SAVE_SONG_Handler(lo_arg **argv, int argc) { auto pController = H2Core::Hydrogen::get_instance()->getCoreActionController(); pController->saveSong(); } void OscServer::SAVE_SONG_AS_Handler(lo_arg **argv, int argc) { auto pController = H2Core::Hydrogen::get_instance()->getCoreActionController(); pController->saveSongAs( QString::fromUtf8( &argv[0]->s ) ); } void OscServer::QUIT_Handler(lo_arg **argv, int argc) { auto pController = H2Core::Hydrogen::get_instance()->getCoreActionController(); pController->quit(); } // ------------------------------------------------------------------- // Helper functions bool IsLoAddressEqual( lo_address first, lo_address second ) { bool portEqual = ( strcmp( lo_address_get_port( first ), lo_address_get_port( second ) ) == 0); bool hostEqual = ( strcmp( lo_address_get_hostname( first ), lo_address_get_hostname( second ) ) == 0); bool protoEqual = ( lo_address_get_protocol( first ) == lo_address_get_protocol( second ) ); return portEqual && hostEqual && protoEqual; } // ------------------------------------------------------------------- // Main action handler void OscServer::handleAction( Action* pAction ) { H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); if( !pPref->getOscFeedbackEnabled() ){ return; } if( pAction->getType() == "MASTER_VOLUME_ABSOLUTE"){ bool ok; float param2 = pAction->getParameter2().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param2); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, "/Hydrogen/MASTER_VOLUME_ABSOLUTE" , reply); } lo_message_free( reply ); } if( pAction->getType() == "STRIP_VOLUME_ABSOLUTE"){ bool ok; float param2 = pAction->getParameter2().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param2); QByteArray ba = QString("/Hydrogen/STRIP_VOLUME_ABSOLUTE/%1").arg(pAction->getParameter1()).toLatin1(); const char *c_str2 = ba.data(); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, c_str2, reply); } lo_message_free( reply ); } if( pAction->getType() == "TOGGLE_METRONOME"){ bool ok; float param1 = pAction->getParameter1().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param1); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, "/Hydrogen/TOGGLE_METRONOME", reply); } lo_message_free( reply ); } if( pAction->getType() == "MUTE_TOGGLE"){ bool ok; float param1 = pAction->getParameter1().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param1); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, "/Hydrogen/MUTE_TOGGLE", reply); } lo_message_free( reply ); } if( pAction->getType() == "STRIP_MUTE_TOGGLE"){ bool ok; float param2 = pAction->getParameter2().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param2); QByteArray ba = QString("/Hydrogen/STRIP_MUTE_TOGGLE/%1").arg(pAction->getParameter1()).toLatin1(); const char *c_str2 = ba.data(); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, c_str2, reply); } lo_message_free( reply ); } if( pAction->getType() == "STRIP_SOLO_TOGGLE"){ bool ok; float param2 = pAction->getParameter2().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param2); QByteArray ba = QString("/Hydrogen/STRIP_SOLO_TOGGLE/%1").arg(pAction->getParameter1()).toLatin1(); const char *c_str2 = ba.data(); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, c_str2, reply); } lo_message_free( reply ); } if( pAction->getType() == "PAN_ABSOLUTE"){ bool ok; float param2 = pAction->getParameter2().toFloat(&ok); lo_message reply = lo_message_new(); lo_message_add_float(reply, param2); QByteArray ba = QString("/Hydrogen/PAN_ABSOLUTE/%1").arg(pAction->getParameter1()).toLatin1(); const char *c_str2 = ba.data(); for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address clientAddress = *it; lo_send_message(clientAddress, c_str2, reply); } lo_message_free( reply ); } } bool OscServer::start() { if ( m_pServerThread == nullptr || !m_pServerThread->is_valid() ) { ERRORLOG("Failed to start OSC server."); return false; } /* * Register all handler functions */ //This handler is responsible for registering clients m_pServerThread->add_method(nullptr, nullptr, [&](lo_message msg){ INFOLOG("OSC REGISTER HANDLER"); lo_address a = lo_message_get_source(msg); bool AddressRegistered = false; for (std::list::iterator it=m_pClientRegistry.begin(); it != m_pClientRegistry.end(); ++it){ lo_address b = *it; if( IsLoAddressEqual(a,b) ) { AddressRegistered = true; break; } } if( !AddressRegistered ){ INFOLOG("REGISTERING CLIENT"); lo_address newAddr = lo_address_new_with_proto( lo_address_get_protocol( a ), lo_address_get_hostname( a ), lo_address_get_port( a ) ); m_pClientRegistry.push_back( newAddr ); H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); H2Core::CoreActionController* pController = pEngine->getCoreActionController(); pController->initExternalControlInterfaces(); } // Returning 1 means that the // message has not been fully // handled and the server should // try other methods. return 1; }); m_pServerThread->add_method(nullptr, nullptr, generic_handler, nullptr); m_pServerThread->add_method("/Hydrogen/PLAY", "", PLAY_Handler); m_pServerThread->add_method("/Hydrogen/PLAY", "f", PLAY_Handler); m_pServerThread->add_method("/Hydrogen/PLAY_STOP_TOGGLE", "", PLAY_STOP_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/PLAY_STOP_TOGGLE", "f", PLAY_STOP_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/PLAY_PAUSE_TOGGLE", "", PLAY_PAUSE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/PLAY_PAUSE_TOGGLE", "f", PLAY_PAUSE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/STOP", "", STOP_Handler); m_pServerThread->add_method("/Hydrogen/STOP", "f", STOP_Handler); m_pServerThread->add_method("/Hydrogen/PAUSE", "", PAUSE_Handler); m_pServerThread->add_method("/Hydrogen/PAUSE", "f", PAUSE_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_READY", "", RECORD_READY_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_READY", "f", RECORD_READY_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_STROBE_TOGGLE", "", RECORD_STROBE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_STROBE_TOGGLE", "f", RECORD_STROBE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_STROBE", "", RECORD_STROBE_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_STROBE", "f", RECORD_STROBE_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_EXIT", "", RECORD_EXIT_Handler); m_pServerThread->add_method("/Hydrogen/RECORD_EXIT", "f", RECORD_EXIT_Handler); m_pServerThread->add_method("/Hydrogen/MUTE", "", MUTE_Handler); m_pServerThread->add_method("/Hydrogen/MUTE", "f", MUTE_Handler); m_pServerThread->add_method("/Hydrogen/UNMUTE", "", UNMUTE_Handler); m_pServerThread->add_method("/Hydrogen/UNMUTE", "f", UNMUTE_Handler); m_pServerThread->add_method("/Hydrogen/MUTE_TOGGLE", "", MUTE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/MUTE_TOGGLE", "f", MUTE_TOGGLE_Handler); m_pServerThread->add_method("/Hydrogen/NEXT_BAR", "", NEXT_BAR_Handler); m_pServerThread->add_method("/Hydrogen/NEXT_BAR", "f", NEXT_BAR_Handler); m_pServerThread->add_method("/Hydrogen/PREVIOUS_BAR", "", PREVIOUS_BAR_Handler); m_pServerThread->add_method("/Hydrogen/PREVIOUS_BAR", "f", PREVIOUS_BAR_Handler); m_pServerThread->add_method("/Hydrogen/BPM_DECR", "f", BPM_DECR_Handler); m_pServerThread->add_method("/Hydrogen/BPM_INCR", "f", BPM_INCR_Handler); m_pServerThread->add_method("/Hydrogen/MASTER_VOLUME_ABSOLUTE", "f", MASTER_VOLUME_ABSOLUTE_Handler); m_pServerThread->add_method("/Hydrogen/MASTER_VOLUME_RELATIVE", "f", MASTER_VOLUME_RELATIVE_Handler); m_pServerThread->add_method("/Hydrogen/STRIP_VOLUME_RELATIVE", "f", STRIP_VOLUME_RELATIVE_Handler); m_pServerThread->add_method("/Hydrogen/SELECT_NEXT_PATTERN", "f", SELECT_NEXT_PATTERN_Handler); m_pServerThread->add_method("/Hydrogen/SELECT_NEXT_PATTERN_PROMPTLY", "f", SELECT_NEXT_PATTERN_PROMPTLY_Handler); m_pServerThread->add_method("/Hydrogen/SELECT_AND_PLAY_PATTERN", "f", SELECT_AND_PLAY_PATTERN_Handler); m_pServerThread->add_method("/Hydrogen/BEATCOUNTER", "", BEATCOUNTER_Handler); m_pServerThread->add_method("/Hydrogen/BEATCOUNTER", "f", BEATCOUNTER_Handler); m_pServerThread->add_method("/Hydrogen/TAP_TEMPO", "", TAP_TEMPO_Handler); m_pServerThread->add_method("/Hydrogen/TAP_TEMPO", "f", TAP_TEMPO_Handler); m_pServerThread->add_method("/Hydrogen/PLAYLIST_SONG", "f", PLAYLIST_SONG_Handler); m_pServerThread->add_method("/Hydrogen/PLAYLIST_NEXT_SONG", "", PLAYLIST_NEXT_SONG_Handler); m_pServerThread->add_method("/Hydrogen/PLAYLIST_NEXT_SONG", "f", PLAYLIST_NEXT_SONG_Handler); m_pServerThread->add_method("/Hydrogen/PLAYLIST_PREV_SONG", "", PLAYLIST_PREV_SONG_Handler); m_pServerThread->add_method("/Hydrogen/PLAYLIST_PREV_SONG", "f", PLAYLIST_PREV_SONG_Handler); m_pServerThread->add_method("/Hydrogen/TOGGLE_METRONOME", "", TOGGLE_METRONOME_Handler); m_pServerThread->add_method("/Hydrogen/TOGGLE_METRONOME", "f", TOGGLE_METRONOME_Handler); m_pServerThread->add_method("/Hydrogen/SELECT_INSTRUMENT", "f", SELECT_INSTRUMENT_Handler); m_pServerThread->add_method("/Hydrogen/UNDO_ACTION", "", UNDO_ACTION_Handler); m_pServerThread->add_method("/Hydrogen/UNDO_ACTION", "f", UNDO_ACTION_Handler); m_pServerThread->add_method("/Hydrogen/REDO_ACTION", "", REDO_ACTION_Handler); m_pServerThread->add_method("/Hydrogen/REDO_ACTION", "f", REDO_ACTION_Handler); m_pServerThread->add_method("/Hydrogen/NEW_SONG", "s", NEW_SONG_Handler); m_pServerThread->add_method("/Hydrogen/OPEN_SONG", "s", OPEN_SONG_Handler); m_pServerThread->add_method("/Hydrogen/SAVE_SONG", "", SAVE_SONG_Handler); m_pServerThread->add_method("/Hydrogen/SAVE_SONG_AS", "s", SAVE_SONG_AS_Handler); m_pServerThread->add_method("/Hydrogen/QUIT", "", QUIT_Handler); /* * Start the server. */ m_pServerThread->start(); INFOLOG(QString("Osc server started. Listening on port %1").arg( m_pPreferences->getOscServerPort() )); return true; } #endif /* H2CORE_HAVE_OSC */ hydrogen-1.0.0-rc1/src/core/src/preferences.cpp000066400000000000000000001502631366722712400213460ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #ifndef WIN32 #include #include #endif #include #include #include #include #include #include #include #include #include "hydrogen/version.h" #include "hydrogen/helpers/filesystem.h" #include //#include namespace H2Core { Preferences* Preferences::__instance = nullptr; void Preferences::create_instance() { if ( __instance == nullptr ) { __instance = new Preferences; } } const char* Preferences::__class_name = "Preferences"; Preferences::Preferences() : Object( __class_name ) { __instance = this; INFOLOG( "INIT" ); //Default jack track-outputs are post fader m_nJackTrackOutputMode = POST_FADER; m_bJackTrackOuts = false; // switch to enable / disable lash, only on h2 startup m_brestartLash = false; m_bsetLash = false; //init pre delete default m_nRecPreDelete = 0; m_nRecPostDelete = 0; //rubberband bpm change queue m_useTheRubberbandBpmChangeEvent = false; __rubberBandCalcTime = 5; QString rubberBandCLIPath = getenv( "PATH" ); QStringList rubberBandCLIPathList = rubberBandCLIPath.split(":");//linux use ":" as separator. maybe windows and osx use other separators //find the Rubberband-CLI in system env //if this fails a second test will check individual user settings for(int i = 0; i < rubberBandCLIPathList.size(); ++i){ m_rubberBandCLIexecutable = rubberBandCLIPathList[i] + "/rubberband"; if ( QFile( m_rubberBandCLIexecutable ).exists() == true ){ readPrefFileforotherplaces = false; break; }else { m_rubberBandCLIexecutable = "Path to Rubberband-CLI"; readPrefFileforotherplaces = true; } } m_pDefaultUIStyle = new UIStyle(); m_nDefaultUILayout = UI_LAYOUT_SINGLE_PANE; __lastspatternDirectory = QDir::homePath(); __lastsampleDirectory = QDir::homePath(); //audio file browser __playsamplesonclicking = false; // audio file browser __playselectedinstrument = false; // midi keyboard and keyboard play only selected instrument recordEvents = false; // not recording by default destructiveRecord = false; // not destructively recording by default punchInPos = 0; punchOutPos = -1; __expandSongItem = true; //SoundLibraryPanel __expandPatternItem = true; //SoundLibraryPanel __useTimelineBpm = false; // use timeline //export dialog m_sExportDirectory = QDir::homePath(); m_nExportModeIdx = 0; m_nExportSampleRateIdx = 0; m_nExportSampleDepthIdx = 0; //export midi dialog m_sMidiExportDirectory = QDir::homePath(); m_nMidiExportMode = 0; ///////////////////////////////////////////////////////////////////////// /////////////////// DEFAULT SETTINGS //////////////////////////////////// ///////////////////////////////////////////////////////////////////////// m_bFollowPlayhead = true; // SEE ABOVE: m_brestartLash // SEE ABOVE: m_bsetLash m_bbc = false; m_mmcsetplay = false; m_countOffset = 0; // beatcounter m_startOffset = 0; // beatcounter sServerList.push_back( QString("http://hydrogen-music.org/feeds/drumkit_list.php") ); m_patternCategories.push_back( QString("not_categorized") ); //___ audio engine properties ___ m_sAudioDriver = QString("Auto"); m_bUseMetronome = false; m_fMetronomeVolume = 0.5; m_nMaxNotes = 256; m_nBufferSize = 1024; m_nSampleRate = 44100; //___ oss driver properties ___ m_sOSSDevice = QString("/dev/dsp"); //___ MIDI Driver properties m_sMidiDriver = QString("ALSA"); m_sMidiPortName = QString("None"); m_sMidiOutputPortName = QString("None"); m_nMidiChannelFilter = -1; m_bMidiNoteOffIgnore = false; m_bMidiFixedMapping = false; m_bMidiDiscardNoteAfterAction = false; //___ alsa audio driver properties ___ m_sAlsaAudioDevice = QString("hw:0"); //___ jack driver properties ___ m_sJackPortName1 = QString("alsa_pcm:playback_1"); m_sJackPortName2 = QString("alsa_pcm:playback_2"); m_bJackTransportMode = true; m_bJackConnectDefaults = true; m_bJackTrackOuts = false; m_nJackTrackOutputMode = 0; m_bJackMasterMode = false ; // OSC configuration m_bOscServerEnabled = false; m_bOscFeedbackEnabled = true; m_nOscServerPort = 9000; //___ General properties ___ m_bPatternModePlaysSelected = true; m_brestoreLastSong = true; m_brestoreLastPlaylist = false; m_bUseLash = false; m_bShowDevelWarning = false; // NONE: lastSongFilename; hearNewNotes = true; // NONE: m_recentFiles; // NONE: m_recentFX; quantizeEvents = true; recordEvents = false; m_bUseRelativeFilenamesForPlaylists = false; //___ GUI properties ___ m_sQTStyle = "Fusion"; applicationFontFamily = "Lucida Grande"; applicationFontPointSize = 10; mixerFontFamily = "Lucida Grande"; mixerFontPointSize = 11; mixerFalloffSpeed = 1.1; m_nPatternEditorGridResolution = 8; m_bPatternEditorUsingTriplets = false; m_bShowInstrumentPeaks = true; m_bIsFXTabVisible = true; m_bShowAutomationArea = false; m_bShowPlaybackTrack = false; m_nPatternEditorGridHeight = 21; m_nPatternEditorGridWidth = 3; mainFormProperties.set(0, 0, 1000, 700, true); mixerProperties.set(10, 350, 829, 276, true); patternEditorProperties.set(280, 100, 706, 439, true); songEditorProperties.set(10, 10, 600, 250, true); drumkitManagerProperties.set(500, 20, 526, 437, true); audioEngineInfoProperties.set(720, 120, 0, 0, false); m_ladspaProperties[0].set(2, 20, 0, 0, false); m_ladspaProperties[1].set(2, 20, 0, 0, false); m_ladspaProperties[2].set(2, 20, 0, 0, false); m_ladspaProperties[3].set(2, 20, 0, 0, false); m_nMaxBars = 400; m_nMaxLayers = 16; m_nColoringMethod = 2; m_nColoringMethodAuxValue = 213; UIStyle* uis = m_pDefaultUIStyle; uis->m_songEditor_backgroundColor = H2RGBColor(95, 101, 117); uis->m_songEditor_alternateRowColor = H2RGBColor(128, 134, 152); uis->m_songEditor_selectedRowColor = H2RGBColor(128, 134, 152); uis->m_songEditor_lineColor = H2RGBColor(72, 76, 88); uis->m_songEditor_textColor = H2RGBColor(196, 201, 214); uis->m_songEditor_pattern1Color = H2RGBColor(97, 167, 251); uis->m_patternEditor_backgroundColor = H2RGBColor(167, 168, 163); uis->m_patternEditor_alternateRowColor = H2RGBColor(167, 168, 163); uis->m_patternEditor_selectedRowColor = H2RGBColor(207, 208, 200); uis->m_patternEditor_textColor = H2RGBColor(40, 40, 40); uis->m_patternEditor_noteColor = H2RGBColor(40, 40, 40); uis->m_patternEditor_lineColor = H2RGBColor(65, 65, 65); uis->m_patternEditor_line1Color = H2RGBColor(75, 75, 75); uis->m_patternEditor_line2Color = H2RGBColor(95, 95, 95); uis->m_patternEditor_line3Color = H2RGBColor(115, 115, 115); uis->m_patternEditor_line4Color = H2RGBColor(125, 125, 125); uis->m_patternEditor_line5Color = H2RGBColor(135, 135, 135); ///////////////////////////////////////////////////////////////////////// //////////////// END OF DEFAULT SETTINGS //////////////////////////////// ///////////////////////////////////////////////////////////////////////// loadPreferences( true ); // Global settings loadPreferences( false ); // User settings } Preferences::~Preferences() { savePreferences(); INFOLOG( "DESTROY" ); __instance = nullptr; delete m_pDefaultUIStyle; } /// /// Load the preferences file /// void Preferences::loadPreferences( bool bGlobal ) { bool recreate = false; // configuration file must be recreated? QString sPreferencesFilename = ( bGlobal ? Filesystem::sys_config_path() : Filesystem::usr_config_path() ); INFOLOG( QString( "Loading preferences file (%1) [%2]" ).arg( bGlobal ? "SYS" : "USER" ).arg( sPreferencesFilename ) ); Filesystem::file_readable( sPreferencesFilename ); // pref file exists? std::ifstream input( sPreferencesFilename.toLocal8Bit() , std::ios::in | std::ios::binary ); if ( input ) { // read preferences file QDomDocument doc = LocalFileMng::openXmlDocument( sPreferencesFilename ); QDomNode rootNode = doc.firstChildElement( "hydrogen_preferences" ); if ( !rootNode.isNull() ) { // version QString version = LocalFileMng::readXmlString( rootNode, "version", "" ); if ( version.isEmpty() ) { recreate = true; } //////// GENERAL /////////// __playselectedinstrument = LocalFileMng::readXmlBool( rootNode, "instrumentInputMode", __playselectedinstrument ); m_bShowDevelWarning = LocalFileMng::readXmlBool( rootNode, "showDevelWarning", m_bShowDevelWarning ); m_brestoreLastSong = LocalFileMng::readXmlBool( rootNode, "restoreLastSong", m_brestoreLastSong ); m_brestoreLastPlaylist = LocalFileMng::readXmlBool( rootNode, "restoreLastPlaylist", m_brestoreLastPlaylist ); m_bPatternModePlaysSelected = LocalFileMng::readXmlBool( rootNode, "patternModePlaysSelected", true ); m_bUseLash = LocalFileMng::readXmlBool( rootNode, "useLash", false ); __useTimelineBpm = LocalFileMng::readXmlBool( rootNode, "useTimeLine", __useTimelineBpm ); m_nMaxBars = LocalFileMng::readXmlInt( rootNode, "maxBars", 400 ); m_nMaxLayers = LocalFileMng::readXmlInt( rootNode, "maxLayers", 16 ); m_nDefaultUILayout = LocalFileMng::readXmlInt( rootNode, "defaultUILayout", UI_LAYOUT_SINGLE_PANE ); m_nLastOpenTab = LocalFileMng::readXmlInt( rootNode, "lastOpenTab", 0 ); m_bUseRelativeFilenamesForPlaylists = LocalFileMng::readXmlBool( rootNode, "useRelativeFilenamesForPlaylists", false ); //restore the right m_bsetlash value m_bsetLash = m_bUseLash; m_useTheRubberbandBpmChangeEvent = LocalFileMng::readXmlBool( rootNode, "useTheRubberbandBpmChangeEvent", m_useTheRubberbandBpmChangeEvent ); m_nRecPreDelete = LocalFileMng::readXmlInt( rootNode, "preDelete", 0 ); m_nRecPostDelete = LocalFileMng::readXmlInt( rootNode, "postDelete", 0 ); hearNewNotes = LocalFileMng::readXmlBool( rootNode, "hearNewNotes", hearNewNotes ); quantizeEvents = LocalFileMng::readXmlBool( rootNode, "quantizeEvents", quantizeEvents ); //rubberband if( readPrefFileforotherplaces ){ //this scond test will check individual user settings QString test = LocalFileMng::readXmlString( rootNode, "path_to_rubberband", ""); if ( QFile( test ).exists() == true ){ m_rubberBandCLIexecutable = test; }else { m_rubberBandCLIexecutable = "Path to Rubberband-CLI"; } } QDomNode pRecentUsedSongsNode = rootNode.firstChildElement( "recentUsedSongs" ); if ( !pRecentUsedSongsNode.isNull() ) { QDomElement pSongElement = pRecentUsedSongsNode.firstChildElement( "song" ); while( !pSongElement.isNull() && !pSongElement.text().isEmpty() ){ m_recentFiles.push_back( pSongElement.text() ); pSongElement = pSongElement.nextSiblingElement( "song" ); } } else { WARNINGLOG( "recentUsedSongs node not found" ); } QDomNode pRecentFXNode = rootNode.firstChildElement( "recentlyUsedEffects" ); if ( ! pRecentFXNode.isNull() ) { QDomElement pFXElement = pRecentFXNode.firstChildElement( "FX" ); while ( !pFXElement.isNull() && ! pFXElement.text().isEmpty()) { m_recentFX.push_back( pFXElement.text() ); pFXElement = pFXElement.nextSiblingElement( "FX" ); } } else { WARNINGLOG( "recentlyUsedEffects node not found" ); } sServerList.clear(); QDomNode pServerListNode = rootNode.firstChildElement( "serverList" ); if ( !pServerListNode.isNull() ) { QDomElement pServerElement = pServerListNode.firstChildElement( "server" ); while ( !pServerElement.isNull() && !pServerElement.text().isEmpty() ) { sServerList.push_back( pServerElement.text() ); pServerElement = pServerElement.nextSiblingElement( "server" ); } } else { WARNINGLOG( "serverList node not found" ); } m_patternCategories.clear(); QDomNode pPatternCategoriesNode = rootNode.firstChildElement( "patternCategories" ); if ( !pPatternCategoriesNode.isNull() ) { QDomElement pPatternCategoriesElement = pPatternCategoriesNode.firstChildElement( "categories" ); while ( !pPatternCategoriesElement.isNull() && !pPatternCategoriesElement.text().isEmpty() ) { m_patternCategories.push_back( pPatternCategoriesElement.text() ); pPatternCategoriesElement = pPatternCategoriesElement.nextSiblingElement( "categories" ); } } else { WARNINGLOG( "patternCategories node not found" ); } /////////////// AUDIO ENGINE ////////////// QDomNode audioEngineNode = rootNode.firstChildElement( "audio_engine" ); if ( audioEngineNode.isNull() ) { WARNINGLOG( "audio_engine node not found" ); recreate = true; } else { m_sAudioDriver = LocalFileMng::readXmlString( audioEngineNode, "audio_driver", m_sAudioDriver ); m_bUseMetronome = LocalFileMng::readXmlBool( audioEngineNode, "use_metronome", m_bUseMetronome ); m_fMetronomeVolume = LocalFileMng::readXmlFloat( audioEngineNode, "metronome_volume", 0.5f ); m_nMaxNotes = LocalFileMng::readXmlInt( audioEngineNode, "maxNotes", m_nMaxNotes ); m_nBufferSize = LocalFileMng::readXmlInt( audioEngineNode, "buffer_size", m_nBufferSize ); m_nSampleRate = LocalFileMng::readXmlInt( audioEngineNode, "samplerate", m_nSampleRate ); //// OSS DRIVER //// QDomNode ossDriverNode = audioEngineNode.firstChildElement( "oss_driver" ); if ( ossDriverNode.isNull() ) { WARNINGLOG( "oss_driver node not found" ); recreate = true; } else { m_sOSSDevice = LocalFileMng::readXmlString( ossDriverNode, "ossDevice", m_sOSSDevice ); } //// JACK DRIVER //// QDomNode jackDriverNode = audioEngineNode.firstChildElement( "jack_driver" ); if ( jackDriverNode.isNull() ) { WARNINGLOG( "jack_driver node not found" ); recreate = true; } else { m_sJackPortName1 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_1", m_sJackPortName1 ); m_sJackPortName2 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_2", m_sJackPortName2 ); QString sMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode", "NO_JACK_TRANSPORT" ); if ( sMode == "NO_JACK_TRANSPORT" ) { m_bJackTransportMode = NO_JACK_TRANSPORT; } else if ( sMode == "USE_JACK_TRANSPORT" ) { m_bJackTransportMode = USE_JACK_TRANSPORT; } //jack time master QString tmMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode_master", "NO_JACK_TIME_MASTER" ); if ( tmMode == "NO_JACK_TIME_MASTER" ) { m_bJackMasterMode = NO_JACK_TIME_MASTER; } else if ( tmMode == "USE_JACK_TIME_MASTER" ) { m_bJackMasterMode = USE_JACK_TIME_MASTER; } //~ jack time master m_bJackTrackOuts = LocalFileMng::readXmlBool( jackDriverNode, "jack_track_outs", m_bJackTrackOuts ); m_bJackConnectDefaults = LocalFileMng::readXmlBool( jackDriverNode, "jack_connect_defaults", m_bJackConnectDefaults ); m_nJackTrackOutputMode = LocalFileMng::readXmlInt( jackDriverNode, "jack_track_output_mode", m_nJackTrackOutputMode ); } /// ALSA AUDIO DRIVER /// QDomNode alsaAudioDriverNode = audioEngineNode.firstChildElement( "alsa_audio_driver" ); if ( alsaAudioDriverNode.isNull() ) { WARNINGLOG( "alsa_audio_driver node not found" ); recreate = true; } else { m_sAlsaAudioDevice = LocalFileMng::readXmlString( alsaAudioDriverNode, "alsa_audio_device", m_sAlsaAudioDevice ); } /// MIDI DRIVER /// QDomNode midiDriverNode = audioEngineNode.firstChildElement( "midi_driver" ); if ( midiDriverNode.isNull() ) { WARNINGLOG( "midi_driver node not found" ); recreate = true; } else { m_sMidiDriver = LocalFileMng::readXmlString( midiDriverNode, "driverName", "ALSA" ); m_sMidiPortName = LocalFileMng::readXmlString( midiDriverNode, "port_name", "None" ); m_sMidiOutputPortName = LocalFileMng::readXmlString( midiDriverNode, "output_port_name", "None" ); m_nMidiChannelFilter = LocalFileMng::readXmlInt( midiDriverNode, "channel_filter", -1 ); m_bMidiNoteOffIgnore = LocalFileMng::readXmlBool( midiDriverNode, "ignore_note_off", true ); m_bMidiDiscardNoteAfterAction = LocalFileMng::readXmlBool( midiDriverNode, "discard_note_after_action", true); m_bMidiFixedMapping = LocalFileMng::readXmlBool( midiDriverNode, "fixed_mapping", false, true ); m_bEnableMidiFeedback = LocalFileMng::readXmlBool( midiDriverNode, "enable_midi_feedback", false, true ); } /// OSC /// QDomNode oscServerNode = audioEngineNode.firstChildElement( "osc_configuration" ); if ( oscServerNode.isNull() ) { WARNINGLOG( "osc_configuration node not found" ); recreate = true; } else { m_bOscServerEnabled = LocalFileMng::readXmlBool( oscServerNode, "oscEnabled", false ); m_bOscFeedbackEnabled = LocalFileMng::readXmlBool( oscServerNode, "oscFeedbackEnabled", true ); m_nOscServerPort = LocalFileMng::readXmlInt( oscServerNode, "oscServerPort", 9000 ); } } /////////////// GUI ////////////// QDomNode guiNode = rootNode.firstChildElement( "gui" ); if ( guiNode.isNull() ) { WARNINGLOG( "gui node not found" ); recreate = true; } else { // QT Style m_sQTStyle = LocalFileMng::readXmlString( guiNode, "QTStyle", m_sQTStyle, true ); if(m_sQTStyle == "Plastique"){ m_sQTStyle = "Fusion"; } // Application font family applicationFontFamily = LocalFileMng::readXmlString( guiNode, "application_font_family", applicationFontFamily ); // Application font pointSize applicationFontPointSize = LocalFileMng::readXmlInt( guiNode, "application_font_pointsize", applicationFontPointSize ); // mixer font family mixerFontFamily = LocalFileMng::readXmlString( guiNode, "mixer_font_family", mixerFontFamily ); // mixer font pointSize mixerFontPointSize = LocalFileMng::readXmlInt( guiNode, "mixer_font_pointsize", mixerFontPointSize ); // Mixer falloff speed mixerFalloffSpeed = LocalFileMng::readXmlFloat( guiNode, "mixer_falloff_speed", 1.1f ); // pattern editor grid resolution m_nPatternEditorGridResolution = LocalFileMng::readXmlInt( guiNode, "patternEditorGridResolution", m_nPatternEditorGridResolution ); m_bPatternEditorUsingTriplets = LocalFileMng::readXmlBool( guiNode, "patternEditorUsingTriplets", m_bPatternEditorUsingTriplets ); m_bShowInstrumentPeaks = LocalFileMng::readXmlBool( guiNode, "showInstrumentPeaks", m_bShowInstrumentPeaks ); m_bIsFXTabVisible = LocalFileMng::readXmlBool( guiNode, "isFXTabVisible", m_bIsFXTabVisible ); m_bShowAutomationArea = LocalFileMng::readXmlBool( guiNode, "showAutomationArea", m_bShowAutomationArea ); m_bShowPlaybackTrack = LocalFileMng::readXmlBool( guiNode, "showPlaybackTrack", m_bShowPlaybackTrack ); // pattern editor grid height m_nPatternEditorGridHeight = LocalFileMng::readXmlInt( guiNode, "patternEditorGridHeight", m_nPatternEditorGridHeight ); // pattern editor grid width m_nPatternEditorGridWidth = LocalFileMng::readXmlInt( guiNode, "patternEditorGridWidth", m_nPatternEditorGridWidth ); // mainForm window properties setMainFormProperties( readWindowProperties( guiNode, "mainForm_properties", mainFormProperties ) ); setMixerProperties( readWindowProperties( guiNode, "mixer_properties", mixerProperties ) ); setPatternEditorProperties( readWindowProperties( guiNode, "patternEditor_properties", patternEditorProperties ) ); setSongEditorProperties( readWindowProperties( guiNode, "songEditor_properties", songEditorProperties ) ); setAudioEngineInfoProperties( readWindowProperties( guiNode, "audioEngineInfo_properties", audioEngineInfoProperties ) ); //export dialog properties m_nExportTemplateIdx = LocalFileMng::readXmlInt( guiNode, "exportDialogTemplate", 0 ); m_nExportModeIdx = LocalFileMng::readXmlInt( guiNode, "exportDialogMode", 0 ); m_nExportSampleRateIdx = LocalFileMng::readXmlInt( guiNode, "exportDialogSampleRate", 0 ); m_nExportSampleDepthIdx = LocalFileMng::readXmlInt( guiNode, "exportDialogSampleDepth", 0 ); m_sExportDirectory = LocalFileMng::readXmlString( guiNode, "exportDialogDirectory", QDir::homePath(), true ); m_bFollowPlayhead = LocalFileMng::readXmlBool( guiNode, "followPlayhead", true ); // midi export dialog properties m_nMidiExportMode = LocalFileMng::readXmlInt( guiNode, "midiExportDialogMode", 0 ); m_sMidiExportDirectory = LocalFileMng::readXmlString( guiNode, "midiExportDialogDirectory", QDir::homePath(), true ); //beatcounter QString bcMode = LocalFileMng::readXmlString( guiNode, "bc", "BC_OFF" ); if ( bcMode == "BC_OFF" ) { m_bbc = BC_OFF; } else if ( bcMode == "BC_ON" ) { m_bbc = BC_ON; } QString setPlay = LocalFileMng::readXmlString( guiNode, "setplay", "SET_PLAY_OFF" ); if ( setPlay == "SET_PLAY_OFF" ) { m_mmcsetplay = SET_PLAY_OFF; } else if ( setPlay == "SET_PLAY_ON" ) { m_mmcsetplay = SET_PLAY_ON; } m_countOffset = LocalFileMng::readXmlInt( guiNode, "countoffset", 0 ); m_startOffset = LocalFileMng::readXmlInt( guiNode, "playoffset", 0 ); //~ beatcounter //SoundLibraryPanel expand items __expandSongItem = LocalFileMng::readXmlBool( guiNode, "expandSongItem", __expandSongItem ); __expandPatternItem = LocalFileMng::readXmlBool( guiNode, "expandPatternItem", __expandPatternItem ); for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) { QString sNodeName = QString("ladspaFX_properties%1").arg( nFX ); setLadspaProperties( nFX, readWindowProperties( guiNode, sNodeName, m_ladspaProperties[nFX] ) ); } QDomNode pUIStyle = guiNode.firstChildElement( "UI_Style" ); if ( !pUIStyle.isNull() ) { readUIStyle( pUIStyle ); } else { WARNINGLOG( "UI_Style node not found" ); recreate = true; } //SongEditor coloring m_nColoringMethod = LocalFileMng::readXmlInt( guiNode, "SongEditor_ColoringMethod", 2 ); m_nColoringMethodAuxValue = LocalFileMng::readXmlInt( guiNode, "SongEditor_ColoringMethodAuxValue", 213 ); } /////////////// FILES ////////////// QDomNode filesNode = rootNode.firstChildElement( "files" ); if ( filesNode.isNull() ) { WARNINGLOG( "files node not found" ); recreate = true; } else { // last used song m_lastSongFilename = LocalFileMng::readXmlString( filesNode, "lastSongFilename", m_lastSongFilename, true ); m_lastPlaylistFilename = LocalFileMng::readXmlString( filesNode, "lastPlaylistFilename", m_lastPlaylistFilename, true ); m_sDefaultEditor = LocalFileMng::readXmlString( filesNode, "defaulteditor", m_sDefaultEditor, true ); } MidiMap::reset_instance(); MidiMap* mM = MidiMap::get_instance(); QDomNode pMidiEventMapNode = rootNode.firstChildElement( "midiEventMap" ); if ( !pMidiEventMapNode.isNull() ) { QDomNode pMidiEventNode = pMidiEventMapNode.firstChildElement( "midiEvent" ); while ( !pMidiEventNode.isNull() ) { if( pMidiEventNode.firstChildElement().nodeName() == QString("mmcEvent")){ QString event = pMidiEventNode.firstChildElement("mmcEvent").text(); QString s_action = pMidiEventNode.firstChildElement("action").text(); QString s_param = pMidiEventNode.firstChildElement("parameter").text(); Action* pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerMMCEvent(event, pAction); } if( pMidiEventNode.firstChildElement().nodeName() == QString("noteEvent")){ QString event = pMidiEventNode.firstChildElement("noteEvent").text(); QString s_action = pMidiEventNode.firstChildElement("action").text(); QString s_param = pMidiEventNode.firstChildElement("parameter").text(); QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").text(); Action* pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerNoteEvent(s_eventParameter.toInt(), pAction); } if( pMidiEventNode.firstChildElement().nodeName() == QString("ccEvent") ){ QString event = pMidiEventNode.firstChildElement("ccEvent").text(); QString s_action = pMidiEventNode.firstChildElement("action").text(); QString s_param = pMidiEventNode.firstChildElement("parameter").text(); QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").text(); Action * pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerCCEvent( s_eventParameter.toInt(), pAction ); } if( pMidiEventNode.firstChildElement().nodeName() == QString("pcEvent") ){ QString event = pMidiEventNode.firstChildElement("pcEvent").text(); QString s_action = pMidiEventNode.firstChildElement("action").text(); QString s_param = pMidiEventNode.firstChildElement("parameter").text(); Action * pAction = new Action( s_action ); pAction->setParameter1( s_param ); mM->registerPCEvent( pAction ); } pMidiEventNode = pMidiEventNode.nextSiblingElement( "midiEvent" ); } } else { WARNINGLOG( "midiMap node not found" ); } } // rootNode else { WARNINGLOG( "hydrogen_preferences node not found" ); recreate = true; } } else { if ( bGlobal ) { WARNINGLOG( "System configuration file not found." ); } else { WARNINGLOG( "Configuration file not found." ); recreate = true; } } if ( m_nMaxLayers < 16 ) { m_nMaxLayers = 16; } // The preferences file should be recreated? if ( recreate == true && !bGlobal ) { WARNINGLOG( "Recreating configuration file." ); savePreferences(); } } /// /// Save the preferences file /// void Preferences::savePreferences() { INFOLOG( "Saving preferences file: " + Filesystem::usr_config_path() ); QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild( header ); QDomNode rootNode = doc.createElement( "hydrogen_preferences" ); // hydrogen version LocalFileMng::writeXmlString( rootNode, "version", QString( get_version().c_str() ) ); ////// GENERAL /////// LocalFileMng::writeXmlString( rootNode, "restoreLastSong", m_brestoreLastSong ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "restoreLastPlaylist", m_brestoreLastPlaylist ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "patternModePlaysSelected", m_bPatternModePlaysSelected ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "useLash", m_bsetLash ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "useTimeLine", __useTimelineBpm ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "maxBars", QString::number( m_nMaxBars ) ); LocalFileMng::writeXmlString( rootNode, "maxLayers", QString::number( m_nMaxLayers ) ); LocalFileMng::writeXmlString( rootNode, "defaultUILayout", QString::number( m_nDefaultUILayout ) ); LocalFileMng::writeXmlString( rootNode, "lastOpenTab", QString::number( m_nLastOpenTab ) ); LocalFileMng::writeXmlString( rootNode, "useTheRubberbandBpmChangeEvent", m_useTheRubberbandBpmChangeEvent ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "preDelete", QString("%1").arg(m_nRecPreDelete) ); LocalFileMng::writeXmlString( rootNode, "postDelete", QString("%1").arg(m_nRecPostDelete) ); LocalFileMng::writeXmlString( rootNode, "useRelativeFilenamesForPlaylists", m_bUseRelativeFilenamesForPlaylists ? "true": "false" ); // instrument input mode LocalFileMng::writeXmlString( rootNode, "instrumentInputMode", __playselectedinstrument ? "true": "false" ); //show development version warning LocalFileMng::writeXmlString( rootNode, "showDevelWarning", m_bShowDevelWarning ? "true": "false" ); // hear new notes in the pattern editor LocalFileMng::writeXmlString( rootNode, "hearNewNotes", hearNewNotes ? "true": "false" ); // key/midi event prefs //LocalFileMng::writeXmlString( rootNode, "recordEvents", recordEvents ? "true": "false" ); LocalFileMng::writeXmlString( rootNode, "quantizeEvents", quantizeEvents ? "true": "false" ); //extern executables if ( QFile( m_rubberBandCLIexecutable ).exists() == false ) { m_rubberBandCLIexecutable = "Path to Rubberband-CLI"; } LocalFileMng::writeXmlString( rootNode, "path_to_rubberband", QString(m_rubberBandCLIexecutable)); // Recent used songs QDomNode recentUsedSongsNode = doc.createElement( "recentUsedSongs" ); { unsigned nSongs = 5; if ( m_recentFiles.size() < 5 ) { nSongs = m_recentFiles.size(); } for ( unsigned i = 0; i < nSongs; i++ ) { LocalFileMng::writeXmlString( recentUsedSongsNode, "song", m_recentFiles[ i ] ); } } rootNode.appendChild( recentUsedSongsNode ); QDomNode recentFXNode = doc.createElement( "recentlyUsedEffects" ); { int nFX = 0; QString FXname; foreach( FXname, m_recentFX ) { LocalFileMng::writeXmlString( recentFXNode, "FX", FXname ); if ( ++nFX > 10 ) break; } } rootNode.appendChild( recentFXNode ); std::list::const_iterator cur_Server; QDomNode serverListNode = doc.createElement( "serverList" ); for( cur_Server = sServerList.begin(); cur_Server != sServerList.end(); ++cur_Server ){ LocalFileMng::writeXmlString( serverListNode , QString("server") , QString( *cur_Server ) ); } rootNode.appendChild( serverListNode ); std::list::const_iterator cur_patternCategories; QDomNode patternCategoriesNode = doc.createElement( "patternCategories" ); for( cur_patternCategories = m_patternCategories.begin(); cur_patternCategories != m_patternCategories.end(); ++cur_patternCategories ){ LocalFileMng::writeXmlString( patternCategoriesNode , QString("categories") , QString( *cur_patternCategories ) ); } rootNode.appendChild( patternCategoriesNode ); //---- AUDIO ENGINE ---- QDomNode audioEngineNode = doc.createElement( "audio_engine" ); { // audio driver LocalFileMng::writeXmlString( audioEngineNode, "audio_driver", m_sAudioDriver ); // use metronome LocalFileMng::writeXmlString( audioEngineNode, "use_metronome", m_bUseMetronome ? "true": "false" ); LocalFileMng::writeXmlString( audioEngineNode, "metronome_volume", QString("%1").arg( m_fMetronomeVolume ) ); LocalFileMng::writeXmlString( audioEngineNode, "maxNotes", QString("%1").arg( m_nMaxNotes ) ); LocalFileMng::writeXmlString( audioEngineNode, "buffer_size", QString("%1").arg( m_nBufferSize ) ); LocalFileMng::writeXmlString( audioEngineNode, "samplerate", QString("%1").arg( m_nSampleRate ) ); //// OSS DRIVER //// QDomNode ossDriverNode = doc.createElement( "oss_driver" ); { LocalFileMng::writeXmlString( ossDriverNode, "ossDevice", m_sOSSDevice ); } audioEngineNode.appendChild( ossDriverNode ); //// JACK DRIVER //// QDomNode jackDriverNode = doc.createElement( "jack_driver" ); { LocalFileMng::writeXmlString( jackDriverNode, "jack_port_name_1", m_sJackPortName1 ); // jack port name 1 LocalFileMng::writeXmlString( jackDriverNode, "jack_port_name_2", m_sJackPortName2 ); // jack port name 2 // jack transport slave QString sMode; if ( m_bJackTransportMode == NO_JACK_TRANSPORT ) { sMode = "NO_JACK_TRANSPORT"; } else if ( m_bJackTransportMode == USE_JACK_TRANSPORT ) { sMode = "USE_JACK_TRANSPORT"; } LocalFileMng::writeXmlString( jackDriverNode, "jack_transport_mode", sMode ); //jack time master QString tmMode; if ( m_bJackMasterMode == NO_JACK_TIME_MASTER ) { tmMode = "NO_JACK_TIME_MASTER"; } else if ( m_bJackMasterMode == USE_JACK_TIME_MASTER ) { tmMode = "USE_JACK_TIME_MASTER"; } LocalFileMng::writeXmlString( jackDriverNode, "jack_transport_mode_master", tmMode ); //~ jack time master // jack default connection QString jackConnectDefaultsString = "false"; if ( m_bJackConnectDefaults ) { jackConnectDefaultsString = "true"; } LocalFileMng::writeXmlString( jackDriverNode, "jack_connect_defaults", jackConnectDefaultsString ); //pre-fader or post-fader track outputs ? LocalFileMng::writeXmlString( jackDriverNode, "jack_track_output_mode", QString("%1").arg( m_nJackTrackOutputMode )); // jack track outs QString jackTrackOutsString = "false"; if ( m_bJackTrackOuts ) { jackTrackOutsString = "true"; } LocalFileMng::writeXmlString( jackDriverNode, "jack_track_outs", jackTrackOutsString ); } audioEngineNode.appendChild( jackDriverNode ); //// ALSA AUDIO DRIVER //// QDomNode alsaAudioDriverNode = doc.createElement( "alsa_audio_driver" ); { LocalFileMng::writeXmlString( alsaAudioDriverNode, "alsa_audio_device", m_sAlsaAudioDevice ); } audioEngineNode.appendChild( alsaAudioDriverNode ); /// MIDI DRIVER /// QDomNode midiDriverNode = doc.createElement( "midi_driver" ); { LocalFileMng::writeXmlString( midiDriverNode, "driverName", m_sMidiDriver ); LocalFileMng::writeXmlString( midiDriverNode, "port_name", m_sMidiPortName ); LocalFileMng::writeXmlString( midiDriverNode, "output_port_name", m_sMidiOutputPortName ); LocalFileMng::writeXmlString( midiDriverNode, "channel_filter", QString("%1").arg( m_nMidiChannelFilter ) ); if ( m_bMidiNoteOffIgnore ) { LocalFileMng::writeXmlString( midiDriverNode, "ignore_note_off", "true" ); } else { LocalFileMng::writeXmlString( midiDriverNode, "ignore_note_off", "false" ); } if ( m_bEnableMidiFeedback ) { LocalFileMng::writeXmlString( midiDriverNode, "enable_midi_feedback", "true" ); } else { LocalFileMng::writeXmlString( midiDriverNode, "enable_midi_feedback", "false" ); } if ( m_bMidiDiscardNoteAfterAction ) { LocalFileMng::writeXmlString( midiDriverNode, "discard_note_after_action", "true" ); } else { LocalFileMng::writeXmlString( midiDriverNode, "discard_note_after_action", "false" ); } if ( m_bMidiFixedMapping ) { LocalFileMng::writeXmlString( midiDriverNode, "fixed_mapping", "true" ); INFOLOG("Saving fixed mapping\n"); } else { LocalFileMng::writeXmlString( midiDriverNode, "fixed_mapping", "false" ); INFOLOG("Saving fixed mapping false\n"); } } audioEngineNode.appendChild( midiDriverNode ); /// OSC /// QDomNode oscNode = doc.createElement( "osc_configuration" ); { LocalFileMng::writeXmlString( oscNode, "oscServerPort", QString("%1").arg( m_nOscServerPort ) ); if ( m_bOscServerEnabled ) { LocalFileMng::writeXmlString( oscNode, "oscEnabled", "true" ); } else { LocalFileMng::writeXmlString( oscNode, "oscEnabled", "false" ); } if ( m_bOscFeedbackEnabled ) { LocalFileMng::writeXmlString( oscNode, "oscFeedbackEnabled", "true" ); } else { LocalFileMng::writeXmlString( oscNode, "oscFeedbackEnabled", "false" ); } } audioEngineNode.appendChild( oscNode ); } rootNode.appendChild( audioEngineNode ); //---- GUI ---- QDomNode guiNode = doc.createElement( "gui" ); { LocalFileMng::writeXmlString( guiNode, "QTStyle", m_sQTStyle ); LocalFileMng::writeXmlString( guiNode, "application_font_family", applicationFontFamily ); LocalFileMng::writeXmlString( guiNode, "application_font_pointsize", QString("%1").arg( applicationFontPointSize ) ); LocalFileMng::writeXmlString( guiNode, "mixer_font_family", mixerFontFamily ); LocalFileMng::writeXmlString( guiNode, "mixer_font_pointsize", QString("%1").arg( mixerFontPointSize ) ); LocalFileMng::writeXmlString( guiNode, "mixer_falloff_speed", QString("%1").arg( mixerFalloffSpeed ) ); LocalFileMng::writeXmlString( guiNode, "patternEditorGridResolution", QString("%1").arg( m_nPatternEditorGridResolution ) ); LocalFileMng::writeXmlString( guiNode, "patternEditorGridHeight", QString("%1").arg( m_nPatternEditorGridHeight ) ); LocalFileMng::writeXmlString( guiNode, "patternEditorGridWidth", QString("%1").arg( m_nPatternEditorGridWidth ) ); LocalFileMng::writeXmlBool( guiNode, "patternEditorUsingTriplets", m_bPatternEditorUsingTriplets ); LocalFileMng::writeXmlBool( guiNode, "showInstrumentPeaks", m_bShowInstrumentPeaks ); LocalFileMng::writeXmlBool( guiNode, "isFXTabVisible", m_bIsFXTabVisible ); LocalFileMng::writeXmlBool( guiNode, "showAutomationArea", m_bShowAutomationArea ); LocalFileMng::writeXmlBool( guiNode, "showPlaybackTrack", m_bShowPlaybackTrack ); // MainForm window properties writeWindowProperties( guiNode, "mainForm_properties", mainFormProperties ); writeWindowProperties( guiNode, "mixer_properties", mixerProperties ); writeWindowProperties( guiNode, "patternEditor_properties", patternEditorProperties ); writeWindowProperties( guiNode, "songEditor_properties", songEditorProperties ); writeWindowProperties( guiNode, "drumkitManager_properties", drumkitManagerProperties ); writeWindowProperties( guiNode, "audioEngineInfo_properties", audioEngineInfoProperties ); for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) { QString sNode = QString("ladspaFX_properties%1").arg( nFX ); writeWindowProperties( guiNode, sNode, m_ladspaProperties[nFX] ); } //ExportSongDialog LocalFileMng::writeXmlString( guiNode, "exportDialogMode", QString("%1").arg( m_nExportModeIdx ) ); LocalFileMng::writeXmlString( guiNode, "exportDialogTemplate", QString("%1").arg( m_nExportTemplateIdx ) ); LocalFileMng::writeXmlString( guiNode, "exportDialogSampleRate", QString("%1").arg( m_nExportSampleRateIdx ) ); LocalFileMng::writeXmlString( guiNode, "exportDialogSampleDepth", QString("%1").arg( m_nExportSampleDepthIdx ) ); LocalFileMng::writeXmlString( guiNode, "exportDialogDirectory", m_sExportDirectory ); LocalFileMng::writeXmlBool( guiNode, "followPlayhead", m_bFollowPlayhead ); //ExportMidiDialog LocalFileMng::writeXmlString( guiNode, "midiExportDialogMode", QString("%1").arg( m_nMidiExportMode ) ); LocalFileMng::writeXmlString( guiNode, "midiExportDialogDirectory", m_sMidiExportDirectory ); //beatcounter QString bcMode; if ( m_bbc == BC_OFF ) { bcMode = "BC_OFF"; } else if ( m_bbc == BC_ON ) { bcMode = "BC_ON"; } LocalFileMng::writeXmlString( guiNode, "bc", bcMode ); QString setPlay; if ( m_mmcsetplay == SET_PLAY_OFF ) { setPlay = "SET_PLAY_OFF"; } else if ( m_mmcsetplay == SET_PLAY_ON ) { setPlay = "SET_PLAY_ON"; } LocalFileMng::writeXmlString( guiNode, "setplay", setPlay ); LocalFileMng::writeXmlString( guiNode, "countoffset", QString("%1").arg(m_countOffset) ); LocalFileMng::writeXmlString( guiNode, "playoffset", QString("%1").arg(m_startOffset) ); //~ beatcounter //SoundLibraryPanel expand items LocalFileMng::writeXmlString( guiNode, "expandSongItem", __expandSongItem ? "true": "false" ); LocalFileMng::writeXmlString( guiNode, "expandPatternItem", __expandPatternItem ? "true": "false" ); // User interface style writeUIStyle( guiNode ); //SongEditor coloring method LocalFileMng::writeXmlString( guiNode, "SongEditor_ColoringMethod", QString::number( m_nColoringMethod ) ); LocalFileMng::writeXmlString( guiNode, "SongEditor_ColoringMethodAuxValue", QString::number( m_nColoringMethodAuxValue ) ); } rootNode.appendChild( guiNode ); //---- FILES ---- QDomNode filesNode = doc.createElement( "files" ); { // last used song LocalFileMng::writeXmlString( filesNode, "lastSongFilename", m_lastSongFilename ); LocalFileMng::writeXmlString( filesNode, "lastPlaylistFilename", m_lastPlaylistFilename ); LocalFileMng::writeXmlString( filesNode, "defaulteditor", m_sDefaultEditor ); } rootNode.appendChild( filesNode ); MidiMap * mM = MidiMap::get_instance(); std::map< QString, Action* > mmcMap = mM->getMMCMap(); //---- MidiMap ---- QDomNode midiEventMapNode = doc.createElement( "midiEventMap" ); std::map< QString, Action* >::iterator dIter( mmcMap.begin() ); for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ){ QString event = dIter->first; Action * pAction = dIter->second; if ( pAction->getType() != "NOTHING" ){ QDomNode midiEventNode = doc.createElement( "midiEvent" ); LocalFileMng::writeXmlString( midiEventNode, "mmcEvent" , event ); LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType()); LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() ); midiEventMapNode.appendChild( midiEventNode ); } } for( int note=0; note < 128; note++ ){ Action * pAction = mM->getNoteAction( note ); if( pAction != nullptr && pAction->getType() != "NOTHING") { QDomNode midiEventNode = doc.createElement( "midiEvent" ); LocalFileMng::writeXmlString( midiEventNode, "noteEvent" , QString("NOTE") ); LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( note ) ); LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() ); LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() ); midiEventMapNode.appendChild( midiEventNode ); } } for( int parameter=0; parameter < 128; parameter++ ){ Action * pAction = mM->getCCAction( parameter ); if( pAction != nullptr && pAction->getType() != "NOTHING") { QDomNode midiEventNode = doc.createElement( "midiEvent" ); LocalFileMng::writeXmlString( midiEventNode, "ccEvent" , QString("CC") ); LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( parameter ) ); LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() ); LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() ); midiEventMapNode.appendChild( midiEventNode ); } } { Action * pAction = mM->getPCAction(); if( pAction != nullptr && pAction->getType() != "NOTHING") { QDomNode midiEventNode = doc.createElement( "midiEvent" ); LocalFileMng::writeXmlString( midiEventNode, "pcEvent" , QString("PROGRAM_CHANGE") ); LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() ); LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() ); midiEventMapNode.appendChild( midiEventNode ); } } rootNode.appendChild( midiEventMapNode ); doc.appendChild( rootNode ); QFile file( Filesystem::usr_config_path() ); if ( !file.open(QIODevice::WriteOnly) ) return; QTextStream TextStream( &file ); doc.save( TextStream, 1 ); file.close(); } void Preferences::setMostRecentFX( QString FX_name ) { int pos = m_recentFX.indexOf( FX_name ); if ( pos != -1 ) m_recentFX.removeAt( pos ); m_recentFX.push_front( FX_name ); } void Preferences::setRecentFiles( std::vector recentFiles ) { // find single filenames. (skip duplicates) std::vector temp; for ( unsigned i = 0; i < recentFiles.size(); i++ ) { QString sFilename = recentFiles[ i ]; bool bExists = false; for ( unsigned j = 0; j < temp.size(); j++ ) { if ( sFilename == temp[ j ] ) { bExists = true; break; } } if ( !bExists ) { temp.push_back( sFilename ); } } m_recentFiles = temp; } /// Read the xml nodes related to window properties WindowProperties Preferences::readWindowProperties( QDomNode parent, const QString& windowName, WindowProperties defaultProp ) { WindowProperties prop = defaultProp; QDomNode windowPropNode = parent.firstChildElement( windowName ); if ( windowPropNode.isNull() ) { WARNINGLOG( "Error reading configuration file: " + windowName + " node not found" ); } else { prop.visible = LocalFileMng::readXmlBool( windowPropNode, "visible", true ); prop.x = LocalFileMng::readXmlInt( windowPropNode, "x", prop.x ); prop.y = LocalFileMng::readXmlInt( windowPropNode, "y", prop.y ); prop.width = LocalFileMng::readXmlInt( windowPropNode, "width", prop.width ); prop.height = LocalFileMng::readXmlInt( windowPropNode, "height", prop.height ); } return prop; } /// Write the xml nodes related to window properties void Preferences::writeWindowProperties( QDomNode parent, const QString& windowName, const WindowProperties& prop ) { QDomDocument doc; QDomNode windowPropNode = doc.createElement( windowName ); if ( prop.visible ) { LocalFileMng::writeXmlString( windowPropNode, "visible", "true" ); } else { LocalFileMng::writeXmlString( windowPropNode, "visible", "false" ); } LocalFileMng::writeXmlString( windowPropNode, "x", QString("%1").arg( prop.x ) ); LocalFileMng::writeXmlString( windowPropNode, "y", QString("%1").arg( prop.y ) ); LocalFileMng::writeXmlString( windowPropNode, "width", QString("%1").arg( prop.width ) ); LocalFileMng::writeXmlString( windowPropNode, "height", QString("%1").arg( prop.height ) ); parent.appendChild( windowPropNode ); } void Preferences::writeUIStyle( QDomNode parent ) { QDomDocument doc; QDomNode node = doc.createElement( "UI_Style" ); // SONG EDITOR QDomNode songEditorNode = doc.createElement( "songEditor" ); LocalFileMng::writeXmlString( songEditorNode, "backgroundColor", m_pDefaultUIStyle->m_songEditor_backgroundColor.toStringFmt() ); LocalFileMng::writeXmlString( songEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_songEditor_alternateRowColor.toStringFmt() ); LocalFileMng::writeXmlString( songEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_songEditor_selectedRowColor.toStringFmt() ); LocalFileMng::writeXmlString( songEditorNode, "lineColor", m_pDefaultUIStyle->m_songEditor_lineColor.toStringFmt() ); LocalFileMng::writeXmlString( songEditorNode, "textColor", m_pDefaultUIStyle->m_songEditor_textColor.toStringFmt() ); LocalFileMng::writeXmlString( songEditorNode, "pattern1Color", m_pDefaultUIStyle->m_songEditor_pattern1Color.toStringFmt() ); node.appendChild( songEditorNode ); // PATTERN EDITOR QDomNode patternEditorNode = doc.createElement( "patternEditor" ); LocalFileMng::writeXmlString( patternEditorNode, "backgroundColor", m_pDefaultUIStyle->m_patternEditor_backgroundColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_patternEditor_alternateRowColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_patternEditor_selectedRowColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "textColor", m_pDefaultUIStyle->m_patternEditor_textColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "noteColor", m_pDefaultUIStyle->m_patternEditor_noteColor.toStringFmt() ); if (m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() == "-1,-1,-1" ){ m_pDefaultUIStyle->m_patternEditor_noteoffColor = H2RGBColor( "100, 100, 200" ); } LocalFileMng::writeXmlString( patternEditorNode, "noteoffColor", m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "lineColor", m_pDefaultUIStyle->m_patternEditor_lineColor.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "line1Color", m_pDefaultUIStyle->m_patternEditor_line1Color.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "line2Color", m_pDefaultUIStyle->m_patternEditor_line2Color.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "line3Color", m_pDefaultUIStyle->m_patternEditor_line3Color.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "line4Color", m_pDefaultUIStyle->m_patternEditor_line4Color.toStringFmt() ); LocalFileMng::writeXmlString( patternEditorNode, "line5Color", m_pDefaultUIStyle->m_patternEditor_line5Color.toStringFmt() ); node.appendChild( patternEditorNode ); parent.appendChild( node ); } void Preferences::readUIStyle( QDomNode parent ) { // SONG EDITOR QDomNode pSongEditorNode = parent.firstChildElement( "songEditor" ); if ( !pSongEditorNode.isNull() ) { m_pDefaultUIStyle->m_songEditor_backgroundColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "backgroundColor", m_pDefaultUIStyle->m_songEditor_backgroundColor.toStringFmt() ) ); m_pDefaultUIStyle->m_songEditor_alternateRowColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_songEditor_alternateRowColor.toStringFmt() ) ); m_pDefaultUIStyle->m_songEditor_selectedRowColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_songEditor_selectedRowColor.toStringFmt() ) ); m_pDefaultUIStyle->m_songEditor_lineColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "lineColor", m_pDefaultUIStyle->m_songEditor_lineColor.toStringFmt() ) ); m_pDefaultUIStyle->m_songEditor_textColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "textColor", m_pDefaultUIStyle->m_songEditor_textColor.toStringFmt() ) ); m_pDefaultUIStyle->m_songEditor_pattern1Color = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "pattern1Color", m_pDefaultUIStyle->m_songEditor_pattern1Color.toStringFmt() ) ); } else { WARNINGLOG( "songEditor node not found" ); } // PATTERN EDITOR QDomNode pPatternEditorNode = parent.firstChildElement( "patternEditor" ); if ( !pPatternEditorNode.isNull() ) { m_pDefaultUIStyle->m_patternEditor_backgroundColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "backgroundColor", m_pDefaultUIStyle->m_patternEditor_backgroundColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_alternateRowColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_patternEditor_alternateRowColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_selectedRowColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_patternEditor_selectedRowColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_textColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "textColor", m_pDefaultUIStyle->m_patternEditor_textColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_noteColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "noteColor", m_pDefaultUIStyle->m_patternEditor_noteColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_noteoffColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "noteoffColor", m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_lineColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "lineColor", m_pDefaultUIStyle->m_patternEditor_lineColor.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_line1Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line1Color", m_pDefaultUIStyle->m_patternEditor_line1Color.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_line2Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line2Color", m_pDefaultUIStyle->m_patternEditor_line2Color.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_line3Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line3Color", m_pDefaultUIStyle->m_patternEditor_line3Color.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_line4Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line4Color", m_pDefaultUIStyle->m_patternEditor_line4Color.toStringFmt() ) ); m_pDefaultUIStyle->m_patternEditor_line5Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line5Color", m_pDefaultUIStyle->m_patternEditor_line5Color.toStringFmt() ) ); } else { WARNINGLOG( "patternEditor node not found" ); } } // ----------------------- const char* WindowProperties::__class_name = "WindowProperties"; WindowProperties::WindowProperties() : Object( __class_name ) { // infoLog( "INIT" ); x = 0; y = 0; width = 0; height = 0; visible = true; } WindowProperties::~WindowProperties() { // infoLog( "DESTROY" ); } // ::::::::::::::::::::::::::::::: const char* UIStyle::__class_name = "UIStyle"; UIStyle::UIStyle() : Object( __class_name ) { // infoLog( "INIT" ); } // :::::::::::::::::::::::::::::::::::::: const char* H2RGBColor::__class_name = "H2RGBColor"; H2RGBColor::H2RGBColor( int r, int g, int b ) : Object( __class_name ) , m_red( r ) , m_green( g ) , m_blue( b ) { // infoLog( "INIT" ); m_red %= 256; m_green %= 256; m_blue %= 256; } H2RGBColor::~H2RGBColor() { // infoLog( "DESTROY" ); } H2RGBColor::H2RGBColor( const QString& sColor ) : Object( __class_name ) { // infoLog( "INIT " + sColor ); QString temp = sColor; QStringList list = temp.split(","); m_red = list[0].toInt(); m_green = list[1].toInt(); m_blue = list[2].toInt(); m_red %= 256; m_green %= 256; m_blue %= 256; } QString H2RGBColor::toStringFmt() { char tmp[255]; sprintf( tmp, "%d,%d,%d", m_red, m_green, m_blue ); return QString( tmp ); } }; hydrogen-1.0.0-rc1/src/core/src/sampler/000077500000000000000000000000001366722712400177755ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/sampler/sampler.cpp000066400000000000000000001342341366722712400221530ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace H2Core { const char* Sampler::__class_name = "Sampler"; static Instrument* create_instrument(int id, const QString& filepath, float volume ) { Instrument* instrument = new Instrument( id, filepath ); instrument->set_volume( volume ); InstrumentLayer* pLayer = new InstrumentLayer( Sample::load( filepath ) ); InstrumentComponent* pComponent = new InstrumentComponent( 0 ); pComponent->set_layer( pLayer, 0 ); instrument->get_components()->push_back( pComponent ); return instrument; } Sampler::Sampler() : Object( __class_name ) , __main_out_L( nullptr ) , __main_out_R( nullptr ) , __preview_instrument( nullptr ) { INFOLOG( "INIT" ); __interpolateMode = LINEAR; __main_out_L = new float[ MAX_BUFFER_SIZE ]; __main_out_R = new float[ MAX_BUFFER_SIZE ]; m_nMaxLayers = InstrumentComponent::getMaxLayers(); QString sEmptySampleFilename = Filesystem::empty_sample_path(); // instrument used in file preview __preview_instrument = create_instrument( EMPTY_INSTR_ID, sEmptySampleFilename, 0.8 ); __preview_instrument->set_is_preview_instrument( true ); // dummy instrument used for playback track __playback_instrument = create_instrument( PLAYBACK_INSTR_ID, sEmptySampleFilename, 0.8 ); __playBackSamplePosition = 0; } Sampler::~Sampler() { INFOLOG( "DESTROY" ); delete[] __main_out_L; delete[] __main_out_R; delete __preview_instrument; __preview_instrument = nullptr; delete __playback_instrument; __playback_instrument = nullptr; } // perche' viene passata anche la canzone? E' davvero necessaria? void Sampler::process( uint32_t nFrames, Song* pSong ) { //infoLog( "[process]" ); AudioOutput* audio_output = Hydrogen::get_instance()->getAudioOutput(); assert( audio_output ); memset( __main_out_L, 0, nFrames * sizeof( float ) ); memset( __main_out_R, 0, nFrames * sizeof( float ) ); // Track output queues are zeroed by // audioEngine_process_clearAudioBuffers() // Max notes limit int m_nMaxNotes = Preferences::get_instance()->m_nMaxNotes; while ( ( int )__playing_notes_queue.size() > m_nMaxNotes ) { Note *oldNote = __playing_notes_queue[ 0 ]; __playing_notes_queue.erase( __playing_notes_queue.begin() ); oldNote->get_instrument()->dequeue(); delete oldNote; // FIXME: send note-off instead of removing the note from the list? } for (std::vector::iterator it = pSong->get_components()->begin() ; it != pSong->get_components()->end(); ++it) { DrumkitComponent* component = *it; component->reset_outs(nFrames); } // eseguo tutte le note nella lista di note in esecuzione unsigned i = 0; Note* pNote; while ( i < __playing_notes_queue.size() ) { pNote = __playing_notes_queue[ i ]; // recupero una nuova nota if ( __render_note( pNote, nFrames, pSong ) ) { // la nota e' finita __playing_notes_queue.erase( __playing_notes_queue.begin() + i ); pNote->get_instrument()->dequeue(); __queuedNoteOffs.push_back( pNote ); // delete pNote; // pNote = NULL; } else { ++i; // carico la prox nota } } //Queue midi note off messages for notes that have a length specified for them while ( !__queuedNoteOffs.empty() ) { pNote = __queuedNoteOffs[0]; MidiOutput* pMidiOut = Hydrogen::get_instance()->getMidiOutput(); if( pMidiOut != nullptr && !pNote->get_instrument()->is_muted() ){ pMidiOut->handleQueueNoteOff( pNote->get_instrument()->get_midi_out_channel(), pNote->get_midi_key(), pNote->get_midi_velocity() ); } __queuedNoteOffs.erase( __queuedNoteOffs.begin() ); if( pNote != nullptr ){ delete pNote; } pNote = nullptr; }//while processPlaybackTrack(nFrames); } void Sampler::note_on( Note *note ) { //infoLog( "[noteOn]" ); assert( note ); note->get_adsr()->attack(); Instrument *pInstr = note->get_instrument(); // mute group int mute_grp = pInstr->get_mute_group(); if ( mute_grp != -1 ) { // remove all notes using the same mute group for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { // delete older note Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_instrument() != pInstr ) && ( pNote->get_instrument()->get_mute_group() == mute_grp ) ) { pNote->get_adsr()->release(); } } } //note off notes if( note->get_note_off() ){ for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_instrument() == pInstr ) ) { //ERRORLOG("note_off"); pNote->get_adsr()->release(); } } } pInstr->enqueue(); if( !note->get_note_off() ){ __playing_notes_queue.push_back( note ); } } void Sampler::midi_keyboard_note_off( int key ) { for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( ( pNote->get_midi_msg() == key) ) { pNote->get_adsr()->release(); } } } void Sampler::note_off( Note* note ) /* * this old note_off function is only used by right click on mixer channel strip play button * all other note_off stuff will handle in midi_keyboard_note_off() and note_on() */ { Instrument *pInstr = note->get_instrument(); // find the notes using the same instrument, and release them for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { Note *pNote = __playing_notes_queue[ j ]; if ( pNote->get_instrument() == pInstr ) { pNote->get_adsr()->release(); } } delete note; } /// Render a note /// Return false: the note is not ended /// Return true: the note is ended bool Sampler::__render_note( Note* pNote, unsigned nBufferSize, Song* pSong ) { //infoLog( "[renderNote] instr: " + pNote->getInstrument()->m_sName ); assert( pSong ); unsigned int nFramepos; Hydrogen* pEngine = Hydrogen::get_instance(); AudioOutput* audio_output = pEngine->getAudioOutput(); if ( pEngine->getState() == STATE_PLAYING ) { nFramepos = audio_output->m_transport.m_nFrames; } else { // use this to support realtime events when not playing nFramepos = pEngine->getRealtimeFrames(); } Instrument *pInstr = pNote->get_instrument(); if ( !pInstr ) { ERRORLOG( "NULL instrument" ); return 1; } bool nReturnValues [pInstr->get_components()->size()]; for(int i = 0; i < pInstr->get_components()->size(); i++){ nReturnValues[i] = false; } int nReturnValueIndex = 0; int nAlreadySelectedLayer = -1; for (std::vector::iterator it = pInstr->get_components()->begin() ; it !=pInstr->get_components()->end(); ++it) { nReturnValues[nReturnValueIndex] = false; InstrumentComponent *pCompo = *it; DrumkitComponent* pMainCompo = nullptr; if( pNote->get_specific_compo_id() != -1 && pNote->get_specific_compo_id() != pCompo->get_drumkit_componentID() ) { continue; } if( pInstr->is_preview_instrument() || pInstr->is_metronome_instrument()){ pMainCompo = pEngine->getSong()->get_components()->front(); } else { pMainCompo = pEngine->getSong()->get_component( pCompo->get_drumkit_componentID() ); } assert(pMainCompo); float fLayerGain = 1.0; float fLayerPitch = 0.0; // scelgo il sample da usare in base alla velocity Sample *pSample = nullptr; SelectedLayerInfo *pSelectedLayer = pNote->get_layer_selected( pCompo->get_drumkit_componentID() ); if ( !pSelectedLayer ) { QString dummy = QString( "NULL Layer Information for instrument %1. Component: %2" ).arg( pInstr->get_name() ).arg( pCompo->get_drumkit_componentID() ); WARNINGLOG( dummy ); nReturnValues[nReturnValueIndex] = true; continue; } if( pSelectedLayer->SelectedLayer != -1 ) { InstrumentLayer *pLayer = pCompo->get_layer( pSelectedLayer->SelectedLayer ); if( pLayer ) { pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } else { switch ( pInstr->sample_selection_alg() ) { case Instrument::VELOCITY: for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ) { InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) continue; if ( ( pNote->get_velocity() >= pLayer->get_start_velocity() ) && ( pNote->get_velocity() <= pLayer->get_end_velocity() ) ) { pSelectedLayer->SelectedLayer = nLayer; pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); break; } } if ( !pSample ){ WARNINGLOG( "Velocity did fall into a hole between the instrument layers." ); // There are a small distance between the // layers of the instruments the velocity of // the pNote has fallen into. This can if the // drumkits weren't written with enough care. // To fix this rare problem, we have to search // for the nearest layer and use its sample. float shortestDistance = 1.0f; int nearestLayer = -1; for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ){ InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) continue; if ( min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ) < shortestDistance ){ shortestDistance = min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ); nearestLayer = nLayer; } } // Check whether the search was successful and assign the results. if ( nearestLayer > -1 ){ InstrumentLayer *pLayer = pCompo->get_layer( nearestLayer ); pSelectedLayer->SelectedLayer = nearestLayer; pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } break; case Instrument::RANDOM: if( nAlreadySelectedLayer != -1 ) { InstrumentLayer *pLayer = pCompo->get_layer( nAlreadySelectedLayer ); if ( pLayer != nullptr ) { pSelectedLayer->SelectedLayer = nAlreadySelectedLayer; pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } if( pSample == nullptr ) { int __possibleIndex[ m_nMaxLayers ]; int __foundSamples = 0; for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ) { InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) continue; if ( ( pNote->get_velocity() >= pLayer->get_start_velocity() ) && ( pNote->get_velocity() <= pLayer->get_end_velocity() ) ) { __possibleIndex[__foundSamples] = nLayer; __foundSamples++; } } // In some instruments the start and end // velocities of a layer are not set // perfectly giving rise to some 'holes'. // Occasionally the velocity of a note // can fall into it causing the sampler // to just skip it. Instead, we will search // for the nearest sample and play this // one instead. if ( __foundSamples == 0 ){ WARNINGLOG( "Velocity did fall into a hole between the instrument layers." ); float shortestDistance = 1.0f; int nearestLayer = -1; for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ){ InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) continue; if ( min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ) < shortestDistance ){ shortestDistance = min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ); nearestLayer = nLayer; } } // Check whether the search was // successful and assign the // results. if ( nearestLayer > -1 ){ pSelectedLayer->SelectedLayer = nearestLayer; // No loop needed in here. // Since the note was in // no layer in the first // place, only one is // sufficient. __possibleIndex[__foundSamples] = nearestLayer; __foundSamples++; } } if( __foundSamples > 0 ) { nAlreadySelectedLayer = __possibleIndex[rand() % __foundSamples]; pSelectedLayer->SelectedLayer = nAlreadySelectedLayer; InstrumentLayer *pLayer = pCompo->get_layer( nAlreadySelectedLayer ); pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } break; case Instrument::ROUND_ROBIN: if( nAlreadySelectedLayer != -1 ) { InstrumentLayer *pLayer = pCompo->get_layer( nAlreadySelectedLayer ); if ( pLayer != nullptr ) { pSelectedLayer->SelectedLayer = nAlreadySelectedLayer; pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } if( !pSample ) { int __possibleIndex[ m_nMaxLayers ]; int __foundSamples = 0; float __roundRobinID; for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ) { InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) continue; if ( ( pNote->get_velocity() >= pLayer->get_start_velocity() ) && ( pNote->get_velocity() <= pLayer->get_end_velocity() ) ) { __possibleIndex[__foundSamples] = nLayer; __roundRobinID = pLayer->get_start_velocity(); __foundSamples++; } } // In some instruments the start and end // velocities of a layer are not set // perfectly giving rise to some 'holes'. // Occasionally the velocity of a note // can fall into it causing the sampler // to just skip it. Instead, we will search // for the nearest sample and play this // one instead. if ( __foundSamples == 0 ){ WARNINGLOG( "Velocity did fall into a hole between the instrument layers." ); float shortestDistance = 1.0f; int nearestLayer = -1; for ( unsigned nLayer = 0; nLayer < m_nMaxLayers; ++nLayer ){ InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer == nullptr ) { continue; } if ( min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ) < shortestDistance ){ shortestDistance = min( abs( pLayer->get_start_velocity() - pNote->get_velocity() ), abs( pLayer->get_start_velocity() - pNote->get_velocity() ) ); nearestLayer = nLayer; } } // Check whether the search was // successful and assign the // results. if ( nearestLayer > -1 ){ InstrumentLayer *pLayer = pCompo->get_layer( nearestLayer ); pSelectedLayer->SelectedLayer = nearestLayer; // No loop needed in here. // Since the note was in // no layer in the first // place, only one is // sufficient. __possibleIndex[__foundSamples] = nearestLayer; __roundRobinID = pLayer->get_start_velocity(); __foundSamples++; } } if( __foundSamples > 0 ) { __roundRobinID = pInstr->get_id() * 10 + __roundRobinID; int p_indexToUse = pSong->get_latest_round_robin(__roundRobinID)+1; if( p_indexToUse > __foundSamples - 1) { p_indexToUse = 0; } pSong->set_latest_round_robin(__roundRobinID, p_indexToUse); nAlreadySelectedLayer = __possibleIndex[p_indexToUse]; pSelectedLayer->SelectedLayer = nAlreadySelectedLayer; InstrumentLayer *pLayer = pCompo->get_layer( nAlreadySelectedLayer ); pSample = pLayer->get_sample(); fLayerGain = pLayer->get_gain(); fLayerPitch = pLayer->get_pitch(); } } break; } } if ( !pSample ) { QString dummy = QString( "NULL sample for instrument %1. Note velocity: %2" ).arg( pInstr->get_name() ).arg( pNote->get_velocity() ); WARNINGLOG( dummy ); nReturnValues[nReturnValueIndex] = true; continue; } if ( pSelectedLayer->SamplePosition >= pSample->get_frames() ) { WARNINGLOG( "sample position out of bounds. The layer has been resized during note play?" ); nReturnValues[nReturnValueIndex] = true; continue; } int noteStartInFrames = ( int ) ( pNote->get_position() * audio_output->m_transport.m_fTickSize ) + pNote->get_humanize_delay(); int nInitialSilence = 0; if ( noteStartInFrames > ( int ) nFramepos ) { // scrivo silenzio prima dell'inizio della nota nInitialSilence = noteStartInFrames - nFramepos; int nFrames = nBufferSize - nInitialSilence; if ( nFrames < 0 ) { int noteStartInFramesNoHumanize = ( int )pNote->get_position() * audio_output->m_transport.m_fTickSize; if ( noteStartInFramesNoHumanize > ( int )( nFramepos + nBufferSize ) ) { // this note is not valid. it's in the future...let's skip it.... ERRORLOG( QString( "Note pos in the future?? Current frames: %1, note frame pos: %2" ).arg( nFramepos ).arg(noteStartInFramesNoHumanize ) ); //pNote->dumpInfo(); nReturnValues[nReturnValueIndex] = true; continue; } // delay note execution //INFOLOG( "Delaying note execution. noteStartInFrames: " + to_string( noteStartInFrames ) + ", nFramePos: " + to_string( nFramepos ) ); //return 0; continue; } } float cost_L = 1.0f; float cost_R = 1.0f; float cost_track_L = 1.0f; float cost_track_R = 1.0f; assert(pMainCompo); bool isMutedForExport = (pEngine->getIsExportSessionActive() && !pInstr->is_currently_exported()); /* * Is instrument muted? * * This can be the case either if the song, instrument or component is muted or if we're in an * export session and we're doing per-instruments exports, but this instrument is not currently * being exported. */ if ( isMutedForExport || pInstr->is_muted() || pSong->__is_muted || pMainCompo->is_muted() ) { cost_L = 0.0; cost_R = 0.0; if ( Preferences::get_instance()->m_nJackTrackOutputMode == 0 ) { // Post-Fader cost_track_L = 0.0; cost_track_R = 0.0; } } else { // Precompute some values... if ( pInstr->get_apply_velocity() ) { cost_L = cost_L * pNote->get_velocity(); // note velocity cost_R = cost_R * pNote->get_velocity(); // note velocity } cost_L = cost_L * pNote->get_pan_l(); // note pan cost_L = cost_L * fLayerGain; // layer gain cost_L = cost_L * pInstr->get_pan_l(); // instrument pan cost_L = cost_L * pInstr->get_gain(); // instrument gain cost_L = cost_L * pCompo->get_gain(); // Component gain cost_L = cost_L * pMainCompo->get_volume(); // Component volument cost_L = cost_L * pInstr->get_volume(); // instrument volume if ( Preferences::get_instance()->m_nJackTrackOutputMode == 0 ) { // Post-Fader cost_track_L = cost_L * 2; } cost_L = cost_L * pSong->get_volume(); // song volume cost_L = cost_L * 2; // max pan is 0.5 cost_R = cost_R * pNote->get_pan_r(); // note pan cost_R = cost_R * fLayerGain; // layer gain cost_R = cost_R * pInstr->get_pan_r(); // instrument pan cost_R = cost_R * pInstr->get_gain(); // instrument gain cost_R = cost_R * pCompo->get_gain(); // Component gain cost_R = cost_R * pMainCompo->get_volume(); // Component volument cost_R = cost_R * pInstr->get_volume(); // instrument volume if ( Preferences::get_instance()->m_nJackTrackOutputMode == 0 ) { // Post-Fader cost_track_R = cost_R * 2; } cost_R = cost_R * pSong->get_volume(); // song pan cost_R = cost_R * 2; // max pan is 0.5 } // direct track outputs only use velocity if ( Preferences::get_instance()->m_nJackTrackOutputMode == 1 ) { cost_track_L = cost_track_L * pNote->get_velocity(); cost_track_L = cost_track_L * fLayerGain; cost_track_R = cost_track_L; } // Se non devo fare resample (drumkit) posso evitare di utilizzare i float e gestire il tutto in // maniera ottimizzata // constant^12 = 2, so constant = 2^(1/12) = 1.059463. // float nStep = 1.0;1.0594630943593 float fTotalPitch = pNote->get_total_pitch() + fLayerPitch; //_INFOLOG( "total pitch: " + to_string( fTotalPitch ) ); if( (int) pSelectedLayer->SamplePosition == 0 && !pInstr->is_muted() ) { if( Hydrogen::get_instance()->getMidiOutput() != nullptr ){ Hydrogen::get_instance()->getMidiOutput()->handleQueueNote( pNote ); } } if ( fTotalPitch == 0.0 && pSample->get_sample_rate() == audio_output->getSampleRate() ) { // NO RESAMPLE nReturnValues[nReturnValueIndex] = __render_note_no_resample( pSample, pNote, pSelectedLayer, pCompo, pMainCompo, nBufferSize, nInitialSilence, cost_L, cost_R, cost_track_L, cost_track_R, pSong ); } else { // RESAMPLE nReturnValues[nReturnValueIndex] = __render_note_resample( pSample, pNote, pSelectedLayer, pCompo, pMainCompo, nBufferSize, nInitialSilence, cost_L, cost_R, cost_track_L, cost_track_R, fLayerPitch, pSong ); } nReturnValueIndex++; } for ( unsigned i = 0 ; i < pInstr->get_components()->size() ; i++ ) { if ( !nReturnValues[i] ) { return false; } } return true; } bool Sampler::processPlaybackTrack(int nBufferSize) { Hydrogen* pEngine = Hydrogen::get_instance(); AudioOutput* pAudioOutput = Hydrogen::get_instance()->getAudioOutput(); Song* pSong = pEngine->getSong(); if( !pSong->get_playback_track_enabled() || pEngine->getState() != STATE_PLAYING || pSong->get_mode() != Song::SONG_MODE) { return false; } InstrumentComponent *pCompo = __playback_instrument->get_components()->front(); Sample *pSample = pCompo->get_layer(0)->get_sample(); float fVal_L; float fVal_R; float *pSample_data_L = pSample->get_data_l(); float *pSample_data_R = pSample->get_data_r(); float fInstrPeak_L = __playback_instrument->get_peak_l(); // this value will be reset to 0 by the mixer.. float fInstrPeak_R = __playback_instrument->get_peak_r(); // this value will be reset to 0 by the mixer.. assert(pSample); int nAvail_bytes = 0; int nInitialBufferPos = 0; if(pSample->get_sample_rate() == pAudioOutput->getSampleRate()){ //No resampling __playBackSamplePosition = pAudioOutput->m_transport.m_nFrames; nAvail_bytes = pSample->get_frames() - ( int )__playBackSamplePosition; if ( nAvail_bytes > nBufferSize ) { nAvail_bytes = nBufferSize; } int nInitialSamplePos = ( int ) __playBackSamplePosition; int nSamplePos = nInitialSamplePos; int nTimes = nInitialBufferPos + nAvail_bytes; if(__playBackSamplePosition > pSample->get_frames()){ //playback track has ended.. return true; } for ( int nBufferPos = nInitialBufferPos; nBufferPos < nTimes; ++nBufferPos ) { fVal_L = pSample_data_L[ nSamplePos ]; fVal_R = pSample_data_R[ nSamplePos ]; fVal_L = fVal_L * 1.0f * pSong->get_playback_track_volume(); //costr fVal_R = fVal_R * 1.0f * pSong->get_playback_track_volume(); //cost l //pDrumCompo->set_outs( nBufferPos, fVal_L, fVal_R ); // to main mix if ( fVal_L > fInstrPeak_L ) { fInstrPeak_L = fVal_L; } if ( fVal_R > fInstrPeak_R ) { fInstrPeak_R = fVal_R; } __main_out_L[nBufferPos] += fVal_L; __main_out_R[nBufferPos] += fVal_R; ++nSamplePos; } } else { //Perform resampling double fSamplePos = 0; int nSampleFrames = pSample->get_frames(); float fStep = 1; fStep *= ( float )pSample->get_sample_rate() / pAudioOutput->getSampleRate(); // Adjust for audio driver sample rate if(pAudioOutput->m_transport.m_nFrames == 0){ fSamplePos = 0; } else { fSamplePos = ( (pAudioOutput->m_transport.m_nFrames/nBufferSize) * (nBufferSize * fStep)); } nAvail_bytes = ( int )( ( float )( pSample->get_frames() - fSamplePos ) / fStep ); if ( nAvail_bytes > nBufferSize ) { nAvail_bytes = nBufferSize; } int nTimes = nInitialBufferPos + nAvail_bytes; for ( int nBufferPos = nInitialBufferPos; nBufferPos < nTimes; ++nBufferPos ) { int nSamplePos = ( int ) fSamplePos; double fDiff = fSamplePos - nSamplePos; if ( ( nSamplePos + 1 ) >= nSampleFrames ) { //we reach the last audioframe. //set this last frame to zero do nothing wrong. fVal_L = 0.0; fVal_R = 0.0; } else { // some interpolation methods need 4 frames data. float last_l; float last_r; if ( ( nSamplePos + 2 ) >= nSampleFrames ) { last_l = 0.0; last_r = 0.0; } else { last_l = pSample_data_L[nSamplePos + 2]; last_r = pSample_data_R[nSamplePos + 2]; } switch( __interpolateMode ){ case LINEAR: fVal_L = pSample_data_L[nSamplePos] * (1 - fDiff ) + pSample_data_L[nSamplePos + 1] * fDiff; fVal_R = pSample_data_R[nSamplePos] * (1 - fDiff ) + pSample_data_R[nSamplePos + 1] * fDiff; break; case COSINE: fVal_L = cosine_Interpolate( pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], fDiff); fVal_R = cosine_Interpolate( pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], fDiff); break; case THIRD: fVal_L = third_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = third_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case CUBIC: fVal_L = cubic_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = cubic_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case HERMITE: fVal_L = hermite_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = hermite_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; } } if ( fVal_L > fInstrPeak_L ) { fInstrPeak_L = fVal_L; } if ( fVal_R > fInstrPeak_R ) { fInstrPeak_R = fVal_R; } __main_out_L[nBufferPos] += fVal_L; __main_out_R[nBufferPos] += fVal_R; fSamplePos += fStep; } //for } __playback_instrument->set_peak_l( fInstrPeak_L ); __playback_instrument->set_peak_r( fInstrPeak_R ); return true; } bool Sampler::__render_note_no_resample( Sample *pSample, Note *pNote, SelectedLayerInfo *pSelectedLayerInfo, InstrumentComponent *pCompo, DrumkitComponent *pDrumCompo, int nBufferSize, int nInitialSilence, float cost_L, float cost_R, float cost_track_L, float cost_track_R, Song* pSong ) { AudioOutput* pAudioOutput = Hydrogen::get_instance()->getAudioOutput(); bool retValue = true; // the note is ended int nNoteLength = -1; if ( pNote->get_length() != -1 ) { nNoteLength = ( int )( pNote->get_length() * pAudioOutput->m_transport.m_fTickSize ); } int nAvail_bytes = pSample->get_frames() - ( int )pSelectedLayerInfo->SamplePosition; // verifico il numero di frame disponibili ancora da eseguire if ( nAvail_bytes > nBufferSize - nInitialSilence ) { // il sample e' piu' grande del buffersize // imposto il numero dei bytes disponibili uguale al buffersize nAvail_bytes = nBufferSize - nInitialSilence; retValue = false; // the note is not ended yet } //ADSR *pADSR = pNote->m_pADSR; int nInitialBufferPos = nInitialSilence; int nInitialSamplePos = ( int )pSelectedLayerInfo->SamplePosition; int nSamplePos = nInitialSamplePos; int nTimes = nInitialBufferPos + nAvail_bytes; float *pSample_data_L = pSample->get_data_l(); float *pSample_data_R = pSample->get_data_r(); float fInstrPeak_L = pNote->get_instrument()->get_peak_l(); // this value will be reset to 0 by the mixer.. float fInstrPeak_R = pNote->get_instrument()->get_peak_r(); // this value will be reset to 0 by the mixer.. float fADSRValue; float fVal_L; float fVal_R; #ifdef H2CORE_HAVE_JACK JackAudioDriver* pJackAudioDriver = nullptr; float * pTrackOutL = nullptr; float * pTrackOutR = nullptr; if( pAudioOutput->has_track_outs() && (pJackAudioDriver = dynamic_cast(pAudioOutput)) ) { pTrackOutL = pJackAudioDriver->getTrackOut_L( pNote->get_instrument(), pCompo ); pTrackOutR = pJackAudioDriver->getTrackOut_R( pNote->get_instrument(), pCompo ); } #endif for ( int nBufferPos = nInitialBufferPos; nBufferPos < nTimes; ++nBufferPos ) { if ( ( nNoteLength != -1 ) && ( nNoteLength <= pSelectedLayerInfo->SamplePosition ) ) { if ( pNote->get_adsr()->release() == 0 ) { retValue = true; // the note is ended } } fADSRValue = pNote->get_adsr()->get_value( 1 ); fVal_L = pSample_data_L[ nSamplePos ] * fADSRValue; fVal_R = pSample_data_R[ nSamplePos ] * fADSRValue; // Low pass resonant filter if ( pNote->get_instrument()->is_filter_active() ) { pNote->compute_lr_values( &fVal_L, &fVal_R ); } #ifdef H2CORE_HAVE_JACK if( pTrackOutL ) { pTrackOutL[nBufferPos] += fVal_L * cost_track_L; } if( pTrackOutR ) { pTrackOutR[nBufferPos] += fVal_R * cost_track_R; } #endif fVal_L = fVal_L * cost_L; fVal_R = fVal_R * cost_R; // update instr peak if ( fVal_L > fInstrPeak_L ) { fInstrPeak_L = fVal_L; } if ( fVal_R > fInstrPeak_R ) { fInstrPeak_R = fVal_R; } pDrumCompo->set_outs( nBufferPos, fVal_L, fVal_R ); // to main mix __main_out_L[nBufferPos] += fVal_L; __main_out_R[nBufferPos] += fVal_R; ++nSamplePos; } pSelectedLayerInfo->SamplePosition += nAvail_bytes; pNote->get_instrument()->set_peak_l( fInstrPeak_L ); pNote->get_instrument()->set_peak_r( fInstrPeak_R ); #ifdef H2CORE_HAVE_LADSPA // LADSPA // change the below return logic if you add code after that ifdef if (pNote->get_instrument()->is_muted() || pSong->__is_muted) return retValue; float masterVol = pSong->get_volume(); for ( unsigned nFX = 0; nFX < MAX_FX; ++nFX ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); float fLevel = pNote->get_instrument()->get_fx_level( nFX ); if ( ( pFX ) && ( fLevel != 0.0 ) ) { fLevel = fLevel * pFX->getVolume(); float *pBuf_L = pFX->m_pBuffer_L; float *pBuf_R = pFX->m_pBuffer_R; float fFXCost_L = fLevel * masterVol; float fFXCost_R = fLevel * masterVol; int nBufferPos = nInitialBufferPos; int nSamplePos = nInitialSamplePos; for ( int i = 0; i < nAvail_bytes; ++i ) { pBuf_L[ nBufferPos ] += pSample_data_L[ nSamplePos ] * fFXCost_L; pBuf_R[ nBufferPos ] += pSample_data_R[ nSamplePos ] * fFXCost_R; ++nSamplePos; ++nBufferPos; } } } // ~LADSPA #endif return retValue; } bool Sampler::__render_note_resample( Sample *pSample, Note *pNote, SelectedLayerInfo *pSelectedLayerInfo, InstrumentComponent *pCompo, DrumkitComponent *pDrumCompo, int nBufferSize, int nInitialSilence, float cost_L, float cost_R, float cost_track_L, float cost_track_R, float fLayerPitch, Song* pSong ) { AudioOutput* pAudioOutput = Hydrogen::get_instance()->getAudioOutput(); int nNoteLength = -1; if ( pNote->get_length() != -1 ) { float resampledTickSize = AudioEngine::compute_tick_size( pSample->get_sample_rate(), pAudioOutput->m_transport.m_fBPM, pSong->__resolution ); nNoteLength = ( int )( pNote->get_length() * resampledTickSize); } float fNotePitch = pNote->get_total_pitch() + fLayerPitch; float fStep = pow( 1.0594630943593, ( double )fNotePitch ); // _ERRORLOG( QString("pitch: %1, step: %2" ).arg(fNotePitch).arg( fStep) ); fStep *= ( float )pSample->get_sample_rate() / pAudioOutput->getSampleRate(); // Adjust for audio driver sample rate // verifico il numero di frame disponibili ancora da eseguire int nAvail_bytes = ( int )( ( float )( pSample->get_frames() - pSelectedLayerInfo->SamplePosition ) / fStep ); bool retValue = true; // the note is ended if ( nAvail_bytes > nBufferSize - nInitialSilence ) { // il sample e' piu' grande del buffersize // imposto il numero dei bytes disponibili uguale al buffersize nAvail_bytes = nBufferSize - nInitialSilence; retValue = false; // the note is not ended yet } // ADSR *pADSR = pNote->m_pADSR; int nInitialBufferPos = nInitialSilence; //float fInitialSamplePos = pNote->get_sample_position( pCompo->get_drumkit_componentID() ); double fSamplePos = pSelectedLayerInfo->SamplePosition; int nTimes = nInitialBufferPos + nAvail_bytes; float *pSample_data_L = pSample->get_data_l(); float *pSample_data_R = pSample->get_data_r(); float fInstrPeak_L = pNote->get_instrument()->get_peak_l(); // this value will be reset to 0 by the mixer.. float fInstrPeak_R = pNote->get_instrument()->get_peak_r(); // this value will be reset to 0 by the mixer.. float fADSRValue = 1.0; float fVal_L; float fVal_R; int nSampleFrames = pSample->get_frames(); #ifdef H2CORE_HAVE_JACK JackAudioDriver* pJackAudioDriver = nullptr; float * pTrackOutL = nullptr; float * pTrackOutR = nullptr; if( pAudioOutput->has_track_outs() && (pJackAudioDriver = dynamic_cast(pAudioOutput)) ) { pTrackOutL = pJackAudioDriver->getTrackOut_L( pNote->get_instrument(), pCompo ); pTrackOutR = pJackAudioDriver->getTrackOut_R( pNote->get_instrument(), pCompo ); } #endif for ( int nBufferPos = nInitialBufferPos; nBufferPos < nTimes; ++nBufferPos ) { if ( ( nNoteLength != -1 ) && ( nNoteLength <= pSelectedLayerInfo->SamplePosition ) ) { if ( pNote->get_adsr()->release() == 0 ) { retValue = 1; // the note is ended } } int nSamplePos = ( int )fSamplePos; double fDiff = fSamplePos - nSamplePos; if ( ( nSamplePos + 1 ) >= nSampleFrames ) { //we reach the last audioframe. //set this last frame to zero do nothing wrong. fVal_L = 0.0; fVal_R = 0.0; } else { // some interpolation methods need 4 frames data. float last_l; float last_r; if ( ( nSamplePos + 2 ) >= nSampleFrames ) { last_l = 0.0; last_r = 0.0; } else { last_l = pSample_data_L[nSamplePos + 2]; last_r = pSample_data_R[nSamplePos + 2]; } switch( __interpolateMode ){ case LINEAR: fVal_L = pSample_data_L[nSamplePos] * (1 - fDiff ) + pSample_data_L[nSamplePos + 1] * fDiff; fVal_R = pSample_data_R[nSamplePos] * (1 - fDiff ) + pSample_data_R[nSamplePos + 1] * fDiff; //fVal_L = linear_Interpolate( pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], fDiff); //fVal_R = linear_Interpolate( pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], fDiff); break; case COSINE: fVal_L = cosine_Interpolate( pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], fDiff); fVal_R = cosine_Interpolate( pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], fDiff); break; case THIRD: fVal_L = third_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = third_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case CUBIC: fVal_L = cubic_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = cubic_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case HERMITE: fVal_L = hermite_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = hermite_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; } } // ADSR envelope fADSRValue = pNote->get_adsr()->get_value( fStep ); fVal_L = fVal_L * fADSRValue; fVal_R = fVal_R * fADSRValue; // Low pass resonant filter if ( pNote->get_instrument()->is_filter_active() ) { pNote->compute_lr_values( &fVal_L, &fVal_R ); } #ifdef H2CORE_HAVE_JACK if( pTrackOutL ) { pTrackOutL[nBufferPos] += fVal_L * cost_track_L; } if( pTrackOutR ) { pTrackOutR[nBufferPos] += fVal_R * cost_track_R; } #endif fVal_L = fVal_L * cost_L; fVal_R = fVal_R * cost_R; // update instr peak if ( fVal_L > fInstrPeak_L ) { fInstrPeak_L = fVal_L; } if ( fVal_R > fInstrPeak_R ) { fInstrPeak_R = fVal_R; } pDrumCompo->set_outs( nBufferPos, fVal_L, fVal_R ); // to main mix __main_out_L[nBufferPos] += fVal_L; __main_out_R[nBufferPos] += fVal_R; fSamplePos += fStep; } pSelectedLayerInfo->SamplePosition += nAvail_bytes * fStep; pNote->get_instrument()->set_peak_l( fInstrPeak_L ); pNote->get_instrument()->set_peak_r( fInstrPeak_R ); #ifdef H2CORE_HAVE_LADSPA // LADSPA // change the below return logic if you add code after that ifdef if (pNote->get_instrument()->is_muted() || pSong->__is_muted) return retValue; float masterVol = pSong->get_volume(); for ( unsigned nFX = 0; nFX < MAX_FX; ++nFX ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); float fLevel = pNote->get_instrument()->get_fx_level( nFX ); if ( ( pFX ) && ( fLevel != 0.0 ) ) { fLevel = fLevel * pFX->getVolume(); float *pBuf_L = pFX->m_pBuffer_L; float *pBuf_R = pFX->m_pBuffer_R; // float fFXCost_L = cost_L * fLevel; // float fFXCost_R = cost_R * fLevel; float fFXCost_L = fLevel * masterVol; float fFXCost_R = fLevel * masterVol; int nBufferPos = nInitialBufferPos; float fSamplePos = pSelectedLayerInfo->SamplePosition; for ( int i = 0; i < nAvail_bytes; ++i ) { int nSamplePos = ( int )fSamplePos; double fDiff = fSamplePos - nSamplePos; if ( ( nSamplePos + 1 ) >= nSampleFrames ) { //we reach the last audioframe. //set this last frame to zero do nothing wrong. fVal_L = 0.0; fVal_R = 0.0; } else { // some interpolation methods need 4 frames data. float last_l; float last_r; if ( ( nSamplePos + 2 ) >= nSampleFrames ) { last_l = 0.0; last_r = 0.0; }else { last_l = pSample_data_L[nSamplePos + 2]; last_r = pSample_data_R[nSamplePos + 2]; } switch( __interpolateMode ){ case LINEAR: fVal_L = pSample_data_L[nSamplePos] * (1 - fDiff ) + pSample_data_L[nSamplePos + 1] * fDiff; fVal_R = pSample_data_R[nSamplePos] * (1 - fDiff ) + pSample_data_R[nSamplePos + 1] * fDiff; break; case COSINE: fVal_L = cosine_Interpolate( pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], fDiff); fVal_R = cosine_Interpolate( pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], fDiff); break; case THIRD: fVal_L = third_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = third_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case CUBIC: fVal_L = cubic_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = cubic_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; case HERMITE: fVal_L = hermite_Interpolate( pSample_data_L[ nSamplePos -1], pSample_data_L[nSamplePos], pSample_data_L[nSamplePos + 1], last_l, fDiff); fVal_R = hermite_Interpolate( pSample_data_R[ nSamplePos -1], pSample_data_R[nSamplePos], pSample_data_R[nSamplePos + 1], last_r, fDiff); break; } } pBuf_L[ nBufferPos ] += fVal_L * fFXCost_L; pBuf_R[ nBufferPos ] += fVal_R * fFXCost_R; fSamplePos += fStep; ++nBufferPos; } } } #endif return retValue; } void Sampler::stop_playing_notes( Instrument* instrument ) { if ( instrument ) { // stop all notes using this instrument for ( unsigned i = 0; i < __playing_notes_queue.size(); ) { Note *pNote = __playing_notes_queue[ i ]; assert( pNote ); if ( pNote->get_instrument() == instrument ) { delete pNote; instrument->dequeue(); __playing_notes_queue.erase( __playing_notes_queue.begin() + i ); } ++i; } } else { // stop all notes // delete all copied notes in the playing notes queue for ( unsigned i = 0; i < __playing_notes_queue.size(); ++i ) { Note *pNote = __playing_notes_queue[i]; pNote->get_instrument()->dequeue(); delete pNote; } __playing_notes_queue.clear(); } } /// Preview, uses only the first layer void Sampler::preview_sample( Sample* sample, int length ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); for (std::vector::iterator it = __preview_instrument->get_components()->begin() ; it != __preview_instrument->get_components()->end(); ++it) { InstrumentComponent* pComponent = *it; InstrumentLayer *pLayer = pComponent->get_layer( 0 ); pLayer->set_sample( sample ); Note *pPreviewNote = new Note( __preview_instrument, 0, 1.0, 0.5, 0.5, length, 0 ); stop_playing_notes( __preview_instrument ); note_on( pPreviewNote ); } AudioEngine::get_instance()->unlock(); } void Sampler::preview_instrument( Instrument* instr ) { Instrument * pOldPreview; AudioEngine::get_instance()->lock( RIGHT_HERE ); stop_playing_notes( __preview_instrument ); pOldPreview = __preview_instrument; __preview_instrument = instr; instr->set_is_preview_instrument(true); Note *pPreviewNote = new Note( __preview_instrument, 0, 1.0, 0.5, 0.5, MAX_NOTES, 0 ); note_on( pPreviewNote ); // exclusive note AudioEngine::get_instance()->unlock(); delete pOldPreview; } void Sampler::setPlayingNotelength( Instrument* instrument, unsigned long ticks, unsigned long noteOnTick ) { if ( instrument ) { // stop all notes using this instrument Hydrogen *pEngine = Hydrogen::get_instance(); Song* pSong = pEngine->getSong(); int selectedpattern = pEngine->getSelectedPatternNumber(); Pattern* pCurrentPattern = nullptr; if ( pSong->get_mode() == Song::PATTERN_MODE || ( pEngine->getState() != STATE_PLAYING )){ PatternList *pPatternList = pSong->get_pattern_list(); if ( ( selectedpattern != -1 ) && ( selectedpattern < ( int )pPatternList->size() ) ) { pCurrentPattern = pPatternList->get( selectedpattern ); } }else { std::vector *pColumns = pSong->get_pattern_group_vector(); // Pattern *pPattern = NULL; int pos = pEngine->getPatternPos() +1; for ( int i = 0; i < pos; ++i ) { PatternList *pColumn = ( *pColumns )[i]; pCurrentPattern = pColumn->get( 0 ); } } if ( pCurrentPattern ) { int patternsize = pCurrentPattern->get_length(); for ( unsigned nNote = 0; nNote < pCurrentPattern->get_length(); nNote++ ) { const Pattern::notes_t* notes = pCurrentPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,nNote) { Note *pNote = it->second; if ( pNote!=nullptr ) { if( !Preferences::get_instance()->__playselectedinstrument ){ if ( pNote->get_instrument() == instrument && pNote->get_position() == noteOnTick ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( ticks > patternsize ) { ticks = patternsize - noteOnTick; } pNote->set_length( ticks ); Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine } }else { if ( pNote->get_instrument() == pEngine->getSong()->get_instrument_list()->get( pEngine->getSelectedInstrumentNumber()) && pNote->get_position() == noteOnTick ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( ticks > patternsize ) { ticks = patternsize - noteOnTick; } pNote->set_length( ticks ); Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine } } } } } } } EventQueue::get_instance()->push_event( EVENT_PATTERN_MODIFIED, -1 ); } bool Sampler::is_instrument_playing( Instrument* instrument ) { if ( instrument ) { // stop all notes using this instrument for ( unsigned j = 0; j < __playing_notes_queue.size(); j++ ) { if ( instrument->get_name() == __playing_notes_queue[ j ]->get_instrument()->get_name()){ return true; } } } return false; } void Sampler::reinitialize_playback_track() { Hydrogen* pEngine = Hydrogen::get_instance(); Song* pSong = pEngine->getSong(); Sample* pSample = nullptr; if(!pSong->get_playback_track_filename().isEmpty()){ pSample = Sample::load( pSong->get_playback_track_filename() ); } InstrumentLayer* pPlaybackTrackLayer = new InstrumentLayer( pSample ); __playback_instrument->get_components()->front()->set_layer( pPlaybackTrackLayer, 0 ); __playBackSamplePosition = 0; } }; hydrogen-1.0.0-rc1/src/core/src/smf/000077500000000000000000000000001366722712400171175ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/smf/smf.cpp000066400000000000000000000277431366722712400204250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2004 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using std::vector; namespace H2Core { const char* SMFHeader::__class_name = "SMFHeader"; SMFHeader::SMFHeader( int nFormat, int nTracks, int nTPQN ) : Object( __class_name ) , m_nFormat( nFormat ) , m_nTracks( nTracks ) , m_nTPQN( nTPQN ) { INFOLOG( "INIT" ); } SMFHeader::~SMFHeader() { INFOLOG( "DESTROY" ); } void SMFHeader::addTrack() { m_nTracks++; } vector SMFHeader::getBuffer() { SMFBuffer buffer; buffer.writeDWord( 1297377380 ); // MThd buffer.writeDWord( 6 ); // Header length = 6 buffer.writeWord( m_nFormat ); buffer.writeWord( m_nTracks ); buffer.writeWord( m_nTPQN ); return buffer.m_buffer; } // ::::::::::::::: const char* SMFTrack::__class_name = "SMFTrack"; //SMFTrack::SMFTrack( const QString& sTrackName ) SMFTrack::SMFTrack() : Object( __class_name ) { INFOLOG( "INIT" ); } SMFTrack::~SMFTrack() { INFOLOG( "DESTROY" ); for ( unsigned i = 0; i < m_eventList.size(); i++ ) { delete m_eventList[ i ]; } } std::vector SMFTrack::getBuffer() { // fill the data vector vector trackData; for ( unsigned i = 0; i < m_eventList.size(); i++ ) { SMFEvent *pEv = m_eventList[ i ]; vector buf = pEv->getBuffer(); // copy the buffer into the data vector for ( unsigned j = 0; j < buf.size(); j++ ) { trackData.push_back( buf[ j ] ); } } SMFBuffer buf; buf.writeDWord( 1297379947 ); // MTrk buf.writeDWord( trackData.size() + 4 ); // Track length vector trackBuf = buf.getBuffer(); for ( unsigned i = 0; i < trackData.size(); i++ ) { trackBuf.push_back( trackData[i] ); } // track end trackBuf.push_back( 0x00 ); // delta trackBuf.push_back( 0xFF ); trackBuf.push_back( 0x2F ); trackBuf.push_back( 0x00 ); return trackBuf; } void SMFTrack::addEvent( SMFEvent *pEvent ) { m_eventList.push_back( pEvent ); } // :::::::::::::::::::::: const char* SMF::__class_name = "SMF"; SMF::SMF(int nFormat, int nTPQN ) : Object( __class_name ) { INFOLOG( "INIT" ); m_pHeader = new SMFHeader( nFormat, 0, nTPQN ); } SMF::~SMF() { INFOLOG( "DESTROY" ); delete m_pHeader; for ( unsigned i = 0; i < m_trackList.size(); i++ ) { delete m_trackList[i]; } } void SMF::addTrack( SMFTrack *pTrack ) { m_pHeader->addTrack(); m_trackList.push_back( pTrack ); } vector SMF::getBuffer() { vector smfVect; // header vector headerVect = m_pHeader->getBuffer(); for ( unsigned i = 0; i < headerVect.size(); i++ ) { smfVect.push_back( headerVect[ i ] ); } // tracks for ( unsigned nTrack = 0; nTrack < m_trackList.size(); nTrack++ ) { SMFTrack *pTrack = m_trackList[ nTrack ]; vector trackVect = pTrack->getBuffer(); for ( unsigned i = 0; i < trackVect.size(); i++ ) { smfVect.push_back( trackVect[ i ] ); } } return smfVect; } // :::::::::::::::::::... const unsigned int TPQN = 192; const unsigned int DRUM_CHANNEL = 9; const unsigned int NOTE_LENGTH = 12; const char* SMFWriter::__class_name = "SMFWriter"; SMFWriter::SMFWriter( const char* sWriterName ) : Object( sWriterName ) { INFOLOG( "INIT" ); } SMFWriter::~SMFWriter() { INFOLOG( "DESTROY" ); } SMFTrack* SMFWriter::createTrack0( Song* pSong ) { SMFTrack *pTrack0 = new SMFTrack(); pTrack0->addEvent( new SMFCopyRightNoticeMetaEvent( pSong->__author , 0 ) ); pTrack0->addEvent( new SMFTrackNameMetaEvent( pSong->__name , 0 ) ); pTrack0->addEvent( new SMFSetTempoMetaEvent( pSong->__bpm , 0 ) ); pTrack0->addEvent( new SMFTimeSignatureMetaEvent( 4 , 4 , 24 , 8 , 0 ) ); return pTrack0; } void SMFWriter::save( const QString& sFilename, Song *pSong ) { INFOLOG( "save" ); SMF* smf = createSMF( pSong ); AutomationPath *vp = pSong->get_velocity_automation_path(); // here writers must prepare to receive pattern events prepareEvents( pSong, smf ); InstrumentList *iList = pSong->get_instrument_list(); // ogni pattern sara' una diversa traccia int nTick = 1; for ( unsigned nPatternList = 0 ; nPatternList < pSong->get_pattern_group_vector()->size() ; nPatternList++ ) { // infoLog( "[save] pattern list pos: " + toString( nPatternList ) ); PatternList *pPatternList = ( *(pSong->get_pattern_group_vector()) )[ nPatternList ]; int nStartTicks = nTick; int nMaxPatternLength = 0; for ( unsigned nPattern = 0 ; nPattern < pPatternList->size() ; nPattern++ ) { Pattern *pPattern = pPatternList->get( nPattern ); // infoLog( " |-> pattern: " + pPattern->getName() ); if ( ( int )pPattern->get_length() > nMaxPatternLength ) { nMaxPatternLength = pPattern->get_length(); } for ( unsigned nNote = 0; nNote < pPattern->get_length(); nNote++ ) { const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,nNote) { Note *pNote = it->second; if ( pNote ) { float rnd = (float)rand()/(float)RAND_MAX; if ( pNote->get_probability() < rnd ) { continue; } float fPos = nPatternList + (float)nNote/(float)nMaxPatternLength; float velocity_adjustment = vp->get_value(fPos); int nVelocity = (int)( 127.0 * pNote->get_velocity() * velocity_adjustment ); int nInstr = iList->index(pNote->get_instrument()); Instrument *pInstr = pNote->get_instrument(); int nPitch = pNote->get_midi_key(); int nChannel = pInstr->get_midi_out_channel(); if ( nChannel == -1 ) { nChannel = DRUM_CHANNEL; } int nLength = pNote->get_length(); if ( nLength == -1 ) { nLength = NOTE_LENGTH; } // get events for specific instrument EventList* eventList = getEvents(pSong, pInstr); eventList->push_back( new SMFNoteOnEvent( nStartTicks + nNote, nChannel, nPitch, nVelocity ) ); eventList->push_back( new SMFNoteOffEvent( nStartTicks + nNote + nLength, nChannel, nPitch, nVelocity ) ); } } } } nTick += nMaxPatternLength; } //tracks creation packEvents(pSong, smf); saveSMF(sFilename, smf); delete smf; } void SMFWriter::sortEvents( EventList *pEvents ) { // awful bubble sort.. for ( unsigned i = 0; i < pEvents->size(); i++ ) { for ( vector::iterator it = pEvents->begin() ; it != ( pEvents->end() - 1 ) ; it++ ) { SMFEvent *pEvent = *it; SMFEvent *pNextEvent = *( it + 1 ); if ( pNextEvent->m_nTicks < pEvent->m_nTicks ) { // swap *it = pNextEvent; *( it +1 ) = pEvent; } } } } void SMFWriter::saveSMF( const QString& sFilename, SMF* pSmf ) { // save the midi file FILE* file = fopen( sFilename.toLocal8Bit(), "wb" ); if( file == nullptr ) return; vector smfVect = pSmf->getBuffer(); for ( unsigned i = 0; i < smfVect.size(); i++ ) { fwrite( &smfVect[ i ], 1, 1, file ); } fclose( file ); } // SMF1Writer - base class for two smf1 writers const char* SMF1Writer::__class_name = "SMF1Writer"; SMF1Writer::SMF1Writer( const char* sWriterName ) : SMFWriter( sWriterName ) { } SMF1Writer::~SMF1Writer() { } SMF* SMF1Writer::createSMF( Song* pSong ){ SMF* smf = new SMF( 1, TPQN ); // Standard MIDI format 1 files should have the first track being the tempo map // which is a track that contains global meta events only. SMFTrack* pTrack0 = createTrack0( pSong ); smf->addTrack( pTrack0 ); // Standard MIDI Format 1 files should have note events in tracks =>2 return smf; } // SMF1 MIDI SINGLE EXPROT const char* SMF1WriterSingle::__class_name = "SMFWriterSingle"; SMF1WriterSingle::SMF1WriterSingle() : SMF1Writer( __class_name ), m_eventList() { } SMF1WriterSingle::~SMF1WriterSingle() { } EventList* SMF1WriterSingle::getEvents( Song* pSong, Instrument* pInstr ) { return &m_eventList; } void SMF1WriterSingle::prepareEvents( Song *pSong, SMF* pSmf ) { m_eventList.clear(); } void SMF1WriterSingle::packEvents( Song *pSong, SMF* pSmf ) { sortEvents( &m_eventList ); SMFTrack *pTrack1 = new SMFTrack(); pSmf->addTrack( pTrack1 ); unsigned nLastTick = 1; for ( vector::iterator it = m_eventList.begin(); it != m_eventList.end(); it++ ) { SMFEvent *pEvent = *it; pEvent->m_nDeltaTime = ( pEvent->m_nTicks - nLastTick ) * 4; nLastTick = pEvent->m_nTicks; // infoLog( " pos: " + toString( (*it)->m_nTicks ) + ", delta: " // + toString( (*it)->m_nDeltaTime ) ); pTrack1->addEvent( *it ); } m_eventList.clear(); } // SMF1 MIDI MULTI EXPORT const char* SMF1WriterMulti::__class_name = "SMFWriterMulti"; SMF1WriterMulti::SMF1WriterMulti() : SMF1Writer( __class_name ), m_eventLists() { } SMF1WriterMulti::~SMF1WriterMulti() { } void SMF1WriterMulti::prepareEvents( Song *pSong, SMF* pSmf ) { InstrumentList *iList = pSong->get_instrument_list(); m_eventLists.clear(); for( unsigned nInstr=0; nInstr < iList->size(); nInstr++ ){ m_eventLists.push_back( new EventList() ); } } EventList* SMF1WriterMulti::getEvents( Song* pSong, Instrument* pInstr ) { int nInstr = pSong->get_instrument_list()->index(pInstr); EventList* eventList = m_eventLists.at( nInstr ); return eventList; } void SMF1WriterMulti::packEvents( Song *pSong, SMF* pSmf ) { InstrumentList *iList = pSong->get_instrument_list(); for ( unsigned nTrack = 0; nTrack < m_eventLists.size(); nTrack++ ) { EventList* eventList = m_eventLists.at( nTrack ); Instrument* instrument = iList->get( nTrack ); sortEvents( eventList ); SMFTrack *pTrack = new SMFTrack(); pSmf->addTrack( pTrack ); //Set instrument name as track name pTrack->addEvent( new SMFTrackNameMetaEvent( instrument->get_name() , 0 ) ); unsigned nLastTick = 1; for ( vector::iterator it = eventList->begin(); it != eventList->end(); it++ ) { SMFEvent *pEvent = *it; pEvent->m_nDeltaTime = ( pEvent->m_nTicks - nLastTick ) * 4; nLastTick = pEvent->m_nTicks; pTrack->addEvent( *it ); } // we can safely delete vector with events now delete eventList; } m_eventLists.clear(); } // SMF0 MIDI EXPORT const char* SMF0Writer::__class_name = "SMF0Writer"; SMF0Writer::SMF0Writer() : SMFWriter( __class_name ), m_track( nullptr ), m_eventList() { } SMF0Writer::~SMF0Writer() { } SMF* SMF0Writer::createSMF( Song* pSong ){ // MIDI files format 0 have all their events in one track SMF* smf = new SMF( 0, TPQN ); m_track = createTrack0( pSong ); smf->addTrack( m_track ); return smf; } EventList* SMF0Writer::getEvents( Song* pSong, Instrument* pInstr ) { return &m_eventList; } void SMF0Writer::prepareEvents( Song *pSong, SMF* pSmf ) { m_eventList.clear(); } void SMF0Writer::packEvents( Song *pSong, SMF* pSmf ) { sortEvents( &m_eventList ); unsigned nLastTick = 1; for ( vector::iterator it = m_eventList.begin(); it != m_eventList.end(); it++ ) { SMFEvent *pEvent = *it; pEvent->m_nDeltaTime = ( pEvent->m_nTicks - nLastTick ) * 4; nLastTick = pEvent->m_nTicks; m_track->addEvent( *it ); } m_eventList.clear(); } }; hydrogen-1.0.0-rc1/src/core/src/smf/smf_event.cpp000066400000000000000000000160351366722712400216160ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* SMFBuffer::__class_name = "SMFBuffer"; SMFBuffer::SMFBuffer() : Object( __class_name ) { } void SMFBuffer::writeByte( short int nByte ) { // infoLog( "[writeByte] " + to_string( nByte ) ); m_buffer.push_back( nByte ); } void SMFBuffer::writeWord( int nVal ) { // infoLog( "writeWord" ); writeByte( nVal >> 8 ); writeByte( nVal ); } void SMFBuffer::writeDWord( long nVal ) { writeByte( nVal >> 24 ); writeByte( nVal >> 16 ); writeByte( nVal >> 8 ); writeByte( nVal ); } void SMFBuffer::writeString( const QString& sMsg ) { // infoLog( "writeString" ); writeVarLen( sMsg.length() ); for ( int i = 0; i < sMsg.length(); i++ ) { writeByte( sMsg.toLocal8Bit().at(i) ); } } void SMFBuffer::writeVarLen( long value ) { // infoLog( "[writeVarLen]" ); long buffer; buffer = value & 0x7f; while ( ( value >>= 7 ) > 0 ) { INFOLOG( "." ); buffer <<= 8; buffer |= 0x80; buffer += ( value & 0x7f ); } while ( true ) { // putc( buffer, outfile ); writeByte( ( char )buffer ); if ( buffer & 0x80 ) { buffer >>= 8; } else { break; } } } // :::::::::::::::::: const char* SMFTrackNameMetaEvent::__class_name = "SMFTrackNameMetaEvent"; SMFTrackNameMetaEvent::SMFTrackNameMetaEvent( const QString& sTrackName, unsigned nTicks ) : SMFEvent( __class_name, nTicks ) , m_sTrackName( sTrackName ) { // it's always at the start of the song m_nDeltaTime = 0; } std::vector SMFTrackNameMetaEvent::getBuffer() { SMFBuffer buf; buf.writeVarLen( m_nDeltaTime ); buf.writeByte( 0xFF ); buf.writeByte( TRACK_NAME ); buf.writeString( m_sTrackName ); return buf.getBuffer(); } // :::::::::::::::::: const char* SMFSetTempoMetaEvent::__class_name = "SMFSetTempoMetaEvent"; SMFSetTempoMetaEvent::SMFSetTempoMetaEvent( float fBPM, unsigned nTicks ) : SMFEvent( __class_name, nTicks ) , m_fBPM( fBPM ) { // it's always at the start of the song m_nDeltaTime = 0; } std::vector SMFSetTempoMetaEvent::getBuffer() { SMFBuffer buf; long msPerBeat; msPerBeat = long( 60000000 / m_fBPM ); // 60 seconds * mills \ BPM buf.writeVarLen( m_nDeltaTime ); buf.writeByte( 0xFF ); buf.writeByte( SET_TEMPO ); buf.writeByte( 0x03 ); // Length buf.writeByte( msPerBeat >> 16 ); buf.writeByte( msPerBeat >> 8 ); buf.writeByte( msPerBeat ); return buf.getBuffer(); } // :::::::::::::::::: const char* SMFCopyRightNoticeMetaEvent::__class_name = "SMFCopyRightNoticeMetaEvent"; SMFCopyRightNoticeMetaEvent::SMFCopyRightNoticeMetaEvent( const QString& sAuthor, unsigned nTicks ) : SMFEvent( __class_name, nTicks ) , m_sAuthor( sAuthor ) { // it's always at the start of the song m_nDeltaTime = 0; } std::vector SMFCopyRightNoticeMetaEvent::getBuffer() { SMFBuffer buf; QString sCopyRightString; time_t now = time(nullptr); tm *ltm = localtime(&now); // Extract the local system time. // Construct the copyright string in the form "(C) [Author] [CurrentYear]" sCopyRightString.append("(C) "); // Start with the copyright symbol and a separator space. sCopyRightString.append( m_sAuthor ); // add the author sCopyRightString.append(" "); // add a separator space sCopyRightString.append( QString::number( 1900 + ltm->tm_year, 10 ) ); // and finish with the year. buf.writeVarLen( m_nDeltaTime ); buf.writeByte( 0xFF ); buf.writeByte( COPYRIGHT_NOTICE ); buf.writeString( sCopyRightString ); return buf.getBuffer(); } // :::::::::::::::::: const char* SMFTimeSignatureMetaEvent::__class_name = "SMFTimeSignatureMetaEvent"; SMFTimeSignatureMetaEvent::SMFTimeSignatureMetaEvent( unsigned nBeats, unsigned nNote , unsigned nMTPMC , unsigned nTSNP24 , unsigned nTicks ) : SMFEvent( __class_name, nTicks ) , m_nBeats( nBeats ) , m_nNote( nNote ) , m_nMTPMC( nMTPMC ) , m_nTSNP24( nTSNP24 ) , m_nTicks( nTicks ) { // it's always at the start of the song m_nDeltaTime = 0; } std::vector SMFTimeSignatureMetaEvent::getBuffer() { SMFBuffer buf; unsigned nBeatsCopy = m_nNote , Note2Log = 0; // Copy Nbeats as the process to generate Note2Log alters the value. while (nBeatsCopy >>= 1) ++Note2Log; // Generate a log to base 2 of the note value, so 8 (as in 6/8) becomes 3 buf.writeVarLen( m_nDeltaTime ); buf.writeByte( 0xFF ); buf.writeByte( TIME_SIGNATURE ); buf.writeByte( 0x04 ); // Event length in bytes. buf.writeByte( m_nBeats ); // Top line of time signature, eg 6 for 6/8 time buf.writeByte( Note2Log ); // Bottom line of time signature expressed as Log2 of the Note value. buf.writeByte( m_nMTPMC ); // MIDI Ticks per Metronome click, normally 24 ( i.e. each quarter note ). buf.writeByte( m_nTSNP24 ); // Thirty Second Notes ( as in 1/32 ) per 24 MIDI clocks, normally 8. return buf.getBuffer(); } // ::::::::::::: SMFEvent::SMFEvent( const char* sEventName, unsigned nTicks ) : Object( sEventName ) , m_nTicks( nTicks ) , m_nDeltaTime( -1 ) { //infoLog( "INIT" ); } SMFEvent::~SMFEvent() { //infoLog( "DESTROY" ); } // :::::::::::::: const char* SMFNoteOnEvent::__class_name = "SMFNoteOnEvent"; SMFNoteOnEvent::SMFNoteOnEvent( unsigned nTicks, int nChannel, int nPitch, int nVelocity ) : SMFEvent( __class_name, nTicks ) , m_nChannel( nChannel ) , m_nPitch( nPitch ) , m_nVelocity( nVelocity ) { if ( nChannel >= 16 ) { ERRORLOG( QString( "nChannel >= 16! nChannel=%1" ).arg( nChannel ) ); } } std::vector SMFNoteOnEvent::getBuffer() { SMFBuffer buf; buf.writeVarLen( m_nDeltaTime ); buf.writeByte( NOTE_ON + m_nChannel ); buf.writeByte( m_nPitch ); buf.writeByte( m_nVelocity ); return buf.getBuffer(); } // ::::::::::: const char* SMFNoteOffEvent::__class_name = "SMFNoteOffEvent"; SMFNoteOffEvent::SMFNoteOffEvent( unsigned nTicks, int nChannel, int nPitch, int nVelocity ) : SMFEvent( __class_name, nTicks ) , m_nChannel( nChannel ) , m_nPitch( nPitch ) , m_nVelocity( nVelocity ) { if ( nChannel >= 16 ) { ERRORLOG( QString( "nChannel >= 16! nChannel=%1" ).arg( nChannel ) ); } } std::vector SMFNoteOffEvent::getBuffer() { SMFBuffer buf; buf.writeVarLen( m_nDeltaTime ); buf.writeByte( NOTE_OFF + m_nChannel ); buf.writeByte( m_nPitch ); buf.writeByte( m_nVelocity ); return buf.getBuffer(); } }; hydrogen-1.0.0-rc1/src/core/src/synth/000077500000000000000000000000001366722712400174775ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/core/src/synth/synth.cpp000066400000000000000000000052031366722712400213500ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* Synth::__class_name = "Synth"; Synth::Synth() : Object( __class_name ) { INFOLOG( "INIT" ); m_pOut_L = new float[ MAX_BUFFER_SIZE ]; m_pOut_R = new float[ MAX_BUFFER_SIZE ]; m_fTheta = 0.0; m_pAudioOutput = nullptr; } Synth::~Synth() { INFOLOG( "DESTROY" ); delete[] m_pOut_L; delete[] m_pOut_R; } void Synth::noteOn( Note* pNote ) { INFOLOG( "NOTE ON" ); assert( pNote ); m_playingNotesQueue.push_back( pNote ); } void Synth::noteOff( Note* pNote ) { INFOLOG( "NOTE OFF - not implemented yet" ); assert( pNote ); // delete the older note... for ( uint i = 0; i < m_playingNotesQueue.size(); ++i ) { Note *pPlayingNote = m_playingNotesQueue[ i ]; if ( pPlayingNote->get_instrument() == pNote->get_instrument() ) { m_playingNotesQueue.erase( m_playingNotesQueue.begin() + i ); delete pPlayingNote; delete pNote; pNote = nullptr; break; } } ERRORLOG( "note not found" ); } // perche' viene passata anche la canzone? E' davvero necessaria? void Synth::process( uint32_t nFrames ) { //INFOLOG( "process" ); // cleanup of the output buffers memset( m_pOut_L, 0, nFrames * sizeof( float ) ); memset( m_pOut_R, 0, nFrames * sizeof( float ) ); for ( uint i = 0; i < m_playingNotesQueue.size(); ++i ) { Note *pPlayingNote = m_playingNotesQueue[ i ]; //pPlayingNote->dumpInfo(); float amplitude = pPlayingNote->get_velocity(); float frequency = TWOPI * 220.0 / 44100.0; for ( uint i = 0; i < nFrames; ++i ) { float fVal = sin( m_fTheta ) * amplitude; m_pOut_L[ i ] += fVal; m_pOut_R[ i ] += fVal; m_fTheta += frequency; } } } void Synth::setAudioOutput( AudioOutput* pAudioOutput ) { m_pAudioOutput = pAudioOutput; } } // namespace H2Core hydrogen-1.0.0-rc1/src/core/src/timehelper.cpp000066400000000000000000000013521366722712400211750ustar00rootroot00000000000000#ifdef WIN32 #include #include int gettimeofday(struct timeval *tv, struct timezone *tz) { FILETIME ft; unsigned __int64 tmpres = 0; static int tzflag; if (NULL != tv) { GetSystemTimeAsFileTime(&ft); tmpres |= ft.dwHighDateTime; tmpres <<= 32; tmpres |= ft.dwLowDateTime; /*converting file time to unix epoch*/ tmpres /= 10; /*convert into microseconds*/ tmpres -= DELTA_EPOCH_IN_MICROSECS; tv->tv_sec = (long)(tmpres / 1000000UL); tv->tv_usec = (long)(tmpres % 1000000UL); } if (NULL != tz) { if (!tzflag) { _tzset(); tzflag++; } tz->tz_minuteswest = _timezone / 60; tz->tz_dsttime = _daylight; } return 0; } #endif hydrogen-1.0.0-rc1/src/core/src/timeline.cpp000066400000000000000000000025471366722712400206540ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 namespace H2Core { const char* Timeline::__class_name = "Timeline"; Timeline::Timeline() : Object( __class_name ) { } void Timeline::sortTimelineVector() { //sort the timeline vector to beats a < b sort(m_timelinevector.begin(), m_timelinevector.end(), TimelineComparator()); } void Timeline::sortTimelineTagVector() { //sort the timeline vector to beats a < b sort(m_timelinetagvector.begin(), m_timelinetagvector.end(), TimelineTagComparator()); } }; hydrogen-1.0.0-rc1/src/core/src/version.cpp000066400000000000000000000012101366722712400205150ustar00rootroot00000000000000 #include "hydrogen/config.h" #include "hydrogen/version.h" namespace H2Core { static const std::string version = H2CORE_VERSION; std::string get_version() { return version; } bool version_older_than( int major, int minor, int patch ) { if ( H2CORE_VERSION_MAJOR > major ) { return true; } else if ( H2CORE_VERSION_MAJOR < major ) { return false; } else { if ( H2CORE_VERSION_MINOR > minor ) { return true; } else if ( H2CORE_VERSION_MINOR < minor ) { return false; } else { if ( H2CORE_VERSION_PATCH > patch ) { return true; } else { return false; } } } } }; /* vim: set softtabstop=4 noexpandtab: */ hydrogen-1.0.0-rc1/src/gui/000077500000000000000000000000001366722712400153775ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/CMakeLists.txt000066400000000000000000000047431366722712400201470ustar00rootroot00000000000000 FILE(GLOB_RECURSE hydrogen_SRCS src/*.cpp) # add undiscovered dependencies to generated config.h INCLUDE(AddFileDependencies) FOREACH( _file ${hydrogen_H} ${hydrogen_SRCS}) FILE(READ "${_file}" _FILE_CONTENT) IF( "${_FILE_CONTENT}" MATCHES "H2CORE_HAVE_" ) ADD_FILE_DEPENDENCIES( ${_file} ${CMAKE_BINARY_DIR}/src/core/include/hydrogen/config.h) ENDIF() ENDFOREACH() INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} # ui_ headers ${CMAKE_CURRENT_SOURCE_DIR}/src # gui headers ${CMAKE_SOURCE_DIR}/src/core/include # core headers ${CMAKE_BINARY_DIR}/src/core/include # generated config.h ${QT_INCLUDES} ${LASH_INCLUDE_DIRS} ${LIBARCHIVE_INCLUDE_DIRS} ) IF(APPLE) # set how it shows up in the Info.plist file SET(MACOSX_BUNDLE_INFO_STRING "Hydrogen for Mac") SET(MACOSX_BUNDLE_ICON_FILE "icon.icns") SET(MACOSX_BUNDLE_GUI_IDENTIFIER "Hydrogen") SET(MACOSX_BUNDLE_LONG_VERSION_STRING "${VERSION}") #this has to be short since it appears as the application name in the menu bar SET(MACOSX_BUNDLE_BUNDLE_NAME "Hydrogen") SET(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VERSION}") SET(MACOSX_BUNDLE_BUNDLE_VERSION "${VERSION}") SET(MACOSX_BUNDLE_COPYRIGHT "Hydrogen Developers, 2009") # set where in the bundle to put the icns file SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/data/img/gray/icon.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) # include the icns file in the target SET(hydrogen_SRCS ${hydrogen_SRCS} ${CMAKE_SOURCE_DIR}/data/img/gray/icon.icns) #copy the data folder FILE(COPY ${CMAKE_SOURCE_DIR}/data DESTINATION hydrogen.app/Contents/Resources PATTERN ".svn" EXCLUDE PATTERN i18n EXCLUDE) ENDIF() ADD_EXECUTABLE(hydrogen WIN32 MACOSX_BUNDLE ${hydrogen_SRCS} ${hydrogen_MOC} ${hydrogen_UIS_H} ${CMAKE_SOURCE_DIR}/windows/icon.rc) SET_PROPERTY(TARGET hydrogen PROPERTY CXX_STANDARD 14) if(APPLE) add_custom_command( TARGET hydrogen POST_BUILD COMMAND plutil -replace NSPrincipalClass -string NSApplication hydrogen.app/Contents/Info.plist ) add_custom_command( TARGET hydrogen POST_BUILD COMMAND plutil -replace NSHighResolutionCapable -bool true hydrogen.app/Contents/Info.plist ) endif() TARGET_LINK_LIBRARIES(hydrogen hydrogen-core-${VERSION} Qt5::Widgets ) ADD_DEPENDENCIES(hydrogen hydrogen-core-${VERSION}) INSTALL(TARGETS hydrogen RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}) hydrogen-1.0.0-rc1/src/gui/src/000077500000000000000000000000001366722712400161665ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/AboutDialog.cpp000066400000000000000000000160261366722712400210710ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "AboutDialog.h" #include "Skin.h" #include #include AboutDialog::AboutDialog(QWidget* parent) : QDialog( parent ) { setupUi( this ); setWindowTitle( tr( "About" ) ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); move( 240, 100 ); QString about; about += QString("
Hydrogen Drum Machine %1 [%2]
").arg( H2Core::get_version().c_str() ).arg( __DATE__ ); about += tr( "Website
" ); about += "http://www.hydrogen-music.org

"; about += tr( "Project page
"); about += "http://sourceforge.net/projects/hydrogen

"; about += tr( "Development mailing list
"); about += "http://lists.sourceforge.net/lists/listinfo/hydrogen-devel
"; aboutTxt->setText( about ); std::vector authorList; authorList.push_back( Author( "Antonio Piraino (aka Journeyman)", "http://www.storiepvtride.it", "Italian manual" ) ); authorList.push_back( Author( "Artemiy Pavlov (aka Artemio)", "www.artemiolabs.com", "drum kits, demo patterns, web site" ) ); authorList.push_back( Author( "Alexandre Prokoudine", "", "Russian translation" ) ); authorList.push_back( Author( "Aurélien Leblond", "", "coding, bug fixes" ) ); authorList.push_back( Author( "Ben Powers", "", "docs" ) ); authorList.push_back( Author( "Benjamin Flaming", "", "JACK patches, bug fix" ) ); authorList.push_back( Author( "Carlo Impagliazzo (aka Truijllo)", "", "testing, ideas.." ) ); authorList.push_back( Author( "Chris Mennie", "http://chrismennie.ca/", "MIDI coding" ) ); authorList.push_back( Author( "Chris Wareham", "", "NetBSD patch" ) ); authorList.push_back( Author( "Christian Vorhof", "", "interface design concept" ) ); authorList.push_back( Author( "Daniil Kolpakov", "", "" ) ); authorList.push_back( Author( "Daniel Tonda Castillo", "", "Spanish manual" ) ); authorList.push_back( Author( "Daryl Hanlon","darylohara@gmail.com","Spanish translation" ) ); authorList.push_back( Author( "Dave Allan", "", "manual review" ) ); authorList.push_back( Author( "Dave Fancella", "", "" ) ); authorList.push_back( Author( "Dave Phillips", "", "bug reports, ideas" ) ); authorList.push_back( Author( "Derrick Karpo", "", "patches, testing" ) ); authorList.push_back( Author( "Dmitry Ivanov", "", "" ) ); authorList.push_back( Author( "Ede Wolf", "", "FAQ, testing" ) ); authorList.push_back( Author( "Elizeu Santos-Neto", "", "Portuguese(Brazil) translation" ) ); authorList.push_back( Author( "Emiliano Grilli (aka Emillo)", "www.emillo.net", "drum kits, demo patterns" ) ); authorList.push_back( Author( "Esben Stien", "", "" ) ); authorList.push_back( Author( "Francesco Cabras", "", "patches, testing" ) ); authorList.push_back( Author( "Gabriel M. Beddingfield", "gabriel@teuton.org", "patches, ideas" ) ); authorList.push_back( Author( "Gene", "", "patches, testing" ) ); authorList.push_back( Author( "Greg Bonik","gregory@bonik.org","pulseaudio coding" ) ); authorList.push_back( Author( "Jakob Lund", "jlund05@imada.sdu.dk", "coding" ) ); authorList.push_back( Author( "Jason Schaefer", "schaefer.jason@gmail.com", "patches, lead/lag feature" ) ); authorList.push_back( Author( "James Stone", "", "Bugfixes" ) ); authorList.push_back( Author( "Jay Alexander Fleming", "", "Serbian translation" ) ); authorList.push_back( Author( "Jesse Chappel", "", "JACK patches" ) ); authorList.push_back( Author( "Jérémy Zurcher", "", "coding") ); authorList.push_back( Author( "Jonas Melzer", "", "German manual" ) ); authorList.push_back( Author( "Jonathan Dempsey", "jonathandempsey@fastmail.fm", "Mac OSX port" ) ); authorList.push_back( Author( "Kevin Dahan (aka Unet)", "", "French translation" ) ); authorList.push_back( Author( "Lee Revell", "", "patches" ) ); authorList.push_back( Author( "Matt Walker", "", "" ) ); authorList.push_back( Author( "Michael Wolkstein", "m.wolkstein@gmx.de", "coding" ) ); authorList.push_back( Author( "Miguel Anxo Bouzada","mbouzada@gmail.com","Galician translation" ) ); authorList.push_back( Author( "Nikos Papadopoylos", "", "Greek translation" ) ); authorList.push_back( Author( "Noel Darlow", "", "manual review" ) ); authorList.push_back( Author( "Olivier Humbert", "", "French translation" ) ); authorList.push_back( Author( "Paul Dorman", "", "" ) ); authorList.push_back( Author( "Pawel Piatek (aka Xj)","xj@wp.pl","coding, bugfixing" ) ); authorList.push_back( Author( "Pieter Van Isacker (aka aikie)", "", "Dutch manual and translation" ) ); authorList.push_back( Author( "Przemysław Sitek", "el.pescado@gazeta.pl", "coding" ) ); authorList.push_back( Author( "Samuel Mimram", "", "packages" ) ); authorList.push_back( Author( "Sebastian Moors (aka mauser)", "mauser@smoors.de", "coding" ) ); authorList.push_back( Author( "Sergio Gil Perez de la Manga", "", "Spanish translation" ) ); authorList.push_back( Author( "Simon Donike", "", "German translation" ) ); authorList.push_back( Author( "Steve Boyer", "", "Windows cross compilation scripts" ) ); authorList.push_back( Author( "Thijs Van Severen", "http://audio-and-linux.blogspot.be/", "manual, website, coding" ) ); authorList.push_back( Author( "Torben Hohn", "", "bugfixing, test" ) ); authorList.push_back( Author( "Yamasaki Yutaka", "yamasaki@good-day.co.jp", "Japanese translation" ) ); authorList.push_back( Author( "Willie Sippel", "willie@zeitgeistmedia.net", "GUI graphics, coding" ) ); QString sAuthors; sAuthors += tr( "Main coder and maintainer:
" ); sAuthors += "
  • Alessandro Cominu (aka Comix) [2001-2008]

  • "; sAuthors += "
  • Michael Wolkstein (aka Wolke) [2008-2014]

  • "; sAuthors += "
  • Sebastian Moors (aka Mauser) [2008-now]

"; sAuthors += tr( "Thanks to:" ); sAuthors += "
    "; for ( uint i = 0; i < authorList.size(); ++i ) { Author a = authorList.at( i ); sAuthors += "
  • "; sAuthors += "" + a.m_sName + " - " + a.m_sInfo + ""; sAuthors += "

  • "; } sAuthors += "
"; authorsText->setText( sAuthors ); logoLabel->setPixmap( QPixmap( Skin::getImagePath() +"/about/aboutLogo.png" ) ); } AboutDialog::~AboutDialog() { } /** * Close the dialog */ void AboutDialog::on_okBtn_clicked() { accept(); } hydrogen-1.0.0-rc1/src/gui/src/AboutDialog.h000066400000000000000000000026011366722712400205300ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ABOUT__DIALOG_H #define ABOUT__DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include "ui_about_dialog.h" class AboutDialog : public QDialog, public Ui_AboutDialog_UI { Q_OBJECT public: AboutDialog(QWidget* parent); ~AboutDialog(); private slots: void on_okBtn_clicked(); private: class Author { public: QString m_sName; QString m_sEmail; QString m_sInfo; Author( QString sName, QString sEmail, QString sInfo ) : m_sName( sName ), m_sEmail( sEmail ), m_sInfo( sInfo ) {} }; }; #endif hydrogen-1.0.0-rc1/src/gui/src/AudioEngineInfoForm.cpp000066400000000000000000000136731366722712400225330ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "AudioEngineInfoForm.h" #include #if QT_VERSION >= 0x050000 # include #endif #include "HydrogenApp.h" #include #include #include #include #include #include #include #include using namespace H2Core; #include "Skin.h" const char* AudioEngineInfoForm::__class_name = "AudioEngineInfoForm"; AudioEngineInfoForm::AudioEngineInfoForm(QWidget* parent) : QWidget( parent ) , Object( __class_name ) { setupUi( this ); setMinimumSize( width(), height() ); // not resizable setMaximumSize( width(), height() ); // not resizable setWindowTitle( tr( "Audio Engine Info" ) ); updateInfo(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateInfo())); HydrogenApp::get_instance()->addEventListener( this ); updateAudioEngineState(); } /** * Destructor */ AudioEngineInfoForm::~AudioEngineInfoForm() { } /** * show event */ void AudioEngineInfoForm::showEvent ( QShowEvent* ) { updateInfo(); timer->start(200); } /** * hide event */ void AudioEngineInfoForm::hideEvent ( QHideEvent* ) { timer->stop(); } void AudioEngineInfoForm::updateInfo() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); // Song position QString sSongPos = "N/A"; if ( pEngine->getPatternPos() != -1 ) { sSongPos = QString::number( pEngine->getPatternPos() ); } m_pSongPositionLbl->setText( sSongPos ); // Audio engine Playing notes char tmp[100]; // Process time int perc = 0; if ( pEngine->getMaxProcessTime() != 0.0 ) { perc= (int)( pEngine->getProcessTime() / ( pEngine->getMaxProcessTime() / 100.0 ) ); } sprintf(tmp, "%#.2f / %#.2f (%d%%)", pEngine->getProcessTime(), pEngine->getMaxProcessTime(), perc ); processTimeLbl->setText(tmp); // Song state if (pSong == nullptr) { songStateLbl->setText( "NULL song" ); } else { if (pSong->get_is_modified()) { songStateLbl->setText( "Modified" ); } else { songStateLbl->setText( "Saved" ); } } // tick number sprintf(tmp, "%03d", (int)pEngine->getTickPosition() ); nTicksLbl->setText(tmp); // Audio driver info AudioOutput *driver = pEngine->getAudioOutput(); if (driver) { QString audioDriverName = driver->class_name(); driverLbl->setText(audioDriverName); // Audio driver buffer size sprintf(tmp, "%d", driver->getBufferSize()); bufferSizeLbl->setText(QString(tmp)); // Audio driver sampleRate sprintf(tmp, "%d", driver->getSampleRate()); sampleRateLbl->setText(QString(tmp)); // Number of frames sprintf(tmp, "%d", (int)driver->m_transport.m_nFrames ); nFramesLbl->setText(tmp); } else { driverLbl->setText( "NULL driver" ); bufferSizeLbl->setText( "N/A" ); sampleRateLbl->setText( "N/A" ); nFramesLbl->setText( "N/A" ); } nRealtimeFramesLbl->setText( QString( "%1" ).arg( pEngine->getRealtimeFrames() ) ); // Midi driver info MidiInput *pMidiDriver = pEngine->getMidiInput(); if (pMidiDriver) { midiDriverName->setText( pMidiDriver->class_name() ); } else { midiDriverName->setText("No MIDI driver support"); } m_pMidiDeviceName->setText( Preferences::get_instance()->m_sMidiPortName ); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if (nSelectedPatternNumber == -1) { selectedPatLbl->setText( "N/A"); } else { selectedPatLbl->setText( QString("%1").arg(nSelectedPatternNumber) ); } int nSelectedInstrumentNumber = pEngine->getSelectedInstrumentNumber(); if (nSelectedInstrumentNumber == -1) { m_pSelectedInstrLbl->setText( "N/A" ); } else { m_pSelectedInstrLbl->setText( QString("%1").arg(nSelectedInstrumentNumber) ); } PatternList *pPatternList = Hydrogen::get_instance()->getCurrentPatternList(); if (pPatternList) { currentPatternLbl->setText( QString::number(pPatternList->size()) ); } else { currentPatternLbl->setText( "N/A" ); } // SAMPLER Sampler *pSampler = AudioEngine::get_instance()->get_sampler(); sampler_playingNotesLbl->setText(QString( "%1 / %2" ).arg(pSampler->get_playing_notes_number()).arg(Preferences::get_instance()->m_nMaxNotes)); // Synth Synth *pSynth = AudioEngine::get_instance()->get_synth(); synth_playingNotesLbl->setText( QString( "%1" ).arg( pSynth->getPlayingNotesNumber() ) ); } /** * Update engineStateLbl with the current audio engine state */ void AudioEngineInfoForm::updateAudioEngineState() { // Audio Engine state QString stateTxt; int state = Hydrogen::get_instance()->getState(); switch (state) { case STATE_UNINITIALIZED: stateTxt = "Uninitialized"; break; case STATE_INITIALIZED: stateTxt = "Initialized"; break; case STATE_PREPARED: stateTxt = "Prepared"; break; case STATE_READY: stateTxt = "Ready"; break; case STATE_PLAYING: stateTxt = "Playing"; break; default: stateTxt = "Unknown!?"; break; } engineStateLbl->setText(stateTxt); } void AudioEngineInfoForm::stateChangedEvent( int ) { updateAudioEngineState(); } void AudioEngineInfoForm::patternChangedEvent() { updateAudioEngineState(); } hydrogen-1.0.0-rc1/src/gui/src/AudioEngineInfoForm.h000066400000000000000000000032511366722712400221670ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AUDIO_ENGINE_INFO_FORM_H #define AUDIO_ENGINE_INFO_FORM_H #include #include "EventListener.h" #include "ui_AudioEngineInfoForm_UI.h" #include #if QT_VERSION >= 0x050000 # include #endif /** * Audio Engine information form */ class AudioEngineInfoForm : public QWidget, public Ui_AudioEngineInfoForm_UI, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT private: QTimer *timer; virtual void updateAudioEngineState(); // EventListener implementation virtual void stateChangedEvent(int nState); virtual void patternChangedEvent(); //~ EventListener implementation public: AudioEngineInfoForm(QWidget* parent); ~AudioEngineInfoForm(); void showEvent ( QShowEvent *ev ); void hideEvent ( QHideEvent *ev ); public slots: void updateInfo(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/AudioEngineInfoForm_UI.ui000066400000000000000000000312221366722712400227510ustar00rootroot00000000000000 AudioEngineInfoForm_UI 0 0 590 376 Form1 300 80 281 61 Synth 10 30 261 19 0 0 0 0 6 6 ### Playing notes 300 10 281 61 Sampler 10 30 261 21 0 0 0 0 6 6 ### Playing notes 10 10 281 65 0 0 0 0 6 6 Selected instrument Audio engine state ### ### ### Process time 10 90 281 151 Sequencer 11 31 261 111 0 0 0 0 6 6 ### ### Song state Selected pattern Song position Patterns ### ### ### Ticks 10 250 281 81 MIDI input 10 30 261 42 0 0 0 0 6 6 ### ### Connected to Name 300 150 281 151 Audio output 10 30 261 111 0 0 0 0 6 6 ### Realtime frames Buffer size ### ### ### Sample rate Name ### Frames hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/000077500000000000000000000000001366722712400213735ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/AudioFileBrowser.cpp000066400000000000000000000310161366722712400253050ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "AudioFileBrowser.h" #include "../HydrogenApp.h" #include "InstrumentEditor/InstrumentEditor.h" #include "SampleWaveDisplay.h" #include "../Widgets/Button.h" #include "../Skin.h" #include #include #include #include #include #include using namespace H2Core; using namespace std; const char* AudioFileBrowser::__class_name = "AudioFileBrowser"; AudioFileBrowser::AudioFileBrowser ( QWidget* pParent, bool bAllowMultiSelect, bool bShowInstrumentManipulationControls) : QDialog ( pParent ) , Object ( __class_name ) { setupUi ( this ); INFOLOG ( "INIT" ); setWindowTitle ( tr ( "Audio File Browser" ) ); setFixedSize ( width(), height() ); m_bAllowMultiSelect = bAllowMultiSelect; m_bShowInstrumentManipulationControls = bShowInstrumentManipulationControls; m_pDirModel = new QDirModel(); m_pDirModel->setFilter( QDir::AllDirs | QDir::AllEntries | QDir::NoDotAndDotDot ); m_pDirModel->setNameFilters( QStringList() << "*.ogg" << "*.OGG" << "*.wav" << "*.WAV" << "*.flac"<< "*.FLAC" << "*.aiff" << "*.AIFF"<< "*.au" << "*.AU" ); m_pDirModel->setSorting( QDir::DirsFirst |QDir::Name ); m_ModelIndex = m_pDirModel->index( QDir::currentPath() ); m_pPlayBtn->setEnabled( false ); m_pStopBtn->setEnabled( false ); openBTN->setEnabled( false ); m_pTree = new QTreeView( treeView ); m_pTree->setModel( m_pDirModel ); m_pTree->resize( 799, 310 ); m_pTree->header()->resizeSection( 0, 405 ); m_pTree->setAlternatingRowColors( true ); m_pTree->setRootIndex( m_pDirModel->index( Preferences::get_instance()->__lastsampleDirectory ) ); pathLineEdit->setText( Preferences::get_instance()->__lastsampleDirectory ); m_pSampleFilename = ""; m_pSelectedFile << "false" << "false"; m_sEmptySampleFilename = Filesystem::empty_sample_path(); m_pPathUptoolButton->setIcon( QIcon( Skin::getImagePath() + "/audiFileBrowser/go-up.png")); m_pPathUptoolButton->setToolTip( QString("Parent Folder")); m_pPathHometoolButton->setIcon( QIcon( Skin::getImagePath() + "/audiFileBrowser/go-home.png")); m_pPathHometoolButton->setToolTip( QString("Home")); m_pPlayBtn->setIcon( QIcon( Skin::getImagePath() + "/audiFileBrowser/player_play.png")); m_pPlayBtn->setToolTip( QString("Play selected")); m_pStopBtn->setIcon( QIcon( Skin::getImagePath() + "/audiFileBrowser/player_stop.png")); m_pStopBtn->setToolTip( QString("Stop")); m_pSampleWaveDisplay = new SampleWaveDisplay( waveformview ); m_pSampleWaveDisplay->updateDisplay( m_sEmptySampleFilename ); m_pSampleWaveDisplay->move( 3, 3 ); playSamplescheckBox->setChecked( Preferences::get_instance()->__playsamplesonclicking ); //get the kde or gnome environment variable for mouse double or single clicking m_SingleClick = false; getEnvironment(); if( !m_bShowInstrumentManipulationControls ) { useNameCheckBox->hide(); autoVelCheckBox->hide(); } connect( m_pTree, SIGNAL( clicked( const QModelIndex&) ), SLOT( clicked( const QModelIndex& ) ) ); connect( m_pTree, SIGNAL( doubleClicked( const QModelIndex&) ), SLOT( doubleClicked( const QModelIndex& ) ) ); connect( pathLineEdit, SIGNAL( returnPressed() ), SLOT( updateModelIndex() ) ); } AudioFileBrowser::~AudioFileBrowser() { Sample *pNewSample = Sample::load( m_sEmptySampleFilename ); AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, 100 ); INFOLOG ( "DESTROY" ); } bool AudioFileBrowser::isFileSupported( QString filename ) { if ( ( filename.endsWith( ".ogg" ) ) || ( filename.endsWith( ".OGG" ) ) || ( filename.endsWith( ".wav" ) ) || ( filename.endsWith( ".WAV" ) ) || ( filename.endsWith( ".au" ) ) || ( filename.endsWith( ".AU" ) ) || ( filename.endsWith( ".aiff" ) ) || ( filename.endsWith( ".AIFF" ) ) || ( filename.endsWith( ".flac" ) ) || ( filename.endsWith( ".FLAC" ) ) ){ return true; } else { return false; } } void AudioFileBrowser::getEnvironment() { QString desktopSession = getenv("DESKTOP_SESSION"); //kde if( desktopSession == "kde" ) { QFile envfile( QDir::homePath() + "/.kde/share/config/kdeglobals"); if ( !envfile.open(QIODevice::ReadOnly | QIODevice::Text) ) { return; } QTextStream envin( &envfile ); while ( !envin.atEnd() ) { QString envLine = envin.readLine(); if( envLine == QString("SingleClick=true" ) ) { m_SingleClick = true; break; } } } //for gnome, xfce and all others we use double click as default } void AudioFileBrowser::keyPressEvent (QKeyEvent *ev) { if( ev->modifiers()==Qt::ControlModifier && m_bAllowMultiSelect) { m_pTree->setSelectionMode( QAbstractItemView::MultiSelection ); openBTN->setEnabled( true ); } } void AudioFileBrowser::keyReleaseEvent (QKeyEvent *ev) { m_pTree->setSelectionMode( QAbstractItemView::SingleSelection ); } void AudioFileBrowser::updateModelIndex() { QString toRemove; QString newPath = pathLineEdit->text(); if( QDir( newPath ).exists() ) { m_pTree->setRootIndex( m_pDirModel->index( newPath ) ); } else { toRemove = newPath.section( '/', -1 ); // QMessageBox::information ( this, "Hydrogen", newpath + toremove); newPath.replace( toRemove, "" ); m_pTree->setRootIndex( m_pDirModel->index( newPath ) ); } } void AudioFileBrowser::clicked( const QModelIndex& index ) { QString path = m_pDirModel->filePath( index ); if( m_SingleClick ) { browseTree( index ); } if( isFileSupported( path ) ) { browseTree( index ); } } void AudioFileBrowser::doubleClicked( const QModelIndex& index ) { if(!m_SingleClick) { browseTree( index ); } } void AudioFileBrowser::browseTree( const QModelIndex& index ) { QString path = m_pDirModel->filePath( index ); pathLineEdit->setText( path ); m_pSampleWaveDisplay->updateDisplay( m_sEmptySampleFilename ); updateModelIndex(); //with this you have a navigation like konqueror if ( m_pDirModel->isDir( index ) ){ m_pPlayBtn->setEnabled( false ); openBTN->setEnabled( false ); return; } QString name = path.section( '/', -1 ); QString path2 = path; QString onlyPath = path; if ( name != "" ){ onlyPath = path.replace( name, "" ); } name = name.left( '.' ); QString message = "Name: " + name; pathLineEdit->setText( onlyPath ); QStringList path2List = path2.split("/"); QString fleTxt = path2List.last(); QApplication::setOverrideCursor(Qt::WaitCursor); if( isFileSupported( path2 ) ) { filelineedit->setText( fleTxt ); Sample *pNewSample = Sample::load( path2 ); if ( pNewSample ) { m_pNBytesLable->setText( tr( "Size: %1 bytes" ).arg( pNewSample->get_size() / 2 ) ); m_pSamplerateLable->setText( tr( "Samplerate: %1" ).arg( pNewSample->get_sample_rate() ) ); float sec = ( float )( pNewSample->get_frames() / (float)pNewSample->get_sample_rate() ); QString qsec; qsec = QString::asprintf( "%2.2f", sec ); m_pLengthLable->setText( tr( "Sample length: " ) + qsec + tr( " s" ) ); delete pNewSample; m_pSampleFilename = path2; m_pSampleWaveDisplay->updateDisplay( path2 ); m_pPlayBtn->setEnabled( true ); openBTN->setEnabled( true ); //important this will only working correct if m_pSampleWaveDisplay->updateDisplay( file ) //is ready with painting the wav file. else the playing sample get crackled sound!! if (playSamplescheckBox->isChecked()){ if ( sec <= 600.00){ on_m_pPlayBtn_clicked(); }else { QMessageBox::information ( this, "Hydrogen", tr( "Please do not preview samples which are longer than 10 minutes!" ) ); } } m_pNameLabel->setText( message ); } else { openBTN->setEnabled( false ); QMessageBox::information ( this, "Hydrogen", tr( "Unable to load that sample file." ) ); } }else{ m_pNameLabel->setText( tr( "Name:")); m_pNBytesLable->setText( tr( "Size:" ) ); m_pSamplerateLable->setText( tr( "Samplerate:" ) ); m_pLengthLable->setText( tr( "Sample length:" ) ); m_pSampleWaveDisplay->updateDisplay( m_sEmptySampleFilename ); m_pPlayBtn->setEnabled( false ); m_pStopBtn->setEnabled( false ); openBTN->setEnabled( false ); m_pSampleFilename = ""; } QApplication::restoreOverrideCursor(); } void AudioFileBrowser::on_m_pPlayBtn_clicked() { if( QFile( m_pSampleFilename ).exists() == false ) { return; } m_pStopBtn->setEnabled( true ); Sample *pNewSample = Sample::load( m_pSampleFilename ); if ( pNewSample ) { assert(pNewSample->get_sample_rate() != 0); int length = ( ( pNewSample->get_frames() / pNewSample->get_sample_rate() + 1) * 100 ); AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, length ); } } void AudioFileBrowser::on_m_pStopBtn_clicked() { Sample *pNewSample = Sample::load( m_sEmptySampleFilename ); AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, 100 ); m_pStopBtn->setEnabled( false ); } void AudioFileBrowser::on_cancelBTN_clicked() { Preferences::get_instance()->__lastsampleDirectory = pathLineEdit->text(); m_pSelectedFile << "false" << "false" << ""; reject(); } void AudioFileBrowser::on_openBTN_clicked() { if( m_pTree->selectionModel()->selectedRows().size() > 0) { QList::iterator i; QList list = m_pTree->selectionModel()->selectedRows(); for (i = list.begin(); i != list.end(); ++i) { QString path2 = (*i).data().toString(); if( isFileSupported( path2 ) ){ QString path = pathLineEdit->text(); if(! path.endsWith("/")) { path = path + "/"; } QString act_filename = path + path2; m_pSelectedFile << act_filename ; } } } Preferences::get_instance()->__lastsampleDirectory = pathLineEdit->text(); accept(); } void AudioFileBrowser::on_playSamplescheckBox_clicked() { Preferences::get_instance()->__playsamplesonclicking = playSamplescheckBox->isChecked(); } QStringList AudioFileBrowser::getSelectedFiles() { if ( useNameCheckBox->isChecked() ) { m_pSelectedFile[0] = "true"; } if ( autoVelCheckBox->isChecked() ) { m_pSelectedFile[1] = "true"; } return m_pSelectedFile; } void AudioFileBrowser::on_m_pPathHometoolButton_clicked() { QString path = pathLineEdit->text(); QStringList pathlist = path.split("/"); while( path != QDir::rootPath() ){ if( pathlist.isEmpty () ) { break; } pathlist.removeLast(); QString updir = pathlist.join("/"); pathLineEdit->setText( updir ); m_pTree->setRootIndex( m_pDirModel->index( updir ) ); m_pTree->collapse( m_pDirModel->index( updir ) ); m_pTree->setExpanded( m_pDirModel->index(updir), false ); path = pathLineEdit->text(); } pathLineEdit->setText( QDir::homePath() ); m_pTree->setRootIndex( m_pDirModel->index( QDir::homePath() ) ); m_pTree->collapse( m_pDirModel->index( QDir::homePath()) ); } void AudioFileBrowser::on_m_pPathUptoolButton_clicked() { QString path = pathLineEdit->text(); QStringList pathlist = path.split("/"); if( pathlist.isEmpty () ) { return; } if( path.endsWith( "/" ) ) { pathlist.removeLast(); QString tmpupdir = pathlist.join("/"); m_pTree->setRootIndex( m_pDirModel->index( tmpupdir ) ); m_pTree->collapse( m_pDirModel->index( tmpupdir ) ); m_pTree->setExpanded( m_pDirModel->index( tmpupdir ), false ); } pathlist.removeLast(); QString updir = pathlist.join("/"); if ( updir == "" ) { pathLineEdit->setText( QString("/") ); } else { pathLineEdit->setText( updir ); } m_pTree->setRootIndex( m_pDirModel->index( updir ) ); m_pTree->collapse( m_pDirModel->index( updir ) ); m_pTree->setExpanded( m_pDirModel->index(updir), false ); } void AudioFileBrowser::on_hiddenCB_clicked() { if ( hiddenCB->isChecked() ) { m_pDirModel->setFilter( QDir::AllDirs | QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden ); } else { m_pDirModel->setFilter( QDir::AllDirs | QDir::AllEntries | QDir::NoDotAndDotDot ); m_pTree->setRootIndex( m_pDirModel->index( pathLineEdit->text() ) ); } } hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/AudioFileBrowser.h000066400000000000000000000050121366722712400247470ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AUDIOFILEBROWSER_H #define AUDIOFILEBROWSER_H #include "ui_AudioFileBrowser_UI.h" #include "InstrumentEditor/InstrumentEditor.h" #include #include #include class Button; class SampleWaveDisplay; /// /// This dialog is used to preview audiofiles /// class AudioFileBrowser : public QDialog, public Ui_AudioFileBrowser_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: AudioFileBrowser( QWidget* pParent, bool bAllowMultiSelect, bool bShowInstrumentManipulationControls); ~AudioFileBrowser(); QStringList getSelectedFiles(); QString setDir( QString dir ); private slots: void on_cancelBTN_clicked(); void on_openBTN_clicked(); void clicked( const QModelIndex& index ); void doubleClicked( const QModelIndex& index ); void on_m_pPlayBtn_clicked(); void on_m_pStopBtn_clicked(); void updateModelIndex(); void on_m_pPathHometoolButton_clicked(); void on_m_pPathUptoolButton_clicked(); void on_playSamplescheckBox_clicked(); void on_hiddenCB_clicked(); virtual void keyPressEvent (QKeyEvent *ev); virtual void keyReleaseEvent (QKeyEvent *ev); private: void browseTree( const QModelIndex& index ); void getEnvironment(); bool isFileSupported( QString filename ); InstrumentEditor* m_pInstrumentEditor; SampleWaveDisplay * m_pSampleWaveDisplay; QString m_pSampleFilename; QStringList m_pSelectedFile; bool m_SingleClick; QDirModel * m_pDirModel; QTreeView * m_pTree; QModelIndex m_ModelIndex; QString m_sEmptySampleFilename; QStringList m_Filters; bool m_bAllowMultiSelect; bool m_bShowInstrumentManipulationControls; }; #endif hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/AudioFileBrowser_UI.ui000066400000000000000000000142141366722712400255360ustar00rootroot00000000000000 AudioFileBrowser_UI 0 0 821 564 Dialog 360 390 451 91 QFrame::StyledPanel QFrame::Raised 10 390 341 131 QFrame::StyledPanel QFrame::Raised 10 10 321 111 Name: Samplerate: Size: Length: 10 530 341 21 Pla&y samples by clicking 10 10 801 35 View hidden folders &Up &Home 360 490 71 26 &Play Sample 11 41 801 341 440 490 51 26 &Stop 360 530 251 21 Be careful, this change all Layer velocity settings Set automatic velocity 718 520 91 33 Cancel 620 520 91 33 Open 520 490 291 21 &Filename to instrument name pathLineEdit hiddenCB m_pPathUptoolButton m_pPathHometoolButton treeView filelineedit m_pPlayBtn m_pStopBtn playSamplescheckBox autoVelCheckBox hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/SampleWaveDisplay.cpp000066400000000000000000000063241366722712400254760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include "SampleWaveDisplay.h" #include "../Skin.h" const char* SampleWaveDisplay::__class_name = "SampleWaveDisplay"; SampleWaveDisplay::SampleWaveDisplay(QWidget* pParent) : QWidget( pParent ) , Object( __class_name ) , m_sSampleName( "" ) { // setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); int w = 445; int h = 85; resize( w, h ); bool ok = m_Background.load( Skin::getImagePath() + "/waveDisplay/bgsamplewavedisplay.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } m_pPeakData = new int[ w ]; } SampleWaveDisplay::~SampleWaveDisplay() { //INFOLOG( "DESTROY" ); delete[] m_pPeakData; } void SampleWaveDisplay::paintEvent(QPaintEvent *ev) { QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing ); painter.drawPixmap( ev->rect(), m_Background, ev->rect() ); painter.setPen( QColor( 102, 150, 205 ) ); int VCenter = height() / 2; for ( int x = 0; x < width(); x++ ) { painter.drawLine( x, VCenter, x, m_pPeakData[x] + VCenter ); painter.drawLine( x, VCenter, x, -m_pPeakData[x] + VCenter ); } QFont font; font.setWeight( 63 ); painter.setFont( font ); painter.setPen( QColor( 255 , 255, 255, 200 ) ); painter.drawText( 0, 0, width(), 20, Qt::AlignCenter, m_sSampleName ); } void SampleWaveDisplay::updateDisplay( QString filename ) { Sample *pNewSample = Sample::load( filename ); if ( pNewSample ) { // Extract the filename from the complete path QString sName = filename; int nPos = sName.lastIndexOf( "/" ); if ( sName.endsWith("emptySample.wav")){ m_sSampleName = ""; }else { m_sSampleName = sName.mid( nPos + 1, sName.length() ); } // INFOLOG( "[updateDisplay] sample: " + m_sSampleName ); int nSampleLength = pNewSample->get_frames(); float nScaleFactor = nSampleLength / width(); float fGain = height() / 2.0 * 1.0; float *pSampleData = pNewSample->get_data_l(); int nSamplePos =0; int nVal; for ( int i = 0; i < width(); ++i ){ nVal = 0; for ( int j = 0; j < nScaleFactor; ++j ) { if ( j < nSampleLength ) { int newVal = static_cast( pSampleData[ nSamplePos ] * fGain ); if ( newVal > nVal ) { nVal = newVal; } } ++nSamplePos; } m_pPeakData[ i ] = nVal; } } delete pNewSample; update(); } hydrogen-1.0.0-rc1/src/gui/src/AudioFileBrowser/SampleWaveDisplay.h000066400000000000000000000025101366722712400251340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SAMPLE_WAVE_DISPLAY #define SAMPLE_WAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include class SampleWaveDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: SampleWaveDisplay( QWidget* pParent ); ~SampleWaveDisplay(); void updateDisplay( QString filename ); void paintEvent(QPaintEvent *ev); private: QPixmap m_Background; QString m_sSampleName; int * m_pPeakData; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Director.cpp000066400000000000000000000147171366722712400204570ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 * */ /** ** ** this dialog is used to use show a director. ** for example to play live without a click in your ears. ** here you get : ** - song name ** - a visual metronome ** - bar position info ** - beat position info ** - bar position tags (current and next) ** ** ------------------------------------------- ** | | ** | song name | ** | | ** ------------------------------------------- ** | | | ** | Bar | Beat | ** | | | ** ------------------------------------------- ** | | ** | current bar tag | ** | | ** ------------------------------------------- ** | | ** | next bar tag | ** | | ** ------------------------------------------- **/ #include "Director.h" #include "HydrogenApp.h" #include "Widgets/PixmapWidget.h" #include #include #include #include using namespace H2Core; using namespace std; Director::Director ( QWidget* pParent ) : QDialog ( pParent ) , Object ( "Director" ) { HydrogenApp::get_instance()->addEventListener( this ); setupUi ( this ); //INFOLOG ( "INIT" ); setWindowTitle ( tr ( "Director" ) ); m_nCounter = 1; // to compute the right beat m_nFadeAlpha = 255; //default alpha m_nBar = 1; // default bar m_nFlashingArea = width() * 5/100; m_fBpm = Hydrogen::get_instance()->getSong()->__bpm; m_pTimeline = Hydrogen::get_instance()->getTimeline(); m_pTimer = new QTimer( this ); connect( m_pTimer, SIGNAL( timeout() ), this, SLOT( updateMetronomBackground() ) ); } Director::~Director() { //INFOLOG ( "DESTROY" ); } void Director::keyPressEvent( QKeyEvent* ev ) { if(ev->key() == Qt::Key_Escape) { HydrogenApp::get_instance()->showDirector(); } } void Director::closeEvent( QCloseEvent* ev ) { HydrogenApp::get_instance()->showDirector(); } void Director::metronomeEvent( int nValue ) { //load a new song if( nValue == 3 ){ //update songname QStringList list = Hydrogen::get_instance()->getSong()->get_filename().split("/"); if ( !list.isEmpty() ){ m_sSongName = list.last().replace( Filesystem::songs_ext, "" ); // if songname is not set, default on an empty song, we call them "Untitled Song". if( m_sSongName.isEmpty() ){ m_sSongName = QString("Untitled Song"); } } update(); return; } //bpm m_fBpm = Hydrogen::get_instance()->getSong()->__bpm; //bar m_nBar = Hydrogen::get_instance()->getPatternPos() + 1; if ( m_nBar <= 0 ){ m_nBar = 1; } // 1000 ms / bpm / 60s m_pTimer->start( static_cast( 1000 / ( m_fBpm / 60 )) / 2 ); m_nFlashingArea = width() * 5/100; m_nFadeAlpha = 255; if ( nValue == 2 ){ m_nFadeAlpha = 0; update(); m_sTAG=""; m_sTAG2=""; return; } if ( nValue == 1 ) { //foregroundcolor "rect" for first blink m_Color = QColor( 255, 50, 1 ,255 ); m_nCounter = 1; } else { //foregroundcolor "rect" for all other blinks m_nCounter++; if( m_nCounter %2 == 0 ) m_nFlashingArea = width() * 52.5/100; m_Color = QColor( 24, 250, 31, 255 ); } // get tags m_sTAG=""; m_sTAG2=""; for ( size_t t = 0; t < m_pTimeline->m_timelinetagvector.size(); t++){ if(t+1m_timelinetagvector.size() && m_pTimeline->m_timelinetagvector[t+1].m_htimelinetagbeat == m_nBar ){ m_sTAG2 = m_pTimeline->m_timelinetagvector[t+1].m_htimelinetag ; } if ( m_pTimeline->m_timelinetagvector[t].m_htimelinetagbeat <= m_nBar-1){ m_sTAG = m_pTimeline->m_timelinetagvector[t].m_htimelinetag ; } if( m_pTimeline->m_timelinetagvector[t].m_htimelinetagbeat > m_nBar-1){ break; } } update(); } void Director::updateMetronomBackground() { m_Color.setAlpha( 0 ); m_pTimer->stop(); update(); } void Director::paintEvent( QPaintEvent* ev ) { QPainter painter(this); //draw the songname painter.setFont(QFont("Arial", height() * 14/100 )); QRect rect(QPoint( width() * 5/100 , height () * 2/100 ), QSize( width() * 90/100, height() * 21/100)); painter.drawText( rect, Qt::AlignCenter, QString( m_sSongName ) ); //draw the metronome painter.setPen( QPen(QColor( 249, 235, 116, 200 ) ,1 , Qt::SolidLine ) ); painter.setBrush( m_Color ); painter.drawRect ( m_nFlashingArea, height() * 25/100, width() * 42.5/100, height() * 35/100); //draw bars painter.setPen(Qt::white); painter.setFont(QFont("Arial", height() * 25/100 )); QRect r1(QPoint( width() * 5/100 , height() * 25/100 ), QSize( width() * 42.5/100, height() * 35/100)); painter.drawText( r1, Qt::AlignCenter, QString("%1").arg( m_nBar) ); //draw beats QRect r2(QPoint( width() * 52.5/100 , height() * 25/100 ), QSize( width() * 42.5/100, height() * 35/100)); painter.drawText( r2, Qt::AlignCenter, QString("%1").arg( m_nCounter) ); if( m_sTAG == m_sTAG2 ){ m_sTAG2 = ""; } //draw current bar tag painter.setPen(Qt::white); painter.setFont(QFont("Arial", height() * 8/100 )); QRect r3(QPoint ( width() * 5/100 , height() * 65/100 ), QSize( width() * 90/100, height() * 14/100)); painter.drawText( r3, Qt::AlignCenter, QString( (m_sTAG) ) ); //draw next bar tag painter.setPen(Qt::gray); painter.setFont(QFont("Arial", height() * 6/100 )); QRect r4(QPoint ( width() * 5/100 , height() * 83/100 ), QSize( width() * 90/100, height() * 11/100)); painter.drawText( r4, Qt::AlignCenter, QString( m_sTAG2 ) ); } hydrogen-1.0.0-rc1/src/gui/src/Director.h000066400000000000000000000034121366722712400201120ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 METRO_BLINKER_H #define METRO_BLINKER_H #include #include "ui_Director_UI.h" #include #include #include #include #include "EventListener.h" class Director : public QDialog, public Ui_Director_UI, public H2Core::Object, public EventListener { Q_OBJECT public: Director( QWidget* pParent ); ~Director(); virtual void metronomeEvent( int nValue ); virtual void paintEvent( QPaintEvent*); void keyPressEvent( QKeyEvent* ev ); void closeEvent( QCloseEvent* ev ); private slots: void updateMetronomBackground(); private: QTimer *m_pTimer; H2Core::Timeline *m_pTimeline; QColor m_Color; QPalette m_BlinkerPalette; int m_nCounter; int m_nFadeAlpha; float m_fBpm; int m_nBar; int m_nFlashingArea; QString m_sTAG; QString m_sTAG2; QString m_sSongName; int m_nTagbeat; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Director_UI.ui000066400000000000000000000006711366722712400207010ustar00rootroot00000000000000 Director_UI 0 0 423 377 Dialog hydrogen-1.0.0-rc1/src/gui/src/DonationDialog.cpp000066400000000000000000000036261366722712400215740ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "DonationDialog.h" #include "Skin.h" #include DonationDialog::DonationDialog(QWidget* parent) : QDialog( parent ) { setupUi( this ); setWindowTitle( tr( "Donations" ) ); } DonationDialog::~DonationDialog() { } void DonationDialog::on_randomizeBtn_clicked() { int r = rand() % 2; if( r == 0 ) { radioButton->setChecked(true); } else { radioButton_2->setChecked(true); } } void DonationDialog::on_donateBtn_clicked() { if(radioButton->isChecked()) { QDesktopServices::openUrl(QUrl::fromEncoded("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=sebastian%2emoors%40gmail%2ecom&lc=DE&item_name=Hydrogen%20donation&no_note=0¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHostedGuest")); } else { QDesktopServices::openUrl(QUrl::fromEncoded("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=m%2ewolkstein%40gmx%2ede&lc=DE&item_name=Hydrogen%20donation&no_note=0¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHostedGuest")); } accept(); } hydrogen-1.0.0-rc1/src/gui/src/DonationDialog.h000066400000000000000000000023511366722712400212330ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 DONATION__DIALOG_H #define DONATION__DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include "ui_DonationDialog.h" class DonationDialog : public QDialog, public Ui_DonationDialog_UI { Q_OBJECT public: DonationDialog(QWidget* parent); ~DonationDialog(); private slots: void on_randomizeBtn_clicked(); void on_donateBtn_clicked(); private: }; #endif hydrogen-1.0.0-rc1/src/gui/src/DonationDialog.ui000066400000000000000000000117261366722712400214270ustar00rootroot00000000000000 DonationDialog_UI 0 0 682 242 Form 0 0 681 241 Qt::Horizontal QSizePolicy::Maximum 30 20 Qt::Vertical 20 40 <html><head/><body><p align="justify">Hydrogen is an open source project which is developed by multiple people in their spare time. By making a donation you can say &quot;thank you&quot; to the involved persons.</p></body></html> true Qt::Vertical 20 40 Sebastian Moors (aka mauser): Maintainer / Developer Michael Wolkstein (aka wolke): Forum hosting Qt::Vertical 20 40 Choose random entry. Qt::Horizontal 40 20 Donate! Qt::Vertical 20 40 Qt::Horizontal QSizePolicy::Maximum 30 20 hydrogen-1.0.0-rc1/src/gui/src/EventListener.h000066400000000000000000000041241366722712400211270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 EVENT_LISTENER #define EVENT_LISTENER #include class EventListener { public: virtual void stateChangedEvent(int nState) { UNUSED( nState ); } virtual void patternChangedEvent() {} virtual void patternModifiedEvent() {} virtual void songModifiedEvent() {} virtual void selectedPatternChangedEvent() {} virtual void selectedInstrumentChangedEvent() {} virtual void parametersInstrumentChangedEvent() {} virtual void midiActivityEvent() {} virtual void noteOnEvent( int nInstrument ) { UNUSED( nInstrument ); } virtual void XRunEvent() {} virtual void errorEvent( int nErrorCode ) { UNUSED( nErrorCode ); } virtual void metronomeEvent( int nValue ) { UNUSED( nValue ); } virtual void rubberbandbpmchangeEvent() {} virtual void progressEvent( int nValue ) { UNUSED( nValue ); } virtual void jacksessionEvent( int nValue) { UNUSED( nValue ); } virtual void playlistLoadSongEvent( int nIndex ){ UNUSED( nIndex ); } virtual void undoRedoActionEvent( int nValue ){ UNUSED( nValue ); } virtual void tempoChangedEvent( int nValue ){ UNUSED( nValue ); } virtual void updateSongEvent( int nValue ){ UNUSED( nValue ); } virtual void quitEvent( int nValue ){ UNUSED( nValue ); } virtual ~EventListener() {} }; #endif hydrogen-1.0.0-rc1/src/gui/src/ExportMidiDialog.cpp000066400000000000000000000136471366722712400221110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "ExportMidiDialog.h" #include "Skin.h" #include "HydrogenApp.h" #include #include #include #include using namespace H2Core; const char* ExportMidiDialog::__class_name = "ExportMidiDialog"; enum ExportModes { EXPORT_SMF1_SINGLE, EXPORT_SMF1_MULTI, EXPORT_SMF0 }; // Here we are going to store export filename QString ExportMidiDialog::sLastFilename = ""; ExportMidiDialog::ExportMidiDialog( QWidget* parent ) : QDialog( parent ) , Object( __class_name ) , m_pEngine( Hydrogen::get_instance() ) , m_pPreferences( Preferences::get_instance() ) , m_bFileSelected( false ) , m_sExtension( ".mid" ) { setupUi( this ); setModal( true ); setWindowTitle( tr( "Export midi" ) ); exportTypeCombo->addItem( tr("SMF1 single: export all instruments to a single track") ); exportTypeCombo->addItem( tr("SMF1 multi: export each instrument to separate track") ); exportTypeCombo->addItem( tr("SMF0: export all events to one track") ); restoreSettingsFromPreferences(); adjustSize(); } ExportMidiDialog::~ExportMidiDialog() { } void ExportMidiDialog::saveSettingsToPreferences() { m_pPreferences->setMidiExportMode( exportTypeCombo->currentIndex() ); // extracting dirname from export box QString sFilename = exportNameTxt->text(); QFileInfo info( sFilename ); QDir dir = info.absoluteDir(); if ( !dir.exists() ) { // very strange if it happens but better to check for it anyway return; } sLastFilename = info.fileName(); QString sSelectedDirname = dir.absolutePath(); m_pPreferences->setMidiExportDirectory( sSelectedDirname ); } QString ExportMidiDialog::createDefaultFilename() { QString sDefaultFilename = m_pEngine->getSong()->get_filename(); if( sDefaultFilename.isEmpty() ){ sDefaultFilename = m_pEngine->getSong()->__name; } else { // extracting filename from full path QFileInfo qDefaultFile( sDefaultFilename ); sDefaultFilename = qDefaultFile.fileName(); } sDefaultFilename.replace( '*', "_" ); sDefaultFilename.replace( Filesystem::songs_ext, "" ); sDefaultFilename += m_sExtension; return sDefaultFilename; } void ExportMidiDialog::restoreSettingsFromPreferences() { // loading previous directory and filling filename text field // loading default filename on a first run if( sLastFilename.isEmpty() ) { sLastFilename = createDefaultFilename(); } QString sDirPath = m_pPreferences->getMidiExportDirectory(); QDir qd = QDir( sDirPath ); // joining filepath with dirname QString sFullPath = qd.absoluteFilePath( sLastFilename ); exportNameTxt->setText( sFullPath ); // loading rest of the options exportTypeCombo->setCurrentIndex( m_pPreferences->getMidiExportMode() ); } void ExportMidiDialog::on_browseBtn_clicked() { QFileDialog fd( this ); QString sPrevDir = m_pPreferences->getMidiExportDirectory(); fd.setFileMode( QFileDialog::AnyFile ); fd.setNameFilter( tr("Midi file (*%1)").arg( m_sExtension ) ); fd.setDirectory( sPrevDir ); fd.setWindowTitle( tr( "Export MIDI file" ) ); fd.setAcceptMode( QFileDialog::AcceptSave ); QString sDefaultFilename = exportNameTxt->text(); fd.selectFile( sDefaultFilename ); QString sFilename; if ( fd.exec() == QDialog::Accepted ) { m_bFileSelected = true; sFilename = fd.selectedFiles().first(); } if ( sFilename.isEmpty() ) { return; } if ( sFilename.endsWith( m_sExtension ) == false ) { sFilename += m_sExtension; } exportNameTxt->setText( sFilename ); } bool ExportMidiDialog::validateUserInput( ) { // check if directory exists otherwise error QString filename = exportNameTxt->text(); QFileInfo file( filename ); QDir dir = file.dir(); if( !dir.exists() ) { QMessageBox::warning( this, "Hydrogen", tr( "Directory %1 does not exist").arg( dir.absolutePath() ), QMessageBox::Ok ); return false; } return true; } void ExportMidiDialog::on_okBtn_clicked() { if ( !validateUserInput() ) { return; } saveSettingsToPreferences(); Song *pSong = m_pEngine->getSong(); QString sFilename = exportNameTxt->text(); QFileInfo qFile( sFilename ); if ( qFile.exists() == true && m_bFileSelected == false ) { int res = QMessageBox::information( this, "Hydrogen", tr( "The file %1 exists. \nOverwrite the existing file?").arg(sFilename), QMessageBox::Yes | QMessageBox::No ); if ( res == QMessageBox::No ) { return; } } // choosing writer SMFWriter *pSmfWriter = nullptr; if( exportTypeCombo->currentIndex() == EXPORT_SMF1_SINGLE ){ pSmfWriter = new SMF1WriterSingle(); } else if ( exportTypeCombo->currentIndex() == EXPORT_SMF1_MULTI ){ pSmfWriter = new SMF1WriterMulti(); } else if ( exportTypeCombo->currentIndex() == EXPORT_SMF0 ){ pSmfWriter = new SMF0Writer(); } assert( pSmfWriter ); pSmfWriter->save( sFilename, pSong ); delete pSmfWriter; accept(); } void ExportMidiDialog::on_closeBtn_clicked() { accept(); } void ExportMidiDialog::on_exportNameTxt_textChanged( const QString& ) { QString filename = exportNameTxt->text(); if ( !filename.isEmpty() ) { okBtn->setEnabled( true ); } else { okBtn->setEnabled( false ); } } hydrogen-1.0.0-rc1/src/gui/src/ExportMidiDialog.h000066400000000000000000000034241366722712400215460ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 EXPORT_MIDI_DIALOG_H #define EXPORT_MIDI_DIALOG_H #include "ui_ExportMidiDialog_UI.h" #include namespace H2Core { class Preferences; class Hydrogen; } /// /// Dialog for exporting song to midi /// class ExportMidiDialog : public QDialog, public Ui_ExportMidiDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: ExportMidiDialog( QWidget* parent ); ~ExportMidiDialog(); private slots: void on_browseBtn_clicked(); void on_closeBtn_clicked(); void on_okBtn_clicked(); void on_exportNameTxt_textChanged( const QString& text ); private: void exportTrack(); void saveSettingsToPreferences(); void restoreSettingsFromPreferences(); QString createDefaultFilename(); bool validateUserInput(); H2Core::Hydrogen* m_pEngine; H2Core::Preferences* m_pPreferences; bool m_bFileSelected; QString m_sExtension; static QString sLastFilename; }; #endif hydrogen-1.0.0-rc1/src/gui/src/ExportMidiDialog_UI.ui000066400000000000000000000142721366722712400223340ustar00rootroot00000000000000 ExportMidiDialog_UI true 0 0 701 180 0 0 0 0 Dialog Qt::LeftToRight true QLayout::SetDefaultConstraint QFormLayout::ExpandingFieldsGrow QFormLayout::WrapLongRows 0 0 Filename 0 0 0 0 false 0 0 120 16777215 &Browse... Alt+B Modus: 0 0 false 0 0 0 25 &Export Alt+E Qt::Horizontal 40 20 0 0 0 26 120 16777215 Qt::LeftToRight &Close Alt+C hydrogen-1.0.0-rc1/src/gui/src/ExportSongDialog.cpp000066400000000000000000000534651366722712400221370ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "ExportSongDialog.h" #include "Skin.h" #include "HydrogenApp.h" #include "Mixer/Mixer.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WIN32 #include #endif using namespace H2Core; const char* ExportSongDialog::__class_name = "ExportSongDialog"; enum ExportModes { EXPORT_TO_SINGLE_TRACK, EXPORT_TO_SEPARATE_TRACKS, EXPORT_TO_BOTH }; // Here we are going to store export filename QString ExportSongDialog::sLastFilename = ""; ExportSongDialog::ExportSongDialog(QWidget* parent) : QDialog(parent) , Object( __class_name ) , m_bExporting( false ) , m_pEngine( Hydrogen::get_instance() ) , m_pPreferences( Preferences::get_instance() ) { setupUi( this ); setModal( true ); setWindowTitle( tr( "Export song" ) ); exportTypeCombo->addItem(tr("Export to a single track")); exportTypeCombo->addItem(tr("Export to separate tracks")); exportTypeCombo->addItem(tr("Both")); HydrogenApp::get_instance()->addEventListener( this ); m_pProgressBar->setValue( 0 ); m_bQfileDialog = false; m_bExportTrackouts = false; m_nInstrument = 0; m_sExtension = ".wav"; m_bOverwriteFiles = false; // use of rubberband batch if( checkUseOfRubberband() ) { m_bOldRubberbandBatchMode = m_pPreferences->getRubberBandBatchMode(); toggleRubberbandCheckBox->setChecked(m_pPreferences->getRubberBandBatchMode()); connect(toggleRubberbandCheckBox, SIGNAL(toggled(bool)), this, SLOT(toggleRubberbandBatchMode( bool ))); } else { m_bOldRubberbandBatchMode = m_pPreferences->getRubberBandBatchMode(); toggleRubberbandCheckBox->setEnabled( false ); } // use of timeline if( m_pEngine->getTimeline()->m_timelinevector.size() > 0 ){ toggleTimeLineBPMCheckBox->setChecked(m_pPreferences->getUseTimelineBpm()); m_bOldTimeLineBPMMode = m_pPreferences->getUseTimelineBpm(); connect(toggleTimeLineBPMCheckBox, SIGNAL(toggled(bool)), this, SLOT(toggleTimeLineBPMMode( bool ))); } else { m_bOldTimeLineBPMMode = m_pPreferences->getUseTimelineBpm(); toggleTimeLineBPMCheckBox->setEnabled( false ); } // use of interpolation mode m_nOldInterpolation = AudioEngine::get_instance()->get_sampler()->getInterpolateMode(); resampleComboBox->setCurrentIndex( m_nOldInterpolation ); connect(resampleComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(resampleComboBoIndexChanged(int))); // if rubberbandBatch calculate time needed by lib rubberband to resample samples if( m_bOldRubberbandBatchMode ) { calculateRubberbandTime(); } //Load the other settings.. restoreSettingsFromPreferences(); // Have the dialog find the best size adjustSize(); } ExportSongDialog::~ExportSongDialog() { HydrogenApp::get_instance()->removeEventListener( this ); } QString ExportSongDialog::createDefaultFilename() { QString sDefaultFilename = m_pEngine->getSong()->get_filename(); // If song is not saved then use song name otherwise use the song filename if( sDefaultFilename.isEmpty() ){ sDefaultFilename = m_pEngine->getSong()->__name; } else { // extracting filename from full path QFileInfo qDefaultFile( sDefaultFilename ); sDefaultFilename = qDefaultFile.fileName(); } sDefaultFilename.replace( '*', "_" ); sDefaultFilename.replace( Filesystem::songs_ext, "" ); sDefaultFilename += m_sExtension; return sDefaultFilename; } void ExportSongDialog::saveSettingsToPreferences() { // extracting dirname from export box QString sFilename = exportNameTxt->text(); QFileInfo info( sFilename ); QDir dir = info.absoluteDir(); if ( !dir.exists() ) { // very strange if it happens but better to check for it anyway return; } // saving filename for this session sLastFilename = info.fileName(); QString sSelectedDirname = dir.absolutePath(); m_pPreferences->setExportDirectory( sSelectedDirname ); // saving other options m_pPreferences->setExportModeIdx( exportTypeCombo->currentIndex() ); m_pPreferences->setExportTemplateIdx( templateCombo->currentIndex() ); m_pPreferences->setExportSampleRateIdx( sampleRateCombo->currentIndex() ); m_pPreferences->setExportSampleDepthIdx( sampleDepthCombo->currentIndex() ); } void ExportSongDialog::restoreSettingsFromPreferences() { // loading previous directory and filling filename text field // loading default filename on a first run and storing it in static field if( sLastFilename.isEmpty() ) { sLastFilename = createDefaultFilename(); } QString sDirPath = m_pPreferences->getExportDirectory(); QDir qd = QDir( sDirPath ); // joining filepath with dirname QString sFullPath = qd.absoluteFilePath( sLastFilename ); exportNameTxt->setText( sFullPath ); // loading rest of the options templateCombo->setCurrentIndex( m_pPreferences->getExportTemplateIdx() ); exportTypeCombo->setCurrentIndex( m_pPreferences->getExportModeIdx() ); int nExportSampleRateIdx = m_pPreferences->getExportSampleRateIdx(); if( nExportSampleRateIdx >= 0 ) { sampleRateCombo->setCurrentIndex( nExportSampleRateIdx ); } int nExportBithDepthIdx = m_pPreferences->getExportSampleDepthIdx(); if( nExportBithDepthIdx >= 0 ) { sampleDepthCombo->setCurrentIndex( nExportBithDepthIdx ); } } void ExportSongDialog::on_browseBtn_clicked() { QString sPrevDir = m_pPreferences->getExportDirectory(); QFileDialog fd(this); fd.setFileMode(QFileDialog::AnyFile); if( templateCombo->currentIndex() <= 4 ) fd.setNameFilter("Microsoft WAV (*.wav *.WAV)"); if( templateCombo->currentIndex() > 4 && templateCombo->currentIndex() < 8 ) fd.setNameFilter( "Apple AIFF (*.aiff *.AIFF)"); if( templateCombo->currentIndex() == 8) fd.setNameFilter( "Lossless Flac (*.flac *.FLAC)"); if( templateCombo->currentIndex() == 9) fd.setNameFilter( "Compressed Ogg (*.ogg *.OGG)"); fd.setDirectory( sPrevDir ); fd.setAcceptMode( QFileDialog::AcceptSave ); fd.setWindowTitle( tr( "Export song" ) ); QString defaultFilename = exportNameTxt->text(); fd.selectFile(defaultFilename); QString filename = ""; if (fd.exec()) { filename = fd.selectedFiles().first(); m_bQfileDialog = true; } if ( !filename.isEmpty() ) { //this second extension check is mostly important if you leave a dot //without a regular extionsion in a filename if( !filename.endsWith( m_sExtension ) ){ filename.append(m_sExtension); } exportNameTxt->setText(filename); } if( filename.endsWith( ".ogg" ) || filename.endsWith( ".OGG" ) ){ sampleRateCombo->hide(); sampleDepthCombo->hide(); sampleRateLable->hide(); sampleDepthLable->hide(); } } bool ExportSongDialog::validateUserInput() { // check if directory exists otherwise error QString filename = exportNameTxt->text(); QFileInfo file( filename ); QDir dir = file.dir(); if( !dir.exists() ) { QMessageBox::warning( this, "Hydrogen", tr( "Directory %1 does not exist").arg( dir.absolutePath() ), QMessageBox::Ok ); return false; } return true; } void ExportSongDialog::on_okBtn_clicked() { if ( m_bExporting ) { return; } if( !validateUserInput() ) { return; } saveSettingsToPreferences(); Song *pSong = m_pEngine->getSong(); InstrumentList *pInstrumentList = pSong->get_instrument_list(); m_bOverwriteFiles = false; if( exportTypeCombo->currentIndex() == EXPORT_TO_SINGLE_TRACK || exportTypeCombo->currentIndex() == EXPORT_TO_BOTH ){ m_bExportTrackouts = false; QString filename = exportNameTxt->text(); if ( QFileInfo( filename ).exists() == true && m_bQfileDialog == false ) { int res; if( exportTypeCombo->currentIndex() == EXPORT_TO_SINGLE_TRACK ){ res = QMessageBox::information( this, "Hydrogen", tr( "The file %1 exists. \nOverwrite the existing file?").arg(filename), QMessageBox::Yes | QMessageBox::No ); } else { res = QMessageBox::information( this, "Hydrogen", tr( "The file %1 exists. \nOverwrite the existing file?").arg(filename), QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll); } if (res == QMessageBox::YesToAll ){ m_bOverwriteFiles = true; } if (res == QMessageBox::No ) { return; } } if( exportTypeCombo->currentIndex() == EXPORT_TO_BOTH ){ m_bExportTrackouts = true; } /* arm all tracks for export */ for (auto i = 0; i < pInstrumentList->size(); i++) { pInstrumentList->get(i)->set_currently_exported( true ); } m_pEngine->startExportSession( sampleRateCombo->currentText().toInt(), sampleDepthCombo->currentText().toInt()); m_pEngine->startExportSong( filename ); return; } if( exportTypeCombo->currentIndex() == EXPORT_TO_SEPARATE_TRACKS ){ m_bExportTrackouts = true; m_pEngine->startExportSession(sampleRateCombo->currentText().toInt(), sampleDepthCombo->currentText().toInt()); exportTracks(); return; } } bool ExportSongDialog::currentInstrumentHasNotes() { Song *pSong = m_pEngine->getSong(); unsigned nPatterns = pSong->get_pattern_list()->size(); bool bInstrumentHasNotes = false; for ( unsigned i = 0; i < nPatterns; i++ ) { Pattern *pPattern = pSong->get_pattern_list()->get( i ); const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if( pNote->get_instrument()->get_id() == pSong->get_instrument_list()->get(m_nInstrument)->get_id() ){ bInstrumentHasNotes = true; break; } } } return bInstrumentHasNotes; } QString ExportSongDialog::findUniqueExportFilenameForInstrument(Instrument* pInstrument) { Song *pSong = m_pEngine->getSong(); QString uniqueInstrumentName; int instrumentOccurence = 0; for(int i=0; i < pSong->get_instrument_list()->size(); i++ ){ if( pSong->get_instrument_list()->get(m_nInstrument)->get_name() == pInstrument->get_name()){ instrumentOccurence++; } } if(instrumentOccurence >= 2){ uniqueInstrumentName = pInstrument->get_name() + QString("_") + QString::number( pInstrument->get_id() ); } else { uniqueInstrumentName = pInstrument->get_name(); } return uniqueInstrumentName; } void ExportSongDialog::exportTracks() { Song *pSong = m_pEngine->getSong(); InstrumentList *pInstrumentList = pSong->get_instrument_list(); if( m_nInstrument < pInstrumentList->size() ){ //if a instrument contains no notes we jump to the next instrument bool bInstrumentHasNotes = currentInstrumentHasNotes(); if( !bInstrumentHasNotes ){ if( m_nInstrument == pInstrumentList->size() -1 ){ m_bExportTrackouts = false; m_nInstrument = 0; return; } else { m_nInstrument++; exportTracks(); return; } } QStringList filenameList = exportNameTxt->text().split( m_sExtension ); QString firstItem; if( !filenameList.isEmpty() ){ firstItem = filenameList.first(); } QString newItem = firstItem + "-" + findUniqueExportFilenameForInstrument( pInstrumentList->get( m_nInstrument ) ); QString filename = newItem.append( m_sExtension ); if ( QFile( filename ).exists() == true && m_bQfileDialog == false && !m_bOverwriteFiles) { int res = QMessageBox::information( this, "Hydrogen", tr( "The file %1 exists. \nOverwrite the existing file?").arg(filename), QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll ); if (res == QMessageBox::No ) return; if (res == QMessageBox::YesToAll ) m_bOverwriteFiles = true; } if( m_nInstrument > 0 ){ m_pEngine->stopExportSong(); m_bExporting = false; } for (auto i = 0; i < pInstrumentList->size(); i++) { pInstrumentList->get(i)->set_currently_exported( false ); } pSong->get_instrument_list()->get(m_nInstrument)->set_currently_exported( true ); m_pEngine->startExportSong( filename ); if(! (m_nInstrument == pInstrumentList->size()) ){ m_nInstrument++; } } } void ExportSongDialog::on_closeBtn_clicked() { m_pEngine->stopExportSong(); m_pEngine->stopExportSession(); m_bExporting = false; if(m_pPreferences->getRubberBandBatchMode()){ EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); } m_pPreferences->setRubberBandBatchMode( m_bOldRubberbandBatchMode ); m_pPreferences->setUseTimelineBpm( m_bOldTimeLineBPMMode ); setResamplerMode(m_nOldInterpolation); accept(); } void ExportSongDialog::on_templateCombo_currentIndexChanged(int index ) { /**index * 0 = wav 44100 | 16 * 1 = wav 48000 | 16 * 2 = wav 48000 | 24 * 3 = wav 22050 | 8 * 4 = wav 96000 | 32 * 5 = aiff 44100 | 16 * 6 = aiff 48000 | 16 * 7 = aiff 48000 | 24 * 8 = flac 48000 * 9 = ogg VBR , disable comboboxes **/ QString filename; QStringList splitty; filename = exportNameTxt->text(); splitty = filename.split("."); splitty.removeLast(); filename = splitty.join( "." ); switch ( index ) { case 0: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 1 ); //44100hz sampleDepthCombo->setCurrentIndex ( 1 ); //16bit filename += ".wav"; m_sExtension = ".wav"; break; case 1: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 2 ); //48000hz sampleDepthCombo->setCurrentIndex ( 1 ); //16bit filename += ".wav"; m_sExtension = ".wav"; break; case 2: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 2 ); //48000hz sampleDepthCombo->setCurrentIndex ( 2 ); //24bit filename += ".wav"; m_sExtension = ".wav"; break; case 3: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 0 ); //22050hz sampleDepthCombo->setCurrentIndex ( 0 ); //8bit filename += ".wav"; m_sExtension = ".wav"; break; case 4: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 4 ); //96000hz sampleDepthCombo->setCurrentIndex ( 3 ); //32bit filename += ".wav"; m_sExtension = ".wav"; break; case 5: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 1 ); //44100hz sampleDepthCombo->setCurrentIndex ( 1 ); //16bit filename += ".aiff"; m_sExtension = ".aiff"; break; case 6: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 2 ); //48000hz sampleDepthCombo->setCurrentIndex ( 1 ); //16bit filename += ".aiff"; m_sExtension = ".aiff"; break; case 7: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 2 ); //48000hz sampleDepthCombo->setCurrentIndex ( 2 ); //24bit filename += ".aiff"; m_sExtension = ".aiff"; break; case 8: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 2 ); //48000hz sampleDepthCombo->setCurrentIndex ( 2 ); //24bit filename += ".flac"; m_sExtension = ".flac"; break; case 9: sampleRateCombo->hide(); sampleDepthCombo->hide(); sampleRateLable->hide(); sampleDepthLable->hide(); filename += ".ogg"; m_sExtension = ".ogg"; break; default: sampleRateCombo->show(); sampleDepthCombo->show(); sampleRateCombo->setCurrentIndex ( 1 ); //44100hz sampleDepthCombo->setCurrentIndex ( 1 ); //16bit filename += ".wav"; m_sExtension = ".wav"; } exportNameTxt->setText(filename); } void ExportSongDialog::on_exportNameTxt_textChanged( const QString& ) { QString filename = exportNameTxt->text(); if ( ! filename.isEmpty() ) { okBtn->setEnabled(true); } else { okBtn->setEnabled(false); } if( filename.endsWith( ".ogg" ) || filename.endsWith( ".OGG" ) ){ if( templateCombo->currentIndex() != 9 ){ templateCombo->setCurrentIndex( 9 );//ogg } } else if( filename.endsWith( ".flac" ) || filename.endsWith( ".FLAC" ) ){ sampleRateLable->show(); sampleDepthLable->show(); if( templateCombo->currentIndex() != 8 ){ templateCombo->setCurrentIndex( 8 );//flac } } else if( filename.endsWith( ".aiff" ) || filename.endsWith( ".AIFF" ) ){ sampleRateLable->show(); sampleDepthLable->show(); if( templateCombo->currentIndex() < 5 || templateCombo->currentIndex() > 7 ){ templateCombo->setCurrentIndex( 5 );//aiff } } else if( filename.endsWith( ".wav" ) || filename.endsWith( ".WAV" ) ){ sampleRateLable->show(); sampleDepthLable->show(); if( templateCombo->currentIndex() > 4 ){ templateCombo->setCurrentIndex( 0 );//wav } } } void ExportSongDialog::progressEvent( int nValue ) { m_pProgressBar->setValue( nValue ); if ( nValue == 100 ) { m_bExporting = false; if( m_nInstrument == Hydrogen::get_instance()->getSong()->get_instrument_list()->size()){ m_nInstrument = 0; m_bExportTrackouts = false; } if( m_bExportTrackouts ){ exportTracks(); } } if ( nValue < 100 ) { closeBtn->setEnabled(false); resampleComboBox->setEnabled(false); }else { closeBtn->setEnabled(true); resampleComboBox->setEnabled(true); } } void ExportSongDialog::toggleRubberbandBatchMode(bool toggled) { m_pPreferences->setRubberBandBatchMode(toggled); if(toggled){ calculateRubberbandTime(); } } void ExportSongDialog::toggleTimeLineBPMMode(bool toggled) { m_pPreferences->setUseTimelineBpm(toggled); } void ExportSongDialog::resampleComboBoIndexChanged(int index ) { setResamplerMode(index); } void ExportSongDialog::setResamplerMode(int index) { switch ( index ){ case 0: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::LINEAR ); break; case 1: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::COSINE ); break; case 2: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::THIRD ); break; case 3: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::CUBIC ); break; case 4: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::HERMITE ); break; } } void ExportSongDialog::calculateRubberbandTime() { QApplication::setOverrideCursor(Qt::WaitCursor); closeBtn->setEnabled(false); resampleComboBox->setEnabled(false); okBtn->setEnabled(false); Timeline* pTimeline = m_pEngine->getTimeline(); float oldBPM = m_pEngine->getSong()->__bpm; float lowBPM = oldBPM; if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if(pTimeline->m_timelinevector[t].m_htimelinebpm < lowBPM){ lowBPM = pTimeline->m_timelinevector[t].m_htimelinebpm; } } } m_pEngine->setBPM(lowBPM); time_t sTime = time(nullptr); Song *pSong = m_pEngine->getSong(); assert(pSong); if(pSong){ InstrumentList *songInstrList = pSong->get_instrument_list(); assert(songInstrList); for ( unsigned nInstr = 0; nInstr < songInstrList->size(); ++nInstr ) { Instrument *pInstr = songInstrList->get( nInstr ); assert( pInstr ); if ( pInstr ){ for (std::vector::iterator it = pInstr->get_components()->begin() ; it != pInstr->get_components()->end(); ++it) { InstrumentComponent* pCompo = *it; for ( int nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer ) { Sample *pSample = pLayer->get_sample(); if ( pSample ) { if( pSample->get_rubberband().use ) { Sample *pNewSample = Sample::load( pSample->get_filepath(), pSample->get_loops(), pSample->get_rubberband(), *pSample->get_velocity_envelope(), *pSample->get_pan_envelope() ); if( !pNewSample ){ continue; } // insert new sample from newInstrument AudioEngine::get_instance()->lock( RIGHT_HERE ); pLayer->set_sample( pNewSample ); AudioEngine::get_instance()->unlock(); } } } } } } } } Preferences::get_instance()->setRubberBandCalcTime(time(nullptr) - sTime); m_pEngine->setBPM(oldBPM); closeBtn->setEnabled(true); resampleComboBox->setEnabled(true); okBtn->setEnabled(true); QApplication::restoreOverrideCursor(); } bool ExportSongDialog::checkUseOfRubberband() { Song *pSong = m_pEngine->getSong(); assert(pSong); if(pSong){ InstrumentList *pSongInstrList = pSong->get_instrument_list(); assert(pSongInstrList); for ( unsigned nInstr = 0; nInstr < pSongInstrList->size(); ++nInstr ) { Instrument *pInstr = pSongInstrList->get( nInstr ); assert( pInstr ); if ( pInstr ){ for (std::vector::iterator it = pInstr->get_components()->begin() ; it != pInstr->get_components()->end(); ++it) { InstrumentComponent* pCompo = *it; for ( int nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { InstrumentLayer *pLayer = pCompo->get_layer( nLayer ); if ( pLayer ) { Sample *pSample = pLayer->get_sample(); if ( pSample ) { if( pSample->get_rubberband().use ) { return true; } } } } } } } } return false; } hydrogen-1.0.0-rc1/src/gui/src/ExportSongDialog.h000066400000000000000000000047251366722712400215770ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 EXPORT_SONG_DIALOG_H #define EXPORT_SONG_DIALOG_H #include "ui_ExportSongDialog_UI.h" #include "EventListener.h" #include namespace H2Core { class Instrument; class Hydrogen; class Preferences; } /// /// Dialog for exporting song /// class ExportSongDialog : public QDialog, public Ui_ExportSongDialog_UI, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: ExportSongDialog(QWidget* parent); ~ExportSongDialog(); virtual void progressEvent( int nValue ); private slots: void on_browseBtn_clicked(); void on_closeBtn_clicked(); void on_okBtn_clicked(); void on_exportNameTxt_textChanged(const QString& text); void on_templateCombo_currentIndexChanged(int index); void toggleRubberbandBatchMode(bool toggled); void toggleTimeLineBPMMode(bool toggled); void resampleComboBoIndexChanged(int index); private: void setResamplerMode(int index); void calculateRubberbandTime(); bool checkUseOfRubberband(); void saveSettingsToPreferences(); void restoreSettingsFromPreferences(); bool currentInstrumentHasNotes(); QString findUniqueExportFilenameForInstrument(H2Core::Instrument* pInstrument); void exportTracks(); bool validateUserInput(); QString createDefaultFilename(); bool m_bExporting; bool m_bExportTrackouts; bool m_bOverwriteFiles; uint m_nInstrument; QString m_sExtension; bool m_bOldRubberbandBatchMode; bool m_bOldTimeLineBPMMode; int m_nOldInterpolation; bool m_bQfileDialog; H2Core::Hydrogen * m_pEngine; H2Core::Preferences* m_pPreferences; static QString sLastFilename; }; #endif hydrogen-1.0.0-rc1/src/gui/src/ExportSongDialog_UI.ui000066400000000000000000000363321366722712400223610ustar00rootroot00000000000000 ExportSongDialog_UI true 0 0 701 420 0 0 0 0 Dialog Qt::LeftToRight true QLayout::SetDefaultConstraint QFormLayout::ExpandingFieldsGrow QFormLayout::WrapLongRows 0 0 Export directory: 0 0 false 0 0 120 16777215 &Browse... Alt+B 0 0 Templates: 0 0 WAV in CD quality "44,1kHz, 16 bit PCM" WAV in ADAT quality "48 kHz, 16 bit PCM" WAV in better quality "48 kHz, 24 bit PCM" WAV LOFI "22.05kHz, 8 bit PCM WAV best Mixdown quality "96 kHz, 32 bit PCM" AIFF in CD quality "41 kHz, 16 bit PCM" AIFF in ADAT quality "48 kHz, 16 bit PCM" AIFF in better quality "48 kHz, 24 bit PCM" FLAC lossless compressor in good quality "48 kHz" OGG Vorbis loosely compressed in good quality "VBR" 0 0 Samplerate in Hz: 0 0 80 25 22050 44100 48000 88200 96000 192000 0 0 SampleDepth in Bit: 0 0 60 25 8 16 24 32 0 0 200 16777215 0 0 Interpolation: 0 0 100 25 Choose type of interpolation method Linear Cosine Third Cubic Hermite Modus: 0 0 0 0 Enable tempo changing TimeLine BPM true 0 0 16777215 22 Enable use of rubberband's batch processor Rubberband Batch 0 0 24 false 0 0 0 25 &Export Alt+E Qt::Horizontal 40 20 0 0 0 26 120 16777215 Qt::LeftToRight &Close Alt+C hydrogen-1.0.0-rc1/src/gui/src/HelpBrowser.cpp000066400000000000000000000100341366722712400211240ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Skin.h" #include #if QT_VERSION >= 0x050000 # include #endif #include const char* SimpleHTMLBrowser::__class_name = "SimpleHTMLBrowser"; SimpleHTMLBrowser::SimpleHTMLBrowser( QWidget *pParent, const QString& sDataPath, const QString& sFilename, SimpleHTMLBrowserType type ) : QDialog( pParent ) , Object( __class_name ) , m_type( type ) , m_sDataPath( sDataPath ) , m_sFilename( sFilename ) { if (m_type == MANUAL ) { setWindowTitle( tr( "Manual" ) ); resize( 800, 600 ); setMinimumSize( 300, 200 ); setStyleSheet("color:#000000;"); } else { setWindowTitle( tr( "Welcome to Hydrogen" ) ); resize( 800, 650 ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); } m_pDontShowAnymoreBtn = new QPushButton( tr( "Don't show this message anymore"), this ); connect( m_pDontShowAnymoreBtn, SIGNAL( clicked() ), this, SLOT( dontShowAnymoreBtnClicked() ) ); m_pDontShowAnymoreBtn->resize( 300, 25 ); m_pDontShowAnymoreBtn->hide(); m_pCloseWindowBtn = new QPushButton( tr( "Ok" ), this ); connect( m_pCloseWindowBtn, SIGNAL( clicked() ), this, SLOT( closeWindow() ) ); m_pCloseWindowBtn->resize( 100, 25 ); m_pCloseWindowBtn->hide(); m_pDocHomeBtn = new QPushButton( tr( "Documentation index" ), this ); connect( m_pDocHomeBtn, SIGNAL( clicked() ), this, SLOT( docIndex() ) ); m_pDocHomeBtn->resize( 300, 25 ); m_pDocHomeBtn->hide(); m_pBrowser = new QTextBrowser( this ); m_pBrowser->setReadOnly( true ); m_pBrowser->setSearchPaths( QStringList( m_sDataPath ) ); //m_pBrowser->setStyleSheet("background-color:#000000;"); QFile file( m_sFilename.toLocal8Bit() ); // Read the text from a file if ( file.open( QIODevice::ReadOnly ) ) { QTextStream stream( &file ); m_pBrowser->setHtml( stream.readAll() ); } QRect rect( QGuiApplication::screens().first()->geometry() ); move( rect.center() - this->rect().center() ); } SimpleHTMLBrowser::~SimpleHTMLBrowser() { // INFOLOG( "DESTROY" ); } void SimpleHTMLBrowser::showEvent ( QShowEvent *ev ) { UNUSED( ev ); // INFOLOG( "[showEvent]" ); } void SimpleHTMLBrowser::resizeEvent( QResizeEvent *ev ) { UNUSED( ev ); if ( m_type == MANUAL ) { m_pBrowser->move( 0, 29 ); m_pBrowser->resize( width(), height() - 29 ); m_pDocHomeBtn->move( 5, 3 ); m_pDocHomeBtn->show(); m_pDontShowAnymoreBtn->hide(); m_pCloseWindowBtn->hide(); } else if ( m_type == WELCOME ) { m_pBrowser->move( 0, 0 ); m_pBrowser->resize( width(), height() - 29 ); m_pDontShowAnymoreBtn->move( width() - m_pDontShowAnymoreBtn->width() - m_pCloseWindowBtn->width() - 5 - 5, height() - 27 ); m_pDontShowAnymoreBtn->show(); m_pCloseWindowBtn->move( width() - m_pCloseWindowBtn->width() - 5, height() - 27 ); m_pCloseWindowBtn->show(); m_pCloseWindowBtn->setDefault(true); m_pDocHomeBtn->hide(); } } void SimpleHTMLBrowser::dontShowAnymoreBtnClicked() { accept(); } void SimpleHTMLBrowser::closeWindow() { reject(); } void SimpleHTMLBrowser::docIndex() { INFOLOG( "[docIndex]" ); QFile file( m_sFilename ); // Read the text from a file if ( file.open( QIODevice::ReadOnly ) ) { QTextStream stream( &file ); m_pBrowser->setHtml( stream.readAll() ); } } hydrogen-1.0.0-rc1/src/gui/src/HelpBrowser.h000066400000000000000000000033421366722712400205750ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include class SimpleHTMLBrowser : public QDialog, public H2Core::Object { H2_OBJECT Q_OBJECT public: enum SimpleHTMLBrowserType { WELCOME, MANUAL }; SimpleHTMLBrowser( QWidget *pParent, const QString& sDataPath, const QString& sFilename, SimpleHTMLBrowserType type ); ~SimpleHTMLBrowser(); public slots: void dontShowAnymoreBtnClicked(); void closeWindow(); void docIndex(); private: SimpleHTMLBrowserType m_type; QTextBrowser *m_pBrowser; QPushButton *m_pDontShowAnymoreBtn; QPushButton *m_pCloseWindowBtn; QPushButton *m_pDocHomeBtn; QString m_sDataPath; QString m_sFilename; virtual void showEvent ( QShowEvent *ev ); virtual void resizeEvent( QResizeEvent *ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/HydrogenApp.cpp000066400000000000000000000424411366722712400211170ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "HydrogenApp.h" #include "Skin.h" #include "PreferencesDialog.h" #include "MainForm.h" #include "PlayerControl.h" #include "AudioEngineInfoForm.h" #include "HelpBrowser.h" #include "LadspaFXProperties.h" #include "InstrumentRack.h" #include "Director.h" #include "PatternEditor/PatternEditorPanel.h" #include "InstrumentEditor/InstrumentEditorPanel.h" #include "SongEditor/SongEditor.h" #include "SongEditor/SongEditorPanel.h" #include "SoundLibrary/SoundLibraryDatastructures.h" #include "SoundLibrary/SoundLibraryPanel.h" #include "PlaylistEditor/PlaylistDialog.h" #include "SampleEditor/SampleEditor.h" #include "Mixer/Mixer.h" #include "Mixer/MixerLine.h" #include "UndoActions.h" #include "Widgets/InfoBar.h" #include #if QT_VERSION >= 0x050000 # include #endif using namespace H2Core; HydrogenApp* HydrogenApp::m_pInstance = nullptr; const char* HydrogenApp::__class_name = "HydrogenApp"; HydrogenApp::HydrogenApp( MainForm *pMainForm, Song *pFirstSong ) : Object( __class_name ) , m_pMainForm( pMainForm ) , m_pMixer( nullptr ) , m_pPatternEditorPanel( nullptr ) , m_pAudioEngineInfoForm( nullptr ) , m_pSongEditorPanel( nullptr ) , m_pHelpBrowser( nullptr ) , m_pFirstTimeInfo( nullptr ) , m_pPlayerControl( nullptr ) , m_pPlaylistDialog( nullptr ) , m_pSampleEditor( nullptr ) , m_pDirector( nullptr ) { m_pInstance = this; m_pEventQueueTimer = new QTimer(this); connect( m_pEventQueueTimer, SIGNAL( timeout() ), this, SLOT( onEventQueueTimer() ) ); m_pEventQueueTimer->start( QUEUE_TIMER_PERIOD ); // Create the audio engine :) Hydrogen::create_instance(); Hydrogen::get_instance()->setSong( pFirstSong ); Preferences::get_instance()->setLastSongFilename( pFirstSong->get_filename() ); SoundLibraryDatabase::create_instance(); //setup the undo stack m_pUndoStack = new QUndoStack( this ); updateWindowTitle(); Preferences *pPref = Preferences::get_instance(); setupSinglePanedInterface(); // restore audio engine form properties m_pAudioEngineInfoForm = new AudioEngineInfoForm( nullptr ); WindowProperties audioEngineInfoProp = pPref->getAudioEngineInfoProperties(); m_pAudioEngineInfoForm->move( audioEngineInfoProp.x, audioEngineInfoProp.y ); if ( audioEngineInfoProp.visible ) { m_pAudioEngineInfoForm->show(); } else { m_pAudioEngineInfoForm->hide(); } m_pPlaylistDialog = new PlaylistDialog( nullptr ); m_pDirector = new Director( nullptr ); // Since HydrogenApp does implement some handler functions for // Events as well, it should be registered as an Eventlistener // itself. addEventListener( this ); } HydrogenApp::~HydrogenApp() { INFOLOG( "[~HydrogenApp]" ); m_pEventQueueTimer->stop(); //delete the undo tmp directory cleanupTemporaryFiles(); delete m_pHelpBrowser; delete m_pAudioEngineInfoForm; delete m_pMixer; delete m_pPlaylistDialog; delete m_pDirector; delete m_pSampleEditor; delete SoundLibraryDatabase::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); if (pEngine) { H2Core::Song * pSong = pEngine->getSong(); // Hydrogen calls removeSong on from its destructor, so here we just delete the objects: delete pEngine; delete pSong; } #ifdef H2CORE_HAVE_LADSPA for (uint nFX = 0; nFX < MAX_FX; nFX++) { delete m_pLadspaFXProperties[nFX]; } #endif } /// Return an HydrogenApp m_pInstance HydrogenApp* HydrogenApp::get_instance() { if (m_pInstance == nullptr) { std::cerr << "Error! HydrogenApp::get_instance (m_pInstance = NULL)" << std::endl; } return m_pInstance; } void HydrogenApp::setupSinglePanedInterface() { Preferences *pPref = Preferences::get_instance(); int uiLayout = pPref->getDefaultUILayout(); // MAINFORM WindowProperties mainFormProp = pPref->getMainFormProperties(); m_pMainForm->resize( mainFormProp.width, mainFormProp.height ); m_pMainForm->move( mainFormProp.x, mainFormProp.y ); m_pSplitter = new QSplitter( nullptr ); m_pSplitter->setOrientation( Qt::Vertical ); m_pSplitter->setOpaqueResize( true ); m_pTab = new QTabWidget( nullptr ); // SONG EDITOR if( uiLayout == Preferences::UI_LAYOUT_SINGLE_PANE) m_pSongEditorPanel = new SongEditorPanel( m_pSplitter ); else m_pSongEditorPanel = new SongEditorPanel( m_pTab ); WindowProperties songEditorProp = pPref->getSongEditorProperties(); m_pSongEditorPanel->resize( songEditorProp.width, songEditorProp.height ); if( uiLayout == Preferences::UI_LAYOUT_TABBED) m_pTab->addTab( m_pSongEditorPanel, tr("Song Editor") ); // this HBox will contain the InstrumentRack and the Pattern editor QWidget *pSouthPanel = new QWidget( m_pSplitter ); QHBoxLayout *pEditorHBox = new QHBoxLayout(); pEditorHBox->setSpacing( 5 ); pEditorHBox->setMargin( 0 ); pSouthPanel->setLayout( pEditorHBox ); // INSTRUMENT RACK m_pInstrumentRack = new InstrumentRack( nullptr ); if( uiLayout == Preferences::UI_LAYOUT_TABBED ){ m_pTab->setMovable( false ); m_pTab->setTabsClosable( false ); m_pTab->addTab( pSouthPanel, tr( "Instrument + Pattern") ); } // PATTERN EDITOR m_pPatternEditorPanel = new PatternEditorPanel( nullptr ); WindowProperties patternEditorProp = pPref->getPatternEditorProperties(); m_pPatternEditorPanel->resize( patternEditorProp.width, patternEditorProp.height ); pEditorHBox->addWidget( m_pPatternEditorPanel ); pEditorHBox->addWidget( m_pInstrumentRack ); // PLayer control m_pPlayerControl = new PlayerControl( nullptr ); QWidget *mainArea = new QWidget( m_pMainForm ); // this is the main widget m_pMainForm->setCentralWidget( mainArea ); // LAYOUT!! QVBoxLayout *pMainVBox = new QVBoxLayout(); pMainVBox->setSpacing( 1 ); pMainVBox->setMargin( 0 ); pMainVBox->addWidget( m_pPlayerControl ); m_pInfoBar = new InfoBar(); m_pInfoBar->hide(); pMainVBox->addWidget( m_pInfoBar ); pMainVBox->addSpacing( 3 ); if( uiLayout == Preferences::UI_LAYOUT_SINGLE_PANE) pMainVBox->addWidget( m_pSplitter ); else { pMainVBox->addWidget( m_pTab ); } mainArea->setLayout( pMainVBox ); // MIXER m_pMixer = new Mixer(nullptr); WindowProperties mixerProp = pPref->getMixerProperties(); m_pMixer->resize( mixerProp.width, mixerProp.height ); m_pMixer->move( mixerProp.x, mixerProp.y ); if( uiLayout == Preferences::UI_LAYOUT_TABBED){ m_pTab->addTab(m_pMixer,tr("Mixer")); } m_pMixer->updateMixer(); if ( mixerProp.visible && uiLayout == Preferences::UI_LAYOUT_SINGLE_PANE ) { m_pMixer->show(); } else { m_pMixer->hide(); } // HELP BROWSER QString sDocPath = H2Core::Filesystem::doc_dir(); QString sDocURI = sDocPath + "/manual.html"; m_pHelpBrowser = new SimpleHTMLBrowser( nullptr, sDocPath, sDocURI, SimpleHTMLBrowser::MANUAL ); #ifdef H2CORE_HAVE_LADSPA // LADSPA FX for (uint nFX = 0; nFX < MAX_FX; nFX++) { m_pLadspaFXProperties[nFX] = new LadspaFXProperties( nullptr, nFX ); m_pLadspaFXProperties[nFX]->hide(); WindowProperties prop = pPref->getLadspaProperties(nFX); m_pLadspaFXProperties[nFX]->move( prop.x, prop.y ); if ( prop.visible ) { m_pLadspaFXProperties[nFX]->show(); } else { m_pLadspaFXProperties[nFX]->hide(); } } #endif if( uiLayout == Preferences::UI_LAYOUT_TABBED){ m_pTab->setCurrentIndex( Preferences::get_instance()->getLastOpenTab() ); QObject::connect(m_pTab, SIGNAL(currentChanged(int)),this,SLOT(currentTabChanged(int))); } } void HydrogenApp::currentTabChanged(int index) { Preferences::get_instance()->setLastOpenTab( index ); } void HydrogenApp::closeFXProperties() { #ifdef H2CORE_HAVE_LADSPA for (uint nFX = 0; nFX < MAX_FX; nFX++) { m_pLadspaFXProperties[nFX]->close(); } #endif } void HydrogenApp::setSong(Song* song) { Hydrogen::get_instance()->setSong( song ); Preferences::get_instance()->setLastSongFilename( song->get_filename() ); m_pSongEditorPanel->updateAll(); m_pPatternEditorPanel->updateSLnameLabel(); updateWindowTitle(); m_pMainForm->updateRecentUsedSongList(); } void HydrogenApp::showMixer(bool show) { /* * Switch to Mixer tab with alt+m in tabbed mode, * otherwise open mixer window */ Preferences *pPref = Preferences::get_instance(); int uiLayout = pPref->getDefaultUILayout(); if( uiLayout == Preferences::UI_LAYOUT_TABBED ) { m_pTab->setCurrentIndex( 2 ); } else { m_pMixer->setVisible( show ); } m_pMainForm->update_mixer_checkbox(); } void HydrogenApp::showInstrumentPanel(bool show) { /* * Switch to pattern editor/instrument tab in tabbed mode, * otherwise hide instrument panel */ Preferences *pPref = Preferences::get_instance(); int uiLayout = pPref->getDefaultUILayout(); if( uiLayout == Preferences::UI_LAYOUT_TABBED ) { m_pTab->setCurrentIndex( 1 ); getInstrumentRack()->setHidden( show ); } else { getInstrumentRack()->setHidden( show ); } m_pMainForm->update_instrument_checkbox( !show ); } void HydrogenApp::showPreferencesDialog() { PreferencesDialog preferencesDialog(m_pMainForm); preferencesDialog.exec(); } void HydrogenApp::setStatusBarMessage( const QString& msg, int msec ) { getPlayerControl()->resetStatusLabel(); getPlayerControl()->showMessage( msg, msec ); } void HydrogenApp::updateWindowTitle() { Song *pSong = Hydrogen::get_instance()->getSong(); assert(pSong); QString title; // special handling for initial title QString qsSongName( pSong->__name ); if( qsSongName == "Untitled Song" && !pSong->get_filename().isEmpty() ){ qsSongName = pSong->get_filename().section( '/', -1 ); } if(pSong->get_is_modified()){ title = qsSongName + " (" + QString(tr("modified")) + ")"; } else { title = qsSongName; } m_pMainForm->setWindowTitle( ( "Hydrogen " + QString( get_version().c_str()) + QString( " - " ) + title ) ); } void HydrogenApp::setScrollStatusBarMessage( const QString& msg, int msec, bool test ) { getPlayerControl()->showScrollMessage( msg, msec , test); } void HydrogenApp::showAudioEngineInfoForm() { m_pAudioEngineInfoForm->hide(); m_pAudioEngineInfoForm->show(); } void HydrogenApp::showPlaylistDialog() { if ( m_pPlaylistDialog->isVisible() ) { m_pPlaylistDialog->hide(); } else { m_pPlaylistDialog->show(); } m_pMainForm->update_playlist_checkbox(); } void HydrogenApp::showDirector() { if ( m_pDirector->isVisible() ) { m_pDirector->hide(); } else { m_pDirector->show(); } m_pMainForm->update_director_checkbox(); } void HydrogenApp::showSampleEditor( QString name, int mSelectedComponemt, int mSelectedLayer ) { if ( m_pSampleEditor ){ QApplication::setOverrideCursor(Qt::WaitCursor); m_pSampleEditor->close(); delete m_pSampleEditor; m_pSampleEditor = nullptr; QApplication::restoreOverrideCursor(); } QApplication::setOverrideCursor(Qt::WaitCursor); m_pSampleEditor = new SampleEditor( nullptr, mSelectedComponemt, mSelectedLayer, name ); m_pSampleEditor->show(); QApplication::restoreOverrideCursor(); } void HydrogenApp::onDrumkitLoad( QString name ){ setStatusBarMessage( tr( "Drumkit loaded: [%1]" ).arg( name ), 2000 ); m_pPatternEditorPanel->updateSLnameLabel( ); } void HydrogenApp::enableDestructiveRecMode(){ m_pPatternEditorPanel->displayorHidePrePostCB(); } void HydrogenApp::songModifiedEvent() { updateWindowTitle(); } void HydrogenApp::onEventQueueTimer() { // use the timer to do schedule instrument slaughter; EventQueue *pQueue = EventQueue::get_instance(); Event event; while ( ( event = pQueue->pop_event() ).type != EVENT_NONE ) { // Provide the event to all EventListeners registered to // HydrogenApp. By registering itself as EventListener and // implementing at least on the methods used below a // particular GUI component can react on specific events. for (int i = 0; i < (int)m_EventListeners.size(); i++ ) { EventListener *pListener = m_EventListeners[ i ]; switch ( event.type ) { case EVENT_STATE: pListener->stateChangedEvent( event.value ); break; case EVENT_PATTERN_CHANGED: pListener->patternChangedEvent(); break; case EVENT_PATTERN_MODIFIED: pListener->patternModifiedEvent(); break; case EVENT_SONG_MODIFIED: pListener->songModifiedEvent(); break; case EVENT_SELECTED_PATTERN_CHANGED: pListener->selectedPatternChangedEvent(); break; case EVENT_SELECTED_INSTRUMENT_CHANGED: pListener->selectedInstrumentChangedEvent(); break; case EVENT_PARAMETERS_INSTRUMENT_CHANGED: pListener->parametersInstrumentChangedEvent(); break; case EVENT_MIDI_ACTIVITY: pListener->midiActivityEvent(); break; case EVENT_NOTEON: pListener->noteOnEvent( event.value ); break; case EVENT_ERROR: pListener->errorEvent( event.value ); break; case EVENT_XRUN: pListener->XRunEvent(); break; case EVENT_METRONOME: pListener->metronomeEvent( event.value ); break; case EVENT_RECALCULATERUBBERBAND: pListener->rubberbandbpmchangeEvent(); break; case EVENT_PROGRESS: pListener->progressEvent( event.value ); break; case EVENT_JACK_SESSION: pListener->jacksessionEvent( event.value ); break; case EVENT_PLAYLIST_LOADSONG: pListener->playlistLoadSongEvent( event.value ); break; case EVENT_UNDO_REDO: pListener->undoRedoActionEvent( event.value ); break; case EVENT_TEMPO_CHANGED: pListener->tempoChangedEvent( event.value ); break; case EVENT_UPDATE_SONG: pListener->updateSongEvent( event.value ); break; case EVENT_QUIT: pListener->quitEvent( event.value ); break; default: ERRORLOG( QString("[onEventQueueTimer] Unhandled event: %1").arg( event.type ) ); } } } // midi notes while(!pQueue->m_addMidiNoteVector.empty()){ int rounds = 1; if(pQueue->m_addMidiNoteVector[0].b_noteExist)// runn twice, delete old note and add new note. this let the undo stack consistent rounds = 2; for(int i = 0; im_addMidiNoteVector[0].m_column, pQueue->m_addMidiNoteVector[0].m_row, pQueue->m_addMidiNoteVector[0].m_pattern, pQueue->m_addMidiNoteVector[0].m_length, pQueue->m_addMidiNoteVector[0].f_velocity, pQueue->m_addMidiNoteVector[0].f_pan_L, pQueue->m_addMidiNoteVector[0].f_pan_R, 0.0, pQueue->m_addMidiNoteVector[0].nk_noteKeyVal, pQueue->m_addMidiNoteVector[0].no_octaveKeyVal, false, false, pQueue->m_addMidiNoteVector[0].b_isMidi, pQueue->m_addMidiNoteVector[0].b_isInstrumentMode); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } pQueue->m_addMidiNoteVector.erase(pQueue->m_addMidiNoteVector.begin()); } } void HydrogenApp::addEventListener( EventListener* pListener ) { if (pListener) { m_EventListeners.push_back( pListener ); } } void HydrogenApp::removeEventListener( EventListener* pListener ) { for ( uint i = 0; i < m_EventListeners.size(); i++ ) { if ( pListener == m_EventListeners[ i ] ) { m_EventListeners.erase( m_EventListeners.begin() + i ); } } } /** * Removes temporary files that were created * for undo'ing things. */ void HydrogenApp::cleanupTemporaryFiles() { Filesystem::rm( Filesystem::tmp_dir(), true ); } void HydrogenApp::updateSongEvent( int nValue ) { Hydrogen* pHydrogen = Hydrogen::get_instance(); if ( nValue == 0 ) { // Set a Song prepared by the core part. Song* pNextSong = pHydrogen->getNextSong(); pHydrogen->setSong( pNextSong ); // Cleanup closeFXProperties(); m_pUndoStack->clear(); // Update GUI components m_pSongEditorPanel->updateAll(); m_pPatternEditorPanel->updateSLnameLabel(); updateWindowTitle(); getInstrumentRack()->getSoundLibraryPanel()->update_background_color(); getSongEditorPanel()->updatePositionRuler(); pHydrogen->getTimeline()->m_timelinetagvector.clear(); // Trigger a reset of the Director and MetronomeWidget. EventQueue::get_instance()->push_event( EVENT_METRONOME, 2 ); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); m_pSongEditorPanel->updateAll(); m_pPatternEditorPanel->updateSLnameLabel(); updateWindowTitle(); } else if ( nValue == 1 ) { QString filename = pHydrogen->getSong()->get_filename(); // Song was saved. setScrollStatusBarMessage( tr("Song saved.") + QString(" Into: ") + filename, 2000 ); updateWindowTitle(); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); } } void HydrogenApp::quitEvent( int nValue ) { m_pMainForm->closeAll(); } hydrogen-1.0.0-rc1/src/gui/src/HydrogenApp.h000066400000000000000000000174431366722712400205700ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 HYDROGEN_APP_H #define HYDROGEN_APP_H #include #include #include #include "EventListener.h" #include #include #include #if QT_VERSION >= 0x050000 # include #endif #include //#include /** Amount of time to pass between successive calls to * HydrogenApp::onEventQueueTimer() in milliseconds. * * This causes the GUI to update at 20 frames per second.*/ #define QUEUE_TIMER_PERIOD 50 namespace H2Core { class Song; } class SongEditorPanel; class MainForm; class PlayerControl; class PatternEditorPanel; class InstrumentEditorPanel; class SongEditor; class Mixer; class AudioEngineInfoForm; class SimpleHTMLBrowser; class LadspaFXProperties; class LadspaFXInfo; class LadspaFXGroup; class InstrumentRack; class PlaylistDialog; class SampleEditor; class Director; class InfoBar; class HydrogenApp : public QObject, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: HydrogenApp( MainForm* pMainForm, H2Core::Song *pFirstSong ); /// Returns the instance of HydrogenApp class static HydrogenApp* get_instance(); virtual ~HydrogenApp(); void setSong( H2Core::Song* pSong ); void showPreferencesDialog(); void updateMixerCheckbox(); void showMixer(bool bShow); void showInstrumentPanel(bool); void showAudioEngineInfoForm(); void showPlaylistDialog(); void showDirector(); void showSampleEditor( QString name, int mSelectedComponemt, int mSelectedLayer ); Mixer* getMixer(); MainForm* getMainForm(); SongEditorPanel* getSongEditorPanel(); AudioEngineInfoForm* getAudioEngineInfoForm(); PlaylistDialog* getPlayListDialog(); Director* getDirector(); SampleEditor* getSampleEditor(); SimpleHTMLBrowser* getHelpBrowser(); PatternEditorPanel* getPatternEditorPanel(); PlayerControl* getPlayerControl(); InstrumentRack* getInstrumentRack(); InfoBar * getInfoBar() const; QUndoStack* m_pUndoStack; void setStatusBarMessage( const QString& msg, int msec = 0 ); void setScrollStatusBarMessage( const QString& msg, int msec = 0, bool test = true ); void updateWindowTitle(); #ifdef H2CORE_HAVE_LADSPA LadspaFXProperties* getLadspaFXProperties(uint nFX) { return m_pLadspaFXProperties[nFX]; } #endif void addEventListener( EventListener* pListener ); void removeEventListener( EventListener* pListener ); void closeFXProperties(); void onDrumkitLoad( QString name ); void enableDestructiveRecMode(); void cleanupTemporaryFiles(); public slots: /** * Function called every #QUEUE_TIMER_PERIOD * millisecond to pop all Events from the EventQueue * and invoke the corresponding functions. * * Depending on the H2Core::EventType, the following members * of EventListener will be called: * - H2Core::EVENT_STATE -> EventListener::stateChangedEvent() * - H2Core::EVENT_PATTERN_CHANGED -> EventListener::patternChangedEvent() * - H2Core::EVENT_PATTERN_MODIFIED -> EventListener::patternModifiedEvent() * - H2Core::EVENT_SONG_MODIFIED -> EventListener::songModifiedEvent() * - H2Core::EVENT_SELECTED_PATTERN_CHANGED -> EventListener::selectedPatternChangedEvent() * - H2Core::EVENT_SELECTED_INSTRUMENT_CHANGED -> EventListener::selectedInstrumentChangedEvent() * - H2Core::EVENT_PARAMETERS_INSTRUMENT_CHANGED -> EventListener::parametersInstrumentChangedEvent() * - H2Core::EVENT_MIDI_ACTIVITY -> EventListener::midiActivityEvent() * - H2Core::EVENT_NOTEON -> EventListener::noteOnEvent() * - H2Core::EVENT_ERROR -> EventListener::errorEvent() * - H2Core::EVENT_XRUN -> EventListener::XRunEvent() * - H2Core::EVENT_METRONOME -> EventListener::metronomeEvent() * - H2Core::EVENT_RECALCULATERUBBERBAND -> EventListener::rubberbandbpmchangeEvent() * - H2Core::EVENT_PROGRESS -> EventListener::progressEvent() * - H2Core::EVENT_JACK_SESSION -> EventListener::jacksessionEvent() * - H2Core::EVENT_PLAYLIST_LOADSONG -> EventListener::playlistLoadSongEvent() * - H2Core::EVENT_UNDO_REDO -> EventListener::undoRedoActionEvent() * - H2Core::EVENT_TEMPO_CHANGED -> EventListener::tempoChangedEvent() * - H2Core::EVENT_UPDATE_SONG -> EventListener::updateSongEvent() * - H2Core::EVENT_NONE -> nothing * * In addition, all MIDI notes in * H2Core::EventQueue::m_addMidiNoteVector will converted into * actions via SE_addNoteAction() and deleted from the * former array. */ void onEventQueueTimer(); void currentTabChanged(int); private: static HydrogenApp * m_pInstance; ///< HydrogenApp instance #ifdef H2CORE_HAVE_LADSPA LadspaFXProperties * m_pLadspaFXProperties[MAX_FX]; #endif MainForm * m_pMainForm; Mixer * m_pMixer; PatternEditorPanel* m_pPatternEditorPanel; AudioEngineInfoForm * m_pAudioEngineInfoForm; SongEditorPanel * m_pSongEditorPanel; SimpleHTMLBrowser * m_pHelpBrowser; SimpleHTMLBrowser * m_pFirstTimeInfo; InstrumentRack* m_pInstrumentRack; PlayerControl * m_pPlayerControl; PlaylistDialog * m_pPlaylistDialog; SampleEditor * m_pSampleEditor; InfoBar * m_pInfoBar; Director * m_pDirector; QTimer * m_pEventQueueTimer; std::vector m_EventListeners; QTabWidget * m_pTab; QSplitter * m_pSplitter; // implement EngineListener interface void engineError(uint nErrorCode); void setupSinglePanedInterface(); virtual void songModifiedEvent(); /** * Refreshes and updates the GUI after the Song was changed in * the core part of Hydrogen. * * When using session management or changing the Song using * an OSC message, this command will get core and GUI in sync * again. * * \param nValue unused */ virtual void updateSongEvent( int nValue ); /** * Calls closeAll() to shutdown Hydrogen. * * \param nValue unused */ virtual void quitEvent( int nValue ); }; inline Mixer* HydrogenApp::getMixer() { return m_pMixer; } inline MainForm* HydrogenApp::getMainForm() { return m_pMainForm; } inline SongEditorPanel* HydrogenApp::getSongEditorPanel() { return m_pSongEditorPanel; } inline AudioEngineInfoForm* HydrogenApp::getAudioEngineInfoForm() { return m_pAudioEngineInfoForm; } inline PlaylistDialog* HydrogenApp::getPlayListDialog() { return m_pPlaylistDialog; } inline Director* HydrogenApp::getDirector() { return m_pDirector; } inline SampleEditor* HydrogenApp::getSampleEditor() { return m_pSampleEditor; } inline SimpleHTMLBrowser* HydrogenApp::getHelpBrowser() { return m_pHelpBrowser; } inline PatternEditorPanel* HydrogenApp::getPatternEditorPanel() { return m_pPatternEditorPanel; } inline PlayerControl* HydrogenApp::getPlayerControl() { return m_pPlayerControl; } inline InstrumentRack* HydrogenApp::getInstrumentRack() { return m_pInstrumentRack; } inline InfoBar* HydrogenApp::getInfoBar() const { return m_pInfoBar; } #endif hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/000077500000000000000000000000001366722712400215055ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/InstrumentEditor.cpp000066400000000000000000001340571366722712400255420ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace H2Core; #include "../HydrogenApp.h" #include "../Skin.h" #include "../Widgets/Rotary.h" #include "../Widgets/ClickableLabel.h" #include "../Widgets/Button.h" #include "../Widgets/LCD.h" #include "../Widgets/LCDCombo.h" #include "../Widgets/Fader.h" #include "InstrumentEditor.h" #include "WaveDisplay.h" #include "LayerPreview.h" #include "AudioFileBrowser/AudioFileBrowser.h" const char* InstrumentEditor::__class_name = "InstrumentEditor"; InstrumentEditor::InstrumentEditor( QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) , m_pInstrument( nullptr ) , m_nSelectedLayer( 0 ) { setFixedWidth( 290 ); // Instrument properties top m_pInstrumentPropTop = new PixmapWidget( this ); m_pInstrumentPropTop->setPixmap( "/instrumentEditor/instrumentTab_top.png" ); m_pShowInstrumentBtn = new ToggleButton( m_pInstrumentPropTop, "/skin_btn_on.png", "/skin_btn_off.png", "/skin_btn_over.png", QSize( 100, 17 ), true ); m_pShowInstrumentBtn->setText(tr("General")); m_pShowInstrumentBtn->setToolTip( tr( "Show instrument properties" ) ); connect( m_pShowInstrumentBtn, SIGNAL( clicked(Button*) ), this, SLOT( buttonClicked(Button*) ) ); m_pShowInstrumentBtn->move( 40, 7 ); m_pShowInstrumentBtn->setPressed( true ); m_pShowLayersBtn = new ToggleButton( m_pInstrumentPropTop, "/skin_btn_on.png", "/skin_btn_off.png", "/skin_btn_over.png", QSize( 100, 17 ), true ); m_pShowLayersBtn->setText( tr("Layers") ); m_pShowLayersBtn->setToolTip( tr( "Show layers properties" ) ); connect( m_pShowLayersBtn, SIGNAL( clicked(Button*) ), this, SLOT( buttonClicked(Button*) ) ); m_pShowLayersBtn->move( 144, 7 ); // Instrument properties m_pInstrumentProp = new PixmapWidget( this ); m_pInstrumentProp->move(0, 31); m_pInstrumentProp->setPixmap( "/instrumentEditor/instrumentTab_new.png" ); m_pNameLbl = new ClickableLabel( m_pInstrumentProp ); m_pNameLbl->setGeometry( 8, 5, 275, 28 ); ///////////// //Midi Out m_pMidiOutChannelLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pMidiOutChannelLCD->move( 67, 261 ); m_pMidiOutChannelLCD->setToolTip(QString(tr("Midi out channel"))); m_pAddMidiOutChannelBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ) ); m_pAddMidiOutChannelBtn->move( 109, 260 ); connect( m_pAddMidiOutChannelBtn, SIGNAL( clicked(Button*) ), this, SLOT( midiOutChannelBtnClicked(Button*) ) ); m_pDelMidiOutChannelBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8) ); m_pDelMidiOutChannelBtn->move( 109, 269 ); connect( m_pDelMidiOutChannelBtn, SIGNAL( clicked(Button*) ), this, SLOT( midiOutChannelBtnClicked(Button*) ) ); /// m_pMidiOutNoteLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pMidiOutNoteLCD->move( 160, 261 ); m_pAddMidiOutNoteBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ), false, true ); m_pMidiOutNoteLCD->setToolTip(QString(tr("Midi out note"))); m_pAddMidiOutNoteBtn->move( 202, 260 ); connect( m_pAddMidiOutNoteBtn, SIGNAL( clicked(Button*) ), this, SLOT( midiOutNoteBtnClicked(Button*) ) ); m_pDelMidiOutNoteBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8), false, true ); m_pDelMidiOutNoteBtn->move( 202, 269 ); connect( m_pDelMidiOutNoteBtn, SIGNAL( clicked(Button*) ), this, SLOT( midiOutNoteBtnClicked(Button*) ) ); ///////////// QFont boldFont; boldFont.setBold(true); m_pNameLbl->setFont( boldFont ); connect( m_pNameLbl, SIGNAL( labelClicked(ClickableLabel*) ), this, SLOT( labelClicked(ClickableLabel*) ) ); m_pRandomPitchRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Random pitch factor" ), false, true ); m_pRandomPitchRotary->move( 117, 210 ); connect( m_pRandomPitchRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); // Filter m_pFilterBypassBtn = new ToggleButton( m_pInstrumentProp, "/instrumentEditor/bypass_on.png", "/instrumentEditor/bypass_off.png", "/instrumentEditor/bypass_over.png", QSize( 30, 13 ) ); connect( m_pFilterBypassBtn, SIGNAL( clicked(Button*) ), this, SLOT( filterActiveBtnClicked(Button*) ) ); m_pCutoffRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Filter Cutoff" ), false, true ); m_pCutoffRotary->setDefaultValue( m_pCutoffRotary->getMax() ); connect( m_pCutoffRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pResonanceRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Filter resonance" ), false, true ); connect( m_pResonanceRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pFilterBypassBtn->move( 70, 170 ); m_pCutoffRotary->move( 117, 164 ); m_pResonanceRotary->move( 170, 164 ); //~ Filter // ADSR m_pAttackRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Attack" ), false, true ); m_pDecayRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Decay" ), false, true ); m_pSustainRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Sustain" ), false, true ); m_pSustainRotary->setDefaultValue( m_pSustainRotary->getMax() ); m_pReleaseRotary = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Release" ), false, true ); m_pReleaseRotary->setDefaultValue( 0.09 ); connect( m_pAttackRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); connect( m_pDecayRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); connect( m_pSustainRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); connect( m_pReleaseRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pAttackRotary->move( 53, 52 ); m_pDecayRotary->move( 105, 52 ); m_pSustainRotary->move( 157, 52 ); m_pReleaseRotary->move( 209, 52 ); //~ ADSR // instrument gain m_pInstrumentGainLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pInstrumentGain = new Rotary( m_pInstrumentProp, Rotary::TYPE_NORMAL, tr( "Instrument gain" ), false, false ); m_pInstrumentGain->setDefaultValue( 0.2 ); // gain is multiplied with 5, so default is 1.0 from users view connect( m_pInstrumentGain, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pInstrumentGainLCD->move( 67, 105 ); m_pInstrumentGain->move( 117, 100 ); m_pMuteGroupLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pMuteGroupLCD->move( 160, 105 ); m_pAddMuteGroupBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ) ); m_pAddMuteGroupBtn->move( 202, 104 ); connect( m_pAddMuteGroupBtn, SIGNAL( clicked(Button*) ), this, SLOT( muteGroupBtnClicked(Button*) ) ); m_pDelMuteGroupBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8) ); m_pDelMuteGroupBtn->move( 202, 113 ); connect( m_pDelMuteGroupBtn, SIGNAL( clicked(Button*) ), this, SLOT( muteGroupBtnClicked(Button*) ) ); m_pIsStopNoteCheckBox = new QCheckBox ( tr( "" ), m_pInstrumentProp ); m_pIsStopNoteCheckBox->move( 63, 138 ); m_pIsStopNoteCheckBox->setToolTip( tr( "Stop the current playing instrument-note before trigger the next note sample." ) ); connect( m_pIsStopNoteCheckBox, SIGNAL( toggled( bool ) ), this, SLOT( onIsStopNoteCheckBoxClicked( bool ) ) ); m_pApplyVelocity = new QCheckBox ( tr( "" ), m_pInstrumentProp ); m_pApplyVelocity->move( 153, 138 ); m_pApplyVelocity->setToolTip( tr( "Don't change the layers' gain based on velocity" ) ); connect( m_pApplyVelocity, SIGNAL( toggled( bool ) ), this, SLOT( onIsApplyVelocityCheckBoxClicked( bool ) ) ); ////////////////////////// // HiHat setup m_pHihatGroupLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pHihatGroupLCD->move( 27, 307 ); m_pAddHihatGroupBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ) ); m_pAddHihatGroupBtn->move( 69, 306 ); connect( m_pAddHihatGroupBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatGroupClicked(Button*) ) ); m_pDelHihatGroupBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8) ); m_pDelHihatGroupBtn->move( 69, 315 ); connect( m_pDelHihatGroupBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatGroupClicked(Button*) ) ); m_pHihatMinRangeLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pHihatMinRangeLCD->move( 137, 307 ); m_pAddHihatMinRangeBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ), false, true ); m_pAddHihatMinRangeBtn->move( 179, 306 ); connect( m_pAddHihatMinRangeBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatMinRangeBtnClicked(Button*) ) ); m_pDelHihatMinRangeBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8), false, true ); m_pDelHihatMinRangeBtn->move( 179, 315 ); connect( m_pDelHihatMinRangeBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatMinRangeBtnClicked(Button*) ) ); m_pHihatMaxRangeLCD = new LCDDisplay( m_pInstrumentProp, LCDDigit::SMALL_BLUE, 4 ); m_pHihatMaxRangeLCD->move( 202, 307 ); m_pAddHihatMaxRangeBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize( 16, 8 ), false, true ); m_pAddHihatMaxRangeBtn->move( 244, 306 ); connect( m_pAddHihatMaxRangeBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatMaxRangeBtnClicked(Button*) ) ); m_pDelHihatMaxRangeBtn = new Button( m_pInstrumentProp, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16,8), false, true ); m_pDelHihatMaxRangeBtn->move( 244, 315 ); connect( m_pDelHihatMaxRangeBtn, SIGNAL( clicked(Button*) ), this, SLOT( hihatMaxRangeBtnClicked(Button*) ) ); // //~ Instrument properties // LAYER properties m_pLayerProp = new PixmapWidget( this ); m_pLayerProp->move( 0, 31 ); m_pLayerProp->hide(); m_pLayerProp->setPixmap( "/instrumentEditor/layerTabsupernew.png" ); // Component m_pCompoNameLbl = new ClickableLabel( m_pLayerProp ); m_pCompoNameLbl->setGeometry( 8, 5, 275, 28 ); m_pCompoNameLbl->setFont( boldFont ); connect( m_pCompoNameLbl, SIGNAL( labelClicked(ClickableLabel*) ), this, SLOT( labelCompoClicked(ClickableLabel*) ) ); m_buttonDropDownCompo = new Button( m_pLayerProp, "/instrumentEditor/btn_dropdown_on.png", "/instrumentEditor/btn_dropdown_off.png", "/instrumentEditor/btn_dropdown_over.png", QSize(13, 13) ); m_buttonDropDownCompo->move( 272, 10 ); connect( m_buttonDropDownCompo, SIGNAL( clicked( Button* ) ), this, SLOT( onClick( Button* ) ) ); // Layer preview m_pLayerPreview = new LayerPreview( nullptr ); m_pLayerScrollArea = new QScrollArea( m_pLayerProp); m_pLayerScrollArea->setFrameShape( QFrame::NoFrame ); m_pLayerScrollArea->move( 6, 44 ); m_pLayerScrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); if ( InstrumentComponent::getMaxLayers() > 16 ) { m_pLayerScrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); } m_pLayerScrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pLayerScrollArea->setMaximumHeight( 182 ); m_pLayerScrollArea->setWidget( m_pLayerPreview ); // Waveform display m_pWaveDisplay = new WaveDisplay( m_pLayerProp ); m_pWaveDisplay->resize( 277, 58 ); m_pWaveDisplay->updateDisplay( nullptr ); m_pWaveDisplay->move( 5, 241 ); connect( m_pWaveDisplay, SIGNAL( doubleClicked(QWidget*) ), this, SLOT( waveDisplayDoubleClicked(QWidget*) ) ); m_pLoadLayerBtn = new Button( m_pLayerProp, "/instrumentEditor/loadLayer_on.png", "/instrumentEditor/loadLayer_off.png", "/instrumentEditor/loadLayer_over.png", QSize( 90, 13 ) ); m_pRemoveLayerBtn = new Button( m_pLayerProp, "/instrumentEditor/deleteLayer_on.png", "/instrumentEditor/deleteLayer_off.png", "/instrumentEditor/deleteLayer_over.png", QSize( 90, 13 ) ); m_pSampleEditorBtn = new Button( m_pLayerProp, "/instrumentEditor/editLayer_on.png", "/instrumentEditor/editLayer_off.png", "/instrumentEditor/editLayer_over.png", QSize( 90, 13 ) ); m_pLoadLayerBtn->move( 48, 267 ); m_pRemoveLayerBtn->move( 145, 267 ); m_pLoadLayerBtn->move( 6, 306 ); m_pRemoveLayerBtn->move( 99, 306 ); m_pSampleEditorBtn->move( 191, 306 ); connect( m_pLoadLayerBtn, SIGNAL( clicked(Button*) ), this, SLOT( buttonClicked(Button*) ) ); connect( m_pRemoveLayerBtn, SIGNAL( clicked(Button*) ), this, SLOT( buttonClicked(Button*) ) ); connect( m_pSampleEditorBtn, SIGNAL( clicked(Button*) ), this, SLOT( buttonClicked(Button*) ) ); // Layer gain m_pLayerGainLCD = new LCDDisplay( m_pLayerProp, LCDDigit::SMALL_BLUE, 4 ); m_pLayerGainRotary = new Rotary( m_pLayerProp, Rotary::TYPE_NORMAL, tr( "Layer gain" ), false, false ); m_pLayerGainRotary->setDefaultValue ( 0.2 ); // gain is multiplied with 5, so default is 1.0 from users view connect( m_pLayerGainRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pCompoGainLCD = new LCDDisplay( m_pLayerProp, LCDDigit::SMALL_BLUE, 4 ); m_pCompoGainRotary = new Rotary( m_pLayerProp, Rotary::TYPE_NORMAL, tr( "Component volume" ), false, false ); m_pCompoGainRotary->setDefaultValue ( 0.2 ); // gain is multiplied with 5, so default is 1.0 from users view connect( m_pCompoGainRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pLayerPitchCoarseLCD = new LCDDisplay( m_pLayerProp, LCDDigit::SMALL_BLUE, 4 ); m_pLayerPitchFineLCD = new LCDDisplay( m_pLayerProp, LCDDigit::SMALL_BLUE, 4 ); m_pLayerPitchCoarseRotary = new Rotary( m_pLayerProp, Rotary::TYPE_CENTER, tr( "Layer pitch (Coarse)" ), true, false ); m_pLayerPitchCoarseRotary->setMin( -24.0 ); m_pLayerPitchCoarseRotary->setMax( 24.0 ); connect( m_pLayerPitchCoarseRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pLayerPitchFineRotary = new Rotary( m_pLayerProp, Rotary::TYPE_CENTER, tr( "Layer pitch (Fine)" ), true, false ); m_pLayerPitchFineRotary->setMin( -50.0 ); m_pLayerPitchFineRotary->setMax( 50.0 ); connect( m_pLayerPitchFineRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pLayerGainLCD->move( 54, 341 + 3 ); m_pLayerGainRotary->move( 102, 341 ); m_pCompoGainLCD->move( 151, 341 + 3 ); m_pCompoGainRotary->move( 199, 341 ); m_pLayerPitchCoarseLCD->move( 54, 391 + 3 ); m_pLayerPitchCoarseRotary->move( 102, 391 ); m_pLayerPitchFineLCD->move( 151, 391 + 3 ); m_pLayerPitchFineRotary->move( 199, 391 ); m_sampleSelectionAlg = new LCDCombo(m_pLayerProp, 25); m_sampleSelectionAlg->move( 60, 434 ); m_sampleSelectionAlg->setToolTip( tr("Select pattern size") ); m_sampleSelectionAlg->addItem( QString( "First in Velocity" ) ); m_sampleSelectionAlg->addItem( QString( "Round Robin" ) ); m_sampleSelectionAlg->addItem( QString( "Random" ) ); connect( m_sampleSelectionAlg, SIGNAL( valueChanged( int ) ), this, SLOT( pSampleSelectionChanged( int ) ) ); //~ Layer properties //component handling QStringList itemsCompo; popCompo = new QMenu( this ); itemsCompo.clear(); std::vector* pComponentList = Hydrogen::get_instance()->getSong()->get_components(); for (std::vector::iterator it = pComponentList->begin() ; it != pComponentList->end(); ++it) { DrumkitComponent* pComponent = *it; if( !itemsCompo.contains( pComponent->get_name() ) ) { itemsCompo.append( pComponent->get_name() ); } } itemsCompo.append("--sep--"); itemsCompo.append("add"); itemsCompo.append("delete"); itemsCompo.append("rename"); m_nSelectedComponent = pComponentList->front()->get_id(); connect( popCompo, SIGNAL( triggered(QAction*) ), this, SLOT( compoChangeAddDelete(QAction*) ) ); update(); //~component handling selectLayer( m_nSelectedLayer ); HydrogenApp::get_instance()->addEventListener(this); selectedInstrumentChangedEvent(); // force an update // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } InstrumentEditor::~InstrumentEditor() { //INFOLOG( "DESTROY" ); } void InstrumentEditor::selectedInstrumentChangedEvent() { AudioEngine::get_instance()->lock( RIGHT_HERE ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); if ( pSong != nullptr ) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = pEngine->getSelectedInstrumentNumber(); if ( nInstr >= pInstrList->size() ) { nInstr = -1; } if ( nInstr == -1 ) { m_pInstrument = nullptr; } else { m_pInstrument = pInstrList->get( nInstr ); //INFOLOG( "new instr: " + m_pInstrument->m_sName ); } } else { m_pInstrument = nullptr; } AudioEngine::get_instance()->unlock(); // update layer list if ( m_pInstrument ) { m_pNameLbl->setText( m_pInstrument->get_name() ); // ADSR m_pAttackRotary->setValue( sqrtf(m_pInstrument->get_adsr()->get_attack() / 100000.0) ); m_pDecayRotary->setValue( sqrtf(m_pInstrument->get_adsr()->get_decay() / 100000.0) ); m_pSustainRotary->setValue( m_pInstrument->get_adsr()->get_sustain() ); float fTmp = m_pInstrument->get_adsr()->get_release() - 256.0; if( fTmp < 0.0 ) { fTmp = 0.0; } m_pReleaseRotary->setValue( sqrtf(fTmp / 100000.0) ); //~ ADSR // filter m_pFilterBypassBtn->setPressed( !m_pInstrument->is_filter_active() ); m_pCutoffRotary->setValue( m_pInstrument->get_filter_cutoff() ); m_pResonanceRotary->setValue( m_pInstrument->get_filter_resonance() ); //~ filter // random pitch m_pRandomPitchRotary->setValue( m_pInstrument->get_random_pitch_factor() ); //Stop Note m_pIsStopNoteCheckBox->setChecked( m_pInstrument->is_stop_notes() ); //Ignore Velocity m_pApplyVelocity->setChecked( m_pInstrument->get_apply_velocity() ); // instr gain char tmp[20]; sprintf( tmp, "%#.2f", m_pInstrument->get_gain() ); m_pInstrumentGainLCD->setText( tmp ); m_pInstrumentGain->setValue( m_pInstrument->get_gain()/ 5.0 ); // instr mute group QString sMuteGroup = QString("%1").arg( m_pInstrument->get_mute_group() ); if (m_pInstrument->get_mute_group() == -1 ) { sMuteGroup = "Off"; } m_pMuteGroupLCD->setText( sMuteGroup ); // midi out channel QString sMidiOutChannel = QString("%1").arg( m_pInstrument->get_midi_out_channel()+1 ); if (m_pInstrument->get_midi_out_channel() == -1 ) { sMidiOutChannel = "Off"; } m_pMidiOutChannelLCD->setText( sMidiOutChannel ); //midi out note QString sMidiOutNote = QString("%1").arg( m_pInstrument->get_midi_out_note() ); m_pMidiOutNoteLCD->setText( sMidiOutNote ); // hihat QString sHHGroup = QString("%1").arg( m_pInstrument->get_hihat_grp() ); if (m_pInstrument->get_hihat_grp() == -1 ) { sHHGroup = "Off"; } m_pHihatGroupLCD->setText( sHHGroup ); QString sHiHatMinRange = QString("%1").arg( m_pInstrument->get_lower_cc() ); m_pHihatMinRangeLCD->setText( sHiHatMinRange ); QString sHiHatMaxRange = QString("%1").arg( m_pInstrument->get_higher_cc() ); m_pHihatMaxRangeLCD->setText( sHiHatMaxRange ); // see instrument.h m_sampleSelectionAlg->select( m_pInstrument->sample_selection_alg(), false); itemsCompo.clear(); std::vector* compoList = pSong->get_components(); for (auto& it : *pSong->get_components() ) { DrumkitComponent* pDrumkitComponent = it; if( !itemsCompo.contains( pDrumkitComponent->get_name() ) ) itemsCompo.append( pDrumkitComponent->get_name() ); } itemsCompo.append("--sep--"); itemsCompo.append("add"); itemsCompo.append("delete"); itemsCompo.append("rename"); update(); bool bFound = false; for (std::vector::iterator it = compoList->begin() ; it != compoList->end(); ++it) { DrumkitComponent* pComponent = *it; if ( pComponent->get_id() == m_nSelectedComponent ) { bFound = true; break; } } if ( !bFound ){ m_nSelectedComponent = compoList->front()->get_id(); } DrumkitComponent* pTmpComponent = pSong->get_component( m_nSelectedComponent ); assert(pTmpComponent); m_pCompoNameLbl->setText( pTmpComponent->get_name() ); if( m_nSelectedLayer >= 0 ){ InstrumentComponent* pComponent = m_pInstrument->get_component( m_nSelectedComponent ); if( pComponent ) { char tmp[20]; sprintf( tmp, "%#.2f", pComponent->get_gain()); m_pCompoGainLCD->setText( tmp ); m_pCompoGainRotary->setValue( pComponent->get_gain() / 5.0 ); InstrumentLayer* pLayer = pComponent->get_layer( m_nSelectedLayer ); if(pLayer) { m_pWaveDisplay->updateDisplay( pLayer ); } else { m_pWaveDisplay->updateDisplay( nullptr ); } } else { m_pWaveDisplay->updateDisplay( nullptr ); } } else{ m_pWaveDisplay->updateDisplay( nullptr ); } } else { m_pNameLbl->setText( QString( "NULL Instrument..." ) ); m_pWaveDisplay->updateDisplay( nullptr ); m_nSelectedLayer = 0; } selectLayer( m_nSelectedLayer ); } void InstrumentEditor::rotaryChanged(Rotary *ref) { float fVal = ref->getValue(); if ( m_pInstrument ) { if ( ref == m_pRandomPitchRotary ){ m_pInstrument->set_random_pitch_factor( fVal ); } else if ( ref == m_pCutoffRotary ) { m_pInstrument->set_filter_cutoff( fVal ); } else if ( ref == m_pResonanceRotary ) { if ( fVal > 0.95f ) { fVal = 0.95f; } m_pInstrument->set_filter_resonance( fVal ); } else if ( ref == m_pAttackRotary ) { m_pInstrument->get_adsr()->set_attack( fVal * fVal * 100000 ); } else if ( ref == m_pDecayRotary ) { m_pInstrument->get_adsr()->set_decay( fVal * fVal * 100000 ); } else if ( ref == m_pSustainRotary ) { m_pInstrument->get_adsr()->set_sustain( fVal ); } else if ( ref == m_pReleaseRotary ) { m_pInstrument->get_adsr()->set_release( 256.0 + fVal * fVal * 100000 ); } else if ( ref == m_pLayerGainRotary ) { fVal = fVal * 5.0; char tmp[20]; sprintf( tmp, "%#.2f", fVal ); m_pLayerGainLCD->setText( tmp ); InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { pLayer->set_gain( fVal ); m_pWaveDisplay->updateDisplay( pLayer ); } } } else if ( ref == m_pCompoGainRotary ) { fVal = fVal * 5.0; char tmp[20]; sprintf( tmp, "%#.2f", fVal ); m_pCompoGainLCD->setText( tmp ); InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); pCompo->set_gain( fVal ); } else if ( ref == m_pLayerPitchCoarseRotary ) { //fVal = fVal * 24.0 - 12.0; m_pLayerPitchCoarseLCD->setText( QString( "%1" ).arg( (int)fVal ) ); InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { int nCoarse = (int)m_pLayerPitchCoarseRotary->getValue(); float fFine = m_pLayerPitchFineRotary->getValue() / 100.0; pLayer->set_pitch( nCoarse + fFine ); INFOLOG( QString("pitch: %1").arg( pLayer->get_pitch() ) ); } } } else if ( ref == m_pLayerPitchFineRotary ) { m_pLayerPitchFineLCD->setText( QString( "%1" ).arg( fVal ) ); InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { int nCoarse = (int)m_pLayerPitchCoarseRotary->getValue(); float fFine = m_pLayerPitchFineRotary->getValue() / 100.0; pLayer->set_pitch( nCoarse + fFine ); INFOLOG( QString("pitch: %1").arg( pLayer->get_pitch()) ); } } } else if ( ref == m_pInstrumentGain ) { fVal = fVal * 5.0; char tmp[20]; sprintf( tmp, "%#.2f", fVal ); m_pInstrumentGainLCD->setText( tmp ); m_pInstrument->set_gain( fVal ); } else { ERRORLOG( "[rotaryChanged] unhandled rotary" ); } } } void InstrumentEditor::filterActiveBtnClicked(Button *ref) { if ( m_pInstrument ) { m_pInstrument->set_filter_active( !ref->isPressed() ); } } void InstrumentEditor::waveDisplayDoubleClicked( QWidget* pRef ) { if ( !m_pInstrument ) { return; } InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( !pCompo ) { return; } H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { Sample* pSample = pLayer->get_sample(); if( pSample ) { QString name = pSample->get_filepath(); HydrogenApp::get_instance()->showSampleEditor( name, m_nSelectedComponent, m_nSelectedLayer ); } } else { loadLayer(); } } void InstrumentEditor::buttonClicked( Button* pButton ) { if ( pButton == m_pShowInstrumentBtn ) { m_pShowInstrumentBtn->setPressed( true ); m_pShowLayersBtn->setPressed( false ); m_pInstrumentProp->show(); m_pLayerProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pShowLayersBtn ) { m_pShowLayersBtn->setPressed( true ); m_pShowInstrumentBtn->setPressed( false ); m_pLayerProp->show(); m_pInstrumentProp->hide(); m_pShowLayersBtn->show(); m_pShowInstrumentBtn->show(); } else if ( pButton == m_pLoadLayerBtn ) { loadLayer(); } else if ( pButton == m_pRemoveLayerBtn ) { //Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( m_pInstrument ) { InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { m_pInstrument->get_component(m_nSelectedComponent)->set_layer( nullptr, m_nSelectedLayer ); int nCount = 0; for( int n = 0; n < InstrumentComponent::getMaxLayers(); n++ ) { InstrumentLayer* pLayer = m_pInstrument->get_component(m_nSelectedComponent)->get_layer( n ); if( pLayer ){ nCount++; } } if( nCount == 0 ){ m_pInstrument->get_components()->erase( m_pInstrument->get_components()->begin() + m_nSelectedComponent ); } } } AudioEngine::get_instance()->unlock(); selectedInstrumentChangedEvent(); // update all m_pLayerPreview->updateAll(); } else if ( pButton == m_pSampleEditorBtn ){ if ( m_pInstrument ) { InstrumentComponent* pCompo = m_pInstrument->get_component(m_nSelectedComponent); if( pCompo ) { H2Core::InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { Sample* pSample = pLayer->get_sample(); if( pSample == nullptr) return; QString name = pSample->get_filepath(); HydrogenApp::get_instance()->showSampleEditor( name, m_nSelectedComponent, m_nSelectedLayer ); } } } } else { ERRORLOG( "[buttonClicked] unhandled button" ); } } void InstrumentEditor::loadLayer() { Hydrogen *pEngine = Hydrogen::get_instance(); AudioFileBrowser *pFileBrowser = new AudioFileBrowser( nullptr, true, true); QStringList filename; filename << "false" << "false" << ""; if (pFileBrowser->exec() == QDialog::Accepted) { filename = pFileBrowser->getSelectedFiles(); } delete pFileBrowser; if ( filename[2].isEmpty() ) return; bool fnc = false; if ( filename[0] == "true" ){ fnc = true; } //use auto velocity if we want to work with multiple filenames if ( filename.size() > 3) filename[1] = "true"; int selectedLayer = m_nSelectedLayer; int firstSelection = selectedLayer; if (filename.size() > 2) { for(int i=2;i < filename.size();++i) { selectedLayer = m_nSelectedLayer + i - 2; if( ( i-2 >= InstrumentComponent::getMaxLayers() ) || ( selectedLayer + 1 > InstrumentComponent::getMaxLayers() ) ) break; Sample *pNewSample = Sample::load( filename[i] ); H2Core::Instrument *pInstr = nullptr; AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); pInstr = pInstrList->get( pEngine->getSelectedInstrumentNumber() ); /* if we're using multiple layers, we start inserting the first layer at m_nSelectedLayer and the next layer at m_nSelectedLayer+1 */ InstrumentComponent *pCompo = pInstr->get_component(m_nSelectedComponent); if( !pCompo ) { pCompo = new InstrumentComponent( m_nSelectedComponent ); pInstr->get_components()->push_back( pCompo ); } H2Core::InstrumentLayer *pLayer = pInstr->get_component(m_nSelectedComponent)->get_layer( selectedLayer ); if (pLayer != nullptr) { // insert new sample from newInstrument, old sample gets deleted by set_sample pLayer->set_sample( pNewSample ); } else { pLayer = new H2Core::InstrumentLayer(pNewSample); pInstr->get_component(m_nSelectedComponent)->set_layer( pLayer, selectedLayer ); } if ( fnc ){ QString newFilename = filename[i].section( '/', -1 ); newFilename.replace( "." + newFilename.section( '.', -1 ), ""); m_pInstrument->set_name( newFilename ); } //set automatic velocity if ( filename[1] == "true" ){ setAutoVelocity(); } AudioEngine::get_instance()->unlock(); } } selectedInstrumentChangedEvent(); // update all selectLayer( firstSelection ); m_pLayerPreview->updateAll(); } void InstrumentEditor::setAutoVelocity() { std::vector layerInUse( InstrumentComponent::getMaxLayers(), 0 ); int nLayers = 0; for ( int i = 0; i < InstrumentComponent::getMaxLayers() ; i++ ) { InstrumentLayer *pLayer = m_pInstrument->get_component(m_nSelectedComponent)->get_layer( i ); if ( pLayer ) { nLayers++; layerInUse[i] = i; } } if( nLayers == 0){ nLayers = 1; } float velocityrange = 1.0 / nLayers; for ( int i = 0; i < InstrumentComponent::getMaxLayers() ; i++ ) { if ( layerInUse[i] == i ){ nLayers--; InstrumentLayer *pLayer = m_pInstrument->get_component(m_nSelectedComponent)->get_layer( i ); if ( pLayer ) { pLayer->set_start_velocity( nLayers * velocityrange); pLayer->set_end_velocity( nLayers * velocityrange + velocityrange ); } } } } void InstrumentEditor::labelCompoClicked( ClickableLabel* pRef ) { UNUSED( pRef ); DrumkitComponent* pComponent = Hydrogen::get_instance()->getSong()->get_component( m_nSelectedComponent ); QString sOldName = pComponent->get_name(); bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", tr( "New component name" ), QLineEdit::Normal, sOldName, &bIsOkPressed ); if ( bIsOkPressed ) { pComponent->set_name( sNewName ); selectedInstrumentChangedEvent(); // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } } void InstrumentEditor::selectComponent( int nComponent ) { if (!m_pInstrument) { return; } m_nSelectedComponent = nComponent; m_pLayerPreview->set_selected_component(m_nSelectedComponent); } void InstrumentEditor::labelClicked( ClickableLabel* pRef ) { UNUSED( pRef ); if (m_pInstrument) { QString sOldName = m_pInstrument->get_name(); bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", tr( "New instrument name" ), QLineEdit::Normal, sOldName, &bIsOkPressed ); if ( bIsOkPressed ) { m_pInstrument->set_name( sNewName ); selectedInstrumentChangedEvent(); #ifdef H2CORE_HAVE_JACK AudioEngine::get_instance()->lock( RIGHT_HERE ); Hydrogen *engine = Hydrogen::get_instance(); engine->renameJackPorts(engine->getSong()); AudioEngine::get_instance()->unlock(); #endif // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } else { // user entered nothing or pressed Cancel } } } void InstrumentEditor::selectLayer( int nLayer ) { if (!m_pInstrument) { return; } m_nSelectedLayer = nLayer; H2Core::InstrumentComponent *pComponent = m_pInstrument->get_component( m_nSelectedComponent ); if(pComponent && nLayer >= 0 ){ H2Core::InstrumentLayer *pLayer = pComponent->get_layer( nLayer ); m_pWaveDisplay->updateDisplay( pLayer ); if (pLayer) { char tmp[20]; // Layer GAIN m_pLayerGainRotary->setValue( pLayer->get_gain() / 5.0 ); sprintf( tmp, "%#.2f", pLayer->get_gain() ); m_pLayerGainLCD->setText( tmp ); //Component GAIN char tmp2[20]; sprintf( tmp2, "%#.2f", pComponent->get_gain()); m_pCompoGainRotary->setValue( pComponent->get_gain() / 5.0); m_pCompoGainLCD->setText( tmp2 ); // Layer PITCH int nCoarsePitch = (int) ::round(pLayer->get_pitch()); float fFinePitch = pLayer->get_pitch() - nCoarsePitch; //INFOLOG( "fine pitch: " + to_string( fFinePitch ) ); m_pLayerPitchCoarseRotary->setValue( nCoarsePitch ); m_pLayerPitchFineRotary->setValue( fFinePitch * 100 ); m_pLayerPitchCoarseLCD->setText( QString( "%1" ).arg( nCoarsePitch ) ); m_pLayerPitchFineLCD->setText( QString( "%1" ).arg( fFinePitch * 100 ) ); } else { // Layer GAIN m_pLayerGainRotary->setValue( 1.0 ); m_pLayerGainLCD->setText( "" ); //Component GAIN m_pCompoGainRotary->setValue( 1.0 ); m_pCompoGainLCD->setText( "" ); // Layer PITCH m_pLayerPitchCoarseRotary->setValue( 0.0 ); m_pLayerPitchFineRotary->setValue( 0.0 ); m_pLayerPitchCoarseLCD->setText( "" ); m_pLayerPitchFineLCD->setText( "" ); } } else { m_pWaveDisplay->updateDisplay( nullptr ); // Layer GAIN m_pLayerGainRotary->setValue( 1.0 ); m_pLayerGainLCD->setText( "" ); m_pCompoGainRotary->setValue( 1.0 ); m_pCompoGainLCD->setText( "" ); // Layer PITCH m_pLayerPitchCoarseRotary->setValue( 0.0 ); m_pLayerPitchFineRotary->setValue( 0.0 ); m_pLayerPitchCoarseLCD->setText( "" ); m_pLayerPitchFineLCD->setText( "" ); } } void InstrumentEditor::muteGroupBtnClicked(Button *pRef) { assert( m_pInstrument ); int mute_grp = m_pInstrument->get_mute_group(); if (pRef == m_pAddMuteGroupBtn ) { mute_grp += 1; } else if (pRef == m_pDelMuteGroupBtn ) { mute_grp -= 1; } m_pInstrument->set_mute_group( mute_grp ); selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::onIsStopNoteCheckBoxClicked( bool on ) { m_pInstrument->set_stop_notes( on ); selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::onIsApplyVelocityCheckBoxClicked( bool on ) { assert( m_pInstrument ); m_pInstrument->set_apply_velocity( on ); selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::midiOutChannelBtnClicked(Button *pRef) { assert( m_pInstrument ); if (pRef == m_pAddMidiOutChannelBtn ) { m_pInstrument->set_midi_out_channel( m_pInstrument->get_midi_out_channel() + 1); } else if (pRef == m_pDelMidiOutChannelBtn ) { m_pInstrument->set_midi_out_channel( m_pInstrument->get_midi_out_channel() - 1); } selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::midiOutNoteBtnClicked(Button *pRef) { assert( m_pInstrument ); if (pRef == m_pAddMidiOutNoteBtn ) { m_pInstrument->set_midi_out_note( m_pInstrument->get_midi_out_note() + 1); } else if (pRef == m_pDelMidiOutNoteBtn ) { m_pInstrument->set_midi_out_note( m_pInstrument->get_midi_out_note() - 1); } selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::onClick(Button*) { popCompo->popup( m_pCompoNameLbl->mapToGlobal( QPoint( m_pCompoNameLbl->width() - 40, m_pCompoNameLbl->height() / 2 ) ) ); } void InstrumentEditor::update() { //INFOLOG ( "update: "+toString(items.size()) ); popCompo->clear(); for( int i = 0; i < itemsCompo.size(); i++ ) { if ( itemsCompo.at(i) != "--sep--" ){ popCompo->addAction( itemsCompo.at(i) ); }else{ popCompo->addSeparator(); } } } int InstrumentEditor::findFreeDrumkitComponentId( int startingPoint ) { bool bFoundFreeSlot = true; std::vector* pDrumkitComponentList = Hydrogen::get_instance()->getSong()->get_components(); for (std::vector::iterator it = pDrumkitComponentList->begin() ; it != pDrumkitComponentList->end(); ++it) { DrumkitComponent* pDrumkitComponent = *it; if( pDrumkitComponent->get_id() == startingPoint ) { bFoundFreeSlot = false; break; } } if(bFoundFreeSlot) return startingPoint; else return findFreeDrumkitComponentId( startingPoint + 1 ); } void InstrumentEditor::compoChangeAddDelete(QAction* pAction) { QString sSelectedAction = pAction->text(); Hydrogen * pEngine = Hydrogen::get_instance(); if( sSelectedAction.compare("add") == 0 ) { if ( m_pInstrument ) { bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", tr( "Component name" ), QLineEdit::Normal, "New Component", &bIsOkPressed ); if ( bIsOkPressed ) { DrumkitComponent* pDrumkitComponent = new DrumkitComponent( findFreeDrumkitComponentId(), sNewName ); pEngine->getSong()->get_components()->push_back( pDrumkitComponent ); //InstrumentComponent* instrument_component = new InstrumentComponent( dm_component->get_id() ); //instrument_component->set_gain( 1.0f ); //m_pInstrument->get_components()->push_back( instrument_component ); m_nSelectedComponent = pDrumkitComponent->get_id(); m_pLayerPreview->set_selected_component( pDrumkitComponent->get_id() ); selectedInstrumentChangedEvent(); // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts(pEngine->getSong()); #endif } else { // user entered nothing or pressed Cancel } } } else if( sSelectedAction.compare("delete") == 0 ) { std::vector* pDrumkitComponents = pEngine->getSong()->get_components(); if(pDrumkitComponents->size() == 1){ return; } DrumkitComponent* pDrumkitComponent = pEngine->getSong()->get_component( m_nSelectedComponent ); InstrumentList* pInstruments = pEngine->getSong()->get_instrument_list(); for ( int n = ( int )pInstruments->size() - 1; n >= 0; n-- ) { Instrument* pInstrument = pInstruments->get( n ); for( int o = 0 ; o < pInstrument->get_components()->size() ; o++ ) { InstrumentComponent* pInstrumentComponent = pInstrument->get_components()->at( o ); if( pInstrumentComponent->get_drumkit_componentID() == pDrumkitComponent->get_id() ) { for( int nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { InstrumentLayer* pLayer = pInstrumentComponent->get_layer( nLayer ); if( pLayer ) delete pLayer; } pInstrument->get_components()->erase( pInstrument->get_components()->begin() + o );; break; } } } for ( int n = 0 ; n < pDrumkitComponents->size() ; n++ ) { DrumkitComponent* pTmpDrumkitComponent = pDrumkitComponents->at( n ); if( pTmpDrumkitComponent->get_id() == pDrumkitComponent->get_id() ) { pDrumkitComponents->erase( pDrumkitComponents->begin() + n ); break; } } m_nSelectedComponent = pDrumkitComponents->front()->get_id(); selectedInstrumentChangedEvent(); // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } else if( sSelectedAction.compare("rename") == 0 ) { labelCompoClicked( nullptr ); } else { m_nSelectedComponent = -1; std::vector* pDrumkitComponents = pEngine->getSong()->get_components(); for (std::vector::iterator it = pDrumkitComponents->begin() ; it != pDrumkitComponents->end(); ++it) { DrumkitComponent* pDrumkitComponent = *it; if( pDrumkitComponent->get_name().compare( sSelectedAction ) == 0) { m_nSelectedComponent = pDrumkitComponent->get_id(); m_pCompoNameLbl->setText( pDrumkitComponent->get_name() ); break; } } if( m_pInstrument && !m_pInstrument->get_component(m_nSelectedComponent)) { INFOLOG("Component needs to be added"); InstrumentComponent* pInstrComponent = new InstrumentComponent( m_nSelectedComponent ); pInstrComponent->set_gain( 1.0f ); m_pInstrument->get_components()->push_back( pInstrComponent ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts(pEngine->getSong()); #endif } m_pLayerPreview->set_selected_component(m_nSelectedComponent); selectedInstrumentChangedEvent(); // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } } void InstrumentEditor::rubberbandbpmchangeEvent() { if( !Preferences::get_instance()->getRubberBandBatchMode() /*&& Preferences::get_instance()->__usetimeline */){ //we return also if time-line is activated. this wont work. // INFOLOG( "Tempo change: Recomputing rubberband samples is disabled" ); return; } // INFOLOG( "Tempo change: Recomputing rubberband samples." ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); assert(song); if(song){ InstrumentList *pSongInstrList = song->get_instrument_list(); assert(pSongInstrList); for ( unsigned nInstr = 0; nInstr < pSongInstrList->size(); ++nInstr ) { Instrument *pInstr = pSongInstrList->get( nInstr ); assert( pInstr ); if ( pInstr ){ InstrumentComponent* pInstrumentComponent = pInstr->get_component(m_nSelectedComponent); if (!pInstrumentComponent) { continue; // regular case when you have a new component empty } for ( int nLayer = 0; nLayer < InstrumentComponent::getMaxLayers(); nLayer++ ) { InstrumentLayer *pLayer = pInstrumentComponent->get_layer( nLayer ); if ( pLayer ) { Sample *pSample = pLayer->get_sample(); if ( pSample ) { if( pSample->get_rubberband().use ) { //INFOLOG( QString("Instrument %1 Layer %2" ).arg(nInstr).arg(nLayer)); Sample *pNewSample = Sample::load( pSample->get_filepath(), pSample->get_loops(), pSample->get_rubberband(), *pSample->get_velocity_envelope(), *pSample->get_pan_envelope() ); if( !pNewSample ){ continue; } // insert new sample from newInstrument AudioEngine::get_instance()->lock( RIGHT_HERE ); pLayer->set_sample( pNewSample ); AudioEngine::get_instance()->unlock(); } } } } } } } } void InstrumentEditor::pSampleSelectionChanged( int selected ) { assert( m_pInstrument ); if ( selected == 0 ){ m_pInstrument->set_sample_selection_alg( Instrument::VELOCITY ); } else if ( selected == 1 ){ m_pInstrument->set_sample_selection_alg( Instrument::ROUND_ROBIN ); } else if ( selected == 2){ m_pInstrument->set_sample_selection_alg( Instrument::RANDOM ); } selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::hihatGroupClicked(Button *pRef) { assert( m_pInstrument ); if ( pRef == m_pAddHihatGroupBtn && m_pInstrument->get_hihat_grp() < 32 ){ m_pInstrument->set_hihat_grp( m_pInstrument->get_hihat_grp() + 1 ); } else if ( pRef == m_pDelHihatGroupBtn && m_pInstrument->get_hihat_grp() > -1 ){ m_pInstrument->set_hihat_grp( m_pInstrument->get_hihat_grp() - 1 ); } selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::hihatMinRangeBtnClicked(Button *pRef) { assert( m_pInstrument ); if ( pRef == m_pAddHihatMinRangeBtn && m_pInstrument->get_lower_cc() < 127 ){ m_pInstrument->set_lower_cc( m_pInstrument->get_lower_cc() + 1 ); } else if ( pRef == m_pDelHihatMinRangeBtn && m_pInstrument->get_lower_cc() > 0 ){ m_pInstrument->set_lower_cc( m_pInstrument->get_lower_cc() - 1 ); } selectedInstrumentChangedEvent(); // force an update } void InstrumentEditor::hihatMaxRangeBtnClicked(Button *pRef) { assert( m_pInstrument ); if ( pRef == m_pAddHihatMaxRangeBtn && m_pInstrument->get_higher_cc() < 127 ){ m_pInstrument->set_higher_cc( m_pInstrument->get_higher_cc() + 1); } else if ( pRef == m_pDelHihatMaxRangeBtn && m_pInstrument->get_higher_cc() > 0 ){ m_pInstrument->set_higher_cc( m_pInstrument->get_higher_cc() - 1); } selectedInstrumentChangedEvent(); // force an update } hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/InstrumentEditor.h000066400000000000000000000114311366722712400251750ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 INSTRUMENT_EDITOR_DIALOG_H #define INSTRUMENT_EDITOR_DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include "../EventListener.h" #include "../Widgets/PixmapWidget.h" class Fader; class LCDDisplay; class Button; class ToggleButton; class ClickableLabel; class Rotary; class LCDCombo; class WaveDisplay; class LayerPreview; /// /// Instrument Editor /// class InstrumentEditor : public QWidget, public H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: InstrumentEditor( QWidget* parent ); ~InstrumentEditor(); void selectLayer( int nLayer ); void setFileforLayer(QString filename ); void selectComponent( int nComponent ); // implements EventListener interface virtual void selectedInstrumentChangedEvent(); virtual void rubberbandbpmchangeEvent(); //~ implements EventListener interface void update(); static int findFreeDrumkitComponentId( int startingPoint = 0 ); private slots: void rotaryChanged(Rotary *ref); void filterActiveBtnClicked(Button *ref); void buttonClicked(Button*); void labelClicked( ClickableLabel* pRef ); void labelCompoClicked( ClickableLabel* pRef ); void compoChangeAddDelete(QAction*); void onClick(Button*); void muteGroupBtnClicked(Button *pRef); void onIsStopNoteCheckBoxClicked( bool on ); void onIsApplyVelocityCheckBoxClicked( bool on); void midiOutChannelBtnClicked(Button *pRef); void midiOutNoteBtnClicked(Button *pRef); void hihatGroupClicked(Button *pRef); void hihatMinRangeBtnClicked(Button *pRef); void hihatMaxRangeBtnClicked(Button *pRef); void pSampleSelectionChanged( int ); void waveDisplayDoubleClicked( QWidget *pRef ); private: H2Core::Instrument *m_pInstrument; int m_nSelectedLayer; int m_nSelectedComponent; ToggleButton *m_pShowInstrumentBtn; ToggleButton *m_pShowLayersBtn; // Instrument properties PixmapWidget *m_pInstrumentProp; PixmapWidget *m_pInstrumentPropTop; ClickableLabel *m_pNameLbl; // ADSR Rotary *m_pAttackRotary; Rotary *m_pDecayRotary; Rotary *m_pSustainRotary; Rotary *m_pReleaseRotary; // Random pitch Rotary *m_pRandomPitchRotary; // Low pass filter ToggleButton *m_pFilterBypassBtn; Rotary *m_pCutoffRotary; Rotary *m_pResonanceRotary; // Instrument gain LCDDisplay *m_pInstrumentGainLCD; Rotary *m_pInstrumentGain; QCheckBox *m_pApplyVelocity; // Instrument mute group LCDDisplay *m_pMuteGroupLCD; Button *m_pAddMuteGroupBtn; Button *m_pDelMuteGroupBtn; // Instrument midi out LCDDisplay *m_pMidiOutChannelLCD; Button *m_pAddMidiOutChannelBtn; Button *m_pDelMidiOutChannelBtn; LCDDisplay *m_pMidiOutNoteLCD; Button *m_pAddMidiOutNoteBtn; Button *m_pDelMidiOutNoteBtn; // Instrument hihat LCDDisplay *m_pHihatGroupLCD; Button *m_pAddHihatGroupBtn; Button *m_pDelHihatGroupBtn; LCDDisplay *m_pHihatMinRangeLCD; Button *m_pAddHihatMinRangeBtn; Button *m_pDelHihatMinRangeBtn; LCDDisplay *m_pHihatMaxRangeLCD; Button *m_pAddHihatMaxRangeBtn; Button *m_pDelHihatMaxRangeBtn; //~ Instrument properties // Layer properties LayerPreview *m_pLayerPreview; QScrollArea *m_pLayerScrollArea; PixmapWidget *m_pLayerProp; Rotary *m_pLayerGainRotary; LCDDisplay *m_pLayerGainLCD; Rotary *m_pLayerPitchCoarseRotary; Rotary *m_pLayerPitchFineRotary; LCDDisplay *m_pLayerPitchCoarseLCD; LCDDisplay *m_pLayerPitchFineLCD; //LCDCombo *__pattern_size_combo; LCDCombo *m_sampleSelectionAlg; WaveDisplay *m_pWaveDisplay; Button *m_pLoadLayerBtn; Button *m_pRemoveLayerBtn; Button *m_pSampleEditorBtn; QCheckBox *m_pIsStopNoteCheckBox; //~ Layer properties // Component ClickableLabel *m_pCompoNameLbl; Button *m_buttonDropDownCompo; QStringList itemsCompo; QMenu *popCompo; Rotary *m_pCompoGainRotary; LCDDisplay *m_pCompoGainLCD; //~ Component void loadLayer(); void setAutoVelocity(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/InstrumentEditorPanel.cpp000066400000000000000000000046471366722712400265230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "InstrumentEditorPanel.h" #include "../Skin.h" #include "../HydrogenApp.h" InstrumentEditorPanel* InstrumentEditorPanel::m_pInstance = nullptr; const char* InstrumentEditorPanel::__class_name = "InstrumentEditorPanel"; InstrumentEditorPanel* InstrumentEditorPanel::get_instance() { if ( m_pInstance == nullptr ) { m_pInstance = new InstrumentEditorPanel( nullptr ); } return m_pInstance; } InstrumentEditorPanel::InstrumentEditorPanel( QWidget *pParent ) : Object( __class_name ) { UNUSED( pParent ); INFOLOG( "INIT" ); m_pInstance = this; m_pInstrumentEditor = new InstrumentEditor( nullptr ); // LAYOUT QGridLayout *vbox = new QGridLayout(); vbox->setSpacing( 0 ); vbox->setMargin( 0 ); vbox->addWidget( m_pInstrumentEditor, 0, 0 ); this->setLayout( vbox ); m_nLayer = 0; HydrogenApp::get_instance()->addEventListener(this); } InstrumentEditorPanel::~InstrumentEditorPanel() { INFOLOG( "DESTROY" ); } void InstrumentEditorPanel::parametersInstrumentChangedEvent() { notifyOfDrumkitChange(); } void InstrumentEditorPanel::notifyOfDrumkitChange() { std::vector* pComponentList = H2Core::Hydrogen::get_instance()->getSong()->get_components(); m_pInstrumentEditor->selectComponent(pComponentList->front()->get_id()); m_pInstrumentEditor->selectedInstrumentChangedEvent(); } void InstrumentEditorPanel::selectLayer( int nLayer ) { m_pInstrumentEditor->selectLayer( nLayer ); m_nLayer = nLayer; } hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/InstrumentEditorPanel.h000066400000000000000000000032701366722712400261570ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 INSTRUMENT_EDITOR_PANEL_H #define INSTRUMENT_EDITOR_PANEL_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include "InstrumentEditor.h" #include "../EventListener.h" /// /// Container for the Instrument Editor (Singleton). /// class InstrumentEditorPanel : public QWidget, private H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: static InstrumentEditorPanel* get_instance(); ~InstrumentEditorPanel(); virtual void parametersInstrumentChangedEvent(); void selectLayer( int nLayer ); int getSelectedLayer() { return m_nLayer; } public slots: void notifyOfDrumkitChange(); private: static InstrumentEditorPanel* m_pInstance; InstrumentEditor* m_pInstrumentEditor; int m_nLayer; InstrumentEditorPanel( QWidget *pParent ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/LayerPreview.cpp000066400000000000000000000276521366722712400246430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include #include #include #include #include #include #include #include #include using namespace H2Core; #include "../Skin.h" #include "../HydrogenApp.h" #include "InstrumentEditorPanel.h" #include "LayerPreview.h" const char* LayerPreview::__class_name = "LayerPreview"; LayerPreview::LayerPreview( QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) , m_pInstrument( nullptr ) , m_nSelectedComponent( 0 ) , m_nSelectedLayer( 0 ) , m_bMouseGrab( false ) { setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); setMouseTracking( true ); int w = 276; if( InstrumentComponent::getMaxLayers() > 16) { w = 261; } int h = 20 + m_nLayerHeight * InstrumentComponent::getMaxLayers(); resize( w, h ); m_speakerPixmap.load( Skin::getImagePath() + "/instrumentEditor/speaker.png" ); HydrogenApp::get_instance()->addEventListener( this ); /** * We get a style similar to the one used for the 2 buttons on top of the instrument editor panel */ this->setStyleSheet("font-size: 9px; font-weight: bold;"); } LayerPreview::~ LayerPreview() { //INFOLOG( "DESTROY" ); } void LayerPreview::set_selected_component( int SelectedComponent ) { m_nSelectedComponent = SelectedComponent; } void LayerPreview::paintEvent(QPaintEvent *ev) { QPainter p( this ); p.fillRect( ev->rect(), QColor( 58, 62, 72 ) ); int nLayers = 0; for ( int i = 0; i < InstrumentComponent::getMaxLayers(); i++ ) { if ( m_pInstrument ) { InstrumentComponent* pComponent = m_pInstrument->get_component( m_nSelectedComponent ); if(pComponent) { InstrumentLayer *pLayer = pComponent->get_layer( i ); if ( pLayer ) { nLayers++; } } } } int nLayer = 0; for ( int i = InstrumentComponent::getMaxLayers() - 1; i >= 0; i-- ) { int y = 20 + m_nLayerHeight * i; QString label = "< - >"; if ( m_pInstrument ) { InstrumentComponent* pComponent = m_pInstrument->get_component( m_nSelectedComponent ); if( pComponent ) { InstrumentLayer *pLayer = pComponent->get_layer( i ); if ( pLayer && nLayers > 0 ) { Sample* pSample = pLayer->get_sample(); if( pSample != nullptr) { label = pSample->get_filename(); } int x1 = (int)( pLayer->get_start_velocity() * width() ); int x2 = (int)( pLayer->get_end_velocity() * width() ); int red = (int)( 128.0 / nLayers * nLayer ); int green = (int)( 134.0 / nLayers * nLayer ); int blue = (int)( 152.0 / nLayers * nLayer ); QColor layerColor( red, green, blue ); p.fillRect( x1, 0, x2 - x1, 19, layerColor ); p.setPen( QColor( 230, 230, 230 ) ); p.drawText( x1, 0, x2 - x1, 20, Qt::AlignCenter, QString("%1").arg( i + 1 ) ); if ( m_nSelectedLayer == i ) { p.setPen( QColor( 210, 0, 0 ) ); } p.drawRect( x1, 1, x2 - x1 - 1, 18 ); // bordino in alto // layer view p.fillRect( 0, y, width(), m_nLayerHeight, QColor( 25, 44, 65 ) ); p.fillRect( x1, y, x2 - x1, m_nLayerHeight, QColor( 90, 160, 233 ) ); nLayer++; } else { // layer view p.fillRect( 0, y, width(), m_nLayerHeight, QColor( 59, 73, 96 ) ); } } else { // layer view p.fillRect( 0, y, width(), m_nLayerHeight, QColor( 59, 73, 96 ) ); } } else { // layer view p.fillRect( 0, y, width(), m_nLayerHeight, QColor( 59, 73, 96 ) ); } p.setPen( QColor( 128, 134, 152 ) ); p.drawRect( 0, y, width() - 1, m_nLayerHeight ); p.drawText( 10, y, width() - 10, 20, Qt::AlignLeft, QString( "%1: %2" ).arg( i + 1 ).arg( label ) ); } // selected layer p.setPen( QColor( 210, 0, 0 ) ); int y = 20 + m_nLayerHeight * m_nSelectedLayer; p.drawRect( 0, y, width() - 1, m_nLayerHeight ); } void LayerPreview::selectedInstrumentChangedEvent() { AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != nullptr) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= (int)pInstrList->size() ) { nInstr = -1; } if (nInstr == -1) { m_pInstrument = nullptr; } else { m_pInstrument = pInstrList->get( nInstr ); } } else { m_pInstrument = nullptr; } AudioEngine::get_instance()->unlock(); /* if ( m_pInstrument ) { InstrumentComponent* p_tmpCompo = m_pInstrument->get_component( m_nSelectedComponent ); if(!p_tmpCompo) { for(int i = 0 ; i < InstrumentComponent::getMaxLayers() ; i++) { p_tmpCompo = m_pInstrument->get_component( i ); if(p_tmpCompo) { m_nSelectedComponent = i; break; } } } } */ // select the last valid layer if ( m_pInstrument ) { for (int i = InstrumentComponent::getMaxLayers() - 1; i >= 0; i-- ) { InstrumentComponent* p_compo = m_pInstrument->get_component( m_nSelectedComponent ); if ( p_compo ) { if ( p_compo->get_layer( i ) ) { m_nSelectedLayer = i; break; } } else { m_nSelectedLayer = 0; } } } else { m_nSelectedLayer = 0; } update(); } void LayerPreview::mouseReleaseEvent(QMouseEvent *ev) { m_bMouseGrab = false; setCursor( QCursor( Qt::ArrowCursor ) ); /* * We want the tooltip to still show if mouse pointer * is over an active layer's boundary */ InstrumentComponent *pCompo = m_pInstrument->get_component( m_nSelectedComponent ); if ( pCompo ) { InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { int x1 = (int)( pLayer->get_start_velocity() * width() ); int x2 = (int)( pLayer->get_end_velocity() * width() ); if ( ( ev->x() < x1 + 5 ) && ( ev->x() > x1 - 5 ) ){ setCursor( QCursor( Qt::SizeHorCursor ) ); showLayerStartVelocity(pLayer, ev); } else if ( ( ev->x() < x2 + 5 ) && ( ev->x() > x2 - 5 ) ) { setCursor( QCursor( Qt::SizeHorCursor ) ); showLayerEndVelocity(pLayer, ev); } } } } void LayerPreview::mousePressEvent(QMouseEvent *ev) { const unsigned nPosition = 0; const float fPan_L = 0.5f; const float fPan_R = 0.5f; const int nLength = -1; const float fPitch = 0.0f; if ( !m_pInstrument ) { return; } if ( ev->y() < 20 ) { float fVelocity = (float)ev->x() / (float)width(); Note * pNote = new Note( m_pInstrument, nPosition, fVelocity, fPan_L, fPan_R, nLength, fPitch ); pNote->set_specific_compo_id( m_nSelectedComponent ); AudioEngine::get_instance()->get_sampler()->note_on(pNote); for ( int i = 0; i < InstrumentComponent::getMaxLayers(); i++ ) { InstrumentComponent *pCompo = m_pInstrument->get_component(m_nSelectedComponent); if(pCompo){ InstrumentLayer *pLayer = pCompo->get_layer( i ); if ( pLayer ) { if ( ( fVelocity > pLayer->get_start_velocity()) && ( fVelocity < pLayer->get_end_velocity() ) ) { if ( i != m_nSelectedLayer ) { m_nSelectedLayer = i; update(); InstrumentEditorPanel::get_instance()->selectLayer( m_nSelectedLayer ); } break; } } } } } else { m_nSelectedLayer = ( ev->y() - 20 ) / m_nLayerHeight; update(); InstrumentEditorPanel::get_instance()->selectLayer( m_nSelectedLayer ); InstrumentComponent *pCompo = m_pInstrument->get_component(m_nSelectedComponent); if(pCompo) { InstrumentLayer *pLayer = pCompo->get_layer( m_nSelectedLayer ); if ( pLayer ) { Note *note = new Note( m_pInstrument , nPosition, m_pInstrument->get_component(m_nSelectedComponent)->get_layer( m_nSelectedLayer )->get_end_velocity() - 0.01, fPan_L, fPan_R, nLength, fPitch ); note->set_specific_compo_id( m_nSelectedComponent ); AudioEngine::get_instance()->get_sampler()->note_on(note); int x1 = (int)( pLayer->get_start_velocity() * width() ); int x2 = (int)( pLayer->get_end_velocity() * width() ); if ( ( ev->x() < x1 + 5 ) && ( ev->x() > x1 - 5 ) ){ setCursor( QCursor( Qt::SizeHorCursor ) ); m_bGrabLeft = true; m_bMouseGrab = true; showLayerStartVelocity(pLayer, ev); } else if ( ( ev->x() < x2 + 5 ) && ( ev->x() > x2 - 5 ) ){ setCursor( QCursor( Qt::SizeHorCursor ) ); m_bGrabLeft = false; m_bMouseGrab = true; showLayerEndVelocity(pLayer, ev); } else { setCursor( QCursor( Qt::ArrowCursor ) ); } } } } } void LayerPreview::mouseMoveEvent( QMouseEvent *ev ) { if ( !m_pInstrument ) { return; } int x = ev->pos().x(); int y = ev->pos().y(); float fVel = (float)x / (float)width(); if (fVel < 0 ) { fVel = 0; } else if (fVel > 1) { fVel = 1; } if ( y < 20 ) { setCursor( QCursor( m_speakerPixmap ) ); return; } if ( m_bMouseGrab ) { InstrumentLayer *pLayer = m_pInstrument->get_component( m_nSelectedComponent )->get_layer( m_nSelectedLayer ); if ( pLayer ) { if ( m_bMouseGrab ) { if ( m_bGrabLeft ) { if ( fVel < pLayer->get_end_velocity()) { pLayer->set_start_velocity( fVel ); showLayerStartVelocity( pLayer, ev ); } } else { if ( fVel > pLayer->get_start_velocity()) { pLayer->set_end_velocity( fVel ); showLayerEndVelocity( pLayer, ev ); } } update(); } } } else { m_nSelectedLayer = ( ev->y() - 20 ) / m_nLayerHeight; if ( m_nSelectedLayer < InstrumentComponent::getMaxLayers() ) { InstrumentComponent* pComponent = m_pInstrument->get_component(m_nSelectedComponent); if( pComponent ){ InstrumentLayer *pLayer = pComponent->get_layer( m_nSelectedLayer ); if ( pLayer ) { int x1 = (int)( pLayer->get_start_velocity() * width() ); int x2 = (int)( pLayer->get_end_velocity() * width() ); if ( ( x < x1 + 5 ) && ( x > x1 - 5 ) ){ setCursor( QCursor( Qt::SizeHorCursor ) ); showLayerStartVelocity(pLayer, ev); } else if ( ( x < x2 + 5 ) && ( x > x2 - 5 ) ){ setCursor( QCursor( Qt::SizeHorCursor ) ); showLayerEndVelocity(pLayer, ev); } else { setCursor( QCursor( Qt::ArrowCursor ) ); QToolTip::hideText(); } } else { setCursor( QCursor( Qt::ArrowCursor ) ); QToolTip::hideText(); } } else { setCursor( QCursor( Qt::ArrowCursor ) ); QToolTip::hideText(); } } } } void LayerPreview::updateAll() { update(); } int LayerPreview::getMidiVelocityFromRaw( const float raw ) { return static_cast (raw * 127); } void LayerPreview::showLayerStartVelocity( const InstrumentLayer* pLayer, const QMouseEvent* pEvent ) { const float fVelo = pLayer->get_start_velocity(); QToolTip::showText( pEvent->globalPos(), tr( "Dec. = %1\nMIDI = %2" ) .arg( QString::number( fVelo, 'f', 2) ) .arg( getMidiVelocityFromRaw( fVelo ) +1 ), this); } void LayerPreview::showLayerEndVelocity( const InstrumentLayer* pLayer, const QMouseEvent* pEvent ) { const float fVelo = pLayer->get_end_velocity(); QToolTip::showText( pEvent->globalPos(), tr( "Dec. = %1\nMIDI = %2" ) .arg( QString::number( fVelo, 'f', 2) ) .arg( getMidiVelocityFromRaw( fVelo ) +1 ), this); } hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/LayerPreview.h000066400000000000000000000050621366722712400242770ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LAYER_PREVIEW_H #define LAYER_PREVIEW_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include "../EventListener.h" namespace H2Core { class InstrumentLayer; } using H2Core::InstrumentLayer; class LayerPreview : public QWidget, public H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: LayerPreview(QWidget* pParent); ~LayerPreview(); void updateAll(); void paintEvent(QPaintEvent *ev); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void mouseMoveEvent ( QMouseEvent *ev ); void set_selected_component( int SelectedComponent ); private: static const int m_nLayerHeight = 10; QPixmap m_speakerPixmap; H2Core::Instrument * m_pInstrument; int m_nSelectedLayer; int m_nSelectedComponent; bool m_bMouseGrab; bool m_bGrabLeft; /** * convert a raw velocity value (0.0 to 1.0) * into a MIDI velocity value (0 to 127) * * @param raw Raw velocity value * @return MIDI velocity value */ int getMidiVelocityFromRaw( const float raw ); /** * display a layer's start velocity in a tooltip * * @param pLayer The layer * @param pEvent The event carrying mouse position */ void showLayerStartVelocity( const InstrumentLayer* pLayer, const QMouseEvent* pEvent ); /** * display a layer's end velocity in a tooltip * * @param pLayer The layer * @param pEvent The event carrying mouse position */ void showLayerEndVelocity( const InstrumentLayer* pLayer, const QMouseEvent* pEvent ); virtual void selectedInstrumentChangedEvent(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/WaveDisplay.cpp000066400000000000000000000101721366722712400244420ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include "WaveDisplay.h" #include "../Skin.h" const char* WaveDisplay::__class_name = "WaveDisplay"; WaveDisplay::WaveDisplay(QWidget* pParent) : QWidget( pParent ) , Object( __class_name ) , m_nCurrentWidth( 0 ) , m_sSampleName( "-" ) , m_pLayer( nullptr ) , m_SampleNameAlignment( Qt::AlignCenter ) { setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); bool ok = m_Background.load( Skin::getImagePath() + "/waveDisplay/bgsamplewavedisplay.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } m_pPeakData = new int[ width() ]; memset( m_pPeakData, 0, width() * sizeof( m_pPeakData[0] ) ); } WaveDisplay::~WaveDisplay() { //INFOLOG( "DESTROY" ); delete[] m_pPeakData; } void WaveDisplay::paintEvent( QPaintEvent *ev ) { UNUSED(ev); QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing ); QBrush brush = QBrush(Qt::red, m_Background); brush.setStyle(Qt::TexturePattern); painter.setBrush(brush); painter.drawRect(0, 0, width(), height()); if( m_pLayer ){ painter.setPen( QColor( 102, 150, 205 ) ); int VCenter = height() / 2; for ( int x = 0; x < width(); x++ ) { painter.drawLine( x, VCenter, x, m_pPeakData[x] + VCenter ); painter.drawLine( x, VCenter, x, -m_pPeakData[x] + VCenter ); } } QFont font; font.setWeight( 63 ); painter.setFont( font ); painter.setPen( QColor( 255 , 255, 255, 200 ) ); if( m_SampleNameAlignment == Qt::AlignCenter ){ painter.drawText( 0, 0, width(), 20, m_SampleNameAlignment, m_sSampleName ); } else if( m_SampleNameAlignment == Qt::AlignLeft ) { // Use a small offnset iso. starting directly at the left border painter.drawText( 20, 0, width(), 20, m_SampleNameAlignment, m_sSampleName ); } } void WaveDisplay::resizeEvent( QResizeEvent * event ) { updateDisplay(m_pLayer); } void WaveDisplay::updateDisplay( H2Core::InstrumentLayer *pLayer ) { int currentWidth = width(); if(!pLayer || currentWidth <= 0){ m_pLayer = nullptr; m_sSampleName = "-"; return; } if(currentWidth != m_nCurrentWidth){ delete[] m_pPeakData; m_pPeakData = new int[ currentWidth ]; m_nCurrentWidth = currentWidth; } if ( pLayer && pLayer->get_sample() ) { m_pLayer = pLayer; m_sSampleName = pLayer->get_sample()->get_filename(); //INFOLOG( "[updateDisplay] sample: " + m_sSampleName ); int nSampleLength = pLayer->get_sample()->get_frames(); int nScaleFactor = nSampleLength / m_nCurrentWidth; float fGain = height() / 2.0 * pLayer->get_gain(); float *pSampleData = pLayer->get_sample()->get_data_l(); int nSamplePos =0; int nVal; for ( int i = 0; i < width(); ++i ){ nVal = 0; for ( int j = 0; j < nScaleFactor; ++j ) { if ( j < nSampleLength ) { int newVal = (int)( pSampleData[ nSamplePos ] * fGain ); if ( newVal > nVal ) { nVal = newVal; } } ++nSamplePos; } m_pPeakData[ i ] = nVal; } } else { m_sSampleName = "-"; for ( int i =0; i < m_nCurrentWidth; ++i ){ m_pPeakData[ i ] = 0; } } update(); } void WaveDisplay::mouseDoubleClickEvent(QMouseEvent *ev) { if (ev->button() == Qt::LeftButton) { emit doubleClicked(this); } } hydrogen-1.0.0-rc1/src/gui/src/InstrumentEditor/WaveDisplay.h000066400000000000000000000035711366722712400241140ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 WAVE_DISPLAY #define WAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include namespace H2Core { class InstrumentLayer; } class WaveDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: WaveDisplay(QWidget* pParent); ~WaveDisplay(); virtual void updateDisplay( H2Core::InstrumentLayer *pLayer ); void paintEvent( QPaintEvent *ev ); void resizeEvent( QResizeEvent * event ); void mouseDoubleClickEvent(QMouseEvent *ev); void setSampleNameAlignment(Qt::AlignmentFlag flag); signals: void doubleClicked(QWidget *pWidget); protected: Qt::AlignmentFlag m_SampleNameAlignment; QPixmap m_Background; QString m_sSampleName; int * m_pPeakData; /* * Used to re-initialise m_pPeakData if width has changed */ int m_nCurrentWidth; H2Core::InstrumentLayer * m_pLayer; }; inline void WaveDisplay::setSampleNameAlignment(Qt::AlignmentFlag flag) { m_SampleNameAlignment = flag; } #endif hydrogen-1.0.0-rc1/src/gui/src/InstrumentRack.cpp000066400000000000000000000075051366722712400216520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "InstrumentRack.h" #include "Skin.h" #include "Widgets/Button.h" #include "InstrumentEditor/InstrumentEditorPanel.h" #include "SoundLibrary/SoundLibraryPanel.h" #include const char* InstrumentRack::__class_name = "InstrumentRack"; InstrumentRack::InstrumentRack( QWidget *pParent ) : QWidget( pParent ) , Object( __class_name ) { INFOLOG( "INIT" ); resize( 290, 405 ); setMinimumSize( width(), height() ); setFixedWidth( width() ); // TAB buttons QWidget *pTabButtonsPanel = new QWidget( nullptr ); pTabButtonsPanel->setFixedHeight( 24 ); pTabButtonsPanel->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // instrument editor button m_pShowInstrumentEditorBtn = new ToggleButton( pTabButtonsPanel, "/instrumentEditor/instrument_show_on.png", "/instrumentEditor/instrument_show_off.png", "/instrumentEditor/instrument_show_off.png", QSize( 130, 24 ) ); m_pShowInstrumentEditorBtn->setToolTip( tr( "Show Instrument editor" ) ); m_pShowInstrumentEditorBtn->setText( tr( "Instrument" ) ); connect( m_pShowInstrumentEditorBtn, SIGNAL( clicked( Button* ) ), this, SLOT( on_showInstrumentEditorBtnClicked() ) ); // show sound library button m_pShowSoundLibraryBtn = new ToggleButton( pTabButtonsPanel, "/instrumentEditor/library_show_on.png", "/instrumentEditor/library_show_off.png", "/instrumentEditor/library_show_off.png", QSize( 150, 24 ) ); m_pShowSoundLibraryBtn->setToolTip( tr( "Show sound library" ) ); m_pShowSoundLibraryBtn->setText( tr( "Sound library" ) ); connect( m_pShowSoundLibraryBtn, SIGNAL( clicked( Button* ) ), this, SLOT( on_showSoundLibraryBtnClicked() ) ); QHBoxLayout *pTabHBox = new QHBoxLayout(); pTabHBox->setSpacing( 0 ); pTabHBox->setMargin( 0 ); pTabHBox->addWidget( m_pShowInstrumentEditorBtn ); pTabHBox->addWidget( m_pShowSoundLibraryBtn ); pTabButtonsPanel->setLayout( pTabHBox ); //~ TAB buttons InstrumentEditorPanel::get_instance()->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); m_pSoundLibraryPanel = new SoundLibraryPanel( nullptr, false ); // LAYOUT QGridLayout *pGrid = new QGridLayout(); pGrid->setSpacing( 0 ); pGrid->setMargin( 0 ); pGrid->addWidget( pTabButtonsPanel, 0, 0, 1, 3 ); pGrid->addWidget( InstrumentEditorPanel::get_instance(), 2, 1 ); pGrid->addWidget( m_pSoundLibraryPanel, 2, 1 ); this->setLayout( pGrid ); on_showInstrumentEditorBtnClicked(); // show the instrument editor as default } InstrumentRack::~InstrumentRack() { INFOLOG( "DESTROY" ); } void InstrumentRack::on_showSoundLibraryBtnClicked() { m_pShowSoundLibraryBtn->setPressed( true ); m_pShowInstrumentEditorBtn->setPressed( false ); m_pSoundLibraryPanel->show(); InstrumentEditorPanel::get_instance()->hide(); } void InstrumentRack::on_showInstrumentEditorBtnClicked() { m_pShowInstrumentEditorBtn->setPressed( true ); m_pShowSoundLibraryBtn->setPressed( false ); InstrumentEditorPanel::get_instance()->show(); m_pSoundLibraryPanel->hide(); } hydrogen-1.0.0-rc1/src/gui/src/InstrumentRack.h000066400000000000000000000031441366722712400213120ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 INSTRUMENT_RACK_H #define INSTRUMENT_RACK_H #include #include #if QT_VERSION >= 0x050000 # include #endif class ToggleButton; class SoundLibraryPanel; class InstrumentRack : public QWidget, private H2Core::Object { H2_OBJECT Q_OBJECT public: InstrumentRack( QWidget *pParent ); ~InstrumentRack(); SoundLibraryPanel* getSoundLibraryPanel() { return m_pSoundLibraryPanel; } private slots: void on_showSoundLibraryBtnClicked(); void on_showInstrumentEditorBtnClicked(); private: /// button for showing the Sound Library ToggleButton *m_pShowSoundLibraryBtn; /// button for showing the Instrument Editor ToggleButton *m_pShowInstrumentEditorBtn; SoundLibraryPanel* m_pSoundLibraryPanel; }; #endif hydrogen-1.0.0-rc1/src/gui/src/LadspaFXProperties.cpp000066400000000000000000000315371366722712400224220ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "LadspaFXProperties.h" #include "HydrogenApp.h" #include "LadspaFXSelector.h" #include "Skin.h" #include "Widgets/Fader.h" #include "Widgets/LCD.h" #include "Mixer/Mixer.h" #include "Mixer/MixerLine.h" using namespace std; using namespace H2Core; const char* LadspaFXProperties::__class_name = "LadspaFXProperties"; LadspaFXProperties::LadspaFXProperties(QWidget* parent, uint nLadspaFX) : QWidget( parent ) , Object( __class_name ) { // INFOLOG( "INIT" ); m_nLadspaFX = nLadspaFX; resize( 500, 200 ); setMinimumSize( width(), height() ); setFixedHeight( height() ); QHBoxLayout *hbox = new QHBoxLayout(); hbox->setSpacing( 0 ); hbox->setMargin( 0 ); setLayout( hbox ); // Background image QPixmap background; bool ok = background.load( Skin::getImagePath() + "/mixerPanel/mixer_background.png" ); if( !ok ){ ERRORLOG( "Error loading pixmap" ); } m_pScrollArea = new QScrollArea( nullptr ); hbox->addWidget( m_pScrollArea ); m_pScrollArea->move( 0, 0 ); m_pScrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pScrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pScrollArea->resize( width(), height() ); m_pFrame = new QFrame( this ); m_pFrame->resize( width(), height() ); m_pScrollArea->setWidget( m_pFrame ); m_pNameLbl = new QLabel(this); m_pNameLbl->move( 10, 10 ); m_pNameLbl->resize( 270, 24 ); QFont boldFont; boldFont.setBold(true); m_pNameLbl->setFont( boldFont ); m_pSelectFXBtn = new QPushButton( tr("Select FX"), this); m_pSelectFXBtn->move( 170, 10 ); m_pSelectFXBtn->resize( 100, 24 ); connect( m_pSelectFXBtn, SIGNAL(clicked()), this, SLOT(selectFXBtnClicked()) ); m_pRemoveFXBtn = new QPushButton( tr("Remove FX"), this); m_pRemoveFXBtn->move( 280, 10 ); m_pRemoveFXBtn->resize( 100, 24 ); connect( m_pRemoveFXBtn, SIGNAL(clicked()), this, SLOT(removeFXBtnClicked()) ); m_pActivateBtn = new QPushButton( tr("Activate"), this); m_pActivateBtn->move( 390, 10 ); m_pActivateBtn->resize( 100, 24 ); connect( m_pActivateBtn, SIGNAL(clicked()), this, SLOT(activateBtnClicked()) ); m_pTimer = new QTimer( this ); connect(m_pTimer, SIGNAL( timeout() ), this, SLOT( updateOutputControls() ) ); } LadspaFXProperties::~LadspaFXProperties() { // INFOLOG( "DESTROY" ); } void LadspaFXProperties::showEvent ( QShowEvent* ) { updateControls(); } void LadspaFXProperties::closeEvent( QCloseEvent *ev ) { ev->accept(); } void LadspaFXProperties::faderChanged( Fader * ref ) { ref->setPeak_L( ref->getValue() ); ref->setPeak_R( ref->getValue() ); Song *pSong = (Hydrogen::get_instance() )->getSong(); #ifdef H2CORE_HAVE_LADSPA LadspaFX *pFX = Effects::get_instance()->getLadspaFX( m_nLadspaFX ); for ( uint i = 0; i < m_pInputControlFaders.size(); i++ ) { if (ref == m_pInputControlFaders[ i ] ) { LadspaControlPort *pControl = pFX->inputControlPorts[ i ]; pControl->fControlValue = ref->getValue(); //float fInterval = pControl->fUpperBound - pControl->fLowerBound; //pControl->fControlValue = pControl->fLowerBound + fValue * fInterval; QString sValue; if (pControl->fControlValue < 1.0 ) { sValue = QString("%1").arg( pControl->fControlValue, 0, 'f', 2 ); } else if ( pControl->fControlValue < 100.0 ) { sValue = QString("%1").arg( pControl->fControlValue, 0, 'f', 1 ); } else { sValue = QString("%1").arg( pControl->fControlValue, 0, 'f', 0 ); } m_pInputControlLabel[ i ]->setText( sValue ); } } pSong->set_is_modified( true ); #endif } void LadspaFXProperties::updateControls() { #ifdef H2CORE_HAVE_LADSPA INFOLOG( "*** [updateControls] ***" ); m_pTimer->stop(); LadspaFX *pFX = Effects::get_instance()->getLadspaFX( m_nLadspaFX ); // svuoto i vettori.. if ( m_pInputControlNames.size() != 0 ) { for (uint i = 0; i < m_pInputControlNames.size(); i++) { delete m_pInputControlNames[ i ]; } m_pInputControlNames.clear(); } if ( m_pInputControlLabel.size() != 0 ) { for (uint i = 0; i < m_pInputControlLabel.size(); i++) { delete m_pInputControlLabel[ i ]; } m_pInputControlLabel.clear(); } if ( m_pInputControlFaders.size() != 0 ) { for (uint i = 0; i < m_pInputControlFaders.size(); i++) { delete m_pInputControlFaders[ i ]; } m_pInputControlFaders.clear(); } if ( m_pOutputControlFaders.size() != 0 ) { for (uint i = 0; i < m_pOutputControlFaders.size(); i++) { delete m_pOutputControlFaders[ i ]; } m_pOutputControlFaders.clear(); } if ( m_pOutputControlNames.size() != 0 ) { for (uint i = 0; i < m_pOutputControlNames.size(); i++) { delete m_pOutputControlNames[ i ]; } m_pOutputControlNames.clear(); } if (pFX) { QString sPluginName = pFX->getPluginLabel(); setWindowTitle( tr( "[%1] LADSPA FX Properties" ).arg( sPluginName ) ); int nControlsFrameWidth = 10 + 45 * (pFX->inputControlPorts.size() + pFX->outputControlPorts.size()) + 10 + 45; if ( nControlsFrameWidth < width() ) { nControlsFrameWidth = width(); } m_pFrame->resize( nControlsFrameWidth, height() ); m_pActivateBtn->setEnabled(true); if (pFX->isEnabled()) { m_pActivateBtn->setText( tr("Deactivate") ); } else { m_pActivateBtn->setText( tr("Activate") ); } QString mixerline_text_path = Skin::getImagePath() + "/mixerPanel/mixer_background.png"; QPixmap textBackground; if( textBackground.load( mixerline_text_path ) == false ){ ERRORLOG( "Error loading pixmap" ); } // input controls uint nInputControl_X = 0; for (uint i = 0; i < pFX->inputControlPorts.size(); i++) { LadspaControlPort *pControlPort = pFX->inputControlPorts[ i ]; nInputControl_X = 10 + 45 * i; if (pControlPort->isToggle){ // toggle button WARNINGLOG( "[updateControls] LADSPA toggle controls not implemented yet"); } // peak volume label QString sValue; if (pControlPort->fControlValue < 1.0 ) { sValue = QString("%1").arg( pControlPort->fControlValue, 0, 'f', 2); } else if ( pControlPort->fControlValue < 100.0 ) { sValue = QString("%1").arg( pControlPort->fControlValue, 0, 'f', 1); } else { sValue = QString("%1").arg( pControlPort->fControlValue, 0, 'f', 0); } LCDDisplay *pLCD = new LCDDisplay( m_pFrame, LCDDigit::SMALL_BLUE, 4 ); pLCD->move( nInputControl_X, 40 ); pLCD->setText( sValue ); pLCD->show(); QPalette lcdPalette; lcdPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); pLCD->setPalette( lcdPalette ); m_pInputControlLabel.push_back( pLCD ); InstrumentNameWidget *pName = new InstrumentNameWidget( m_pFrame ); pName->move( nInputControl_X, 60 ); pName->show(); pName->setText( pControlPort->sName ); m_pInputControlNames.push_back( pName ); pName->setToolTip( pName->text() ); // fader Fader *pFader = new Fader( m_pFrame, pControlPort->m_bIsInteger, false ); connect( pFader, SIGNAL( valueChanged(Fader*) ), this, SLOT( faderChanged(Fader*) ) ); m_pInputControlFaders.push_back( pFader ); pFader->move( nInputControl_X + 20, 60 ); pFader->show(); pFader->setMaxValue( pControlPort->fUpperBound ); pFader->setMinValue( pControlPort->fLowerBound ); pFader->setMaxPeak( pControlPort->fUpperBound ); pFader->setMinPeak( pControlPort->fLowerBound ); pFader->setValue( pControlPort->fControlValue ); pFader->setPeak_L( pControlPort->fControlValue ); pFader->setPeak_R( pControlPort->fControlValue ); pFader->setDefaultValue( pControlPort->fDefaultValue ); //float fInterval = pControlPort->fUpperBound - pControlPort->fLowerBound; //float fValue = ( pControlPort->fControlValue - pControlPort->fLowerBound ) / fInterval; //pFader->setValue( fValue ); //pFader->setPeak_L( fValue ); //pFader->setPeak_R( fValue ); faderChanged( pFader ); m_pNameLbl->setText( pFX->getPluginName() ); } nInputControl_X += 45; for (uint i = 0; i < pFX->outputControlPorts.size(); i++) { LadspaControlPort *pControl = pFX->outputControlPorts[ i ]; uint xPos = nInputControl_X + 10 + 45 * i; InstrumentNameWidget *pName = new InstrumentNameWidget( m_pFrame ); pName->move( xPos, 60 ); pName->show(); pName->setText( pControl->sName ); m_pInputControlNames.push_back( pName ); pName->setToolTip( pName->text() ); // fader Fader *pFader = new Fader( m_pFrame, true, true ); // without knob! pFader->move( xPos + 20, 60 ); //float fInterval = pControl->fUpperBound - pControl->fLowerBound; //float fValue = pControl->fControlValue / fInterval; pFader->show(); pFader->setMaxValue( pControl->fUpperBound ); pFader->setMinValue( pControl->fLowerBound ); pFader->setMaxPeak( pControl->fUpperBound ); pFader->setMinPeak( pControl->fLowerBound ); pFader->setValue( pControl->fControlValue ); pFader->setPeak_L( pControl->fControlValue ); pFader->setPeak_R( pControl->fControlValue ); pFader->setDefaultValue( pControl->fDefaultValue ); m_pOutputControlFaders.push_back( pFader ); } } else { INFOLOG( "NULL PLUGIN" ); setWindowTitle( tr( "LADSPA FX %1 Properties" ).arg( m_nLadspaFX) ); m_pNameLbl->setText( tr("No plugin") ); m_pActivateBtn->setEnabled(false); } m_pTimer->start(100); #endif } void LadspaFXProperties::selectFXBtnClicked() { #ifdef H2CORE_HAVE_LADSPA LadspaFXSelector fxSelector(m_nLadspaFX); if (fxSelector.exec() == QDialog::Accepted) { QString sSelectedFX = fxSelector.getSelectedFX(); if ( !sSelectedFX.isEmpty() ) { LadspaFX *pFX = nullptr; vector pluginList = Effects::get_instance()->getPluginList(); for (uint i = 0; i < pluginList.size(); i++) { H2Core::LadspaFXInfo *pFXInfo = pluginList[i]; if (pFXInfo->m_sName == sSelectedFX ) { int nSampleRate = Hydrogen::get_instance()->getAudioOutput()->getSampleRate(); pFX = LadspaFX::load( pFXInfo->m_sFilename, pFXInfo->m_sLabel, nSampleRate ); pFX->setEnabled( true ); break; } } Song *pSong = (Hydrogen::get_instance() )->getSong(); pSong->set_is_modified(true); Effects::get_instance()->setLadspaFX( pFX, m_nLadspaFX ); //AudioEngine::get_instance()->unlock(); Hydrogen::get_instance()->restartLadspaFX(); updateControls(); } else { // no plugin selected INFOLOG( "no plugin selected" ); } } #endif } void LadspaFXProperties::removeFXBtnClicked() { #ifdef H2CORE_HAVE_LADSPA Song *pSong = (Hydrogen::get_instance() )->getSong(); pSong->set_is_modified( true ); Effects::get_instance()->setLadspaFX( nullptr, m_nLadspaFX ); Hydrogen::get_instance()->restartLadspaFX(); updateControls(); #endif } void LadspaFXProperties::updateOutputControls() { #ifdef H2CORE_HAVE_LADSPA // INFOLOG( "[updateOutputControls]" ); // Song *pSong = (Hydrogen::get_instance() )->getSong(); LadspaFX *pFX = Effects::get_instance()->getLadspaFX(m_nLadspaFX); if (pFX) { m_pActivateBtn->setEnabled(true); if (pFX->isEnabled()) { m_pActivateBtn->setText( tr("Deactivate") ); } else { m_pActivateBtn->setText( tr("Activate") ); } for (uint i = 0; i < pFX->outputControlPorts.size(); i++) { LadspaControlPort *pControl = pFX->outputControlPorts[i]; vector::iterator it = m_pOutputControlFaders.begin() + i; if (it != m_pOutputControlFaders.end() ) { Fader *pFader = *it; if (pFader == nullptr) { ERRORLOG( "[updateOutputControls] pFader = NULL" ); continue; } float fValue = pControl->fControlValue; float fInterval = pControl->fUpperBound - pControl->fLowerBound; fValue = pControl->fControlValue / fInterval; if (fValue < 0) fValue = -fValue; pFader->setPeak_L( fValue ); pFader->setPeak_R( fValue ); } } } else { m_pActivateBtn->setEnabled(false); } #endif } void LadspaFXProperties::activateBtnClicked() { #ifdef H2CORE_HAVE_LADSPA // Song *pSong = (Hydrogen::get_instance() )->getSong(); LadspaFX *pFX = Effects::get_instance()->getLadspaFX(m_nLadspaFX); if (pFX) { AudioEngine::get_instance()->lock( RIGHT_HERE ); pFX->setEnabled( !pFX->isEnabled() ); AudioEngine::get_instance()->unlock(); } #endif } hydrogen-1.0.0-rc1/src/gui/src/LadspaFXProperties.h000066400000000000000000000037741366722712400220710ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LADSPA_FX_PROPERTIES_H #define LADSPA_FX_PROPERTIES_H #include #include #if QT_VERSION >= 0x050000 # include #endif #include class Fader; class LCDDisplay; class InstrumentNameWidget; class LadspaFXProperties : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: LadspaFXProperties(QWidget* parent, uint nLadspaFX); ~LadspaFXProperties(); void updateControls(); void showEvent ( QShowEvent *ev ); void closeEvent( QCloseEvent *ev ); public slots: void faderChanged( Fader* ref ); void selectFXBtnClicked(); void removeFXBtnClicked(); void activateBtnClicked(); void updateOutputControls(); private: uint m_nLadspaFX; QLabel *m_pNameLbl; std::vector m_pInputControlFaders; std::vector m_pInputControlNames; std::vector m_pInputControlLabel; std::vector m_pOutputControlFaders; std::vector m_pOutputControlNames; QScrollArea* m_pScrollArea; QFrame* m_pFrame; QPushButton *m_pSelectFXBtn; QPushButton *m_pActivateBtn; QPushButton *m_pRemoveFXBtn; QTimer* m_pTimer; }; #endif hydrogen-1.0.0-rc1/src/gui/src/LadspaFXSelector.cpp000066400000000000000000000174001366722712400220370ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "LadspaFXSelector.h" #include "HydrogenApp.h" #include "Skin.h" #include #include #include #include #include using namespace std; using namespace H2Core; const char* LadspaFXSelector::__class_name = "LadspaFXSelector"; LadspaFXSelector::LadspaFXSelector(int nLadspaFX) : QDialog( nullptr ) , Object( __class_name ) , m_pCurrentItem( nullptr ) { //INFOLOG( "INIT" ); setupUi( this ); setFixedSize( width(), height() ); setWindowTitle( tr( "Select LADSPA FX" ) ); m_sSelectedPluginName = ""; m_nameLbl->setText( QString("") ); m_labelLbl->setText( QString("") ); m_typeLbl->setText( QString("") ); m_pIDLbl->setText( QString("") ); m_pMakerLbl->setText( QString("") ); m_pCopyrightLbl->setText( QString("") ); m_pPluginsListBox->clear(); m_pOkBtn->setEnabled(false); m_pGroupsListView->setHeaderLabels( QStringList( tr( "Groups" ) ) ); #ifdef H2CORE_HAVE_LADSPA //Song *pSong = Hydrogen::get_instance()->getSong(); LadspaFX *pFX = Effects::get_instance()->getLadspaFX(nLadspaFX); if (pFX) { m_sSelectedPluginName = pFX->getPluginName(); } buildLadspaGroups(); m_pGroupsListView->headerItem()->setHidden( true ); // LadspaFXGroup* pFXGroup = LadspaFX::getLadspaFXGroup(); // vector list = findPluginsInGroup( m_sSelectedPluginName, pFXGroup ); // for (uint i = 0; i < list.size(); i++) { // m_pPluginsListBox->addItem( list[i]->m_sName.c_str() ); // } #endif connect( m_pPluginsListBox, SIGNAL( itemSelectionChanged () ), this, SLOT( pluginSelected() ) ); pluginSelected(); // on_m_pGroupsListView_currentItemChanged( m_pGroupsListView->currentItem(), NULL ); } LadspaFXSelector::~LadspaFXSelector() { //INFOLOG( "DESTROY" ); } void LadspaFXSelector::buildLadspaGroups() { #ifdef H2CORE_HAVE_LADSPA m_pGroupsListView->clear(); H2Core::LadspaFXGroup* pFXGroup = Effects::get_instance()->getLadspaFXGroup(); if(pFXGroup) { for (uint i = 0; i < pFXGroup->getChildList().size(); i++) { H2Core::LadspaFXGroup *pNewGroup = ( pFXGroup->getChildList() )[ i ]; addGroup( m_pGroupsListView, pNewGroup ); } m_pGroupsListView->setCurrentItem( m_pCurrentItem ); } #endif } #ifdef H2CORE_HAVE_LADSPA void LadspaFXSelector::addGroup( QTreeWidget *parent, H2Core::LadspaFXGroup *pGroup ) { QTreeWidgetItem* pNewItem = new QTreeWidgetItem( parent ); QFont f = pNewItem->font( 0 ); f.setBold( true ); pNewItem->setFont( 0, f ); buildGroup( pNewItem, pGroup ); } void LadspaFXSelector::addGroup( QTreeWidgetItem * parent, H2Core::LadspaFXGroup *pGroup ) { QTreeWidgetItem* pNewItem = new QTreeWidgetItem( parent ); buildGroup( pNewItem, pGroup ); } void LadspaFXSelector::buildGroup( QTreeWidgetItem *pNewItem, H2Core::LadspaFXGroup *pGroup ) { QString sGroupName = pGroup->getName(); if (sGroupName == QString("Uncategorized")) { sGroupName = tr("Alphabetic List"); } else if (sGroupName == QString("Categorized(LRDF)")) { sGroupName = tr("Categorized"); } else if (sGroupName == QString("Recently Used")) { sGroupName = tr("Recently Used"); } pNewItem->setText( 0, sGroupName ); for ( uint i = 0; i < pGroup->getChildList().size(); i++ ) { H2Core::LadspaFXGroup *pNewGroup = ( pGroup->getChildList() )[ i ]; addGroup( pNewItem, pNewGroup ); } for(uint i = 0; i < pGroup->getLadspaInfo().size(); i++) { H2Core::LadspaFXInfo* pInfo = (pGroup->getLadspaInfo())[i]; if (pInfo->m_sName == m_sSelectedPluginName) { m_pCurrentItem = pNewItem; break; } } } #endif QString LadspaFXSelector::getSelectedFX() { return m_sSelectedPluginName; } void LadspaFXSelector::pluginSelected() { #ifdef H2CORE_HAVE_LADSPA //INFOLOG( "[pluginSelected]" ); // if ( m_pPluginsListBox->selectedItems().isEmpty() ) return; QString sSelected = m_pPluginsListBox->currentItem()->text(); m_sSelectedPluginName = sSelected; std::vector pluginList = Effects::get_instance()->getPluginList(); for (uint i = 0; i < pluginList.size(); i++) { H2Core::LadspaFXInfo *pFXInfo = pluginList[i]; if (pFXInfo->m_sName == m_sSelectedPluginName ) { m_nameLbl->setText( pFXInfo->m_sName ); m_labelLbl->setText( pFXInfo->m_sLabel ); if ( ( pFXInfo->m_nIAPorts == 2 ) && ( pFXInfo->m_nOAPorts == 2 ) ) { // Stereo plugin m_typeLbl->setText( tr("Stereo") ); } else if ( ( pFXInfo->m_nIAPorts == 1 ) && ( pFXInfo->m_nOAPorts == 1 ) ) { // Mono plugin m_typeLbl->setText( tr("Mono") ); } else { // not supported m_typeLbl->setText( tr("Not supported") ); } m_pIDLbl->setText( pFXInfo->m_sID ); m_pMakerLbl->setText( pFXInfo->m_sMaker ); m_pCopyrightLbl->setText( pFXInfo->m_sCopyright ); break; } } m_pOkBtn->setEnabled(true); #endif } void LadspaFXSelector::on_m_pGroupsListView_currentItemChanged( QTreeWidgetItem * currentItem, QTreeWidgetItem * previous ) { UNUSED( previous ); #ifdef H2CORE_HAVE_LADSPA //INFOLOG( "new selection: " + currentItem->text(0).toLocal8Bit().constData() ); m_pOkBtn->setEnabled(false); m_nameLbl->setText( QString("") ); m_labelLbl->setText( QString("") ); m_typeLbl->setText( QString("") ); m_pIDLbl->setText( QString("") ); m_pMakerLbl->setText( QString("") ); m_pCopyrightLbl->setText( QString("") ); // nothing was selected if ( currentItem == nullptr ) { return; } if ( currentItem->childCount() ) { currentItem->setExpanded( true ); } QString itemText = currentItem->text( 0 ); m_pPluginsListBox->clear(); // ... Why not anyway ? Jakob Lund H2Core::LadspaFXGroup* pFXGroup = Effects::get_instance()->getLadspaFXGroup(); std::vector pluginList = findPluginsInGroup( itemText, pFXGroup ); int selectedIndex = -1; for (int i = 0; i < (int)pluginList.size(); i++) { //INFOLOG( "adding plugin: " + pluginList[ i ]->m_sName ); m_pPluginsListBox->addItem( pluginList[ i ]->m_sName ); if ( pluginList[ i ]->m_sName == m_sSelectedPluginName ) { selectedIndex = i; } } if ( selectedIndex >= 0 ) m_pPluginsListBox->setCurrentRow( selectedIndex ); #endif } #ifdef H2CORE_HAVE_LADSPA std::vector LadspaFXSelector::findPluginsInGroup( const QString& sSelectedGroup, H2Core::LadspaFXGroup *pGroup ) { //INFOLOG( "group: " + sSelectedGroup ); vector list; if ( pGroup->getName() == sSelectedGroup ) { //INFOLOG( "found..." ); for ( uint i = 0; i < pGroup->getLadspaInfo().size(); ++i ) { H2Core::LadspaFXInfo *pInfo = ( pGroup->getLadspaInfo() )[i]; list.push_back( pInfo ); } return list; } else { //INFOLOG( "not found...searching in the child groups" ); for ( uint i = 0; i < pGroup->getChildList().size(); ++i ) { H2Core::LadspaFXGroup *pNewGroup = ( pGroup->getChildList() )[ i ]; list = findPluginsInGroup( sSelectedGroup, pNewGroup ); if (list.size() != 0) { return list; } } } //WARNINGLOG( "[findPluginsInGroup] no group found ('" + sSelectedGroup + "')" ); return list; } #endif hydrogen-1.0.0-rc1/src/gui/src/LadspaFXSelector.h000066400000000000000000000037761366722712400215170ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LADSPA_FX_SELECTOR_H #define LADSPA_FX_SELECTOR_H #include "ui_LadspaFXSelector_UI.h" #include #include #include #if QT_VERSION >= 0x050000 # include #endif #include #include namespace H2Core { class LadspaFXInfo; class LadspaFXGroup; } class LadspaFXSelector : public QDialog, public Ui_LadspaFXSelector_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: LadspaFXSelector(int nLadspaFX); ~LadspaFXSelector(); QString getSelectedFX(); private slots: void on_m_pGroupsListView_currentItemChanged( QTreeWidgetItem * current, QTreeWidgetItem * previous ); void pluginSelected(); private: QTreeWidgetItem* m_pCurrentItem; QString m_sSelectedPluginName; void buildLadspaGroups(); #ifdef H2CORE_HAVE_LADSPA void addGroup(QTreeWidgetItem *parent, H2Core::LadspaFXGroup *pGroup); void addGroup( QTreeWidget *parent, H2Core::LadspaFXGroup *pGroup ); void buildGroup(QTreeWidgetItem *pNewItem, H2Core::LadspaFXGroup *pGroup); std::vector findPluginsInGroup( const QString& sSelectedGroup, H2Core::LadspaFXGroup *pGroup ); #endif }; #endif hydrogen-1.0.0-rc1/src/gui/src/LadspaFXSelector_UI.ui000066400000000000000000000340061366722712400222700ustar00rootroot00000000000000 LadspaFXSelector_UI 0 0 659 408 0 0 Form1 10 370 640 24 6 0 Qt::Horizontal QSizePolicy::Expanding 20 0 0 0 0 22 &Cancel Alt+C 0 0 0 22 &OK Alt+O true false Qt::Horizontal QSizePolicy::Expanding 20 0 10 10 201 351 10 10 181 331 true false 1 220 10 221 351 10 10 201 331 true 450 10 201 351 10 20 180 20 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Name:</span></p></body></html> 10 40 180 41 ### fx name 1 Qt::AlignTop true 10 81 180 19 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label:</span></p></body></html> 10 101 180 20 ### fx label Qt::AlignTop false 10 126 80 20 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Type:</span></p></body></html> 100 126 90 20 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">ID:</span></p></body></html> 10 146 80 20 ### fx type Qt::AlignTop 100 146 90 20 ### fx ID Qt::AlignTop 10 169 180 20 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Maker:</span></p></body></html> 10 189 180 61 ### FX maker 1 2 Qt::AlignTop true 10 250 180 20 12 50 false false false false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Copyright:</span></p></body></html> 10 270 180 71 ### copyright 1 2 3 Qt::AlignTop true m_pCancelBtn clicked() LadspaFXSelector_UI reject() 272 371 149 388 m_pOkBtn clicked() LadspaFXSelector_UI accept() 417 378 509 381 hydrogen-1.0.0-rc1/src/gui/src/MainForm.cpp000066400000000000000000001574011366722712400204120ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include #include #include #include #include #include "AboutDialog.h" #include "AudioEngineInfoForm.h" #include "DonationDialog.h" #include "ExportSongDialog.h" #include "ExportMidiDialog.h" #include "HydrogenApp.h" #include "InstrumentRack.h" #include "Skin.h" #include "MainForm.h" #include "PlayerControl.h" #include "HelpBrowser.h" #include "LadspaFXProperties.h" #include "SongPropertiesDialog.h" #include "UndoActions.h" #include "Widgets/InfoBar.h" #include "Director.h" #include "Mixer/Mixer.h" #include "InstrumentEditor/InstrumentEditorPanel.h" #include "PatternEditor/PatternEditorPanel.h" #include "SongEditor/SongEditor.h" #include "SongEditor/SongEditorPanel.h" #include "SoundLibrary/SoundLibraryPanel.h" #include "SoundLibrary/SoundLibraryImportDialog.h" #include "SoundLibrary/SoundLibrarySaveDialog.h" #include "SoundLibrary/SoundLibraryOpenDialog.h" #include "SoundLibrary/SoundLibraryExportDialog.h" #include "SoundLibrary/SoundLibraryPropertiesDialog.h" #include "PlaylistEditor/PlaylistDialog.h" #include #if QT_VERSION >= 0x050000 # include #endif #ifndef WIN32 #include #include #endif #ifdef H2CORE_HAVE_LASH #include #include #endif #include #include using namespace std; using namespace H2Core; int MainForm::sigusr1Fd[2]; const char* MainForm::__class_name = "MainForm"; MainForm::MainForm( QApplication *app, const QString& songFilename ) : QMainWindow( nullptr, nullptr ) , Object( __class_name ) { setMinimumSize( QSize( 1000, 500 ) ); #ifndef WIN32 if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigusr1Fd)) { qFatal("Couldn't create HUP socketpair"); } snUsr1 = new QSocketNotifier(sigusr1Fd[1], QSocketNotifier::Read, this); connect(snUsr1, SIGNAL(activated(int)), this, SLOT( handleSigUsr1() )); #endif m_pQApp = app; m_pQApp->processEvents(); // Load default song Song *pSong = nullptr; if ( !songFilename.isEmpty() ) { pSong = Song::load( songFilename ); /* * If the song could not be loaded, create * a new one with the specified filename */ if (pSong == nullptr) { pSong = Song::get_empty_song(); pSong->set_filename( songFilename ); } } else { Preferences *pref = Preferences::get_instance(); bool restoreLastSong = pref->isRestoreLastSongEnabled(); QString filename = pref->getLastSongFilename(); if ( restoreLastSong && ( !filename.isEmpty() )) { pSong = Song::load( filename ); if (pSong == nullptr) { //QMessageBox::warning( this, "Hydrogen", tr("Error restoring last song.") ); pSong = Song::get_empty_song(); pSong->set_filename( "" ); } } else { pSong = Song::get_empty_song(); pSong->set_filename( "" ); } } showDevelWarning(); h2app = new HydrogenApp( this, pSong ); h2app->addEventListener( this ); createMenuBar(); checkMidiSetup(); h2app->setStatusBarMessage( tr("Hydrogen Ready."), 10000 ); initKeyInstMap(); // we need to do all this to support the keyboard playing // for all the window modes h2app->getMixer()->installEventFilter (this); h2app->getPatternEditorPanel()->installEventFilter (this); h2app->getPatternEditorPanel()->getPianoRollEditor()->installEventFilter (this); h2app->getSongEditorPanel()->installEventFilter (this); h2app->getPlayerControl()->installEventFilter(this); InstrumentEditorPanel::get_instance()->installEventFilter(this); h2app->getAudioEngineInfoForm()->installEventFilter(this); h2app->getDirector()->installEventFilter(this); // h2app->getPlayListDialog()->installEventFilter(this); installEventFilter( this ); connect( &m_AutosaveTimer, SIGNAL(timeout()), this, SLOT(onAutoSaveTimer())); m_AutosaveTimer.start( 60 * 1000 ); #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if (lashClient->isConnected()) { // send alsa client id now since it can only be sent // after the audio engine has been started. Preferences *pref = Preferences::get_instance(); if ( pref->m_sMidiDriver == "ALSA" ) { // infoLog("[LASH] Sending alsa seq id to LASH server"); lashClient->sendAlsaClientId(); } // start timer for polling lash events lashPollTimer = new QTimer(this); connect( lashPollTimer, SIGNAL( timeout() ), this, SLOT( onLashPollTimer() ) ); lashPollTimer->start(500); } } #endif //playlist display timer QTimer *playlistDisplayTimer = new QTimer(this); connect( playlistDisplayTimer, SIGNAL( timeout() ), this, SLOT( onPlaylistDisplayTimer() ) ); playlistDisplayTimer->start(30000); // update player control at // ~ playlist display timer //beatcouter Hydrogen::get_instance()->setBcOffsetAdjust(); // director EventQueue::get_instance()->push_event( EVENT_METRONOME, 1 ); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); m_pUndoView = new QUndoView(h2app->m_pUndoStack); m_pUndoView->setWindowTitle(tr("Undo history")); //restore last playlist if( Preferences::get_instance()->isRestoreLastPlaylistEnabled() && !Preferences::get_instance()->getLastPlaylistFilename().isEmpty() ){ bool loadlist = h2app->getPlayListDialog()->loadListByFileName( Preferences::get_instance()->getLastPlaylistFilename() ); if( !loadlist ){ _ERRORLOG ( "Error loading the playlist" ); } } } MainForm::~MainForm() { // remove the autosave file QFile file( getAutoSaveFilename() ); file.remove(); //if a playlist is used, we save the last playlist-path to hydrogen.conf Preferences::get_instance()->setLastPlaylistFilename( Playlist::get_instance()->getFilename() ); if ( (Hydrogen::get_instance()->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } // remove the autosave file m_AutosaveTimer.stop(); QFile autosaveFile( "hydrogen_autosave.h2song" ); autosaveFile.remove(); hide(); if (h2app != nullptr) { delete Playlist::get_instance(); delete h2app; h2app = nullptr; } } /// /// Create the menubar /// void MainForm::createMenuBar() { // menubar QMenuBar *m_pMenubar = new QMenuBar( this ); setMenuBar( m_pMenubar ); // FILE menu QMenu *m_pFileMenu = m_pMenubar->addMenu( tr( "Pro&ject" ) ); m_pFileMenu->addAction( tr( "&New" ), this, SLOT( action_file_new() ), QKeySequence( "Ctrl+N" ) ); m_pFileMenu->addAction( tr( "Show &info" ), this, SLOT( action_file_songProperties() ), QKeySequence( "" ) ); m_pFileMenu->addSeparator(); // ----- m_pFileMenu->addAction( tr( "&Open" ), this, SLOT( action_file_open() ), QKeySequence( "Ctrl+O" ) ); m_pFileMenu->addAction( tr( "Open &Demo" ), this, SLOT( action_file_openDemo() ), QKeySequence( "Ctrl+D" ) ); m_pRecentFilesMenu = m_pFileMenu->addMenu( tr( "Open &recent" ) ); m_pFileMenu->addSeparator(); // ----- m_pFileMenu->addAction( tr( "&Save" ), this, SLOT( action_file_save() ), QKeySequence( "Ctrl+S" ) ); m_pFileMenu->addAction( tr( "Save &as..." ), this, SLOT( action_file_save_as() ), QKeySequence( "Ctrl+Shift+S" ) ); m_pFileMenu->addSeparator(); // ----- m_pFileMenu->addAction ( tr ( "Open &Pattern" ), this, SLOT ( action_file_openPattern() ), QKeySequence ( "" ) ); m_pFileMenu->addAction( tr( "Expor&t pattern as..." ), this, SLOT( action_file_export_pattern_as() ), QKeySequence( "Ctrl+P" ) ); m_pFileMenu->addSeparator(); // ----- m_pFileMenu->addAction( tr( "Export &MIDI file" ), this, SLOT( action_file_export_midi() ), QKeySequence( "Ctrl+M" ) ); m_pFileMenu->addAction( tr( "&Export song" ), this, SLOT( action_file_export() ), QKeySequence( "Ctrl+E" ) ); m_pFileMenu->addAction( tr( "Export &LilyPond file" ), this, SLOT( action_file_export_lilypond() ), QKeySequence( "Ctrl+L" ) ); #ifndef Q_OS_MACX m_pFileMenu->addSeparator(); // ----- m_pFileMenu->addAction( tr("&Quit"), this, SLOT( action_file_exit() ), QKeySequence( "Ctrl+Q" ) ); #endif updateRecentUsedSongList(); connect( m_pRecentFilesMenu, SIGNAL( triggered(QAction*) ), this, SLOT( action_file_open_recent(QAction*) ) ); //~ FILE menu // Undo menu QMenu *m_pUndoMenu = m_pMenubar->addMenu( tr( "&Undo" ) ); m_pUndoMenu->addAction( tr( "Undo" ), this, SLOT( action_undo() ), QKeySequence( "Ctrl+Z" ) ); m_pUndoMenu->addAction( tr( "Redo" ), this, SLOT( action_redo() ), QKeySequence( "Shift+Ctrl+Z" ) ); m_pUndoMenu->addAction( tr( "Undo history" ), this, SLOT( openUndoStack() ), QKeySequence( "" ) ); // DRUMKITS MENU QMenu *m_pDrumkitsMenu = m_pMenubar->addMenu( tr( "Drum&kits" ) ); m_pDrumkitsMenu->addAction( tr( "New" ), this, SLOT( action_instruments_clearAll() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addAction( tr( "Open" ), this, SLOT( action_banks_open() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addAction( tr( "Properties" ), this, SLOT( action_banks_properties() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addSeparator(); // ----- m_pDrumkitsMenu->addAction( tr( "Save" ), this, SLOT( action_instruments_saveLibrary() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addAction( tr( "Save As" ), this, SLOT( action_instruments_saveAsLibrary() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addSeparator(); // ----- m_pDrumkitsMenu->addAction( tr( "Export" ), this, SLOT( action_instruments_exportLibrary() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addAction( tr( "Import" ), this, SLOT( action_instruments_importLibrary() ), QKeySequence( "" ) ); m_pDrumkitsMenu->addAction( tr( "Online import" ), this, SLOT( action_instruments_onlineImportLibrary() ), QKeySequence( "" ) ); // INSTRUMENTS MENU QMenu *m_pInstrumentsMenu = m_pMenubar->addMenu( tr( "I&nstruments" ) ); m_pInstrumentsMenu->addAction( tr( "&Add instrument" ), this, SLOT( action_instruments_addInstrument() ), QKeySequence( "" ) ); m_pInstrumentsMenu->addAction( tr( "&Clear all" ), this, SLOT( action_instruments_clearAll() ), QKeySequence( "" ) ); m_pInstrumentsMenu->addSeparator(); // ----- m_pInstrumentsMenu->addAction( tr( "Add component" ), this, SLOT( action_instruments_addComponent() ), QKeySequence( "" ) ); // VIEW MENU QMenu *m_pViewMenu = m_pMenubar->addMenu( tr( "&View" ) ); m_pViewPlaylistEditorAction = m_pViewMenu->addAction( tr("Playlist &editor"), this, SLOT( action_window_showPlaylistDialog() ), QKeySequence( "" ) ); m_pViewPlaylistEditorAction->setCheckable( true ); m_pViewDirectorAction = m_pViewMenu->addAction( tr("Director"), this, SLOT( action_window_show_DirectorWidget() ), QKeySequence( "Alt+D" ) ); m_pViewDirectorAction->setCheckable( true ); m_pFileMenu->addSeparator(); m_pViewMixerAction = m_pViewMenu->addAction( tr("&Mixer"), this, SLOT( action_window_showMixer() ), QKeySequence( "Alt+M" ) ); m_pViewMixerAction->setCheckable( true ); update_mixer_checkbox(); // if checkbox need to be checked. m_pViewMixerInstrumentRackAction = m_pViewMenu->addAction( tr("&Instrument Rack"), this, SLOT( action_window_showDrumkitManagerPanel() ), QKeySequence( "Alt+I" ) ); m_pViewMixerInstrumentRackAction->setCheckable( true ); update_instrument_checkbox( true ); // check it as Instrument panel is always open on start m_pViewAutomationPathAction = m_pViewMenu->addAction( tr("&Automation path"), this, SLOT( action_window_showAutomationArea() ), QKeySequence( "Alt+A" ) ); m_pViewAutomationPathAction->setCheckable( true ); update_automation_checkbox(); m_pViewTimelineAction = m_pViewMenu->addAction( tr("&Timeline"), this, SLOT( action_window_showTimeline() ), QKeySequence( "" ) ); m_pViewTimelineAction->setCheckable( true ); m_pViewTimelineAction->setChecked( true ); update_automation_checkbox(); m_pViewPlaybackTrackAction = m_pViewMenu->addAction( tr("&Playback track"), this, SLOT( action_window_showPlaybackTrack() ), QKeySequence( "" ) ); m_pViewPlaybackTrackAction->setCheckable( true ); m_pViewPlaybackTrackAction->setChecked( false ); update_automation_checkbox(); m_pViewMenu->addSeparator(); // ----- m_pViewMenu->addAction( tr("Full screen"), this, SLOT( action_window_toggleFullscreen() ), QKeySequence( "Alt+F" ) ); // Options menu QMenu *m_pOptionsMenu = m_pMenubar->addMenu( tr( "&Options" )); m_pInputModeMenu = m_pOptionsMenu->addMenu( tr( "Input mode" ) ); m_pInstrumentAction = m_pInputModeMenu->addAction( tr( "Instrument" ), this, SLOT( action_toggle_input_mode()), QKeySequence( "Ctrl+Alt+I" ) ); m_pInstrumentAction->setCheckable( true ); m_pDrumkitAction = m_pInputModeMenu->addAction( tr( "Drumkit" ), this, SLOT( action_toggle_input_mode()), QKeySequence( "Ctrl+Alt+D" ) ); m_pDrumkitAction->setCheckable( true ); if( Preferences::get_instance()->__playselectedinstrument ) { m_pInstrumentAction->setChecked( true ); m_pDrumkitAction->setChecked (false ); } else { m_pInstrumentAction->setChecked( false ); m_pDrumkitAction->setChecked (true ); } m_pOptionsMenu->addAction( tr("&Preferences"), this, SLOT( showPreferencesDialog() ), QKeySequence( "Alt+P" ) ); //~ Tools menu Logger *pLogger = Logger::get_instance(); if ( pLogger->bit_mask() >= 1 ) { // DEBUG menu QMenu *m_pDebugMenu = m_pMenubar->addMenu( tr("De&bug") ); m_pDebugMenu->addAction( tr( "Show &audio engine info" ), this, SLOT( action_debug_showAudioEngineInfo() ) ); if(pLogger->bit_mask() == 8) { // hydrogen -V8 list object map in console m_pDebugMenu->addAction( tr( "Print Objects" ), this, SLOT( action_debug_printObjects() ) ); } //~ DEBUG menu } // INFO menu QMenu *m_pInfoMenu = m_pMenubar->addMenu( tr( "&Info" ) ); m_pInfoMenu->addAction( tr("&User manual"), this, SLOT( showUserManual() ), QKeySequence( "Ctrl+?" ) ); m_pInfoMenu->addSeparator(); m_pInfoMenu->addAction( tr("&About"), this, SLOT( action_help_about() ), QKeySequence( tr("", "Info|About") ) ); m_pInfoMenu->addAction( tr("Report bug"), this, SLOT( action_report_bug() )); m_pInfoMenu->addAction( tr("Donate"), this, SLOT( action_donate() )); //~ INFO menu } void MainForm::onLashPollTimer() { #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* client = LashClient::get_instance(); if (!client->isConnected()) { WARNINGLOG("[LASH] Not connected to server!"); return; } bool keep_running = true; lash_event_t* event; string songFilename; QString filenameSong; Song *song = Hydrogen::get_instance()->getSong(); // Extra parentheses for -Wparentheses while ( (event = client->getNextEvent()) ) { switch (lash_event_get_type(event)) { case LASH_Save_File: INFOLOG("[LASH] Save file"); songFilename.append(lash_event_get_string(event)); songFilename.append("/hydrogen.h2song"); filenameSong = QString::fromLocal8Bit( songFilename.c_str() ); song->set_filename( filenameSong ); action_file_save(); client->sendEvent(LASH_Save_File); break; case LASH_Restore_File: songFilename.append(lash_event_get_string(event)); songFilename.append("/hydrogen.h2song"); INFOLOG( QString("[LASH] Restore file: %1") .arg( songFilename.c_str() ) ); filenameSong = QString::fromLocal8Bit( songFilename.c_str() ); openSongFile( filenameSong ); client->sendEvent(LASH_Restore_File); break; case LASH_Quit: // infoLog("[LASH] Quit!"); keep_running = false; break; default: ; // infoLog("[LASH] Got unknown event!"); } lash_event_destroy(event); } if (!keep_running) { lashPollTimer->stop(); action_file_exit(); } } #endif } void MainForm::action_donate() { DonationDialog *pDialog = new DonationDialog( nullptr ); pDialog->exec(); } /// return true if the app needs to be closed. bool MainForm::action_file_exit() { bool proceed = handleUnsavedChanges(); if(!proceed) { return false; } closeAll(); return true; } void MainForm::action_file_new() { Hydrogen * pEngine = Hydrogen::get_instance(); if ( (pEngine->getState() == STATE_PLAYING) ) { pEngine->sequencer_stop(); } bool proceed = handleUnsavedChanges(); if(!proceed) { return; } h2app->m_pUndoStack->clear(); pEngine->getTimeline()->m_timelinevector.clear(); Song * pSong = Song::get_empty_song(); pSong->set_filename( "" ); h2app->setSong(pSong); pEngine->setSelectedPatternNumber( 0 ); h2app->getInstrumentRack()->getSoundLibraryPanel()->update_background_color(); h2app->getSongEditorPanel()->updatePositionRuler(); pEngine->getTimeline()->m_timelinetagvector.clear(); // update director tags EventQueue::get_instance()->push_event( EVENT_METRONOME, 2 ); // update director songname EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); } void MainForm::action_file_save_as() { Hydrogen* pEngine = Hydrogen::get_instance(); if ( pEngine->getState() == STATE_PLAYING ) { pEngine->sequencer_stop(); } //std::auto_ptr fd( new QFileDialog ); QFileDialog fd(this); fd.setFileMode( QFileDialog::AnyFile ); fd.setNameFilter( Filesystem::songs_filter_name ); fd.setAcceptMode( QFileDialog::AcceptSave ); fd.setWindowTitle( tr( "Save song" ) ); fd.setSidebarUrls( fd.sidebarUrls() << QUrl::fromLocalFile( Filesystem::songs_dir() ) ); Song *song = pEngine->getSong(); QString defaultFilename; QString lastFilename = song->get_filename(); if ( lastFilename.isEmpty() ) { defaultFilename = pEngine->getSong()->__name; defaultFilename += Filesystem::songs_ext; } else { defaultFilename = lastFilename; } fd.selectFile( defaultFilename ); QString filename; if (fd.exec() == QDialog::Accepted) { filename = fd.selectedFiles().first(); } if ( !filename.isEmpty() ) { QString sNewFilename = filename; if ( sNewFilename.endsWith( Filesystem::songs_ext ) == false ) { filename += Filesystem::songs_ext; } song->set_filename(filename); action_file_save(); } h2app->setScrollStatusBarMessage( tr("Song saved as.") + QString(" Into: ") + defaultFilename, 2000 ); h2app->updateWindowTitle(); } void MainForm::action_file_save() { Song *pSong = Hydrogen::get_instance()->getSong(); QString filename = pSong->get_filename(); if ( filename.isEmpty() ) { // just in case! return action_file_save_as(); } bool saved = false; saved = pSong->save( filename ); if(! saved) { QMessageBox::warning( this, "Hydrogen", tr("Could not save song.") ); } else { Preferences::get_instance()->setLastSongFilename( pSong->get_filename() ); // add the new loaded song in the "last used song" vector Preferences *pPref = Preferences::get_instance(); vector recentFiles = pPref->getRecentFiles(); recentFiles.insert( recentFiles.begin(), filename ); pPref->setRecentFiles( recentFiles ); updateRecentUsedSongList(); h2app->setScrollStatusBarMessage( tr("Song saved.") + QString(" Into: ") + filename, 2000 ); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); } } void MainForm::action_toggle_input_mode() { if( !Preferences::get_instance()->__playselectedinstrument ) { Preferences::get_instance()->__playselectedinstrument = true; m_pInstrumentAction->setChecked( true ); m_pDrumkitAction->setChecked (false ); } else { Preferences::get_instance()->__playselectedinstrument = false; m_pInstrumentAction->setChecked( false ); m_pDrumkitAction->setChecked (true ); } } void MainForm::action_help_about() { AboutDialog *dialog = new AboutDialog( nullptr ); dialog->exec(); } void MainForm::action_report_bug() { QDesktopServices::openUrl(QString("https://github.com/hydrogen-music/hydrogen/issues")); } void MainForm::showUserManual() { h2app->getHelpBrowser()->hide(); h2app->getHelpBrowser()->show(); } void MainForm::action_file_export_pattern_as() { if ( ( Hydrogen::get_instance()->getState() == STATE_PLAYING ) ) { Hydrogen::get_instance()->sequencer_stop(); } Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); Pattern *pPattern = pSong->get_pattern_list()->get( pEngine->getSelectedPatternNumber() ); QDir dir = Preferences::get_instance()->__lastspatternDirectory; QString title = tr( "Save Pattern as ..." ); QFileDialog fd(this); fd.setWindowTitle( title ); fd.setDirectory( dir ); fd.selectFile( pPattern->get_name() ); fd.setFileMode( QFileDialog::AnyFile ); fd.setNameFilter( Filesystem::patterns_filter_name ); fd.setAcceptMode( QFileDialog::AcceptSave ); fd.setSidebarUrls( fd.sidebarUrls() << QUrl::fromLocalFile( Filesystem::patterns_dir() ) ); fd.setDefaultSuffix( Filesystem::patterns_ext ); if ( fd.exec() != QDialog::Accepted ) { return; } QFileInfo fileInfo = fd.selectedFiles().first(); Preferences::get_instance()->__lastspatternDirectory = fileInfo.path(); QString filePath = fileInfo.absoluteFilePath(); QString originalName = pPattern->get_name(); pPattern->set_name( fileInfo.baseName() ); QString path = Files::savePatternPath( filePath, pPattern, pSong, pEngine->getCurrentDrumkitname() ); pPattern->set_name( originalName ); if ( path.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export pattern.") ); return; } h2app->setStatusBarMessage( tr( "Pattern saved." ), 10000 ); if ( filePath.indexOf( Filesystem::patterns_dir() ) == 0 ) { SoundLibraryDatabase::get_instance()->updatePatterns(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); } } void MainForm::action_file_open() { if ( ((Hydrogen::get_instance())->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } bool proceed = handleUnsavedChanges(); if(!proceed) { return; } static QString lastUsedDir = Filesystem::songs_dir(); //std::auto_ptr fd( new QFileDialog ); QFileDialog fd(this); fd.setFileMode(QFileDialog::ExistingFile); fd.setDirectory( lastUsedDir ); fd.setNameFilter( Filesystem::songs_filter_name ); fd.setWindowTitle( tr( "Open song" ) ); QString filename; if (fd.exec() == QDialog::Accepted) { filename = fd.selectedFiles().first(); lastUsedDir = fd.directory().absolutePath(); } if ( !filename.isEmpty() ) { openSongFile( filename ); } HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->update_background_color(); } void MainForm::action_file_openPattern() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); int selectedPatternPosition = pEngine->getSelectedPatternNumber(); Instrument *pInstrument = pSong->get_instrument_list()->get ( 0 ); assert ( pInstrument ); QFileDialog fd(this); fd.setFileMode ( QFileDialog::ExistingFile ); fd.setDirectory ( Filesystem::patterns_dir() ); fd.setNameFilter( Filesystem::patterns_filter_name ); fd.setWindowTitle ( tr ( "Open Pattern" ) ); QString filename; if ( fd.exec() == QDialog::Accepted ) { filename = fd.selectedFiles().first(); } QString patternname = filename; Pattern* err = Pattern::load_file( patternname, pSong->get_instrument_list() ); if ( err == nullptr ) { _ERRORLOG( "Error loading the pattern" ); _ERRORLOG( patternname ); } else { H2Core::Pattern *pNewPattern = err; if(!pPatternList->check_name( pNewPattern->get_name() ) ){ pNewPattern->set_name( pPatternList->find_unused_pattern_name( pNewPattern->get_name() ) ); } SE_insertPatternAction* pAction = new SE_insertPatternAction( selectedPatternPosition + 1, pNewPattern ); HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } } /// \todo parametrizzare il metodo action_file_open ed eliminare il seguente... void MainForm::action_file_openDemo() { if ( (Hydrogen::get_instance()->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } bool proceed = handleUnsavedChanges(); if(!proceed) { return; } h2app->m_pUndoStack->clear(); QFileDialog fd(this); fd.setFileMode(QFileDialog::ExistingFile); fd.setNameFilter( Filesystem::songs_filter_name ); fd.setWindowTitle( tr( "Open song" ) ); fd.setDirectory( Filesystem::demos_dir() ); QString filename; if (fd.exec() == QDialog::Accepted) { filename = fd.selectedFiles().first(); } if ( !filename.isEmpty() ) { openSongFile( filename ); Hydrogen::get_instance()->getSong()->set_filename( "" ); } } void MainForm::showPreferencesDialog() { h2app->showPreferencesDialog(); } void MainForm::action_window_showPlaylistDialog() { h2app->showPlaylistDialog(); } // function to update director status in menu bar void MainForm::update_playlist_checkbox() { bool isVisible = HydrogenApp::get_instance()->getPlayListDialog()->isVisible(); m_pViewPlaylistEditorAction->setChecked( isVisible ); } void MainForm::action_window_show_DirectorWidget() { h2app->showDirector(); } // function to update director status in menu bar void MainForm::update_director_checkbox() { bool isVisible = HydrogenApp::get_instance()->getDirector()->isVisible(); m_pViewDirectorAction->setChecked( isVisible ); } void MainForm::action_window_toggleFullscreen() { if( this->isFullScreen() ){ this->showNormal(); } else { this->showFullScreen(); } } void MainForm::action_window_showMixer() { bool isVisible = HydrogenApp::get_instance()->getMixer()->isVisible(); h2app->showMixer( !isVisible ); } // function to update mixer status in menu bar void MainForm::update_mixer_checkbox() { bool isVisible = HydrogenApp::get_instance()->getMixer()->isVisible(); m_pViewMixerAction->setChecked( isVisible ); } void MainForm::action_debug_showAudioEngineInfo() { h2app->showAudioEngineInfoForm(); } /// /// Shows the song editor /// void MainForm::action_window_showSongEditor() { bool isVisible = h2app->getSongEditorPanel()->isVisible(); h2app->getSongEditorPanel()->setHidden( isVisible ); } void MainForm::action_window_showTimeline() { h2app->getSongEditorPanel()->showTimeline(); m_pViewPlaybackTrackAction->setChecked( false ); m_pViewTimelineAction->setChecked( true ); } void MainForm::action_window_showPlaybackTrack() { h2app->getSongEditorPanel()->showPlaybackTrack(); m_pViewPlaybackTrackAction->setChecked( true ); m_pViewTimelineAction->setChecked( false ); } void MainForm::action_window_showAutomationArea() { h2app->getSongEditorPanel()->toggleAutomationAreaVisibility(); } void MainForm::action_instruments_addInstrument() { SE_mainMenuAddInstrumentAction *pAction = new SE_mainMenuAddInstrumentAction(); HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } void MainForm::action_instruments_addComponent() { bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", tr( "Component name" ), QLineEdit::Normal, "New Component", &bIsOkPressed ); if ( bIsOkPressed ) { Hydrogen *pEngine = Hydrogen::get_instance(); DrumkitComponent* pDrumkitComponent = new DrumkitComponent( InstrumentEditor::findFreeDrumkitComponentId(), sNewName ); pEngine->getSong()->get_components()->push_back( pDrumkitComponent ); selectedInstrumentChangedEvent(); // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts(pEngine->getSong()); #endif } else { // user entered nothing or pressed Cancel } } void MainForm::action_banks_open() { SoundLibraryOpenDialog dialog( this ); dialog.exec(); } void MainForm::action_instruments_clearAll() { switch( QMessageBox::information( this, "Hydrogen", tr("Clear all instruments?"), tr("Ok"), tr("Cancel"), 0, // Enter == button 0 1 )) { // Escape == button 2 case 0: // ok btn pressed break; case 1: // cancel btn pressed return; } // Remove all instruments Song *pSong = Hydrogen::get_instance()->getSong(); InstrumentList* pList = pSong->get_instrument_list(); for (uint i = pList->size(); i > 0; i--) { functionDeleteInstrument(i - 1); } EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } void MainForm::functionDeleteInstrument(int instrument) { Hydrogen * pEngine = Hydrogen::get_instance(); Instrument *pSelectedInstrument = pEngine->getSong()->get_instrument_list()->get( instrument ); std::list< Note* > noteList; Song* pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); QString instrumentName = pSelectedInstrument->get_name(); QString drumkitName = pEngine->getCurrentDrumkitname(); for ( int i = 0; i < pPatternList->size(); i++ ) { const H2Core::Pattern *pPattern = pSong->get_pattern_list()->get(i); const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() == pSelectedInstrument ) { pNote->set_pattern_idx( i ); noteList.push_back( pNote ); } } } SE_deleteInstrumentAction *pAction = new SE_deleteInstrumentAction( noteList, drumkitName, instrumentName, instrument ); HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } void MainForm::action_instruments_exportLibrary() { SoundLibraryExportDialog exportDialog( this, QString() ); exportDialog.exec(); } void MainForm::action_instruments_importLibrary() { SoundLibraryImportDialog dialog( this, false ); dialog.exec(); } void MainForm::action_instruments_onlineImportLibrary() { SoundLibraryImportDialog dialog( this, true ); dialog.exec(); } void MainForm::action_instruments_saveLibrary() { QString sDrumkitName = Hydrogen::get_instance()->getCurrentDrumkitname(); Drumkit *pDrumkitInfo = nullptr; //User drumkit list QStringList usr_dks = Filesystem::usr_drumkit_list(); for (int i = 0; i < usr_dks.size(); ++i) { QString absPath = Filesystem::usr_drumkits_dir() + usr_dks[i]; Drumkit *pInfo = Drumkit::load( absPath, false ); if (pInfo) { if ( QString(pInfo->get_name() ) == sDrumkitName ){ pDrumkitInfo = pInfo; break; } } // Since Drumkit::load() calls New Drumkit() internally, we // have to take care of destroying it manually. delete pInfo; } // System drumkit list QStringList sys_dks = Filesystem::sys_drumkit_list(); for (int i = 0; i < sys_dks.size(); ++i) { QString absPath = Filesystem::sys_drumkits_dir() + sys_dks[i]; Drumkit *pInfo = Drumkit::load( absPath, false ); if (pInfo) { if ( QString( pInfo->get_name() ) == sDrumkitName ){ pDrumkitInfo = pInfo; break; } } // Since Drumkit::load() calls New Drumkit() internally, we // have to take care of destroying it manually. delete pInfo; } if ( pDrumkitInfo != nullptr ){ if( !H2Core::Drumkit::save( QString( pDrumkitInfo->get_name() ), QString( pDrumkitInfo->get_author() ), QString( pDrumkitInfo->get_info() ), QString( pDrumkitInfo->get_license() ), QString( pDrumkitInfo->get_image() ), QString( pDrumkitInfo->get_image_license() ), H2Core::Hydrogen::get_instance()->getSong()->get_instrument_list(), H2Core::Hydrogen::get_instance()->getSong()->get_components(), true ) ) { QMessageBox::information( this, "Hydrogen", tr ( "Saving of this library failed.")); } } else { action_instruments_saveAsLibrary(); } //HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); // Cleaning up the last pInfo we did not deleted due to the break // statement. delete pDrumkitInfo; } void MainForm::action_instruments_saveAsLibrary() { SoundLibrarySaveDialog dialog( this ); dialog.exec(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); } /// /// Window close event /// void MainForm::closeEvent( QCloseEvent* ev ) { if ( action_file_exit() == false ) { // don't close!!! ev->ignore(); return; } ev->accept(); } void MainForm::action_file_export() { if ( (Hydrogen::get_instance()->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } ExportSongDialog *dialog = new ExportSongDialog(this); dialog->exec(); delete dialog; } void MainForm::action_window_showDrumkitManagerPanel() { InstrumentRack *pPanel = HydrogenApp::get_instance()->getInstrumentRack(); pPanel->setHidden( pPanel->isVisible() ); update_instrument_checkbox( pPanel->isVisible() ); } void MainForm::update_instrument_checkbox( bool show ) { m_pViewMixerInstrumentRackAction->setChecked( show ); } void MainForm::update_automation_checkbox() { Preferences *pref = Preferences::get_instance(); if(pref->getShowAutomationArea()){ m_pViewAutomationPathAction->setChecked(true); } else { m_pViewAutomationPathAction->setChecked(false); } } void MainForm::closeAll() { // save window properties in the preferences files Preferences *pPreferences = Preferences::get_instance(); // mainform WindowProperties mainFormProp; mainFormProp.x = x(); mainFormProp.y = y(); mainFormProp.height = height(); mainFormProp.width = width(); pPreferences->setMainFormProperties( mainFormProp ); // Save mixer properties WindowProperties mixerProp; mixerProp.x = h2app->getMixer()->x(); mixerProp.y = h2app->getMixer()->y(); mixerProp.width = h2app->getMixer()->width(); mixerProp.height = h2app->getMixer()->height(); mixerProp.visible = h2app->getMixer()->isVisible(); pPreferences->setMixerProperties( mixerProp ); // save pattern editor properties WindowProperties patternEditorProp; patternEditorProp.x = h2app->getPatternEditorPanel()->x(); patternEditorProp.y = h2app->getPatternEditorPanel()->y(); patternEditorProp.width = h2app->getPatternEditorPanel()->width(); patternEditorProp.height = h2app->getPatternEditorPanel()->height(); patternEditorProp.visible = h2app->getPatternEditorPanel()->isVisible(); pPreferences->setPatternEditorProperties( patternEditorProp ); // save song editor properties WindowProperties songEditorProp; songEditorProp.x = h2app->getSongEditorPanel()->x(); songEditorProp.y = h2app->getSongEditorPanel()->y(); songEditorProp.width = h2app->getSongEditorPanel()->width(); songEditorProp.height = h2app->getSongEditorPanel()->height(); QSize size = h2app->getSongEditorPanel()->frameSize(); songEditorProp.visible = h2app->getSongEditorPanel()->isVisible(); pPreferences->setSongEditorProperties( songEditorProp ); // save audio engine info properties WindowProperties audioEngineInfoProp; audioEngineInfoProp.x = h2app->getAudioEngineInfoForm()->x(); audioEngineInfoProp.y = h2app->getAudioEngineInfoForm()->y(); audioEngineInfoProp.visible = h2app->getAudioEngineInfoForm()->isVisible(); pPreferences->setAudioEngineInfoProperties( audioEngineInfoProp ); #ifdef H2CORE_HAVE_LADSPA // save LADSPA FX window properties for (uint nFX = 0; nFX < MAX_FX; nFX++) { WindowProperties prop; prop.x = h2app->getLadspaFXProperties(nFX)->x(); prop.y = h2app->getLadspaFXProperties(nFX)->y(); prop.visible= h2app->getLadspaFXProperties(nFX)->isVisible(); pPreferences->setLadspaProperties(nFX, prop); } #endif m_pQApp->quit(); } // keybindings.. void MainForm::onPlayStopAccelEvent() { int nState = Hydrogen::get_instance()->getState(); switch (nState) { case STATE_READY: Hydrogen::get_instance()->sequencer_play(); break; case STATE_PLAYING: Hydrogen::get_instance()->sequencer_stop(); break; default: ERRORLOG( "[MainForm::onPlayStopAccelEvent()] Unhandled case." ); } } void MainForm::onRestartAccelEvent() { Hydrogen* pEngine = Hydrogen::get_instance(); pEngine->setPatternPos( 0 ); } void MainForm::onBPMPlusAccelEvent() { Hydrogen* pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song* pSong = pEngine->getSong(); if (pSong->__bpm < MAX_BPM) { pEngine->setBPM( pSong->__bpm + 0.1 ); } AudioEngine::get_instance()->unlock(); } void MainForm::onBPMMinusAccelEvent() { Hydrogen* pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song* pSong = pEngine->getSong(); if (pSong->__bpm > MIN_BPM ) { pEngine->setBPM( pSong->__bpm - 0.1 ); } AudioEngine::get_instance()->unlock(); } void MainForm::onSaveAsAccelEvent() { action_file_save_as(); } void MainForm::onSaveAccelEvent() { action_file_save(); } void MainForm::onOpenAccelEvent() { action_file_open(); } void MainForm::updateRecentUsedSongList() { m_pRecentFilesMenu->clear(); Preferences *pPref = Preferences::get_instance(); vector recentUsedSongs = pPref->getRecentFiles(); QString sFilename; for ( uint i = 0; i < recentUsedSongs.size(); ++i ) { sFilename = recentUsedSongs[ i ]; if ( !sFilename.isEmpty() ) { QAction *pAction = new QAction( this ); pAction->setText( sFilename ); m_pRecentFilesMenu->addAction( pAction ); } } } void MainForm::action_file_open_recent(QAction *pAction) { // INFOLOG( pAction->text() ); openSongFile( pAction->text() ); } void MainForm::openSongFile( const QString& sFilename ) { Hydrogen *pEngine = Hydrogen::get_instance(); if ( pEngine->getState() == STATE_PLAYING ) { pEngine->sequencer_stop(); } pEngine->getTimeline()->m_timelinetagvector.clear(); h2app->closeFXProperties(); Song *pSong = Song::load( sFilename ); if ( pSong == nullptr ) { QMessageBox::information( this, "Hydrogen", tr("Error loading song.") ); return; } h2app->m_pUndoStack->clear(); // add the new loaded song in the "last used song" vector Preferences *pPref = Preferences::get_instance(); vector recentFiles = pPref->getRecentFiles(); recentFiles.insert( recentFiles.begin(), sFilename ); pPref->setRecentFiles( recentFiles ); h2app->setSong( pSong ); updateRecentUsedSongList(); pEngine->setSelectedPatternNumber( 0 ); HydrogenApp::get_instance()->getSongEditorPanel()->updatePositionRuler(); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); checkMidiSetup(); } void MainForm::checkMidiSetup() { InfoBar *pInfoBar = h2app->getInfoBar(); Song *pSong = Hydrogen::get_instance()->getSong(); if ( pSong->get_instrument_list()->has_all_midi_notes_same() ) { WARNINGLOG( "Incorrect MIDI setup" ); pInfoBar->reset(); pInfoBar->setTitle( tr("MIDI setup advice") ); pInfoBar->setText( tr("MIDI out notes are not configured for this drumkit, so exporting this song to MIDI file may fail. Would you like Hydrogen to automatically fix this by assigning default values?") ); QPushButton *fix = pInfoBar->addButton( tr("Set default values") ); QObject::connect( fix, SIGNAL(clicked()), this, SLOT(onFixMidiSetup()) ); pInfoBar->show(); } else { pInfoBar->hide(); } } void MainForm::onFixMidiSetup() { INFOLOG( "Fixing MIDI setup" ); Song *pSong = Hydrogen::get_instance()->getSong(); pSong->get_instrument_list()->set_default_midi_out_notes(); pSong->set_is_modified( true ); InfoBar *pInfoBar = h2app->getInfoBar(); pInfoBar->hide(); } void MainForm::initKeyInstMap() { QString loc = QLocale::system().name(); int instr = 0; ///POSIX Locale //locale for keyboardlayout QWERTZ // de_DE, de_AT, de_LU, de_CH, de //locale for keyboardlayout AZERTY // fr_BE, fr_CA, fr_FR, fr_LU, fr_CH //locale for keyboardlayout QWERTY // en_GB, en_US, en_ZA, usw. if ( loc.contains( "de" ) || loc.contains( "DE" )){ ///QWERTZ keycodeInstrumentMap[Qt::Key_Y] = instr++; keycodeInstrumentMap[Qt::Key_S] = instr++; keycodeInstrumentMap[Qt::Key_X] = instr++; keycodeInstrumentMap[Qt::Key_D] = instr++; keycodeInstrumentMap[Qt::Key_C] = instr++; keycodeInstrumentMap[Qt::Key_V] = instr++; keycodeInstrumentMap[Qt::Key_G] = instr++; keycodeInstrumentMap[Qt::Key_B] = instr++; keycodeInstrumentMap[Qt::Key_H] = instr++; keycodeInstrumentMap[Qt::Key_N] = instr++; keycodeInstrumentMap[Qt::Key_J] = instr++; keycodeInstrumentMap[Qt::Key_M] = instr++; keycodeInstrumentMap[Qt::Key_Q] = instr++; keycodeInstrumentMap[Qt::Key_2] = instr++; keycodeInstrumentMap[Qt::Key_W] = instr++; keycodeInstrumentMap[Qt::Key_3] = instr++; keycodeInstrumentMap[Qt::Key_E] = instr++; keycodeInstrumentMap[Qt::Key_R] = instr++; keycodeInstrumentMap[Qt::Key_5] = instr++; keycodeInstrumentMap[Qt::Key_T] = instr++; keycodeInstrumentMap[Qt::Key_6] = instr++; keycodeInstrumentMap[Qt::Key_Z] = instr++; keycodeInstrumentMap[Qt::Key_7] = instr++; keycodeInstrumentMap[Qt::Key_U] = instr++; } else if ( loc.contains( "fr" ) || loc.contains( "FR" )){ ///AZERTY keycodeInstrumentMap[Qt::Key_W] = instr++; keycodeInstrumentMap[Qt::Key_S] = instr++; keycodeInstrumentMap[Qt::Key_X] = instr++; keycodeInstrumentMap[Qt::Key_D] = instr++; keycodeInstrumentMap[Qt::Key_C] = instr++; keycodeInstrumentMap[Qt::Key_V] = instr++; keycodeInstrumentMap[Qt::Key_G] = instr++; keycodeInstrumentMap[Qt::Key_B] = instr++; keycodeInstrumentMap[Qt::Key_H] = instr++; keycodeInstrumentMap[Qt::Key_N] = instr++; keycodeInstrumentMap[Qt::Key_J] = instr++; keycodeInstrumentMap[Qt::Key_Question] = instr++; keycodeInstrumentMap[Qt::Key_A] = instr++; keycodeInstrumentMap[Qt::Key_2] = instr++; keycodeInstrumentMap[Qt::Key_Z] = instr++; keycodeInstrumentMap[Qt::Key_3] = instr++; keycodeInstrumentMap[Qt::Key_E] = instr++; keycodeInstrumentMap[Qt::Key_R] = instr++; keycodeInstrumentMap[Qt::Key_5] = instr++; keycodeInstrumentMap[Qt::Key_T] = instr++; keycodeInstrumentMap[Qt::Key_6] = instr++; keycodeInstrumentMap[Qt::Key_Y] = instr++; keycodeInstrumentMap[Qt::Key_7] = instr++; keycodeInstrumentMap[Qt::Key_U] = instr++; }else { /// default QWERTY keycodeInstrumentMap[Qt::Key_Z] = instr++; keycodeInstrumentMap[Qt::Key_S] = instr++; keycodeInstrumentMap[Qt::Key_X] = instr++; keycodeInstrumentMap[Qt::Key_D] = instr++; keycodeInstrumentMap[Qt::Key_C] = instr++; keycodeInstrumentMap[Qt::Key_V] = instr++; keycodeInstrumentMap[Qt::Key_G] = instr++; keycodeInstrumentMap[Qt::Key_B] = instr++; keycodeInstrumentMap[Qt::Key_H] = instr++; keycodeInstrumentMap[Qt::Key_N] = instr++; keycodeInstrumentMap[Qt::Key_J] = instr++; keycodeInstrumentMap[Qt::Key_M] = instr++; keycodeInstrumentMap[Qt::Key_Q] = instr++; keycodeInstrumentMap[Qt::Key_2] = instr++; keycodeInstrumentMap[Qt::Key_W] = instr++; keycodeInstrumentMap[Qt::Key_3] = instr++; keycodeInstrumentMap[Qt::Key_E] = instr++; keycodeInstrumentMap[Qt::Key_R] = instr++; keycodeInstrumentMap[Qt::Key_5] = instr++; keycodeInstrumentMap[Qt::Key_T] = instr++; keycodeInstrumentMap[Qt::Key_6] = instr++; keycodeInstrumentMap[Qt::Key_Y] = instr++; keycodeInstrumentMap[Qt::Key_7] = instr++; keycodeInstrumentMap[Qt::Key_U] = instr++; } } bool MainForm::eventFilter( QObject *o, QEvent *e ) { UNUSED( o ); if ( e->type() == QEvent::KeyPress) { // special processing for key press QKeyEvent *k = (QKeyEvent *)e; // qDebug( "Got key press for instrument '%c'", k->ascii() ); //int songnumber = 0; HydrogenApp* app = HydrogenApp::get_instance(); Hydrogen* engine = Hydrogen::get_instance(); switch (k->key()) { case Qt::Key_Space: onPlayStopAccelEvent(); return true; // eat event case Qt::Key_Comma: engine->handleBeatCounter(); return true; // eat even break; case Qt::Key_Backspace: onRestartAccelEvent(); return true; // eat event break; case Qt::Key_Plus: onBPMPlusAccelEvent(); return true; // eat event break; case Qt::Key_Minus: onBPMMinusAccelEvent(); return true; // eat event break; case Qt::Key_Backslash: engine->onTapTempoAccelEvent(); return true; // eat event break; case Qt::Key_S | Qt::CTRL: onSaveAccelEvent(); return true; break; case Qt::Key_F5 : if( Playlist::get_instance()->size() == 0) { break; } return handleSelectNextPrevSongOnPlaylist( -1 ); break; case Qt::Key_F6 : if( Playlist::get_instance()->size() == 0) { break; } return handleSelectNextPrevSongOnPlaylist( 1 ); break; case Qt::Key_F12 : //panic button stop all playing notes engine->__panic(); //QMessageBox::information( this, "Hydrogen", tr( "Panic" ) ); return true; break; case Qt::Key_F9 : // Qt::Key_Left do not work. Some ideas ? engine->setPatternPos( Hydrogen::get_instance()->getPatternPos() - 1 ); return true; break; case Qt::Key_F10 : // Qt::Key_Right do not work. Some ideas ? engine->setPatternPos( Hydrogen::get_instance()->getPatternPos() + 1 ); return true; break; case Qt::Key_L : engine->togglePlaysSelected(); QString msg = Preferences::get_instance()->patternModePlaysSelected() ? "Single pattern mode" : "Stacked pattern mode"; app->setStatusBarMessage( msg, 5000 ); app->getSongEditorPanel()->setModeActionBtn( Preferences::get_instance()->patternModePlaysSelected() ); app->getSongEditorPanel()->updateAll(); return true; break; } // virtual keyboard handling map::iterator found = keycodeInstrumentMap.find ( k->key() ); if (found != keycodeInstrumentMap.end()) { // INFOLOG( "[eventFilter] virtual keyboard event" ); // insert note at the current column in time // if event recording enabled int row = (*found).second; float velocity = 0.8; float pan_L = 0.5f; float pan_R = 0.5f; engine->addRealtimeNote (row, velocity, pan_L, pan_R, 0, false, false , row + 36); return true; // eat event } else { return false; // let it go } } else { return false; // standard event processing } } /// print the object map void MainForm::action_debug_printObjects() { INFOLOG( "[action_debug_printObjects]" ); Object::write_objects_map_to_cerr(); } void MainForm::action_file_export_midi() { if ( (Hydrogen::get_instance()->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } ExportMidiDialog *dialog = new ExportMidiDialog(this); dialog->exec(); delete dialog; } void MainForm::action_file_export_lilypond() { if ( ( ( Hydrogen::get_instance() )->getState() == STATE_PLAYING ) ) { Hydrogen::get_instance()->sequencer_stop(); } switch ( QMessageBox::information( this, "Hydrogen", tr( "\nThe LilyPond export is an experimental feature.\n" "It should work like a charm provided that you use the " "GM-kit, and that you do not use triplet.\n" ), tr( "Ok" ), tr( "&Cancel" ), 0, 2 ) ) { case 1: case 2: return; } QFileDialog fd( this ); fd.setFileMode( QFileDialog::AnyFile ); fd.setNameFilter( tr( "LilyPond file (*.ly)" ) ); fd.setDirectory( QDir::homePath() ); fd.setWindowTitle( tr( "Export LilyPond file" ) ); fd.setAcceptMode( QFileDialog::AcceptSave ); QString sFilename; if ( fd.exec() == QDialog::Accepted ) { sFilename = fd.selectedFiles().first(); } if ( !sFilename.isEmpty() ) { if ( sFilename.endsWith( ".ly" ) == false ) { sFilename += ".ly"; } Song *pSong = Hydrogen::get_instance()->getSong(); LilyPond ly; ly.extractData( *pSong ); ly.write( sFilename ); } } void MainForm::errorEvent( int nErrorCode ) { //ERRORLOG( "[errorEvent]" ); QString msg; switch (nErrorCode) { case Hydrogen::UNKNOWN_DRIVER: msg = tr( "Unknown audio driver" ); break; case Hydrogen::ERROR_STARTING_DRIVER: msg = tr( "Error starting audio driver" ); break; case Hydrogen::JACK_SERVER_SHUTDOWN: msg = tr( "Jack driver: server shutdown" ); break; case Hydrogen::JACK_CANNOT_ACTIVATE_CLIENT: msg = tr( "Jack driver: cannot activate client" ); break; case Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT: msg = tr( "Jack driver: cannot connect output port" ); break; case Hydrogen::JACK_CANNOT_CLOSE_CLIENT: msg = tr( "Jack driver: cannot disconnect client" ); break; case Hydrogen::JACK_ERROR_IN_PORT_REGISTER: msg = tr( "Jack driver: error in port register" ); break; case Hydrogen::OSC_CANNOT_CONNECT_TO_PORT: msg = tr( "OSC Server: Cannot connect to given port, using temporary port instead" ); break; default: msg = QString( tr( "Unknown error %1" ) ).arg( nErrorCode ); } QMessageBox::information( this, "Hydrogen", msg ); } void MainForm::playlistLoadSongEvent (int nIndex) { Playlist* pPlaylist = Playlist::get_instance(); QString songFilename; if( !pPlaylist->getSongFilenameByNumber( nIndex, songFilename ) ) { return; } openSongFile( songFilename ); pPlaylist->activateSong( nIndex ); HydrogenApp::get_instance()->setScrollStatusBarMessage( tr( "Playlist: Set song No. %1" ).arg( nIndex +1 ), 5000 ); } void MainForm::jacksessionEvent( int nEvent ) { switch (nEvent){ case 0: action_file_save(); break; case 1: action_file_exit(); break; } } void MainForm::action_file_songProperties() { SongPropertiesDialog *pDialog = new SongPropertiesDialog( this ); if ( pDialog->exec() == QDialog::Accepted ) { Hydrogen::get_instance()->getSong()->set_is_modified( true ); } delete pDialog; } void MainForm::action_window_showPatternEditor() { bool isVisible = HydrogenApp::get_instance()->getPatternEditorPanel()->isVisible(); HydrogenApp::get_instance()->getPatternEditorPanel()->setHidden( isVisible ); } void MainForm::showDevelWarning() { //set this to 'false' for the case that you want to make a release.. if ( true ) { Preferences *pPreferences = Preferences::get_instance(); bool isDevelWarningEnabled = pPreferences->getShowDevelWarning(); if(isDevelWarningEnabled) { QString msg = tr( "You're using a development version of Hydrogen, please help us reporting bugs or suggestions in the hydrogen-devel mailing list.

Thank you!" ); QMessageBox develMessageBox( this ); develMessageBox.setText( msg ); develMessageBox.addButton( QMessageBox::Ok ); develMessageBox.addButton( tr( "Don't show this message anymore" ) , QMessageBox::AcceptRole ); if( develMessageBox.exec() == 0 ){ //don't show warning again pPreferences->setShowDevelWarning( false ); } } } } QString MainForm::getAutoSaveFilename() { Song *pSong = Hydrogen::get_instance()->getSong(); assert( pSong ); QString sOldFilename = pSong->get_filename(); QString newName = "autosave.h2song"; if ( !sOldFilename.isEmpty() ) { newName = sOldFilename.left( sOldFilename.length() - 7 ) + ".autosave.h2song"; } return newName; } void MainForm::onAutoSaveTimer() { //INFOLOG( "[onAutoSaveTimer]" ); Song *pSong = Hydrogen::get_instance()->getSong(); assert( pSong ); QString sOldFilename = pSong->get_filename(); pSong->save( getAutoSaveFilename() ); pSong->set_filename(sOldFilename); } void MainForm::onPlaylistDisplayTimer() { if( Playlist::get_instance()->size() == 0) { return; } int songnumber = Playlist::get_instance()->getActiveSongNumber(); QString songname; if ( songnumber == -1 ) { return; } if ( Hydrogen::get_instance()->getSong()->__name == "Untitled Song" ){ songname = Hydrogen::get_instance()->getSong()->get_filename(); } else { songname = Hydrogen::get_instance()->getSong()->__name; } QString message = (tr("Playlist: Song No. %1").arg( songnumber + 1)) + QString(" --- Songname: ") + songname + QString(" --- Author: ") + Hydrogen::get_instance()->getSong()->__author; HydrogenApp::get_instance()->setScrollStatusBarMessage( message, 2000 ); } // Returns true if unsaved changes are successfully handled (saved, discarded, etc.) // Returns false if not (i.e. Cancel) bool MainForm::handleUnsavedChanges() { bool done = false; bool rv = true; while ( !done && Hydrogen::get_instance()->getSong()->get_is_modified() ) { switch( QMessageBox::information( this, "Hydrogen", tr("\nThe document contains unsaved changes.\n" "Do you want to save the changes?\n"), tr("&Save"), tr("&Discard"), tr("&Cancel"), 0, // Enter == button 0 2 ) ) { // Escape == button 2 case 0: // Save clicked or Alt+S pressed or Enter pressed. // If the save fails, the __is_modified flag will still be true if ( ! Hydrogen::get_instance()->getSong()->get_filename().isEmpty() ) { action_file_save(); } else { // never been saved action_file_save_as(); } // save break; case 1: // Discard clicked or Alt+D pressed // don't save but exit done = true; break; case 2: // Cancel clicked or Alt+C pressed or Escape pressed // don't exit done = true; rv = false; break; } } if(rv != false) { while ( !done && Playlist::get_instance()->getIsModified() ) { switch( QMessageBox::information( this, "Hydrogen", tr("\nThe current playlist contains unsaved changes.\n" "Do you want to discard the changes?\n"), tr("&Discard"), tr("&Cancel"), 0, // Enter == button 0 2 ) ) { // Escape == button 1 case 0: // Discard clicked or Alt+D pressed // don't save but exit done = true; break; case 1: // Cancel clicked or Alt+C pressed or Escape pressed // don't exit done = true; rv = false; break; } } } return rv; } void MainForm::usr1SignalHandler(int) { char a = 1; ::write(sigusr1Fd[0], &a, sizeof(a)); } void MainForm::handleSigUsr1() { snUsr1->setEnabled(false); char tmp; ::read(sigusr1Fd[1], &tmp, sizeof(tmp)); action_file_save(); snUsr1->setEnabled(true); } void MainForm::openUndoStack() { m_pUndoView->show(); m_pUndoView->setAttribute(Qt::WA_QuitOnClose, false); } void MainForm::action_undo(){ h2app->m_pUndoStack->undo(); } void MainForm::action_redo(){ h2app->m_pUndoStack->redo(); } void MainForm::undoRedoActionEvent( int nEvent ){ if( nEvent == 0 ) { h2app->m_pUndoStack->undo(); } else if(nEvent == 1) { h2app->m_pUndoStack->redo(); } } bool MainForm::handleSelectNextPrevSongOnPlaylist( int step ) { int nPlaylistSize = Playlist::get_instance()->size(); int nSongnumber = Playlist::get_instance()->getActiveSongNumber(); if( nSongnumber+step >= 0 && nSongnumber+step <= nPlaylistSize-1 ){ Playlist::get_instance()->setNextSongByNumber( nSongnumber + step ); } else { return false; } return true; } void MainForm::action_banks_properties() { QString sDrumkitName = Hydrogen::get_instance()->getCurrentDrumkitname(); Drumkit *pDrumkitInfo = nullptr; //User drumkit list QStringList usr_dks = Filesystem::usr_drumkit_list(); for (int i = 0; i < usr_dks.size(); ++i) { QString absPath = Filesystem::usr_drumkits_dir() + usr_dks[i]; Drumkit *pInfo = Drumkit::load( absPath ); if (pInfo) { if ( QString(pInfo->get_name() ) == sDrumkitName ){ pDrumkitInfo = pInfo; break; } } // Since Drumkit::load() calls New Drumkit() internally, we // have to take care of destroying it manually. delete pInfo; } //System drumkit list QStringList sys_dks = Filesystem::sys_drumkit_list(); for (int i = 0; i < sys_dks.size(); ++i) { QString absPath = Filesystem::sys_drumkits_dir() + sys_dks[i]; Drumkit *pInfo = Drumkit::load( absPath ); if (pInfo) { if ( QString( pInfo->get_name() ) == sDrumkitName ){ pDrumkitInfo = pInfo; break; } } // Since Drumkit::load() calls New Drumkit() internally, we // have to take care of destroying it manually. delete pInfo; } if( pDrumkitInfo ) { SoundLibraryPropertiesDialog dialog( this , pDrumkitInfo, pDrumkitInfo ); dialog.exec(); } else { QMessageBox::information( this, "Hydrogen", tr("Retrieving information about drumkit '%1' failed: drumkit does not exist.").arg( sDrumkitName ) ); } // Cleaning up the last pInfo we did not deleted due to the break // statement. delete pDrumkitInfo; } hydrogen-1.0.0-rc1/src/gui/src/MainForm.h000066400000000000000000000120571366722712400200540ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MAINFORM_H #define MAINFORM_H #include #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include "EventListener.h" #include #include class HydrogenApp; class QUndoView;///debug only /// /// Main window /// class MainForm : public QMainWindow, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: QApplication* m_pQApp; MainForm( QApplication *app, const QString& songFilename ); ~MainForm(); void updateRecentUsedSongList(); virtual void errorEvent( int nErrorCode ); virtual void jacksessionEvent( int nValue); virtual void playlistLoadSongEvent(int nIndex); virtual void undoRedoActionEvent( int nEvent ); static void usr1SignalHandler(int unused); public slots: void showPreferencesDialog(); void showUserManual(); void action_file_new(); void action_file_open(); void action_file_openDemo(); void action_file_save(); void action_file_save_as(); void action_file_openPattern(); void action_file_export_pattern_as(); bool action_file_exit(); void action_file_export(); void action_file_export_midi(); void action_file_export_lilypond(); void action_file_songProperties(); void action_help_about(); void action_report_bug(); void action_donate(); void action_instruments_addInstrument(); void action_instruments_clearAll(); void action_instruments_saveLibrary(); void action_instruments_saveAsLibrary(); void action_instruments_exportLibrary(); void action_instruments_importLibrary(); void action_instruments_onlineImportLibrary(); void action_instruments_addComponent(); void action_banks_properties(); void action_banks_open(); void action_window_showMixer(); void action_window_showPlaylistDialog(); void action_window_show_DirectorWidget(); void action_window_showSongEditor(); void action_window_showPatternEditor(); void action_window_showDrumkitManagerPanel(); void action_window_showAutomationArea(); void action_window_showTimeline(); void action_window_showPlaybackTrack(); void action_window_toggleFullscreen(); void update_mixer_checkbox(); void update_instrument_checkbox( bool show ); void update_automation_checkbox(); void update_director_checkbox(); void update_playlist_checkbox(); void action_debug_printObjects(); void action_debug_showAudioEngineInfo(); void closeEvent( QCloseEvent* ev ); void onPlayStopAccelEvent(); void onRestartAccelEvent(); void onBPMPlusAccelEvent(); void onBPMMinusAccelEvent(); void onSaveAsAccelEvent(); void onSaveAccelEvent(); void onOpenAccelEvent(); void action_file_open_recent( QAction *pAction ); void showDevelWarning(); void onLashPollTimer(); void openUndoStack(); void action_undo(); void action_redo(); void action_toggle_input_mode(); void handleSigUsr1(); void closeAll(); private slots: void onAutoSaveTimer(); void onPlaylistDisplayTimer(); void onFixMidiSetup(); protected: // Returns true if handled, false if aborted. bool handleUnsavedChanges(); private: HydrogenApp* h2app; static int sigusr1Fd[2]; QSocketNotifier *snUsr1; void functionDeleteInstrument(int instrument); QMenu * m_pInputModeMenu; QAction * m_pViewPlaylistEditorAction; QAction * m_pViewDirectorAction; QAction * m_pViewMixerAction; QAction * m_pViewMixerInstrumentRackAction; QAction * m_pViewAutomationPathAction; QAction * m_pViewTimelineAction; QAction * m_pViewPlaybackTrackAction; QAction * m_pInstrumentAction; QAction * m_pDrumkitAction; QMenu * m_pRecentFilesMenu; QAction * m_pRecentFileAction0; QAction * m_pRecentFileAction1; QAction * m_pRecentFileAction2; QAction * m_pRecentFileAction3; QAction * m_pRecentFileAction4; QUndoView * m_pUndoView;///debug only QTimer m_AutosaveTimer; /** Create the menubar */ void createMenuBar(); void openSongFile( const QString& sFilename ); void checkMidiSetup(); bool eventFilter( QObject *o, QEvent *e ); std::map keycodeInstrumentMap; void initKeyInstMap(); QString getAutoSaveFilename(); #ifdef H2CORE_HAVE_LASH QTimer *lashPollTimer; #endif bool handleSelectNextPrevSongOnPlaylist(int step); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Mixer/000077500000000000000000000000001366722712400172525ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/Mixer/Mixer.cpp000066400000000000000000000613171366722712400210520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Mixer.h" #include "MixerLine.h" #include "../Skin.h" #include "../HydrogenApp.h" #include "../LadspaFXProperties.h" #include "../InstrumentEditor/InstrumentEditorPanel.h" #include "../Widgets/Button.h" #include "../Widgets/PixmapWidget.h" #include #include #include #include #include #include #include #include #include #include using namespace H2Core; #include #define MIXER_STRIP_WIDTH 56 #define MASTERMIXER_STRIP_WIDTH 126 const char* Mixer::__class_name = "Mixer"; Mixer::Mixer( QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) { setWindowTitle( tr( "Mixer" ) ); setMaximumHeight( 284 ); setMinimumHeight( 284 ); setFixedHeight( 284 ); // fader Panel m_pFaderHBox = new QHBoxLayout(); m_pFaderHBox->setSpacing( 0 ); m_pFaderHBox->setMargin( 0 ); m_pFaderPanel = new QWidget( nullptr ); m_pFaderPanel->resize( MIXER_STRIP_WIDTH * MAX_INSTRUMENTS, height() ); m_pFaderPanel->setLayout( m_pFaderHBox ); m_pFaderScrollArea = new QScrollArea( nullptr ); m_pFaderScrollArea->setFrameShape( QFrame::NoFrame ); m_pFaderScrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pFaderScrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); m_pFaderScrollArea->setMinimumWidth( MIXER_STRIP_WIDTH * 4 ); m_pFaderScrollArea->setWidget( m_pFaderPanel ); for ( uint i = 0; i < MAX_INSTRUMENTS; ++i ) { m_pMixerLine[ i ] = nullptr; } //~ fader panel // fX frame m_pFXFrame = new PixmapWidget( nullptr ); m_pFXFrame->setFixedSize( 213, height() ); m_pFXFrame->setPixmap( "/mixerPanel/background_FX.png" ); for (uint nFX = 0; nFX < MAX_FX; nFX++) { m_pLadspaFXLine[nFX] = new LadspaFXMixerLine( m_pFXFrame ); m_pLadspaFXLine[nFX]->move( 13, 43 * nFX + 84 ); connect( m_pLadspaFXLine[nFX], SIGNAL( activeBtnClicked(LadspaFXMixerLine*) ), this, SLOT( ladspaActiveBtnClicked( LadspaFXMixerLine*) ) ); connect( m_pLadspaFXLine[nFX], SIGNAL( editBtnClicked(LadspaFXMixerLine*) ), this, SLOT( ladspaEditBtnClicked( LadspaFXMixerLine*) ) ); connect( m_pLadspaFXLine[nFX], SIGNAL( volumeChanged(LadspaFXMixerLine*) ), this, SLOT( ladspaVolumeChanged( LadspaFXMixerLine*) ) ); } if ( Preferences::get_instance()->isFXTabVisible() ) { m_pFXFrame->show(); } else { m_pFXFrame->hide(); } //~ fX frame // Master frame m_pMasterLine = new MasterMixerLine( nullptr ); m_pMasterLine->move( 0, 0 ); connect( m_pMasterLine, SIGNAL( volumeChanged(MasterMixerLine*) ), this, SLOT( masterVolumeChanged(MasterMixerLine*) ) ); m_pShowFXPanelBtn = new ToggleButton( m_pMasterLine, "/mixerPanel/showFX_on.png", "/mixerPanel/showFX_off.png", "/mixerPanel/showFX_over.png", QSize(42, 13) ); m_pShowFXPanelBtn->move( 67, 242 ); m_pShowFXPanelBtn->setPressed(false); m_pShowFXPanelBtn->setToolTip( tr( "Show FX panel" ) ); connect( m_pShowFXPanelBtn, SIGNAL(clicked(Button*)), this, SLOT( showFXPanelClicked(Button*))); m_pShowFXPanelBtn->setPressed( Preferences::get_instance()->isFXTabVisible() ); #ifndef H2CORE_HAVE_LADSPA m_pShowFXPanelBtn->hide(); #endif m_pShowPeaksBtn = new ToggleButton( m_pMasterLine, "/mixerPanel/showPeaks_on.png", "/mixerPanel/showPeaks_off.png", "/mixerPanel/showPeaks_over.png", QSize(42, 13) ); m_pShowPeaksBtn->move( 67, 258 ); m_pShowPeaksBtn->setPressed( (Preferences::get_instance())->showInstrumentPeaks() ); m_pShowPeaksBtn->setToolTip( tr( "Show instrument peaks" ) ); connect( m_pShowPeaksBtn, SIGNAL(clicked(Button*)), this, SLOT( showPeaksBtnClicked(Button*))); //~ Master frame // LAYOUT! QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing( 0 ); pLayout->setMargin( 0 ); pLayout->addWidget( m_pFaderScrollArea ); pLayout->addWidget( m_pFXFrame ); pLayout->addWidget( m_pMasterLine ); this->setLayout( pLayout ); m_pUpdateTimer = new QTimer( this ); connect( m_pUpdateTimer, SIGNAL( timeout() ), this, SLOT( updateMixer() ) ); m_pUpdateTimer->start(50); HydrogenApp::get_instance()->addEventListener( this ); } Mixer::~Mixer() { m_pUpdateTimer->stop(); } MixerLine* Mixer::createMixerLine( int nInstr ) { MixerLine *pMixerLine = new MixerLine( nullptr , nInstr); pMixerLine->setVolume( 0.2 ); pMixerLine->setMuteClicked( false ); pMixerLine->setSoloClicked( false ); connect( pMixerLine, SIGNAL( noteOnClicked(MixerLine*) ), this, SLOT( noteOnClicked(MixerLine*) ) ); connect( pMixerLine, SIGNAL( noteOffClicked(MixerLine*) ), this, SLOT( noteOffClicked(MixerLine*) ) ); connect( pMixerLine, SIGNAL( muteBtnClicked(MixerLine*) ), this, SLOT( muteClicked(MixerLine*) ) ); connect( pMixerLine, SIGNAL( soloBtnClicked(MixerLine*) ), this, SLOT( soloClicked(MixerLine*) ) ); connect( pMixerLine, SIGNAL( volumeChanged(MixerLine*) ), this, SLOT( volumeChanged(MixerLine*) ) ); connect( pMixerLine, SIGNAL( instrumentNameClicked(MixerLine*) ), this, SLOT( nameClicked(MixerLine*) ) ); connect( pMixerLine, SIGNAL( instrumentNameSelected(MixerLine*) ), this, SLOT( nameSelected(MixerLine*) ) ); connect( pMixerLine, SIGNAL( panChanged(MixerLine*) ), this, SLOT( panChanged( MixerLine*) ) ); connect( pMixerLine, SIGNAL( knobChanged(MixerLine*, int) ), this, SLOT( knobChanged( MixerLine*, int) ) ); return pMixerLine; } void Mixer::closeEvent( QCloseEvent* ev ) { HydrogenApp::get_instance()->showMixer(false); } ComponentMixerLine* Mixer::createComponentMixerLine( int theCompoID ) { ComponentMixerLine *pMixerLine = new ComponentMixerLine( nullptr , theCompoID); pMixerLine->setVolume( 0.2 ); pMixerLine->setMuteClicked( false ); pMixerLine->setSoloClicked( false ); connect( pMixerLine, SIGNAL( muteBtnClicked(ComponentMixerLine*) ), this, SLOT( muteClicked(ComponentMixerLine*) ) ); connect( pMixerLine, SIGNAL( soloBtnClicked(ComponentMixerLine*) ), this, SLOT( soloClicked(ComponentMixerLine*) ) ); connect( pMixerLine, SIGNAL( volumeChanged(ComponentMixerLine*) ), this, SLOT( volumeChanged(ComponentMixerLine*) ) ); return pMixerLine; } void Mixer::muteClicked(MixerLine* ref) { int nLine = findMixerLineByRef(ref); bool isMuteClicked = ref->isMuteClicked(); Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); pEngine->setSelectedInstrumentNumber( nLine ); pController->setStripIsMuted( nLine, isMuteClicked ); } void Mixer::muteClicked(ComponentMixerLine* ref) { bool isMuteClicked = ref->isMuteClicked(); DrumkitComponent *pCompo = Hydrogen::get_instance()->getSong()->get_component( ref->getCompoID() ); pCompo->set_muted( isMuteClicked ); } void Mixer::soloClicked(ComponentMixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); std::vector pCompoList = *(pSong->get_components()); int nComponents = pCompoList.size(); bool isSoloClicked = ref->isSoloClicked(); int nLine = findCompoMixerLineByRef(ref); if ( isSoloClicked ) { for ( int i = 0; i < nComponents ; ++i ) { ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[i]; p_tmpCompoMixer->setSoloClicked( false ); p_tmpCompoMixer->setMuteClicked( true ); DrumkitComponent* p_tmpCompo = pCompoList[i]; p_tmpCompo->set_muted( true ); } ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[nLine]; p_tmpCompoMixer->setSoloClicked( true ); p_tmpCompoMixer->setMuteClicked( false ); DrumkitComponent* p_tmpCompo = pCompoList[nLine]; p_tmpCompo->set_muted( false ); } else { for ( int i = 0; i < nComponents ; ++i ) { ComponentMixerLine* p_tmpCompoMixer = m_pComponentMixerLine[i]; p_tmpCompoMixer->setSoloClicked( false ); p_tmpCompoMixer->setMuteClicked( false ); DrumkitComponent* p_tmpCompo = pCompoList[i]; p_tmpCompo->set_muted( false ); } } } void Mixer::volumeChanged(ComponentMixerLine* ref) { float newVolume = ref->getVolume(); DrumkitComponent *pCompo = Hydrogen::get_instance()->getSong()->get_component( ref->getCompoID() ); pCompo->set_volume( newVolume ); } void Mixer::unmuteAll( bool findSelectedInstr ) { if(findSelectedInstr) { unmuteAll( Hydrogen::get_instance()->getSelectedInstrumentNumber() ); } else { unmuteAll( 0 ); } } void Mixer::unmuteAll( int selectedInstrument ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstruments = pInstrList->size(); for ( int i = 0; i < nInstruments; ++i ) { m_pMixerLine[i]->setMuteClicked( false ); m_pMixerLine[i]->setSoloClicked( false ); pInstrList->get( i )->set_muted( false ); } // select first instrument after unmute all Hydrogen::get_instance()->setSelectedInstrumentNumber(selectedInstrument); } void Mixer::soloClicked(MixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstruments = pInstrList->size(); int nLine = findMixerLineByRef(ref); pController->setStripIsSoloed( nLine, ref->isSoloClicked() ); for ( int i = 0; i < nInstruments; ++i ) { if( m_pMixerLine[i] ){ m_pMixerLine[i]->setSoloClicked( pInstrList->get(i)->is_soloed() ); m_pMixerLine[i]->setMuteClicked( pInstrList->get(i)->is_muted() ); } } Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); } /// used in PatternEditorInstrumentList void Mixer::soloClicked(uint nLine) { MixerLine * pMixerLine = m_pMixerLine[ nLine ]; if( pMixerLine ){ pMixerLine->setSoloClicked( !pMixerLine->isSoloClicked() ); soloClicked( pMixerLine ); } } bool Mixer::isSoloClicked( uint n ) { if ( n >= MAX_INSTRUMENTS || m_pMixerLine[ n ] == nullptr ) { return false; } return m_pMixerLine[ n ]->isSoloClicked(); } void Mixer::noteOnClicked( MixerLine* ref ) { int nLine = findMixerLineByRef( ref ); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); InstrumentList *pInstrList = song->get_instrument_list(); const float fPitch = 0.0f; Note *pNote = new Note( pInstrList->get(nLine), 0, 1.0, 0.5f, 0.5f, -1, fPitch ); AudioEngine::get_instance()->get_sampler()->note_on(pNote); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); } /// Play sample button, right-clicked (note off) void Mixer::noteOffClicked( MixerLine* ref ) { int nLine = findMixerLineByRef( ref ); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *instrList = pSong->get_instrument_list(); const float fPitch = 0.0f; Note *pNote = new Note( instrList->get( nLine ), 0, 1.0, 0.5, 0.5, -1, fPitch ); AudioEngine::get_instance()->get_sampler()->note_off(pNote); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); } uint Mixer::findMixerLineByRef(MixerLine* ref) { for (uint i = 0; i < MAX_INSTRUMENTS; i++) { if (m_pMixerLine[i] == ref) { return i; } } return 0; } uint Mixer::findCompoMixerLineByRef(ComponentMixerLine* ref) { for (std::map::iterator it=m_pComponentMixerLine.begin(); it!=m_pComponentMixerLine.end(); ++it) { if(it->second == ref) { return it->first; } } return 0; } void Mixer::volumeChanged(MixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); int nLine = findMixerLineByRef(ref); pController->setStripVolume( nLine, ref->getVolume() ); } void Mixer::masterVolumeChanged(MasterMixerLine* ref) { Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); float Volume = ref->getVolume(); pController->setMasterVolume( Volume ); } void Mixer::updateMixer() { Preferences *pPref = Preferences::get_instance(); bool bShowPeaks = pPref->showInstrumentPeaks(); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); std::vector* compoList = pSong->get_components(); uint nSelectedInstr = pEngine->getSelectedInstrumentNumber(); float fallOff = pPref->getMixerFalloffSpeed(); uint nMuteClicked = 0; int nInstruments = pInstrList->size(); int nCompo = compoList->size(); for ( unsigned nInstr = 0; nInstr < MAX_INSTRUMENTS; ++nInstr ) { if ( nInstr >= nInstruments ) { // unused instrument! let's hide and destroy the mixerline! if ( m_pMixerLine[ nInstr ] ) { delete m_pMixerLine[ nInstr ]; m_pMixerLine[ nInstr ] = nullptr; int newWidth = MIXER_STRIP_WIDTH * ( nInstruments + nCompo ); if ( m_pFaderPanel->width() != newWidth ) { m_pFaderPanel->resize( newWidth, height() ); } } continue; } else { if ( m_pMixerLine[ nInstr ] == nullptr ) { // the mixerline doesn't exists..I'll create a new one! m_pMixerLine[ nInstr ] = createMixerLine( nInstr ); m_pFaderHBox->insertWidget( nInstr, m_pMixerLine[ nInstr ] ); int newWidth = MIXER_STRIP_WIDTH * ( nInstruments + nCompo ); if ( m_pFaderPanel->width() != newWidth ) { m_pFaderPanel->resize( newWidth, height() ); } } MixerLine *pLine = m_pMixerLine[ nInstr ]; Instrument *pInstr = pInstrList->get( nInstr ); assert( pInstr ); float fNewPeak_L = pInstr->get_peak_l(); pInstr->set_peak_l( 0.0f ); // reset instrument peak float fNewPeak_R = pInstr->get_peak_r(); pInstr->set_peak_r( 0.0f ); // reset instrument peak float fNewVolume = pInstr->get_volume(); bool bMuted = pInstr->is_muted(); QString sName = pInstr->get_name(); float fPan_L = pInstr->get_pan_l(); float fPan_R = pInstr->get_pan_r(); // fader float fOldPeak_L = pLine->getPeak_L(); float fOldPeak_R = pLine->getPeak_R(); if (!bShowPeaks) { fNewPeak_L = 0.0f; fNewPeak_R = 0.0f; } if ( fNewPeak_L >= fOldPeak_L) { // LEFT peak pLine->setPeak_L( fNewPeak_L ); } else { pLine->setPeak_L( fOldPeak_L / fallOff ); } if ( fNewPeak_R >= fOldPeak_R) { // Right peak pLine->setPeak_R( fNewPeak_R ); } else { pLine->setPeak_R( fOldPeak_R / fallOff ); } // fader position pLine->setVolume( fNewVolume ); // mute if ( bMuted ) { nMuteClicked++; } pLine->setMuteClicked( bMuted ); // instr name pLine->setName( sName ); // pan float fPanValue = 0.0; if (fPan_R == 1.0) { fPanValue = 1.0 - (fPan_L / 2.0); } else { fPanValue = fPan_R / 2.0; } pLine->setPan( fPanValue ); // activity if ( pLine->getActivity() > 0 ) { pLine->setActivity( m_pMixerLine[ nInstr ]->getActivity() - 30 ); pLine->setPlayClicked( true ); } else { pLine->setPlayClicked( false ); } for (uint nFX = 0; nFX < MAX_FX; nFX++) { pLine->setFXLevel( nFX, pInstr->get_fx_level( nFX ) ); } pLine->setSelected( nInstr == nSelectedInstr ); pLine->updateMixerLine(); } } for (std::vector::iterator it = compoList->begin() ; it != compoList->end(); ++it) { DrumkitComponent* p_compo = *it; if( m_pComponentMixerLine.find(p_compo->get_id()) == m_pComponentMixerLine.end() ) { // the mixerline doesn't exists..I'll create a new one! m_pComponentMixerLine[ p_compo->get_id() ] = createComponentMixerLine( p_compo->get_id() ); m_pFaderHBox->addWidget( m_pComponentMixerLine[ p_compo->get_id() ] ); int newWidth = MIXER_STRIP_WIDTH * ( nInstruments + nCompo ); if ( m_pFaderPanel->width() != newWidth ) { m_pFaderPanel->resize( newWidth, height() ); } } ComponentMixerLine *pLine = m_pComponentMixerLine[ p_compo->get_id() ]; float fNewPeak_L = p_compo->get_peak_l(); p_compo->set_peak_l( 0.0f ); // reset instrument peak float fNewPeak_R = p_compo->get_peak_r(); p_compo->set_peak_r( 0.0f ); // reset instrument peak float fNewVolume = p_compo->get_volume(); bool bMuted = p_compo->is_muted(); QString sName = p_compo->get_name(); float fOldPeak_L = pLine->getPeak_L(); float fOldPeak_R = pLine->getPeak_R(); if (!bShowPeaks) { fNewPeak_L = 0.0f; fNewPeak_R = 0.0f; } if ( fNewPeak_L >= fOldPeak_L) { // LEFT peak pLine->setPeak_L( fNewPeak_L ); } else { pLine->setPeak_L( fOldPeak_L / fallOff ); } if ( fNewPeak_R >= fOldPeak_R) { // Right peak pLine->setPeak_R( fNewPeak_R ); } else { pLine->setPeak_R( fOldPeak_R / fallOff ); } // fader position pLine->setVolume( fNewVolume ); // mute if ( bMuted ) { nMuteClicked++; } pLine->setMuteClicked( bMuted ); // instr name pLine->setName( sName ); pLine->updateMixerLine(); } if( compoList->size() < m_pComponentMixerLine.size() ) { std::vector* p_ids_to_delete = new std::vector(); for (std::map::iterator it=m_pComponentMixerLine.begin(); it!=m_pComponentMixerLine.end(); ++it) { bool p_foundExistingRelatedComponent = false; for ( std::vector::iterator it2 = compoList->begin() ; it2 != compoList->end(); ++it2 ) { DrumkitComponent* p_compo = *it2; if( p_compo->get_id() == it->first ) { p_foundExistingRelatedComponent = true; break; } } if( !p_foundExistingRelatedComponent ) { p_ids_to_delete->push_back( it->first ) ; } } for ( std::vector::iterator it = p_ids_to_delete->begin() ; it != p_ids_to_delete->end(); ++it ) { int p_compoID = *it; delete m_pComponentMixerLine[p_compoID]; m_pComponentMixerLine.erase( p_compoID ); int newWidth = MIXER_STRIP_WIDTH * ( nInstruments + nCompo ); if ( m_pFaderPanel->width() != newWidth ) { m_pFaderPanel->resize( newWidth, height() ); } } } if (nMuteClicked == nInstruments - 1) { // find the not muted button for (uint i = 0; i < nInstruments; i++) { Instrument *instr = pInstrList->get(i); if (instr->is_muted() == false) { m_pMixerLine[i]->setSoloClicked(true); break; } } } else { for (uint i = 0; i < nInstruments; i++) { m_pMixerLine[i]->setSoloClicked(false); } } // update MasterPeak float oldPeak_L = m_pMasterLine->getPeak_L(); float newPeak_L = pEngine->getMasterPeak_L(); pEngine->setMasterPeak_L(0.0); float oldPeak_R = m_pMasterLine->getPeak_R(); float newPeak_R = pEngine->getMasterPeak_R(); pEngine->setMasterPeak_R(0.0); if (!bShowPeaks) { newPeak_L = 0.0; newPeak_R = 0.0; } if (newPeak_L >= oldPeak_L) { m_pMasterLine->setPeak_L( newPeak_L ); } else { m_pMasterLine->setPeak_L( oldPeak_L / fallOff ); } if (newPeak_R >= oldPeak_R) { m_pMasterLine->setPeak_R(newPeak_R); } else { m_pMasterLine->setPeak_R( oldPeak_R / fallOff ); } // set master fader position float newVolume = pSong->get_volume(); float oldVolume = m_pMasterLine->getVolume(); if (oldVolume != newVolume) { m_pMasterLine->setVolume(newVolume); } m_pMasterLine->updateMixerLine(); #ifdef H2CORE_HAVE_LADSPA // LADSPA for (uint nFX = 0; nFX < MAX_FX; nFX++) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX( nFX ); if ( pFX ) { m_pLadspaFXLine[nFX]->setName( pFX->getPluginName() ); float fNewPeak_L = 0.0; float fNewPeak_R = 0.0; float fOldPeak_L = 0.0; float fOldPeak_R = 0.0; m_pLadspaFXLine[nFX]->getPeaks( &fOldPeak_L, &fOldPeak_R ); if (fNewPeak_L < fOldPeak_L) fNewPeak_L = fOldPeak_L / fallOff; if (fNewPeak_R < fOldPeak_R) fNewPeak_R = fOldPeak_R / fallOff; m_pLadspaFXLine[nFX]->setPeaks( fNewPeak_L, fNewPeak_R ); m_pLadspaFXLine[nFX]->setFxActive( pFX->isEnabled() ); m_pLadspaFXLine[nFX]->setVolume( pFX->getVolume() ); } else { m_pLadspaFXLine[nFX]->setName( "No plugin" ); m_pLadspaFXLine[nFX]->setFxActive( false ); m_pLadspaFXLine[nFX]->setVolume( 0.0 ); } } // ~LADSPA #endif } /// show event void Mixer::showEvent ( QShowEvent *ev ) { UNUSED( ev ); updateMixer(); } /// hide event void Mixer::hideEvent ( QHideEvent *ev ) { UNUSED( ev ); } void Mixer::nameClicked(MixerLine* ref) { UNUSED( ref ); InstrumentEditorPanel::get_instance()->show(); } void Mixer::nameSelected(MixerLine* ref) { int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); } void Mixer::panChanged(MixerLine* ref) { float panValue = ref->getPan(); int nLine = findMixerLineByRef(ref); Hydrogen *pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); pController->setStripPan( nLine, panValue ); } void Mixer::knobChanged(MixerLine* ref, int nKnob) { int nLine = findMixerLineByRef(ref); Hydrogen::get_instance()->setSelectedInstrumentNumber( nLine ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get(nLine); pInstr->set_fx_level( ref->getFXLevel(nKnob), nKnob ); QString sInfo = tr( "Set FX %1 level ").arg( nKnob + 1 ); ( HydrogenApp::get_instance() )->setStatusBarMessage( sInfo+ QString( "[%1]" ).arg( ref->getFXLevel(nKnob), 0, 'f', 2 ), 2000 ); Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine); } void Mixer::noteOnEvent( int nInstrument ) { if ( m_pMixerLine[ nInstrument ] ) { m_pMixerLine[ nInstrument ]->setActivity( 100 ); } } void Mixer::resizeEvent ( QResizeEvent *ev ) { UNUSED( ev ); } void Mixer::showFXPanelClicked(Button* ref) { if ( ref->isPressed() ) { m_pFXFrame->show(); Preferences::get_instance()->setFXTabVisible( true ); } else { m_pFXFrame->hide(); Preferences::get_instance()->setFXTabVisible( false ); } resizeEvent( nullptr ); // force an update } void Mixer::showPeaksBtnClicked(Button* ref) { Preferences *pPref = Preferences::get_instance(); if ( ref->isPressed() ) { pPref->setInstrumentPeaks( true ); ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Show instrument peaks = On"), 2000 ); } else { pPref->setInstrumentPeaks( false ); ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Show instrument peaks = Off"), 2000 ); } } void Mixer::ladspaActiveBtnClicked( LadspaFXMixerLine* ref ) { #ifdef H2CORE_HAVE_LADSPA bool bActive = ref->isFxActive(); for (uint nFX = 0; nFX < MAX_FX; nFX++) { if (ref == m_pLadspaFXLine[ nFX ] ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX(nFX); if (pFX) { pFX->setEnabled( bActive ); } break; } } #else QMessageBox::critical( this, "Hydrogen", tr("LADSPA effects are not available in this version of Hydrogen.") ); #endif } void Mixer::ladspaEditBtnClicked( LadspaFXMixerLine *ref ) { #ifdef H2CORE_HAVE_LADSPA for (uint nFX = 0; nFX < MAX_FX; nFX++) { if (ref == m_pLadspaFXLine[ nFX ] ) { HydrogenApp::get_instance()->getLadspaFXProperties(nFX)->hide(); HydrogenApp::get_instance()->getLadspaFXProperties(nFX)->show(); } } Hydrogen::get_instance()->getSong()->set_is_modified( true ); #else QMessageBox::critical( this, "Hydrogen", tr("LADSPA effects are not available in this version of Hydrogen.") ); #endif } void Mixer::ladspaVolumeChanged( LadspaFXMixerLine* ref) { #ifdef H2CORE_HAVE_LADSPA Song *pSong = (Hydrogen::get_instance() )->getSong(); pSong->set_is_modified( true ); for (uint nFX = 0; nFX < MAX_FX; nFX++) { if (ref == m_pLadspaFXLine[ nFX ] ) { LadspaFX *pFX = Effects::get_instance()->getLadspaFX(nFX); if (pFX) { pFX->setVolume( ref->getVolume() ); QString sInfo = tr( "Set LADSPA FX ( %1 ) volume").arg( QString(pFX->getPluginName() ) ); HydrogenApp::get_instance()->setStatusBarMessage( sInfo+ QString( " [%1]" ).arg( ref->getVolume(), 0, 'f', 2 ), 2000 ); } } } #endif } void Mixer::getPeaksInMixerLine( uint nMixerLine, float& fPeak_L, float& fPeak_R ) { if ( nMixerLine < MAX_INSTRUMENTS ) { fPeak_L = m_pMixerLine[ nMixerLine ]->getPeak_L(); fPeak_R = m_pMixerLine[ nMixerLine ]->getPeak_R(); } else { fPeak_L = 0; fPeak_R = 0; } } hydrogen-1.0.0-rc1/src/gui/src/Mixer/Mixer.h000066400000000000000000000064021366722712400205110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIXER_H #define MIXER_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include "../EventListener.h" class Button; class ToggleButton; class MixerLine; class ComponentMixerLine; class FxMixerLine; class MasterMixerLine; class LadspaFXMixerLine; class PixmapWidget; class Mixer : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: Mixer(QWidget* parent); ~Mixer(); void showEvent ( QShowEvent *ev ); void hideEvent ( QHideEvent *ev ); void resizeEvent ( QResizeEvent *ev ); void soloClicked(uint nLine); bool isSoloClicked(uint nLine); void getPeaksInMixerLine( uint nMixerLine, float& fPeak_L, float& fPeak_R ); public slots: void noteOnClicked(MixerLine* ref); void noteOffClicked(MixerLine* ref); void muteClicked(MixerLine* ref); void muteClicked(ComponentMixerLine* ref); void unmuteAll( bool findSelectedInstr); void unmuteAll( int selectedInstr); void soloClicked(MixerLine* ref); void soloClicked(ComponentMixerLine* ref); void volumeChanged(MixerLine* ref); void volumeChanged(ComponentMixerLine* ref); void panChanged(MixerLine* ref); void knobChanged(MixerLine* ref, int nKnob); void masterVolumeChanged(MasterMixerLine*); void nameClicked(MixerLine* ref); void nameSelected(MixerLine* ref); void updateMixer(); void showFXPanelClicked(Button* ref); void showPeaksBtnClicked(Button* ref); void ladspaActiveBtnClicked( LadspaFXMixerLine* ref ); void ladspaEditBtnClicked( LadspaFXMixerLine *ref ); void ladspaVolumeChanged( LadspaFXMixerLine* ref); void closeEvent(QCloseEvent *event); private: QHBoxLayout * m_pFaderHBox; LadspaFXMixerLine * m_pLadspaFXLine[MAX_FX]; QScrollArea* m_pFaderScrollArea; ToggleButton * m_pShowFXPanelBtn; ToggleButton * m_pShowPeaksBtn; MasterMixerLine * m_pMasterLine; QWidget * m_pFaderPanel; MixerLine * m_pMixerLine[MAX_INSTRUMENTS]; std::map m_pComponentMixerLine; PixmapWidget * m_pFXFrame; QTimer * m_pUpdateTimer; uint findMixerLineByRef(MixerLine* ref); uint findCompoMixerLineByRef(ComponentMixerLine* ref); MixerLine* createMixerLine( int ); ComponentMixerLine* createComponentMixerLine( int ); // Implements EventListener interface virtual void noteOnEvent( int nInstrument ); //~ Implements EventListener interface }; #endif hydrogen-1.0.0-rc1/src/gui/src/Mixer/MixerLine.cpp000066400000000000000000000673021366722712400216620ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "../InstrumentEditor/InstrumentEditor.h" #include "../HydrogenApp.h" #include "../Skin.h" #include "../Widgets/Fader.h" #include "../Widgets/Rotary.h" #include "../Widgets/Button.h" #include "../Widgets/LCD.h" #include #include #include #include using namespace H2Core; #include "MixerLine.h" #define MIXERLINE_WIDTH 56 #define MIXERLINE_HEIGHT 254 #define MASTERMIXERLINE_WIDTH 126 #define MASTERMIXERLINE_HEIGHT 284 #define MIXERLINE_LABEL_H 115 #define MASTERMIXERLINE_FADER_H 75 using namespace H2Core; const char* MixerLine::__class_name = "MixerLine"; MixerLine::MixerLine(QWidget* parent, int nInstr) : PixmapWidget( parent, __class_name ) { // INFOLOG( "INIT" ); m_nWidth = MIXERLINE_WIDTH; m_nHeight = MIXERLINE_HEIGHT; m_fMaxPeak = 0.0; m_nActivity = 0; m_bIsSelected = false; m_nPeakTimer = 0; Action* pAction; resize( m_nWidth, m_nHeight ); setFixedSize( m_nWidth, m_nHeight ); setPixmap( "/mixerPanel/mixerline_background.png" ); // Play sample button m_pPlaySampleBtn = new Button( this, "/mixerPanel/btn_play_on.png", "/mixerPanel/btn_play_off.png", "/mixerPanel/btn_play_over.png", QSize( 18, 13 ) ); m_pPlaySampleBtn->move( 8, 2 ); m_pPlaySampleBtn->setToolTip( tr( "Play sample" ) ); connect(m_pPlaySampleBtn, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); connect(m_pPlaySampleBtn, SIGNAL(rightClicked(Button*)), this, SLOT(rightClick(Button*))); // Trigger sample LED m_pTriggerSampleLED = new Button( this, "/mixerPanel/led_trigger_on.png", "/mixerPanel/led_trigger_off.png", "/mixerPanel/led_trigger_off.png", QSize( 5, 13 ) ); m_pTriggerSampleLED->move( 26, 2 ); connect(m_pTriggerSampleLED, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); // Mute button m_pMuteBtn = new ToggleButton( this, "/mixerPanel/btn_mute_on.png", "/mixerPanel/btn_mute_off.png", "/mixerPanel/btn_mute_over.png", QSize( 18, 13 ) ); m_pMuteBtn->move( 8, 17 ); m_pMuteBtn->setToolTip( tr( "Mute" ) ); connect(m_pMuteBtn, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); // Solo button m_pSoloBtn = new ToggleButton( this, "/mixerPanel/btn_solo_on.png", "/mixerPanel/btn_solo_off.png", "/mixerPanel/btn_solo_over.png", QSize( 18, 13 ) ); m_pSoloBtn->move( 30, 17); m_pSoloBtn->setToolTip( tr( "Solo" ) ); connect(m_pSoloBtn, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); // pan rotary m_pPanRotary = new Rotary( this, Rotary::TYPE_CENTER, tr( "Pan" ), false, true); m_pPanRotary->move( 14, 32 ); connect( m_pPanRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( panChanged(Rotary*) ) ); pAction = new Action("PAN_ABSOLUTE"); pAction->setParameter1( QString::number(nInstr )); pAction->setParameter2( QString::number( 1 )); m_pPanRotary->setAction(pAction); // FX send uint y = 0; for (uint i = 0; i < MAX_FX; i++) { m_pKnob[i] = new Knob(this); pAction = new Action(QString( "EFFECT%1_LEVEL_ABSOLUTE" ).arg( QString::number(i+1) )); pAction->setParameter1( QString::number( nInstr ) ); m_pKnob[i]->setAction( pAction ); if ( (i % 2) == 0 ) { m_pKnob[i]->move( 9, 63 + (20 * y) ); } else { m_pKnob[i]->move( 30, 63 + (20 * y) ); y++; } connect( m_pKnob[i], SIGNAL( valueChanged(Knob*) ), this, SLOT( knobChanged(Knob*) ) ); } Preferences *pPref = Preferences::get_instance(); float fFalloffTemp = pPref->getMixerFalloffSpeed(); fFalloffTemp = (fFalloffTemp * 20) - 2; m_nFalloff = (int)fFalloffTemp; QPixmap textBackground; bool ok = textBackground.load( Skin::getImagePath() + "/mixerPanel/mixerline_text_background.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } // instrument name widget m_pNameWidget = new InstrumentNameWidget( this ); m_pNameWidget->move( 6, 128 ); m_pNameWidget->setToolTip( tr( "Instrument name (double click to edit)" ) ); connect( m_pNameWidget, SIGNAL( doubleClicked () ), this, SLOT( nameClicked() ) ); connect( m_pNameWidget, SIGNAL( clicked () ), this, SLOT( nameSelected() ) ); // m_pFader m_pFader = new Fader( this, false, false ); m_pFader->move( 23, 128 ); m_pFader->setMinValue( 0.0 ); m_pFader->setMaxValue( 1.5 ); connect( m_pFader, SIGNAL( valueChanged(Fader*) ), this, SLOT( faderChanged(Fader*) ) ); pAction = new Action("STRIP_VOLUME_ABSOLUTE"); pAction->setParameter1( QString::number(nInstr) ); m_pFader->setAction( pAction ); m_pPeakLCD = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 4 ); m_pPeakLCD->move( 10, 106 ); m_pPeakLCD->setText( "0.00" ); QPalette lcdPalette; lcdPalette.setColor( QPalette::Background, QColor( 49, 53, 61 ) ); m_pPeakLCD->setPalette( lcdPalette ); } MixerLine::~MixerLine() { // INFOLOG( "DESTROY" ); //delete m_pFader; } void MixerLine::updateMixerLine() { if ( m_nPeakTimer > m_nFalloff ) { if ( m_fMaxPeak > 0.05f ) { m_fMaxPeak = m_fMaxPeak - 0.05f; } else { m_fMaxPeak = 0.0f; m_nPeakTimer = 0; } char tmp[20]; snprintf(tmp, 19, "%#.2f", (double)m_fMaxPeak ); m_pPeakLCD->setText(tmp); if ( m_fMaxPeak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } } m_nPeakTimer++; } void MixerLine::click(Button *ref) { Song *song = (Hydrogen::get_instance())->getSong(); if (ref == m_pMuteBtn) { song->set_is_modified(true); emit muteBtnClicked(this); } else if (ref == m_pSoloBtn) { song->set_is_modified(true); emit soloBtnClicked(this); } else if (ref == m_pPlaySampleBtn) { emit noteOnClicked(this); } } void MixerLine::rightClick(Button *ref) { if (ref == m_pPlaySampleBtn) { emit noteOffClicked(this); } } void MixerLine::faderChanged(Fader *ref) { Song *pSong = (Hydrogen::get_instance())->getSong(); pSong->set_is_modified( true ); emit volumeChanged(this); double value = (double) ref->getValue(); ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Set instrument volume [%1]" ).arg( value, 0, 'f', 2 ), 2000 ); } bool MixerLine::isMuteClicked() { return m_pMuteBtn->isPressed(); } void MixerLine::setMuteClicked(bool isClicked) { m_pMuteBtn->setPressed(isClicked); } bool MixerLine::isSoloClicked() { return m_pSoloBtn->isPressed(); } void MixerLine::setSoloClicked(bool isClicked) { m_pSoloBtn->setPressed(isClicked); } float MixerLine::getVolume() { return m_pFader->getValue(); } void MixerLine::setVolume( float value ) { m_pFader->setValue( value ); } void MixerLine::setPeak_L( float peak ) { if (peak != getPeak_L() ) { m_pFader->setPeak_L( peak ); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText( tmp ); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float MixerLine::getPeak_L() { return m_pFader->getPeak_L(); } void MixerLine::setPeak_R( float peak ) { if (peak != getPeak_R() ) { m_pFader->setPeak_R( peak ); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText( tmp ); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float MixerLine::getPeak_R() { return m_pFader->getPeak_R(); } void MixerLine::nameClicked() { emit instrumentNameClicked(this); } void MixerLine::nameSelected() { emit instrumentNameSelected(this); } void MixerLine::panChanged(Rotary *ref) { Song *pSong = Hydrogen::get_instance()->getSong(); pSong->set_is_modified( true ); emit panChanged( this ); float panValue = ref->getValue(); float pan_L, pan_R; if (panValue > 0.5) { pan_L = (1.0 - panValue) * 2.0; pan_R = 1.0; } else { pan_L = 1.0; pan_R = panValue * 2.0; } char m_pFaderPos[100]; snprintf( m_pFaderPos, 99, "%#.2fL, %#.2fR", pan_L, pan_R); HydrogenApp::get_instance()->setStatusBarMessage( tr( "Set instr. pan [%1]" ).arg( m_pFaderPos ), 2000 ); m_pPanRotary->setToolTip( QString("Pan ") + QString( m_pFaderPos ) ); } float MixerLine::getPan() { return m_pPanRotary->getValue(); } void MixerLine::setPan(float fValue) { if ( fValue != m_pPanRotary->getValue() ) { m_pPanRotary->setValue( fValue ); float pan_L, pan_R; if (fValue > 0.5) { pan_L = (1.0 - fValue) * 2.0; pan_R = 1.0; } else { pan_L = 1.0; pan_R = fValue * 2.0; } char m_pFaderPos[100]; snprintf( m_pFaderPos, 99,"Pan %#.2fL, %#.2fR", pan_L, pan_R); m_pPanRotary->setToolTip( QString( m_pFaderPos ) ); } } void MixerLine::setPlayClicked( bool clicked ) { m_pTriggerSampleLED->setPressed( clicked ); } void MixerLine::knobChanged(Knob* pRef) { // infoLog( "knobChanged" ); for (uint i = 0; i < MAX_FX; i++) { if (m_pKnob[i] == pRef) { emit knobChanged( this, i ); break; } } } void MixerLine::setFXLevel( uint nFX, float fValue ) { if (nFX >= MAX_FX) { ERRORLOG( QString("[setFXLevel] nFX >= MAX_FX (nFX=%1)").arg(nFX) ); return; } m_pKnob[nFX]->setValue( fValue ); } float MixerLine::getFXLevel(uint nFX) { if (nFX >= MAX_FX) { ERRORLOG( QString("[setFXLevel] nFX >= MAX_FX (nFX=%1)").arg(nFX) ); return 0.0f; } return m_pKnob[nFX]->getValue(); } void MixerLine::setSelected( bool bIsSelected ) { if (m_bIsSelected == bIsSelected ) return; m_bIsSelected = bIsSelected; if (m_bIsSelected) { setPixmap( "/mixerPanel/mixerline_background_on.png" ); } else { setPixmap( "/mixerPanel/mixerline_background.png" ); } } // :::::::::::::::::::::::::::: const char* ComponentMixerLine::__class_name = "ComponentMixerLine"; ComponentMixerLine::ComponentMixerLine(QWidget* parent, int CompoID) : PixmapWidget( parent, __class_name ) { // INFOLOG( "INIT" ); __compoID = CompoID; m_nWidth = MIXERLINE_WIDTH; m_nHeight = MIXERLINE_HEIGHT; m_fMaxPeak = 0.0; m_nActivity = 0; m_bIsSelected = false; m_nPeakTimer = 0; resize( m_nWidth, m_nHeight ); setFixedSize( m_nWidth, m_nHeight ); setPixmap( "/mixerPanel/componentmixerline_background.png" ); // Mute button m_pMuteBtn = new ToggleButton( this, "/mixerPanel/btn_mute_on.png", "/mixerPanel/btn_mute_off.png", "/mixerPanel/btn_mute_over.png", QSize( 18, 13 ) ); m_pMuteBtn->move( 8, 17 ); m_pMuteBtn->setToolTip( tr( "Mute" ) ); connect(m_pMuteBtn, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); // Solo button m_pSoloBtn = new ToggleButton( this, "/mixerPanel/btn_solo_on.png", "/mixerPanel/btn_solo_off.png", "/mixerPanel/btn_solo_over.png", QSize( 18, 13 ) ); m_pSoloBtn->move( 30, 17); m_pSoloBtn->setToolTip( tr( "Solo" ) ); connect(m_pSoloBtn, SIGNAL(clicked(Button*)), this, SLOT(click(Button*))); Preferences *pPref = Preferences::get_instance(); float fFalloffTemp = pPref->getMixerFalloffSpeed(); fFalloffTemp = (fFalloffTemp * 20) - 2; m_nFalloff = (int)fFalloffTemp; QPixmap textBackground; bool ok = textBackground.load( Skin::getImagePath() + "/mixerPanel/mixerline_text_background.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } // instrument name widget m_pNameWidget = new InstrumentNameWidget( this ); m_pNameWidget->move( 6, 128 ); m_pNameWidget->setToolTip( tr( "Component name" ) ); // m_pFader m_pFader = new Fader( this, false, false ); m_pFader->move( 23, 128 ); m_pFader->setMinValue( 0.0 ); m_pFader->setMaxValue( 1.5 ); connect( m_pFader, SIGNAL( valueChanged(Fader*) ), this, SLOT( faderChanged(Fader*) ) ); //pAction = new MidiAction("STRIP_VOLUME_ABSOLUTE"); //pAction->setParameter1( QString::number(nInstr) ); //m_pFader->setAction( pAction ); m_pPeakLCD = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 4 ); m_pPeakLCD->move( 10, 106 ); m_pPeakLCD->setText( "0.00" ); QPalette lcdPalette; lcdPalette.setColor( QPalette::Background, QColor( 49, 53, 61 ) ); m_pPeakLCD->setPalette( lcdPalette ); } ComponentMixerLine::~ComponentMixerLine() { // INFOLOG( "DESTROY" ); //delete m_pFader; } void ComponentMixerLine::updateMixerLine() { if ( m_nPeakTimer > m_nFalloff ) { if ( m_fMaxPeak > 0.05f ) { m_fMaxPeak = m_fMaxPeak - 0.05f; } else { m_fMaxPeak = 0.0f; m_nPeakTimer = 0; } char tmp[20]; snprintf(tmp, 19, "%#.2f", (double)m_fMaxPeak ); m_pPeakLCD->setText(tmp); if ( m_fMaxPeak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } } m_nPeakTimer++; } void ComponentMixerLine::click(Button *ref) { Song *pSong = (Hydrogen::get_instance())->getSong(); if (ref == m_pMuteBtn) { pSong->set_is_modified( true ); emit muteBtnClicked(this); } else if (ref == m_pSoloBtn) { pSong->set_is_modified( true ); emit soloBtnClicked(this); } } void ComponentMixerLine::faderChanged(Fader *ref) { Song *pSong = (Hydrogen::get_instance())->getSong(); pSong->set_is_modified( true ); emit volumeChanged(this); double value = (double) ref->getValue(); ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Set instrument volume [%1]" ).arg( value, 0, 'f', 2 ), 2000 ); } bool ComponentMixerLine::isMuteClicked() { return m_pMuteBtn->isPressed(); } void ComponentMixerLine::setMuteClicked(bool isClicked) { m_pMuteBtn->setPressed(isClicked); } bool ComponentMixerLine::isSoloClicked() { return m_pSoloBtn->isPressed(); } void ComponentMixerLine::setSoloClicked(bool isClicked) { m_pSoloBtn->setPressed(isClicked); } float ComponentMixerLine::getVolume() { return m_pFader->getValue(); } void ComponentMixerLine::setVolume( float value ) { m_pFader->setValue( value ); } void ComponentMixerLine::setPeak_L( float peak ) { if (peak != getPeak_L() ) { m_pFader->setPeak_L( peak ); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText( tmp ); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float ComponentMixerLine::getPeak_L() { return m_pFader->getPeak_L(); } void ComponentMixerLine::setPeak_R( float peak ) { if (peak != getPeak_R() ) { m_pFader->setPeak_R( peak ); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText( tmp ); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float ComponentMixerLine::getPeak_R() { return m_pFader->getPeak_R(); } // :::::::::::::::::::::::::::: const char* MasterMixerLine::__class_name = "MasterMixerLine"; MasterMixerLine::MasterMixerLine(QWidget* parent) : PixmapWidget( parent, __class_name ) { m_nWidth = MASTERMIXERLINE_WIDTH; m_nHeight = MASTERMIXERLINE_HEIGHT; m_nPeakTimer = 0; setMinimumSize( m_nWidth, m_nHeight ); setMaximumSize( m_nWidth, m_nHeight ); resize( m_nWidth, m_nHeight ); QPalette defaultPalette; defaultPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); this->setPalette( defaultPalette ); // Background image setPixmap( "/mixerPanel/masterMixerline_background.png" ); Preferences *pPref = Preferences::get_instance(); float fFalloffTemp = pPref->getMixerFalloffSpeed(); fFalloffTemp = (fFalloffTemp * 20) - 2; m_nFalloff = (int)fFalloffTemp; m_pMasterFader = new MasterFader( this ); m_pMasterFader->setMin( 0.0 ); m_pMasterFader->setMax( 1.5 ); m_pMasterFader->move( 24, MASTERMIXERLINE_FADER_H ); connect( m_pMasterFader, SIGNAL( valueChanged(MasterFader*) ), this, SLOT( faderChanged(MasterFader*) ) ); Action* pAction = new Action("MASTER_VOLUME_ABSOLUTE"); m_pMasterFader->setAction( pAction ); m_pPeakLCD = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 4 ); m_pPeakLCD->move( 23, 53 ); m_pPeakLCD->setText( "0.00" ); QPalette lcdPalette; lcdPalette.setColor( QPalette::Background, QColor( 49, 53, 61 ) ); m_pPeakLCD->setPalette( lcdPalette ); m_pHumanizeVelocityRotary = new Rotary( this, Rotary::TYPE_NORMAL, tr( "Humanize velocity" ), false, false ); m_pHumanizeVelocityRotary->move( 74, 88 ); connect( m_pHumanizeVelocityRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pHumanizeTimeRotary = new Rotary( this, Rotary::TYPE_NORMAL, tr( "Humanize time" ), false, false ); m_pHumanizeTimeRotary->move( 74, 125 ); connect( m_pHumanizeTimeRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); m_pSwingRotary = new Rotary( this, Rotary::TYPE_NORMAL, tr( "Swing" ), false, false ); m_pSwingRotary->move( 74, 162 ); connect( m_pSwingRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); // Mute btn m_pMuteBtn = new ToggleButton( this, "/mixerPanel/master_mute_on.png", "/mixerPanel/master_mute_off.png", "/mixerPanel/master_mute_over.png", QSize( 42, 13 ) ); m_pMuteBtn->move( 20, 32 ); connect( m_pMuteBtn, SIGNAL( clicked(Button*) ), this, SLOT( muteClicked(Button*) ) ); m_pMuteBtn->setAction( new Action("MUTE_TOGGLE")); } MasterMixerLine::~MasterMixerLine() { m_fMaxPeak = 0.0; } void MasterMixerLine::muteClicked(Button* pBtn) { Hydrogen::get_instance()->getCoreActionController()->setMasterIsMuted( pBtn->isPressed() ); } void MasterMixerLine::faderChanged(MasterFader *ref) { m_pMasterFader->setValue( ref->getValue() ); emit volumeChanged(this); Song *pSong = Hydrogen::get_instance()->getSong(); pSong->set_is_modified( true ); double value = (double) ref->getValue(); ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Set master volume [%1]" ).arg( value, 0, 'f', 2 ), 2000 ); } float MasterMixerLine::getVolume() { return m_pMasterFader->getValue(); } void MasterMixerLine::setVolume( float value ) { m_pMasterFader->setValue( value ); } void MasterMixerLine::setPeak_L(float peak) { if ( peak != getPeak_L() ) { m_pMasterFader->setPeak_L(peak); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText(tmp); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float MasterMixerLine::getPeak_L() { return m_pMasterFader->getPeak_L(); } void MasterMixerLine::setPeak_R(float peak) { if ( peak != getPeak_R() ) { m_pMasterFader->setPeak_R(peak); if (peak > m_fMaxPeak) { if ( peak < 0.1f ) { peak = 0.0f; } char tmp[20]; snprintf(tmp, 19,"%#.2f", peak); m_pPeakLCD->setText(tmp); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; m_nPeakTimer = 0; } } } float MasterMixerLine::getPeak_R() { return m_pMasterFader->getPeak_R(); } void MasterMixerLine::updateMixerLine() { if ( m_nPeakTimer > m_nFalloff ) { if ( m_fMaxPeak > 0.05f ) { m_fMaxPeak = m_fMaxPeak - 0.05f; } else { m_fMaxPeak = 0.0f; m_nPeakTimer = 0; } char tmp[20]; snprintf(tmp, 19, "%#.2f", m_fMaxPeak ); m_pPeakLCD->setText(tmp); if ( m_fMaxPeak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } } m_nPeakTimer++; Song *pSong = Hydrogen::get_instance()->getSong(); if ( pSong ) { m_pHumanizeTimeRotary->setValue( pSong->get_humanize_time_value() ); m_pHumanizeVelocityRotary->setValue( pSong->get_humanize_velocity_value() ); m_pSwingRotary->setValue( pSong->get_swing_factor() ); m_pMuteBtn->setPressed( pSong->__is_muted ); } else { WARNINGLOG( "pSong == NULL "); } } void MasterMixerLine::rotaryChanged( Rotary *pRef ) { QString sMsg; double fVal = (double) pRef->getValue(); Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( pRef == m_pHumanizeTimeRotary ) { pEngine->getSong()->set_humanize_time_value( fVal ); sMsg = tr( "Set humanize time parameter [%1]").arg( fVal, 0, 'f', 2 ); } else if ( pRef == m_pHumanizeVelocityRotary ) { pEngine->getSong()->set_humanize_velocity_value( fVal ); sMsg = tr( "Set humanize velocity parameter [%1]").arg( fVal, 0, 'f', 2 ); } else if ( pRef == m_pSwingRotary ) { pEngine->getSong()->set_swing_factor( fVal ); sMsg = tr( "Set swing factor [%1]").arg( fVal, 0, 'f', 2 ); } else { ERRORLOG( "[knobChanged] Unhandled knob" ); } AudioEngine::get_instance()->unlock(); ( HydrogenApp::get_instance() )->setStatusBarMessage( sMsg, 2000 ); } ///////////////////////////////////////// FxMixerLine::FxMixerLine(QWidget* parent) : PixmapWidget( parent, "FxMixerLine" ) { m_nWidth = MIXERLINE_WIDTH; m_nHeight = MIXERLINE_HEIGHT; setMinimumSize( m_nWidth, m_nHeight ); setMaximumSize( m_nWidth, m_nHeight ); resize( m_nWidth, m_nHeight ); m_fMaxPeak = 0.0; // MixerLine Background image setPixmap( "/mixerPanel/mixerline_background.png" ); // active button activeBtn = new ToggleButton( this, "/mixerPanel/btn_on_on.png", "/mixerPanel/btn_on_off.png", "/mixerPanel/btn_on_over.png", QSize( 18, 12 ) ); activeBtn->move( 2, 5 ); activeBtn->setToolTip( tr( "FX on/off") ); connect( activeBtn, SIGNAL( clicked(Button*) ), this, SLOT( click(Button*) ) ); // m_pFader m_pFader = new Fader( this, false, false ); m_pFader->move( 22, 106 ); connect( m_pFader, SIGNAL( valueChanged(Fader*) ), this, SLOT( faderChanged(Fader*) ) ); m_pNameWidget = new InstrumentNameWidget( this ); m_pNameWidget->move( 2, 106 ); m_pNameWidget->setText( tr( "Master output" ) ); m_pPeakLCD = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 4 ); m_pPeakLCD->move( 2, MIXERLINE_LABEL_H ); m_pPeakLCD->setText( "0.00" ); } FxMixerLine::~FxMixerLine() { delete m_pFader; } void FxMixerLine::click(Button *ref) { Song *pSong = Hydrogen::get_instance()->getSong(); if (ref == activeBtn ) { pSong->set_is_modified( true ); emit activeBtnClicked( this ); } } void FxMixerLine::faderChanged(Fader *ref) { UNUSED( ref ); m_fMaxPeak = 0.0; char tmp[20]; snprintf( tmp, 19, "%#.2f", m_fMaxPeak ); m_pPeakLCD->setText( tmp ); if ( m_fMaxPeak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } Song *pSong = Hydrogen::get_instance()->getSong(); pSong->set_is_modified( true ); emit volumeChanged( this ); } float FxMixerLine::getVolume() { return m_pFader->getValue(); } void FxMixerLine::setVolume( float value ) { m_pFader->setValue( value ); } void FxMixerLine::setPeak_L( float peak ) { if (peak != getPeak_L() ) { m_pFader->setPeak_L( peak ); if (peak > m_fMaxPeak) { char tmp[20]; snprintf(tmp, 19,"%#.2f", peak); m_pPeakLCD->setText(tmp); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; } } } float FxMixerLine::getPeak_L() { return m_pFader->getPeak_L(); } void FxMixerLine::setPeak_R(float peak) { if (peak != getPeak_R() ) { m_pFader->setPeak_R( peak ); if (peak > m_fMaxPeak) { char tmp[20]; snprintf(tmp, 19, "%#.2f", peak); m_pPeakLCD->setText(tmp); if ( peak > 1.0 ) { m_pPeakLCD->setSmallRed(); } else { m_pPeakLCD->setSmallBlue(); } m_fMaxPeak = peak; } } } float FxMixerLine::getPeak_R() { return m_pFader->getPeak_R(); } bool FxMixerLine::isFxActive() { return activeBtn->isPressed(); } void FxMixerLine::setFxActive( bool active ) { activeBtn->setPressed( active ); } //////////////////////////////// InstrumentNameWidget::InstrumentNameWidget(QWidget* parent) : PixmapWidget( parent, "InstrumentNameWidget" ) { // infoLog( "INIT" ); m_nWidgetWidth = 17; m_nWidgetHeight = 116; Preferences *pPref = Preferences::get_instance(); QString family = pPref->getMixerFontFamily(); int size = pPref->getMixerFontPointSize(); m_mixerFont.setFamily( family ); m_mixerFont.setPointSize( size ); setPixmap( "/mixerPanel/mixerline_label_background.png" ); this->resize( m_nWidgetWidth, m_nWidgetHeight ); } InstrumentNameWidget::~InstrumentNameWidget() { // infoLog( "DESTROY" ); } void InstrumentNameWidget::paintEvent( QPaintEvent* ev ) { PixmapWidget::paintEvent( ev ); QPainter p( this ); p.setPen( QColor(230, 230, 230) ); p.setFont( m_mixerFont ); p.rotate( -90 ); p.drawText( -m_nWidgetHeight + 5, 0, m_nWidgetHeight - 10, m_nWidgetWidth, Qt::AlignVCenter, m_sInstrName ); } void InstrumentNameWidget::setText( QString text ) { if (m_sInstrName != text ) { m_sInstrName = text; update(); } } QString InstrumentNameWidget::text() { return m_sInstrName; } void InstrumentNameWidget::mousePressEvent( QMouseEvent * e ) { UNUSED( e ); emit clicked(); } void InstrumentNameWidget::mouseDoubleClickEvent( QMouseEvent * e ) { UNUSED( e ); emit doubleClicked(); } // ::::::::::::::::::::: LadspaFXMixerLine::LadspaFXMixerLine(QWidget* parent) : PixmapWidget( parent, "LadspaFXMixerLine" ) { resize( 194, 43 ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); setPixmap( "/mixerPanel/fxline_background.png" ); // active button m_pActiveBtn = new ToggleButton( this, "/mixerPanel/bypass_on.png", "/mixerPanel/bypass_off.png", "/mixerPanel/bypass_over.png", QSize( 30, 13 ) ); m_pActiveBtn->move( 55, 25 ); m_pActiveBtn->setToolTip( tr( "FX bypass") ); connect( m_pActiveBtn, SIGNAL( clicked(Button*) ), this, SLOT( click(Button*) ) ); // edit button m_pEditBtn = new Button( this, "/mixerPanel/edit_on.png", "/mixerPanel/edit_off.png", "/mixerPanel/edit_over.png", QSize( 30, 13 ) ); m_pEditBtn->move( 87, 25 ); m_pEditBtn->setToolTip( tr( "Edit FX parameters") ); connect( m_pEditBtn, SIGNAL( clicked(Button*) ), this, SLOT( click(Button*) ) ); // instrument name widget m_pNameLCD = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 13 ); m_pNameLCD->move( 11, 9 ); m_pNameLCD->setText( "No name" ); m_pNameLCD->setToolTip( tr( "Ladspa FX name" ) ); // m_pRotary m_pRotary = new Rotary( this, Rotary::TYPE_NORMAL, tr( "Effect return" ), false, false ); m_pRotary->setDefaultValue( m_pRotary->getMax() ); m_pRotary->move( 132, 4 ); connect( m_pRotary, SIGNAL( valueChanged(Rotary*) ), this, SLOT( rotaryChanged(Rotary*) ) ); } LadspaFXMixerLine::~LadspaFXMixerLine() { // infoLog( "DESTROY" ); } void LadspaFXMixerLine::setName(QString name) { m_pNameLCD->setText( name ); } void LadspaFXMixerLine::click(Button *ref) { if ( ref == m_pActiveBtn ) { emit activeBtnClicked( this ); } else if( ref == m_pEditBtn ) { emit editBtnClicked( this ); } } bool LadspaFXMixerLine::isFxActive() { return !m_pActiveBtn->isPressed(); } void LadspaFXMixerLine::setFxActive( bool active ) { m_pActiveBtn->setPressed( !active ); } void LadspaFXMixerLine::rotaryChanged(Rotary *ref) { UNUSED( ref ); m_fMaxPeak = 0.0; Song *pSong = Hydrogen::get_instance()->getSong(); pSong->set_is_modified( true ); emit volumeChanged(this); } void LadspaFXMixerLine::setPeaks( float fPeak_L, float fPeak_R ) { UNUSED( fPeak_L ); UNUSED( fPeak_R ); } void LadspaFXMixerLine::getPeaks( float *fPeak_L, float *fPeak_R ) { UNUSED( fPeak_L ); UNUSED( fPeak_R ); } float LadspaFXMixerLine::getVolume() { return m_pRotary->getValue(); } void LadspaFXMixerLine::setVolume(float value) { m_pRotary->setValue( value ); } hydrogen-1.0.0-rc1/src/gui/src/Mixer/MixerLine.h000066400000000000000000000165001366722712400213210ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIXERLINE_H #define MIXERLINE_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include class Fader; class MasterFader; class PanFader; class Knob; class Button; class ToggleButton; class InstrumentPropertiesDialog; class InstrumentNameWidget; class LCDDisplay; class Rotary; #include "../Widgets/PixmapWidget.h" class InstrumentNameWidget : public PixmapWidget { H2_OBJECT Q_OBJECT public: InstrumentNameWidget(QWidget* parent); ~InstrumentNameWidget(); void setText(QString text); QString text(); void mousePressEvent( QMouseEvent * e ); void mouseDoubleClickEvent( QMouseEvent * e ); signals: void clicked(); void doubleClicked(); protected: virtual void paintEvent(QPaintEvent *ev); private: int m_nWidgetWidth; int m_nWidgetHeight; QString m_sInstrName; QFont m_mixerFont; }; /// /// A mixer strip /// class MixerLine: public PixmapWidget { H2_OBJECT Q_OBJECT public: MixerLine(QWidget* parent, int nInstr); ~MixerLine(); void updateMixerLine(); bool isMuteClicked(); void setMuteClicked(bool isClicked); bool isSoloClicked(); void setSoloClicked(bool isClicked); float getVolume(); void setVolume(float value); void setPeak_L( float peak ); float getPeak_L(); void setPeak_R( float peak ); float getPeak_R(); void setName(QString name) { m_pNameWidget->setText( name ); } QString getName() { return m_pNameWidget->text(); } float getPan(); void setPan(float value); int getActivity() { return m_nActivity; } void setActivity( uint value ) { m_nActivity = value; } void setPlayClicked( bool clicked ); void setFXLevel( uint nFX, float fValue ); float getFXLevel( uint nFX ); void setSelected( bool bIsSelected ); signals: void muteBtnClicked(MixerLine *ref); void soloBtnClicked(MixerLine *ref); void volumeChanged(MixerLine *ref); void instrumentNameClicked(MixerLine *ref); void instrumentNameSelected(MixerLine *ref); void noteOnClicked(MixerLine *ref); void noteOffClicked(MixerLine *ref); void panChanged(MixerLine *ref); void knobChanged(MixerLine *ref, int nKnob); public slots: void click(Button *ref); void rightClick(Button *ref); void faderChanged(Fader *ref); void panChanged(Rotary *ref); void knobChanged(Knob *ref); void nameClicked(); void nameSelected(); private: uint m_nWidth; uint m_nHeight; bool m_bIsSelected; uint m_nActivity; uint m_nPeakTimer; float m_fMaxPeak; float m_nFalloff; Fader * m_pFader; Rotary* m_pPanRotary; InstrumentNameWidget * m_pNameWidget; ToggleButton * m_pMuteBtn; ToggleButton * m_pSoloBtn; Button * m_pPlaySampleBtn; Button * m_pTriggerSampleLED; Knob * m_pKnob[MAX_FX]; LCDDisplay * m_pPeakLCD; }; class ComponentMixerLine: public PixmapWidget { H2_OBJECT Q_OBJECT public: ComponentMixerLine(QWidget* parent, int CompoID); ~ComponentMixerLine(); void updateMixerLine(); bool isMuteClicked(); void setMuteClicked(bool isClicked); bool isSoloClicked(); void setSoloClicked(bool isClicked); float getVolume(); void setVolume(float value); void setPeak_L( float peak ); float getPeak_L(); void setPeak_R( float peak ); float getPeak_R(); void setName(QString name) { m_pNameWidget->setText( name ); } QString getName() { return m_pNameWidget->text(); } int getCompoID(){ return __compoID; } signals: void muteBtnClicked(ComponentMixerLine *ref); void soloBtnClicked(ComponentMixerLine *ref); void volumeChanged(ComponentMixerLine *ref); public slots: void click(Button *ref); void faderChanged(Fader *ref); private: int __compoID; uint m_nWidth; uint m_nHeight; bool m_bIsSelected; uint m_nActivity; uint m_nPeakTimer; float m_fMaxPeak; float m_nFalloff; Fader * m_pFader; InstrumentNameWidget * m_pNameWidget; ToggleButton * m_pMuteBtn; ToggleButton * m_pSoloBtn; LCDDisplay * m_pPeakLCD; }; class MasterMixerLine: public PixmapWidget { H2_OBJECT Q_OBJECT public: MasterMixerLine(QWidget* parent); ~MasterMixerLine(); void updateMixerLine(); float getVolume(); void setVolume(float value); void setPeak_L(float peak); float getPeak_L(); void setPeak_R(float peak); float getPeak_R(); signals: void volumeChanged(MasterMixerLine *ref); public slots: void faderChanged(MasterFader * ref); void rotaryChanged( Rotary *pRef ); void muteClicked(Button*); private: uint m_nWidth; uint m_nHeight; uint m_nPeakTimer; float m_fMaxPeak; float m_nFalloff; Fader * m_pFader; MasterFader * m_pMasterFader; LCDDisplay * m_pPeakLCD; Rotary * m_pSwingRotary; Rotary * m_pHumanizeTimeRotary; Rotary * m_pHumanizeVelocityRotary; ToggleButton * m_pMuteBtn; }; /// /// Mixer strip for FX /// class FxMixerLine: public PixmapWidget { H2_OBJECT Q_OBJECT public: FxMixerLine(QWidget* parent); ~FxMixerLine(); float getVolume(); void setVolume(float value); void setPeak_L(float peak); float getPeak_L(); void setPeak_R(float peak); float getPeak_R(); void setName(QString name) { m_pNameWidget->setText( name ); } QString getName() { return m_pNameWidget->text(); } bool isFxActive(); void setFxActive( bool active ); signals: void volumeChanged( FxMixerLine *ref ); void instrumentNameClicked( FxMixerLine *ref ); void activeBtnClicked( FxMixerLine *ref ); public slots: void click(Button *ref); void faderChanged(Fader * ref); private: uint m_nWidth; uint m_nHeight; float m_fMaxPeak; Fader * m_pFader; InstrumentNameWidget * m_pNameWidget; ToggleButton * activeBtn; LCDDisplay * m_pPeakLCD; }; class LadspaFXMixerLine : public PixmapWidget { H2_OBJECT Q_OBJECT public: LadspaFXMixerLine(QWidget* parent); ~LadspaFXMixerLine(); bool isFxActive(); void setFxActive( bool active ); void setPeaks( float fPeak_L, float fPeak_R ); void getPeaks( float *fPeak_L, float *fPeak_R ); void setName( QString name ); float getVolume(); void setVolume( float value ); public slots: void click(Button *ref); void rotaryChanged(Rotary * ref); signals: void activeBtnClicked( LadspaFXMixerLine *ref ); void editBtnClicked( LadspaFXMixerLine *ref ); void volumeChanged( LadspaFXMixerLine *ref); private: float m_fMaxPeak; ToggleButton * m_pActiveBtn; Button * m_pEditBtn; Rotary * m_pRotary; LCDDisplay * m_pNameLCD; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/000077500000000000000000000000001366722712400207525ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/DrumPatternEditor.cpp000066400000000000000000001306401366722712400250760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "DrumPatternEditor.h" #include "PatternEditorPanel.h" #include "NotePropertiesRuler.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "UndoActions.h" #include "../HydrogenApp.h" #include "../Mixer/Mixer.h" #include "../Skin.h" #include #include #include using namespace std; using namespace H2Core; const char* DrumPatternEditor::__class_name = "DrumPatternEditor"; DrumPatternEditor::DrumPatternEditor(QWidget* parent, PatternEditorPanel *panel) : QWidget( parent ) , Object( __class_name ) , m_nResolution( 8 ) , m_bUseTriplets( false ) , m_bRightBtnPressed( false ) , m_pDraggedNote( nullptr ) , m_pPattern( nullptr ) , m_pPatternEditorPanel( panel ) { setFocusPolicy(Qt::ClickFocus); m_nGridWidth = Preferences::get_instance()->getPatternEditorGridWidth(); m_nGridHeight = Preferences::get_instance()->getPatternEditorGridHeight(); unsigned nEditorWidth = 20 + m_nGridWidth * ( MAX_NOTES * 4 ); m_nEditorHeight = m_nGridHeight * MAX_INSTRUMENTS; resize( nEditorWidth, m_nEditorHeight ); HydrogenApp::get_instance()->addEventListener( this ); } DrumPatternEditor::~DrumPatternEditor() { } void DrumPatternEditor::updateEditor() { Hydrogen* engine = Hydrogen::get_instance(); // check engine state int state = engine->getState(); if ( (state != STATE_READY) && (state != STATE_PLAYING) ) { ERRORLOG( "FIXME: skipping pattern editor update (state should be READY or PLAYING)" ); return; } Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { m_pPattern = pPatternList->get( nSelectedPatternNumber ); } else { m_pPattern = nullptr; } __selectedPatternNumber = nSelectedPatternNumber; uint nEditorWidth; if ( m_pPattern ) { nEditorWidth = 20 + m_nGridWidth * m_pPattern->get_length(); } else { nEditorWidth = 20 + m_nGridWidth * MAX_NOTES; } resize( nEditorWidth, height() ); // redraw all update( 0, 0, width(), height() ); } int DrumPatternEditor::getColumn(QMouseEvent *ev) { int nBase; if (m_bUseTriplets) { nBase = 3; } else { nBase = 4; } float nWidth = (m_nGridWidth * 4 * MAX_NOTES) / (nBase * m_nResolution); int x = ev->x(); int nColumn; nColumn = x - 20 + (nWidth / 2); nColumn = nColumn / nWidth; nColumn = (nColumn * 4 * MAX_NOTES) / (nBase * m_nResolution); return nColumn; } void DrumPatternEditor::mousePressEvent(QMouseEvent *ev) { if ( m_pPattern == nullptr ) { return; } Song *pSong = Hydrogen::get_instance()->getSong(); int nInstruments = pSong->get_instrument_list()->size(); int row = (int)( ev->y() / (float)m_nGridHeight); if (row >= nInstruments) { return; } int nColumn = getColumn( ev ); int nRealColumn = 0; if( ev->x() > 20 ) { nRealColumn = ev->x() / static_cast(m_nGridWidth) - 20; } if ( nColumn >= (int)m_pPattern->get_length() ) { update( 0, 0, width(), height() ); return; } Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( row ); if( ev->button() == Qt::LeftButton && (ev->modifiers() & Qt::ShiftModifier) ) { //shift + leftClick: add noteOff note SE_addNoteRightClickAction *action = new SE_addNoteRightClickAction( nColumn, row, __selectedPatternNumber ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } else if (ev->button() == Qt::LeftButton ) { H2Core::Note *pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument ); int oldLength = -1; float oldVelocity = 0.8f; float oldPan_L = 0.5f; float oldPan_R = 0.5f; float oldLeadLag = 0.0f; Note::Key oldNoteKeyVal = Note::C; Note::Octave oldOctaveKeyVal = Note::P8; bool noteExisted = false; if( pDraggedNote ){ oldLength = pDraggedNote->get_length(); oldVelocity = pDraggedNote->get_velocity(); oldPan_L = pDraggedNote->get_pan_l(); oldPan_R = pDraggedNote->get_pan_r(); oldLeadLag = pDraggedNote->get_lead_lag(); oldNoteKeyVal = pDraggedNote->get_key(); oldOctaveKeyVal = pDraggedNote->get_octave(); noteExisted = true; } SE_addNoteAction *action = new SE_addNoteAction( nColumn, row, __selectedPatternNumber, oldLength, oldVelocity, oldPan_L, oldPan_R, oldLeadLag, oldNoteKeyVal, oldOctaveKeyVal, noteExisted, Preferences::get_instance()->getHearNewNotes(), false, false); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } else if (ev->button() == Qt::RightButton ) { m_bRightBtnPressed = true; m_pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, false ); // needed for undo note length __nRealColumn = nRealColumn; __nColumn = nColumn; __row = row; if( m_pDraggedNote ){ __oldLength = m_pDraggedNote->get_length(); } else { __oldLength = -1; } } } void DrumPatternEditor::addOrDeleteNoteAction( int nColumn, int row, int selectedPatternNumber, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal, bool listen, bool isMidi, bool isInstrumentMode, bool isNoteOff) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); H2Core::Pattern *pPattern; if ( ( selectedPatternNumber != -1 ) && ( (uint)selectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( selectedPatternNumber ); } else { pPattern = nullptr; } Song *pSong = Hydrogen::get_instance()->getSong(); Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( row ); m_bRightBtnPressed = false; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine bool bNoteAlreadyExist = false; if(!isInstrumentMode){ Pattern::notes_t* notes = (Pattern::notes_t*)pPattern->get_notes(); FOREACH_NOTE_IT_BOUND(notes,it,nColumn) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() == pSelectedInstrument ) { // the note exists...remove it! bNoteAlreadyExist = true; delete pNote; notes->erase( it ); break; } } } else { Note* note = pPattern->find_note( nColumn, -1, pSelectedInstrument, (Note::Key)oldNoteKeyVal, (Note::Octave)oldOctaveKeyVal ); if( note ) { // the note exists...remove it! bNoteAlreadyExist = true; m_pPattern->remove_note( note ); delete note; } } if ( bNoteAlreadyExist == false ) { // create the new note unsigned nPosition = nColumn; float fVelocity = oldVelocity; float fPan_L = oldPan_L ; float fPan_R = oldPan_R; int nLength = oldLength; if( isNoteOff ) { fVelocity = 0.0f; fPan_L = 0.5f; fPan_R = 0.5f; nLength = 1; } const float fPitch = 0.0f; Note *pNote = new Note( pSelectedInstrument, nPosition, fVelocity, fPan_L, fPan_R, nLength, fPitch ); pNote->set_note_off( isNoteOff ); if( !isNoteOff ) pNote->set_lead_lag( oldLeadLag ); pNote->set_key_octave( (Note::Key)oldNoteKeyVal, (Note::Octave)oldOctaveKeyVal ); pPattern->insert_note( pNote ); if(isMidi){ pNote->set_just_recorded(true); } // hear note if ( listen && !isNoteOff ) { Note *pNote2 = new Note( pSelectedInstrument, 0, fVelocity, fPan_L, fPan_R, nLength, fPitch); AudioEngine::get_instance()->get_sampler()->note_on(pNote2); } } pSong->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine // update the selected line int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if (nSelectedInstrument != row) { Hydrogen::get_instance()->setSelectedInstrumentNumber( row ); } else { update( 0, 0, width(), height() ); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } } void DrumPatternEditor::mouseReleaseEvent(QMouseEvent *ev) { UNUSED( ev ); setCursor( QCursor( Qt::ArrowCursor ) ); if (m_pPattern == nullptr) { return; } if ( m_bRightBtnPressed && m_pDraggedNote ) { if ( m_pDraggedNote->get_note_off() ) return; SE_editNoteLenghtAction *action = new SE_editNoteLenghtAction( m_pDraggedNote->get_position(), m_pDraggedNote->get_position(), __row, m_pDraggedNote->get_length(),__oldLength, __selectedPatternNumber); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } void DrumPatternEditor::editNoteLengthAction( int nColumn, int nRealColumn, int row, int length, int selectedPatternNumber ) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); H2Core::Pattern *pPattern; if ( (selectedPatternNumber != -1) && ( (uint)selectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( selectedPatternNumber ); } else { pPattern = nullptr; } Note *pDraggedNote; Song *pSong = pEngine->getSong(); Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( row ); AudioEngine::get_instance()->lock( RIGHT_HERE ); pDraggedNote = pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, false ); if( pDraggedNote ){ pDraggedNote->set_length( length ); } AudioEngine::get_instance()->unlock(); update( 0, 0, width(), height() ); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::mouseMoveEvent(QMouseEvent *ev) { if (m_pPattern == nullptr) { return; } int row = MAX_INSTRUMENTS - 1 - (ev->y() / (int)m_nGridHeight); if (row >= MAX_INSTRUMENTS) { return; } if ( m_bRightBtnPressed && m_pDraggedNote ) { if ( m_pDraggedNote->get_note_off() ) return; int nTickColumn = getColumn( ev ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine int nLen = nTickColumn - (int)m_pDraggedNote->get_position(); if (nLen <= 0) { nLen = -1; } float fNotePitch = m_pDraggedNote->get_octave() * 12 + m_pDraggedNote->get_key(); float fStep = 0; if(nLen > -1){ fStep = pow( 1.0594630943593, ( double )fNotePitch ); }else { fStep = 1.0; } m_pDraggedNote->set_length( nLen * fStep); Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine //__draw_pattern(); update( 0, 0, width(), height() ); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); } } void DrumPatternEditor::keyPressEvent (QKeyEvent *ev) { ev->ignore(); } /// /// Draws a pattern /// void DrumPatternEditor::__draw_pattern(QPainter& painter) { const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); const QColor selectedRowColor( pStyle->m_patternEditor_selectedRowColor.getRed(), pStyle->m_patternEditor_selectedRowColor.getGreen(), pStyle->m_patternEditor_selectedRowColor.getBlue() ); __create_background( painter ); if (m_pPattern == nullptr) { return; } int nNotes = m_pPattern->get_length(); int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); InstrumentList * pInstrList = pSong->get_instrument_list(); if ( m_nEditorHeight != (int)( m_nGridHeight * pInstrList->size() ) ) { // the number of instruments is changed...recreate all m_nEditorHeight = m_nGridHeight * pInstrList->size(); resize( width(), m_nEditorHeight ); } for ( uint nInstr = 0; nInstr < pInstrList->size(); ++nInstr ) { uint y = m_nGridHeight * nInstr; if ( nInstr == (uint)nSelectedInstrument ) { // selected instrument painter.fillRect( 0, y + 1, ( 20 + nNotes * m_nGridWidth ), m_nGridHeight - 1, selectedRowColor ); } } // draw the grid __draw_grid( painter ); /* BUGFIX if m_pPattern is not renewed every time we draw a note, hydrogen will crash after you save a song and create a new one. -smoors */ Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { m_pPattern = pPatternList->get( nSelectedPatternNumber ); } else { m_pPattern = nullptr; } // ~ FIX if( m_pPattern->get_notes()->size() == 0) return; const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *note = it->second; assert( note ); __draw_note( note, painter ); } } QColor DrumPatternEditor::computeNoteColor( float velocity ){ int red; int green; int blue; /* The note gets painted black if it has the default velocity (0.8). The color changes if you alter the velocity.. */ //qDebug() << "x: " << x; //qDebug() << "x2: " << x*x; if( velocity < 0.8){ red = fabs(-( velocity - 0.8))*255; green = fabs(-( velocity - 0.8))*255; blue = green * 1.25; } else { green = blue = 0; red = (velocity-0.8)*5*255; } //qDebug() << "R " << red << "G " << green << "blue " << blue; return QColor( red, green, blue ); } /// /// Draws a note /// void DrumPatternEditor::__draw_note( Note *note, QPainter& p ) { static const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); static const QColor noteColor( pStyle->m_patternEditor_noteColor.getRed(), pStyle->m_patternEditor_noteColor.getGreen(), pStyle->m_patternEditor_noteColor.getBlue() ); static const QColor noteoffColor( pStyle->m_patternEditor_noteoffColor.getRed(), pStyle->m_patternEditor_noteoffColor.getGreen(), pStyle->m_patternEditor_noteoffColor.getBlue() ); p.setRenderHint( QPainter::Antialiasing ); int nInstrument = -1; InstrumentList * pInstrList = Hydrogen::get_instance()->getSong()->get_instrument_list(); for ( uint nInstr = 0; nInstr < pInstrList->size(); ++nInstr ) { Instrument *pInstr = pInstrList->get( nInstr ); if ( pInstr == note->get_instrument() ) { nInstrument = nInstr; break; } } if ( nInstrument == -1 ) { ERRORLOG( "Instrument not found..skipping note" ); return; } uint pos = note->get_position(); p.setPen( noteColor ); QColor color = computeNoteColor( note->get_velocity() ); uint w = 8; uint h = m_nGridHeight / 3; if ( note->get_length() == -1 && note->get_note_off() == false ) { // trigger note uint x_pos = 20 + (pos * m_nGridWidth);// - m_nGridWidth / 2.0; uint y_pos = ( nInstrument * m_nGridHeight) + (m_nGridHeight / 2) - 3; p.setBrush( color ); p.drawEllipse( x_pos -4 , y_pos, w, h ); } else if ( note->get_length() == 1 && note->get_note_off() == true ){ p.setPen( noteoffColor ); uint x_pos = 20 + ( pos * m_nGridWidth );// - m_nGridWidth / 2.0; uint y_pos = ( nInstrument * m_nGridHeight ) + (m_nGridHeight / 2) - 3; p.setBrush(QColor( noteoffColor)); p.drawEllipse( x_pos -4 , y_pos, w, h ); } else { float fNotePitch = note->get_octave() * 12 + note->get_key(); float fStep = pow( 1.0594630943593, ( double )fNotePitch ); uint x = 20 + (pos * m_nGridWidth); int w = m_nGridWidth * note->get_length() / fStep; w = w - 1; // lascio un piccolo spazio tra una nota ed un altra int y = (int) ( ( nInstrument ) * m_nGridHeight + (m_nGridHeight / 100.0 * 30.0) ); int h = (int) (m_nGridHeight - ((m_nGridHeight / 100.0 * 30.0) * 2.0) ); p.setBrush( color ); p.fillRect( x, y + 1, w, h + 1, color ); /// \todo: definire questo colore nelle preferenze p.drawRect( x, y + 1, w, h + 1 ); } } void DrumPatternEditor::__draw_grid( QPainter& p ) { static const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); static const QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); static const QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); static const QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); static const QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); static const QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); // vertical lines p.setPen( QPen( res_1, 0, Qt::DotLine ) ); int nBase; if (m_bUseTriplets) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nNotes = MAX_NOTES; if ( m_pPattern ) { nNotes = m_pPattern->get_length(); } if (!m_bUseTriplets) { for ( int i = 0; i < nNotes + 1; i++ ) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (m_nResolution >= 4) { p.setPen( QPen( res_1, 0 ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n8th) == 0 ) { if (m_nResolution >= 8) { p.setPen( QPen( res_2, 0 ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n16th) == 0 ) { if (m_nResolution >= 16) { p.setPen( QPen( res_3, 0 ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n32th) == 0 ) { if (m_nResolution >= 32) { p.setPen( QPen( res_4, 0 ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n64th) == 0 ) { if (m_nResolution >= 64) { p.setPen( QPen( res_5, 0 ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * m_nResolution); for ( int i = 0; i < nNotes + 1; i++ ) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0 ) ); } else { p.setPen( QPen( res_3, 0 ) ); } p.drawLine(x, 1, x, m_nEditorHeight - 1); nCounter++; } } } // fill the first half of the rect with a solid color static const QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); static const QColor selectedRowColor( pStyle->m_patternEditor_selectedRowColor.getRed(), pStyle->m_patternEditor_selectedRowColor.getGreen(), pStyle->m_patternEditor_selectedRowColor.getBlue() ); int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); int nInstruments = pSong->get_instrument_list()->size(); for ( uint i = 0; i < (uint)nInstruments; i++ ) { uint y = m_nGridHeight * i + 1; if ( i == (uint)nSelectedInstrument ) { p.fillRect( 0, y, (20 + nNotes * m_nGridWidth), (int)( m_nGridHeight * 0.7 ), selectedRowColor ); } else { p.fillRect( 0, y, (20 + nNotes * m_nGridWidth), (int)( m_nGridHeight * 0.7 ), backgroundColor ); } } } void DrumPatternEditor::__create_background( QPainter& p) { static const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); static const QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); static const QColor alternateRowColor( pStyle->m_patternEditor_alternateRowColor.getRed(), pStyle->m_patternEditor_alternateRowColor.getGreen(), pStyle->m_patternEditor_alternateRowColor.getBlue() ); static const QColor lineColor( pStyle->m_patternEditor_lineColor.getRed(), pStyle->m_patternEditor_lineColor.getGreen(), pStyle->m_patternEditor_lineColor.getBlue() ); int nNotes = MAX_NOTES; if ( m_pPattern ) { nNotes = m_pPattern->get_length(); } Song *pSong = Hydrogen::get_instance()->getSong(); int nInstruments = pSong->get_instrument_list()->size(); if ( m_nEditorHeight != (int)( m_nGridHeight * nInstruments ) ) { // the number of instruments is changed...recreate all m_nEditorHeight = m_nGridHeight * nInstruments; resize( width(), m_nEditorHeight ); } p.fillRect(0, 0, 20 + nNotes * m_nGridWidth, height(), backgroundColor); for ( uint i = 0; i < (uint)nInstruments; i++ ) { uint y = m_nGridHeight * i; if ( ( i % 2) != 0) { p.fillRect( 0, y, (20 + nNotes * m_nGridWidth), m_nGridHeight, alternateRowColor ); } } // horizontal lines p.setPen( lineColor ); for ( uint i = 0; i < (uint)nInstruments; i++ ) { uint y = m_nGridHeight * i + m_nGridHeight; p.drawLine( 0, y, (20 + nNotes * m_nGridWidth), y); } p.drawLine( 0, m_nEditorHeight, (20 + nNotes * m_nGridWidth), m_nEditorHeight ); } void DrumPatternEditor::paintEvent( QPaintEvent* /*ev*/ ) { //INFOLOG( "paint" ); //QWidget::paintEvent(ev); QPainter painter( this ); __draw_pattern( painter ); } void DrumPatternEditor::showEvent ( QShowEvent *ev ) { UNUSED( ev ); updateEditor(); } void DrumPatternEditor::hideEvent ( QHideEvent *ev ) { UNUSED( ev ); } void DrumPatternEditor::setResolution(uint res, bool bUseTriplets) { this->m_nResolution = res; this->m_bUseTriplets = bUseTriplets; // redraw all update( 0, 0, width(), height() ); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); } void DrumPatternEditor::zoom_in() { if (m_nGridWidth >= 3){ m_nGridWidth *= 2; }else { m_nGridWidth *= 1.5; } updateEditor(); } void DrumPatternEditor::zoom_out() { if ( m_nGridWidth > 1.5 ) { if (m_nGridWidth > 3){ m_nGridWidth /= 2; }else { m_nGridWidth /= 1.5; } updateEditor(); } } void DrumPatternEditor::selectedInstrumentChangedEvent() { update( 0, 0, width(), height() ); } /// This method is called from another thread (audio engine) void DrumPatternEditor::patternModifiedEvent() { update( 0, 0, width(), height() ); } void DrumPatternEditor::patternChangedEvent() { updateEditor(); } void DrumPatternEditor::selectedPatternChangedEvent() { updateEditor(); } ///NotePropertiesRuler undo redo action void DrumPatternEditor::undoRedoAction( int column, QString mode, int nSelectedPatternNumber, int nSelectedInstrument, float velocity, float pan_L, float pan_R, float leadLag, float probability, int noteKeyVal, int octaveKeyVal) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); Pattern *pPattern; PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( nSelectedPatternNumber ); } else { pPattern = nullptr; } const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,column) { Note *pNote = it->second; assert( pNote ); assert( (int)pNote->get_position() == column ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( mode == "VELOCITY" && !pNote->get_note_off() ) { pNote->set_velocity( velocity ); } else if ( mode == "PAN" ){ pNote->set_pan_l( pan_L ); pNote->set_pan_r( pan_R ); } else if ( mode == "LEADLAG" ){ pNote->set_lead_lag( leadLag ); } else if ( mode == "NOTEKEY" ){ pNote->set_key_octave( (Note::Key)noteKeyVal, (Note::Octave)octaveKeyVal ); } else if ( mode == "PROBABILITY" ){ pNote->set_probability( probability ); } pSong->set_is_modified( true ); break; } updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); m_pPatternEditorPanel->getProbabilityEditor()->updateEditor(); } ///========================================================== ///undo / redo actions from pattern editor instrument list void DrumPatternEditor::functionClearNotesRedoAction( int nSelectedInstrument, int patternNumber ) { Hydrogen * H = Hydrogen::get_instance(); PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); Pattern *pPattern = pPatternList->get( patternNumber ); Instrument *pSelectedInstrument = H->getSong()->get_instrument_list()->get( nSelectedInstrument ); pPattern->purge_instrument( pSelectedInstrument ); EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } void DrumPatternEditor::functionClearNotesUndoAction( std::list< H2Core::Note* > noteList, int nSelectedInstrument, int patternNumber ) { Hydrogen * H = Hydrogen::get_instance(); PatternList *pPatternList = H->getSong()->get_pattern_list(); Pattern *pPattern = pPatternList->get( patternNumber ); std::list < H2Core::Note *>::const_iterator pos; for ( pos = noteList.begin(); pos != noteList.end(); ++pos){ Note *pNote; pNote = new Note(*pos); assert( pNote ); pPattern->insert_note( pNote ); } EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionPasteNotesUndoAction(std::list & appliedList) { // Get song's pattern list Hydrogen * H = Hydrogen::get_instance(); PatternList *patternList = H->getSong()->get_pattern_list(); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine while (appliedList.size() > 0) { // Get next applied pattern Pattern *pApplied = appliedList.front(); assert(pApplied); // Find destination pattern to perform undo Pattern *pat = patternList->find(pApplied->get_name()); if (pat != NULL) { // Remove all notes of applied pattern from destination pattern const Pattern::notes_t* notes = pApplied->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes, it) { // Get note to remove Note *pNote = it->second; assert(pNote); // Check if note is not present Pattern::notes_t* notes = (Pattern::notes_t *)pat->get_notes(); FOREACH_NOTE_IT_BOUND(notes, it, pNote->get_position()) { Note *pFoundNote = it->second; if (pFoundNote->get_instrument() == pNote->get_instrument()) { notes->erase(it); delete pFoundNote; break; } } } } // Remove applied pattern; delete pApplied; appliedList.pop_front(); } AudioEngine::get_instance()->unlock(); // unlock the audio engine // Update editors EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionPasteNotesRedoAction(std::list & changeList, std::list & appliedList) { Hydrogen * H = Hydrogen::get_instance(); PatternList *patternList = H->getSong()->get_pattern_list(); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine // Add notes to pattern std::list < H2Core::Pattern *>::iterator pos; for ( pos = changeList.begin(); pos != changeList.end(); ++pos) { Pattern *pPattern = *pos; assert(pPattern); Pattern *pat = patternList->find(pPattern->get_name()); // Destination pattern if (pat != NULL) { // Create applied pattern Pattern *pApplied = new Pattern( pat->get_name(), pat->get_info(), pat->get_category(), pat->get_length()); // Add all notes of source pattern to destination pattern // and store all applied notes in applied pattern const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes, it) { Note *pNote = it->second; assert(pNote); // Check if note is not present bool noteExists = false; const Pattern::notes_t* notes = pat->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes, it, pNote->get_position()) { Note *pFoundNote = it->second; if (pFoundNote->get_instrument() == pNote->get_instrument()) { // note already exists noteExists = true; break; } } // Apply note and store it as applied if (!noteExists) { pat->insert_note(new Note(pNote)); pApplied->insert_note(new Note(pNote)); } } // Add applied pattern to applied list appliedList.push_back(pApplied); } } AudioEngine::get_instance()->unlock(); // unlock the audio engine // Update editors EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionFillNotesUndoAction( QStringList noteList, int nSelectedInstrument, int patternNumber ) { Hydrogen * H = Hydrogen::get_instance(); PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); Pattern *pPattern = pPatternList->get( patternNumber ); Instrument *pSelectedInstrument = H->getSong()->get_instrument_list()->get( nSelectedInstrument ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine for (int i = 0; i < noteList.size(); i++ ) { int nColumn = noteList.value(i).toInt(); Pattern::notes_t* notes = (Pattern::notes_t*)pPattern->get_notes(); FOREACH_NOTE_IT_BOUND(notes,it,nColumn) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() == pSelectedInstrument ) { // the note exists...remove it! notes->erase( it ); delete pNote; break; } } } AudioEngine::get_instance()->unlock(); // unlock the audio engine EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionFillNotesRedoAction( QStringList noteList, int nSelectedInstrument, int patternNumber ) { Hydrogen * H = Hydrogen::get_instance(); PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); Pattern *pPattern = pPatternList->get( patternNumber ); Instrument *pSelectedInstrument = H->getSong()->get_instrument_list()->get( nSelectedInstrument ); const float velocity = 0.8f; const float pan_L = 0.5f; const float pan_R = 0.5f; const float fPitch = 0.0f; const int nLength = -1; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine for (int i = 0; i < noteList.size(); i++ ) { // create the new note int position = noteList.value(i).toInt(); Note *pNote = new Note( pSelectedInstrument, position, velocity, pan_L, pan_R, nLength, fPitch ); pPattern->insert_note( pNote ); } AudioEngine::get_instance()->unlock(); // unlock the audio engine EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionRandomVelocityAction( QStringList noteVeloValue, int nSelectedInstrument, int selectedPatternNumber ) { Hydrogen * H = Hydrogen::get_instance(); PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); Pattern *pPattern = pPatternList->get( selectedPatternNumber ); Instrument *pSelectedInstrument = H->getSong()->get_instrument_list()->get( nSelectedInstrument ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine int nBase; if ( isUsingTriplets() ) { nBase = 3; } else { nBase = 4; } int nResolution = 4 * MAX_NOTES / ( nBase * getResolution() ); int positionCount = 0; for (int i = 0; i < pPattern->get_length(); i += nResolution) { const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,i) { Note *pNote = it->second; if ( pNote->get_instrument() == pSelectedInstrument) { float velocity = noteVeloValue.value( positionCount ).toFloat(); pNote->set_velocity(velocity); positionCount++; } } } AudioEngine::get_instance()->unlock(); // unlock the audio engine EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); } void DrumPatternEditor::functionMoveInstrumentAction( int nSourceInstrument, int nTargetInstrument ) { Hydrogen *engine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = engine->getSong(); InstrumentList *pInstrumentList = pSong->get_instrument_list(); if ( ( nTargetInstrument > (int)pInstrumentList->size() ) || ( nTargetInstrument < 0) ) { AudioEngine::get_instance()->unlock(); return; } pInstrumentList->move( nSourceInstrument, nTargetInstrument ); #ifdef H2CORE_HAVE_JACK engine->renameJackPorts( pSong ); #endif AudioEngine::get_instance()->unlock(); engine->setSelectedInstrumentNumber( nTargetInstrument ); pSong->set_is_modified( true ); } void DrumPatternEditor::functionDropInstrumentUndoAction( int nTargetInstrument, std::vector* AddedComponents ) { Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->removeInstrument( nTargetInstrument, false ); std::vector* pDrumkitComponents = pEngine->getSong()->get_components(); for (std::vector::iterator it = AddedComponents->begin() ; it != AddedComponents->end(); ++it) { int p_compoID = *it; for ( int n = 0 ; n < pDrumkitComponents->size() ; n++ ) { DrumkitComponent* pTmpDrumkitComponent = pDrumkitComponents->at( n ); if( pTmpDrumkitComponent->get_id() == p_compoID ) { pDrumkitComponents->erase( pDrumkitComponents->begin() + n ); break; } } } AudioEngine::get_instance()->lock( RIGHT_HERE ); #ifdef H2CORE_HAVE_JACK Song *pSong = pEngine->getSong(); pEngine->renameJackPorts(pSong); #endif AudioEngine::get_instance()->unlock(); updateEditor(); } void DrumPatternEditor::functionDropInstrumentRedoAction( QString sDrumkitName, QString sInstrumentName, int nTargetInstrument, std::vector* AddedComponents) { Instrument *pNewInstrument = Instrument::load_instrument( sDrumkitName, sInstrumentName ); if( pNewInstrument == nullptr ){ return; } Drumkit *pNewDrumkit = Drumkit::load_by_name( sDrumkitName, false ); if( pNewDrumkit == nullptr ){ return; } Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); std::vector* pOldInstrumentComponents = new std::vector ( pNewInstrument->get_components()->begin(), pNewInstrument->get_components()->end() ); pNewInstrument->get_components()->clear(); for (std::vector::iterator it = pNewDrumkit->get_components()->begin() ; it != pNewDrumkit->get_components()->end(); ++it) { DrumkitComponent* pComponent = *it; int OldID = pComponent->get_id(); int NewID = -1; NewID = findExistingCompo( pComponent->get_name() ); if ( NewID == -1 ) { NewID = findFreeCompoID(); AddedComponents->push_back( NewID ); pComponent->set_id( NewID ); pComponent->set_name( renameCompo( pComponent->get_name() ) ); Hydrogen::get_instance()->getSong()->get_components()->push_back( pComponent ); } for ( std::vector::iterator it2 = pOldInstrumentComponents->begin() ; it2 != pOldInstrumentComponents->end(); ++it2 ) { InstrumentComponent* pOldInstrCompo = *it2; if( pOldInstrCompo->get_drumkit_componentID() == OldID ) { InstrumentComponent* pNewInstrCompo = new InstrumentComponent( pOldInstrCompo ); pNewInstrCompo->set_drumkit_componentID( NewID ); pNewInstrument->get_components()->push_back( pNewInstrCompo ); } } } // create a new valid ID for this instrument int nID = -1; for ( uint i = 0; i < pEngine->getSong()->get_instrument_list()->size(); ++i ) { Instrument* pInstr = pEngine->getSong()->get_instrument_list()->get( i ); if ( pInstr->get_id() > nID ) { nID = pInstr->get_id(); } } ++nID; pNewInstrument->set_id( nID ); pEngine->getSong()->get_instrument_list()->add( pNewInstrument ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts( pEngine->getSong() ); #endif AudioEngine::get_instance()->unlock(); //move instrument to the position where it was dropped functionMoveInstrumentAction(pEngine->getSong()->get_instrument_list()->size() - 1 , nTargetInstrument ); // select the new instrument pEngine->setSelectedInstrumentNumber(nTargetInstrument); EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); updateEditor(); } QString DrumPatternEditor::renameCompo( QString OriginalName ) { std::vector* pComponentList = Hydrogen::get_instance()->getSong()->get_components(); for (std::vector::iterator it = pComponentList->begin() ; it != pComponentList->end(); ++it) { DrumkitComponent* pComponent = *it; if( pComponent->get_name().compare( OriginalName ) == 0 ){ return renameCompo( OriginalName + "_new" ); } } return OriginalName; } int DrumPatternEditor::findFreeCompoID( int startingPoint ) { bool FoundFreeSlot = true; std::vector* pComponentList = Hydrogen::get_instance()->getSong()->get_components(); for (std::vector::iterator it = pComponentList->begin() ; it != pComponentList->end(); ++it) { DrumkitComponent* pComponent = *it; if( pComponent->get_id() == startingPoint ) { FoundFreeSlot = false; break; } } if(FoundFreeSlot){ return startingPoint; } else { return findFreeCompoID( startingPoint + 1 ); } } int DrumPatternEditor::findExistingCompo( QString SourceName ) { std::vector* pComponentList = Hydrogen::get_instance()->getSong()->get_components(); for (std::vector::iterator it = pComponentList->begin() ; it != pComponentList->end(); ++it) { DrumkitComponent* pComponent = *it; if ( pComponent->get_name().compare( SourceName ) == 0 ){ return pComponent->get_id(); } } return -1; } void DrumPatternEditor::functionDeleteInstrumentUndoAction( std::list< H2Core::Note* > noteList, int nSelectedInstrument, QString instrumentName, QString drumkitName ) { Hydrogen *pEngine = Hydrogen::get_instance(); Instrument *pNewInstrument; if( drumkitName == "" ){ pNewInstrument = new Instrument( pEngine->getSong()->get_instrument_list()->size() -1, instrumentName ); }else { pNewInstrument = Instrument::load_instrument( drumkitName, instrumentName ); } if( pNewInstrument == nullptr ) return; // create a new valid ID for this instrument int nID = -1; for ( uint i = 0; i < pEngine->getSong()->get_instrument_list()->size(); ++i ) { Instrument* pInstr = pEngine->getSong()->get_instrument_list()->get( i ); if ( pInstr->get_id() > nID ) { nID = pInstr->get_id(); } } ++nID; pNewInstrument->set_id( nID ); // pNewInstrument->set_adsr( new ADSR( 0, 0, 1.0, 1000 ) ); AudioEngine::get_instance()->lock( RIGHT_HERE ); pEngine->getSong()->get_instrument_list()->add( pNewInstrument ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts( pEngine->getSong() ); #endif AudioEngine::get_instance()->unlock(); // unlock the audio engine //move instrument to the position where it was dropped functionMoveInstrumentAction(pEngine->getSong()->get_instrument_list()->size() - 1 , nSelectedInstrument ); // select the new instrument pEngine->setSelectedInstrumentNumber( nSelectedInstrument ); H2Core::Pattern *pPattern; PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); updateEditor(); EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); //restore all deleted instrument notes AudioEngine::get_instance()->lock( RIGHT_HERE ); if(noteList.size() > 0 ){ std::list < H2Core::Note *>::const_iterator pos; for ( pos = noteList.begin(); pos != noteList.end(); ++pos){ Note *pNote = new Note( *pos, pNewInstrument ); assert( pNote ); pPattern = pPatternList->get( pNote->get_pattern_idx() ); assert (pPattern); pPattern->insert_note( pNote ); //delete pNote; } } AudioEngine::get_instance()->unlock(); // unlock the audio engine } void DrumPatternEditor::functionAddEmptyInstrumentUndo() { Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->removeInstrument( pEngine->getSong()->get_instrument_list()->size() -1 , false ); AudioEngine::get_instance()->lock( RIGHT_HERE ); #ifdef H2CORE_HAVE_JACK pEngine->renameJackPorts( pEngine->getSong() ); #endif AudioEngine::get_instance()->unlock(); updateEditor(); } void DrumPatternEditor::functionAddEmptyInstrumentRedo() { AudioEngine::get_instance()->lock( RIGHT_HERE ); Song* pSong = Hydrogen::get_instance()->getSong(); InstrumentList* pList = pSong->get_instrument_list(); // create a new valid ID for this instrument int nID = -1; for ( uint i = 0; i < pList->size(); ++i ) { Instrument* pInstr = pList->get( i ); if ( pInstr->get_id() > nID ) { nID = pInstr->get_id(); } } ++nID; Instrument *pNewInstr = new Instrument( nID, "New instrument"); pList->add( pNewInstr ); #ifdef H2CORE_HAVE_JACK Hydrogen::get_instance()->renameJackPorts( pSong ); #endif AudioEngine::get_instance()->unlock(); Hydrogen::get_instance()->setSelectedInstrumentNumber( pList->size() - 1 ); } ///~undo / redo actions from pattern editor instrument list ///========================================================== hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/DrumPatternEditor.h000066400000000000000000000120141366722712400245350ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 DRUM_PATTERN_EDITOR_H #define DRUM_PATTERN_EDITOR_H #include "../EventListener.h" #include #include #if QT_VERSION >= 0x050000 # include #endif namespace H2Core { class Note; class Pattern; } class PatternEditorInstrumentList; class PatternEditorPanel; /// /// Drum pattern editor /// class DrumPatternEditor : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: DrumPatternEditor(QWidget* parent, PatternEditorPanel *panel); ~DrumPatternEditor(); void setResolution(uint res, bool bUseTriplets); uint getResolution() { return m_nResolution; } bool isUsingTriplets() { return m_bUseTriplets; } void zoom_in(); void zoom_out(); static QColor computeNoteColor( float ); // Implements EventListener interface virtual void patternModifiedEvent(); virtual void patternChangedEvent(); virtual void selectedPatternChangedEvent(); virtual void selectedInstrumentChangedEvent(); //~ Implements EventListener interface void addOrDeleteNoteAction( int nColumn, int row, int selectedPatternNumber, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal, bool listen, bool isMidi, bool isInstrumentMode, bool isNoteOff); void editNoteLengthAction( int nColumn, int nRealColumn, int row, int length, int selectedPatternNumber ); void undoRedoAction( int column, QString mode, int nSelectedPatternNumber, int nSelectedInstrument, float velocity, float pan_L, float pan_R, float leadLag, float probability, int noteKeyVal, int octaveKeyVal ); void functionClearNotesRedoAction( int nSelectedInstrument, int selectedPatternNumber ); void functionClearNotesUndoAction( std::list< H2Core::Note* > noteList, int nSelectedInstrument, int patternNumber ); void functionFillNotesUndoAction( QStringList noteList, int nSelectedInstrument, int patternNumber ); void functionFillNotesRedoAction( QStringList noteList, int nSelectedInstrument, int patternNumber ); void functionRandomVelocityAction( QStringList noteVeloValue, int nSelectedInstrument, int selectedPatternNumber ); void functionMoveInstrumentAction( int nSourceInstrument, int nTargetInstrument ); void functionDropInstrumentUndoAction( int nTargetInstrument, std::vector* AddedComponents ); void functionDropInstrumentRedoAction(QString sDrumkitName, QString sInstrumentName, int nTargetInstrument, std::vector* AddedComponents ); void functionDeleteInstrumentUndoAction( std::list< H2Core::Note* > noteList, int nSelectedInstrument, QString instrumentName, QString drumkitName ); void functionAddEmptyInstrumentUndo(); void functionAddEmptyInstrumentRedo(); void functionPasteNotesRedoAction(std::list & changeList, std::list & appliedList); void functionPasteNotesUndoAction(std::list & appliedList); public slots: void updateEditor(); private: float m_nGridWidth; uint m_nGridHeight; int m_nEditorHeight; uint m_nResolution; bool m_bUseTriplets; bool m_bRightBtnPressed; H2Core::Note *m_pDraggedNote; //~ H2Core::Pattern *m_pPattern; PatternEditorPanel *m_pPatternEditorPanel; void __draw_note( H2Core::Note* note, QPainter& painter ); void __draw_pattern( QPainter& painter ); void __draw_grid( QPainter& painter ); void __create_background( QPainter& pointer ); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void keyPressEvent (QKeyEvent *ev); virtual void showEvent ( QShowEvent *ev ); virtual void hideEvent ( QHideEvent *ev ); virtual void paintEvent(QPaintEvent *ev); int getColumn(QMouseEvent *ev); int findFreeCompoID( int startingPoint = 0 ); int findExistingCompo( QString SourceName ); QString renameCompo( QString OriginalName ); int __nRealColumn; int __nColumn; int __row; int __oldLength; int __selectedPatternNumber; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/NotePropertiesRuler.cpp000066400000000000000000001117211366722712400254550ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include #include "../HydrogenApp.h" #include "UndoActions.h" #include "NotePropertiesRuler.h" #include "PatternEditorPanel.h" #include "DrumPatternEditor.h" #include "PianoRollEditor.h" const char* NotePropertiesRuler::__class_name = "NotePropertiesRuler"; NotePropertiesRuler::NotePropertiesRuler( QWidget *parent, PatternEditorPanel *pPatternEditorPanel, NotePropertiesMode mode ) : QWidget( parent ) , Object( __class_name ) , m_Mode( mode ) , m_pPatternEditorPanel( pPatternEditorPanel ) , m_pPattern( nullptr ) { //infoLog("INIT"); //setAttribute(Qt::WA_NoBackground); m_nGridWidth = (Preferences::get_instance())->getPatternEditorGridWidth(); m_nEditorWidth = 20 + m_nGridWidth * ( MAX_NOTES * 4 ); if (m_Mode == VELOCITY ) { m_nEditorHeight = 100; } else if ( m_Mode == PAN ) { m_nEditorHeight = 100; } else if ( m_Mode == LEADLAG ) { m_nEditorHeight = 100; } else if ( m_Mode == NOTEKEY ) { m_nEditorHeight = 210; } if (m_Mode == PROBABILITY ) { m_nEditorHeight = 100; } resize( m_nEditorWidth, m_nEditorHeight ); setMinimumSize( m_nEditorWidth, m_nEditorHeight ); m_pBackground = new QPixmap( m_nEditorWidth, m_nEditorHeight ); updateEditor(); show(); HydrogenApp::get_instance()->addEventListener( this ); m_bMouseIsPressed = false; } NotePropertiesRuler::~NotePropertiesRuler() { //infoLog("DESTROY"); } void NotePropertiesRuler::wheelEvent(QWheelEvent *ev ) { if (m_pPattern == nullptr) return; pressAction( ev->x(), ev->y() ); //get all old values float delta; if (ev->modifiers() == Qt::ControlModifier) { delta = 0.01; // fine control } else { delta = 0.05; // course control } if ( ev->delta() < 0 ) { delta = (delta * -1.0); } DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int width = (m_nGridWidth * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution()); int x_pos = ev->x(); int column; column = (x_pos - 20) + (width / 2); column = column / width; column = (column * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution() ); int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = (Hydrogen::get_instance())->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,column) { Note *pNote = it->second; assert( pNote ); assert( (int)pNote->get_position() == column ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( m_Mode == VELOCITY && !pNote->get_note_off() ) { float val = pNote->get_velocity() + delta; if (val > 1.0) { val = 1.0; } else if (val < 0.0) { val = 0.0; } pNote->set_velocity(val); __velocity = val; char valueChar[100]; sprintf( valueChar, "%#.2f", val); ( HydrogenApp::get_instance() )->setStatusBarMessage( QString("Set note velocity [%1]").arg( valueChar ), 2000 ); } else if ( m_Mode == PAN && !pNote->get_note_off() ){ float pan_L, pan_R; float val = (pNote->get_pan_r() - pNote->get_pan_l() + 0.5) + delta; if (val > 1.0) { val = 1.0; } else if (val < 0.0) { val = 0.0; } if ( val > 0.5 ) { pan_L = 1.0 - val; pan_R = 0.5; } else { pan_L = 0.5; pan_R = val; } pNote->set_pan_l(pan_L); pNote->set_pan_r(pan_R); } else if ( m_Mode == LEADLAG ){ float val = (pNote->get_lead_lag() - 1.0)/-2.0 + delta; if (val > 1.0) { val = 1.0; } else if (val < 0.0) { val = 0.0; } pNote->set_lead_lag((val * -2.0) + 1.0); char valueChar[100]; if (pNote->get_lead_lag() < 0.0) { sprintf( valueChar, "%.2f", ( pNote->get_lead_lag() * -5)); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Leading beat by: %1 ticks").arg( valueChar ), 2000 ); } else if (pNote->get_lead_lag() > 0.0) { sprintf( valueChar, "%.2f", ( pNote->get_lead_lag() * 5)); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Lagging beat by: %1 ticks").arg( valueChar ), 2000 ); } else { HydrogenApp::get_instance()->setStatusBarMessage( QString("Note on beat"), 2000 ); } } else if ( m_Mode == PROBABILITY && !pNote->get_note_off() ) { float val = pNote->get_probability() + delta; if (val > 1.0) { val = 1.0; } else if (val < 0.0) { val = 0.0; } pNote->set_probability(val); __probability = val; } pSong->set_is_modified( true ); startUndoAction(); updateEditor(); break; } } void NotePropertiesRuler::mousePressEvent(QMouseEvent *ev) { m_bMouseIsPressed = true; pressAction( ev->x(), ev->y() ); mouseMoveEvent( ev ); } void NotePropertiesRuler::pressAction( int x, int y) { //create all needed old vars for undo if (m_pPattern == nullptr) { return; } __oldVelocity = 0.8f; __oldPan_L = 0.5f; __oldPan_R = 0.5f; __oldLeadLag = 0.0f; __oldNoteKeyVal = 10; DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int width = (m_nGridWidth * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution()); int x_pos = x; int column; column = (x_pos - 20) + (width / 2); column = column / width; column = (column * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution() ); float val = height() - y; if (val > height()) { val = height(); } else if (val < 0.0) { val = 0.0; } int keyval = val; val = val / height(); int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = (Hydrogen::get_instance())->getSong(); __nSelectedInstrument = nSelectedInstrument; __undoColumn = column; const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,column) { Note *pNote = it->second; assert( pNote ); assert( (int)pNote->get_position() == column ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( m_Mode == VELOCITY && !pNote->get_note_off() ) { __oldVelocity = pNote->get_velocity(); __mode = "VELOCITY"; } else if ( m_Mode == PAN && !pNote->get_note_off() ){ __oldPan_L = pNote->get_pan_l(); __oldPan_R = pNote->get_pan_r(); __mode = "PAN"; } else if ( m_Mode == LEADLAG ){ __oldLeadLag = pNote->get_lead_lag(); __mode = "LEADLAG"; } else if ( m_Mode == NOTEKEY ){ __mode = "NOTEKEY"; __oldOctaveKeyVal = pNote->get_octave(); __oldNoteKeyVal = pNote->get_key(); } else if ( m_Mode == PROBABILITY && !pNote->get_note_off() ) { __oldProbability = pNote->get_probability(); __mode = "PROBABILITY"; } } } void NotePropertiesRuler::mouseMoveEvent( QMouseEvent *ev ) { if( m_bMouseIsPressed ){ __velocity = 0.8f; __pan_L = 0.5f; __pan_R = 0.5f; __leadLag = 0.0f ; __noteKeyVal = 10; if (m_pPattern == nullptr) return; DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int width = (m_nGridWidth * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution()); int x_pos = ev->x(); int column; column = (x_pos - 20) + (width / 2); column = column / width; column = (column * 4 * MAX_NOTES) / ( nBase * pPatternEditor->getResolution() ); bool columnChange = false; if( __columnCheckOnXmouseMouve != column ){ __undoColumn = column; columnChange = true; } float val = height() - ev->y(); if (val > height()) { val = height(); } else if (val < 0.0) { val = 0.0; } int keyval = val; val = val / height(); int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = (Hydrogen::get_instance())->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,column) { Note *pNote = it->second; assert( pNote ); assert( (int)pNote->get_position() == column ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( m_Mode == VELOCITY && !pNote->get_note_off() ) { if( columnChange ){ __oldVelocity = pNote->get_velocity(); } pNote->set_velocity( val ); __velocity = val; char valueChar[100]; sprintf( valueChar, "%#.2f", val); HydrogenApp::get_instance()->setStatusBarMessage( QString("Set note velocity [%1]").arg( valueChar ), 2000 ); } else if ( m_Mode == PAN && !pNote->get_note_off() ){ float pan_L, pan_R; if ( (ev->button() == Qt::MidButton) || (ev->modifiers() == Qt::ControlModifier && ev->button() == Qt::LeftButton) ) { val = 0.5; } if ( val > 0.5 ) { pan_L = 1.0 - val; pan_R = 0.5; } else { pan_L = 0.5; pan_R = val; } if( columnChange ){ __oldPan_L = pNote->get_pan_l(); __oldPan_R = pNote->get_pan_r(); } pNote->set_pan_l( pan_L ); pNote->set_pan_r( pan_R ); __pan_L = pan_L; __pan_R = pan_R; } else if ( m_Mode == LEADLAG ){ if ( (ev->button() == Qt::MidButton) || (ev->modifiers() == Qt::ControlModifier && ev->button() == Qt::LeftButton) ) { pNote->set_lead_lag(0.0); __leadLag = 0.0; } else { if( columnChange ){ __oldLeadLag = pNote->get_lead_lag(); } pNote->set_lead_lag((val * -2.0) + 1.0); __leadLag = (val * -2.0) + 1.0; char valueChar[100]; if (pNote->get_lead_lag() < 0.0) { sprintf( valueChar, "%.2f", ( pNote->get_lead_lag() * -5)); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Leading beat by: %1 ticks").arg( valueChar ), 2000 ); } else if (pNote->get_lead_lag() > 0.0) { sprintf( valueChar, "%.2f", ( pNote->get_lead_lag() * 5)); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Lagging beat by: %1 ticks").arg( valueChar ), 2000 ); } else { HydrogenApp::get_instance()->setStatusBarMessage( QString("Note on beat"), 2000 ); } } } else if ( m_Mode == NOTEKEY ){ if ( (ev->button() == Qt::MidButton) || (ev->modifiers() == Qt::ControlModifier && ev->button() == Qt::LeftButton) ) { ; } else { //set the note height //QMessageBox::information ( this, "Hydrogen", tr( "val: %1" ).arg(keyval) ); int k = 666; int o = 666; if(keyval >=6 && keyval<=125) { k = (keyval-6)/10; } else if(keyval>=135 && keyval<=205) { o = (keyval-166)/10; if(o==-4) o=-3; // 135 } pNote->set_key_octave((Note::Key)k,(Note::Octave)o); // won't set wrong values see Note::set_key_octave __octaveKeyVal = pNote->get_octave(); __noteKeyVal = pNote->get_key(); } } else if ( m_Mode == PROBABILITY && !pNote->get_note_off() ) { if( columnChange ){ __oldProbability = pNote->get_probability(); } pNote->set_probability( val ); __probability = val; char valueChar[100]; sprintf( valueChar, "%#.2f", val); HydrogenApp::get_instance()->setStatusBarMessage( QString("Set note probability [%1]").arg( valueChar ), 2000 ); } if( columnChange ){ __columnCheckOnXmouseMouve = column; startUndoAction(); return; } __columnCheckOnXmouseMouve = column; pSong->set_is_modified( true ); updateEditor(); break; } m_pPatternEditorPanel->getPianoRollEditor()->updateEditor(); pPatternEditor->updateEditor(); } } void NotePropertiesRuler::mouseReleaseEvent(QMouseEvent *ev) { m_bMouseIsPressed = false; startUndoAction(); } void NotePropertiesRuler::startUndoAction() { SE_editNotePropertiesVolumeAction *action = new SE_editNotePropertiesVolumeAction( __undoColumn, __mode, __nSelectedPatternNumber, __nSelectedInstrument, __velocity, __oldVelocity, __pan_L, __oldPan_L, __pan_R, __oldPan_R, __leadLag, __oldLeadLag, __probability, __oldProbability, __noteKeyVal, __oldNoteKeyVal, __octaveKeyVal, __oldOctaveKeyVal ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } void NotePropertiesRuler::paintEvent( QPaintEvent *ev) { QPainter painter(this); painter.drawPixmap( ev->rect(), *m_pBackground, ev->rect() ); } void NotePropertiesRuler::createVelocityBackground(QPixmap *pixmap) { if ( !isVisible() ) { return; } UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); H2RGBColor valueColor( (int)( pStyle->m_patternEditor_backgroundColor.getRed() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getGreen() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getBlue() * ( 1 - 0.3 ) ) ); QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); QColor horizLinesColor( pStyle->m_patternEditor_backgroundColor.getRed() - 20, pStyle->m_patternEditor_backgroundColor.getGreen() - 20, pStyle->m_patternEditor_backgroundColor.getBlue() - 20 ); unsigned nNotes = MAX_NOTES; if (m_pPattern) { nNotes = m_pPattern->get_length(); } QPainter p( pixmap ); p.fillRect( 0, 0, width(), height(), QColor(0,0,0) ); p.fillRect( 0, 0, 20 + nNotes * m_nGridWidth, height(), backgroundColor ); // vertical lines DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nResolution = pPatternEditor->getResolution(); if ( !pPatternEditor->isUsingTriplets() ) { for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (nResolution >= 4) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n8th) == 0 ) { if (nResolution >= 8) { p.setPen( QPen( res_2, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n16th) == 0 ) { if (nResolution >= 16) { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n32th) == 0 ) { if (nResolution >= 32) { p.setPen( QPen( res_4, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n64th) == 0 ) { if (nResolution >= 64) { p.setPen( QPen( res_5, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * nResolution); for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); } else { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); } p.drawLine(x, 0, x, m_nEditorHeight); nCounter++; } } } p.setPen( horizLinesColor ); for (unsigned y = 0; y < m_nEditorHeight; y = y + (m_nEditorHeight / 10)) { p.drawLine(20, y, 20 + nNotes * m_nGridWidth, y); } // draw velocity lines if (m_pPattern != nullptr) { int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pposNote = it->second; assert( pposNote ); uint pos = pposNote->get_position(); int xoffset = 0; FOREACH_NOTE_CST_IT_BOUND(notes,coit,pos) { Note *pNote = coit->second; assert( pNote ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } uint x_pos = 20 + pos * m_nGridWidth; uint line_end = height(); uint value = 0; if ( m_Mode == VELOCITY ) { value = (uint)(pNote->get_velocity() * height()); } else if ( m_Mode == PROBABILITY ) { value = (uint)(pNote->get_probability() * height()); } uint line_start = line_end - value; QColor centerColor = DrumPatternEditor::computeNoteColor( pNote->get_velocity() ); int nLineWidth = 3; p.fillRect( x_pos - 1 + xoffset, line_start, nLineWidth, line_end - line_start , centerColor ); xoffset++; } } } p.setPen(res_1); p.drawLine(0, 0, m_nEditorWidth, 0); p.drawLine(0, m_nEditorHeight - 1, m_nEditorWidth, m_nEditorHeight - 1); } void NotePropertiesRuler::createPanBackground(QPixmap *pixmap) { if ( !isVisible() ) { return; } UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); //QColor backgroundColor( 255, 255, 255 ); QColor blackKeysColor( 240, 240, 240 ); QColor horizLinesColor( pStyle->m_patternEditor_backgroundColor.getRed() - 20, pStyle->m_patternEditor_backgroundColor.getGreen() - 20, pStyle->m_patternEditor_backgroundColor.getBlue() - 20 ); H2RGBColor valueColor( (int)( pStyle->m_patternEditor_backgroundColor.getRed() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getGreen() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getBlue() * ( 1 - 0.3 ) ) ); QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); QPainter p( pixmap ); p.fillRect( 0, 0, width(), height(), QColor(0, 0, 0) ); unsigned nNotes = MAX_NOTES; if (m_pPattern) { nNotes = m_pPattern->get_length(); } p.fillRect( 0, 0, 20 + nNotes * m_nGridWidth, height(), backgroundColor ); // central line p.setPen( horizLinesColor ); p.drawLine(0, height() / 2.0, m_nEditorWidth, height() / 2.0); // vertical lines DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nResolution = pPatternEditor->getResolution(); if ( !pPatternEditor->isUsingTriplets() ) { for (uint i = 0; i < nNotes +1 ; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (nResolution >= 4) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n8th) == 0 ) { if (nResolution >= 8) { p.setPen( QPen( res_2, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n16th) == 0 ) { if (nResolution >= 16) { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n32th) == 0 ) { if (nResolution >= 32) { p.setPen( QPen( res_4, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n64th) == 0 ) { if (nResolution >= 64) { p.setPen( QPen( res_5, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * nResolution); for (uint i = 0; i < nNotes +1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); } else { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); } p.drawLine(x, 0, x, m_nEditorHeight); nCounter++; } } } if ( m_pPattern ) { int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pposNote = it->second; assert( pposNote ); uint pos = pposNote->get_position(); int xoffset = 0; FOREACH_NOTE_CST_IT_BOUND(notes,coit,pos) { Note *pNote = coit->second; assert( pNote ); if ( pNote->get_note_off() || pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } uint x_pos = 20 + pNote->get_position() * m_nGridWidth; QColor centerColor = DrumPatternEditor::computeNoteColor( pNote->get_velocity() ); if (pNote->get_pan_r() == pNote->get_pan_l()) { // pan value is centered - draw circle int y_pos = (int)( height() * 0.5 ); p.setBrush(QColor( centerColor )); p.drawEllipse( x_pos-4 + xoffset, y_pos-4, 8, 8); } else { int y_start = (int)( pNote->get_pan_l() * height() ); int y_end = (int)( height() - pNote->get_pan_r() * height() ); int nLineWidth = 3; p.fillRect( x_pos - 1 + xoffset, y_start, nLineWidth, y_end - y_start, QColor( centerColor) ); p.fillRect( x_pos - 1 + xoffset, ( height() / 2.0 ) - 2 , nLineWidth, 5, QColor( centerColor ) ); } xoffset++; } } } p.setPen(res_1); p.drawLine(0, 0, m_nEditorWidth, 0); p.drawLine(0, m_nEditorHeight - 1, m_nEditorWidth, m_nEditorHeight - 1); } void NotePropertiesRuler::createLeadLagBackground(QPixmap *pixmap) { if ( !isVisible() ) { return; } UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); QColor blackKeysColor( 240, 240, 240 ); QColor horizLinesColor( pStyle->m_patternEditor_backgroundColor.getRed() - 20, pStyle->m_patternEditor_backgroundColor.getGreen() - 20, pStyle->m_patternEditor_backgroundColor.getBlue() - 20 ); H2RGBColor valueColor( (int)( pStyle->m_patternEditor_backgroundColor.getRed() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getGreen() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getBlue() * ( 1 - 0.3 ) ) ); QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); QPainter p( pixmap ); p.fillRect( 0, 0, width(), height(), QColor(0, 0, 0) ); unsigned nNotes = MAX_NOTES; if (m_pPattern) { nNotes = m_pPattern->get_length(); } p.fillRect( 0, 0, 20 + nNotes * m_nGridWidth, height(), backgroundColor ); // central line p.setPen( horizLinesColor ); p.drawLine(0, height() / 2.0, m_nEditorWidth, height() / 2.0); // vertical lines DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nResolution = pPatternEditor->getResolution(); if ( !pPatternEditor->isUsingTriplets() ) { for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (nResolution >= 4) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n8th) == 0 ) { if (nResolution >= 8) { p.setPen( QPen( res_2, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n16th) == 0 ) { if (nResolution >= 16) { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n32th) == 0 ) { if (nResolution >= 32) { p.setPen( QPen( res_4, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n64th) == 0 ) { if (nResolution >= 64) { p.setPen( QPen( res_5, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * nResolution); for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); } else { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); } p.drawLine(x, 0, x, m_nEditorHeight); nCounter++; } } } if ( m_pPattern ) { int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pposNote = it->second; assert( pposNote ); uint pos = pposNote->get_position(); int xoffset = 0; FOREACH_NOTE_CST_IT_BOUND(notes,coit,pos) { Note *pNote = coit->second; assert( pNote ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } uint x_pos = 20 + pNote->get_position() * m_nGridWidth; int red1 = (int) (pNote->get_velocity() * 255); int green1; int blue1; blue1 = ( 255 - (int) red1 )* .33; green1 = ( 255 - (int) red1 ); if (pNote->get_lead_lag() == 0) { // leadlag value is centered - draw circle int y_pos = (int)( height() * 0.5 ); p.setBrush(QColor( 0 , 0 , 0 )); p.drawEllipse( x_pos-4 + xoffset, y_pos-4, 8, 8); } else { int y_start = (int)( height() * 0.5 ); int y_end = y_start + ((pNote->get_lead_lag()/2) * height()); int nLineWidth = 3; int red; int green; int blue = (int) (pNote->get_lead_lag() * 255); if (blue < 0) { red = blue *-1; blue = (int) red * .33; green = (int) red * .33; } else { red = (int) blue * .33; green = (int) blue * .33; } p.fillRect( x_pos - 1 + xoffset, y_start, nLineWidth, y_end - y_start, QColor( red, green ,blue ) ); p.fillRect( x_pos - 1 + xoffset, ( height() / 2.0 ) - 2 , nLineWidth, 5, QColor( red1, green1 ,blue1 ) ); } xoffset++; } } } p.setPen(res_1); p.drawLine(0, 0, m_nEditorWidth, 0); p.drawLine(0, m_nEditorHeight - 1, m_nEditorWidth, m_nEditorHeight - 1); } void NotePropertiesRuler::createNoteKeyBackground(QPixmap *pixmap) { if ( !isVisible() ) { return; } UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); H2RGBColor valueColor( (int)( pStyle->m_patternEditor_backgroundColor.getRed() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getGreen() * ( 1 - 0.3 ) ), (int)( pStyle->m_patternEditor_backgroundColor.getBlue() * ( 1 - 0.3 ) ) ); QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); QColor horizLinesColor( pStyle->m_patternEditor_backgroundColor.getRed() - 100, pStyle->m_patternEditor_backgroundColor.getGreen() - 100, pStyle->m_patternEditor_backgroundColor.getBlue() - 100 ); unsigned nNotes = MAX_NOTES; if (m_pPattern) { nNotes = m_pPattern->get_length(); } QPainter p( pixmap ); p.fillRect( 0, 0, width(), height(), QColor(0,0,0) ); p.fillRect( 0, 0, 20 + nNotes * m_nGridWidth, height(), backgroundColor ); p.setPen( horizLinesColor ); for (unsigned y = 10; y < 80; y = y + 10 ) { p.setPen( QPen( res_1, 1, Qt::DashLine ) ); if (y == 40) p.setPen( QPen( QColor(0,0,0), 1, Qt::SolidLine ) ); p.drawLine(20, y, 20 + nNotes * m_nGridWidth, y); } for (unsigned y = 90; y < 210; y = y + 10 ) { p.setPen( QPen( QColor( 255, 255, 255 ), 9, Qt::SolidLine, Qt::FlatCap) ); if ( y == 100 ||y == 120 ||y == 140 ||y == 170 ||y == 190) p.setPen( QPen( QColor( 0, 0, 0 ), 7, Qt::SolidLine, Qt::FlatCap ) ); p.drawLine(20, y, 20 + nNotes * m_nGridWidth, y); } // vertical lines DrumPatternEditor *pPatternEditor = m_pPatternEditorPanel->getDrumPatternEditor(); int nBase; if (pPatternEditor->isUsingTriplets()) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nResolution = pPatternEditor->getResolution(); if ( !pPatternEditor->isUsingTriplets() ) { for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (nResolution >= 4) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n8th) == 0 ) { if (nResolution >= 8) { p.setPen( QPen( res_2, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n16th) == 0 ) { if (nResolution >= 16) { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n32th) == 0 ) { if (nResolution >= 32) { p.setPen( QPen( res_4, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } else if ( (i % n64th) == 0 ) { if (nResolution >= 64) { p.setPen( QPen( res_5, 0, Qt::DotLine ) ); p.drawLine(x, 0, x, m_nEditorHeight); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * nResolution); for (uint i = 0; i < nNotes + 1; i++) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0, Qt::DotLine ) ); } else { p.setPen( QPen( res_3, 0, Qt::DotLine ) ); } p.drawLine(x, 0, x, m_nEditorHeight); nCounter++; } } } p.setPen(res_1); p.drawLine(0, 0, m_nEditorWidth, 0); p.drawLine(0, m_nEditorHeight - 1, m_nEditorWidth, m_nEditorHeight - 1); //paint the oktave if ( m_pPattern ) { int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( !pNote->get_note_off() ) { uint x_pos = 17 + pNote->get_position() * m_nGridWidth; uint y_pos = (4-pNote->get_octave())*10-3; p.setBrush(QColor( 99, 160, 233 )); p.drawEllipse( x_pos, y_pos, 6, 6); } } } //paint the note if ( m_pPattern ) { int nSelectedInstrument = Hydrogen::get_instance()->getSelectedInstrumentNumber(); Song *pSong = Hydrogen::get_instance()->getSong(); const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() != pSong->get_instrument_list()->get( nSelectedInstrument ) ) { continue; } if ( !pNote->get_note_off() ) { int d = 6; int k = pNote->get_key(); uint x_pos = 17 + pNote->get_position() * m_nGridWidth; uint y_pos = 200-(k*10)-3; if(k<5) { if(!(k&0x01)) { x_pos-=1; y_pos-=1; d+=2; } } else { if(k&0x01) { x_pos-=1; y_pos-=1; d+=2; } } p.setBrush(QColor( 0, 0, 0)); p.drawEllipse( x_pos, y_pos, d, d); } } } } void NotePropertiesRuler::updateEditor() { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { m_pPattern = pPatternList->get( nSelectedPatternNumber ); } else { m_pPattern = nullptr; } __nSelectedPatternNumber = nSelectedPatternNumber; // update editor width int editorWidth; if ( m_pPattern ) { editorWidth = 20 + m_pPattern->get_length() * m_nGridWidth; } else { editorWidth = 20 + MAX_NOTES * m_nGridWidth; } resize( editorWidth, height() ); delete m_pBackground; m_pBackground = new QPixmap( editorWidth, m_nEditorHeight ); if ( m_Mode == VELOCITY || m_Mode == PROBABILITY ) { createVelocityBackground( m_pBackground ); } else if ( m_Mode == PAN ) { createPanBackground( m_pBackground ); } else if ( m_Mode == LEADLAG ) { createLeadLagBackground( m_pBackground ); } else if ( m_Mode == NOTEKEY ) { createNoteKeyBackground( m_pBackground ); } // redraw all update(); } void NotePropertiesRuler::zoomIn() { if (m_nGridWidth >= 3){ m_nGridWidth *= 2; }else { m_nGridWidth *= 1.5; } updateEditor(); } void NotePropertiesRuler::zoomOut() { if ( m_nGridWidth > 1.5 ) { if (m_nGridWidth > 3){ m_nGridWidth /= 2; }else { m_nGridWidth /= 1.5; } updateEditor(); } } void NotePropertiesRuler::selectedPatternChangedEvent() { updateEditor(); } void NotePropertiesRuler::selectedInstrumentChangedEvent() { updateEditor(); } hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/NotePropertiesRuler.h000066400000000000000000000056341366722712400251270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 NOTE_PROPERTIES_RULER_H #define NOTE_PROPERTIES_RULER_H #include "../EventListener.h" #include #if QT_VERSION >= 0x050000 # include #endif #include namespace H2Core { class Pattern; class NoteKey; } class PatternEditorPanel; class NotePropertiesRuler : public QWidget, public H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: enum NotePropertiesMode { VELOCITY, PAN, LEADLAG, NOTEKEY, PROBABILITY }; NotePropertiesRuler( QWidget *parent, PatternEditorPanel *pPatternEditorPanel, NotePropertiesMode mode ); ~NotePropertiesRuler(); void zoomIn(); void zoomOut(); //public slots: void updateEditor(); private: static const int m_nKeys = 24; static const int m_nBasePitch = 12; NotePropertiesMode m_Mode; PatternEditorPanel *m_pPatternEditorPanel; H2Core::Pattern *m_pPattern; float m_nGridWidth; uint m_nEditorWidth; uint m_nEditorHeight; QPixmap *m_pBackground; void createVelocityBackground(QPixmap *pixmap); void createPanBackground(QPixmap *pixmap); void createLeadLagBackground(QPixmap *pixmap); void createNoteKeyBackground(QPixmap *pixmap); void paintEvent(QPaintEvent *ev); void mousePressEvent(QMouseEvent *ev); void mouseMoveEvent(QMouseEvent *ev); void wheelEvent(QWheelEvent *ev); void mouseReleaseEvent(QMouseEvent *ev); void startUndoAction(); void pressAction( int x, int y); // Implements EventListener interface virtual void selectedPatternChangedEvent(); virtual void selectedInstrumentChangedEvent(); //~ Implements EventListener interface int __nSelectedPatternNumber; int __nSelectedInstrument; bool m_bMouseIsPressed; float __velocity; float __oldVelocity; float __pan_L; float __pan_R; float __oldPan_L; float __oldPan_R; float __leadLag; float __oldLeadLag; float __probability; float __oldProbability; int __noteKeyVal; int __oldNoteKeyVal; int __octaveKeyVal; int __oldOctaveKeyVal; int __checkXPosition; int __columnCheckOnXmouseMouve; int __undoColumn; QString __mode; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorInstrumentList.cpp000066400000000000000000000540321366722712400271730ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PatternEditorInstrumentList.h" #include #include #include #include #include #include #include #include #include #include #include using namespace H2Core; #include "UndoActions.h" #include "PatternEditorPanel.h" #include "InstrumentEditor/InstrumentEditorPanel.h" #include "DrumPatternEditor.h" #include "../HydrogenApp.h" #include "../Mixer/Mixer.h" #include "../Widgets/Button.h" #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include // for std::min using namespace std; const char* InstrumentLine::__class_name = "InstrumentLine"; InstrumentLine::InstrumentLine(QWidget* pParent) : PixmapWidget(pParent, __class_name) , m_bIsSelected(false) { int h = Preferences::get_instance()->getPatternEditorGridHeight(); setFixedSize(181, h); m_pNameLbl = new QLabel(this); m_pNameLbl->resize( 145, h ); m_pNameLbl->move( 10, 1 ); QFont nameFont; nameFont.setPointSize( 10 ); nameFont.setBold( true ); m_pNameLbl->setFont(nameFont); m_pMuteBtn = new ToggleButton( this, "/mixerPanel/btn_mute_on.png", "/mixerPanel/btn_mute_off.png", "/mixerPanel/btn_mute_off.png", QSize( 18, 13 ) ); m_pMuteBtn->move( 145, 5 ); m_pMuteBtn->setPressed(false); m_pMuteBtn->setToolTip( tr("Mute instrument") ); connect(m_pMuteBtn, SIGNAL(clicked(Button*)), this, SLOT(muteClicked())); m_pSoloBtn = new ToggleButton( this, "/mixerPanel/btn_solo_on.png", "/mixerPanel/btn_solo_off.png", "/mixerPanel/btn_solo_off.png", QSize( 18, 13 ) ); m_pSoloBtn->move( 163, 5 ); m_pSoloBtn->setPressed(false); m_pSoloBtn->setToolTip( tr("Solo") ); connect(m_pSoloBtn, SIGNAL(clicked(Button*)), this, SLOT(soloClicked())); // Popup menu m_pFunctionPopup = new QMenu( this ); m_pFunctionPopup->addAction( tr( "Clear notes" ), this, SLOT( functionClearNotes() ) ); m_pFunctionPopupSub = new QMenu( tr( "Fill notes ..." ), m_pFunctionPopup ); m_pFunctionPopupSub->addAction( tr( "Fill all notes" ), this, SLOT( functionFillAllNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/2 notes" ), this, SLOT( functionFillEveryTwoNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/3 notes" ), this, SLOT( functionFillEveryThreeNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/4 notes" ), this, SLOT( functionFillEveryFourNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/6 notes" ), this, SLOT( functionFillEverySixNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/8 notes" ), this, SLOT( functionFillEveryEightNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/12 notes" ), this, SLOT( functionFillEveryTwelveNotes() ) ); m_pFunctionPopupSub->addAction( tr( "Fill 1/16 notes" ), this, SLOT( functionFillEverySixteenNotes() ) ); m_pFunctionPopup->addMenu( m_pFunctionPopupSub ); m_pFunctionPopup->addAction( tr( "Randomize velocity" ), this, SLOT( functionRandomizeVelocity() ) ); m_pFunctionPopup->addSeparator(); m_pCopyPopupSub = new QMenu( tr( "Copy notes ..." ), m_pFunctionPopup ); m_pCopyPopupSub->addAction( tr( "Only for this pattern" ), this, SLOT( functionCopyInstrumentPattern() ) ); m_pCopyPopupSub->addAction( tr( "For all patterns" ), this, SLOT( functionCopyAllInstrumentPatterns() ) ); m_pFunctionPopup->addMenu( m_pCopyPopupSub ); m_pPastePopupSub = new QMenu( tr( "Paste notes ..." ), m_pFunctionPopup ); m_pPastePopupSub->addAction( tr( "Only for this pattern" ), this, SLOT( functionPasteInstrumentPattern() ) ); m_pPastePopupSub->addAction( tr( "For all patterns" ), this, SLOT( functionPasteAllInstrumentPatterns() ) ); m_pFunctionPopup->addMenu( m_pPastePopupSub ); m_pFunctionPopup->addSeparator(); m_pFunctionPopup->addAction( tr( "Rename instrument" ), this, SLOT( functionRenameInstrument() ) ); m_pFunctionPopup->addAction( tr( "Delete instrument" ), this, SLOT( functionDeleteInstrument() ) ); m_bIsSelected = true; setSelected(false); } void InstrumentLine::setName(const QString& sName) { m_pNameLbl->setText(sName); } void InstrumentLine::setSelected(bool bSelected) { if (bSelected == m_bIsSelected) { return; } m_bIsSelected = bSelected; if (m_bIsSelected) { setPixmap( "/patternEditor/instrument_line_selected.png"); } else { setPixmap( "/patternEditor/instrument_line.png"); } } void InstrumentLine::setNumber(int nIndex) { m_nInstrumentNumber = nIndex; } void InstrumentLine::setMuted(bool isMuted) { m_pMuteBtn->setPressed(isMuted); } void InstrumentLine::setSoloed( bool soloed ) { m_pSoloBtn->setPressed( soloed ); } void InstrumentLine::muteClicked() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Instrument *pInstr = pInstrList->get( m_nInstrumentNumber ); CoreActionController* pCoreActionController = pEngine->getCoreActionController(); pCoreActionController->setStripIsMuted( m_nInstrumentNumber, !pInstr->is_muted() ); } void InstrumentLine::soloClicked() { HydrogenApp::get_instance()->getMixer()->soloClicked( m_nInstrumentNumber ); } void InstrumentLine::mousePressEvent(QMouseEvent *ev) { Hydrogen::get_instance()->setSelectedInstrumentNumber( m_nInstrumentNumber ); HydrogenApp::get_instance()->getPatternEditorPanel()->updatePianorollEditor(); if ( ev->button() == Qt::LeftButton ) { const int width = m_pMuteBtn->x() - 5; // clickable field width const float velocity = std::min((float)ev->x()/(float)width, 1.0f); const float pan_L = 0.5f; const float pan_R = 0.5f; const int nLength = -1; const float fPitch = 0.0f; Song *pSong = Hydrogen::get_instance()->getSong(); Instrument *pInstr = pSong->get_instrument_list()->get( m_nInstrumentNumber ); Note *pNote = new Note( pInstr, 0, velocity, pan_L, pan_R, nLength, fPitch); AudioEngine::get_instance()->get_sampler()->note_on(pNote); } else if (ev->button() == Qt::RightButton ) { m_pFunctionPopup->popup( QPoint( ev->globalX(), ev->globalY() ) ); } // propago l'evento al parent: serve per il drag&drop PixmapWidget::mousePressEvent(ev); } H2Core::Pattern* InstrumentLine::getCurrentPattern() { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); assert( pPatternList != nullptr ); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( nSelectedPatternNumber != -1 ) { Pattern* pCurrentPattern = pPatternList->get( nSelectedPatternNumber ); return pCurrentPattern; } return nullptr; } void InstrumentLine::functionClearNotes() { Hydrogen * pEngine = Hydrogen::get_instance(); int selectedPatternNr = pEngine->getSelectedPatternNumber(); Pattern *pPattern = getCurrentPattern(); Instrument *pSelectedInstrument = pEngine->getSong()->get_instrument_list()->get( m_nInstrumentNumber ); std::list< Note* > noteList; const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() == pSelectedInstrument ) { noteList.push_back( pNote ); } } if( noteList.size() > 0 ){ SE_clearNotesPatternEditorAction *action = new SE_clearNotesPatternEditorAction( noteList, m_nInstrumentNumber,selectedPatternNr); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } void InstrumentLine::functionCopyInstrumentPattern() { Hydrogen * pEngine = Hydrogen::get_instance(); int selectedPatternNr = pEngine->getSelectedPatternNumber(); Song *song = pEngine->getSong(); assert(song); // Serialize & put to clipboard QString serialized = song->copyInstrumentLineToString( selectedPatternNr, m_nInstrumentNumber ); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(serialized); } void InstrumentLine::functionCopyAllInstrumentPatterns() { Hydrogen * pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); assert(song); // Serialize & put to clipboard QString serialized = song->copyInstrumentLineToString( -1, m_nInstrumentNumber ); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(serialized); } void InstrumentLine::functionPasteInstrumentPattern() { Hydrogen * pEngine = Hydrogen::get_instance(); int selectedPatternNr = pEngine->getSelectedPatternNumber(); functionPasteInstrumentPatternExec(selectedPatternNr); } void InstrumentLine::functionPasteAllInstrumentPatterns() { functionPasteInstrumentPatternExec(-1); } void InstrumentLine::functionPasteInstrumentPatternExec(int patternID) { Hydrogen * pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); assert(song); // This is a note list for pasted notes collection std::list< Pattern* > patternList; // Get from clipboard & deserialize QClipboard *clipboard = QApplication::clipboard(); QString serialized = clipboard->text(); if ( !song->pasteInstrumentLineFromString( serialized, patternID, m_nInstrumentNumber, patternList ) ) return; // Ignore empty result if (patternList.size() <= 0) return; // Create action SE_pasteNotesPatternEditorAction *action = new SE_pasteNotesPatternEditorAction(patternList); HydrogenApp::get_instance()->m_pUndoStack->push(action); } void InstrumentLine::functionFillAllNotes(){ functionFillNotes(1); } void InstrumentLine::functionFillEveryTwoNotes(){ functionFillNotes(2); } void InstrumentLine::functionFillEveryThreeNotes(){ functionFillNotes(3); } void InstrumentLine::functionFillEveryFourNotes(){ functionFillNotes(4); } void InstrumentLine::functionFillEverySixNotes(){ functionFillNotes(6); } void InstrumentLine::functionFillEveryEightNotes(){ functionFillNotes(8); } void InstrumentLine::functionFillEveryTwelveNotes(){ functionFillNotes(12); } void InstrumentLine::functionFillEverySixteenNotes(){ functionFillNotes(16); } void InstrumentLine::functionFillNotes( int every ) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternEditorPanel *pPatternEditorPanel = HydrogenApp::get_instance()->getPatternEditorPanel(); DrumPatternEditor *pPatternEditor = pPatternEditorPanel->getDrumPatternEditor(); int nBase; if ( pPatternEditor->isUsingTriplets() ) { nBase = 3; } else { nBase = 4; } int nResolution = 4 * MAX_NOTES * every / ( nBase * pPatternEditor->getResolution() ); Song *pSong = pEngine->getSong(); QStringList notePositions; Pattern* pCurrentPattern = getCurrentPattern(); if (pCurrentPattern != nullptr) { int nPatternSize = pCurrentPattern->get_length(); int nSelectedInstrument = pEngine->getSelectedInstrumentNumber(); if (nSelectedInstrument != -1) { Instrument *instrRef = (pSong->get_instrument_list())->get( nSelectedInstrument ); for (int i = 0; i < nPatternSize; i += nResolution) { bool noteAlreadyPresent = false; const Pattern::notes_t* notes = pCurrentPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,i) { Note *pNote = it->second; if ( pNote->get_instrument() == instrRef ) { // note already exists noteAlreadyPresent = true; break; } } if ( noteAlreadyPresent == false ) { notePositions << QString("%1").arg(i); } } SE_fillNotesRightClickAction *action = new SE_fillNotesRightClickAction( notePositions, nSelectedInstrument, pEngine->getSelectedPatternNumber() ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } } void InstrumentLine::functionRandomizeVelocity() { Hydrogen *pEngine = Hydrogen::get_instance(); PatternEditorPanel *pPatternEditorPanel = HydrogenApp::get_instance()->getPatternEditorPanel(); DrumPatternEditor *pPatternEditor = pPatternEditorPanel->getDrumPatternEditor(); int nBase; if ( pPatternEditor->isUsingTriplets() ) { nBase = 3; } else { nBase = 4; } int nResolution = 4 * MAX_NOTES / ( nBase * pPatternEditor->getResolution() ); Song *pSong = pEngine->getSong(); QStringList noteVeloValue; QStringList oldNoteVeloValue; Pattern* pCurrentPattern = getCurrentPattern(); if (pCurrentPattern != nullptr) { int nPatternSize = pCurrentPattern->get_length(); int nSelectedInstrument = pEngine->getSelectedInstrumentNumber(); if (nSelectedInstrument != -1) { Instrument *instrRef = (pSong->get_instrument_list())->get( nSelectedInstrument ); for (int i = 0; i < nPatternSize; i += nResolution) { const Pattern::notes_t* notes = pCurrentPattern->get_notes(); FOREACH_NOTE_CST_IT_BOUND(notes,it,i) { Note *pNote = it->second; if ( pNote->get_instrument() == instrRef ) { float fVal = ( rand() % 100 ) / 100.0; oldNoteVeloValue << QString("%1").arg( pNote->get_velocity() ); fVal = pNote->get_velocity() + ( ( fVal - 0.50 ) / 2 ); if ( fVal < 0 ) { fVal = 0; } if ( fVal > 1 ) { fVal = 1; } noteVeloValue << QString("%1").arg(fVal); } } } SE_randomVelocityRightClickAction *action = new SE_randomVelocityRightClickAction( noteVeloValue, oldNoteVeloValue, nSelectedInstrument, pEngine->getSelectedPatternNumber() ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } } void InstrumentLine::functionRenameInstrument() { // This code is pretty much a duplicate of void InstrumentEditor::labelClicked // in InstrumentEditor.cpp Hydrogen * pEngine = Hydrogen::get_instance(); Instrument *pSelectedInstrument = pEngine->getSong()->get_instrument_list()->get( m_nInstrumentNumber ); QString sOldName = pSelectedInstrument->get_name(); bool bIsOkPressed; QString sNewName = QInputDialog::getText( this, "Hydrogen", tr( "New instrument name" ), QLineEdit::Normal, sOldName, &bIsOkPressed ); if ( bIsOkPressed ) { pSelectedInstrument->set_name( sNewName ); #ifdef H2CORE_HAVE_JACK AudioEngine::get_instance()->lock( RIGHT_HERE ); Hydrogen *engine = Hydrogen::get_instance(); engine->renameJackPorts(engine->getSong()); AudioEngine::get_instance()->unlock(); #endif // this will force an update... EventQueue::get_instance()->push_event( EVENT_SELECTED_INSTRUMENT_CHANGED, -1 ); } else { // user entered nothing or pressed Cancel } } void InstrumentLine::functionDeleteInstrument() { Hydrogen * pEngine = Hydrogen::get_instance(); Instrument *pSelectedInstrument = pEngine->getSong()->get_instrument_list()->get( m_nInstrumentNumber ); std::list< Note* > noteList; Song* song = pEngine->getSong(); PatternList *patList = song->get_pattern_list(); QString instrumentName = pSelectedInstrument->get_name(); QString drumkitName = pEngine->getCurrentDrumkitname(); for ( int i = 0; i < patList->size(); i++ ) { H2Core::Pattern *pPattern = song->get_pattern_list()->get(i); const Pattern::notes_t* notes = pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); if ( pNote->get_instrument() == pSelectedInstrument ) { pNote->set_pattern_idx( i ); noteList.push_back( pNote ); } } } SE_deleteInstrumentAction *action = new SE_deleteInstrumentAction( noteList, drumkitName, instrumentName, m_nInstrumentNumber ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } ////// const char* PatternEditorInstrumentList::__class_name = "PatternEditorInstrumentList"; PatternEditorInstrumentList::PatternEditorInstrumentList( QWidget *parent, PatternEditorPanel *pPatternEditorPanel ) : QWidget( parent ) , Object( __class_name ) { //INFOLOG("INIT"); m_pPattern = nullptr; m_pPatternEditorPanel = pPatternEditorPanel; m_nGridHeight = Preferences::get_instance()->getPatternEditorGridHeight(); m_nEditorWidth = 181; m_nEditorHeight = m_nGridHeight * MAX_INSTRUMENTS; resize( m_nEditorWidth, m_nEditorHeight ); setAcceptDrops(true); for ( int i = 0; i < MAX_INSTRUMENTS; ++i) { m_pInstrumentLine[i] = nullptr; } updateInstrumentLines(); m_pUpdateTimer = new QTimer( this ); connect( m_pUpdateTimer, SIGNAL( timeout() ), this, SLOT( updateInstrumentLines() ) ); m_pUpdateTimer->start(50); } PatternEditorInstrumentList::~PatternEditorInstrumentList() { //INFOLOG( "DESTROY" ); m_pUpdateTimer->stop(); } /// /// Create a new InstrumentLine /// InstrumentLine* PatternEditorInstrumentList::createInstrumentLine() { InstrumentLine *pLine = new InstrumentLine(this); return pLine; } /// /// Update every InstrumentLine, create or destroy lines if necessary. /// void PatternEditorInstrumentList::updateInstrumentLines() { //INFOLOG( "Update lines" ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); InstrumentList *pInstrList = pSong->get_instrument_list(); Mixer * mixer = HydrogenApp::get_instance()->getMixer(); unsigned nSelectedInstr = pEngine->getSelectedInstrumentNumber(); unsigned nInstruments = pInstrList->size(); for ( unsigned nInstr = 0; nInstr < MAX_INSTRUMENTS; ++nInstr ) { if ( nInstr >= nInstruments ) { // unused instrument! let's hide and destroy the mixerline! if ( m_pInstrumentLine[ nInstr ] ) { delete m_pInstrumentLine[ nInstr ]; m_pInstrumentLine[ nInstr ] = nullptr; int newHeight = m_nGridHeight * nInstruments; resize( width(), newHeight ); } continue; } else { if ( m_pInstrumentLine[ nInstr ] == nullptr ) { // the instrument line doesn't exists..I'll create a new one! m_pInstrumentLine[ nInstr ] = createInstrumentLine(); m_pInstrumentLine[nInstr]->move( 0, m_nGridHeight * nInstr ); m_pInstrumentLine[nInstr]->show(); int newHeight = m_nGridHeight * nInstruments; resize( width(), newHeight ); } InstrumentLine *pLine = m_pInstrumentLine[ nInstr ]; Instrument* pInstr = pInstrList->get(nInstr); assert(pInstr); pLine->setNumber(nInstr); pLine->setName( pInstr->get_name() ); pLine->setSelected( nInstr == nSelectedInstr ); pLine->setMuted( pInstr->is_muted() ); if ( mixer ) { pLine->setSoloed( mixer->isSoloClicked( nInstr ) ); } } } } void PatternEditorInstrumentList::dragEnterEvent(QDragEnterEvent *event) { INFOLOG( "[dragEnterEvent]" ); if ( event->mimeData()->hasFormat("text/plain") ) { Song *song = (Hydrogen::get_instance())->getSong(); int nInstruments = song->get_instrument_list()->size(); if ( nInstruments < MAX_INSTRUMENTS ) { event->acceptProposedAction(); } } } void PatternEditorInstrumentList::dropEvent(QDropEvent *event) { //WARNINGLOG("Drop!"); QString sText = event->mimeData()->text(); if(sText.startsWith("Songs:") || sText.startsWith("Patterns:") || sText.startsWith("move pattern:") || sText.startsWith("drag pattern:")) return; if (sText.startsWith("move instrument:")) { Hydrogen *engine = Hydrogen::get_instance(); int nSourceInstrument = engine->getSelectedInstrumentNumber(); // Starting point for instument list is 50 lower than // on the drum pattern editor int pos_y = ( event->pos().x() >= m_nEditorWidth ) ? event->pos().y() - 50 : event->pos().y(); int nTargetInstrument = pos_y / m_nGridHeight; if( nTargetInstrument >= engine->getSong()->get_instrument_list()->size() ){ nTargetInstrument = engine->getSong()->get_instrument_list()->size() - 1; } if ( nSourceInstrument == nTargetInstrument ) { event->acceptProposedAction(); return; } SE_moveInstrumentAction *action = new SE_moveInstrumentAction( nSourceInstrument, nTargetInstrument ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); event->acceptProposedAction(); } if( sText.startsWith("importInstrument:") ) { //an instrument was dragged from the soundlibrary browser to the patterneditor sText = sText.remove(0,QString("importInstrument:").length()); QStringList tokens = sText.split( "::" ); QString sDrumkitName = tokens.at( 0 ); QString sInstrumentName = tokens.at( 1 ); int nTargetInstrument = event->pos().y() / m_nGridHeight; /* "X > 181": border between the instrument names on the left and the grid Because the right part of the grid starts above the name column, we have to subtract the difference */ if ( event->pos().x() > 181 ) nTargetInstrument = ( event->pos().y() - 90 ) / m_nGridHeight ; Hydrogen *engine = Hydrogen::get_instance(); if( nTargetInstrument > engine->getSong()->get_instrument_list()->size() ){ nTargetInstrument = engine->getSong()->get_instrument_list()->size(); } SE_dragInstrumentAction *action = new SE_dragInstrumentAction( sDrumkitName, sInstrumentName, nTargetInstrument); HydrogenApp::get_instance()->m_pUndoStack->push( action ); event->acceptProposedAction(); } } void PatternEditorInstrumentList::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { __drag_start_position = event->pos(); } } void PatternEditorInstrumentList::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) { return; } if ( abs(event->pos().y() - __drag_start_position.y()) < (int)m_nGridHeight) { return; } Hydrogen *pEngine = Hydrogen::get_instance(); int nSelectedInstr = pEngine->getSelectedInstrumentNumber(); Instrument *pInstr = pEngine->getSong()->get_instrument_list()->get(nSelectedInstr); QString sText = QString("move instrument:%1").arg( pInstr->get_name() ); QDrag *pDrag = new QDrag(this); QMimeData *pMimeData = new QMimeData; pMimeData->setText( sText ); pDrag->setMimeData( pMimeData); pDrag->exec( Qt::CopyAction | Qt::MoveAction ); // propago l'evento QWidget::mouseMoveEvent(event); } hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorInstrumentList.h000066400000000000000000000065531366722712400266450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PATTERN_EDITOR_INSTRUMENT_LIST_H #define PATTERN_EDITOR_INSTRUMENT_LIST_H #include #include #if QT_VERSION >= 0x050000 # include #endif #include #include "../Widgets/PixmapWidget.h" namespace H2Core { class Pattern; } class PatternEditorPanel; class ToggleButton; class InstrumentLine : public PixmapWidget { H2_OBJECT Q_OBJECT public: InstrumentLine(QWidget* pParent); void setName(const QString& sName); void setSelected(bool isSelected); void setNumber(int nIndex); void setMuted(bool isMuted); void setSoloed( bool soloed ); private slots: void functionClearNotes(); void functionFillAllNotes(); void functionFillEveryTwoNotes(); void functionFillEveryThreeNotes(); void functionFillEveryFourNotes(); void functionFillEverySixNotes(); void functionFillEveryEightNotes(); void functionFillEveryTwelveNotes(); void functionFillEverySixteenNotes(); void functionFillNotes( int every ); void functionCopyInstrumentPattern(); void functionCopyAllInstrumentPatterns(); void functionPasteInstrumentPattern(); void functionPasteAllInstrumentPatterns(); void functionPasteInstrumentPatternExec(int patternID); void functionRandomizeVelocity(); void functionDeleteInstrument(); void functionRenameInstrument(); void muteClicked(); void soloClicked(); private: QMenu *m_pFunctionPopup; QMenu *m_pFunctionPopupSub; QMenu *m_pCopyPopupSub; QMenu *m_pPastePopupSub; QLabel *m_pNameLbl; bool m_bIsSelected; int m_nInstrumentNumber; ///< The related instrument number ToggleButton *m_pMuteBtn; ToggleButton *m_pSoloBtn; virtual void mousePressEvent(QMouseEvent *ev); H2Core::Pattern* getCurrentPattern(); }; class PatternEditorInstrumentList : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: PatternEditorInstrumentList( QWidget *parent, PatternEditorPanel *pPatternEditorPanel ); ~PatternEditorInstrumentList(); virtual void mousePressEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); public slots: void updateInstrumentLines(); protected: PatternEditorPanel *m_pPatternEditorPanel; H2Core::Pattern *m_pPattern; uint m_nGridHeight; uint m_nEditorWidth; uint m_nEditorHeight; InstrumentLine* m_pInstrumentLine[MAX_INSTRUMENTS]; QTimer *m_pUpdateTimer; QPoint __drag_start_position; InstrumentLine* createInstrumentLine(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorPanel.cpp000066400000000000000000000773771366722712400252470ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include "HydrogenApp.h" #include "PatternEditorPanel.h" #include "PatternEditorInstrumentList.h" #include "PatternEditorRuler.h" #include "NotePropertiesRuler.h" #include "DrumPatternEditor.h" #include "PianoRollEditor.h" #include "../MainForm.h" #include "../Widgets/Button.h" #include "../Widgets/Fader.h" #include "../Widgets/PixmapWidget.h" #include "../Widgets/LCDCombo.h" #include "../Skin.h" #include "../SongEditor/SongEditorPanel.h" #include void PatternEditorPanel::updateSLnameLabel( ) { QFont font; font.setBold( true ); pSLlabel->setFont( font ); pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit ); } const char* PatternEditorPanel::__class_name = "PatternEditorPanel"; PatternEditorPanel::PatternEditorPanel( QWidget *pParent ) : QWidget( pParent ) , Object( __class_name ) , m_pPattern( nullptr ) { setAcceptDrops(true); Preferences *pPref = Preferences::get_instance(); // Editor TOP PixmapWidget *editor_top = new PixmapWidget(nullptr); editor_top->setPixmap("/patternEditor/editor_top.png", true); editor_top->setFixedHeight(24); PixmapWidget *editor_top_2 = new PixmapWidget(nullptr); editor_top_2->setPixmap("/patternEditor/editor_top.png", true); editor_top_2->setFixedHeight(24); QHBoxLayout *editor_top_hbox = new QHBoxLayout(editor_top); editor_top_hbox->setSpacing(0); editor_top_hbox->setMargin(0); editor_top_hbox->setAlignment(Qt::AlignLeft); QHBoxLayout *editor_top_hbox_2 = new QHBoxLayout(editor_top_2); editor_top_hbox_2->setSpacing(0); editor_top_hbox_2->setMargin(0); editor_top_hbox_2->setAlignment(Qt::AlignLeft); //soundlibrary name pSLlabel = new QLabel( nullptr ); pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit ); pSLlabel->setFixedSize( 170, 20 ); pSLlabel->move( 10, 3 ); pSLlabel->setToolTip( tr("Loaded Soundlibrary") ); editor_top_hbox->addWidget( pSLlabel ); //wolke some background images back_size_res PixmapWidget *pSizeResol = new PixmapWidget( nullptr ); pSizeResol->setFixedSize( 200, 20 ); pSizeResol->setPixmap( "/patternEditor/background_res-new.png" ); pSizeResol->move( 0, 3 ); editor_top_hbox_2->addWidget( pSizeResol ); // PATTERN size __pattern_size_combo = new LCDCombo(pSizeResol, 4); __pattern_size_combo->move( 34, 2 ); __pattern_size_combo->setToolTip( tr("Select pattern size") ); for ( int i = 1; i <= 32; i++) { __pattern_size_combo->addItem( QString( "%1" ).arg( i ) ); } // is triggered from inside selectedPatternChangedEvent() connect(__pattern_size_combo, SIGNAL( valueChanged( int ) ), this, SLOT( patternSizeChanged( int ) ) ); // GRID resolution __resolution_combo = new LCDCombo( pSizeResol , 7); __resolution_combo->setToolTip(tr("Select grid resolution")); __resolution_combo->addItem( "4" ); __resolution_combo->addItem( "8" ); __resolution_combo->addItem( "16" ); __resolution_combo->addItem( "32" ); __resolution_combo->addItem( "64" ); __resolution_combo->addSeparator(); __resolution_combo->addItem( "4T" ); __resolution_combo->addItem( "8T" ); __resolution_combo->addItem( "16T" ); __resolution_combo->addItem( "32T" ); __resolution_combo->addSeparator(); __resolution_combo->addItem( "off" ); __resolution_combo->move( 121, 2 ); // is triggered from inside PatternEditorPanel() connect(__resolution_combo, SIGNAL(valueChanged( int )), this, SLOT(gridResolutionChanged( int ))); PixmapWidget *pRec = new PixmapWidget( nullptr ); pRec->setFixedSize( 158, 20 ); pRec->setPixmap( "/patternEditor/background_rec-new.png" ); pRec->move( 0, 3 ); editor_top_hbox_2->addWidget( pRec ); // Hear notes btn ToggleButton *hearNotesBtn = new ToggleButton( pRec, "/patternEditor/btn_hear_on.png", "/patternEditor/btn_hear_off.png", "/patternEditor/btn_hear_off.png", QSize(15, 13) ); hearNotesBtn->move( 34, 3 ); hearNotesBtn->setToolTip( tr( "Hear new notes" ) ); connect( hearNotesBtn, SIGNAL(clicked(Button*)), this, SLOT( hearNotesBtnClick(Button*))); hearNotesBtn->setPressed( pPref->getHearNewNotes() ); // quantize ToggleButton* quantizeEventsBtn = new ToggleButton( pRec, "/patternEditor/btn_quant_on.png", "/patternEditor/btn_quant_off.png", "/patternEditor/btn_quant_off.png", QSize(15, 13) ); quantizeEventsBtn->move( 90, 3 ); quantizeEventsBtn->setPressed( pPref->getQuantizeEvents()); quantizeEventsBtn->setToolTip( tr( "Quantize keyboard/midi events to grid" ) ); connect( quantizeEventsBtn, SIGNAL(clicked(Button*)), this, SLOT( quantizeEventsBtnClick(Button*))); // Editor mode __show_drum_btn = new ToggleButton( pRec, "/patternEditor/btn_drum_piano_on.png", "/patternEditor/btn_drum_piano_off.png", "/patternEditor/btn_drum_piano_off.png", QSize(17, 13) ); __show_drum_btn->move( 137, 3 ); __show_drum_btn->setPressed( false ); __show_drum_btn->setToolTip( tr( "Show piano roll editor" ) ); connect(__show_drum_btn, SIGNAL(clicked(Button*)), this, SLOT( showDrumEditorBtnClick(Button*))); __recpredelete = new QComboBox( nullptr ); __recpredelete->setFixedSize( 130, 20 ); __recpredelete->move( 2, 1 ); __recpredelete->addItem ( QString( "On play" )); __recpredelete->addItem ( QString( "On rec: once fp" )); __recpredelete->addItem ( QString( "On rec: 1/1 fp" )); __recpredelete->addItem ( QString( "On rec: 1/2 fp" )); __recpredelete->addItem ( QString( "On rec: 1/4 fp" )); __recpredelete->addItem ( QString( "On rec: 1/8 fp" )); __recpredelete->addItem ( QString( "On rec: 1/16 fp" )); __recpredelete->addItem ( QString( "On rec: 1/32 fp" )); __recpredelete->addItem ( QString( "On rec: 1/64 fp" )); __recpredelete->addItem ( QString( "On rec: 1/64" )); __recpredelete->addItem ( QString( "On rec: 1/32" )); __recpredelete->addItem ( QString( "On rec: 1/16" )); __recpredelete->addItem ( QString( "On rec: 1/8" )); __recpredelete->addItem ( QString( "On rec: 1/4" )); __recpredelete->addItem ( QString( "On rec: 1/2" )); __recpredelete->addItem ( QString( "On rec: 1/1" )); __recpredelete->addItem ( QString( "On rec: once" )); __recpredelete->update(); __recpredelete->setToolTip( tr( "destructive mode pre delete settings" ) ); editor_top_hbox_2->addWidget( __recpredelete ); connect( __recpredelete, SIGNAL( currentIndexChanged( int ) ), this, SLOT( recPreDeleteSelect( int) ) ); __recpostdelete = new QComboBox( nullptr ); __recpostdelete->setFixedSize( 60, 20 ); __recpostdelete->move( 2, 1 ); __recpostdelete->addItem ( QString( "off" )); __recpostdelete->addItem ( QString( "1/64" )); __recpostdelete->addItem ( QString( "1/32" )); __recpostdelete->addItem ( QString( "1/16" )); __recpostdelete->addItem ( QString( "1/8" )); __recpostdelete->addItem ( QString( "1/4" )); __recpostdelete->addItem ( QString( "1/2" )); __recpostdelete->addItem ( QString( "1/1" )); __recpostdelete->update(); __recpostdelete->setToolTip( tr( "destructive mode post delete settings" ) ); editor_top_hbox_2->addWidget( __recpostdelete ); connect( __recpostdelete, SIGNAL( currentIndexChanged( int ) ), this, SLOT( recPostDeleteSelect( int) ) ); // zoom-in btn Button *zoom_in_btn = new Button( nullptr, "/songEditor/btn_new_on.png", "/songEditor/btn_new_off.png", "/songEditor/btn_new_over.png", QSize(19, 13) ); zoom_in_btn->setToolTip( tr( "Zoom in" ) ); connect(zoom_in_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomInBtnClicked(Button*) ) ); // zoom-out btn Button *zoom_out_btn = new Button( nullptr, "/songEditor/btn_minus_on.png", "/songEditor/btn_minus_off.png", "/songEditor/btn_minus_over.png", QSize(19, 13) ); zoom_out_btn->setToolTip( tr( "Zoom out" ) ); connect( zoom_out_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomOutBtnClicked(Button*) ) ); // End Editor TOP // RULER____________________________________ // Ruler ScrollView m_pRulerScrollView = new QScrollArea( nullptr ); m_pRulerScrollView->setFrameShape( QFrame::NoFrame ); m_pRulerScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pRulerScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pRulerScrollView->setFixedHeight( 25 ); // Ruler m_pPatternEditorRuler = new PatternEditorRuler( m_pRulerScrollView->viewport() ); m_pRulerScrollView->setWidget( m_pPatternEditorRuler ); connect( m_pRulerScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ RULER // EDITOR _____________________________________ // Editor scrollview m_pEditorScrollView = new QScrollArea( nullptr ); m_pEditorScrollView->setFrameShape( QFrame::NoFrame ); m_pEditorScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pEditorScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); // Editor m_pDrumPatternEditor = new DrumPatternEditor( m_pEditorScrollView->viewport(), this ); m_pEditorScrollView->setWidget( m_pDrumPatternEditor ); connect( m_pEditorScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorVScroll(int) ) ); connect( m_pEditorScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //PianoRollEditor m_pPianoRollScrollView = new QScrollArea( nullptr ); m_pPianoRollScrollView->setFrameShape( QFrame::NoFrame ); m_pPianoRollScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded ); m_pPianoRollScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pPianoRollEditor = new PianoRollEditor( m_pPianoRollScrollView->viewport(), this ); m_pPianoRollScrollView->setWidget( m_pPianoRollEditor ); connect( m_pPianoRollScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); m_pPianoRollScrollView->hide(); //~ EDITOR // INSTRUMENT LIST // Instrument list scrollview m_pInstrListScrollView = new QScrollArea( nullptr ); m_pInstrListScrollView->setFrameShape( QFrame::NoFrame ); m_pInstrListScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pInstrListScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); // Instrument list m_pInstrumentList = new PatternEditorInstrumentList( m_pInstrListScrollView->viewport(), this ); m_pInstrListScrollView->setWidget( m_pInstrumentList ); m_pInstrListScrollView->setFixedWidth( m_pInstrumentList->width() ); connect( m_pInstrListScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorVScroll(int) ) ); //~ INSTRUMENT LIST // NOTE_VELOCITY EDITOR m_pNoteVelocityScrollView = new QScrollArea( nullptr ); m_pNoteVelocityScrollView->setFrameShape( QFrame::NoFrame ); m_pNoteVelocityScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteVelocityScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteVelocityEditor = new NotePropertiesRuler( m_pNoteVelocityScrollView->viewport(), this, NotePropertiesRuler::VELOCITY ); m_pNoteVelocityScrollView->setWidget( m_pNoteVelocityEditor ); m_pNoteVelocityScrollView->setFixedHeight( 100 ); connect( m_pNoteVelocityScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ NOTE_VELOCITY EDITOR // NOTE_PAN EDITOR m_pNotePanScrollView = new QScrollArea( nullptr ); m_pNotePanScrollView->setFrameShape( QFrame::NoFrame ); m_pNotePanScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNotePanScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNotePanEditor = new NotePropertiesRuler( m_pNotePanScrollView->viewport(), this, NotePropertiesRuler::PAN ); m_pNotePanScrollView->setWidget( m_pNotePanEditor ); m_pNotePanScrollView->setFixedHeight( 100 ); connect( m_pNotePanScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ NOTE_PAN EDITOR // NOTE_LEADLAG EDITOR m_pNoteLeadLagScrollView = new QScrollArea( nullptr ); m_pNoteLeadLagScrollView->setFrameShape( QFrame::NoFrame ); m_pNoteLeadLagScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteLeadLagScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteLeadLagEditor = new NotePropertiesRuler( m_pNoteLeadLagScrollView->viewport(), this, NotePropertiesRuler::LEADLAG ); m_pNoteLeadLagScrollView->setWidget( m_pNoteLeadLagEditor ); m_pNoteLeadLagScrollView->setFixedHeight( 100 ); connect( m_pNoteLeadLagScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ NOTE_LEADLAG EDITOR // NOTE_NOTEKEY EDITOR m_pNoteNoteKeyScrollView = new QScrollArea( nullptr ); m_pNoteNoteKeyScrollView->setFrameShape( QFrame::NoFrame ); m_pNoteNoteKeyScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteNoteKeyScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteNoteKeyEditor = new NotePropertiesRuler( m_pNoteNoteKeyScrollView->viewport(), this, NotePropertiesRuler::NOTEKEY ); m_pNoteNoteKeyScrollView->setWidget( m_pNoteNoteKeyEditor ); m_pNoteNoteKeyScrollView->setFixedHeight( 210 ); connect( m_pNoteNoteKeyScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ NOTE_NOTEKEY EDITOR // NOTE_PROBABILITY EDITOR m_pNoteProbabilityScrollView = new QScrollArea( nullptr ); m_pNoteProbabilityScrollView->setFrameShape( QFrame::NoFrame ); m_pNoteProbabilityScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteProbabilityScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pNoteProbabilityEditor = new NotePropertiesRuler( m_pNoteProbabilityScrollView->viewport(), this, NotePropertiesRuler::PROBABILITY ); m_pNoteProbabilityScrollView->setWidget( m_pNoteProbabilityEditor ); m_pNoteProbabilityScrollView->setFixedHeight( 100 ); connect( m_pNoteProbabilityScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorHScroll(int) ) ); //~ NOTE_PROBABILITY EDITOR // external horizontal scrollbar m_pPatternEditorHScrollBar = new QScrollBar( Qt::Horizontal , nullptr ); connect( m_pPatternEditorHScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) ); // external vertical scrollbar m_pPatternEditorVScrollBar = new QScrollBar( Qt::Vertical, nullptr ); connect( m_pPatternEditorVScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) ); QHBoxLayout *pPatternEditorHScrollBarLayout = new QHBoxLayout(); pPatternEditorHScrollBarLayout->setSpacing( 0 ); pPatternEditorHScrollBarLayout->setMargin( 0 ); pPatternEditorHScrollBarLayout->addWidget( m_pPatternEditorHScrollBar ); pPatternEditorHScrollBarLayout->addWidget( zoom_in_btn ); pPatternEditorHScrollBarLayout->addWidget( zoom_out_btn ); QWidget *pPatternEditorHScrollBarContainer = new QWidget(); pPatternEditorHScrollBarContainer->setLayout( pPatternEditorHScrollBarLayout ); QPalette label_palette; label_palette.setColor( QPalette::Foreground, QColor( 230, 230, 230 ) ); QFont boldFont; boldFont.setBold( true ); m_pPatternNameLbl = new QLabel( nullptr ); m_pPatternNameLbl->setFont( boldFont ); m_pPatternNameLbl->setText( "pattern name label" ); m_pPatternNameLbl->setPalette(label_palette); // NOTE_PROPERTIES BUTTONS PixmapWidget *pPropertiesPanel = new PixmapWidget( nullptr ); pPropertiesPanel->setColor( QColor( 58, 62, 72 ) ); pPropertiesPanel->setFixedSize( 181, 100 ); QVBoxLayout *pPropertiesVBox = new QVBoxLayout( pPropertiesPanel ); pPropertiesVBox->setSpacing( 0 ); pPropertiesVBox->setMargin( 0 ); __pPropertiesCombo = new LCDCombo( nullptr, 20); __pPropertiesCombo->setToolTip(tr("Select note properties")); __pPropertiesCombo->addItem( tr("Velocity") ); __pPropertiesCombo->addItem( tr("Pan") ); __pPropertiesCombo->addItem( tr("Lead and Lag") ); __pPropertiesCombo->addItem( tr("NoteKey") ); __pPropertiesCombo->addItem( tr("Probability") ); /* __pPropertiesCombo->addItem( tr("Cutoff") ); */ /* __pPropertiesCombo->addItem( tr("Resonance") ); */ // is triggered here below connect( __pPropertiesCombo, SIGNAL(valueChanged( int )), this, SLOT(propertiesComboChanged( int ))); pPropertiesVBox->addWidget( __pPropertiesCombo ); //~ NOTE_PROPERTIES BUTTONS // LAYOUT QWidget *pMainPanel = new QWidget(); QGridLayout *pGrid = new QGridLayout(); pGrid->setSpacing( 0 ); pGrid->setMargin( 0 ); pGrid->addWidget( editor_top, 0, 0); pGrid->addWidget( editor_top_2, 0, 1, 1, 3); pGrid->addWidget( m_pPatternNameLbl, 1, 0 ); pGrid->addWidget( m_pRulerScrollView, 1, 1 ); pGrid->addWidget( m_pInstrListScrollView, 2, 0 ); pGrid->addWidget( m_pEditorScrollView, 2, 1 ); pGrid->addWidget( m_pPianoRollScrollView, 2, 1 ); pGrid->addWidget( m_pPatternEditorVScrollBar, 2, 2 ); pGrid->addWidget( pPatternEditorHScrollBarContainer, 10, 1 ); pGrid->addWidget( m_pNoteVelocityScrollView, 4, 1 ); pGrid->addWidget( m_pNotePanScrollView, 4, 1 ); pGrid->addWidget( m_pNoteLeadLagScrollView, 4, 1 ); pGrid->addWidget( m_pNoteNoteKeyScrollView, 4, 1 ); pGrid->addWidget( m_pNoteProbabilityScrollView, 4, 1 ); pGrid->addWidget( pPropertiesPanel, 4, 0 ); pGrid->setRowStretch( 2, 100 ); pMainPanel->setLayout( pGrid ); // restore grid resolution int nIndex; int nRes = pPref->getPatternEditorGridResolution(); if (nRes == MAX_NOTES) { nIndex = 11; } else if ( pPref->isPatternEditorUsingTriplets() == false ) { switch ( nRes ) { case 4: nIndex = 0; break; case 8: nIndex = 1; break; case 16: nIndex = 2; break; case 32: nIndex = 3; break; case 64: nIndex = 4; break; default: nIndex = 0; ERRORLOG( QString("Wrong grid resolution: %1").arg( pPref->getPatternEditorGridResolution() ) ); } } else { switch ( nRes ) { case 8: nIndex = 6; break; case 16: nIndex = 7; break; case 32: nIndex = 8; break; case 64: nIndex = 9; break; default: nIndex = 6; ERRORLOG( QString("Wrong grid resolution: %1").arg( pPref->getPatternEditorGridResolution() ) ); } } __resolution_combo->select( nIndex ); //set pre delete __recpredelete->setCurrentIndex(pPref->m_nRecPreDelete); __recpostdelete->setCurrentIndex(pPref->m_nRecPostDelete); displayorHidePrePostCB(); // LAYOUT QVBoxLayout *pVBox = new QVBoxLayout(); pVBox->setSpacing( 0 ); pVBox->setMargin( 0 ); this->setLayout( pVBox ); pVBox->addWidget( pMainPanel ); HydrogenApp::get_instance()->addEventListener( this ); // update __pPropertiesCombo->select( 0 ); selectedPatternChangedEvent(); } PatternEditorPanel::~PatternEditorPanel() { } void PatternEditorPanel::syncToExternalHorizontalScrollbar(int) { //INFOLOG( "[syncToExternalHorizontalScrollbar]" ); // drum Editor m_pEditorScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); m_pEditorScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() ); // piano roll Editor m_pPianoRollScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // Ruler m_pRulerScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // Instrument list m_pInstrListScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() ); // Velocity ruler m_pNoteVelocityScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // pan ruler m_pNotePanScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // leadlag ruler m_pNoteLeadLagScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // notekey ruler m_pNoteNoteKeyScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); // Probability ruler m_pNoteProbabilityScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() ); } void PatternEditorPanel::on_patternEditorVScroll(int nValue) { //INFOLOG( "[on_patternEditorVScroll] " + QString::number(nValue) ); m_pPatternEditorVScrollBar->setValue( nValue ); resizeEvent(nullptr); } void PatternEditorPanel::on_patternEditorHScroll(int nValue) { //INFOLOG( "[on_patternEditorHScroll] " + QString::number(nValue) ); m_pPatternEditorHScrollBar->setValue( nValue ); resizeEvent(nullptr); } void PatternEditorPanel::gridResolutionChanged( int nSelected ) { int nResolution; bool bUseTriplets = false; if ( nSelected == 11 ) { nResolution = MAX_NOTES; } else if ( nSelected > 4 ) { bUseTriplets = true; nResolution = 0x1 << (nSelected - 3); } else { nResolution = 0x1 << (nSelected + 2); } // INFOLOG( QString("idx %1 -> %2 resolution").arg( nSelected ).arg( nResolution ) ); m_pDrumPatternEditor->setResolution( nResolution, bUseTriplets ); m_pPianoRollEditor->setResolution( nResolution, bUseTriplets ); Preferences::get_instance()->setPatternEditorGridResolution( nResolution ); Preferences::get_instance()->setPatternEditorUsingTriplets( bUseTriplets ); } void PatternEditorPanel::selectedPatternChangedEvent() { PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); int nSelectedPatternNumber = Hydrogen::get_instance()->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { // update pattern name text m_pPattern = pPatternList->get( nSelectedPatternNumber ); QString sCurrentPatternName = m_pPattern->get_name(); this->setWindowTitle( ( tr( "Pattern editor - %1").arg( sCurrentPatternName ) ) ); m_pPatternNameLbl->setText( sCurrentPatternName ); // update pattern size combobox int nPatternSize = m_pPattern->get_length(); int nEighth = MAX_NOTES / 8; // do no emit the changed value, otherwise patternSizeChanged() would be triggered, // which handles a manual pattern size change __pattern_size_combo->select( (nPatternSize / nEighth) - 1 , false); } else { m_pPattern = nullptr; this->setWindowTitle( ( tr( "Pattern editor - %1").arg(QString("No pattern selected.")) ) ); m_pPatternNameLbl->setText( tr( "No pattern selected" ) ); } resizeEvent( nullptr ); // force an update of the scrollbars } void PatternEditorPanel::hearNotesBtnClick(Button *ref) { Preferences *pref = ( Preferences::get_instance() ); pref->setHearNewNotes( ref->isPressed() ); if (ref->isPressed() ) { ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Hear new notes = On" ), 2000 ); } else { ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Hear new notes = Off" ), 2000 ); } } void PatternEditorPanel::quantizeEventsBtnClick(Button *ref) { Preferences *pref = ( Preferences::get_instance() ); pref->setQuantizeEvents( ref->isPressed() ); if (ref->isPressed() ) { ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Quantize incoming keyboard/midi events = On" ), 2000 ); } else { ( HydrogenApp::get_instance() )->setStatusBarMessage( tr( "Quantize incoming keyboard/midi events = Off" ), 2000 ); } } static void syncScrollBarSize(QScrollBar *pDest, QScrollBar *pSrc) { pDest->setMinimum( pSrc->minimum() ); pDest->setMaximum( pSrc->maximum() ); pDest->setSingleStep( pSrc->singleStep() ); pDest->setPageStep( pSrc->pageStep() ); } void PatternEditorPanel::resizeEvent( QResizeEvent *ev ) { UNUSED( ev ); QScrollArea *pScrollArea = m_pEditorScrollView; syncScrollBarSize( m_pPatternEditorHScrollBar, pScrollArea->horizontalScrollBar() ); syncScrollBarSize( m_pPatternEditorVScrollBar, pScrollArea->verticalScrollBar() ); syncScrollBarSize( m_pRulerScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar() ); syncScrollBarSize( m_pNoteVelocityScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar() ); syncScrollBarSize( m_pNotePanScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar() ); syncScrollBarSize( m_pNoteLeadLagScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar()) ; syncScrollBarSize( m_pNoteNoteKeyScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar() ); syncScrollBarSize( m_pNoteProbabilityScrollView->horizontalScrollBar(), pScrollArea->horizontalScrollBar() ); } void PatternEditorPanel::showEvent ( QShowEvent *ev ) { UNUSED( ev ); } /// richiamato dall'uso dello scroll del mouse void PatternEditorPanel::contentsMoving(int dummy) { UNUSED( dummy ); //INFOLOG( "contentsMoving" ); syncToExternalHorizontalScrollbar(0); } void PatternEditorPanel::selectedInstrumentChangedEvent() { //m_pNoteVelocityEditor->updateEditor(); //m_pNotePanEditor->updateEditor(); //m_pNoteLeadLagEditor->updateEditor(); resizeEvent(nullptr); // force a scrollbar update } void PatternEditorPanel::showDrumEditorBtnClick(Button *ref) { UNUSED( ref ); if ( !__show_drum_btn->isPressed() ){ __show_drum_btn->setToolTip( tr( "Show piano roll editor" ) ); m_pPianoRollScrollView->hide(); m_pEditorScrollView->show(); m_pInstrListScrollView->show(); m_pDrumPatternEditor->selectedInstrumentChangedEvent(); // force an update // force a re-sync of extern scrollbars resizeEvent( nullptr ); } else { __show_drum_btn->setToolTip( tr( "Show drum editor" ) ); m_pPianoRollScrollView->show(); m_pPianoRollScrollView->verticalScrollBar()->setValue( 250 ); m_pEditorScrollView->show(); m_pInstrListScrollView->show(); m_pPianoRollEditor->selectedPatternChangedEvent(); m_pPianoRollEditor->updateEditor(); // force an update // force a re-sync of extern scrollbars resizeEvent( nullptr ); } } void PatternEditorPanel::zoomInBtnClicked(Button *ref) { if(m_pPatternEditorRuler->getGridWidth() >=24){ return; } UNUSED( ref ); m_pPatternEditorRuler->zoomIn(); m_pDrumPatternEditor->zoom_in(); m_pNoteVelocityEditor->zoomIn(); m_pNoteLeadLagEditor->zoomIn(); m_pNoteNoteKeyEditor->zoomIn(); m_pNoteProbabilityEditor->zoomIn(); m_pNotePanEditor->zoomIn(); m_pPianoRollEditor->zoom_in(); resizeEvent( nullptr ); } void PatternEditorPanel::zoomOutBtnClicked(Button *ref) { UNUSED( ref ); m_pPatternEditorRuler->zoomOut(); m_pDrumPatternEditor->zoom_out(); m_pNoteVelocityEditor->zoomOut(); m_pNoteLeadLagEditor->zoomOut(); m_pNoteNoteKeyEditor->zoomOut(); m_pNoteProbabilityEditor->zoomOut(); m_pNotePanEditor->zoomOut(); m_pPianoRollEditor->zoom_out(); resizeEvent( nullptr ); } void PatternEditorPanel::patternSizeChanged( int nSelected ) { // INFOLOG( QString("idx %1 -> %2 eighth").arg( nSelected ).arg( ( MAX_NOTES / 8 ) * ( nSelected + 1 ) ) ); if ( !m_pPattern ) { return; } int nEighth = MAX_NOTES / 8; Hydrogen *pEngine = Hydrogen::get_instance(); if ( pEngine->getState() != STATE_READY ) { __pattern_size_combo->select( ((m_pPattern->get_length() / nEighth) - 1), false ); QMessageBox::information( this, "Hydrogen", tr( "Is not possible to change the pattern size when playing." ) ); return; } m_pPattern->set_length( nEighth * ( nSelected + 1 ) ); m_pPatternEditorRuler->updateEditor( true ); // redraw all m_pNoteVelocityEditor->updateEditor(); m_pNotePanEditor->updateEditor(); m_pNoteLeadLagEditor->updateEditor(); m_pNoteNoteKeyEditor->updateEditor(); m_pNoteProbabilityEditor->updateEditor(); m_pPianoRollEditor->updateEditor(); resizeEvent( nullptr ); EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); } void PatternEditorPanel::moveUpBtnClicked(Button *) { Hydrogen *engine = Hydrogen::get_instance(); int nSelectedInstrument = engine->getSelectedInstrumentNumber(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = engine->getSong(); InstrumentList *pInstrumentList = pSong->get_instrument_list(); if ( ( nSelectedInstrument - 1 ) >= 0 ) { pInstrumentList->swap( nSelectedInstrument -1, nSelectedInstrument ); AudioEngine::get_instance()->unlock(); engine->setSelectedInstrumentNumber( nSelectedInstrument - 1 ); pSong->set_is_modified( true ); } else { AudioEngine::get_instance()->unlock(); } } void PatternEditorPanel::moveDownBtnClicked(Button *) { Hydrogen *engine = Hydrogen::get_instance(); int nSelectedInstrument = engine->getSelectedInstrumentNumber(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = engine->getSong(); InstrumentList *pInstrumentList = pSong->get_instrument_list(); if ( ( nSelectedInstrument + 1 ) < (int)pInstrumentList->size() ) { pInstrumentList->swap( nSelectedInstrument, nSelectedInstrument + 1 ); AudioEngine::get_instance()->unlock(); engine->setSelectedInstrumentNumber( nSelectedInstrument + 1 ); pSong->set_is_modified( true ); } else { AudioEngine::get_instance()->unlock(); } } void PatternEditorPanel::dragEnterEvent(QDragEnterEvent *event) { m_pInstrumentList->dragEnterEvent( event ); } void PatternEditorPanel::dropEvent(QDropEvent *event) { m_pInstrumentList->dropEvent( event ); } void PatternEditorPanel::propertiesComboChanged( int nSelected ) { if ( nSelected == 0 ) { // Velocity m_pNotePanScrollView->hide(); m_pNoteLeadLagScrollView->hide(); m_pNoteNoteKeyScrollView->hide(); m_pNoteVelocityScrollView->show(); m_pNoteProbabilityScrollView->hide(); m_pNoteVelocityEditor->updateEditor(); } else if ( nSelected == 1 ) { // Pan m_pNoteVelocityScrollView->hide(); m_pNoteLeadLagScrollView->hide(); m_pNoteNoteKeyScrollView->hide(); m_pNotePanScrollView->show(); m_pNoteProbabilityScrollView->hide(); m_pNotePanEditor->updateEditor(); } else if ( nSelected == 2 ) { // Lead and Lag m_pNoteVelocityScrollView->hide(); m_pNotePanScrollView->hide(); m_pNoteNoteKeyScrollView->hide(); m_pNoteLeadLagScrollView->show(); m_pNoteProbabilityScrollView->hide(); m_pNoteLeadLagEditor->updateEditor(); } else if ( nSelected == 3 ) { // NoteKey m_pNoteVelocityScrollView->hide(); m_pNotePanScrollView->hide(); m_pNoteLeadLagScrollView->hide(); m_pNoteNoteKeyScrollView->show(); m_pNoteProbabilityScrollView->hide(); m_pNoteNoteKeyEditor->updateEditor(); } else if ( nSelected == 4 ) { // Probability m_pNotePanScrollView->hide(); m_pNoteLeadLagScrollView->hide(); m_pNoteNoteKeyScrollView->hide(); m_pNoteVelocityScrollView->hide(); m_pNoteProbabilityScrollView->show(); m_pNoteProbabilityEditor->updateEditor(); } /* else if ( nSelected == 5 ) { // Cutoff } else if ( nSelected == 6 ) { // Resonance } */ else { ERRORLOG( QString("unhandled value : %1").arg(nSelected) ); } } void PatternEditorPanel::recPreDeleteSelect( int index ) { Preferences::get_instance()->m_nRecPreDelete = index; if( index>=9 && index <=15 ){ __recpostdelete->show(); }else{ __recpostdelete->hide(); } } void PatternEditorPanel::recPostDeleteSelect( int index ) { Preferences::get_instance()->m_nRecPostDelete = index; } void PatternEditorPanel::displayorHidePrePostCB() { int index = __recpredelete->currentIndex(); if( Preferences::get_instance()->getDestructiveRecord() ){ __recpostdelete->show(); if( index>=8 && index <=14 ){ __recpostdelete->show(); }else{ __recpostdelete->hide(); } __recpredelete->show(); }else{ __recpostdelete->hide(); __recpredelete->hide(); } } void PatternEditorPanel::updatePianorollEditor() { m_pDrumPatternEditor->updateEditor(); // force an update } hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorPanel.h000066400000000000000000000117421366722712400246740ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PATTERN_EDITOR_PANEL_H #define PATTERN_EDITOR_PANEL_H #include #include "PianoRollEditor.h" #include "../EventListener.h" #include "../Widgets/LCDCombo.h" class Button; class ToggleButton; class Fader; class PatternEditorRuler; class PatternEditorInstrumentList; class NotePropertiesRuler; class LCDCombo; class DrumPatternEditor; class PianoRollEditor; enum patternEditorRightClickMode { VELOCITY_SELECTED, PAN_SELECTED, LEAD_LAG_SELECTED }; namespace H2Core { class Pattern; } /// /// Pattern Editor Panel /// class PatternEditorPanel : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: PatternEditorPanel(QWidget *parent); ~PatternEditorPanel(); DrumPatternEditor* getDrumPatternEditor() { return m_pDrumPatternEditor; } NotePropertiesRuler* getVelocityEditor() { return m_pNoteVelocityEditor; } NotePropertiesRuler* getPanEditor() { return m_pNotePanEditor; } NotePropertiesRuler* getLeadLagEditor() { return m_pNoteLeadLagEditor; } NotePropertiesRuler* getNoteKeyEditor() { return m_pNoteNoteKeyEditor; } NotePropertiesRuler* getProbabilityEditor() { return m_pNoteProbabilityEditor; } PatternEditorInstrumentList* getInstrumentList() { return m_pInstrumentList; } PianoRollEditor* getPianoRollEditor() { return m_pPianoRollEditor; } int getPropertiesComboValue(){ return __pPropertiesCombo->selected(); } void updateSLnameLabel(); void displayorHidePrePostCB(); void updatePianorollEditor(); // Implements EventListener interface virtual void selectedPatternChangedEvent(); virtual void selectedInstrumentChangedEvent(); //~ Implements EventListener interface private slots: void gridResolutionChanged( int nSelected ); void propertiesComboChanged( int nSelected ); void patternSizeChanged( int nSelected ); void hearNotesBtnClick(Button *ref); void quantizeEventsBtnClick(Button *ref); void showDrumEditorBtnClick(Button *ref); void syncToExternalHorizontalScrollbar(int); void contentsMoving(int dummy); void on_patternEditorVScroll(int); void on_patternEditorHScroll(int); void zoomInBtnClicked(Button *ref); void zoomOutBtnClicked(Button *ref); void moveDownBtnClicked(Button *); void moveUpBtnClicked(Button *); void recPreDeleteSelect( int index ); void recPostDeleteSelect( int index ); private: H2Core::Pattern * m_pPattern; QPixmap m_backgroundPixmap; QLabel * pSLlabel; // Editor top LCDCombo * __pattern_size_combo; LCDCombo * __resolution_combo; ToggleButton * __show_drum_btn; ToggleButton * __show_piano_btn; QComboBox * __recpredelete; QComboBox * __recpostdelete; // ~Editor top //note properties combo LCDCombo * __pPropertiesCombo; // drum editor QScrollArea* m_pEditorScrollView; DrumPatternEditor * m_pDrumPatternEditor; // piano roll editor QScrollArea* m_pPianoRollInternScrollView; QScrollArea* m_pPianoRollScrollView; PianoRollEditor * m_pPianoRollEditor; // ruler QScrollArea* m_pRulerScrollView; PatternEditorRuler *m_pPatternEditorRuler; // instr list QScrollArea* m_pInstrListScrollView; PatternEditorInstrumentList *m_pInstrumentList; // note velocity editor QScrollArea* m_pNoteVelocityScrollView; NotePropertiesRuler *m_pNoteVelocityEditor; // note pan editor QScrollArea* m_pNotePanScrollView; NotePropertiesRuler *m_pNotePanEditor; // note leadlag editor QScrollArea* m_pNoteLeadLagScrollView; NotePropertiesRuler *m_pNoteLeadLagEditor; // note notekey editor QScrollArea* m_pNoteNoteKeyScrollView; NotePropertiesRuler *m_pNoteNoteKeyEditor; // note probability editor QScrollArea * m_pNoteProbabilityScrollView; NotePropertiesRuler *m_pNoteProbabilityEditor; QScrollBar * m_pPatternEditorHScrollBar; QScrollBar * m_pPatternEditorVScrollBar; // TOOLBAR QLabel * m_pPatternNameLbl; Button * m_pRandomVelocityBtn; //~ TOOLBAR Button * sizeDropdownBtn; Button * resDropdownBtn; virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); virtual void resizeEvent(QResizeEvent *ev); virtual void showEvent(QShowEvent *ev); }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorRuler.cpp000066400000000000000000000161311366722712400252560ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include #include #include "PatternEditorRuler.h" #include "PatternEditorPanel.h" #include "../HydrogenApp.h" #include "../Skin.h" const char* PatternEditorRuler::__class_name = "PatternEditorRuler"; PatternEditorRuler::PatternEditorRuler( QWidget* parent ) : QWidget( parent ) , Object( __class_name ) { setAttribute(Qt::WA_NoBackground); //infoLog( "INIT" ); Preferences *pPref = Preferences::get_instance(); UIStyle *pStyle = pPref->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); m_pPattern = nullptr; m_nGridWidth = Preferences::get_instance()->getPatternEditorGridWidth(); m_nRulerWidth = 20 + m_nGridWidth * ( MAX_NOTES * 4 ); m_nRulerHeight = 25; resize( m_nRulerWidth, m_nRulerHeight ); bool ok = m_tickPosition.load( Skin::getImagePath() + "/patternEditor/tickPosition.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap " ); } m_pBackground = new QPixmap( m_nRulerWidth, m_nRulerHeight ); m_pBackground->fill( backgroundColor ); m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateEditor())); HydrogenApp::get_instance()->addEventListener( this ); } PatternEditorRuler::~PatternEditorRuler() { //infoLog( "DESTROY"); } void PatternEditorRuler::updateStart(bool start) { if (start) { m_pTimer->start(50); // update ruler at 20 fps } else { m_pTimer->stop(); } } void PatternEditorRuler::showEvent ( QShowEvent *ev ) { UNUSED( ev ); updateEditor(); updateStart(true); } void PatternEditorRuler::hideEvent ( QHideEvent *ev ) { UNUSED( ev ); updateStart(false); } void PatternEditorRuler::updateEditor( bool bRedrawAll ) { static int oldNTicks = 0; Hydrogen *pEngine = Hydrogen::get_instance(); //Do not redraw anything if Export is active. //https://github.com/hydrogen-music/hydrogen/issues/857 if( pEngine->getIsExportSessionActive() ) { return; } PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { m_pPattern = pPatternList->get( nSelectedPatternNumber ); } else { m_pPattern = nullptr; } bool bActive = false; // is the pattern playing now? /* * Lock audio engine to make sure pattern list does not get * modified / cleared during iteration */ AudioEngine::get_instance()->lock( RIGHT_HERE ); PatternList *pList = pEngine->getCurrentPatternList(); for (uint i = 0; i < pList->size(); i++) { if ( m_pPattern == pList->get(i) ) { bActive = true; break; } } AudioEngine::get_instance()->unlock(); int state = pEngine->getState(); if ( ( state == STATE_PLAYING ) && (bActive) ) { m_nTicks = pEngine->getTickPosition(); } else { m_nTicks = -1; // hide the tickPosition } if (oldNTicks != m_nTicks) { // redraw all bRedrawAll = true; } oldNTicks = m_nTicks; if (bRedrawAll) { update( 0, 0, width(), height() ); } } void PatternEditorRuler::paintEvent( QPaintEvent *ev) { if (!isVisible()) { return; } QPainter painter(this); painter.drawPixmap( ev->rect(), *m_pBackground, ev->rect() ); // gray background for unusable section of pattern if (m_pPattern) { int nXStart = 20 + m_pPattern->get_length() * m_nGridWidth; if ( (m_nRulerWidth - nXStart) != 0 ) { painter.fillRect( nXStart, 0, m_nRulerWidth - nXStart, m_nRulerHeight, QColor(170,170,170) ); } } // numbers QColor textColor( 100, 100, 100 ); QColor lineColor( 170, 170, 170 ); Preferences *pref = Preferences::get_instance(); QString family = pref->getApplicationFontFamily(); int size = pref->getApplicationFontPointSize(); QFont font( family, size ); painter.setFont(font); painter.drawLine( 0, 0, m_nRulerWidth, 0 ); painter.drawLine( 0, m_nRulerHeight - 1, m_nRulerWidth - 1, m_nRulerHeight - 1); uint nQuarter = 48; for ( int i = 0; i < 64 ; i++ ) { int nText_x = 20 + nQuarter / 4 * i * m_nGridWidth; if ( ( i % 4 ) == 0 ) { painter.setPen( textColor ); painter.drawText( nText_x - 30, 0, 60, m_nRulerHeight, Qt::AlignCenter, QString("%1").arg(i / 4 + 1) ); //ERRORLOG(QString("nText_x: %1, true, : %2").arg(nText_x).arg(m_nRulerWidth)); } else { painter.setPen( QPen( QColor( lineColor ), 1, Qt::SolidLine ) ); painter.drawLine( nText_x, ( m_nRulerHeight - 5 ) / 2, nText_x, m_nRulerHeight - ( (m_nRulerHeight - 5 ) / 2 )); //ERRORLOG("PAINT LINE"); } } // draw tickPosition if (m_nTicks != -1) { uint x = (uint)( 20 + m_nTicks * m_nGridWidth - 5 - 11 / 2.0 ); painter.drawPixmap( QRect( x, height() / 2, 11, 8 ), m_tickPosition, QRect( 0, 0, 11, 8 ) ); } } void PatternEditorRuler::zoomIn() { if (m_nGridWidth >= 3){ m_nGridWidth *= 2; }else { m_nGridWidth *= 1.5; } m_nRulerWidth = 20 + m_nGridWidth * ( MAX_NOTES * 4 ); resize( QSize(m_nRulerWidth, m_nRulerHeight )); delete m_pBackground; m_pBackground = new QPixmap( m_nRulerWidth, m_nRulerHeight ); UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); m_pBackground->fill( backgroundColor ); update(); } void PatternEditorRuler::zoomOut() { if ( m_nGridWidth > 1.5 ) { if (m_nGridWidth > 3){ m_nGridWidth /= 2; }else { m_nGridWidth /= 1.5; } m_nRulerWidth = 20 + m_nGridWidth * ( MAX_NOTES * 4 ); resize( QSize(m_nRulerWidth, m_nRulerHeight) ); delete m_pBackground; m_pBackground = new QPixmap( m_nRulerWidth, m_nRulerHeight ); UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_patternEditor_backgroundColor.getRed(), pStyle->m_patternEditor_backgroundColor.getGreen(), pStyle->m_patternEditor_backgroundColor.getBlue() ); m_pBackground->fill( backgroundColor ); update(); } } void PatternEditorRuler::selectedPatternChangedEvent() { updateEditor( true ); } hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PatternEditorRuler.h000066400000000000000000000037051366722712400247260ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PATTERN_EDITOR_RULER_H #define PATTERN_EDITOR_RULER_H #include "../EventListener.h" #include #if QT_VERSION >= 0x050000 # include #endif #include class PatternEditorPanel; namespace H2Core { class Pattern; } class PatternEditorRuler : public QWidget, public H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: PatternEditorRuler( QWidget* parent ); ~PatternEditorRuler(); void paintEvent(QPaintEvent *ev); void updateStart(bool start); void showEvent( QShowEvent *ev ); void hideEvent( QHideEvent *ev ); void zoomIn(); void zoomOut(); float getGridWidth() const { return m_nGridWidth; }; public slots: void updateEditor( bool bRedrawAll = false ); private: uint m_nRulerWidth; uint m_nRulerHeight; float m_nGridWidth; QPixmap *m_pBackground; QPixmap m_tickPosition; QTimer *m_pTimer; int m_nTicks; PatternEditorPanel *m_pPatternEditorPanel; H2Core::Pattern *m_pPattern; // Implements EventListener interface virtual void selectedPatternChangedEvent(); //~ Implements EventListener interface }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PianoRollEditor.cpp000066400000000000000000001011351366722712400245250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PianoRollEditor.h" #include "PatternEditorPanel.h" #include "NotePropertiesRuler.h" #include "UndoActions.h" #include #include #include #include #include #include #include #include #include using namespace H2Core; #include "../HydrogenApp.h" const char* PianoRollEditor::__class_name = "PianoRollEditor"; PianoRollEditor::PianoRollEditor( QWidget *pParent, PatternEditorPanel *panel ) : QWidget( pParent ) , Object( __class_name ) , m_nResolution( 8 ) , m_bRightBtnPressed( false ) , m_bUseTriplets( false ) , m_pPattern( nullptr ) , m_pPatternEditorPanel( panel ) , m_pDraggedNote( nullptr ) { INFOLOG( "INIT" ); m_nRowHeight = 10; m_nOctaves = 7; setAttribute(Qt::WA_NoBackground); setFocusPolicy(Qt::ClickFocus); m_nGridWidth = Preferences::get_instance()->getPatternEditorGridWidth(); m_nEditorWidth = 20 + m_nGridWidth * (MAX_NOTES * 4); m_nEditorHeight = m_nOctaves * 12 * m_nRowHeight; m_pBackground = new QPixmap( m_nEditorWidth, m_nEditorHeight ); m_pTemp = new QPixmap( m_nEditorWidth, m_nEditorHeight ); resize( m_nEditorWidth, m_nEditorHeight ); createBackground(); HydrogenApp::get_instance()->addEventListener( this ); } PianoRollEditor::~PianoRollEditor() { INFOLOG( "DESTROY" ); } void PianoRollEditor::setResolution(uint res, bool bUseTriplets) { this->m_nResolution = res; this->m_bUseTriplets = bUseTriplets; updateEditor(); } void PianoRollEditor::updateEditor() { // uint nEditorWidth; if ( m_pPattern ) { m_nEditorWidth = 20 + m_nGridWidth * m_pPattern->get_length(); } else { m_nEditorWidth = 20 + m_nGridWidth * MAX_NOTES; } resize( m_nEditorWidth, height() ); // redraw all update( 0, 0, width(), height() ); createBackground(); drawPattern(); // ERRORLOG(QString("update editor %1").arg(m_nEditorWidth)); } //eventlistener void PianoRollEditor::patternModifiedEvent() { updateEditor(); } void PianoRollEditor::selectedInstrumentChangedEvent() { updateEditor(); } void PianoRollEditor::selectedPatternChangedEvent() { //INFOLOG( "updating m_pPattern pointer" ); Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); int nSelectedPatternNumber = pEngine->getSelectedPatternNumber(); if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->size() ) ) { m_pPattern = pPatternList->get( nSelectedPatternNumber ); } else { m_pPattern = nullptr; } __selectedPatternNumber = nSelectedPatternNumber; updateEditor(); } void PianoRollEditor::paintEvent(QPaintEvent *ev) { QPainter painter( this ); painter.drawPixmap( ev->rect(), *m_pTemp, ev->rect() ); } void PianoRollEditor::createBackground() { //INFOLOG( "(re)creating the background" ); QColor backgroundColor( 250, 250, 250 ); m_pBackground->fill( backgroundColor ); QColor octaveColor( 230, 230, 230 ); QColor octaveAlternateColor( 200, 200, 200 ); QColor baseOctaveColor( 245, 245, 245 ); QColor baseNoteColor( 255, 255, 255 ); QColor fbk( 160, 160, 160 ); unsigned start_x = 0; unsigned end_x = width(); QPainter p( m_pBackground ); for ( uint octave = 0; octave < m_nOctaves; ++octave ) { unsigned start_y = octave * 12 * m_nRowHeight; if ( octave % 2 ) { if ( octave == 3 ){ // p.fillRect( start_x, start_y, end_x - start_x, 12 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y, end_x - start_x, start_y + 1 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 1 * m_nRowHeight, end_x - start_x, start_y + 2 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 2 * m_nRowHeight, end_x - start_x, start_y + 3 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 3 * m_nRowHeight, end_x - start_x, start_y + 4 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 4 * m_nRowHeight, end_x - start_x, start_y + 5 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 5 * m_nRowHeight, end_x - start_x, start_y + 6 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 6 * m_nRowHeight, end_x - start_x, start_y + 7 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 7 * m_nRowHeight, end_x - start_x, start_y + 8 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 8 * m_nRowHeight, end_x - start_x, start_y + 9 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 9 * m_nRowHeight, end_x - start_x, start_y + 10 * m_nRowHeight, baseOctaveColor ); p.fillRect( start_x, start_y + 10 * m_nRowHeight, end_x - start_x, start_y + 11 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 11 * m_nRowHeight, end_x - start_x, start_y + 12 * m_nRowHeight, baseNoteColor ); } else { // p.fillRect( start_x, start_y, end_x - start_x, 12 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y, end_x - start_x, start_y + 1 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 1 * m_nRowHeight, end_x - start_x, start_y + 2 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 2 * m_nRowHeight, end_x - start_x, start_y + 3 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 3 * m_nRowHeight, end_x - start_x, start_y + 4 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 4 * m_nRowHeight, end_x - start_x, start_y + 5 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 5 * m_nRowHeight, end_x - start_x, start_y + 6 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 6 * m_nRowHeight, end_x - start_x, start_y + 7 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 7 * m_nRowHeight, end_x - start_x, start_y + 8 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 8 * m_nRowHeight, end_x - start_x, start_y + 9 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 9 * m_nRowHeight, end_x - start_x, start_y + 10 * m_nRowHeight, octaveColor ); p.fillRect( start_x, start_y + 10 * m_nRowHeight, end_x - start_x, start_y + 11 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 11 * m_nRowHeight, end_x - start_x, start_y + 12 * m_nRowHeight, octaveColor ); } } else { // p.fillRect( start_x, start_y, end_x - start_x, 12 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y, end_x - start_x, start_y + 1 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 1 * m_nRowHeight, end_x - start_x, start_y + 2 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 2 * m_nRowHeight, end_x - start_x, start_y + 3 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 3 * m_nRowHeight, end_x - start_x, start_y + 4 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 4 * m_nRowHeight, end_x - start_x, start_y + 5 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 5 * m_nRowHeight, end_x - start_x, start_y + 6 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 6 * m_nRowHeight, end_x - start_x, start_y + 7 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 7 * m_nRowHeight, end_x - start_x, start_y + 8 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 8 * m_nRowHeight, end_x - start_x, start_y + 9 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 9 * m_nRowHeight, end_x - start_x, start_y + 10 * m_nRowHeight, octaveAlternateColor ); p.fillRect( start_x, start_y + 10 * m_nRowHeight, end_x - start_x, start_y + 11 * m_nRowHeight, fbk ); p.fillRect( start_x, start_y + 11 * m_nRowHeight, end_x - start_x, start_y + 12 * m_nRowHeight, octaveAlternateColor ); } } // horiz lines for ( uint row = 0; row < ( 12 * m_nOctaves ); ++row ) { unsigned y = row * m_nRowHeight; p.drawLine( start_x, y,end_x , y ); } //draw text QFont font; font.setPointSize ( 9 ); // font.setWeight( 63 ); p.setFont( font ); p.setPen( QColor(10, 10, 10 ) ); int offset = 0; int insertx = 3; for ( int oct = 0; oct < (int)m_nOctaves; oct++ ){ if( oct > 3 ){ p.drawText( insertx, m_nRowHeight + offset, "B" ); p.drawText( insertx, 10 + m_nRowHeight + offset, "A#" ); p.drawText( insertx, 20 + m_nRowHeight + offset, "A" ); p.drawText( insertx, 30 + m_nRowHeight + offset, "G#" ); p.drawText( insertx, 40 + m_nRowHeight + offset, "G" ); p.drawText( insertx, 50 + m_nRowHeight + offset, "F#" ); p.drawText( insertx, 60 + m_nRowHeight + offset, "F" ); p.drawText( insertx, 70 + m_nRowHeight + offset, "E" ); p.drawText( insertx, 80 + m_nRowHeight + offset, "D#" ); p.drawText( insertx, 90 + m_nRowHeight + offset, "D" ); p.drawText( insertx, 100 + m_nRowHeight + offset, "C#" ); p.drawText( insertx, 110 + m_nRowHeight + offset, "C" ); offset += 12 * m_nRowHeight; }else { p.drawText( insertx, m_nRowHeight + offset, "b" ); p.drawText( insertx, 10 + m_nRowHeight + offset, "a#" ); p.drawText( insertx, 20 + m_nRowHeight + offset, "a" ); p.drawText( insertx, 30 + m_nRowHeight + offset, "g#" ); p.drawText( insertx, 40 + m_nRowHeight + offset, "g" ); p.drawText( insertx, 50 + m_nRowHeight + offset, "f#" ); p.drawText( insertx, 60 + m_nRowHeight + offset, "f" ); p.drawText( insertx, 70 + m_nRowHeight + offset, "e" ); p.drawText( insertx, 80 + m_nRowHeight + offset, "d#" ); p.drawText( insertx, 90 + m_nRowHeight + offset, "d" ); p.drawText( insertx, 100 + m_nRowHeight + offset, "c#" ); p.drawText( insertx, 110 + m_nRowHeight + offset, "c" ); offset += 12 * m_nRowHeight; } } draw_grid( p ); } void PianoRollEditor::draw_grid( QPainter& p ) { static const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); static const QColor res_1( pStyle->m_patternEditor_line1Color.getRed(), pStyle->m_patternEditor_line1Color.getGreen(), pStyle->m_patternEditor_line1Color.getBlue() ); static const QColor res_2( pStyle->m_patternEditor_line2Color.getRed(), pStyle->m_patternEditor_line2Color.getGreen(), pStyle->m_patternEditor_line2Color.getBlue() ); static const QColor res_3( pStyle->m_patternEditor_line3Color.getRed(), pStyle->m_patternEditor_line3Color.getGreen(), pStyle->m_patternEditor_line3Color.getBlue() ); static const QColor res_4( pStyle->m_patternEditor_line4Color.getRed(), pStyle->m_patternEditor_line4Color.getGreen(), pStyle->m_patternEditor_line4Color.getBlue() ); static const QColor res_5( pStyle->m_patternEditor_line5Color.getRed(), pStyle->m_patternEditor_line5Color.getGreen(), pStyle->m_patternEditor_line5Color.getBlue() ); // vertical lines int nBase; if (m_bUseTriplets) { nBase = 3; } else { nBase = 4; } int n4th = 4 * MAX_NOTES / (nBase * 4); int n8th = 4 * MAX_NOTES / (nBase * 8); int n16th = 4 * MAX_NOTES / (nBase * 16); int n32th = 4 * MAX_NOTES / (nBase * 32); int n64th = 4 * MAX_NOTES / (nBase * 64); int nNotes = MAX_NOTES; if ( m_pPattern ) { nNotes = m_pPattern->get_length(); } if (!m_bUseTriplets) { for ( int i = 0; i < nNotes + 1; i++ ) { uint x = 20 + i * m_nGridWidth; if ( (i % n4th) == 0 ) { if (m_nResolution >= 4) { p.setPen( QPen( res_1, 1, Qt::DashLine) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n8th) == 0 ) { if (m_nResolution >= 8) { p.setPen( QPen( res_2, 0, Qt::DashLine ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n16th) == 0 ) { if (m_nResolution >= 16) { p.setPen( QPen( res_3, 0, Qt::DashLine ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n32th) == 0 ) { if (m_nResolution >= 32) { p.setPen( QPen( res_4, 0, Qt::DashLine ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } else if ( (i % n64th) == 0 ) { if (m_nResolution >= 64) { p.setPen( QPen( res_5, 0, Qt::DashLine ) ); p.drawLine(x, 1, x, m_nEditorHeight - 1); } } } } else { // Triplets uint nCounter = 0; int nSize = 4 * MAX_NOTES / (nBase * m_nResolution); for ( int i = 0; i < nNotes + 1; i++ ) { uint x = 20 + i * m_nGridWidth; if ( (i % nSize) == 0) { if ((nCounter % 3) == 0) { p.setPen( QPen( res_1, 0, Qt::DashLine ) ); } else { p.setPen( QPen( res_3, 0, Qt::DashLine ) ); } p.drawLine(x, 1, x, m_nEditorHeight - 1); nCounter++; } } } } void PianoRollEditor::drawPattern() { if ( isVisible() == false ) { return; } //INFOLOG( "draw pattern" ); QPainter p( m_pTemp ); // copy the background image p.drawPixmap( rect(), *m_pBackground, rect() ); // for each note... const Pattern::notes_t* notes = m_pPattern->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { //cout << "note" << endl; //cout << "note n: " << it->first << endl; Note *note = it->second; assert( note ); drawNote( note, &p ); } } void PianoRollEditor::drawNote( Note *pNote, QPainter *pPainter ) { static const UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); static const QColor noteColor( pStyle->m_patternEditor_noteColor.getRed(), pStyle->m_patternEditor_noteColor.getGreen(), pStyle->m_patternEditor_noteColor.getBlue() ); static const QColor noteoffColor( pStyle->m_patternEditor_noteoffColor.getRed(), pStyle->m_patternEditor_noteoffColor.getGreen(), pStyle->m_patternEditor_noteoffColor.getBlue() ); int nInstrument = -1; InstrumentList * pInstrList = Hydrogen::get_instance()->getSong()->get_instrument_list(); for ( uint nInstr = 0; nInstr < pInstrList->size(); ++nInstr ) { Instrument *pInstr = pInstrList->get( nInstr ); if ( pInstr == pNote->get_instrument() ) { nInstrument = nInstr; break; } } if ( nInstrument == -1 ) { //ERRORLOG( "Instrument not found..skipping note" ); return; } if ( nInstrument != Hydrogen::get_instance()->getSelectedInstrumentNumber() ) { return; } uint start_x = 20 + pNote->get_position() * m_nGridWidth; uint start_y = height() - m_nRowHeight - ( m_nRowHeight * pNote->get_key() + ( 12 * (pNote->get_octave() +3) ) * m_nRowHeight ) + 1; uint w = 8; uint h = m_nRowHeight - 2; QColor color = m_pPatternEditorPanel->getDrumPatternEditor()->computeNoteColor( pNote->get_velocity() ); if ( pNote->get_length() == -1 && pNote->get_note_off() == false ) { pPainter->setBrush( color ); pPainter->drawEllipse( start_x -4 , start_y, w, h ); } else if ( pNote->get_length() == 1 && pNote->get_note_off() == true ){ pPainter->setBrush(QColor( noteoffColor )); pPainter->drawEllipse( start_x -4 , start_y, w, h ); } else { float fNotePitch = pNote->get_octave() * 12 + pNote->get_key(); float fStep = pow( 1.0594630943593, ( double )fNotePitch ); int nend = m_nGridWidth * pNote->get_length() / fStep; nend = nend - 1; // lascio un piccolo spazio tra una nota ed un altra pPainter->setBrush( color ); pPainter->fillRect( start_x, start_y, nend, h, color ); pPainter->drawRect( start_x, start_y, nend, h ); } } int PianoRollEditor::getColumn(QMouseEvent *ev) { int nBase; if (m_bUseTriplets) { nBase = 3; } else { nBase = 4; } int nWidth = (m_nGridWidth * 4 * MAX_NOTES) / (nBase * m_nResolution); int x = ev->x(); int nColumn; nColumn = x - 20 + (nWidth / 2); nColumn = nColumn / nWidth; nColumn = (nColumn * 4 * MAX_NOTES) / (nBase * m_nResolution); return nColumn; } void PianoRollEditor::mousePressEvent(QMouseEvent *ev) { //ERRORLOG("Mouse press event"); if ( m_pPattern == nullptr ) { return; } Song *pSong = Hydrogen::get_instance()->getSong(); int row = ((int) ev->y()) / ((int) m_nEditorHeight); if (row >= (int) m_nOctaves * 12 ) { return; } int nColumn = getColumn( ev ); if ( nColumn >= (int)m_pPattern->get_length() ) { update( 0, 0, width(), height() ); return; } int pressedline = ((int) ev->y()) / ((int) m_nRowHeight); Instrument *pSelectedInstrument = nullptr; int nSelectedInstrumentnumber = Hydrogen::get_instance()->getSelectedInstrumentNumber(); pSelectedInstrument = pSong->get_instrument_list()->get( nSelectedInstrumentnumber ); assert(pSelectedInstrument); //ERRORLOG(QString("pressedline: %1, column %2, event ev: %3, editorhight %4").arg(pressedline).arg(nColumn).arg(ev->y()).arg(m_nEditorHeight)); Note::Octave pressedoctave = (Note::Octave)(3 - (pressedline / 12 )); Note::Key pressednotekey; if ( pressedline < 12 ){ pressednotekey = (Note::Key)(11 - pressedline); } else { pressednotekey = (Note::Key)(11 - pressedline % 12); } //ERRORLOG(QString("pressedline: %1, octave %2, notekey: %3").arg(pressedline).arg(pressedoctave).arg(pressednotekey)); if (ev->button() == Qt::LeftButton ) { if ( ev->modifiers() & Qt::ShiftModifier ){ SE_addPianoRollNoteOffAction *action = new SE_addPianoRollNoteOffAction( nColumn, pressedline, __selectedPatternNumber, nSelectedInstrumentnumber ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); return; } unsigned nRealColumn = 0; if( ev->x() > 20 ) { nRealColumn = (ev->x() - 20) / static_cast(m_nGridWidth); } H2Core::Note* pDraggedNote = nullptr; pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, pressednotekey, pressedoctave ); int oldLength = -1; float oldVelocity = 0.8f; float oldPan_L = 0.5f; float oldPan_R = 0.5f; float oldLeadLag = 0.0f; int oldNoteKeyVal = 0; int oldOctaveKeyVal = 0; if( pDraggedNote ){ oldLength = pDraggedNote->get_length(); oldVelocity = pDraggedNote->get_velocity(); oldPan_L = pDraggedNote->get_pan_l(); oldPan_R = pDraggedNote->get_pan_r(); oldLeadLag = pDraggedNote->get_lead_lag(); oldNoteKeyVal = pDraggedNote->get_key(); oldOctaveKeyVal = pDraggedNote->get_octave(); } SE_addNotePianoRollAction *action = new SE_addNotePianoRollAction( nColumn, pressedline, __selectedPatternNumber, nSelectedInstrumentnumber, oldLength, oldVelocity, oldPan_L, oldPan_R, oldLeadLag, oldNoteKeyVal, oldOctaveKeyVal ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } else if (ev->button() == Qt::RightButton ) { m_bRightBtnPressed = true; m_pDraggedNote = nullptr; m_pOldPoint = ev->y(); unsigned nRealColumn = 0; if( ev->x() > 20 ) { nRealColumn = (ev->x() - 20) / static_cast(m_nGridWidth); } // AudioEngine::get_instance()->lock( RIGHT_HERE ); m_pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, pressednotekey, pressedoctave, false ); //needed for undo note length __nRealColumn = nRealColumn; __nColumn = nColumn; __pressedLine = pressedline; __selectedInstrumentnumber = nSelectedInstrumentnumber; if( m_pDraggedNote ){ __oldLength = m_pDraggedNote->get_length(); //needed to undo note properties __oldVelocity = m_pDraggedNote->get_velocity(); __oldPan_L = m_pDraggedNote->get_pan_l(); __oldPan_R = m_pDraggedNote->get_pan_r(); __oldLeadLag = m_pDraggedNote->get_lead_lag(); __velocity = __oldVelocity; __pan_L = __oldPan_L; __pan_R = __oldPan_R; __leadLag = __oldLeadLag; }else { __oldLength = -1; } // AudioEngine::get_instance()->unlock(); } } void PianoRollEditor::addOrDeleteNoteAction( int nColumn, int pressedLine, int selectedPatternNumber, int selectedinstrument, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal, bool noteOff ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); H2Core::Pattern *pPattern; Instrument *pSelectedInstrument = nullptr; pSelectedInstrument = pSong->get_instrument_list()->get( selectedinstrument ); assert(pSelectedInstrument); if ( ( selectedPatternNumber != -1 ) && ( (uint)selectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( selectedPatternNumber ); } else { pPattern = nullptr; } Note::Octave pressedoctave = (Note::Octave)(3 - (pressedLine / 12 )); Note::Key pressednotekey; if ( pressedLine < 12 ){ pressednotekey = (Note::Key)(11 - pressedLine); } else { pressednotekey = (Note::Key)(11 - pressedLine % 12); } m_bRightBtnPressed = false; bool bNoteAlreadyExist = false; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine Note* note = m_pPattern->find_note( nColumn, -1, pSelectedInstrument, pressednotekey, pressedoctave ); if( note ) { // the note exists...remove it! bNoteAlreadyExist = true; m_pPattern->remove_note( note ); delete note; } if ( bNoteAlreadyExist == false ) { // create the new note unsigned nPosition = nColumn; float fVelocity = oldVelocity; float fPan_L = oldPan_L; float fPan_R = oldPan_R; int nLength = oldLength; float fPitch = 0.0f; if(noteOff) { fVelocity = 0.0f; fPan_L = 0.5f; fPan_R = 0.5f; nLength = 1; fPitch = 0.0f; } Note *pNote = new Note( pSelectedInstrument, nPosition, fVelocity, fPan_L, fPan_R, nLength, fPitch ); pNote->set_note_off( noteOff ); if(! noteOff) pNote->set_lead_lag( oldLeadLag ); pNote->set_key_octave( pressednotekey, pressedoctave ); pPattern->insert_note( pNote ); // hear note Preferences *pref = Preferences::get_instance(); if ( pref->getHearNewNotes() && !noteOff ) { Note *pNote2 = new Note( pSelectedInstrument, 0, fVelocity, fPan_L, fPan_R, nLength, fPitch); pNote2->set_key_octave( pressednotekey, pressedoctave ); AudioEngine::get_instance()->get_sampler()->note_on(pNote2); } } pSong->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getDrumPatternEditor()->updateEditor(); } void PianoRollEditor::mouseMoveEvent(QMouseEvent *ev) { if (m_pPattern == nullptr) { return; } int row = ((int) ev->y()) / ((int) m_nEditorHeight); if (row >= (int) m_nOctaves * 12 ) { return; } if (m_bRightBtnPressed && m_pDraggedNote ) { if ( m_pDraggedNote->get_note_off() ) return; int nTickColumn = getColumn( ev ); AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine int nLen = nTickColumn - (int)m_pDraggedNote->get_position(); if (nLen <= 0) { nLen = -1; } float fNotePitch = m_pDraggedNote->get_octave() * 12 + m_pDraggedNote->get_key(); float fStep = 0; if(nLen > -1){ fStep = pow( 1.0594630943593, ( double )fNotePitch ); } else { fStep = 1.0; } m_pDraggedNote->set_length( nLen * fStep); Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine //__draw_pattern(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); } int selectedProperty = m_pPatternEditorPanel->getPropertiesComboValue(); //edit velocity if (m_bRightBtnPressed && m_pDraggedNote && selectedProperty == 0 ) { // Velocity if ( m_pDraggedNote->get_note_off() ) return; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine float val = m_pDraggedNote->get_velocity(); float ymove = m_pOldPoint - ev->y(); val = val + (ymove / 100); if (val > 1) { val = 1; } else if (val < 0.0) { val = 0.0; } m_pDraggedNote->set_velocity( val ); __velocity = val; Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine //__draw_pattern(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pOldPoint = ev->y(); } //edit pan if (m_bRightBtnPressed && m_pDraggedNote && selectedProperty == 1 ) { // Pan if ( m_pDraggedNote->get_note_off() ) return; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine float pan_L, pan_R; float val = (m_pDraggedNote->get_pan_r() - m_pDraggedNote->get_pan_l() + 0.5); float ymove = m_pOldPoint - ev->y(); val = val + (ymove / 100); if ( val > 0.5 ) { pan_L = 1.0 - val; pan_R = 0.5; } else { pan_L = 0.5; pan_R = val; } m_pDraggedNote->set_pan_l( pan_L ); m_pDraggedNote->set_pan_r( pan_R ); __pan_L = pan_L; __pan_R = pan_R; Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine //__draw_pattern(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pOldPoint = ev->y(); } //edit lead lag if (m_bRightBtnPressed && m_pDraggedNote && selectedProperty == 2 ) { // Lead and Lag if ( m_pDraggedNote->get_note_off() ) return; AudioEngine::get_instance()->lock( RIGHT_HERE ); // lock the audio engine float val = ( m_pDraggedNote->get_lead_lag() - 1.0 ) / -2.0 ; float ymove = m_pOldPoint - ev->y(); val = val + (ymove / 100); if (val > 1.0) { val = 1.0; } else if (val < 0.0) { val = 0.0; } m_pDraggedNote->set_lead_lag((val * -2.0) + 1.0); __leadLag = (val * -2.0) + 1.0; char valueChar[100]; if ( m_pDraggedNote->get_lead_lag() < 0.0 ) { sprintf( valueChar, "%.2f", ( m_pDraggedNote->get_lead_lag() * -5 ) ); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Leading beat by: %1 ticks").arg( valueChar ), 2000 ); } else if ( m_pDraggedNote->get_lead_lag() > 0.0 ) { sprintf( valueChar, "%.2f", ( m_pDraggedNote->get_lead_lag() * 5 ) ); // FIXME: '5' taken from fLeadLagFactor calculation in hydrogen.cpp HydrogenApp::get_instance()->setStatusBarMessage( QString("Lagging beat by: %1 ticks").arg( valueChar ), 2000 ); } else { HydrogenApp::get_instance()->setStatusBarMessage( QString("Note on beat"), 2000 ); } Hydrogen::get_instance()->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); // unlock the audio engine //__draw_pattern(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pOldPoint = ev->y(); } } void PianoRollEditor::mouseReleaseEvent(QMouseEvent *ev) { //INFOLOG("Mouse release event" ); if (m_pPattern == nullptr) { return; } if ( m_bRightBtnPressed && m_pDraggedNote ) { if ( m_pDraggedNote->get_note_off() ) return; if( m_pDraggedNote->get_length() != __oldLength ) { SE_editPianoRollNoteLengthAction *action = new SE_editPianoRollNoteLengthAction( m_pDraggedNote->get_position(), m_pDraggedNote->get_position(), m_pDraggedNote->get_length(),__oldLength, __selectedPatternNumber, __selectedInstrumentnumber, __pressedLine ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } if( __velocity == __oldVelocity && __oldLeadLag == __leadLag && __oldPan_L == __pan_L && __oldPan_R == __pan_R ) return; SE_editNotePropertiesPianoRollAction *action = new SE_editNotePropertiesPianoRollAction( m_pDraggedNote->get_position(), m_pDraggedNote->get_position(), __selectedPatternNumber, __selectedInstrumentnumber, __velocity, __oldVelocity, __pan_L, __oldPan_L, __pan_R, __oldPan_R, __leadLag, __oldLeadLag, __pressedLine ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } void PianoRollEditor::editNoteLengthAction( int nColumn, int nRealColumn, int length, int selectedPatternNumber, int nSelectedInstrumentnumber, int pressedline) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); H2Core::Pattern *pPattern; if ( (selectedPatternNumber != -1) && ( (uint)selectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( selectedPatternNumber ); } else { pPattern = nullptr; } Song *pSong = pEngine->getSong(); int nInstruments = pSong->get_instrument_list()->size(); Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( nSelectedInstrumentnumber ); Note::Octave pressedoctave = (Note::Octave)(3 - (pressedline / 12 )); Note::Key pressednotekey; if ( pressedline < 12 ){ pressednotekey = (Note::Key)(11 - pressedline); } else { pressednotekey = (Note::Key)(11 - pressedline % 12); } Note* pDraggedNote = nullptr; AudioEngine::get_instance()->lock( RIGHT_HERE ); pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, pressednotekey, pressedoctave, false ); if ( pDraggedNote ){ pDraggedNote->set_length( length ); } AudioEngine::get_instance()->unlock(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getDrumPatternEditor()->updateEditor(); } void PianoRollEditor::editNotePropertiesAction( int nColumn, int nRealColumn, int selectedPatternNumber, int selectedInstrumentnumber, float velocity, float pan_L, float pan_R, float leadLag, int pressedline ) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); H2Core::Pattern *pPattern; if ( (selectedPatternNumber != -1) && ( (uint)selectedPatternNumber < pPatternList->size() ) ) { pPattern = pPatternList->get( selectedPatternNumber ); } else { pPattern = nullptr; } Note::Octave pressedoctave = (Note::Octave)(3 - (pressedline / 12 )); Note::Key pressednotekey; if ( pressedline < 12 ){ pressednotekey = (Note::Key)(11 - pressedline); } else { pressednotekey = (Note::Key)(11 - pressedline % 12); } Song *pSong = pEngine->getSong(); int nInstruments = pSong->get_instrument_list()->size(); Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( selectedInstrumentnumber ); Note* pDraggedNote = nullptr; AudioEngine::get_instance()->lock( RIGHT_HERE ); pDraggedNote = m_pPattern->find_note( nColumn, nRealColumn, pSelectedInstrument, pressednotekey, pressedoctave, false ); if ( pDraggedNote ){ pDraggedNote->set_velocity( velocity ); pDraggedNote->set_pan_l( pan_L ); pDraggedNote->set_pan_r( pan_R ); pDraggedNote->set_lead_lag( leadLag ); } AudioEngine::get_instance()->unlock(); updateEditor(); m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); m_pPatternEditorPanel->getPanEditor()->updateEditor(); m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); m_pPatternEditorPanel->getDrumPatternEditor()->updateEditor(); } void PianoRollEditor::zoom_in() { if (m_nGridWidth >= 3){ m_nGridWidth *= 2; }else { m_nGridWidth *= 1.5; } updateEditor(); } void PianoRollEditor::zoom_out() { if ( m_nGridWidth > 1.5 ) { if (m_nGridWidth > 3){ m_nGridWidth /= 2; }else { m_nGridWidth /= 1.5; } updateEditor(); } } hydrogen-1.0.0-rc1/src/gui/src/PatternEditor/PianoRollEditor.h000066400000000000000000000070621366722712400241760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PIANO_ROLL_EDITOR_H #define PIANO_ROLL_EDITOR_H #include #include "../EventListener.h" #include #if QT_VERSION >= 0x050000 # include #endif namespace H2Core { class Pattern; class Note; } class PatternEditorPanel; class PianoRollEditor: public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: PianoRollEditor( QWidget *pParent, PatternEditorPanel *panel ); ~PianoRollEditor(); // Implements EventListener interface virtual void selectedPatternChangedEvent(); virtual void selectedInstrumentChangedEvent(); virtual void patternModifiedEvent(); //~ Implements EventListener interface void setResolution(uint res, bool bUseTriplets); void zoom_in(); void zoom_out(); void addOrDeleteNoteAction( int nColumn, int pressedLine, int selectedPatternNumber, int selectedinstrument, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal, bool noteOff); void editNotePropertiesAction( int nColumn, int nRealColumn, int selectedPatternNumber, int selectedInstrumentnumber, float velocity, float pan_L, float pan_R, float leadLag, int pressedLine ); void editNoteLengthAction( int nColumn, int nRealColumn, int length, int selectedPatternNumber, int nSelectedInstrumentnumber, int pressedLine ); public slots: void updateEditor(); private: unsigned m_nRowHeight; unsigned m_nOctaves; uint m_nResolution; bool m_bRightBtnPressed; bool m_bUseTriplets; H2Core::Pattern *m_pPattern; float m_nGridWidth; uint m_nEditorWidth; uint m_nEditorHeight; QPixmap *m_pBackground; QPixmap *m_pTemp; int m_pOldPoint; PatternEditorPanel *m_pPatternEditorPanel; H2Core::Note *m_pDraggedNote; void createBackground(); void drawPattern(); void draw_grid(QPainter& p ); void drawNote( H2Core::Note *pNote, QPainter *pPainter ); virtual void paintEvent(QPaintEvent *ev); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); // virtual void keyPressEvent ( QKeyEvent * ev ); int getColumn(QMouseEvent *ev); int __selectedInstrumentnumber; int __selectedPatternNumber; int __nRealColumn; int __nColumn; int __pressedLine; int __oldLength; float __velocity; float __oldVelocity; float __pan_L; float __oldPan_L; float __pan_R; float __oldPan_R; float __leadLag; float __oldLeadLag; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternPropertiesDialog.cpp000066400000000000000000000110621366722712400235040ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PatternPropertiesDialog.h" #include "Skin.h" #include "HydrogenApp.h" #include "UndoActions.h" #include #include #include #include using namespace std; using namespace H2Core; PatternPropertiesDialog::PatternPropertiesDialog(QWidget* parent, Pattern *pattern, int nselectedPattern, bool savepattern) : QDialog(parent) { setupUi( this ); setWindowTitle( tr( "Pattern properties" ) ); this->pattern = pattern; patternNameTxt->setText( pattern->get_name() ); patternNameTxt->selectAll(); patternDescTxt->setText( pattern->get_info() ); QString category = pattern->get_category(); __nselectedPattern = nselectedPattern; __savepattern = savepattern; if ( category == "" ){ category = "not_categorized"; } categoryComboBox->addItem( category ); Preferences *pPref = H2Core::Preferences::get_instance(); std::list::const_iterator cur_patternCategories; if ( pPref->m_patternCategories.size() == 0 ) { pPref->m_patternCategories.push_back( "not_categorized" ); } //categoryComboBox->clear(); for( cur_patternCategories = pPref->m_patternCategories.begin(); cur_patternCategories != pPref->m_patternCategories.end(); ++cur_patternCategories ) { if ( categoryComboBox->currentText() != *cur_patternCategories ){ categoryComboBox->addItem( *cur_patternCategories ); } } defaultNameCheck( pattern->get_name(), savepattern ); okBtn->setEnabled(true); } /** * Destructor */ PatternPropertiesDialog::~PatternPropertiesDialog() { } void PatternPropertiesDialog::on_cancelBtn_clicked() { reject(); } void PatternPropertiesDialog::on_okBtn_clicked() { QString pattName = patternNameTxt->text(); QString pattCategory = categoryComboBox->currentText(); QString pattInfo = patternDescTxt->toPlainText(); Preferences *pPref = H2Core::Preferences::get_instance(); std::list::const_iterator cur_testpatternCategories; bool test = true; for( cur_testpatternCategories = pPref->m_patternCategories.begin(); cur_testpatternCategories != pPref->m_patternCategories.end(); ++cur_testpatternCategories ) { if ( categoryComboBox->currentText() == *cur_testpatternCategories ){ test = false; } } if (test == true ) { pPref->m_patternCategories.push_back( pattCategory ); } if( __savepattern ){ pattern->set_name( pattName ); pattern->set_info( pattInfo ); pattern->set_category( pattCategory ); }else { SE_modifyPatternPropertiesAction *action = new SE_modifyPatternPropertiesAction( pattern->get_name() , pattern->get_info(), pattern->get_category(), pattName, pattInfo, pattCategory, __nselectedPattern ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } accept(); } void PatternPropertiesDialog::defaultNameCheck( QString pattName, bool savepattern) { if ( savepattern && !nameCheck(pattName) ) { defaultNameCheck( tr( "%1#2").arg(pattName), savepattern ); } else { patternNameTxt->setText( tr( "%1").arg(pattName) ); } } bool PatternPropertiesDialog::nameCheck( QString pattName ) { if (pattName == "") { return false; } PatternList *patternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); for (uint i = 0; i < patternList->size(); i++) { if ( patternList->get(i)->get_name() == pattName) { return false; } } return true; } void PatternPropertiesDialog::on_categoryComboBox_editTextChanged() { if ( categoryComboBox->currentText() == pattern->get_category() ) { okBtn->setEnabled( false ); } else { okBtn->setEnabled(true); } } void PatternPropertiesDialog::on_patternNameTxt_textChanged() { if ( nameCheck( patternNameTxt->text() ) ) { okBtn->setEnabled( true ); } else { okBtn->setEnabled( false ); } } hydrogen-1.0.0-rc1/src/gui/src/PatternPropertiesDialog.h000066400000000000000000000033021366722712400231470ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PATTERN_PROPERTIES_DIALOG_H #define PATTERN_PROPERTIES_DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include "ui_PatternPropertiesDialog_UI.h" namespace H2Core { class Pattern; } /// ///Pattern Properties Dialog /// class PatternPropertiesDialog : public QDialog, public Ui_PatternPropertiesDialog_UI { Q_OBJECT public: PatternPropertiesDialog( QWidget* parent, H2Core::Pattern* pattern, int nselectedPattern, bool save ); ~PatternPropertiesDialog(); /// Does some name check static bool nameCheck( QString ); void defaultNameCheck( QString , bool); private slots: void on_cancelBtn_clicked(); void on_okBtn_clicked(); void on_patternNameTxt_textChanged(); void on_categoryComboBox_editTextChanged(); private: H2Core::Pattern *pattern; int __nselectedPattern; bool __savepattern; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PatternPropertiesDialog_UI.ui000066400000000000000000000060051366722712400237350ustar00rootroot00000000000000 PatternPropertiesDialog_UI 0 0 311 274 Form1 10 10 291 253 New Pattern Name Pattern description Pattern category true Qt::Horizontal 37 28 &Cancel Alt+C &OK Alt+O true Qt::Horizontal 37 28 hydrogen-1.0.0-rc1/src/gui/src/PlayerControl.cpp000066400000000000000000001001141366722712400214640ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Skin.h" #include "PlayerControl.h" #include "InstrumentRack.h" #include "HydrogenApp.h" #include "Widgets/LCD.h" #include "Widgets/Button.h" #include "Widgets/CpuLoadWidget.h" #include "Widgets/MidiActivityWidget.h" #include "Widgets/PixmapWidget.h" #include "Mixer/Mixer.h" #include "SongEditor/SongEditorPanel.h" #include "PatternEditor/PatternEditorPanel.h" #include "InstrumentEditor/InstrumentEditorPanel.h" #include #include #include #include #include using namespace H2Core; //beatconter global int bcDisplaystatus = 0; //~ beatcounter const char* PlayerControl::__class_name = "PlayerControl"; PlayerControl::PlayerControl(QWidget *parent) : QLabel(parent) , Object( __class_name ) { HydrogenApp::get_instance()->addEventListener( this ); auto pPreferences = Preferences::get_instance(); // Background image setPixmap( QPixmap( Skin::getImagePath() + "/playerControlPanel/background.png" ) ); setScaledContents( true ); QHBoxLayout *hbox = new QHBoxLayout(); hbox->setSpacing( 0 ); hbox->setMargin( 0 ); setLayout( hbox ); // CONTROLS PixmapWidget *pControlsPanel = new PixmapWidget( nullptr ); pControlsPanel->setFixedSize( 344, 43 ); pControlsPanel->setPixmap( "/playerControlPanel/background_Control.png" ); hbox->addWidget( pControlsPanel ); m_pTimeDisplayH = new LCDDisplay( pControlsPanel, LCDDigit::LARGE_GRAY, 2 ); m_pTimeDisplayH->move( 27, 12 ); m_pTimeDisplayH->setText( "00" ); m_pTimeDisplayM = new LCDDisplay( pControlsPanel, LCDDigit::LARGE_GRAY, 2 ); m_pTimeDisplayM->move( 61, 12 ); m_pTimeDisplayM->setText( "00" ); m_pTimeDisplayS = new LCDDisplay( pControlsPanel, LCDDigit::LARGE_GRAY, 2 ); m_pTimeDisplayS->move( 95, 12 ); m_pTimeDisplayS->setText( "00" ); m_pTimeDisplayMS = new LCDDisplay( pControlsPanel, LCDDigit::SMALL_GRAY, 3 ); m_pTimeDisplayMS->move( 122, 16 ); m_pTimeDisplayMS->setText( "000" ); // Rewind button m_pRwdBtn = new Button( pControlsPanel, "/playerControlPanel/btn_rwd_on.png", "/playerControlPanel/btn_rwd_off.png", "/playerControlPanel/btn_rwd_over.png", QSize(21, 15) ); m_pRwdBtn->move(168, 17); m_pRwdBtn->setToolTip( tr("Rewind") ); connect(m_pRwdBtn, SIGNAL(clicked(Button*)), this, SLOT(RewindBtnClicked(Button*))); // Record button m_pRecBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/btn_rec_on.png", "/playerControlPanel/btn_rec_off.png", "/playerControlPanel/btn_rec_over.png", QSize(21, 15) ); m_pRecBtn->move(195, 17); m_pRecBtn->setPressed(false); m_pRecBtn->setHidden(false); m_pRecBtn->setToolTip( tr("Record") ); connect(m_pRecBtn, SIGNAL(clicked(Button*)), this, SLOT(recBtnClicked(Button*))); connect(m_pRecBtn, SIGNAL(rightClicked(Button*)), this, SLOT(recBtnRightClicked(Button*))); Action* pAction = new Action("RECORD_READY"); m_pRecBtn->setAction( pAction ); // Record+delete button m_pRecDelBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/btn_recdel_on.png", "/playerControlPanel/btn_recdel_off.png", "/playerControlPanel/btn_recdel_over.png", QSize(21, 15) ); m_pRecDelBtn->move(195, 17); m_pRecDelBtn->setPressed(false); m_pRecDelBtn->setHidden(true); m_pRecDelBtn->setToolTip( tr("Destructive Record") ); connect(m_pRecDelBtn, SIGNAL(clicked(Button*)), this, SLOT(recBtnClicked(Button*))); connect(m_pRecDelBtn, SIGNAL(rightClicked(Button*)), this, SLOT(recBtnRightClicked(Button*))); // Play button m_pPlayBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/btn_play_on.png", "/playerControlPanel/btn_play_off.png", "/playerControlPanel/btn_play_over.png", QSize(26, 17) ); m_pPlayBtn->move(222, 17); m_pPlayBtn->setPressed(false); m_pPlayBtn->setToolTip( tr("Play/ Pause") ); connect(m_pPlayBtn, SIGNAL(clicked(Button*)), this, SLOT(playBtnClicked(Button*))); pAction = new Action("PLAY"); m_pPlayBtn->setAction( pAction ); // Stop button m_pStopBtn = new Button( pControlsPanel, "/playerControlPanel/btn_stop_on.png", "/playerControlPanel/btn_stop_off.png", "/playerControlPanel/btn_stop_over.png", QSize(21, 15) ); m_pStopBtn->move(254, 17); m_pStopBtn->setToolTip( tr("Stop") ); connect(m_pStopBtn, SIGNAL(clicked(Button*)), this, SLOT(stopBtnClicked(Button*))); pAction = new Action("STOP"); m_pStopBtn->setAction( pAction ); // Fast forward button m_pFfwdBtn = new Button( pControlsPanel, "/playerControlPanel/btn_ffwd_on.png", "/playerControlPanel/btn_ffwd_off.png", "/playerControlPanel/btn_ffwd_over.png", QSize(21, 15) ); m_pFfwdBtn->move(281, 17); m_pFfwdBtn->setToolTip( tr("Fast Forward") ); connect(m_pFfwdBtn, SIGNAL(clicked(Button*)), this, SLOT(FFWDBtnClicked(Button*))); // Loop song button button m_pSongLoopBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/btn_loop_on.png", "/playerControlPanel/btn_loop_off.png", "/playerControlPanel/btn_loop_over.png", QSize(21, 15) ); m_pSongLoopBtn->move(310, 17); m_pSongLoopBtn->setToolTip( tr("Loop song") ); connect( m_pSongLoopBtn, SIGNAL( clicked(Button*) ), this, SLOT( songLoopBtnClicked(Button*) ) ); // Live mode button m_pLiveModeBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/statusLED_on.png", "/playerControlPanel/statusLED_off.png", "/playerControlPanel/statusLED_off.png", QSize(68, 9) ); m_pLiveModeBtn->move(180, 5); m_pLiveModeBtn->setPressed(true); m_pLiveModeBtn->setToolTip( tr("Pattern Mode") ); connect(m_pLiveModeBtn, SIGNAL(clicked(Button*)), this, SLOT(liveModeBtnClicked(Button*))); // Song mode button m_pSongModeBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/statusLED_on.png", "/playerControlPanel/statusLED_off.png", "/playerControlPanel/statusLED_off.png", QSize(68, 9) ); m_pSongModeBtn->move(253, 5); m_pSongModeBtn->setPressed(false); m_pSongModeBtn->setToolTip( tr("Song Mode") ); connect(m_pSongModeBtn, SIGNAL(clicked(Button*)), this, SLOT(songModeBtnClicked(Button*))); //~ CONTROLS // BC on off PixmapWidget *pControlsBBTBConoffPanel = new PixmapWidget( nullptr ); pControlsBBTBConoffPanel->setFixedSize( 15, 43 ); pControlsBBTBConoffPanel->setPixmap( "/playerControlPanel/onoff.png" ); hbox->addWidget( pControlsBBTBConoffPanel ); m_pBConoffBtn = new ToggleButton( pControlsBBTBConoffPanel, "/playerControlPanel/bc_on.png", "/playerControlPanel/bc_off.png", "/playerControlPanel/bc_off.png", QSize(10, 40) ); m_pBConoffBtn->move(1, 1); m_pBConoffBtn->setPressed(false); m_pBConoffBtn->setToolTip( tr("BeatCounter Panel on") ); connect(m_pBConoffBtn, SIGNAL(clicked(Button*)), this, SLOT(bconoffBtnClicked(Button*))); //~ BC on off //beatcounter m_pControlsBCPanel = new PixmapWidget( nullptr ); m_pControlsBCPanel->setFixedSize( 86, 43 ); m_pControlsBCPanel->setPixmap( "/playerControlPanel/beatConter_BG.png" ); hbox->addWidget( m_pControlsBCPanel ); m_pBCDisplayZ = new LCDDisplay( m_pControlsBCPanel, LCDDigit::LARGE_GRAY, 2 ); m_pBCDisplayZ->move( 36, 8 ); m_pBCDisplayZ->setText( "--" ); m_pBCDisplayT = new LCDDisplay( m_pControlsBCPanel, LCDDigit::SMALL_GRAY, 1 ); m_pBCDisplayT->move( 23, 26 ); m_pBCDisplayT->setText( "4" ); m_pBCDisplayB = new LCDDisplay( m_pControlsBCPanel, LCDDigit::SMALL_GRAY, 2 ); m_pBCDisplayB->move( 39, 26 ); // set display from 4 to 04. fix against qt4 transparent problem // m_pBCDisplayB->setText( "4" ); m_pBCDisplayB->setText( "04" ); m_pBCTUpBtn = new Button( m_pControlsBCPanel, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize(16, 8) ); m_pBCTUpBtn->move( 4, 6 ); connect( m_pBCTUpBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bctButtonClicked( Button* ) ) ); m_pBCTDownBtn = new Button( m_pControlsBCPanel, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16, 8) ); m_pBCTDownBtn->move( 4, 16 ); connect( m_pBCTDownBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bctButtonClicked( Button* ) ) ); m_pBCBUpBtn = new Button( m_pControlsBCPanel, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize(16, 8) ); m_pBCBUpBtn->move( 65, 6 ); connect( m_pBCBUpBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bcbButtonClicked( Button* ) ) ); m_pBCBDownBtn = new Button( m_pControlsBCPanel, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16, 8) ); m_pBCBDownBtn->move( 65, 16 ); connect( m_pBCBDownBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bcbButtonClicked( Button* ) ) ); m_pBCSetPlayBtn = new ToggleButton( m_pControlsBCPanel, "/playerControlPanel/btn_set_play_on.png", "/playerControlPanel/btn_set_play_off.png", "/playerControlPanel/btn_set_play_off.png", QSize(15, 13) ); m_pBCSetPlayBtn->move(67, 27); m_pBCSetPlayBtn->setPressed(false); m_pBCSetPlayBtn->setToolTip( tr("Set BPM / Set BPM and play") ); connect(m_pBCSetPlayBtn, SIGNAL(clicked(Button*)), this, SLOT(bcSetPlayBtnClicked(Button*))); //~ beatcounter // BPM PixmapWidget *pBPMPanel = new PixmapWidget( nullptr ); pBPMPanel->setFixedSize( 145, 43 ); pBPMPanel->setPixmap( "/playerControlPanel/background_BPM.png" ); hbox->addWidget( pBPMPanel ); // LCD BPM SpinBox m_pLCDBPMSpinbox = new LCDSpinBox( pBPMPanel, 6, LCDSpinBox::FLOAT, 30, 400 ); m_pLCDBPMSpinbox->move( 43, 6 ); connect( m_pLCDBPMSpinbox, SIGNAL(changed(LCDSpinBox*)), this, SLOT(bpmChanged())); connect( m_pLCDBPMSpinbox, SIGNAL(spinboxClicked()), this, SLOT(bpmClicked())); m_pBPMUpBtn = new Button( pBPMPanel, "/lcd/LCDSpinBox_up_on.png", "/lcd/LCDSpinBox_up_off.png", "/lcd/LCDSpinBox_up_over.png", QSize(16, 8), false, true ); m_pBPMUpBtn->move( 12, 5 ); connect( m_pBPMUpBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bpmButtonClicked( Button* ) ) ); m_pBPMDownBtn = new Button( pBPMPanel, "/lcd/LCDSpinBox_down_on.png", "/lcd/LCDSpinBox_down_off.png", "/lcd/LCDSpinBox_down_over.png", QSize(16, 8), false, true ); m_pBPMDownBtn->move( 12, 14 ); connect( m_pBPMDownBtn, SIGNAL( clicked( Button* ) ), this, SLOT(bpmButtonClicked( Button* ) ) ); m_pRubberBPMChange = new ToggleButton( pBPMPanel, "/playerControlPanel/rubber_on.png", "/playerControlPanel/rubber_off.png", "/playerControlPanel/rubber_off.png", QSize(9, 37) ); m_pRubberBPMChange->move( 133, 3 ); m_pRubberBPMChange->setToolTip( tr("Recalculate Rubberband modified samples if bpm will change") ); m_pRubberBPMChange->setPressed( pPreferences->getRubberBandBatchMode()); connect( m_pRubberBPMChange, SIGNAL( clicked( Button* ) ), this, SLOT(rubberbandButtonToggle( Button* ) ) ); QString program = pPreferences->m_rubberBandCLIexecutable; //test the path. if test fails, no button if ( QFile( program ).exists() == false) { m_pRubberBPMChange->hide(); } m_pMetronomeWidget = new MetronomeWidget( pBPMPanel ); m_pMetronomeWidget->resize( 85, 5 ); m_pMetronomeWidget->move( 42, 25 ); m_pMetronomeBtn = new ToggleButton( pBPMPanel, "/playerControlPanel/btn_metronome_on.png", "/playerControlPanel/btn_metronome_off.png", "/playerControlPanel/btn_metronome_over.png", QSize( 20, 13 ) ); m_pMetronomeBtn->move( 10, 26 ); m_pMetronomeBtn->setToolTip( tr("Switch metronome on/off") ); connect( m_pMetronomeBtn, SIGNAL( clicked( Button* ) ), this, SLOT(metronomeButtonClicked( Button* ) ) ); pAction = new Action("TOGGLE_METRONOME"); m_pMetronomeBtn->setAction( pAction ); //~ BPM // JACK PixmapWidget *pJackPanel = new PixmapWidget( nullptr ); pJackPanel->setFixedSize( 113, 43 ); pJackPanel->setPixmap( "/playerControlPanel/background_Jack.png" ); hbox->addWidget( pJackPanel ); // Jack transport mode button m_pJackTransportBtn = new ToggleButton( pJackPanel, "/playerControlPanel/jackTransportBtn_on.png", "/playerControlPanel/jackTransportBtn_off.png", "/playerControlPanel/jackTransportBtn_over.png", QSize(45, 13) ); m_pJackTransportBtn->hide(); if ( pPreferences->m_bJackTransportMode == Preferences::USE_JACK_TRANSPORT ) { m_pJackTransportBtn->setPressed( true ); } else { m_pJackTransportBtn->setPressed( false ); } m_pJackTransportBtn->setToolTip( tr("Jack-transport on/off") ); connect(m_pJackTransportBtn, SIGNAL(clicked(Button*)), this, SLOT(jackTransportBtnClicked(Button*))); m_pJackTransportBtn->move(10, 26); //jack time master m_pJackMasterBtn = new ToggleButton( pJackPanel, "/playerControlPanel/jackMasterBtn_on.png", "/playerControlPanel/jackMasterBtn_off.png", "/playerControlPanel/jackMasterBtn_over.png", QSize(45, 13) ); m_pJackMasterBtn->hide(); if ( m_pJackTransportBtn->isPressed() && pPreferences->m_bJackMasterMode == Preferences::USE_JACK_TIME_MASTER ) { m_pJackMasterBtn->setPressed( true ); } else { m_pJackMasterBtn->setPressed( false ); } m_pJackMasterBtn->setToolTip( tr("Jack-Time-Master on/off") ); connect(m_pJackMasterBtn, SIGNAL(clicked(Button*)), this, SLOT(jackMasterBtnClicked(Button*))); m_pJackMasterBtn->move(56, 26); //~ jack time master m_pEngine = Hydrogen::get_instance(); // CPU load widget m_pCpuLoadWidget = new CpuLoadWidget( pJackPanel ); // Midi Activity widget m_pMidiActivityWidget = new MidiActivityWidget( pJackPanel ); m_pMidiActivityWidget->move( 10, 14 ); m_pCpuLoadWidget->move( 10, 4 ); //~ JACK PixmapWidget *pLcdBackGround = new PixmapWidget( nullptr ); pLcdBackGround->setFixedSize( 256, 43 ); pLcdBackGround->setPixmap( "/playerControlPanel/lcd_background.png" ); hbox->addWidget( pLcdBackGround ); m_pShowMixerBtn = new ToggleButton( pLcdBackGround, "/skin_btn_on.png", "/skin_btn_off.png", "/skin_btn_over.png", QSize( 80, 17 ), true ); m_pShowMixerBtn->move( 7, 6 ); m_pShowMixerBtn->setToolTip( tr( "Show mixer" ) ); m_pShowMixerBtn->setText( tr( "Mixer" ) ); connect(m_pShowMixerBtn, SIGNAL(clicked(Button*)), this, SLOT(showButtonClicked(Button*))); m_pShowInstrumentRackBtn = new ToggleButton( pLcdBackGround, "/skin_btn_on.png", "/skin_btn_off.png", "/skin_btn_over.png", QSize( 160, 17 ), true ); m_pShowInstrumentRackBtn->move( 88, 6 ); m_pShowInstrumentRackBtn->setToolTip( tr( "Show Instrument Rack" ) ); m_pShowInstrumentRackBtn->setText( tr( "Instrument rack" ) ); connect( m_pShowInstrumentRackBtn, SIGNAL( clicked(Button*) ), this, SLOT( showButtonClicked( Button*)) ); m_pStatusLabel = new LCDDisplay(pLcdBackGround , LCDDigit::SMALL_BLUE, 30, true ); m_pStatusLabel->move( 7, 25 ); hbox->addStretch( 1000 ); // this must be the last widget in the HBOX!! QTimer *timer = new QTimer( this ); connect(timer, SIGNAL(timeout()), this, SLOT(updatePlayerControl())); timer->start(100); // update player control at 10 fps m_pStatusTimer = new QTimer( this ); connect( m_pStatusTimer, SIGNAL( timeout() ), this, SLOT( onStatusTimerEvent() ) ); m_pScrollTimer = new QTimer( this ); connect( m_pScrollTimer, SIGNAL( timeout() ), this, SLOT( onScrollTimerEvent() ) ); m_pScrollMessage = ""; } PlayerControl::~PlayerControl() { } void PlayerControl::updatePlayerControl() { Preferences *pPref = Preferences::get_instance(); HydrogenApp *pH2App = HydrogenApp::get_instance(); m_pShowMixerBtn->setPressed( pH2App->getMixer()->isVisible() ); m_pShowInstrumentRackBtn->setPressed( pH2App->getInstrumentRack()->isVisible() ); int state = m_pEngine->getState(); if (state == STATE_PLAYING ) { m_pPlayBtn->setPressed(true); } else { m_pPlayBtn->setPressed(false); } if (pPref->getRecordEvents()) { m_pRecBtn->setPressed(true); m_pRecDelBtn->setPressed(true); } else { m_pRecBtn->setPressed(false); m_pRecDelBtn->setPressed(false); } if (pPref->getDestructiveRecord()) { if ( m_pRecDelBtn->isHidden() ) { m_pRecBtn->setHidden(true); m_pRecDelBtn->setHidden(false); } } else { if ( m_pRecBtn->isHidden() ) { m_pRecBtn->setHidden(false); m_pRecDelBtn->setHidden(true); } } Song *song = m_pEngine->getSong(); m_pSongLoopBtn->setPressed( song->is_loop_enabled() ); m_pLCDBPMSpinbox->setValue( song->__bpm ); if ( song->get_mode() == Song::PATTERN_MODE ) { m_pLiveModeBtn->setPressed( true ); m_pSongModeBtn->setPressed( false ); } else { m_pLiveModeBtn->setPressed( false ); m_pSongModeBtn->setPressed( true ); } //beatcounter if ( pPref->m_bbc == Preferences::BC_OFF ) { m_pControlsBCPanel->hide(); m_pBConoffBtn->setPressed(false); }else { m_pControlsBCPanel->show(); m_pBConoffBtn->setPressed(true); } if ( pPref->m_mmcsetplay == Preferences::SET_PLAY_OFF) { m_pBCSetPlayBtn->setPressed(false); }else { m_pBCSetPlayBtn->setPressed(true); } //~ beatcounter #ifdef H2CORE_HAVE_JACK AudioOutput *p_Driver = m_pEngine->getAudioOutput(); if ( m_pEngine->haveJackAudioDriver() ) { m_pJackTransportBtn->show(); m_pJackMasterBtn->show(); switch ( pPref->m_bJackTransportMode ) { case Preferences::NO_JACK_TRANSPORT: m_pJackTransportBtn->setPressed(false); m_pJackMasterBtn->setPressed(false); break; case Preferences::USE_JACK_TRANSPORT: m_pJackTransportBtn->setPressed(true); if ( static_cast(p_Driver)->getIsTimebaseMaster() > 0 ) { m_pJackMasterBtn->setPressed( true ); } else { m_pJackMasterBtn->setPressed( false ); } break; } } else { m_pJackTransportBtn->hide(); m_pJackMasterBtn->hide(); } #endif // time float fFrames = m_pEngine->getAudioOutput()->m_transport.m_nFrames; float fSampleRate = m_pEngine->getAudioOutput()->getSampleRate(); if ( fSampleRate != 0 ) { float fSeconds = fFrames / fSampleRate; int nMSec = (int)( (fSeconds - (int)fSeconds) * 1000.0 ); int nSeconds = ( (int)fSeconds ) % 60; int nMins = (int)( fSeconds / 60.0 ) % 60; int nHours = (int)( fSeconds / 3600.0 ); char tmp[100]; sprintf(tmp, "%02d", nHours ); m_pTimeDisplayH->setText( QString( tmp ) ); sprintf(tmp, "%02d", nMins ); m_pTimeDisplayM->setText( QString( tmp ) ); sprintf(tmp, "%02d", nSeconds ); m_pTimeDisplayS->setText( QString( tmp ) ); sprintf(tmp, "%03d", nMSec ); m_pTimeDisplayMS->setText( QString( tmp ) ); } m_pMetronomeBtn->setPressed(pPref->m_bUseMetronome); //beatcounter get BC message char bcstatus[4]; int beatstocountondisplay = 1; beatstocountondisplay = m_pEngine->getBcStatus(); switch (beatstocountondisplay){ case 1 : if (bcDisplaystatus == 1){ Preferences::get_instance()->m_bbc = Preferences::BC_OFF; bcDisplaystatus = 0; } sprintf(bcstatus, "R"); m_pBCDisplayZ->setText( QString (bcstatus) ); break; default: if (Preferences::get_instance()->m_bbc == Preferences::BC_OFF){ Preferences::get_instance()->m_bbc = Preferences::BC_ON; bcDisplaystatus = 1; } sprintf(bcstatus, "%02d ", beatstocountondisplay -1); m_pBCDisplayZ->setText( QString (bcstatus) ); } //~ beatcounter } /// Toggle record mode void PlayerControl::recBtnClicked(Button* ref) { if ( m_pEngine->getState() != STATE_PLAYING ) { if (ref->isPressed()) { Preferences::get_instance()->setRecordEvents(true); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Record midi events = On" ), 2000 ); } else { Preferences::get_instance()->setRecordEvents(false); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Record midi events = Off" ), 2000 ); } } } /// Toggle destructive/nondestructive move void PlayerControl::recBtnRightClicked(Button* ref) { UNUSED( ref ); if ( Preferences::get_instance()->getDestructiveRecord() ) { Preferences::get_instance()->setDestructiveRecord(false); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Destructive mode = Off" ), 2000 ); } else { Preferences::get_instance()->setDestructiveRecord(true); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Destructive mode = On" ), 2000 ); } HydrogenApp::get_instance()->enableDestructiveRecMode(); } /// Start audio engine void PlayerControl::playBtnClicked(Button* ref) { if (ref->isPressed()) { m_pEngine->sequencer_play(); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Playing."), 5000); } else { m_pEngine->sequencer_stop(); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Pause."), 5000); } } /// Stop audio engine void PlayerControl::stopBtnClicked(Button* ref) { UNUSED( ref ); m_pPlayBtn->setPressed(false); m_pEngine->sequencer_stop(); m_pEngine->setPatternPos( 0 ); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Stopped."), 5000); Hydrogen::get_instance()->setTimelineBpm(); } /// Set Song mode void PlayerControl::songModeBtnClicked(Button* ref) { UNUSED( ref ); m_pEngine->sequencer_stop(); m_pEngine->setPatternPos( 0 ); // from start m_pEngine->getSong()->set_mode( Song::SONG_MODE ); m_pSongModeBtn->setPressed(true); m_pLiveModeBtn->setPressed(false); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Song mode selected."), 5000); } ///Set Live mode void PlayerControl::liveModeBtnClicked(Button* ref) { UNUSED( ref ); m_pEngine->sequencer_stop(); m_pEngine->getSong()->set_mode( Song::PATTERN_MODE ); m_pSongModeBtn->setPressed(false); m_pLiveModeBtn->setPressed(true); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Pattern mode selected."), 5000); } void PlayerControl::bpmChanged() { float fNewBpmValue = m_pLCDBPMSpinbox->getValue(); if (fNewBpmValue < 30) { fNewBpmValue = 30; } else if (fNewBpmValue > 400 ) { fNewBpmValue = 400; } m_pEngine->getSong()->set_is_modified( true ); AudioEngine::get_instance()->lock( RIGHT_HERE ); m_pEngine->setBPM( fNewBpmValue ); AudioEngine::get_instance()->unlock(); } //beatcounter void PlayerControl::bconoffBtnClicked( Button* ) { Preferences *pPref = Preferences::get_instance(); if (m_pBConoffBtn->isPressed()) { pPref->m_bbc = Preferences::BC_ON; (HydrogenApp::get_instance())->setStatusBarMessage(tr(" BC Panel on"), 5000); m_pControlsBCPanel->show(); } else { pPref->m_bbc = Preferences::BC_OFF; (HydrogenApp::get_instance())->setStatusBarMessage(tr(" BC Panel off"), 5000); m_pControlsBCPanel->hide(); } } void PlayerControl::bcSetPlayBtnClicked( Button* ) { Preferences *pPref = Preferences::get_instance(); if (m_pBCSetPlayBtn->isPressed()) { pPref->m_mmcsetplay = Preferences::SET_PLAY_ON; (HydrogenApp::get_instance())->setStatusBarMessage(tr(" Count BPM and start PLAY"), 5000); } else { pPref->m_mmcsetplay = Preferences::SET_PLAY_OFF; (HydrogenApp::get_instance())->setStatusBarMessage(tr(" Count and set BPM"), 5000); } } void PlayerControl::rubberbandButtonToggle(Button* ) { Preferences *pPref = Preferences::get_instance(); if (m_pRubberBPMChange->isPressed()) { EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); pPref->setRubberBandBatchMode(true); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Recalculate all samples using Rubberband ON"), 2000); } else { pPref->setRubberBandBatchMode(false); (HydrogenApp::get_instance())->setScrollStatusBarMessage(tr("Recalculate all samples using Rubberband OFF"), 2000); } } void PlayerControl::bcbButtonClicked( Button* bBtn) { int tmp = m_pEngine->getbeatsToCount(); char tmpb[3]; // m_pBCBUpBtn if ( bBtn == m_pBCBUpBtn ) { tmp ++; if (tmp > 16) { tmp = 2; } //small fix against qt4 png transparent problem //think this will be solved in next time // if (tmp < 10 ){ // sprintf(tmpb, "%01d", tmp ); // }else // { sprintf(tmpb, "%02d", tmp ); // } m_pBCDisplayB->setText( QString( tmpb ) ); m_pEngine->setbeatsToCount( tmp ); } else { tmp --; if (tmp < 2 ) { tmp = 16; } //small fix against qt4 png transparent problem //think this will be solved in next time // if (tmp < 10 ){ // sprintf(tmpb, "%01d", tmp ); // }else // { sprintf(tmpb, "%02d", tmp ); // } m_pBCDisplayB->setText( QString( tmpb ) ); m_pEngine->setbeatsToCount( tmp ); } } void PlayerControl::bctButtonClicked( Button* tBtn) { float tmp = m_pEngine->getNoteLength() * 4; if ( tBtn == m_pBCTUpBtn) { tmp = tmp / 2 ; if (tmp < 1) { tmp = 8; } m_pBCDisplayT->setText( QString::number( tmp ) ); m_pEngine->setNoteLength( (tmp) / 4 ); } else { tmp = tmp * 2; if (tmp > 8 ) { tmp = 1; } m_pBCDisplayT->setText( QString::number(tmp) ); m_pEngine->setNoteLength( (tmp) / 4 ); } } //~ beatcounter void PlayerControl::jackTransportBtnClicked( Button* ) { Preferences *pPref = Preferences::get_instance(); if ( !m_pEngine->haveJackAudioDriver() ) { QMessageBox::warning( this, "Hydrogen", tr( "JACK-transport will work only with JACK driver." ) ); return; } if (m_pJackTransportBtn->isPressed()) { AudioEngine::get_instance()->lock( RIGHT_HERE ); pPref->m_bJackTransportMode = Preferences::USE_JACK_TRANSPORT; AudioEngine::get_instance()->unlock(); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Jack-transport mode = On"), 5000); m_pJackMasterBtn->setDisabled( false ); } else { AudioEngine::get_instance()->lock( RIGHT_HERE ); pPref->m_bJackTransportMode = Preferences::NO_JACK_TRANSPORT; AudioEngine::get_instance()->unlock(); (HydrogenApp::get_instance())->setStatusBarMessage(tr("Jack-transport mode = Off"), 5000); m_pJackMasterBtn->setPressed( false ); m_pJackMasterBtn->setDisabled( true ); } } //jack time master void PlayerControl::jackMasterBtnClicked( Button* ) { #ifdef H2CORE_HAVE_JACK Preferences *pPref = Preferences::get_instance(); if ( !m_pEngine->haveJackTransport() ) { QMessageBox::warning( this, "Hydrogen", tr( "JACK-transport will work only with JACK driver." ) ); return; } if (m_pJackMasterBtn->isPressed()) { AudioEngine::get_instance()->lock( RIGHT_HERE ); pPref->m_bJackMasterMode = Preferences::USE_JACK_TIME_MASTER; AudioEngine::get_instance()->unlock(); (HydrogenApp::get_instance())->setStatusBarMessage(tr(" Jack-Time-Master mode = On"), 5000); Hydrogen::get_instance()->onJackMaster(); } else { AudioEngine::get_instance()->lock( RIGHT_HERE ); pPref->m_bJackMasterMode = Preferences::NO_JACK_TIME_MASTER; AudioEngine::get_instance()->unlock(); (HydrogenApp::get_instance())->setStatusBarMessage(tr(" Jack-Time-Master mode = Off"), 5000); Hydrogen::get_instance()->offJackMaster(); } HydrogenApp::get_instance()->getSongEditorPanel()->updateTimelineUsage(); #endif } //~ jack time master void PlayerControl::bpmClicked() { bool bIsOkPressed; double fNewVal= QInputDialog::getDouble( this, "Hydrogen", tr( "New BPM value" ), m_pLCDBPMSpinbox->getValue(), 10, 400, 2, &bIsOkPressed ); if ( bIsOkPressed ) { if ( fNewVal < 30 ) { return; } m_pEngine->getSong()->set_is_modified( true ); AudioEngine::get_instance()->lock( RIGHT_HERE ); m_pEngine->setBPM( fNewVal ); AudioEngine::get_instance()->unlock(); } else { // user entered nothing or pressed Cancel } } void PlayerControl::bpmButtonClicked( Button* pBtn ) { if ( pBtn == m_pBPMUpBtn ) { m_pLCDBPMSpinbox->upBtnClicked(); } else { m_pLCDBPMSpinbox->downBtnClicked(); } } void PlayerControl::FFWDBtnClicked( Button* ) { WARNINGLOG( "relocate via button press" ); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setPatternPos( pEngine->getPatternPos() + 1 ); Hydrogen::get_instance()->setTimelineBpm(); } void PlayerControl::RewindBtnClicked( Button* ) { WARNINGLOG( "relocate via button press" ); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setPatternPos( pEngine->getPatternPos() - 1 ); Hydrogen::get_instance()->setTimelineBpm(); } void PlayerControl::songLoopBtnClicked( Button* ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *song = pEngine->getSong(); song->set_loop_enabled( ! song->is_loop_enabled() ); song->set_is_modified( true ); if ( song->is_loop_enabled() ) { HydrogenApp::get_instance()->setStatusBarMessage(tr("Loop song = On"), 5000); } else { HydrogenApp::get_instance()->setStatusBarMessage(tr("Loop song = Off"), 5000); } } void PlayerControl::metronomeButtonClicked(Button* ref) { Hydrogen* pEngine = Hydrogen::get_instance(); CoreActionController* pController = pEngine->getCoreActionController(); pController->setMetronomeIsActive( ref->isPressed() ); } void PlayerControl::showButtonClicked( Button* pRef ) { //INFOLOG( "[showButtonClicked]" ); HydrogenApp *pH2App = HydrogenApp::get_instance(); if ( pRef == m_pShowMixerBtn ) { bool isVisible = pH2App->getMixer()->isVisible(); pH2App->showMixer( !isVisible ); } else if ( pRef == m_pShowInstrumentRackBtn ) { bool isVisible = pH2App->getInstrumentRack()->isVisible(); pH2App->showInstrumentPanel( isVisible ); } } void PlayerControl::showMessage( const QString& msg, int msec ) { if ( m_pScrollTimer->isActive ()) { m_pScrollTimer->stop(); } m_pStatusLabel->setText( msg ); m_pStatusTimer->start( msec ); } void PlayerControl::showScrollMessage( const QString& msg, int msec, bool test ) { if ( test == false ){ m_pStatusLabel->setText( msg ); m_pScrollTimer->start( msec ); }else { m_pScrollMessage = msg; m_pStatusLabel->setText( msg ); m_pStatusTimer->start( msec ); m_pScrollTimer->start( msec ); } } void PlayerControl::onScrollTimerEvent() { int lwl = 25; int msgLength = m_pScrollMessage.length(); if ( msgLength > lwl) { m_pScrollMessage = m_pScrollMessage.right( msgLength - 1 ); } m_pScrollTimer->stop(); if ( msgLength > lwl){ showScrollMessage( m_pScrollMessage, 150, false ); }else { showMessage( m_pScrollMessage, 2000 ); } } void PlayerControl::onStatusTimerEvent() { resetStatusLabel(); } void PlayerControl::resetStatusLabel() { m_pStatusTimer->stop(); m_pStatusLabel->setText( "" ); } void PlayerControl::tempoChangedEvent( int nValue ) { /* * This is an external tempo change, triggered * via a midi or osc message. * * Just update the GUI using the current tempo * of the song. */ m_pLCDBPMSpinbox->setValue( m_pEngine->getSong()->__bpm ); } //:::::::::::::::::::::::::::::::::::::::::::::::: const char* MetronomeWidget::__class_name = "MetronomeWidget"; MetronomeWidget::MetronomeWidget(QWidget *pParent) : QWidget( pParent ) , Object( __class_name ) , m_nValue( 0 ) , m_state( METRO_OFF ) { // INFOLOG( "INIT" ); HydrogenApp::get_instance()->addEventListener( this ); m_metro_off.load( Skin::getImagePath() + "/playerControlPanel/metronome_off.png" ); m_metro_on_firstbeat.load( Skin::getImagePath() + "/playerControlPanel/metronome_up.png" ); m_metro_on.load( Skin::getImagePath() + "/playerControlPanel/metronome_down.png" ); QTimer *timer = new QTimer(this); connect( timer, SIGNAL( timeout() ), this, SLOT( updateWidget() ) ); timer->start(50); // update player control at 20 fps } MetronomeWidget::~MetronomeWidget() { // INFOLOG( "DESTROY" ); } void MetronomeWidget::metronomeEvent( int nValue ) { if (nValue == 2) { // 2 = set pattern position is not needed here return; } if (nValue == 1) { m_state = METRO_FIRST; m_nValue = 5; } else { m_state = METRO_ON; m_nValue = 5; } updateWidget(); } void MetronomeWidget::updateWidget() { if ( m_nValue > 0 ) { m_nValue -= 1; if (m_nValue == 0 ) { m_nValue = 0; m_state = METRO_OFF; } update(); } } void MetronomeWidget::paintEvent( QPaintEvent* ev) { QPainter painter(this); switch( m_state ) { case METRO_FIRST: painter.drawPixmap( ev->rect(), m_metro_on_firstbeat, ev->rect() ); break; case METRO_ON: painter.drawPixmap( ev->rect(), m_metro_on, ev->rect() ); break; case METRO_OFF: painter.drawPixmap( ev->rect(), m_metro_off, ev->rect() ); break; } } hydrogen-1.0.0-rc1/src/gui/src/PlayerControl.h000066400000000000000000000107261366722712400211420ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PLAYER_CONTROL_H #define PLAYER_CONTROL_H #include #if QT_VERSION >= 0x050000 # include #endif #include "EventListener.h" #include namespace H2Core { class Hydrogen; } class LCDSpinBox; class LCDDisplay; class Button; class ToggleButton; class CpuLoadWidget; class MidiActivityWidget; class PixmapWidget; /// /// /// class MetronomeWidget : public QWidget,public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: MetronomeWidget(QWidget *pParent); ~MetronomeWidget(); virtual void metronomeEvent( int nValue ); virtual void paintEvent( QPaintEvent*); public slots: void updateWidget(); private: enum m_state { METRO_FIRST, METRO_ON, METRO_OFF }; int m_nValue; int m_state; QPixmap m_metro_off; QPixmap m_metro_on_firstbeat; QPixmap m_metro_on; }; /// /// Player control panel /// class PlayerControl : public QLabel, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: PlayerControl(QWidget *parent); ~PlayerControl(); void showMessage( const QString& msg, int msec ); void showScrollMessage( const QString& msg, int msec, bool test ); void resetStatusLabel(); virtual void tempoChangedEvent( int nValue ); private slots: void recBtnClicked(Button* ref); void recBtnRightClicked(Button* ref); void playBtnClicked(Button* ref); void stopBtnClicked(Button* ref); void updatePlayerControl(); void songModeBtnClicked(Button* ref); void liveModeBtnClicked(Button* ref); void jackTransportBtnClicked(Button* ref); //jack time master void jackMasterBtnClicked(Button* ref); //~ jack time master void bpmChanged(); void bpmButtonClicked( Button *pRef ); void bpmClicked(); void FFWDBtnClicked(Button *pRef); void RewindBtnClicked(Button *pRef); void songLoopBtnClicked(Button* ref); void metronomeButtonClicked(Button* ref); void onStatusTimerEvent(); void onScrollTimerEvent(); void showButtonClicked( Button* pRef ); //beatcounter void bconoffBtnClicked( Button* ref); void bcSetPlayBtnClicked(Button* ref); void bcbButtonClicked(Button* bBtn); void bctButtonClicked(Button* tBtn); //~ beatcounter //rubberband void rubberbandButtonToggle(Button* ref); private: H2Core::Hydrogen *m_pEngine; QPixmap m_background; Button *m_pRwdBtn; ToggleButton *m_pRecBtn; ToggleButton *m_pRecDelBtn; ToggleButton *m_pPlayBtn; Button *m_pStopBtn; Button *m_pFfwdBtn; ToggleButton *m_pSongLoopBtn; ToggleButton *m_pSongModeBtn; ToggleButton *m_pLiveModeBtn; //beatcounter ToggleButton *m_pBConoffBtn; ToggleButton *m_pBCSpaceBtn; ToggleButton *m_pBCSetPlayBtn; Button *m_pBCTUpBtn; Button *m_pBCTDownBtn; Button *m_pBCBUpBtn; Button *m_pBCBDownBtn; //~ beatcounter //rubberbandBPMChange ToggleButton *m_pRubberBPMChange; ToggleButton *m_pJackTransportBtn; //jack time master ToggleButton *m_pJackMasterBtn; //~ jack time master Button *m_pBPMUpBtn; Button *m_pBPMDownBtn; CpuLoadWidget *m_pCpuLoadWidget; MidiActivityWidget *m_pMidiActivityWidget; LCDSpinBox *m_pLCDBPMSpinbox; LCDDisplay *m_pTimeDisplayH; LCDDisplay *m_pTimeDisplayM; LCDDisplay *m_pTimeDisplayS; LCDDisplay *m_pTimeDisplayMS; //beatcounter PixmapWidget *m_pControlsBCPanel; LCDDisplay *m_pBCDisplayZ; LCDDisplay *m_pBCDisplayB; LCDDisplay *m_pBCDisplayT; //~ beatcounter MetronomeWidget *m_pMetronomeWidget; ToggleButton *m_pMetronomeBtn; ToggleButton *m_pShowMixerBtn; ToggleButton *m_pShowInstrumentRackBtn; LCDDisplay *m_pStatusLabel; QTimer *m_pStatusTimer; QTimer *m_pScrollTimer; QString m_pScrollMessage; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PlaylistEditor/000077500000000000000000000000001366722712400211365ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/PlaylistEditor/PlaylistDialog.cpp000066400000000000000000000721351366722712400245730ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PlaylistDialog.h" #include "../HydrogenApp.h" #include "../InstrumentRack.h" #include "SoundLibrary/SoundLibraryPanel.h" #include "SongEditor/SongEditorPanel.h" #include "Widgets/PixmapWidget.h" #include #include #include #include #include #include #include #include #include "../Widgets/Button.h" #include #include #include #include #include #include #include #include #include #include using namespace H2Core; using namespace std; const char* PlaylistDialog::__class_name = "PlaylistDialog"; PlaylistDialog::PlaylistDialog ( QWidget* pParent ) : QDialog ( pParent ) , Object ( __class_name ) { setupUi ( this ); INFOLOG ( "INIT" ); setWindowTitle ( tr ( "Playlist Browser" ) + QString(" - ") + Playlist::get_instance()->getFilename() ); setFixedSize ( width(), height() ); installEventFilter( this ); // menubar QMenuBar *m_pMenubar = new QMenuBar( this ); // Playlist menu QMenu *m_pPlaylistMenu = m_pMenubar->addMenu( tr( "&Playlist" ) ); m_pPlaylistMenu->addAction( tr( "Add song to Play&list" ), this, SLOT( addSong() ), QKeySequence( "Ctrl+A" ) ); m_pPlaylistMenu->addAction( tr( "Add ¤t song to Playlist" ), this, SLOT( addCurrentSong() ), QKeySequence( "Ctrl+Alt+A" ) ); m_pPlaylistMenu->addSeparator(); // ----- m_pPlaylistMenu->addAction( tr( "&Remove selected song from Playlist" ), this, SLOT( removeFromList() ), QKeySequence::Delete ); m_pPlaylistMenu->addAction( tr( "&New Playlist" ), this, SLOT( clearPlaylist() ), QKeySequence( "Ctrl+N" ) ); m_pPlaylistMenu->addSeparator(); m_pPlaylistMenu->addAction( tr( "&Open Playlist" ), this, SLOT( loadList() ), QKeySequence( "Ctrl+O" ) ); m_pPlaylistMenu->addSeparator(); m_pPlaylistMenu->addAction( tr( "&Save Playlist" ), this, SLOT( saveList() ), QKeySequence( "Ctrl+S" ) ); m_pPlaylistMenu->addAction( tr( "Save Playlist &as" ), this, SLOT( saveListAs() ), QKeySequence( "Ctrl+Shift+S" ) ); #ifdef WIN32 //no scripts under windows #else // Script menu QMenu *m_pScriptMenu = m_pMenubar->addMenu( tr( "&Scripts" ) ); m_pScriptMenu->addAction( tr( "&Add Script to selected song" ), this, SLOT( loadScript() ), QKeySequence( "" ) ); m_pScriptMenu->addAction( tr( "&Edit selected Script" ), this, SLOT( editScript() ), QKeySequence( "" ) ); m_pScriptMenu->addSeparator(); m_pScriptMenu->addAction( tr( "&Remove selected Script" ), this, SLOT( removeScript() ), QKeySequence( "" ) ); m_pScriptMenu->addSeparator(); m_pScriptMenu->addAction( tr( "&Create a new Script" ), this, SLOT( newScript() ), QKeySequence( "" ) ); #endif // CONTROLS PixmapWidget *pControlsPanel = new PixmapWidget( nullptr ); pControlsPanel->setFixedSize( 119, 32 ); pControlsPanel->setPixmap( "/playerControlPanel/playlist_background_Control.png" ); vboxLayout->addWidget( pControlsPanel ); // Rewind button m_pRwdBtn = new Button( pControlsPanel, "/playerControlPanel/btn_rwd_on.png", "/playerControlPanel/btn_rwd_off.png", "/playerControlPanel/btn_rwd_over.png", QSize(21, 15) ); m_pRwdBtn->move(6, 6); m_pRwdBtn->setToolTip( tr("Rewind") ); connect(m_pRwdBtn, SIGNAL(clicked(Button*)), this, SLOT(rewindBtnClicked(Button*))); // Play button m_pPlayBtn = new ToggleButton( pControlsPanel, "/playerControlPanel/btn_play_on.png", "/playerControlPanel/btn_play_off.png", "/playerControlPanel/btn_play_over.png", QSize(33, 17) ); m_pPlayBtn->move(33, 6); m_pPlayBtn->setPressed(false); m_pPlayBtn->setToolTip( tr("Play/ Pause/ Load selected song") ); connect(m_pPlayBtn, SIGNAL(clicked(Button*)), this, SLOT(nodePlayBTN(Button*))); // Stop button m_pStopBtn = new Button( pControlsPanel, "/playerControlPanel/btn_stop_on.png", "/playerControlPanel/btn_stop_off.png", "/playerControlPanel/btn_stop_over.png", QSize(21, 15) ); m_pStopBtn->move(65, 6); m_pStopBtn->setToolTip( tr("Stop") ); connect(m_pStopBtn, SIGNAL(clicked(Button*)), this, SLOT(nodeStopBTN(Button*))); // Fast forward button m_pFfwdBtn = new Button( pControlsPanel, "/playerControlPanel/btn_ffwd_on.png", "/playerControlPanel/btn_ffwd_off.png", "/playerControlPanel/btn_ffwd_over.png", QSize(21, 15) ); m_pFfwdBtn->move(92, 6); m_pFfwdBtn->setToolTip( tr("Fast Forward") ); connect(m_pFfwdBtn, SIGNAL(clicked(Button*)), this, SLOT(ffWDBtnClicked(Button*))); #ifdef WIN32 QStringList headers; headers << tr ( "Song list" ); QTreeWidgetItem* header = new QTreeWidgetItem ( headers ); m_pPlaylistTree->setHeaderItem ( header ); m_pPlaylistTree->setAlternatingRowColors( true ); /*addSongBTN->setEnabled ( true ); loadListBTN->setEnabled ( true ); removeFromListBTN->setEnabled ( false ); removeFromListBTN->setEnabled ( false ); saveListBTN->setEnabled ( false ); saveListAsBTN->setEnabled ( false ); loadScriptBTN->hide(); removeScriptBTN->hide(); editScriptBTN->hide(); newScriptBTN->hide(); clearPlBTN->setEnabled ( false );*/ QVBoxLayout *pSideBarLayout = new QVBoxLayout(sideBarWidget); pSideBarLayout->setSpacing(0); pSideBarLayout->setMargin(0); #else QStringList headers; headers << tr ( "Song list" ) << tr ( "Script" ) << tr ( "exec Script" ); QTreeWidgetItem* header = new QTreeWidgetItem ( headers ); m_pPlaylistTree->setHeaderItem ( header ); m_pPlaylistTree->header()->resizeSection ( 0, 405 ); m_pPlaylistTree->header()->resizeSection ( 1, 405 ); m_pPlaylistTree->header()->resizeSection ( 2, 15 ); m_pPlaylistTree->setAlternatingRowColors( true ); QVBoxLayout *pSideBarLayout = new QVBoxLayout(sideBarWidget); pSideBarLayout->setSpacing(0); pSideBarLayout->setMargin(0); #endif // zoom-in btn Button *pUpBtn = new Button( nullptr, "/songEditor/btn_up_on.png", "/songEditor/btn_up_off.png", "/songEditor/btn_up_over.png", QSize(18, 13) ); pUpBtn->setFontSize(7); pUpBtn->setToolTip( tr( "sort" ) ); connect(pUpBtn, SIGNAL(clicked(Button*)), this, SLOT(o_upBClicked()) ); pSideBarLayout->addWidget(pUpBtn); // zoom-in btn Button *pDownBtn = new Button( nullptr, "/songEditor/btn_down_on.png", "/songEditor/btn_down_off.png", "/songEditor/btn_down_over.png", QSize(18, 13) ); pDownBtn->setFontSize(7); pDownBtn->setToolTip( tr( "sort" ) ); connect(pDownBtn, SIGNAL(clicked(Button*)), this, SLOT(o_downBClicked())); pSideBarLayout->addWidget(pDownBtn); //restore the playlist Playlist* pPlaylist = Playlist::get_instance(); if( pPlaylist->size() > 0 ){ for ( uint i = 0; i < pPlaylist->size(); ++i ){ QTreeWidgetItem* pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree ); pPlaylistItem->setText( 0, pPlaylist->get( i )->filePath ); pPlaylistItem->setText( 1, pPlaylist->get( i )->scriptPath ); if ( pPlaylist->get( i )->scriptEnabled ) { pPlaylistItem->setCheckState( 2, Qt::Checked ); } else { pPlaylistItem->setCheckState( 2, Qt::Unchecked ); } } //restore the selected item int selected = Playlist::get_instance()->getActiveSongNumber(); int Selected = Playlist::get_instance()->getSelectedSongNr(); if( selected == -1 && Selected == -1 ) return; int aselected = 0; if( selected == -1 ){ aselected = Selected; } else { aselected = selected ; } QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->topLevelItem ( aselected ); m_pPlaylistItem->setBackground( 0, QColor( 50, 50, 50) ); m_pPlaylistItem->setBackground( 1, QColor( 50, 50, 50) ); m_pPlaylistItem->setBackground( 2, QColor( 50, 50, 50) ); } timer = new QTimer( this ); connect(timer, SIGNAL(timeout() ), this, SLOT( updateActiveSongNumber() ) ); timer->start( 1000 ); // update player control at 1 fps } PlaylistDialog::~PlaylistDialog() { INFOLOG ( "DESTROY" ); } void PlaylistDialog::keyPressEvent( QKeyEvent* ev ) { if(ev->key() == Qt::Key_Escape) { HydrogenApp::get_instance()->showPlaylistDialog(); } } void PlaylistDialog::closeEvent( QCloseEvent* ev ) { HydrogenApp::get_instance()->showPlaylistDialog(); } void PlaylistDialog::addSong() { QFileDialog fd(this); fd.setWindowTitle( tr( "Add Song to PlayList" ) ); fd.setFileMode( QFileDialog::ExistingFiles ); fd.setNameFilter( Filesystem::songs_filter_name ); fd.setDirectory( Filesystem::songs_dir() ); if ( fd.exec() != QDialog::Accepted ) { return; } foreach( QString filePath, fd.selectedFiles() ) { updatePlayListNode( filePath ); } } void PlaylistDialog::addCurrentSong() { Song * pSong = Hydrogen::get_instance()->getSong(); QString filename = pSong->get_filename(); if (filename == "") { // just in case! QMessageBox::information ( this, "Hydrogen", tr ( "Please save your song first" )); return; } updatePlayListNode ( filename ); } void PlaylistDialog::removeFromList() { QTreeWidgetItem* pPlaylistItem = m_pPlaylistTree->currentItem(); int index = m_pPlaylistTree->indexOfTopLevelItem ( pPlaylistItem ); QTreeWidgetItem * pTmpItem = m_pPlaylistTree->topLevelItem ( 1 ); if (pPlaylistItem == nullptr){ QMessageBox::information ( this, "Hydrogen", tr ( "No Song selected!" )); } else { if (pTmpItem == nullptr){ m_pPlaylistTree->clear(); Playlist::get_instance()->clear(); Playlist::get_instance()->setSelectedSongNr( -1 ); Playlist::get_instance()->setActiveSongNumber( -1 ); Playlist::get_instance()->setFilename( "" ); setWindowTitle ( tr ( "Playlist Browser" ) ); return; } else { ///avoid segfault if the last item will be removed!! /// delete pPlaylistItem; updatePlayListVector(); if ( Playlist::get_instance()->getActiveSongNumber() == index ){ Playlist::get_instance()->setActiveSongNumber( -1 ); } else if ( Playlist::get_instance()->getActiveSongNumber() > index ){ Playlist::get_instance()->setActiveSongNumber( Playlist::get_instance()->getActiveSongNumber() -1 ); } } } } void PlaylistDialog::clearPlaylist() { bool DiscardChanges = false; bool IsModified = Playlist::get_instance()->getIsModified(); if( IsModified ) { switch(QMessageBox::information( this, "Hydrogen", tr("\nThe current playlist contains unsaved changes.\n" "Do you want to discard the changes?\n"), tr("&Discard"), tr("&Cancel"), nullptr, // Enter == button 0 2 ) ) { // Escape == button 1 case 0: // Discard clicked or Alt+D pressed // don't save but exit DiscardChanges = true; break; case 1: // Cancel clicked or Alt+C pressed or Escape pressed // don't exit DiscardChanges = false; break; } } if(!IsModified || (IsModified && DiscardChanges)) { m_pPlaylistTree->clear(); Playlist::get_instance()->clear(); Playlist::get_instance()->setSelectedSongNr( -1 ); Playlist::get_instance()->setActiveSongNumber( -1 ); Playlist::get_instance()->setFilename ( "" ); setWindowTitle ( tr ( "Playlist Browser" ) ); Playlist::get_instance()->setIsModified(false); } return; } void PlaylistDialog::updatePlayListNode ( QString file ) { QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree ); m_pPlaylistItem->setText ( 0, file ); m_pPlaylistItem->setText ( 1, tr("no Script") ); m_pPlaylistItem->setCheckState( 2, Qt::Unchecked ); updatePlayListVector(); m_pPlaylistTree->setCurrentItem ( m_pPlaylistItem ); } void PlaylistDialog::loadList() { QFileDialog fd(this); fd.setWindowTitle( tr( "Load Playlist" ) ); fd.setFileMode( QFileDialog::ExistingFile ); fd.setDirectory( Filesystem::playlists_dir() ); fd.setNameFilter( Filesystem::playlists_filter_name ); if ( fd.exec() != QDialog::Accepted ) { return; } QString filename = fd.selectedFiles().first(); bool relativePaths = Preferences::get_instance()->isPlaylistUsingRelativeFilenames(); Playlist* pPlaylist = Playlist::load( filename, relativePaths); if ( ! pPlaylist ) { _ERRORLOG( "Error loading the playlist" ); /* FIXME: get current instance (?) */ pPlaylist = Playlist::get_instance(); } Playlist* playlist = Playlist::get_instance(); if( playlist->size() > 0 ) { QTreeWidget* m_pPlaylist = m_pPlaylistTree; m_pPlaylist->clear(); for ( uint i = 0; i < playlist->size(); ++i ){ QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree ); if( playlist->get( i )->fileExists ){ m_pPlaylistItem->setText( 0, playlist->get( i )->filePath ); } else { m_pPlaylistItem->setText( 0, tr("File not found: ") + playlist->get( i )->filePath ); } m_pPlaylistItem->setText ( 1, playlist->get( i )->scriptPath ); if ( playlist->get( i )->scriptEnabled ) { m_pPlaylistItem->setCheckState( 2, Qt::Checked ); } else { m_pPlaylistItem->setCheckState( 2, Qt::Unchecked ); } } QTreeWidgetItem* m_pPlaylistItem = m_pPlaylist->topLevelItem ( 0 ); m_pPlaylist->setCurrentItem ( m_pPlaylistItem ); pPlaylist->setSelectedSongNr( 0 ); setWindowTitle ( tr ( "Playlist Browser" ) + QString(" - ") + pPlaylist->getFilename() ); } } void PlaylistDialog::newScript() { Preferences *pPref = Preferences::get_instance(); QFileDialog fd(this); fd.setFileMode ( QFileDialog::AnyFile ); fd.setNameFilter( Filesystem::scripts_filter_name ); fd.setAcceptMode ( QFileDialog::AcceptSave ); fd.setWindowTitle ( tr ( "New Script" ) ); fd.setDirectory( Filesystem::scripts_dir() ); QString defaultFilename; defaultFilename += ".sh"; fd.selectFile ( defaultFilename ); QString filename; if ( fd.exec() != QDialog::Accepted ) return; filename = fd.selectedFiles().first(); if( filename.contains(" ", Qt::CaseInsensitive)){ QMessageBox::information ( this, "Hydrogen", tr ( "Script name or path to the script contains whitespaces.\nIMPORTANT\nThe path to the script and the scriptname must be without whitespaces.") ); return; } QFile chngPerm ( filename ); if (!chngPerm.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream out(&chngPerm); out << "#!/bin/sh\n\n#have phun"; chngPerm.close(); if (chngPerm.exists() ) { chngPerm.setPermissions( QFile::ReadOwner|QFile::WriteOwner|QFile::ExeOwner ); QMessageBox::information ( this, "Hydrogen", tr ( "WARNING, the new file is executable by the owner of the file!" ) ); } if( pPref->getDefaultEditor().isEmpty() ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Default Editor Set. Please set your Default Editor\nDo not use a console based Editor\nSorry, but this will not work for the moment." ) ); static QString lastUsedDir = "/usr/bin/"; QFileDialog fd(this); fd.setFileMode ( QFileDialog::ExistingFile ); fd.setDirectory ( lastUsedDir ); fd.setWindowTitle ( tr ( "Set your Default Editor" ) ); QString filename; if ( fd.exec() == QDialog::Accepted ){ filename = fd.selectedFiles().first(); pPref->setDefaultEditor( filename ); } } QString openfile = pPref->getDefaultEditor() + " " + filename + "&"; char *ofile; ofile = new char[openfile.length() + 1]; strcpy(ofile, openfile.toLatin1()); std::system( ofile ); delete [] ofile; return; } void PlaylistDialog::saveListAs() { QFileDialog fd(this); fd.setWindowTitle( tr( "Save Playlist" ) ); fd.setFileMode( QFileDialog::AnyFile ); fd.setNameFilter( Filesystem::playlists_filter_name ); fd.setAcceptMode( QFileDialog::AcceptSave ); fd.setDirectory( Filesystem::playlists_dir() ); fd.selectFile( Filesystem::untitled_playlist_file_name() ); fd.setDefaultSuffix( Filesystem::playlist_ext ); if ( fd.exec() != QDialog::Accepted ) { return; } QString filename = fd.selectedFiles().first(); Playlist* pPlaylist = Playlist::get_instance(); bool relativePaths = Preferences::get_instance()->isPlaylistUsingRelativeFilenames(); if ( Files::savePlaylistPath( filename, pPlaylist, relativePaths ) == nullptr ) { return; } pPlaylist->setIsModified( false ); setWindowTitle( tr( "Playlist Browser" ) + QString(" - %1").arg( filename ) ); } void PlaylistDialog::saveList() { Playlist* pPlaylist = Playlist::get_instance(); if ( pPlaylist->getFilename().isEmpty() ) { return saveListAs(); } bool relativePaths = Preferences::get_instance()->isPlaylistUsingRelativeFilenames(); if ( Files::savePlaylistPath( pPlaylist->getFilename(), pPlaylist, relativePaths ) == nullptr ) { return; } pPlaylist->setIsModified( false ); } void PlaylistDialog::loadScript() { QTreeWidgetItem* pPlaylistItem = m_pPlaylistTree->currentItem(); if ( pPlaylistItem == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Song in List or no Song selected!" ) ); return; } static QString lastUsedDir = Filesystem::scripts_dir(); QFileDialog fd(this); fd.setFileMode ( QFileDialog::ExistingFile ); fd.setDirectory ( lastUsedDir ); fd.setNameFilter ( tr ( "Hydrogen Playlist (*.sh)" ) ); fd.setWindowTitle ( tr ( "Add Script to selected Song" ) ); QString filename; if ( fd.exec() == QDialog::Accepted ){ filename = fd.selectedFiles().first(); if( filename.contains(" ", Qt::CaseInsensitive)){ QMessageBox::information ( this, "Hydrogen", tr ( "Script name or path to the script contains whitespaces.\nIMPORTANT\nThe path to the script and the scriptname must without whitespaces.") ); return; } pPlaylistItem->setText ( 1, filename ); updatePlayListVector(); } } void PlaylistDialog::removeScript() { QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem(); if (m_pPlaylistItem == nullptr){ QMessageBox::information ( this, "Hydrogen", tr ( "No Song selected!" )); return; } else { QString selected; selected = m_pPlaylistItem->text ( 1 ); if( !QFile( selected ).exists() ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Script in use!" )); return; } else { m_pPlaylistItem->setText ( 1, tr("no Script") ); m_pPlaylistItem->setCheckState( 2, Qt::Unchecked ); updatePlayListVector(); } } } void PlaylistDialog::editScript() { Preferences *pPref = Preferences::get_instance(); if( pPref->getDefaultEditor().isEmpty() ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Default Editor Set. Please set your Default Editor\nDo not use a console based Editor\nSorry, but this will not work for the moment." ) ); static QString lastUsedDir = "/usr/bin/"; QFileDialog fd(this); fd.setFileMode ( QFileDialog::ExistingFile ); fd.setDirectory ( lastUsedDir ); fd.setWindowTitle ( tr ( "Set your Default Editor" ) ); QString filename; if ( fd.exec() == QDialog::Accepted ){ filename = fd.selectedFiles().first(); pPref->setDefaultEditor( filename ); } } QTreeWidgetItem* pPlaylistItem = m_pPlaylistTree->currentItem(); if ( pPlaylistItem == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Song selected!" ) ); return; } QString selected; selected = pPlaylistItem->text ( 1 ); QString filename = pPref->getDefaultEditor() + " " + selected + "&"; if( !QFile( selected ).exists() ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Script selected!" )); return; } char *file; file = new char[ filename.length() + 1 ]; strcpy( file , filename.toLatin1() ); std::system( file ); delete [] file; return; } void PlaylistDialog::o_upBClicked() { timer->stop(); Playlist* pPlaylist = Playlist::get_instance(); QTreeWidget* pPlaylistTree = m_pPlaylistTree; QTreeWidgetItem* pPlaylistTreeItem = m_pPlaylistTree->currentItem(); int index = pPlaylistTree->indexOfTopLevelItem ( pPlaylistTreeItem ); if (index == 0 ){ timer->start( 1000 ); return; } QTreeWidgetItem* tmpPlaylistItem = pPlaylistTree->takeTopLevelItem ( index ); pPlaylistTree->insertTopLevelItem ( index -1, tmpPlaylistItem ); pPlaylistTree->setCurrentItem ( tmpPlaylistItem ); if ( pPlaylist->getSelectedSongNr() >= 0 ){ pPlaylist->setSelectedSongNr( pPlaylist->getSelectedSongNr() -1 ); } if ( pPlaylist->getActiveSongNumber() == index ){ pPlaylist->setActiveSongNumber( pPlaylist->getActiveSongNumber() -1 ); }else if ( pPlaylist->getActiveSongNumber() == index -1 ){ pPlaylist->setActiveSongNumber( pPlaylist->getActiveSongNumber() +1 ); } updatePlayListVector(); } void PlaylistDialog::o_downBClicked() { timer->stop(); Playlist* pPlaylist = Playlist::get_instance(); QTreeWidget* m_pPlaylist = m_pPlaylistTree; int length = m_pPlaylist->topLevelItemCount(); QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem(); int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem ); if ( index == length - 1){ timer->start( 1000 ); return; } QTreeWidgetItem* pTmpPlaylistItem = m_pPlaylist->takeTopLevelItem ( index ); m_pPlaylist->insertTopLevelItem ( index +1, pTmpPlaylistItem ); m_pPlaylist->setCurrentItem ( pTmpPlaylistItem ); if ( pPlaylist->getSelectedSongNr() >= 0 ) { pPlaylist->setSelectedSongNr( pPlaylist->getSelectedSongNr() +1 ); } if (pPlaylist ->getActiveSongNumber() == index ){ pPlaylist->setActiveSongNumber( pPlaylist->getActiveSongNumber() +1 ); }else if ( pPlaylist->getActiveSongNumber() == index +1 ){ pPlaylist->setActiveSongNumber( pPlaylist->getActiveSongNumber() -1 ); } updatePlayListVector(); } void PlaylistDialog::on_m_pPlaylistTree_itemClicked ( QTreeWidgetItem * item, int column ) { if ( column == 2 ){ QString selected; selected = item->text ( 1 ); if( !QFile( selected ).exists() ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Script!" )); item->setCheckState( 2, Qt::Unchecked ); return; } updatePlayListVector(); } return; } void PlaylistDialog::nodePlayBTN( Button* ref ) { Hydrogen * pEngine = Hydrogen::get_instance(); HydrogenApp * pH2App = HydrogenApp::get_instance(); if (ref->isPressed()) { QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem(); if ( m_pPlaylistItem == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "No valid song selected!" ) ); m_pPlayBtn->setPressed(false); return; } QString selected = ""; selected = m_pPlaylistItem->text ( 0 ); if( selected == pEngine->getSong()->get_filename()){ pEngine->sequencer_play(); return; } if ( pEngine->getState() == STATE_PLAYING ){ pEngine->sequencer_stop(); } Song *pSong = Song::load ( selected ); if ( pSong == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "Error loading song." ) ); m_pPlayBtn->setPressed(false); return; } QTreeWidget* m_pPlaylist = m_pPlaylistTree; int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem ); Playlist::get_instance()->setActiveSongNumber( index ); pH2App->setSong ( pSong ); pEngine->setSelectedPatternNumber ( 0 ); pEngine->sequencer_play(); }else { pEngine->sequencer_stop(); pH2App->setStatusBarMessage(tr("Pause."), 5000); } } void PlaylistDialog::nodeStopBTN( Button* ref ) { UNUSED( ref ); m_pPlayBtn->setPressed(false); Hydrogen::get_instance()->sequencer_stop(); Hydrogen::get_instance()->setPatternPos ( 0 ); } void PlaylistDialog::ffWDBtnClicked( Button* ref) { UNUSED( ref ); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setPatternPos( pEngine->getPatternPos() + 1 ); } void PlaylistDialog::rewindBtnClicked( Button* ref ) { UNUSED( ref ); Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->setPatternPos( pEngine->getPatternPos() - 1 ); } void PlaylistDialog::on_m_pPlaylistTree_itemDoubleClicked () { QTreeWidgetItem* pPlaylistItem = m_pPlaylistTree->currentItem(); if ( pPlaylistItem == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "No Song selected!" ) ); return; } QString selected; selected = pPlaylistItem->text ( 0 ); int index = m_pPlaylistTree->indexOfTopLevelItem ( pPlaylistItem ); Playlist::get_instance()->setSelectedSongNr( index ); Playlist::get_instance()->setActiveSongNumber( index ); HydrogenApp *pH2App = HydrogenApp::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); if ( pEngine->getState() == STATE_PLAYING ){ pEngine->sequencer_stop(); } m_pPlayBtn->setPressed(false); Timeline* pTimeline = pEngine->getTimeline(); pTimeline->m_timelinetagvector.clear(); Song *pSong = Song::load ( selected ); if ( pSong == nullptr ){ QMessageBox::information ( this, "Hydrogen", tr ( "Error loading song." ) ); return; } pH2App->setSong ( pSong ); pEngine->setSelectedPatternNumber ( 0 ); HydrogenApp::get_instance()->getSongEditorPanel()->updatePositionRuler(); pH2App->setStatusBarMessage( tr( "Playlist: set song no. %1" ).arg( index +1 ), 5000 ); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->update_background_color(); EventQueue::get_instance()->push_event( EVENT_METRONOME, 3 ); ///exec script ///this is very very simple and only an experiment #ifdef WIN32 //I know nothing about windows scripts -wolke- return; #else QString execscript; selected = pPlaylistItem->text ( 1 ); bool execcheckbox = pPlaylistItem->checkState ( 2 ); if( execcheckbox == false){ //QMessageBox::information ( this, "Hydrogen", tr ( "No Script selected!" )); return; } if( execscript == "Script not used"){ //QMessageBox::information ( this, "Hydrogen", tr ( "Script not in use!" )); return; } char *file; file = new char[ selected.length() + 1 ]; strcpy( file , selected.toLatin1() ); std::system( file ); delete [] file; return; #endif } void PlaylistDialog::updatePlayListVector() { int length = m_pPlaylistTree->topLevelItemCount(); Playlist::get_instance()->clear(); for (int i = 0 ;i < length; i++){ QTreeWidgetItem * pPlaylistItem = m_pPlaylistTree->topLevelItem ( i ); Playlist::Entry* entry = new Playlist::Entry(); entry->filePath = pPlaylistItem->text( 0 ); entry->scriptPath = pPlaylistItem->text( 1 ); entry->scriptEnabled = pPlaylistItem->checkState( 2 ); Playlist::get_instance()->add( entry ); Playlist::get_instance()->setIsModified(true); } timer->start( 1000 ); } void PlaylistDialog::updateActiveSongNumber() { for ( uint i = 0; i < Playlist::get_instance()->size(); ++i ){ if ( !m_pPlaylistTree->topLevelItem( i ) ) { break; } ( m_pPlaylistTree->topLevelItem( i ) )->setBackground( 0, QBrush() ); ( m_pPlaylistTree->topLevelItem( i ) )->setBackground( 1, QBrush() ); ( m_pPlaylistTree->topLevelItem( i ) )->setBackground( 2, QBrush() ); } int selected = Playlist::get_instance()->getActiveSongNumber(); if ( selected == -1 ) { return; } QTreeWidgetItem* pPlaylistItem = m_pPlaylistTree->topLevelItem ( selected ); if ( pPlaylistItem != nullptr ){ pPlaylistItem->setBackground( 0, QColor( 50, 50, 50) ); pPlaylistItem->setBackground( 1, QColor( 50, 50, 50) ); pPlaylistItem->setBackground( 2, QColor( 50, 50, 50) ); } } bool PlaylistDialog::eventFilter ( QObject *o, QEvent *e ) { UNUSED ( o ); if ( e->type() == QEvent::KeyPress ) { QKeyEvent *k = ( QKeyEvent * ) e; switch ( k->key() ) { case Qt::Key_F5 : if( Playlist::get_instance()->size() == 0 || Playlist::get_instance()->getActiveSongNumber() <=0) { break; } Playlist::get_instance()->setNextSongByNumber(Playlist::get_instance()->getActiveSongNumber()-1); return true; break; case Qt::Key_F6 : if( Playlist::get_instance()->size() == 0 || Playlist::get_instance()->getActiveSongNumber() >= Playlist::get_instance()->size() -1) { break; } Playlist::get_instance()->setNextSongByNumber(Playlist::get_instance()->getActiveSongNumber()+1); return true; break; } } else { return false; // standard event processing } return false; } bool PlaylistDialog::loadListByFileName( QString filename ) { bool bUseRelativeFilenames = Preferences::get_instance()->isPlaylistUsingRelativeFilenames(); Playlist* pPlaylist = Playlist::load ( filename, bUseRelativeFilenames ); if ( !pPlaylist ) { _ERRORLOG( "Error loading the playlist" ); return false; } Preferences::get_instance()->setLastPlaylistFilename( filename ); Playlist* playlist = Playlist::get_instance(); if ( playlist->size() > 0 ) { QTreeWidget* m_pPlaylist = m_pPlaylistTree; m_pPlaylist->clear(); for ( uint i = 0; i < playlist->size(); ++i ){ QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree ); m_pPlaylistItem->setText( 0, playlist->get( i )->filePath ); m_pPlaylistItem->setText( 1, playlist->get( i )->scriptPath ); if ( playlist->get( i )->scriptEnabled ) { m_pPlaylistItem->setCheckState( 2, Qt::Checked ); } else { m_pPlaylistItem->setCheckState( 2, Qt::Unchecked ); } } QTreeWidgetItem* m_pPlaylistItem = m_pPlaylist->topLevelItem ( 0 ); m_pPlaylist->setCurrentItem ( m_pPlaylistItem ); pPlaylist->setSelectedSongNr( 0 ); setWindowTitle ( tr ( "Playlist Browser" ) + QString(" - ") + pPlaylist->getFilename() ); } return true; } hydrogen-1.0.0-rc1/src/gui/src/PlaylistEditor/PlaylistDialog.h000066400000000000000000000045711366722712400242370ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PLAYLIST_DIALOG_H #define PLAYLIST_DIALOG_H #include #include "ui_PlaylistDialog_UI.h" #include #include #include #include class Button; class ToggleButton; class PixmapWidget; /// /// This dialog is used to use the H2PlayList /// class PlaylistDialog : public QDialog, public Ui_PlaylistDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: PlaylistDialog( QWidget* pParent ); ~PlaylistDialog(); bool loadListByFileName( QString filename); private slots: void keyPressEvent( QKeyEvent* ev ); void closeEvent( QCloseEvent* ev ); void addSong(); void addCurrentSong(); void removeFromList(); void removeScript(); void clearPlaylist(); void loadList(); void saveListAs(); void saveList(); void loadScript(); void ffWDBtnClicked(Button* ref); void nodePlayBTN( Button* ref ); void nodeStopBTN( Button* ref ); void rewindBtnClicked(Button *ref); void editScript(); void newScript(); void on_m_pPlaylistTree_itemClicked ( QTreeWidgetItem * item, int column ); void o_upBClicked(); void o_downBClicked(); void on_m_pPlaylistTree_itemDoubleClicked (); void updateActiveSongNumber(); bool eventFilter ( QObject *o, QEvent *e ); private: void updatePlayListNode( QString file ); void updatePlayListVector(); void setFirstItemCurrent(); Button *zoom_in_btn; QTimer *timer; Button *m_pRwdBtn; ToggleButton *m_pPlayBtn; Button *m_pStopBtn; Button *m_pFfwdBtn; }; #endif hydrogen-1.0.0-rc1/src/gui/src/PlaylistEditor/PlaylistDialog_UI.ui000066400000000000000000000044671366722712400250260ustar00rootroot00000000000000 PlaylistDialog_UI 0 0 961 397 PlayList Browser 12 29 921 321 0 271 false Qt::ScrollBarAsNeeded Qt::ScrollBarAsNeeded true false false false QAbstractItemView::NoDragDrop true true false false Song list 940 30 16 311 10 350 181 41 hydrogen-1.0.0-rc1/src/gui/src/PreferencesDialog.cpp000066400000000000000000000611021366722712400222530ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Skin.h" #include "PreferencesDialog.h" #include "HydrogenApp.h" #include "MainForm.h" #include "qmessagebox.h" #include "qstylefactory.h" #include #include #include "Widgets/MidiTable.h" #include #include #include #include #include #include #include #include "SongEditor/SongEditor.h" #include "SongEditor/SongEditorPanel.h" using namespace H2Core; const char* PreferencesDialog::__class_name = "PreferencesDialog"; PreferencesDialog::PreferencesDialog(QWidget* parent) : QDialog( parent ) , Object( __class_name ) { setupUi( this ); setWindowTitle( tr( "Preferences" ) ); setMinimumSize( width(), height() ); Preferences *pPref = Preferences::get_instance(); pPref->loadPreferences( false ); // reload user's preferences driverComboBox->clear(); driverComboBox->addItem( "Auto" ); #ifdef H2CORE_HAVE_JACK driverComboBox->addItem( "Jack" ); #endif #ifdef H2CORE_HAVE_ALSA driverComboBox->addItem( "Alsa" ); #endif #ifdef H2CORE_HAVE_OSS driverComboBox->addItem( "Oss" ); #endif #ifdef H2CORE_HAVE_PORTAUDIO driverComboBox->addItem( "PortAudio" ); #endif #ifdef H2CORE_HAVE_COREAUDIO driverComboBox->addItem( "CoreAudio" ); #endif #ifdef H2CORE_HAVE_PULSEAUDIO driverComboBox->addItem( "PulseAudio" ); #endif if( driverComboBox->findText(pPref->m_sAudioDriver) > -1){ driverComboBox->setCurrentIndex(driverComboBox->findText(pPref->m_sAudioDriver)); } else { driverInfoLbl->setText("Select your Audio Driver"); ERRORLOG( "Unknown midi input from preferences [" + pPref->m_sAudioDriver + "]" ); } m_pMidiDriverComboBox->clear(); #ifdef H2CORE_HAVE_ALSA m_pMidiDriverComboBox->addItem( "ALSA" ); #endif #ifdef H2CORE_HAVE_PORTMIDI m_pMidiDriverComboBox->addItem( "PortMidi" ); #endif #ifdef H2CORE_HAVE_COREMIDI m_pMidiDriverComboBox->addItem( "CoreMidi" ); #endif #ifdef H2CORE_HAVE_JACK m_pMidiDriverComboBox->addItem( "JackMidi" ); #endif if( m_pMidiDriverComboBox->findText(pPref->m_sMidiDriver) > -1){ m_pMidiDriverComboBox->setCurrentIndex(m_pMidiDriverComboBox->findText(pPref->m_sMidiDriver)); } else { driverInfoLbl->setText("Select your Midi Driver"); ERRORLOG( "Unknown midi input from preferences [" + pPref->m_sMidiDriver + "]" ); } m_pIgnoreNoteOffCheckBox->setChecked( pPref->m_bMidiNoteOffIgnore ); m_pEnableMidiFeedbackCheckBox->setChecked( pPref->m_bEnableMidiFeedback ); m_pDiscardMidiMsgCheckbox->setChecked( pPref->m_bMidiDiscardNoteAfterAction ); m_pFixedMapping->setChecked( pPref->m_bMidiFixedMapping ); updateDriverInfo(); // metronome volume uint metronomeVol = (uint)( pPref->m_fMetronomeVolume * 100.0 ); metronomeVolumeSpinBox->setValue(metronomeVol); // max voices maxVoicesTxt->setValue( pPref->m_nMaxNotes ); // JACK trackOutsCheckBox->setChecked( pPref->m_bJackTrackOuts ); connect(trackOutsCheckBox, SIGNAL(toggled(bool)), this, SLOT(toggleTrackOutsCheckBox( bool ))); connectDefaultsCheckBox->setChecked( pPref->m_bJackConnectDefaults ); trackOutputComboBox->setCurrentIndex( pPref->m_nJackTrackOutputMode ); //~ JACK bufferSizeSpinBox->setValue( pPref->m_nBufferSize ); switch ( pPref->m_nSampleRate ) { case 44100: sampleRateComboBox->setCurrentIndex( 0 ); break; case 48000: sampleRateComboBox->setCurrentIndex( 1 ); break; case 88200: sampleRateComboBox->setCurrentIndex( 2 ); break; case 96000: sampleRateComboBox->setCurrentIndex( 3 ); break; default: ERRORLOG( QString("Wrong samplerate: %1").arg( pPref->m_nSampleRate ) ); } resampleComboBox->setCurrentIndex( (int) AudioEngine::get_instance()->get_sampler()->getInterpolateMode() ); // Appearance tab QString applicationFamily = pPref->getApplicationFontFamily(); int applicationPointSize = pPref->getApplicationFontPointSize(); QFont applicationFont( applicationFamily, applicationPointSize ); applicationFontLbl->setFont( applicationFont ); applicationFontLbl->setText( applicationFamily + QString(" %1").arg( applicationPointSize ) ); QString mixerFamily = pPref->getMixerFontFamily(); int mixerPointSize = pPref->getMixerFontPointSize(); QFont mixerFont( mixerFamily, mixerPointSize ); mixerFontLbl->setFont( mixerFont ); mixerFontLbl->setText( mixerFamily + QString(" %1").arg( mixerPointSize ) ); float falloffSpeed = pPref->getMixerFalloffSpeed(); if (falloffSpeed == FALLOFF_SLOW) { mixerFalloffComboBox->setCurrentIndex(0); } else if (falloffSpeed == FALLOFF_NORMAL) { mixerFalloffComboBox->setCurrentIndex(1); } else if (falloffSpeed == FALLOFF_FAST) { mixerFalloffComboBox->setCurrentIndex(2); } else { ERRORLOG( QString("PreferencesDialog: wrong mixerFalloff value = %1").arg(falloffSpeed) ); } uiLayoutComboBox->setCurrentIndex( pPref->getDefaultUILayout() ); // Style QStringList list = QStyleFactory::keys(); uint i = 0; for ( QStringList::Iterator it = list.begin(); it != list.end(); it++) { styleComboBox->addItem( *it ); //INFOLOG( "QT Stile: " + *it ); //string sStyle = (*it).latin1(); QString sStyle = (*it); if (sStyle == pPref->getQTStyle() ) { styleComboBox->setCurrentIndex( i ); } i++; } //SongEditor coloring int coloringMethod = pPref->getColoringMethod(); int coloringMethodAuxValue = pPref->getColoringMethodAuxValue(); coloringMethodCombo->clear(); coloringMethodCombo->addItem(tr("Automatic")); coloringMethodCombo->addItem(tr("Steps")); coloringMethodCombo->addItem(tr("Fixed")); coloringMethodAuxSpinBox->setMaximum(300); coloringMethodCombo->setCurrentIndex( coloringMethod ); coloringMethodAuxSpinBox->setValue( coloringMethodAuxValue ); coloringMethodCombo_currentIndexChanged( coloringMethod ); connect(coloringMethodCombo, SIGNAL(currentIndexChanged(int)), this, SLOT( coloringMethodCombo_currentIndexChanged(int) )); // midi tab midiPortChannelComboBox->setEnabled( false ); midiPortComboBox->setEnabled( false ); // list midi input ports midiPortComboBox->clear(); midiPortComboBox->addItem( "None" ); if ( Hydrogen::get_instance()->getMidiInput() ) { std::vector midiOutList = Hydrogen::get_instance()->getMidiInput()->getOutputPortList(); if ( midiOutList.size() != 0 ) { midiPortComboBox->setEnabled( true ); midiPortChannelComboBox->setEnabled( true ); } for (uint i = 0; i < midiOutList.size(); i++) { QString sPortName = midiOutList[i]; midiPortComboBox->addItem( sPortName ); if ( sPortName == pPref->m_sMidiPortName ) { midiPortComboBox->setCurrentIndex( i + 1 ); } } } // list midi output ports midiOutportComboBox->clear(); midiOutportComboBox->addItem( "None" ); if ( Hydrogen::get_instance()->getMidiOutput() ) { std::vector midiOutList = Hydrogen::get_instance()->getMidiOutput()->getInputPortList(); if ( midiOutList.size() != 0 ) { midiOutportComboBox->setEnabled( true ); midiPortChannelComboBox->setEnabled( true ); } for (uint i = 0; i < midiOutList.size(); i++) { QString sPortName = midiOutList[i]; midiOutportComboBox->addItem( sPortName ); if ( sPortName == pPref->m_sMidiOutputPortName ) { midiOutportComboBox->setCurrentIndex( i + 1 ); } } } if ( pPref->m_nMidiChannelFilter == -1 ) { midiPortChannelComboBox->setCurrentIndex( 0 ); } else { midiPortChannelComboBox->setCurrentIndex( pPref->m_nMidiChannelFilter + 1 ); } //OSC tab enableOscCheckbox->setChecked( pPref->getOscServerEnabled() ); enableOscFeedbackCheckbox->setChecked( pPref->getOscFeedbackEnabled() ); connect(enableOscCheckbox, SIGNAL(toggled(bool)), this, SLOT(toggleOscCheckBox( bool ))); incomingOscPortSpinBox->setValue( pPref->getOscServerPort() ); oscWidget->setEnabled( pPref->getOscServerEnabled() ); // General tab restoreLastUsedSongCheckbox->setChecked( pPref->isRestoreLastSongEnabled() ); restoreLastUsedPlaylistCheckbox->setChecked( pPref->isRestoreLastPlaylistEnabled() ); useRelativePlaylistPathsCheckbox->setChecked( pPref->isPlaylistUsingRelativeFilenames() ); //restore the right m_bsetlash value if ( pPref->m_brestartLash == true ){ if (pPref->m_bsetLash == false ){ pPref->m_bsetLash = true ; pPref->m_brestartLash = false; } } useLashCheckbox->setChecked( pPref->m_bsetLash ); sBcountOffset->setValue( pPref->m_countOffset ); sBstartOffset->setValue( pPref->m_startOffset ); sBmaxBars->setValue( pPref->getMaxBars() ); sBmaxLayers->setValue( pPref->getMaxLayers() ); QString pathtoRubberband = pPref->m_rubberBandCLIexecutable; rubberbandLineEdit->setText( pathtoRubberband ); #ifdef H2CORE_HAVE_RUBBERBAND pathToRubberbandExLable->hide(); rubberbandLineEdit->hide(); #endif m_bNeedDriverRestart = false; connect(m_pMidiDriverComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT( onMidiDriverComboBoxIndexChanged(int) )); } PreferencesDialog::~PreferencesDialog() { INFOLOG("~PREFERENCES_DIALOG"); } void PreferencesDialog::on_cancelBtn_clicked() { Preferences *preferencesMng = Preferences::get_instance(); preferencesMng->loadPreferences( false ); // reload old user's preferences //restore the right m_bsetlash value if ( preferencesMng->m_brestartLash == true ){ if (preferencesMng->m_bsetLash == false ){ preferencesMng->m_bsetLash = true ; preferencesMng->m_brestartLash = false; } } reject(); } void PreferencesDialog::on_okBtn_clicked() { // m_bNeedDriverRestart = true; Preferences *pPref = Preferences::get_instance(); MidiMap *mM = MidiMap::get_instance(); mM->reset_instance(); midiTable->saveMidiTable(); // Selected audio driver if (driverComboBox->currentText() == "Auto" ) { pPref->m_sAudioDriver = "Auto"; } else if (driverComboBox->currentText() == "Jack" ) { pPref->m_sAudioDriver = "Jack"; } else if (driverComboBox->currentText() == "Alsa" ) { pPref->m_sAudioDriver = "Alsa"; pPref->m_sAlsaAudioDevice = m_pAudioDeviceTxt->text(); } else if (driverComboBox->currentText() == "Oss" ) { pPref->m_sAudioDriver = "Oss"; pPref->m_sOSSDevice = m_pAudioDeviceTxt->text(); } else if (driverComboBox->currentText() == "PortAudio" ) { pPref->m_sAudioDriver = "PortAudio"; } else if (driverComboBox->currentText() == "CoreAudio" ) { pPref->m_sAudioDriver = "CoreAudio"; } else if (driverComboBox->currentText() == "PulseAudio" ) { pPref->m_sAudioDriver = "PulseAudio"; } else { ERRORLOG( "[okBtnClicked] Invalid audio driver:" + driverComboBox->currentText() ); } // JACK pPref->m_bJackConnectDefaults = connectDefaultsCheckBox->isChecked(); /* * 0: Post-Fader * 1: Pre-Fader */ if (trackOutputComboBox->currentIndex() == Preferences::POST_FADER) { pPref->m_nJackTrackOutputMode = Preferences::POST_FADER; } else { pPref->m_nJackTrackOutputMode = Preferences::PRE_FADER; } //~ JACK pPref->m_nBufferSize = bufferSizeSpinBox->value(); if ( sampleRateComboBox->currentText() == "44100" ) { pPref->m_nSampleRate = 44100; } else if ( sampleRateComboBox->currentText() == "48000" ) { pPref->m_nSampleRate = 48000; } else if ( sampleRateComboBox->currentText() == "88200" ) { pPref->m_nSampleRate = 88200; } else if ( sampleRateComboBox->currentText() == "96000" ) { pPref->m_nSampleRate = 96000; } // metronome pPref->m_fMetronomeVolume = (metronomeVolumeSpinBox->value()) / 100.0; // maxVoices pPref->m_nMaxNotes = maxVoicesTxt->value(); if ( m_pMidiDriverComboBox->currentText() == "ALSA" ) { pPref->m_sMidiDriver = "ALSA"; } else if ( m_pMidiDriverComboBox->currentText() == "PortMidi" ) { pPref->m_sMidiDriver = "PortMidi"; } else if ( m_pMidiDriverComboBox->currentText() == "CoreMidi" ) { pPref->m_sMidiDriver = "CoreMidi"; } else if ( m_pMidiDriverComboBox->currentText() == "JackMidi" ) { pPref->m_sMidiDriver = "JackMidi"; } pPref->m_bMidiNoteOffIgnore = m_pIgnoreNoteOffCheckBox->isChecked(); pPref->m_bMidiFixedMapping = m_pFixedMapping->isChecked(); pPref->m_bMidiDiscardNoteAfterAction = m_pDiscardMidiMsgCheckbox->isChecked(); pPref->m_bEnableMidiFeedback = m_pEnableMidiFeedbackCheckBox->isChecked(); // Mixer falloff QString falloffStr = mixerFalloffComboBox->currentText(); if ( falloffStr== tr("Slow") ) { pPref->setMixerFalloffSpeed(FALLOFF_SLOW); } else if ( falloffStr == tr("Normal") ) { pPref->setMixerFalloffSpeed(FALLOFF_NORMAL); } else if ( falloffStr == tr("Fast") ) { pPref->setMixerFalloffSpeed(FALLOFF_FAST); } else { ERRORLOG( "[okBtnClicked] Unknown mixerFallOffSpeed: " + falloffStr ); } QString sNewMidiPortName = midiPortComboBox->currentText(); if ( pPref->m_sMidiPortName != sNewMidiPortName ) { pPref->m_sMidiPortName = sNewMidiPortName; m_bNeedDriverRestart = true; } QString sNewMidiOutputPortName = midiOutportComboBox->currentText(); if ( pPref->m_sMidiOutputPortName != sNewMidiOutputPortName ) { pPref->m_sMidiOutputPortName = sNewMidiOutputPortName; m_bNeedDriverRestart = true; } if ( pPref->m_nMidiChannelFilter != midiPortChannelComboBox->currentIndex() - 1 ) { //m_bNeedDriverRestart = true; } pPref->m_nMidiChannelFilter = midiPortChannelComboBox->currentIndex() - 1; //OSC tab pPref->setOscServerEnabled( enableOscCheckbox->isChecked() ); pPref->setOscFeedbackEnabled( enableOscFeedbackCheckbox->isChecked() ); pPref->setOscServerPort( incomingOscPortSpinBox->value() ); // General tab pPref->setRestoreLastSongEnabled( restoreLastUsedSongCheckbox->isChecked() ); pPref->setRestoreLastPlaylistEnabled( restoreLastUsedPlaylistCheckbox->isChecked() ); pPref->setUseRelativeFilenamesForPlaylists( useRelativePlaylistPathsCheckbox->isChecked() ); pPref->m_bsetLash = useLashCheckbox->isChecked(); //restore m_bsetLash after saving pref. //path to rubberband pPref-> m_rubberBandCLIexecutable = rubberbandLineEdit->text(); //check preferences if ( pPref->m_brestartLash == true ){ pPref->m_bsetLash = true ; } pPref->m_countOffset = sBcountOffset->value(); pPref->m_startOffset = sBstartOffset->value(); pPref->setMaxBars( sBmaxBars->value() ); pPref->setMaxLayers( sBmaxLayers->value() ); Hydrogen::get_instance()->setBcOffsetAdjust(); pPref->setDefaultUILayout( uiLayoutComboBox->currentIndex() ); int coloringMethod = coloringMethodCombo->currentIndex(); pPref->setColoringMethod( coloringMethod ); switch( coloringMethod ) { case 0: //Automatic pPref->setColoringMethodAuxValue(0); break; case 1: pPref->setColoringMethodAuxValue( coloringMethodAuxSpinBox->value() ); break; case 2: pPref->setColoringMethodAuxValue( coloringMethodAuxSpinBox->value() ); break; } HydrogenApp *pH2App = HydrogenApp::get_instance(); SongEditorPanel* pSongEditorPanel = pH2App->getSongEditorPanel(); SongEditor * pSongEditor = pSongEditorPanel->getSongEditor(); pSongEditor->updateEditorandSetTrue(); pPref->savePreferences(); if (m_bNeedDriverRestart) { int res = QMessageBox::information( this, "Hydrogen", tr( "Driver restart required.\n Restart driver?"), tr("&Ok"), tr("&Cancel"), 0, 1 ); if ( res == 0 ) { Hydrogen::get_instance()->restartDrivers(); } } accept(); } void PreferencesDialog::on_driverComboBox_activated( int index ) { UNUSED( index ); QString selectedDriver = driverComboBox->currentText(); updateDriverInfo(); m_bNeedDriverRestart = true; } void PreferencesDialog::updateDriverInfo() { Preferences *pPref = Preferences::get_instance(); QString info; bool bJack_support = false; #ifdef H2CORE_HAVE_JACK bJack_support = true; #endif bool bAlsa_support = false; #ifdef H2CORE_HAVE_ALSA bAlsa_support = true; #endif bool bOss_support = false; #ifdef H2CORE_HAVE_OSS bOss_support = true; #endif bool bPortAudio_support = false; #ifdef H2CORE_HAVE_PORTAUDIO bPortAudio_support = true; #endif bool bCoreAudio_support = false; #ifdef H2CORE_HAVE_COREAUDIO bCoreAudio_support = true; #endif bool bPulseAudio_support = false; #ifdef H2CORE_HAVE_PULSEAUDIO bPulseAudio_support = true; #endif if ( driverComboBox->currentText() == "Auto" ) { info += tr("Automatic driver selection"); // Display the selected driver as well. if ( H2Core::Hydrogen::get_instance()->getAudioOutput() != nullptr ) { info += tr("
")+ H2Core::Hydrogen::get_instance()->getAudioOutput()->class_name()+ tr(" selected"); } m_pAudioDeviceTxt->setEnabled(false); m_pAudioDeviceTxt->setText( "" ); bufferSizeSpinBox->setEnabled( false ); sampleRateComboBox->setEnabled( false ); trackOutputComboBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled( false ); } else if ( driverComboBox->currentText() == "OSS" ) { // OSS info += tr("Open Sound System
Simple audio driver [/dev/dsp]"); if ( !bOss_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(true); m_pAudioDeviceTxt->setText( pPref->m_sOSSDevice ); bufferSizeSpinBox->setEnabled(true); sampleRateComboBox->setEnabled(true); trackOutputComboBox->setEnabled( false ); trackOutsCheckBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled(false); } else if ( driverComboBox->currentText() == "Jack" ) { // JACK info += tr("Jack Audio Connection Kit Driver
Low latency audio driver"); if ( !bJack_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(false); m_pAudioDeviceTxt->setText( "" ); bufferSizeSpinBox->setEnabled(false); sampleRateComboBox->setEnabled(false); trackOutputComboBox->setEnabled( true ); connectDefaultsCheckBox->setEnabled(true); trackOutsCheckBox->setEnabled( true ); } else if ( driverComboBox->currentText() == "Alsa" ) { // ALSA info += tr("ALSA Driver
"); if ( !bAlsa_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(true); m_pAudioDeviceTxt->setText( pPref->m_sAlsaAudioDevice ); bufferSizeSpinBox->setEnabled(true); sampleRateComboBox->setEnabled(true); trackOutputComboBox->setEnabled( false ); trackOutsCheckBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled(false); } else if ( driverComboBox->currentText() == "PortAudio" ) { info += tr( "PortAudio Driver
" ); if ( !bPortAudio_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(false); m_pAudioDeviceTxt->setText( "" ); bufferSizeSpinBox->setEnabled(true); sampleRateComboBox->setEnabled(true); trackOutsCheckBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled(false); } else if ( driverComboBox->currentText() == "CoreAudio" ) { info += tr( "CoreAudio Driver
" ); if ( !bCoreAudio_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(false); m_pAudioDeviceTxt->setText( "" ); bufferSizeSpinBox->setEnabled(true); sampleRateComboBox->setEnabled(true); trackOutputComboBox->setEnabled( false ); trackOutsCheckBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled(false); } else if ( driverComboBox->currentText() == "PulseAudio" ) { info += tr("PulseAudio Driver
"); if ( !bPulseAudio_support ) { info += tr("
Not compiled"); } m_pAudioDeviceTxt->setEnabled(false); m_pAudioDeviceTxt->setText(""); bufferSizeSpinBox->setEnabled(true); sampleRateComboBox->setEnabled(true); trackOutputComboBox->setEnabled( false ); trackOutsCheckBox->setEnabled( false ); connectDefaultsCheckBox->setEnabled(false); } else { QString selectedDriver = driverComboBox->currentText(); ERRORLOG( "Unknown driver = " + selectedDriver ); } metronomeVolumeSpinBox->setEnabled(true); bufferSizeSpinBox->setValue( pPref->m_nBufferSize ); driverInfoLbl->setText(info); } void PreferencesDialog::on_selectApplicationFontBtn_clicked() { Preferences *preferencesMng = Preferences::get_instance(); QString family = preferencesMng->getApplicationFontFamily(); int pointSize = preferencesMng->getApplicationFontPointSize(); bool ok; QFont font = QFontDialog::getFont( &ok, QFont( family, pointSize ), this ); if ( ok ) { // font is set to the font the user selected family = font.family(); pointSize = font.pointSize(); QString familyStr = family; preferencesMng->setApplicationFontFamily(familyStr); preferencesMng->setApplicationFontPointSize(pointSize); } else { // the user cancelled the dialog; font is set to the initial // value, in this case Times, 12. } QFont newFont(family, pointSize); applicationFontLbl->setFont(newFont); applicationFontLbl->setText(family + QString(" %1").arg(pointSize)); } void PreferencesDialog::on_bufferSizeSpinBox_valueChanged( int i ) { UNUSED( i ); m_bNeedDriverRestart = true; } void PreferencesDialog::on_sampleRateComboBox_editTextChanged( const QString& ) { m_bNeedDriverRestart = true; } void PreferencesDialog::on_restartDriverBtn_clicked() { Hydrogen::get_instance()->restartDrivers(); m_bNeedDriverRestart = false; } void PreferencesDialog::on_selectMixerFontBtn_clicked() { Preferences *preferencesMng = Preferences::get_instance(); QString family = preferencesMng->getMixerFontFamily(); int pointSize = preferencesMng->getMixerFontPointSize(); bool ok; QFont font = QFontDialog::getFont( &ok, QFont( family, pointSize ), this ); if ( ok ) { // font is set to the font the user selected family = font.family(); pointSize = font.pointSize(); QString familyStr = family; preferencesMng->setMixerFontFamily(familyStr); preferencesMng->setMixerFontPointSize(pointSize); } QFont newFont(family, pointSize); mixerFontLbl->setFont(newFont); mixerFontLbl->setText(family + QString(" %1").arg(pointSize)); } void PreferencesDialog::on_midiPortComboBox_activated( int index ) { UNUSED( index ); m_bNeedDriverRestart = true; } void PreferencesDialog::on_midiOutportComboBox_activated( int index ) { UNUSED( index ); m_bNeedDriverRestart = true; } void PreferencesDialog::on_styleComboBox_activated( int index ) { UNUSED( index ); QApplication *pQApp = (HydrogenApp::get_instance())->getMainForm()->m_pQApp; QString sStyle = styleComboBox->currentText(); pQApp->setStyle( sStyle ); Preferences *pPref = Preferences::get_instance(); pPref->setQTStyle( sStyle ); } void PreferencesDialog::on_useLashCheckbox_clicked() { if ( useLashCheckbox->isChecked() ){ Preferences::get_instance()->m_brestartLash = true; } else { Preferences::get_instance()->m_bsetLash = false ; } QMessageBox::information ( this, "Hydrogen", tr ( "Please restart hydrogen to enable/disable LASH support" ) ); } void PreferencesDialog::coloringMethodCombo_currentIndexChanged (int index) { switch(index) { case 0: coloringMethodAuxLabel->setText( "" ); coloringMethodAuxSpinBox->hide(); break; case 1: coloringMethodAuxLabel->setText( tr("Number of steps") ); coloringMethodAuxSpinBox->setMinimum(1); coloringMethodAuxSpinBox->show(); break; case 2: coloringMethodAuxLabel->setText( tr("Color (Hue value)") ); coloringMethodAuxSpinBox->setMinimum(0); coloringMethodAuxSpinBox->show(); break; } } void PreferencesDialog::on_resampleComboBox_currentIndexChanged ( int index ) { switch ( index ){ case 0: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::LINEAR ); break; case 1: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::COSINE ); break; case 2: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::THIRD ); break; case 3: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::CUBIC ); break; case 4: AudioEngine::get_instance()->get_sampler()->setInterpolateMode( Sampler::HERMITE ); break; } } void PreferencesDialog::onMidiDriverComboBoxIndexChanged ( int index ) { m_bNeedDriverRestart = true; } void PreferencesDialog::toggleTrackOutsCheckBox(bool toggled) { Preferences::get_instance()->m_bJackTrackOuts = toggled; m_bNeedDriverRestart = true; } void PreferencesDialog::toggleOscCheckBox(bool toggled) { oscWidget->setEnabled( toggled ); } hydrogen-1.0.0-rc1/src/gui/src/PreferencesDialog.h000066400000000000000000000040741366722712400217250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PREFERENCES_DIALOG_H #define PREFERENCES_DIALOG_H #include "ui_PreferencesDialog_UI.h" #include /// /// Preferences Dialog /// class PreferencesDialog : public QDialog, private Ui_PreferencesDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: PreferencesDialog( QWidget* parent ); ~PreferencesDialog(); private slots: void on_okBtn_clicked(); void on_cancelBtn_clicked(); void on_selectApplicationFontBtn_clicked(); void on_selectMixerFontBtn_clicked(); void on_restartDriverBtn_clicked(); void on_driverComboBox_activated( int index ); void on_bufferSizeSpinBox_valueChanged( int i ); void on_resampleComboBox_currentIndexChanged ( int index ); void on_sampleRateComboBox_editTextChanged( const QString& text ); void on_midiPortComboBox_activated( int index ); void on_midiOutportComboBox_activated( int index ); void on_styleComboBox_activated( int index ); void on_useLashCheckbox_clicked(); void onMidiDriverComboBoxIndexChanged( int index ); void toggleTrackOutsCheckBox(bool toggled); void toggleOscCheckBox(bool toggled); void coloringMethodCombo_currentIndexChanged (int index); private: bool m_bNeedDriverRestart; void updateDriverInfo(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/PreferencesDialog_UI.ui000066400000000000000000001074001366722712400225050ustar00rootroot00000000000000 PreferencesDialog_UI 0 0 664 555 Form1 0 0 QTabWidget::Rounded 0 &General 0 22 &Reopen last used song Alt+R 0 22 &Reopen last used playlist Alt+R Use relative paths for playlist Use lash Qt::Vertical 20 114 first step, adjust timing mismatch between controller/keyboard trigger latency and computed bpm -200 200 Beat counter drift compensation in 1/10 ms second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup -500 500 Beat counter start offset in ms second step, adjust offset between last controller/keyboard trigger and the deferred sequencer startup 1 800 Maximum number of instrument layers 16 8192 Maximum number of layers (requires restart of Hydrogen) Maximum number of bars Path to the Rubberband command-line utility Qt::Horizontal 40 20 181 0 Audio &System Restart output 0 22 100 5000 100 1024 0 22 Sample rate Device 0 22 Buffer size 0 0 0 44100 48000 88200 96000 0 Post-Fader Pre-Fader 0 22 Track output 6 Connect to &Default Output Pair Alt+D Create per-instrument outputs Alt+D Qt::Vertical 331 13 0 22 1 512 false 0 22 1 100 0 22 Metronome volume Polyphony Interpolate resampling Linear Cosine Third Cubic Hermite Qt::Vertical 331 13 Audio output details ### Qt::AlignTop true &Midi System Midi driver 0 22 Input 0 0 Output 0 22 Channel 0 22 All 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Ignore note-off Enable midi feedback Discard midi messages after action has been triggered Use output note as input note &OSC 10 30 441 121 0 30 441 41 Incoming port Qt::Horizontal 40 20 <html><head/><body><p>Port which will be used to receive incoming OSC messages</p></body></html> 20000 9000 0 10 441 25 0 22 Enable OSC &feedback Alt+R 10 10 441 22 0 22 &Enable OSC support Alt+R &Appearance 0 22 QFrame::Box Application font Qt::AlignCenter Style 0 22 Select font 0 22 Select font 0 22 Meters falloff speed 0 22 Slow Normal Fast 0 22 QFrame::Box 0 Mixer font Qt::AlignCenter 0 0 22 QFrame::Box 0 0 Default interface layout Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 22 Single pane Tabbed TextLabel Coloring method for Song Editor elements <html><head/><body><p><span style=" font-style:italic;">After changing a font or the interface layout the application must be restarted.</span></p></body></html> true Qt::Vertical 20 169 Qt::Horizontal QSizePolicy::Expanding 184 16 0 0 0 22 &Cancel Alt+C 0 0 0 22 &OK Alt+O true false Qt::Horizontal QSizePolicy::Expanding 183 16 MidiTable QTableWidget
../src/Widgets/MidiTable.h
hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/000077500000000000000000000000001366722712400205565ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/DetailWaveDisplay.cpp000066400000000000000000000102711366722712400246360ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include "DetailWaveDisplay.h" #include "../Skin.h" const char* DetailWaveDisplay::__class_name = "DetailWaveDisplay"; DetailWaveDisplay::DetailWaveDisplay(QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) , m_sSampleName( "" ) { // setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); int w = 180; int h = 265; resize( w, h ); bool ok = m_background.load( Skin::getImagePath() + "/waveDisplay/detailsamplewavedisplay.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } m_pNormalImageDetailFrames = 180; m_pDetailSamplePosition = 0; m_pZoomFactor = 1; } DetailWaveDisplay::~DetailWaveDisplay() { //INFOLOG( "DESTROY" ); delete[] m_pPeakDatal; delete[] m_pPeakDatar; } void DetailWaveDisplay::setDetailSamplePosition( unsigned posi, float zoomfactor, QString type) { m_pDetailSamplePosition = posi ; m_pZoomFactor = zoomfactor; m_pType = type; update(); } void DetailWaveDisplay::paintEvent(QPaintEvent *ev) { QPainter painter( this ); painter.setRenderHint( QPainter::HighQualityAntialiasing ); painter.drawPixmap( ev->rect(), m_background, ev->rect() ); painter.setPen( QColor( 230, 230, 230 ) ); int VCenterl = height() / 4; int VCenterr = height() / 4 + height() / 2; // int imagedetailframes = m_pnormalimagedetailframes / m_pzoomFactor; int startpos = m_pDetailSamplePosition - m_pNormalImageDetailFrames / 2 ; for ( int x = 0; x < width() ; x++ ) { if ( (startpos) > 0 ){ painter.drawLine( x, (-m_pPeakDatal[startpos -1] *m_pZoomFactor) +VCenterl, x, (-m_pPeakDatal[startpos ] *m_pZoomFactor)+VCenterl ); painter.drawLine( x, (-m_pPeakDatar[startpos -1] *m_pZoomFactor) +VCenterr, x, (-m_pPeakDatar[startpos ] *m_pZoomFactor)+VCenterr ); //ERRORLOG( QString("startpos: %1").arg(startpos) ) } else { painter.drawLine( x, 0 +VCenterl, x, 0+VCenterl ); painter.drawLine( x, 0 +VCenterr, x, 0+VCenterr ); } startpos++; } painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::DotLine ) ); painter.drawLine( 0, VCenterl, width(),VCenterl ); painter.drawLine( 0, VCenterr, width(),VCenterr ); QColor _color; if ( m_pType == "Start" ) { _color = QColor( 32, 173, 0 ); } else if ( m_pType == "Loop" ) { _color = QColor( 93, 170, 254 ); } else if ( m_pType == "End" ) { _color = QColor( 217, 68, 0 ); } else { _color = QColor( 255, 255, 255 ); } painter.setPen( QPen( _color, 1, Qt::SolidLine ) ); painter.drawLine( 90, 0, 90,265 ); } void DetailWaveDisplay::updateDisplay( QString filename ) { Sample *pNewSample = Sample::load( filename ); if ( pNewSample ) { int mSampleLength = pNewSample->get_frames(); m_pPeakDatal = new int[ mSampleLength + m_pNormalImageDetailFrames /2 ]; m_pPeakDatar = new int[ mSampleLength + m_pNormalImageDetailFrames /2 ]; for ( int i = 0 ; i < mSampleLength + m_pNormalImageDetailFrames /2 ; i++){ m_pPeakDatal[ i ] = 0; m_pPeakDatar[ i ] = 0; } float fGain = height() / 4.0 * 1.0; float *pSampleDatal = pNewSample->get_data_l(); float *pSampleDatar = pNewSample->get_data_r(); for ( int i = 0; i < mSampleLength; i++ ){ m_pPeakDatal[ i ] = static_cast( pSampleDatal[ i ] * fGain ); m_pPeakDatar[ i ] = static_cast( pSampleDatar[ i ] * fGain ); } } delete pNewSample; } hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/DetailWaveDisplay.h000066400000000000000000000030731366722712400243050ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 DETAIL_WAVE_DISPLAY #define DETAIL_WAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include namespace H2Core { class Sample; } class DetailWaveDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: DetailWaveDisplay(QWidget* pParent); ~DetailWaveDisplay(); void updateDisplay( QString filename ); void paintEvent(QPaintEvent *ev); void setDetailSamplePosition( unsigned posi, float zoomfactor, QString type); private: QPixmap m_background; QString m_sSampleName; int *m_pPeakDatal; int *m_pPeakDatar; int m_pDetailSamplePosition; int m_pNormalImageDetailFrames; float m_pZoomFactor; QString m_pType; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/MainSampleWaveDisplay.cpp000066400000000000000000000170621366722712400254670ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "HydrogenApp.h" #include "SampleEditor.h" using namespace H2Core; #include "MainSampleWaveDisplay.h" #include "../Skin.h" const char* MainSampleWaveDisplay::__class_name = "MainSampleWaveDisplay"; MainSampleWaveDisplay::MainSampleWaveDisplay(QWidget* pParent) : QWidget( pParent ) , Object( __class_name ) { // setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); int w = 624; int h = 265; resize( w, h ); bool ok = m_background.load( Skin::getImagePath() + "/waveDisplay/mainsamplewavedisplay.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } m_pPeakDatal = new int[ w ]; m_pPeakDatar = new int[ w ]; m_pStartFramePosition = 25; m_pLoopFramePosition = 25; m_pEndFramePosition = width() -25; m_pmove = false; m_plocator = -1; m_pupdateposi = false; __startsliderismoved = false; __loopsliderismoved = false; __endsliderismoved = false; } MainSampleWaveDisplay::~MainSampleWaveDisplay() { //INFOLOG( "DESTROY" ); delete[] m_pPeakDatal; delete[] m_pPeakDatar; } void MainSampleWaveDisplay::paintLocatorEvent( int pos, bool updateposi) { m_pupdateposi = updateposi; if ( !updateposi ){ m_plocator = -1; }else { m_plocator = pos; } update(); } void MainSampleWaveDisplay::paintEvent(QPaintEvent *ev) { QPainter painter( this ); painter.setRenderHint( QPainter::HighQualityAntialiasing ); bool issmaller = false; painter.drawPixmap( ev->rect(), m_background, ev->rect() ); painter.setPen( QColor( 230, 230, 230 ) ); int VCenterl = height() / 4; int VCenterr = height() / 4 + height() / 2; if ( width() >= m_pSampleLength ) issmaller = true; for ( int x = 25; x < width() -25; x++ ) { if ( !issmaller || x <= m_pSampleLength){ painter.drawLine( x, -m_pPeakDatal[x -25] +VCenterl, x, -m_pPeakDatal[x -24] +VCenterl ); painter.drawLine( x, -m_pPeakDatar[x -25] +VCenterr, x, -m_pPeakDatar[x -24] +VCenterr ); }else { painter.drawLine( x, 0 +VCenterl, x, 0 +VCenterl ); painter.drawLine( x, 0 +VCenterr, x, 0 +VCenterr ); } } painter.setCompositionMode(QPainter::CompositionMode_SourceOver); painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::DotLine ) ); painter.drawLine( 23, 4, 23, height() -4 ); painter.drawLine( width() -23, 4,width() -23, height() -4 ); painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::SolidLine ) ); painter.drawLine( m_plocator, 4, m_plocator, height() -4); painter.drawLine( 0, VCenterl, width(),VCenterl ); painter.drawLine( 0, VCenterr, width(),VCenterr ); QFont font; font.setWeight( 63 ); painter.setFont( font ); //start frame pointer painter.setPen( QColor( 32, 173, 0, 200 ) ); painter.drawLine( m_pStartFramePosition, 4, m_pStartFramePosition, height() -4 ); painter.drawText( m_pStartFramePosition -10, 250, 10,20, Qt::AlignRight, "S" ); //endframe pointer painter.setPen( QColor( 217, 68, 0, 200 ) ); painter.drawLine( m_pEndFramePosition, 4, m_pEndFramePosition, height() -4 ); painter.drawText( m_pEndFramePosition -10, 123, 10, 20, Qt::AlignRight, "E" ); //loopframe pointer painter.setPen( QColor( 93, 170, 254, 200 ) ); painter.drawLine( m_pLoopFramePosition, 4, m_pLoopFramePosition, height() -4 ); painter.drawText( m_pLoopFramePosition , 0, 10, 20, Qt::AlignLeft, "L" ); } void MainSampleWaveDisplay::updateDisplayPointer() { update(); } void MainSampleWaveDisplay::updateDisplay( const QString& filename ) { Sample *pNewSample = Sample::load( filename ); if ( pNewSample ) { int nSampleLength = pNewSample->get_frames(); m_pSampleLength = nSampleLength; float nScaleFactor = nSampleLength / (width() -50); if ( nScaleFactor < 1 ){ nScaleFactor = 1; } float fGain = height() / 4.0 * 1.0; float *pSampleDatal = pNewSample->get_data_l(); float *pSampleDatar = pNewSample->get_data_r(); unsigned nSamplePos = 0; int nVall = 0; int nValr = 0; int newVall = 0; int newValr = 0; for ( int i = 0; i < width(); ++i ){ for ( int j = 0; j < nScaleFactor; ++j ) { if ( j < nSampleLength && nSamplePos < nSampleLength) { if ( pSampleDatal[ nSamplePos ] && pSampleDatar[ nSamplePos ] ){ newVall = static_cast( pSampleDatal[ nSamplePos ] * fGain ); newValr = static_cast( pSampleDatar[ nSamplePos ] * fGain ); nVall = newVall; nValr = newValr; }else { nVall = 0; nValr = 0; } } ++nSamplePos; } m_pPeakDatal[ i ] = nVall; m_pPeakDatar[ i ] = nValr; } } delete pNewSample; pNewSample = nullptr; update(); } void MainSampleWaveDisplay::mouseMoveEvent(QMouseEvent *ev) { testPosition( ev ); update(); } void MainSampleWaveDisplay::mousePressEvent(QMouseEvent *ev) { testPosition( ev ); update(); } void MainSampleWaveDisplay::testPosition( QMouseEvent *ev ) { assert(ev); //startframepointer if (ev->y()>=200 ) { m_pStartFramePosition = ev->x() ; __startsliderismoved = true; if ( m_pStartFramePosition > m_pLoopFramePosition ){ m_pLoopFramePosition = m_pStartFramePosition; __loopsliderismoved = true; } if ( m_pStartFramePosition > m_pEndFramePosition ){ m_pEndFramePosition = m_pStartFramePosition; __endsliderismoved = true; } // update(); } //loopframeposition else if (ev->y()<=65 ) { m_pLoopFramePosition = ev->x() ; __loopsliderismoved = true; if ( m_pLoopFramePosition < m_pStartFramePosition ){ m_pStartFramePosition = m_pLoopFramePosition; __startsliderismoved = true; } if ( m_pLoopFramePosition > m_pEndFramePosition ){ m_pEndFramePosition = m_pLoopFramePosition; __endsliderismoved = true; } // update(); } //endframeposition else if ( ev->y() >= 86 && ev->y() <= 179 ) { m_pEndFramePosition = ev->x() ; __endsliderismoved = true; if ( m_pEndFramePosition < m_pLoopFramePosition ){ m_pLoopFramePosition = m_pEndFramePosition; __loopsliderismoved = true; } if ( m_pEndFramePosition < m_pStartFramePosition ){ m_pStartFramePosition = m_pEndFramePosition; __startsliderismoved = true; } // update(); } if ( ( m_pStartFramePosition ) >= width() -25 ) m_pStartFramePosition =width() -25; if ( ( m_pLoopFramePosition ) >= width() -25 ) m_pLoopFramePosition =width() -25; if ( ( m_pEndFramePosition ) >= width() -25 ) m_pEndFramePosition =width() -25; if ( ( m_pStartFramePosition ) <= 25 ) m_pStartFramePosition = 25; if ( ( m_pLoopFramePosition ) <= 25 ) m_pLoopFramePosition = 25; if ( ( m_pEndFramePosition ) <= 25 ) m_pEndFramePosition = 25; } void MainSampleWaveDisplay::mouseReleaseEvent(QMouseEvent *ev) { update(); bool test = HydrogenApp::get_instance()->getSampleEditor()->returnAllMainWaveDisplayValues(); if (test){ __startsliderismoved = false; __loopsliderismoved = false; __endsliderismoved = false; } } hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/MainSampleWaveDisplay.h000066400000000000000000000036761366722712400251420ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MAIN_SAMPLE_WAVE_DISPLAY #define MAIN_SAMPLE_WAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include #include "SampleEditor.h" class SampleEditor; class MainSampleWaveDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: MainSampleWaveDisplay(QWidget* pParent); ~MainSampleWaveDisplay(); void updateDisplay( const QString& filename ); void updateDisplayPointer(); void paintLocatorEvent( int pos, bool last_event); void paintEvent(QPaintEvent *ev); int m_pStartFramePosition; int m_pLoopFramePosition; int m_pEndFramePosition; bool m_pmove; void testPositionFromSampleeditor(); bool __startsliderismoved; bool __loopsliderismoved; bool __endsliderismoved; private: QPixmap m_background; int *m_pPeakDatal; int *m_pPeakDatar; virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); void testPosition( QMouseEvent *ev ); int m_pSampleLength; int m_plocator; bool m_pupdateposi; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/SampleEditor.cpp000066400000000000000000000705261366722712400236640ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SampleEditor.h" #include "../HydrogenApp.h" #include "../InstrumentEditor/InstrumentEditor.h" #include "../InstrumentEditor/InstrumentEditorPanel.h" #include "../Widgets/Button.h" #include "MainSampleWaveDisplay.h" #include "DetailWaveDisplay.h" #include "TargetWaveDisplay.h" #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace H2Core; const char* SampleEditor::__class_name = "SampleEditor"; SampleEditor::SampleEditor ( QWidget* pParent, int nSelectedComponent, int nSelectedLayer, QString mSamplefilename ) : QDialog ( pParent ) , Object ( __class_name ) { setupUi ( this ); INFOLOG ( "INIT" ); m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateMainsamplePositionRuler())); m_pTargetDisplayTimer = new QTimer(this); connect(m_pTargetDisplayTimer, SIGNAL(timeout()), this, SLOT(updateTargetsamplePositionRuler())); m_pSampleEditorStatus = true; m_pSampleFromFile = nullptr; m_pSelectedLayer = nSelectedLayer; m_pSelectedComponent = nSelectedComponent; m_samplename = mSamplefilename; m_pZoomfactor = 1; m_pDetailFrame = 0; m_pLineColor = "default"; m_pOnewayStart = false; m_pOnewayLoop = false; m_pOnewayEnd = false; m_pslframes = 0; m_pPositionsRulerPath = nullptr; m_pPlayButton = false; m_pRatio = 1.0f; __rubberband.c_settings = 4; QString newfilename = mSamplefilename.section( '/', -1 ); //init Displays m_pMainSampleWaveDisplay = new MainSampleWaveDisplay( mainSampleview ); m_pSampleAdjustView = new DetailWaveDisplay( mainSampleAdjustView ); m_pTargetSampleView = new TargetWaveDisplay( targetSampleView ); setWindowTitle ( QString( "SampleEditor " + newfilename) ); setFixedSize ( width(), height() ); setModal ( true ); //this new sample give us the not changed real samplelength m_pSampleFromFile = Sample::load( mSamplefilename ); if (!m_pSampleFromFile) reject(); unsigned slframes = m_pSampleFromFile->get_frames(); LoopCountSpinBox->setRange(0, 20000 ); StartFrameSpinBox->setRange(0, slframes ); LoopFrameSpinBox->setRange(0, slframes ); EndFrameSpinBox->setRange(0, slframes ); EndFrameSpinBox->setValue( slframes ); rubberbandCsettingscomboBox->setCurrentIndex( 4 ); rubberComboBox->setCurrentIndex( 0 ); __rubberband.use = false; __rubberband.divider = 1.0; openDisplays(); getAllFrameInfos(); #ifndef H2CORE_HAVE_RUBBERBAND if ( QFile( Preferences::get_instance()->m_rubberBandCLIexecutable ).exists() == false ){ RubberbandCframe->setDisabled ( true ); __rubberband.use = false; m_pSampleEditorStatus = true; } #else RubberbandCframe->setDisabled ( false ); m_pSampleEditorStatus = true; #endif __rubberband.pitch = 0.0; } SampleEditor::~SampleEditor() { m_pMainSampleWaveDisplay->close(); delete m_pMainSampleWaveDisplay; m_pMainSampleWaveDisplay = nullptr; m_pSampleAdjustView->close(); delete m_pSampleAdjustView; m_pSampleAdjustView = nullptr; m_pTargetSampleView->close(); delete m_pTargetSampleView; m_pTargetSampleView = nullptr; delete m_pSampleFromFile; m_pSampleFromFile = nullptr; INFOLOG ( "DESTROY" ); } void SampleEditor::closeEvent(QCloseEvent *event) { if ( !m_pSampleEditorStatus ) { int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. These changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( err == 0 ) { m_pSampleEditorStatus = true; accept(); } else { event->ignore(); return; } } else { accept(); } } void SampleEditor::getAllFrameInfos() { H2Core::Instrument *pInstrument = nullptr; Sample* pSample = nullptr; Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != nullptr) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= static_cast(pInstrList->size()) ) { nInstr = -1; } if (nInstr == -1) { pInstrument = nullptr; } else { pInstrument = pInstrList->get( nInstr ); //INFOLOG( "new instr: " + pInstrument->m_sName ); } } assert( pInstrument ); H2Core::InstrumentLayer *pLayer = pInstrument->get_component(0)->get_layer( m_pSelectedLayer ); if ( pLayer ) { pSample = pLayer->get_sample(); } assert( pSample ); //this values are needed if we restore a sample from disk if a new song with sample changes will load m_sample_is_modified = pSample->get_is_modified(); m_pSamplerate = pSample->get_sample_rate(); __loops = pSample->get_loops(); __rubberband = pSample->get_rubberband(); if ( pSample->get_velocity_envelope()->size()==0 ) { m_pTargetSampleView->get_velocity()->clear(); m_pTargetSampleView->get_velocity()->push_back( std::make_unique( 0, 0 ) ); m_pTargetSampleView->get_velocity()->push_back( std::make_unique( m_pTargetSampleView->width(), 0 ) ); } else { m_pTargetSampleView->get_velocity()->clear(); for(auto& pEnvPtr : *pSample->get_velocity_envelope() ){ m_pTargetSampleView->get_velocity()->emplace_back( std::make_unique( pEnvPtr->value, pEnvPtr->frame ) ); } } if ( pSample->get_pan_envelope()->size()==0 ) { m_pTargetSampleView->get_pan()->clear(); m_pTargetSampleView->get_pan()->push_back( std::make_unique( 0, m_pTargetSampleView->height()/2 ) ); m_pTargetSampleView->get_pan()->push_back( std::make_unique( m_pTargetSampleView->width(), m_pTargetSampleView->height()/2 ) ); } else { for(auto& pEnvPtr : *pSample->get_pan_envelope() ){ m_pTargetSampleView->get_pan()->emplace_back( std::make_unique( pEnvPtr.get() ) ); } } if (m_sample_is_modified) { __loops.end_frame = pSample->get_loops().end_frame; if ( __loops.mode == Sample::Loops::FORWARD ) { ProcessingTypeComboBox->setCurrentIndex ( 0 ); } if ( __loops.mode == Sample::Loops::REVERSE ) { ProcessingTypeComboBox->setCurrentIndex ( 1 ); } if ( __loops.mode == Sample::Loops::PINGPONG ) { ProcessingTypeComboBox->setCurrentIndex ( 2 ); } StartFrameSpinBox->setValue( __loops.start_frame ); LoopFrameSpinBox->setValue( __loops.loop_frame ); EndFrameSpinBox->setValue( __loops.end_frame ); LoopCountSpinBox->setValue( __loops.count ); m_pMainSampleWaveDisplay->m_pStartFramePosition = __loops.start_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pMainSampleWaveDisplay->m_pLoopFramePosition = __loops.loop_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pMainSampleWaveDisplay->m_pEndFramePosition = __loops.end_frame / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); if( !__rubberband.use ) { rubberComboBox->setCurrentIndex( 0 ); } rubberbandCsettingscomboBox->setCurrentIndex( __rubberband.c_settings ); if( !__rubberband.use ) { rubberbandCsettingscomboBox->setCurrentIndex( 4 ); } pitchdoubleSpinBox->setValue( __rubberband.pitch ); if( !__rubberband.use ) { pitchdoubleSpinBox->setValue( 0.0 ); } if( __rubberband.divider == 1.0/64.0) { rubberComboBox->setCurrentIndex( 1 ); } else if( __rubberband.divider == 1.0/32.0) { rubberComboBox->setCurrentIndex( 2 ); } else if( __rubberband.divider == 1.0/16.0) { rubberComboBox->setCurrentIndex( 3 ); } else if( __rubberband.divider == 1.0/8.0) { rubberComboBox->setCurrentIndex( 4 ); } else if( __rubberband.divider == 1.0/4.0) { rubberComboBox->setCurrentIndex( 5 ); } else if( __rubberband.divider == 1.0/2.0) { rubberComboBox->setCurrentIndex( 6 ); } else if( __rubberband.use && ( __rubberband.divider >= 1.0 ) ) { rubberComboBox->setCurrentIndex( (int)(__rubberband.divider + 6) ); } setSamplelengthFrames(); checkRatioSettings(); } m_pTargetSampleView->updateDisplay( pLayer ); connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) ); connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) ); connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) ); connect( LoopCountSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopCountSpinBox( int ) ) ); connect( ProcessingTypeComboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedProcessingTypeComboBox( const QString ) ) ); connect( rubberComboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedrubberComboBox( const QString ) ) ); connect( rubberbandCsettingscomboBox, SIGNAL( currentIndexChanged ( const QString ) ), this, SLOT( valueChangedrubberbandCsettingscomboBox( const QString ) ) ); connect( pitchdoubleSpinBox, SIGNAL ( valueChanged( double ) ), this, SLOT( valueChangedpitchdoubleSpinBox( double ) ) ); } void SampleEditor::getAllLocalFrameInfos() { __loops.start_frame = StartFrameSpinBox->value(); __loops.loop_frame = LoopFrameSpinBox->value(); __loops.count = LoopCountSpinBox->value(); __loops.end_frame = EndFrameSpinBox->value(); } void SampleEditor::openDisplays() { H2Core::Instrument *pInstrument = nullptr; Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != nullptr) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= static_cast(pInstrList->size()) ) { nInstr = -1; } if (nInstr == -1) { pInstrument = nullptr; } else { pInstrument = pInstrList->get( nInstr ); //INFOLOG( "new instr: " + pInstrument->m_sName ); } } // wavedisplays m_divider = m_pSampleFromFile->get_frames() / 574.0F; m_pMainSampleWaveDisplay->updateDisplay( m_samplename ); m_pMainSampleWaveDisplay->move( 1, 1 ); m_pSampleAdjustView->updateDisplay( m_samplename ); m_pSampleAdjustView->move( 1, 1 ); m_pTargetSampleView->move( 1, 1 ); } void SampleEditor::on_ClosePushButton_clicked() { if ( !m_pSampleEditorStatus ){ int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. These changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( err == 0 ){ m_pSampleEditorStatus = true; accept(); }else { return; } }else { accept(); } } void SampleEditor::on_PrevChangesPushButton_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); getAllLocalFrameInfos(); createNewLayer(); m_pSampleEditorStatus = true; QApplication::restoreOverrideCursor(); } bool SampleEditor::getCloseQuestion() { bool close = false; int err = QMessageBox::information( this, "Hydrogen", tr( "Close dialog! maybe there is some unsaved work on sample.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( err == 0 ) close = true; return close; } void SampleEditor::createNewLayer() { if ( !m_pSampleEditorStatus ){ Sample *pEditSample = Sample::load( m_samplename, __loops, __rubberband, *m_pTargetSampleView->get_velocity(), *m_pTargetSampleView->get_pan() ); if( pEditSample == nullptr ){ return; } AudioEngine::get_instance()->lock( RIGHT_HERE ); H2Core::Instrument *pInstrument = nullptr; Song *pSong = Hydrogen::get_instance()->getSong(); if (pSong != nullptr) { InstrumentList *pInstrList = pSong->get_instrument_list(); int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber(); if ( nInstr >= static_cast(pInstrList->size()) ) { nInstr = -1; } if (nInstr == -1) { pInstrument = nullptr; } else { pInstrument = pInstrList->get( nInstr ); } } H2Core::InstrumentLayer *pLayer = pInstrument->get_component(0)->get_layer( m_pSelectedLayer ); // insert new sample from newInstrument pLayer->set_sample( pEditSample ); AudioEngine::get_instance()->unlock(); m_pTargetSampleView->updateDisplay( pLayer ); } } void SampleEditor::mouseReleaseEvent(QMouseEvent *ev) { } bool SampleEditor::returnAllMainWaveDisplayValues() { testpTimer(); // QMessageBox::information ( this, "Hydrogen", tr ( "jep %1" ).arg(m_pSample->get_frames())); m_sample_is_modified = true; if( m_pMainSampleWaveDisplay->__startsliderismoved ) __loops.start_frame = m_pMainSampleWaveDisplay->m_pStartFramePosition * m_divider - 25 * m_divider; if( m_pMainSampleWaveDisplay->__loopsliderismoved ) __loops.loop_frame = m_pMainSampleWaveDisplay->m_pLoopFramePosition * m_divider - 25 * m_divider; if( m_pMainSampleWaveDisplay->__endsliderismoved ) __loops.end_frame = m_pMainSampleWaveDisplay->m_pEndFramePosition * m_divider - 25 * m_divider ; StartFrameSpinBox->setValue( __loops.start_frame ); LoopFrameSpinBox->setValue( __loops.loop_frame ); EndFrameSpinBox->setValue( __loops.end_frame ); m_pOnewayStart = true; m_pOnewayLoop = true; m_pOnewayEnd = true; setSamplelengthFrames(); return true; } void SampleEditor::returnAllTargetDisplayValues() { setSamplelengthFrames(); m_sample_is_modified = true; } void SampleEditor::setTrue() { m_pSampleEditorStatus = false; } void SampleEditor::valueChangedStartFrameSpinBox( int ) { testpTimer(); m_pDetailFrame = StartFrameSpinBox->value(); m_pLineColor = "Start"; if ( !m_pOnewayStart ){ m_pMainSampleWaveDisplay->m_pStartFramePosition = StartFrameSpinBox->value() / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); __loops.start_frame = StartFrameSpinBox->value(); }else { m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); m_pOnewayStart = false; } testPositionsSpinBoxes(); m_pSampleEditorStatus = false; setSamplelengthFrames(); } void SampleEditor::valueChangedLoopFrameSpinBox( int ) { testpTimer(); m_pDetailFrame = LoopFrameSpinBox->value(); m_pLineColor = "Loop"; if ( !m_pOnewayLoop ){ m_pMainSampleWaveDisplay->m_pLoopFramePosition = LoopFrameSpinBox->value() / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); __loops.loop_frame = LoopFrameSpinBox->value(); }else { m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); m_pOnewayLoop = false; } testPositionsSpinBoxes(); m_pSampleEditorStatus = false; setSamplelengthFrames(); } void SampleEditor::valueChangedEndFrameSpinBox( int ) { testpTimer(); m_pDetailFrame = EndFrameSpinBox->value(); m_pLineColor = "End"; if ( !m_pOnewayEnd ){ m_pMainSampleWaveDisplay->m_pEndFramePosition = EndFrameSpinBox->value() / m_divider + 25 ; m_pMainSampleWaveDisplay->updateDisplayPointer(); m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); __loops.end_frame = EndFrameSpinBox->value(); }else { m_pOnewayEnd = false; m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor , m_pLineColor); } testPositionsSpinBoxes(); m_pSampleEditorStatus = false; setSamplelengthFrames(); } void SampleEditor::on_PlayPushButton_clicked() { if (PlayPushButton->text() == "Stop" ){ testpTimer(); return; } const float pan_L = 0.5f; const float pan_R = 0.5f; const int nLength = -1; const float fPitch = 0.0f; const int selectedLayer = InstrumentEditorPanel::get_instance()->getSelectedLayer(); Song *pSong = Hydrogen::get_instance()->getSong(); Instrument *pInstr = pSong->get_instrument_list()->get( Hydrogen::get_instance()->getSelectedInstrumentNumber() ); Note *pNote = new Note( pInstr, 0, pInstr->get_component( m_pSelectedComponent )->get_layer( selectedLayer )->get_end_velocity() - 0.01, pan_L, pan_R, nLength, fPitch); pNote->set_specific_compo_id( m_pSelectedComponent ); AudioEngine::get_instance()->get_sampler()->note_on(pNote); setSamplelengthFrames(); createPositionsRulerPath(); m_pPlayButton = true; m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true); m_pSampleAdjustView->setDetailSamplePosition( __loops.start_frame, m_pZoomfactor , nullptr); if( __rubberband.use == false ){ m_pTimer->start(40); // update ruler at 25 fps } m_pRealtimeFrameEnd = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes; //calculate the new rubberband sample length if( __rubberband.use ){ m_prealtimeframeendfortarget = Hydrogen::get_instance()->getRealtimeFrames() + (m_pslframes * m_pRatio + 0.1); }else { m_prealtimeframeendfortarget = m_pRealtimeFrameEnd; } m_pTargetDisplayTimer->start(40); // update ruler at 25 fps PlayPushButton->setText( QString( "Stop") ); } void SampleEditor::on_PlayOrigPushButton_clicked() { if (PlayOrigPushButton->text() == "Stop" ){ testpTimer(); return; } const int selectedlayer = InstrumentEditorPanel::get_instance()->getSelectedLayer(); Song *pSong = Hydrogen::get_instance()->getSong(); Instrument *pInstr = pSong->get_instrument_list()->get( Hydrogen::get_instance()->getSelectedInstrumentNumber() ); /* *preview_instrument deletes the last used preview instrument, therefore we have to construct a temporary *instrument. Otherwise pInstr would be deleted if consumed by preview_instrument. */ Instrument *tmpInstrument = Instrument::load_instrument( pInstr->get_drumkit_name(), pInstr->get_name() ); Sample *pNewSample = Sample::load( pInstr->get_component(0)->get_layer( selectedlayer )->get_sample()->get_filepath() ); if ( pNewSample ){ int length = ( ( pNewSample->get_frames() / pNewSample->get_sample_rate() + 1) * 100 ); AudioEngine::get_instance()->get_sampler()->preview_instrument( tmpInstrument ); AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, length ); m_pslframes = pNewSample->get_frames(); } m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true); m_pSampleAdjustView->setDetailSamplePosition( __loops.start_frame, m_pZoomfactor , nullptr); m_pTimer->start(40); // update ruler at 25 fps m_pRealtimeFrameEnd = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes; PlayOrigPushButton->setText( QString( "Stop") ); } void SampleEditor::updateMainsamplePositionRuler() { unsigned long realpos = Hydrogen::get_instance()->getRealtimeFrames(); if ( realpos < m_pRealtimeFrameEnd ){ unsigned frame = m_pslframes - ( m_pRealtimeFrameEnd - realpos ); if ( m_pPlayButton == true ){ m_pMainSampleWaveDisplay->paintLocatorEvent( m_pPositionsRulerPath[frame] / m_divider + 25 , true); m_pSampleAdjustView->setDetailSamplePosition( m_pPositionsRulerPath[frame], m_pZoomfactor , nullptr); }else{ m_pMainSampleWaveDisplay->paintLocatorEvent( frame / m_divider + 25 , true); m_pSampleAdjustView->setDetailSamplePosition( frame, m_pZoomfactor , nullptr); } // ERRORLOG( QString("sampleval: %1").arg(frame) ); }else { m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false); m_pTimer->stop(); PlayPushButton->setText( QString("&Play") ); PlayOrigPushButton->setText( QString( "P&lay original sample") ); m_pPlayButton = false; } } void SampleEditor::updateTargetsamplePositionRuler() { unsigned long realpos = Hydrogen::get_instance()->getRealtimeFrames(); unsigned targetSampleLength; if( __rubberband.use ){ targetSampleLength = m_pslframes * m_pRatio + 0.1; }else { targetSampleLength = m_pslframes; } if ( realpos < m_prealtimeframeendfortarget ){ unsigned pos = targetSampleLength - ( m_prealtimeframeendfortarget - realpos ); m_pTargetSampleView->paintLocatorEventTargetDisplay( (m_pTargetSampleView->width() * pos /targetSampleLength), true); // ERRORLOG( QString("sampleval: %1").arg(frame) ); }else { m_pTargetSampleView->paintLocatorEventTargetDisplay( -1 , false); m_pTargetDisplayTimer->stop(); PlayPushButton->setText(QString( "&Play") ); PlayOrigPushButton->setText( QString( "P&lay original sample") ); m_pPlayButton = false; } } void SampleEditor::createPositionsRulerPath() { setSamplelengthFrames(); unsigned oneSampleLength = __loops.end_frame - __loops.start_frame; unsigned loopLength = __loops.end_frame - __loops.loop_frame; unsigned repeatsLength = loopLength * __loops.count; unsigned newLength = 0; if (oneSampleLength == loopLength){ newLength = oneSampleLength + oneSampleLength * __loops.count ; }else { newLength =oneSampleLength + repeatsLength; } unsigned normalLength = m_pSampleFromFile->get_frames(); unsigned * normalFrames = new unsigned[ normalLength ]; unsigned * tempFrames = new unsigned[ newLength ]; unsigned * loopFrames = new unsigned[ loopLength ]; for ( unsigned i = 0; i < normalLength; i++ ) { normalFrames[i] = i; } Sample::Loops::LoopMode loopmode = __loops.mode; long int z = __loops.loop_frame; long int y = __loops.start_frame; for ( unsigned i = 0; i < newLength; i++){ //first vector tempFrames[i] = 0; } for ( unsigned i = 0; i < oneSampleLength; i++, y++){ //first vector tempFrames[i] = normalFrames[y]; } for ( unsigned i = 0; i < loopLength; i++, z++){ //loop vector loopFrames[i] = normalFrames[z]; } if ( loopmode == Sample::Loops::REVERSE ){ reverse(loopFrames, loopFrames + loopLength); } if ( loopmode == Sample::Loops::REVERSE && __loops.count > 0 && __loops.start_frame == __loops.loop_frame ){ reverse( tempFrames, tempFrames + oneSampleLength ); } if ( loopmode == Sample::Loops::PINGPONG && __loops.start_frame == __loops.loop_frame){ reverse(loopFrames, loopFrames + loopLength); } for ( int i = 0; i< __loops.count ;i++){ unsigned tempdataend = oneSampleLength + ( loopLength * i ); if ( __loops.start_frame == __loops.loop_frame ){ copy( loopFrames, loopFrames+loopLength ,tempFrames+ tempdataend ); } if ( loopmode == Sample::Loops::PINGPONG && __loops.count > 1){ reverse(loopFrames, loopFrames + loopLength); } if ( __loops.start_frame != __loops.loop_frame ){ copy( loopFrames, loopFrames+loopLength ,tempFrames+ tempdataend ); } } if ( __loops.count == 0 && loopmode == Sample::Loops::REVERSE ){ reverse( tempFrames + __loops.loop_frame, tempFrames + newLength); } if(m_pPositionsRulerPath) { delete[] m_pPositionsRulerPath; } m_pPositionsRulerPath = tempFrames; delete[] loopFrames; delete[] normalFrames; } void SampleEditor::setSamplelengthFrames() { getAllLocalFrameInfos(); unsigned oneSampleLength = __loops.end_frame - __loops.start_frame; unsigned loopLength = __loops.end_frame - __loops.loop_frame ; unsigned repeatsLength = loopLength * __loops.count; unsigned newLength = 0; if (oneSampleLength == loopLength){ newLength = oneSampleLength + oneSampleLength * __loops.count ; }else { newLength =oneSampleLength + repeatsLength; } m_pslframes = newLength; newlengthLabel->setText(QString("new sample length: %1 frames").arg(newLength)); checkRatioSettings(); } void SampleEditor::valueChangedLoopCountSpinBox( int ) { testpTimer(); if ( m_pslframes > Hydrogen::get_instance()->getAudioOutput()->getSampleRate() * 60 ){ AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false); m_pTimer->stop(); m_pPlayButton = false; } __loops.count = LoopCountSpinBox->value() ; m_pSampleEditorStatus = false; setSamplelengthFrames(); if ( m_pslframes > Hydrogen::get_instance()->getAudioOutput()->getSampleRate() * 60 * 30){ // >30 min LoopCountSpinBox->setMaximum(LoopCountSpinBox->value() -1); } } void SampleEditor::valueChangedrubberbandCsettingscomboBox( const QString ) { __rubberband.c_settings = rubberbandCsettingscomboBox->currentIndex(); m_pSampleEditorStatus = false; } void SampleEditor::valueChangedpitchdoubleSpinBox( double ) { __rubberband.pitch = pitchdoubleSpinBox->value(); m_pSampleEditorStatus = false; } void SampleEditor::valueChangedrubberComboBox( const QString ) { if( rubberComboBox->currentText() != "off" ){ __rubberband.use = true; }else { __rubberband.use = false; __rubberband.divider = 1.0; } switch ( rubberComboBox->currentIndex() ){ case 0 :// __rubberband.divider = 4.0; break; case 1 :// __rubberband.divider = 1.0/64.0; break; case 2 :// __rubberband.divider = 1.0/32.0; break; case 3 :// __rubberband.divider = 1.0/16.0; break; case 4 :// __rubberband.divider = 1.0/8.0; break; case 5 :// __rubberband.divider = 1.0/4.0; break; case 6 :// __rubberband.divider = 1.0/2.0; break; case 7 :// __rubberband.divider = 1.0; break; default: __rubberband.divider = (float)rubberComboBox->currentIndex() - 6.0; } // QMessageBox::information ( this, "Hydrogen", tr ( "divider %1" ).arg( __rubberband.divider )); // float __rubberband.divider; setSamplelengthFrames(); m_pSampleEditorStatus = false; } void SampleEditor::checkRatioSettings() { //calculate ratio double durationtime = 60.0 / Hydrogen::get_instance()->getNewBpmJTM() * __rubberband.divider; double induration = (double) m_pslframes / (double) m_pSamplerate; if (induration != 0.0) m_pRatio = durationtime / induration; //my personal ratio quality settings //ratios < 0.1 || > 3.0 are bad (red) or experimental sounds //ratios > 0.1 && < 0.5 || > 2.0 && < 3.0 are mediocre (yellow) //ratios > 0.5 && < 2.0 are good (green) // // 0.1 0.5 2.0 3.0 //<---red---[--yellow--[------green------]----yellow----]---red---> //green ratio if( ( m_pRatio >= 0.5 ) && ( m_pRatio <= 2.0 ) ){ rubberComboBox->setStyleSheet("QComboBox { background-color: green; }"); } //yellow ratio else if( ( m_pRatio >= 0.1 ) && ( m_pRatio <= 3.0 ) ){ rubberComboBox->setStyleSheet("QComboBox { background-color: yellow; }"); } //red ratio else{ rubberComboBox->setStyleSheet("QComboBox { background-color: red; }"); } QString text = QString( " RB-Ratio = %1").arg(m_pRatio); ratiolabel->setText( text ); //no rubberband = default if( !__rubberband.use ){ rubberComboBox->setStyleSheet("QComboBox { background-color: 58, 62, 72; }"); ratiolabel->setText( "" ); } } void SampleEditor::valueChangedProcessingTypeComboBox( const QString unused ) { switch ( ProcessingTypeComboBox->currentIndex() ){ case 0 :// __loops.mode = Sample::Loops::FORWARD; break; case 1 :// __loops.mode = Sample::Loops::REVERSE; break; case 2 :// __loops.mode = Sample::Loops::PINGPONG; break; default: __loops.mode = Sample::Loops::FORWARD; } m_pSampleEditorStatus = false; } void SampleEditor::on_verticalzoomSlider_valueChanged( int value ) { m_pZoomfactor = value / 10 +1; m_pSampleAdjustView->setDetailSamplePosition( m_pDetailFrame, m_pZoomfactor, m_pLineColor ); } void SampleEditor::testPositionsSpinBoxes() { if ( __loops.start_frame > __loops.loop_frame ) __loops.loop_frame = __loops.start_frame; if ( __loops.start_frame > __loops.end_frame ) __loops.end_frame = __loops.start_frame; if ( __loops.loop_frame > __loops.end_frame ) __loops.end_frame = __loops.loop_frame; if ( __loops.end_frame < __loops.loop_frame ) __loops.loop_frame = __loops.end_frame; if ( __loops.end_frame < __loops.start_frame ) __loops.start_frame = __loops.end_frame; StartFrameSpinBox->setValue( __loops.start_frame ); LoopFrameSpinBox->setValue( __loops.loop_frame ); EndFrameSpinBox->setValue( __loops.end_frame ); } void SampleEditor::testpTimer() { if ( m_pTimer->isActive() || m_pTargetDisplayTimer->isActive() ){ m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false); m_pTimer->stop(); m_pTargetDisplayTimer->stop(); PlayPushButton->setText( QString( "&Play" ) ); PlayOrigPushButton->setText( QString( "P&lay original sample") ); AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); m_pPlayButton = false; } } hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/SampleEditor.h000066400000000000000000000072771366722712400233340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SAMPLEEDITOR_H #define SAMPLEEDITOR_H #include "ui_SampleEditor_UI.h" #include "../InstrumentEditor/InstrumentEditor.h" #include #include #include #include #include #include class Button; class MainSampleWaveDisplay; class TargetWaveDisplay; class DetailWaveDisplay; /// /// This dialog is used to preview audiofiles /// class SampleEditor : public QDialog, public Ui_SampleEditor_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SampleEditor( QWidget* pParent, int nSelectedComponent, int nSelectedLayer, QString nSampleFilename ); ~SampleEditor(); void setSampleName( QString name); bool getCloseQuestion(); bool m_pSampleEditorStatus; bool returnAllMainWaveDisplayValues(); void returnAllTargetDisplayValues(); void setTrue(); //this values come from the real sample to restore a frm song loaded sample bool m_sample_is_modified; ///< true if sample is modified private slots: void valueChangedLoopCountSpinBox( int ); void valueChangedProcessingTypeComboBox( const QString ); void valueChangedrubberComboBox( const QString ); void valueChangedrubberbandCsettingscomboBox( const QString ); void valueChangedpitchdoubleSpinBox( double ); void on_ClosePushButton_clicked(); void on_PrevChangesPushButton_clicked(); void valueChangedStartFrameSpinBox( int ); void valueChangedLoopFrameSpinBox( int ); void valueChangedEndFrameSpinBox( int ); void on_PlayPushButton_clicked(); void on_PlayOrigPushButton_clicked(); void on_verticalzoomSlider_valueChanged ( int value ); void updateMainsamplePositionRuler(); void updateTargetsamplePositionRuler(); private: H2Core::Sample *m_pSampleFromFile; int m_pSelectedLayer; int m_pSelectedComponent; QString m_samplename; double m_divider; void openDisplays(); void getAllFrameInfos(); void getAllLocalFrameInfos(); void setAllSampleProps(); void testPositionsSpinBoxes(); void createNewLayer(); void setSamplelengthFrames(); void createPositionsRulerPath(); void testpTimer(); void closeEvent(QCloseEvent *event); void checkRatioSettings(); virtual void mouseReleaseEvent(QMouseEvent *ev); MainSampleWaveDisplay *m_pMainSampleWaveDisplay; TargetWaveDisplay *m_pTargetSampleView; DetailWaveDisplay *m_pSampleAdjustView; float m_pZoomfactor; unsigned m_pDetailFrame; QString m_pLineColor; bool m_pOnewayStart; bool m_pOnewayLoop; bool m_pOnewayEnd; unsigned long m_pRealtimeFrameEnd; unsigned long m_prealtimeframeendfortarget; unsigned m_pslframes; unsigned m_pSamplerate; QTimer *m_pTimer; QTimer *m_pTargetDisplayTimer; unsigned *m_pPositionsRulerPath; bool m_pPlayButton; float m_pRatio; H2Core::Sample::Loops __loops; H2Core::Sample::Rubberband __rubberband; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/SampleEditor_UI.ui000066400000000000000000000570771366722712400241220ustar00rootroot00000000000000 SampleEditor_UI 0 0 862 545 Dialog 10 440 841 94 CrossCursor QFrame::Box QFrame::Raised 770 295 81 26 &Close 14 295 701 33 Start 100 0 Adjust sample start frame 1000000000 Qt::Horizontal 40 20 Loop 100 0 Adjust sample loop begin frame 1000000000 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">mode</span></p></body></html> 86 0 set processing forward reverse pingpong <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Loop</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:7pt;">Count</span></p></body></html> 60 0 loops 0 10000 Qt::Horizontal 40 20 End 100 0 Adjust sample end & loop end frame 1000000000 10 10 838 267 624 265 624 265 SplitHCursor QFrame::StyledPanel QFrame::Raised 180 265 180 265 QFrame::StyledPanel QFrame::Raised 1 Qt::Vertical 10 330 841 71 QFrame::StyledPanel QFrame::Raised 10 10 821 60 "Rubberband Audio Processor" : Change the tempo (sample length) and pitch of audio. Sample length to beat: 75 16777215 off 1/64 1/32 1/16 1/8 1/4 1/2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 true 150 0 Pitch (Semitone,Cent) 75 16777215 Pitch the sample in semitones, cents -36.000000000000000 36.000000000000000 0.010000000000000 0.000000000000000 Qt::Horizontal 40 20 100 16777215 Crispness: 0 0 45 16777215 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"Crispness" levels:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0 equivalent to --no-transients --no-lamination --window-long</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 1 equivalent to --no-transients --no-lamination</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 2 equivalent to --no-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 3 equivalent to --bl-transients</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 4 default processing options</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 5 equivalent to --no-lamination --window-short (may be good for drums)</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">you can find more information here:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.breakfastquay.com/rubberband/ "><span style=" text-decoration: underline; color:#0000ff;">http://www.breakfastquay.com/rubberband/ </span></a></p></body></html> 0 1 2 3 4 5 10 410 841 35 &Apply Changes Qt::Horizontal QSizePolicy::Maximum 13 20 &Play Qt::Horizontal QSizePolicy::Minimum 13 20 P&lay original sample 300 0 new sample length: Qt::Horizontal 40 20 80 0 fade-out type volume panorama layoutWidget_4 targetSampleView ClosePushButton layoutWidget_1 layoutWidget_2 RubberbandCframe ProcessingTypeComboBox LoopCountSpinBox PrevChangesPushButton PlayOrigPushButton ClosePushButton hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/TargetWaveDisplay.cpp000066400000000000000000000304671366722712400246730ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "HydrogenApp.h" #include "SampleEditor.h" using namespace H2Core; #define UI_WIDTH 841 #define UI_HEIGHT 91 #include #include #include "TargetWaveDisplay.h" #include "../Skin.h" const char* TargetWaveDisplay::__class_name = "TargetWaveDisplay"; TargetWaveDisplay::TargetWaveDisplay(QWidget* pParent) : QWidget( pParent ) , Object( __class_name ) , m_sSampleName( "" ) { // setAttribute(Qt::WA_NoBackground); //INFOLOG( "INIT" ); int w = UI_WIDTH; int h = UI_HEIGHT; resize( w, h ); bool ok = m_Background.load( Skin::getImagePath() + "/waveDisplay/targetsamplewavedisplay.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } m_pPeakData_Left = new int[ w ]; m_pPeakData_Right = new int[ w ]; m_VMove = false; m_sInfo = ""; m_nX = -10; m_nY = -10; m_nLocator = -1; m_UpdatePosition = false; } TargetWaveDisplay::~TargetWaveDisplay() { //INFOLOG( "DESTROY" ); delete[] m_pPeakData_Left; delete[] m_pPeakData_Right; } void TargetWaveDisplay::paintEvent(QPaintEvent *ev) { QPainter painter( this ); painter.setRenderHint( QPainter::HighQualityAntialiasing ); painter.drawPixmap( ev->rect(), m_Background, ev->rect() ); painter.setPen( QColor( 252, 142, 73 )); int VCenter = height() / 2; int LCenter = VCenter -4; int RCenter = VCenter +4; for ( int x = 0; x < width() - 1; x++ ) { painter.drawLine( x, LCenter, x, -m_pPeakData_Left[x +1] +LCenter ); } painter.setPen( QColor( 116, 186, 255 )); for ( int x = 0; x < width() - 1; x++ ) { painter.drawLine( x, RCenter, x, -m_pPeakData_Right[x +1] +RCenter ); } QFont Font; Font.setWeight( 63 ); painter.setFont( Font ); for ( int i = 0; i < static_cast(m_VelocityEnvelope.size()) -1; i++){ //volume line painter.setPen( QPen(QColor( 255, 255, 255, 200 ) ,1 , Qt::SolidLine) ); painter.drawLine( m_VelocityEnvelope[i]->frame, m_VelocityEnvelope[i]->value, m_VelocityEnvelope[i + 1]->frame, m_VelocityEnvelope[i +1]->value ); painter.setBrush(QColor( 99, 160, 233 )); painter.drawEllipse ( m_VelocityEnvelope[i]->frame - 6/2, m_VelocityEnvelope[i]->value - 6/2, 6, 6 ); } for ( int i = 0; i < static_cast(m_PanEnvelope.size()) -1; i++){ //pan line painter.setPen( QPen(QColor( 249, 235, 116, 200 ) ,1 , Qt::SolidLine) ); painter.drawLine( m_PanEnvelope[i]->frame, m_PanEnvelope[i]->value, m_PanEnvelope[i + 1]->frame, m_PanEnvelope[i +1]->value ); painter.setBrush(QColor( 77, 189, 55 )); painter.drawEllipse ( m_PanEnvelope[i]->frame - 6/2, m_PanEnvelope[i]->value - 6/2, 6, 6 ); } painter.setCompositionMode(QPainter::CompositionMode_SourceOver); painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::SolidLine ) ); painter.drawLine( m_nLocator, 4, m_nLocator, height() -4); //volume line //first rect painter.setPen( QPen(QColor( 255, 255, 255, 200 ) ,1 , Qt::SolidLine) ); painter.setBrush(QColor( 99, 160, 233 )); painter.drawRect ( m_VelocityEnvelope[0]->frame - 12/2, m_VelocityEnvelope[0]->value - 6/2, 12, 6 ); //last rect painter.drawRect ( m_VelocityEnvelope[m_VelocityEnvelope.size() -1]->frame - 12/2, m_VelocityEnvelope[m_VelocityEnvelope.size() -1]->value - 6/2, 12, 6 ); //pan line //first rect painter.setPen( QPen(QColor( 249, 235, 116, 200 ) ,1 , Qt::SolidLine) ); painter.setBrush(QColor( 77, 189, 55 )); painter.drawRect ( m_PanEnvelope[0]->frame - 12/2, m_PanEnvelope[0]->value - 6/2, 12, 6 ); //last rect painter.drawRect ( m_PanEnvelope[m_PanEnvelope.size() -1]->frame - 12/2, m_PanEnvelope[m_PanEnvelope.size() -1]->value - 6/2, 12, 6 ); painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::DotLine ) ); painter.drawLine( 0, LCenter, UI_WIDTH, LCenter ); painter.setPen( QPen( QColor( 255, 255, 255 ), 1, Qt::DotLine ) ); painter.drawLine( 0, RCenter, UI_WIDTH, RCenter ); if (m_nY < 50){ if (m_nX < 790){ painter.drawText( m_nX +5, m_nY, 60, 20, Qt::AlignLeft, QString( m_sInfo ) ); } else { painter.drawText( m_nX - 65, m_nY, 60, 20, Qt::AlignRight, QString( m_sInfo ) ); } }else { if (m_nX < 790){ painter.drawText( m_nX +5, m_nY -20, 60, 20, Qt::AlignLeft, QString( m_sInfo ) ); } else { painter.drawText( m_nX - 65, m_nY -20, 60, 20, Qt::AlignRight, QString( m_sInfo ) ); } } } void TargetWaveDisplay::updateDisplayPointer() { update(); } void TargetWaveDisplay::paintLocatorEventTargetDisplay( int pos, bool updateposi) { m_UpdatePosition = updateposi; if ( !updateposi ){ m_nLocator = -1; } else { m_nLocator = pos; } update(); } void TargetWaveDisplay::updateDisplay( H2Core::InstrumentLayer *pLayer ) { if ( pLayer && pLayer->get_sample() ) { int nSampleLength = pLayer->get_sample()->get_frames(); float nScaleFactor = nSampleLength / width(); float fGain = (height() - 8) / 2.0 * pLayer->get_gain(); float *pSampleDatal = pLayer->get_sample()->get_data_l(); float *pSampleDatar = pLayer->get_sample()->get_data_r(); int nSamplePos = 0; int nVall; int nValr; for ( int i = 0; i < width(); ++i ){ nVall = 0; nValr = 0; for ( int j = 0; j < nScaleFactor; ++j ) { if ( j < nSampleLength ) { if ( pSampleDatal[ nSamplePos ] < 0 ){ int newVal = static_cast( pSampleDatal[ nSamplePos ] * -fGain ); nVall = newVal; }else { int newVal = static_cast( pSampleDatal[ nSamplePos ] * fGain ); nVall = newVal; } if ( pSampleDatar[ nSamplePos ] > 0 ){ int newVal = static_cast( pSampleDatar[ nSamplePos ] * -fGain ); nValr = newVal; }else { int newVal = static_cast( pSampleDatar[ nSamplePos ] * fGain ); nValr = newVal; } } ++nSamplePos; } m_pPeakData_Left[ i ] = nVall; m_pPeakData_Right[ i ] = nValr; } } update(); } void TargetWaveDisplay::mouseMoveEvent(QMouseEvent *ev) { int snapradius = 10; int editType = HydrogenApp::get_instance()->getSampleEditor()->EditTypeComboBox->currentIndex(); ///edit volume points if( editType == 0 ){ m_VMove = true; if ( ev->x() <= 0 || ev->x() >= UI_WIDTH || ev->y() < 0 || ev->y() > UI_HEIGHT ){ update(); m_VMove = false; return; } float info = (UI_HEIGHT - ev->y()) / (float)UI_HEIGHT; m_sInfo.setNum( info, 'g', 2 ); m_nX = ev->x(); m_nY = ev->y(); for ( int i = 0; i < static_cast(m_VelocityEnvelope.size()); i++){ if ( m_VelocityEnvelope[i]->frame >= ev->x() - snapradius && m_VelocityEnvelope[i]->frame <= ev->x() + snapradius ) { m_VelocityEnvelope.erase( m_VelocityEnvelope.begin() + i); int Frame = 0; int Value = 0; if ( i == 0 ){ Frame = 0; Value = ev->y(); } else if ( i == static_cast(m_VelocityEnvelope.size()) ) { Frame = m_VelocityEnvelope[i]->frame; Value = ev->y(); } else { Frame = ev->x(); Value = ev->y(); } m_VelocityEnvelope.push_back( std::make_unique( Frame, Value) ); sort( m_VelocityEnvelope.begin(), m_VelocityEnvelope.end(), EnvelopePoint::Comparator() ); update(); return; }else { m_VMove = false; } } ///edit panorama points }else if( editType == 1 ){ m_VMove = true; if ( ev->x() <= 0 || ev->x() >= UI_WIDTH || ev->y() < 0 || ev->y() > UI_HEIGHT ){ update(); m_VMove = false; return; } float info = (UI_HEIGHT/2 - ev->y()) / (UI_HEIGHT/2.0); m_sInfo.setNum( info, 'g', 2 ); m_nX = ev->x(); m_nY = ev->y(); for ( int i = 0; i < static_cast(m_PanEnvelope.size()); i++){ if ( m_PanEnvelope[i]->frame >= ev->x() - snapradius && m_PanEnvelope[i]->frame <= ev->x() + snapradius ) { m_PanEnvelope.erase( m_PanEnvelope.begin() + i); int Frame = 0; int Value = 0; if ( i == 0 ){ Frame = 0; Value = ev->y(); } else if ( i == static_cast(m_PanEnvelope.size()) ) { Frame = m_PanEnvelope[i]->frame; Value = ev->y(); } else { Frame = ev->x(); Value = ev->y(); } m_PanEnvelope.push_back( std::make_unique(Frame, Value) ); sort( m_PanEnvelope.begin(), m_PanEnvelope.end(), EnvelopePoint::Comparator() ); update(); return; }else { m_VMove = false; } } } update(); HydrogenApp::get_instance()->getSampleEditor()->setTrue(); } void TargetWaveDisplay::mousePressEvent(QMouseEvent *ev) { int SnapRadius = 6; bool NewPoint = true; // add new point int EditType = HydrogenApp::get_instance()->getSampleEditor()->EditTypeComboBox->currentIndex(); ///edit volume points if( EditType == 0 ){ // test if there is already a point for ( int i = 0; i < static_cast(m_VelocityEnvelope.size()); ++i){ if ( m_VelocityEnvelope[i]->frame >= ev->x() - SnapRadius && m_VelocityEnvelope[i]->frame <= ev->x() + SnapRadius ){ NewPoint = false; } } int x = ev->x(); int y = ev->y(); if (ev->button() == Qt::LeftButton && !m_VMove && NewPoint){ float info = (UI_HEIGHT - ev->y()) / (float)UI_HEIGHT; m_sInfo.setNum( info, 'g', 2 ); m_nX = ev->x(); m_nY = ev->y(); if ( ev->y() <= 0 ) y = 0; if ( ev->y() >= UI_HEIGHT ) y = UI_HEIGHT; if ( ev->x() <= SnapRadius ) x = SnapRadius; if ( ev->x() >= UI_WIDTH-SnapRadius ) x = UI_WIDTH-SnapRadius; m_VelocityEnvelope.push_back( std::make_unique( x, y ) ); sort( m_VelocityEnvelope.begin(), m_VelocityEnvelope.end(), EnvelopePoint::Comparator() ); } //remove point SnapRadius = 10; if (ev->button() == Qt::RightButton ){ if ( ev->x() <= 0 || ev->x() >= UI_WIDTH ){ update(); return; } m_sInfo = ""; for ( int i = 0; i < static_cast(m_VelocityEnvelope.size()); i++){ if ( m_VelocityEnvelope[i]->frame >= ev->x() - SnapRadius && m_VelocityEnvelope[i]->frame <= ev->x() + SnapRadius ){ if ( m_VelocityEnvelope[i]->frame == 0 || m_VelocityEnvelope[i]->frame == UI_WIDTH) return; m_VelocityEnvelope.erase( m_VelocityEnvelope.begin() + i); } } } } ///edit panorama points else if( EditType == 1 ){ // test if there is already a point for ( int i = 0; i < static_cast(m_PanEnvelope.size()); ++i){ if ( m_PanEnvelope[i]->frame >= ev->x() - SnapRadius && m_PanEnvelope[i]->frame <= ev->x() + SnapRadius ){ NewPoint = false; } } int x = ev->x(); int y = ev->y(); if (ev->button() == Qt::LeftButton && !m_VMove && NewPoint){ float info = (UI_HEIGHT/2 - ev->y()) / (UI_HEIGHT/2.0); m_sInfo.setNum( info, 'g', 2 ); m_nX = ev->x(); m_nY = ev->y(); if ( ev->y() <= 0 ) y = 0; if ( ev->y() >= UI_HEIGHT ) y = UI_HEIGHT; if ( ev->x() <= SnapRadius ) x = SnapRadius; if ( ev->x() >= UI_WIDTH-SnapRadius ) x = UI_WIDTH-SnapRadius; m_PanEnvelope.push_back( std::make_unique( x, y ) ); sort( m_PanEnvelope.begin(), m_PanEnvelope.end(), EnvelopePoint::Comparator() ); } //remove point SnapRadius = 10; if (ev->button() == Qt::RightButton ){ if ( ev->x() <= 0 || ev->x() >= UI_WIDTH ){ update(); return; } m_sInfo = ""; for ( int i = 0; i < static_cast(m_PanEnvelope.size()); i++){ if ( m_PanEnvelope[i]->frame >= ev->x() - SnapRadius && m_PanEnvelope[i]->frame <= ev->x() + SnapRadius ){ if ( m_PanEnvelope[i]->frame == 0 || m_PanEnvelope[i]->frame == UI_WIDTH) return; m_PanEnvelope.erase( m_PanEnvelope.begin() + i); } } } } update(); HydrogenApp::get_instance()->getSampleEditor()->setTrue(); } void TargetWaveDisplay::mouseReleaseEvent(QMouseEvent *ev) { update(); HydrogenApp::get_instance()->getSampleEditor()->returnAllTargetDisplayValues(); } hydrogen-1.0.0-rc1/src/gui/src/SampleEditor/TargetWaveDisplay.h000066400000000000000000000041671366722712400243360ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 TARGET_WAVE_DISPLAY #define TARGET_WAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include class SampleEditor; namespace H2Core { class InstrumentLayer; class EnvelopePoint; } class TargetWaveDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: TargetWaveDisplay(QWidget* pParent); ~TargetWaveDisplay(); void updateDisplay( H2Core::InstrumentLayer *pLayer ); void updateDisplayPointer(); void paintLocatorEventTargetDisplay( int pos, bool last_event); void paintEvent(QPaintEvent *ev); H2Core::Sample::PanEnvelope* get_pan() { return &m_PanEnvelope; } H2Core::Sample::VelocityEnvelope* get_velocity() { return &m_VelocityEnvelope; } private: QPixmap m_Background; QString m_sSampleName; QString m_sInfo; int m_nX; int m_nY; int m_nLocator; int *m_pPeakData_Left; int *m_pPeakData_Right; unsigned m_nSampleLength; bool m_VMove; bool m_UpdatePosition; virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); H2Core::Sample::PanEnvelope m_PanEnvelope; H2Core::Sample::VelocityEnvelope m_VelocityEnvelope; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Skin.h000066400000000000000000000021251366722712400172430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 H2_SKIN_H #define H2_SKIN_H #include #include /// /// Skin support /// class Skin { public: static QString getImagePath() { return H2Core::Filesystem::img_dir().append( "/gray" ); } }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/000077500000000000000000000000001366722712400202435ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/SongEditor/PatternFillDialog.cpp000066400000000000000000000041041366722712400243120ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PatternFillDialog.h" #include #include #include #include "Skin.h" const char* PatternFillDialog::__class_name = "PatternFillDialog"; PatternFillDialog::PatternFillDialog(QWidget* parent, FillRange* pRange) : QDialog(parent) , Object( __class_name ) { setupUi( this ); setFixedSize( width(), height() ); setWindowTitle( tr( "Fill with selected pattern" ) ); __fill_range = pRange; __text_changed(); } PatternFillDialog::~PatternFillDialog() { } void PatternFillDialog::on_cancelBtn_clicked() { reject(); } void PatternFillDialog::on_okBtn_clicked() { __fill_range->fromVal = fromText->text().toUInt(); __fill_range->toVal = toText->text().toUInt(); __fill_range->bInsert = fillRB->isChecked(); accept(); } void PatternFillDialog::on_fromText_textChanged( const QString& ) { __text_changed(); } void PatternFillDialog::on_toText_textChanged( const QString& ) { __text_changed(); } void PatternFillDialog::__text_changed() { int fromVal, toVal; if ( ( fromVal = fromText->text().toUInt() ) && ( toVal = toText->text().toUInt() ) && ( toVal > fromVal ) ) { okBtn->setEnabled(true); } else { okBtn->setEnabled(false); } } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/PatternFillDialog.h000066400000000000000000000032331366722712400237610ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PATTERN_FILL_DIALOG_H #define PATTERN_FILL_DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include "ui_PatternFillDialog_UI.h" #include namespace H2Core { class Pattern; } struct FillRange { int fromVal; int toVal; bool bInsert; }; /// /// Pattern Fill Dialog /// class PatternFillDialog : public QDialog, public Ui_PatternFillDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: PatternFillDialog( QWidget* parent, FillRange* range ); ~PatternFillDialog(); private slots: void on_cancelBtn_clicked(); void on_okBtn_clicked(); void on_fromText_textChanged(const QString & text); void on_toText_textChanged(const QString & text); private: FillRange* __fill_range; /// Does some name check void __text_changed(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/PatternFillDialog_UI.ui000066400000000000000000000122421366722712400245440ustar00rootroot00000000000000 Matt Walker PatternFillDialog_UI 0 0 221 121 5 5 0 0 Form 1 true 10 10 201 71 10 10 71 51 0 6 &Fill Alt+F true &Clear Alt+C 90 10 101 51 0 6 From: 50 32767 To: 50 32767 10 90 201 27 0 6 Qt::Horizontal QSizePolicy::Expanding 36 11 Cancel OK true Qt::Horizontal QSizePolicy::Expanding 36 11 fillRB fromText toText cancelBtn okBtn hydrogen-1.0.0-rc1/src/gui/src/SongEditor/PlaybackTrackWaveDisplay.cpp000066400000000000000000000135541366722712400256430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; #include "../Skin.h" #include "../HydrogenApp.h" #include "../InstrumentEditor/WaveDisplay.h" #include "PlaybackTrackWaveDisplay.h" #include "SongEditor.h" #include "SongEditorPanel.h" const char* PlaybackTrackWaveDisplay::__class_name = "PlaybackTrackWaveDisplay"; PlaybackTrackWaveDisplay::PlaybackTrackWaveDisplay(QWidget* pParent) : WaveDisplay( pParent ) { INFOLOG( "INIT" ); setAcceptDrops(true); } void PlaybackTrackWaveDisplay::dropEvent(QDropEvent* event) { const QMimeData* mimeData = event->mimeData(); QString sText = event->mimeData()->text(); if ( mimeData->hasUrls() ) { QList urlList = mimeData->urls(); //someone dragged a file from an external tool. //check if is a supported sample, and then try to load it if( sText.startsWith("file://")) { Hydrogen::get_instance()->loadPlaybackTrack( urlList.at(0).toLocalFile() ); HydrogenApp* pH2App = HydrogenApp::get_instance(); pH2App->getSongEditorPanel()->updatePlaybackTrackIfNecessary(); } } } void PlaybackTrackWaveDisplay::dragEnterEvent(QDragEnterEvent * event) { if(event->mimeData()->hasFormat("text/plain")) { event->acceptProposedAction(); } } void PlaybackTrackWaveDisplay::dragMoveEvent(QDragMoveEvent *event) { event->accept(); } void PlaybackTrackWaveDisplay::updateDisplay( H2Core::InstrumentLayer *pLayer ) { HydrogenApp* pH2App = HydrogenApp::get_instance(); Preferences* pPref = Preferences::get_instance(); int currentWidth = width(); if(!pLayer || currentWidth <= 0){ m_pLayer = nullptr; m_sSampleName = "-"; return; } if(currentWidth != m_nCurrentWidth){ delete[] m_pPeakData; m_pPeakData = new int[ currentWidth ]; m_nCurrentWidth = currentWidth; } //initialise everything with 0.. memset( m_pPeakData, 0, currentWidth * sizeof(m_pPeakData[0]) ); if ( pLayer && pLayer->get_sample() ) { Song* pSong = Hydrogen::get_instance()->getSong(); m_pLayer = pLayer; m_sSampleName = m_pLayer->get_sample()->get_filename(); float * pSampleData = pLayer->get_sample()->get_data_l(); int nSampleLength = m_pLayer->get_sample()->get_frames(); float fLengthOfPlaybackTrackInSecs = ( float )( nSampleLength / (float) m_pLayer->get_sample()->get_sample_rate() ); float fRemainingLengthOfPlaybackTrack = fLengthOfPlaybackTrackInSecs; float fGain = height() / 2.0 * pLayer->get_gain(); int nSamplePos = 0; int nMaxBars = pPref->getMaxBars(); std::vector *pPatternColumns = pSong->get_pattern_group_vector(); int nColumns = pPatternColumns->size(); int nSongEditorGridWith; if( pH2App->getSongEditorPanel() ) { nSongEditorGridWith = pH2App->getSongEditorPanel()->getSongEditor()->getGridWidth(); } else { //this might happen during init of SongEditorPanel nSongEditorGridWith = 16; } int nRenderStartPosition = 0.8 * nSongEditorGridWith; for ( int patternPosition = 0; patternPosition < nMaxBars; ++patternPosition ) { int maxPatternSize = 0; if( patternPosition < nColumns ) { PatternList *pColumn = ( *pPatternColumns )[ patternPosition ]; for ( unsigned j = 0; j < pColumn->size(); j++ ) { const Pattern *pPattern = pColumn->get( j ); int nPatternSize = pPattern->get_length(); if(maxPatternSize < nPatternSize) { maxPatternSize = nPatternSize; } } } //No pattern found in this column, use default size (Size: 8) if(maxPatternSize == 0) maxPatternSize = 192; //length (in seconds) of one pattern is: (nPatternSize/24) / ((pEngine->getSong()->__bpm * 2) / 60) float fLengthOfCurrentPatternInSecs = (maxPatternSize/24) / ((pSong->__bpm * 2) / 60); if( fRemainingLengthOfPlaybackTrack >= fLengthOfCurrentPatternInSecs ) { //only a part of the PlaybackTrack will fit into this Pattern float nScaleFactor = fLengthOfCurrentPatternInSecs / fLengthOfPlaybackTrackInSecs; int nSamplesToRender = nScaleFactor * nSampleLength; int nVal = 0; for ( int i = nRenderStartPosition; i < nRenderStartPosition + nSongEditorGridWith ; ++i ) { if( i < m_nCurrentWidth ) { nVal = 0; int nSamplesToRenderInThisStep = (nSamplesToRender / nSongEditorGridWith); for ( int j = 0; j < nSamplesToRenderInThisStep; ++j ) { if ( nSamplePos < nSampleLength ) { int newVal = (int)( pSampleData[ nSamplePos ] * fGain ); if ( newVal > nVal ) { nVal = newVal; } } ++nSamplePos; } m_pPeakData[ i ] = nVal; } } nRenderStartPosition += nSongEditorGridWith; fRemainingLengthOfPlaybackTrack -= fLengthOfCurrentPatternInSecs; } } } else { m_sSampleName = "-"; for ( int i =0; i < m_nCurrentWidth; ++i ){ m_pPeakData[ i ] = 0; } } update(); } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/PlaybackTrackWaveDisplay.h000066400000000000000000000030411366722712400252760ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PLAYBACKTRACKWAVE_DISPLAY #define PLAYBACKTRACKWAVE_DISPLAY #include #if QT_VERSION >= 0x050000 # include #endif #include #include "../InstrumentEditor/WaveDisplay.h" namespace H2Core { class InstrumentLayer; } class PlaybackTrackWaveDisplay : public WaveDisplay { H2_OBJECT Q_OBJECT public: PlaybackTrackWaveDisplay(QWidget* pParent); ~PlaybackTrackWaveDisplay() = default; void updateDisplay( H2Core::InstrumentLayer *pLayer ) override; public slots: virtual void dragMoveEvent(QDragMoveEvent *event) override; virtual void dropEvent(QDropEvent *event) override; virtual void dragEnterEvent(QDragEnterEvent * event) override; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditor.cpp000066400000000000000000002003711366722712400230270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include #include #include #include #include using namespace H2Core; #include "UndoActions.h" #include "MainForm.h" #include "SongEditor.h" #include "SongEditorPanel.h" #include "SongEditorPanelBpmWidget.h" #include "SongEditorPanelTagWidget.h" #include "PatternFillDialog.h" #include "VirtualPatternDialog.h" #include "SoundLibrary/SoundLibraryPanel.h" #include "SoundLibrary/SoundLibraryDatastructures.h" #include "../PatternEditor/PatternEditorPanel.h" #include "../HydrogenApp.h" #include "../InstrumentRack.h" #include "../Widgets/Button.h" #include "../PatternPropertiesDialog.h" #include "../SongPropertiesDialog.h" #include "../Skin.h" #ifdef WIN32 #include #include #endif using namespace std; const char* SongEditor::__class_name = "SongEditor"; struct PatternDisplayInfo { bool bActive; bool bNext; QString sPatternName; }; SongEditorGridRepresentationItem::SongEditorGridRepresentationItem(int x, int y, bool value) { this->x = x; this->y = y; this->value = value; } SongEditor::SongEditor( QWidget *parent ) : QWidget( parent ) , Object( __class_name ) , m_bSequenceChanged( true ) , m_bIsMoving( false ) , m_bShowLasso( false ) { setAttribute(Qt::WA_NoBackground); setFocusPolicy (Qt::StrongFocus); m_nGridWidth = 16; m_nGridHeight = 18; Preferences *pref = Preferences::get_instance(); m_nMaxPatternSequence = pref->getMaxBars(); int m_nInitialWidth = 10 + m_nMaxPatternSequence * m_nGridWidth; int m_nInitialHeight = 10; this->resize( QSize(m_nInitialWidth, m_nInitialHeight) ); createBackground(); // create m_backgroundPixmap pixmap update(); } SongEditor::~SongEditor() { } int SongEditor::getGridWidth () { return m_nGridWidth; } void SongEditor::setGridWidth( uint width ) { if ( ( SONG_EDITOR_MIN_GRID_WIDTH <= width ) && ( SONG_EDITOR_MAX_GRID_WIDTH >= width ) ) { m_nGridWidth = width; this->resize ( 10 + m_nMaxPatternSequence * m_nGridWidth, height() ); } } void SongEditor::keyPressEvent ( QKeyEvent * ev ) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); vector* pColumns = pEngine->getSong()->get_pattern_group_vector(); if ( ev->key() == Qt::Key_Delete ) { if ( m_selectedCells.size() != 0 ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); // delete all selected cells for ( uint i = 0; i < m_selectedCells.size(); i++ ) { QPoint cell = m_selectedCells[ i ]; PatternList* pColumn = (*pColumns)[ cell.x() ]; pColumn->del(pPatternList->get( cell.y() ) ); } AudioEngine::get_instance()->unlock(); m_selectedCells.clear(); m_bSequenceChanged = true; update(); } return; } ev->ignore(); } void SongEditor::mousePressEvent( QMouseEvent *ev ) { if ( ev->x() < 10 ) { return; } int nRow = ev->y() / m_nGridHeight; int nColumn = ( (int)ev->x() - 10 ) / (int)m_nGridWidth; if ( ev->modifiers() == Qt::ControlModifier ) { INFOLOG( "[mousePressEvent] CTRL pressed!" ); m_bIsCtrlPressed = true; } else { m_bIsCtrlPressed = false; } HydrogenApp* h2app = HydrogenApp::get_instance(); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); // don't lock the audio driver before checking that... if ( nRow >= (int)pPatternList->size() || nRow < 0 || nColumn < 0 ) { return; } SongEditorActionMode actionMode = HydrogenApp::get_instance()->getSongEditorPanel()->getActionMode(); if ( actionMode == SELECT_ACTION ) { AudioEngine::get_instance()->lock( RIGHT_HERE ); bool bOverExistingPattern = false; for ( uint i = 0; i < m_selectedCells.size(); i++ ) { QPoint cell = m_selectedCells[ i ]; if ( cell.x() == nColumn && cell.y() == nRow ) { bOverExistingPattern = true; break; } } if ( bOverExistingPattern ) { // MOVE PATTERNS // INFOLOG( "[mousePressEvent] Move patterns" ); m_bIsMoving = true; m_bShowLasso = false; m_movingCells = m_selectedCells; m_clickPoint.setX( nColumn ); m_clickPoint.setY( nRow ); } else { // INFOLOG( "[mousePressEvent] Select patterns" ); // select patterns m_bShowLasso = true; m_lasso.setCoords( ev->x(), ev->y(), ev->x(), ev->y() ); setCursor( QCursor( Qt::CrossCursor ) ); m_selectedCells.clear(); m_selectedCells.push_back( QPoint( nColumn, nRow ) ); } AudioEngine::get_instance()->unlock(); // update m_bSequenceChanged = true; update(); } else if ( actionMode == DRAW_ACTION ) { H2Core::Pattern *pPattern = pPatternList->get( nRow ); vector *pColumns = pSong->get_pattern_group_vector(); // E' la lista di "colonne" di pattern if ( nColumn < (int)pColumns->size() ) { PatternList *pColumn = ( *pColumns )[ nColumn ]; bool bFound = false; unsigned nColumnIndex = 0; for ( nColumnIndex = 0; nColumnIndex < pColumn->size(); nColumnIndex++) { if ( pColumn->get( nColumnIndex ) == pPattern ) { // il pattern e' gia presente bFound = true; break; } } if ( bFound ) {//Delete pattern SE_deletePatternAction *action = new SE_deletePatternAction( nColumn, nRow, nColumnIndex) ; h2app->m_pUndoStack->push( action ); } else { if ( nColumn < (int)pColumns->size() ) { SE_addPatternAction *action = new SE_addPatternAction( nColumn, nRow, nColumnIndex ) ; h2app->m_pUndoStack->push( action ); } } } else { SE_addPatternAction *action = new SE_addPatternAction( nColumn, nRow, 0 ) ; h2app->m_pUndoStack->push( action ); } } h2app->getSongEditorPanel()->updatePlaybackTrackIfNecessary(); } void SongEditor::addPattern( int nColumn , int nRow ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); H2Core::Pattern *pPattern = pPatternList->get( nRow ); vector *pColumns = pSong->get_pattern_group_vector(); AudioEngine::get_instance()->lock( RIGHT_HERE ); if ( nColumn < (int)pColumns->size() ) { PatternList *pColumn = ( *pColumns )[ nColumn ]; // ADD PATTERN m_selectedCells.clear(); pColumn->add( pPattern ); } else { //we need to add some new columns.. PatternList *pColumn = new PatternList(); m_selectedCells.clear(); int nSpaces = nColumn - pColumns->size(); pColumns->push_back( pColumn ); for ( int i = 0; i < nSpaces; i++ ) { pColumn = new PatternList(); pColumns->push_back( pColumn ); } pColumn->add( pPattern ); } pSong->set_is_modified( true ); AudioEngine::get_instance()->unlock(); m_bSequenceChanged = true; update(); } void SongEditor::deletePattern( int nColumn , int nRow, unsigned nColumnIndex ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); H2Core::Pattern *pPattern = pPatternList->get( nRow ); vector *pColumns = pSong->get_pattern_group_vector(); AudioEngine::get_instance()->lock( RIGHT_HERE ); PatternList *pColumn = ( *pColumns )[ nColumn ]; pColumn->del( nColumnIndex ); // elimino le colonne vuote for ( int i = pColumns->size() - 1; i >= 0; i-- ) { PatternList *pColumn = ( *pColumns )[ i ]; if ( pColumn->size() == 0 ) { pColumns->erase( pColumns->begin() + i ); delete pColumn; } else { break; } } pSong->set_is_modified( true ); AudioEngine::get_instance()->unlock(); m_bSequenceChanged = true; update(); } void SongEditor::mouseMoveEvent(QMouseEvent *ev) { int nRow = ev->y() / m_nGridHeight; int nColumn = ( (int)ev->x() - 10 ) / (int)m_nGridWidth; PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list(); vector* pColumns = Hydrogen::get_instance()->getSong()->get_pattern_group_vector(); if ( m_bIsMoving ) { // WARNINGLOG( "[mouseMoveEvent] Move patterns not implemented yet" ); int nRowDiff = nRow - m_clickPoint.y(); int nColumnDiff = nColumn - m_clickPoint.x(); // INFOLOG( "[mouseMoveEvent] row diff: "+ to_string( nRowDiff ) ); // INFOLOG( "[mouseMoveEvent] col diff: "+ to_string( nColumnDiff ) ); for ( int i = 0; i < (int)m_movingCells.size(); i++ ) { QPoint cell = m_movingCells[ i ]; m_movingCells[ i ].setX( m_selectedCells[ i ].x() + nColumnDiff ); m_movingCells[ i ].setY( m_selectedCells[ i ].y() + nRowDiff ); } m_bSequenceChanged = true; update(); return; } if ( m_bShowLasso ) { // SELECTION setCursor( QCursor( Qt::CrossCursor ) ); int x = ev->x(); int y = ev->y(); if ( x < 0 ) { x = 0; } if ( y < 0 ) { y = 0; } m_lasso.setBottomRight( QPoint( x, y ) ); // aggiorno la lista di celle selezionate m_selectedCells.clear(); int nStartColumn = (int)( ( m_lasso.left() - 10.0 ) / m_nGridWidth ); int nEndColumn = nColumn; if ( nStartColumn > nEndColumn ) { int nTemp = nEndColumn; nEndColumn = nStartColumn; nStartColumn = nTemp; } int nStartRow = m_lasso.top() / m_nGridHeight; int nEndRow = nRow; if ( nStartRow > nEndRow ) { int nTemp = nEndRow; nEndRow = nStartRow; nStartRow = nTemp; } for ( int nRow = nStartRow; nRow <= nEndRow; nRow++ ) { for ( int nCol = nStartColumn; nCol <= nEndColumn; nCol++ ) { if ( nRow >= (int)pPatternList->size() || nRow < 0 || nCol < 0 ) { return; } H2Core::Pattern *pPattern = pPatternList->get( nRow ); if ( nCol < (int)pColumns->size() ) { PatternList *pColumn = ( *pColumns )[ nCol ]; for ( uint i = 0; i < pColumn->size(); i++) { if ( pColumn->get(i) == pPattern ) { // esiste un pattern in questa posizione m_selectedCells.push_back( QPoint( nCol, nRow ) ); } } } } } m_bSequenceChanged = true; update(); } } void SongEditor::mouseReleaseEvent( QMouseEvent *ev ) { UNUSED(ev); if ( m_bIsMoving ) { // fine dello spostamento dei pattern // create the new patterns /* * For the proper handling of undo events we have to make sure * that the array m_movingCells does not include cells that are * already existing. * * Example: A song consists of a sequence with the cells 0,1 and 3. * Consider that we the two first cells 0 and 1 get moved one * cell to the right (to 2,3). An undo action would now delete * (2,3) for and re-create 0,1. Cell 3 got deleted now, but it existed * before the first move operation. */ SongEditorGridRepresentationItem* item; m_existingCells.clear(); for ( uint i = 0; i < m_movingCells.size(); i++ ) { QPoint cell = m_movingCells[ i ]; //looking for cell identified with (cell.x/cell.y) in the gridRepresentation bool found = false; foreach(item, gridRepresentation) { if(item->x == cell.x() && item->y == cell.y()) { found = true; } } if( found ){ m_existingCells.push_back(cell); } } SE_movePatternCellAction *action = new SE_movePatternCellAction( m_movingCells, m_selectedCells , m_existingCells, m_bIsCtrlPressed); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } setCursor( QCursor( Qt::ArrowCursor ) ); m_bShowLasso = false; m_bSequenceChanged = true; m_bIsCtrlPressed = false; update(); } /** * @brief moves or copies a cell which represents a pattern * @param movingCells Target cells for move/copy action * @param selectedCells Currently selected cells for move/copy action * @param existingCells Cells which are included in selected/movingCells but where existing before(import for undo). * @param bIsCtrlPressed If ctrl is pressed, do copy instead of move * @param undo Determine if this is an undo-operation */ void SongEditor::movePatternCellAction( std::vector movingCells, std::vector selectedCells, std::vector existingCells, bool bIsCtrlPressed, bool undo ) { Hydrogen *pEngine = Hydrogen::get_instance(); PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); vector* pColumns = pEngine->getSong()->get_pattern_group_vector(); AudioEngine::get_instance()->lock( RIGHT_HERE ); //create the new patterns for ( uint i = 0; i < movingCells.size(); i++ ) { QPoint cell = movingCells[ i ]; if ( cell.x() < 0 || cell.y() < 0 || cell.y() >= (int)pPatternList->size() ) { // skip continue; } // aggiungo un pattern per volta PatternList* pColumn = nullptr; if ( cell.x() < (int)pColumns->size() ) { pColumn = (*pColumns)[ cell.x() ]; } else { // creo dei patternlist vuoti int nSpaces = cell.x() - pColumns->size(); for ( int i = 0; i <= nSpaces; i++ ) { pColumn = new PatternList(); pColumns->push_back( pColumn ); } } pColumn->add( pPatternList->get( cell.y() ) ); } if ( bIsCtrlPressed) //Copy { if( undo ) { // remove the old patterns for ( uint i = 0; i < selectedCells.size(); i++ ) { QPoint cell = selectedCells[ i ]; bool existing = false; for ( uint i = 0; i < existingCells.size(); i++ ) { QPoint existing_cell = existingCells[ i ]; if(existing_cell.x() == cell.x() && existing_cell.y() == cell.y()) existing = true; } //this cell existed before. Don't delete it! if(existing){ continue; } PatternList* pColumn = nullptr; if ( cell.x() < (int)pColumns->size() ) { pColumn = (*pColumns)[ cell.x() ]; } else { pColumn = new PatternList(); pColumns->push_back( pColumn ); } pColumn->del(pPatternList->get( cell.y() ) ); } } } else { // MOVE // remove the old patterns for ( uint i = 0; i < selectedCells.size(); i++ ) { QPoint cell = selectedCells[ i ]; PatternList* pColumn = nullptr; /* * Check first if pattern was present in movingCells. * If it was, don't delete it! */ bool moved = false; for ( uint i = 0; i < movingCells.size(); i++ ) { QPoint cell2 = movingCells[ i ]; if( cell.x() == cell2.x() && cell.y() == cell2.y() ){ moved = true; } } if( moved ) { continue; } if( undo ) { bool existing = false; for ( uint i = 0; i < existingCells.size(); i++ ) { QPoint existing_cell = existingCells[ i ]; if(existing_cell.x() == cell.x() && existing_cell.y() == cell.y()) existing = true; } //this cell existed before. Don't delete it! if(existing){ continue; } } if ( cell.x() < (int)pColumns->size() ) { pColumn = (*pColumns)[ cell.x() ]; } else { pColumn = new PatternList(); pColumns->push_back( pColumn ); } pColumn->del(pPatternList->get( cell.y() ) ); } } // remove the empty patternlist at the end of the song for ( int i = pColumns->size() - 1; i != 0 ; i-- ) { PatternList *pList = (*pColumns)[ i ]; int nSize = pList->size(); if ( nSize == 0 ) { pColumns->erase( pColumns->begin() + i ); delete pList; } else { break; } } pEngine->getSong()->set_is_modified( true ); AudioEngine::get_instance()->unlock(); m_bIsMoving = false; m_movingCells.clear(); m_selectedCells.clear(); m_bSequenceChanged = true; update(); } void SongEditor::paintEvent( QPaintEvent *ev ) { /* INFOLOG( "[paintEvent] x: " + to_string( ev->rect().x() ) + " y: " + to_string( ev->rect().y() ) + " w: " + to_string( ev->rect().width() ) + " h: " + to_string( ev->rect().height() ) ); */ // ridisegno tutto solo se sono cambiate le note if (m_bSequenceChanged) { m_bSequenceChanged = false; drawSequence(); } QPainter painter(this); painter.drawPixmap( ev->rect(), *m_pSequencePixmap, ev->rect() ); if ( m_bShowLasso ) { QPen pen( Qt::white ); pen.setStyle( Qt::DotLine ); painter.setPen( pen ); painter.drawRect( m_lasso ); } } void SongEditor::createBackground() { UIStyle *pStyle = Preferences::get_instance()->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_songEditor_backgroundColor.getRed(), pStyle->m_songEditor_backgroundColor.getGreen(), pStyle->m_songEditor_backgroundColor.getBlue() ); QColor alternateRowColor( pStyle->m_songEditor_alternateRowColor.getRed(), pStyle->m_songEditor_alternateRowColor.getGreen(), pStyle->m_songEditor_alternateRowColor.getBlue() ); QColor linesColor( pStyle->m_songEditor_lineColor.getRed(), pStyle->m_songEditor_lineColor.getGreen(), pStyle->m_songEditor_lineColor.getBlue() ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); uint nPatterns = pSong->get_pattern_list()->size(); static int nOldHeight = -1; int nNewHeight = m_nGridHeight * nPatterns; if (nOldHeight != nNewHeight) { // cambiamento di dimensioni... if (nNewHeight == 0) { nNewHeight = 1; // the pixmap should not be empty } m_pBackgroundPixmap = new QPixmap( width(), nNewHeight ); // initialize the pixmap m_pSequencePixmap = new QPixmap( width(), nNewHeight ); // initialize the pixmap this->resize( QSize( width(), nNewHeight ) ); } m_pBackgroundPixmap->fill( alternateRowColor ); QPainter p( m_pBackgroundPixmap ); p.setPen( linesColor ); /* // sfondo per celle scure (alternato) for (uint i = 0; i < nPatterns; i++) { if ( ( i % 2) != 0) { uint y = m_nGridHeight * i; p.fillRect ( 0, y, m_nMaxPatternSequence * m_nGridWidth, 2, backgroundColor ); p.fillRect ( 0, y + 2, m_nMaxPatternSequence * m_nGridWidth, m_nGridHeight - 4, alternateRowColor ); p.fillRect ( 0, y + m_nGridHeight - 2, m_nMaxPatternSequence * m_nGridWidth, 2, backgroundColor ); } } */ // celle... p.setPen( linesColor ); // vertical lines for (uint i = 0; i < m_nMaxPatternSequence + 1; i++) { uint x = 10 + i * m_nGridWidth; int x1 = x; int x2 = x + m_nGridWidth; p.drawLine( x1, 0, x1, m_nGridHeight * nPatterns ); p.drawLine( x2, 0, x2, m_nGridHeight * nPatterns ); } p.setPen( linesColor ); // horizontal lines for (uint i = 0; i < nPatterns; i++) { uint y = m_nGridHeight * i; int y1 = y + 2; int y2 = y + m_nGridHeight - 2; p.drawLine( 0, y1, (m_nMaxPatternSequence * m_nGridWidth), y1 ); p.drawLine( 0, y2, (m_nMaxPatternSequence * m_nGridWidth), y2 ); } p.setPen( backgroundColor ); // horizontal lines (erase..) for (uint i = 0; i < nPatterns + 1; i++) { uint y = m_nGridHeight * i; p.fillRect( 0, y, m_nMaxPatternSequence * m_nGridWidth, 2, backgroundColor ); p.drawLine( 0, y + m_nGridHeight - 1, m_nMaxPatternSequence * m_nGridWidth, y + m_nGridHeight - 1 ); } //~ celle m_bSequenceChanged = true; } void SongEditor::cleanUp(){ delete m_pBackgroundPixmap; delete m_pSequencePixmap; } void SongEditor::drawSequence() { QPainter p; p.begin( m_pSequencePixmap ); p.drawPixmap( rect(), *m_pBackgroundPixmap, rect() ); p.end(); Song* song = Hydrogen::get_instance()->getSong(); PatternList *patList = song->get_pattern_list(); vector* pColumns = song->get_pattern_group_vector(); uint listLength = patList->size(); //Drawing the pattern based on the gridRepresentation array while (!gridRepresentation.isEmpty()) { delete gridRepresentation.takeFirst(); } for (uint i = 0; i < pColumns->size(); i++) { PatternList* pColumn = (*pColumns)[ i ]; std::set drawnAsVirtual; for (uint nPat = 0; nPat < pColumn->size(); ++nPat) { H2Core::Pattern *pat = pColumn->get( nPat ); if (drawnAsVirtual.find(pat) == drawnAsVirtual.end()) { int position = -1; // find the position in pattern list for (uint j = 0; j < listLength; j++) { H2Core::Pattern *pat2 = patList->get( j ); if (pat == pat2) { position = j; break; } } if (position == -1) { WARNINGLOG( QString("[drawSequence] position == -1, group = %1").arg( i ) ); } //normal pattern gridRepresentation.append(new SongEditorGridRepresentationItem(i,position,false)); }//if for ( Pattern::virtual_patterns_cst_it_t it = pat->get_flattened_virtual_patterns()->begin(); it != pat->get_flattened_virtual_patterns()->end(); ++it) { if (drawnAsVirtual.find(*it) == drawnAsVirtual.end()) { int position = patList->index(*it); if (position == -1) { WARNINGLOG( QString("[drawSequence] position == -1, group = %1").arg( i ) ); } //virtual pattern gridRepresentation.append(new SongEditorGridRepresentationItem(i,position,true)); drawnAsVirtual.insert(*it); } } } } //Draw the patterns according to the gridRepresentation SongEditorGridRepresentationItem* s; foreach(s, gridRepresentation) { drawPattern( s->x, s->y, s->value); } // Moving cells p.begin( m_pSequencePixmap ); // p.setRasterOp( Qt::XorROP ); // comix: this composition mode seems to be not available on Mac p.setCompositionMode( QPainter::CompositionMode_Xor ); QPen pen( Qt::gray ); pen.setStyle( Qt::DotLine ); p.setPen( pen ); for ( uint i = 0; i < m_movingCells.size(); i++ ) { int x = 10 + m_nGridWidth * ( m_movingCells[ i ] ).x(); int y = m_nGridHeight * ( m_movingCells[ i ] ).y(); QColor patternColor; patternColor.setRgb( 255, 255, 255 ); p.fillRect( x + 2, y + 4, m_nGridWidth - 3, m_nGridHeight - 7, patternColor ); } } void SongEditor::drawPattern( int pos, int number, bool invertColour ) { Preferences *pref = Preferences::get_instance(); UIStyle *pStyle = pref->getDefaultUIStyle(); QPainter p( m_pSequencePixmap ); QColor patternColor( pStyle->m_songEditor_pattern1Color.getRed(), pStyle->m_songEditor_pattern1Color.getGreen(), pStyle->m_songEditor_pattern1Color.getBlue() ); /* * The following color modes are available: * * Fixed: One color. Argument: specified color * Steps: User defined number of steps. * Automatic: Steps = Number of pattern in song */ int coloringMethod = pref->getColoringMethod(); int coloringMethodAuxValue = pref->getColoringMethodAuxValue(); int steps = 1; /* * This coloring of the song editor "squares" is done using the hsv color model, * see http://qt-project.org/doc/qt-4.8/qcolor.html#the-hsv-color-model for details. * * The default color of the cubes in rgb is 97,167,251. * The hsv equivalent is 213,156,249. */ int hue = 213; Song* song = Hydrogen::get_instance()->getSong(); PatternList *patList = song->get_pattern_list(); switch(coloringMethod) { case 0: //Automatic steps = patList->size(); if(steps == 0) { //beware of the division by zero.. steps = 1; } hue = ((number % steps) * (300 / steps) + 213) % 300; patternColor.setHsv( hue , 156 , 249); break; case 1: //Steps steps = coloringMethodAuxValue; hue = ((number % steps) * (300 / steps) + 213) % 300; patternColor.setHsv( hue , 156, 249); break; case 2: //Fixed color hue = coloringMethodAuxValue; patternColor.setHsv( hue , 156, 249); break; } if (true == invertColour) { patternColor = patternColor.darker(200); }//if bool bIsSelected = false; for ( uint i = 0; i < m_selectedCells.size(); i++ ) { QPoint point = m_selectedCells[ i ]; if ( point.x() == pos && point.y() == number ) { bIsSelected = true; break; } } if ( bIsSelected ) { patternColor = patternColor.darker( 130 ); } int x = 10 + m_nGridWidth * pos; int y = m_nGridHeight * number; p.fillRect( x + 1, y + 3, m_nGridWidth - 1, m_nGridHeight - 5, patternColor ); } void SongEditor::clearThePatternSequenceVector( QString filename ) { Hydrogen *engine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *song = engine->getSong(); //before deleting the sequence, write a temp sequence file to disk song->writeTempPatternList( filename ); vector *pPatternGroupsVect = song->get_pattern_group_vector(); for (uint i = 0; i < pPatternGroupsVect->size(); i++) { PatternList *pPatternList = (*pPatternGroupsVect)[i]; pPatternList->clear(); delete pPatternList; } pPatternGroupsVect->clear(); song->set_is_modified( true ); AudioEngine::get_instance()->unlock(); m_bSequenceChanged = true; update(); } void SongEditor::updateEditorandSetTrue() { Hydrogen::get_instance()->getSong()->set_is_modified( true ); m_bSequenceChanged = true; update(); } // ::::::::::::::::::: const char* SongEditorPatternList::__class_name = "SongEditorPatternList"; SongEditorPatternList::SongEditorPatternList( QWidget *parent ) : QWidget( parent ) , Object( __class_name ) , EventListener() , m_pBackgroundPixmap( nullptr ) { m_nWidth = 200; m_nGridHeight = 18; setAttribute(Qt::WA_NoBackground); setAcceptDrops(true); patternBeingEdited = nullptr; line = new QLineEdit( "Inline Pattern Name", this ); line->setFrame( false ); line->hide(); line->setAcceptDrops( false ); connect( line, SIGNAL(editingFinished()), this, SLOT(inlineEditingFinished()) ); connect( line, SIGNAL(returnPressed()), this, SLOT(inlineEditingEntered()) ); this->resize( m_nWidth, m_nInitialHeight ); m_labelBackgroundLight.load( Skin::getImagePath() + "/songEditor/songEditorLabelBG.png" ); m_labelBackgroundDark.load( Skin::getImagePath() + "/songEditor/songEditorLabelABG.png" ); m_labelBackgroundSelected.load( Skin::getImagePath() + "/songEditor/songEditorLabelSBG.png" ); m_playingPattern_on_Pixmap.load( Skin::getImagePath() + "/songEditor/playingPattern_on.png" ); m_playingPattern_off_Pixmap.load( Skin::getImagePath() + "/songEditor/playingPattern_off.png" ); m_pPatternPopup = new QMenu( this ); m_pPatternPopup->addAction( tr("Copy"), this, SLOT( patternPopup_copy() ) ); m_pPatternPopup->addAction( tr("Delete"), this, SLOT( patternPopup_delete() ) ); m_pPatternPopup->addAction( tr("Fill/Clear ..."), this, SLOT( patternPopup_fill() ) ); m_pPatternPopup->addAction( tr("Properties"), this, SLOT( patternPopup_properties() ) ); m_pPatternPopup->addAction( tr("Load Pattern"), this, SLOT( patternPopup_load() ) ); m_pPatternPopup->addAction( tr("Save Pattern"), this, SLOT( patternPopup_save() ) ); m_pPatternPopup->addAction( tr("Export Pattern"), this, SLOT( patternPopup_export() ) ); m_pPatternPopup->addAction( tr("Virtual Pattern"), this, SLOT( patternPopup_virtualPattern() ) ); HydrogenApp::get_instance()->addEventListener( this ); createBackground(); update(); } SongEditorPatternList::~SongEditorPatternList() { } void SongEditorPatternList::patternChangedEvent() { createBackground(); update(); ///here we check the timeline && m_pSong->get_mode() == Song::SONG_MODE Hydrogen* pHydrogen = Hydrogen::get_instance(); #ifdef H2CORE_HAVE_JACK if ( pHydrogen->haveJackTransport() ) { return; } #endif Timeline* pTimeline = pHydrogen->getTimeline(); if ( ( Preferences::get_instance()->getUseTimelineBpm() ) && ( pHydrogen->getSong()->get_mode() == Song::SONG_MODE ) ){ for ( int i = 0; i < static_cast(pTimeline->m_timelinevector.size()); i++){ if ( ( pTimeline->m_timelinevector[i].m_htimelinebeat == pHydrogen->getPatternPos() ) && ( pHydrogen->getNewBpmJTM() != pTimeline->m_timelinevector[i].m_htimelinebpm ) ){ pHydrogen->setBPM( pTimeline->m_timelinevector[i].m_htimelinebpm ); } } } } /// Single click, select the next pattern void SongEditorPatternList::mousePressEvent( QMouseEvent *ev ) { int row = (ev->y() / m_nGridHeight); Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); PatternList *patternList = song->get_pattern_list(); if ( row >= (int)patternList->size() ) { return; } if ( (ev->button() == Qt::MidButton) || (ev->modifiers() == Qt::ControlModifier && ev->button() == Qt::RightButton) || (ev->modifiers() == Qt::ControlModifier && ev->button() == Qt::LeftButton) ){ togglePattern( row ); } else { engine->setSelectedPatternNumber( row ); if (ev->button() == Qt::RightButton) { m_pPatternPopup->popup( QPoint( ev->globalX(), ev->globalY() ) ); } } createBackground(); update(); } /// /// Start/stop playing a pattern in "pattern mode" /// void SongEditorPatternList::togglePattern( int row ) { Hydrogen *pEngine = Hydrogen::get_instance(); pEngine->sequencer_setNextPattern( row ); createBackground(); update(); } void SongEditorPatternList::mouseDoubleClickEvent( QMouseEvent *ev ) { int row = (ev->y() / m_nGridHeight); inlineEditPatternName( row ); } void SongEditorPatternList::inlineEditPatternName( int row ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); if ( row >= (int)pPatternList->size() ) { return; } patternBeingEdited = pPatternList->get( row ); line->setGeometry( 23, row * m_nGridHeight , m_nWidth - 23, m_nGridHeight ); line->setText( patternBeingEdited->get_name() ); line->selectAll(); line->show(); line->setFocus(); } void SongEditorPatternList::inlineEditingEntered() { assert( patternBeingEdited != nullptr ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); /* * Make sure that the entered pattern name is unique. * If it is not, use an unused patten name. */ QString patternName = pPatternList->find_unused_pattern_name( line->text() ); int nSelectedPattern = pEngine->getSelectedPatternNumber(); SE_modifyPatternPropertiesAction *action = new SE_modifyPatternPropertiesAction( patternBeingEdited->get_name() , patternBeingEdited->get_info(), patternBeingEdited->get_category(), patternName, patternBeingEdited->get_info(), patternBeingEdited->get_category(), nSelectedPattern ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } void SongEditorPatternList::inlineEditingFinished() { patternBeingEdited = nullptr; line->hide(); } void SongEditorPatternList::paintEvent( QPaintEvent *ev ) { QPainter painter(this); qreal pixelRatio = devicePixelRatio(); QRectF srcRect( pixelRatio * ev->rect().x(), pixelRatio * ev->rect().y(), pixelRatio * ev->rect().width(), pixelRatio * ev->rect().height() ); painter.drawPixmap( ev->rect(), *m_pBackgroundPixmap, srcRect ); } void SongEditorPatternList::updateEditor() { if(!isVisible()) { return; } update(); } void SongEditorPatternList::createBackground() { Preferences *pref = Preferences::get_instance(); UIStyle *pStyle = pref->getDefaultUIStyle(); QColor textColor( pStyle->m_songEditor_textColor.getRed(), pStyle->m_songEditor_textColor.getGreen(), pStyle->m_songEditor_textColor.getBlue() ); QString family = pref->getApplicationFontFamily(); int size = pref->getApplicationFontPointSize(); QFont textFont( family, size ); QFont boldTextFont( textFont); boldTextFont.setPointSize(10); boldTextFont.setBold( true ); Hydrogen *pEngine = Hydrogen::get_instance(); //Do not redraw anything if Export is active. //https://github.com/hydrogen-music/hydrogen/issues/857 if( pEngine->getIsExportSessionActive() ) { return; } Song *pSong = pEngine->getSong(); int nPatterns = pSong->get_pattern_list()->size(); int nSelectedPattern = pEngine->getSelectedPatternNumber(); static int oldHeight = -1; int newHeight = m_nGridHeight * nPatterns; if (oldHeight != newHeight) { if (newHeight == 0) { newHeight = 1; // the pixmap should not be empty } delete m_pBackgroundPixmap; qreal pixelRatio = devicePixelRatio(); m_pBackgroundPixmap = new QPixmap( m_nWidth * pixelRatio , newHeight * pixelRatio ); // initialize the pixmap m_pBackgroundPixmap->setDevicePixelRatio( pixelRatio ); this->resize( m_nWidth, newHeight ); } m_pBackgroundPixmap->fill( Qt::black ); QPainter p( m_pBackgroundPixmap ); p.setFont( boldTextFont ); for ( int i = 0; i < nPatterns; i++ ) { uint y = m_nGridHeight * i; if ( i == nSelectedPattern ) { p.drawPixmap( QPoint( 0, y ), m_labelBackgroundSelected ); } else { if ( ( i % 2) == 0 ) { p.drawPixmap( QPoint( 0, y ), m_labelBackgroundDark ); } else { p.drawPixmap( QPoint( 0, y ), m_labelBackgroundLight ); } } } std::unique_ptr PatternArray{new PatternDisplayInfo[nPatterns]}; AudioEngine::get_instance()->lock( RIGHT_HERE ); PatternList *pCurrentPatternList = pEngine->getCurrentPatternList(); //assemble the data.. for ( int i = 0; i < nPatterns; i++ ) { H2Core::Pattern *pPattern = pSong->get_pattern_list()->get(i); if ( pCurrentPatternList->index( pPattern ) != -1 ) { PatternArray[i].bActive = true; } else { PatternArray[i].bActive = false; } if ( pEngine->getNextPatterns()->index( pPattern ) != -1 ) { PatternArray[i].bNext = true; } else { PatternArray[i].bNext = false; } PatternArray[i].sPatternName = pPattern->get_name(); } AudioEngine::get_instance()->unlock(); /// paint the foreground (pattern name etc.) for ( int i = 0; i < nPatterns; i++ ) { if ( i == nSelectedPattern ) { p.setPen( QColor( 0,0,0 ) ); } else { p.setPen( textColor ); } uint text_y = i * m_nGridHeight; if ( PatternArray[i].bNext ) { p.drawPixmap( QPoint( 5, text_y + 3 ), m_playingPattern_off_Pixmap ); } else if (PatternArray[i].bActive) { //mark active pattern with triangular if( ! pref->patternModePlaysSelected() ){ p.drawPixmap( QPoint( 5, text_y + 3 ), m_playingPattern_on_Pixmap ); } } p.drawText( 25, text_y - 1, m_nWidth - 25, m_nGridHeight + 2, Qt::AlignVCenter, PatternArray[i].sPatternName); } } void SongEditorPatternList::patternPopup_virtualPattern() { Hydrogen *pEngine = Hydrogen::get_instance(); VirtualPatternDialog *dialog = new VirtualPatternDialog( this ); SongEditorPanel *pSEPanel = HydrogenApp::get_instance()->getSongEditorPanel(); int tmpselectedpatternpos = pEngine->getSelectedPatternNumber(); dialog->patternList->setSortingEnabled(1); Song *song = pEngine->getSong(); PatternList *pPatternList = song->get_pattern_list(); H2Core::Pattern *selectedPattern = pPatternList->get(tmpselectedpatternpos); std::map patternNameMap; int listsize = pPatternList->size(); for (unsigned int index = 0; index < listsize; ++index) { H2Core::Pattern *curPattern = pPatternList->get( index ); QString patternName = curPattern->get_name(); if (patternName == selectedPattern->get_name()) { continue; }//if patternNameMap[patternName] = curPattern; QListWidgetItem *newItem = new QListWidgetItem(patternName, dialog->patternList); dialog->patternList->insertItem(0, newItem ); if (selectedPattern->get_virtual_patterns()->find(curPattern) != selectedPattern->get_virtual_patterns()->end()) { newItem->setSelected( true ); }//if }//for if ( dialog->exec() == QDialog::Accepted ) { selectedPattern->virtual_patterns_clear(); for (unsigned int index = 0; index < listsize-1; ++index) { QListWidgetItem *listItem = dialog->patternList->item(index); if (listItem->isSelected() == true) { if (patternNameMap.find(listItem->text()) != patternNameMap.end()) { selectedPattern->virtual_patterns_add(patternNameMap[listItem->text()]); }//if }//if }//for pSEPanel->updateAll(); }//if pPatternList->flattened_virtual_patterns_compute(); delete dialog; }//patternPopup_virtualPattern void SongEditorPatternList::patternPopup_load() { Hydrogen *engine = Hydrogen::get_instance(); int nSelectedPattern = engine->getSelectedPatternNumber(); Song *song = engine->getSong(); Pattern *pattern = song->get_pattern_list()->get( nSelectedPattern ); QFileDialog fd(this); fd.setFileMode( QFileDialog::ExistingFile ); fd.setNameFilter( Filesystem::patterns_filter_name ); fd.setDirectory( Filesystem::patterns_dir() ); fd.setWindowTitle( tr( "Open Pattern" ) ); if (fd.exec() != QDialog::Accepted) { return; } QString patternPath = fd.selectedFiles().first(); QString prevPatternPath = Files::savePatternTmp( pattern->get_name(), pattern, song, engine->getCurrentDrumkitname() ); if ( prevPatternPath.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export pattern.") ); return; } LocalFileMng fileMng; QString sequencePath = Filesystem::tmp_file_path( "SEQ.xml" ); if ( !song->writeTempPatternList( sequencePath ) ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export sequence.") ); return; } SE_loadPatternAction *action = new SE_loadPatternAction( patternPath, prevPatternPath, sequencePath, nSelectedPattern, false ); HydrogenApp *hydrogenApp = HydrogenApp::get_instance(); hydrogenApp->m_pUndoStack->push( action ); } void SongEditorPatternList::loadPatternAction( QString afilename, int position) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); Pattern* pNewPattern = Pattern::load_file( afilename, pSong->get_instrument_list() ); if ( pNewPattern == nullptr ) { _ERRORLOG( "Error loading the pattern" ); return; } if( !pPatternList->check_name( pNewPattern->get_name() ) ) { pNewPattern->set_name( pPatternList->find_unused_pattern_name( pNewPattern->get_name() ) ); } pPatternList->insert( position, pNewPattern ); pEngine->setSelectedPatternNumber( position ); pSong->set_is_modified( true ); createBackground(); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); } void SongEditorPatternList::patternPopup_export() { HydrogenApp::get_instance()->getMainForm()->action_file_export_pattern_as(); return; } void SongEditorPatternList::patternPopup_save() { Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); Pattern *pattern = song->get_pattern_list()->get( engine->getSelectedPatternNumber() ); QString path = Files::savePatternNew( pattern->get_name(), pattern, song, engine->getCurrentDrumkitname() ); if ( path.isEmpty() ) { if ( QMessageBox::information( this, "Hydrogen", tr( "The pattern-file exists. \nOverwrite the existing pattern?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ) != 0 ) { return; } path = Files::savePatternOver( pattern->get_name(), pattern, song, engine->getCurrentDrumkitname() ); } if ( path.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export pattern.") ); return; } HydrogenApp::get_instance()->setStatusBarMessage( tr( "Pattern saved." ), 10000 ); SoundLibraryDatabase::get_instance()->updatePatterns(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); } void SongEditorPatternList::patternPopup_edit() { HydrogenApp::get_instance()->getPatternEditorPanel()->show(); HydrogenApp::get_instance()->getPatternEditorPanel()->setFocus(); } void SongEditorPatternList::patternPopup_properties() { Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); PatternList *patternList = song->get_pattern_list(); int nSelectedPattern = engine->getSelectedPatternNumber(); H2Core::Pattern *pattern = patternList->get( nSelectedPattern ); PatternPropertiesDialog *dialog = new PatternPropertiesDialog(this, pattern, nSelectedPattern, false); dialog->exec(); delete dialog; dialog = nullptr; } void SongEditorPatternList::acceptPatternPropertiesDialogSettings(QString newPatternName, QString newPatternInfo, QString newPatternCategory, int patternNr) { Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); PatternList *patternList = song->get_pattern_list(); H2Core::Pattern *pattern = patternList->get( patternNr ); pattern->set_name( newPatternName ); pattern->set_info( newPatternInfo ); pattern->set_category( newPatternCategory ); song->set_is_modified( true ); EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); createBackground(); update(); } void SongEditorPatternList::revertPatternPropertiesDialogSettings(QString oldPatternName, QString oldPatternInfo, QString oldPatternCategory, int patternNr) { Hydrogen *engine = Hydrogen::get_instance(); Song *song = engine->getSong(); PatternList *patternList = song->get_pattern_list(); H2Core::Pattern *pattern = patternList->get( patternNr ); pattern->set_name( oldPatternName ); pattern->set_category( oldPatternCategory ); song->set_is_modified( true ); EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); createBackground(); update(); } void SongEditorPatternList::patternPopup_delete() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); int patternPosition = pEngine->getSelectedPatternNumber(); Pattern *pattern = pSong->get_pattern_list()->get( patternPosition ); QString patternPath = Files::savePatternTmp( pattern->get_name(), pattern, pSong, pEngine->getCurrentDrumkitname() ); if ( patternPath.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export pattern.") ); return; } LocalFileMng fileMng; QString sequencePath = Filesystem::tmp_file_path( "SEQ.xml" ); if ( !pSong->writeTempPatternList( sequencePath ) ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export sequence.") ); return; } SE_deletePatternFromListAction *action = new SE_deletePatternFromListAction( patternPath , sequencePath, patternPosition ); HydrogenApp *hydrogenApp = HydrogenApp::get_instance(); hydrogenApp->m_pUndoStack->push( action ); } void SongEditorPatternList::deletePatternFromList( QString patternFilename, QString sequenceFileName, int patternPosition ) { Hydrogen *pEngine = Hydrogen::get_instance(); if ( pEngine->getSong()->get_mode() == Song::PATTERN_MODE ) { pEngine->sequencer_setNextPattern( -1 ); } Song *song = pEngine->getSong(); PatternList *pSongPatternList = song->get_pattern_list(); H2Core::Pattern *pattern = pSongPatternList->get( patternPosition ); INFOLOG( QString("[patternPopup_delete] Delete pattern: %1 @%2").arg(pattern->get_name()).arg( (long long)pattern ) ); pSongPatternList->del(pattern); vector *patternGroupVect = song->get_pattern_group_vector(); uint i = 0; while (i < patternGroupVect->size() ) { PatternList *list = (*patternGroupVect)[i]; uint j = 0; while ( j < list->size() ) { H2Core::Pattern *pOldPattern = list->get( j ); if (pOldPattern == pattern ) { list->del( j ); continue; } j++; } i++; } //Lock because PatternList will be modified AudioEngine::get_instance()->lock( RIGHT_HERE ); PatternList *list = pEngine->getCurrentPatternList(); list->del( pattern ); // se esiste, seleziono il primo pattern if ( pSongPatternList->size() > 0 ) { H2Core::Pattern *pFirstPattern = pSongPatternList->get( 0 ); list->add( pFirstPattern ); } else { // there's no patterns.. Pattern *pEmptyPattern = new Pattern(); pEmptyPattern->set_name( tr("Pattern 1") ); pEmptyPattern->set_category( tr("not_categorized") ); pSongPatternList->add( pEmptyPattern ); } AudioEngine::get_instance()->unlock(); pEngine->setSelectedPatternNumber( -1 ); pEngine->setSelectedPatternNumber( 0 ); for (unsigned int index = 0; index < pSongPatternList->size(); ++index) { H2Core::Pattern *curPattern = pSongPatternList->get(index); Pattern::virtual_patterns_cst_it_t it = curPattern->get_virtual_patterns()->find(pattern); if (it != curPattern->get_virtual_patterns()->end()) { curPattern->virtual_patterns_del(*it); }//if }//for pSongPatternList->flattened_virtual_patterns_compute(); delete pattern; song->set_is_modified( true ); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); } void SongEditorPatternList::restoreDeletedPatternsFromList( QString patternFilename, QString sequenceFileName, int patternPosition ) { Hydrogen *engine = Hydrogen::get_instance(); Song *pSong = engine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); Pattern* pattern = Pattern::load_file( patternFilename, pSong->get_instrument_list() ); if ( pattern == nullptr ) { _ERRORLOG( "Error loading the pattern" ); } pPatternList->insert( patternPosition, pattern ); pSong->set_is_modified( true ); createBackground(); engine->setSelectedPatternNumber( patternPosition ); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); } void SongEditorPatternList::patternPopup_copy() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); int nSelectedPattern = pEngine->getSelectedPatternNumber(); H2Core::Pattern *pPattern = pPatternList->get( nSelectedPattern ); H2Core::Pattern *pNewPattern = new Pattern( pPattern ); PatternPropertiesDialog *dialog = new PatternPropertiesDialog( this, pNewPattern, nSelectedPattern, true ); if ( dialog->exec() == QDialog::Accepted ) { QString filePath = Files::savePatternTmp( pNewPattern->get_name(), pNewPattern, pSong, pEngine->getCurrentDrumkitname() ); if ( filePath.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not export pattern.") ); return; } SE_copyPatternAction *action = new SE_copyPatternAction( filePath, nSelectedPattern + 1 ); HydrogenApp *hydrogenApp = HydrogenApp::get_instance(); hydrogenApp->m_pUndoStack->push( action ); } delete dialog; delete pNewPattern; HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); } void SongEditorPatternList::patternPopup_copyAction( QString patternFilename, int patternposition ) { Hydrogen *engine = Hydrogen::get_instance(); Song *pSong = engine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); Pattern* pattern = Pattern::load_file( patternFilename, pSong->get_instrument_list() ); if ( pattern == nullptr ) { _ERRORLOG( "Error loading the pattern" ); return; } pPatternList->insert( patternposition, pattern ); engine->setSelectedPatternNumber( patternposition ); pSong->set_is_modified( true ); createBackground(); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 ); } void SongEditorPatternList::patternPopup_fill() { Hydrogen *pEngine = Hydrogen::get_instance(); int nSelectedPattern = pEngine->getSelectedPatternNumber(); FillRange range; PatternFillDialog *dialog = new PatternFillDialog( this, &range ); // use a PatternFillDialog to get the range and mode data if ( dialog->exec() == QDialog::Accepted ) { SE_fillRangePatternAction *action = new SE_fillRangePatternAction( &range, nSelectedPattern ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } delete dialog; } void SongEditorPatternList::fillRangeWithPattern( FillRange* pRange, int nPattern ) { Hydrogen *pEngine = Hydrogen::get_instance(); AudioEngine::get_instance()->lock( RIGHT_HERE ); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); H2Core::Pattern *pPattern = pPatternList->get( nPattern ); vector *pColumns = pSong->get_pattern_group_vector(); // E' la lista di "colonne" di pattern PatternList *pColumn = nullptr; int nColumn, nColumnIndex; bool bHasPattern = false; int fromVal = pRange->fromVal - 1; int toVal = pRange->toVal; // Add patternlists to PatternGroupVector as necessary int nDelta = toVal - pColumns->size() + 1; for ( int i = 0; i < nDelta; i++ ) { pColumn = new PatternList(); pColumns->push_back( pColumn ); } // Fill or Clear each cell in range for ( nColumn = fromVal; nColumn < toVal; nColumn++ ) { // expand Pattern pColumn = ( *pColumns )[ nColumn ]; assert( pColumn ); bHasPattern = false; // check whether the pattern (and column) already exists for ( nColumnIndex = 0; pColumn && nColumnIndex < (int)pColumn->size(); nColumnIndex++) { if ( pColumn->get( nColumnIndex ) == pPattern ) { bHasPattern = true; break; } } if ( pRange->bInsert && !bHasPattern ) { //fill pColumn->add( pPattern); } else if ( !pRange->bInsert && bHasPattern ) { // clear pColumn->del( pPattern); } } // remove all the empty patternlists at the end of the song for ( int i = pColumns->size() - 1; i != 0 ; i-- ) { PatternList *pList = (*pColumns)[ i ]; int nSize = pList->size(); if ( nSize == 0 ) { pColumns->erase( pColumns->begin() + i ); delete pList; } else { break; } } AudioEngine::get_instance()->unlock(); // Update pSong->set_is_modified( true ); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); } ///drag & drop void SongEditorPatternList::dragEnterEvent(QDragEnterEvent *event) { if ( event->mimeData()->hasFormat("text/plain") ) { event->acceptProposedAction(); } } void SongEditorPatternList::dropEvent(QDropEvent *event) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); QString sText = event->mimeData()->text(); const QMimeData* mimeData = event->mimeData(); int nTargetPattern = 0; if(m_nGridHeight > 0) { nTargetPattern = event->pos().y() / m_nGridHeight; } if( sText.startsWith("Songs:") || sText.startsWith("move instrument:") || sText.startsWith("importInstrument:")){ event->acceptProposedAction(); return; } if ( sText.startsWith("move pattern:") ) { int nSourcePattern = pEngine->getSelectedPatternNumber(); if ( nSourcePattern == nTargetPattern ) { event->acceptProposedAction(); return; } SE_movePatternListItemAction *action = new SE_movePatternListItemAction( nSourcePattern , nTargetPattern ) ; HydrogenApp::get_instance()->m_pUndoStack->push( action ); event->acceptProposedAction(); } else if( sText.startsWith("file://") && mimeData->hasUrls() ) { //Dragging a file from an external file manager PatternList *pPatternList = pSong->get_pattern_list(); QList urlList = mimeData->urls(); int successfullyAddedPattern = 0; for (int i = 0; i < urlList.size(); i++) { QString patternFilePath = urlList.at(i).toLocalFile(); if( patternFilePath.endsWith(".h2pattern") ) { Pattern* pPattern = Pattern::load_file( patternFilePath, pSong->get_instrument_list() ); if ( pPattern) { H2Core::Pattern *pNewPattern = pPattern; if(!pPatternList->check_name( pNewPattern->get_name() ) ){ pNewPattern->set_name( pPatternList->find_unused_pattern_name( pNewPattern->get_name() ) ); } SE_insertPatternAction* pInsertPatternAction = new SE_insertPatternAction( nTargetPattern + successfullyAddedPattern, pNewPattern ); HydrogenApp::get_instance()->m_pUndoStack->push( pInsertPatternAction ); successfullyAddedPattern++; } else { ERRORLOG( QString("Error loading pattern %1").arg(patternFilePath) ); } } } } else { QStringList tokens = sText.split( "::" ); QString sPatternName = tokens.at( 1 ); //create a unique sequencefilename Pattern *pPattern = pSong->get_pattern_list()->get( nTargetPattern ); HydrogenApp *pHydrogenApp = HydrogenApp::get_instance(); QString oldPatternName = pPattern->get_name(); QString sequenceFilename = Filesystem::tmp_file_path( "SEQ.xml" ); bool drag = false; if( QString( tokens.at(0) ).contains( "drag pattern" )) drag = true; SE_loadPatternAction *pAction = new SE_loadPatternAction( sPatternName, oldPatternName, sequenceFilename, nTargetPattern, drag ); pHydrogenApp->m_pUndoStack->push( pAction ); } } void SongEditorPatternList::movePatternLine( int nSourcePattern , int nTargetPattern ) { Hydrogen *engine = Hydrogen::get_instance(); Song *pSong = engine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); // move instruments... H2Core::Pattern *pSourcePattern = pPatternList->get( nSourcePattern );//Instrument *pSourceInstr = pPatternList->get(nSourcePattern); if ( nSourcePattern < nTargetPattern) { for (int nPatr = nSourcePattern; nPatr < nTargetPattern; nPatr++) { H2Core::Pattern *pPattern = pPatternList->get(nPatr + 1); pPatternList->replace( nPatr, pPattern ); } pPatternList->replace( nTargetPattern, pSourcePattern ); } else { for (int nPatr = nSourcePattern; nPatr >= nTargetPattern; nPatr--) { H2Core::Pattern *pPattern = pPatternList->get(nPatr - 1); pPatternList->replace( nPatr, pPattern ); } pPatternList->replace( nTargetPattern, pSourcePattern ); } engine->setSelectedPatternNumber( nTargetPattern ); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); pSong->set_is_modified( true ); } void SongEditorPatternList::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) { return; } if ( abs(event->pos().y() - __drag_start_position.y()) < (int)m_nGridHeight) { return; } QString sText = QString("move pattern:%1"); QDrag *pDrag = new QDrag(this); QMimeData *pMimeData = new QMimeData; pMimeData->setText( sText ); pDrag->setMimeData( pMimeData); //drag->setPixmap(iconPixmap); pDrag->exec( Qt::CopyAction | Qt::MoveAction ); QWidget::mouseMoveEvent(event); } // :::::::::::::::::::::::::: const char* SongEditorPositionRuler::__class_name = "SongEditorPositionRuler"; SongEditorPositionRuler::SongEditorPositionRuler( QWidget *parent ) : QWidget( parent ) , Object( __class_name ) , m_bRightBtnPressed( false ) { setAttribute(Qt::WA_NoBackground); m_nGridWidth = 16; Preferences *pPref = Preferences::get_instance(); m_nMaxPatternSequence = pPref->getMaxBars(); m_nInitialWidth = m_nMaxPatternSequence * 16; resize( m_nInitialWidth, m_nHeight ); setFixedHeight( m_nHeight ); qreal pixelRatio = devicePixelRatio(); m_pBackgroundPixmap = new QPixmap( m_nInitialWidth * pixelRatio, m_nHeight * pixelRatio ); // initialize the pixmap m_pBackgroundPixmap->setDevicePixelRatio( pixelRatio ); createBackground(); // create m_backgroundPixmap pixmap // create tick position pixmap bool ok = m_tickPositionPixmap.load( Skin::getImagePath() + "/patternEditor/tickPosition.png" ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } update(); m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updatePosition())); m_pTimer->start(200); } SongEditorPositionRuler::~SongEditorPositionRuler() { m_pTimer->stop(); } uint SongEditorPositionRuler::getGridWidth() { return m_nGridWidth; } void SongEditorPositionRuler::setGridWidth( uint width ) { if ( SONG_EDITOR_MIN_GRID_WIDTH <= width && SONG_EDITOR_MAX_GRID_WIDTH >= width ) { m_nGridWidth = width; createBackground (); } } void SongEditorPositionRuler::createBackground() { Preferences *pPref = Preferences::get_instance(); Timeline * pTimeline = Hydrogen::get_instance()->getTimeline(); UIStyle *pStyle = pPref->getDefaultUIStyle(); QColor backgroundColor( pStyle->m_songEditor_backgroundColor.getRed(), pStyle->m_songEditor_backgroundColor.getGreen(), pStyle->m_songEditor_backgroundColor.getBlue() ); QColor textColor( pStyle->m_songEditor_textColor.getRed(), pStyle->m_songEditor_textColor.getGreen(), pStyle->m_songEditor_textColor.getBlue() ); QColor textColorAlpha( pStyle->m_songEditor_textColor.getRed(), pStyle->m_songEditor_textColor.getGreen(), pStyle->m_songEditor_textColor.getBlue(), 45 ); QColor alternateRowColor( pStyle->m_songEditor_alternateRowColor.getRed(), pStyle->m_songEditor_alternateRowColor.getGreen(), pStyle->m_songEditor_alternateRowColor.getBlue() ); m_pBackgroundPixmap->fill( backgroundColor ); QString family = pPref->getApplicationFontFamily(); int size = pPref->getApplicationFontPointSize(); QFont font( family, size ); QPainter p( m_pBackgroundPixmap ); p.setFont( font ); p.fillRect( 0, 0, width(), 24, QColor( 67, 72, 83, 105) ); char tmp[10]; for (uint i = 0; i < m_nMaxPatternSequence + 1; i++) { uint x = 10 + i * m_nGridWidth; for ( int t = 0; t < static_cast(pTimeline->m_timelinetagvector.size()); t++){ if ( pTimeline->m_timelinetagvector[t].m_htimelinetagbeat == i ) { p.setPen( Qt::cyan ); p.drawText( x - m_nGridWidth / 2 , 12, m_nGridWidth * 2, height() , Qt::AlignCenter, "T"); } } if ( (i % 4) == 0 ) { p.setPen( textColor ); sprintf( tmp, "%d", i + 1 ); p.drawText( x - m_nGridWidth, 12, m_nGridWidth * 2, height(), Qt::AlignCenter, tmp ); } else { p.setPen( textColor ); p.drawLine( x, 32, x, 40 ); } } //draw tempo content if(pPref->getUseTimelineBpm()){ p.setPen( textColor ); }else { p.setPen( textColorAlpha ); } char tempo[10]; for (uint i = 0; i < m_nMaxPatternSequence + 1; i++) { uint x = 10 + i * m_nGridWidth; p.drawLine( x, 2, x, 5 ); p.drawLine( x, 19, x, 20 ); for ( int t = 0; t < static_cast(pTimeline->m_timelinevector.size()); t++){ if ( pTimeline->m_timelinevector[t].m_htimelinebeat == i ) { sprintf( tempo, "%d", ((int)pTimeline->m_timelinevector[t].m_htimelinebpm) ); p.drawText( x - m_nGridWidth, 3, m_nGridWidth * 2, height() / 2 - 5, Qt::AlignCenter, tempo ); } } } p.setPen( QColor(35, 39, 51) ); p.drawLine( 0, 0, width(), 0 ); p.fillRect ( 0, height() - 27, width(), 1, QColor(35, 39, 51) ); p.fillRect ( 0, height() - 3, width(), 2, alternateRowColor ); } void SongEditorPositionRuler::mouseMoveEvent(QMouseEvent *ev) { if ( !m_bRightBtnPressed ) { // Click+drag triggers same action as clicking at new position mousePressEvent( ev ); } else { // Right-click+drag int column = (ev->x() / m_nGridWidth); Preferences* pPref = Preferences::get_instance(); if ( column > (int)Hydrogen::get_instance()->getSong()->get_pattern_group_vector()->size() ) { pPref->setPunchOutPos(-1); return; } if ( Hydrogen::get_instance()->getSong()->get_mode() == Song::PATTERN_MODE ) { return; } pPref->setPunchOutPos(column-1); update(); } } void SongEditorPositionRuler::mousePressEvent( QMouseEvent *ev ) { auto pHydrogen = Hydrogen::get_instance(); if (ev->button() == Qt::LeftButton && ev->y() >= 26) { int column = (ev->x() / m_nGridWidth); m_bRightBtnPressed = false; if ( column > (int)pHydrogen->getSong()->get_pattern_group_vector()->size() ) { return; } // disabling son relocates while in pattern mode as it causes weird behaviour. (jakob lund) if ( pHydrogen->getSong()->get_mode() == Song::PATTERN_MODE ) { return; } AudioOutput* pDriver = pHydrogen->getAudioOutput(); int nPatternPos = pHydrogen->getPatternPos(); if ( nPatternPos != column ) { WARNINGLOG( "relocate via mouse click" ); pHydrogen->setPatternPos( column ); update(); #ifdef H2CORE_HAVE_JACK if ( pHydrogen->haveJackTransport() ) { long totalTick = pHydrogen->getTickForPosition( column ); static_cast(pDriver)->m_currentPos = totalTick * pDriver->m_transport.m_fTickSize; } #endif } //time line test #ifdef H2CORE_HAVE_JACK if ( !pHydrogen->haveJackTimebaseClient() ) { pHydrogen->setTimelineBpm(); } #else pHydrogen->setTimelineBpm(); #endif } else if (ev->button() == Qt::MidButton && ev->y() >= 26) { int column = (ev->x() / m_nGridWidth); SongEditorPanelTagWidget dialog( this , column ); if (dialog.exec() == QDialog::Accepted) { //createBackground(); } } else if (ev->button() == Qt::RightButton && ev->y() >= 26) { int column = (ev->x() / m_nGridWidth); Preferences* pPref = Preferences::get_instance(); if ( column >= (int)pHydrogen->getSong()->get_pattern_group_vector()->size() ) { pPref->unsetPunchArea(); return; } if ( pHydrogen->getSong()->get_mode() == Song::PATTERN_MODE ) { return; } m_bRightBtnPressed = true; // Disable until mouse is moved pPref->setPunchInPos(column); pPref->setPunchOutPos(-1); update(); } else if( ( ev->button() == Qt::LeftButton || ev->button() == Qt::RightButton ) && ev->y() <= 25 && Preferences::get_instance()->getUseTimelineBpm() ){ int column = (ev->x() / m_nGridWidth); SongEditorPanelBpmWidget dialog( this , column ); if (dialog.exec() == QDialog::Accepted) { //createBackground(); } } } void SongEditorPositionRuler::mouseReleaseEvent(QMouseEvent *ev) { UNUSED( ev ); m_bRightBtnPressed = false; } void SongEditorPositionRuler::paintEvent( QPaintEvent *ev ) { if (!isVisible()) { return; } Hydrogen *pEngine = Hydrogen::get_instance(); float fPos = pEngine->getPatternPos(); int pIPos = Preferences::get_instance()->getPunchInPos(); int pOPos = Preferences::get_instance()->getPunchOutPos(); if ( pEngine->getCurrentPatternList()->size() != 0 ) { H2Core::Pattern *pPattern = pEngine->getCurrentPatternList()->get( 0 ); if (pPattern != nullptr){ fPos += (float)pEngine->getTickPosition() / (float)pPattern->get_length(); } else { fPos += (float)pEngine->getTickPosition() / (float)MAX_NOTES; } } else { // nessun pattern, uso la grandezza di default fPos += (float)pEngine->getTickPosition() / (float)MAX_NOTES; } if ( pEngine->getSong()->get_mode() == Song::PATTERN_MODE ) { fPos = -1; pIPos = 0; pOPos = -1; } QPainter painter(this); qreal pixelRatio = devicePixelRatio(); QRectF srcRect( pixelRatio * ev->rect().x(), pixelRatio * ev->rect().y(), pixelRatio * ev->rect().width(), pixelRatio * ev->rect().height() ); painter.drawPixmap( ev->rect(), *m_pBackgroundPixmap, srcRect ); if (fPos != -1) { uint x = (int)( 10 + fPos * m_nGridWidth - 11 / 2 ); painter.drawPixmap( QRect( x, height() / 2, 11, 8), m_tickPositionPixmap, QRect(0, 0, 11, 8) ); painter.setPen( QColor(35, 39, 51) ); painter.drawLine( x + 5 , 8, x +5 , 24 ); } if ( pIPos <= pOPos ) { int xIn = (int)( 10 + pIPos * m_nGridWidth ); int xOut = (int)( 9 + (pOPos+1) * m_nGridWidth ); painter.fillRect( xIn, 30, xOut-xIn+1, 12, QColor(200, 100, 100, 100) ); QPen pen(QColor(200, 100, 100)); painter.setPen(pen); painter.drawRect( xIn, 30, xOut-xIn+1, 12 ); } } void SongEditorPositionRuler::updatePosition() { HydrogenApp::get_instance()->getSongEditorPanel()->updateTimelineUsage(); update(); } void SongEditorPositionRuler::editTimeLineAction( int newPosition, float newBpm ) { Hydrogen* pEngine = Hydrogen::get_instance(); Timeline* pTimeline = pEngine->getTimeline(); //erase the value to set the new value if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if ( pTimeline->m_timelinevector[t].m_htimelinebeat == newPosition -1 ) { pTimeline->m_timelinevector.erase( pTimeline->m_timelinevector.begin() + t); } } } Timeline::HTimelineVector tlvector; tlvector.m_htimelinebeat = newPosition -1 ; if( newBpm < 30.0 ) newBpm = 30.0; if( newBpm > 500.0 ) newBpm = 500.0; tlvector.m_htimelinebpm = newBpm; pTimeline->m_timelinevector.push_back( tlvector ); pTimeline->sortTimelineVector(); createBackground(); } void SongEditorPositionRuler::deleteTimeLinePosition( int position ) { Hydrogen* pEngine = Hydrogen::get_instance(); Timeline* pTimeline = pEngine->getTimeline(); //erase the value to set the new value if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if ( pTimeline->m_timelinevector[t].m_htimelinebeat == position -1 ) { pTimeline->m_timelinevector.erase( pTimeline->m_timelinevector.begin() + t); } } } createBackground(); } void SongEditorPositionRuler::editTagAction( QString text, int position, QString textToReplace) { Hydrogen* pEngine = Hydrogen::get_instance(); Timeline* pTimeline = pEngine->getTimeline(); //check vector for old entries and remove them. for( int i = 0; i < pTimeline->m_timelinetagvector.size(); ++i ){ if( ( pTimeline->m_timelinetagvector[i].m_htimelinetag == textToReplace ) && ( pTimeline->m_timelinetagvector[i].m_htimelinetagbeat == position ) ){ pTimeline->m_timelinetagvector.erase( pTimeline->m_timelinetagvector.begin() + i ); break; } } Timeline::HTimelineTagVector tlvector; tlvector.m_htimelinetagbeat = position; tlvector.m_htimelinetag = text; pTimeline->m_timelinetagvector.push_back( tlvector ); pTimeline->sortTimelineTagVector(); createBackground(); } void SongEditorPositionRuler::deleteTagAction( QString text, int position ) { Hydrogen* pEngine = Hydrogen::get_instance(); Timeline* pTimeline = pEngine->getTimeline(); for( int i = 0; i < pTimeline->m_timelinetagvector.size(); ++i ){ if( ( pTimeline->m_timelinetagvector[i].m_htimelinetag == text ) && ( pTimeline->m_timelinetagvector[i].m_htimelinetagbeat == position ) ){ pTimeline->m_timelinetagvector.erase( pTimeline->m_timelinetagvector.begin() + i ); break; } } pTimeline->sortTimelineTagVector(); createBackground(); } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditor.h000066400000000000000000000145221366722712400224750ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_EDITOR_H #define SONG_EDITOR_H #include #include #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include "../EventListener.h" #include "PatternFillDialog.h" class Button; class ToggleButton; class SongEditor; class SongEditorPatternList; class SongEditorPositionRuler; static const uint SONG_EDITOR_MIN_GRID_WIDTH = 8; static const uint SONG_EDITOR_MAX_GRID_WIDTH = 16; class SongEditorGridRepresentationItem { public: SongEditorGridRepresentationItem(int x, int y, bool value); int x; int y; bool value; }; /// /// Song editor /// class SongEditor : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: SongEditor( QWidget *parent ); ~SongEditor(); void createBackground(); void cleanUp(); int getGridWidth (); void setGridWidth( uint width); void addPattern( int nColumn, int nRow); void deletePattern( int nColumn, int nRow, unsigned nColumnIndex); void clearThePatternSequenceVector( QString filename ); void updateEditorandSetTrue(); void movePatternCellAction( std::vector movingCells, std::vector selectedCells, std::vector m_existingCells, bool bIsCtrlPressed, bool undo); private: //holds a list for active patterns for each pattern QList gridRepresentation; unsigned m_nGridHeight; unsigned m_nGridWidth; unsigned m_nMaxPatternSequence; bool m_bSequenceChanged; bool m_bIsMoving; bool m_bIsCtrlPressed; QPixmap *m_pBackgroundPixmap; QPixmap *m_pSequencePixmap; std::vector m_selectedCells; std::vector m_movingCells; std::vector m_existingCells; QPoint m_clickPoint; // Usato come riferimento per le operazioni di spostamento bool m_bShowLasso; QRect m_lasso; virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void keyPressEvent (QKeyEvent *ev); virtual void paintEvent(QPaintEvent *ev); void drawSequence(); void drawPattern( int pos, int number, bool invertColour ); }; /// /// Song editor pattern list /// class SongEditorPatternList : public QWidget, public H2Core::Object, public EventListener { H2_OBJECT Q_OBJECT public: SongEditorPatternList( QWidget *parent ); ~SongEditorPatternList(); void updateEditor(); void createBackground(); void movePatternLine( int, int ); void deletePatternFromList( QString patternFilename, QString sequenceFileName, int patternPosition ); void restoreDeletedPatternsFromList( QString patternFilename, QString sequenceFileName, int patternPosition ); void acceptPatternPropertiesDialogSettings( QString newPatternName, QString newPatternInfo, QString newPatternCategory, int patternNr ); void revertPatternPropertiesDialogSettings(QString oldPatternName, QString oldPatternInfo, QString oldPatternCategory, int patternNr); void loadPatternAction( QString filename, int position); void fillRangeWithPattern(FillRange* r, int nPattern); void patternPopup_copyAction( QString patternFilename, int patternposition ); int getGridHeight() { return m_nGridHeight; } public slots: void patternPopup_edit(); void patternPopup_save(); void patternPopup_export(); void patternPopup_load(); void patternPopup_properties(); void patternPopup_delete(); void patternPopup_copy(); void patternPopup_fill(); void patternPopup_virtualPattern(); void inlineEditingFinished(); void inlineEditingEntered(); virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); private: uint m_nGridHeight; uint m_nWidth; static const uint m_nInitialHeight = 10; QPixmap *m_pBackgroundPixmap; QPixmap m_labelBackgroundLight; QPixmap m_labelBackgroundDark; QPixmap m_labelBackgroundSelected; QPixmap m_playingPattern_on_Pixmap; QPixmap m_playingPattern_off_Pixmap; QMenu *m_pPatternPopup; QLineEdit *line; H2Core::Pattern *patternBeingEdited; void inlineEditPatternName( int row ); virtual void mousePressEvent( QMouseEvent *ev ); virtual void mouseDoubleClickEvent( QMouseEvent *ev ); virtual void paintEvent( QPaintEvent *ev ); void togglePattern( int ); virtual void patternChangedEvent(); void mouseMoveEvent(QMouseEvent *event); QPoint __drag_start_position; }; // class SongEditorPatternListener : public EventListener { // // } // class SongEditorPositionRuler : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: SongEditorPositionRuler( QWidget *parent ); ~SongEditorPositionRuler(); void createBackground(); uint getGridWidth(); void setGridWidth (uint width); void editTimeLineAction( int newPosition, float newBpm ); void deleteTimeLinePosition( int position ); void editTagAction( QString text, int position, QString textToReplace ); void deleteTagAction( QString text, int position ); public slots: void updatePosition(); private: QTimer * m_pTimer; uint m_nGridWidth; uint m_nMaxPatternSequence; uint m_nInitialWidth; static const uint m_nHeight = 50; QPixmap * m_pBackgroundPixmap; QPixmap m_tickPositionPixmap; bool m_bRightBtnPressed; virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mousePressEvent( QMouseEvent *ev ); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void paintEvent( QPaintEvent *ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanel.cpp000066400000000000000000000735131366722712400240150ustar00rootroot00000000000000 /* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SongEditorPanel.h" #include "PlaybackTrackWaveDisplay.h" #include "../AudioFileBrowser/AudioFileBrowser.h" #include "../HydrogenApp.h" #include "../PatternPropertiesDialog.h" #include "../SongPropertiesDialog.h" #include "../Widgets/AutomationPathView.h" #include "../Widgets/Button.h" #include "../Widgets/Fader.h" #include "../Widgets/LCDCombo.h" #include "../Widgets/PixmapWidget.h" #include "../Skin.h" #include "SongEditor.h" #include "UndoActions.h" #include #include #include #include #include #ifdef WIN32 #include #endif using namespace H2Core; using namespace std; const char* SongEditorPanel::__class_name = "SongEditorPanel"; SongEditorPanel::SongEditorPanel(QWidget *pParent) : QWidget( pParent ) , Object( __class_name ) , m_actionMode( DRAW_ACTION ) { m_nInitialWidth = 600; m_nInitialHeight = 250; Preferences *pPref = Preferences::get_instance(); Hydrogen* pEngine = Hydrogen::get_instance(); Song* pSong = pEngine->getSong(); setWindowTitle( tr( "Song Editor" ) ); // background PixmapWidget *pBackPanel = new PixmapWidget( nullptr ); pBackPanel->setFixedSize( 196, 49 ); pBackPanel->setPixmap( "/songEditor/bg_topPanel.png" ); // time line toggle button m_pTimeLineToggleBtn = new ToggleButton( pBackPanel, "/songEditor/btn_bpm_on.png", "/songEditor/btn_bpm_off.png", "/songEditor/btn_bpm_over.png", QSize( 54, 13 ) ); m_pTimeLineToggleBtn->move( 133, 6 ); m_pTimeLineToggleBtn->setToolTip( tr( "Enable time line edit") ); connect( m_pTimeLineToggleBtn, SIGNAL( clicked( Button* ) ), this, SLOT( timeLineBtnPressed(Button* ) ) ); if ( pPref->getUseTimelineBpm() && !pEngine->haveJackTimebaseClient() ) { m_pTimeLineToggleBtn->setPressed( true ); m_pTimeLineToggleBtn->setToolTip( trUtf8( "Enable time line edit") ); } else { m_pTimeLineToggleBtn->setPressed( false ); m_pTimeLineToggleBtn->setToolTip( trUtf8( "Timeline usage is disabled in the presence of an external JACK timebase master") ); } // clear sequence button m_pClearPatternSeqBtn = new Button( pBackPanel, "/songEditor/btn_clear_on.png", "/songEditor/btn_clear_off.png", "/songEditor/btn_clear_over.png", QSize(53,13) ); m_pClearPatternSeqBtn->move( 6, 5 + 25 ); m_pClearPatternSeqBtn->setToolTip( tr("Clear pattern sequence") ); connect( m_pClearPatternSeqBtn, SIGNAL( clicked( Button* ) ), this, SLOT( clearSequence(Button*) ) ); // new pattern button Button *newPatBtn = new Button( pBackPanel, "/songEditor/btn_new_on.png", "/songEditor/btn_new_off.png", "/songEditor/btn_new_over.png", QSize(19, 13) ); newPatBtn->move( 64, 5 + 25); newPatBtn->setToolTip( tr("Create new pattern") ); connect( newPatBtn, SIGNAL( clicked( Button* ) ), this, SLOT( newPatBtnClicked( Button* ) ) ); // down button m_pDownBtn = new Button( pBackPanel, "/songEditor/btn_down_on.png", "/songEditor/btn_down_off.png", "/songEditor/btn_down_over.png", QSize(18,13) ); m_pDownBtn->move( 89, 5 + 25); m_pDownBtn->setToolTip( tr("Move the selected pattern down") ); connect( m_pDownBtn, SIGNAL( clicked( Button* ) ), this, SLOT( downBtnClicked( Button* ) ) ); // up button m_pUpBtn = new Button( pBackPanel, "/songEditor/btn_up_on.png", "/songEditor/btn_up_off.png", "/songEditor/btn_up_over.png", QSize(18,13) ); m_pUpBtn->move( 106, 5 + 25 ); m_pUpBtn->setToolTip( tr("Move the selected pattern up") ); connect( m_pUpBtn, SIGNAL( clicked( Button* ) ), this, SLOT( upBtnClicked( Button* ) ) ); // select toggle button m_pPointerActionBtn = new ToggleButton( pBackPanel, "/songEditor/btn_select_on.png", "/songEditor/btn_select_off.png", "/songEditor/btn_select_over.png", QSize( 18, 13 ) ); m_pPointerActionBtn->move( 128, 5 + 25 ); m_pPointerActionBtn->setToolTip( tr( "Select mode" ) ); connect( m_pPointerActionBtn, SIGNAL( clicked( Button* ) ), this, SLOT( pointerActionBtnPressed(Button*) ) ); // draw toggle button m_pDrawActionBtn = new ToggleButton( pBackPanel, "/songEditor/btn_draw_on.png", "/songEditor/btn_draw_off.png", "/songEditor/btn_draw_over.png", QSize( 18, 13 ) ); m_pDrawActionBtn->move( 147, 5 + 25 ); m_pDrawActionBtn->setToolTip( tr( "Draw mode") ); connect( m_pDrawActionBtn, SIGNAL( clicked( Button* ) ), this, SLOT( drawActionBtnPressed(Button* ) ) ); m_pDrawActionBtn->setPressed( true ); m_pModeActionBtn = new ToggleButton( pBackPanel, "/songEditor/btn_mode_on.png", "/songEditor/btn_mode_off.png", "/songEditor/btn_mode_over.png", QSize( 18, 13 ) ); m_pModeActionBtn->move( 169, 5 + 25 ); m_pModeActionBtn->setToolTip( tr( "stacked mode") ); m_pModeActionBtn->setPressed( pPref->patternModePlaysSelected() ); connect( m_pModeActionBtn, SIGNAL( clicked( Button* ) ), this, SLOT( modeActionBtnPressed() ) ); // ZOOM m_pHScrollBar = new QScrollBar( Qt::Horizontal, nullptr ); connect( m_pHScrollBar, SIGNAL(valueChanged(int)), this, SLOT( hScrollTo(int) ) ); // zoom-in btn Button* pZoomInBtn = new Button( nullptr, "/songEditor/btn_new_on.png", "/songEditor/btn_new_off.png", "/songEditor/btn_new_over.png", QSize( 19, 13 ) ); connect( pZoomInBtn, SIGNAL( clicked( Button* ) ), this, SLOT( zoomOutBtnPressed(Button* ) ) ); // zoom-out btn Button* pZoomOutBtn = new Button( nullptr, "/songEditor/btn_minus_on.png", "/songEditor/btn_minus_off.png", "/songEditor/btn_minus_over.png", QSize( 19, 13 ) ); connect( pZoomOutBtn, SIGNAL( clicked( Button* ) ), this, SLOT( zoomInBtnPressed(Button* ) ) ); // view playback track toggle button m_pViewPlaybackToggleBtn = new ToggleButton( nullptr, "/songEditor/btn_viewPL_on.png", "/songEditor/btn_viewPL_off.png", "/songEditor/btn_viewPL_over.png", QSize( 19, 13 ) ); m_pViewPlaybackToggleBtn->setToolTip( tr( "View playback track") ); connect( m_pViewPlaybackToggleBtn, SIGNAL( clicked( Button* ) ), this, SLOT( viewPlaybackTrackBtnPressed(Button* ) ) ); m_pViewPlaybackToggleBtn->setPressed( false ); // Playback Fader m_pPlaybackTrackFader = new VerticalFader( pBackPanel, false, false ); m_pPlaybackTrackFader->move( 6, 2 ); m_pPlaybackTrackFader->setMinValue( 0.0 ); m_pPlaybackTrackFader->setMaxValue( 1.5 ); m_pPlaybackTrackFader->setValue( pSong->get_playback_track_volume() ); m_pPlaybackTrackFader->hide(); connect( m_pPlaybackTrackFader, SIGNAL( valueChanged(Fader*) ), this, SLOT( faderChanged(Fader*) ) ); // mute playback track toggle button m_pMutePlaybackToggleBtn = new ToggleButton( pBackPanel, "/mixerPanel/master_mute_on.png", "/mixerPanel/master_mute_off.png", "/mixerPanel/master_mute_over.png", QSize( 42, 13 ) ); m_pMutePlaybackToggleBtn->setToolTip( tr( "Mute playback track") ); m_pMutePlaybackToggleBtn->move( 151, 6 ); m_pMutePlaybackToggleBtn->hide(); connect( m_pMutePlaybackToggleBtn, SIGNAL( clicked( Button* ) ), this, SLOT( mutePlaybackTrackBtnPressed(Button* ) ) ); m_pMutePlaybackToggleBtn->setPressed( !pSong->get_playback_track_enabled() ); // edit playback track toggle button m_pEditPlaybackBtn = new Button( pBackPanel, "/mixerPanel/edit_on.png", "/mixerPanel/edit_off.png", "/mixerPanel/edit_over.png", QSize( 42, 13 ) ); m_pEditPlaybackBtn->setToolTip( tr( "Choose playback track") ); m_pEditPlaybackBtn->move( 124, 6 ); m_pEditPlaybackBtn->hide(); connect( m_pEditPlaybackBtn, SIGNAL( clicked( Button* ) ), this, SLOT( editPlaybackTrackBtnPressed(Button* ) ) ); m_pEditPlaybackBtn->setPressed( false ); // timeline view toggle button m_pViewTimeLineToggleBtn = new ToggleButton( nullptr, "/songEditor/btn_viewTL_on.png", "/songEditor/btn_viewTL_off.png", "/songEditor/btn_viewTL_over.png", QSize( 19, 13 ) ); m_pViewTimeLineToggleBtn->setToolTip( tr( "View timeline") ); connect( m_pViewTimeLineToggleBtn, SIGNAL( clicked( Button* ) ), this, SLOT( viewTimeLineBtnPressed(Button* ) ) ); m_pViewTimeLineToggleBtn->setPressed( true ); QHBoxLayout *pHZoomLayout = new QHBoxLayout(); pHZoomLayout->setSpacing( 0 ); pHZoomLayout->setMargin( 0 ); pHZoomLayout->addWidget( m_pViewPlaybackToggleBtn ); pHZoomLayout->addWidget( m_pViewTimeLineToggleBtn ); pHZoomLayout->addWidget( m_pHScrollBar ); pHZoomLayout->addWidget( pZoomInBtn ); pHZoomLayout->addWidget( pZoomOutBtn ); QWidget *pHScrollbarPanel = new QWidget(); pHScrollbarPanel->setLayout( pHZoomLayout ); //~ ZOOM // PATTERN LIST m_pPatternListScrollView = new QScrollArea( nullptr ); m_pPatternListScrollView->setFrameShape( QFrame::NoFrame ); m_pPatternListScrollView->setFixedWidth( m_nPatternListWidth ); m_pPatternListScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pPatternListScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); connect( m_pPatternListScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( vScrollTo(int) ) ); m_pPatternList = new SongEditorPatternList( m_pPatternListScrollView->viewport() ); m_pPatternListScrollView->setWidget( m_pPatternList ); // EDITOR m_pEditorScrollView = new QScrollArea( nullptr ); m_pEditorScrollView->setFrameShape( QFrame::NoFrame ); m_pEditorScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pEditorScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pSongEditor = new SongEditor( m_pEditorScrollView->viewport() ); m_pEditorScrollView->setWidget( m_pSongEditor ); connect( m_pEditorScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( hScrollTo(int) ) ); connect( m_pEditorScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( vScrollTo(int) ) ); // POSITION RULER m_pWidgetStack = new QStackedWidget( nullptr ); m_pWidgetStack->setFixedHeight( 50 ); m_pPositionRulerScrollView = new QScrollArea( m_pWidgetStack ); m_pPositionRulerScrollView->setFrameShape( QFrame::NoFrame ); m_pPositionRulerScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pPositionRulerScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pPositionRuler = new SongEditorPositionRuler( m_pPositionRulerScrollView->viewport() ); m_pPositionRulerScrollView->setWidget( m_pPositionRuler ); m_pPositionRulerScrollView->setFixedHeight( 50 ); connect( m_pPositionRulerScrollView->horizontalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( hScrollTo(int) ) ); m_pPlaybackTrackScrollView = new QScrollArea( m_pWidgetStack ); m_pPlaybackTrackScrollView->setFrameShape( QFrame::NoFrame ); m_pPlaybackTrackScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pPlaybackTrackScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); InstrumentComponent* pCompo = AudioEngine::get_instance()->get_sampler()->__playback_instrument->get_components()->front(); assert(pCompo); m_pPlaybackTrackWaveDisplay = new PlaybackTrackWaveDisplay( m_pPlaybackTrackScrollView->viewport() ); m_pPlaybackTrackWaveDisplay->setSampleNameAlignment( Qt::AlignLeft ); m_pPlaybackTrackWaveDisplay->resize( m_pPositionRuler->width() , 50); m_pPlaybackTrackWaveDisplay->setAcceptDrops( true ); m_pPlaybackTrackScrollView->setWidget( m_pPlaybackTrackWaveDisplay ); m_pPlaybackTrackScrollView->setFixedHeight( 50 ); m_pAutomationPathScrollView = new QScrollArea( nullptr ); m_pAutomationPathScrollView->setFrameShape( QFrame::NoFrame ); m_pAutomationPathScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pAutomationPathScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); m_pAutomationPathView = new AutomationPathView( m_pAutomationPathScrollView->viewport() ); m_pAutomationPathScrollView->setWidget( m_pAutomationPathView ); m_pAutomationPathScrollView->setFixedHeight( 64 ); connect( m_pAutomationPathView, SIGNAL( valueChanged() ), this, SLOT( automationPathChanged() ) ); connect( m_pAutomationPathView, SIGNAL( pointAdded(float, float) ), this, SLOT( automationPathPointAdded(float,float) ) ); connect( m_pAutomationPathView, SIGNAL( pointRemoved(float, float) ), this, SLOT( automationPathPointRemoved(float,float) ) ); connect( m_pAutomationPathView, SIGNAL( pointMoved(float, float, float, float) ), this, SLOT( automationPathPointMoved(float,float, float, float) ) ); m_pAutomationCombo = new LCDCombo( nullptr, 22 ); m_pAutomationCombo->setToolTip( tr("Adjust parameter values in time") ); m_pAutomationCombo->addItem( tr("Velocity") ); m_pAutomationCombo->select( 0 ); m_pVScrollBar = new QScrollBar( Qt::Vertical, nullptr ); connect( m_pVScrollBar, SIGNAL(valueChanged(int)), this, SLOT( vScrollTo(int) ) ); m_pWidgetStack->addWidget( m_pPositionRulerScrollView ); m_pWidgetStack->addWidget( m_pPlaybackTrackScrollView ); if( Preferences::get_instance()->getShowPlaybackTrack() ) { showPlaybackTrack(); } else { showTimeline(); } // ok...let's build the layout QGridLayout *pGridLayout = new QGridLayout(); pGridLayout->setSpacing( 0 ); pGridLayout->setMargin( 0 ); pGridLayout->addWidget( pBackPanel, 0, 0 ); pGridLayout->addWidget( m_pWidgetStack, 0, 1 ); pGridLayout->addWidget( m_pPatternListScrollView, 1, 0 ); pGridLayout->addWidget( m_pEditorScrollView, 1, 1 ); pGridLayout->addWidget( m_pVScrollBar, 1, 2, 2, 1 ); pGridLayout->addWidget( m_pAutomationPathScrollView, 2, 1); pGridLayout->addWidget( m_pAutomationCombo, 2, 0, Qt::AlignTop | Qt::AlignRight ); pGridLayout->addWidget( pHScrollbarPanel, 3, 1 ); if( !pPref->getShowAutomationArea() ){ m_pAutomationPathScrollView->hide(); m_pAutomationCombo->hide(); } this->setLayout( pGridLayout ); QPalette defaultPalette; defaultPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); this->setPalette( defaultPalette ); show(); updateAll(); HydrogenApp::get_instance()->addEventListener( this ); m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT( updatePlayHeadPosition() ) ); connect(m_pTimer, SIGNAL(timeout()), this, SLOT( updatePlaybackFaderPeaks() ) ); m_pTimer->start(100); } SongEditorPanel::~SongEditorPanel() { m_pTimer->stop(); } void SongEditorPanel::updatePlayHeadPosition() { Song *pSong = Hydrogen::get_instance()->getSong(); if ( Preferences::get_instance()->m_bFollowPlayhead && pSong->get_mode() == Song::SONG_MODE) { if ( Hydrogen::get_instance()->getState() != STATE_PLAYING ) { return; } QPoint pos = m_pPositionRuler->pos(); int x = -pos.x(); int w = m_pPositionRulerScrollView->viewport()->width(); int nPlayHeadPosition = Hydrogen::get_instance()->getPatternPos() * m_pSongEditor->getGridWidth(); int value = m_pEditorScrollView->horizontalScrollBar()->value(); if ( nPlayHeadPosition > ( x + w - 50 ) ) { hScrollTo( value + 100 ); } else if ( nPlayHeadPosition < x ) { hScrollTo( value - 100 ); } } } void SongEditorPanel::updatePlaybackFaderPeaks() { Sampler* pSampler = AudioEngine::get_instance()->get_sampler(); Preferences * pPref = Preferences::get_instance(); Instrument* pInstrument = pSampler->__playback_instrument; bool bShowPeaks = pPref->showInstrumentPeaks(); float fallOff = pPref->getMixerFalloffSpeed(); // fader float fOldPeak_L = m_pPlaybackTrackFader->getPeak_L(); float fOldPeak_R = m_pPlaybackTrackFader->getPeak_R(); float fNewPeak_L = pInstrument->get_peak_l(); pInstrument->set_peak_l( 0.0f ); // reset instrument peak float fNewPeak_R = pInstrument->get_peak_r(); pInstrument->set_peak_r( 0.0f ); // reset instrument peak if (!bShowPeaks) { fNewPeak_L = 0.0f; fNewPeak_R = 0.0f; } if ( fNewPeak_L >= fOldPeak_L) { // LEFT peak m_pPlaybackTrackFader->setPeak_L( fNewPeak_L ); } else { m_pPlaybackTrackFader->setPeak_L( fOldPeak_L / fallOff ); } if ( fNewPeak_R >= fOldPeak_R) { // Right peak m_pPlaybackTrackFader->setPeak_R( fNewPeak_R ); } else { m_pPlaybackTrackFader->setPeak_R( fOldPeak_R / fallOff ); } } void SongEditorPanel::vScrollTo( int value ) { static bool inside = false; if ( !inside ) { inside = true; m_pVScrollBar->setValue( value ); m_pPatternListScrollView->verticalScrollBar()->setValue( value ); m_pEditorScrollView->verticalScrollBar()->setValue( value ); inside = false; } } void SongEditorPanel::hScrollTo( int value ) { static bool inside = false; if ( !inside ) { inside = true; m_pHScrollBar->setValue( value ); m_pEditorScrollView->horizontalScrollBar()->setValue( value ); m_pPlaybackTrackScrollView->horizontalScrollBar()->setValue( value ); m_pPositionRulerScrollView->horizontalScrollBar()->setValue( value ); m_pAutomationPathScrollView->horizontalScrollBar()->setValue( value ); inside = false; } } /// /// Update and redraw all... /// void SongEditorPanel::updateAll() { Hydrogen * pEngine = Hydrogen::get_instance(); Song * pSong = pEngine->getSong(); updatePlaybackTrackIfNecessary(); m_pPatternList->createBackground(); m_pPatternList->update(); m_pSongEditor->cleanUp(); m_pSongEditor->createBackground(); m_pSongEditor->update(); updateTimelineUsage(); m_pAutomationPathView->setAutomationPath( pSong->get_velocity_automation_path() ); resyncExternalScrollBar(); } void SongEditorPanel::updatePlaybackTrackIfNecessary() { if( Preferences::get_instance()->getShowPlaybackTrack() ) { InstrumentComponent *pCompo = AudioEngine::get_instance()->get_sampler()->__playback_instrument->get_components()->front(); m_pPlaybackTrackWaveDisplay->updateDisplay( pCompo->get_layer(0) ); } } void SongEditorPanel::updatePositionRuler() { m_pPositionRuler->createBackground(); } /// /// Create a new pattern /// void SongEditorPanel::newPatBtnClicked( Button* btn ) { UNUSED( btn ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); Pattern *pNewPattern = new Pattern( tr("Pattern %1").arg(pPatternList->size()+1)); PatternPropertiesDialog *pDialog = new PatternPropertiesDialog( this, pNewPattern, 0, true ); if ( pDialog->exec() == QDialog::Accepted ) { SE_insertPatternAction* pAction = new SE_insertPatternAction( pEngine->getSelectedPatternNumber() + 1, new Pattern( pNewPattern->get_name() , pNewPattern->get_info(), pNewPattern->get_category() ) ); HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } delete pNewPattern; delete pDialog; } void SongEditorPanel::insertPattern( int idx, Pattern* pPattern ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); pPatternList->insert( idx, pPattern ); pEngine->setSelectedPatternNumber( idx ); pSong->set_is_modified( true ); updateAll(); } void SongEditorPanel::deletePattern( int idx ) { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); H2Core::Pattern *pPattern = pPatternList->get( idx ); if( idx == pEngine->getSelectedPatternNumber() ) { pEngine->setSelectedPatternNumber( idx -1 ); } pPatternList->del( pPattern ); delete pPattern; pSong->set_is_modified( true ); updateAll(); } /// /// Move up a pattern in the patternList /// void SongEditorPanel::upBtnClicked( Button* btn ) { UNUSED( btn ); Hydrogen *pEngine = Hydrogen::get_instance(); if( pEngine->getSelectedPatternNumber() < 0 || !pEngine->getSelectedPatternNumber() ) return; int nSelectedPatternPos = pEngine->getSelectedPatternNumber(); SE_movePatternListItemAction *pAction = new SE_movePatternListItemAction( nSelectedPatternPos, nSelectedPatternPos -1 ) ; HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } /// /// Move down a pattern in the patternList /// void SongEditorPanel::downBtnClicked( Button* btn ) { UNUSED( btn ); Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); if( pEngine->getSelectedPatternNumber() +1 >= pPatternList->size() ) { return; } int nSelectedPatternPos = pEngine->getSelectedPatternNumber(); SE_movePatternListItemAction *pAction = new SE_movePatternListItemAction( nSelectedPatternPos, nSelectedPatternPos +1 ) ; HydrogenApp::get_instance()->m_pUndoStack->push( pAction ); } void SongEditorPanel::clearSequence( Button* btn) { UNUSED( btn ); int res = QMessageBox::information( this, "Hydrogen", tr( "Warning, this will erase your pattern sequence.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( res == 1 ) { return; } QString filename = Filesystem::tmp_file_path( "SEQ.xml" ); SE_deletePatternSequenceAction *pAction = new SE_deletePatternSequenceAction( filename ); HydrogenApp *pH2App = HydrogenApp::get_instance(); pH2App->m_pUndoStack->push( pAction ); } void SongEditorPanel::restoreGroupVector( QString filename ) { //clear the old sequese vector *pPatternGroupsVect = Hydrogen::get_instance()->getSong()->get_pattern_group_vector(); for (uint i = 0; i < pPatternGroupsVect->size(); i++) { PatternList *pPatternList = (*pPatternGroupsVect)[i]; pPatternList->clear(); delete pPatternList; } pPatternGroupsVect->clear(); Hydrogen::get_instance()->getSong()->readTempPatternList( filename ); m_pSongEditor->updateEditorandSetTrue(); updateAll(); } void SongEditorPanel::resyncExternalScrollBar() { int nGridHeight = m_pPatternList->getGridHeight(); m_pHScrollBar->setMinimum( m_pEditorScrollView->horizontalScrollBar()->minimum() ); m_pHScrollBar->setMaximum( m_pEditorScrollView->horizontalScrollBar()->maximum() ); m_pHScrollBar->setSingleStep( m_pEditorScrollView->horizontalScrollBar()->singleStep() ); m_pHScrollBar->setPageStep( m_pEditorScrollView->horizontalScrollBar()->pageStep() ); m_pHScrollBar->setValue( m_pEditorScrollView->horizontalScrollBar()->value() ); m_pVScrollBar->setMinimum( m_pEditorScrollView->verticalScrollBar()->minimum() ); m_pVScrollBar->setMaximum( m_pEditorScrollView->verticalScrollBar()->maximum() ); m_pVScrollBar->setSingleStep( m_pEditorScrollView->verticalScrollBar()->singleStep() ); m_pVScrollBar->setPageStep( m_pEditorScrollView->verticalScrollBar()->pageStep() ); m_pVScrollBar->setValue( m_pEditorScrollView->verticalScrollBar()->value() ); // Make sure currently selected pattern is visible. m_pPatternListScrollView->ensureVisible( 0, (Hydrogen::get_instance()->getSelectedPatternNumber() * nGridHeight + nGridHeight/2 ), 0, m_pPatternList->getGridHeight() ); } void SongEditorPanel::resizeEvent( QResizeEvent *ev ) { UNUSED( ev ); resyncExternalScrollBar(); } void SongEditorPanel::pointerActionBtnPressed( Button* pBtn ) { pBtn->setPressed( true ); m_pDrawActionBtn->setPressed( false ); m_actionMode = SELECT_ACTION; } void SongEditorPanel::drawActionBtnPressed( Button* pBtn ) { pBtn->setPressed( true ); m_pPointerActionBtn->setPressed( false ); m_actionMode = DRAW_ACTION; } void SongEditorPanel::updateTimelineUsage() { auto pHydrogen = Hydrogen::get_instance(); if ( pHydrogen->haveJackTimebaseClient() ) { m_pTimeLineToggleBtn->setToolTip( trUtf8( "Timeline usage is disabled in the presence of an external JACK timebase master") ); m_pTimeLineToggleBtn->setPressed( false ); m_pTimeLineToggleBtn->setDisabled( true ); Preferences::get_instance()->setUseTimelineBpm( false ); m_pPositionRuler->createBackground(); return; } else if ( m_pTimeLineToggleBtn->toolTip() == trUtf8( "Timeline usage is disabled in the presence of an external JACK timebase master") ) { // No external timebase master present anymore. m_pTimeLineToggleBtn->setToolTip( trUtf8( "Enable time line edit") ); m_pTimeLineToggleBtn->setDisabled( false ); } } void SongEditorPanel::timeLineBtnPressed( Button* pBtn ) { auto pHydrogen = Hydrogen::get_instance(); if ( pHydrogen->haveJackTimebaseClient() ) { m_pTimeLineToggleBtn->setToolTip( trUtf8( "Timeline usage is disabled in the presence of an external JACK timebase master") ); return; } else { m_pTimeLineToggleBtn->setToolTip( trUtf8( "Enable time line edit") ); } if ( m_pTimeLineToggleBtn->isPressed() ){ Preferences::get_instance()->setUseTimelineBpm( true ); if ( !pHydrogen->haveJackTransport() ) { pHydrogen->setTimelineBpm(); } } else { Preferences::get_instance()->setUseTimelineBpm( false ); } m_pPositionRuler->createBackground(); } void SongEditorPanel::showTimeline() { m_pWidgetStack->setCurrentWidget( m_pPositionRulerScrollView ); m_pTimeLineToggleBtn->show(); m_pMutePlaybackToggleBtn->hide(); m_pEditPlaybackBtn->hide(); m_pPlaybackTrackFader->hide(); m_pViewPlaybackToggleBtn->setPressed( false ); m_pViewTimeLineToggleBtn->setPressed( true ); Preferences::get_instance()->setShowPlaybackTrack( false ); } void SongEditorPanel::showPlaybackTrack() { m_pWidgetStack->setCurrentWidget( m_pPlaybackTrackScrollView ); m_pTimeLineToggleBtn->hide(); m_pMutePlaybackToggleBtn->show(); m_pEditPlaybackBtn->show(); m_pPlaybackTrackFader->show(); m_pViewTimeLineToggleBtn->setPressed( false ); m_pViewPlaybackToggleBtn->setPressed( true ); Preferences::get_instance()->setShowPlaybackTrack( true ); } void SongEditorPanel::viewTimeLineBtnPressed( Button* pBtn ) { if( pBtn->isPressed() ){ showTimeline(); } else { showPlaybackTrack(); } } void SongEditorPanel::viewPlaybackTrackBtnPressed( Button* pBtn ) { if( pBtn->isPressed() ){ showPlaybackTrack(); } else { showTimeline(); } } void SongEditorPanel::mutePlaybackTrackBtnPressed( Button* pBtn ) { Hydrogen* pEngine = Hydrogen::get_instance(); bool state = !pBtn->isPressed(); state = pEngine->setPlaybackTrackState( state ); m_pMutePlaybackToggleBtn->setPressed( !state ); } void SongEditorPanel::editPlaybackTrackBtnPressed( Button* pBtn ) { if ( (Hydrogen::get_instance()->getState() == STATE_PLAYING) ) { Hydrogen::get_instance()->sequencer_stop(); } //use AudioFileBrowser, but don't allow multi-select. Also, hide all no necessary controls. AudioFileBrowser *pFileBrowser = new AudioFileBrowser( nullptr, false, false); QStringList filenameList; if ( pFileBrowser->exec() == QDialog::Accepted ) { filenameList = pFileBrowser->getSelectedFiles(); } delete pFileBrowser; if( filenameList.size() != 3 ) { return; } if ( filenameList[2].isEmpty() ) { return; } Hydrogen::get_instance()->loadPlaybackTrack( filenameList[2] ); updateAll(); } void SongEditorPanel::modeActionBtnPressed( ) { if( m_pModeActionBtn->isPressed() ){ m_pModeActionBtn->setToolTip( tr( "stacked pattern mode") ); } else { m_pModeActionBtn->setToolTip( tr( "single pattern mode") ); } Hydrogen::get_instance()->togglePlaysSelected(); updateAll(); } void SongEditorPanel::setModeActionBtn( bool mode ) { if( mode ){ m_pModeActionBtn->setPressed( true ); m_pModeActionBtn->setToolTip( tr( "stacked pattern mode") ); } else { m_pModeActionBtn->setPressed( false ); m_pModeActionBtn->setToolTip( tr( "single pattern mode") ); } } void SongEditorPanel::zoomInBtnPressed( Button* pBtn ) { UNUSED( pBtn ); unsigned width = m_pSongEditor->getGridWidth (); --width; m_pSongEditor->setGridWidth (width); m_pPositionRuler->setGridWidth (width); m_pAutomationPathView->setGridWidth (width); updateAll(); } void SongEditorPanel::zoomOutBtnPressed( Button* pBtn ) { UNUSED( pBtn ); unsigned width = m_pSongEditor->getGridWidth (); ++width; m_pSongEditor->setGridWidth (width); m_pPositionRuler->setGridWidth (width); m_pAutomationPathView->setGridWidth (width); updateAll(); } void SongEditorPanel::faderChanged(Fader *pFader) { UNUSED( pFader ); Hydrogen * pHydrogen = Hydrogen::get_instance(); Song* pSong = pHydrogen->getSong(); if( pSong ){ pSong->set_playback_track_volume( pFader->getValue() ); } } void SongEditorPanel::selectedPatternChangedEvent() { m_pModeActionBtn->setPressed( Preferences::get_instance()->patternModePlaysSelected() ); updateAll(); } void SongEditorPanel::automationPathChanged() { Hydrogen *pEngine = Hydrogen::get_instance(); Song *pSong = pEngine->getSong(); pSong->set_is_modified(true); } void SongEditorPanel::automationPathPointAdded(float x, float y) { H2Core::AutomationPath *pPath = m_pAutomationPathView->getAutomationPath(); SE_automationPathAddPointAction *pUndoAction = new SE_automationPathAddPointAction(pPath, x, y); HydrogenApp::get_instance()->m_pUndoStack->push( pUndoAction ); } void SongEditorPanel::automationPathPointRemoved(float x, float y) { H2Core::AutomationPath *pPath = m_pAutomationPathView->getAutomationPath(); SE_automationPathRemovePointAction *pUndoAction = new SE_automationPathRemovePointAction(pPath, x, y); HydrogenApp::get_instance()->m_pUndoStack->push( pUndoAction ); } void SongEditorPanel::automationPathPointMoved(float ox, float oy, float tx, float ty) { H2Core::AutomationPath *pPath = m_pAutomationPathView->getAutomationPath(); SE_automationPathMovePointAction *pUndoAction = new SE_automationPathMovePointAction(pPath, ox, oy, tx, ty); HydrogenApp::get_instance()->m_pUndoStack->push( pUndoAction ); } void SongEditorPanel::toggleAutomationAreaVisibility() { Preferences *pPref = Preferences::get_instance(); if(!pPref->getShowAutomationArea()) { m_pAutomationPathScrollView->show(); m_pAutomationCombo->show(); pPref->setShowAutomationArea( true ); } else { m_pAutomationPathScrollView->hide(); m_pAutomationCombo->hide(); pPref->setShowAutomationArea( false ); } } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanel.h000066400000000000000000000117731366722712400234620ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_EDITOR_PANEL_H #define SONG_EDITOR_PANEL_H #include "../EventListener.h" #include #include #include #if QT_VERSION >= 0x050000 # include #endif class Button; class SongEditor; class SongEditorPatternList; class SongEditorPositionRuler; class ToggleButton; class Fader; class AutomationPathView; class LCDCombo; class PlaybackTrackWaveDisplay; enum SongEditorActionMode { SELECT_ACTION, DRAW_ACTION }; class SongEditorPanel : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: SongEditorPanel( QWidget *parent ); ~SongEditorPanel(); SongEditor* getSongEditor(){ return m_pSongEditor; } SongEditorPatternList* getSongEditorPatternList(){ return m_pPatternList; } SongEditorPositionRuler* getSongEditorPositionRuler(){ return m_pPositionRuler; } AutomationPathView* getAutomationPathView() const { return m_pAutomationPathView; } void updateAll(); void updatePositionRuler(); void setModeActionBtn( bool mode ); SongEditorActionMode getActionMode() { return m_actionMode; } void toggleAutomationAreaVisibility(); void showTimeline(); void showPlaybackTrack(); void updatePlaybackTrackIfNecessary(); // Implements EventListener interface virtual void selectedPatternChangedEvent(); void restoreGroupVector( QString filename ); //~ Implements EventListener interface ///< an empty new pattern will be added to pattern list at idx void insertPattern( int idx, H2Core::Pattern* pPattern ); ///< pattern at idx within pattern list will be destroyed void deletePattern( int idx ); /** Disables and deactivates the Timeline when an external * JACK timebase master is detected and enables it when it's * gone or Hydrogen itself becomes the timebase master. */ void updateTimelineUsage(); private slots: void vScrollTo( int value ); void hScrollTo( int value ); void newPatBtnClicked( Button* ); void upBtnClicked( Button* ); void downBtnClicked( Button* ); void clearSequence( Button* ); void updatePlaybackFaderPeaks(); void updatePlayHeadPosition(); void pointerActionBtnPressed( Button* pBtn ); void drawActionBtnPressed( Button* pBtn ); void timeLineBtnPressed( Button* pBtn ); void viewTimeLineBtnPressed( Button* pBtn ); void viewPlaybackTrackBtnPressed( Button* pBtn ); void mutePlaybackTrackBtnPressed( Button* pBtn ); void editPlaybackTrackBtnPressed( Button* pBtn ); void modeActionBtnPressed( ); void zoomInBtnPressed( Button* pBtn ); void zoomOutBtnPressed( Button* pBtn ); void faderChanged(Fader* pFader); void automationPathChanged(); void automationPathPointAdded(float x, float y); void automationPathPointRemoved(float x, float y); void automationPathPointMoved(float ox, float oy, float tx, float ty); private: SongEditorActionMode m_actionMode; uint m_nInitialWidth; uint m_nInitialHeight; static const int m_nPatternListWidth = 200; QScrollArea* m_pEditorScrollView; QScrollArea* m_pPatternListScrollView; QScrollArea* m_pPositionRulerScrollView; QScrollArea* m_pPlaybackTrackScrollView; QScrollBar * m_pVScrollBar; QScrollBar * m_pHScrollBar; QStackedWidget* m_pWidgetStack; QScrollArea* m_pAutomationPathScrollView; SongEditor* m_pSongEditor; SongEditorPatternList * m_pPatternList; SongEditorPositionRuler *m_pPositionRuler; PlaybackTrackWaveDisplay* m_pPlaybackTrackWaveDisplay; Button * m_pUpBtn; Button * m_pDownBtn; Button * m_pClearPatternSeqBtn; ToggleButton * m_pPointerActionBtn; ToggleButton * m_pModeActionBtn; ToggleButton * m_pDrawActionBtn; ToggleButton * m_pTagbarToggleBtn; Fader* m_pPlaybackTrackFader; ToggleButton * m_pTimeLineToggleBtn; ToggleButton * m_pPlaybackToggleBtn; ToggleButton * m_pViewTimeLineToggleBtn; ToggleButton * m_pViewPlaybackToggleBtn; ToggleButton * m_pMutePlaybackToggleBtn; Button * m_pEditPlaybackBtn; QTimer* m_pTimer; AutomationPathView * m_pAutomationPathView; LCDCombo* m_pAutomationCombo; virtual void resizeEvent( QResizeEvent *ev ); void resyncExternalScrollBar(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelBpmWidget.cpp000066400000000000000000000075641366722712400256230ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include "UndoActions.h" #include "../HydrogenApp.h" #include "SongEditorPanelBpmWidget.h" #include "SongEditorPanel.h" #include "SongEditor.h" #include #include namespace H2Core { const char* SongEditorPanelBpmWidget::__class_name = "SongEditorPanelBpmWidget"; SongEditorPanelBpmWidget::SongEditorPanelBpmWidget( QWidget* pParent, int beat ) : QDialog( pParent ) , Object( __class_name ) , m_stimelineposition ( beat ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "BPM" ) ); setFixedSize( width(), height() ); lineEditBeat->setText(QString("%1").arg( m_stimelineposition + 1) ); deleteBtn->setEnabled ( false ); Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); std::vector timelineVector = pTimeline->m_timelinevector; //restore the bpm value if( timelineVector.size() > 0 ){ for ( int t = 0; t < timelineVector.size(); t++ ){ // ERRORLOG(QString("%1 %2").arg(Hydrogen::get_instance()->m_timelinevector[t].m_htimelinebeat).arg(m_stimelineposition)); if ( timelineVector[t].m_htimelinebeat == m_stimelineposition ) { lineEditBpm->setText( QString("%1").arg( timelineVector[t].m_htimelinebpm ) ); deleteBtn->setEnabled ( true ); return; } else { lineEditBpm->setText( QString("%1").arg( engine->getNewBpmJTM()) ); } } }else { lineEditBpm->setText( QString("%1").arg( engine->getNewBpmJTM() ) ); } } SongEditorPanelBpmWidget::~SongEditorPanelBpmWidget() { INFOLOG( "DESTROY" ); } void SongEditorPanelBpmWidget::on_CancelBtn_clicked() { reject(); } void SongEditorPanelBpmWidget::on_okBtn_clicked() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); float oldBpm = -1.0; //search for an old entry if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if ( pTimeline->m_timelinevector[t].m_htimelinebeat == ( QString( lineEditBeat->text() ).toInt() ) -1 ) { oldBpm = pTimeline->m_timelinevector[t].m_htimelinebpm; } } } SE_editTimeLineAction *action = new SE_editTimeLineAction( lineEditBeat->text().toInt(), oldBpm, QString( lineEditBpm->text() ).toFloat() ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); accept(); } void SongEditorPanelBpmWidget::on_deleteBtn_clicked() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); float oldBpm = -1.0; //search for an old entry if( pTimeline->m_timelinevector.size() >= 1 ){ for ( int t = 0; t < pTimeline->m_timelinevector.size(); t++){ if ( pTimeline->m_timelinevector[t].m_htimelinebeat == ( QString( lineEditBeat->text() ).toInt() ) -1 ) { oldBpm = pTimeline->m_timelinevector[t].m_htimelinebpm; } } } SE_deleteTimeLineAction *action = new SE_deleteTimeLineAction( lineEditBeat->text().toInt(), oldBpm ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); accept(); } } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelBpmWidget.h000066400000000000000000000027211366722712400252560ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_EDITOR_PANEL_BPM_WIDGET_H #define SONG_EDITOR_PANEL_BPM_WIDGET_H #include #include "ui_SongEditorPanelBpmWidget_UI.h" #include /// /// namespace H2Core { class SongEditorPanelBpmWidget : public QDialog, public Ui_SongEditorPanelBpmWidget_UI, public H2Core::Object { H2_OBJECT //lineEditBEAT //lineEditBPM //deleteBtn Q_OBJECT public: SongEditorPanelBpmWidget( QWidget* pParent, int beat ); ~SongEditorPanelBpmWidget(); private slots: void on_CancelBtn_clicked(); void on_okBtn_clicked(); void on_deleteBtn_clicked(); private: int m_stimelineposition; }; } #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelBpmWidget_UI.ui000066400000000000000000000054251366722712400260450ustar00rootroot00000000000000 SongEditorPanelBpmWidget_UI 0 0 198 151 Form 10 10 180 135 Edit the bpm value for current beat 500,55 Edit beat in timeline 500 Bar BPM Delete this BPM Marker Delete BPM Marker Cancel Ok true lineEditBpm lineEditBeat deleteBtn CancelBtn okBtn hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelTagWidget.cpp000066400000000000000000000120631366722712400256060ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include "UndoActions.h" #include "../HydrogenApp.h" #include "SongEditorPanelTagWidget.h" #include "SongEditorPanel.h" #include "SongEditor.h" #include #include namespace H2Core { const char* SongEditorPanelTagWidget::__class_name = "SongEditorPanelTagWidget"; SongEditorPanelTagWidget::SongEditorPanelTagWidget( QWidget* pParent, int beat ) : QDialog( pParent ) , Object( __class_name ) , m_stimelineposition ( beat ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "Tag" ) ); createTheTagTableWidget(); connect( tagTableWidget, SIGNAL( itemChanged ( QTableWidgetItem * ) ), this, SLOT( a_itemIsChanged( QTableWidgetItem * ) ) ); } SongEditorPanelTagWidget::~SongEditorPanelTagWidget() { INFOLOG( "DESTROY" ); } void SongEditorPanelTagWidget::a_itemIsChanged(QTableWidgetItem *item) { __theChangedItems << QString( "%1" ).arg( item->row() ); } void SongEditorPanelTagWidget::createTheTagTableWidget() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); int patterngroupvectorsize; patterngroupvectorsize = engine->getSong()->get_pattern_group_vector()->size(); for( int i = 0; i < patterngroupvectorsize; i++ ) { tagTableWidget->insertRow( i ); } std::vector timelineTagVector = pTimeline->m_timelinetagvector; //read the tag vector and fill all tags into items if( timelineTagVector.size() > 0 ){ for ( unsigned int t = 0; t < timelineTagVector.size(); t++ ){ QTableWidgetItem *newTagItem = new QTableWidgetItem(); newTagItem->setText( QString( "%1" ).arg( timelineTagVector[t].m_htimelinetag ) ); tagTableWidget->setItem( timelineTagVector[t].m_htimelinetagbeat, 0, newTagItem ); tagTableWidget->setCurrentItem( newTagItem ); tagTableWidget->openPersistentEditor( newTagItem ); } } //activate the clicked item and //if you click on an existing tag //fill in the old contend if( timelineTagVector.size() > 0 ){ int vpos = -1; QTableWidgetItem *newTagItem2 = new QTableWidgetItem(); newTagItem2->setText( QString( "" ) ); for ( unsigned int t = 0; t < timelineTagVector.size(); t++ ){ if( timelineTagVector[t].m_htimelinetagbeat == m_stimelineposition){ vpos = t; } } if( vpos >-1 ){ newTagItem2->setText( QString( "%1" ).arg( timelineTagVector[vpos].m_htimelinetag ) ); } tagTableWidget->setItem( m_stimelineposition , 0, newTagItem2 ); tagTableWidget->setCurrentItem( newTagItem2 ); tagTableWidget->openPersistentEditor( newTagItem2 ); } //add first tag if( timelineTagVector.size() == 0 ){ QTableWidgetItem *newTagItem3 = new QTableWidgetItem(); tagTableWidget->setItem( m_stimelineposition , 0, newTagItem3 ); tagTableWidget->setCurrentItem( newTagItem3 ); tagTableWidget->openPersistentEditor( newTagItem3 ); } } void SongEditorPanelTagWidget::on_CancelBtn_clicked() { reject(); } void SongEditorPanelTagWidget::on_okBtn_clicked() { Hydrogen* engine = Hydrogen::get_instance(); Timeline* pTimeline = engine->getTimeline(); int patterngroupvectorsize; patterngroupvectorsize = engine->getSong()->get_pattern_group_vector()->size(); //oldText list contains all old item values. we need them for undo an item QStringList oldText; if(pTimeline->m_timelinetagvector.size() > 0){ for (int i = 0; i < patterngroupvectorsize; i++){ oldText << ""; } for(int i = 0; i < pTimeline->m_timelinetagvector.size(); ++i){ oldText.replace(pTimeline->m_timelinetagvector[i].m_htimelinetagbeat , pTimeline->m_timelinetagvector[i].m_htimelinetag); } } for( int i = 0; i < __theChangedItems.size() ; i++ ) { QTableWidgetItem *newTagItem = new QTableWidgetItem(); int songPosition = __theChangedItems.value( i ).toInt(); newTagItem = tagTableWidget->item( songPosition, 0 ); if ( newTagItem ) { SE_editTagAction *action = new SE_editTagAction( newTagItem->text() ,oldText.value( songPosition ), songPosition ); HydrogenApp::get_instance()->m_pUndoStack->push( action ); } } accept(); } void SongEditorPanelTagWidget::on_tagTableWidget_currentItemChanged(QTableWidgetItem * current, QTableWidgetItem * previous ) { tagTableWidget->closePersistentEditor(previous); } } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelTagWidget.h000066400000000000000000000032201366722712400252460ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_EDITOR_PANEL_TAG_WIDGET_H #define SONG_EDITOR_PANEL_TAG_WIDGET_H #include #include "ui_SongEditorPanelTagWidget_UI.h" #include /// /// namespace H2Core { class SongEditorPanelTagWidget : public QDialog, public Ui_SongEditorPanelTagWidget_UI, public H2Core::Object { H2_OBJECT //lineEditBEAT //lineEditBPM //deleteBtn Q_OBJECT public: SongEditorPanelTagWidget( QWidget* pParent, int beat ); ~SongEditorPanelTagWidget(); private slots: void on_CancelBtn_clicked(); void on_okBtn_clicked(); void on_tagTableWidget_currentItemChanged( QTableWidgetItem * current, QTableWidgetItem * previous ); void a_itemIsChanged(QTableWidgetItem *item); private: int m_stimelineposition; void createTheTagTableWidget(); QStringList __theChangedItems; }; } #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/SongEditorPanelTagWidget_UI.ui000066400000000000000000000036461366722712400260450ustar00rootroot00000000000000 SongEditorPanelTagWidget_UI 0 0 293 420 Form QAbstractItemView::DragDrop Qt::CopyAction 100 true Tag Cancel Ok true CancelBtn okBtn hydrogen-1.0.0-rc1/src/gui/src/SongEditor/VirtualPatternDialog.cpp000066400000000000000000000030101366722712400250450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "VirtualPatternDialog.h" #include #include #include #include #include "Skin.h" const char* VirtualPatternDialog::__class_name = "VirtualPatternDialog"; VirtualPatternDialog::VirtualPatternDialog(QWidget* parent) : QDialog(parent) , Object( __class_name ) { setupUi( this ); setFixedSize( width(), height() ); setWindowTitle( tr( "Select virtual pattern" ) ); } VirtualPatternDialog::~VirtualPatternDialog() { } void VirtualPatternDialog::on_cancelBtn_clicked() { reject(); } void VirtualPatternDialog::on_okBtn_clicked() { accept(); } hydrogen-1.0.0-rc1/src/gui/src/SongEditor/VirtualPatternDialog.h000066400000000000000000000026761366722712400245330ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 VIRTUAL_PATTERN_DIALOG_H #define VIRTUAL_PATTERN_DIALOG_H #include #if QT_VERSION >= 0x050000 # include #endif #include "ui_VirtualPatternDialog_UI.h" #include namespace H2Core { class Pattern; class PatternList; } /// /// Virtual Pattern Dialog /// class VirtualPatternDialog : public QDialog, public Ui_VirtualPatternDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: VirtualPatternDialog( QWidget* parent ); ~VirtualPatternDialog(); private slots: void on_cancelBtn_clicked(); void on_okBtn_clicked(); private: }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongEditor/VirtualPatternDialog_UI.ui000066400000000000000000000045461366722712400253140ustar00rootroot00000000000000 VirtualPatternDialog_UI 0 0 400 300 Dialog 20 250 351 41 Qt::Horizontal 40 20 OK true Cancel Qt::Horizontal 40 20 10 0 381 241 QFrame::StyledPanel QFrame::Raised 0 0 381 241 QAbstractItemView::MultiSelection hydrogen-1.0.0-rc1/src/gui/src/SongPropertiesDialog.cpp000066400000000000000000000035051366722712400230000ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SongPropertiesDialog.h" #include "Skin.h" #include #include #include using namespace H2Core; SongPropertiesDialog::SongPropertiesDialog(QWidget* parent) : QDialog(parent) { setupUi( this ); setMaximumSize( width(), height() ); setMinimumSize( width(), height() ); setWindowTitle( tr( "Song properties" ) ); Song *pSong = Hydrogen::get_instance()->getSong(); songNameTxt->setText( pSong->__name ); authorTxt->setText( pSong->__author ); notesTxt->append( pSong->get_notes() ); licenseTxt->setText( pSong->get_license() ); } SongPropertiesDialog::~SongPropertiesDialog() { } void SongPropertiesDialog::on_cancelBtn_clicked() { reject(); } void SongPropertiesDialog::on_okBtn_clicked() { Song *pSong = Hydrogen::get_instance()->getSong(); pSong->__name = songNameTxt->text(); pSong->__author = authorTxt->text(); pSong->set_notes( notesTxt->toPlainText() ); pSong->set_license( licenseTxt->text() ); accept(); } hydrogen-1.0.0-rc1/src/gui/src/SongPropertiesDialog.h000066400000000000000000000024161366722712400224450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SONG_PROPERTIES_DIALOG_H #define SONG_PROPERTIES_DIALOG_H #include "ui_SongPropertiesDialog_UI.h" #include "HydrogenApp.h" /** * Song Properties Dialog */ class SongPropertiesDialog : public QDialog, private Ui_SongPropertiesDialog_UI { H2_OBJECT Q_OBJECT public: SongPropertiesDialog(QWidget* parent); ~SongPropertiesDialog(); private slots: void on_cancelBtn_clicked(); void on_okBtn_clicked(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SongPropertiesDialog_UI.ui000066400000000000000000000070351366722712400232320ustar00rootroot00000000000000 SongPropertiesDialog_UI 0 0 290 378 Form1 10 36 268 24 10 72 268 24 0 20 Author 10 96 268 24 10 190 268 24 0 20 Notes 10 12 268 24 0 20 Song name 150 330 90 24 &OK Alt+O true 50 330 90 24 &Cancel Alt+C 10 220 271 101 10 154 268 24 10 130 268 24 0 20 License hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/000077500000000000000000000000001366722712400206035ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/FileBrowser.cpp000066400000000000000000000163451366722712400235430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "FileBrowser.h" #include #include #include "math.h" #include "string.h" #include #include #include using namespace H2Core; const char* FileBrowser::__class_name = "FileBrowser"; FileBrowser::FileBrowser( QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) { INFOLOG( "[FileBrowser]" ); m_pDirectoryLabel = new QLabel( nullptr ); m_pUpBtn = new QPushButton( "..", nullptr ); m_pUpBtn->setMaximumWidth( 30 ); connect( m_pUpBtn, SIGNAL( clicked() ), this, SLOT( on_upBtnClicked() ) ); QWidget *pDirectoryPanel = new QWidget( nullptr ); QHBoxLayout *hbox = new QHBoxLayout(); hbox->setSpacing( 0 ); hbox->setMargin( 0 ); hbox->addWidget( m_pDirectoryLabel ); hbox->addWidget( m_pUpBtn ); pDirectoryPanel->setLayout( hbox ); QWidget *pInfoPanel = new QWidget( nullptr ); m_pFileInfo = new QLabel( nullptr ); QPushButton *pPlayBtn = new QPushButton( "Play", nullptr ); connect( pPlayBtn, SIGNAL( clicked() ), this, SLOT( on_playBtnClicked() ) ); pPlayBtn->setMaximumWidth( 40 ); QHBoxLayout *pInfoHBox = new QHBoxLayout(); pInfoHBox->addWidget( m_pFileInfo ); pInfoHBox->addWidget( pPlayBtn ); pInfoPanel->setLayout( pInfoHBox ); m_pDirList = new QListWidget( nullptr ); m_pFileList = new QListWidget( nullptr ); connect( m_pFileList, SIGNAL( currentItemChanged( QListWidgetItem*, QListWidgetItem*) ), this, SLOT( on_fileList_ItemChanged( QListWidgetItem*, QListWidgetItem* ) ) ); connect( m_pFileList, SIGNAL( itemActivated( QListWidgetItem* ) ), this, SLOT( on_fileList_ItemActivated( QListWidgetItem* ) ) ); connect( m_pDirList, SIGNAL( itemActivated( QListWidgetItem* ) ), this, SLOT( on_dirList_ItemActivated( QListWidgetItem* ) ) ); // LAYOUT QVBoxLayout *vbox = new QVBoxLayout(); vbox->setSpacing( 0 ); vbox->setMargin( 0 ); vbox->addWidget( pDirectoryPanel ); vbox->addWidget( m_pDirList ); vbox->addWidget( m_pFileList ); vbox->addWidget( pInfoPanel ); this->setLayout( vbox ); updateFileInfo( "", 0, 0 ); loadDirectoryTree( QDir::homePath() ); } FileBrowser::~FileBrowser() { INFOLOG( "[~FileBrowser]" ); } void FileBrowser::loadDirectoryTree( const QString& sBasedir ) { INFOLOG( "[loadDirectoryTree]" ); m_pDirList->clear(); m_pFileList->clear(); m_directory.setPath( sBasedir ); m_pDirectoryLabel->setText( sBasedir ); QFileInfoList list = m_directory.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QListWidgetItem *pItem = new QListWidgetItem(); if ( fileInfo.isDir() ) { if ( fileInfo.fileName().startsWith( "." ) ) { delete pItem; continue; } pItem->setText( fileInfo.fileName() ); m_pDirList->insertItem( 0, pItem); } else { delete pItem; } } m_pDirList->sortItems( Qt::AscendingOrder ); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QListWidgetItem *pItem = new QListWidgetItem(); if ( !fileInfo.isDir() ) { bool bOk = false; if ( fileInfo.fileName().endsWith( ".wav", Qt::CaseInsensitive ) ) { bOk = true; } else if ( fileInfo.fileName().endsWith( ".flac", Qt::CaseInsensitive ) ) { bOk = true; } else if ( fileInfo.fileName().endsWith( ".au", Qt::CaseInsensitive ) ) { bOk = true; } else if ( fileInfo.fileName().endsWith( ".aiff", Qt::CaseInsensitive ) ) { bOk = true; } if ( bOk ) { pItem->setText( fileInfo.fileName() ); m_pFileList->insertItem( 0, pItem); } else { delete pItem; } } else { delete pItem; } } m_pFileList->sortItems( Qt::AscendingOrder ); } void FileBrowser::updateFileInfo( QString sFilename, unsigned nSampleRate, unsigned nBytes ) { char sFileSizeUnit[6]; char sFileSize[32]; if( nBytes >= 1073741824 ){ sprintf( sFileSize, "%#.3f", (float)nBytes / 1073741824.0 ); strcpy( sFileSizeUnit, "GByte" ); } else if( nBytes >= 1048576 ){ sprintf( sFileSize, "%#.2f", (float)nBytes / 1048576.0 ); strcpy( sFileSizeUnit, "MByte" ); } else if(nBytes >= 1024) { sprintf( sFileSize, "%#.1f", (float)nBytes / 1024.0 ); strcpy( sFileSizeUnit, "KByte" ); } else { sprintf( sFileSize, "%#.0f", (double)nBytes ); strcpy( sFileSizeUnit, "Byte" ); } m_pFileInfo->setText( QString( tr( "%1
%2 KHz
%3 %4" ) ) .arg( sFilename ) .arg( nSampleRate ) .arg( sFileSize ) .arg( sFileSizeUnit ) ); } void FileBrowser::on_fileList_ItemChanged( QListWidgetItem * current, QListWidgetItem * previous ) { UNUSED( previous ); INFOLOG( "[on_fileList_ItemChanged]" ); if ( current ) { QString sFileName = current->text(); QFileInfoList list = m_directory.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); if ( fileInfo.fileName() == current->text() ) { updateFileInfo( sFileName, 0, fileInfo.size() ); } } } } void FileBrowser::on_fileList_ItemActivated( QListWidgetItem* item ) { if ( !item ) { return; } QString sFileName = m_directory.absolutePath() + "/" + ( item->text() ); QFileInfoList list = m_directory.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); if ( fileInfo.fileName() == item->text() ) { INFOLOG( "[on_fileList_ItemActivated] " + fileInfo.absoluteFilePath() ); if ( !fileInfo.isDir() ) { // FIXME: evitare di caricare il sample, visualizzare solo le info del file Sample *pNewSample = Sample::load( fileInfo.absoluteFilePath() ); if (pNewSample) { updateFileInfo( fileInfo.absoluteFilePath(), pNewSample->get_sample_rate(), pNewSample->get_size() ); AudioEngine::get_instance()->get_sampler()->preview_sample(pNewSample, 192); } } } } } void FileBrowser::on_dirList_ItemActivated( QListWidgetItem* pItem ) { INFOLOG( "[on_dirList_ItemActivated]" ); if ( !pItem ) { return; } QString sFileName = m_directory.absolutePath() + "/" + ( pItem->text() ); QFileInfoList list = m_directory.entryInfoList(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); if ( fileInfo.fileName() == pItem->text() ) { if ( fileInfo.isDir() ) { // change directory loadDirectoryTree( fileInfo.absoluteFilePath() ); return; } } } } void FileBrowser::on_upBtnClicked() { INFOLOG( "[on_upBtnClicked]" ); m_directory.cdUp(); loadDirectoryTree( m_directory.absolutePath() ); } void FileBrowser::on_playBtnClicked() { INFOLOG( "[on_playBtnClicked]" ); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/FileBrowser.h000066400000000000000000000033061366722712400232010ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 FILE_BROWSER_H #define FILE_BROWSER_H #include #include #if QT_VERSION >= 0x050000 # include #endif class FileBrowser : public QWidget, private H2Core::Object { H2_OBJECT Q_OBJECT public: FileBrowser( QWidget* pParent ); ~FileBrowser(); private slots: void on_fileList_ItemChanged( QListWidgetItem * current, QListWidgetItem * previous ); void on_fileList_ItemActivated( QListWidgetItem* ); void on_dirList_ItemActivated( QListWidgetItem* ); void on_upBtnClicked(); void on_playBtnClicked(); private: QLabel *m_pDirectoryLabel; QPushButton* m_pUpBtn; QLabel *m_pFileInfo; QListWidget *m_pDirList; QListWidget *m_pFileList; QDir m_directory; void loadDirectoryTree( const QString& basedir ); void updateFileInfo( QString sFilename, unsigned nSampleRate, unsigned nBytes ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryDatastructures.cpp000066400000000000000000000126171366722712400266710ustar00rootroot00000000000000#include "SoundLibraryImportDialog.h" #include "SoundLibraryRepositoryDialog.h" #include "SoundLibraryPanel.h" #include "../Widgets/DownloadWidget.h" #include "../HydrogenApp.h" #include "../InstrumentRack.h" #include #include #include #include #include #include "SoundLibraryDatastructures.h" #include #include #include #include using namespace H2Core; SoundLibraryDatabase* SoundLibraryDatabase::__instance = nullptr; const char* SoundLibraryDatabase::__class_name = "SoundLibraryDatabase"; SoundLibraryDatabase::SoundLibraryDatabase() : Object( __class_name ) { INFOLOG( "INIT" ); patternVector = new soundLibraryInfoVector(); updatePatterns(); } SoundLibraryDatabase::~SoundLibraryDatabase() { //Clean up the patterns data structure soundLibraryInfoVector::iterator mapIterator; for( mapIterator=patternVector->begin(); mapIterator != patternVector->end(); mapIterator++ ) { delete *mapIterator; } delete patternVector; } void SoundLibraryDatabase::create_instance() { if ( __instance == nullptr ) { __instance = new SoundLibraryDatabase; } } void SoundLibraryDatabase::printPatterns() { soundLibraryInfoVector::iterator mapIterator; for( mapIterator=patternVector->begin(); mapIterator != patternVector->end(); mapIterator++ ) { INFOLOG( QString( "Name: " + (*mapIterator)->getName() ) ); } for (int i = 0; i < patternCategories.size(); ++i) INFOLOG( patternCategories.at(i) ) } bool SoundLibraryDatabase::isPatternInstalled( const QString& patternName) { soundLibraryInfoVector::iterator mapIterator; for( mapIterator=patternVector->begin(); mapIterator != patternVector->end(); mapIterator++ ) { if( (*mapIterator)->getName() == patternName ) return true; } return false; } void SoundLibraryDatabase::update() { updatePatterns(); //updateSongs(); //updateDrumkits(); } void SoundLibraryDatabase::updatePatterns() { patternVector->clear(); patternCategories = QStringList(); // search drumkit subdirectories within patterns user directory foreach ( const QString& drumkit, Filesystem::pattern_drumkits() ) { getPatternFromDirectory( Filesystem::patterns_dir( drumkit ), patternVector); } // search patterns user directory getPatternFromDirectory( Filesystem::patterns_dir(), patternVector); } void SoundLibraryDatabase::getPatternFromDirectory( const QString& sPatternDir, std::vector* patternVector ) { foreach ( const QString& fName, Filesystem::pattern_list( sPatternDir ) ) { QString sFile = sPatternDir + fName; SoundLibraryInfo* slInfo = new SoundLibraryInfo( sFile ); patternVector->push_back( slInfo ); if ( !patternCategories.contains( slInfo->getCategory() ) ) { patternCategories << slInfo->getCategory(); } } } soundLibraryInfoVector* SoundLibraryDatabase::getAllPatterns() const { return patternVector; } const char* SoundLibraryInfo::__class_name = "SoundLibraryInfo"; SoundLibraryInfo::SoundLibraryInfo() : Object( __class_name ) { //default constructor } SoundLibraryInfo::SoundLibraryInfo(const QString &path) : Object( __class_name ) { /* *Use the provided file instantiate this object with the corresponding meta *data from either a drumkit, a pattern or a song. */ QDomDocument doc = LocalFileMng::openXmlDocument( path ); setPath( path ); QDomNode rootNode = doc.firstChildElement( "drumkit_pattern" ); if ( !rootNode.isNull() ) { setType( "pattern" ); setAuthor( LocalFileMng::readXmlString( rootNode,"author", "undefined author" ) ); setLicense( LocalFileMng::readXmlString( rootNode,"license", "undefined license" ) ); QDomNode patternNode = rootNode.firstChildElement( "pattern" ); setName( LocalFileMng::readXmlString( patternNode,"pattern_name", "" ) ); if ( getName().isEmpty() ) { setName( LocalFileMng::readXmlString( patternNode,"name", "" ) ); } setInfo( LocalFileMng::readXmlString( patternNode,"info", "No information available." ) ); setCategory( LocalFileMng::readXmlString( patternNode,"category", "" ) ); } //New drumkits rootNode = doc.firstChildElement( "drumkit_info" ); if ( !rootNode.isNull() ) { setType( "drumkit" ); setAuthor( LocalFileMng::readXmlString( rootNode,"author", "undefined author" ) ); setLicense( LocalFileMng::readXmlString( rootNode,"license", "undefined license" ) ); setName( LocalFileMng::readXmlString( rootNode,"name", "" ) ); setInfo( LocalFileMng::readXmlString( rootNode,"info", "No information available." ) ); setImage( LocalFileMng::readXmlString( rootNode,"image", "" ) ); setImageLicense( LocalFileMng::readXmlString( rootNode,"imageLicense", "undefined license" ) ); //setCategory( LocalFileMng::readXmlString( rootNode,"category", "" ) ); } //Songs rootNode = doc.firstChildElement( "song" ); if ( !rootNode.isNull() ) { setType( "song" ); setAuthor( LocalFileMng::readXmlString( rootNode,"author", "undefined author" ) ); setLicense( LocalFileMng::readXmlString( rootNode,"license", "undefined license" ) ); setName( LocalFileMng::readXmlString( rootNode,"name", "" ) ); setInfo( LocalFileMng::readXmlString( rootNode,"info", "No information available." ) ); //setCategory( LocalFileMng::readXmlString( rootNode,"category", "" ) ); } } SoundLibraryInfo::~SoundLibraryInfo() { //default deconstructor } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryDatastructures.h000066400000000000000000000060551366722712400263350ustar00rootroot00000000000000#ifndef SOUNDLIBRARYDATASTRUCTURES_H #define SOUNDLIBRARYDATASTRUCTURES_H #include #include class SoundLibraryInfo; /** * @class SoundLibraryDatabase * * @brief This class holds information about all installed soundlibrary items. * * This class organizes the metadata of all locally installed soundlibrary items. * * @author Sebastian Moors * */ typedef std::vector soundLibraryInfoVector; class SoundLibraryDatabase: public H2Core::Object { H2_OBJECT public: SoundLibraryDatabase(); ~SoundLibraryDatabase(); //bool isItemInstalled( const SoundLibraryInfo& item ); soundLibraryInfoVector* getAllPatterns() const; QStringList getAllPatternCategories() const { return patternCategories; } void update(); void updatePatterns(); void printPatterns(); void getPatternFromDirectory(const QString& path, soundLibraryInfoVector* ); bool isPatternInstalled( const QString& patternName); static void create_instance(); static SoundLibraryDatabase* get_instance() { assert(__instance); return __instance; } private: static SoundLibraryDatabase *__instance; soundLibraryInfoVector* patternVector; QStringList patternCategories; }; /** * @class SoundLibraryInfo * * @brief This class holds information about a soundlibrary. * * This class is used to represent soundlibrary items. It contains * the metadata for songs, pattern and drumkits. * * @author Sebastian Moors * */ class SoundLibraryInfo : public H2Core::Object { H2_OBJECT public: SoundLibraryInfo(); SoundLibraryInfo( const QString& path); ~SoundLibraryInfo(); QString getName() const { return m_sName; } QString getUrl() const{ return m_sURL; } QString getInfo() const { return m_sInfo; } QString getAuthor() const { return m_sAuthor; } QString getCategory() const { return m_sCategory; } QString getType() const { return m_sType; } QString getLicense() const { return m_sLicense; } QString getImage() const { return m_sImage; } QString getImageLicense() const { return m_sImageLicense; } void setName( const QString& name ){ m_sName = name; } void setUrl(const QString& url){ m_sURL = url; } void setInfo( const QString& info){ m_sInfo = info; } void setAuthor( const QString& author ){ m_sAuthor = author; } void setType( const QString& type){ m_sType = type; } void setCategory( const QString& category){ m_sCategory = category; } void setLicense( const QString& license ){ m_sLicense = license; } void setImage( const QString& image ){ m_sImage = image; } void setImageLicense( const QString& imageLicense ){ m_sImageLicense = imageLicense; } void setPath( const QString& path){ m_sPath = path; } QString getPath(){ return m_sPath; } private: QString m_sName; QString m_sURL; QString m_sInfo; QString m_sAuthor; QString m_sCategory; QString m_sType; QString m_sLicense; QString m_sImage; QString m_sImageLicense; QString m_sPath; }; #endif // SOUNDLIBRARYDATASTRUCTURES_H hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryExportDialog.cpp000066400000000000000000000251071366722712400262530ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryExportDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 # include #endif #if defined(H2CORE_HAVE_LIBARCHIVE) #include #include #include #include #endif using namespace H2Core; const char* SoundLibraryExportDialog::__class_name = "SoundLibraryExportDialog"; SoundLibraryExportDialog::SoundLibraryExportDialog( QWidget* pParent, const QString& selectedKit ) : QDialog( pParent ) , Object( __class_name ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "Export Sound Library" ) ); setFixedSize( width(), height() ); preselectedKit = selectedKit; updateDrumkitList(); drumkitPathTxt->setText( QDir::homePath() ); } SoundLibraryExportDialog::~SoundLibraryExportDialog() { INFOLOG( "DESTROY" ); for (uint i = 0; i < drumkitInfoList.size(); i++ ) { Drumkit* info = drumkitInfoList[i]; delete info; } drumkitInfoList.clear(); } void SoundLibraryExportDialog::on_exportBtn_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); QString drumkitName = drumkitList->currentText(); QString drumkitDir = Filesystem::drumkit_dir_search( drumkitName ); QString saveDir = drumkitPathTxt->text(); Drumkit* pDrumkit = nullptr; QDir qdTempFolder( Filesystem::tmp_dir() ); int componentID = -1; if( versionList->currentIndex() == 1 ) { for (uint i = 0; i < drumkitInfoList.size(); i++ ) { pDrumkit = drumkitInfoList[i]; if( pDrumkit->get_name().compare( drumkitName ) == 0 ) { QString temporaryDrumkitXML = qdTempFolder.filePath( "drumkit.xml" ); INFOLOG( "[ExportSoundLibrary]" ); INFOLOG( "Saving temporary file into: " + temporaryDrumkitXML ); for (std::vector::iterator it = pDrumkit->get_components()->begin() ; it != pDrumkit->get_components()->end(); ++it) { DrumkitComponent* pComponent = *it; if( pComponent->get_name().compare( componentList->currentText() ) == 0) { componentID = pComponent->get_id(); break; } } pDrumkit->save_file( temporaryDrumkitXML, true, componentID ); break; } } } assert( pDrumkit ); #if defined(H2CORE_HAVE_LIBARCHIVE) QString fullDir = drumkitDir + "/" + drumkitName; QDir sourceDir(fullDir); sourceDir.setFilter(QDir::Files); QStringList filesList = sourceDir.entryList(); QString outname = saveDir + "/" + drumkitName + ".h2drumkit"; struct archive *a; struct archive_entry *entry; struct stat st; char buff[8192]; int len; int fd; a = archive_write_new(); #if ARCHIVE_VERSION_NUMBER < 3000000 archive_write_set_compression_gzip(a); #else archive_write_add_filter_gzip(a); #endif archive_write_set_format_pax_restricted(a); archive_write_open_filename(a, outname.toUtf8().constData()); for (int i = 0; i < filesList.size(); i++) { QString filename = fullDir + "/" + filesList.at(i); QString targetFilename = drumkitName + "/" + filesList.at(i); if( versionList->currentIndex() == 1 ) { if( filesList.at(i).compare( QString("drumkit.xml") ) == 0 ) { filename = qdTempFolder.filePath( "drumkit.xml" ); } else { bool bFoundFileInRightComponent = false; for( int j = 0; j < pDrumkit->get_instruments()->size() ; j++){ InstrumentList instrList = pDrumkit->get_instruments(); Instrument* instr = instrList[j]; for (std::vector::iterator it = instr->get_components()->begin() ; it != instr->get_components()->end(); ++it) { InstrumentComponent* component = *it; if( component->get_drumkit_componentID() == componentID ){ for( int n = 0; n < InstrumentComponent::getMaxLayers(); n++ ) { InstrumentLayer* layer = component->get_layer( n ); if( layer ) { if( layer->get_sample()->get_filename().compare(filesList.at(i)) == 0 ) { bFoundFileInRightComponent = true; break; } } } } } } if( !bFoundFileInRightComponent ) { continue; } } } stat(filename.toUtf8().constData(), &st); entry = archive_entry_new(); archive_entry_set_pathname(entry, targetFilename.toUtf8().constData()); archive_entry_set_size(entry, st.st_size); archive_entry_set_filetype(entry, AE_IFREG); archive_entry_set_perm(entry, 0644); archive_write_header(a, entry); fd = ::open(filename.toUtf8().constData(), O_RDONLY); len = read(fd, buff, sizeof(buff)); while ( len > 0 ) { archive_write_data(a, buff, len); len = read(fd, buff, sizeof(buff)); } ::close(fd); archive_entry_free(entry); } archive_write_close(a); #if ARCHIVE_VERSION_NUMBER < 3000000 archive_write_finish(a); #else archive_write_free(a); #endif filesList.clear(); QApplication::restoreOverrideCursor(); QMessageBox::information( this, "Hydrogen", "Drumkit exported." ); #elif !defined(WIN32) if(TmpFileCreated) { /* * If a temporary drumkit.xml has been created: * 1. move the original drumkit.xml to drumkit_backup.xml * 2. copy the temporary file to drumkitDir/drumkit.xml * 3. export the drumkit * 4. move the drumkit_backup.xml to drumkit.xml */ int ret = 0; //1. QString cmd = QString( "cd " ) + drumkitDir + "; " + "cp " + drumkitName + "/drumkit.xml " + drumkitName + "/drumkit_097.xml"; ret = system( cmd.toLocal8Bit() ); //2. cmd = QString( "cd " ) + drumkitDir + "; " + "mv " + qdTempFolder.filePath( "drumkit.xml" ) + " " + drumkitName + "/drumkit.xml"; ret = system( cmd.toLocal8Bit() ); //3. cmd = QString( "cd " ) + drumkitDir + ";" + "tar czf \"" + saveDir + "/" + drumkitName + ".h2drumkit\" -- \"" + drumkitName + "\""; ret = system( cmd.toLocal8Bit() ); //4. cmd = QString( "cd " ) + drumkitDir + "; " + "mv " + drumkitName + "/drumkit_097.xml " + drumkitName + "/drumkit.xml"; ret = system( cmd.toLocal8Bit() ); } else { QString cmd = QString( "cd " ) + drumkitDir + ";" + "tar czf \"" + saveDir + "/" + drumkitName + ".h2drumkit\" -- \"" + drumkitName + "\""; int ret = system( cmd.toLocal8Bit() ); } QApplication::restoreOverrideCursor(); QMessageBox::information( this, "Hydrogen", "Drumkit exported." ); #else QApplication::restoreOverrideCursor(); QMessageBox::information( this, "Hydrogen", "Drumkit not exported. Operation not supported." ); #endif } void SoundLibraryExportDialog::on_drumkitPathTxt_textChanged( QString str ) { QString path = drumkitPathTxt->text(); if (path.isEmpty()) { exportBtn->setEnabled( false ); } else { exportBtn->setEnabled( true ); } } void SoundLibraryExportDialog::on_browseBtn_clicked() { static QString lastUsedDir = QDir::homePath(); QString filename = QFileDialog::getExistingDirectory (this, tr("Directory"), lastUsedDir); if ( filename.isEmpty() ) { drumkitPathTxt->setText( QDir::homePath() ); } else { drumkitPathTxt->setText( filename ); lastUsedDir = filename; } } void SoundLibraryExportDialog::on_cancelBtn_clicked() { accept(); } void SoundLibraryExportDialog::on_drumkitList_currentIndexChanged( QString str ) { componentList->clear(); QStringList p_compoList = kit_components[str]; for (QStringList::iterator it = p_compoList.begin() ; it != p_compoList.end(); ++it) { QString p_compoName = *it; componentList->addItem( p_compoName ); } } void SoundLibraryExportDialog::on_versionList_currentIndexChanged( int index ) { if( index == 0 ) { componentList->setEnabled( false ); } else if( index == 1 ) { componentList->setEnabled( true ); } } void SoundLibraryExportDialog::updateDrumkitList() { INFOLOG( "[updateDrumkitList]" ); drumkitList->clear(); for (uint i = 0; i < drumkitInfoList.size(); i++ ) { Drumkit* info = drumkitInfoList[i]; delete info; } drumkitInfoList.clear(); QStringList sysDrumkits = Filesystem::sys_drumkit_list(); for (int i = 0; i < sysDrumkits.size(); ++i) { QString absPath = Filesystem::sys_drumkits_dir() + sysDrumkits.at(i); Drumkit *info = Drumkit::load( absPath, false ); if (info) { drumkitInfoList.push_back( info ); drumkitList->addItem( info->get_name() ); QStringList p_components; for (std::vector::iterator it = info->get_components()->begin() ; it != info->get_components()->end(); ++it) { DrumkitComponent* p_compo = *it; p_components.append(p_compo->get_name()); } kit_components[info->get_name()] = p_components; } } QStringList userDrumkits = Filesystem::usr_drumkit_list(); for (int i = 0; i < userDrumkits.size(); ++i) { QString absPath = Filesystem::usr_drumkits_dir() + userDrumkits.at(i); Drumkit *info = Drumkit::load( absPath, false ); if (info) { drumkitInfoList.push_back( info ); drumkitList->addItem( info->get_name() ); QStringList p_components; for (std::vector::iterator it = info->get_components()->begin() ; it != info->get_components()->end(); ++it) { DrumkitComponent* p_compo = *it; p_components.append(p_compo->get_name()); } kit_components[info->get_name()] = p_components; } } /* * If the export dialog was called from the soundlibrary panel via right click on * a soundlibrary, the variable preselectedKit holds the name of the selected drumkit */ int index = drumkitList->findText( preselectedKit ); if ( index >= 0) { drumkitList->setCurrentIndex( index ); } else { drumkitList->setCurrentIndex( 0 ); } on_drumkitList_currentIndexChanged( drumkitList->currentText() ); on_versionList_currentIndexChanged( 0 ); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryExportDialog.h000066400000000000000000000033641366722712400257210ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_EXPORT_DIALOG_H #define SOUND_LIBRARY_EXPORT_DIALOG_H #include "ui_SoundLibraryExportDialog_UI.h" #include #include #include #include /// /// /// class SoundLibraryExportDialog : public QDialog, public Ui_SoundLibraryExportDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryExportDialog( QWidget* pParent, const QString&); ~SoundLibraryExportDialog(); private slots: void on_exportBtn_clicked(); void on_browseBtn_clicked(); void on_cancelBtn_clicked(); void on_versionList_currentIndexChanged( int index ); void on_drumkitList_currentIndexChanged( QString str ); void on_drumkitPathTxt_textChanged( QString str ); void updateDrumkitList(); private: std::vector drumkitInfoList; QString preselectedKit; QHash kit_components; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryExportDialog_UI.ui000066400000000000000000000146231366722712400265040ustar00rootroot00000000000000 SoundLibraryExportDialog_UI 0 0 503 281 Dialog 10 120 481 101 Drumkit 10 20 461 70 0 0 Drumkit Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 0 0 Component Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 10 9 481 101 Export 10 20 461 74 0 0 Path 0 0 120 16777215 Browse... false 0 0 Version 0 0 0.9.7 and higher 0.9.6 and lower 170 240 178 35 false Export false true Cancel false hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryImportDialog.cpp000066400000000000000000000476311366722712400262520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryDatastructures.h" #include "SoundLibraryImportDialog.h" #include "SoundLibraryRepositoryDialog.h" #include "SoundLibraryPanel.h" #include "../Widgets/DownloadWidget.h" #include "../HydrogenApp.h" #include "../InstrumentRack.h" #include #include #include #include #include #include #include #include #include #include #include const char* SoundLibraryImportDialog::__class_name = "SoundLibraryImportDialog"; const int max_redirects = 30; SoundLibraryImportDialog::SoundLibraryImportDialog( QWidget* pParent, bool bOnlineImport ) : QDialog( pParent ) , Object( __class_name ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "Sound Library import" ) ); setFixedSize( width(), height() ); QStringList headers; headers << tr( "Sound library" ) << tr( "Status" ); QTreeWidgetItem* header = new QTreeWidgetItem( headers ); m_pDrumkitTree->setHeaderItem( header ); m_pDrumkitTree->header()->resizeSection( 0, 200 ); connect( m_pDrumkitTree, SIGNAL( currentItemChanged ( QTreeWidgetItem*, QTreeWidgetItem* ) ), this, SLOT( soundLibraryItemChanged( QTreeWidgetItem*, QTreeWidgetItem* ) ) ); connect( repositoryCombo, SIGNAL(currentIndexChanged(int)), this, SLOT( onRepositoryComboBoxIndexChanged(int) )); SoundLibraryNameLbl->setText( "" ); SoundLibraryInfoLbl->setText( "" ); DownloadBtn->setEnabled( false ); InstallBtn->setEnabled (false ); updateRepositoryCombo(); if( bOnlineImport){ tabWidget->setCurrentIndex( 0 ); } else { tabWidget->setCurrentIndex( 1 ); } } SoundLibraryImportDialog::~SoundLibraryImportDialog() { INFOLOG( "DESTROY" ); } //update combo box void SoundLibraryImportDialog::updateRepositoryCombo() { H2Core::Preferences* pref = H2Core::Preferences::get_instance(); /* Read serverList from config and put servers into the comboBox */ if( pref->sServerList.size() == 0 ) { pref->sServerList.push_back( "http://hydrogen-music.org/feeds/drumkit_list.php" ); } repositoryCombo->clear(); std::list::const_iterator cur_Server; for( cur_Server = pref->sServerList.begin(); cur_Server != pref->sServerList.end(); ++cur_Server ) { repositoryCombo->insertItem( 0, *cur_Server ); } reloadRepositoryData(); } void SoundLibraryImportDialog::onRepositoryComboBoxIndexChanged(int i) { UNUSED(i); if(!repositoryCombo->currentText().isEmpty()) { QString cacheFile = getCachedFilename(); if( !H2Core::Filesystem::file_exists( cacheFile, true ) ) { SoundLibraryImportDialog::on_UpdateListBtn_clicked(); } reloadRepositoryData(); } } /// /// Edit the server list /// void SoundLibraryImportDialog::on_EditListBtn_clicked() { SoundLibraryRepositoryDialog repoDialog( this ); repoDialog.exec(); updateRepositoryCombo(); } void SoundLibraryImportDialog::clearImageCache() { // Note: After a kit is installed the list refreshes and this gets called to // clear the image cache - maybe we want to keep the cache in this case? QString cacheDir = H2Core::Filesystem::repositories_cache_dir() ; INFOLOG("Deleting cached image files from " + cacheDir.toLocal8Bit() ); QDir dir( cacheDir ); dir.setNameFilters(QStringList() << "*.png"); dir.setFilter(QDir::Files); foreach(QString dirFile, dir.entryList()) { if ( !dir.remove(dirFile) ) { WARNINGLOG("Error removing image file(s) from cache."); } } } QString SoundLibraryImportDialog::getCachedFilename() { QString cacheDir = H2Core::Filesystem::repositories_cache_dir(); QString serverMd5 = QString(QCryptographicHash::hash(( repositoryCombo->currentText().toLatin1() ),QCryptographicHash::Md5).toHex()); QString cacheFile = cacheDir + "/" + serverMd5; return cacheFile; } QString SoundLibraryImportDialog::getCachedImageFilename() { QString cacheDir = H2Core::Filesystem::repositories_cache_dir(); QString kitNameMd5 = QString(QCryptographicHash::hash(( SoundLibraryNameLbl->text().toLatin1() ),QCryptographicHash::Md5).toHex()); QString cacheFile = cacheDir + "/" + kitNameMd5 + ".png"; return cacheFile; } void SoundLibraryImportDialog::writeCachedData(const QString& fileName, const QString& data) { if( data.isEmpty() ) { return; } QFile outFile( fileName ); if( !outFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) { ERRORLOG( QString("Failed to open file for writing repository cache: %1").arg( fileName ) ); return; } QTextStream stream( &outFile ); stream << data; outFile.close(); } void SoundLibraryImportDialog::writeCachedImage( const QString& imageFile, QPixmap& pixmap ) { QString cacheFile = getCachedImageFilename() ; QFile outFile( cacheFile ); if( !outFile.open( QIODevice::WriteOnly ) ) { ERRORLOG( QString("Failed to open file for writing repository image cache: %1").arg( imageFile ) ); return; } pixmap.save(&outFile); outFile.close(); } QString SoundLibraryImportDialog::readCachedData(const QString& fileName) { QString content; QFile inFile( fileName ); if( !inFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { ERRORLOG( QString("Failed to open file for reading: %1").arg( fileName ) ); return content; } QDomDocument document; if( !document.setContent( &inFile ) ) { inFile.close(); return content; } inFile.close(); content = document.toString(); return content; } QString SoundLibraryImportDialog::readCachedImage( const QString& imageFile ) { QString cacheFile = getCachedImageFilename() ; QFile file( cacheFile ); if( !file.exists() ) { // no image in cache, just return NULL return nullptr; } return cacheFile; } void SoundLibraryImportDialog::reloadRepositoryData() { QString sDrumkitXML; QString cacheFile = getCachedFilename(); if(H2Core::Filesystem::file_exists(cacheFile,true)) { sDrumkitXML = readCachedData(cacheFile); } m_soundLibraryList.clear(); QDomDocument dom; dom.setContent( sDrumkitXML ); QDomNode drumkitNode = dom.documentElement().firstChild(); while ( !drumkitNode.isNull() ) { if( !drumkitNode.toElement().isNull() ) { if ( drumkitNode.toElement().tagName() == "drumkit" || drumkitNode.toElement().tagName() == "song" || drumkitNode.toElement().tagName() == "pattern" ) { SoundLibraryInfo soundLibInfo; if ( drumkitNode.toElement().tagName() =="song" ) { soundLibInfo.setType( "song" ); } if ( drumkitNode.toElement().tagName() =="drumkit" ) { soundLibInfo.setType( "drumkit" ); } if ( drumkitNode.toElement().tagName() =="pattern" ) { soundLibInfo.setType( "pattern" ); } QDomElement nameNode = drumkitNode.firstChildElement( "name" ); if ( !nameNode.isNull() ) { soundLibInfo.setName( nameNode.text() ); } QDomElement urlNode = drumkitNode.firstChildElement( "url" ); if ( !urlNode.isNull() ) { soundLibInfo.setUrl( urlNode.text() ); } QDomElement infoNode = drumkitNode.firstChildElement( "info" ); if ( !infoNode.isNull() ) { soundLibInfo.setInfo( infoNode.text() ); } QDomElement authorNode = drumkitNode.firstChildElement( "author" ); if ( !authorNode.isNull() ) { soundLibInfo.setAuthor( authorNode.text() ); } QDomElement licenseNode = drumkitNode.firstChildElement( "license" ); if ( !licenseNode.isNull() ) { soundLibInfo.setLicense( licenseNode.text() ); } QDomElement imageNode = drumkitNode.firstChildElement( "image" ); if ( !imageNode.isNull() ) { soundLibInfo.setImage( imageNode.text() ); } QDomElement imageLicenseNode = drumkitNode.firstChildElement( "imageLicense" ); if ( !imageLicenseNode.isNull() ) { soundLibInfo.setImageLicense( imageLicenseNode.text() ); } m_soundLibraryList.push_back( soundLibInfo ); } } drumkitNode = drumkitNode.nextSibling(); } updateSoundLibraryList(); } /// /// Download and update the drumkit list /// void SoundLibraryImportDialog::on_UpdateListBtn_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); QString downloadUrl = repositoryCombo->currentText(); QString sDrumkitXML; for (int i=0; i < max_redirects; i++) { DownloadWidget drumkitList( this, tr( "Updating SoundLibrary list..." ), downloadUrl); drumkitList.exec(); if (!drumkitList.get_redirect_url().isEmpty()) { downloadUrl = drumkitList.get_redirect_url().toEncoded(); } else if (!drumkitList.get_error()) { sDrumkitXML = drumkitList.get_xml_content(); break; } } /* * Hydrogen creates the following cache hierarchy to cache * the content of server lists: * * CACHE_DIR * +-----repositories * +-----serverlist_$(md5(SERVER_NAME)) */ QString cacheFile = getCachedFilename(); writeCachedData(cacheFile, sDrumkitXML); reloadRepositoryData(); QApplication::restoreOverrideCursor(); } void SoundLibraryImportDialog::updateSoundLibraryList() { // build the sound library tree m_pDrumkitTree->clear(); m_pDrumkitsItem = new QTreeWidgetItem( m_pDrumkitTree ); m_pDrumkitsItem->setText( 0, tr( "Drumkits" ) ); m_pDrumkitsItem->setExpanded( true ); m_pSongItem = new QTreeWidgetItem( m_pDrumkitTree ); m_pSongItem->setText( 0, tr( "Songs" ) ); m_pSongItem->setExpanded( true ); m_pPatternItem = new QTreeWidgetItem( m_pDrumkitTree ); m_pPatternItem->setText( 0, tr( "Patterns" ) ); m_pPatternItem->setExpanded( true ); for ( uint i = 0; i < m_soundLibraryList.size(); ++i ) { QString sLibraryName = m_soundLibraryList[ i ].getName(); QTreeWidgetItem* pDrumkitItem = nullptr; if ( m_soundLibraryList[ i ].getType() == "song" ) { pDrumkitItem = new QTreeWidgetItem( m_pSongItem ); } else if ( m_soundLibraryList[ i ].getType() == "drumkit" ) { pDrumkitItem = new QTreeWidgetItem( m_pDrumkitsItem ); } else if ( m_soundLibraryList[ i ].getType() == "pattern" ) { pDrumkitItem = new QTreeWidgetItem( m_pPatternItem ); } if( pDrumkitItem ) { if ( isSoundLibraryItemAlreadyInstalled( m_soundLibraryList[ i ] ) ) { pDrumkitItem->setText( 0, sLibraryName ); pDrumkitItem->setText( 1, tr( "Installed" ) ); } else { pDrumkitItem->setText( 0, sLibraryName ); pDrumkitItem->setText( 1, tr( "New" ) ); } } } // Also clear out the image cache clearImageCache(); } /// Is the SoundLibrary already installed? bool SoundLibraryImportDialog::isSoundLibraryItemAlreadyInstalled( SoundLibraryInfo sInfo ) { // check if the filename matches with an already installed soundlibrary directory. // The filename used in the Soundlibrary URL must be the same of the unpacked directory. // E.g: V-Synth_VariBreaks.h2drumkit must contain the V-Synth_VariBreaks directory once unpacked. // Many drumkit are broken now (wrong filenames) and MUST be fixed! QString sName = QFileInfo( sInfo.getUrl() ).fileName(); sName = sName.left( sName.lastIndexOf( "." ) ); if ( sInfo.getType() == "drumkit" ) { if ( H2Core::Filesystem::drumkit_exists(sName) ) { return true; } } if ( sInfo.getType() == "pattern" ) { return SoundLibraryDatabase::get_instance()->isPatternInstalled( sInfo.getName() ); } if ( sInfo.getType() == "song" ) { if ( H2Core::Filesystem::song_exists(sName) ) { return true; } } return false; } void SoundLibraryImportDialog::loadImage(QString img ) { QPixmap pixmap; pixmap.load( img ) ; writeCachedImage( drumkitImageLabel->text(), pixmap ); showImage( pixmap ); } void SoundLibraryImportDialog::showImage( QPixmap pixmap ) { int x = (int) drumkitImageLabel->size().width(); int y = drumkitImageLabel->size().height(); float labelAspect = (float) x / y; float imageAspect = (float) pixmap.width() / pixmap.height(); if ( ( x < pixmap.width() ) || ( y < pixmap.height() ) ) { if ( labelAspect >= imageAspect ) { // image is taller or the same as label frame pixmap = pixmap.scaledToHeight( y ); } else { // image is wider than label frame pixmap = pixmap.scaledToWidth( x ); } } drumkitImageLabel->setPixmap( pixmap ); // TODO: Check if valid! } void SoundLibraryImportDialog::soundLibraryItemChanged( QTreeWidgetItem* current, QTreeWidgetItem* previous ) { UNUSED( previous ); if ( current ) { QString selected = current->text(0); for ( uint i = 0; i < m_soundLibraryList.size(); ++i ) { if ( m_soundLibraryList[ i ].getName() == selected ) { SoundLibraryInfo info = m_soundLibraryList[ i ]; //bool alreadyInstalled = isSoundLibraryAlreadyInstalled( info.m_sURL ); SoundLibraryNameLbl->setText( info.getName() ); if( info.getType() == "pattern" ){ SoundLibraryInfoLbl->setText(""); } else { SoundLibraryInfoLbl->setText( info.getInfo() ); } AuthorLbl->setText( tr( "Author: %1" ).arg( info.getAuthor() ) ); LicenseLbl->setText( tr( "Drumkit License: %1" ).arg( info.getLicense()) ); ImageLicenseLbl->setText( tr("Image License: %1" ).arg( info.getImageLicense() ) ); // Load the drumkit image // Clear any image first drumkitImageLabel->setPixmap( QPixmap() ); drumkitImageLabel->setText( info.getImage() ); if ( info.getImage().length() > 0 ) { if ( isSoundLibraryItemAlreadyInstalled( info ) ) { // get image file from local disk QString sName = QFileInfo( info.getUrl() ).fileName(); sName = sName.left( sName.lastIndexOf( "." ) ); H2Core::Drumkit* drumkitInfo = H2Core::Drumkit::load_by_name( sName, false ); if ( drumkitInfo ) { // get the image from the local filesystem QPixmap pixmap ( drumkitInfo->get_path() + "/" + drumkitInfo->get_image() ); INFOLOG("Loaded image " + drumkitInfo->get_image().toLocal8Bit() + " from local filesystem"); showImage( pixmap ); } else { ___ERRORLOG ( "Error loading the drumkit" ); } } else { // Try from the cache QString cachedFile = readCachedImage( info.getImage() ); if ( cachedFile.length() > 0 ) { QPixmap pixmap ( cachedFile ); showImage( pixmap ); INFOLOG( "Loaded image " + info.getImage().toLocal8Bit() + " from cache (" + cachedFile + ")" ); } else { // Get the drumkit's directory name from URL // // Example: if the server repo URL is: http://www.hydrogen-music.org/feeds/drumkit_list.php // and the image name from the XML is Roland_TR-808_drum_machine.jpg // the URL for the image will be: http://www.hydrogen-music.org/feeds/images/Roland_TR-808_drum_machine.jpg if ( info.getImage().length() > 0 ) { QString sImageUrl; QString sLocalFile; sImageUrl = repositoryCombo->currentText().left( repositoryCombo->currentText().lastIndexOf( QString( "/" )) + 1 ) + info.getImage() ; sLocalFile = QDir::tempPath() + "/" + QFileInfo( sImageUrl ).fileName(); DownloadWidget dl( this, tr( "" ), sImageUrl, sLocalFile ); dl.exec(); loadImage( sLocalFile ); // Delete the temporary file QFile::remove( sLocalFile ); } } } } else { // no image file specified in drumkit.xml INFOLOG( "No image for this kit specified in drumkit.xml on remote server" ); } DownloadBtn->setEnabled( true ); return; } } } SoundLibraryNameLbl->setText( "" ); SoundLibraryInfoLbl->setText( "" ); AuthorLbl->setText( "" ); DownloadBtn->setEnabled( false ); } void SoundLibraryImportDialog::on_DownloadBtn_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); QString selected = m_pDrumkitTree->currentItem()->text(0); for ( uint i = 0; i < m_soundLibraryList.size(); ++i ) { if ( m_soundLibraryList[ i ].getName() == selected ) { // Download the sound library QString sURL = m_soundLibraryList[ i ].getUrl(); QString sType = m_soundLibraryList[ i ].getType(); QString sLocalFile; if( sType == "drumkit") { sLocalFile = QDir::tempPath() + "/" + QFileInfo( sURL ).fileName(); } if( sType == "song") { sLocalFile = H2Core::Filesystem::songs_dir() + QFileInfo( sURL ).fileName(); } if( sType == "pattern") { sLocalFile = H2Core::Filesystem::patterns_dir() + QFileInfo( sURL ).fileName(); } bool Error = false; for ( int i = 0; i < max_redirects; ++i ) { DownloadWidget dl( this, tr( "Downloading SoundLibrary..." ), sURL, sLocalFile ); dl.exec(); QUrl redirect_url = dl.get_redirect_url(); if (redirect_url.isEmpty() ) { // ok, we have all data Error = dl.get_error(); break; } else { sURL = redirect_url.toEncoded(); Error = dl.get_error(); } } //No 'else', error message has been already displayed by DL widget if(!Error) { // install the new soundlibrary try { if ( sType == "drumkit" ) { H2Core::Drumkit::install( sLocalFile ); QApplication::restoreOverrideCursor(); QMessageBox::information( this, "Hydrogen", QString( tr( "SoundLibrary imported in %1" ) ).arg( H2Core::Filesystem::usr_data_path() ) ); } if ( sType == "song" || sType == "pattern") { QApplication::restoreOverrideCursor(); } } catch( H2Core::H2Exception ex ) { QApplication::restoreOverrideCursor(); QMessageBox::warning( this, "Hydrogen", tr( "An error occurred importing the SoundLibrary." ) ); } } else { QApplication::restoreOverrideCursor(); } QApplication::setOverrideCursor(Qt::WaitCursor); // remove the downloaded files.. if( sType == "drumkit" ) { QDir dir; dir.remove( sLocalFile ); } // update the drumkit list SoundLibraryDatabase::get_instance()->update(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); updateSoundLibraryList(); QApplication::restoreOverrideCursor(); return; } } } void SoundLibraryImportDialog::on_BrowseBtn_clicked() { static QString lastUsedDir = QDir::homePath(); QFileDialog fd(this); fd.setFileMode(QFileDialog::ExistingFile); fd.setNameFilter( "Hydrogen drumkit (*.h2drumkit)" ); fd.setDirectory( lastUsedDir ); fd.setWindowTitle( tr( "Import drumkit" ) ); QString filename = ""; if (fd.exec() == QDialog::Accepted) { filename = fd.selectedFiles().first(); } if (filename != "") { SoundLibraryPathTxt->setText( filename ); lastUsedDir = fd.directory().absolutePath(); InstallBtn->setEnabled ( true ); } } void SoundLibraryImportDialog::on_InstallBtn_clicked() { QApplication::setOverrideCursor(Qt::WaitCursor); try { H2Core::Drumkit::install( SoundLibraryPathTxt->text() ); QMessageBox::information( this, "Hydrogen", QString( tr( "SoundLibrary imported in %1" ).arg( H2Core::Filesystem::usr_data_path() ) ) ); // update the drumkit list SoundLibraryDatabase::get_instance()->update(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); QApplication::restoreOverrideCursor(); } catch( H2Core::H2Exception ex ) { QApplication::restoreOverrideCursor(); QMessageBox::warning( this, "Hydrogen", tr( "An error occurred importing the SoundLibrary." ) ); } } void SoundLibraryImportDialog::on_close_btn_clicked() { accept(); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryImportDialog.h000066400000000000000000000047521366722712400257140ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_IMPORT_DIALOG_H #define SOUND_LIBRARY_IMPORT_DIALOG_H #include "ui_SoundLibraryImportDialog_UI.h" #include #include #include #include "SoundLibraryDatastructures.h" /// /// This dialog is used to import a SoundLibrary file from a local file or via HTTP. /// class SoundLibraryImportDialog : public QDialog, public Ui_SoundLibraryImportDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryImportDialog( QWidget* pParent, bool bOnlineImport ); ~SoundLibraryImportDialog(); signals: private slots: void on_EditListBtn_clicked(); void on_UpdateListBtn_clicked(); void on_DownloadBtn_clicked(); void on_BrowseBtn_clicked(); void on_InstallBtn_clicked(); void on_close_btn_clicked(); void soundLibraryItemChanged( QTreeWidgetItem*, QTreeWidgetItem* ); void onRepositoryComboBoxIndexChanged(int); private: std::vector m_soundLibraryList; QTreeWidgetItem* m_pDrumkitsItem; QTreeWidgetItem* m_pSongItem; QTreeWidgetItem* m_pPatternItem; bool isSoundLibraryItemAlreadyInstalled( SoundLibraryInfo sInfo ); void writeCachedData(const QString& fileName, const QString& data); void writeCachedImage( const QString& imageFile, QPixmap& pixmap ); void clearImageCache(); QString readCachedImage( const QString& imageFile ); QString readCachedData(const QString& fileName); QString getCachedFilename(); QString getCachedImageFilename(); void reloadRepositoryData(); void updateSoundLibraryList(); void updateRepositoryCombo(); void showImage( QPixmap pixmap ); void loadImage( QString img ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryImportDialog_UI.ui000066400000000000000000000235041366722712400264730ustar00rootroot00000000000000 SoundLibraryImportDialog_UI 0 0 795 688 Dialog 0 Internet 9 9 375 588 Qt::Horizontal 40 20 Update list Edit server list Qt::Horizontal 40 20 true 15 false false 1 390 86 374 511 16777215 50 75 true Sound Library Name Qt::AlignCenter true true 0 200 34 31 30 34 31 30 144 141 139 TextLabel Qt::AlignCenter 16777215 30 Image License... 16777215 30 Drumkit License... 16777215 30 Author... Qt::Horizontal 372 21 Download and install Local file 10 10 721 74 Browse... false Install 0 0 true Qt::Horizontal 40 20 Close Qt::Horizontal 40 20 hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryOpenDialog.cpp000066400000000000000000000047031366722712400256720ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryOpenDialog.h" #include "SoundLibrary/SoundLibraryPanel.h" using namespace H2Core; const char* SoundLibraryOpenDialog::__class_name = "SoundLibraryOpenDialog"; SoundLibraryOpenDialog::SoundLibraryOpenDialog( QWidget* pParent ) : QDialog( pParent ) , Object( __class_name ) { INFOLOG( "INIT" ); setWindowTitle( tr( "Open Sound Library" ) ); setFixedSize( 280, 380 ); QVBoxLayout *pVBox = new QVBoxLayout(); pVBox->setSpacing( 6 ); pVBox->setMargin( 9 ); // Sound Library Panel m_pSoundLibraryPanel = new SoundLibraryPanel( nullptr, true ); pVBox->addWidget( m_pSoundLibraryPanel, 0, nullptr ); // Buttons QHBoxLayout *pButtonsBox = new QHBoxLayout(); pButtonsBox->addStretch(); m_pOkBtn = new QPushButton( tr("Load") ); pButtonsBox->addWidget( m_pOkBtn ); m_pCancelBtn = new QPushButton( tr("Cancel") ); pButtonsBox->addWidget( m_pCancelBtn ); pButtonsBox->addStretch(); pVBox->addLayout( pButtonsBox ); this->setLayout( pVBox ); connect( m_pSoundLibraryPanel, SIGNAL( item_changed ( bool ) ), this, SLOT( on_soundLib_item_changed( bool ) ) ); connect( m_pOkBtn, SIGNAL( clicked ( ) ), this, SLOT( on_open_btn_clicked( ) ) ); connect( m_pCancelBtn, SIGNAL( clicked ( ) ), this, SLOT( on_cancel_btn_clicked( ) ) ); } SoundLibraryOpenDialog::~SoundLibraryOpenDialog() { } void SoundLibraryOpenDialog::on_soundLib_item_changed( bool bDrumkitSelected) { m_pOkBtn->setEnabled( bDrumkitSelected ); } void SoundLibraryOpenDialog::on_open_btn_clicked() { m_pSoundLibraryPanel->on_drumkitLoadAction(); accept(); } void SoundLibraryOpenDialog::on_cancel_btn_clicked() { accept(); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryOpenDialog.h000066400000000000000000000027361366722712400253430ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_OPEN_DIALOG_H #define SOUND_LIBRARY_OPEN_DIALOG_H #include #if QT_VERSION >= 0x050000 #include #endif #include "SoundLibraryDatastructures.h" class SoundLibraryPanel; class SoundLibraryOpenDialog : public QDialog, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryOpenDialog( QWidget* pParent ); ~SoundLibraryOpenDialog(); private slots: void on_soundLib_item_changed( bool bDrumkitSelected ); void on_cancel_btn_clicked(); void on_open_btn_clicked(); private: SoundLibraryPanel* m_pSoundLibraryPanel; QPushButton* m_pOkBtn; QPushButton* m_pCancelBtn; }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryPanel.cpp000066400000000000000000000621151366722712400247110ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryPanel.h" #include #if QT_VERSION >= 0x050000 # include #endif #include "SoundLibraryDatastructures.h" #include "SoundLibraryTree.h" #include "FileBrowser.h" #include "SoundLibrarySaveDialog.h" #include "SoundLibraryPropertiesDialog.h" #include "SoundLibraryExportDialog.h" #include "../HydrogenApp.h" #include "../Widgets/Button.h" #include "../Widgets/PixmapWidget.h" #include "../Skin.h" #include "../SongEditor/SongEditorPanel.h" #include "../PatternEditor/PatternEditorPanel.h" #include "../PatternEditor/DrumPatternEditor.h" #include "../PatternEditor/PatternEditorInstrumentList.h" #include "../InstrumentRack.h" #include "../InstrumentEditor/InstrumentEditorPanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace H2Core; #include const char* SoundLibraryPanel::__class_name = "SoundLibraryPanel"; SoundLibraryPanel::SoundLibraryPanel( QWidget *pParent, bool bInItsOwnDialog ) : QWidget( pParent ) , Object( __class_name ) , __sound_library_tree( nullptr ) , __drumkit_menu( nullptr ) , __instrument_menu( nullptr ) , __song_menu( nullptr ) , __pattern_menu( nullptr ) , __pattern_menu_list( nullptr ) , __system_drumkits_item( nullptr ) , __user_drumkits_item( nullptr ) , __song_item( nullptr ) , __pattern_item( nullptr ) , __pattern_item_list( nullptr ) { //INFOLOG( "INIT" ); __drumkit_menu = new QMenu( this ); __drumkit_menu->addAction( tr( "Load" ), this, SLOT( on_drumkitLoadAction() ) ); __drumkit_menu->addAction( tr( "Export" ), this, SLOT( on_drumkitExportAction() ) ); __drumkit_menu->addAction( tr( "Properties" ), this, SLOT( on_drumkitPropertiesAction() ) ); __drumkit_menu->addSeparator(); __drumkit_menu->addAction( tr( "Delete" ), this, SLOT( on_drumkitDeleteAction() ) ); __instrument_menu = new QMenu( this ); __instrument_menu->addSeparator(); __instrument_menu->addAction( tr( "Delete" ), this, SLOT( on_instrumentDeleteAction() ) ); __song_menu = new QMenu( this ); __song_menu->addSeparator(); __song_menu->addAction( tr( "Load" ), this, SLOT( on_songLoadAction() ) ); __pattern_menu = new QMenu( this ); __pattern_menu->addSeparator(); __pattern_menu->addAction( tr( "Load" ), this, SLOT( on_patternLoadAction() ) ); __pattern_menu->addAction( tr( "Delete" ), this, SLOT( on_patternDeleteAction() ) ); __pattern_menu_list = new QMenu( this ); __pattern_menu_list->addSeparator(); __pattern_menu_list->addAction( tr( "Load" ), this, SLOT( on_patternLoadAction() ) ); // DRUMKIT LIST __sound_library_tree = new SoundLibraryTree( nullptr ); connect( __sound_library_tree, SIGNAL( currentItemChanged ( QTreeWidgetItem*, QTreeWidgetItem* ) ), this, SLOT( on_DrumkitList_ItemChanged( QTreeWidgetItem*, QTreeWidgetItem* ) ) ); connect( __sound_library_tree, SIGNAL( itemActivated ( QTreeWidgetItem*, int ) ), this, SLOT( on_DrumkitList_itemActivated( QTreeWidgetItem*, int ) ) ); connect( __sound_library_tree, SIGNAL( leftClicked(QPoint) ), this, SLOT( on_DrumkitList_leftClicked(QPoint)) ); if( !bInItsOwnDialog ) { connect( __sound_library_tree, SIGNAL( rightClicked(QPoint) ), this, SLOT( on_DrumkitList_rightClicked(QPoint)) ); connect( __sound_library_tree, SIGNAL( onMouseMove( QMouseEvent* ) ), this, SLOT( on_DrumkitList_mouseMove( QMouseEvent* ) ) ); } // LAYOUT QVBoxLayout *pVBox = new QVBoxLayout(); pVBox->setSpacing( 0 ); pVBox->setMargin( 0 ); pVBox->addWidget( __sound_library_tree ); this->setLayout( pVBox ); __expand_pattern_list = Preferences::get_instance()->__expandPatternItem; __expand_songs_list = Preferences::get_instance()->__expandSongItem; updateDrumkitList(); } SoundLibraryPanel::~SoundLibraryPanel() { for (uint i = 0; i < __system_drumkit_info_list.size(); ++i ) { delete __system_drumkit_info_list[i]; } __system_drumkit_info_list.clear(); for (uint i = 0; i < __user_drumkit_info_list.size(); ++i ) { delete __user_drumkit_info_list[i]; } __user_drumkit_info_list.clear(); } void SoundLibraryPanel::updateDrumkitList() { QString currentSL = Hydrogen::get_instance()->getCurrentDrumkitname(); LocalFileMng mng; __sound_library_tree->clear(); __system_drumkits_item = new QTreeWidgetItem( __sound_library_tree ); __system_drumkits_item->setText( 0, tr( "System drumkits" ) ); __system_drumkits_item->setExpanded( true ); __user_drumkits_item = new QTreeWidgetItem( __sound_library_tree ); __user_drumkits_item->setText( 0, tr( "User drumkits" ) ); __user_drumkits_item->setExpanded( true ); for (uint i = 0; i < __system_drumkit_info_list.size(); ++i ) { delete __system_drumkit_info_list[i]; } __system_drumkit_info_list.clear(); for (uint i = 0; i < __user_drumkit_info_list.size(); ++i ) { delete __user_drumkit_info_list[i]; } __user_drumkit_info_list.clear(); //User drumkit list QStringList usr_dks = Filesystem::usr_drumkit_list(); for (int i = 0; i < usr_dks.size(); ++i) { QString absPath = Filesystem::usr_drumkits_dir() + usr_dks[i]; Drumkit *pInfo = Drumkit::load( absPath, false ); if (pInfo) { __user_drumkit_info_list.push_back( pInfo ); QTreeWidgetItem* pDrumkitItem = new QTreeWidgetItem( __user_drumkits_item ); pDrumkitItem->setText( 0, pInfo->get_name() ); if ( QString(pInfo->get_name() ) == currentSL ){ pDrumkitItem->setBackground( 0, QColor( 50, 50, 50) ); } InstrumentList *pInstrList = pInfo->get_instruments(); for ( uint nInstr = 0; nInstr < pInstrList->size(); ++nInstr ) { Instrument *pInstr = pInstrList->get( nInstr ); QTreeWidgetItem* pInstrumentItem = new QTreeWidgetItem( pDrumkitItem ); pInstrumentItem->setText( 0, QString( "[%1] " ).arg( nInstr + 1 ) + pInstr->get_name() ); pInstrumentItem->setToolTip( 0, pInstr->get_name() ); } } } //System drumkit list QStringList sys_dks = Filesystem::sys_drumkit_list(); for (int i = 0; i < sys_dks.size(); ++i) { QString absPath = Filesystem::sys_drumkits_dir() + sys_dks[i]; Drumkit *pInfo = Drumkit::load( absPath, false ); if (pInfo) { __system_drumkit_info_list.push_back( pInfo ); QTreeWidgetItem* pDrumkitItem = new QTreeWidgetItem( __system_drumkits_item ); pDrumkitItem->setText( 0, pInfo->get_name() ); if ( QString( pInfo->get_name() ) == currentSL ){ pDrumkitItem->setBackground( 0, QColor( 50, 50, 50) ); } InstrumentList *pInstrList = pInfo->get_instruments(); for ( uint nInstr = 0; nInstr < pInstrList->size(); ++nInstr ) { Instrument *pInstr = pInstrList->get( nInstr ); QTreeWidgetItem* pInstrumentItem = new QTreeWidgetItem( pDrumkitItem ); pInstrumentItem->setText( 0, QString( "[%1] " ).arg( nInstr + 1 ) + pInstr->get_name() ); pInstrumentItem->setToolTip( 0, pInstr->get_name() ); } } } //Songlist QStringList songs = Filesystem::song_list_cleared(); if ( songs.size() > 0 ) { __song_item = new QTreeWidgetItem( __sound_library_tree ); __song_item->setText( 0, tr( "Songs" ) ); __song_item->setToolTip( 0, tr("Double click to expand the list") ); __song_item->setExpanded( __expand_songs_list ); for (uint i = 0; i < songs.size(); i++) { QTreeWidgetItem* pSongItem = new QTreeWidgetItem( __song_item ); QString song = songs[i]; pSongItem->setText( 0 , song.left( song.indexOf(".")) ); pSongItem->setToolTip( 0, song ); } } //Pattern list QStringList patternDirList = Filesystem::pattern_drumkits(); if ( patternDirList.size() > 0 ) { __pattern_item = new QTreeWidgetItem( __sound_library_tree ); __pattern_item->setText( 0, tr( "Patterns" ) ); __pattern_item->setToolTip( 0, tr("Double click to expand the list") ); __pattern_item->setExpanded( __expand_pattern_list ); //this is the second step to push the mng.function //SoundLibraryDatabase::create_instance(); SoundLibraryDatabase* db = SoundLibraryDatabase::get_instance(); soundLibraryInfoVector* allPatternDirList = db->getAllPatterns(); QStringList allCategoryNameList = db->getAllPatternCategories(); //now sorting via category for (uint i = 0; i < allCategoryNameList.size(); ++i) { QString categoryName = allCategoryNameList[i]; QTreeWidgetItem* pCategoryItem = new QTreeWidgetItem( __pattern_item ); pCategoryItem->setText( 0, categoryName ); soundLibraryInfoVector::iterator mapIterator; for( mapIterator=allPatternDirList->begin(); mapIterator != allPatternDirList->end(); mapIterator++ ) { QString patternCategory = (*mapIterator)->getCategory(); if ( (patternCategory == categoryName) || (patternCategory.isEmpty() && categoryName == "No category") ){ QTreeWidgetItem* pPatternItem = new QTreeWidgetItem( pCategoryItem ); pPatternItem->setText( 0, (*mapIterator)->getName()); pPatternItem->setText( 1, (*mapIterator)->getPath() ); pPatternItem->setToolTip( 0, mng.getDrumkitNameForPattern( (*mapIterator)->getPath() )); INFOLOG( "Path" + (*mapIterator)->getPath() ); } } } } } void SoundLibraryPanel::on_DrumkitList_ItemChanged( QTreeWidgetItem * current, QTreeWidgetItem * previous ) { UNUSED( previous ); if( current == nullptr ){ return; } if ( current->parent() == __system_drumkits_item || current->parent() == __user_drumkits_item ){ emit item_changed( true ); } else { emit item_changed( false ); } test_expandedItems(); } void SoundLibraryPanel::on_DrumkitList_itemActivated( QTreeWidgetItem * item, int column ) { UNUSED( column ); // INFOLOG( "[on_DrumkitList_itemActivated]" ); if ( item == __system_drumkits_item || item == __user_drumkits_item || item == __system_drumkits_item->parent() || item->parent() == __song_item || item == __song_item || item == __pattern_item || item->parent() == __pattern_item || item->parent()->parent() == __pattern_item || item == __pattern_item_list || item->parent() == __pattern_item_list || item->parent()->parent() == __pattern_item_list ) { return; } if ( item->parent() == __system_drumkits_item || item->parent() == __user_drumkits_item ) { // e' stato selezionato un drumkit } else { // e' stato selezionato uno strumento QString selectedName = item->text(0); if( item->text(0) == "Patterns" ) return; QString sInstrName = selectedName.remove( 0, selectedName.indexOf( "] " ) + 2 ); QString sDrumkitName = item->parent()->text(0); INFOLOG( QString(sDrumkitName) + ", instr:" + sInstrName ); Instrument *pInstrument = Instrument::load_instrument( sDrumkitName, sInstrName ); pInstrument->set_muted( false ); AudioEngine::get_instance()->get_sampler()->preview_instrument( pInstrument ); } } void SoundLibraryPanel::on_DrumkitList_rightClicked( QPoint pos ) { if( __sound_library_tree->currentItem() == nullptr ) { return; } if ( ( __sound_library_tree->currentItem()->parent() == nullptr ) || ( __sound_library_tree->currentItem() == __user_drumkits_item ) || ( __sound_library_tree->currentItem() == __system_drumkits_item ) ) { return; } if ( __sound_library_tree->currentItem()->parent() == __song_item ) { __song_menu->popup( pos ); } if ( __sound_library_tree->currentItem()->parent()->parent() == __pattern_item && __pattern_item != nullptr ) { __pattern_menu->popup( pos ); } if ( __sound_library_tree->currentItem()->parent() == __user_drumkits_item ) { __drumkit_menu->popup( pos ); } else if ( __sound_library_tree->currentItem()->parent()->parent() == __user_drumkits_item ) { __instrument_menu->popup( pos ); } //else if ( __sound_library_tree->currentItem()->parent()->parent()->parent() == __pattern_item_list ) { // __pattern_menu_list->popup( pos ); //} if ( __sound_library_tree->currentItem()->parent() == __system_drumkits_item ) { __drumkit_menu->popup( pos ); } else if ( __sound_library_tree->currentItem()->parent()->parent() == __system_drumkits_item ) { __instrument_menu->popup( pos ); } } void SoundLibraryPanel::on_DrumkitList_leftClicked( QPoint pos ) { __start_drag_position = pos; } void SoundLibraryPanel::on_DrumkitList_mouseMove( QMouseEvent *event) { if (! ( event->buttons() & Qt::LeftButton ) ) { return; } if ( ( event->pos() - __start_drag_position ).manhattanLength() < QApplication::startDragDistance() ) { return; } if ( !__sound_library_tree->currentItem() ) { return; } if ( ( __sound_library_tree->currentItem()->parent() == __system_drumkits_item ) || ( __sound_library_tree->currentItem()->parent() == __user_drumkits_item ) ) { // drumkit selection //INFOLOG( "ho selezionato un drumkit (system)" ); return; } else { //INFOLOG( "ho selezionato uno strumento" ); // instrument selection if ( __sound_library_tree->currentItem() == nullptr ) { return; } if ( __sound_library_tree->currentItem()->parent() == nullptr ) { return; } if ( __sound_library_tree->currentItem()->parent() == __song_item ) { return; } if ( __sound_library_tree->currentItem()->parent()->text(0) == nullptr ) { return; } if ( __sound_library_tree->currentItem()->parent() == __pattern_item ) { return; } if ( __sound_library_tree->currentItem()->parent()->parent() == __pattern_item ) { QString sPatternPath = __sound_library_tree->currentItem()->text( 1 ); QString dragtype = "drag pattern"; QString sText = dragtype + "::" + sPatternPath; QDrag *pDrag = new QDrag(this); QMimeData *pMimeData = new QMimeData; pMimeData->setText( sText ); pDrag->setMimeData( pMimeData); pDrag->exec( Qt::CopyAction | Qt::MoveAction ); return; } QString sDrumkitName = __sound_library_tree->currentItem()->parent()->text(0); QString sInstrumentName = ( __sound_library_tree->currentItem()->text(0) ).remove( 0, __sound_library_tree->currentItem()->text(0).indexOf( "] " ) + 2 ); QString sText = "importInstrument:" + sDrumkitName + "::" + sInstrumentName; QDrag *pDrag = new QDrag(this); QMimeData *pMimeData = new QMimeData; pMimeData->setText( sText ); pDrag->setMimeData( pMimeData); pDrag->exec( Qt::CopyAction | Qt::MoveAction ); } } void SoundLibraryPanel::on_drumkitLoadAction() { restore_background_color(); QString sDrumkitName = __sound_library_tree->currentItem()->text(0); Drumkit *pDrumkitInfo = nullptr; // find the drumkit in the list for ( uint i = 0; i < __system_drumkit_info_list.size(); i++ ) { Drumkit *pInfo = __system_drumkit_info_list[i]; if ( pInfo->get_name() == sDrumkitName ) { pDrumkitInfo = pInfo; break; } } for ( uint i = 0; i < __user_drumkit_info_list.size(); i++ ) { Drumkit *pInfo = __user_drumkit_info_list[i]; if ( pInfo->get_name() == sDrumkitName ) { pDrumkitInfo = pInfo; break; } } if( !pDrumkitInfo ) { return; } InstrumentList *pSongInstrList = Hydrogen::get_instance()->getSong()->get_instrument_list(); InstrumentList *pDrumkitInstrList = pDrumkitInfo->get_instruments(); int oldCount = pSongInstrList->size(); int newCount = pDrumkitInstrList->size(); bool conditionalLoad = false; bool hasNotes = false; INFOLOG("Old kit has " + QString::number( oldCount ) + " instruments, new one has " + QString::number( newCount ) ); if ( newCount < oldCount ) { // Check if any of the instruments that will be removed have notes for ( int i = 0; i < pSongInstrList->size(); i++) { if ( i >= newCount ) { INFOLOG("Checking if Instrument " + QString::number( i ) + " has notes..." ); if ( Hydrogen::get_instance()->instrumentHasNotes( pSongInstrList->get( i ) ) ) { hasNotes = true; INFOLOG("Instrument " + QString::number( i ) + " has notes" ); } } } if ( hasNotes ) { QMessageBox msgBox; msgBox.setWindowTitle("Hydrogen"); msgBox.setIcon( QMessageBox::Warning ); msgBox.setText( tr( "The existing kit has %1 instruments but the new one only has %2.\nThe first %2 instruments will be replaced with the new instruments and will keep their notes, but some of the remaining instruments have notes.\nWould you like to keep or discard the remaining instruments and notes?\n").arg( QString::number( oldCount ),QString::number( newCount ) ) ); msgBox.setStandardButtons(QMessageBox::Save); msgBox.setButtonText(QMessageBox::Save, tr("Keep")); msgBox.addButton(QMessageBox::Discard); msgBox.addButton(QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); switch ( msgBox.exec() ) { case QMessageBox::Save: // Save old instruments with notes conditionalLoad = true; break; case QMessageBox::Discard: // discard extra instruments conditionalLoad = false; break; case QMessageBox::Cancel: // Cancel return; } } } assert( pDrumkitInfo ); QApplication::setOverrideCursor(Qt::WaitCursor); Hydrogen::get_instance()->loadDrumkit( pDrumkitInfo, conditionalLoad ); Hydrogen::get_instance()->getSong()->set_is_modified( true ); HydrogenApp::get_instance()->onDrumkitLoad( pDrumkitInfo->get_name() ); HydrogenApp::get_instance()->getPatternEditorPanel()->getDrumPatternEditor()->updateEditor(); HydrogenApp::get_instance()->getPatternEditorPanel()->updatePianorollEditor(); InstrumentEditorPanel::get_instance()->notifyOfDrumkitChange(); __sound_library_tree->currentItem()->setBackground( 0, QColor( 50, 50, 50) ); QApplication::restoreOverrideCursor(); } void SoundLibraryPanel::update_background_color() { restore_background_color(); change_background_color(); } void SoundLibraryPanel::restore_background_color() { for (int i = 0; i < __system_drumkits_item->childCount() ; i++){ ( __system_drumkits_item->child( i ) )->setBackground( 0, QBrush() ); } for (int i = 0; i < __user_drumkits_item->childCount() ; i++){ ( __user_drumkits_item->child( i ) )->setBackground(0, QBrush() ); } } void SoundLibraryPanel::change_background_color() { QString sCurDrumkitName = Hydrogen::get_instance()->getCurrentDrumkitname(); for (int i = 0; i < __system_drumkits_item->childCount() ; i++){ if ( ( __system_drumkits_item->child( i ) )->text( 0 ) == sCurDrumkitName ){ ( __system_drumkits_item->child( i ) )->setBackground( 0, QColor( 50, 50, 50) ); break; } } for (int i = 0; i < __user_drumkits_item->childCount() ; i++){ if ( ( __user_drumkits_item->child( i ))->text( 0 ) == sCurDrumkitName ){ ( __user_drumkits_item->child( i ) )->setBackground( 0, QColor( 50, 50, 50) ); break; } } } void SoundLibraryPanel::on_drumkitDeleteAction() { QTreeWidgetItem* pItem = __sound_library_tree->currentItem(); QString itemName = QString("%1").arg(__sound_library_tree->currentItem()->text(0)); //if we delete the current loaded drumkit we can get trouble with some empty pointers // TODO this check is really unsafe if ( pItem->text(0) == Hydrogen::get_instance()->getCurrentDrumkitname() ){ QMessageBox::warning( this, "Hydrogen", tr( "It is not possible to delete the currently loaded drumkit: \n \"%1\".\nTo delete this drumkit first load another drumkit.").arg(itemName) ); return; } if ( pItem->parent() == __system_drumkits_item ) { QMessageBox::warning( this, "Hydrogen", tr( "\"%1\"is a system drumkit and can't be deleted.").arg(itemName) ); return; } int res = QMessageBox::warning( this, "Hydrogen", tr( "Warning, the \"%1\" drumkit will be deleted from disk.\nAre you sure?").arg(itemName), "&Ok", "&Cancel", nullptr, 1 ); if ( res == 1 ) { return; } QApplication::setOverrideCursor(Qt::WaitCursor); bool success = Drumkit::remove( pItem->text(0) ); test_expandedItems(); updateDrumkitList(); QApplication::restoreOverrideCursor(); if ( !success) { QMessageBox::warning( this, "Hydrogen", tr( "Drumkit deletion failed.") ); } } void SoundLibraryPanel::on_drumkitExportAction() { QString sDrumkitName = __sound_library_tree->currentItem()->text(0); SoundLibraryExportDialog exportDialog( this, sDrumkitName); exportDialog.exec(); } void SoundLibraryPanel::on_drumkitPropertiesAction() { QString sDrumkitName = __sound_library_tree->currentItem()->text(0); Drumkit *drumkitInfo = nullptr; // find the drumkit in the list for ( uint i = 0; i < __system_drumkit_info_list.size(); i++ ) { Drumkit *pInfo = __system_drumkit_info_list[i]; if ( pInfo->get_name() == sDrumkitName ) { drumkitInfo = pInfo; break; } } for ( uint i = 0; i < __user_drumkit_info_list.size(); i++ ) { Drumkit*pInfo = __user_drumkit_info_list[i]; if ( pInfo->get_name() == sDrumkitName ) { drumkitInfo = pInfo; break; } } assert( drumkitInfo ); QString sPreDrumkitName = Hydrogen::get_instance()->getCurrentDrumkitname(); Drumkit *preDrumkitInfo = nullptr; // find the drumkit in the list for ( uint i = 0; i < __system_drumkit_info_list.size(); i++ ) { Drumkit *prInfo = __system_drumkit_info_list[i]; if ( prInfo->get_name() == sPreDrumkitName ) { preDrumkitInfo = prInfo; break; } } for ( uint i = 0; i < __user_drumkit_info_list.size(); i++ ) { Drumkit *prInfo = __user_drumkit_info_list[i]; if ( prInfo->get_name() == sPreDrumkitName ) { preDrumkitInfo = prInfo; break; } } if ( preDrumkitInfo == nullptr ){ QMessageBox::warning( this, "Hydrogen", QString( "The current loaded song missing his soundlibrary.\nPlease load a existing soundlibrary first") ); return; } assert( preDrumkitInfo ); //open the soundlibrary save dialog SoundLibraryPropertiesDialog dialog( this , drumkitInfo, preDrumkitInfo ); dialog.exec(); } void SoundLibraryPanel::on_instrumentDeleteAction() { QMessageBox::warning( this, "Hydrogen", QString( "Not implemented yet.") ); ERRORLOG( "[on_instrumentDeleteAction] not implemented yet" ); } void SoundLibraryPanel::on_songLoadAction() { QString sFilename = Filesystem::song_path( __sound_library_tree->currentItem()->text( 0 ) ); Hydrogen *pHydrogen = Hydrogen::get_instance(); if ( pHydrogen->getState() == STATE_PLAYING ) { pHydrogen->sequencer_stop(); } Song *pSong = Song::load( sFilename ); if ( pSong == nullptr ) { QMessageBox::information( this, "Hydrogen", tr("Error loading song.") ); return; } // add the new loaded song in the "last used song" vector Preferences *pPref = Preferences::get_instance(); std::vector recentFiles = pPref->getRecentFiles(); recentFiles.insert( recentFiles.begin(), sFilename ); pPref->setRecentFiles( recentFiles ); HydrogenApp* pH2App = HydrogenApp::get_instance(); pH2App->setSong( pSong ); //updateRecentUsedSongList(); pHydrogen->setSelectedPatternNumber( 0 ); } void SoundLibraryPanel::on_patternLoadAction() { LocalFileMng mng; Hydrogen *pHydrogen = Hydrogen::get_instance(); Song *pSong = pHydrogen->getSong(); PatternList *pPatternList = pSong->get_pattern_list(); QString patternName = __sound_library_tree->currentItem()->text( 0 ); QString drumkitName = __sound_library_tree->currentItem()->toolTip ( 0 ); // FIXME : file path should come from the selected item Pattern* pErr = Pattern::load_file( Filesystem::pattern_path( drumkitName, patternName ), pSong->get_instrument_list() ); if ( pErr == nullptr ) { ERRORLOG( "Error loading the pattern" ); return; } pPatternList->add ( pErr ); pSong->set_is_modified( true ); HydrogenApp::get_instance()->getSongEditorPanel()->updateAll(); } void SoundLibraryPanel::on_patternDeleteAction() { QString patternPath = __sound_library_tree->currentItem()->text( 1 ); int res = QMessageBox::information( this, "Hydrogen", tr( "Warning, the selected pattern will be deleted from disk.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( res == 1 ) { return; } QFile rmfile( patternPath ); bool err = rmfile.remove(); if ( err == false ) { ERRORLOG( "Error removing the pattern" ); } SoundLibraryDatabase::get_instance()->updatePatterns(); test_expandedItems(); updateDrumkitList(); } void SoundLibraryPanel::test_expandedItems() { assert( __sound_library_tree ); if ( __song_item == nullptr) { __expand_songs_list = false; } else { __expand_songs_list = __song_item->isExpanded(); } if ( __pattern_item == nullptr) { __expand_pattern_list = false; } else { __expand_pattern_list = __pattern_item->isExpanded(); } Preferences::get_instance()->__expandSongItem = __expand_songs_list; Preferences::get_instance()->__expandPatternItem = __expand_pattern_list; //ERRORLOG( QString("songs %1 patterns %2").arg(__expand_songs_list).arg(__expand_pattern_list) ); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryPanel.h000066400000000000000000000053031366722712400243520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_PANEL_H #define SOUND_LIBRARY_PANEL_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include namespace H2Core { class Song; class Drumkit; class SoundLibrary; } class SoundLibraryTree; class ToggleButton; class SoundLibraryPanel : public QWidget, private H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryPanel( QWidget* parent, bool bInItsOwnDialog ); ~SoundLibraryPanel(); void updateDrumkitList(); void test_expandedItems(); void update_background_color(); public slots: void on_drumkitLoadAction(); private slots: void on_DrumkitList_ItemChanged( QTreeWidgetItem* current, QTreeWidgetItem* previous ); void on_DrumkitList_itemActivated( QTreeWidgetItem* item, int column ); void on_DrumkitList_leftClicked( QPoint pos ); void on_DrumkitList_rightClicked( QPoint pos ); void on_DrumkitList_mouseMove( QMouseEvent* event ); void on_drumkitDeleteAction(); void on_drumkitPropertiesAction(); void on_drumkitExportAction(); void on_instrumentDeleteAction(); void on_songLoadAction(); void on_patternLoadAction(); void on_patternDeleteAction(); signals: void item_changed(bool bDrumkitSelected); private: SoundLibraryTree *__sound_library_tree; //FileBrowser *m_pFileBrowser; QPoint __start_drag_position; QMenu* __drumkit_menu; QMenu* __instrument_menu; QMenu* __song_menu; QMenu* __pattern_menu; QMenu* __pattern_menu_list; QTreeWidgetItem* __system_drumkits_item; QTreeWidgetItem* __user_drumkits_item; QTreeWidgetItem* __song_item; QTreeWidgetItem* __pattern_item; QTreeWidgetItem* __pattern_item_list; std::vector __system_drumkit_info_list; std::vector __user_drumkit_info_list; bool __expand_pattern_list; bool __expand_songs_list; void restore_background_color(); void change_background_color(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryPropertiesDialog.cpp000066400000000000000000000173251366722712400271310ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include "../HydrogenApp.h" #include "../Skin.h" #include "SoundLibraryPropertiesDialog.h" #include "../InstrumentRack.h" #include "SoundLibraryPanel.h" #include namespace H2Core { //globals Drumkit *pGlobalDrumkitInfo = nullptr; Drumkit *pGlobalPreDrumkit = nullptr; QString oldName; const char* SoundLibraryPropertiesDialog::__class_name = "SoundLibraryPropertiesDialog"; SoundLibraryPropertiesDialog::SoundLibraryPropertiesDialog( QWidget* pParent, Drumkit *pDrumkitInfo, Drumkit *pPreDrumKit ) : QDialog( pParent ) , Object( __class_name ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "SoundLibrary Properties" ) ); setFixedSize( width(), height() ); pGlobalPreDrumkit = pPreDrumKit; //display the current drumkit infos into the qlineedit if ( pDrumkitInfo != nullptr ){ pGlobalDrumkitInfo = pDrumkitInfo; nameTxt->setText( QString( pDrumkitInfo->get_name() ) ); oldName = pDrumkitInfo->get_name(); authorTxt->setText( QString( pDrumkitInfo->get_author() ) ); infoTxt->append( QString( pDrumkitInfo->get_info() ) ); licenseTxt->setText( QString( pDrumkitInfo->get_license() ) ); imageText->setText( QString ( pDrumkitInfo->get_image() ) ); imageLicenseText->setText( QString ( pDrumkitInfo->get_image_license() ) ); // Licence with attribution is often too long... imageLicenseText->setToolTip( QString( pDrumkitInfo->get_image_license() ) ); QPixmap *pPixmap = new QPixmap (pDrumkitInfo->get_path() + "/" + pDrumkitInfo->get_image()); // scale the image down to fit if required int x = (int) drumkitImageLabel->size().width(); int y = drumkitImageLabel->size().height(); float labelAspect = (float) x / y; float imageAspect = (float) pPixmap->width() / pPixmap->height(); if ( ( x < pPixmap->width() ) || ( y < pPixmap->height() ) ) { if ( labelAspect >= imageAspect ) { // image is taller or the same as label frame *pPixmap = pPixmap->scaledToHeight( y ); } else { // image is wider than label frame *pPixmap = pPixmap->scaledToWidth( x ); } } drumkitImageLabel->setPixmap(*pPixmap); drumkitImageLabel->show(); } } SoundLibraryPropertiesDialog::~SoundLibraryPropertiesDialog() { INFOLOG( "DESTROY" ); } void SoundLibraryPropertiesDialog::updateImage( QString& filename ) { QPixmap *pPixmap = new QPixmap ( filename ); // scale the image down to fit if required int x = (int) drumkitImageLabel->size().width(); int y = drumkitImageLabel->size().height(); float labelAspect = (float) x / y; float imageAspect = (float) pPixmap->width() / pPixmap->height(); if ( ( x < pPixmap->width() ) || ( y < pPixmap->height() ) ) { if ( labelAspect >= imageAspect ) { // image is taller or the same as label frame *pPixmap = pPixmap->scaledToHeight( y ); } else { // image is wider than label frame *pPixmap = pPixmap->scaledToWidth( x ); } } drumkitImageLabel->setPixmap(*pPixmap); drumkitImageLabel->show(); } void SoundLibraryPropertiesDialog::on_imageBrowsePushButton_clicked() { // Try to get the drumkit directory and open file browser QString drumkitDir = Filesystem::drumkit_dir_search( nameTxt->text() ) + "/" + nameTxt->text(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), drumkitDir, tr("Image Files (*.png *.jpg *.jpeg)")); // If cancel was clicked just abort if ( fileName == nullptr ) { return; } // If this file is in different directory copy it here QFile file( fileName ); QFileInfo fileInfo(file.fileName()); if ( fileInfo.dir().path() != drumkitDir ) { INFOLOG("Copying " + fileName + " to " + drumkitDir.toLocal8Bit() ); if ( !QFile::copy( fileName, drumkitDir + "/" + fileInfo.fileName() )) { WARNINGLOG( "Could not copy " + fileInfo.fileName() + " to " + drumkitDir ); } } QString filename(fileInfo.fileName()); imageText->setText( filename ); pGlobalDrumkitInfo->set_image( filename ); updateImage( fileName ); } void SoundLibraryPropertiesDialog::on_saveBtn_clicked() { bool reload = false; if ( saveChanges_checkBox->isChecked() ){ //test if the drumkit is loaded if ( Hydrogen::get_instance()->getCurrentDrumkitname() != pGlobalDrumkitInfo->get_name() ){ QMessageBox::information( this, "Hydrogen", tr ( "This is not possible, you can only save changes inside instruments to the current loaded sound library")); saveChanges_checkBox->setChecked( false ); return; } reload = true; } //load the selected drumkit to save it correct.... later the old drumkit will be reloaded if ( pGlobalDrumkitInfo != nullptr && ( !saveChanges_checkBox->isChecked() ) ){ if ( Hydrogen::get_instance()->getCurrentDrumkitname() != pGlobalDrumkitInfo->get_name() ){ Hydrogen::get_instance()->loadDrumkit( pGlobalDrumkitInfo ); Hydrogen::get_instance()->getSong()->set_is_modified( true ); } } //check the drumkit name. if the name is a new one, one qmessagebox with question "are you sure" will displayed. if ( nameTxt->text() != oldName ){ int res = QMessageBox::information( this, "Hydrogen", tr( "Warning! Changing the drumkit name will result in creating a new drumkit with this name.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), nullptr, 1 ); if ( res == 1 ) { return; } else { reload = true; } } //check the name and set the drumkitinfo to current drumkit if ( pGlobalDrumkitInfo != nullptr && !nameTxt->text().isEmpty() ){ pGlobalDrumkitInfo->set_name( nameTxt->text() ); pGlobalDrumkitInfo->set_author( authorTxt->text() ); pGlobalDrumkitInfo->set_info( infoTxt->toHtml() ); pGlobalDrumkitInfo->set_license( licenseTxt->text() ); pGlobalDrumkitInfo->set_image( imageText->text() ); pGlobalDrumkitInfo->set_image_license( imageLicenseText->text() ); } //save the drumkit // Note: The full path of the image is passed to make copying to a new drumkit easy if( pGlobalDrumkitInfo != nullptr) { if( !H2Core::Drumkit::save( nameTxt->text(), authorTxt->text(), infoTxt->toHtml(), licenseTxt->text(), pGlobalDrumkitInfo->get_path() + "/" + pGlobalDrumkitInfo->get_image(), pGlobalDrumkitInfo->get_image_license(), H2Core::Hydrogen::get_instance()->getSong()->get_instrument_list(), H2Core::Hydrogen::get_instance()->getSong()->get_components(), true ) ) { QMessageBox::information( this, "Hydrogen", tr ( "Saving of this drumkit failed.")); } } //check pre loaded drumkit name and reload the old drumkit if ( pGlobalPreDrumkit != nullptr ){ if ( pGlobalPreDrumkit->get_name() != Hydrogen::get_instance()->getCurrentDrumkitname() ){ Hydrogen::get_instance()->loadDrumkit( pGlobalPreDrumkit ); Hydrogen::get_instance()->getSong()->set_is_modified( true ); } } //reload if necessary if ( reload == true ){ HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->test_expandedItems(); HydrogenApp::get_instance()->getInstrumentRack()->getSoundLibraryPanel()->updateDrumkitList(); } accept(); } } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryPropertiesDialog.h000066400000000000000000000027301366722712400265700ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_PROPERTIES_DIALOG_H #define SOUND_LIBRARY_PROPERTIES_DIALOG_H #include "ui_SoundLibraryPropertiesDialog_UI.h" #include /// /// namespace H2Core { class Drumkit; class SoundLibraryPropertiesDialog : public QDialog, public Ui_SoundLibraryPropertiesDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryPropertiesDialog(QWidget* pParent , Drumkit *pDrumkitInfo, Drumkit *pPreDrumKit ); ~SoundLibraryPropertiesDialog(); private slots: void on_saveBtn_clicked(); void on_imageBrowsePushButton_clicked(); private: void updateImage( QString& filename ); }; } #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryPropertiesDialog_UI.ui000066400000000000000000000220321366722712400273500ustar00rootroot00000000000000 SoundLibraryPropertiesDialog_UI 0 0 592 653 Dialog 10 10 111 25 0 0 Name 10 40 111 25 0 0 Author 10 100 111 120 Information Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true 120 39 467 22 0 0 209 0 120 11 467 22 0 0 209 0 120 95 467 191 false 10 70 111 41 Drumkit License Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 120 67 467 22 0 0 209 0 410 610 176 41 Save Cancel 10 580 571 31 Save changes made to instruments into sound library 10 350 571 221 34 31 30 34 31 30 144 141 139 true QFrame::StyledPanel false Qt::AlignCenter 10 296 111 14 Image 120 292 378 22 0 0 209 0 506 292 80 21 Browse 120 320 467 25 0 0 209 0 10 316 111 31 0 0 Image License true nameTxt authorTxt licenseTxt infoTxt saveChanges_checkBox saveBtn m_cancelBtn m_cancelBtn clicked() SoundLibraryPropertiesDialog_UI reject() 121 220 51 196 hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryRepositoryDialog.cpp000066400000000000000000000053201366722712400271440ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2007 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryRepositoryDialog.h" #include #include #include #include const char* SoundLibraryRepositoryDialog::__class_name = "SoundLibraryRepositoryDialog"; SoundLibraryRepositoryDialog::SoundLibraryRepositoryDialog( QWidget* pParent ) : QDialog( pParent ) , Object( __class_name ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "Edit repository settings" ) ); setFixedSize( width(), height() ); updateDialog(); } //update all values void SoundLibraryRepositoryDialog::updateDialog(){ H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); /* Read serverList from config and put servers into the serverList */ std::list::const_iterator cur_Server; ServerListWidget->clear(); for( cur_Server = pPref->sServerList.begin(); cur_Server != pPref->sServerList.end(); ++cur_Server ) { ServerListWidget->addItem( *cur_Server ); } } /// /// Add new server url void SoundLibraryRepositoryDialog::on_AddBtn_clicked() { H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); bool ok; QString text = QInputDialog::getText(this, tr("Edit server list"), tr("URL"), QLineEdit::Normal,QString(""), &ok); if( ok && !text.isEmpty() ){ pPref->sServerList.push_back( text ); } updateDialog(); } /// /// Delete serverList entry /// void SoundLibraryRepositoryDialog::on_DeleteBtn_clicked() { QList selectedItems; selectedItems = ServerListWidget->selectedItems(); //std::list::const_iterator cur_Server; H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); while( ! selectedItems.isEmpty() ){ QString selText; selText = selectedItems.takeFirst()->text(); pPref->sServerList.remove(selText); } updateDialog(); } SoundLibraryRepositoryDialog::~SoundLibraryRepositoryDialog() { INFOLOG( "DESTROY" ); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryRepositoryDialog.h000066400000000000000000000025531366722712400266160ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2007 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_REPOSITORY_DIALOG_H #define SOUND_LIBRARY_REPOSITORY_DIALOG_H #include "ui_SoundLibraryRepositoryDialog_UI.h" #include /// /// /// class SoundLibraryRepositoryDialog : public QDialog, public Ui_SoundLibraryRepositoryDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryRepositoryDialog( QWidget* pParent ); ~SoundLibraryRepositoryDialog(); private slots: void on_AddBtn_clicked(); void on_DeleteBtn_clicked(); private: void updateDialog(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryRepositoryDialog_UI.ui000066400000000000000000000022151366722712400273740ustar00rootroot00000000000000 SoundLibraryRepositoryDialog_UI 0 0 400 300 Dialog 0 0 401 301 Add Delete hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibrarySaveDialog.cpp000066400000000000000000000105341366722712400256660ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibrarySaveDialog.h" #include #include #include #include "../HydrogenApp.h" #include "../Skin.h" const char* SoundLibrarySaveDialog::__class_name = "SoundLibrarySaveDialog"; SoundLibrarySaveDialog::SoundLibrarySaveDialog( QWidget* pParent ) : QDialog( pParent ) , Object( __class_name ) { setupUi( this ); INFOLOG( "INIT" ); setWindowTitle( tr( "Save Sound Library" ) ); setFixedSize( width(), height() ); } SoundLibrarySaveDialog::~SoundLibrarySaveDialog() { INFOLOG( "DESTROY" ); } void SoundLibrarySaveDialog::updateImage( QString& filename ) { QPixmap *pixmap = new QPixmap ( filename ); // scale the image down to fit if required int x = (int) drumkitImageLabel->size().width(); int y = drumkitImageLabel->size().height(); float labelAspect = (float) x / y; float imageAspect = (float) pixmap->width() / pixmap->height(); if ( ( x < pixmap->width() ) || ( y < pixmap->height() ) ) { if ( labelAspect >= imageAspect ) { // image is taller or the same as label frame *pixmap = pixmap->scaledToHeight( y ); } else { // image is wider than label frame *pixmap = pixmap->scaledToWidth( x ); } } drumkitImageLabel->setPixmap(*pixmap); drumkitImageLabel->show(); } void SoundLibrarySaveDialog::on_imageBrowsePushButton_clicked() { // Try to get the drumkit directory and open file browser QString drumkitDir = H2Core::Filesystem::usr_drumkits_dir() + "/" + nameTxt->text(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), drumkitDir, tr("Image Files (*.png *.jpg *.jpeg)")); // If this file is in different directory copy it here QFile file( fileName ); QFileInfo fileInfo(file.fileName()); ERRORLOG(fileInfo.dir().path().toLocal8Bit() + drumkitDir); if ( fileInfo.dir().path() != drumkitDir ) { QDir dir( drumkitDir ); if ( !dir.exists() ) { dir.mkpath("."); } INFOLOG("Copying " + fileName + " to " + drumkitDir.toLocal8Bit() ); if ( !QFile::copy( fileName, drumkitDir + "/" + fileInfo.fileName() )) { WARNINGLOG( "Could not copy " + fileInfo.fileName() + " to " + drumkitDir ); } } QString filename(fileInfo.fileName()); imageText->setText( filename ); updateImage( fileName ); } void SoundLibrarySaveDialog::on_saveBtn_clicked() { if( nameTxt->text().isEmpty() ){ QMessageBox::information( this, "Hydrogen", tr ( "Please supply at least a valid name")); return; } bool Overwrite = false; if(H2Core::Drumkit::user_drumkit_exists( nameTxt->text() )){ QMessageBox msgBox; msgBox.setText(tr("A library with the same name already exists. Do you want to overwrite the existing library?")); msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); if(ret == QMessageBox::Yes){ Overwrite = true; } else { return; } } // Note: use full path for image - Drumkit->save() will handle copying it if need be if( !H2Core::Drumkit::save( nameTxt->text(), authorTxt->text(), infoTxt->toHtml(), licenseTxt->text(), H2Core::Filesystem::usr_drumkits_dir() + "/" + nameTxt->text() + "/" + imageText->text(), imageLicenseText->text(), H2Core::Hydrogen::get_instance()->getSong()->get_instrument_list(), H2Core::Hydrogen::get_instance()->getSong()->get_components(), Overwrite ) ) { QMessageBox::information( this, "Hydrogen", tr ( "Saving of this library failed.")); return; } accept(); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibrarySaveDialog.h000066400000000000000000000025421366722712400253330ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_SAVE_DIALOG_H #define SOUND_LIBRARY_SAVE_DIALOG_H #include "ui_SoundLibrarySaveDialog_UI.h" #include /// /// /// class SoundLibrarySaveDialog : public QDialog, public Ui_SoundLibrarySaveDialog_UI, public H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibrarySaveDialog( QWidget* pParent ); ~SoundLibrarySaveDialog(); private slots: void on_saveBtn_clicked(); void on_imageBrowsePushButton_clicked(); private: void updateImage( QString& filename ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibrarySaveDialog_UI.ui000066400000000000000000000224351366722712400261210ustar00rootroot00000000000000 SoundLibrarySaveDialog_UI 0 0 602 595 Dialog 360 560 221 35 Save Cancel 10 330 571 221 34 31 30 34 31 30 144 141 139 true QFrame::StyledPanel false Qt::AlignCenter 10 11 581 311 QFormLayout::ExpandingFieldsGrow 0 0 Name 0 0 209 0 0 0 Author 0 0 209 0 0 0 License Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 209 0 0 0 Information Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 16777215 200 false 0 0 Image QLayout::SetMinimumSize 0 0 209 0 999999 31 120 16777215 Browse 0 0 Image License 0 0 209 0 nameTxt authorTxt licenseTxt infoTxt m_cancelBtn clicked() SoundLibrarySaveDialog_UI reject() 121 220 51 196 hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryTree.cpp000066400000000000000000000033061366722712400245460ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SoundLibraryTree.h" #include const char* SoundLibraryTree::__class_name = "SoundLibraryTree"; SoundLibraryTree::SoundLibraryTree( QWidget *pParent ) : QTreeWidget( pParent ) , Object( __class_name ) { setHeaderLabels( QStringList( tr( "Sound library" ) ) ); setAlternatingRowColors( true ); setRootIsDecorated( false ); headerItem()->setHidden( true ); // hides the header } void SoundLibraryTree::mousePressEvent(QMouseEvent *event) { // INFOLOG( "[mousePressEvent]" ); QTreeWidget::mousePressEvent( event ); if ( event->button() == Qt::RightButton ) { emit rightClicked( QPoint( event->globalX(), event->globalY() ) ); } else if (event->button() == Qt::LeftButton ) { emit leftClicked( QPoint( event->globalX(), event->globalY() ) ); } } void SoundLibraryTree::mouseMoveEvent(QMouseEvent *event) { emit onMouseMove( event ); } hydrogen-1.0.0-rc1/src/gui/src/SoundLibrary/SoundLibraryTree.h000066400000000000000000000026331366722712400242150ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SOUND_LIBRARY_TREE_H #define SOUND_LIBRARY_TREE_H #include #if QT_VERSION >= 0x050000 # include #endif #include class SoundLibraryTree : public QTreeWidget, private H2Core::Object { H2_OBJECT Q_OBJECT public: SoundLibraryTree( QWidget *pParent ); signals: void leftClicked( QPoint pos ); void rightClicked( QPoint pos ); void onMouseMove( QMouseEvent* event ); private slots: protected: virtual void mousePressEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); }; #endif hydrogen-1.0.0-rc1/src/gui/src/SplashScreen.cpp000066400000000000000000000037161366722712400212730ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "SplashScreen.h" #include #include #include #include "Skin.h" const char* SplashScreen::__class_name = "SplashScreen"; SplashScreen::SplashScreen() : QSplashScreen( (QWidget*) nullptr ) , Object( __class_name ) { //INFOLOG( "SplashScreen" ); setFixedSize(width, height); m_pBackground = new QPixmap( Skin::getImagePath() + "/splash/splash.png" ); QFont font; font.setPointSize( 10 ); font.setBold( true ); QPainter p; p.begin( m_pBackground ); p.setFont( font ); p.setPen( QColor( 20, 20, 20 ) ); QString version = QString( "v%1 (%2)" ).arg( H2Core::get_version().c_str() ).arg( __DATE__ ); p.drawText( 5, 5, width - 10, 40, Qt::AlignRight | Qt::AlignTop, version ); p.end(); setPixmap( *m_pBackground ); // Center on screeen QRect rect( QGuiApplication::screens().first()->geometry() ); move( rect.center() - this->rect().center() ); QTimer::singleShot( 5000, this, SLOT( onCloseTimer() ) ); } SplashScreen::~SplashScreen() { //INFOLOG( "~SplashScreen" ); delete m_pBackground; } void SplashScreen::onCloseTimer() { hide(); } hydrogen-1.0.0-rc1/src/gui/src/SplashScreen.h000066400000000000000000000024141366722712400207320ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SPLASH_SCREEN_H #define SPLASH_SCREEN_H #include #include #include #include class SplashScreen : public QSplashScreen, public H2Core::Object { H2_OBJECT Q_OBJECT public: SplashScreen(); ~SplashScreen(); private slots: void onCloseTimer(); private: QPixmap * m_pBackground; static const uint width = 400; static const uint height = 300; }; #endif hydrogen-1.0.0-rc1/src/gui/src/UndoActions.h000066400000000000000000001174551366722712400206020ustar00rootroot00000000000000#ifndef UNDOACTIONS_H #define UNDOACTIONS_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include #include #include #include #include "HydrogenApp.h" #include "SongEditor/SongEditor.h" #include "SongEditor/SongEditorPanel.h" #include "SongEditor/PatternFillDialog.h" #include "PatternEditor/NotePropertiesRuler.h" #include "PatternEditor/DrumPatternEditor.h" #include "PatternEditor/PatternEditorPanel.h" #include "PatternEditor/NotePropertiesRuler.h" #include "Widgets/AutomationPathView.h" //===================================================================================================================================== //song editor commands class SE_addPatternAction : public QUndoCommand { public: SE_addPatternAction( int nColumn, int nRow, unsigned nColumnIndex ){ setText( QString( "Add Pattern ( %1, %2 )" ).arg( nColumn ).arg( nRow ) ); __nColumn = nColumn; __nRow = nRow; __nColumnIndex = nColumnIndex; } virtual void undo() { //qDebug() << "add Pattern Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->deletePattern( __nColumn, __nRow , __nColumnIndex ); } virtual void redo() { //qDebug() << "add Pattern Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->addPattern( __nColumn, __nRow ); } private: int __nColumn; int __nRow; unsigned __nColumnIndex; }; class SE_deletePatternAction : public QUndoCommand { public: SE_deletePatternAction( int nColumn, int nRow, unsigned nColumnIndex ){ setText( QString( "Delete Pattern ( %1, %2 )" ).arg( nColumn ).arg( nRow ) ); __nColumn = nColumn; __nRow = nRow; __nColumnIndex = nColumnIndex; } virtual void undo() { //qDebug() << "Delete pattern Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->addPattern( __nColumn, __nRow ); } virtual void redo() { //qDebug() << "Delete pattern Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->deletePattern( __nColumn, __nRow, __nColumnIndex ); } private: int __nColumn; int __nRow; unsigned __nColumnIndex; }; class SE_movePatternListItemAction : public QUndoCommand { public: SE_movePatternListItemAction( int nSourcePattern , int nTargetPattern ){ setText( QString( "Move pattern list item ( %1, %2 )" ).arg( nSourcePattern ).arg( nTargetPattern ) ); __nSourcePattern = nSourcePattern; __nTargetPattern = nTargetPattern; } virtual void undo() { //qDebug() << "Move Pattern List Item Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->movePatternLine( __nTargetPattern, __nSourcePattern ); } virtual void redo() { //qDebug() << "Move Pattern List Item redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->movePatternLine( __nSourcePattern , __nTargetPattern ); } private: int __nSourcePattern; int __nTargetPattern; }; class SE_deletePatternSequenceAction : public QUndoCommand { public: SE_deletePatternSequenceAction( QString pFilename ){ setText( QString( "Delete complete pattern-sequence" ) ); __pFilename = pFilename ; } virtual void undo() { //qDebug() << "Delete complete pattern-sequence undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->restoreGroupVector( __pFilename ); } virtual void redo() { //qDebug() << "Delete complete pattern-sequence redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->clearThePatternSequenceVector( __pFilename ); } private: QString __pFilename; }; class SE_deletePatternFromListAction : public QUndoCommand { public: SE_deletePatternFromListAction( QString patternFilename , QString sequenceFileName, int patternPosition ){ setText( QString( "Delete pattern from list" ) ); __patternFilename = patternFilename; __sequenceFileName = sequenceFileName; __patternPosition = patternPosition; } virtual void undo() { //qDebug() << "Delete pattern from list undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->restoreDeletedPatternsFromList( __patternFilename, __sequenceFileName, __patternPosition ); h2app->getSongEditorPanel()->restoreGroupVector( __sequenceFileName ); h2app->getSongEditorPanel()->getSongEditor()->updateEditorandSetTrue(); } virtual void redo() { //qDebug() << "Delete pattern from list redo" ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __patternFilename, __sequenceFileName, __patternPosition ); } private: QString __patternFilename; QString __sequenceFileName; int __patternPosition; }; class SE_modifyPatternPropertiesAction : public QUndoCommand { public: SE_modifyPatternPropertiesAction( QString oldPatternName ,QString oldPatternInfo, QString oldPatternCategory, QString newPatternName , QString newPatternInfo, QString newPatternCategory, int patternNr ){ setText( QString( "Modify pattern properties" ) ); __oldPatternName = oldPatternName; __oldPatternCategory = oldPatternCategory; __oldPatternInfo = oldPatternInfo; __newPatternName = newPatternName; __newPatternInfo = newPatternInfo; __newPatternCategory = newPatternCategory; __patternNr = patternNr; } virtual void undo() { //qDebug() << "Modify pattern properties undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->revertPatternPropertiesDialogSettings( __oldPatternName, __oldPatternInfo, __oldPatternCategory, __patternNr ); } virtual void redo() { //qDebug() << "Modify pattern properties redo" ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->acceptPatternPropertiesDialogSettings( __newPatternName, __newPatternInfo, __newPatternCategory, __patternNr ); } private: QString __oldPatternName; QString __oldPatternInfo; QString __oldPatternCategory; QString __newPatternName; QString __newPatternInfo; QString __newPatternCategory; int __patternNr; }; class SE_copyPatternAction : public QUndoCommand { public: SE_copyPatternAction( QString patternFilename, int patternPosition ){ setText( QString( "Copy pattern" ) ); __patternFilename = patternFilename; __patternPosition = patternPosition; } virtual void undo() { //qDebug() << "copy pattern undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->deletePattern( __patternPosition ); } virtual void redo() { //qDebug() << "copy pattern redo" ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPatternList()->patternPopup_copyAction( __patternFilename, __patternPosition ); } private: QString __patternFilename; int __patternPosition; }; class SE_insertPatternAction : public QUndoCommand { public: SE_insertPatternAction( int patternPosition, H2Core::Pattern* pPattern ) { setText( QString( "Add pattern" ) ); __patternPosition = patternPosition; __newPattern = pPattern; } ~SE_insertPatternAction() { delete __newPattern; } virtual void undo() { //qDebug() << "Add pattern undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->deletePattern( __patternPosition ); } virtual void redo() { //qDebug() << "Add pattern redo" ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->insertPattern( __patternPosition, new H2Core::Pattern( __newPattern ) ); } private: H2Core::Pattern* __newPattern; int __patternPosition; }; class SE_loadPatternAction : public QUndoCommand { public: SE_loadPatternAction( QString patternName, QString oldPatternName, QString sequenceFileName, int patternPosition, bool dragFromList){ setText( QString( "Load/drag pattern" ) ); __patternName = patternName; __oldPatternName = oldPatternName; __sequenceFileName = sequenceFileName; __patternPosition = patternPosition; __dragFromList = dragFromList; } virtual void undo() { //qDebug() << "Load/drag pattern undo" << __dragFromList; HydrogenApp* h2app = HydrogenApp::get_instance(); if( __dragFromList ){ h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __sequenceFileName, __patternPosition ); }else { h2app->getSongEditorPanel()->getSongEditorPatternList()->restoreDeletedPatternsFromList( __oldPatternName, __sequenceFileName, __patternPosition ); h2app->getSongEditorPanel()->deletePattern( __patternPosition +1 ); } h2app->getSongEditorPanel()->restoreGroupVector( __sequenceFileName ); h2app->getSongEditorPanel()->getSongEditor()->updateEditorandSetTrue(); } virtual void redo() { //qDebug() << "Load/drag pattern redo" << __dragFromList << __patternPosition; HydrogenApp* h2app = HydrogenApp::get_instance(); if(!__dragFromList){ h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __sequenceFileName, __patternPosition ); } h2app->getSongEditorPanel()->getSongEditorPatternList()->loadPatternAction( __patternName, __patternPosition ); } private: QString __patternName; QString __oldPatternName; QString __sequenceFileName; int __patternPosition; bool __dragFromList; }; class SE_fillRangePatternAction : public QUndoCommand { public: SE_fillRangePatternAction( FillRange* pRange, int nPattern ){ setText( QString( "Fill/remove range of pattern" ) ); __pRange = pRange; __from = pRange->fromVal; __to = pRange->toVal; __bInsert = pRange->bInsert; __nPattern = nPattern; } virtual void undo() { //qDebug() << "fill/remove range of undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); bool insert; if( __bInsert ){ insert = false; }else { insert = true; } __pRange->bInsert = insert; __pRange->fromVal = __from; __pRange->toVal = __to; h2app->getSongEditorPanel()->getSongEditorPatternList()->fillRangeWithPattern( __pRange, __nPattern); } virtual void redo() { //qDebug() << "fill/remove range of redo"; HydrogenApp* h2app = HydrogenApp::get_instance(); __pRange->bInsert = __bInsert; __pRange->fromVal = __from; __pRange->toVal = __to; h2app->getSongEditorPanel()->getSongEditorPatternList()->fillRangeWithPattern( __pRange, __nPattern); } private: FillRange* __pRange; int __from; int __to; bool __bInsert; int __nPattern; }; class SE_movePatternCellAction : public QUndoCommand { public: SE_movePatternCellAction( std::vector movingCells, std::vector selectedCells, std::vector existingCells, bool bIsCtrlPressed ){ setText( QString( "Move/copy selected cells" ) ); __selectedCells = selectedCells; __movingCells = movingCells; __existingCells = existingCells; __bIsCtrlPressed = bIsCtrlPressed; } virtual void undo() { //qDebug() << "move/copy selected cells undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->movePatternCellAction( __selectedCells, __movingCells, __existingCells, __bIsCtrlPressed, true ); } virtual void redo() { //qDebug() << "move/copy selected cells redo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditor()->movePatternCellAction( __movingCells, __selectedCells, __existingCells, __bIsCtrlPressed, false ); } private: std::vector __selectedCells; std::vector __movingCells; std::vector __existingCells; bool __bIsCtrlPressed; }; class SE_editTimeLineAction : public QUndoCommand { public: SE_editTimeLineAction( int newPosition, float oldBpm, float newBpm ){ setText( QString( "Edit timeline tempo" ) ); __newPosition = newPosition; __oldBpm = oldBpm; __newBpm = newBpm; } virtual void undo() { //qDebug() << "edit timeline tempo undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); if(__oldBpm >-1 ){ h2app->getSongEditorPanel()->getSongEditorPositionRuler()->editTimeLineAction( __newPosition, __oldBpm ); }else { h2app->getSongEditorPanel()->getSongEditorPositionRuler()->deleteTimeLinePosition( __newPosition ); } } virtual void redo() { //qDebug() << "edit timeline tempo redo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPositionRuler()->editTimeLineAction( __newPosition, __newBpm ); } private: int __newPosition; float __oldBpm; float __newBpm; }; //~song editor commands //===================================================================================================================================== //time line commands class SE_deleteTimeLineAction : public QUndoCommand { public: SE_deleteTimeLineAction( int newPosition, float oldBpm ){ setText( QString( "Delete timeline tempo" ) ); __newPosition = newPosition; __oldBpm = oldBpm; } virtual void undo() { //qDebug() << "delete timeline tempo undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPositionRuler()->editTimeLineAction( __newPosition, __oldBpm ); } virtual void redo() { //qDebug() << "delete timeline tempo redo"; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getSongEditorPositionRuler()->deleteTimeLinePosition( __newPosition ); } private: int __newPosition; float __oldBpm; float __newBpm; }; class SE_editTagAction : public QUndoCommand { public: SE_editTagAction( QString text, QString oldText, int position ){ setText( "Edit timeline tag" ); __text = text; __oldText = oldText; __position = position; } virtual void undo() { //qDebug() << "edit timeline tag undo"; HydrogenApp* h2app = HydrogenApp::get_instance(); if( __oldText != "" ){ h2app->getSongEditorPanel()->getSongEditorPositionRuler()->editTagAction( __oldText, __position , __text ); }else { h2app->getSongEditorPanel()->getSongEditorPositionRuler()->deleteTagAction( __text, __position ); } } virtual void redo() { //qDebug() << "edit timeline tag redo"; HydrogenApp* h2app = HydrogenApp::get_instance(); if( __text == "" ){ h2app->getSongEditorPanel()->getSongEditorPositionRuler()->deleteTagAction( __oldText, __position ); }else { h2app->getSongEditorPanel()->getSongEditorPositionRuler()->editTagAction( __text, __position, __oldText ); } } private: QString __text; QString __oldText; int __position; }; //~time line commands //===================================================================================================================================== //pattern editor commands class SE_addNoteAction : public QUndoCommand { public: SE_addNoteAction( int nColumn, int nRow, int selectedPatternNumber, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal, bool noteExisted, bool listen, bool isMidi, bool isInstrumentMode){ if( noteExisted ){ setText( QString( "Delete note ( %1, %2)" ).arg( nColumn ).arg( nRow ) ); } else { setText( QString( "Add note ( %1, %2)" ).arg( nColumn ).arg( nRow ) ); } __nColumn = nColumn; __nRow = nRow; __selectedPatternNumber = selectedPatternNumber; __oldLength = oldLength; __oldVelocity = oldVelocity; __oldPan_L = oldPan_L; __oldPan_R = oldPan_R; __oldLeadLag = oldLeadLag; __oldNoteKeyVal = oldNoteKeyVal; __oldOctaveKeyVal = oldOctaveKeyVal; __listen = listen; __isMidi = isMidi; __isInstrumentMode = isInstrumentMode; } virtual void undo() { //qDebug() << "Add note Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); __isMidi = false; // undo is never a midi event. h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber, __oldLength, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __oldNoteKeyVal, __oldOctaveKeyVal, __listen, __isMidi, __isInstrumentMode, false ); } virtual void redo() { //qDebug() << "Add Note Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber, __oldLength, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __oldNoteKeyVal, __oldOctaveKeyVal, __listen, __isMidi, __isInstrumentMode, false ); } private: int __nColumn; int __nRow; int __selectedPatternNumber; int __oldLength; float __oldVelocity; float __oldPan_L; float __oldPan_R; float __oldLeadLag; int __oldNoteKeyVal; int __oldOctaveKeyVal; bool __listen; bool __isMidi; bool __isInstrumentMode; }; class SE_addNoteRightClickAction : public QUndoCommand { public: SE_addNoteRightClickAction( int nColumn, int nRow, int selectedPatternNumber ){ setText( QString( "Add pattern editor NOTE_OFF note ( %1, %2 )" ).arg( nColumn ).arg( nRow ) ); __nColumn = nColumn; __nRow = nRow; __selectedPatternNumber = selectedPatternNumber; } virtual void undo() { //qDebug() << "Add off note Note Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber, -1, 0.8f, 0.5f, 0.5f, 0.0, 0, 0, false, false, false, true); } virtual void redo() { //qDebug() << "Add off note Note Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber, -1, 0.8f, 0.5f, 0.5f, 0.0, 0, 0, false, false, false, true); } private: int __nColumn; int __nRow; int __selectedPatternNumber; }; class SE_editNoteLenghtAction : public QUndoCommand { public: SE_editNoteLenghtAction( int nColumn, int nRealColumn, int row, int length, int oldLength, int selectedPatternNumber ){ setText( QString( "Change note length" ) ); __nColumn = nColumn; __nRealColumn = nRealColumn; __row = row; __length = length; __oldLength = oldLength; __selectedPatternNumber = selectedPatternNumber; } virtual void undo() { //qDebug() << "Change note length Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->editNoteLengthAction( __nColumn, __nRealColumn, __row, __oldLength, __selectedPatternNumber ); } virtual void redo() { //qDebug() << "Change note length Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->editNoteLengthAction( __nColumn, __nRealColumn, __row, __length, __selectedPatternNumber ); } private: int __nColumn; int __nRealColumn; int __row; int __oldLength; int __length; int __selectedPatternNumber; }; class SE_clearNotesPatternEditorAction : public QUndoCommand { public: SE_clearNotesPatternEditorAction( std::list< H2Core::Note* > noteList, int nSelectedInstrument, int selectedPatternNumber ){ setText( QString( "Clear notes" ) ); std::list < H2Core::Note *>::iterator pos; for ( pos = noteList.begin(); pos != noteList.end(); ++pos){ H2Core::Note *pNote; pNote = new H2Core::Note(*pos); assert( pNote ); __noteList.push_back( pNote ); } __nSelectedInstrument = nSelectedInstrument; __selectedPatternNumber = selectedPatternNumber; } ~SE_clearNotesPatternEditorAction(){ //qDebug() << "delete left notes "; while ( __noteList.size() ) { delete __noteList.front(); __noteList.pop_front(); } } virtual void undo() { //qDebug() << "clear note sequence Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionClearNotesUndoAction( __noteList, __nSelectedInstrument, __selectedPatternNumber ); } virtual void redo() { //qDebug() << "clear note sequence Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionClearNotesRedoAction( __nSelectedInstrument, __selectedPatternNumber ); } private: std::list< H2Core::Note* > __noteList; int __nSelectedInstrument; int __selectedPatternNumber; }; class SE_pasteNotesPatternEditorAction : public QUndoCommand { public: SE_pasteNotesPatternEditorAction(const std::list & patternList) { //qDebug() << "paste note sequence Create "; setText( QString( "Paste instrument notes" ) ); std::list < H2Core::Pattern *>::const_iterator pos; for ( pos = patternList.begin(); pos != patternList.end(); ++pos) { H2Core::Pattern *pPattern = *pos; assert( pPattern ); __patternList.push_back(pPattern); } } ~SE_pasteNotesPatternEditorAction() { //qDebug() << "paste note sequence Destroy "; while ( __patternList.size() > 0) { delete __patternList.front(); __patternList.pop_front(); } while ( __appliedList.size() > 0) { delete __appliedList.front(); __appliedList.pop_front(); } } virtual void undo() { //qDebug() << "paste note sequence Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionPasteNotesUndoAction( __appliedList ); } virtual void redo() { //qDebug() << "paste note sequence Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionPasteNotesRedoAction( __patternList, __appliedList ); } private: std::list< H2Core::Pattern* > __patternList; std::list< H2Core::Pattern* > __appliedList; }; class SE_fillNotesRightClickAction : public QUndoCommand { public: SE_fillNotesRightClickAction( QStringList notePositions, int nSelectedInstrument, int selectedPatternNumber ){ setText( QString( "Fill notes" ) ); __notePositions = notePositions; __nSelectedInstrument= nSelectedInstrument; __selectedPatternNumber = selectedPatternNumber; } virtual void undo() { //qDebug() << "fill notes Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionFillNotesUndoAction( __notePositions, __nSelectedInstrument, __selectedPatternNumber ); } virtual void redo() { //qDebug() << "fill notes Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionFillNotesRedoAction( __notePositions, __nSelectedInstrument, __selectedPatternNumber ); } private: QStringList __notePositions; int __nSelectedInstrument; int __selectedPatternNumber; }; class SE_randomVelocityRightClickAction : public QUndoCommand { public: SE_randomVelocityRightClickAction( QStringList noteVeloValue, QStringList oldNoteVeloValue, int nSelectedInstrument, int selectedPatternNumber ){ setText( QString( "Random velocity" ) ); __noteVeloValue = noteVeloValue; __oldNoteVeloValue = oldNoteVeloValue; __nSelectedInstrument= nSelectedInstrument; __selectedPatternNumber = selectedPatternNumber; } virtual void undo() { //qDebug() << "Random velocity Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionRandomVelocityAction( __oldNoteVeloValue, __nSelectedInstrument, __selectedPatternNumber ); } virtual void redo() { //qDebug() << "Random velocity Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionRandomVelocityAction( __noteVeloValue, __nSelectedInstrument, __selectedPatternNumber ); } private: QStringList __noteVeloValue; QStringList __oldNoteVeloValue; int __nSelectedInstrument; int __selectedPatternNumber; }; class SE_moveInstrumentAction : public QUndoCommand { public: SE_moveInstrumentAction( int nSourceInstrument, int nTargetInstrument ){ setText( QString( "Move instrument" ) ); __nSourceInstrument = nSourceInstrument; __nTargetInstrument = nTargetInstrument; } virtual void undo() { //qDebug() << "move Instrument Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionMoveInstrumentAction( __nTargetInstrument, __nSourceInstrument ); } virtual void redo() { //qDebug() << "move Instrument Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionMoveInstrumentAction( __nSourceInstrument, __nTargetInstrument ); } private: int __nSourceInstrument; int __nTargetInstrument; }; class SE_dragInstrumentAction : public QUndoCommand { public: SE_dragInstrumentAction( QString sDrumkitName, QString sInstrumentName, int nTargetInstrument){ setText( QString( "Drop instrument" ) ); __sDrumkitName = sDrumkitName; __sInstrumentName = sInstrumentName; __nTargetInstrument = nTargetInstrument; __addedComponents = new std::vector(); } ~SE_dragInstrumentAction() { delete __addedComponents; } virtual void undo() { //qDebug() << "drop Instrument Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionDropInstrumentUndoAction( __nTargetInstrument, __addedComponents ); } virtual void redo() { //qDebug() << "drop Instrument Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionDropInstrumentRedoAction( __sDrumkitName, __sInstrumentName, __nTargetInstrument, __addedComponents ); } private: QString __sDrumkitName; QString __sInstrumentName; int __nTargetInstrument; std::vector* __addedComponents; }; class SE_deleteInstrumentAction : public QUndoCommand { public: SE_deleteInstrumentAction( std::list< H2Core::Note* > noteList, QString drumkitName, QString instrumentName, int nSelectedInstrument ){ setText( QString( "Delete instrument " ) ); std::list < H2Core::Note *>::iterator pos; for ( pos = noteList.begin(); pos != noteList.end(); ++pos){ H2Core::Note *pNote; pNote = new H2Core::Note(*pos); assert( pNote ); __noteList.push_back( pNote ); } __drumkitName = drumkitName; __instrumentName = instrumentName; __nSelectedInstrument = nSelectedInstrument; } ~SE_deleteInstrumentAction(){ //qDebug() << "delete left notes "; while ( __noteList.size() ) { delete __noteList.front(); __noteList.pop_front(); } } virtual void undo() { //qDebug() << "delete Instrument Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionDeleteInstrumentUndoAction( __noteList, __nSelectedInstrument, __instrumentName, __drumkitName ); } virtual void redo() { //qDebug() << "delete Instrument Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); //delete an instrument from list h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionDropInstrumentUndoAction( __nSelectedInstrument, new std::vector() ); } private: std::list< H2Core::Note* > __noteList; QString __instrumentName; QString __drumkitName; int __nSelectedInstrument; }; class SE_mainMenuAddInstrumentAction : public QUndoCommand { public: SE_mainMenuAddInstrumentAction(){ setText( QString( "Drop instrument" ) ); } virtual void undo() { //qDebug() << "drop Instrument Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionAddEmptyInstrumentUndo(); } virtual void redo() { //qDebug() << "drop Instrument Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->functionAddEmptyInstrumentRedo(); } private: }; //~pattern editor commands //===================================================================================================================================== //piano roll editor commands class SE_addNotePianoRollAction : public QUndoCommand { public: SE_addNotePianoRollAction( int nColumn, int pressedLine, int selectedPatternNumber, int nSelectedInstrumentnumber, int oldLength, float oldVelocity, float oldPan_L, float oldPan_R, float oldLeadLag, int oldNoteKeyVal, int oldOctaveKeyVal ){ setText( QString( "Add piano roll note ( %1, %2 )" ).arg( nColumn ).arg( pressedLine ) ); __nColumn = nColumn; __pressedLine = pressedLine; __selectedPatternNumber = selectedPatternNumber; __nSelectedInstrumentnumber = nSelectedInstrumentnumber; __oldLength = oldLength; __oldVelocity = oldVelocity; __oldPan_L = oldPan_L; __oldPan_R = oldPan_R; __oldLeadLag = oldLeadLag; __oldNoteKeyVal = oldNoteKeyVal; __oldOctaveKeyVal = oldOctaveKeyVal; } virtual void undo() { //qDebug() << "Add Piano Roll note Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->addOrDeleteNoteAction( __nColumn, __pressedLine, __selectedPatternNumber, __nSelectedInstrumentnumber, __oldLength, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __oldNoteKeyVal, __oldOctaveKeyVal, false ); } virtual void redo() { //qDebug() << "Add Piano Roll Note Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->addOrDeleteNoteAction( __nColumn, __pressedLine, __selectedPatternNumber, __nSelectedInstrumentnumber, __oldLength, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __oldNoteKeyVal, __oldOctaveKeyVal, false ); } private: int __nColumn; int __pressedLine; int __selectedPatternNumber; int __nSelectedInstrumentnumber; int __oldLength; float __oldVelocity; float __oldPan_L; float __oldPan_R; float __oldLeadLag; int __oldNoteKeyVal; int __oldOctaveKeyVal; }; class SE_addPianoRollNoteOffAction : public QUndoCommand { public: SE_addPianoRollNoteOffAction( int nColumn, int pressedLine, int selectedPatternNumber, int nSelectedInstrumentnumber ){ setText( QString( "Add piano roll NOTE_OFF note ( %1, %2 )" ).arg( nColumn ).arg( pressedLine ) ); __nColumn = nColumn; __pressedLine = pressedLine; __selectedPatternNumber = selectedPatternNumber; __nSelectedInstrumentnumber = nSelectedInstrumentnumber; } virtual void undo() { //qDebug() << "Add off note Note Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->addOrDeleteNoteAction( __nColumn, __pressedLine, __selectedPatternNumber, __nSelectedInstrumentnumber, -1, 0.8f, 0.5f, 0.5f, 0.0, 0, 0 , true); } virtual void redo() { //qDebug() << "Add off note Note Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->addOrDeleteNoteAction( __nColumn, __pressedLine, __selectedPatternNumber, __nSelectedInstrumentnumber, -1, 0.8f, 0.5f, 0.5f, 0.0, 0, 0, true); } private: int __nColumn; int __pressedLine; int __selectedPatternNumber; int __nSelectedInstrumentnumber; }; class SE_editPianoRollNoteLengthAction : public QUndoCommand { public: SE_editPianoRollNoteLengthAction( int nColumn, int nRealColumn, int length, int oldLength, int selectedPatternNumber, int nSelectedInstrumentnumber, int pressedLine){ setText( QString( "Change piano roll note length " ) ); __nColumn = nColumn; __nRealColumn = nRealColumn; __length = length; __oldLength = oldLength; __selectedPatternNumber = selectedPatternNumber; __nSelectedInstrumentnumber = nSelectedInstrumentnumber; __pressedLine = pressedLine; } virtual void undo() { //qDebug() << "Change note length Piano Roll Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->editNoteLengthAction( __nColumn, __nRealColumn, __oldLength, __selectedPatternNumber, __nSelectedInstrumentnumber, __pressedLine); } virtual void redo() { //qDebug() << "Change note length Piano RollRedo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->editNoteLengthAction( __nColumn, __nRealColumn, __length, __selectedPatternNumber, __nSelectedInstrumentnumber, __pressedLine ); } private: int __nColumn; int __nRealColumn; int __oldLength; int __length; int __selectedPatternNumber; int __nSelectedInstrumentnumber; int __pressedLine; }; class SE_editNotePropertiesPianoRollAction : public QUndoCommand { public: SE_editNotePropertiesPianoRollAction( int nColumn, int nRealColumn, int selectedPatternNumber, int selectedInstrumentnumber, float velocity, float oldVelocity, float pan_L, float oldPan_L, float pan_R, float oldPan_R, float leadLag, float oldLeadLag, int pressedLine ){ setText( QString( "Change note properties piano roll" ) ); __nColumn = nColumn; __nRealColumn = nRealColumn; __selectedPatternNumber = selectedPatternNumber; __nSelectedInstrumentnumber = selectedInstrumentnumber; __velocity = velocity; __oldVelocity = oldVelocity; __pan_L = pan_L; __oldPan_L = oldPan_L; __pan_R = pan_R; __oldPan_R = oldPan_R; __leadLag = leadLag; __oldLeadLag = oldLeadLag; __pressedLine = pressedLine; } virtual void undo() { //qDebug() << "Change Note properties Piano Roll Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->editNotePropertiesAction( __nColumn, __nRealColumn, __selectedPatternNumber, __nSelectedInstrumentnumber, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __pressedLine ); } virtual void redo() { //qDebug() << "Change Note properties Piano RollRedo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getPianoRollEditor()->editNotePropertiesAction( __nColumn, __nRealColumn, __selectedPatternNumber, __nSelectedInstrumentnumber, __velocity, __pan_L, __pan_R, __leadLag, __pressedLine ); } private: int __nColumn; int __nRealColumn; int __selectedPatternNumber; int __nSelectedInstrumentnumber; float __velocity; float __oldVelocity; float __pan_L; float __oldPan_L; float __pan_R; float __oldPan_R; float __leadLag; float __oldLeadLag; int __pressedLine; }; //~piano roll editor commands //===================================================================================================================================== //Note Properties Ruler commands class SE_editNotePropertiesVolumeAction : public QUndoCommand { public: SE_editNotePropertiesVolumeAction( int undoColumn, QString mode, int nSelectedPatternNumber, int nSelectedInstrument, float velocity, float oldVelocity, float pan_L, float oldPan_L, float pan_R, float oldPan_R, float leadLag, float oldLeadLag, float probability, float oldProbability, int noteKeyVal, int oldNoteKeyVal, int octaveKeyVal, int oldOctaveKeyVal) { setText( QString( "Edit note property " + mode.toLower() ) ); __undoColumn = undoColumn; __mode = mode; __nSelectedPatternNumber = nSelectedPatternNumber; __nSelectedInstrument = nSelectedInstrument; __velocity = velocity; __oldVelocity = oldVelocity; __pan_L = pan_L; __oldPan_L = oldPan_L; __pan_R = pan_R; __oldPan_R = oldPan_R; __leadLag = leadLag; __oldLeadLag = oldLeadLag; __probability = probability; __oldProbability = oldProbability; __noteKeyVal = noteKeyVal; __oldNoteKeyVal = oldNoteKeyVal; __octaveKeyVal = octaveKeyVal; __oldOctaveKeyVal = oldOctaveKeyVal; } virtual void undo() { //qDebug() << "edit note property Undo "; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->undoRedoAction( __undoColumn, __mode, __nSelectedPatternNumber, __nSelectedInstrument, __oldVelocity, __oldPan_L, __oldPan_R, __oldLeadLag, __oldProbability, __oldNoteKeyVal, __oldOctaveKeyVal ); } virtual void redo() { //qDebug() << "edit note property Redo " ; HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getPatternEditorPanel()->getDrumPatternEditor()->undoRedoAction( __undoColumn, __mode, __nSelectedPatternNumber, __nSelectedInstrument, __velocity, __pan_L, __pan_R, __leadLag, __probability, __noteKeyVal, __octaveKeyVal ); } private: int __undoColumn; QString __mode; int __nSelectedPatternNumber; int __nSelectedInstrument; float __velocity; float __oldVelocity; float __pan_L; float __oldPan_L; float __pan_R; float __oldPan_R; float __leadLag; float __oldLeadLag; float __probability; float __oldProbability; int __noteKeyVal; int __oldNoteKeyVal; int __octaveKeyVal; int __oldOctaveKeyVal; int __selectedPatternNumber; int __nSelectedInstrumentnumber; }; //~Note Properties Ruler commands //===================================================================================================================================== class SE_automationPathAddPointAction : public QUndoCommand { public: SE_automationPathAddPointAction( H2Core::AutomationPath *path, float x, float y) { setText( QString( "Add point" ) ); __path = path; __x = x; __y = y; } virtual void undo() { __path->remove_point( __x ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } virtual void redo() { __path->add_point( __x, __y ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } private: H2Core::AutomationPath* __path; float __x; float __y; }; class SE_automationPathRemovePointAction : public QUndoCommand { public: SE_automationPathRemovePointAction( H2Core::AutomationPath *path, float x, float y) { setText( QString( "Remove point" ) ); __path = path; __x = x; __y = y; } virtual void redo() { __path->remove_point( __x ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } virtual void undo() { __path->add_point( __x, __y ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } private: H2Core::AutomationPath* __path; float __x; float __y; }; class SE_automationPathMovePointAction : public QUndoCommand { public: SE_automationPathMovePointAction( H2Core::AutomationPath *path, float ox, float oy, float tx, float ty) { setText( QString( "Move point" ) ); __path = path; __ox = ox; __oy = oy; __tx = tx; __ty = ty; } virtual void redo() { __path->remove_point( __ox ); __path->add_point( __tx, __ty ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } virtual void undo() { __path->remove_point( __tx ); __path->add_point( __ox, __oy ); HydrogenApp* h2app = HydrogenApp::get_instance(); h2app->getSongEditorPanel()->getAutomationPathView()->update(); } private: H2Core::AutomationPath* __path; float __ox; float __oy; float __tx; float __ty; }; #endif // UNDOACTIONS_H hydrogen-1.0.0-rc1/src/gui/src/Widgets/000077500000000000000000000000001366722712400175745ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/gui/src/Widgets/AutomationPathView.cpp000066400000000000000000000147141366722712400240770ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "AutomationPathView.h" #include #include "../SongEditor/SongEditor.h" const char* AutomationPathView::__class_name = "AutomationPathView"; using namespace H2Core; AutomationPathView::AutomationPathView(QWidget *parent) : QWidget(parent), H2Core::Object(__class_name), m_nGridWidth(16), m_nMarginWidth(10), m_nMarginHeight(4), m_bIsHolding(false) { setFocusPolicy( Qt::ClickFocus ); Preferences *pref = Preferences::get_instance(); m_nMaxPatternSequence = pref->getMaxBars(); _path = nullptr; autoResize(); } void AutomationPathView::setAutomationPath(AutomationPath *path) { _path = path; if(_path) { _selectedPoint = _path->end(); } update(); } void AutomationPathView::setGridWidth( int width ) { if ( ( SONG_EDITOR_MIN_GRID_WIDTH <= width ) && ( SONG_EDITOR_MAX_GRID_WIDTH >= width ) ) { m_nGridWidth = width; autoResize(); } } /** * \brief Locate path point on a wdiget surface **/ QPoint AutomationPathView::translatePoint(float x,float y) const { return translatePoint(std::make_pair(x, y)); } /** * \brief Locate path point on a wdiget surface **/ QPoint AutomationPathView::translatePoint(const std::pair &p) const { int contentHeight = height() - 2* m_nMarginHeight; return QPoint( m_nMarginWidth + p.first * m_nGridWidth, m_nMarginHeight + contentHeight * ((_path->get_max()-p.second)/(_path->get_max()-_path->get_min())) ); } /** * \brief Check if user clicked within area inside margins */ bool AutomationPathView::checkBounds(QMouseEvent *event) const { return event->x() > m_nMarginWidth && event->y() > m_nMarginHeight && event->y() < height()-m_nMarginHeight; } /** * \brief Locate clicked point on a path */ std::pair AutomationPathView::locate(QMouseEvent *event) const { int contentHeight = height() - 2* m_nMarginHeight; float x = (event->x() - m_nMarginWidth) / (float)m_nGridWidth; float y = ((contentHeight-event->y()+m_nMarginHeight)/(float)contentHeight) * (_path->get_max() - _path->get_min()) + _path->get_min(); return std::pair(x,y); } /** * \brief Repaint widget **/ void AutomationPathView::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QPen rulerPen(Qt::DotLine); rulerPen.setColor(QColor(127, 133, 153)); painter.setPen(rulerPen); /* Paint min, max */ painter.drawLine(0, m_nMarginHeight, width(), m_nMarginHeight); painter.drawLine(0, height()-m_nMarginHeight, width(), height()-m_nMarginHeight); if (!_path) { return; } /* Paint default */ QPoint def = translatePoint(0, _path->get_default()); painter.drawLine(0, def.y(), width(), def.y()); QPen linePen(QColor(99, 165, 255)); linePen.setWidth(2); painter.setPen(linePen); if (_path->empty()) { QPoint p = translatePoint(0,_path->get_default()); painter.drawLine(0, p.y(), width(), p.y()); } else { std::pair firstPoint = *_path->begin(); QPoint lastPoint = translatePoint(0,firstPoint.second); lastPoint.setX(0); for (auto point : *_path) { QPoint current = translatePoint(point); painter.drawLine(lastPoint, current); lastPoint = current; } QPoint last(width(), lastPoint.y()); painter.drawLine(lastPoint, last); } QPen circlePen(QColor(99, 165, 255)); circlePen.setWidth(1); painter.setPen(circlePen); painter.setBrush(QBrush(QColor(58,62,72))); for (auto point : *_path) { QPoint center = translatePoint(point); painter.drawEllipse(center, 3, 3); } } /** * \brief Handle mouse click * * This function locates point within click proximity, moves it * along Y axis. If threre's no point to move, new point is created. * That point is marked for move by mouseMoveEvent(). */ void AutomationPathView::mousePressEvent(QMouseEvent *event) { if (! checkBounds(event) || !_path) { return; } auto p = locate(event); float x = p.first; float y = p.second; _selectedPoint = _path->find(x); if (_selectedPoint == _path->end()) { _path->add_point(x, y); _selectedPoint = _path->find(x); m_bPointAdded = true; } else { _selectedPoint = _path->move(_selectedPoint, x, y); m_fOriginX = x; m_fOriginY = y; m_bPointAdded = false; } update(); m_bIsHolding = true; emit valueChanged(); } /** * \brief Handler for releasing mouse button * * Ends any point drags **/ void AutomationPathView::mouseReleaseEvent(QMouseEvent *event) { m_bIsHolding = false; if (! checkBounds(event) || !_path) { return; } auto p = locate(event); float x = p.first; float y = p.second; if (m_bPointAdded) { emit pointAdded(x, y); } else { emit pointMoved(m_fOriginX, m_fOriginY, x, y); } emit valueChanged(); } /** * \brief Handler for mouse moves * * Moves selected point. */ void AutomationPathView::mouseMoveEvent(QMouseEvent *event) { if (! checkBounds(event) || !_path) { return; } auto p = locate(event); float x = p.first; float y = p.second; if(m_bIsHolding) { _selectedPoint = _path->move(_selectedPoint, x, y); } update(); } /** * \brief Handler for key presses * * Removed selected point */ void AutomationPathView::keyPressEvent(QKeyEvent *event) { if ( event->key() == Qt::Key_Delete || event->key() == Qt::Key_Backspace ) { if ( _path && _selectedPoint != _path->end() ) { float x = _selectedPoint->first; float y = _selectedPoint->second; _path->remove_point(_selectedPoint->first); _selectedPoint = _path->end(); emit pointRemoved( x, y ); update(); emit valueChanged(); event->accept(); return; } } event->ignore(); } /** * \brief Resize widget to fit everything **/ void AutomationPathView::autoResize() { resize ( 10 + m_nMaxPatternSequence * m_nGridWidth, 64 ); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/AutomationPathView.h000066400000000000000000000053121366722712400235360ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AUTOMATION_PATH_VIEW_H #define AUTOMATION_PATH_VIEW_H #include #include #include #if QT_VERSION >= 0x050000 # include #endif class AutomationPathView : public QWidget, public H2Core::Object { Q_OBJECT H2_OBJECT H2Core::AutomationPath *_path; int m_nGridWidth; /** < Width of song grid cell size - in order to properly align AutomationPathView and SongEditor */ int m_nMarginWidth; /** < Width of an empty space on the left side */ int m_nMarginHeight;/** < Height of top and bottom margins */ int m_nMaxPatternSequence; bool m_bIsHolding; /** < Whether any points are being dragged */ bool m_bPointAdded;/** < Whether a new point was added during mouse move */ float m_fOriginX; /** < Original position of selected point */ float m_fOriginY; /** < Original position of selected point */ H2Core::AutomationPath::iterator _selectedPoint; /** < Point that is being dragged */ public: AutomationPathView(QWidget *parent = nullptr); H2Core::AutomationPath *getAutomationPath() const noexcept { return _path; } void setAutomationPath(H2Core::AutomationPath *path); int getGridWidth() const noexcept { return m_nGridWidth; } void setGridWidth(int width); protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void keyPressEvent(QKeyEvent *event) override; QPoint translatePoint(float x, float y) const; QPoint translatePoint(const std::pair &p) const; bool checkBounds(QMouseEvent *event) const; std::pair locate(QMouseEvent *) const; void autoResize(); signals: void valueChanged(); void pointAdded(float x, float y); void pointRemoved(float x, float y); void pointMoved(float ox, float oy, float tx, float ty); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/Button.cpp000066400000000000000000000166211366722712400215610ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Button.h" #include "PixmapWidget.h" #include "../Skin.h" #include "MidiSenseWidget.h" #include // for QT_VERSION #if QT_VERSION == 0x040100 // SVG renderer was introduced in QT4.1 #include #endif #include const char* Button::__class_name = "Button"; Button::Button( QWidget * pParent, const QString& sOnImage, const QString& sOffImage, const QString& sOverImage, QSize size, bool use_skin_style, bool enable_press_hold ) : QWidget( pParent ) , Object( __class_name ) , m_bPressed( false ) , m_onPixmap( size ) , m_offPixmap( size ) , m_overPixmap( size ) , m_bMouseOver( false ) , __use_skin_style(use_skin_style) , __enable_press_hold(enable_press_hold) { // draw the background: slower but useful with transparent images! //setAttribute(Qt::WA_NoBackground); setMinimumSize( size ); setMaximumSize( size ); resize( size ); if ( loadImage( sOnImage, m_onPixmap ) == false ) { m_onPixmap.fill( QColor( 0, 255, 0 ) ); } if ( loadImage( sOffImage, m_offPixmap ) == false ) { m_offPixmap.fill( QColor( 0, 100, 0 ) ); } if ( loadImage( sOverImage, m_overPixmap ) == false ) { m_overPixmap.fill( QColor( 0, 180, 0 ) ); } this->setStyleSheet("font-size: 9px; font-weight: bold;"); m_timerTimeout = 0; m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(buttonPressed_timer_timeout())); } Button::~Button() { } bool Button::loadImage( const QString& sFilename, QPixmap& pixmap ) { #if QT_VERSION == 0x040100 // SVG renderer was introduced in QT4.1 /* if ( sFilename.endsWith( ".svg" ) ) { ERRORLOG( "************* LOAD SVG!!" ); if ( !QFile::exists( sFilename ) ) { return false; } QSvgRenderer doc( sFilename ); if ( doc.isValid() == false ) { ERRORLOG( "error loading SVG image: '" + sFilename.toLocal8Bit().constData() + "'" ); return false; } QPainter p; p.begin( &pixmap ); p.setViewport( 0, 0, width(), height() ); p.eraseRect( 0, 0, width(), height() ); doc.render( &p ); p.end(); return true; } */ #endif // load an image if ( pixmap.load( Skin::getImagePath() + sFilename ) == false ) { if ( !sFilename.isEmpty() ) { ERRORLOG( QString( "Error loading image: '%1'" ).arg( sFilename ) ); } return false; } return true; } void Button::mousePressEvent(QMouseEvent*ev) { /* * Shift + Left-Click activate the midi learn widget */ if ( ev->button() == Qt::LeftButton && (ev->modifiers() & Qt::ShiftModifier) ){ MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); return; } m_bPressed = true; update(); emit mousePress(this); if ( ev->button() == Qt::LeftButton && __enable_press_hold) { m_timerTimeout = 2000; buttonPressed_timer_timeout(); } } void Button::mouseReleaseEvent(QMouseEvent* ev) { setPressed( false ); if (ev->button() == Qt::LeftButton) { if(__enable_press_hold) { m_timer->stop(); } else { emit clicked(this); } } else if (ev->button() == Qt::RightButton) { emit rightClicked(this); } } void Button::buttonPressed_timer_timeout() { emit clicked(this); if(m_timerTimeout > 100) { m_timerTimeout = m_timerTimeout / 2; } m_timer->start(m_timerTimeout); } void Button::setFontSize(int size) { m_textFont.setPointSize(size); } void Button::setPressed(bool pressed) { if (pressed != m_bPressed) { m_bPressed = pressed; update(); } } void Button::enterEvent(QEvent *ev) { UNUSED( ev ); m_bMouseOver = true; update(); } void Button::leaveEvent(QEvent *ev) { UNUSED( ev ); m_bMouseOver = false; update(); } void Button::paintEvent( QPaintEvent* ev) { QPainter painter(this); // background if (m_bPressed) { if (__use_skin_style) { static int w = 5; static int h = m_onPixmap.height(); // central section, scaled painter.drawPixmap( QRect(w, 0, width() - w * 2, h), m_onPixmap, QRect(10, 0, w, h) ); // left side painter.drawPixmap( QRect(0, 0, w, h), m_onPixmap, QRect(0, 0, w, h) ); // right side painter.drawPixmap( QRect(width() - w, 0, w, h), m_onPixmap, QRect(m_onPixmap.width() - w, 0, w, h) ); } else { painter.drawPixmap( ev->rect(), m_onPixmap, ev->rect() ); } } else { if (m_bMouseOver) { if (__use_skin_style) { static int w = 5; static int h = m_overPixmap.height(); // central section, scaled painter.drawPixmap( QRect(w, 0, width() - w * 2, h), m_overPixmap, QRect(10, 0, w, h) ); // left side painter.drawPixmap( QRect(0, 0, w, h), m_overPixmap, QRect(0, 0, w, h) ); // right side painter.drawPixmap( QRect(width() - w, 0, w, h), m_overPixmap, QRect(m_overPixmap.width() - w, 0, w, h) ); } else { painter.drawPixmap( ev->rect(), m_overPixmap, ev->rect() ); } } else { if (__use_skin_style) { static int w = 5; static int h = m_offPixmap.height(); // central section, scaled painter.drawPixmap( QRect(w, 0, width() - w * 2, h), m_offPixmap, QRect(10, 0, w, h) ); // left side painter.drawPixmap( QRect(0, 0, w, h), m_offPixmap, QRect(0, 0, w, h) ); // right side painter.drawPixmap( QRect(width() - w, 0, w, h), m_offPixmap, QRect(m_offPixmap.width() - w, 0, w, h) ); } else { painter.drawPixmap( ev->rect(), m_offPixmap, ev->rect() ); } } } if ( !m_sText.isEmpty() ) { painter.setFont( m_textFont ); QColor shadow(150, 150, 150, 100); QColor text(10, 10, 10); if (m_bMouseOver) { shadow = QColor(220, 220, 220, 100); } // shadow painter.setPen( shadow ); painter.drawText( 1, 1, width(), height(), Qt::AlignHCenter | Qt::AlignVCenter, m_sText ); // text painter.setPen( text ); painter.drawText( 0, 0, width(), height(), Qt::AlignHCenter | Qt::AlignVCenter, m_sText ); } } void Button::setText( const QString& sText ) { m_sText = sText; update(); } // ::::::::::::::::::::::::: ToggleButton::ToggleButton( QWidget *pParent, const QString& sOnImg, const QString& sOffImg, const QString& sOverImg, QSize size, bool use_skin_style ) : Button( pParent, sOnImg, sOffImg, sOverImg, size, use_skin_style, false ) { } ToggleButton::~ToggleButton() { } void ToggleButton::mousePressEvent(QMouseEvent *ev) { if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ShiftModifier ){ MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); return; } if (ev->button() == Qt::RightButton) { emit rightClicked(this); } else { if (m_bPressed) { m_bPressed = false; } else { m_bPressed = true; } update(); emit clicked(this); } } void ToggleButton::mouseReleaseEvent(QMouseEvent*) { // do nothing, this method MUST override Button's one } hydrogen-1.0.0-rc1/src/gui/src/Widgets/Button.h000066400000000000000000000051631366722712400212250ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 BUTTON_H #define BUTTON_H #include #include #include "MidiLearnable.h" #include #if QT_VERSION >= 0x050000 # include #endif class PixmapWidget; /** * Generic Button with pixmaps and text. */ class Button : public QWidget, public H2Core::Object, public MidiLearnable { H2_OBJECT Q_OBJECT public: Button( QWidget *pParent, const QString& sOnImg, const QString& sOffImg, const QString& sOverImg, QSize size, bool use_skin_style = false, bool enable_press_hold = false ); virtual ~Button(); bool isPressed() { return m_bPressed; } void setPressed(bool pressed); void setText( const QString& sText ); void setFontSize( int size ); signals: void clicked(Button *pBtn); void rightClicked(Button *pBtn); void mousePress(Button *pBtn); protected slots: void buttonPressed_timer_timeout(); protected: bool m_bPressed; QFont m_textFont; QString m_sText; QPixmap m_onPixmap; QPixmap m_offPixmap; QPixmap m_overPixmap; private: bool m_bMouseOver; bool __use_skin_style; bool __enable_press_hold; void mousePressEvent(QMouseEvent *ev); void mouseReleaseEvent(QMouseEvent *ev); void enterEvent(QEvent *ev); void leaveEvent(QEvent *ev); void paintEvent( QPaintEvent* ev); QTimer *m_timer; int m_timerTimeout; bool loadImage( const QString& sFilename, QPixmap& pixmap ); }; /** * A ToggleButton (On/Off). */ class ToggleButton : public Button { Q_OBJECT public: ToggleButton( QWidget *pParent, const QString& sOnImg, const QString& sOffImg, const QString& sOverImg, QSize size, bool use_skin_style = false ); ~ToggleButton(); private: void mousePressEvent( QMouseEvent *ev ); void mouseReleaseEvent( QMouseEvent *ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/ClickableLabel.cpp000066400000000000000000000026171366722712400231170ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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" #include #if QT_VERSION >= 0x050000 # include #endif #include ClickableLabel::ClickableLabel( QWidget *pParent ) : QLabel( pParent ) { QPalette defaultPalette; defaultPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); defaultPalette.setColor( QPalette::Foreground, QColor( 230, 230, 230 ) ); this->setPalette( defaultPalette ); this->setAlignment( Qt::AlignCenter ); } void ClickableLabel::mousePressEvent( QMouseEvent * e ) { UNUSED( e ); emit labelClicked( this ); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/ClickableLabel.h000066400000000000000000000022511366722712400225560ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 CLICKABLE_LABEL_H #define CLICKABLE_LABEL_H #include #if QT_VERSION >= 0x050000 # include #endif class ClickableLabel : public QLabel { Q_OBJECT public: ClickableLabel( QWidget *pParent ); void mousePressEvent( QMouseEvent * e ); signals: void labelClicked( ClickableLabel* pLabel ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/CpuLoadWidget.cpp000066400000000000000000000071301366722712400227740ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "CpuLoadWidget.h" #include #include "../Skin.h" #include "../HydrogenApp.h" #include #include #include #include const char* CpuLoadWidget::__class_name = "CpuLoadWidget"; CpuLoadWidget::CpuLoadWidget( QWidget *pParent ) : QWidget( pParent ) , Object( __class_name ) , m_fValue( 0 ) { setAttribute(Qt::WA_NoBackground); static const uint WIDTH = 92; static const uint HEIGHT = 8; resize( WIDTH, HEIGHT ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); m_nXRunValue = 0; // Background image QString background_path = Skin::getImagePath().append( "/playerControlPanel/cpuLoad_back.png" ); bool ok = m_back.load( background_path ); if( !ok ) { ERRORLOG( "Error loading pixmap " + background_path ); } // Leds image QString leds_path = Skin::getImagePath().append( "/playerControlPanel/cpuLoad_leds.png" ); ok = m_leds.load( leds_path ); if( !ok ) { ERRORLOG( "Error loading pixmap " + leds_path ); } QTimer *timer = new QTimer(this); connect( timer, SIGNAL( timeout() ), this, SLOT( updateCpuLoadWidget() ) ); timer->start(200); // update player control at 5 fps HydrogenApp::get_instance()->addEventListener( this ); } CpuLoadWidget::~CpuLoadWidget() { } void CpuLoadWidget::mousePressEvent(QMouseEvent *ev) { UNUSED( ev ); } void CpuLoadWidget::setValue(float newValue) { if ( newValue > 1.0 ) { newValue = 1.0; } else if (newValue < 0.0) { newValue = 0.0; } if (m_fValue != newValue) { m_fValue = newValue; } } float CpuLoadWidget::getValue() { return m_fValue; } void CpuLoadWidget::paintEvent( QPaintEvent*) { if (!isVisible()) { return; } QPainter painter(this); // background // bitBlt( &m_temp, 0, 0, &m_back, 0, 0, width(), height(), CopyROP ); painter.drawPixmap( rect(), m_back, QRect( 0, 0, width(), height() ) ); // leds int pos = (int)( 3 + m_fValue * ( width() - 3 * 2 ) ); // bitBlt( &m_temp, 0, 0, &m_leds, 0, 0, pos, height(), CopyROP ); painter.drawPixmap( QRect( 0, 0, pos, height() ), m_leds, QRect( 0, 0, pos, height() ) ); if (m_nXRunValue > 0) { // xrun led // bitBlt( &m_temp, 90, 0, &m_leds, 90, 0, width(), height(), CopyROP ); painter.drawPixmap( QRect( 90, 0, width(), height() ), m_leds, QRect( 90, 0, width(), height() ) ); } } void CpuLoadWidget::updateCpuLoadWidget() { // Process time H2Core::Hydrogen *engine = H2Core::Hydrogen::get_instance(); int perc = 0; if ( engine->getMaxProcessTime() != 0.0 ) { perc = (int)( engine->getProcessTime() / ( engine->getMaxProcessTime() / 100.0 ) ); } setValue( perc / 100.0 ); if (m_nXRunValue > 0) { m_nXRunValue -= 5; } update(); } void CpuLoadWidget::XRunEvent() { INFOLOG( "[xRunEvent]" ); m_nXRunValue = 100; update(); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/CpuLoadWidget.h000066400000000000000000000030341366722712400224400ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 CPU_LOAD_WIDGET_H #define CPU_LOAD_WIDGET_H #include #include "../EventListener.h" #include #include #if QT_VERSION >= 0x050000 # include #endif /// /// Shows CPU load /// class CpuLoadWidget : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: CpuLoadWidget(QWidget *pParent ); ~CpuLoadWidget(); void setValue( float newValue ); float getValue(); void mousePressEvent(QMouseEvent *ev); void paintEvent(QPaintEvent *ev); void XRunEvent(); public slots: void updateCpuLoadWidget(); private: float m_fValue; uint m_nXRunValue; QPixmap m_back; QPixmap m_leds; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/DownloadWidget.cpp000066400000000000000000000144221366722712400232160ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "DownloadWidget.h" #include #include #include const char* Download::__class_name = "Download"; Download::Download( QWidget* pParent, const QString& download_url, const QString& local_file ) : QDialog( pParent ) , Object( __class_name ) , __download_percent( 0 ) , __eta( 0 ) , __bytes_current( 0 ) , __bytes_total( 0 ) , __remote_url( download_url ) , __local_file( local_file ) , __reply(nullptr) , __error(false) { if ( !__local_file.isEmpty() ) { INFOLOG( QString( "Downloading '%1' in '%2'" ).arg( __remote_url.toString() ).arg( __local_file ) ); } else { INFOLOG( QString( "Downloading '%1'" ).arg( __remote_url.toString() ) ); } __http_client = new QNetworkAccessManager(this); QString sEnvHttpProxy = QString( getenv( "http_proxy" ) ); int nEnvHttpPort = 0; QString sEnvHttpUser = QString( getenv( "http_user" ) ); QString sEnvHttpPassword = QString( getenv( "http_password" ) ); nEnvHttpPort = sEnvHttpProxy.right( sEnvHttpProxy.length() - sEnvHttpProxy.indexOf(':') - 1 ).toInt(); sEnvHttpProxy = sEnvHttpProxy.left( sEnvHttpProxy.indexOf(':') ); __time.start(); if ( ( !sEnvHttpProxy.isNull() ) && ( nEnvHttpPort != 0 ) ) { QNetworkProxy proxy; proxy.setType( QNetworkProxy::DefaultProxy ); proxy.setHostName( sEnvHttpProxy ); proxy.setPort( nEnvHttpPort ); proxy.setUser( sEnvHttpUser ); proxy.setPassword( sEnvHttpPassword ); __http_client->setProxy(proxy); } QNetworkRequest getReq; getReq.setUrl( __remote_url ); getReq.setRawHeader( "User-Agent" , "Hydrogen" ); __reply = __http_client->get( getReq ); connect(__reply, SIGNAL(finished()),this, SLOT(finished())); connect(__reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64))); } Download::~Download() { } /// TODO: I have to save the file to disk on a temporary dir and then move it if everything is ok. void Download::finished() { if ( __reply->error() ) { __error = true; ERRORLOG(QString( tr( "Importing item failed: %1" ) ).arg( __reply->errorString() )); QMessageBox::information( this, "Hydrogen", QString( tr( "Importing item failed: %1" ) ).arg( __reply->errorString() ) ); reject(); return; } int StatusAttribute = __reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if(StatusAttribute >= 200 && StatusAttribute < 300){ //do nothing, handling will be done later.. } else if(StatusAttribute >= 300 && StatusAttribute < 400){ QVariant RedirectAttribute = __reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if ( RedirectAttribute != 0 ) { __redirect_url = __remote_url.resolved(RedirectAttribute.toUrl()); __reply->deleteLater(); INFOLOG( QString( "Download redirected to '%1'" ).arg( __redirect_url.toString() ) ); reject(); return; } } INFOLOG( "Download completed. " ); if ( __local_file.isEmpty() ) { // store the text received only when not using the file. __feed_xml_string = QString( __reply->readAll() ); } else { QFile file( __local_file ); if ( !file.open( QIODevice::WriteOnly ) ) { ERRORLOG( QString( "Unable to save %1" ).arg( __local_file ) ); } else { file.write(__reply->readAll()); file.flush(); file.close(); } } accept(); } void Download::downloadProgress( qint64 done, qint64 total ) { __bytes_current = done; __bytes_total = total; __download_percent = ( float )done / ( float )total * 100.0; } // :::::::::::::::::::.. DownloadWidget::DownloadWidget( QWidget* parent, const QString& title, const QString& __remote_url, const QString& local_file ) : Download( parent, __remote_url, local_file ) { setWindowTitle( title ); setModal( true ); setFixedSize( 500, 100 ); QFont boldFont; boldFont.setBold( true ); __url_label = new QLabel( nullptr ); __url_label->setFont( boldFont ); __url_label->setAlignment( Qt::AlignCenter ); __url_label->setText( QFileInfo( __remote_url ).fileName() ); __progress_bar = new QProgressBar( nullptr ); __progress_bar->setMinimum( 0 ); __progress_bar->setMaximum( 100 ); __eta_label = new QLabel( nullptr ); __eta_label->setAlignment( Qt::AlignHCenter ); QVBoxLayout* pVBox = new QVBoxLayout(); pVBox->addWidget( __url_label ); pVBox->addWidget( __progress_bar ); pVBox->addWidget( __eta_label ); setLayout( pVBox ); __update_timer = new QTimer( this ); connect( __update_timer, SIGNAL( timeout() ), this, SLOT( updateStats() ) ); __close_timer = new QTimer( this ); connect( __close_timer, SIGNAL( timeout() ), this, SLOT( close() ) ); __update_timer->start( 100 ); } DownloadWidget::~DownloadWidget() { __update_timer->stop(); __close_timer->stop(); } void DownloadWidget::updateStats() { if ( __download_percent > 0 ) { __eta = ( int )( round( ( __time.elapsed() / __download_percent * ( 100 - __download_percent ) ) / 1000 ) ); } __progress_bar->setValue( get_percent_done() ); QString hours = QString( "%1" ).arg( __eta / 60 / 60 ); QString minutes = QString( "%1" ).arg( ( __eta / 60 ) % 60 ); QString seconds = QString( "%1" ).arg( __eta % 60 ); hours = hours.rightJustified( 2, '0' ); minutes = minutes.rightJustified( 2, '0' ); seconds = seconds.rightJustified( 2, '0' ); QString sETA = hours + ":" + minutes + ":" + seconds; __eta_label->setText( tr( "(%1/%2 KiB) - ETA %3" ).arg( __bytes_current / 1024 ).arg( __bytes_total / 1024 ).arg( sETA ) ); if ( __download_percent == 100 ) { __update_timer->stop(); __close_timer->start( 1000 ); // close the window after 1 second } } hydrogen-1.0.0-rc1/src/gui/src/Widgets/DownloadWidget.h000066400000000000000000000043271366722712400226660ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 DOWNLOAD_WIDGET_H #define DOWNLOAD_WIDGET_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include class Download : public QDialog, public H2Core::Object { H2_OBJECT Q_OBJECT public: Download( QWidget* parent, const QString& download_url, const QString& local_file ); ~Download(); int get_percent_done() { return (int)__download_percent; } const QString& get_xml_content() { return __feed_xml_string; } bool get_error() { return __error; } private slots: void finished(); void downloadProgress( qint64 done, qint64 total ); protected: QNetworkAccessManager* __http_client; QNetworkReply* __reply; QElapsedTimer __time; float __download_percent; int __eta; qint64 __bytes_current; qint64 __bytes_total; QUrl __redirect_url; QUrl __remote_url; QString __local_file; QString __feed_xml_string; bool __error; }; class DownloadWidget : public Download { H2_OBJECT Q_OBJECT public: DownloadWidget( QWidget* parent, const QString& title, const QString& download_url, const QString& local_file = "" ); ~DownloadWidget(); QUrl get_redirect_url() { return __redirect_url; } private slots: void updateStats(); private: QTimer* __update_timer; QTimer* __close_timer; QLabel* __url_label; QLabel* __eta_label; QProgressBar* __progress_bar; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/Fader.cpp000066400000000000000000000376501366722712400213340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "../Skin.h" #include "Fader.h" #include "LCD.h" #include "MidiSenseWidget.h" #include #if QT_VERSION >= 0x050000 # include #endif #include const char* Fader::__class_name = "Fader"; Fader::Fader( QWidget *pParent, bool bUseIntSteps, bool bWithoutKnob) : QWidget( pParent ) , Object( __class_name ) , m_bWithoutKnob( bWithoutKnob ) , m_bUseIntSteps( bUseIntSteps ) , m_fPeakValue_L( 0.0 ) , m_fPeakValue_R( 0.0 ) , m_fMinPeak( 0.01f ) , m_fMaxPeak( 1.0 ) , m_fValue( 0.0 ) , m_fMinValue( 0.0 ) , m_fMaxValue( 1.0 ) , m_fDefaultValue( m_fMaxValue ) , m_bIgnoreMouseMove( false ) { setAttribute( Qt::WA_NoBackground ); setMinimumSize( 23, 116 ); setMaximumSize( 23, 116); resize( 23, 116 ); // Background image QString background_path = Skin::getImagePath() + "/mixerPanel/fader_background.png"; bool ok = m_back.load( background_path ); if( ok == false ) { ERRORLOG("Fader: Error loading pixmap"); } // Leds image QString leds_path = Skin::getImagePath() + "/mixerPanel/fader_leds.png"; ok = m_leds.load( leds_path ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } // Knob image QString knob_path = Skin::getImagePath() + "/mixerPanel/fader_knob.png"; ok = m_knob.load( knob_path ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } } Fader::~Fader() { //infoLog( "[Destroy]" ); } void Fader::mouseMoveEvent( QMouseEvent *ev ) { if ( m_bIgnoreMouseMove ) { return; } float fVal = (float)( height() - ev->y() ) / (float)height(); fVal = fVal * ( m_fMaxValue - m_fMinValue ); fVal = fVal + m_fMinValue; setValue( fVal ); emit valueChanged(this); } void Fader::mousePressEvent(QMouseEvent *ev) { if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ControlModifier ) { resetValueToDefault(); m_bIgnoreMouseMove = true; emit valueChanged(this); } else if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ShiftModifier ) { MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); } else { mouseMoveEvent(ev); } } void Fader::mouseReleaseEvent(QMouseEvent *ev) { m_bIgnoreMouseMove = false; } void Fader::wheelEvent ( QWheelEvent *ev ) { ev->accept(); if ( m_bUseIntSteps ) { if ( ev->delta() > 0 ) { setValue( m_fValue + 1 ); } else { setValue( m_fValue - 1 ); } } else { float step = ( m_fMaxValue - m_fMinValue ) / 50.0; if ( ev->delta() > 0 ) { setValue( m_fValue + step ); } else { setValue( m_fValue - step ); } } emit valueChanged(this); } void Fader::setValue( float fVal ) { if ( fVal > m_fMaxValue ) { //WARNINGLOG( toString( fVal ) + " > " + toString( m_fMax ) ); fVal = m_fMaxValue; } else if ( fVal < m_fMinValue ) { //WARNINGLOG( toString( fVal ) + " < " + toString( m_fMin ) ); fVal = m_fMinValue; } if ( m_bUseIntSteps ) { fVal = (int)fVal; } if ( m_fValue != fVal ) { //INFOLOG( "new value: " + toString( fVal ) ); m_fValue = fVal; update(); } } float Fader::getValue() { return m_fValue; } void Fader::setDefaultValue( float fDefaultValue ) { if ( fDefaultValue == m_fDefaultValue ) { return; } if ( fDefaultValue < m_fMinValue ) { fDefaultValue = m_fMinValue; } else if ( fDefaultValue > m_fMaxValue ) { fDefaultValue = m_fMaxValue; } if ( fDefaultValue != m_fDefaultValue ) { m_fDefaultValue = fDefaultValue; } } void Fader::resetValueToDefault() { setValue(m_fDefaultValue); } /// /// Set peak value (0.0 .. 1.0) /// void Fader::setPeak_L( float fPeak ) { if ( fPeak < m_fMinPeak ) { fPeak = m_fMinPeak; } else if ( fPeak > m_fMaxPeak ) { fPeak = m_fMaxPeak; } if ( m_fPeakValue_L != fPeak) { m_fPeakValue_L = fPeak; update(); } } /// /// Set peak value (0.0 .. 1.0) /// void Fader::setPeak_R( float fPeak ) { if ( fPeak < m_fMinPeak ) { fPeak = m_fMinPeak; } else if ( fPeak > m_fMaxPeak ) { fPeak = m_fMaxPeak; } if ( m_fPeakValue_R != fPeak ) { m_fPeakValue_R = fPeak; update(); } } void Fader::paintEvent( QPaintEvent *ev) { UNUSED( ev ); QPainter painter(this); // background painter.drawPixmap( ev->rect(), m_back, ev->rect() ); float realPeak_L = m_fPeakValue_L - m_fMinPeak; int peak_L = 116 - ( realPeak_L / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0; if ( peak_L > 116 ) { peak_L = 116; } painter.drawPixmap( QRect( 0, peak_L, 11, 116 - peak_L ), m_leds, QRect( 0, peak_L, 11, 116 - peak_L ) ); float realPeak_R = m_fPeakValue_R - m_fMinPeak; int peak_R = 116 - ( realPeak_R / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0; if ( peak_R > 116 ) { peak_R = 116; } painter.drawPixmap( QRect( 11, peak_R, 11, 116 - peak_R ), m_leds, QRect( 11, peak_R, 11, 116 - peak_R ) ); if ( m_bWithoutKnob == false ) { // knob static const uint knob_height = 29; static const uint knob_width = 15; float fRange = m_fMaxValue - m_fMinValue; float realVal = m_fValue - m_fMinValue; uint knob_y = (uint)( 116.0 - ( 86.0 * ( realVal / fRange ) ) ); painter.drawPixmap( QRect( 4, knob_y - knob_height, knob_width, knob_height), m_knob, QRect( 0, 0, knob_width, knob_height ) ); } } void Fader::setMinValue( float fMin ) { m_fMinValue = fMin; } void Fader::setMaxValue( float fMax ) { m_fMaxValue = fMax; } void Fader::setMaxPeak( float fMax ) { m_fMaxPeak = fMax; } void Fader::setMinPeak( float fMin ) { m_fMinPeak = fMin; } ////////////////////////////////// VerticalFader::VerticalFader( QWidget *pParent, bool bUseIntSteps, bool bWithoutKnob) : Fader( pParent, bUseIntSteps, bWithoutKnob ) { m_bWithoutKnob = bWithoutKnob; m_bUseIntSteps = bUseIntSteps; m_fPeakValue_L = 0.0; m_fPeakValue_R = 0.0; m_fMinPeak = 0.01f; m_fMaxPeak = 1.0; m_fValue = 0.0; m_fMinValue = 0.0; m_fMaxValue = 1.0; setAttribute( Qt::WA_NoBackground ); setMinimumSize( 116, 23 ); setMaximumSize( 116, 23); resize( 116, 23 ); QMatrix matrix; matrix.rotate(90); // Background image QString background_path = Skin::getImagePath() + "/mixerPanel/fader_background.png"; bool ok = m_back.load( background_path ); m_back=m_back.transformed(matrix); if( ok == false ) { ERRORLOG("Fader: Error loading pixmap"); } // Leds image QString leds_path = Skin::getImagePath() + "/mixerPanel/fader_leds.png"; ok = m_leds.load( leds_path ); m_leds=m_leds.transformed(matrix); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } // Knob image QString knob_path = Skin::getImagePath() + "/mixerPanel/fader_knob.png"; ok = m_knob.load( knob_path ); m_knob = m_knob.transformed(matrix); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } } VerticalFader::~VerticalFader() { // infoLog( "[~MasterFader]" ); } void VerticalFader::mouseMoveEvent( QMouseEvent *ev ) { float fVal = (float)( ev->x() ) / (float)width(); qDebug() <<"H/ev/FVal: " << width() << ev->x() << fVal; fVal = fVal * ( m_fMaxValue - m_fMinValue ); fVal = fVal + m_fMinValue; setValue( fVal ); emit valueChanged(this); } void VerticalFader::paintEvent( QPaintEvent *ev) { UNUSED( ev ); QPainter painter(this); // background painter.drawPixmap( ev->rect(), m_back, ev->rect() ); float realPeak_L = m_fPeakValue_L - m_fMinPeak; int peak_L = 116 - ( realPeak_L / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0; if ( peak_L > 116 ) { peak_L = 116; } painter.drawPixmap( QRect( 0, 0, 116 - peak_L, 11 ), m_leds, QRect( 0, 0, 116 - peak_L, 11 ) ); float realPeak_R = m_fPeakValue_R - m_fMinPeak; int peak_R = 116 - ( realPeak_R / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0; if ( peak_R > 116 ) { peak_R = 116; } painter.drawPixmap( QRect( 0, 11, 116 - peak_R, 11 ), m_leds, QRect( 0, 11, 116 - peak_R, 11 ) ); if ( m_bWithoutKnob == false ) { // knob static const uint knob_height = 15; static const uint knob_width = 29; float fRange = m_fMaxValue - m_fMinValue; float realVal = m_fValue - m_fMinValue; uint knob_x = (uint)( 116.0 - ( 101 * ( 1-realVal / fRange ) ) ); painter.drawPixmap( QRect(knob_x - knob_height, 4 , knob_width, knob_height), m_knob, QRect( 0, 0, knob_width, knob_height ) ); } } ////////////////////////////////// const char* MasterFader::__class_name = "MasterFader"; MasterFader::MasterFader(QWidget *pParent, bool bWithoutKnob) : QWidget( pParent ) , Object( __class_name ) , m_bWithoutKnob( bWithoutKnob ) , m_fPeakValue_L( 0.0 ) , m_fPeakValue_R( 0.0 ) , m_fValue( 0.0 ) , m_fMin( 0.0 ) , m_fMax( 1.0 ) , m_fDefaultValue( m_fMax ) , m_bIgnoreMouseMove( false ) { setAttribute(Qt::WA_NoBackground); setMinimumSize( 34, 190 ); setMaximumSize( 34, 190); resize( 34, 190 ); // Background image QString background_path = Skin::getImagePath() + "/mixerPanel/masterMixer_background.png"; bool ok = m_back.load( background_path ); if( ok == false ) { ERRORLOG("Fader: Error loading pixmap"); } // Leds image QString leds_path = Skin::getImagePath() + "/mixerPanel/masterMixer_leds.png"; ok = m_leds.load( leds_path ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } // Knob image QString knob_path = Skin::getImagePath() + "/mixerPanel/fader_knob.png"; ok = m_knob.load( knob_path ); if( ok == false ){ ERRORLOG( "Error loading pixmap" ); } } MasterFader::~MasterFader() { // infoLog( "[~MasterFader]" ); } void MasterFader::wheelEvent ( QWheelEvent *ev ) { ev->accept(); float step = ( m_fMax - m_fMin ) / 50.0; if ( ev->delta() > 0 ) { setValue( m_fValue + step ); } else { setValue( m_fValue - step ); } emit valueChanged(this); } void MasterFader::mouseMoveEvent( QMouseEvent *ev ) { if ( m_bIgnoreMouseMove ) { return; } float fVal = (float)( height() - ev->y() ) / (float)height(); fVal = fVal * ( m_fMax - m_fMin ); setValue( fVal ); emit valueChanged(this); } void MasterFader::mouseReleaseEvent(QMouseEvent *ev) { m_bIgnoreMouseMove = false; } void MasterFader::mousePressEvent(QMouseEvent *ev) { if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ControlModifier ) { resetValueToDefault(); m_bIgnoreMouseMove = true; emit valueChanged(this); } else if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ShiftModifier ) { MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); } else { mouseMoveEvent(ev); } } void MasterFader::setValue( float newValue ) { if ( newValue > m_fMax ) { newValue = m_fMax; } else if ( newValue < m_fMin ) { newValue = m_fMin; } if ( m_fValue != newValue) { m_fValue = newValue; update(); } } float MasterFader::getValue() { return m_fValue; } void MasterFader::setDefaultValue( float fDefaultValue ) { if ( fDefaultValue == m_fDefaultValue ) { return; } if ( fDefaultValue < m_fMin ) { fDefaultValue = m_fMin; } else if ( fDefaultValue > m_fMax ) { fDefaultValue = m_fMax; } if ( fDefaultValue != m_fDefaultValue ) { m_fDefaultValue = fDefaultValue; } } void MasterFader::resetValueToDefault() { setValue(m_fDefaultValue); } /// /// Set peak value (0.0 .. 1.0) /// void MasterFader::setPeak_L( float peak ) { if ( peak < 0.01f ) { peak = 0.01f; } else if (peak > 1.0f ) { peak = 1.0f; } if ( m_fPeakValue_L != peak ) { m_fPeakValue_L = peak; update(); } } /// /// Set peak value (0.0 .. 1.0) /// void MasterFader::setPeak_R( float peak ) { if ( peak < 0.01f ) { peak = 0.01f; } else if ( peak > 1.0f ) { peak = 1.0f; } if ( m_fPeakValue_R != peak ) { m_fPeakValue_R = peak; update(); } } void MasterFader::paintEvent( QPaintEvent* ev ) { QPainter painter(this); // background painter.drawPixmap( ev->rect(), m_back, ev->rect() ); // leds float peak_L = m_fPeakValue_L * 190.0; uint offset_L = (uint)( 190.0 - peak_L ); painter.drawPixmap( QRect( 0, offset_L, 9, 190 - offset_L), m_leds, QRect( 0, offset_L, 9, 190 - offset_L) ); float peak_R = m_fPeakValue_R * 190.0; uint offset_R = (uint)( 190.0 - peak_R ); painter.drawPixmap( QRect( 9, offset_R, 9, 190 - offset_R), m_leds, QRect( 9, offset_R, 9, 190 - offset_R) ); if (m_bWithoutKnob == false) { // knob static const uint knob_height = 29; static const uint knob_width = 15; uint knob_y = (uint)( 190.0 - ( 159.0 * ( m_fValue / ( m_fMax - m_fMin ) ) ) ); painter.drawPixmap( QRect( 19, knob_y - knob_height, knob_width, knob_height), m_knob, QRect( 0, 0, knob_width, knob_height ) ); } } void MasterFader::setMin( float fMin ) { m_fMin = fMin; } void MasterFader::setMax( float fMax ) { m_fMax = fMax; } /////////////////// QPixmap* Knob::m_background = nullptr; const char* Knob::__class_name = "Knob"; /// /// Constructor /// Knob::Knob( QWidget* pParent ) : QWidget( pParent ) , Object( __class_name ) { setAttribute(Qt::WA_NoBackground); m_nWidgetWidth = 18; m_nWidgetHeight = 18; m_fValue = 0.0; m_fDefaultValue = 0.0; m_fMousePressValue = 0.0; m_fMousePressY = 0.0; m_bIgnoreMouseMove = false; if ( m_background == nullptr ) { QString sBackground_path = Skin::getImagePath() + "/mixerPanel/knob_images.png"; m_background = new QPixmap(); if ( m_background->load( sBackground_path ) == false ){ ERRORLOG( "Error loading pixmap" ); } } resize( m_nWidgetWidth, m_nWidgetHeight ); } /// /// Destructor /// Knob::~ Knob() { } void Knob::paintEvent( QPaintEvent* ev ) { UNUSED( ev ); QPainter painter(this); int nFrame = (int)(31.0 * m_fValue); int xPos = m_nWidgetWidth * nFrame; // bitBlt(&m_temp, 0, 0, m_background, xPos, 0, m_nWidgetWidth, m_nWidgetHeight, CopyROP); painter.drawPixmap( rect(), *m_background, QRect( xPos, 0, m_nWidgetWidth, m_nWidgetHeight ) ); } void Knob::setValue( float fValue ) { if ( fValue == m_fValue ) { return; } if ( fValue < 0.0 ) { fValue = 0.0; // warningLog( "[setValue] fValue < 0" ); } else if ( fValue > 1.0 ) { fValue = 1.0; // warningLog( "[setValue] fValue > 1" ); } if ( fValue != m_fValue ) { m_fValue = fValue; update(); } } void Knob::setDefaultValue( float fDefaultValue ) { if ( fDefaultValue == m_fDefaultValue ) { return; } if ( fDefaultValue < 0.0 ) { fDefaultValue = 0.0; } else if ( fDefaultValue > 1.0 ) { fDefaultValue = 1.0; } if ( fDefaultValue != m_fDefaultValue ) { m_fDefaultValue = fDefaultValue; } } void Knob::resetValueToDefault() { setValue(m_fDefaultValue); } void Knob::mousePressEvent(QMouseEvent *ev) { if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ControlModifier ) { resetValueToDefault(); m_bIgnoreMouseMove = true; emit valueChanged(this); } else if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ShiftModifier ) { MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); } else { setCursor( QCursor( Qt::SizeVerCursor ) ); m_fMousePressValue = m_fValue; m_fMousePressY = ev->y(); } } void Knob::mouseReleaseEvent( QMouseEvent *ev ) { UNUSED( ev ); setCursor( QCursor( Qt::ArrowCursor ) ); m_bIgnoreMouseMove = false; } void Knob::mouseMoveEvent( QMouseEvent *ev ) { if ( m_bIgnoreMouseMove ) { return; } float y = ev->y() - m_fMousePressY; float fNewValue = m_fMousePressValue - ( y / 100.0 ); setValue( fNewValue ); emit valueChanged(this); } void Knob::wheelEvent ( QWheelEvent *ev ) { ev->accept(); if ( ev->delta() > 0 ) { setValue( m_fValue + 0.025 ); } else { setValue( m_fValue - 0.025 ); } emit valueChanged(this); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/Fader.h000066400000000000000000000112371366722712400207720ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 FADER_H #define FADER_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include "MidiLearnable.h" /// /// Fader and VuMeter widget /// class Fader : public QWidget, public H2Core::Object, public MidiLearnable { H2_OBJECT Q_OBJECT public: Fader(QWidget *pParent, bool bUseIntSteps, bool bWithoutKnob ); ~Fader(); void setMinValue( float fMin ); void setMaxValue( float fMax ); float getMinValue() { return m_fMinValue; } float getMaxValue() { return m_fMaxValue; } void setValue( float fVal ); float getValue(); void setDefaultValue( float fDefaultValue ); float getDefaultValue() { return m_fDefaultValue; } void resetValueToDefault(); void setMaxPeak( float fMax ); void setMinPeak( float fMin ); void setPeak_L( float peak ); float getPeak_L() { return m_fPeakValue_L; } void setPeak_R( float peak ); float getPeak_R() { return m_fPeakValue_R; } virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void wheelEvent( QWheelEvent *ev ); virtual void paintEvent(QPaintEvent *ev); signals: void valueChanged(Fader *ref); protected: bool m_bWithoutKnob; bool m_bUseIntSteps; bool m_bIgnoreMouseMove; float m_fPeakValue_L; float m_fPeakValue_R; float m_fMinPeak; float m_fMaxPeak; float m_fValue; float m_fMinValue; float m_fMaxValue; float m_fDefaultValue; QPixmap m_back; QPixmap m_leds; QPixmap m_knob; }; class VerticalFader : public Fader { Q_OBJECT public: VerticalFader(QWidget *pParent, bool bUseIntSteps, bool bWithoutKnob ); ~VerticalFader(); virtual void paintEvent(QPaintEvent *ev); virtual void mouseMoveEvent(QMouseEvent *ev); }; class MasterFader : public QWidget, public H2Core::Object, public MidiLearnable { H2_OBJECT Q_OBJECT public: MasterFader(QWidget *pParent, bool bWithoutKnob = false); ~MasterFader(); void setMin( float fMin ); void setMax( float fMax ); float getMin() { return m_fMin; } float getMax() { return m_fMax; } void setValue( float newValue ); float getValue(); void setDefaultValue( float fDefaultValue ); float getDefaultValue() { return m_fDefaultValue; } void resetValueToDefault(); void setPeak_L( float peak ); float getPeak_L() { return m_fPeakValue_L; } void setPeak_R( float peak ); float getPeak_R() { return m_fPeakValue_R; } virtual void mousePressEvent( QMouseEvent *ev ); virtual void mouseMoveEvent( QMouseEvent *ev ); virtual void mouseReleaseEvent(QMouseEvent *ev); virtual void paintEvent( QPaintEvent *ev ); virtual void wheelEvent( QWheelEvent *ev ); signals: void valueChanged( MasterFader *ref ); private: bool m_bWithoutKnob; bool m_bIgnoreMouseMove; float m_fPeakValue_L; float m_fPeakValue_R; float m_fValue; float m_fMin; float m_fMax; float m_fDefaultValue; QPixmap m_back; QPixmap m_leds; QPixmap m_knob; }; class Knob : public QWidget, public H2Core::Object, public MidiLearnable { H2_OBJECT Q_OBJECT public: Knob( QWidget* parent ); ~Knob(); void setValue( float fValue ); float getValue() { return m_fValue; } void setDefaultValue( float fDefaultValue ); float getDefaultValue() { return m_fDefaultValue; } void resetValueToDefault(); signals: void valueChanged( Knob *ref ); private: static QPixmap *m_background; bool m_bIgnoreMouseMove; int m_nWidgetWidth; int m_nWidgetHeight; float m_fValue; float m_fDefaultValue; float m_fMousePressValue; float m_fMousePressY; virtual void paintEvent( QPaintEvent *ev ); virtual void mousePressEvent( QMouseEvent *ev ); virtual void mouseReleaseEvent( QMouseEvent *ev ); virtual void mouseMoveEvent( QMouseEvent *ev ); virtual void wheelEvent( QWheelEvent *ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/InfoBar.cpp000066400000000000000000000053711366722712400216260ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2016 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "InfoBar.h" #include #include #include #include #include "../Skin.h" InfoBar::InfoBar( QWidget *parent ) : QWidget( parent ) { setBackgroundColor(); createLayout(); createIcon(); createLabel(); createCloseButton(); } void InfoBar::setBackgroundColor() { QPalette pal = palette(); pal.setColor( QPalette::Window, QColor( 97, 165, 249 ) ); setAutoFillBackground( true ); setPalette( pal ); } void InfoBar::createLayout() { m_pLayout = new QHBoxLayout(); m_pLayout->setContentsMargins( 2, 2, 2, 2 ); setLayout( m_pLayout ); } void InfoBar::createIcon() { QLabel *icon = new QLabel(); icon->setPixmap( QPixmap( Skin::getImagePath() + "/warning.png" ) ); m_pLayout->addWidget( icon ); } void InfoBar::createLabel() { m_pLabel = new QLabel(); m_pLabel->setWordWrap( true ); m_pLayout->addWidget( m_pLabel, 1 ); QFont font = m_pLabel->font(); font.setPointSize( 11 ); m_pLabel->setFont( font ); } void InfoBar::createCloseButton() { QPushButton *close = new QPushButton(); QIcon closeIcon = style()->standardIcon( QStyle::SP_TitleBarCloseButton ); close->setIcon( closeIcon ); close->setFlat( true ); m_pLayout->addWidget( close ); QObject::connect(close, SIGNAL(clicked()), this, SLOT(hide())); } void InfoBar::setTitle(const QString &title) { m_sTitle = title; updateText(); } void InfoBar::setText(const QString &str) { m_sText = str; updateText(); } void InfoBar::updateText() { auto html = QString("%1
%2").arg(m_sTitle).arg(m_sText); m_pLabel->setText(html); } QPushButton *InfoBar::addButton( const QString &label ) { QPushButton *button = new QPushButton(); button->setText( label ); m_pLayout->insertWidget( m_pLayout->count() - 1, button ); m_buttons.push_back(button); return button; } void InfoBar::reset() { m_sTitle = ""; m_sText = ""; updateText(); for (QPushButton *button : m_buttons) { delete button; } m_buttons.clear(); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/InfoBar.h000066400000000000000000000026521366722712400212720ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2016 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 INFOBAR_H #define INFOBAR_H #include #include class QHBoxLayout; class QLabel; class QPushButton; class InfoBar : public QWidget { QHBoxLayout *m_pLayout; QLabel *m_pLabel; QString m_sTitle; QString m_sText; std::vector m_buttons; public: InfoBar(QWidget *parent = Q_NULLPTR); void setTitle(const QString &text); void setText(const QString &text); QPushButton *addButton( const QString &label ); void reset(); private: void setBackgroundColor(); void createLayout(); void createIcon(); void createLabel(); void createCloseButton(); void updateText(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/LCD.cpp000066400000000000000000000225611366722712400207100ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "LCD.h" #include "../Skin.h" #include #if QT_VERSION >= 0x050000 # include #endif #include QPixmap* LCDDigit::m_pSmallBlueFontSet = nullptr; QPixmap* LCDDigit::m_pSmallRedFontSet = nullptr; QPixmap* LCDDigit::m_pLargeGrayFontSet = nullptr; QPixmap* LCDDigit::m_pSmallGrayFontSet = nullptr; const char* LCDDigit::__class_name = "LCDDigit"; LCDDigit::LCDDigit( QWidget * pParent, LCDType type ) : QWidget( pParent ) , Object( __class_name ) , m_type( type ) { setAttribute(Qt::WA_NoBackground); switch ( m_type ) { case SMALL_BLUE: case SMALL_RED: resize( 8, 11 ); break; case LARGE_GRAY: resize( 14, 16 ); break; case SMALL_GRAY: resize( 12, 11 ); break; } setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); // Small blue FontSet image if (m_pSmallBlueFontSet == nullptr ) { QString sSmallBlueFontSet = Skin::getImagePath() + "/lcd/LCDSmallBlueFontSet.png"; m_pSmallBlueFontSet = new QPixmap(); bool ok = m_pSmallBlueFontSet->load( sSmallBlueFontSet ); if( ok == false ) { ERRORLOG( "Error loading pixmap"); } } // Small red FontSet image if (m_pSmallRedFontSet == nullptr ) { QString sSmallRedFontSet = Skin::getImagePath() + "/lcd/LCDSmallRedFontSet.png"; m_pSmallRedFontSet = new QPixmap(); bool ok = m_pSmallRedFontSet->load( sSmallRedFontSet ); if( ok == false ) { ERRORLOG( "Error loading pixmap" ); } } // Large gray FontSet image if (m_pLargeGrayFontSet == nullptr ) { QString sLargeGrayFontSet = Skin::getImagePath() + "/lcd/LCDLargeGrayFontSet.png"; m_pLargeGrayFontSet = new QPixmap(); bool ok = m_pLargeGrayFontSet->load( sLargeGrayFontSet ); if( ok == false ) { ERRORLOG( "Error loading pixmap" ); } } // Small gray FontSet image if (m_pSmallGrayFontSet == nullptr ) { QString sSmallGrayFontSet = Skin::getImagePath() + "/lcd/LCDSmallGrayFontSet.png"; m_pSmallGrayFontSet = new QPixmap(); bool ok = m_pSmallGrayFontSet->load( sSmallGrayFontSet ); if( ok == false ) { ERRORLOG( "Error loading pixmap" ); } } set( ' ' ); } LCDDigit::~LCDDigit() { // delete m_pSmallBlueFontSet; // m_pSmallBlueFontSet = NULL; // delete m_pSmallRedFontSet; // m_pSmallRedFontSet = NULL; } //void LCDDigit::mousePressEvent(QMouseEvent *ev) void LCDDigit::mouseReleaseEvent(QMouseEvent* ev) { UNUSED( ev ); emit digitClicked(); } void LCDDigit::paintEvent(QPaintEvent *ev) { UNUSED( ev ); int x = m_nCol * width(); int y = m_nRow * height(); QPainter painter(this); switch ( m_type ) { case SMALL_BLUE: painter.drawPixmap( rect(), *m_pSmallBlueFontSet, QRect( x, y, width(), height() ) ); break; case SMALL_RED: painter.drawPixmap( rect(), *m_pSmallRedFontSet, QRect( x, y, width(), height() ) ); break; case LARGE_GRAY: painter.drawPixmap( rect(), *m_pLargeGrayFontSet, QRect( x, y, width(), height() ) ); break; case SMALL_GRAY: painter.drawPixmap( rect(), *m_pSmallGrayFontSet, QRect( x, y, width(), height() ) ); break; default: ERRORLOG( "[paint] Unhandled type" ); painter.setPen(Qt::blue); painter.drawText(rect(), Qt::AlignCenter, "!"); } } void LCDDigit::set( char ch ) { int MAXCOL = 66; const char keymap[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ' ', '-', ':', '/', '\\', ',', ';', '.', ' ', ' ', ' ', '#' }; for ( int n = 0; n < 77; n++ ) { //73 if ( keymap[ n ] == ch ) { m_nCol = n % MAXCOL; m_nRow = n / MAXCOL; break; } } update(); } void LCDDigit::setSmallRed() { if ( m_type != SMALL_RED ) { m_type = SMALL_RED; update(); } } void LCDDigit::setSmallBlue() { if ( m_type != SMALL_BLUE ) { m_type = SMALL_BLUE; update(); } } // :::::::::::::::::: const char* LCDDisplay::__class_name = "LCDDisplay"; LCDDisplay::LCDDisplay( QWidget * pParent, LCDDigit::LCDType type, int nDigits, bool leftAlign ) : QWidget( pParent ) , Object( __class_name ) , m_sMsg( "" ) , m_bLeftAlign( leftAlign ) { for ( int n = 0; n < nDigits; n++ ) { LCDDigit *pDigit = new LCDDigit( this, type ); if ( ( type == LCDDigit::LARGE_GRAY ) || ( type == LCDDigit::SMALL_GRAY ) ) { pDigit->move( pDigit->width() * n, 0 ); } else { pDigit->move( pDigit->width() * n + 2, 2 ); } connect( pDigit, SIGNAL( digitClicked() ), this, SLOT( digitClicked() ) ); m_pDisplay.push_back( pDigit ); } if ( ( type == LCDDigit::LARGE_GRAY ) || ( type == LCDDigit::SMALL_GRAY ) ) { int w = m_pDisplay[ 0 ]->width() * nDigits; int h = m_pDisplay[ 0 ]->height(); resize( w, h ); } else { int w = m_pDisplay[ 0 ]->width() * nDigits + 4; int h = m_pDisplay[ 0 ]->height() + 4; resize( w, h ); } setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); setText( " "); QPalette defaultPalette; defaultPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); this->setPalette( defaultPalette ); } LCDDisplay::~LCDDisplay() { // for ( uint i = 0; i < m_pDisplay.size(); i++ ) { // delete m_pDisplay[ i ]; // } } void LCDDisplay::setText( const QString& sMsg ) { if ( sMsg == m_sMsg ) { return; } m_sMsg = sMsg; int nLen = sMsg.length(); if ( m_bLeftAlign ) { for ( int i = 0; i < (int)m_pDisplay.size(); ++i ) { if ( i < nLen ) { m_pDisplay[ i ]->set( sMsg.toLocal8Bit().at(i) ); } else { m_pDisplay[ i ]->set( ' ' ); } } } else { // right aligned int nPadding = 0; if ( nLen < (int)m_pDisplay.size() ) { nPadding = m_pDisplay.size() - nLen; } else { nLen = m_pDisplay.size(); } for ( int i = 0; i < nPadding; i++) { m_pDisplay[ i ]->set( ' ' ); } for ( int i = 0; i < nLen; i++ ) { m_pDisplay[ i + nPadding ]->set( sMsg.toLocal8Bit().at(i) ); } } } void LCDDisplay::setSmallRed() { for ( uint i = 0; i < m_pDisplay.size(); i++) { m_pDisplay[ i ]->setSmallRed(); } } void LCDDisplay::setSmallBlue() { for ( uint i = 0; i < m_pDisplay.size(); i++) { m_pDisplay[ i ]->setSmallBlue(); } } void LCDDisplay::digitClicked() { emit displayClicked( this ); } // ::::::::::::::::::: const char* LCDSpinBox::__class_name = "LCDSpinBox"; // used in PlayerControl LCDSpinBox::LCDSpinBox( QWidget *pParent, int nDigits, LCDSpinBoxType type, int nMin, int nMax ) : QWidget( pParent ) , Object( __class_name ) , m_type( type ) , m_fValue( 0 ) , m_nMinValue( nMin ) , m_nMaxValue( nMax ) { m_pDisplay = new LCDDisplay( this, LCDDigit::LARGE_GRAY, nDigits ); connect( m_pDisplay, SIGNAL( displayClicked(LCDDisplay*) ), this, SLOT( displayClicked(LCDDisplay*) ) ); resize( m_pDisplay->width(), m_pDisplay->height() ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); setValue( 0 ); } LCDSpinBox::~LCDSpinBox() { delete m_pDisplay; // delete m_pUpBtn; // delete m_pDownBtn; } void LCDSpinBox::upBtnClicked() { switch( m_type ) { case INTEGER: if ( m_nMaxValue != -1 && m_fValue < m_nMaxValue ) { setValue( m_fValue + 1); } break; case FLOAT: if ( m_nMaxValue != -1 && m_fValue < (float)m_nMaxValue ) { setValue( m_fValue + 1.0); } break; } emit changed(this); } void LCDSpinBox::downBtnClicked() { switch( m_type ) { case INTEGER: if ( m_nMinValue != -1 && m_fValue > m_nMinValue ) { setValue( m_fValue -1); } break; case FLOAT: if ( m_nMinValue != -1 && m_fValue > m_nMinValue ) { setValue( m_fValue - 1.0); } break; } emit changed(this); } void LCDSpinBox::setValue( float nValue ) { switch ( m_type ) { case INTEGER: if ( nValue != m_fValue ) { m_fValue = (int)nValue; m_pDisplay->setText( QString( "%1" ).arg( m_fValue ) ); } break; case FLOAT: if ( nValue != m_fValue ) { m_fValue = nValue; QString floatString; floatString.setNum( m_fValue , 'f' , 6 ); m_pDisplay->setText( floatString ); } break; } } void LCDSpinBox::displayClicked( LCDDisplay *pRef ) { UNUSED( pRef ); emit spinboxClicked(); } void LCDSpinBox::wheelEvent ( QWheelEvent *ev ) { ev->accept(); if ( ev->delta() > 0 ) { switch( m_type ) { case INTEGER: setValue( m_fValue + 1); break; case FLOAT: setValue( m_fValue + 1.0); break; } emit changed(this); } else { switch( m_type ) { case INTEGER: setValue( m_fValue -1); break; case FLOAT: setValue( m_fValue - 1.0); break; } emit changed(this); } } hydrogen-1.0.0-rc1/src/gui/src/Widgets/LCD.h000066400000000000000000000055161366722712400203560ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LCD_H #define LCD_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include class LCDDigit : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: enum LCDType { SMALL_BLUE, SMALL_RED, LARGE_GRAY, SMALL_GRAY }; LCDDigit( QWidget *pParent, LCDType type ); ~LCDDigit(); void set( char ch ); void setSmallRed(); void setSmallBlue(); signals: void digitClicked(); private: static QPixmap *m_pSmallBlueFontSet; static QPixmap *m_pSmallRedFontSet; static QPixmap *m_pLargeGrayFontSet; static QPixmap *m_pSmallGrayFontSet; int m_nCol; int m_nRow; LCDType m_type; virtual void paintEvent(QPaintEvent *ev); virtual void mouseReleaseEvent(QMouseEvent* ev); }; class LCDDisplay : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: LCDDisplay( QWidget * pParent, LCDDigit::LCDType type, int nDigits, bool leftAlign = false ); ~LCDDisplay(); void setText( const QString& sMsg ); QString getText() { return m_sMsg; } void setSmallRed(); void setSmallBlue(); public slots: void digitClicked(); signals: void displayClicked( LCDDisplay* pRef ); private: std::vector m_pDisplay; QString m_sMsg; bool m_bLeftAlign; }; class LCDSpinBox : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: enum LCDSpinBoxType { INTEGER, FLOAT }; LCDSpinBox( QWidget *pParent, int nDigits, LCDSpinBoxType type, int nMin = -1, int nMax = -1 ); ~LCDSpinBox(); void setValue( float nValue ); float getValue() { return m_fValue; } virtual void wheelEvent( QWheelEvent *ev ); // richiamati da PlayerControl void upBtnClicked(); void downBtnClicked(); signals: void changed(LCDSpinBox *pRef); void spinboxClicked(); public slots: void displayClicked( LCDDisplay *pRef ); private: LCDSpinBoxType m_type; LCDDisplay* m_pDisplay; float m_fValue; int m_nMinValue; int m_nMaxValue; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/LCDCombo.cpp000066400000000000000000000063131366722712400216650ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "LCDCombo.h" #include "../Skin.h" #include "LCD.h" #include "Button.h" #include const char* LCDCombo::__class_name = "LCDCombo"; LCDCombo::LCDCombo( QWidget *pParent, int digits ) : QWidget(pParent) , Object( __class_name ) { INFOLOG( "INIT" ); display = new LCDDisplay( this, LCDDigit::SMALL_BLUE, digits, false ); button = new Button( this, "/patternEditor/btn_dropdown_on.png", "/patternEditor/btn_dropdown_off.png", "/patternEditor/btn_dropdown_over.png", QSize(13, 13) ); pop = new QMenu( this ); size = digits; active = -1; button->move( ( digits * 8 ) + 5, 1 ); setFixedSize( ( digits * 8 ) + 17, display->height() ); connect( button, SIGNAL( clicked( Button* ) ), this, SLOT( onClick( Button* ) ) ); connect( pop, SIGNAL( triggered(QAction*) ), this, SLOT( changeText(QAction*) ) ); } LCDCombo::~LCDCombo() { } void LCDCombo::changeText( QAction* pAction ) { select( actions.indexOf(pAction) ); } void LCDCombo::onClick( Button* ) { pop->popup( display->mapToGlobal( QPoint( 1, display->height() + 2 ) ) ); } bool LCDCombo::addItem( const QString &text ) { //INFOLOG( "add item" ); if ( text.size() <= size ) { actions.append( pop->addAction( text ) ); return true; } else { WARNINGLOG(QString( "'%1' is > %2").arg( text ).arg( size ) ); return false; } } void LCDCombo::addSeparator() { actions.append( pop->addSeparator() ); } void LCDCombo::mousePressEvent( QMouseEvent *ev ) { UNUSED( ev ); pop->popup( display->mapToGlobal( QPoint( 1, display->height() + 2 ) ) ); } void LCDCombo::wheelEvent( QWheelEvent * ev ) { ev->ignore(); const int n = actions.size(); const int d = ( ev->delta() > 0 ) ? -1: 1; int next = ( n + active + d ) % n; if ( actions.at( next )->isSeparator() ) { next = ( n + next + d ) % n; } select( next ); } int LCDCombo::selected() { return active; } bool LCDCombo::select( int idx ) { return select(idx, true); } bool LCDCombo::select( int idx, bool emitValueChanged ) { if (active == idx) { return false; } if (idx < 0 || idx >= actions.size()) { WARNINGLOG(QString("out of index %1 >= %2").arg(idx).arg(actions.size())); return false; } active = idx; display->setText( actions.at( idx )->text() ); if ( emitValueChanged ) { emit valueChanged( idx ); } return true; } hydrogen-1.0.0-rc1/src/gui/src/Widgets/LCDCombo.h000066400000000000000000000032701366722712400213310ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 LCDCOMBO_H #define LCDCOMBO_H #include #if QT_VERSION >= 0x050000 # include #endif #include class Button; class LCDDisplay; class LCDCombo : public QWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: LCDCombo( QWidget *pParent, int digits = 5 ); ~LCDCombo(); bool addItem( const QString &text ); void addSeparator(); int selected(); bool select(int idx ); bool select(int idx, bool emitValueChanged ); private slots: void changeText( QAction* ); void onClick( Button* ); signals: void valueChanged( int idx ); private: QList actions; LCDDisplay *display; Button *button; QMenu *pop; int size; int active; static const QString SEPARATOR; virtual void mousePressEvent( QMouseEvent *ev ); virtual void wheelEvent( QWheelEvent * ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiActivityWidget.cpp000066400000000000000000000053001366722712400240410ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "../Skin.h" #include "../HydrogenApp.h" #include "MidiActivityWidget.h" #include #include #include #include #include const char* MidiActivityWidget::__class_name = "MidiActivityWidget"; MidiActivityWidget::MidiActivityWidget( QWidget * parent ) : QWidget( parent ) , Object( __class_name ) , m_bValue( false ) { setAttribute(Qt::WA_NoBackground); static const uint WIDTH = 58; static const uint HEIGHT = 9; resize( WIDTH, HEIGHT ); setMinimumSize( width(), height() ); setMaximumSize( width(), height() ); // Background image bool ok = m_back.load( Skin::getImagePath() + "/playerControlPanel/midiActivity_back.png" ); if( ok == false ) { ERRORLOG("Error loading pixmap"); } // Leds image ok = m_leds.load( Skin::getImagePath() + "/playerControlPanel/midiActivity_on.png" ); if( ok == false ) { ERRORLOG( "Error loading pixmap" ); } HydrogenApp::get_instance()->addEventListener(this); m_qTimer = new QTimer(this); connect( m_qTimer, SIGNAL( timeout() ), this, SLOT( restoreMidiActivityWidget() ) ); } /** * Destructor */ MidiActivityWidget::~MidiActivityWidget() { } void MidiActivityWidget::mousePressEvent(QMouseEvent *ev) { UNUSED( ev ); } void MidiActivityWidget::paintEvent( QPaintEvent*) { if ( !isVisible() ) { return; } QPainter painter(this); if (m_bValue ) { // bitBlt( this, 0, 0, &m_leds, 0, 0, width(), height(), CopyROP, true); painter.drawPixmap( rect(), m_leds, rect() ); } else { // bitBlt( this, 0, 0, &m_back, 0, 0, width(), height(), CopyROP, true); painter.drawPixmap( rect(), m_back, rect() ); } } void MidiActivityWidget::restoreMidiActivityWidget() { m_bValue = false; update(); m_qTimer->stop(); } void MidiActivityWidget::midiActivityEvent() { m_qTimer->stop(); m_bValue = true; update(); m_qTimer->start( 100 ); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiActivityWidget.h000066400000000000000000000027351366722712400235170ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIDI_ACTIVITY_WIDGET_H #define MIDI_ACTIVITY_WIDGET_H #include #if QT_VERSION >= 0x050000 # include #endif #include "../EventListener.h" #include class MidiActivityWidget : public QWidget, public EventListener, public H2Core::Object { H2_OBJECT Q_OBJECT public: MidiActivityWidget(QWidget * parent); ~MidiActivityWidget(); void mousePressEvent(QMouseEvent *ev); void paintEvent(QPaintEvent *ev); public slots: void restoreMidiActivityWidget(); private: bool m_bValue; QTimer *m_qTimer; QPixmap m_back; QPixmap m_leds; virtual void midiActivityEvent(); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiLearnable.h000066400000000000000000000025021366722712400224340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIDILEARNABLE_H #define MIDILEARNABLE_H #include /* Every widget which supports MidiLearn should derive from this Class. */ class MidiLearnable { public: MidiLearnable(){ m_action = nullptr; } ~MidiLearnable(){ if( m_action != nullptr) delete m_action; } void setAction( Action *action ){ m_action = action; } Action* getAction(){ return m_action; } private: Action *m_action; }; #endif // MIDILEARNABLE_H hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiSenseWidget.cpp000066400000000000000000000071001366722712400233220ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "hydrogen/midi_map.h" #include "MidiSenseWidget.h" #include const char* MidiSenseWidget::__class_name = "MidiSenseWidget"; MidiSenseWidget::MidiSenseWidget(QWidget* pParent, bool directWr, Action* midiAction): QDialog( pParent ) , Object(__class_name) { m_DirectWrite = directWr; m_pAction = midiAction; setWindowTitle( "Waiting.." ); setFixedSize( 280, 100 ); bool midiOperable = false; m_pURLLabel = new QLabel( this ); m_pURLLabel->setAlignment( Qt::AlignCenter ); if(m_pAction != nullptr){ m_pURLLabel->setText( "Waiting for midi input..." ); midiOperable = true; } else { /* * Check if this widget got called from the midiTable in the preferences * window(directWrite=false) or by clicking on a midiLearn-capable gui item(directWrite=true) */ if(m_DirectWrite){ m_pURLLabel->setText( tr("This element is not midi operable.") ); midiOperable = false; } else { m_pURLLabel->setText( tr("Waiting for midi input...") ); midiOperable = true; } } QVBoxLayout* pVBox = new QVBoxLayout( this ); pVBox->addWidget( m_pURLLabel ); setLayout( pVBox ); H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); pEngine->lastMidiEvent = ""; pEngine->lastMidiEventParameter = 0; m_LastMidiEventParameter = 0; m_pUpdateTimer = new QTimer( this ); if(midiOperable) { /* * If the widget is not midi operable, we can omit * starting the timer which listens to midi input.. */ connect( m_pUpdateTimer, SIGNAL( timeout() ), this, SLOT( updateMidi() ) ); m_pUpdateTimer->start( 100 ); } }; MidiSenseWidget::~MidiSenseWidget(){ INFOLOG("DESTROY"); m_pUpdateTimer->stop(); } void MidiSenseWidget::updateMidi(){ H2Core::Hydrogen *pEngine = H2Core::Hydrogen::get_instance(); if( !pEngine->lastMidiEvent.isEmpty() ){ m_sLastMidiEvent = pEngine->lastMidiEvent; m_LastMidiEventParameter = pEngine->lastMidiEventParameter; if( m_DirectWrite ){ //write the action / parameter combination to the midiMap MidiMap *pMidiMap = MidiMap::get_instance(); assert(m_pAction); Action* pAction = new Action( m_pAction->getType() ); pAction->setParameter1( m_pAction->getParameter1() ); if( m_sLastMidiEvent.left(2) == "CC" ){ pMidiMap->registerCCEvent( m_LastMidiEventParameter , pAction ); } else if( m_sLastMidiEvent.left(3) == "MMC" ){ pMidiMap->registerMMCEvent( m_sLastMidiEvent , pAction ); } else if( m_sLastMidiEvent.left(4) == "NOTE" ){ pMidiMap->registerNoteEvent( m_LastMidiEventParameter , pAction ); } else if (m_sLastMidiEvent.left(14) == "PROGRAM_CHANGE" ){ pMidiMap->registerPCEvent( pAction ); } else { /* In all other cases, the midiMap cares for deleting the pointer */ delete pAction; } } close(); } } hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiSenseWidget.h000066400000000000000000000027231366722712400227750ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIDISENSE_WIDGET_H #define MIDISENSE_WIDGET_H #include #if QT_VERSION >= 0x050000 # include #endif #include #include class MidiSenseWidget : public QDialog ,public H2Core::Object { H2_OBJECT Q_OBJECT public: MidiSenseWidget(QWidget*,bool m_DirectWrite = false , Action* m_pAction = nullptr); ~MidiSenseWidget(); QString m_sLastMidiEvent; int m_LastMidiEventParameter; private slots: void updateMidi(); private: QTimer* m_pUpdateTimer; QLabel* m_pURLLabel; Action* m_pAction; bool m_DirectWrite; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiTable.cpp000066400000000000000000000172201366722712400221340ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "../Skin.h" #include "MidiSenseWidget.h" #include "MidiTable.h" #include #include #include #include #include #include const char* MidiTable::__class_name = "MidiTable"; MidiTable::MidiTable( QWidget *pParent ) : QTableWidget( pParent ) , Object( __class_name ) { __row_count = 0; setupMidiTable(); m_pUpdateTimer = new QTimer( this ); currentMidiAutosenseRow = 0; } MidiTable::~MidiTable() { for( int myRow = 0; myRow <= __row_count ; myRow++ ) { delete cellWidget( myRow, 0 ); delete cellWidget( myRow, 1 ); delete cellWidget( myRow, 2 ); delete cellWidget( myRow, 3 ); } } void MidiTable::midiSensePressed( int row ){ currentMidiAutosenseRow = row; MidiSenseWidget midiSenseWidget( this ); midiSenseWidget.exec(); QComboBox * eventCombo = dynamic_cast ( cellWidget( row, 1 ) ); QSpinBox * eventSpinner = dynamic_cast ( cellWidget( row, 2 ) ); eventCombo->setCurrentIndex( eventCombo->findText( midiSenseWidget.m_sLastMidiEvent ) ); eventSpinner->setValue( midiSenseWidget.m_LastMidiEventParameter ); m_pUpdateTimer->start( 100 ); } void MidiTable::updateTable() { if( __row_count > 0 ) { QComboBox * eventCombo = dynamic_cast ( cellWidget( __row_count - 1, 1 ) ); QComboBox * actionCombo = dynamic_cast ( cellWidget( __row_count - 1, 3 ) ); if( eventCombo == nullptr || actionCombo == nullptr) return; if( actionCombo->currentText() != "" && eventCombo->currentText() != "" ) { insertNewRow("", "", 0, 0); } } } void MidiTable::insertNewRow(QString actionString , QString eventString, int eventParameter , int actionParameter) { MidiActionManager *pActionHandler = MidiActionManager::get_instance(); insertRow( __row_count ); int oldRowCount = __row_count; ++__row_count; QPushButton *midiSenseButton = new QPushButton(this); midiSenseButton->setIcon(QIcon(Skin::getImagePath() + "/preferencesDialog/rec.png")); midiSenseButton->setToolTip( tr("press button to record midi event") ); QSignalMapper *signalMapper = new QSignalMapper(this); connect(midiSenseButton, SIGNAL( clicked()), signalMapper, SLOT( map() )); signalMapper->setMapping( midiSenseButton, oldRowCount ); connect( signalMapper, SIGNAL(mapped( int ) ), this, SLOT( midiSensePressed(int) ) ); setCellWidget( oldRowCount, 0, midiSenseButton ); QComboBox *eventBox = new QComboBox(); connect( eventBox , SIGNAL( currentIndexChanged( int ) ) , this , SLOT( updateTable() ) ); eventBox->insertItems( oldRowCount , pActionHandler->getEventList() ); eventBox->setCurrentIndex( eventBox->findText(eventString) ); setCellWidget( oldRowCount, 1, eventBox ); QSpinBox *eventParameterSpinner = new QSpinBox(); setCellWidget( oldRowCount , 2, eventParameterSpinner ); eventParameterSpinner->setMaximum( 999 ); eventParameterSpinner->setValue( eventParameter ); QComboBox *actionBox = new QComboBox(); connect( actionBox , SIGNAL( currentIndexChanged( int ) ) , this , SLOT( updateTable() ) ); actionBox->insertItems( oldRowCount, pActionHandler->getActionList()); actionBox->setCurrentIndex ( actionBox->findText( actionString ) ); setCellWidget( oldRowCount , 3, actionBox ); QSpinBox *actionParameterSpinner = new QSpinBox(); setCellWidget( oldRowCount , 4, actionParameterSpinner ); actionParameterSpinner->setValue( actionParameter); actionParameterSpinner->setMaximum( 999 ); } void MidiTable::setupMidiTable() { MidiMap *pMidiMap = MidiMap::get_instance(); QStringList items; items << "" << tr("Event") << tr("Param.") << tr("Action") << tr("Param.") ; setRowCount( 0 ); setColumnCount( 5 ); verticalHeader()->hide(); setHorizontalHeaderLabels( items ); horizontalHeader()->setStretchLastSection(true); setColumnWidth( 0 , 25 ); setColumnWidth( 1 , 155 ); setColumnWidth( 2, 73 ); setColumnWidth( 3, 175 ); setColumnWidth( 4 , 73 ); bool ok; std::map< QString , Action* > mmcMap = pMidiMap->getMMCMap(); std::map< QString , Action* >::iterator dIter( mmcMap.begin() ); for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ) { Action * pAction = dIter->second; QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); insertNewRow(pAction->getType() , dIter->first , 0 , actionParameterInteger ); } for( int note = 0; note < 128; note++ ) { Action * pAction = pMidiMap->getNoteAction( note ); QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); if ( pAction->getType() == "NOTHING" ){ continue; } insertNewRow(pAction->getType() , "NOTE" , note , actionParameterInteger ); } for( int parameter = 0; parameter < 128; parameter++ ){ Action * pAction = pMidiMap->getCCAction( parameter ); QString actionParameter; int actionParameterInteger = 0; actionParameter = pAction->getParameter1(); actionParameterInteger = actionParameter.toInt(&ok,10); if ( pAction->getType() == "NOTHING" ){ continue; } insertNewRow(pAction->getType() , "CC" , parameter , actionParameterInteger ); } { Action * pAction = pMidiMap->getPCAction(); if ( pAction->getType() != "NOTHING" ) { QString actionParameter = pAction->getParameter1(); int actionParameterInteger = actionParameter.toInt(&ok,10); insertNewRow( pAction->getType() , "PROGRAM_CHANGE" , 0 , actionParameterInteger ); } } insertNewRow( "", "", 0, 0 ); } void MidiTable::saveMidiTable() { MidiMap *mM = MidiMap::get_instance(); for ( int row = 0; row < __row_count; row++ ) { QComboBox * eventCombo = dynamic_cast ( cellWidget( row, 1 ) ); QSpinBox * eventSpinner = dynamic_cast ( cellWidget( row, 2 ) ); QComboBox * actionCombo = dynamic_cast ( cellWidget( row, 3 ) ); QSpinBox * actionSpinner = dynamic_cast ( cellWidget( row, 4 ) ); QString eventString; QString actionString; if( !eventCombo->currentText().isEmpty() && !actionCombo->currentText().isEmpty() ){ eventString = eventCombo->currentText(); actionString = actionCombo->currentText(); Action* pAction = new Action( actionString ); if( actionSpinner->cleanText() != ""){ pAction->setParameter1( actionSpinner->cleanText() ); } if( eventString.left(2) == "CC" ){ mM->registerCCEvent( eventSpinner->cleanText().toInt() , pAction ); } else if( eventString.left(3) == "MMC" ){ mM->registerMMCEvent( eventString , pAction ); } else if( eventString.left(4) == "NOTE" ){ mM->registerNoteEvent( eventSpinner->cleanText().toInt() , pAction ); } else if( eventString.left(14) == "PROGRAM_CHANGE" ){ mM->registerPCEvent( pAction ); } } } } hydrogen-1.0.0-rc1/src/gui/src/Widgets/MidiTable.h000066400000000000000000000026471366722712400216100ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 MIDI_TABLE_H #define MIDI_TABLE_H #include #include #if QT_VERSION >= 0x050000 # include #endif class MidiTable : public QTableWidget, public H2Core::Object { H2_OBJECT Q_OBJECT public: MidiTable( QWidget* pParent ); ~MidiTable(); void setupMidiTable(); void saveMidiTable(); void insertNewRow(QString, QString, int, int); private slots: void updateTable(); void midiSensePressed( int ); private: int __row_count; int currentMidiAutosenseRow; QSignalMapper *signalMapper; QTimer* m_pUpdateTimer; }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/PixmapWidget.cpp000066400000000000000000000050331366722712400227030ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "PixmapWidget.h" #include "../Skin.h" #include #include const char* PixmapWidget::__class_name = "PixmapWidget"; PixmapWidget::PixmapWidget( QWidget *pParent, const char* sClassName ) : Object( __class_name ) , QWidget( pParent ) , m_sPixmapPath( "" ) , __expand_horiz(false) { // draw the background: slower but useful with transparent images! //setAttribute(Qt::WA_NoBackground); __color = QColor(200, 0, 0); } PixmapWidget::~PixmapWidget() { } void PixmapWidget::setColor(const QColor& color) { if (__color == color) { return; } __color = color; update(); } void PixmapWidget::setPixmap( QString sPixmapPath, bool expand_horiz ) { if ( m_sPixmapPath == sPixmapPath ) { return; } m_sPixmapPath = sPixmapPath; __expand_horiz = expand_horiz; bool ok = m_pixmap.load( Skin::getImagePath() + sPixmapPath ); if ( !ok ) { _INFOLOG( QString( "Error loading: %1%2").arg( Skin::getImagePath() ).arg( sPixmapPath ) ); } resize( m_pixmap.width(), m_pixmap.height() ); update(); } void PixmapWidget::paintEvent( QPaintEvent* ev) { QWidget::paintEvent(ev); QPainter painter(this); if ( m_pixmap.isNull() ) { painter.fillRect( ev->rect(), __color ); } else { if (__expand_horiz) { static int w = 10; static int h = m_pixmap.height(); // central section, scaled painter.drawPixmap( QRect(w, 0, width() - w * 2, h), m_pixmap, QRect(10, 0, w, h) ); // left side painter.drawPixmap( QRect(0, 0, w, h), m_pixmap, QRect(0, 0, w, h) ); // right side painter.drawPixmap( QRect(width() - w, 0, w, h), m_pixmap, QRect(m_pixmap.width() - w, 0, w, h) ); } else { painter.drawPixmap( ev->rect(), m_pixmap, ev->rect() ); } } } hydrogen-1.0.0-rc1/src/gui/src/Widgets/PixmapWidget.h000066400000000000000000000026411366722712400223520ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 PIXMAP_WIDGET_H #define PIXMAP_WIDGET_H #include #if QT_VERSION >= 0x050000 # include #endif #include class PixmapWidget : public H2Core::Object, public QWidget { H2_OBJECT public: PixmapWidget( QWidget *pParent, const char* = "PixmapWidget" ); ~PixmapWidget(); void setPixmap( QString sPixmapPath, bool expand_horiz = false ); void setColor( const QColor& color ); protected: QString m_sPixmapPath; QColor __color; QPixmap m_pixmap; bool __expand_horiz; virtual void paintEvent( QPaintEvent* ev); }; #endif hydrogen-1.0.0-rc1/src/gui/src/Widgets/Rotary.cpp000066400000000000000000000152201366722712400215600ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "Rotary.h" #include "LCD.h" #include "../Skin.h" #include RotaryTooltip::RotaryTooltip( QPoint pos ) // : QWidget( 0, "RotaryTooltip", Qt::WStyle_Customize| Qt::WStyle_NoBorder | Qt::WStyle_StaysOnTop| Qt::WX11BypassWM ) : QWidget( nullptr, Qt::ToolTip ) { UNUSED( pos ); m_pDisplay = new LCDDisplay( this, LCDDigit::SMALL_BLUE, 4); m_pDisplay->move( 0, 0 ); resize( m_pDisplay->size() ); QPalette defaultPalette; defaultPalette.setColor( QPalette::Background, QColor( 49, 53, 61 ) ); this->setPalette( defaultPalette ); } void RotaryTooltip::showTip( QPoint pos, QString sText ) { move( pos ); m_pDisplay->setText( sText ); show(); } RotaryTooltip::~RotaryTooltip() { // delete m_pDisplay; } /////////////////// QPixmap* Rotary::m_background_normal = nullptr; QPixmap* Rotary::m_background_center = nullptr; const char* Rotary::__class_name = "Rotary"; Rotary::Rotary( QWidget* parent, RotaryType type, QString sToolTip, bool bUseIntSteps, bool bUseValueTip ) : QWidget( parent ) , Object( __class_name ) , m_bUseIntSteps( bUseIntSteps ) , m_type( type ) , m_fMin( 0.0 ) , m_fMax( 1.0 ) , m_fMousePressValue( 0.0 ) , m_fMousePressY( 0.0 ) , m_bShowValueToolTip( bUseValueTip ) , m_bIgnoreMouseMove( false ) { setAttribute(Qt::WA_NoBackground); setToolTip( sToolTip ); m_pValueToolTip = new RotaryTooltip( mapToGlobal( QPoint( 0, 0 ) ) ); m_nWidgetWidth = 28; m_nWidgetHeight = 26; if (bUseIntSteps) { m_fDefaultValue = (int) ( type == TYPE_CENTER ? ( ( m_fMax - m_fMin ) / 2.0 ) : m_fMin ); } else { m_fDefaultValue = ( type == TYPE_CENTER ? ( ( m_fMax - m_fMin ) / 2.0 ) : m_fMin ); } m_fValue = m_fDefaultValue; if ( m_background_normal == nullptr ) { m_background_normal = new QPixmap(); if ( m_background_normal->load( Skin::getImagePath() + "/mixerPanel/rotary_images.png" ) == false ){ ERRORLOG( "Error loading pixmap" ); } } if ( m_background_center == nullptr ) { m_background_center = new QPixmap(); if ( m_background_center->load( Skin::getImagePath() + "/mixerPanel/rotary_center_images.png" ) == false ){ ERRORLOG( "Error loading pixmap" ); } } resize( m_nWidgetWidth, m_nWidgetHeight ); // m_temp.resize( m_nWidgetWidth, m_nWidgetHeight ); } Rotary::~ Rotary() { delete m_pValueToolTip; } void Rotary::paintEvent( QPaintEvent* ev ) { UNUSED( ev ); QPainter painter(this); float fRange = fabs( m_fMax ) + fabs( m_fMin ); float fValue = fabs( m_fMin ) + m_fValue; int nFrame; if ( m_bUseIntSteps ) { nFrame = (int)( 63.0 * ( (int)fValue / fRange ) ); } else { nFrame = (int)( 63.0 * ( fValue / fRange ) ); } // INFOLOG( "\nrange: " + toString( fRange ) ); // INFOLOG( "norm value: " + toString( fValue ) ); // INFOLOG( "frame: " + toString( nFrame ) ); if ( m_type == TYPE_NORMAL ) { int xPos = m_nWidgetWidth * nFrame; painter.drawPixmap( rect(), *m_background_normal, QRect( xPos, 0, m_nWidgetWidth, m_nWidgetHeight ) ); } else { // the image is broken... if ( nFrame > 62 ) { nFrame = 62; } int xPos = m_nWidgetWidth * nFrame; painter.drawPixmap( rect(), *m_background_center, QRect( xPos, 0, m_nWidgetWidth, m_nWidgetHeight ) ); } } void Rotary::setValue( float fValue ) { if ( fValue == m_fValue ) { return; } if ( fValue < m_fMin ) { fValue = m_fMin; } else if ( fValue > m_fMax ) { fValue = m_fMax; } if ( fValue != m_fValue ) { m_fValue = fValue; update(); } } void Rotary::mousePressEvent(QMouseEvent *ev) { if (ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ControlModifier) { resetValueToDefault(); m_bIgnoreMouseMove = true; emit valueChanged(this); } else if ( ev->button() == Qt::LeftButton && ev->modifiers() == Qt::ShiftModifier ) { MidiSenseWidget midiSense( this, true, this->getAction() ); midiSense.exec(); } else { setCursor( QCursor( Qt::SizeVerCursor ) ); m_fMousePressValue = m_fValue; m_fMousePressY = ev->y(); } if ( m_bShowValueToolTip ) { char tmp[20]; sprintf( tmp, "%#.2f", m_fValue ); m_pValueToolTip->showTip( mapToGlobal( QPoint( -38, 1 ) ), QString( tmp ) ); } } void Rotary::mouseReleaseEvent( QMouseEvent *ev ) { UNUSED( ev ); setCursor( QCursor( Qt::ArrowCursor ) ); m_pValueToolTip->hide(); m_bIgnoreMouseMove = false; } void Rotary::wheelEvent ( QWheelEvent *ev ) { ev->accept(); float stepfactor = 5.0; // course adjustment float delta = 1.0; // Control Modifier = fine adjustment if (ev->modifiers() == Qt::ControlModifier) { stepfactor = 1.0; } if ( !m_bUseIntSteps ) { float fRange = fabs( m_fMax ) + fabs( m_fMin ); delta = fRange / 100.0; } if ( ev->delta() < 0 ) { delta = delta * -1.0; } setValue( getValue() + (delta * stepfactor) ); emit valueChanged(this); } void Rotary::mouseMoveEvent( QMouseEvent *ev ) { if ( m_bIgnoreMouseMove ) { return; } float fRange = fabs( m_fMax ) + fabs( m_fMin ); float deltaY = ev->y() - m_fMousePressY; float fNewValue = ( m_fMousePressValue - ( deltaY / 100.0 * fRange ) ); setValue( fNewValue ); emit valueChanged(this); if ( m_bShowValueToolTip ) { char tmp[20]; sprintf( tmp, "%#.2f", m_fValue ); m_pValueToolTip->showTip( mapToGlobal( QPoint( -38, 1 ) ), QString( tmp ) ); } } void Rotary::setMin( float fMin ) { m_fMin = fMin; update(); } float Rotary::getMin() { return m_fMin; } void Rotary::setMax( float fMax ) { m_fMax = fMax; update(); } float Rotary::getMax() { return m_fMax; } void Rotary::setDefaultValue( float fDefaultValue ) { if ( fDefaultValue == m_fDefaultValue ) { return; } if ( fDefaultValue < m_fMin ) { fDefaultValue = m_fMin; } else if ( fDefaultValue > m_fMax ) { fDefaultValue = m_fMax; } if ( fDefaultValue != m_fDefaultValue ) { m_fDefaultValue = fDefaultValue; } } float Rotary::getDefaultValue() { return m_fDefaultValue; } void Rotary::resetValueToDefault() { setValue(m_fDefaultValue); } hydrogen-1.0.0-rc1/src/gui/src/Widgets/Rotary.h000066400000000000000000000050511366722712400212260ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ROTARY_H #define ROTARY_H #include "MidiLearnable.h" #include "MidiSenseWidget.h" #include #if QT_VERSION >= 0x050000 # include #endif class LCDDisplay; #include class RotaryTooltip : public QWidget { public: RotaryTooltip( QPoint pos ); ~RotaryTooltip(); void showTip( QPoint pos, QString sText ); private: LCDDisplay *m_pDisplay; }; class Rotary : public QWidget, public H2Core::Object, public MidiLearnable { H2_OBJECT Q_OBJECT public: enum RotaryType { TYPE_NORMAL, TYPE_CENTER }; Rotary( QWidget* parent, RotaryType type, QString sToolTip, bool bUseIntSteps, bool bUseValueTip ); ~Rotary(); void setMin( float fMin ); float getMin(); void setMax( float fMax ); float getMax(); void setValue( float fValue ); float getValue() { if ( m_bUseIntSteps ) { int val = (int)m_fValue; return val; } else return m_fValue; } void setDefaultValue( float fDefaultValue ); float getDefaultValue(); void resetValueToDefault(); signals: void valueChanged(Rotary *ref); private: bool m_bUseIntSteps; bool m_bIgnoreMouseMove; RotaryType m_type; static QPixmap* m_background_normal; static QPixmap* m_background_center; int m_nWidgetWidth; int m_nWidgetHeight; float m_fMin; float m_fMax; float m_fValue; float m_fDefaultValue; float m_fMousePressValue; float m_fMousePressY; RotaryTooltip *m_pValueToolTip; bool m_bShowValueToolTip; virtual void paintEvent(QPaintEvent *ev); virtual void mousePressEvent(QMouseEvent *ev); virtual void mouseReleaseEvent( QMouseEvent *ev ); virtual void mouseMoveEvent(QMouseEvent *ev); virtual void wheelEvent( QWheelEvent *ev ); }; #endif hydrogen-1.0.0-rc1/src/gui/src/about_dialog.ui000066400000000000000000003203141366722712400211610ustar00rootroot00000000000000 AboutDialog_UI 0 0 549 441 About Hydrogen 10 410 531 32 Qt::Horizontal 211 20 100 0 &OK Alt+O Qt::Horizontal 211 20 10 10 531 100 Qt::AlignVCenter 10 120 531 281 0 A&bout 10 10 511 240 QFrame::Box QFrame::Sunken ### Qt::RichText Qt::AlignTop &Authors 10 10 511 241 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> &License 10 10 511 241 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">This program is distributed under the terms of the GPL v2.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 675 Mass Ave, Cambridge, MA 02139, USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">modification follow.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> the Program is not required to print an announcement.)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">compelled to copy the source along with the object code.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 5. You are not required to accept this License, since you have not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">signed it. However, nothing else grants you permission to modify or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute the Program or its derivative works. These actions are</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">prohibited by law if you do not accept this License. Therefore, by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">modifying or distributing the Program (or any work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Program), you indicate your acceptance of this License to do so, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">all its terms and conditions for copying, distributing or modifying</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the Program or works based on it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 6. Each time you redistribute the Program (or any work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Program), the recipient automatically receives a license from the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">original licensor to copy, distribute or modify the Program subject to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">these terms and conditions. You may not impose any further</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">restrictions on the recipients' exercise of the rights granted herein.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">You are not responsible for enforcing compliance by third parties to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 7. If, as a consequence of a court judgment or allegation of patent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">infringement or for any other reason (not limited to patent issues),</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">conditions are imposed on you (whether by court order, agreement or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">otherwise) that contradict the conditions of this License, they do not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">excuse you from the conditions of this License. If you cannot</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">distribute so as to satisfy simultaneously your obligations under this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">License and any other pertinent obligations, then as a consequence you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">may not distribute the Program at all. For example, if a patent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">license would not permit royalty-free redistribution of the Program by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">all those who receive copies directly or indirectly through you, then</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the only way you could satisfy both it and this License would be to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">refrain entirely from distribution of the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">If any portion of this section is held invalid or unenforceable under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">any particular circumstance, the balance of the section is intended to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">apply and the section as a whole is intended to apply in other</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">circumstances.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">It is not the purpose of this section to induce you to infringe any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">patents or other property right claims or to contest validity of any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">such claims; this section has the sole purpose of protecting the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">integrity of the free software distribution system, which is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">implemented by public license practices. Many people have made</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">generous contributions to the wide range of software distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">through that system in reliance on consistent application of that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">system; it is up to the author/donor to decide if he or she is willing</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">to distribute software through any other system and a licensee cannot</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">impose that choice.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">This section is intended to make thoroughly clear what is believed to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">be a consequence of the rest of this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 8. If the distribution and/or use of the Program is restricted in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">certain countries either by patents or by copyrighted interfaces, the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">original copyright holder who places the Program under this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">may add an explicit geographical distribution limitation excluding</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">those countries, so that distribution is permitted only in or among</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">countries not thus excluded. In such case, this License incorporates</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the limitation as if written in the body of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 9. The Free Software Foundation may publish revised and/or new versions</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">of the General Public License from time to time. Such new versions will</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">be similar in spirit to the present version, but may differ in detail to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">address new problems or concerns.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Each version is given a distinguishing version number. If the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">specifies a version number of this License which applies to it and &quot;any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">later version&quot;, you have the option of following the terms and conditions</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">either of that version or of any later version published by the Free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Software Foundation. If the Program does not specify a version number of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">this License, you may choose any version ever published by the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Foundation.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 10. If you wish to incorporate parts of the Program into other free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">programs whose distribution conditions are different, write to the author</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">to ask for permission. For software which is copyrighted by the Free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Software Foundation, write to the Free Software Foundation; we sometimes</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">make exceptions for this. Our decision will be guided by the two goals</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">of preserving the free status of all derivatives of our free software and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">of promoting the sharing and reuse of software generally.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> NO WARRANTY</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">REPAIR OR CORRECTION.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">POSSIBILITY OF SUCH DAMAGES.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> END OF TERMS AND CONDITIONS</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> How to Apply These Terms to Your New Programs</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> If you develop a new program, and you want it to be of the greatest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">possible use to the public, the best way to achieve this is to make it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">free software which everyone can redistribute and change under these terms.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> To do so, attach the following notices to the program. It is safest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">to attach them to the start of each source file to most effectively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">convey the exclusion of warranty; and each file should have at least</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> &lt;one line to give the program's name and a brief idea of what it does.&gt;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Copyright (C) 19yy &lt;name of author&gt;</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> This program is free software; you can redistribute it and/or modify</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> it under the terms of the GNU General Public License as published by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> the Free Software Foundation; either version 2 of the License, or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> (at your option) any later version.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> This program is distributed in the hope that it will be useful,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> GNU General Public License for more details.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> You should have received a copy of the GNU General Public License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> along with this program; if not, write to the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Also add information on how to contact you by electronic and paper mail.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">If the program is interactive, make it output a short notice like this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">when it starts in an interactive mode:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Gnomovision version 69, Copyright (C) 19yy name of author</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> This is free software, and you are welcome to redistribute it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> under certain conditions; type `show c' for details.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">The hypothetical commands `show w' and `show c' should show the appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">parts of the General Public License. Of course, the commands you use may</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">be called something other than `show w' and `show c'; they could even be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">mouse-clicks or menu items--whatever suits your program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">You should also get your employer (if you work as a programmer) or your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">school, if any, to sign a &quot;copyright disclaimer&quot; for the program, if</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">necessary. Here is a sample; alter the names:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Yoyodyne, Inc., hereby disclaims all copyright interest in the program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> `Gnomovision' (which makes passes at compilers) written by James Hacker.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> &lt;signature of Ty Coon&gt;, 1 April 1989</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"> Ty Coon, President of Vice</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; color:#ffffff;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">This General Public License does not permit incorporating your program into</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">proprietary programs. If your program is a subroutine library, you may</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">consider it more useful to permit linking proprietary applications with the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">library. If this is what you want to do, use the GNU Library General</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; color:#ffffff;">Public License instead of this License.</span></p></body></html> hydrogen-1.0.0-rc1/src/gui/src/main.cpp000066400000000000000000000336701366722712400176270ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #if QT_VERSION >= 0x050000 # include #endif #include #include #include #include #include "SplashScreen.h" #include "HydrogenApp.h" #include "MainForm.h" #include "PlaylistEditor/PlaylistDialog.h" #include "Skin.h" #ifdef H2CORE_HAVE_LASH #include #endif #ifdef H2CORE_HAVE_JACKSESSION #include #endif #include #include #include #include #include #include #include #include #include #include #include // // Set the palette used in the application // void setPalette( QApplication *pQApp ) { // create the default palette QPalette defaultPalette; // A general background color. defaultPalette.setColor( QPalette::Background, QColor( 58, 62, 72 ) ); // A general foreground color. defaultPalette.setColor( QPalette::Foreground, QColor( 255, 255, 255 ) ); // Used as the background color for text entry widgets; usually white or another light color. defaultPalette.setColor( QPalette::Base, QColor( 88, 94, 112 ) ); // Used as the alternate background color in views with alternating row colors defaultPalette.setColor( QPalette::AlternateBase, QColor( 138, 144, 162 ) ); // The foreground color used with Base. This is usually the same as the Foreground, in which case it must provide good contrast with Background and Base. defaultPalette.setColor( QPalette::Text, QColor( 255, 255, 255 ) ); // The general button background color. This background can be different from Background as some styles require a different background color for buttons. defaultPalette.setColor( QPalette::Button, QColor( 88, 94, 112 ) ); // A foreground color used with the Button color. defaultPalette.setColor( QPalette::ButtonText, QColor( 255, 255, 255 ) ); // Lighter than Button color. defaultPalette.setColor( QPalette::Light, QColor( 138, 144, 162 ) ); // Between Button and Light. defaultPalette.setColor( QPalette::Midlight, QColor( 128, 134, 152 ) ); // Darker than Button. defaultPalette.setColor( QPalette::Dark, QColor( 58, 62, 72 ) ); // Between Button and Dark. defaultPalette.setColor( QPalette::Mid, QColor( 81, 86, 99 ) ); // A very dark color. By default, the shadow color is Qt::black. defaultPalette.setColor( QPalette::Shadow, QColor( 255, 255, 255 ) ); // A color to indicate a selected item or the current item. defaultPalette.setColor( QPalette::Highlight, QColor( 116, 124, 149 ) ); // A text color that contrasts with Highlight. defaultPalette.setColor( QPalette::HighlightedText, QColor( 255, 255, 255 ) ); pQApp->setPalette( defaultPalette ); pQApp->setStyleSheet("QToolTip {padding: 1px; border: 1px solid rgb(199, 202, 204); background-color: rgb(227, 243, 252); color: rgb(64, 64, 66);}"); } static int setup_unix_signal_handlers() { #ifndef WIN32 struct sigaction usr1; usr1.sa_handler = MainForm::usr1SignalHandler; sigemptyset(&usr1.sa_mask); usr1.sa_flags = 0; usr1.sa_flags |= SA_RESTART; if (sigaction(SIGUSR1, &usr1, nullptr) > 0) { return 1; } return 0; #endif } static void setApplicationIcon(QApplication *app) { QIcon icon; icon.addFile(Skin::getImagePath() + "/icon16.png", QSize(16, 16)); icon.addFile(Skin::getImagePath() + "/icon24.png", QSize(24, 24)); icon.addFile(Skin::getImagePath() + "/icon32.png", QSize(32, 32)); icon.addFile(Skin::getImagePath() + "/icon48.png", QSize(48, 48)); icon.addFile(Skin::getImagePath() + "/icon64.png", QSize(64, 64)); app->setWindowIcon(icon); } int main(int argc, char *argv[]) { try { #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QApplication* pQApp = new QApplication( argc, argv ); pQApp->setApplicationName( "Hydrogen" ); pQApp->setApplicationVersion( QString::fromStdString( H2Core::get_version() ) ); QCommandLineParser parser; QString aboutText = QString( "\nHydrogen " ) + QString::fromStdString( H2Core::get_version() ) + QString( " [" ) + QString::fromStdString( __DATE__ ) + QString( "] [http://www.hydrogen-music.org]" ) + QString( "\nCopyright 2002-2008 Alessandro Cominu\nCopyright 2008-2020 The hydrogen development team" ) + QString( "\nHydrogen comes with ABSOLUTELY NO WARRANTY\nThis is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details.\n" ); parser.setApplicationDescription( aboutText ); QCommandLineOption audioDriverOption( QStringList() << "d" << "driver", "Use the selected audio driver (jack, alsa, oss)", "Audiodriver"); QCommandLineOption installDrumkitOption( QStringList() << "i" << "install", "Install a drumkit (*.h2drumkit)" , "File"); QCommandLineOption noSplashScreenOption( QStringList() << "n" << "nosplash", "Hide splash screen" ); QCommandLineOption playlistFileNameOption( QStringList() << "p" << "playlist", "Load a playlist (*.h2playlist) at startup", "File" ); QCommandLineOption systemDataPathOption( QStringList() << "P" << "data", "Use an alternate system data path", "Path" ); QCommandLineOption songFileOption( QStringList() << "s" << "song", "Load a song (*.h2song) at startup", "File" ); QCommandLineOption kitOption( QStringList() << "k" << "kit", "Load a drumkit at startup", "DrumkitName" ); QCommandLineOption verboseOption( QStringList() << "V" << "verbose", "Level, if present, may be None, Error, Warning, Info, Debug or 0xHHHH","Level"); parser.addHelpOption(); parser.addVersionOption(); parser.addOption( audioDriverOption ); parser.addOption( installDrumkitOption ); parser.addOption( noSplashScreenOption ); parser.addOption( playlistFileNameOption ); parser.addOption( systemDataPathOption ); parser.addOption( songFileOption ); parser.addOption( kitOption ); parser.addOption( verboseOption ); //Conditional options #ifdef H2CORE_HAVE_JACKSESSION QCommandLineOption jackSessionOption(QStringList() << "S" << "jacksessionid", "ID - Start a JackSessionHandler session"); parser.addOption(jackSessionOption); #endif // Evaluate the options parser.process(*pQApp); QString sSelectedDriver = parser.value( audioDriverOption ); QString sDrumkitName = parser.value( installDrumkitOption ); bool bNoSplash = parser.isSet( noSplashScreenOption ); QString sPlaylistFilename = parser.value( playlistFileNameOption ); QString sSysDataPath = parser.value( systemDataPathOption ); QString sSongFilename = parser.value ( songFileOption ); QString sDrumkitToLoad = parser.value( kitOption ); QString sVerbosityString = parser.value( verboseOption ); unsigned logLevelOpt = H2Core::Logger::Error; if( parser.isSet(verboseOption) ){ if( !sVerbosityString.isEmpty() ) { logLevelOpt = H2Core::Logger::parse_log_level( sVerbosityString.toLocal8Bit() ); } else { logLevelOpt = H2Core::Logger::Error|H2Core::Logger::Warning; } } #ifdef H2CORE_HAVE_JACKSESSION QString sessionId; #endif std::cout << aboutText.toStdString(); setup_unix_signal_handlers(); // Man your battle stations... this is not a drill. H2Core::Logger::create_instance(); H2Core::Logger::set_bit_mask( logLevelOpt ); H2Core::Logger* pLogger = H2Core::Logger::get_instance(); H2Core::Object::bootstrap( pLogger, pLogger->should_log(H2Core::Logger::Debug) ); if( sSysDataPath.length() == 0 ) { H2Core::Filesystem::bootstrap( pLogger ); } else { H2Core::Filesystem::bootstrap( pLogger, sSysDataPath ); } MidiMap::create_instance(); H2Core::Preferences::create_instance(); // See below for H2Core::Hydrogen. ___INFOLOG( QString("Using QT version ") + QString( qVersion() ) ); ___INFOLOG( "Using data path: " + H2Core::Filesystem::sys_data_path() ); H2Core::Preferences *pPref = H2Core::Preferences::get_instance(); pPref->setH2ProcessName( QString(argv[0]) ); #ifdef H2CORE_HAVE_LASH LashClient::create_instance("hydrogen", "Hydrogen", &argc, &argv); LashClient* pLashClient = LashClient::get_instance(); #endif if( ! sDrumkitName.isEmpty() ){ H2Core::Drumkit::install( sDrumkitName ); exit(0); } if (sSelectedDriver == "auto") { pPref->m_sAudioDriver = "Auto"; } else if (sSelectedDriver == "jack") { pPref->m_sAudioDriver = "Jack"; } else if ( sSelectedDriver == "oss" ) { pPref->m_sAudioDriver = "Oss"; } else if ( sSelectedDriver == "alsa" ) { pPref->m_sAudioDriver = "Alsa"; } QString family = pPref->getApplicationFontFamily(); pQApp->setFont( QFont( family, pPref->getApplicationFontPointSize() ) ); QTranslator qttor( nullptr ); QTranslator tor( nullptr ); QLocale locale = QLocale::system(); if ( locale != QLocale::c() ) { if (qttor.load( locale, QString( "qt" ), QString( "_" ), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { pQApp->installTranslator( &qttor ); } else { ___INFOLOG( QString("Warning: No Qt translation for locale %1 found.").arg(locale.name())); } QString sTranslationPath = H2Core::Filesystem::i18n_dir(); QString sTranslationFile( "hydrogen" ); bool bTransOk = tor.load( locale, sTranslationFile, QString( "_" ), sTranslationPath ); if (bTransOk) { ___INFOLOG( "Using locale: " + sTranslationPath ); } else { ___INFOLOG( "Warning: no locale found: " + sTranslationPath ); } if (tor.isEmpty()) { ___INFOLOG( "Warning: error loading locale: " + sTranslationPath ); } } pQApp->installTranslator( &tor ); QString sStyle = pPref->getQTStyle(); if ( !sStyle.isEmpty() ) { pQApp->setStyle( sStyle ); } setPalette( pQApp ); setApplicationIcon(pQApp); SplashScreen *pSplash = new SplashScreen(); if (bNoSplash) { pSplash->hide(); } else { pSplash->show(); } #ifdef H2CORE_HAVE_LASH if ( H2Core::Preferences::get_instance()->useLash() ){ if (pLashClient->isConnected()) { lash_event_t* lash_event = pLashClient->getNextEvent(); if (lash_event && lash_event_get_type(lash_event) == LASH_Restore_File) { // notify client that this project was not a new one pLashClient->setNewProject(false); sSongFilename = ""; sSongFilename.append( QString::fromLocal8Bit(lash_event_get_string(lash_event)) ); sSongFilename.append("/hydrogen.h2song"); //H2Core::Logger::get_instance()->log("[LASH] Restore file: " + sSongFilename); lash_event_destroy(lash_event); } else if (lash_event) { //H2Core::Logger::get_instance()->log("[LASH] ERROR: Instead of restore file got event: " + lash_event_get_type(lash_event)); lash_event_destroy(lash_event); } } } #endif #ifdef H2CORE_HAVE_JACKSESSION if(!sessionId.isEmpty()){ pPref->setJackSessionUUID( sessionId ); /* * imo, jack sessions use jack as default audio driver. * hydrogen remember last used audiodriver. * here we make it save that hydrogen start in a jacksession case * every time with jack as audio driver */ pPref->m_sAudioDriver = "Jack"; } /* * the use of applicationFilePath() make it * possible to use different executables. * for example if you start hydrogen from a local * build directory. */ QString path = pQApp->applicationFilePath(); pPref->setJackSessionApplicationPath( path ); #endif // Hydrogen here to honor all preferences. H2Core::Hydrogen::create_instance(); // Tell Hydrogen it was started via the QT5 GUI. H2Core::Hydrogen::get_instance()->setActiveGUI( true ); #ifdef H2CORE_HAVE_OSC H2Core::Hydrogen::get_instance()->startNsmClient(); QString NsmSongFilename = pPref->getNsmSongName(); if(!NsmSongFilename.isEmpty()) { sSongFilename = NsmSongFilename; } #endif MainForm *pMainForm = new MainForm( pQApp, sSongFilename ); pMainForm->show(); pSplash->finish( pMainForm ); if( ! sPlaylistFilename.isEmpty() ){ bool loadlist = HydrogenApp::get_instance()->getPlayListDialog()->loadListByFileName( sPlaylistFilename ); if ( loadlist ){ H2Core::Playlist::get_instance()->setNextSongByNumber( 0 ); } else { ___ERRORLOG ( "Error loading the playlist" ); } } if( ! sDrumkitToLoad.isEmpty() ) { H2Core::Drumkit* pDrumkitInfo = H2Core::Drumkit::load_by_name( sDrumkitToLoad, true ); if ( pDrumkitInfo ) { H2Core::Hydrogen::get_instance()->loadDrumkit( pDrumkitInfo ); HydrogenApp::get_instance()->onDrumkitLoad( pDrumkitInfo->get_name() ); } else { ___ERRORLOG ( "Error loading the drumkit" ); } } pQApp->exec(); delete pSplash; delete pMainForm; delete pQApp; delete pPref; delete H2Core::EventQueue::get_instance(); delete H2Core::AudioEngine::get_instance(); delete MidiMap::get_instance(); delete MidiActionManager::get_instance(); ___INFOLOG( "Quitting..." ); std::cout << "\nBye..." << endl; delete H2Core::Logger::get_instance(); if (H2Core::Object::count_active()) { H2Core::Object::write_objects_map_to_cerr(); } } catch ( const H2Core::H2Exception& ex ) { std::cerr << "[main] Exception: " << ex.what() << std::endl; } catch (...) { std::cerr << "[main] Unknown exception X-(" << std::endl; } return 0; } hydrogen-1.0.0-rc1/src/gui/src/precompiled.h000066400000000000000000000011651366722712400206450ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include // STL #include #include #include #include // QT #include #if QT_VERSION >= 0x050000 # include #endif #include #include #include #include #include #include #include #include #include // STL #include #include #include #include // QT #include #include hydrogen-1.0.0-rc1/src/player/000077500000000000000000000000001366722712400161075ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/player/CMakeLists.txt000066400000000000000000000011001366722712400206370ustar00rootroot00000000000000 FILE(GLOB_RECURSE h2player_SRCS *.cpp) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/core/include # core headers ${CMAKE_BINARY_DIR}/src/core/include # generated config.h ${QT_INCLUDES} ) ADD_EXECUTABLE(h2player WIN32 MACOSX_BUNDLE ${h2player_SRCS} ) SET_PROPERTY(TARGET h2player PROPERTY CXX_STANDARD 14) TARGET_LINK_LIBRARIES(h2player hydrogen-core-${VERSION} Qt5::Widgets ) ADD_DEPENDENCIES(h2player hydrogen-core-${VERSION}) INSTALL(TARGETS h2player RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}) hydrogen-1.0.0-rc1/src/player/main.cpp000066400000000000000000000067121366722712400175450ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net] * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include #include using std::cout; using std::endl; #include void usage() { cout << "Usage: hydrogenPlayer song.h2song" << endl; exit(1); } int main(int argc, char** argv){ unsigned logLevelOpt = H2Core::Logger::Error; H2Core::Logger::create_instance(); H2Core::Logger::set_bit_mask( logLevelOpt ); H2Core::Logger* logger = H2Core::Logger::get_instance(); H2Core::Object::bootstrap( logger, logger->should_log(H2Core::Logger::Debug) ); QCoreApplication a(argc, argv); H2Core::Filesystem::bootstrap( logger ); if (argc != 2) { usage(); } cout << "Hydrogen player starting..." << endl << endl; QString filename = argv[1]; MidiMap::create_instance(); H2Core::Preferences::create_instance(); H2Core::Hydrogen::create_instance(); H2Core::Preferences *preferences = H2Core::Preferences::get_instance(); H2Core::Song *pSong = H2Core::Song::load( filename ); if (pSong == nullptr) { cout << "Error loading song!" << endl; exit(2); } H2Core::Hydrogen *hydrogen = H2Core::Hydrogen::get_instance(); hydrogen->setSong(pSong); cout << "Press b for rewind from beginning" << endl; cout << "Press p for play" << endl; cout << "Press s for stop" << endl; cout << "Press q for quit" << endl; cout << "f = show frames" << endl; char pippo; while (true) { pippo = getchar(); switch( pippo ) { case 'q': cout << endl << "HydrogenPlayer shutdown..." << endl; hydrogen->sequencer_stop(); delete hydrogen; delete pSong; delete H2Core::EventQueue::get_instance(); delete H2Core::AudioEngine::get_instance(); delete preferences; delete H2Core::Logger::get_instance(); std::cout << std::endl << std::endl << H2Core::Object::objects_count() << " alive objects" << std::endl << std::endl; H2Core::Object::write_objects_map_to_cerr(); exit(0); break; case 'p': hydrogen->sequencer_play(); break; case 's': hydrogen->sequencer_stop(); break; case 'b': hydrogen->setPatternPos( 0 ); break; case 'f': cout << "Frames = " << hydrogen->getTotalFrames() << endl; break; case 'd': cout << "DEBUG" << endl; H2Core::Object::write_objects_map_to_cerr(); int nObj = H2Core::Object::objects_count(); std::cout << std::endl << std::endl << nObj << " alive objects" << std::endl << std::endl; break; } } } hydrogen-1.0.0-rc1/src/tests/000077500000000000000000000000001366722712400157555ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/CMakeLists.txt000066400000000000000000000011571366722712400205210ustar00rootroot00000000000000CMAKE_MINIMUM_REQUIRED(VERSION 2.6) add_definitions() include_directories( ${CMAKE_SOURCE_DIR}/src/core/include # core headers ${CMAKE_BINARY_DIR}/src/core/include # generated config.h ${QT_INCLUDES} # TODO be able to remove this ${CPPUNIT_INCLUDE_DIRS} ) FILE(GLOB_RECURSE TESTS_SRCS *.cpp) link_directories() add_executable(tests ${TESTS_SRCS}) SET_PROPERTY(TARGET tests PROPERTY CXX_STANDARD 14) target_link_libraries(tests hydrogen-core-${VERSION} ${CPPUNIT_LIBRARIES} Qt5::Core Qt5::Test ) add_dependencies(tests hydrogen-core-${VERSION}) hydrogen-1.0.0-rc1/src/tests/adsr_test.cpp000066400000000000000000000030321366722712400204470ustar00rootroot00000000000000#include "adsr_test.h" #include #include CPPUNIT_TEST_SUITE_REGISTRATION( ADSRTest ); using namespace H2Core; const double delta = 0.00001; void ADSRTest::setUp() { m_adsr = new ADSR( 1.0, 2.0, 0.8, 256.0 ); } void ADSRTest::tearDown() { delete m_adsr; } void ADSRTest::testAttack() { m_adsr->attack(); /* Attack */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, m_adsr->get_value( 0.5 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.774681627750397, m_adsr->get_value( 0.5 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, m_adsr->get_value( 0.1 ), delta ); /* Decay */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, m_adsr->get_value( 1.0 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.830416560173035, m_adsr->get_value( 1.0 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.8, m_adsr->get_value( 1.0 ), delta ); /* Sustain */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.8, m_adsr->get_value( 4.0 ), delta ); } void ADSRTest::testRelease() { m_adsr->get_value( 1.1 ); // move past Attack m_adsr->get_value( 2.1 ); // move past Decay m_adsr->get_value( 0.1 ); // calculate and store sustain /* Release note, and check if it was on sustain value */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.8, m_adsr->release(), delta ); /* Release */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.8, m_adsr->get_value( 128.0 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.121666193008423, m_adsr->get_value( 128.0 ), delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, m_adsr->get_value( 128.0 ), delta ); /* Idle */ CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, m_adsr->get_value( 2.0 ), delta ); } hydrogen-1.0.0-rc1/src/tests/adsr_test.h000066400000000000000000000006611366722712400201210ustar00rootroot00000000000000#ifndef ADSR_TEST_H #define ADSR_TEST_H #include namespace H2Core { class ADSR; }; class ADSRTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( ADSRTest ); CPPUNIT_TEST( testAttack ); CPPUNIT_TEST( testRelease ); CPPUNIT_TEST_SUITE_END(); private: H2Core::ADSR* m_adsr; public: virtual void setUp(); virtual void tearDown(); void testAttack(); void testRelease(); }; #endif hydrogen-1.0.0-rc1/src/tests/assertions/000077500000000000000000000000001366722712400201475ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/assertions/audiofile.cpp000066400000000000000000000055571366722712400226300ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2018 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "audiofile.h" #include #include static constexpr qint64 BUFFER_SIZE = 4096; void H2Test::checkAudioFilesEqual(const QString &expected, const QString &actual, CppUnit::SourceLine sourceLine) { SF_INFO info1 = {0}; std::unique_ptr f1{ sf_open( expected.toLocal8Bit().data(), SFM_READ, &info1), sf_close }; if ( f1 == nullptr ) { CppUnit::Message msg( "Can't open reference file", sf_strerror( nullptr ) ); throw CppUnit::Exception(msg, sourceLine); } SF_INFO info2 = {0}; std::unique_ptr f2{ sf_open( actual.toLocal8Bit().data(), SFM_READ, &info2), sf_close }; if ( f2 == nullptr ) { CppUnit::Message msg( "Can't open results file", sf_strerror( nullptr ) ); throw CppUnit::Exception(msg, sourceLine); } if ( info1.frames != info2.frames ) { CppUnit::Message msg( "Number of samples different", std::string("Expected: ") + expected.toStdString(), std::string("Actual : ") + actual.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } auto remainingSamples = info1.frames * info1.channels; auto offset = 0LL; while ( remainingSamples > 0 ) { short buf1[ BUFFER_SIZE ]; short buf2[ BUFFER_SIZE ]; auto toRead = qMin( remainingSamples, (sf_count_t)BUFFER_SIZE ); auto read1 = sf_read_short( f1.get(), buf1, toRead); if ( read1 != toRead ) throw CppUnit::Exception( CppUnit::Message( "Short read or read error" ), sourceLine ); auto read2= sf_read_short( f2.get(), buf2, toRead); if ( read2 != toRead ) throw CppUnit::Exception( CppUnit::Message( "Short read or read error" ), sourceLine ); for ( sf_count_t i = 0; i < toRead; ++i ) { if ( buf1[i] != buf2[i] ) { auto diffLocation = offset + i + 1; CppUnit::Message msg( std::string("Files differ at sample ") + std::to_string(diffLocation), std::string("Expected: ") + expected.toStdString(), std::string("Actual : ") + actual.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } } offset += read1; remainingSamples -= read1; } } hydrogen-1.0.0-rc1/src/tests/assertions/audiofile.h000066400000000000000000000024051366722712400222620ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2018 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ASSERTIONS_AUDIOFILE_H #define ASSERTIONS_AUDIOFILE_H #include #include namespace H2Test { void checkAudioFilesEqual(const QString &expected, const QString &actual, CppUnit::SourceLine sourceLine); } /** * \brief Assert that two files' contents are the same **/ #define H2TEST_ASSERT_AUDIO_FILES_EQUAL(expected, actual) \ H2Test::checkAudioFilesEqual(expected, actual, CPPUNIT_SOURCELINE()) #endif hydrogen-1.0.0-rc1/src/tests/assertions/file.cpp000066400000000000000000000051741366722712400216010ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2018 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 "file.h" #include static constexpr qint64 BUFFER_SIZE = 4096; void H2Test::checkFilesEqual(const QString &expected, const QString &actual, CppUnit::SourceLine sourceLine) { QFile f1(expected); QFile f2(actual); if (! f1.open(QIODevice::ReadOnly)) { CppUnit::Message msg( std::string("Can't open reference file: ") + f1.errorString().toStdString(), std::string("Expected: ") + expected.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } if (! f2.open(QIODevice::ReadOnly)) { CppUnit::Message msg( std::string("Can't open result file: ") + f2.errorString().toStdString(), std::string("Actual : ") + actual.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } if ( f1.size() != f2.size() ) { CppUnit::Message msg( "File size differ", std::string("Expected: ") + expected.toStdString(), std::string("Actual : ") + actual.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } auto remaining = f1.size(); qint64 offset = 0; while ( remaining > 0 ) { char buf1[BUFFER_SIZE]; char buf2[BUFFER_SIZE]; qint64 toRead = qMin( remaining, (qint64)BUFFER_SIZE ); auto r1 = f1.read( buf1, toRead ); if ( r1 != toRead ) throw CppUnit::Exception( CppUnit::Message( "Short read or read error" ), sourceLine ); auto r2 = f2.read( buf2, toRead ); if ( r2 != toRead ) throw CppUnit::Exception( CppUnit::Message( "Short read or read error" ), sourceLine ); for (int i = 0; i < r1; i++) { if ( buf1[i] != buf2[i] ) { auto diffLocation = offset + i + 1; CppUnit::Message msg( std::string("Files differ at byte ") + std::to_string(diffLocation), std::string("Expected: ") + expected.toStdString(), std::string("Actual : ") + actual.toStdString() ); throw CppUnit::Exception(msg, sourceLine); } } offset += r1; remaining -= r1; } } hydrogen-1.0.0-rc1/src/tests/assertions/file.h000066400000000000000000000023521366722712400212410ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2018 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ASSERTIONS_FILE_H #define ASSERTIONS_FILE_H #include #include namespace H2Test { void checkFilesEqual(const QString &expected, const QString &actual, CppUnit::SourceLine sourceLine); } /** * \brief Assert that two files' contents are the same **/ #define H2TEST_ASSERT_FILES_EQUAL(expected, actual) \ H2Test::checkFilesEqual(expected, actual, CPPUNIT_SOURCELINE()) #endif hydrogen-1.0.0-rc1/src/tests/automation_path_serializer_test.cpp000066400000000000000000000056561366722712400251610ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; class AutomationPathSerializerTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(AutomationPathSerializerTest); CPPUNIT_TEST(testRead); CPPUNIT_TEST(testWrite); CPPUNIT_TEST(testRoundtripReadWrite); CPPUNIT_TEST_SUITE_END(); public: void testRead() { QDomDocument doc; QString xml = ""; CPPUNIT_ASSERT(doc.setContent(xml, false)); AutomationPath path(-10, 10, 0); AutomationPathSerializer reader; reader.read_automation_path(doc.documentElement(), path); AutomationPath expect(-10, 10, 0); expect.add_point(2, 4); expect.add_point(4, -2); CPPUNIT_ASSERT_EQUAL(expect, path); CPPUNIT_ASSERT_EQUAL(4.0f, path.get_value(2.0f)); CPPUNIT_ASSERT_EQUAL(-2.0f, path.get_value(4.0f)); } void testWrite() { AutomationPath path(-1, 1, 0); path.add_point(0.0f, 0.0f); path.add_point(1.0f, 1.0f); path.add_point(2.0f, 0.0f); path.add_point(3.0f,-1.0f); AutomationPathSerializer writer; QDomDocument doc; QDomElement node = doc.createElement("path"); doc.appendChild(node); writer.write_automation_path(node, path); QDomDocument expect; QString expect_xml = ""; CPPUNIT_ASSERT(expect.setContent(expect_xml, false)); /* This test may be fragile */ CPPUNIT_ASSERT_EQUAL( expect.toString(0).toStdString(), doc.toString(0).toStdString() ); } void testRoundtripReadWrite() { AutomationPath p1(0, 10, 0); p1.add_point(0.0f, 4.0f); p1.add_point(1.0f, 8.0f); p1.add_point(3.0f, 6.0f); QDomDocument doc; QDomElement node = doc.createElement("path"); doc.appendChild(node); AutomationPathSerializer serializer; serializer.write_automation_path(node, p1); AutomationPath p2(0, 10, 0); serializer.read_automation_path(node, p2); CPPUNIT_ASSERT_EQUAL(p1, p2); } }; CPPUNIT_TEST_SUITE_REGISTRATION( AutomationPathSerializerTest ); hydrogen-1.0.0-rc1/src/tests/automation_path_test.cpp000066400000000000000000000161341366722712400227210ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2015-2016 by Przemysław Sitek * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 using namespace H2Core; namespace CppUnit { template<> struct assertion_traits > { static bool equal(const std::pair &lhs, const std::pair &rhs) { return lhs == rhs; } static std::string toString(const std::pair &p) { std::stringstream o; o << "(" << p.first << "," << p.second << ")"; return o.str(); } }; } class AutomationPathTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(AutomationPathTest); CPPUNIT_TEST(testConstruction); CPPUNIT_TEST(testEmptyPath); CPPUNIT_TEST(testOnePoint); CPPUNIT_TEST(testValueBeforeFirstPoint); CPPUNIT_TEST(testValueAfterLastPoint); CPPUNIT_TEST(testMidpointValue); CPPUNIT_TEST(testEmptyPathsEqual); CPPUNIT_TEST(testPathsEqual); CPPUNIT_TEST(testEmptyPathsNotEqual); CPPUNIT_TEST(testPathsNotEqual); CPPUNIT_TEST(testIterator); CPPUNIT_TEST(testFindPointInEmptyPath); CPPUNIT_TEST(testFindPoint); CPPUNIT_TEST(testFindNotFound); CPPUNIT_TEST(testMovePoint); CPPUNIT_TEST(testRemovePoint); CPPUNIT_TEST_SUITE_END(); const double delta = 0.0001; public: /* Test whether AutomationPaths are constructed correctly */ void testConstruction() { AutomationPath p(0.2f, 0.8f, 0.6f); CPPUNIT_ASSERT(p.empty()); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.2, static_cast(p.get_min()), delta); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.8, static_cast(p.get_max()), delta); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.6, static_cast(p.get_default()), delta); } /* Empty automation path should always return default value */ void testEmptyPath() { AutomationPath p1(0.0f, 1.0f, 0.0f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, static_cast(p1.get_value(0.0f)), delta); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, static_cast(p1.get_value(2.0f)), delta); AutomationPath p2(0.0f, 1.0f, 0.3f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.3, static_cast(p2.get_value(0.0f)), delta); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.3, static_cast(p2.get_value(5.0f)), delta); AutomationPath p3(0.0f, 1.0f, 1.0f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, static_cast(p3.get_value(0.0f)), delta); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, static_cast(p3.get_value(7.0f)), delta); } /* Test getting value of an anchor point */ void testOnePoint() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(1.0f, 0.5f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, static_cast(p.get_value(1.0f)), delta); } /* Test getting value before first point, i.e if returned value is defined by first point */ void testValueBeforeFirstPoint() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(1.0f, 0.5f); p.add_point(2.0f, 0.7f); CPPUNIT_ASSERT(! p.empty()); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, static_cast(p.get_value(0.0f)), delta); } /* Test whether value past the last point is defined by that value */ void testValueAfterLastPoint() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(1.0f, 0.4f); p.add_point(2.0f, 0.6f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.6, static_cast(p.get_value(3.0f)), delta); } /* Test getting value between two anchor points */ void testMidpointValue() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(1.0f, 0.2f); p.add_point(2.0f, 0.4f); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.3, static_cast(p.get_value(1.5f)), delta); } /* Test operator== and operator!= */ void testEmptyPathsEqual() { AutomationPath p1(-2.0f, 2.0f, 1.0f); AutomationPath p2(-2.0f, 2.0f, 1.0f); CPPUNIT_ASSERT(p1 == p2); CPPUNIT_ASSERT(!(p1 != p2)); } void testPathsEqual() { AutomationPath p1(-4.0f, 3.0f, 1.5f); p1.add_point(1.0f, 0.0f); p1.add_point(2.0f, 2.0f); AutomationPath p2(-4.0f, 3.0f, 1.5f); p2.add_point(1.0f, 0.0f); p2.add_point(2.0f, 2.0f); CPPUNIT_ASSERT(p1 == p2); CPPUNIT_ASSERT(!(p1 != p2)); } void testEmptyPathsNotEqual() { AutomationPath p1(-2.0f, 2.0f, 1.0f); AutomationPath p2(-1.0f, 1.0f, 0.0f); CPPUNIT_ASSERT(p1 != p2); CPPUNIT_ASSERT(!(p1 == p2)); } void testPathsNotEqual() { AutomationPath p1(-2.0f, 2.0f, 1.0f); p1.add_point(1.0f, 0.0f); AutomationPath p2(-2.0f, 2.0f, 1.0f); p2.add_point(2.0f, 2.0f); CPPUNIT_ASSERT(p1 != p2); CPPUNIT_ASSERT(!(p1 == p2)); } void testIterator() { typedef std::pair pair; AutomationPath p(0.0f, 4.0f, 1.0f); p.add_point(0.0f, 0.0f); p.add_point(1.0f, 2.0f); p.add_point(2.0f, 4.0f); auto i = p.begin(); CPPUNIT_ASSERT(i != p.end()); CPPUNIT_ASSERT_EQUAL(pair(0.0f,0.0f), *i); i++; CPPUNIT_ASSERT(i != p.end()); CPPUNIT_ASSERT_EQUAL(pair(1.0f,2.0f), *i); i++; CPPUNIT_ASSERT(i != p.end()); CPPUNIT_ASSERT_EQUAL(pair(2.0f,4.0f), *i); i++; CPPUNIT_ASSERT(i == p.end()); } void testFindPointInEmptyPath() { AutomationPath p(0.0f, 1.0f, 1.0f); auto iter = p.find(0.0f); CPPUNIT_ASSERT(iter == p.end()); auto iter2 = p.find(22.0f); CPPUNIT_ASSERT(iter2 == p.end()); } void testFindPoint() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(4.0f, 0.5f); auto iter = p.find(4.0f); CPPUNIT_ASSERT(iter == p.begin()); auto iter2 = p.find(4.4f); CPPUNIT_ASSERT(iter2 == p.begin()); auto iter3 = p.find(3.6f); CPPUNIT_ASSERT(iter3 == p.begin()); } void testFindNotFound() { AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(2.0f, 0.2f); auto iter = p.find(1.3f); CPPUNIT_ASSERT(iter == p.end()); auto iter2 = p.find(2.6f); CPPUNIT_ASSERT(iter2 == p.end()); } void testMovePoint() { typedef std::pair pair; AutomationPath p(0.0f, 1.0f, 1.0f); p.add_point(5.0f, 0.5f); auto in = p.begin(); auto out = p.move(in, 6.0f, 1.0f); CPPUNIT_ASSERT(out == p.begin()); CPPUNIT_ASSERT_EQUAL( pair(6.0f, 1.0f), *out ); } void testRemovePoint() { AutomationPath p(1.0f, 1.0f, 1.0f); p.add_point(0.0f, 0.0f); p.remove_point(0.0f); CPPUNIT_ASSERT(p.empty()); CPPUNIT_ASSERT(p.find(0.0f) == p.end()); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, static_cast(p.get_value(0.0f)), delta); } }; CPPUNIT_TEST_SUITE_REGISTRATION( AutomationPathTest ); hydrogen-1.0.0-rc1/src/tests/core_action_controller_test.cpp000066400000000000000000000077011366722712400242550ustar00rootroot00000000000000#include "core_action_controller_test.h" #include using namespace H2Core; void CoreActionControllerTest::setUp() { m_pHydrogen = Hydrogen::get_instance(); m_pController = m_pHydrogen->getCoreActionController(); m_pHydrogen->setSong( Song::get_empty_song() ); } void CoreActionControllerTest::tearDown() { m_pHydrogen->setSong( Song::get_empty_song() ); if ( QFile::exists( m_sFileName ) ) { QFile::remove( m_sFileName ); } if ( QFile::exists( m_sFileName2 ) ) { QFile::remove( m_sFileName2 ); } // The improper file name must not be used to create a file. CPPUNIT_ASSERT( !QFile::exists( m_sFileNameImproper ) ); } void CoreActionControllerTest::testSessionManagement() { // --------------------------------------------------------------- // Test CoreActionController::newSong() // --------------------------------------------------------------- // Attempting to create a new song with an improper file name. QTemporaryFile fileWrongName; if ( fileWrongName.open() ) { CPPUNIT_ASSERT( !m_pController->newSong( fileWrongName.fileName() ) ); m_sFileNameImproper = fileWrongName.fileName(); } // Create a new song with a proper file name and existing and // writable file. m_sFileName = QString( "%1.h2song" ).arg( m_sFileNameImproper ); QFile fileProperName( m_sFileName ); if ( fileProperName.open( QIODevice::ReadWrite ) ) { CPPUNIT_ASSERT( m_pController->newSong( fileProperName.fileName() ) ); CPPUNIT_ASSERT( m_sFileName == m_pHydrogen->getSong()->get_filename() ); // ----------------------------------------------------------- // Test CoreActionController::saveSong() // ----------------------------------------------------------- CPPUNIT_ASSERT( m_pController->saveSong() ); // ----------------------------------------------------------- } // Create a new song with proper a file name but no existing file. m_sFileName2 = QString( "%1_new.h2song" ).arg( m_sFileNameImproper ); CPPUNIT_ASSERT( m_pController->newSong( m_sFileName2 ) ); CPPUNIT_ASSERT( m_sFileName2 == m_pHydrogen->getSong()->get_filename() ); // --------------------------------------------------------------- // Test CoreActionController::openSong() // --------------------------------------------------------------- // Attempt to load a non-existing song. CPPUNIT_ASSERT( !m_pController->openSong( m_sFileNameImproper ) ); // The previous action should have not affected the current song. CPPUNIT_ASSERT( m_sFileName2 == m_pHydrogen->getSong()->get_filename() ); // Load the first song (which was saved). CPPUNIT_ASSERT( m_pController->openSong( m_sFileName ) ); CPPUNIT_ASSERT( m_sFileName == m_pHydrogen->getSong()->get_filename() ); // Attempt to load the second song. This will fail since Hydrogen // did not stored the song to disk. CPPUNIT_ASSERT( !m_pController->openSong( m_sFileName2 ) ); // --------------------------------------------------------------- // Test CoreActionController::saveSongAs() // --------------------------------------------------------------- // But we can, instead, make a copy of the current song by saving // it to m_sFileName2. CPPUNIT_ASSERT( m_pController->saveSongAs( m_sFileName2 ) ); // Check if everything worked out. CPPUNIT_ASSERT( m_pController->openSong( m_sFileName ) ); CPPUNIT_ASSERT( m_sFileName == m_pHydrogen->getSong()->get_filename() ); CPPUNIT_ASSERT( m_pController->openSong( m_sFileName2 ) ); CPPUNIT_ASSERT( m_sFileName2 == m_pHydrogen->getSong()->get_filename() ); // --------------------------------------------------------------- CPPUNIT_ASSERT( fileProperName.remove() ); } void CoreActionControllerTest::testIsSongPathValid() { // Is not absolute. CPPUNIT_ASSERT( !m_pController->isSongPathValid( "test.h2song" ) ); // Improper suffix. CPPUNIT_ASSERT( !m_pController->isSongPathValid( "test.test" ) ); QString sValidPath = QString( "%1/test.h2song" ).arg( QDir::tempPath() ); CPPUNIT_ASSERT( m_pController->isSongPathValid( sValidPath ) ); } hydrogen-1.0.0-rc1/src/tests/core_action_controller_test.h000066400000000000000000000021071366722712400237150ustar00rootroot00000000000000#include #include #include #include class CoreActionControllerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( CoreActionControllerTest ); CPPUNIT_TEST( testSessionManagement ); CPPUNIT_TEST( testIsSongPathValid ); CPPUNIT_TEST_SUITE_END(); private: H2Core::Hydrogen* m_pHydrogen; H2Core::CoreActionController* m_pController; QString m_sFileNameImproper; QString m_sFileName; QString m_sFileName2; public: // Initializes the private member variables and loads an empty // song into Hydrogen. void setUp(); // Loads an empty song into Hydrogen and deletes all temporary // files. void tearDown(); // Tests the CoreActionController::newSong(), // CoreActionController::openSong(), // CoreActionController::saveSong() // CoreActionController::saveSongAs() methods. void testSessionManagement(); // Tests CoreActionController::isSongPathValid() void testIsSongPathValid(); }; CPPUNIT_TEST_SUITE_REGISTRATION( CoreActionControllerTest ); hydrogen-1.0.0-rc1/src/tests/data/000077500000000000000000000000001366722712400166665ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/drumkits/000077500000000000000000000000001366722712400205305ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/000077500000000000000000000000001366722712400221125ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/crash.wav000066400000000000000000020300541366722712400237350ustar00rootroot00000000000000RIFF$0WAVEfmt Ddata0p-y2|nJ!orpU4B7e dTY^wKpJ[pi+nyah:XMb!l ;{ |G!z[k{* koPiG#)7w5mD !R UmcV0HH3 yqv;\+]~*7f`V<!UWL0U-h SVC"->A2*C|%>l.Cyx9xUQ>J=Snm(swf.Lt _5Ch<8(#m7A]Z"K5gV a7U&k]cuC2T3au,{c&8Hb{T'; v= 8II8A!#qPS 4ukGZ [ /* {b @ Z|A@z6}<"n~4jp<#}{I&+CBRrf/HKy59   xg XiE;} *H;caxiUuX7Y(4W?zn.=+f[]PB~_jT kx /5.[  cI *Q ]: S X 3'N  ' y'x>[N -^]OyJW*/t)E!RQxb9U7 dB1- [J 2nH0|%4.,[LB^9 0S)v'-(Bk{na@  b_60(6YKr3>Z2<FHfb&._o V234bp&+#7Z):EuS [;W(s=KNY "u?Xc#/PG  dS5[$aLy'g"0?v!ze?'o?'MHU rwIdF34 4v@v#,isqoLU)+Ow'='lJ>v9ow:@y-zPP9N7!J k`,;#}jZ|>U+"T 7zM?34k*kYsJS.}*g( fgP\GOXL<A9K%K%B^`#iVY0S UM_5+Hk[/0QU0R(FSa0kd UE?DFE8t*mUNYACUYy?  ;BX? /T{mtx@ / dOfF8)&4UC?w`>Z8#@hS$=1_"/ g"dL3  [ >L}7/AFqu  D  ?&f6]P \k],\l22. o #`/N5SDInp  5/xp;GK  ^7k [EoSj!Bx hYiyy Ye  e83Z` Bx+_6 :t/j+&6=]F2y"&3 ef5[Q@x="Foh\ _#)CFB<]gFmt O `g7WR4q W& =]v\N]:86et(C: %Om1 h2Li|G(}r%^ >B'B B7|,Gp/WFP F f&  t # i2 U' ]N.W(6 ! sD  +:Ph0<<J 5i"h]%faH_?\ > VUxD UCXk0\B hu"0u^<>K| Q"RUa,We?^-P, PJ8FE:&PAsfhRV*  U:en=7eW:Ea _#+f}W8"9jR'~UUz $ h2A*x!  Tv*E/~v%aJfDj dN> [7%9qw $BH<`Wrn%G-\Vdtumq o&3_nc<{]1  )Ii; EN_dw )k^t c +rS Lb;wHec;=` }  #/ g\` %7PUHd/f)HJsTe +n+ T@HSF6G ? 19M*]Uh 1V2J*~ ns?fC&<Q0UEs(|.r 7 ?v CCU^ > ~u f> ' Hdg xp x '"X uG *f34> )E  *|\aE)a^1 b{VcbJ{D0Y>^C-G=q9n8Tx@E0]m,Qu{<sK Nv% jRj*H 6 1Tw=zlshXFu 3 W2~OLXk%TX?]~t3 uO+U]5sb=w }G=   |V5997zTlo/wad&\WXIOFo 'ZK^}i/>r(2yYR.OsA}36*  _l] NBb8 '9xX? ,P'D ^cZMZ: cV^}8 "~^ENNa   Cv*hyxahm% ppE d?n"Z6DNqjg GBDTbd>t3x%pu[>^XG)+h?MZ{b6 N !wF]-8 DT  ?|AII+!&W(X tn?]AL/Q#'giHvOWi-4{ Bs .z7|U| Ou iR`LI]4>6X`5zOiJsh"JYS_7'MH >Xia=>"|mU#c?"&wq axv)*J^ OLUP$w*Z*> L iO]$ F'.RAhwa*?^pf?hYIz e3 --u!A|Oax 4tcHx AKM(dA0 CkBC3f!$Xp8IE~+w#4 HG;x Wsr)3aQq9.TrISiyN8)5X5xS}VGz8Dz  3 7Hy.0*Xz[CSW\(B V:Z4_d"2?6B`z3c Z$* U,19M*)2U S' A8z,#Ocuj]QO|]1qg9&L0s,Y TvfIT9UQU>"]:g]"_u b 4C_/v w' (&Dg_ 2  _ErB&&tCp|N=!vD NeS&& :b6Lz5q-Z0*:`+Kk: `  GT; dTlp}5o D?2*>bVWP*Rc(++Hj|kTu$k\OB5 JFNut-O#a\S y#5$e[qg'Rj.$ 6~k2AVSd,] e~x D)%BQ6 X;1-p8T0&;pyGv O mCj[Ik _WS"3B\%*UrjfvI{F)rtjIk:_jTNx)N= p]MK~,3b QV;HCuxoh@'t72<-[. +zLeFF?'8vg{,wF``e?|\ q vp1I$R\\~}{D z vi/BroOTM!QtW+X[ul ' & 7dHFr[z"OI5SFrSvpaL& ;Jcf0>mMYGafQ-X1w;I=zd!QPXriy.rB xXJZEI(>:"r+)@l#~$U$g%S.p{   pQ] usiRzF#V_j\b;k:VieIzK|ezG topLWO$-r8 RJqV+IDLh4!hsT M, soii 26HL(C~ vvp7Gh2!QkwP= G [A&{x(8f@s||"wCD_?6M"O4}4\D]/K[> ^fVFd^.c)bX xjE'7 !hK)/>OvT'MN@ $f}Rq&r}F o[d5cTuCJq'hv Re{'1LB8| w 6Hpt]LSXUZO=EIQ4 RD nMRIU9N_1lX * $ gm!I]ZnS%_TR>que89H1LRunb g2U>mi\vo7eWI{${AN_mxS^K: rz~}5QlxjWhK$MO)cT+tJT  -${E!&"l Xx=i\(SSm| f.Wh"{Wn(p Em1(1z i1'oF 2"Bna0DHIBb_XMVl^b>;}G ?JH~UnVG+ JP(!L sZa<`hD|^ W*8C#u5=(j!\RHE#jVJ ?g3E>^V{Lj?B ELwuu4bGQ]])1 o+yw ]M M}p )_*# qNw = @Ko4 q~FcwETTVC2vnqIPn W%HKp#~@u3K.s wqmwxh=+5>pL  Oj (: _4aelFrKIf~R\kPMDcVMg< q_&T2Cn 8GP~\1gu.lnR^H* e,A*_ I`to<Rh Z7 *-u %48J? !$O-0Fk E(2DcmNyj$]rqH}- }T! 84'7)bK^^(dt|];s >RkOJG { C~r;Mu:dakd>EsCye.:&4=d",t)'YBB;& W=\bIZ"3M,g29\Gj,z-lRRL 8MHs`~M'n]:4NB 'bAjy:T';(n)e@:N\O;}DvGBwglN}yTmZ3 f^4 0[zRr[;b MJ c ckscLU=EDuV6 H jZ'[e+dl-e'k[7aSL Kb7 =zBl~_PI+," h>BG^{~] Y#EfWt } t$;X}b xm{>yJTn wjbPdzX K, ;K 2:ZUhK| p+vmqF5$]}5j*O VI~7_Mztj(Tz Sx4)ewX5eL:F'D`l 5T! Akn () @08bc'v[7F^ wCK_  !s4CPLw<F<8/QTHQNHDz&c@&9,\x"K3TS" ` oL^@);Q%MU/us/2 6JOx M]vm0y1yr[4qu(mzm#K6\~ k}.*gy`I17KRBj.6=Le  qN UAx(KO?gGIV.OHrlRw2f-4 (W1[c~KX-%9xDZc /"?- ;_nEwHqy#d06H !F5H@)EJ<)C {t56;(wUQs /qsyv%UBx<)bz  \_GUn5xh;A.3Z{2gw;RJd +Pf<dNz< ^/_)^?cOv`_7wkG={FRWM-|{, g89nEL'Rxaw? W{ik#"K9srHU 6eJF`(_wy!q 1d0UU 5/aIb6C_r ;`Cy9d%   f"oBvl;u@q";ul5)F 4"/)-sSA!?;1] |~1; Mq"z)vhP/|dGGL+o1$YQBl@O#{vqn.2TJn&Xz/Stpdg}n{ z(dFz# :Blpfn:OxgY~ .-:!m1<)Lw_ G;  1+_A/C5 -G"1dT!gm)BZ DNPA#XBgdh$ $1 ) (t K,2FO1)Y)iY =$KDXW$RBU~sw8(uw9kKt)Bw U]h>yVx:s+<# j w6)^CWzFrY@&!w% 8P  I0Oh>@t<  ~bV xvI>  <|92b/t@ l0;QiT^LV^#'LEdt*D|:,aY74h($"PY<mlw|!%c9y!cN b?wka>N|okaG E%ic&vRiD+:?{0<~M- bE"U<.b?t 5vB*' |MM}E gd3g)I" qzy~,By O OOs e \"U)Uq-7~i1 u |VOd;lLjwKSNe@>\R{7w]%fN1']H>y^-b^NEB"}cv|CLlv y:y lKBo{B"UFZNQ-z&@ krF?k?OH5-Q[VE 1jQ .D|  =~JTtu7 3!pi6{(FZbFJ )3XIfo1{ O>MDrK1 [H]H D BN]@z48Pd+4t7-z;.9 Uf>k }>]$D24$u0R]7e(S_oa<3Y4LcnC,))4?\0ERHRj0j5u"?"WmB<)s=Ym`~IkC,E|T]OUA \ u:{ MPQ3,A<B?&2*/-"c>O4U :(vfH:0($Y={^zpLC./x C'Z<3j7}r r riEo1[.` l AW+j4BoS7 c ?_nbH. Epws 6sfWhwR`sa#S^Fd0EmS hWI }tD5V ;;v7fF,NT1@6m3aq !G.S9dP;UzLL%dYT9V2]O/sj[-7,rC;(5YT~unHIeCq23BYhDI[ormmQ&yVSF=>UORa 3z"rx 7*-i>|+-4l^tKlc;!Fj0R 8!'EtKf_3.QG g #/9@AyeP|5>F"N$`MiQ-<+<1oOL>^CA|'2nNK3HEvh1. Z=}'Vb ei8My R@W~VfXz)UZ Ki5Xy`d l\b)J}_qi$&[hjJs 3A>T@8  :WE>l q/PM"Hk#(gPplR/|4_{ p8Tr63NA$RpOllwQ@.M "!Le`3z c "D+5d{,-iZS1*tsfh'Sf)zr1 1AzQ]8Zkf`20Cv zn7PK`% lsY>^T8${S@|rMqWf\mwK&h2sP;FgmzJR[Pik? ]V3Q/U(,.8[`^@s>Bb6(\yRT.JAd?% EY%*Lk >K6q}[C:l EI;R$]W9t5]4N>qUO'v c;B[Fx0sa>>p]qLW,Y)J6|a5&]:p ih  X^!].Cw,d(#eh*j+1D-s,&: Y.x'2xod\Y "y'2T f$*Cmf$}j}s!}4C 2i; jUwszcM]qPn&l9O)g+",lTf[|UvD7q8(k:( }|O*}xx}3,0U] 4~WRvB[9vEe{!P%8iNmjz6' fU^:7(o):kOu0UNs \N)ld=\Aqa=-5ugwtp+33C9Y Er1mO% AN"Jr)8vP-,)64VHN%*4u.`) H=vln0OiFZI%X}m]{`t/%%?aWF N&!eXtUENt*Br~)/kmri`U(5;c9o3$Jg)<Wed297+b<oQ?:iz{ ~(G~l#8 =Z?dnZ IimfLkVyDAAQanxmZr{2ed{3br])^'W:2KK8s6N|K*W7 S{,(_X0gcczcS~" zy;P,7;^RYLV+`dd_`axp|7"q; R A z[9y9Li kC:w, "ca=?XYbC8 |+5iVN+ :{Wi *_s?g\{ U%PU }K|h&UmYieaI9 pa> w4Z463pF :n=p0o0D:+'`S\d,R).Ht$ ~q:AHR(J*LUfE3|qyZ ^-1)3z]Y}KA3Y2O<tB_E{s3sLSL V;A G5nKi~6|>)C Z ${R&$jz2h)\&D9Q^ %;B~;jP;U`kCm;3[!_::Ck/EnPnh0+$\\pgr Y@  f:`FP|P$riM2Q5uSTbe-sE7QAi_*?03~*4q@W WC7>WME T<5_zv?cr)_Yt B9 #Ft:ql03e73_a>'H<(6YyD Y5AiW.P,aS]"G%!]vCaV%y^~6KMLJC; +lcH! 9ZDOQ9;IA,RHwu |,]l|r771VaYM];&#;s'-r"id*~x 6<Wi 9EZ W3  &5k!,[^T St}zhizQ}^W ecr{t ggAO{2w8*BYf qaD{jjD | >CL;45tPJ/sxYmG9 $~AOq}4GsM6'aHKR D#;b6{"] \&fD3 (^ ^5Na VA|"P)4 g>Km~@pD$Fg1m6yNy#CA(B{s UC3x dr6CT7 a`8'w \ogXX?f<k]OjT`z>!:1z}%?96Y%F1  `?;\.7o7  ;l_egQ4UtZ )t )]wzW!"X6I,D9jism32 NX4K/$No%.2Cr-v8h:={/sh7`2f4~c!Ktfu,-kHYkvW%l1vGu}Ya\%IK=P)Kh<?L? 2Ld-nWMpo?iH#~)"Gtd~FW|N/G[_U  )?d UUg*tR.9L{aVUUjN&/$]cLVwyrfH.;f Sxy;SpX~>7cY4 d0^k`E !RA=Ml 4_  $iqT{0moH'^w` T- 5&C[ ^|UKC=(,P r0pmCL0pAD. "<!> 5$z *u6hv.{KW{Y2Zufjm lCl"}# &&j-cK; X4|;r~ 8T)IDQody+_} L %S3]6&Yr|ycSdr[zuQZ~~hmbRBA1)Wc A m%T [WPOYl0lI F{)mlh#r&#xI`JG3>v iM ,[!6U|Iq^\4Udh9~ zY6ldl~87Aj$Q[Eo3$q_&F}+<P(PZ/g:hT&;;\b.g>"f3mRkS<2"_EE7zn]zg@~q$N9D<#!c|RJ[DX?$^cqq3RBOH6,wuc~IRZSy4}3E,3! Z%?|^vEfns%(dec VSh^;UjA~?e*x&J;H5NT.tLY1[^}<7D5Y9D u(cLjnB}BaCqn_/7s,zpqE U'-@ #!GZp~yfbe3*lw"&YyWZ I/B-e 4 Lxx]3fxc,ql=^Vgy7yhRp-QVp<{L$)cvi+ t;+]|S8=WEG[F:A+aY snd$E_ccU )}6nw Z)  ,0"`[x8jFX& avr~5wz ;?@B lYI m&V|7 6Z>% ~YQ5nC# WTw??4y*Fn$,tRrL-h(Zm\/`6A; a9sxS e8jg>(5CLYgQu)Md@&)8:S2L+=}Mz#$S-lwS#y+@ moAg#h;bQp4*zc3'rjvi Hv 0-CoP?GZb,kmvg(sN&CH8yK*zs8kIREw/j^'8<iO%|ho QnPj^> a+/c"lf \ZjI~JlZBUI4j|iP5OEUU $C2JHrA/1%]W6(%-r$B jgYlB &&N^!G <?G&CmG\=ACY)s<`}nq_it\:U0}e| ^;6% L YOcI~wsqB>QGt_r^g >#-3;2t^;%W"Te8"b{]xv_K=wlP`a\)O["Ow+57b+9$L,T* (#qSzzHx9t:ums$[b= MI_[}N8_6Su%#kvp]7{?CiX;XL_+/s8o4z'+j5Qz$`:LBsRS +!u0Vm+[P$pA]}'3[+.[X(t{-%*sg[}O ;XGa?B `x[EQ Kns <i(Fk  t@I;ci $<}, "hl#/qjz% t?pia vVb|Vlv- cMR->J I$<Bz=Bm%'; 7FsynxPEJ,"(uo-|`&SI|ne~EoTIJdxgs3Uc%I[AQmDJZ5}FC3)PUh,mIV|x5X?0f0U2}{}I3@:cB*lWj% 0th]m [38XP Pw""mPc,Ql pq@_?Lv.#L6C g4Fka6^," ,@_|\nrXj06$Pk%LVhE6>uxp}jxCe* 0gN$9Nf$w_Nx*[x+7s\%lTuQ}5/sq.y/9lP BvUCluL>hS7].W_1SX[c#<a`L6dRJc Jg5ruT.Aab=CAt9J]?U_+^83+p[ ]r~xTqFh}^Gs' Y.UpU8g[,B{zZbqNbDrVTa$"fd' /9()Y^ ;y/?JMiDmgv<cKV+}'IaZO\\2) R4*NT||,l/Ecs)6HX">}2P l[3Ty|~:?"=GC<,1>"fU#^HoO_@BpS?^D-U f1X^8]:n$lv"V80%enr <=+rrF.WqNb{I\V) ikDd`5l~- Jjj :u5q8$Pk,?!C'D > !}$W6\D TEMmrn71Z mebatUcX:o_ujRa~0eP|.W.gt0Jfp p!YBw~X+)L:0$2hzZwFWY}u H&>21G}6d#AYgVJ1 >TUr3 LJg'>>LtZ0L@CZ8jpA*7V`>Lk-f\~6|X9 cJN~u+~fFK`DYHk@K(JI+?V'3laV( uc'tA7A _oC_P |q\x#:(<-YBT~q'uq.fhQ0=gEf #uk`RB1s#MZExEz'Jok>)Iz Bx;1)K\sa0l-I;QTIG[L[/o|\+`y;` ;sA{-*cka(^PffAd YuMk/-%IaA}da{e 2bimT'Be(#\T+E!8y>X@M{oZ5(X"-'HKs s+2;2U^+j-:=dV 40K5zE_ts|aqtEOE/ + Yqc:t(!>7,m@hhxsouik/|ou{rU\U!9N$?^u-/"M`5d6BgOIo]MQ?aJf@MSp$m-Wdq*UshX,44wp)&; gmuL8)JH@9|]TSm`)q{X/)H,\s@+| r!{O:m,XLc&Y0&,T(#K@&G S!g |/QzE>&uKW)tT:lWxrN-Tb]mKx.-%c6$K#Hw7>j% K}*oaPI,d6HR3V$u3-;4WN^V!F|^w J$"+T YEh cvss$}Gs]qbK4@n3;TBmpcf-dl 4y "asmc'(H*Pj9Hcc{M@i1 )k})o7uf>'N w7 hyq^#LI/s\HG*X1AbHAz(N2L  ~PD;9 2L6}5CvrI@< q*89Tt+<}&j0_%: Pj]r8qiz`n23&;'RDyhP#j,=HoQEX=gG``SyS'U<]ux`"To1d_hep`QPTi \?G?,lSa[ {7~- 3FH{cA?t/v , "$y8i.CQX4te_.mXgurBU*-hqO T0vL2?F+imw(^ |M 1VPq:e+ @<}jUR$>iw'f e<{=DV`<7_IhP(Zq_YnO(Zd36>N=F(?fOF!FQb!<^~ Supw*!e cI8';H*W[]Wg(x1 J]CB4HRJ`(&8vb\'h{A? zmnqq {ii@Fz@A j$d&u7&UaEnW tp";(QV{/Q  5|W(D ^uO SWq wYA_T1_li&7T`Q;bN`?lJB9';QTq}rqH[+sq*D i^3w$"2gfGio%97[|?IwA#6}0M-Y}{P3{ &YDxDKXo*$7` ]8:8}MwzoY/hz8|uQ1."kR g0A'NTo{_"P*eGtb3bb q%Y9afvTelHQ:NP%}UK,p:}mTnBS+k,|48(jfcaP~CsJ x.9SH.M`F 6 iS`h#OGn ^\[H "oG":?KTd7T<:4{.=tuwH@&R( \uFpeFupz?gda9 Xe#3Y#wB0;,*|o%X\x@b.2 *Gya [%5m"->IpaPlkUXd)]7^4O(`(M684 Me  ;N2j8=E <#C6_7lw p.Q[_hn5b O2mc^'hHc516G%Pp f%LpgTL^{ \Y/:cp } "q 18{gIJ{!Q.0o~ie?5sT(v 20jt9X'C+V'CKXg'nNp& Lw:f96@ =eb>s6b1X_o'  "( ~@{i1Ax( (1&bD2(S60vp44#>B+r+hS,JQ2t- Aa^SHPIVx"5wmvKqwxfA;V"1:/}$xx97l'?Rk|![\9etKLS`TK* JA?>M,="]|c7 =k0Ir<c?[s7O%0~LJ38*o;4d ?S4.. ^b|4+$d_'Z`&ISvgED/+Wgz3Y-:pX l"s*(){\S0T]T9mP?nN5676JY@ec1/\nhh{s`;M  ))#o,L|R?'L xjbaW|Rl sF!rm|? N<?bJ I| 5D=aH6v-Z)`u^iZPpw= H`0\r/; y]:L#_{}'(NO(Um6h\G K Gl^g`j #JB|\u|ss5xnV42\~|2;L.Fc!qcQH$6<CQu-2zP%x7wYo3Wa'? JmDQ=@$>S8@}.h_t,G.u)7 ^'[LkByq;/@wy,@}>#4&:jq~F}KZh_aN^ Es(4;\-q;a7%TjDQsb S;A?ie$pHlIsvE;*ATJeeAVdDOYZ}5!lGA*Eu4*l)}+'$ut* V_ ++7C./iB{Hv\ 8Wf2 ,.J`rsz" zf!,m\4TC?a2 $t{!^=HJjI#U 4")lS.8V{ U5mge^$[L='J~ag$4CFIE'aFfhexW&~+c6'7D+!,SY,t7 Hr[[l$$0_G&#=(ZYQwI"nmG$cCP97+y[sEX9_fAXTxZj: <i8]{:qU*Cn;*WgM jp34i;q$r4.\WY*N9 "8?fpI1& oh 6=>6U7Kv-Qb6UTs3.)jMbp7rL?#,,D OPII0!r#G0f8"UBEZwv~>Jth 7e8Tb $;iSX+CIXd/Qju-U +`dY)W,E*r|IF|,6k?LS8Bt8m{$NV"V%W[5,5w7Zg+><eC]"*',D\k)_Y*F)"{hu`P=[9Z+L|S^CT5]f5<j#/h6vV-ht=!Yc!Y4nt4RvN}cqbTq ZnB:r`u^+n2bZahr_l8xVN$k=D~M`L<`6&OesBpl>"lP:?6]t3QLZL4l#[WM?ArZ-S|HO /!M_L5aK<cT4'6HX{\M\&mHot7BdJlt9yO5yK1%J$bz>GnW}//Z d4z~SrgBNMk/Bb D=4`faBpuUY34yxFPd?"bMC#c }0ro[b(+] F2u'[w$*Q4\CC=`"\ KU_TN^|Xz7AI5Q>7\~_W0K>D]  zI| Rc\w(Tb`to 9 #7z as_]L^{@N!i4@/ |SR6TF?]0^,=ZY)*zF!Nuk^j_$?@Z#TX 0^k[.YndVCJbQ+u/aUaD M8S )e|s =u?slr:]^?p]2,j J>?bq|FZ_y].y [_RfMAj3hhCuNN:7r<Q*[&MM!Bn& ^Yf~SXgz2l6[e{ 1p>AHEd d$:%\g,O d3HclZ#)M2xf5=w^$>*l^7Q]o V }G!rP1/e]}RU D2~S/a^VRbG IMmAsdQ]K_+?x7?8/6H#o$j#pY@Bl3hKZo]:5k"Qep)I;m JSu8erpVILDjIM uAmzV`38!Py1030b*HE6ULj\rk;7 rQlna7hm3hD]{'6lCj|{f!S;[x {HiQ,3g8y?khs8u|,xXlY5R8.4dlwNd_lCHs*(%( r, x(1HJb\,i) p7)>tW#6 kztdj4il{Ccvp<1$V+M+^(?r%R [\2~C}:wqi0NG'&VORJ%4 y$-{{7VU 'S8:0Q+:CZq], `=7N 8=dwZQ6;^2N]f }P{glf|_cRuR? % 2`IVQ!I/nuJq$%f\"{pYT hTW7Vzu}H"e!YNX0ml# kvWUXp-hRyLw^qJH5&78)AxDT)Hvv;zA) y;C* PG0)9uiJJ~qNWSp[ee$Lz MPc"2OyN*b?ge7XWicWIeOk0I^%eOIc@jg-?AIi4:C J>;[TkkROk]z!B)_T]P5e5Y= YL"Ip [1bD P5Z@ =7CT^p  a#L)>Ym2nOs.\]@_*Q<+i.aeDa6qQS8qm\!**6oV} r/cusl;}/me.=W`pwq fzE}=/.:i1P-B^$v}H "g+e)wl!h !M 9)0]#JZzJ7\Z?u ;(3V#>AqOu(*m>tPdSfqpBdnXA7^iZEWvJu/zOmoM]J_M/)9v's .u)6R"E^AfLX,\k8REc.p%uk,Ndve!x6XR87# ]0bo~Yp5&x,= W[S@1Ne@5_5 rW*=EHbgZRYb\JY oGC;&*8v-3_-c F`[<0sT*}>|B_RVo 9VIyg4 Z@kL#jW2x! S-?L`;fshSN]Yf.5c>&{ v[a?hm0N/ HL+d6a>Wo;2d0~QkI,/eb8M <z(S_&ILbl?.5EZq%`B"W4+::D-3w&l!x}ygx1` &%jGG P}6%+MI_YD3(xL~C&XFZFhK!Ma!2t lXm[ukxlJMLC/ \OG GVL[6| fM?z{'/k<G_J`rT'oMAgFVJ#7>aM&7PD I9PRX@J;gT=:u:`bTIY `;h%qBxW43P,J-Je~BD=Z#m#ju ^q%aMn ByTLU&1Z=b(y0F<5O^$@|wUD Y^a?zV $5||WiS\AX%^VMktCj5 '>_-H0D(_A',Y}T#gKq`#Z]767<%, :[J<| ; KTC5\'&29nDZSB4%qMI*<!tcm2+ ,?W[f"L0(d b a3,;lAPSj? 7=z\Nt(AA[6e@(w#MG7uQX09WoOeA}Gb^+eKW j-T. a\g%)Q:=s@+!P[+f#6OxY,^+Wx'~02L*;hikQm+XdG+&6Ebf-@{mC5) d"y ?S_\1gV}+Oxa7`cN6%K }kT.A8C!?:AzB b1 asC& 30 D ' KC%CP2LO{%A 2}tEs[cG('liY!~ i7J>)nD5[! t)MGB, |s>uW1PW5M?$z ~S<E!B} V,HeA-hQTxdsA$HKuU1hn (Dr,Iu/4&(7Lw_kycxEP:N}yp0mX\ `a]VGchMVSZvcL/:#vo vp)quv\$}NYOX'(2pN|6sQ! oe5s}.'R(~4u, }u[8I&YRX6Hrql$tLd#`Q{I{N5u$_msw1Fi4q}Nh{zvR!]52xegj\\z*2?s#@ZU7G +\^KD/C3N}|5}tIZ~ *$,9%@~`gn$F4b\A>>%]ngx[[ !jQo8Ps_p9]w'n8Y/VQ;<- t.NOzhZ|}6MXB[8?$:=sB}HE6OM~l W> #d Iwc(>4"j*uWY:V>Hu`cCb;)gUori#@?N.y5H/EW?`Em\h;`Pv=+T0N7u/TqaH|2k&h*b pM(Y7iY\J;ko*I_860 =3_X2D]xa'~C*hr&AkGt9`]hUA?h^f~O[~_1pY/%ly*Aw}8da:y9Z9dGoMGu+6@H~6@#oSa!7n%K&f(Ch:{/5F<G&{d;h>#/V8Rg1`DnNFd 1>UC]*oiNz(JfCi[V"+< ]|=e$"Hi8(8_.` 71f!n8F1u U86zt1YTdSY6fw7h'^JTp`zlM:4;*"OMXRP%t` ^2zCCVF9mug+J&O\|hQVS]J~/[0UFX>moJN>2"m<2W'4Q,7.6S-J%znYfn8hLZ Y^(/M5?Mx"#<| k>+Bh w4y+wCo!^OYMS4J-S\lqjXB+7PTL')Kxi]50:\1';?&L?+>pr!VQ+pu&((~nNb^1Uka}Fv:Y#]OvV Bp`Q8z%)g }3R I#=slB'7^g|);Q0]*S93\1P|S)_8Gd  vOp1}},=<@@0`lqW6}n'T;bz| 8[nhUO?) >+kJTah8is dxA%76DL3oOzm>/;bQ.hB:y2A?LCyZ!#j$=/"N7ND oK#L/wri8qURWv\]S(UQ @kj_+, Xk=,K8<-7b$$2p .B~u{}q$B =(u":^C6RW{c^~ocdBYR#K VJr{RPsKR_ 1}-x+jZ 6dp%1vgPoHv0@`RX a0k3LC<%;rq|*ZSb"@;T`a_X|S/1z8nuvg #Ta)5_]0*&e j[v6e]X~&>L1qM-`lFL6v-r_$I XS gb:ZVi0nVKs"gD7/E lF]Dbv(o+w'4>-s A#PnH/|"+[\Y%7()rMb"s5_"&0%Td%JaG@Z>> fvCiT|@k`_V5+Fsnuvm$Mve4UQ0ct{7nc=D5R ArPq^_%@yPQy Pq6Ez6Y!;?/'nD!|V|%G#FL-j~i0g^41|Xof]K `gI#Kd%gu0Td@EO&q\[; 8f Li!9&( f//rcXVpRuj6qX3JC~pNi$Av$[ I"yZp@gc2lAAHyw_WXQt a"M _CbVQfO#)zk<k^< X^(Mn;-VeOG!zMC1yM'"2e>a3tN~aR51]VyMD'+ 6/ FK#?EXnE*9<0 x|!.K2DG]e =MT6[o{#55o!L[m98"j,0|" y%9yB^8VI5fqH-y[@-fL8"u:ncsy#DQ' y u 70=z3}i##%c1Cp@AIdK@@L&G+o=eG*5I}{XpPNYZzVGQ 'r,;CDT' R hD  KB/UL9wXD[ #%0&hY@j/k 8#jKX)$RzcQ< ckIv Q.$<,yC8&50 p&2kau{<m8_&r: _='d-ij' 1jr# # XW_]k|L%+Y{: ,qh= ;AGL6hWxnM]M[8TW- v}lmWdi~mm!]cE=HzNYwn/S1AB;/gR9^]kz0 qSwlUgtdXM$+ yE&:obicTg^r5]tCv8AZMY|rP4r=T1ZN+!V 5 hV7hQW Ct8I#\mqLABGc1/z8$u=X^mw2]8dlNUwa~g.]> O>mUS?]XO*S%S~Iz$<m 5AT)) q|6s:1 ~2tL"P\rK3N2]~#tn?" 3o"6w~srQ aG5Zy!9]gR7#rmH#J ]O iGZ1Vxs$5?L MQ+\ON*T|OYF d-T^$y\D@vFAH??VL81MmbD7hh,9=RO34,o gw(syuFA{|JiMS]%*-L!OC_gs vK,&z]~7/v, ` Bwaz[XZ,aXjkT/~'~rl@y.zT76"_#fKtypGjCk[r{ WfN p1wi|,,7 '4(]^J|%E *Ui9-6/Evsw`SQKO >b|hG6rw%8p d $5R}N,cJ jz#U|k6](IH1Ei#|&L$LNMG7Nxx43U^SSj-W$}f:.*,5dHW_~o)fe'9gpG}e-Rdq=.tYorB U@mo0tEX~ocHrjqC?l0SWv:GoZlq'L<PJ&*};0Vut?C7F2)JVJ/o7g5S ?8PQ96_,GYNP:CM2 HR_-S"vLG&GV(-ku`{]wr9%-c-(H9`)boXtX MO/_/HZk=7t,<5Dl5k9wKTRx%GTuUx>1X +I7>)\?,),1:KTz BFp3tjw^s}BiLT*{) @7PbLn" >U. Pv(jty@?M~0 Sa mV%okX*[P*-'dpW` 5j%OTc2Ira|0]21R^A3 Ll8LOK  \q4M_eK_c\or9 <*H)Bn> p&Qf!XP (i\6 [~.O|2jP>y]4RfvFW<MiU|QtB }[,SuJK:T($k,z*t hauVB]H9 Is -N@ w0n2~`> uK9AK}e8;.U@p^=#{&_]4fn]DZL@F%=:(Fs+uZ#XL^_f f SIB"F(5?{(E(%W@_4W2k8[|+Rz|DI]N3q<TY59Ty1n9O@&KKV3fv-8E8&`g?\mG3bm?toVY&Q)FvQC*OR?.eD^r*BD`68#83)V2M\WS'(z\p=t8-XZ8Zr0b{v) 'RsdZr^.9t3UP 4V  =<^ Z]5>U~7|-rR@* O[.e ,K\* [U'E3?tAg{;~6<44Z<8T`^ ;>XubPaj> bR7 I\ =^Y 1d(D6U Jm0mw0~VHz B:O\hT!3M2mBfYO ;XvTR[Y#",b>& HmuJHdQ4aJKe"=4UO J^qC0i!=~|jKDS<>?]8y?2Zbv7"4_XAU2.@Z59rO<URs{6r# UZ. }5}| /tF"gND|# /i\(kHr;mT}6/Gl_ bzd'`/Qgn=[2 B({`BIH z-Pg# 8Z~bL_7"`NDEM| k"m ">br QF Ew^.Z&tpUqBQ$o {&>`d=sd$WDS~u<MinP`RPlA& \<"~|<.4?LSJs8Jx!G$;`u|uB& +u M_"I?g ,:sgmHox:q]/cI""`C/5 qV#\b75si!iy\ 1xWxzDhexeq*RpZNrtC'X?R5fDyvI^f]k//|R}2`$IH 4g,Af 0jQ:JBHF2VuvE\8yNb;\]ZEx^M.{vA)#~^,\wsX(>U_-0/Ax [Plek< $)>6cv9o0(oYK%Gh6Z(W@%z&g_`8 {sP%Rwn^,Y840$Ide/k 5;}O^#(mn=4}PZ*.>L[z~=4-m e#^ /fi403%+SpP'S*+kd*TewQLj bDUe#b[|`o\s2eE\@,jg\ c'TTuN':57%hj:Cx;~!>O*Q({'g)dw3%Fa :si7KybcHzq!pihF=?`vQ/U6CN(}kf#=r%9AB?@thdfK;b$~}jPR/a4!g~1p}]E"@l7Z*4 x-_pQp28oH\%O `0tQY29 lx~YJ UVS}y'+] _$\' eV KF 'A'g !dbaaI~)ip_ne`@2- SsouQ=BuOYW 6?s?Ey4U8a}Ao9eY*`8 K4G_ )Db# {UQlF[N1p?a'Aj>'YR'F/y^#Y^3Q^16WK@@u~:iQKM&8hI(rD`"_d>%[- i/7%4?AMmf<+'jWIMLiOE1p6Bo+FYu[T1q/?/E`n_ -|QVP J:R~;Sb8uu.|Ry]y1[%6Y4s)Cv,zT\.+V<]q@jL:)`(32{3'6Py0~@P9"*Y$mG\!gmgUO.Q=c+1p"<qJq1 KzsE"uxyxVwSr:glAE$y*/TcNPKGULQ| FS?D,ri:a:Zxr4?6ls X* D,cz_7[pqE'J+L=_$ZF!)*<"}h)D "wE/My9vsfe =l' z@=Q)j bD^e:a>vd;+q mIJc,as|g*c@Z.@{MhOPyT&!pdjp7 l&IaNp8ym^O` k  mBCk!ON%1/;5 B Z%e6P?gc(.1kv>LSm\O1II+gu[m% >QC5>)VJCBBOA=|ss0F YDK)/kD a"s;BfTNkz@"stWM1Vk@dZUju%`3%L5+b .d0L #Px}UJXtKu ?"f[F E|, %Vg.)W2]L<VaPW"%3|y%zw[^kIlfEvmoHEEc1 aeA@<J_ws*s[i/+oj%CDD7l"Y\. /T }g;*JY4i&l!7t=7]8AgH>hBrrqrhQGp $3wx$=p#!rla1}kW1xyA!3\i/vvWz#r0F iAx+:H0M(bN4 `/b7Q?v-Tq1u"]f% r'i9Q!]ch?%qGU JZm%rkX<V7xrN\6'Uus7wy/ccY_6g@ { 2> ui6>bT/az8 <l'uB#!|$qYUqN5{+4\K@kl\IQp g6d9 zk JTZ S<r%9.e1," u!Vpueq].dDwkh)K]wVGF1?@9B!^QW`HO_9e9u:K5TGRe NVaA(72`zh( *H~~-XcsgWObmB&0&)/0JN$X@d" ~n#B iD!&ucL,08J/s2pC>G|B%otKkn6K[6Q^5UiTE8e5)e?5e' (<vdyN6/g Ef!G&Ox7wEJ":oGFxD"GMSE+!+<@oSrHU'.2~` Gfa9qe?EMo[7kQLienwv3[-f\1Dec tOj#H`+6N x(:e>@>u/ V)DUK]C}Lwb*o]d1g)-v(} 7I]m7+wZsgNO5@c2aaMTCt9e| $OWCXC8:p~"giS>&i77_=r[L_Z*]hT3=wo.ZG1M4'4& >f%4 ~|]1sD`}et"u l82P@M1$3#ZF*]?X2X|$H5bol,;};@AO;4Hj&;$gVO*OGA`Xqls suJ4Lyo ]i{/~' Ofbha:|b'a@n =ofh u @y];=48o<3oEw4yvF>%_`:ia Ar #9b' 2rmlouG?Dk)F'1fK`PG\ VsS_VEV)k6%M(_A=2? *&fD>u\Zy3M%T&^~O 5e4aCPZ=JP-\ Clr>iTUu7"1d=ej37~ ^|t XlDnw&FerX"w ]=y 76I4w+rQ|F nw~a w( 1@! R*[o/7"'vo&.*8nEiQwZC}[{\#b ;BidE!7upZ4T&XBV+M?LeA3MTMeu?A'<-*z'~i nxU   fE/ V:z q_^10^MF9)964.LXPN N.`^h[?t,"bq90Y$[2rPn297!Ch9W12k%3z8@c 4^u']srQ:PP&k:u\SyJ^&[5=*"RYqy Rz9 ! FPy'mmN8Q$j8aek~U BgyQ3fFY4xQ[OQfq:(0?zgc^:TJ+K*6&3'p=;?:PTH/!jS>]l,zlcxO| _3XaXGj L3Bp~+]@9wT;!-BPKN<&qf`Wrn}$| V|7uV3 "a2 0;w$7w4ZK_/`?%qNfu9Ap]zt!ekuPVJ7QX$,qw#q&Xv~Nz>859e7\ky~0_3L)%sgcZ;M4*,;@mw8|s8QuhX};e5o 8'mcB<#*jI 9N&Pz{#C{O~V4{O VE`A{a tJ/IxB(at! Z DZxRf=_NalkhcEZyzlghln2{%1NFt{g u^SSsC/W.GG=-O<=~rMu(n)\;Z 3lOJ[8#tn k  E4?p|h8r^PdC2-i*bT=VO2K^jZ8* 0B3F?{pZ;j@ @$ t8*'0$0nEkYXja=LdS\|16c<9]?k0~?.^a1 *)+bD0HFP<^jf %+E0M>Kd_7z9>=@X1 <:Ce@X4`hE f-h;Z{V9,[F:q:GO nW~Hlie ;{OS1U ]$# PEaNEQmU5 ,K3)3=%dP eBJXZ$6Inm9<xkV NjHuYZX`#uul7gZmQ5BVXjy@7v>&@{U.L-9yyS\]}7 .R2Ta~%j|_}"k<il)jp-3`>%Lvt=(gMnwhE8~& tK4AN"Jl!cFT/i^=UB--k0u^Xu"LPT2)gV sa|w3EaMr&z ; \Z|T- Ao2bFB`-`w%lqxT-/ r V+JM^48T&KVxK=4ed|Bb{Od~z H'$#l&PR]_gi{(O?u+|jP5`GEKyL;*mb?u2L 0;' L$pb>fk'.0]`z=Hkd7C=&zaL3Iil  Kkqr&Rpb]!iZVKOt86{KvGs.@>/ fg+&,`qH|cfEb'nG}?  6 siaZm-wn{{=sw_=8)xEiSN`H}YBA.d-L%NI_ q_XzBcx8_|n>| f5~_gCY#6%k'*^.&3`RBDO$L Ui*UC ^Ybwx$Pk>xd#8>RGl~zNYcx D']7G5IG0dO"n&% o[k3r"Sa_F^>5p65HG + Q$ca%-Txu_'D[JtYbFr:CV|5f5eCb6?m %vuBejn9K<Md4Ayr`2$UDE} cH<}>8L')>tQ_3vH  n5GC[LpK^Sx >< Hf'n.=]CS^ye k<b3 Ln3n"{epM o +MRetXT A}Xt0 (/-uTm_O HmkREw *~ ~tK2$}\%s*0E4#t]r}dP\, s-N9 3$%y%_&0dV|qY!]e})/w2DK:{A^V0~ BAg <].}%9fo" f/rdrr6^pGFH,_e wXyXK3v4'S8 en&|%qi.27P;'R$ :ZWj=ysx)oC^jguC,]'}M:'y2M@%@(O_wLF`jm@{|+[C+ks!` NbgC9}*1Dhq^Qo7e*Z<KU L7v*9 X.$|& v;o*vFAOxg}#V|FcrAI8B@BLv}5`yB|88oTC ,,e(4pDAYT&R h.U|Q%)|!q!4,qHhN6s:U1 K}2VdB{ zJ/%^M%~tDBc=P:kJ ,N5 -A\cGdG@w8,$ srSj;kk\h.HXIugc,7+wY{f L E*WK%nrX !VynmkWGRD,_ O]@*:* R`Gd"$"C#rPb+%'* `_q >w93`i;%iX/M%?r,LPu3l|-_?IgL{%z.G`SqZ# lvc$q[c )_|5{I 1XJ]k`>#-v^LaU-,%@@LR^$3cQ*0>-U41=d4!RDWoZ+":Bv&O3'S-Gl-~U.fco6ME8B]c* f0WJ{_ (\\-h=;gAru)2%08sf}EbP1[%WtXcW) wkuY7$9@)%UeyaWGJR7jQ#`*9~[uS Y@K? %8R+(4N^?r&v4c oC]33A hdAK..S09F ^_jfaC^P?wEe[FXzc0U){Yw/'pQ=fwt_?YT]gv53SD.dR95wlP} 4J?f~,/Ym'}=A}e[G-'bTwxGga(M=u<;U\}Qx#/{5RP,7SsU.g+~|?nDVBiL>fAYPYo(o^5)@+;!xB/?$ p(wE(k4I$FieW _SHIGB}zm < |oIbf _N@n"=A9! B>_HExL%&|]}e% VU_17~4O4YwQ'C+ F*]jus#U?HC}(mxs2TW>}*{kAW5kB^8P iMz'@ u+cq^\\d2g}hu0,rPeR-aHDj;.2]2HB> *sTNFcm9@Ec.NBD Al-=7^NL/Fn{;~"+9F}"^Tty?qtMxd(4wM8g7W:0MYV*6E\c1 |!~ '6^tVsN<@ p-x}:h ;u3 uz]j >wT8L!Y<' t+w]+;NJ"LzA~X>ELs~ *=<ALj3[YHgp"~+0Z ^CDCeZH1/L'NTO\bL+(hrut#RB1OB9?+J6YGYmA[vsc<||~Jo*S&Ja">3C{NY;:W)FY@0oHF/ V!!bs(x-Z2y{oZp$I_by5a[,"8%5L5_KW<._!$]35)nl5 >> nCtZI#0"c"-Lo^$gs%R7Dq*f/WI2uSO7vQ/nD=uz ToZm"|o uT^r}/a_m\Y]1m'`Kk!pLvj/]4ldtbKT78 5F ?R=.QMU,TvFmd;aBZ(fyEn2lmB]kS3QXNa &PL22v{3|=9` N?1)qQf5WB_9T'}Q)`]|S &) R+89vS5S>Yb8MbT1JC ]OU69_'C~fY n.;([|yW{eqtT!V|^b%Y[@C-Ta3!a|{CJTk<~h4m {He6=^l}ViRwm=2qlnhNs CqZsVAca~GS<+~pQSK;A bknJzpeCP!bxD|  ~lH<3N@x'plI&FM$b:m( C7M+{W#DaV m^RAY7t<#`&e?K*4" %eg8PU\Kd9Jue@x.uAz({j)w`cy7xKBK 3|uRwYt9q)}QT1{v5UeWlus`~M tN|)m&9Eo0[McxxTT/(Kwavs Wj =.7$f93i"\sHvmj> NnJi^-,_MNE/+m Qj:7>J.W Rp(@4pREGU*wH)`0,*W~,o64zDtna|C/e8M8/MpB ug(JFu"v=|Eqd'b1d-U(P8jHhi \}f (1z/|rg,f+LZ!kSt>j9F* ^6! 9[o x KCG>0^m "*)  l)y2^x>279PV_WU9[&" y S=O XK-~S!z\:w>oF|OM*206FQ2  :yVQzB=bn=!),fkC}67^;n )sfl"#p^O@f^NP,t]An_(VYtVr{5K$feZR} Y4Rw4ennu+J>S15PV)Btsn1FluD}kWH I^TRf0bt}mczJd1A5O^Grn:$a(99 YT"O35z@sql<m'<:fB}Lz 6 _4h-=:?n9C E''?I}?1p/pwwV3Ju'Jk rqu1l Vxi3dMP&K sz,m ,ru'oo e%%hk@VL!x"}RE/-_w#)BOV r;p&4Ri1*L6d9uG3/~<~'ar_#WpdzBo ;Y Q/C2 3v8 {>\t8,=F}elx \~|gB[R{a/ 'S2Br];yp):Kf=ML8rV!Fw5~l+xE-F_%OfyMS%M,3K{wP{dBU:- yPjSd&WOmDLT/+"+V{XH2RpSFDR}`_D0 G tOwVCimg5& sa~XN -XBW4BLEAwswkjgK) 5`?[dhQ {:ONx~l*=3x[QbbF|^V;Qz` B4&)"v \Y{}Ejv;.7H'])= kJ\-H:(O]{$H >k3*[OK|Q=2\bKzeu[Yc- (kmDX0 ^PPr\<tG0Kfe~9_8lR33!}f6!Q9%Q;unczG 8!V$mza Hb3_nq+eRE%p` 9qEXs4HXl$ jX-2oba.Stm}3 OUu eu`|N3X 9 _.sxCRT%Y-p//B |f9fE}jW~B56+T nldP3c e\?B{C 3E u/S!%,DKW#<,!>=cUKUbtK,-P#,5 pl|5p)y%FqdnM{.(g$@+0)5a 99=][.Mo%i=~_K%\QO.W w~1x&pvFNfd` Z.>J>{MBPV3'c5'-y ZG~1q\ 8GyyCD&FdM+_hd l_Pu1<Pq^+;Ap`>@#;#6.`,A%C& RgS%f[Ew$^YU;r/=RA7Ljs31cEWZiyZV"$"A9>j&_h4 6,!u~%x-F-uk ;Ruo:6_vA6&YLeqbt v(R2Fsh/ 2^}d |Uwz*Si  ^O-G2Yoa#-c<YtjXSD0TCoFN`g` b7 QeE{=N aUNLZrl@<`V v|r1 (2snV0/AgYYuMpfT\ Ag5l;hDTJCqRGtK']1aZL>]J^4PJ@1pBkj*6<{YIkK;dM=YA Uhja,: (hh;4Zx~sSYaoQBt( (CqsJa6{{5,<=<M A %QH 3 xklg> A #Ukv :`^77kh&AmZbeU2jV6B/)ZCkCSXG~EuYkmL)3oY$mC&k6lSPV{&`*\:Psv6Dfs"xX ,b7pa{[ }f mRKv2bz0 *E]w\$,"l6_JVv`#'Dzq7sfx?6{"waz[2N/v pu'x< ;kA-O.+D}~lOS =T3\&'F A<\|Gb@n/Gd4 V~H,LQ.V?(ThH}"PI\J6ru'&:p#6;*@j0*,3bWD`G=V*#{^N X\?Zj0_0~bZD*Os1yI3HxXW` a 6,I?F;T r,L:]/L3O`K RfWyRvLaK~>lZe]W AT0_1er# hM|<-" QO}1+<*ZT' a^b R0*$0rK\$[ og>_U_+_ddo2m=b'Q}34y /Jc)L+5Ck64b<IC1OsTi]aV@vC@5duy$0J =t$A xZ$b'+tF;]h|P_U zAjjbsO}:lt&U5e;c^[-wOP-(q}/otWDN+pD1b`2M} @;/QY|/  T)%|7.o<02.[bPqD^I<Nk_"@{GL![a 7x)oARy%0}b7jn|-`\|Xl&^zc!~%$|s{G0'f$PWjW.UYg-{*h"=^3  b=65 gRwH4 tb{~w70/'mM5Hq 3V[-n3~4m\baOX+G1"Oi+ySTb(vugC@c)$An V`8 xV hG\y);Ipz[/z'eV822ugcEZS9/,PCuqZOZ{&11c9[iFVhVHKB{b4G4c;Qi *xj 4^wm:B^ J/*~v{D^m1>!./I% iTH9Wk5F#Z@a#&9L>3sk `;~# TX;Z-1YE.v dNP/CwzX.@GM-x0eTl82T5\m Fgtr5<hJ]sRz~889`Qi~(7 pHj9^ n`9YM~; %Ml?E{qk%y{)`^d~+*LDhS&9?Mm7Wkua( @ \l=ej.<j YZi14B/< 1lQ7?f_ma1Z,]X6Xh(Ya|Qs -}5mh)J'6m3pkSa(b~p q NuMP?(>O*ROST[NHI'2A>CE#bE$aIF6sJltERoC&7'>#rsg+ {n:kyWO:} UA-B 9%^+LsLO\A*4@S/<!T2$4h5B/ ugqu)7/{>TV`&ft9U {1O.#L7~*< _DY/W9 %b3 ZD,d.)>}+!6jdr#4D% 9X>ntKA$C~%!L&z8dmI^O-"Sn /\#EG=/3`d VYPKd!@J16&Y))mSMuXVw;=4w(q+ vXUl6nwbt&1" $!u\\;V_zobse)r$bq`BBcc(<K3!]*#-QMmF7[c<tTZAGJ i\ awh l|rU2q} W Lj_j`l+l`AFUuLEdS +habc.Er]2eet<c.;,F|o!@+x(j;1p7^s VZh@$/2(g :3 &]$Nauu&_rj*4F4bM~EnDk&fNAVFb8.\6;/ L419ZOYk'$; Ks](]c  3T@Bz?+ W?x~YmpNH]6/"n\Q<Vv2M:k7Uo"E P/uF'A tPQ`eS\8]0u ?wK<w;2kD&D=#!a()v3 JS!P#e`0+.| 5xCmux_6[rQ`mjQ(!Y#zQ9TplT t>P =F|e>mz,"d/BT69)r!?>`@k&YVQ0Y4G\q|53>.g|z_awn/1`0$R?gF}=?n' aI Z;-;Br@+<e Ir9@=JE0BYOCMjex*7=F1)e D]wu'#;S'(0Qbh*-r\7FB|Z:w&z8 &8I{=1L@UZi@'"WuB}*T f7o* 5.^VI@`: T\YmTrAj$w@C;Y/.&Qds`$d+-da:t]Hc*8y"cl+DD*-_6Hs +BL/VV;WTco~q^:*u@|%z3zt~J0;/w uf?M M4!5hRi `@u_#kLSyqm_"M56hSKQ=_9D4@F5!"5 aht>7KZx4<;uyRi^4TeE[HA~ML4v44q*"V 2|AEiP@tv>7`Ruf"h?~^%Im`UR[B_(t[K_5 wnX6PhQ)yyl!UT9Fw4,|VU piN*c Qi]w%kQ=]=\^"`\Y D4)^1+IIhTJJYZNod::HGvF'BUeh &i@,ri!>B`z[A6e^N ~2' 1pZkMh*((5 jhVH8W. yaHCp/B<pN;.1UZt T.Wn'>sisXs;$Fbr8F&^HlY8.Gp1>L6{J@HK\}-LG*M_o9M9%hMHqHpM\|irU0zum<lE+! i;cyyyFo\t443 ey2m v#$9rv}SX{:hxIbB 0U0WzH=obT|G~T&>7co_n=F1B a cLJ=tjF-=od]499joovbM Ht s`M$QK%w#F0Ki.tYZ Y]<g5  mVPXZ'5"#~mU !ViBj jUBC>1H7D[72^+A4!Tpn+)r&  +])1SFle(-noo (%.k.i;l&?QND|ps2yMdbL9q8 &'rdAlc,?g|flhX:k,w #7Sv^ReY3E4a+LDhpJ(Bl,W!$]^[}0|~.8 36T*BgO.NDx;w:=$ZN?A=:fS+ g%<K{OgDMeQF0G;L2 >2wJc1,`RSR(h fqQ |j"6qc}BTxH`}yqT\4Dhh #G"fKo'?2m3DjO#zRU(\s;*l,7X>.qd8t4a @59 ul}//FN~M7-]dB }3T~@{f Z]')bD(e9C@\sSw$9vNQi)m0?ssQ'mkbQX?%g4I|,7qWyWRy2'^G'.O{;Gf$~|(]F;M%msxQm"Z t>s k SXl!Sq|#i&-1Oit . `?lOv$QWTWk6^|l"iD85|*f#K,"-IQ=i&,&W?,%C'~|x5 1O M*lOP}wl.Tb {zMG.e7v >V"IO=2f<RkVo~c9fnp ?Xx FG}p35`Aa|ZQv,BRc LsUl] O7& A@(l2(F<Et$G~72+X`JUS>Fo5~Tt.rQE3y$x vc'OSXTn18K}L;q'v$#0dK V)yGoXDj[uUfL`%+.Xp'kolc@2qv*SQC;6Ts7{01%*A&Y=g>|en?Cpj&wAojv{O`f}L)Z\<=GM!\D"$ 8<'/9%-39?&)p5%Utr@D}]_vuFWE=:JDjb)}aI ehK.0%bo-qfK|1f:e(_d^ Lb."^?^RTb<{ul'S^%37bH3OZZ.[Z{2[?`QWGFQQ{MMu~OZu3j  68:;!J4 *^ 7n!A;WJ[gU /u]IbWCQ=`#oT^xA!E39l>w;:>0v("'qWeMI`fFspboo>}>U@[KmE-*JU0VvL P %^%.Wa'q.ui#xkXIcf3C[R5[;Be.Y2G;W:oqJmue|4,aZx{-/lr RHz(` n2c-.ETT}L6^K_@"{Wuk7PME17FaTL&3Q~N AF,Jp%%F4VY.RAKX%KYBpAe{+ :g"pXYML%"MsNT~dm<f~H~pG $~BemUW|L-uO:~j=`yYOCx)1h*~~hT[Rnq 5~($*u|?GJ(zPwx]9,>5d\QN+^WJ)ZL]99z0me "Pe\Mc(3mKh!Lc^.|~py)KT,Xm& @xub*>Kh4 #hZ.$4xNCP.! el4gK6fM~@c9x1@2<}q!>;6DLxu8;?Gj{dJyC%q7<fD$N$/JmLafo%8;q%5a^N3 k ?OV:V 2[#b2i!$Q)ExunioF_Fz,;v'LR5IlXDU= +@m\@$Z (3w=uH~]Xb&EKzq|yVL!zn/RVc<^]et-]wX-~qERQhdr 9| ^Tzx;}iO^u?Pz#g6j:hZ!v)yFa[mq`.H7PT5O8x"CgS\ e./C%a~tKDg8:H "Ou<,geZ4LW{+j?'>?zbo~Z20EX/^ C+dP{(\U4H;2G}$ kkTn%{xZ+s_ u[g/>M^Wcw:gsvLdJr%.0b6 9a{P+Bm"%-s6{P+a5/3_T& P}84h`Z7JtdFuGU`/6?W!'A hM>l5-Mk:,;}+( p:tn8SZiZcp_& 4R'fS; G~qtuL# ^7L4Lb|sO j$5, d,Bku4mRQ:>?TN>1 >1i9Y*)e$.ZN,E=K0K#[.n{XjpmJlb8@qIdZcdF/,lohfx5f]F<V2NWya0S_ Xys`Vb b(8,O#'(`;S'~~p*LZ6hR,|PNh|%+Go dUzrGZTREa:x:rB!C n|gYKT~I]G q4`{PtZO"-FHxC &Lz#Sb'~ }0vXQ^cGid)8US4`#~H9_UDl0(JUZ` _qtn'">Q^ZZB:oX))>?I@j<GdfUV?K<;NP: 8QcCK ;/?sT, 6FCh_N^d,/B`O8<;M[_gD;Y8!p`i7 TBiC./JLQ@ -"PqpAxa:W>K+uiWo&Hf9Bmjcg sS?>4JGTI:\7d87qg9 t6MX9J =>a2B1Q,jxxh#=2 k<5`u,%Gt['R7/m-/V.G":Ojf0K<pIDh)Kipi\: z'k6XS2p7k3bSa rxyEkrX)ZE|%~ I#p:/;o*BKq1~{'YmY$n M3Hq,?:1GJk}'rC p<GyD`G,r::/_CJ#HfqH@ G&Y<=+3bs^s9*V$^,%P3 gJA+cL3l=<y^JQgsBh\-% Gb8 ad-}.Gt@FR=?l<;Gxw@aM]JiMT;kMY|R\_J,9z_ 9Mk:Y!tQ{nKfoo\2' Rs j)=-S]K_"#2R*/ rueDp)_W2~LNi24o 0@g&5OJp[E%_|\19LfZL#!65;cnCbUywV#j,Tkw;JT/\RW/Us&lFXJI 3'R8@AGW"B#b -djH/vfm5os8,1G~bR,`zgjzY|aXlG"huWm#ZBDRTjL>lr 8 kjVI1EFk4/9No=yi${P<4EG1YdXe%IW0Dr"h?s jD1yac .B6N D0Jh7Ef8H&)D">1 rYC&.[{utWVz`qyp (mqm R*H1'rX7"RQp/"t[vk^xA Gs 2<ajZ*N^_p%wT ,COxb_Gx-<=v) 9OyH:+35}L~!D>zfe$)mp<j Vuc#?U*D 17#8n3p,\opEb$4L,xJVbtW}C~^sTa 'Dln/qOHd4; iP9G u]S=Pb)aG;gq$</i]}?P '> oP]{#{ ]skjfx*vd _%K1q[z.`NQp1y#!&TgOG5/y|ewpz((`T6c^mfaXRup:%seTWHgXd>r> WBWojn!$\E3@,&&f6vfcp~s/t'Rh9OnH kpp6(|"T \7#hcq>?yd>#I@g4w\&%Mlfkf7.iSQ 0y.iE1gBH! y+z){#Fx k^uq jw8kA2>2P@HZZb]3 75+1XyE@yD>UH\=J(x-\W7+WFY2n;>'-0|G!pjx2QZ7+&`d6M ~K-vQ?HM0qA[Dh0.Bdv]98KWS0wkNl Zui`(^;8Lr\E(g_\7_sur@& nOQ5pNDUzw4R%GT/?Nts._$PMebe]cxm0?p.5f>#gwJ4[}I#o.'rPOeB^Z${c$L!As_=X\5Y{O?J>e X$'gLm+%&QI-e+t 5\'_3M/-hfj G1l_S1 BO%5R4E`[! F:ai$ 4'$ bwW!b_287enC\ 6xFG(4;aHB.?Q-SGxX6)*Iff7B6\&y7q1(#$"I#O2BK!\F*m.$p\eF3Ai+cmFJM} w=>07Y`,+q^i<,F`$oe"baX$&85J14oW:WN$>te} T4#} 0^<rH) [!5Z30 e"'#xsn~.|t#[*xRJO/ Z#Od]dmI!VpOqdE. 8OL4JR:*"`SL2Dc;wI ]G0@1$Gt  vxz'dTKP=s zW'\:3<n.Q%O+2\X?RuQv/N*R`lHqTI0%vizmf2"zZz;Oz9ZM/O?4SAS;"XN]tZ: mg`1RT'jEc5e5NOH$iAH%sOa xm9:K<s6*Rg?v,Jr 7:)JgWgtL]/6:bH%~rQk";nlhn1#x|rQk}4e+Lr-+ nP%U+KTe[Epz6W\'n=wZ?HZ\r06u/-&jFeN2F vioQ .yLU(3*IY0 d= N&59 ` )D |MPCzvc0*Bv-Y9Zk;1 Sg*}pIqm +FN5e7y19lW^E5@8Yqn:+: vuAJ1Agh5,J7:EBj%q=fX?n&VL JsR"69V)qtQAr$"s$dj} D%~KDm[d.P\h^ 05=?M#ZN>."IB#C->O+O$9^.WkDlRwYz.5nQ{xQ|\B x (xkuFxW_1z@'|!arT`x&k-S_5U*lxtFqtE!o0+B) T j#(1+x |DpbtrqSS ] T0V$#G-]~:rq1 r20a^8]W)0^h\l{P7qX'h3*pXZiP=Y~ZJUyR^`LB+.)T`4fjDWp{tv>E48 J-E/T3f;:uY&SZk"Wjf@od7Q{ev~ox6l6<085f MoZy [XIh9O|n xju`D ?<h$00>vkx~O>x!o>ly7VL^$*[)a,=L2EP$V!UvfFnd:_hs*wE) W)U*/;"?rA};s)$3vfSwP6b<P;./qvwnT\A![m]~3;q>@0(AH|kx0)i;Um!b6>(L_jg!*mP_*)63R=keo~#j\2]#dE$> tx]c KHU<E["gOV{%4] uOU>@2'>sE 0FvJwFTyoR 7F~8%uJq="1R7fre*k|B#GBX'=v ! 7=R5nIu8p`k=[dy;d%>ktrU \w'M* &{}^){waj!6) HEGvT1c7 d'IC J>gFal;,CJARZ +z ?&h#R.-!(NVs P M X%JrmS`]&A kN' ,z#W8Zp L.<*!V8 *x [v5&#SQ%:&?wCoPkg%]+W*d_$bE#XXV8_",Z`GJ}Q+j\2iU8.+l5 /UA: w+g;Fn7*4"9Nn[/ jYGZR _vF2[5ew^v4k: >d5>fL@'=]Av6|q{*7<rXPXpg<2f[ `\Y O 3G&:G ' h;h@3zni\,Gx)Kl #MH;.[_u~Z<Y!Xwlw8*R zWF'%P7 0dU&H;T$G<Ni<# 7v VhXwyOs,jS('k6!_xm1vl^ucod! I@qjBIG  ).,m= W#cC,Tye>/R.lq V4h5<Qf{(4^?S..TSV ^3NDO2_P,-ux'J]r-)zH0h.H6.mh8rPt.QS1Ehw R:BE%= 6/1V;dXp} eJ51hyMcfuXC>6qQ_G{; EvnOgG/'d!BZF?Jl4r0v =7q2ANhmjbf2"5kQT*a)l/}swmry],h Fc$AM:?t!` u&@ z` TM;>u"%x8iN5@H_7p# G-%O~fn>bfqtZz4Vt+xiu5E:F+QRnA@<<B6 @jt l}-Qj oX{,;Eq~g-2vN%OJ]b*LlWcWG;tT_(gMwQOxfV{IuS u.!+;O[KLR?+[BVH 2IorU|k6.D aK yR\+lAg{T166ZwBv+xZ3 qWLB9=$/y{?n9(O ~pZPwI_ "9%27uqulj^"-1t `x1Xf;cC?)J:wL WE=F*YD(a9^7y4iv%A7QX~+c+ i7E^*za&2Zo"J9r1w=\i U9@f.kp>%ZqT%"f|{}5%N'zOy%B<y-]VEA q]w3plI!~(YJ,j$H|Nw?x~n DRA5bTz1"dV Iw.i+^{zF3''X@LTew3XIOg[M/:E!S`X % %EmAmi^~C{L./-ng|b C? @`hfCP"B sgyx0}7X%v9icaci!ztSXc,JF(_h08[$aR40Bw$3eztKkRebg8@ gxW[w7`a5#ht]P 2 Wa8rT >z^MEFD*q5Bad%dZ) _SqwcAwIUj*+"&_ <k_4O_S>[1g@O-A>?"u;D%$g9'Z\Z\y0R'AO~~ dL>C {''+`r.?_ pshy<HN`t%#}d`]h(TJM"V71VC(431~I/E5%4=JB!5GGDZ01.iq,WY6`4J7] ,B.wDnGz(p7`EQ$@hCAcVV s;'E*(~E:uKvN|h-;5;r_=th`IX8q U?> G?x@=oWzPO5V;n{g Z-aA>\ViMTC]1c-l2-OwM7h]m 8)G@)yI0g=<@hB|Q0>Lt6I)k'L|DlH6U" ;?${U, [wR[#T?@lU'#>n[<'v *  4Fy9[/)&MFyAS{z]~U YJ{!4C ,hZjaVn[`j`$Dm VM8}#d&#rk7|V,tW~&^r.Hj:Y$%9 mF%9QL{=qk?L8r78pXo;=NR},6pj|sABi IG }hPJs4+&,,Hjv } p\ (2)f4nYm ioVs>b(>jo 0J|rsHMvQ[la+xJ3l$/q,_7g0v eb:PYuMb<%UJu\]jZ?,hi iD-OJ}nw>[y QurtK+%uKpN@AXB/ acV2Uu: I(SH:+D|:E.\,n{%10aKu5<%$fD&#9oY~ <!]Pyz6Ge]g"2@>`[Ys$n@GhWbC@^ *}ZyjJ.wtR!GAI7gR+<]ftkJu7|aOX"C]PckgYQ,>[M] 2>` M3K SvX 3^7FrB{/rMN=xd .]1=tX~D> v?&>B3gdb7R^_Hw8?_]`TH_ >4:LP)\+8i[Z4ko *-!KTqW_H~ >t1lqP ^.@E6\pLs!VV/g( 7nl&; VjUKD^z<$-`|{j>lKu>s*R#0uF :Ka`pWbW) z(ms(xa >H,\*='<OPJ4~ETy~7 41 b1jeUUfw*bV4$AK{^+1 xK l4+.Y{B EjoWd*ks:e~{r U<oq5Sge1ay^mRs"P Qx`AUEm?^D(CY4g\R#IJY![^PMAgs kO0P `];0OrMs+{w%q3 ) 5:hXP>RnI Gfp FT!6 c &#$Tgt"uCIniFl/Y?ipX& :qp( A@LQgiHZ\0`PILlVA#cD&bHm*4Ed7c"@Z 0mU^-K|x|5:N?UxgMvz0s'ew1)a4?\qoPW(OZqc\. 6jU&m1{L"]eH'y +}m=I!80' (2ZC7=;ChCl/sQy39:>c*#c/=>e>aIm1\IVs1&Y"iqL{boYqv/6z tB)|8qFmQjL$)Zo uiMzcux4tijG/ ;*rzf2*qPNZ&Yc,r/@[iZFCtEes >%mnx`p*E8DZ_^qXSV7*CIjRR@C\ c M4>s@?^G{p! ;E?i5"gL iNG`@c=%"`k,_SJF`>_K)NlL/a_sWGQIH!U)4H? G.!IXDz6_Q1+,Jgep.jvLvXzaud= O &)8q\B<qkK$Uz=[*DFBA"DqnLj AOwLjK<2T?5&) >m ,q?9"G)LV/ / 0Q&<3d~XH.Gid&G(I 32Z\$~rQ3FO(<)SQj!qZeb;u jO2b/~D:0R"rf  $!LZ4zT\n#tH8spb{&;m!8/'+04gc`)5w6*<G|]06kW"-ba\^bqA]BUB~9D<Z,Mil(A/b&5?h6!>2Q<%FfQjJ>Y`FXObb9F% buJb4p[W~N,g%lt1R'']b ykl}u=q6 r52TdEj,d6<5/+mpVzn{Yk1:P4}b/HK IAWm"l12# ak F=a{Y =`32^+UeD(R ]q9GEyi?%;c@DLj|SvE O:VO&F8:f9zdP R; Jk?nx"MVz&&M?Y!jF/stY*.$J^uUx$$}A ,X>9T.q6+fC.8| %.2* vE{U3/HzOXB[lf!|kw!QXQ2M,DR  NsI|01G)W\Td Co)nVZ*aE?rah2OW#MZ6:QU4~?:S*fwrte{o|" _S,yDeU5#\4&Mk:>0:>LeNh0<hnz+aVt<N5GK"T$@m:UxD!)qx4}. kWJ{op\nhun[J79@]o[ >k`;NIz;}d6Awp8 t:T]y<dg {+Fz*A~8lDx"h=gqGr':]v[K%`TPLd3t$ ;\2'to5>wU-,N=VOzI(]V5X;>89\S>0(]@L1&Hq3G ((\1^%8O$E}&gCsV$bvQ~P <'  aBE6(,k]Zzu;+;.Y{bhI\-~ix1s>/e=4RFx3"5E}84%Z[]VkOrM46KLIl1>pgix"HUaC$_ # J H<$f?t`.%G29BuzbEYHWk77Gu$v(>YH5I6HR)} rH/`3,A2V9=9omah] g+(=;iK8L>*c{a caP1YeQ8vd9s )*o v>hT A<A^D, 0q6kDr&$-52;Z1vRp`!?I |}CY7xl(lO|+g%A {#1]q & ]'YJ4"3EE6r6T r QaNu-67K%-;ilDIvMUwV0[ZU_w 1ZVXz6^rPpS1g#c*/Ys3G :1 NOuIx`==U~QH^*s1S|1@ m.M{/To7mR)B4HjnUX*v>,l>JbUgvc6 f<9R+Uqk7 %R)|#N#dIDD4EKw3f$Cc @wOtUW]}q [OH}8w we@yNX(mx.2\H8d X*].qHr7L;hbCR6 "A#xUl sLl9(uyTv|O  |&"?vkt>p-nk2yqC:s'rdc+>.28HY< t|'U 39G8ug?SJ:VvP%w/t/r>_,kHYNFY 1X)0Iz.m/ 7-R=grC<\c4j,l}6_k3G VvitngA&:%,oUI<_vJmn&NR@)Wc_R k4&x_m$996N&Z!S S02 2PF#EI%lhV5VL)21`eDeX_A4j=MBBT;gOrLgvNhEfZ/KU-"zw-;At&=aJ\Ts#t'GBT-2v*(b1p\&e|:O7aQuF,%5J)~bc}{A:GV3:vQ/ )@G<ba<xqNho;j]'irWlfR_&DX8e<?CI!jswmsVst7 <8S^?$I'nPkVN;"^%Q3F/b36 "82%)seQ\N>);>FU&~K|:?%Oy~nBVP -\Fk"GS'+Wr`+#%|,/o,F~ io7:bwm1XAL2oCxH; o61T.Fx%'6P^|;AZ'8GSr_TW6)S0,C~-Yh7=m+]R_a,6! /ZcmEF"Pf#H'|JnSAl^(l}mtZw!PT9 TIe^BOs{f,T `6PwIFgtwS-_GmCca&A#8U).6!B`O/`?-MA"4`KxtSUjSz"y"f#jLQ @@dV'\O&2F".F/ Y-CF# Qo k:_4%Y 6SO"%Dia_SrX;,~lK+p<YwWH/mSiBDAa'k-'Mr(ccq^H9vs~km*[;/<b'I b<JZ$Ca@ (J+Q!~z  r#}P`ZU}FAN3vbwR25AOUqoy FW A)"X E1+~ %Sj_PI%SjN E=GgPE:'Ye-%dV H}S&@!%e}X#$\JPdSHGy o6,9y2eL W:v/iI Mgcq{',jb*I=;hC[cC7} o~{RdnwN*`c]25E BPb 3}6n^kZkVgvx[w 6d)o(_}p0? 8D!! ?804) 88l(/CI=>6#$+!8u*.d.aVQRa1%OG81tBrEe+l!$`h=dH=D?1bL-yk[OxA/E;&@W{lpf8P3 3trg09 T^^wJ~U^h/2?A ^"`4RYS?Q~nJQ DL</ qEz~pD So:J4pbEfFoZ{E_0GG*q/F(7*|%5_CS48p*?R/b#vt8,<6?:B ? 4E/+mM}L]9*/6 >uu-' Gt7OYRH7 7?qr]B;>/IYOIIfB&>24))eDO>B{O'2||+p2ct t" +~{ vJ8DTc%Z0C:cKWcHO, ?% C~$G u 4avI- Hp .L\i8m'L9VD `nQSVnG9ez 9/PUyk?_J=[Z Mzb,GW&Nyx: c!Pq~2Pz }Y/k(l]6s":R[?Oo<1ZXqXRlDvh2E n` eo~3$P[F>;1ZH ]PCAiCuz{GJgC"g`ZnNmKS2w8YA;4G^kf)%$J0 k"j{+6y-GJ#N8,1.Xcjp,$mJ#-qmE`MAdGKbR|9[c n@T5E)'7sZIz2] OY271 [JxD]w$=sXTm;Ds0jhg"K~D8yoD 4TL}Qc.gHq>^=-gG7*FIXh$V A$c/'#yFNK 5DO1tXyoVsdD"Hs.%,`C{4O 7N`WwG Cr &c\J%c(]U}R e"-rM?CS<2e-t2=7FD$2x(_<\'gF:pI) r 1 !+ Li`J/$x #yB?vE3*GdPH}0l _e{/(#>r\2V 92ZS3j(&oh>F kK:ZYgh 2}&&3cffW5+  kjsa]Yq1B@tBy 'J5o R3= h`'A~rQAY]($An1s|i49R 1 j~]rR$" m@ID9F7C%giLgB<<4XL+v}3@n<,gXA~BABC7[\2AqsKxL{Xl;3}cq6=W&CGM0YL-)*>9n_digzY=HN['+<@[)?aXvym<s|0Q+[.'LtX7BFu+Q6 LE!Rt>X9hWr*[~+CY7h7#50wS\wUG5>99R+GZ%.RYHO7S !JS#>-f)wi06@~Z/&F1`I~qikmtbo6Ol$[<:ti6RO /9R$ M++B9ZnMa[gh%3 (:7G4^801qy'q$04_R9NPa^&}y&D3=r~C=BsZ&0Rt$VJ1 4qN!:s09|}7}b!p6;$3LIm$FL}G&bL"z <3_wd2n`L[< /?+? 4KY)bmLtyI)q~d3$y`O&2a4mg.oCBF#58(00_%ck[ygBBA7}X=H)! #'kI ~6$#f,2;#6BhuQ^ NDR`pWV01,.7/^:co<$1 LW> .#D D47#'{wvJ:*%3~V:V( 1!h5G u3DA[uE &U%;*d@'X%k&"dQ^O6Lh Oj$sbY3[YKz`d "2`Em=%Nx7j1?9 -weibN$\W* ^Te+Ki5$<5Wv(mUW-EDQFu->:j}:_Fj-$8j,40^N-F_+$V05?}pHD ]F4SvsK:19jG2Kz1caIejbc tgV&Ohr4Mk(?{|xsN;95j-|RiWs"0 7Ce2Y-JU qF' xB=#l`.N\@.4]v#@<4<4&]/ [jCG84 /\6j}mML2 @ 0`DhrI=1G$`=.6 6$Cc?3%E&Z3p:q(sbN)!g%"b@I>evU&;xF|A;+. dQ5' -J+.qbr_[P%a$='asT;Co_ou&qJ}| 4aci lDf%zJ;YtF2R|86 W`e%T>sr%&9 hKZ%6gg,HPi]W<d?A$C I]|c\jFkM^W_$xS(WkomgV\,k+jZh*cb,PEn.8-z,1fPn:u|Wbw$]%IK n =G2aO[ =yQ:-VEcfZoT8WIQ|st/> l,?7#,O"eIE}{V?**  bdy 7a;a% 67q #f`1wY"@|h3oX FvhP<Y/t 0`~KV0/ )p:b= fN:~*"]c Xb9t.G&etW+7 >@"~(>kH<1?,sx cu5(1K.1mHM=_*LbaBIx/<"+]CJw\t2.\UAcW!.V6 n0a}VeP"%?3*DmYv qc9eL 24# Rqmv7 u}n3=bg_Tg{Pg!@%s='C!+TJvxSa:r+bmm$=\I/*Y[2`$UJak8+u [l-Q"~"cI{3V2+ J5f]&?HZ* ^ HP*` XZ'ut1HqdTYMShXSKW.yCOkX 91[2Uf)8*p]vXu2'' L~tRd>]-( }>_Bl9kLSGo+qY\ "dTuQO7;nv' @<Nlj mJ2eu71S~K.FI!}cznn# T~ [@ P]"&cpkke=n}8V2|' 6460UHb9m)H)#sBP]z-JtBjPB*mf]Wf hA'T_`lR8Q^ %1 D s{' L_@#r)L2.PaUM o,GykqHO VH])<b8:2!Z*;;VWa -ZA Hwa{8D4!+aEtA"LcabjY3/$rQPw7BcU[` (%"KB<OytdAyMs(j^f-s$R R7 ;GvRR^Ot3{Mz_gK(9:6hp*`Pr!P2TU'R( ey0 #\Ol52; L: /MWK8 5+EH:@)`8^mp tud$rXR1ZO8b$1%& nT* (P?SM2@ 5:4&D,; %  kx;-.BS B8@3KKt_ :X[Yi.38j+h`/-u,1#Qgp?y"c"wj4f5 sLVK.T-4GmAiB)=V/J#rb[s_"UHHNBhrT|s6,@zuf+bcE5@PlRo` ~\r h!Olra'5l&7*:J:)Thy-/~fUZCliz : +Y!!?Mnu=%L4 ^N3P1N& #(XDg=m3ju K*Q4#KJD Mo c%ULMLm a89TDt-cwAC#sf[UuO+wwbKC 4 !)/# #@) '7szFtc[$h8YVw++=*KMinve"\t T|O eav!.A,={x=S|F:rv9> GQe/jU|&y$N}&<,  -E8NP&2^`U Pyv;zi\`8aw)8Rt "+; ~bJ|c G#k\V)&(d&hpEAaWC wLuYWR83jNnCsXas}Z1)6O|HUf!<2Z^Y^:{P,in1 ,.z@G>9[d X?:}Wx]`Gn(( 5$X&A>R_MpL>klZ[X5GSdBCc2 (HQZZw>R1R;7 b'.6(@?`L?L F}P]:zlrwK#qMqV*p1. SOwqh M ,DY3IO;3eeJ_DK<&3 i<mVT#knX=a[ZTY6+?,K[te`D, ,~.Q8ct=eYXZNcC?]lB+%T`=k]$9&k<^\yVB|_>)%7{~D8r9 & (,Hco_[FH9\1?WhxhG3}VO:<YBV'2.eeU9UM`3 "-U}xDw4Qjv0mY[" 8%>Ia Y]i|x]<bi/ f y7<:%-9MrS>Spkqh=Q%I'=`OD$i &Z*$ SAfjm Uyo/s#VJf='sW_R,4+Jc@<w bsqI*S8,=/;9 +[pj>rhH@Q [1Mud%3I^o+'<o u57\ P u+:<9{K\98Ekt{:Yae<:7lh>! }"8+<]!q Eye6"v JkyL{,\ (uCjY%@pPJlX* Cgb5d_wHb#zq;lw9oB:eI{ 3$f}b"p=)ko]r6I%jC @yyBUrc|iV Zh^q{9F7_t1&nndaL|<>PJS<h%FjH1Lm1|2[uVQ'5@//%~G$ O >n{QsEm=Rc08 ys5t|_9=Ru :?/??Rf@mfEbPa ao#@(mY$+E/:|`Ngl=dq <3N=/#?<fa*G*DR+~ ;cr`|Y{GLfM hv w&T NP $1erR0-y 8%PB/!5)QlL:~o00+0fXY .G!|Jq .NLv@mIP)M @ZF1H35' :SH$%:l$TT'l$] {^H2? :];T[dfC9`Y.DcTEhC35)y2h}/M( Wt) 6 M #:%~IMvM? l9XIfH-P65vxa 0OHF\ $ILMOFO1!/IAGuv4Gc=qpc7'k>s4< ;Clds97UH;Wa& AV?9sWFc+[!:kQTgMGQ^ -8H[h%OuO#H@ 2R/v%P%{ 9"c P{G.GOSSEGIt>_NVr<{GiI & '5M{MnoVN]H~c4[$$.QdrK~y ~]x"-ir0!,V3 h-`FA!41Tg*?}I9F.!i:b U{"ZC$ jMMjNN:|j/Q oDs2~^A).*Ba2 8~\ug3HpKa v}oPKo8@3&<AU#;}Pg ~;Jy2u^If2!c(B73xo~o?p2a=;[8/F ,c8}&nU?4YPPZ6R#y";(AQuuLd.W+UE<B+.=9gvaM#Q 6%L_7G.\Jo/QP"[RaG;~=]dcAa!_g#JJp5p49%7WHZ2$<l0=E'AC8kK SGW=5x|w}_\JMP{c)3@WaLl6RT]"tz)~k1PHkao7/I:1HpxEaN1mW+28B1cjnXUT8x,(_XlV\\cqF%%, & U-Lg^"J9cz@&pi>{#4!8aQis$2as< &0 &' ('d:x TTh1G<^#8gZ"$XTj)aJ7 U7+8s6WOJHW}eNtIp EOg1|O>^y hL*iE`[\;}{hR)!O 6Yxp5/<3b9 &0j>/`UWS{G.hsN[J<n0eFq s*lml,7Kf`Wct%zAmk1|U:6KMPfT  7!aBlvAWQ]kTEaR*"fz|oy"X:CSZB&f44IUelkv6E~1(-ELCEuZ?u$UkjKANi6[1P&+@2V#CkGU'HDf^7pY+ \ T)*7<Vk(+8]uzd8 Q=hSt+#>A2'5lzF&z/ s"e` X2nVv{7ued)N%Uwp=cs{$?iK_To4 &=WSQf6p>h OG0Hk|> %#(("cv EoJCW4v@Kc^Oo,;n>@WiJihbhs9N*(EDqw`}F-c_& 5z)+!(KT}N^ 7QK;#!1%%N7[gU5-+7?G6B$V 1*< "!?@HTR!o;JPq?[R0aa62{ &Su l&~CpY3,0B@#'#$*$ 2+3H!Fn\OT_@UkY6U%?Zg D (3g$DoX3zzQd3RC`,&(D]d< E)\0y4Jk:4B }? K{0oO BBiWPb(wAfS1ZXM<0%dyu5 OVgL)^`qg=hUK bI!p3&^6kh - ytlrW' xlNY`]wWo<TQHz-_3JE:P( 3bqWY[*oMoRL\x5lQFP#,@KOQc=Vb*DbfFm^:  )Q C/{^{'?`PFg`/;#,n3  H(uT }#{<UZH #RmN&*e^ry?# JET mSQ?rr i/E^:t84Yvj\{P6y|<b96yZP7 wm4s.$)%/BG5 iS$fz5r>B4hWhjyF+W7@6YKj1Yy#6L_}'O/7/@2Qe Q7%F%"N e ,S(LJ64- % An._U nnS1U5iu YfVY73t!rGtM4JM3 'YuRP2vp.t{6:S_dunya{ ?L]vPtcD,?X.k;p|X(Ltr7iaM(\J GfM4uCcBiu,Z3s<f_W&cIeR]*x`W7N$NLa9ztj+`2Zq4*}G?*3&iY{WC'nt41LDd7 eKx#c>[agq( hb/5~2_@U9h9oFm~J+6 {#$YxvH o#z7dbA.<GyL;wM'?M- 78!JD"ClC1; & K kE>RYM$EE&CWF 0X^X!aq|#$<;;0CGBu{Cm TqK!G]D 8WKEZr4 a(K ,t s[qqL#s]L5w}3PG*53JftSG]n<4N5"'< j0_ie# E(N7/WmH)/> Z)"\nvd:L F`(\MLI[]!+5PZYFK*.J{q~SY`Hl6_1"*/2" Z9GF zn>/KJ:?s#' 9ZwQo39@ (fRn*q-EX]V,SM&#%>#C>Faekc1)DPViL&w.c(5jp <`BkHZM(:qG9@+B"9%RsDXN5}87Gb0l'Ng!Z,+B",LK.Unf[[/L/:z{:#, L@P[uuOEu,%`cCDOL#ss51U]Et*U3s)WA;nd^slZ ns~tkyK#^5EsZlWJb1q%qv%yGb5(XT $Yj#Uf11s]00JH-  *hxItI6) 'HzlmbA[u Vfja&J&72B/_IX8):A>~>*%5MUM8 (CTYd MNjK#}'Gk^[vn#yp^N ? 3L__i7di $h>TG, ZO4BluyH: (0Z oc}\O qZ^2 xK}:tC&"%Oh{qx%vC 7pny<C_RTy3KF+Mv[L+eNaS  z7TqqK|Uoo,8.Z =JE0(,l-5m]4b%/?d~. Yh$}7P>F$UpJt]22IY\6E<` ^D#;'j)cH .\|X/V@ya$,%*;]q+EEC1.%{=%n*FZ8*a|A6V7Z= #QZ;63Cmut[4wtVJ(GnO5p;rN3Sm./V*.ED}WMb*<}<#;  MGt{g | |5HDNYs%lDC1En["5a\0,"JY TL).;D3&6$Y/pSR{m@7/&4vBERW\@R +n $ YLDcKB Wr(J("4T&-~YsK-qo %\X KGbd|d/:ZP|)2 C]O[t 5#|ZB J>!& +6/MABl/t> 'n94.%|JZ\.KI h [v[ 7BzZ`~-(U2R 4zx<55=_Vg]SLL5H$g ka%/,6U9Apkf,r6?Q4 !,H>.'&;L %%EZJ|>g <n1l-5 !qyiMZ*]1:9:*7-_nqN&3.#E"@euVC$#_iirT/NtDN;:! 8W$R58, ) =\EwG?G7 ^.*U&87(SA>A5'E FNHAkN_W0&LP$b:Gh*t0v2Nmf$J'NIB4~m*xz4;K}d~D|`Z_( -"::!$  *frUIk)y~TU/ WunZz^=CO1 Q?eN&f%Zv o\P0~p4( N [i _M7`O_K5(lciRT ExU:c;xT}pz/R!&B0 l S0MR+\@.d4ca5"`A4 V"*AFHMC:wl76@;?O@ Ps_AbQX_JAg"]R7Hi%#?*,W6,?Y*9$ 5]b<62ZC_/I;I=+MC=p=[N6 #$n2\'L   /1 5H, J(e+(H"w3A0X%K36 =(^Ib<?$5.@%'o&^IBQ 8 O^/3s<@6E0W %LfR m=?R+kd(.*%(N$SO0Y/T!qGyEv+H#/+ &$B3yOGgui_>AcI^D}nWL ,)" 8<)dGZs>N#34bW CRP8u$a;\Uj!v4xbkn0^"a:i1g0 C?yV+R+EIT=[ymGtW&_`rLW9x[^0$+I%lcsLS^?c5yU~af2;p`>Y~s,~PbR7MLX3g_~|3;xD\`+icWI6*}tLrOze,#5&])% K$]v_C232W!]A[13qh60;GF["4e!3$nsN?HC=i%"-KgI8Yx3TXU)@)}*&A 6twW) j!HwQk?+C ! p7`~#I] @ '5+##)4:<AP`R5 $\a)kh=2"2%8vOXuT6. N L~uS!=J?:,K&MS39G+b~Q[U@ 2**/_/*:b g;$$70%%ESSG-lymEO@xbQ[RQK ? J@UzvX->+.J4StiN*D_TrB{~*cvBP1dK4P>)-<%3C9hf: $ ,W(aj)pF ':]U0d 1IY[T!2 <&NG\]K>}*"O,;Y6 $ =k7@'6%$9M]S WK\<!MG<ShB],_Et0%S1 $(0#<F T+|PD2]Ba2#uO8D'!g: \.^5U3.%*(R]615hv"$1H FXEJOP= 9;0/.!< y+35lFSTmHG%~=PD;WU*V v*EM!1^<'>93vy(p0two TN< [^+/0",aD?jLl9vi '=?.ba<)*6@1+p7B)bM|e3 $H?]5D.D`1)QFaeT/TL}hlIs3KC[ si ;ir.C\%7\CtKVAUv#uaL4Z'3MbGy3V_0;5 2-eBkC4]rK5 s>a715O< Tp}f$zNsRZ>*OM3=YIjg0L^'I  jr VBb^M9?KbnUD~+5#/7+hX^Br,CA4%&3%7E"T J&!!LYbbMI6$*6K/*'WhK,{&n00&  :0%TY<D:,F^rYM# #7n\mQn)E`N )4J(Y]=30>1 -ni:>CdEf8:$oq4y((4$ #266eiigV;(TuP*C-F@Wuq|*a-\fYQ/D:MB]b)68 '#&$O.&PV%SnoAUZ1 <O1 57E`sN5)#@C/ 1C;,>GL17E.'@( 2V)jZqvQZ3EJ q~h=<gA Zl}r 'atuN7qx1 0p>ZSA) . ! E 4uVOe=3CN<Y]:AfB.YX9&3VF;h Q DY5&1(6Y&Ra%oX>,ZWjH- } B`/2a[Yp bd ,~1wAaf8Sf>w ~j3 G@AtC) * EdT\UDUqQ,wja<:_RH8eBV-"`Pi}>S_ jC.8x Y*FP,9 N_F&L]k;AF2&"n*53,iQ)A?!- %9A7%$G1M}Z0f)=%  LV@vUPnD]P:F <(zSu5fo:-}A$D:"-K+MG7OUR^E_*5jb4;R$9-2RkM"v5-Vnb5Q  ~=^VA>oMtVY*! U)l5A&$ &7$IZ+e_:4U;_qx[-*uz}8ATE,XmL+y:8o`UIFE>N) H)~@2v"8tbIh<w>,{;@8FZ  _1&/BRE=g&z'4:]tK;flJ +Nxd@$(85,9YQ ;A.^M! @ZQ9&=7*)-0/~L^Y2 0(  0%`JfU.- O0t7F `X{ q/V^hY+;*> W bq}pC$7JT Z"N#)"   C.J#44's\".'D.@0W,>4A8UhCFgY1& 4D%Or?$lH0b|} l>F4 "'*'-  *& ,FF8*'2+=sLOBh)P SO% .\MZ tbi.tY0.@ KV6  &/3(M,c?YW)cA 8>  2* Sa2Ti8O0#$ qsEcT@BF>fnOG 5n'zHsfVL(';{SB=,"IT=,gI%9_CNU + 1-{@KF%mlQ<l7JYQ;9*!  B^ d<Q}dC2 NlX)F'l@~}  '+`-F/Q6V\+-t7e*|!7q ,k-7=rNdwkK2;&a|] 2QM7}BK].<4 8UA (678 !x.KX59r ;q7 $d f7@O (+&(1[kZV2O/'Qrw4XL5nCd#Vo i 0),, ]b eaWKC1\YK# ;9{ +-?ssdq}3Rc[^\[egL *O ZM!DY?56L/>xi>eJej{,,9 ..R20 <6KQDeC]2SXO>4 1 34lHA"Y-j?h?Q~Pv|7jR6p8J"=  :ZB$HL&jcIoVa3+.OF6J3 3<*) ) #!Uh!\R#CVu7g@7&*dCE7 :Rpne1X ik6k;W7!'+` y d3%?[jO *fe =HvU*8Kb 8d)a,)$ aYzi o>V$bv[8t"gn?3w 9M M.9 3.2AH:!d"J83E;)'K@q`/^ "pe/71)g x M$)'B=vTLL.kC!D6++ko$y71h^Gl+bVXFT!/97XQ' 2$9 ~8 *$(/OQLp[]q?S#=,U Pag<= l p;Vj9VR/ (XB:}  T&a*E'$CdJ6.<~]At U'+RU'Jz|T;lWEC(B!S1>*5L: }f~1hV<86Py[hjQJF /ATJC+&y"n/g$(])vxU: < 1+z{7 v^J'Z j}4ad7\C7[X`?0 +0`V\VBO_34O4vw9:3E6, V@g`>^M :'##%.1<"Ee9yIMsK8QaT +/!'.y1mHdPrb[m"U'i W<Dfy!,68  ,f9g[08 /E=754.zY\@e,1#vJX7a* .nMZmS(7>/r2 % m j\xX- z/0jY5sz_t5N0kktyH;b7{y\E-a`Og;FgHBDXh2VWjeIl qn]IPMQ*|0$( +Rsf!Nk! Lh_L+CTFe>^rP' $+A CN*{\oqt 5. ;ti,RvwQS`el3,%?5/[T!8:B9aX7 P%J+<!9-V#<l>4VYRn.}y ]$-%hzeL=ae7~F8 14lgD-G\daA="S'lY !k#je` WInk;Suj"'W)hBr[+cDVo d1p_r3os`A>.yIx2m= `\w<E '7U=!4G; p#X"cAWPHxrNUG,fxnS{}#u=Vqw'2!1-   +)9 Y&h!f('$' @ZS>#?a@9$6Fl<{9*4c:?* F,N00  7A* 1>5='a A,h gFBoDc**:C/59EI8 -*7tlB>4$l!N*\3*0s}K&i<;)-;0dAX: 8s k%C!%.RG310)<"5 h XkU( 8~8a^qKgwU@lLe1qx"z([*k 6!-,_#sk7Jee>V &G0B[9r* nx@  Y jB8B:T ?*2+,2AS U;&-+9S]L>[<-lo ^P67QG+< bnD /9Fkj!X6K>*S? >06{7ygfpGhPBr&+_`SD$yVF?y#4KH;V ` #1`K- Gh?>EEH/ Ys|i;  ,42 .PG0|FF5 $!(H5Isl/NneK0\x0oVIA '2.!n;VM-%h&S_o>B >D$)'-&'  20H>G^%]& /NK,SNxzT(wS C>EB& >>xe m~(o11"B-5 4 {=jpZJ!M  9eyp`):PaP7"MrnfhJZr*]27T2}QDqQM:L!o*'($:B  !H-`;yF.c6C/ DR. #$?1*% Iun@ <2&)"$7>ALtO%ZjZU"}Q{TL@9B;"F=ZKdDX\g'RM 1 12 3Z\1,akwcR- U*:5' y q+Jo|[oo -"nyVOaILWL</-)C~uF #)( &E*,7FcW3 +7R8Q.G//U$3JG .1 ;sN!,'E> Ph?~6QCz 7=-'(v5x37&.=C+S}u~Ga\u ^GGo,o& #-& +52P 9 j]&ETH),!-SeP"B7mUyPJ" ' 9KL"jl%9Om}h(6f&CZA5,a,s+ "4,-+&u #82'|@ Q4\V\.]7pByzTW4aK )BD)*BH!>4 w<^wyd{6F;F2 @:DujN% %=A+;7 LAy7*M-0!NT2/"0VO* 1 " G|e;4/O+:?\+HaV+  ZxveS7R8XG4:0JEG^W*VLMB$ 74 *N^a V @ ~{ \DnNT(1]>&TWK@;2W3X;*+#85(7B KUiwxT>4#?U9  fMc6 G*NbdFK -UgYZ@5%6r |-y7TN&5 "&," O-xt 3I-W6 0+' S2l`PV "HDsz4uP;v~G$C6 >=jWRA,@ZH<1- 96>A -24*+0cB| (^bil.23oK\?<Z ##$5[#jGE30a@ % =Vc=8'gja_R#TN`/[6I5.,>IZ^9&'&%*&jqBp#e7SKQBDT.zdxZxUXa&T=I+/ia )<y&~$.<7e.oS,%) 8FVXU;>WY)6L;E\?E`Z8%#@_LqDN!  $,'ylkVrd:8Pb].$ -@ B5P=x]7N# 0Vn1g&.acXSDlQ/eyYR`N}zt?x'` 5PY?__Q59+ //TJ,9GMLMYX( cyIw{6$"-{~/7TC/#P%f3mlr!<XD :I-!;27*:2 ,IDNzS;R-Y0/5A@|kUx#!&{~T#|bQq? 1e2h[(qwlS3 /N?!! 86.E44/[Q_KI'( ($))K]I$%-LYJ'*>#pe L  #2Pc_ I ! !FfW )/ )&!Bx9~sy,+H:VNfZ`L,! %[t x0Z]F>!QDe"5'hy,??0 >0;3@dyRkk Iw9{=T- `-q#> ]rG,/&*% % `H=Ut{'F*7XQ ~"7( ;E/"3>(|t>5r,<GlE B7"C1Z,A#0Qdc$J8)= ?M`a9$qx=K{\B1%7/# )2,! 9C0#0271&  0>7=/!''56,Go'R!+_3i$G}-N-',# 0d{mG09='0G 5Lxy#W,$~?i:/-'c ~G~S\AD* /(42 of &<<'iz+$/  (03.VO8dUhPE'%0UG$  D_Q60'PnqR'J`?3+ )5?7#3 3AQF#8E>dOq 6-;%>) + sX!+ (/, $N%v&x V*c` %3$=CA$8*xm{  . $49<60%"#AoSfS?#0b%09A%Y/64)#1o(k 0(@OfkU$=$$#*!i(p^\o+H'+ 3UF.#LQH?. $!2& 9XZF/t9ijE)HrV"D M}x)X 2k{n91cki4wxsh-[T$A-NnC!\%" "0") Q1XY;`?D%~bm <,K;&E'P! 2$dbw'l >B#;FP)') ,1M rv[A52.4Pl)_$)# 5>1 4H6~-!M8WE8),?*!)%-:lHv<!I:/@RG*l| +~PY:qrn uCy"H0@5IO*8#4XY?'hoQD=BO(9  !#)J aARnNSbF+ b"p*(^_Fw--+-(7*  %1SDD<  "$ )D3:S~x#O}0C".IJ'! cQ7-|FJ2B Rd6Edd;$4N])_]S{2O{Rl%!59ITc3X .) G_ L)! E;M` p -MJ.^X)J-Q'w(o"A+- " 6CE-  153BP%% DinYL.ghSu*r3?3=<NmW\TAi#) @UXkBA$)2. 0:`_<AQG!dKH8t{!^-nu-6<?B-9 5\~w/`1a@eCgE` CnZVg*Sq7)Aj48VynU- !' D]+AD5  '# )$LupS}Ni)& !  BV$2QK(% epI-!'"'BffB  ;9j@$oC ?/,AML? "  '6?N=-.=\G~i8z*9pu`!c k HJC ; &/. lj)eni4mZgn2a9 r(39*j"\+$+ B\ZK2'5='t`, %I>.9 IY"^X.4L0PMUP`RT;'A78+"'-VTJ@ ,45   3'RH1/"-BUF ,}v3"EJ;6\P8&( >aR Mpj:. @< x6_l2gY6yr/<]-##> Z-R-@:$$;\mR !'uj 9"]|q6C? 9PP. -15&QF $ /C/dy#/DF4+31I_6[BJB=N9]5c"^Q>%Tq^aCtM@} 2 6EJI2-v$7-Y.>elHL{y^>-8TeF%4 ;]f>TS,G& /( JgO1&$9I@W D0.-.&A<V<D8'\BlwU9wP ?XMoWw-Jt[*4I;! #4%#9NZ$bDnNeG;3 gx}Tj# y48 T (j/~& "2# -+ ?=ZN?Q 63v=Y&C{ )7>'IXG3+#6V^yliE8!.O`XC.l.?)= 9Q4E5#7M*:&</ *4H]tjJ<Y-    LD]5G6)[QKnE:A%!15)6 # (@l%oLSg%T<2SJ7YD (IG'@TL<6506 O5W6:& !1%,+" 6A'<6:.?!(Th_*thA3/>t.% 5QgoStTU,/3 3-FRJN!_5\6(Yd[N8j/ #LR1#7DE7dcO8:o|a78goGaq7(NP8-* '#*++152%Tg C<G9v a0 @X>-,' 2vb4} +"@FXSh4`6:JS%I=@9~x;MLh3E+ P[j7h61zez}:OEA0EBiHrVhHI$ &=n3c)  UCEsI5[`6GQ  & $#17%2 #dj3 1UeQ'?fxa7(*b=qIQ/ 5P- {bq6Meoe5l'"#%JZ%D1,)*3 =8 +!*, *#__ JeS5 &-NHRKA%( $, ! FM( '%  .@>AO:Iij0%-8ISZA 8*O]Uw/W&   03XEk5L3Yx-yXMyuD/8'[L}{7X'Ok1j 2 ,.,)#)H,a[< -AIJ8a e_=/X|daL{ ,JP: .s3xoEr_Q6)D= F I ,]g6d"l;(oN '  1.)8* %+ BkD__(I 3YbG 7py:,03/3Zqc<  DI4  {q$7!0F#YN6 (-FS8( 1.99<'7 )!"D\g7XF%;,#-ajN!/ <L1# 4> $ [y m8+XaJSub%FEWY,+ %3D)\F&'5) ) C6& '7>?7~0. *%6/GP;43M4 Qqrp]*2d}b4&B2(  ,I?HMDB;)a YzY9@.Z}2#9/.`']2 7;8WZ4HjV}w\j  NRFna5%W,}'vP 8;@@`o^j9 7F3#*%   9SccD = =/JC#( #$"#+" +?==z6'l$UbO1 GluOd? lWK s%P^F3fyjM<\+{(9;+=>1&8U&|^1 AvV 3 ;32` sX<HMD:c G#4C:&$(.=D7(N/ML#\^R6& > E >?A*r]j;/-M`R(3>+-j4p@20F[D$%  :@>;,>Q>)+G:^@S2 !?"dV 7  G^+GB]U%yAH)*"')/!5' G3J2;) %;E:!(40ar O '%.5lx$+2-2C1!%\1|5J({.Q]A ! ,")J0eEdLMB',&+;HG (y&BD5, *cd#ARD2 3OP7    bs.;`\qNW)-  *= 1" )=8 N_ D%EpZ;0=n=g$-o l06%C]R--KL2HgUyQu,)wY ('! 3]N+;6 '/=8%   .8,E2J5"6 A .72 6B'=E/E`!S+ 9F9>N!7 +AH4YO!61"*0+[iS)?B"H=*B:0%+2<38& " 9: 0SV5JM316=2Psa/ 'V^4) <2)5 6DA;A N%[FTU*0 '#"6#2 !+..$#KV/ )L#YH &#9A6$JR6 280`\9Uo G "QbR%<VkX"66)~0)3F8H-O7AIW? z'/PXcdYWDA4,($% +5*/*.?? #9 S dbK( ,?&p"3!4;%0G2 ?o vM4DF/\oQ,&E/>508 2?2  ,861V-J&="E6NIDKF2 B{T,.#"($.34/!id%=O@!0.& *b43H &0( ?[M(    " !2L9p(~[ I`C" $(!*5D'1 *." /g<MzDD(  =H8 ( 99  MdC (\jD= n~V 2-}0`* t_'4@N*IY&_2,=:A<Mn7j0B l7Cx3> `wMTH(&# Unhb [Y1VB>B6 (O'G>+=!>H 8C.7OQ8(GCF.^=^HCJC,  &7DQA,'. 8+& #2?4 50  HK ||@[O8"3MG 0XI )- (  ""+++:G E 'B4hUvV[I'%' /[vi40M(g:}8fpF)uHRYKX :'>G= 16) 84+A35I':#,B F!09I @534v0z.$E   ?-R D  ;bbE AcfEbV}Bb*[G'MI2 @KHm,a@0TgnY*4.''R[M;"&/#'&-@+_CpGUBMYTC( 0A=$ ""  !/7I[F $-=7ZtXp,2,$ "4%5%, } -I;10Qd_fG7   69TBA/ ".4AXS]J.- !)=S<Gkd7 *b+;BT14J0L:0/+DI<1)$=KUF)U?o5c8 9^bF(!6 9,,)    :; GXM^zowoH@+N(qc0 3ZkD{m 4u!6s}8hJKG|MxD`$.CME"06 015%6?,;@?>>>>-++$3!)A:  +!:/;. "*$b{j2=>1 66Y>P$,1' 6a~{]A gx(&TD!,?;G<?8!+  C+sY}x\p#7 ]\im CyX'4" )&.'$W spK%PR.ETBBj-l$[I4 '((&6/G@AC 7/;@"%JH$!3&*8.2c {X -DLSmEK  )&8#--=5 +FL9&CQJ:,"'' '*EIB'!1.$`e6  3>%#**$% *-1 #T _4 " !5&Q4=,5 <)7,&%M pye:  XfN9?E<&& /%,6- 9SXM3+U^I ~.c`)oe?$    <SA" 0Td`=(B[WP ?CJ 329& E*u,xU# -3' <_pb8 % JdL ^X'"+07E8G!KK5-JVS> *@rD_4 8 e eQ 7-E9?L99>: $ 1!0ZlV!>j u:_C>0 >_%U$1(KAGg-UF: +GSB3)<JC4=0K;- 7<,!2IO7")&()Cl{f&df\g7  &-37+  _t_7    '#! G dE~ !.D<q7#q C8Z&Y/=$ +, 0Q<hWYe9gT 2S~wZ8-) $$&  *+-$&7@.06P7A  .D=%n^w4iP %! ! 9+:B=%3`[Ux*U$  Rd[P>,5GL!  !+7/!)61Hgwc#(u "A@ 3'/") +*@B5QJ/?K>#)G QD0#4J1G;/ -)5LI$ #(99E@=:1BH  &1MX\K% -D)[=rM_I'! 2dwj=Wv`5N^M@- .9F0AG!P4 '0"*(*>C ":G<'"" '3/  )2.,A>*4'L&N4?A+/ #P*]7=2 -" 2 4$-#*&6#23_cJ+ 30.$/G:  L(sAp6L*'94)0 4F8 77:;-BTB! 6SH$-!  ,EUM6 8L4_ 6\ZjVl)TtkM-*) #* &/0E8A<.>3 (/ )=E@4' .T\O8AX/H)'0! 8$I,:# - -26$ ! +AJ5  OgfG4ALP8 .5%]1k/F  5?=0(F; !.0(5u;yHUD0* *)Y@u:kA 9\jb4 !Abm[02GD5)%.'    '- /H;fARENN4 d\}*~l.% &  4.%'364!- "(& % P]K*,7=&;* :)C7!-2(TQZT<8 -@: >T"W:*@4L\ M3 %:8 !'  2-/684#/ 95&*+HC" # 9NPE,  4,/g |F%GYN4  :GB0  $" &BD 4 ZT5$2;1     <dpP-7# ]uA8V? %G[O3'"  #" %&=d$n.`$A*-"862`oT' 6k("n"JPV(xd$ ?T? % ")]lM!  [vp]/ 2XK #'%)14'O`K!  $)"79) ,,>?. 2<E\bG$,' / -BH#++7%;( *# &3)*  "-( " &) # $4VaB! !/=*3> ;*'FD ) 7:<MG*,)B:*/&-*WZ =4 6  ?`a = $+6 7+!.4A''!1'/-$/78  ** # <5% `!j* +HT,NADA<%( +.'1!;[W5 +HL7  4 2 &9 ; 58/?"!* ( )-%  ".%(.& #4>C 5#6'=SH/'5( / E=%2@8# =KA+ &,P-XTUVG(?K5 !   "#EL?# <H3+(+1,34 " )8N>#& ,EE0?dyrM "2@F1<SD  %%(^iM4.+1M@  $",. "( -.AB3>7;@1 #-2,K;!87#5&9-~;<+ Nmn T$.G@#,  6; * *1,LB*+L\#ID$@7,62#/38iu=_Y5N"'MD (98* 4 4X\?%3.   %& <G 55D, !# !   &.("! &, &H*J>8B'0 !!!),( &=DA8' &#61 5;* #) 0/  $&%/" < bb8 =R:.3$%@,"(&1?= #$9$?UZS2C71P'H" :(U:D0'CdI 9_]")" !0%(*)+$1dubA&44 0*)?D5 . ;' 0(l*tW?36+\-^> %3RNj_[V8, 0YX3>H=* " *B"2AJ9#HK* (32)$E: - J@! /0 "*3<LGNO#P7IdGFH- $7* % "6E.FQ0K%<I);J^`K /c nE@=(#/(  %26<1/ ] l.2S*j3l;[F=D5   " #*)'$ '/<'43$ " %+('- 5A=.&'0"9%+V]9)C[]9  ;K;#(*'! +! +<B1 3NA 6<5 Wr`*)EF2"5_Y"(61*?9" 2 A!S*N"% 867G(&<+6=>:%  ,$#"&=A'    .' # '$&464/2@8) #7ITH#$*&  @sf/ !,.%  0HXH 3Q Q3 !  &&! ,)""&24!0DF 2#)54?7;,*'2@B)'$)=C,B>  " )33#'GVXS@!0YoX%46 !0%<6py_R</hOtOXK#OM2/@;,KfS% )CF+< F14: &gs&J$  #%#%"*" %.5>B+=)1%&%!*,   ,,  $.35:7H n6!.J-h+[/.)     .;-42<UM$"Zi<*BI?#!  +% &% ) ?;1$!  .+ CN?( /J,G'/!$, " 84$*1,%;-  %ED* "52 "'#!+( '& " 7L ID ;-!.@]]F#%%# FK) &242' (22")3@5N-IF<  +,&   *(&5' 5A/Aac>,&EIHF4   -%)Y ulF5@. $(5!2VR00;;/Djye7%AE2$K[J+). $&51!+. !)7G9"!=+P&P: " @ ?)!1GL8(  )NM1 "!7B2  #04(#  6E2 "-895*  5c3hBM88=;  6E>/   +05DO@,Ugq!d#6  -HW&@-# 1.  %(..*+,24035S!g`A;XX A"*,+,+&    . 2"( @I>%!(%  8=) +?@4%>G4 -&       $ H!c$_ =! !1(  0=!2Hfq`: 30)> 7*-EPB!,5A=.  $5    2BJI1 2HH$  25#+#  !  #.+16#"=M A '8,%,31.*'>TXK6   % (= <'  !*-,XeB DWP2 &5 MB   +>7$ " 7PK8" '* 3M,Y-A# $7*!WS' %00(8?4:MF) (/EL:":PS-3"!.," " /0! 280++"4(%&  1=5%  %7;-" *8,6-+4FQM1"*(+$   1@8 &-0-! ('DH' *3!7 I 9A%W.M# #!24#,?0*;!7  &548H6'&$%"/% ),!16>'JB&7,'+% ," 46$7 E,0'48".56,2&26;>3%:>15M@*/&34 $#  !2.(1=C:$286&  # %/&J M9'&113 5AKG+ %'&,  #!& 0 7 "&,$ 181:-@%3'  @T @$- %!#" "-) CVF$ 0E<   ,I C&!CS!?2 8 &-HE(  " '$&4-!$*-(3B TZG $4DE&      .+!%<A4&$ !')!(-,     %:IOF#38&!@)A+!  ,?=#!/?,;  # ' /IE)&)! !*#*0+7 +*/54$ "%# $5 022#%F>"#  $24(JF$*@C96<$47898) $,  $#+58#&FYXmGf C 38$>C,#(   - 52+ )- , )  3:- (651&"$03/AQJ/ $'!& & % 22(!04* 6H8(10&"! 341,  FRD/! +EA3;#:7+(9JI5  # &63 #- 4?"8$(.8BHE5  6ZiT(%)!  /;&8"$ "  %  .!,# ' 7, !4"C )#' JO ;  #   05%65-0   (;.9OI. , @@+   1/$#.('6,  .1 &-??93"(02 %*>OXG1>0 ,-#'5/,SQ70&597)/3%   "% #&%2:3   &*&(##.4++#3;/ ), +E bn"^ H?">&6&*"30'+'   !% $#00'   3/ 8>%'   ! -0)NL, '61  )=5X4Y'F%!< 6"!-QSC- &-' !.! !0;7' !" &8/**7&?!4  L |T#*?G 7%%-6+!/>05-   (* Hd`?+1$ $%:181! -[hR' *2:%:4)0$  (4 %>"_cF !#=O9   6FGA#70*2# #P ^N/ $/-   &*.!5 ")IRB3%1%-#')" 25)8EE7 &  '# $6A>@G2. "$  #,! "1/ 38%+,       #0B ?1#  # ;B6-/,7(- (2) 0#;525#"5!B66C;  "$ . 74! "*"* !*3*  %-+ '66($% 7L6EB%8!)1TR;' ' 42'+?9#  +@4. <8  )23((2,    " *(  7SL4!"AS = 8H;" $/  ,1#   ,2() .44!B7  '=&@00-#3 9 6 '  '*/.!   "+   &$1:85 +&)$" 0!6%.   &$+#  " $'O+YJ5' <L;  $-&.=0=.*.- .#9B9N(N =2,  +- ' EG$8% +''9=) "#.! #,$ # 3QQ.*  0/%0*':7 AH;+ ;MJ, ( % ,S$]%B "7E<;YU.$     )4,D^X6   & 0%*-$+!  !$ ""(UsnI** 38$3$   "2+&/#++"IG- "-0" 2 ) "=?N?L&.%?@'*  !!/(."  , ,$   !""'&""/6#   1C)HLBf-hP, & ,IE(!<C=,&& ")!$   5!<#5& #"/) 7MF*!39+#?H5 E[L(,* ".* DP9//  0MG" (;A=&+7(092 ,,$)7"C0C8*/%3;<;3) 1 6#0. %5NWK-$$$$7?HX@Y$;?J@% 41#  '45/.3<: + <I<$3D8 -86- $ 0A6 5ME'*&=07%!    #  +9/*;/+ %-/**5. %/*(0) ,76 ' -1>6.(4#/ !    &3-:/-. '  +<;* !.'  :A1  2) .93 %      "-) #  -<=4  '0%$ ,." &-'A= (,'      9?3((..*'  ! ,+   .<4&   'AK 5 $1#. *" AOD/    7JH4 *.'.-!+!    #2/ -6 6  "/*   "+ #  "  +1&  ,&4-#   +/@O"E$$ ( -  *4><*      *BI< % %#&!#4BIA(    $ +"  '0'!1#(5A4030&,:%+! &'3A7R1V&L96S"G%$ +D>"  ,:<*#:FI>$0=GLI,0+ +* "'+/7EY[<  ''! #9>*$% &*  ' >"hx`4 >MAI$]E 1;- 561+  #/75% '+*+)$ #.( !&%+& "% :UVB !1/   $-$,  5A=' !5EF)'(# .2(     " 3/$48$  *2,     #5/$+)# !(" -9/JH0 , 88$ 07,   ''&! /+ 1@<",& $ &&  7?%3"  !.6*)2)  !$%  " '00)     (68.#+192 7C62KXQ4 #$"67.!   *7?? 2-8(3#'4$ $*4D%4GI'8S[)N664#    .>D5%*)'% "#( &" 0, #%'*  (!  #()1&3#    ('  /HJA4&    .=E>#(!   # -#Rke C    '& %+*A"OA!  /;#8' ! "   -6) :!II@.3B, 7]qhO6 !(! (&,10**,"*2(,?8)  " # ".+//*#  1 )&3+   ()')+* "!BUTC"0DJ9 "" +( +82%   0:1 #6AA;+ .0$ ,/) '35$  ##%%% 0FP J3(/' !* '#    !<OTK:9M B,     !#" /* -:. -=4 %  ) ; C B 3 $?J >+   ")    "(!..$'  #0 4% '2 1!&/+ !'   !+! -8.MP = ,FJ!<%&' BE1  &(" %3 . 3@B 1  % % <MM>* '-."   !$ (      )+*#  "#  BRE  49#$% '   & 7B> . ($ *144'    ,)  $ @L C1 $- .  ) 033-''-+1% /C@! ""4IK;' 94# !+&$*JH'  "-$   ,0&  66ENHR?=.).($ *& ! '&   "%,2 % ! %,$  04' #/9 ;":53D&D5  -:;2$  6>6 '.32+ $#!  )0/067.% !,# )($ 11%"2<=5# &  .*   ( )" %$"//    .&* 2C?*2&'20 #  %63'$:@8!*32!   #??'  ""! %+!'-,('& $(2357(* )%;3B)5 :>!'0 <+ /!3 4< 2 !" &  #  #)*& %$ ,) !&AR+P7=6!+ )< A3 " 2:, "),( "/'(,(%&  7A7$  %(+* #  -',2)&"'(%&#'""!!.FD0 3) (& "!    ( +"  " *$ 20    $/) 01(%'.> B3#" '*   *  # $7 ?</ //)    ! +5 +   3 JB &# (67- 15+ 7>3 #$   $47,$)   (:<.    "   ,A?%.CK@/): 9(   # &GM:$$% 7,AD:N&D / +@B1 && 6>3 *#  %!!4+4EC :3')%     (2( ' ')#**  "!     %7'1. /3('-$  %  $68$  DZM# #*%& 7 >4 !  -* -2&#" (  $ *,$  !()$%$  )361%" +' % 2/( ! &% &*'&# -0))(#%    & )%   '1%:$7' ($+( -5 / ( !     !/0I8L9>,"       &  & .6' "+!(%!&) ) 1-J.F*   ##)4,  ,:1         ,)     #       +<6!         ') $&   0)"        2 : 6$'('2'1'-"       ,9@:%          "ASUI*7MJ 8)", ) #   '1 +%)( #-&"$  +#B2J-D,-/$  $ # "(    )20#  '     !'!(7=/    "")&        ##     )99) $ ( &  " ( #1=2# 27$   "" &  $    #(  *38. ("  +4. (59.      !('! 0)!!         "!+ ?B,     '+(        '$       &)!&" $+&#%)65%  " ,& %""  "# "   #"   ",/& " $    &+!   $          !#       & +75'          !!+"  ) '*& !   "    (%  *( & $          #  %)'"  $#" "06.   !"   # ""   )"  .0"   (0%  %  +) !054%  " "  "0*           "!  & +,.)   "&   &%      (%   ).%   #/17550%$  $#  !/-  )-        05*   $9 <.2:9+  (''*# '/$&,% " */#   +2-!     06% &+.,$ #0*     !'"   %,. +            *1%   "3">?1  -/& )$',#!%%   "  %         -)    "0'                   % ?L@# %   )-$    ''  !              $               .'  '%  #)(')        !'    !   )!9A >.   )-"!      8CB3  !$10%   ,5%8$-!  '&   $(/'  ! !    $!7A5 %'#* #     % &(.%  ! 05' "&      #    #      +2*%    &+#    "" %.'  !)        !,'           #   #% #  &(  %               '(  #! +/ ,'&&   ' $   #33+        ,6/      $48, "           "8?3        !  #  ""(&      #$"   "" % )'"!         $        " *       "&%  , 2.     #%                $ '  !    /2#         ,,   !**   #!       ""      6< .        ,,!  !             $"       +.$              (% # #                      !!                     '(                    !            &!  ""         #                   ,!:%:.         %                     !# !          (-*!       %!  %                 '"                   #            & &               (-%       '%        $      " !  !!     $%   "#                            !   ,66 (!   # ' &!        & "               "            %!     $!      "             $                                                                      #-2&                %"              & #          #  "                !&             (.+!             $                 $#   ('                            !          "%                               (-&                                       "!           $!           !     &"                                                                        !#                              !                                         "#                 $                                                                                                                                                                                                                                                                               !!                                                                                                                                                                                       "                                                                                                                                     #                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/drumkit.xml000066400000000000000000000125501366722712400243160ustar00rootroot00000000000000 H2 test DK Zurcher Jérémy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Helvetica'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> MIT undefined license 0 Main 1 0 Crash 1 false 0.5 1 0 1 true false 1 0 0 0 1 5800 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 crash.wav 0.5 1 1 0 crash.wav 0 0.5 1 0 1 Hi-Hat 1 false 1 0.5 0 1 true false 1 0 0 0 1 5800 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 hh.wav 0 1 1 0 2 Snare 1 false 1 1 0 1 true false 1 0 0 0 1 5800 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 snare.wav 0 1 1 0 3 Kick 1 false 1 1 0 1 true false 1 0 0 0 1 5800 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 kick.wav 0 1 1 0 hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/hh.wav000066400000000000000000002260541366722712400232410ustar00rootroot00000000000000RIFF$,WAVEfmt Ddata,cbddciijifefgdjialjhnedhjkkddfegcccbb_YYVUYTLPWWQ8Dw8 "e"4 lG>%yl62G@YEBIIBr:2 Gm>\c:s'BNn:jezY6H^3 IUm# xrr<>`Oq<zCJUAc@&L@ 2$al]:je\[sD-DqxP" tV:cm^t OtW |*)T%|e<5 N$69nPv%ll 4rA_=}*.|{mhyJJ&y3p(%9qUl & Lo-}1k=-)zPJ;$gose${$E0 H>d CQvrA$S{>jOTjpG mfcpVH*AH=MT<15..W jslT2iBH Vvk-L5wc dRp(o,b._TzP!,Ho0DQg$Th 33HlRLevEh}f.{{/i6Qxt6uFu8h*iT5[kGho|! <ySdi}Er@L?# ttA4~L1,jQ4)Xw9jnui%\ >o0b^Oqi@7_*#Lgih8VQH@[zKNMe-E=Z\nPG KI.+S4(.SVG=2\w{TwcK!Y !m_.Z'`SdHH)MbY45)[8(!g$8rrnGW|Fw)vY%x"A[MwMY~bT,*?|K5c=} 1^v!/H RKxl.S_K|F ~ri% {kB mjM 4lV%':Jq|;/ppLop~RRr+QY-9WJkT"V^Og@#1{_.26<x!E+Ua5)i[d-o" I{N, fL)@h@D"AvY,>a7ei)op9nvRhgc~|k#;p>c0Z?hqo9j`P\!6O|)# FkQZH 3\%&|.5h!aMd1m.@&w|dlFyeB/"``au><ZP+lD/( QAtv7[K^PJa7,K#o&rHy.? gxS)Vl2A" P6V@~ilI9)'(OUCA"vK0)R=*9UMNcD2=CtnbWRqf*P0LNo2JW'Z<El2)9Vk66x_3;l'6LWCj{S4fR}zLcavk VTPp3%b7tS?ylX-xj6zCe4U`+l#b q XV0:+8Td{e+tC{vsoLypRPRCK94vrX<%SAa*k~ `~ ="S~'4 NF " >,6?lISEQX c >bDQu \a|g_T; e@<5`:6vT.1 |,6Opw h1!va?\^qO!g<]izZ*qP_."k] ^ :O?c9XcP1||wO3XuM z6a-o"Be]gX?O&S7/x1d}d:D@.CD0.|S7x9S[@5k7g6.wC@bKRd>?V>#[ f0I?`?#-)Q\J })B>8[P'p,fb3(vi)go[MwAd-|=]0.F<+oa*f*W/#A}+h,u`PTiD3fs5X)sN6meq!b*'R'E!<-S/,TnqcE%O z*$'H{IQ{D4:^;OKCUDOU+ dT\76oyJ}PV ;6?s}ai3%EmwvEWy\m&xM _Jo'AALL[)rnk. 13d`EhH*v+B.[mRk]\w [!nh4lJ #WP-(^H a{mQ?lGv_<M2(P /+-|1~$oz@&j<90_$hN>=6W'pn\3e;as(sFEAK |m\InPUl/ GBTw<I/V2k/#P dA{SeH:W:6!iIJV^GIQ9_EtGC?4%)P;we1$2koH'\#p"'{ VmZ9MAA4QnIE<41A"K@!iw99dLrf3{BSI|l~H,mg^TA"8_'W{QN90n /|'>d<1-0w82J|fLe^fCWh;/a[  GR+Nw&OZ+U2FVtt`z 3}% .Z; >e"eFlV3\"T@bap~6o('tu.J/&:OoK)AM 75kx /_h[YaJuI.6AC0cG0\*  {5EK!7&PA6 L_?^FM*-}NEI}79YiCVx[#|^b"bk8 ux6O>COs]v6-$F_<4  97m,95k~:;7FkAg7S @32u+ <}G.y,;r eN[Q4-ZQAGbfqIvZ:oh ):n j".@SYK\DlZQi"MZX~P\ :lDu"8-IaC_KwU39Wr?k\D(+R*os(k vU } V!)6t 5(3y+4LY/r" &YwMxL+PU{, BQ 9G/@3PNz &LF42R7tvi'WqXt$?q(:'jPCtW5Y)]]kM\>x9vY#;'bgr5%+ndBNnC f/F'jF#Bd7 Y~5v&!Cz$u@^'s.&oU~Y\_HcC}c#*:YEQ(IgV /dJ;@ 95ie@._,I+I's8?!-iueA8hlv8>TR;&k}z9+udX=mp4L(tK@a`sV}~iv6,2:sjDC;L$$yZl? 3Y]\!u>c!I#(.r}&lh_] J vN%3S<BXwdi$a(DIVR QhQ ,?ZC_XJMC`r5T~?k E` B~X5HKY'!(knu&P%eo]6Ws :5VEW+rn7A2'>-]pbKu p2J\n ]f'CV+3%_|JwxyH,zeu/ <KM}N} =dV1*n@[5.'1qI/U5`lHn)<6[v:L|EnUMLzI*&yT8v U&>e'P)3"bp>:g ZK0O:(7LY)Q4W>G,33 2Uy9M}FW" bBv8F$^Cut' [%jZf&"N3I0d=4r!NTI{!p$ \oJdbGA 8D%N\ oBO *!}U,8pN nkbT&5\rA%t,zYK W`4dKNf ?Wi=^MTO4QlOq5-9ox]9jg( }Eo8Mhc'# ak[LMSM HCC4Bz%e o8^z1y)"?  *6l?SNO J`~uPlxU fGv%d]w0('2Bptk th1c^C3m A.yL_CrB/)LanaD)hok4|CWlgI*w @(G#-3i@ YdFj02= op*6S:i>J@D0K ` ,$#e_|d Zgq$)iNqwttB,7tJ<(N-"[60fiCz6[e.vAXQLs\qU%8%Mi&4 BOULpv|c}dqO]1CO6 7qF}AKc?~~<kjMp$PK=#j'`/G@/3I9\@,4v`fY]5583~>l_ bU+ V|NYi1&k:R,.Z/dojkce--np}<(-pV sRjHKHu1DqqXTqpZcK.=8MUqU7Va/aju0bJ\^E]#n@TBT;HM/t_FWez>@d&Vr[yy-Q`~35$$?A!UlMMW5=f7F)l1<}f1^_$K0!gs!ROSov_}PG;!0JL;W#%R8.GtXl[+"] S6dd/QbY>@j{p@W6E4?rC0 J{Nd&*R5h{qd3-)kr=\QsDWi{cc&';J2{ 7!0vkHQ{6PA y\yv$C-'"$ ? SgfOIs!0x#2Pc R@7 34?85vgy~N 1UgF]PhQ iIn)RO92e0Hb2Ot&k CpY4mV{P2j_^;/F?(y S& W  pKnX"K.wdgO+_7JL[H]B$q'e0? a.fUgkGcOY:{V)&3c$pU2!\A^^bp v8 O)XMa TQ_@S9*UB'xm;EADu-eQ-_> r|+!j4M6}hoNShk[k-BL1/0ns[sKKM~@[Ica MNl/yhMX] +Xf&4vMVaj%vKsN3WQn`]'y(0#l&hQsMM!y1KV * 5 EsPbht>Tv-05Su+Q mck)SFe6~8 aS8R6(Z"3-f*Gd^;@H;R&fmHC0  usLDjd^Yl6V1j;vTVC1T6&tqU+1.CJOC7YZyBxOO=x-+|`/\-^*.u:P tNtdYyxm<K1/wT>1ZADK{ Rapn41jCN9" V/^Y6N`*m[O=&-!!C"BC* lEVDpJoILa.=bmgFqIiWE&S'I3HxSRGOAw@vbZL JjB*M* k;3o jS?|(; "~CGbem8qR%DU0@n^%Xptv 5^Z&Te1q7EkACK*8Qi[1[7&}7Y";|w[|(@?(x8&O=ZV@GU/_-V\C\Bz4OT>T`C-]N<BDk")~GxSV?Ctpm]rSuH }"^GndKEL(KHS3Hfe{";)P _luG8K"+SD?3c,q,/ fX4R~4Z fw[xz&Bl[D`_"Pi# 47[_xuIq:P'wG C?Y2| w0jI/m#/x2;OTE80r!}5r1%9m1^=%nEzQKovekjvO4rq cZ4 ?/THv6^6s=!L%4GZ}TPL]]] ZQuCLBq.9s_jNNB,BPH0Kt0jG3t*! dP1fk6L &t$LIaYF5 U.2I!$ nU buQ$lO%u]Di#*]"eDvV2c48$h)63YbJ7^HS`A9#^ef G1G<l }UXXO-dDplrDwc V;X-4~u0;Hk7NXJ^$v#Y;'2i*"< 1<UH @M5Zg9Za:$_p\ 'SnHSy+?a23,h.@<%oj!r #:O_LL&7jaY"~? M4!5ag@_F;6 [=n($NM pTK $hjD|{YkkpF,18fQAy:jI loBqW=zYM/P hs~yNsZ$!"3/G_T "98u;'J!i:%W5e@pgX7-9c()G4 Q VL9xQq;Yik y[ E&%2ZC&ptfw ACRgZjm4VLNnT[?Yc{0X dLbWOJ*h$!-0a$(on6 IA3&0c,FYs`n*gn9{t+n+s7Vb*Ll4j\ ^e Y$(X)#'2'iY[)l@##4 #!0#-*E$9)3X xQ tn0l#b1O({xj#q#[7c<<R!5q@3_^mP>T7nzW%r"92zK:=dWQ\Ppg!j  <Ot2R.*-' *w`:nH{o/'=PDL< ? 'SC(-ftt7? 4jzB/uC-$G-;G@ U$BK?C'~`"z) ZYRI/;#d+7Ja*D;?#55ipx*wK0jD=8!#[[&wMA;0=@;kTkR 0F8 ;AjPGw"LnmSdj7" <.9%:v{ +z {^NICG<'al&igILUx&v(I 5` 9)9=@C bt=;h eHa9/8r8I5?+[Dn23&'{)>4s3A+`D6z& rr&4SNV22 K(aP~?nq^.sJfo v71 *=.UJ[*^_hY;<"o6?I!"il(8 .`OPcE",58Bl-" U61GfC*:Q7' >)R" % +6G2H (SN^nA [[jD/$#m [[9#8U'`"yR, k,=c *.HO7?M]O3&?#J #+@'OTCa^Y ]#d-_PwC#%3=E Z)EQJ-H=u_;>u#tf!f+R8#C[G:&lQe08 |@nhi'sbpQH*xuNhZh l Us9+]s^3*IdGnCj7$coe!,e`:@gE *NwU$zw 7\23")w#xu::U1DO[ " m'X-rCZq2M1Y*!Lgr79S*2P]4*R1*ZD70YR0B[4 F,Q3k(?93M &@j_ ; v= \)JsZ .{R "]QuaY5* L-V%n=6|:nJt WDUW) #1 v*=*?;L(y*A3M 1 V{,H,e y,#$@!]7X &S 6d%DL 2B; Y -0P"*wE2 /Kn&O'{f) _d&lD@a2>U IqXTJb*.=Bde_Pa+?B61e, r!HD73%bFLS#/,TAD5Ro I} >`~ujeYa_nEDrbKqwk{vk)}{b }} le}iHK _\0r?*Jf>oXc'OZsH_ V\ H j337TQ#Tl$O~h+ ] x)&DwdGv+{!"s+#S@&B I&e +9+ 8 Jq1:({QL' F !N' Yc[# UA, 'P(( !'R-L<` *G6EY! 1!VAe$#:):$ , pX-&XAZ# -6 ='6 R;NzW7, WFoTl H#a"moKbr,Y, 3"C GjM0'X.Y9D+L&;$8XZ`$6>%@8SPRw#+}Gp0{9<hUY$#Pd ?=83W;t#%>B$*9.%.$K[O? :#7 (3*1&870+ >86!=1* Y$1  )/  ^}{ttv~b6eRMNk _6fkZ`O^TA}c=Aku"SCIbPG?`?$@ZP/MT4(/!6c&[U QBC# &E 0Q% DC*"_,O>(@-9&920> <B"61. !39 .3# @=7H? ,8 'C3(&0/7 x87v~ka(6sj~ m7@) M%^kMdX>D?KhmmM@O ;XiI+4$6g#ItD ,JD5g~@ 9P4mDNO "W8<>A2;G *44+-D/'G[!$K'=3#'3 %6W$.:P(1H"=&A4[O ?'HKIC;/,BA16)2)Yi%J$Aw\B2=@#/!dY%\/w-!lP5d72h9k/>.t%l0 f&a 'M1q;"!,)"/)# 6.0* ! )1: )/ 4$-<%"#$!'+ 47"5$C"94 58- ! )$& * " "!0! ,! )>J//@9 4:HI54YjL:Z^ CE@:wY>opAPYwgyrff \n   + %#      !   )) -     #  %  &  #  o zlfm^~Z gyg\ivksb3>dAAcbN:22>OL+N?+(-;& zxmW}twtp|}rgfrpok]n~]rrqn]_zn^tv[q~^_rk aZnwEg{Y e}qfgjaUhiLLTd#Y<L l\&<3GUV$a<R(+@_R'36 X:[EK"L P L%91*!QfR>G#LR(K$@ GY ^QZ&N"+CM.oO,>-A E V>9(-\W 892QP':E><^)^I&]0[76AL7ZR.O@~:)Y%jBsLD+D./k(N%S3s<x.U&Z.q+`%W,f)pZ#;/\((n%S$W.P4S+e%]3c$ v+Q:cx?17&v x"X(Va l/j(V L [m]-T(r q VQ'k2kP_)tQEg^ Qjk Q O Zim^cwoWJ R`U>Pn jSGe k9Br}oQYwM IovYxjQt~_rcw {     "$"  +$(:H=J bD8U fI3\umd`swOQm{z"z{    ! # *%     x oVnzp_eokh d[\dPHRAHZ KHWL5>LD.% DE ),EI90 9E,  - ;% %!    {lf{lqvrutkpx{sovupkaWUggajeY^cSL_eMIUQC0">UJ6+3JM1(I\<1;-295..7.&058:+$:<%7L8&?1,C@%,B,$' 2=+(*1A1-80)))/,3><;>/,248@IGA=5>E8;E ; 0GR DMO>?> CUWGJ X JS^TTaV"LYg!lagw%mYb+n4T"Op".u)ip%)}'g+q411=E~M@);{YF*-FKA7?EDC?;9E?59ENF<A:4IPEEPE02;DA=EHA?GHC9.3:@B;>LLH<-0?A3/=E=8;71/3892,2*7@"+02*&//" * +  .4 ' *'# !03'$##&#*83; =$C> /-9C@C>>FPG3FXNHPS^hXOcbQVjjddfu{wz}            yronxwhahc\ ]Z^\PUQ;8?JN@07<0%$(**%z|zoywx}|xr~||wjl}x|yrz|xysttvsqysjuzmnqq{rtvmjqxvsxsmlqxqhmpnkvlfc\`ech | tbhmbWakheovldk`Ul zhZduvhmwhgzsimnnqu ppn!rqmilu oektm puiaol ej mlnr v na cnj fjd$h{~ yw{qc kxxt {~xru~y }w ynv ~x { ~qw }v  z }  }             ! " "  ,1/2-29$,,+?G8%?HELVQCPVR!UZ \^ejifn{rj{wr }   ~~uy{yoqspknsja_fh`]bcbdf`Y`hgZXY[ZQOPQLHMTNCB==?:589:9 0- . +(& +*&                  |~ {| un s w uqq m him h edaSZifVT^\ KFGCJBGD9;GC97?6&+2.+66(#.$$#%-*'" %&#&-%$.'+30%.<4)-A=39EJD? =IPPSR TOPWc ` `i e` g jjklv| v uz {y} z}   " "%#'###!" !##)%"'-,! +&($"##!("'  !"$      $#'#*/*(0/-4867:ABC=<DFDLPJKPSWU^d]UV^eb\dmqvpppwzyz{                 }|urstqsrgjqk^`imbVXZUNPWRIDII>69><513*+'(**-  z}|x|qsw{vjmtnmnqniknmcel j cbge\ Z ` _[] Z^ ab[ W Ya_`_XZWUY_YTTXYVSNSPNTTQTPPQQ!T]XNKLQVNLRO MMOKKGEHGEHOKJFD!CAI!LDBEGIJ OMLNPOQX\RSWUOQ^W[de_^_ddfa [beh j o m o q o r ztu ~ wx { x}                       %* & # #', ) + 2 -.8 83 27 ;=<?BEI@@J KOT TN V Y\ ^]^cf djm komgqxsuy{~||                {}{xx|wsxylinhilhcakicfdiihda_]^]Y\_\YXXW[]ZXZVURRRQPPOMMIHJHDFKLOONJDEFCE@AIE8<=:94 8698/220+,,' $()(#              ~}}}}srtsstvvunqvvusrquupnturpnimoiimqotzrpqnkhhlpolknqrpmmklnrlptojlostprrrrvuwzwtnqvwxyyxy}uxvt{{}|z{y~}xy} ~    ! &!!"%$%&&$&%%&!),,--*)'++&,0/+---.*('-2*++-((*,*''--+.-(&,,.+(,-'()&%%'$!%%()$"   !!     %("&),+-1-03.11.39477:B>87<BGGDBEHEKLGQSQQSPOXX[[\Z[baadhfcdhimjpwurruwvuxzsy~}}|~xywtvtronrohmoommllheea``__[[][XUXWSOQMCGFEGEDA><:7860041,1-($"!!!                       "  !%%'(*+.1//26787;@?=;;=<?BC@?>?EBHJGIJNMMMPSPSQPRROPTQOQU Y Z\ X VYZ ` ^ [^^ ] ^ [[^ ^ ` _ bffcc fgilljjkrokmppnljkkmmllmmnpnlonllgiklqkijknqnptrrqpqutuwvvyy{yutsuuswxvutsssssrutwyvtvvutptqpnmopssrppnnnrrrqkqvsqqrnlmmosmimmmkiijjidehcb`\^`^]^[_bab\Y[^]\ZYZ[ZWYWY\[[Z\VUYYSRROOQRRQMNMMNMJFDFC=?EF?<;:942000//-)(*('&*-(%%"                      {{{z{zy{z{wuqvzvvywspqrrvsqpqopqrtqnppqqsqnnotwspruy~|yxz}~yy}      !             "" ##!!!#&''# '("$++)&#&,+*-,*,+/3200333332698999::<=;==@?@A@BEJJEGJGFLNNKLOOQUVWUTZ[]ab^ba__digifkliloolonknrptuvy{{y||{}}{yz}z|   ~ ~ ~~ ~ |x y x wy wtx v t r s o n jlik om pmm ol g fg gi f dd d c`^^^[[YXYXWQ N OKILLHFGHGDFH@>=<;:9633750,+,,++)'&%#%$                                     " '# $&*( & '(-/-0. ,, 1674 3 5 5 6 5 6 9 6 9< : 9; = >:99= A @ @ D G HH F G CACH L L J M NNM M M M O N P QQTTRSSTUUVWUSUTUVSTSTUVTSSRSTUXZWTRPQQRVUSOPSUTOMMQSOPRPOKJMNOLLMLLJHHGHJKKIGDGFEEDCCFFFD@EDDGCA@?BB?>==@DA<=?>;:====9879<878::555554314742556423442--//..0210331.2310+'*-,*)))%%'''(&!$#!#" ! $&# !"!!                                             ! !!##"$()(*-)(-0+),14335221.0467863569789;;79?@BD?>>=BCDDDDFECEHMJFIKHGHGHKKMLIJLKJKJGKJIIJMLLKKLKLLNLKKMRTTTQRRROORSQNOQPRSRUVUWWRQSQPSTTTTUPQPSRNNNOM IKPOJ HILIE GHFEGD? > ? >?>> ><=>: ;;7 5 3 4 3 32 1 0 1330-,-0.+ ))*(& $ %'(%"!"#!                           #$ " # " ! !$ '++* + ++ -./-. - , - / . 0 / - 363 0 25546566 2 0 4 6 5 686 4 6 6986 799:9;=;::97 6 9:<<: 6 4 6 ::;=9 8;=<;;:7 6 ::;;><: 7:<:88:<=9;==<98::::::;;::;==;9988::98;>;;<876:;>><99;<:7579<:874245455565432223440+-0.-,,.1/,,-.-+,-,*))'&%'('*($$%%""#$##&&!   $! !                                                    !""!! !! !""%&$#&)&$$#$&&''$ "&&%%$$##$&%%$'(&#$$$##$$$"##!"##"   !""$#!$###!  !   !  "#!!!""!                                                                                                                                                                 hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/kick.wav000066400000000000000000001043741366722712400235630ustar00rootroot00000000000000RIFFWAVEfmt DXLIST>INFOINAM untitledISFT FL Studio 6 (libsndfile-1.0.20)dataLMA4( %#% "&$)(-,0.42759394787:6<696445.5/33010--.++,'-'+(*&($#&!("$""!%#    L11 O ; E \kD0~e/A "# &^'q%"$%T'i()k***)P**d++,c,.[2e31/=./-&.:03660**,-]010/.-.5.-.h//.,<,,k+w)U)*Z,&+8'&&0&()Y"$& 6$rN"*#_ #z 1%$#$5R[SLV1dܲ|&EzLv~r+ OøѶۖǧNt{QNsp򎙢Y搵{ :²-n}dԥ̞ ڱ3ŎxtcH:NѫzަY]V].NE#;hJS@Kco^%,z]TkՓVɗ8׺*۝ٹؐʵ$ox٨2|AJٵҫoE b5ߪ:)%V H# j  Z"%# ##%()$ "\&.>90@?5<:]4y./o49:;;=@iBq@9S59EQ5Y+[SqD88@KW_Z^TJ+DAF R^h\k&dZ;VPPIKXdga]\|\oZWWXYfZ{Z|[]^\/YVS&QRXbpmv[v}jXIh@?*FOZHellc+WNJHpJPzW[]|[VSrSRONjO>NHE5G+MHUK\=[RIB>yAFHOTVPD>AFJ N\RPʣy(C󻆶̶ĿʛȼCq׳-&rlüٲ<ܾݯ²H|CѿhճʪQ-^ͺ}}Լajƴc ݳb-L㹠aFe1ض}5_ ׼j\';,L-JLdOjQ]9ǠϏȗɲi> ˁ˶ηLt άПVΔΙЧҽ)*)e)h*@+N+*)M)~*,,,;,++l+T++,,+O,./ /--s..|.../00@/.,/,U+9+}-I133 20/T/@/c/(/.K,***,$.30G11/-++,--,,*k)-(' (()*,<,<+V*)A(Z%#$&''''S&#!4 !"w###"! !E"N"! v%}6N[FC#Fhf * 1& |  3 0  _ M T d U ?/.   @xLcr><L:,wXHaY ",gb!g)/J.}hF$Xe ]eX@ W8N %  * b r o   f k h * B ; U & E  , O0y ;D ;W@&qk'!,ZRl1afPX> r:Y{f3KKWf@\D5EdO#vXg Se)*BKvjE^E7QG-Z7#Q`6 ov;P4/G%#f @/ Pf\]GG7 P%jmK{tM2 h_O7=?y# K|wxQ`H0#A3Cs}U,{DuTAN^3H1csE%)|y0b#r*A*!T$p~%Fv{oQHG4L c11w5W."D>ActN2.5SpQD,> nMq;^'`R,Qf!@!7]TzY:6|g *(S f~]x!o Koh~*. zT6%H$@?>o{_x-7E)CGb|8 / W q q S : b r N 5 \ / ] 8  5 > * % . K m R 5 ) Z d " C z x Q 1   G @   + - 9 8   % &   g W  b @ P G + o q I  w >   B E  b ! " J 7 R@pm2155fx;`D[qRlxwW6mC.s[996/(&A"x|}[jY@J|SB 9qo3?ws:+LzL$3yuwdFqMj. j DH.t]F- pO. /u}O p"mL"}kYuGT^)/uw&$LM\y UWi?;`r9;,"c\LCcv+M== :1SgYK`* !DgQ1., OcE 9^o07;561^qdo|fg ,I,0ftlZ 6Witjw*4*"S6LNu3\U.HdA0M[K(( jjxQ|teddDNl;4< -3!KjV46($ [\1 -=? -'  sbQb4$K\un=cF{gD: !~R]fb{W [|jj{%WJ.$1?OB0{c~F&ND@=[d^='  LKt "/HJ/06PknVEOaZWmorwFjlK' 1yzL>,HeHG=3-M %(4#  GU@%tK9,7X`aqq2&  {wtijcqYbc~r~"8BE,.MVK"eGCI:V:Cbzd. A!.7L\bH ,//  "=`rpny/Mrej}Xzln~ 0FZk3Jio]ZKNJVe03:XbP&BhiSA>+:Ulr{dTD9(#&,*5@6   iS>6EJTF%zXKX\KEHA& rYYUI.dWE?;$eWPRMYOF% zvyssggYDXkpkZ@AXf]E<>/,+7S_YS'#Z}a6).GljXOI=9:A\kecqa76MkncF?RqwpvjU\kuveXENXi|}yywk~ # .E\VM3+-@erc_Tc,4.&'<[dd_f]M]y{u6969-1Gty  !'?MY^mpgm )JNJ?9?V' ;TeWB07FYly~wpb^WM21+)vQ2?KlfS5pmvkS;" _C>MTH=1ojeaR@74OnqkZ6,@KC1'2A=$ 7E7)"1JVR  50 "  ytxtbH@?GEGJ:8 }la]^VZdlZQ7//9FBB181;. 6C<87(%,0((9KR]S]Y\M\fdk^`` 0=;#2?Vgip 7UguvYU`}$2<,*DVMOQREVk}p`jr|zywqrnukuxsghmmWZ[XTJSPDQZK9-2ISVG?'&AUSF+)0;:A92&"".AVQUG-+>^]cL?7318GWfsvpjmekl}sudj{  '++#$1?82-#!1DGKD?9;9/%",EWYVNF843=9H:0>JI6===5+,*2)2&* |wsuuf_\`hkeZF<,'!0<HC6*& "(-& ~~p__`dkd_WIINWO>10*#$ |uxj`^emd_T\WRQL:DIW\XWK=2;F^^fURFIHGLLHEFLST\e[LGP`^nntluns-OZ[W]fp4A@>NZ`lq{ ,48@OKMYdqz #,&)"#2>H@>?@HM][`fbmbfacfht}uwhnr{zy{ujhunaV]]nudWGKA@HF>87=(% {qhmqnaO@/''! zvdWN>.{{mqkg`_ZNKOI@8&%.(" vxsspu{}~zvnnuzy||tv||squ|   ")".4E:>:CGP[``_]_fr!*64,)#)'8BMIHJIJOMKCMKZSd^iems}~{jnju~}z}w{xxtu{}{~}ynhd]]af`]QQCKILJB?67,%   ~}oldmjkaZW[SSH@:959?CA64**(2+7/4/+%&,/-*!,/-/'% &(%##  "*+!+,-)(+''(1378B:A=MSUVZ[]]lishsrz| !#)04HGQX\b_nr$(03667AJLMOPU\[aT][ljkhsqxx{wv~~w~{~swtxqnkkehffaZ\X[ZSMLMTEC;888=./(*%#  soa__bdfX^NKC@HF@;73,*! yusovu|tfZ\Z^]fc`X]UUNJG=IDQKQKN@@6B?KDOCJ8;GFHLFC>EFKFKIMKKIOMRLPWZa[RMRW_demjnemmrttw{      y}|||swt||~rxttz~xz|~~}|z~u~{  !+#.'619.1,28>AEDGEFHCGFGLGQPTPNTNMNMPNKJKHOINEG<B<CA>;;657<<33/23:44'/,121.1(./526,99CCB;96ABMLECDENPXWMPHTMUVT^V\[]UZXb]\Y]YZU_XbXaX[SRRU`b^ZQNOOSVROHCGINPHEAECH@F9=553859230.,$# |wwmmbZVSMK@A:7*!  '%85=DJUY^^enu~$!/*/6=MRbbnfmo{ ,->>F?FJU`bqjwu}|wrnigebbVZPPHD?3++-/02% ~zywyon`]UTQJIA=910,%&zyvxwyxrmdffgbe_cVZNWX[]RNEGEJGJFFA@=A>=;8:6?<;21.3463.(,*4374010314/.,149583224:>:=>BBBBHEKIMEEBJNQUSTPTWWZ\aZ][bcmiojlkgooxz|z  !""')*/)2/0449:@AFDGHHJHJFHILXU\ZUXOTPXZ]Z^XYUWXVZZ\[TVRVTXSYPTRTWPOHHGILQKI@@;DCFG?A8<:8440/3222.--)-%' ##!$" w{surwnqklmnksnohegggfidihfkbfbehaigjgagbgedijjnmnmfkjopnqqww~~}{|z  !"         !"%$%'((&)(.+0-1+/+4/624679?8A<@>A@A@HBJCCFGKKMMURSRSSTWYa_`\\_\a_acaeelckgidjdjnrqmfjghoitlrfkfmlnknmikghfgaheghffb]`]baffca_[[WXY]Z[XY]S\NUMQPTSZXXPJMDHCHEKEHA?AA@?:997@?>850417784715,1/0,00,0-/-),%'&((,-*-%''(*(-+2$)'#+)&(#-%*')'',*/*+(+)),(*((,%)%)&)'-*+('%&#% (&+"#!!#! {vpnhfcb]YYVRNKDEA<;633-.,+&"    '+/2133:AJJQOSV[bikrsvw{$'.-69@AFJNRTZ[`bhmrtzw{|~{~vwokifdd_aWVPLLHHF<901.-*)!x}stkic`]VQMHHDA@96/.(&#     " $$'/+4.468@CDEIDMJPTY]`fdnhrtt{{ !#"&((,'0--33777;;?@CDFDJDMINQQSSUZX^[c^f`fejlmqmplrwz|||~~{xzuurnjk`e`[`SZQSMIGCB=771.,))"  }{uvqvqqpjpilkjkjhgfdegehdhfihggegdjgmjmhnhpmpqpqutxwvxwzy}{}  !! !#")$.'/+//10345495>9?>=A;D@FBFCHEKIPLPLPORSRSSUUYU\W_W`X`^^`^`abdceadbeddcf`hbebececbdcac^c]__]`]\[[Y]ZY[VXWRVQTQSOPPJOJMMJLDKACC@EAB@>?;976674432.1-/)*&'!&#  ~~{~|}}y~x{ywzwxwwxxwywwwvxwytxuzzx}wzzy|~zz| #%"'&+,.216597?;DDHJKLNOTU\Y`_cghlmpquwzzy|supjmdb`Y[SSKIE?=963.)'"! ~|xvqqmlldeb^^YYTSQNMJHGDDA@><;8755421/1,.*-+,),('&($,%((&%(&()&*&)*+*0,00/23092<6<;>A@GBIIIPKSQVWZ]_bgekkoqsuzz   "%)).0378<>AEFLMNRRXX\^^cdghljonssywy|{}~yu}r{qynslojlfjdda`_]]YYWTSQPKQDNBFE?C9?895612.-*'("'     "#"&(+*/-130776>7@>AADDIJJNMPRRTXW[X^[``ceffiikjmlrprtswuwxy|z}}~}~}||y|wzuwstqspnoiogifedc_a\]ZYZTVQQOLNGMDGC@D;@9:937/5./-+*%&$""      $%"%'%)'*+*-,/0/4063564888;9;>9A;A@>E?FAEDFGFKDODNIINIPKQMOSMSQQTQSTTVSWUWXUZWWZV[XYZ[Z\[\^\]^\_\b\`^_^a__``a_c]e^c_b`caaaabc_da`e[e]b]c^c^a]cZdYc[_]]]_\_]Z^Z[\YZXZW[XYYYWXYSZPZPXQUQUOVNSNPOLNLKMJJIIFHFDFDBD?A?<=:;9868535.4,0*,*%)!' "!    !#"*$,(../2082:8:><@@ADDFHGMHNLOQQTSUTXVYX\Y]Za]`aaab`gchdidhfihhigkikimhkkhoeogklglhkhjghhfhcj`gbbe_c^a_\^Z[[WYUVVQTONQKNLIIGCG?C@>?;:;674311/.++')&"%"        "!#$#$%%'%)$+%,','-(.(/'2(2(1+..+0/-/-///-0-0-/-..-/-.--+.*-*,,(-','+())%*#'$$%$"$! !             !#$" !   !##!"$#&%(&,'-)-,-.-1.111333456476796;7::9;9<:=;<<<<=:>;===<=<<?9>:;>7>8<:9;9:898897674834516/5/3/2,3,..,+/&/&,&*'&)"("%$!%!""                                        !!!!# % &!&"&#&%%%'$(%(%(&'(')'*&*&,$,&(*'))(*()(()()%,"-$*&)&)%(%'%''#) )"&$"& &!#"!# #!                                           "$ !!"! $%% %!$!%!%"$$"$##&'&!$""#!$&'$ ""                                                                                                       hydrogen-1.0.0-rc1/src/tests/data/drumkits/baseKit/snare.wav000066400000000000000000003241621366722712400237510ustar00rootroot00000000000000RIFFjWAVEfmt DLIST>INFOINAM untitledISFT FL Studio 6 (libsndfile-1.0.20)data G? _ D#"10z.<-9 U%I  f ]x?lV( 2 5<5 RP;SQSRDB@㮖 Ȩv 8;7ؘ8 i &ؔ\+9KL\iwbs߱uBԍ{OLeMz~n-&&{GE0.!li (k΃Mڨ쨽l w mL INIQTM;7 ~m  } fD N #&*. }#ecx#K%("#~Jz!?4>18'^2 (K i" /8('?ɢV1%$77-: . E8މd735QNUUS;QO%I&OVտtĬjʏ"ݭH"$4AI%# &  4*EY#F3м?Sӡ-vʤӻwͪʢ. |Z-p!c  QWcsja+uԞ|޸XT_6ۨw tS^ $7 lBcff(ҏɼ7# iڭ{Jf>YUU8.MJ|t}$#BCR ]y!!j !y:~)jn%? _* ]r  \Z&^+!j ˺ȼԏFC%Kx  duG!("*')|$YQ.gǵT|iMG TL _ P +$$#b# Z!+M@^> !%&(('&A$!p['{ _y"$+" A$C  *d {2V _Ma !X @ pr&~n:B "Aut_"x6տs[ V3&c?'XbWH\[} S /!y^1Dq k+qS\'J%i@Zr=L7 |[}sXzD Y j2IV2iS/Rcx Dimh b@`>(eSl3$LHGuw6TMp -}3mO6/L$"F&mFX1.#f 3 6h o 6@ 0kO Z N  5Ki]& F  f ; I; 6 1 H6m<:ZUuEm p  b {7qx  0  m  L1D L]zi""9!hh_h$_Q[Q/nB ?P4xh+ ZGJ@w   6 s]Y#@ { O|5r/)J ]*|5QaBv~y^c3.| ~M#=X]J54_{kmXE{># nX ;Xf3$$l|k&^dZo  lEPk YK`q2_XvN*lC0>2Xpc+^d+E MMp, x&& t 1l}O/Z0zEp?W q `@!+N  IsY63t  rM rBf ^y2@5Z0h :  o>r dEPK>M  6D~ 1_5PG)36Fgm781 = Qr sa  s PiLtNi # \EN<j  > a f-~7h  7]j  $d*IjWi  ~ b : CP NmscN - n+ HnP 5wG G 5 onX  s  t Pr+Q<$iDatLHs|n^KR/$kQK"O1yL > &  G * qng.aA0f0ak+0QuD.-Cn9e=H-8T`Fh0>v'],9tc Ck-1H9G,Lur, G _ g=N m&c    lZXWgQ#d*z R 3 te5m= LLf8[>F7rK(HH 3- u3 z >:D/ ~1z  >SaQ 0z V1)70N t \  6z f~ ~x]rEBa~7<,&r $g)n?,,k%c<C=h N OS$w{"B*s+@WTx` p S=7:{N\ ,A lX  Id p F PT~},4`(nmLC%1= v PAh m)6 L* Ep51 = 3D!9H Y'D-&pz3 @ r` S  }b$Jvo1"5ix$feqMH-tfwmgqtCS|,i A B GIY B[Y|6O ?  ]}y|RP!wcr9-lUCc/W9r9CNQ58ja<JaJ,Fv{U{l:nFzf5J)$j o S"1Z >9  y & 6; Ae (i NT    >K .j8c*ivUT)u= A~LI ni @P  eGaJ/+K74^xK pgk<`US+">& Voj)zp8?  Wx{ nh: n9 S D 8_ s^ i8bG`!V4<&#AN+]`=|K-DE(R]7rk[WTz+ `FRl GnO#WM v>6VQ p_!N@@/<]i~t#3x<=nFY ^ .- l  26-x hy %  \F ;U19|  # fi]  >^fi4[YzD HWTK/ 8t%1uAPBdNvdaVnqkq8GJ#}fGZY Q,9[JjQu]hZESlA ; zmv1' :  \&GZT ) $ i&pA. E.c&(T4q S WCDqba&EOmA'iZ[X$ W3HGcq)-Pj8\|=VK,|OD@LWTg9m70lc=vZUPx b   J8Z )tuDh ul  * $  zj/ qC9 @;'l+{g JP)b_ Pp{H> 4*wCbI9uK: Gt>Fkq ,u[ e;Y8 GG96}f3-bow  Q   + 5,__Oa#jw @ 0 F& * T / A G_so(E72 e. b K = km "dg~ Ea]`N/h]631Mq_dbUI dmd?,Z)YO=^uQ3^4 U'B?9i' ^Dqbcu&3@$5 %  yY^%;Cp$F;OlCINwKpJ]V p E uo4`&  KH&6ytA S5)E:MHCeg0%& r)h*%Z+@[JY*>_-Lm%Nib  m"-+@|u#4  fLF&] $@G9#cf <4 +vq1W7  n3jcfY   L q wju.+2*G#6zNf1)Zi{_l/L`<V-OzC~cm^3 m[nT0<:Oh Y?pk m W , ^ $tl07  p8  Gboc.62 X XBzq+3:m> FBm WxT%}T=m^gB4"`T!"HG-{}>I}Jlv/ 8slBFY c:XG`;$qHBfe  [A |c {+  f , d  U M32/ 9$2ZT7>k Pm I eV%1Z^&n{MmZAO+TlPe wrdL !4j"\^9Y+NB+`33]gtE( |%:F! )  1@,~ ^Ujm+,T>Z{oN 5'o  t 1`3 XS ~xo ! G!P 2; aem O&c~ (@kh\N0r7VT?Py=w(n`;8DMhI[*Tl0Y0+06o #>"'3(^[4GkW 1`,-iYEjv4}u`](l.fJ!m] : ;hUuu i 8ddd7UV= X[ m  Z  [Cju*noC9FrW/g  @ ,u?y)V@gV9JNHL >19QH1nl)/8!.v + {&waJu)p* u r&q2 {/,,<g  'Ub7 =Ux5BP  _$^=W7"}@XGrU{'u f1 w 0 [ (p[O(gq;:xmyi{3 1 ?2 W4 LY>o%Q2}D/g= jDWwK@[Ho\+"6@]R 1V<v{DE@4B$Qp` c;OG6xYJ/lk/ lJs3`MxrE2IfC5]jub>,8Xf$jk|152F Zeezh  .9 "   -Hy%#w&z8nS`.~g=gLT:x"q j F4r EqD| iOsYO #u |d,ANm?:7 8iQH[?Mdqwe9,crDw#k4YRrcULYg<woT~ -t*]QLJP3lZbQ}*-I2-0-jcj_s&JR%<Jr{ y DW@Z0`R!0m7e7Q|K?My.9%/\d/k^- qH fm U>r["u6*>bK GIh,mpZ\9YU@?*/  y^n@]xy3PPjm a" u5DSTf dCKaM-{3_Aj1:l$Us/I brHf| Xt\Eh$)k7x  BN 2T O=&*0Wz8m?/F\vCioys.m7?DL 0 j  Rt ?rKBk &,'% ^-@]$MbT$ \B~/?pQft GoaZ`iry8/Ki xn  *%EJ6|B  ; sI&>G >b 92pue-K!qgs$ZC wpz4U)q,>0 ~f.\riiE=ib{w (yv tU[DSQYps(&dbjzRkmTLj(7ba59s # $n T   7]HdM.Wwc]dq 'yH6|'L(4 0 & P 3;t}{pX~R~IbKVG))H+,/!jiXQ 3J2g0 'GWqa'c iXpe4bj.Q~p;tXR1RmyL]$&.N:w>Q5DFs J|oStW fz]=npN3t8lNirkHP1}#:xDVgM#l&>?r-  [ I-! o={(1whg]ujI>8whBO.}`k3.Xm%%T`W *u} El?f>3NSr{ F&nv'l8kEfqtab`ubx9siIC 8 a p\PF_ oT3AF6U+<`*Y ieU.s_[LA"k1W1Nw:%V~dO2(s s\f]{M@TX8[w DO5lf"H?`?.7Y@,6B2vp=y[WrkJ t _6jH z-l^?egc'* <e4yQ}piNA%t]`n <;B\(/NC[@W) Lp+66NzN8 ~7hB%&wNeDoaYo{hNko|<;><.9TqNi=%(\1~np[E?k R?OtiZ+J )9cZ{  'cs6^^ VnIa5 HqN)MCUz1T}7{@GVt}%7YurW3 cTZ"pk*Al?y/%g . zAUeWs*/.f. F4 j,  =br(>3%7b~+BJ~v4#ZMEs F_t}K09R5v  qU&J\HINFD;j+=+ jJMZW03~7M:|4gd'dKyc@_uTiM] ;f? &n:D}\,ukevil_;m6tefM' CU M  0jE{uJc_1PA%9`\O\ CZkOGM@H-o! $8vK$@1?mMSxF6 q X<N7Nwt w|L ? OEm>!_pd."fbZTL{MetH,V({r(ag1rR$a(<W9|c',:`pn.E@)'GVps:1XS~:[.ww>{1?`:*p@Ub$6hrFB[5MM4\Njtg?>Yc:J RP:S-3 0 )\+` CI pYMhkb!l+'g$.&HB0GUhAoK;=9jV`c=t&=#P]To +'}/fH{%9 6m2rH7Dy'M"daYbs}GFTg"Xk yqM7dZa/VOb4K(2`,(lbyc:MK5dW8X+v|)&k? f;3S^iD!!8w4?J3hAU`Oi_k $*+r1?T dW5? J{#(pQ7bU\E6 QANFU,] 79ZU::O-e'?A kA9H #  oL@]\Bq@K\$0;I)V^a>;&,ogh0p"` AV Kn#.j:k&}1nZ4w|7;WcDGa8sN3h] z8(|h$$mW,=_S :0m9Ufa!H(fVm$*g* DC%IO>z(jJNHDHH/'LG6haEiI(dJjren W}#syOHEvJ04a$<DC3&-;`Ha&9 L.Ga J BZPTK%tb+ ;hot)7c,p=sKQuNE$ `q5G1S##Y&p7}<S!DyexO:W5}nI,dP!~+ _zfy-\%cj0>.%4^ !/1LW1gfJ;+;q .{if5v~k?ZXzV@zHV(8M.3l)/UnbwZQ[/wqa+m-,qugG .,=BCDhN^.?!mKu sk$m!-[gI~ hdEdQ1e7qlP8?aVMpi_Oy0Wx^_Szlw (927jx#Z8%~?$&a`V6[^e&5p|&!*J~kwPp1,$8/*O8>OhhoViGW9 I0$vpbjofhQ(2j&b2wm r~Zh"/`^qsABgUML?!8 +VMJkSn vHW7Y'_jQFfXt"f& F<6ELkUe-[em\hF->K-kX,7oYOy{{lS>\&nf?h>Uyivq|}bvn*<o0u Cwa @UHFHLt"13[4w`L>].z}[=YlHIWN#a;5jLD}937:RwB2#!;4W_rH+3,3yH9* O&R|g5`_7!^bO| K6Raw*\Uur- B7QJ$k1Hw,8YS"rZ_gW&icw?6 ]gp$VVZV| S@ge'%_S,"Pj1?E#YT%T{5#[* WSQoj^[D0r,;<?,p%G-9! (vI4rV8sa$V 7Xp4&sShkMWM74-rNB{AM :/xwU@/9hyNNIX  _-X m '2dw:|,_%svt.FJ@Je,bY>lec>k^crkLdtftPz#u4@0jDq;{blewcy,"Df4>nmnS6}^QkJ4m[!I{0rHH(*:7m6h1D"j\} >I3+!9$;E|/sulo|e?CO5t>A4uIZx}# *jzu3Mt19 n`Ty`+!1|8v ^hILhiS H}<u{gR B@sa1gOf8}?Y&MM lRJ\E~14B[$\J'gLDc<}dg.jI\|WNX5"<%lI NVnX=b.* y%pZu"I[["OpLNf3[Jjc@W1{TrUN]m>3!] @WOg+c0XiEqW^TL_ F'L;Vh, bxWN9 %:9'zKe1| ?Q !&%f-z'Q;P$BDYv[vE{,? kD(<_f_kYJRwJ<lu d;QoPd*?h~V @.n)MD5}fJ E8W,.Qh.Ve @0 2%R-fE.i8P2)-Z=+htDI A{;-G>XeB~J65!?"D/6YodhH3 {EXA?\FT7wQ;D1a3M>mEhb:+{Lj]XNY* zf8Gg\ "!#^b5'%{|>g Z,>9C6{BIz_i"JUm,;B YW}] yS*:\ tTF1&U Ch`r|}2{G d8Q~3\X;#r8~7d==7hB)WX^">9ZNN#TBc#8s{x '(h<2rA |'/E={FFyBA A[tIX3avp>1|Gq!vRqh?N)?|"~3])l@|HH $] b%;Ty{)]K0DB2GWG40B?7A7f"jop]1Z!8C\|,yOukXrN^L42/oypBm^1'39jS98a kU2 /H'=`G423hp;=)Recm t5S$lFH qjA1 c5-[3u{8Z<dAS8P:_Bc=<^5F!rj+S/B*Bh@ M<x2dt}gP[%0?!6 ) U"n5 \6b{!/mfH0xfElC+ N (? pHC8v<U7G=zG2MLj@<^i43,Zy & 1F'y<$MhI,Z' Iv}s<n=g{GUBdr%rwM|#DeV ~/cSS))<@4-VD<,ex]BGW{KVfdgt[(&m[iHLA}:S-~ j9 SScDE9  "H%U 8mOEZ|$iv*,c#1y,AQsEP 'Sx1q*y("P10i)9<?p ~{|G< nG>FrygEZ]9b`#hE:=\;w0rp|Q%Tto#<#oXN,l{;.%&4Ni+z3}`".oWhmQ8&Sq%-.fS~axZ~ SPwlCW{-;lQc!R]"_'gPLq#sc`eC!6kv46r8 ;>@*\]eq!ywdU&.R :WtR"-]uILa bV|j?L0OEMmp#}qP"07VY`<LAWHL+c)g Vrkys k[LeK'KD:@'NG>/J01[/6f}XJ1>l0qBu2_"  :T# ")`5a vM6X Zh\&k%](k`rIy+rpoG$*Q3 .{bS1\ DBS;HSxj017Oh&+b~c;6LDk[Gy08C,U{K& )UGU|vj>[IZ\3u'$q@}L@u3ddi}rV:#,wwW\X(8ttTa`kW9I@>\;6v8IQ$RZ]&8-;of pFe5L|5S  v97M +~M?LTlLK_- v&/cU^POO|53Ex  c`pj 'KNEvY^BPHvsr<6XrK~z< *flW("0yv=`zsX>8G /W1#(_="~TOgxRsgE8\T)z)]KH~}aEA1Bo&V0_k(HEP){'N""PTP&|8=TKC[HM=bz\t gT'CxnJRgj6]|A@*GdqLt>l ~HB"x#.bosg"\)=7\%n }[f__Czm\P4ooWtfRB QM5_H lF7JM&;>r:#QH{"d,%p>vxcc[d[ :cl!b .!{;$G$\TeiI~&[6A@B;K(]P|9:l#xdPcC/F0Wm{DZB%:*-#Z-R`5-;:C`,%"Vwy}aVw{n7GL`MLXC4k9 M]&ztG6E1=l4c&Se#KhO8"!B .n Jaj&h}0Pp0Q ,TdfM@r=x=4^[)#fLHL3?>jMh^~_rZdj|p*o(zHX~8M<s`L+"Go!IJXD,-:zsx1L,tAIF?'py$@a.;{LDOvU]!74!h/8=<] z\(oD"y|Litc1 VUYndpi-InR|4LiYGx<:t?XwBD^<_;+roR }j+ W_gX*%W.O0s^T5_[~)<q^nN 0C6YkfgRF<?GSCC%w9U&5kx qU&n|=eLk{J#'P%MD1$bu-/ /i;N[]gAVD(flMRG#E'&-Zm^v.2UeZ~9% n-2g,@YJN  [1|;>WV2Rm_T*263<OK{Jw2/KY*1SwhP'q}]Vgx8Je(T[L_*`h}jl!@XzjyUCYHMjRZ'XJz$cEAiQT}dF,m) S{iFc\RQ[^B/s0)t<+eX$SvAdl8]E*F#0gW\>Z-Y-LibJU6 0s8+B.}Tolr1oCd Dqj."(D i:>,gF4Ja~{)>sMYFj 6TewDt#DcI=gt%|=ub,$Uhd5pbN3V"@0]Wz7.&Y@*k-O2c"9oKyF(i*>t&BlAl%)_30 B*eXRTX%Ity,%S(a#8M:M#n-I!Xv/ L WFV -I`oEC 8ZOCS=]ft,NU:E_s1%mH.IK_R`#q LdKpFSrE!G>uw;_ d`}<K;/bi6N=Ro)Z(y1}AT1'G`eJ${:laSBD88j")N^?XJM]%!}}CQ/Hx?mLI[zNtKL1-?kFXCD"JR+=FyU- x^\[ O8OG0t HmM 'y[ $+OE@Jo:eh V6j'{$=kAmz[QG%d[ >XU*c/cyN'It?9lGLk^aKpJnKm[&6zOTy^]OB;j5EVwt/BpQzCIDj't\sIzVpK ON6)a:)9PzX gX|0kKxX ;1p+;Dk;WX]1Q7[9+(3b$>7Rpd&o{ mrHr d~s^gd!-9O|`S *B. O8$DK!sa X%n2o<F 2g1]aaxOEK&C]u Olp~3[ifTUc Sg1P:-%t8/G?K2 *zLf_ZYuR3j:r(\sV ;_%?kpXYqN b0iR>|7WYgh+}SN=87H1U[';`_$H3FItN3$z<kHe4:T+E@&f;a0x mP~$pAy` hzH_W/GD|a}ZVJ3l@1[D}B-fIs<b`{AUlpZ7SjWvF/zO$ TZ$#(I"%|j}"fC0+.M*{4}$fP,WXalaNhs{IQ! NG/\Elh:s\|TzpzLP*?"T" T1Q f-LW>#i.~"<TQLg sy,2$rmLngXsfZhZ/8?JZ#r_h9av B`BU3KKlZg!]5Akm\=,W0N$Nul}"A]@#{lNwu7&;g_jTaO 4dx_#pqNLrEs]0J ):4:OT[aX ^D$X =}yl8X&M <p :BwK,8L;F^0Wx[yzte8k2Vg8qS1.=stc3eObFG ^Hq   YQ.*`'?s3y~<?BoU dBC+b96,#3%REP{!*;Xbz9"Xo 8b>TJxz^Ka4Sh+I^OH2|*Xw {f8UPS;K 6)y}!:~6jsq aR<?^;rJ$l=L$A 41<{?i o[`$!37c25(Z)ft }nww}vaS ?sJlQIBy-:arQ|3R(n.7yd%Pll+  rYrrt+ Yq :Buv.=kw"TI1tH >}R:k[y1 *hmrN&rRwD%CHye jWK3V*pl S(iPY'jVziKd2hQMw:@Ub5|B,ZTEKlS{OQONnH&6KiBI>gGDba KR4O T`?a!H8#2<E1TMeM||:p ]3os<X{srhG+U6tcO d) Tj }Z'"Mdh.Q!%1eP:P]jXIke)4 =.W~NHAR. ;LUg13,E %Ey >RJ&ED"z7}x /O|R `"53w[@&9T44hl*'o?<.jp{& Kz$:@/7W1iq? Nx9=foh<p?g%QBR1r|mbQ0Q0At|x=jHyMeX87suNG S Qv:q'b(]]KhV \m`!-wYU4o|X,6? -b* Ckx~YagFm}YMQ2W^AGB#n+0N~e\'%AE:`+/=D na)L8Y,R[F'^ e)z/QBdA!M$L~$I@/ lTiU]YQ`!mM?Ya)%@7_B@^X$F"~pIrB'CoM}%APn %wa?{4^ $H14I\0N0z1QX2P r<"VMO iMG9fhF4a2{#7KMt<"qBHpM&  hs?= [BV\c8O G6$ V?ML"FtVl7 %$$xsw.+Qd(&=HJiwMov, +<q@1Z\7]2) sx 8-^:v/xXOga<O%7X=L_[=Um_7n0G$Ww9tTepL\{I,qO-vuobLe% dt}j4})PwS =>zVw@{4t_Mx irIHs0-IHM)=h_^G8~UY\Ni_ }I85kA:RzFOehr@uf`~cC [S 9SsQ0N v+JxTohb2QlHgI;d8q Wa w 9vce| $Gi o[gyD7lXc@l/IZB 4`/obk("4qUy +^cB6r{*N:Im  L}Jt :*+ qRxScX|PC (sKATPed'`L~Q+S G +F_(Jkt85kEKnEJQbXQOwD M^(ABTY_&n:OCv G?q?,dat,rv2-\n2cmiBi~y"}+ fY2su' mmtDln<:c^e|) E"4vz]<TY-i4Fd_yDBF P:#)Dl0q]@:W` "#yHj+9Zwq0/@p" ~M~aNYZ9:hfn3";4{}^1A{jYww-";VMCN's"~]zA#V'(fG#:(@L aBGj2p2182( 6%/aMy7T [f_ qt1M,ys  '10q%W3|E =GTssU/u*|*!Xi7CI_MALM_*j:2J@}G=T`|B1:M /qtb+lca#nO&"F:ikQx7HBN4mnVUfkf9lE~KERb"w9<Z RGA5Ne 'L0vUvS9;rm}=jfjEtHT+pI9[91ZbmW&]&M'n5j4l c=9M,  A|[c=}3}]x >w|N`e`EP6 1RAHe1vh22* MFT36y#C{;AZlP;e?O}+p5 aZA^6{yB-j@-K 4|K/&5x#.*Y1B@VZW(M brB`en3olu{gh0K(D7?P5IH&%PG3rt848 Wg{GJ|Aek*,"[k0kx5XXP[/iB^j#|!}Hwvx1"X$3)>8~kj|K #"kDj+Nij== "xW]U + Ycizi^%S5DqSh$ A&9[-It@U"qrZ_b{^q["T,QA-C8S~T >c"ua|qOAxyI/Zdvi`*#LjS-A)yU3[^<J`H}2^:4C$,VfJ#>C/}YT.R*W* ?),[[2/T(C.):OF_234rKwzTw !Y:J.fZl*M~lQv5:e j*Hb;A%tWOR^'h T!]y~tuawAx 'k|N_. (% FhYW:Lk\mSJAuCn|42KE'0_]#Djo =+xw^ugo><S) fjo@A~s- Y""IP)RV_ 1( "oB`.amD#A>-.Zs#liqPy'!\:c/,*=MeOG KIh8u5FD$bzMIw5Pf}t4?;AiegO`h?Y%o*rZq!2VyQ4e#-a\KX] oGb4yI9JH2 %s  LJLjyS$ HUYn ".1M>^*0u>0Ly)/kFNO&E`q_8SFR tR(ofct}BE8uvzwhG/6?wOF,=7#5+h0iR">Ep~7  uhnLMJ2p\Bv%rjBx9PB$=0twX0BA}9Jt ]hY *?9!8`2^_K*)A eXYcz-oxV@Va%2T)zQw0yZn >>)Q6SR<Y->O*+l}}xU?p;W\_P%ke>? ?4*[Knc}^2,VyG7MRIX N5sKAN,_|FenQeSQAMQAE)%K?*9gD P&PB({{9  $ gV+)`P#5mNPvGvLRbXuR X AnS0eNj^ul< '=0:JOX7@JC J!^sw?PRdkpD8W8SG]EA3C,XyqMV!q/NrKp}{I|USFU|Y!e-MJ1[qa$pJ8|.~fxM\LMnOT R/ Q[-y{3a5wZ, %Nd xLl E9U/`.#Cs1F7s {nQhPc< Z$33R2x~3%1tg5u ]HGlF/dHa;KYv}>FM(6!(.!D^^ .s S5U(4c6jwEfq4|vG8vJt-Vggka{Wc {S10x.0 u=i(%9xh"a,(8@q&3 b,[Zs?p~)/DPKzrn;<&%<34$/OizcA" {6`@} \NTfj / ;R&d !BlehN(bcVF[#YYkmN$qCX<vpmPvb0%ygHdE_qGO ya=uJ]_csTxV( .0v5M8\vASK9AmY/t Ke pS9h?j=DoOan$p#COC'7\cZ4<!_j;}i(KeJ.`Y+$hxQTSG_ /@SLq1K.`#|IDD1=T+&"DI b{u]qQ\'OPwgz2 ?Z.BB  '&zfc$w4*<M$[&wcDMHQM"O%~y, {}8% ,%j^$+.mJq'j'8A2F#CXp)}+AaJ:`dKNO`XtE#Y<@sTue^aV/U+`H|,=<qpv<^\YXywC)VnvjUN;yioytf>X =HP<[`. l>bzjsXs}GUJBdp[j ) d~x}lZ  S;62#PEf4h8]R5DJ*&G_o/k .3XG\jC3 #<)D=A1*N0l$o(l)YSC\Ckd^w.flk6&z~y*rby [Gq-v |nrJWktF$`[aGV8 Tfqwm>|<_R{K"$3+S{Xi@JSHQ]u7Eqnw3 3'9|pTP F/ -0&T2=K~W]?P"T:\(dd[GLN KD.U>4[ylp|muhbudgJTS 0KZ89rJ 3H fc yc DJ9Q,e%Aq)!40P^V%!t B%1YBKNiy|uI];*J! !@:.p|`nn/ -^56 I~i&[bop3T_!EUB&)<T@77ycE ,#:b5["@ :bkKfV*K2VL+0Mu7#32=/&{puD1I+[Q" i  gHD4+J/0+;t JL),Xn+B=F#F91v,(  ^P=o`;/nSLhM&l%oV{rYW*3+_Z $Ny|jiOA D/dGi[@,y<~f=/M^VeYY^Ag|'uV;vgxkQ9/;" UY<&9%?pSed_ fCo<R= [Y$YNVrntwt\ExIt]$nYg"2# VSF+2H@8!B"8?1K(=N4wS;d?dE7+8EW_byHu*l:>JWX]ROFcnttvQBt$CUU&) k1k9!mD (2LLGV|6k\/au:H#%)R,>LzP!?}psnr9G4>b{IW=81#+M+=|h, ymgk # r]!+ \RMThjOKF1>U!9>'+- 2-M&m MdU>F>3'",yAZF ;b("oU_$ajym)!,"$bZ &1=FKMk}ko\cE?]?r]}dZU++9,"~ujy7'6G [A (M,!)|o }>kbR~;\R&[@Dq ;?L6]eda%cWQ"lY&$(f5i@>h0(8;#-)<=VA iPV ,-7H K.CCJn>}a,{};LG'5kq{ZGH Xe"nS? N$Olpmb y >_O+<0C'"$L0]Cu;73LH$1;?r<m,T$dv'[AQRQO@# 0 pw9AZ0 [JA#|0-LNCXov>lq*AW\**i=9 QS=?N@(%j?LK-zphyD3 Y2~zdwym i)5{lh4 x/HkDq^a{noME=Z YK'9`wl:@Vnbwplky` ;mkKI.EL7LUak^I'?U-^XMbKJ#QNx'(J%*' 2zARYDx~nN 6DOjsk/ `@^W:!&:f%D- E<G@W`d|m[RWvdFfp]~nsrn /-').[mut9zt|mX"h@n.>0(~ yF:X|GQ-5a:4M7!s&|x ;i=,H$%i-$.=Q8?U58\&ki]5\STazt7aju|,M*wRJyz 3D"1*YLEj+| l/vq Q7\NO j`>#rV>+BHiamES==j!n*_Y{7~K+X3bfs|~<J&,83 =!f ziJ9-+M4,<?A0 FrY*~gQ^MYreTG6;>:4as[7+ v==?*mcO7RHR;,;*KZ7A  L/o\X"1"_[ [[5H>!m.Z)eX41-NV5;-hS '83L(dQMd*"a pgm>,\WK>ZR9:#=S*T72CWpz!'CQ:7 5"(5;b0U"Y<RmvoaB %"/I T$80XJZREG1K^,w[fNoG5V;D ti, ? }i9+ OzC68$-2/$HJ$3PS&e`5 'c[m#J2:w2 !+$:_on+X"K [U^P:I-0=P/Z@2"?'(2# {V7]A[e2@3NyR>!{&|"{i+t/Ut}ujUc!o#[GQIBoS- Hd.n_Xuqo3t~c|T=4A{)7,[\C2^TLkDLrFZ0L7[ObrWNudN7y5-O=2mpg*!#o Olzsn&~BTu4BueK3\eTw* #z\tzK`;5F Z+k>)T|bQ3 ;PUulz\/!@&)L ^)]]$kAU/<\zZ$=#    9Mt 2tXlPM0TO E&+&9rta`aSuAx.($"8\L9(YUunGW n|~=FEP@2Wx^VO %2W68! 6 (C4>/[xoU\Hc-pP %(DWZOQU;3EO1_"_jdK?U^^A r{&3)Xd%* 6?/2;Qaf+ "4l&1wEFB G%Q# n`l0{$"!,M0E#9.W42$%+<y9e=:DWGh:gHafh@}yUD 7*IVE?$&ABc^NhdD+- " GFgXCo*X1"%!My#N\dM0&=,;++$ [uuGmgTDSR704>L0;L*d/x@kHIF4NEVq5v\M,;>&K)}#BS pNuzLfr/ ''K0'! +}! K]dX09EB\O64,NRnq+}LkZ- %E='0 C$^!R1- K H@BSj&{>}9a&w+Z#KILA2', }s$$QE=4JG@_(IK@+6":&91aq 5E& ?z{G - j<oJ )*9;/vZIW 2a Y0N6"*#A C'/Z<rRt0 >&#\zdL7!!@0J3*7T}v+~*T`? ![SbC=:MG:9C,D-]K~i: {'i.`(~"^#WBXZef}liWJSP3 f N=: +>A!sixuyG53 + !i+L-3OSgBF; *-?* M%VIFZ3i ;-|TO\vwf,%FSb'v'k%oRly1oZ6 ;%-)168$#*c/b/} S (ko.bGvTn-c'>-; l`DXZBX@?>8Q5:AGT=  - ;240B`5 :E/ refgrq]`K%3j<qh;'raNQl~5G*+4,!! $pGiJ3?-UH_PtBs9D%AmY5WCk}+@#v%{tscaC}/;AKQ iu[s?]Vw urj3`hsbm.L' ,;A KA5* 2*lLG=P"E;T~l6; L(RH#F Q fP2!2cSigg\Np !% );8G03;Z\vw5kjw~GB$-(2jJKY.da^T " 0(<P-6?<4 ,@;7FI  *& p]O>%7,3/.M?063Soof0X#B6\3l2^`qqL #-*#)'M+b0](Z; [G|7&Q^1 ,=Zkfkvl!`l'@s3T8$6N_iS(Cjp#vmHyS14)$!BVS\ig`e_2'*  |lpBD.:* $ $ ' '+3 ) 6 Q J2( 0& {7! *$+NB""1IT8@^^1',RN8%,4>90,$2VL5-BL[lZfC^-V#X'a<ZVFu'r?>[-]*8  1L_W M f)P:B>.6Tl1gBP=30 1 ;GTm{|wpjv}kVs6/u!6W)I>Tq\jfR8& ~p{w\'M!MM0-[%rDg mlp.yNpAk>c=F=O>[ C?QR g&,  $>*+8 %\'p?r5/SGz maSr~o4z]teKD91Q*c`rog ]?8@AYl*\kDtC^RVQ`Z`}/lfqpZ]Y55I,#*?L.* *,H^U65GBvfaiw}oj`i ?"[C $  -<[WovmemeE[H.% 5(3AARwxM4Gij<F`C 8OloVB`S <@0?M4) &H H! &-H\X(PCo !}3.DL0BKAITdgN,6PY[L6*2HQKG8 $,9Q\W< " 2e |TJZheT[ v p>%  &)!/57.6! $+3%0! -=7/=SB3<6';K8&(4GYWVS4}vz|4G6&,-&~7|RqG4# =4 9^_h~ -/0e4K1#  %$036;1U!T 83') 1437<BJ@Qxrsh2$.0J\zOlVNl;p3vC[xW7DQ@ -  5,#,) FyY' -!$30- ' $!)6BUcrrA*X/ljZWsq]UJ?9%& 0&_{e>GZVP`jYSUXXN?CQke&!#9# 84|n_SP*[<w=B=% 46,/- #*2'-BGIFCBB:4EWWD6PL~WOYjutlr`pR|/5L\p{bh/ghcP@<5"  8A:/("1T_P>,  3A>;5+  !%4/# +>RV [!W5<,6DF ?IWcU<8%5ZB{`_d`8\TODJ[baW>*,B2(1/! /7$  %@agTC,vx & % 1G^kwmX#X0e.dWY qw*\8]*y|d@, % C`2XG/Ylv !(|"g]U+PGEO7:%.77 0,,:D>BK]eYN:,0;XtpfehwhN<&)~0>$ !9@DVif^`P2#".D>3-&()/)Q5l?b:= $!0Z"i[SXU%V1Q0G!A:=E OTWcj%e1f"k liVJ)@;/E*A<8U+Y)9.(5-Eczvf_WA/" uy   %)+.>=.;\`P Wi)m6a>YOX_BR;3W!j_OIV[NINC,!%*545W#d%Z(ati IC[g*d5c#hq"f(Y$NM\ZatlH( >NE<0!+3>HH5pj #!   +/0<1  *'CD:85,!#;D/!490$*+   0,"-#2==\GgTba\W^:d%K 30<6M7T2S#Q$Q)GKO41<,!' $2,'   79 "289;O\]jwnUSV5   #$ (5/03K>Y9q5v@U6:-> W"W4A4:0<-8%: *$6HL0v| "!0::.$-26. &" &4AADXep{}nhd[>[BmAVYH72{>sCd.[ZV#D$6"62:?9;7+?$A*  & !&-/      #7=? @0%/+4 1-34,-6+4 ) &) .G.]S :,8K VW]fV9  '"+!  '2&)'  % '*>NE88+!  +  $'G\>& $-71," # +%@3X6]1V8bE|NSLr>Y7?/;$A$I!S"_*d*j&a';&($   $"&(.7, %2/&%' &(93</1*.'($&42N;P6;5448*<(9286F-S+V2_ApLyMOF;?FPqN`E\E_JSKKI:?"<CLPK!=>LQK7'%&-'"08/*-00,#  y}(<GA>HTSB741% ")68 .!)$(##-53(-.,13" % .,)1>HMB'"0>A@HVULGXeheK @NTC3&      %+)/3*&ARX ` ip)r*o$yybL!F.I1>2*B#J*;)6*@,E.C%;2-0:FE BCC&L#TQ G(9/1/&,36 *       *393/797<DA5.*( !% "*/,%  )!:;2(71=&CHR^WH6"&)!$"  $ 10' #  () '9DIHC?K] a\]!cZ A0-.'   *+).+&-!"/'#&"  ' &    $ ,.*/207B?::5,*&$2L_nz{zpinz{dO>35330"  $ * 1 654."# &!").75+     !#     "%$259: 7:3* )).6/:-:-811>*L(Z'^!T!H%KX] ] a`` XE6 ," % !          "'0/   -=B> 78%;#B?64@QOB BC 5 -/)  $"- (#)+  &5 2'!.6 ;90%    (       # )0+$% -(   *-$  )'" *  #'"(3;5&$! ""(20#"!   "!      !'),+  &- 0* #% '    "$#     ") & & ,1'10') $'     %    !"(/-& #.47766322387/(("  #:GGDA:3870&     "$ !*'         *-                  $    '"#/87-&#('' "(2(       #     #%!  #($  '#$($"#    '1310 3/, + &""(.!0&3+2.0--)*$!  $#% "          !     '&*+&$"$    !      %&!#%%  !''          &1 =DC?>942 1 / %   ') & & #"          "    $$          "   ).- 495 -,494,+0*                     !" #                )&#              #%" "                %#                 !"""                                                                                                                                                                                                         hydrogen-1.0.0-rc1/src/tests/data/drumkits/invAdsrKit/000077500000000000000000000000001366722712400226065ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/drumkits/invAdsrKit/drumkit.xml000066400000000000000000000062031366722712400250100ustar00rootroot00000000000000 H2 test DK Zurcher Jérémy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Helvetica'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> MIT undefined license 0 Main 1 0 SnareFloatAttack 1 false 1 1 0 1 true false 1 0 0.123 0 1 5800 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 snare.wav 0 1 1 0 1 KickFloatRelease 1 false 1 1 0 1 true false 1 0 0 0 1 5800.123 -1 -1 60 true VELOCITY -1 0 127 0 0 0 0 0 1 kick.wav 0 1 1 0 hydrogen-1.0.0-rc1/src/tests/data/drumkits/invAdsrKit/kick.wav000066400000000000000000001043741366722712400242570ustar00rootroot00000000000000RIFFWAVEfmt DXLIST>INFOINAM untitledISFT FL Studio 6 (libsndfile-1.0.20)dataLMA4( %#% "&$)(-,0.42759394787:6<696445.5/33010--.++,'-'+(*&($#&!("$""!%#    L11 O ; E \kD0~e/A "# &^'q%"$%T'i()k***)P**d++,c,.[2e31/=./-&.:03660**,-]010/.-.5.-.h//.,<,,k+w)U)*Z,&+8'&&0&()Y"$& 6$rN"*#_ #z 1%$#$5R[SLV1dܲ|&EzLv~r+ OøѶۖǧNt{QNsp򎙢Y搵{ :²-n}dԥ̞ ڱ3ŎxtcH:NѫzަY]V].NE#;hJS@Kco^%,z]TkՓVɗ8׺*۝ٹؐʵ$ox٨2|AJٵҫoE b5ߪ:)%V H# j  Z"%# ##%()$ "\&.>90@?5<:]4y./o49:;;=@iBq@9S59EQ5Y+[SqD88@KW_Z^TJ+DAF R^h\k&dZ;VPPIKXdga]\|\oZWWXYfZ{Z|[]^\/YVS&QRXbpmv[v}jXIh@?*FOZHellc+WNJHpJPzW[]|[VSrSRONjO>NHE5G+MHUK\=[RIB>yAFHOTVPD>AFJ N\RPʣy(C󻆶̶ĿʛȼCq׳-&rlüٲ<ܾݯ²H|CѿhճʪQ-^ͺ}}Լajƴc ݳb-L㹠aFe1ض}5_ ׼j\';,L-JLdOjQ]9ǠϏȗɲi> ˁ˶ηLt άПVΔΙЧҽ)*)e)h*@+N+*)M)~*,,,;,++l+T++,,+O,./ /--s..|.../00@/.,/,U+9+}-I133 20/T/@/c/(/.K,***,$.30G11/-++,--,,*k)-(' (()*,<,<+V*)A(Z%#$&''''S&#!4 !"w###"! !E"N"! v%}6N[FC#Fhf * 1& |  3 0  _ M T d U ?/.   @xLcr><L:,wXHaY ",gb!g)/J.}hF$Xe ]eX@ W8N %  * b r o   f k h * B ; U & E  , O0y ;D ;W@&qk'!,ZRl1afPX> r:Y{f3KKWf@\D5EdO#vXg Se)*BKvjE^E7QG-Z7#Q`6 ov;P4/G%#f @/ Pf\]GG7 P%jmK{tM2 h_O7=?y# K|wxQ`H0#A3Cs}U,{DuTAN^3H1csE%)|y0b#r*A*!T$p~%Fv{oQHG4L c11w5W."D>ActN2.5SpQD,> nMq;^'`R,Qf!@!7]TzY:6|g *(S f~]x!o Koh~*. zT6%H$@?>o{_x-7E)CGb|8 / W q q S : b r N 5 \ / ] 8  5 > * % . K m R 5 ) Z d " C z x Q 1   G @   + - 9 8   % &   g W  b @ P G + o q I  w >   B E  b ! " J 7 R@pm2155fx;`D[qRlxwW6mC.s[996/(&A"x|}[jY@J|SB 9qo3?ws:+LzL$3yuwdFqMj. j DH.t]F- pO. /u}O p"mL"}kYuGT^)/uw&$LM\y UWi?;`r9;,"c\LCcv+M== :1SgYK`* !DgQ1., OcE 9^o07;561^qdo|fg ,I,0ftlZ 6Witjw*4*"S6LNu3\U.HdA0M[K(( jjxQ|teddDNl;4< -3!KjV46($ [\1 -=? -'  sbQb4$K\un=cF{gD: !~R]fb{W [|jj{%WJ.$1?OB0{c~F&ND@=[d^='  LKt "/HJ/06PknVEOaZWmorwFjlK' 1yzL>,HeHG=3-M %(4#  GU@%tK9,7X`aqq2&  {wtijcqYbc~r~"8BE,.MVK"eGCI:V:Cbzd. A!.7L\bH ,//  "=`rpny/Mrej}Xzln~ 0FZk3Jio]ZKNJVe03:XbP&BhiSA>+:Ulr{dTD9(#&,*5@6   iS>6EJTF%zXKX\KEHA& rYYUI.dWE?;$eWPRMYOF% zvyssggYDXkpkZ@AXf]E<>/,+7S_YS'#Z}a6).GljXOI=9:A\kecqa76MkncF?RqwpvjU\kuveXENXi|}yywk~ # .E\VM3+-@erc_Tc,4.&'<[dd_f]M]y{u6969-1Gty  !'?MY^mpgm )JNJ?9?V' ;TeWB07FYly~wpb^WM21+)vQ2?KlfS5pmvkS;" _C>MTH=1ojeaR@74OnqkZ6,@KC1'2A=$ 7E7)"1JVR  50 "  ytxtbH@?GEGJ:8 }la]^VZdlZQ7//9FBB181;. 6C<87(%,0((9KR]S]Y\M\fdk^`` 0=;#2?Vgip 7UguvYU`}$2<,*DVMOQREVk}p`jr|zywqrnukuxsghmmWZ[XTJSPDQZK9-2ISVG?'&AUSF+)0;:A92&"".AVQUG-+>^]cL?7318GWfsvpjmekl}sudj{  '++#$1?82-#!1DGKD?9;9/%",EWYVNF843=9H:0>JI6===5+,*2)2&* |wsuuf_\`hkeZF<,'!0<HC6*& "(-& ~~p__`dkd_WIINWO>10*#$ |uxj`^emd_T\WRQL:DIW\XWK=2;F^^fURFIHGLLHEFLST\e[LGP`^nntluns-OZ[W]fp4A@>NZ`lq{ ,48@OKMYdqz #,&)"#2>H@>?@HM][`fbmbfacfht}uwhnr{zy{ujhunaV]]nudWGKA@HF>87=(% {qhmqnaO@/''! zvdWN>.{{mqkg`_ZNKOI@8&%.(" vxsspu{}~zvnnuzy||tv||squ|   ")".4E:>:CGP[``_]_fr!*64,)#)'8BMIHJIJOMKCMKZSd^iems}~{jnju~}z}w{xxtu{}{~}ynhd]]af`]QQCKILJB?67,%   ~}oldmjkaZW[SSH@:959?CA64**(2+7/4/+%&,/-*!,/-/'% &(%##  "*+!+,-)(+''(1378B:A=MSUVZ[]]lishsrz| !#)04HGQX\b_nr$(03667AJLMOPU\[aT][ljkhsqxx{wv~~w~{~swtxqnkkehffaZ\X[ZSMLMTEC;888=./(*%#  soa__bdfX^NKC@HF@;73,*! yusovu|tfZ\Z^]fc`X]UUNJG=IDQKQKN@@6B?KDOCJ8;GFHLFC>EFKFKIMKKIOMRLPWZa[RMRW_demjnemmrttw{      y}|||swt||~rxttz~xz|~~}|z~u~{  !+#.'619.1,28>AEDGEFHCGFGLGQPTPNTNMNMPNKJKHOINEG<B<CA>;;657<<33/23:44'/,121.1(./526,99CCB;96ABMLECDENPXWMPHTMUVT^V\[]UZXb]\Y]YZU_XbXaX[SRRU`b^ZQNOOSVROHCGINPHEAECH@F9=553859230.,$# |wwmmbZVSMK@A:7*!  '%85=DJUY^^enu~$!/*/6=MRbbnfmo{ ,->>F?FJU`bqjwu}|wrnigebbVZPPHD?3++-/02% ~zywyon`]UTQJIA=910,%&zyvxwyxrmdffgbe_cVZNWX[]RNEGEJGJFFA@=A>=;8:6?<;21.3463.(,*4374010314/.,149583224:>:=>BBBBHEKIMEEBJNQUSTPTWWZ\aZ][bcmiojlkgooxz|z  !""')*/)2/0449:@AFDGHHJHJFHILXU\ZUXOTPXZ]Z^XYUWXVZZ\[TVRVTXSYPTRTWPOHHGILQKI@@;DCFG?A8<:8440/3222.--)-%' ##!$" w{surwnqklmnksnohegggfidihfkbfbehaigjgagbgedijjnmnmfkjopnqqww~~}{|z  !"         !"%$%'((&)(.+0-1+/+4/624679?8A<@>A@A@HBJCCFGKKMMURSRSSTWYa_`\\_\a_acaeelckgidjdjnrqmfjghoitlrfkfmlnknmikghfgaheghffb]`]baffca_[[WXY]Z[XY]S\NUMQPTSZXXPJMDHCHEKEHA?AA@?:997@?>850417784715,1/0,00,0-/-),%'&((,-*-%''(*(-+2$)'#+)&(#-%*')'',*/*+(+)),(*((,%)%)&)'-*+('%&#% (&+"#!!#! {vpnhfcb]YYVRNKDEA<;633-.,+&"    '+/2133:AJJQOSV[bikrsvw{$'.-69@AFJNRTZ[`bhmrtzw{|~{~vwokifdd_aWVPLLHHF<901.-*)!x}stkic`]VQMHHDA@96/.(&#     " $$'/+4.468@CDEIDMJPTY]`fdnhrtt{{ !#"&((,'0--33777;;?@CDFDJDMINQQSSUZX^[c^f`fejlmqmplrwz|||~~{xzuurnjk`e`[`SZQSMIGCB=771.,))"  }{uvqvqqpjpilkjkjhgfdegehdhfihggegdjgmjmhnhpmpqpqutxwvxwzy}{}  !! !#")$.'/+//10345495>9?>=A;D@FBFCHEKIPLPLPORSRSSUUYU\W_W`X`^^`^`abdceadbeddcf`hbebececbdcac^c]__]`]\[[Y]ZY[VXWRVQTQSOPPJOJMMJLDKACC@EAB@>?;976674432.1-/)*&'!&#  ~~{~|}}y~x{ywzwxwwxxwywwwvxwytxuzzx}wzzy|~zz| #%"'&+,.216597?;DDHJKLNOTU\Y`_cghlmpquwzzy|supjmdb`Y[SSKIE?=963.)'"! ~|xvqqmlldeb^^YYTSQNMJHGDDA@><;8755421/1,.*-+,),('&($,%((&%(&()&*&)*+*0,00/23092<6<;>A@GBIIIPKSQVWZ]_bgekkoqsuzz   "%)).0378<>AEFLMNRRXX\^^cdghljonssywy|{}~yu}r{qynslojlfjdda`_]]YYWTSQPKQDNBFE?C9?895612.-*'("'     "#"&(+*/-130776>7@>AADDIJJNMPRRTXW[X^[``ceffiikjmlrprtswuwxy|z}}~}~}||y|wzuwstqspnoiogifedc_a\]ZYZTVQQOLNGMDGC@D;@9:937/5./-+*%&$""      $%"%'%)'*+*-,/0/4063564888;9;>9A;A@>E?FAEDFGFKDODNIINIPKQMOSMSQQTQSTTVSWUWXUZWWZV[XYZ[Z\[\^\]^\_\b\`^_^a__``a_c]e^c_b`caaaabc_da`e[e]b]c^c^a]cZdYc[_]]]_\_]Z^Z[\YZXZW[XYYYWXYSZPZPXQUQUOVNSNPOLNLKMJJIIFHFDFDBD?A?<=:;9868535.4,0*,*%)!' "!    !#"*$,(../2082:8:><@@ADDFHGMHNLOQQTSUTXVYX\Y]Za]`aaab`gchdidhfihhigkikimhkkhoeogklglhkhjghhfhcj`gbbe_c^a_\^Z[[WYUVVQTONQKNLIIGCG?C@>?;:;674311/.++')&"%"        "!#$#$%%'%)$+%,','-(.(/'2(2(1+..+0/-/-///-0-0-/-..-/-.--+.*-*,,(-','+())%*#'$$%$"$! !             !#$" !   !##!"$#&%(&,'-)-,-.-1.111333456476796;7::9;9<:=;<<<<=:>;===<=<<?9>:;>7>8<:9;9:898897674834516/5/3/2,3,..,+/&/&,&*'&)"("%$!%!""                                        !!!!# % &!&"&#&%%%'$(%(%(&'(')'*&*&,$,&(*'))(*()(()()%,"-$*&)&)%(%'%''#) )"&$"& &!#"!# #!                                           "$ !!"! $%% %!$!%!%"$$"$##&'&!$""#!$&'$ ""                                                                                                       hydrogen-1.0.0-rc1/src/tests/data/drumkits/invAdsrKit/snare.wav000066400000000000000000003241621366722712400244450ustar00rootroot00000000000000RIFFjWAVEfmt DLIST>INFOINAM untitledISFT FL Studio 6 (libsndfile-1.0.20)data G? _ D#"10z.<-9 U%I  f ]x?lV( 2 5<5 RP;SQSRDB@㮖 Ȩv 8;7ؘ8 i &ؔ\+9KL\iwbs߱uBԍ{OLeMz~n-&&{GE0.!li (k΃Mڨ쨽l w mL INIQTM;7 ~m  } fD N #&*. }#ecx#K%("#~Jz!?4>18'^2 (K i" /8('?ɢV1%$77-: . E8މd735QNUUS;QO%I&OVտtĬjʏ"ݭH"$4AI%# &  4*EY#F3м?Sӡ-vʤӻwͪʢ. |Z-p!c  QWcsja+uԞ|޸XT_6ۨw tS^ $7 lBcff(ҏɼ7# iڭ{Jf>YUU8.MJ|t}$#BCR ]y!!j !y:~)jn%? _* ]r  \Z&^+!j ˺ȼԏFC%Kx  duG!("*')|$YQ.gǵT|iMG TL _ P +$$#b# Z!+M@^> !%&(('&A$!p['{ _y"$+" A$C  *d {2V _Ma !X @ pr&~n:B "Aut_"x6տs[ V3&c?'XbWH\[} S /!y^1Dq k+qS\'J%i@Zr=L7 |[}sXzD Y j2IV2iS/Rcx Dimh b@`>(eSl3$LHGuw6TMp -}3mO6/L$"F&mFX1.#f 3 6h o 6@ 0kO Z N  5Ki]& F  f ; I; 6 1 H6m<:ZUuEm p  b {7qx  0  m  L1D L]zi""9!hh_h$_Q[Q/nB ?P4xh+ ZGJ@w   6 s]Y#@ { O|5r/)J ]*|5QaBv~y^c3.| ~M#=X]J54_{kmXE{># nX ;Xf3$$l|k&^dZo  lEPk YK`q2_XvN*lC0>2Xpc+^d+E MMp, x&& t 1l}O/Z0zEp?W q `@!+N  IsY63t  rM rBf ^y2@5Z0h :  o>r dEPK>M  6D~ 1_5PG)36Fgm781 = Qr sa  s PiLtNi # \EN<j  > a f-~7h  7]j  $d*IjWi  ~ b : CP NmscN - n+ HnP 5wG G 5 onX  s  t Pr+Q<$iDatLHs|n^KR/$kQK"O1yL > &  G * qng.aA0f0ak+0QuD.-Cn9e=H-8T`Fh0>v'],9tc Ck-1H9G,Lur, G _ g=N m&c    lZXWgQ#d*z R 3 te5m= LLf8[>F7rK(HH 3- u3 z >:D/ ~1z  >SaQ 0z V1)70N t \  6z f~ ~x]rEBa~7<,&r $g)n?,,k%c<C=h N OS$w{"B*s+@WTx` p S=7:{N\ ,A lX  Id p F PT~},4`(nmLC%1= v PAh m)6 L* Ep51 = 3D!9H Y'D-&pz3 @ r` S  }b$Jvo1"5ix$feqMH-tfwmgqtCS|,i A B GIY B[Y|6O ?  ]}y|RP!wcr9-lUCc/W9r9CNQ58ja<JaJ,Fv{U{l:nFzf5J)$j o S"1Z >9  y & 6; Ae (i NT    >K .j8c*ivUT)u= A~LI ni @P  eGaJ/+K74^xK pgk<`US+">& Voj)zp8?  Wx{ nh: n9 S D 8_ s^ i8bG`!V4<&#AN+]`=|K-DE(R]7rk[WTz+ `FRl GnO#WM v>6VQ p_!N@@/<]i~t#3x<=nFY ^ .- l  26-x hy %  \F ;U19|  # fi]  >^fi4[YzD HWTK/ 8t%1uAPBdNvdaVnqkq8GJ#}fGZY Q,9[JjQu]hZESlA ; zmv1' :  \&GZT ) $ i&pA. E.c&(T4q S WCDqba&EOmA'iZ[X$ W3HGcq)-Pj8\|=VK,|OD@LWTg9m70lc=vZUPx b   J8Z )tuDh ul  * $  zj/ qC9 @;'l+{g JP)b_ Pp{H> 4*wCbI9uK: Gt>Fkq ,u[ e;Y8 GG96}f3-bow  Q   + 5,__Oa#jw @ 0 F& * T / A G_so(E72 e. b K = km "dg~ Ea]`N/h]631Mq_dbUI dmd?,Z)YO=^uQ3^4 U'B?9i' ^Dqbcu&3@$5 %  yY^%;Cp$F;OlCINwKpJ]V p E uo4`&  KH&6ytA S5)E:MHCeg0%& r)h*%Z+@[JY*>_-Lm%Nib  m"-+@|u#4  fLF&] $@G9#cf <4 +vq1W7  n3jcfY   L q wju.+2*G#6zNf1)Zi{_l/L`<V-OzC~cm^3 m[nT0<:Oh Y?pk m W , ^ $tl07  p8  Gboc.62 X XBzq+3:m> FBm WxT%}T=m^gB4"`T!"HG-{}>I}Jlv/ 8slBFY c:XG`;$qHBfe  [A |c {+  f , d  U M32/ 9$2ZT7>k Pm I eV%1Z^&n{MmZAO+TlPe wrdL !4j"\^9Y+NB+`33]gtE( |%:F! )  1@,~ ^Ujm+,T>Z{oN 5'o  t 1`3 XS ~xo ! G!P 2; aem O&c~ (@kh\N0r7VT?Py=w(n`;8DMhI[*Tl0Y0+06o #>"'3(^[4GkW 1`,-iYEjv4}u`](l.fJ!m] : ;hUuu i 8ddd7UV= X[ m  Z  [Cju*noC9FrW/g  @ ,u?y)V@gV9JNHL >19QH1nl)/8!.v + {&waJu)p* u r&q2 {/,,<g  'Ub7 =Ux5BP  _$^=W7"}@XGrU{'u f1 w 0 [ (p[O(gq;:xmyi{3 1 ?2 W4 LY>o%Q2}D/g= jDWwK@[Ho\+"6@]R 1V<v{DE@4B$Qp` c;OG6xYJ/lk/ lJs3`MxrE2IfC5]jub>,8Xf$jk|152F Zeezh  .9 "   -Hy%#w&z8nS`.~g=gLT:x"q j F4r EqD| iOsYO #u |d,ANm?:7 8iQH[?Mdqwe9,crDw#k4YRrcULYg<woT~ -t*]QLJP3lZbQ}*-I2-0-jcj_s&JR%<Jr{ y DW@Z0`R!0m7e7Q|K?My.9%/\d/k^- qH fm U>r["u6*>bK GIh,mpZ\9YU@?*/  y^n@]xy3PPjm a" u5DSTf dCKaM-{3_Aj1:l$Us/I brHf| Xt\Eh$)k7x  BN 2T O=&*0Wz8m?/F\vCioys.m7?DL 0 j  Rt ?rKBk &,'% ^-@]$MbT$ \B~/?pQft GoaZ`iry8/Ki xn  *%EJ6|B  ; sI&>G >b 92pue-K!qgs$ZC wpz4U)q,>0 ~f.\riiE=ib{w (yv tU[DSQYps(&dbjzRkmTLj(7ba59s # $n T   7]HdM.Wwc]dq 'yH6|'L(4 0 & P 3;t}{pX~R~IbKVG))H+,/!jiXQ 3J2g0 'GWqa'c iXpe4bj.Q~p;tXR1RmyL]$&.N:w>Q5DFs J|oStW fz]=npN3t8lNirkHP1}#:xDVgM#l&>?r-  [ I-! o={(1whg]ujI>8whBO.}`k3.Xm%%T`W *u} El?f>3NSr{ F&nv'l8kEfqtab`ubx9siIC 8 a p\PF_ oT3AF6U+<`*Y ieU.s_[LA"k1W1Nw:%V~dO2(s s\f]{M@TX8[w DO5lf"H?`?.7Y@,6B2vp=y[WrkJ t _6jH z-l^?egc'* <e4yQ}piNA%t]`n <;B\(/NC[@W) Lp+66NzN8 ~7hB%&wNeDoaYo{hNko|<;><.9TqNi=%(\1~np[E?k R?OtiZ+J )9cZ{  'cs6^^ VnIa5 HqN)MCUz1T}7{@GVt}%7YurW3 cTZ"pk*Al?y/%g . zAUeWs*/.f. F4 j,  =br(>3%7b~+BJ~v4#ZMEs F_t}K09R5v  qU&J\HINFD;j+=+ jJMZW03~7M:|4gd'dKyc@_uTiM] ;f? &n:D}\,ukevil_;m6tefM' CU M  0jE{uJc_1PA%9`\O\ CZkOGM@H-o! $8vK$@1?mMSxF6 q X<N7Nwt w|L ? OEm>!_pd."fbZTL{MetH,V({r(ag1rR$a(<W9|c',:`pn.E@)'GVps:1XS~:[.ww>{1?`:*p@Ub$6hrFB[5MM4\Njtg?>Yc:J RP:S-3 0 )\+` CI pYMhkb!l+'g$.&HB0GUhAoK;=9jV`c=t&=#P]To +'}/fH{%9 6m2rH7Dy'M"daYbs}GFTg"Xk yqM7dZa/VOb4K(2`,(lbyc:MK5dW8X+v|)&k? f;3S^iD!!8w4?J3hAU`Oi_k $*+r1?T dW5? J{#(pQ7bU\E6 QANFU,] 79ZU::O-e'?A kA9H #  oL@]\Bq@K\$0;I)V^a>;&,ogh0p"` AV Kn#.j:k&}1nZ4w|7;WcDGa8sN3h] z8(|h$$mW,=_S :0m9Ufa!H(fVm$*g* DC%IO>z(jJNHDHH/'LG6haEiI(dJjren W}#syOHEvJ04a$<DC3&-;`Ha&9 L.Ga J BZPTK%tb+ ;hot)7c,p=sKQuNE$ `q5G1S##Y&p7}<S!DyexO:W5}nI,dP!~+ _zfy-\%cj0>.%4^ !/1LW1gfJ;+;q .{if5v~k?ZXzV@zHV(8M.3l)/UnbwZQ[/wqa+m-,qugG .,=BCDhN^.?!mKu sk$m!-[gI~ hdEdQ1e7qlP8?aVMpi_Oy0Wx^_Szlw (927jx#Z8%~?$&a`V6[^e&5p|&!*J~kwPp1,$8/*O8>OhhoViGW9 I0$vpbjofhQ(2j&b2wm r~Zh"/`^qsABgUML?!8 +VMJkSn vHW7Y'_jQFfXt"f& F<6ELkUe-[em\hF->K-kX,7oYOy{{lS>\&nf?h>Uyivq|}bvn*<o0u Cwa @UHFHLt"13[4w`L>].z}[=YlHIWN#a;5jLD}937:RwB2#!;4W_rH+3,3yH9* O&R|g5`_7!^bO| K6Raw*\Uur- B7QJ$k1Hw,8YS"rZ_gW&icw?6 ]gp$VVZV| S@ge'%_S,"Pj1?E#YT%T{5#[* WSQoj^[D0r,;<?,p%G-9! (vI4rV8sa$V 7Xp4&sShkMWM74-rNB{AM :/xwU@/9hyNNIX  _-X m '2dw:|,_%svt.FJ@Je,bY>lec>k^crkLdtftPz#u4@0jDq;{blewcy,"Df4>nmnS6}^QkJ4m[!I{0rHH(*:7m6h1D"j\} >I3+!9$;E|/sulo|e?CO5t>A4uIZx}# *jzu3Mt19 n`Ty`+!1|8v ^hILhiS H}<u{gR B@sa1gOf8}?Y&MM lRJ\E~14B[$\J'gLDc<}dg.jI\|WNX5"<%lI NVnX=b.* y%pZu"I[["OpLNf3[Jjc@W1{TrUN]m>3!] @WOg+c0XiEqW^TL_ F'L;Vh, bxWN9 %:9'zKe1| ?Q !&%f-z'Q;P$BDYv[vE{,? kD(<_f_kYJRwJ<lu d;QoPd*?h~V @.n)MD5}fJ E8W,.Qh.Ve @0 2%R-fE.i8P2)-Z=+htDI A{;-G>XeB~J65!?"D/6YodhH3 {EXA?\FT7wQ;D1a3M>mEhb:+{Lj]XNY* zf8Gg\ "!#^b5'%{|>g Z,>9C6{BIz_i"JUm,;B YW}] yS*:\ tTF1&U Ch`r|}2{G d8Q~3\X;#r8~7d==7hB)WX^">9ZNN#TBc#8s{x '(h<2rA |'/E={FFyBA A[tIX3avp>1|Gq!vRqh?N)?|"~3])l@|HH $] b%;Ty{)]K0DB2GWG40B?7A7f"jop]1Z!8C\|,yOukXrN^L42/oypBm^1'39jS98a kU2 /H'=`G423hp;=)Recm t5S$lFH qjA1 c5-[3u{8Z<dAS8P:_Bc=<^5F!rj+S/B*Bh@ M<x2dt}gP[%0?!6 ) U"n5 \6b{!/mfH0xfElC+ N (? pHC8v<U7G=zG2MLj@<^i43,Zy & 1F'y<$MhI,Z' Iv}s<n=g{GUBdr%rwM|#DeV ~/cSS))<@4-VD<,ex]BGW{KVfdgt[(&m[iHLA}:S-~ j9 SScDE9  "H%U 8mOEZ|$iv*,c#1y,AQsEP 'Sx1q*y("P10i)9<?p ~{|G< nG>FrygEZ]9b`#hE:=\;w0rp|Q%Tto#<#oXN,l{;.%&4Ni+z3}`".oWhmQ8&Sq%-.fS~axZ~ SPwlCW{-;lQc!R]"_'gPLq#sc`eC!6kv46r8 ;>@*\]eq!ywdU&.R :WtR"-]uILa bV|j?L0OEMmp#}qP"07VY`<LAWHL+c)g Vrkys k[LeK'KD:@'NG>/J01[/6f}XJ1>l0qBu2_"  :T# ")`5a vM6X Zh\&k%](k`rIy+rpoG$*Q3 .{bS1\ DBS;HSxj017Oh&+b~c;6LDk[Gy08C,U{K& )UGU|vj>[IZ\3u'$q@}L@u3ddi}rV:#,wwW\X(8ttTa`kW9I@>\;6v8IQ$RZ]&8-;of pFe5L|5S  v97M +~M?LTlLK_- v&/cU^POO|53Ex  c`pj 'KNEvY^BPHvsr<6XrK~z< *flW("0yv=`zsX>8G /W1#(_="~TOgxRsgE8\T)z)]KH~}aEA1Bo&V0_k(HEP){'N""PTP&|8=TKC[HM=bz\t gT'CxnJRgj6]|A@*GdqLt>l ~HB"x#.bosg"\)=7\%n }[f__Czm\P4ooWtfRB QM5_H lF7JM&;>r:#QH{"d,%p>vxcc[d[ :cl!b .!{;$G$\TeiI~&[6A@B;K(]P|9:l#xdPcC/F0Wm{DZB%:*-#Z-R`5-;:C`,%"Vwy}aVw{n7GL`MLXC4k9 M]&ztG6E1=l4c&Se#KhO8"!B .n Jaj&h}0Pp0Q ,TdfM@r=x=4^[)#fLHL3?>jMh^~_rZdj|p*o(zHX~8M<s`L+"Go!IJXD,-:zsx1L,tAIF?'py$@a.;{LDOvU]!74!h/8=<] z\(oD"y|Litc1 VUYndpi-InR|4LiYGx<:t?XwBD^<_;+roR }j+ W_gX*%W.O0s^T5_[~)<q^nN 0C6YkfgRF<?GSCC%w9U&5kx qU&n|=eLk{J#'P%MD1$bu-/ /i;N[]gAVD(flMRG#E'&-Zm^v.2UeZ~9% n-2g,@YJN  [1|;>WV2Rm_T*263<OK{Jw2/KY*1SwhP'q}]Vgx8Je(T[L_*`h}jl!@XzjyUCYHMjRZ'XJz$cEAiQT}dF,m) S{iFc\RQ[^B/s0)t<+eX$SvAdl8]E*F#0gW\>Z-Y-LibJU6 0s8+B.}Tolr1oCd Dqj."(D i:>,gF4Ja~{)>sMYFj 6TewDt#DcI=gt%|=ub,$Uhd5pbN3V"@0]Wz7.&Y@*k-O2c"9oKyF(i*>t&BlAl%)_30 B*eXRTX%Ity,%S(a#8M:M#n-I!Xv/ L WFV -I`oEC 8ZOCS=]ft,NU:E_s1%mH.IK_R`#q LdKpFSrE!G>uw;_ d`}<K;/bi6N=Ro)Z(y1}AT1'G`eJ${:laSBD88j")N^?XJM]%!}}CQ/Hx?mLI[zNtKL1-?kFXCD"JR+=FyU- x^\[ O8OG0t HmM 'y[ $+OE@Jo:eh V6j'{$=kAmz[QG%d[ >XU*c/cyN'It?9lGLk^aKpJnKm[&6zOTy^]OB;j5EVwt/BpQzCIDj't\sIzVpK ON6)a:)9PzX gX|0kKxX ;1p+;Dk;WX]1Q7[9+(3b$>7Rpd&o{ mrHr d~s^gd!-9O|`S *B. O8$DK!sa X%n2o<F 2g1]aaxOEK&C]u Olp~3[ifTUc Sg1P:-%t8/G?K2 *zLf_ZYuR3j:r(\sV ;_%?kpXYqN b0iR>|7WYgh+}SN=87H1U[';`_$H3FItN3$z<kHe4:T+E@&f;a0x mP~$pAy` hzH_W/GD|a}ZVJ3l@1[D}B-fIs<b`{AUlpZ7SjWvF/zO$ TZ$#(I"%|j}"fC0+.M*{4}$fP,WXalaNhs{IQ! NG/\Elh:s\|TzpzLP*?"T" T1Q f-LW>#i.~"<TQLg sy,2$rmLngXsfZhZ/8?JZ#r_h9av B`BU3KKlZg!]5Akm\=,W0N$Nul}"A]@#{lNwu7&;g_jTaO 4dx_#pqNLrEs]0J ):4:OT[aX ^D$X =}yl8X&M <p :BwK,8L;F^0Wx[yzte8k2Vg8qS1.=stc3eObFG ^Hq   YQ.*`'?s3y~<?BoU dBC+b96,#3%REP{!*;Xbz9"Xo 8b>TJxz^Ka4Sh+I^OH2|*Xw {f8UPS;K 6)y}!:~6jsq aR<?^;rJ$l=L$A 41<{?i o[`$!37c25(Z)ft }nww}vaS ?sJlQIBy-:arQ|3R(n.7yd%Pll+  rYrrt+ Yq :Buv.=kw"TI1tH >}R:k[y1 *hmrN&rRwD%CHye jWK3V*pl S(iPY'jVziKd2hQMw:@Ub5|B,ZTEKlS{OQONnH&6KiBI>gGDba KR4O T`?a!H8#2<E1TMeM||:p ]3os<X{srhG+U6tcO d) Tj }Z'"Mdh.Q!%1eP:P]jXIke)4 =.W~NHAR. ;LUg13,E %Ey >RJ&ED"z7}x /O|R `"53w[@&9T44hl*'o?<.jp{& Kz$:@/7W1iq? Nx9=foh<p?g%QBR1r|mbQ0Q0At|x=jHyMeX87suNG S Qv:q'b(]]KhV \m`!-wYU4o|X,6? -b* Ckx~YagFm}YMQ2W^AGB#n+0N~e\'%AE:`+/=D na)L8Y,R[F'^ e)z/QBdA!M$L~$I@/ lTiU]YQ`!mM?Ya)%@7_B@^X$F"~pIrB'CoM}%APn %wa?{4^ $H14I\0N0z1QX2P r<"VMO iMG9fhF4a2{#7KMt<"qBHpM&  hs?= [BV\c8O G6$ V?ML"FtVl7 %$$xsw.+Qd(&=HJiwMov, +<q@1Z\7]2) sx 8-^:v/xXOga<O%7X=L_[=Um_7n0G$Ww9tTepL\{I,qO-vuobLe% dt}j4})PwS =>zVw@{4t_Mx irIHs0-IHM)=h_^G8~UY\Ni_ }I85kA:RzFOehr@uf`~cC [S 9SsQ0N v+JxTohb2QlHgI;d8q Wa w 9vce| $Gi o[gyD7lXc@l/IZB 4`/obk("4qUy +^cB6r{*N:Im  L}Jt :*+ qRxScX|PC (sKATPed'`L~Q+S G +F_(Jkt85kEKnEJQbXQOwD M^(ABTY_&n:OCv G?q?,dat,rv2-\n2cmiBi~y"}+ fY2su' mmtDln<:c^e|) E"4vz]<TY-i4Fd_yDBF P:#)Dl0q]@:W` "#yHj+9Zwq0/@p" ~M~aNYZ9:hfn3";4{}^1A{jYww-";VMCN's"~]zA#V'(fG#:(@L aBGj2p2182( 6%/aMy7T [f_ qt1M,ys  '10q%W3|E =GTssU/u*|*!Xi7CI_MALM_*j:2J@}G=T`|B1:M /qtb+lca#nO&"F:ikQx7HBN4mnVUfkf9lE~KERb"w9<Z RGA5Ne 'L0vUvS9;rm}=jfjEtHT+pI9[91ZbmW&]&M'n5j4l c=9M,  A|[c=}3}]x >w|N`e`EP6 1RAHe1vh22* MFT36y#C{;AZlP;e?O}+p5 aZA^6{yB-j@-K 4|K/&5x#.*Y1B@VZW(M brB`en3olu{gh0K(D7?P5IH&%PG3rt848 Wg{GJ|Aek*,"[k0kx5XXP[/iB^j#|!}Hwvx1"X$3)>8~kj|K #"kDj+Nij== "xW]U + Ycizi^%S5DqSh$ A&9[-It@U"qrZ_b{^q["T,QA-C8S~T >c"ua|qOAxyI/Zdvi`*#LjS-A)yU3[^<J`H}2^:4C$,VfJ#>C/}YT.R*W* ?),[[2/T(C.):OF_234rKwzTw !Y:J.fZl*M~lQv5:e j*Hb;A%tWOR^'h T!]y~tuawAx 'k|N_. (% FhYW:Lk\mSJAuCn|42KE'0_]#Djo =+xw^ugo><S) fjo@A~s- Y""IP)RV_ 1( "oB`.amD#A>-.Zs#liqPy'!\:c/,*=MeOG KIh8u5FD$bzMIw5Pf}t4?;AiegO`h?Y%o*rZq!2VyQ4e#-a\KX] oGb4yI9JH2 %s  LJLjyS$ HUYn ".1M>^*0u>0Ly)/kFNO&E`q_8SFR tR(ofct}BE8uvzwhG/6?wOF,=7#5+h0iR">Ep~7  uhnLMJ2p\Bv%rjBx9PB$=0twX0BA}9Jt ]hY *?9!8`2^_K*)A eXYcz-oxV@Va%2T)zQw0yZn >>)Q6SR<Y->O*+l}}xU?p;W\_P%ke>? ?4*[Knc}^2,VyG7MRIX N5sKAN,_|FenQeSQAMQAE)%K?*9gD P&PB({{9  $ gV+)`P#5mNPvGvLRbXuR X AnS0eNj^ul< '=0:JOX7@JC J!^sw?PRdkpD8W8SG]EA3C,XyqMV!q/NrKp}{I|USFU|Y!e-MJ1[qa$pJ8|.~fxM\LMnOT R/ Q[-y{3a5wZ, %Nd xLl E9U/`.#Cs1F7s {nQhPc< Z$33R2x~3%1tg5u ]HGlF/dHa;KYv}>FM(6!(.!D^^ .s S5U(4c6jwEfq4|vG8vJt-Vggka{Wc {S10x.0 u=i(%9xh"a,(8@q&3 b,[Zs?p~)/DPKzrn;<&%<34$/OizcA" {6`@} \NTfj / ;R&d !BlehN(bcVF[#YYkmN$qCX<vpmPvb0%ygHdE_qGO ya=uJ]_csTxV( .0v5M8\vASK9AmY/t Ke pS9h?j=DoOan$p#COC'7\cZ4<!_j;}i(KeJ.`Y+$hxQTSG_ /@SLq1K.`#|IDD1=T+&"DI b{u]qQ\'OPwgz2 ?Z.BB  '&zfc$w4*<M$[&wcDMHQM"O%~y, {}8% ,%j^$+.mJq'j'8A2F#CXp)}+AaJ:`dKNO`XtE#Y<@sTue^aV/U+`H|,=<qpv<^\YXywC)VnvjUN;yioytf>X =HP<[`. l>bzjsXs}GUJBdp[j ) d~x}lZ  S;62#PEf4h8]R5DJ*&G_o/k .3XG\jC3 #<)D=A1*N0l$o(l)YSC\Ckd^w.flk6&z~y*rby [Gq-v |nrJWktF$`[aGV8 Tfqwm>|<_R{K"$3+S{Xi@JSHQ]u7Eqnw3 3'9|pTP F/ -0&T2=K~W]?P"T:\(dd[GLN KD.U>4[ylp|muhbudgJTS 0KZ89rJ 3H fc yc DJ9Q,e%Aq)!40P^V%!t B%1YBKNiy|uI];*J! !@:.p|`nn/ -^56 I~i&[bop3T_!EUB&)<T@77ycE ,#:b5["@ :bkKfV*K2VL+0Mu7#32=/&{puD1I+[Q" i  gHD4+J/0+;t JL),Xn+B=F#F91v,(  ^P=o`;/nSLhM&l%oV{rYW*3+_Z $Ny|jiOA D/dGi[@,y<~f=/M^VeYY^Ag|'uV;vgxkQ9/;" UY<&9%?pSed_ fCo<R= [Y$YNVrntwt\ExIt]$nYg"2# VSF+2H@8!B"8?1K(=N4wS;d?dE7+8EW_byHu*l:>JWX]ROFcnttvQBt$CUU&) k1k9!mD (2LLGV|6k\/au:H#%)R,>LzP!?}psnr9G4>b{IW=81#+M+=|h, ymgk # r]!+ \RMThjOKF1>U!9>'+- 2-M&m MdU>F>3'",yAZF ;b("oU_$ajym)!,"$bZ &1=FKMk}ko\cE?]?r]}dZU++9,"~ujy7'6G [A (M,!)|o }>kbR~;\R&[@Dq ;?L6]eda%cWQ"lY&$(f5i@>h0(8;#-)<=VA iPV ,-7H K.CCJn>}a,{};LG'5kq{ZGH Xe"nS? N$Olpmb y >_O+<0C'"$L0]Cu;73LH$1;?r<m,T$dv'[AQRQO@# 0 pw9AZ0 [JA#|0-LNCXov>lq*AW\**i=9 QS=?N@(%j?LK-zphyD3 Y2~zdwym i)5{lh4 x/HkDq^a{noME=Z YK'9`wl:@Vnbwplky` ;mkKI.EL7LUak^I'?U-^XMbKJ#QNx'(J%*' 2zARYDx~nN 6DOjsk/ `@^W:!&:f%D- E<G@W`d|m[RWvdFfp]~nsrn /-').[mut9zt|mX"h@n.>0(~ yF:X|GQ-5a:4M7!s&|x ;i=,H$%i-$.=Q8?U58\&ki]5\STazt7aju|,M*wRJyz 3D"1*YLEj+| l/vq Q7\NO j`>#rV>+BHiamES==j!n*_Y{7~K+X3bfs|~<J&,83 =!f ziJ9-+M4,<?A0 FrY*~gQ^MYreTG6;>:4as[7+ v==?*mcO7RHR;,;*KZ7A  L/o\X"1"_[ [[5H>!m.Z)eX41-NV5;-hS '83L(dQMd*"a pgm>,\WK>ZR9:#=S*T72CWpz!'CQ:7 5"(5;b0U"Y<RmvoaB %"/I T$80XJZREG1K^,w[fNoG5V;D ti, ? }i9+ OzC68$-2/$HJ$3PS&e`5 'c[m#J2:w2 !+$:_on+X"K [U^P:I-0=P/Z@2"?'(2# {V7]A[e2@3NyR>!{&|"{i+t/Ut}ujUc!o#[GQIBoS- Hd.n_Xuqo3t~c|T=4A{)7,[\C2^TLkDLrFZ0L7[ObrWNudN7y5-O=2mpg*!#o Olzsn&~BTu4BueK3\eTw* #z\tzK`;5F Z+k>)T|bQ3 ;PUulz\/!@&)L ^)]]$kAU/<\zZ$=#    9Mt 2tXlPM0TO E&+&9rta`aSuAx.($"8\L9(YUunGW n|~=FEP@2Wx^VO %2W68! 6 (C4>/[xoU\Hc-pP %(DWZOQU;3EO1_"_jdK?U^^A r{&3)Xd%* 6?/2;Qaf+ "4l&1wEFB G%Q# n`l0{$"!,M0E#9.W42$%+<y9e=:DWGh:gHafh@}yUD 7*IVE?$&ABc^NhdD+- " GFgXCo*X1"%!My#N\dM0&=,;++$ [uuGmgTDSR704>L0;L*d/x@kHIF4NEVq5v\M,;>&K)}#BS pNuzLfr/ ''K0'! +}! K]dX09EB\O64,NRnq+}LkZ- %E='0 C$^!R1- K H@BSj&{>}9a&w+Z#KILA2', }s$$QE=4JG@_(IK@+6":&91aq 5E& ?z{G - j<oJ )*9;/vZIW 2a Y0N6"*#A C'/Z<rRt0 >&#\zdL7!!@0J3*7T}v+~*T`? ![SbC=:MG:9C,D-]K~i: {'i.`(~"^#WBXZef}liWJSP3 f N=: +>A!sixuyG53 + !i+L-3OSgBF; *-?* M%VIFZ3i ;-|TO\vwf,%FSb'v'k%oRly1oZ6 ;%-)168$#*c/b/} S (ko.bGvTn-c'>-; l`DXZBX@?>8Q5:AGT=  - ;240B`5 :E/ refgrq]`K%3j<qh;'raNQl~5G*+4,!! $pGiJ3?-UH_PtBs9D%AmY5WCk}+@#v%{tscaC}/;AKQ iu[s?]Vw urj3`hsbm.L' ,;A KA5* 2*lLG=P"E;T~l6; L(RH#F Q fP2!2cSigg\Np !% );8G03;Z\vw5kjw~GB$-(2jJKY.da^T " 0(<P-6?<4 ,@;7FI  *& p]O>%7,3/.M?063Soof0X#B6\3l2^`qqL #-*#)'M+b0](Z; [G|7&Q^1 ,=Zkfkvl!`l'@s3T8$6N_iS(Cjp#vmHyS14)$!BVS\ig`e_2'*  |lpBD.:* $ $ ' '+3 ) 6 Q J2( 0& {7! *$+NB""1IT8@^^1',RN8%,4>90,$2VL5-BL[lZfC^-V#X'a<ZVFu'r?>[-]*8  1L_W M f)P:B>.6Tl1gBP=30 1 ;GTm{|wpjv}kVs6/u!6W)I>Tq\jfR8& ~p{w\'M!MM0-[%rDg mlp.yNpAk>c=F=O>[ C?QR g&,  $>*+8 %\'p?r5/SGz maSr~o4z]teKD91Q*c`rog ]?8@AYl*\kDtC^RVQ`Z`}/lfqpZ]Y55I,#*?L.* *,H^U65GBvfaiw}oj`i ?"[C $  -<[WovmemeE[H.% 5(3AARwxM4Gij<F`C 8OloVB`S <@0?M4) &H H! &-H\X(PCo !}3.DL0BKAITdgN,6PY[L6*2HQKG8 $,9Q\W< " 2e |TJZheT[ v p>%  &)!/57.6! $+3%0! -=7/=SB3<6';K8&(4GYWVS4}vz|4G6&,-&~7|RqG4# =4 9^_h~ -/0e4K1#  %$036;1U!T 83') 1437<BJ@Qxrsh2$.0J\zOlVNl;p3vC[xW7DQ@ -  5,#,) FyY' -!$30- ' $!)6BUcrrA*X/ljZWsq]UJ?9%& 0&_{e>GZVP`jYSUXXN?CQke&!#9# 84|n_SP*[<w=B=% 46,/- #*2'-BGIFCBB:4EWWD6PL~WOYjutlr`pR|/5L\p{bh/ghcP@<5"  8A:/("1T_P>,  3A>;5+  !%4/# +>RV [!W5<,6DF ?IWcU<8%5ZB{`_d`8\TODJ[baW>*,B2(1/! /7$  %@agTC,vx & % 1G^kwmX#X0e.dWY qw*\8]*y|d@, % C`2XG/Ylv !(|"g]U+PGEO7:%.77 0,,:D>BK]eYN:,0;XtpfehwhN<&)~0>$ !9@DVif^`P2#".D>3-&()/)Q5l?b:= $!0Z"i[SXU%V1Q0G!A:=E OTWcj%e1f"k liVJ)@;/E*A<8U+Y)9.(5-Eczvf_WA/" uy   %)+.>=.;\`P Wi)m6a>YOX_BR;3W!j_OIV[NINC,!%*545W#d%Z(ati IC[g*d5c#hq"f(Y$NM\ZatlH( >NE<0!+3>HH5pj #!   +/0<1  *'CD:85,!#;D/!490$*+   0,"-#2==\GgTba\W^:d%K 30<6M7T2S#Q$Q)GKO41<,!' $2,'   79 "289;O\]jwnUSV5   #$ (5/03K>Y9q5v@U6:-> W"W4A4:0<-8%: *$6HL0v| "!0::.$-26. &" &4AADXep{}nhd[>[BmAVYH72{>sCd.[ZV#D$6"62:?9;7+?$A*  & !&-/      #7=? @0%/+4 1-34,-6+4 ) &) .G.]S :,8K VW]fV9  '"+!  '2&)'  % '*>NE88+!  +  $'G\>& $-71," # +%@3X6]1V8bE|NSLr>Y7?/;$A$I!S"_*d*j&a';&($   $"&(.7, %2/&%' &(93</1*.'($&42N;P6;5448*<(9286F-S+V2_ApLyMOF;?FPqN`E\E_JSKKI:?"<CLPK!=>LQK7'%&-'"08/*-00,#  y}(<GA>HTSB741% ")68 .!)$(##-53(-.,13" % .,)1>HMB'"0>A@HVULGXeheK @NTC3&      %+)/3*&ARX ` ip)r*o$yybL!F.I1>2*B#J*;)6*@,E.C%;2-0:FE BCC&L#TQ G(9/1/&,36 *       *393/797<DA5.*( !% "*/,%  )!:;2(71=&CHR^WH6"&)!$"  $ 10' #  () '9DIHC?K] a\]!cZ A0-.'   *+).+&-!"/'#&"  ' &    $ ,.*/207B?::5,*&$2L_nz{zpinz{dO>35330"  $ * 1 654."# &!").75+     !#     "%$259: 7:3* )).6/:-:-811>*L(Z'^!T!H%KX] ] a`` XE6 ," % !          "'0/   -=B> 78%;#B?64@QOB BC 5 -/)  $"- (#)+  &5 2'!.6 ;90%    (       # )0+$% -(   *-$  )'" *  #'"(3;5&$! ""(20#"!   "!      !'),+  &- 0* #% '    "$#     ") & & ,1'10') $'     %    !"(/-& #.47766322387/(("  #:GGDA:3870&     "$ !*'         *-                  $    '"#/87-&#('' "(2(       #     #%!  #($  '#$($"#    '1310 3/, + &""(.!0&3+2.0--)*$!  $#% "          !     '&*+&$"$    !      %&!#%%  !''          &1 =DC?>942 1 / %   ') & & #"          "    $$          "   ).- 495 -,494,+0*                     !" #                )&#              #%" "                %#                 !"""                                                                                                                                                                                                         hydrogen-1.0.0-rc1/src/tests/data/functional/000077500000000000000000000000001366722712400210305ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/functional/mutegroups.h2song000066400000000000000000001641731366722712400244000ustar00rootroot00000000000000 1.0.0-'b8390da' 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true false 0 pattern 0 0 0 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 Pattern 1 not_categorized 192 0 0 0.8 0.5 0.5 0 1 C0 -1 10 false 24 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 10 false 72 0 0.8 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 10 false 120 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 10 false 168 0 0.8 0.5 0.5 0 1 C0 -1 6 false Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/src/tests/data/functional/mutegroups.ref.flac000066400000000000000000006776131366722712400246700ustar00rootroot00000000000000fLaC" */ BXRh|JWF)( reference libFLAC 1.3.2 20170101 ɘtT:~?p@V'}Ƶ=!ڑR- wVAŸY9ePSi~KB]5{+*|%*z0ą1kgtiG0Wv)ayNVP9E&sܲ KABfUR<\V50YLDNIRK$F$4`'Ajg)|9X׉p!*IW @@AuS!T P@aڏ.d ǡZ ΔJDIN?@9h5ʽ-&~,$,VFp!?%(_ s! f%@T=c$=@[skƈ+q\ŋ"XI\x)Vf-tu!40A":tk/Q D k 6gzj&.!^%g%Z !XX@h\uWoO}5UeT" v+E]d GhʠK}֋VS^=Hr̡504QrGXi^)(׌ʨ]Wj]vDxa6?%Q1Q[jwBF"QC}>5=64`@h4vkZK)F ,޲ߦ'nb\QR[(|pR{*ZvGF mAQҥ=tG*^>X;R~}K#*H|:| ֵ7hr |MO2Ձ휍~$.v0D: ܾ i["TO0HsȢeWǔgΊ8&9g̀ ~:&J+,mF2m KRk}{B.y[𣔘J5VJnlI^ND8"PY*Ea T^ʦV ;3.6=!kV7ƛozNl:%W0sIqRԷ ~Lx( I6ΠJqlł#w#*;в-{g(pkxMt3y #MO h aÅ{}h2ޏkO&w1a)'QJ?GV"&afXB ],xfF{jBFr3,צvg|n"̢ݑA.WUQE #YM i>fn+ j6jg'y`L'9SmiI"3Y+jj_hs.gW_8 *]xNL*p#V̲ы$~kn54_ p?S4-f<2F +߉1ba~d9ۦz)C!\ֵ3 )1W^? ?M_x` [M,AHQA0i !k q;Bs 5M( V &89cAUFd,FZ ip@3=/ ҪFgdih6Ⱦb25Q+b_9R'Z <_[7TW6Q"X]70qco'H%xVdB;Gs`ؕ~4Y[v<:O"z'RQUABֶ(VT/9,Xqqƥ5g㥢f:,EvQVt bmSTD,>G[VĨf*)^|Ct cnljmJcsi)>0MTo*48{<ޮ@xpb XjJi9 sH͈J ,M *[4ɑQkue MwP,:z2z*yL9VkrCT5Zյ$^ߡeh MT+H}|3RRXܵ[(!O Lt 丱PHCEd4xP\!+'*qPMΨ ~4rEuGX]!x/-KxQQOeU!Mcd[<2-diCFCaP+*jĿ!IX*#.[Ҫi儋Q{5segې+` ^@5TZB;s}{Ȟ|P"̷hޔwl 9E'2އ3s6"tM`!J/O?t 메'+}R 7?c iS5l\Pz'~6󍰓|'G4ኊ&[G"6+Κgrɪg@{q?!=N M8бb9Nk% fv{gQ [aiFf6f<rƫ2i,{DXpD2aPid(ʸZ!oWx\=oD|K"jڒ_"`K:2XdWCᄱNt˽1I_3()ٟͤKjUTc@qHnR[%`uIy=j4*96QۂtbM 4^rO _Y½ϞpDPJ RdgXO/^9#O̫oj_ķ x Pu1usv6r:ԋ}C>(ۛRk5RR%K9N%Fd(4njxqD<'/h$+^z_%(ҘG%pmZD*8e4 5O, oV"=1.a ]1aboY80o"0>bGXnMehQwUw.[A3&) j*Tc:Ґf[,?9#brlgt)liPΌ$&_,"c{Sl<0~o.->ķ1qL{m r:*g,e>ZQLJǣ|) F2r*:`Z0WA_H P-LGv @@hRЫ,l wqha*Z.X܈R"bAV+!L\ L7}!yAHr]/y3nLf W!V\e'-Y4NÄO6 KB %S9{TąJMd%*ix$Kx:N7SQN R93Г<;Y;2#1J>LI 6;#)o=' $$YCxZY^DDw:Lg< @Y ޖ*/`UQ1M424V5$ Dl8ѯ*˿H!20ba`;]lY$sI."Q$G:yMS}25 Fj(ZNC1`g.LH^63IOss0lr4:1iHM t"N՗$GSuV<ɇ[UPQeDV̓v1Aݦ1xU8҈n!>QL jC<1{/i% 1 _T<&Ao*J:EIJzS,r1ToŖ̢—r/wDh4cr $wAH؆TkZ<-JzFkFQ3qwۮ>"ߢ*?"6nAbjOå7 i]\?#Ϟe8A.O IGux2Ya{ĆBWYPyΫY%NirU[o˷`"Ye²WP;D!vUe+B>C>Jso5E 3/ M. |%D+P@ ;3 AD@F\)"~8帄|q&"dY-*}ahv5l:g>NKmRF3{}A9GЧF=0M}ED#H%"raHUNQFc6c0쉭.TBK_*D4b'C-Ms=*h&E I:6l@*~ͿڱmO6_Dl\[U[!ɶe9f)9#tB]ԕd>wUslS=a8#lMsRV 9ecwFY$/x H6*;*-7ȤT7/!B"SKq1n`}1{/rRu kkcB+9 wQ'Y'ʃF5׬i QxHѹ%x=m1NH]ńs/xzŒе];VOBEeަq ]ZA9ydGSEg`/B)w@d`+q3p  A'J\Sa!l3hjqV ^S(93Tb,J \O^qEa΄ڍIl}4cc:ث_)\d~Y ),VZ,G]P8k i76d8bc:%TEeV D P/8Q ".1_o'(vx"X:(߳q.$: %SӐD-׳3Wuu8Ik1\/lJ\o/9L*WA\W*fsV__B$Ʀ@@B*;l?Bt$*!:3~ֽ  2O8bbxQ̋BZ]F{pc )ظYa%BĻKCaA:#Xu6gg:f `B+##*b}K2vɵ&>AD!vz~MJd8ǎ5iYQ>XćD.kE+fpSF]S v+V QJ/╹&8DBz,CQ~6`g-RUTfG^S!; zxB m+ihTiCͥco0@ ). !PC]P^J+`whE{9T&\?2BH5&Ջm=Bs:ϒ%sQK>&Ǭ-Ko&!Q,#v5Pa11Ad,Z6@SQp]," t}Ie(vo'KS\wXk2(@ PLpfNZ&6[&DZOda%ᬡZ?CkK=oKh58RN UmКJ0j!0`U٘[n?eA@8es$pը΅I3~-"Va}rv (]pS Pb "cdmUbϑ2t7&yO[?lyTw]P8rv*Zv˩x,Bٱ<tD.&}xo˪;pICG]Ǫ A{DQ'3A uІ6D(=kڻY1K|x)}F6E6ޚ N6"~[s:! wI!<-m?B>Bq yxS x']-EM2x|DH2uF_F%(K6;ȠH(>CzVv.U8xRCRDCtR9qhr;Ydª'Drhjx?8-v0ݦu Cߵ%K%P5#{YMvA(]~}ƴ K>]6$ƪ5IJB7Fѓ(kI(I-Rͽ|?+`?҈1}w]|4 獯RZMʛ$z~͜c8“16Qej[!}$(XB$"xU${]rFGB =@͙0I:5AM6#`=0@lh[2z>Eu8paRFuicxU:dd)ReH$ 0vOxP{#*|죴gP b \pd;O+O ~3q3Jq-z|]E$:O>2p߯K8>^cw ʎK-2  9ż3Cҽ@9m}#0[A>P`GܸոBG\(VKFE5 L_ӑ!W42PB42 v@eV E ڛ()<];Hcbl4iR͠i.cο3Pf(V}E1EռDLILdBPX֨ 3V#qJ,⪗aCmZf7M:%OݡqDlrڙy F?Ur?oB,&T/iN+!b66\ZgsD Ge~h9-}wX`~5~LlW.b8C6J:5Q*iڎ˱}]5~̳~4x}\P*bY=jwHۗ3QIU XD '|jN V e/ 7s֊6r-$ן?+洽3c\$VRWiK\7;2Wwy^^<RO KsuOD &7󚏞gGK ꆐ]x2epBjǺKNTZpA#@׌[6L5"L(hL6yZ+6U#1ISwF%0euc*ʦ_/R9s"'-<%R8{I1 zadA]bnX%MIzxwAU4xͪ)羼_%hդqB/*4w+'ً.r0̴LW|CTICa\M$&L_5ly)E$ja>NR˛$v܉D&䓼賑\uXWv_$ (Tjn5_їc ܌F^bbof=CR5l%'/[jK۴#3m6uuFɅN( ߂/= ! Ȅ|gOfEǔ`n.#Z%:Eĥ&V#eG#Ti( ˴9\X e>evHmvǂݵh[.x C`6'nh™t2BʨUAS R>]xvְb[kѿS@5L1Yalv^8\H (2/J4]Ojmg7!s4@>z3u+b%*ey/ld%"-E Ħ gĝy๊ 耺,6T)-}ιyLutNS8Uc ZQ#) R#jQroSrZŜ2I-yn쒿Jec[^Rl|_gP P?+I%)${,c%`$IMxh1^,UA e jxV0j|ucg59?@Yk,u\E(2|Z,Љ[ncvj:ա?&(0i@)HNeel,ȇ\rodE; ,Md(GN`ntzhSO7V)A}u7ᄵe%,I'!8Iq;ьax&U^Rz4T!Cڃc΢Ae#rYC⚇" ~|5մs .Y҈,ς2jPD {x4| %6!M vl Q4:~(Qb"mC$B:0⚂j΁57_-׍'p4vm-\pE"tk#6ԟ>H@b*S>30z6:]W1KR|St/l/JfFMD~T'Јq\\mL ,0{/MY( j.4}աB4R\,%d3_2|8]Z8s/OW:FSطx|j"cWq-])~K]$0DhKM" >J EInz1hv2CHQ8J S |qIv?et^ 3ŀW\cG(ldv4Y2Eʘ ֵ\}s"=KH|KΩIq88|*$kv[]^1&mv T `izDrj Bc_Y]%ڃ1E,?>]XڮRI$`C:1bښ]AX 8׹ /C|]#nBNG؜%D2@ma0V(LVq V-90;ʾEw) Bzgz[4Sf /4$R[m=aFՉegieE7 NoTQ8`|.UJ CfC99)Բ9] S"u1&0U^q`rh% ^9ҵ-- lXI4,HNP^ ^>FߚDa;m#%'ŁP#=Xc~TeQai T57)tD1w70G&"BtM]y23>@Hj pʵK<]V"rs$Ua6f,4+iWB+WDT@OV8@r%^dC} pњcibu*{AC?F"?-iCqÝ]b$;3KRDQ/!B5-:.֥\_Pv(( Tx`WK`>Y@CCv+Kp`]WjVTG(m[Ɉ;-i5Q"nHF6K2:YOJ- " H +P?t曙({zӏYQ)Yę\="76pKZۙmJ$1UN]LWR3gyBĐ&: DX*t(غhQXWe?3(e4 i'⍩WW(pQUzс؅ZhoSⳂ80gW;\Ѧ>JP댲I n)^` PnEFu CjխS!D1_+G'21ShDÐKEU%21GHXpA=;j=+B=W.'>DtuNȓ:, >X`fW n=!p;VkHmqZ]xn0\Ne솾1A=D!) B U]! }tшmظ 4VVǑ, ±&O&[ (rBJ;3U ^)W%RA\& :aZ2d]}{ˆ/V^Gh *I J2jJ1 vKoVzs X* ss'|?LW%K .;% ``Vw8z//LB]!Qh:YKMԺ7^m!R UV(jtNƒ*wcSў˖g7<2elU~Q QJ̔+*ןH n $/3AO^/)]ixɮ͗xiP}ᔓ>c8Y #]~+ PБ.2;4l\C/^# F&oO`N7[SHW}|FՍVЭeS5hx4]fDCkCa,0$$2jrU.u$H`ݱQ#$?m&faL`ߧ}쬝__;O_k׿C"m]1EpSM`7AKH=!9>~ax!@R޳62f9z4M:WAۢ2AnI T ->8^i24k΢œ_[EL8U1W m(n޽lmPN`ps5!+ٌ%2lrqļʐ.%"A (}i9鍭2!(r,=1.#^~WYKFej{,Ҿt`X oeeb;hEٌW!˓RCZ@kH>&<=f>lOr'p]L7Oz_$=U.f`5c idQWلHӆvP9Q9ۊZX vLbӰ!=?E\+Jß')]^:!! 5󈎡<18AH$6N(rn4NxYhr)hb?W~Gy~y].EM6/ pXDNb~z~>H-nf s$Љp"RU1pEG O\hhCCh ߮=3O{Ԝ"s$T:z߫W(WDbp$;WGwQnh+K )\ǢZ%GV4f.5 hRTBP4Ω ܒ=RV ]<1}6Yr抇t;&Kr|Bښi_RK"?K(`9%<pα$v8R:V8nՑ<y0,LPW ޒM8ӆѱ$YqXRfU<śFÊ@˔$碅Y9.?&aFD)7]vtlsZVl&@cek^3ڼiЂ緍GJޕj.[7'Ahm Uq"Zz!}cM%2)Ak@R:2E+U[Z~DtR"ᝰSMOymmRBUm,ͦT%jHԄL`|f %ޜRȁzp$Z{jciS|NoH"}*` ~̒%m%p>$i Ȑ8dJFtxW'%1_u6: a+ /V ^;AH&(LX9Rj=cDq?V22T24tsɉ-$`Y_(De,qn+gUGq 20B{";pHYLL%kj*is!E2Y3)m=%*.Ri ;ը2&okݘͱm%'QϜЪ ?AhrY:2_[Ӯ8mq)-(`As Щi0IA/e+\nmR.X>Pn!&lP+ҎoԆIi?qty9 ?ó:}l\x3#BbxcRLgAO~s++Sixkni$93}1bh~T|zW&vעXj@1ãCYR 5E B&ObHmn2UT͓zƦD h) `m8=Y}Ь 1«It >N}?VT,hHٽO/ol~#܌&r/ VWb`>ҁt9./'k:Ï'a)A]Csv4 J<(Pb~)80g2cRüJ‴0Z)G]M<ۗ`TDKafH~k>C|a>vbd / YH _ϳ]! |+v+[$OĈS. wCCap񮭅^k=ZA: xB+zLI%i^QX.ՙy~UHG"cGRYp ɘzF.fcZjsυ9(P+NWK 0)ceZOnQPm I*\.Zg4ܷw=DH"h=  [\n"$85b 0!Scj?YW+\}f:> wzsLDž#u7?+C&ZIHegK\Kw*4 ۷Sls=?@/6E;X:xE)9o*@3F7)eG&*36~6-G`_z##0\Y_DCNo̵`N=, =c,/5t$Q3 4zv͘]mFI +0:u'Y 7UB+%cg%(JOc'pm6w1D21z%}}MѣxSNv'*rKms0'X IyeRQ@ P:~"TB_3BMqkJcZl]}I#7hL SE0xA +;7Rq3dGHɵщ*N1F&H, B@pUc)Nn iL(=eB[!ȕ']vJ;ڮDӻsg2b\dbG{];o8_뉺:*QZ q3 ZZ(10N:lwr?} @wjCks6F2,%nI} b\law5y{_];2H6yƪRddSuT)' J')Y#RT:b6v)3UCf$@ĿKeq(?IBiU]Mњ\J6^;˴&9z!UB"D 9 8} _}\&.8)]9b H b$hˑh!.I\N&6@TLjKIL r-gL+?TVCowV髣k*xp=,"ڶ]!je$z*WʊV`ב: 5mT oU-|rƺ36jNM>SI^#"`%p%Q޼4ߗ]#jo"rO&J KA{Ov}Vܱ̉?k -]"M/nn =z`[NEbɭ֮r*@2zI64?2ٜv'٘?jQX *O M_j'gJVÜ- [f*Sb]bz"Ӌ6%_ Wi #v@KTN4֎lP={J/P81$d8"#hi9r5ɌiO߮ݐRm8Э-Dѕ3o!JrǦ*GD] kĭ> T}%i| %ʓ@Q-BNdaoWhRw5yP@$ja5k F0̀i3΍<' >S|ꋑo!kO"o 1kџƞLug4oH,{Y %-nd2Jbג^x8±p}#_0 |3lpQ} N}Q +)?qYu03'֗PViC $ECy iRB{Hu7qsvv'T 8; [K-(&,IF :zBh1*(..ڊ4Jr.:VG[/'M=;1kM rd4ez ?h bD>+萱5ݟDŽ?Jqš { F`Vc3l?j*CKf;S- h잧CFIW乽}44%m JzA & ӧ NK!s4 cqD] go4I].V'7"a]E[L`͈Lsyp %+i@r$ġDyަUdLQL%!/oE cb0m劢8⿺8,J߶[ԑcP:lS,VAeet>$tLMfS1hTb6"qbcfMn>=M#P#eڵos+'yI6j4/giP$S6ls0ܒwPZp͡VNQRRb!d'"DlT% ZcBQ$%"s giZ[@yXs*G\j}Qeb< d(_('(1BX V,aRBW›*=[KkʕB>%&=,;fm00o`Ζ7AK"+dCJV0 =^0dq7P=7({t rJxCk$_ps3%kG:#;+B|pCuVH $NKA'Ba+s!`7Td_ʼt]VTU[V,(QUgǪE#q-yQ_ eoRSݣ'~Dz0KWsp0>T>hg"2"-uQ]RT\0$ICݑW:MwCg5p=xC@7Lf9(fkPJ$w SeO1yb˲ !^sM@%ǰy=r3)Tt:'%P0vUHe+䙔j\W֙(QZ³<*ICU:tZ'@=#4[s4aJQ\⯆@ Z@!I=vllDFYD8Dʐ %NR"Y z4G\dh8Aps%1i, R$צ>KRz6w̼u4F'\<<+>Qwi Ҳnjf{Xm{Y. CG9$YiV|UągϫzkӠ4MJ햠Ԯ.X3Rd]7;hyJh܈owA[\|1 G4.2*#N/weFW8Yefx7㋁ܱ#PT~4,@iQNQcrrF`D,ε"C(\S热LTw,l@]QK/M55C6F.7#5[4R_\&^nV38â2|Ե:EMJ漅mNwg…D`;}#ֹR+k ϟVga=x>{' |Cۤ^M2~_jQZ3n۝A 3x貤}ؾs ŢNףиTJ .9bHSaoقމO!_eA4c)3 f_@yK76n[fLBT_4ݷ@= ~':LELuk[5U s=$-O1e 'ZvyV~UG(qrt^jzQڤuG*ɔ0ƆGz3`W No*L؟Ni:F,0:h‡=+P)<>]d$J2ȞeaNQv`Ԏ= *zSg+l6p%mUR,.Y" a 2|YwѦ$"AE EO%NHoLwd b.;Gi~MEij L$J{]k/SY ҝld.VqE6Ղ/t " hW2hg^;ė&T*t6$Ņ8]dIZ9,g>-bɩf4uE`B@``0W^dZ_=_D dhN-L;Pue.8 ytX AC]Gg*F df^S'|(U&S8b1)/ODpS>YdJv ᕢ[ zϝ2݁VE;{CMC^B[T.Mi:O({+3KMc; b>LIVɩ&V<-FPwfЬL}Jez) &}ݺ/o%~5ԇ^".fat T y>:E-~@w@cx#%.ͬL^i)џ$$ʚcuĖZ3u?1 f AAx ܍ULB@/"tFNF̠K 'Ckj2`ۈ?zG@6Nh6WU10AaR6ױBk1,M,3.g/6]~z2: TP!} g10(P·82T Ʌ|q̟Ry gmGT?vH ;>Y#5PqͿ!~%eFCYϿ~ "ZTJ.#[k [*{ ).m 'K,F8B1orjB u>Q1Yׇ\FdoK6RFi#}%'ȪL`gzFWZI(\ðal&O1xĺ>Xe⢚5RN*۱G/fd3%'q}SP#dvR*(tntv({"OݡBϴdBD}`_XKЈY@jV$`{z~ 0vH)f\&,`P cˌ!M{f(1񴃁 dӼ- ! U8e jW(|3ۈ@cN[m閧liTAc0]@ FP{(jpcDF4xHg,|Es4Pelګ0 M/49 .MԥRe}abqwgSNݷ+tԙd 2H@΍qBf4bqL#-y;b/Cxgݩ= XR̛'mDR: ;*U.]Pc|y(p,NISM"+Jai~l?آLޱ /ecvxW_/xEFf?=5SG>2KiUiWUl1;sȧdn8(7ت I2>6B( X28SQίEbVU cKfU2̸_6}xvj!$jPM 5<[LŤ )+JQD7Lv`Sb}ҦH\BcT r0TSoפݞ=S{f7i~JR3dI(aI6K4 tرOSɋ$MH r'ƶxU]G+Y,'0Z:dS9Z xOԿi=1Z7o&;66Qt`: :>.j$e$xE1tcک%Ogi>LO-w) ,^G_&|AJBVfs6X0-MR &R.IT)= IPq UꮯhiB&'1SkA3]lzz]:\i+*cBU2x& Q^zm'&QjHHn ]'ʭOQB٧:bF"3TR$V  {(v a >'UrJJc2&S([]bt% Bc L]P|gV>"mP5)NdOu]tڂm oIT8d=XO3:Kj|5։tIwCzbka)$0".Q3BޚVwU8UcQ *+9K[^rc7"X~zZF侈z[):ܴ.4Kl~pR *q$Gjh܎fUܯ? }\,~"~/Sk$K-q$}Ii]I=[.NZ7mm$GqW KOT< -ty=Lz}?J}19^V~͘V^JC֥m9^0Y$0P73,pB~ h/ pe?FRDD螥Ҡ(S=J,n a x&Pt\rʼnDd 8Yo ˖>ðCR/ QHؐ5&41$ ޲mKB 4>՞c|X#pJ]R&&lǜwKP4%[\KJK7'18^>]8jx#@Ɨ;%z owę=+{"+%~C}7VQRMGJ{dHa_Hd aCI#%(b#C [s#LFSnB 5mlߘ$ ^,BS+Ibϊ2Nv!>aH3l%lGmnqa[E'-ŬATZtwRC*® }IãU-^E!a @26p$ƟfW։m'H^R|Ĕ 倧B@L.)1E:O?܄<N22uIx)wHg E]ӈq2#d˾+ű)"A/C_ƽHŹnv1kH\Ro޴EJ)%HCo NSrr3zA4,fX:X bd(ieFH4R*hs]B6%Z{#FϏv;/%{>*W!]wwhei14MjѴy&e߃[8FioE&hJu[ki=[Ӿ4~ :bհ˖K)CYk#B^^mFgXw4L5.T7~F r4`!m%*0pfQ 8IB&f(+K9 ahڜ"Y>_ݛ$Ie7/VOĩ)a ѿ&ej~+ĻQ9- f8/$L$KFb+Y#-cx⸣aYBOVʻE9qs|QAif;ief㯣&O/ѧ!mxER3[o*@ $/oIz̑뼲6\Y ʠ!ܲQX^X;Sj=βb>S-Rz%H]CobJn!r^rt*")hZI֓5]Z:vLXHQ[ !MsC1жJ@-xYzQtJܠ?BT g/gwٞ=Gc3"ǩai:7>¨bL\,#O͢I=b\#G*Ziۯ g ۍ/ )4oy,Yhֿxnr, LJK'x~ԏ@JK;:<=@(:veˆJ-`K=9Z{kW}̦in~?X;UNVD:j%!\62$?pd93#ҶݟU! "˪ޢhMC!md쩕+z,ZCCcf*R[qɸPJ Ly{ȯ5p~LܛI=#wrvcX82[{$nUf\9?%J%?dwN %OM°RM[S\*H,J bM+LsM%O։ZwPX#YsAؖ[]1Pd-VTꛖbl#Ib LZ -:݊K"B@'DCRӦTlR2@ҾRwQ;Ńd6$GteV.y2n &=ҽ/^Yk_I%x+61 'nݜ;X6V\v>}͗wQ$VV))$Bi1>QL_$qH\%MFcn{c\_{H'Ir3g]Af Gm! V&׆UE.F'Nʰ!p8I PB ́J*t\d3~jGNMp~mij8ߔW.zUr,%Bᇞېh(_J "ކC oJuh0ˈn2JBQRJ4kahI5KuꛪE)J>UѤ S]-1ijT%z*2CѼ&\,>V\@}}չiD[[hfB_ 'Vn 4Ļ($DX" D⺽WG~A3_0j\e֓jΧCS _a*_ip²9/{#ҸmJڭ~H߯"v7ոM;ETUו1\l…c='jj!~& euc_܍P2 ^(l~ KFF/bra?0̿+ ˗_Gs=b6tTD-Fw4)Q\STeq`hYTXAt7QwPęZJMDtTuEКv\ė]­&=rR(#<~B[Rt8[?Nۮ .=anƍQ\S0o׵:ϫdh^f2'I=8Ět&A$3$E,) 22E+R&>0,R80N8Bw3/VרBPϗK K hj-&UT&ZyKA_'-|uDR D$%MR`QHdCL؄c ^od/}PPor`Jӵu =*1f- H36kmIo#$FkJDnZ'NdPx21cIbJhS$al CQeK*ef;k`(H@fks㧐WZV J$mD˩Wy.)IeeXh]C_,bO|m*x;|T緑,lɛ Y\J[$03LHFNJORQ޳Vd48~xs˒n ۬6ĝ$¶r!n, n$"\5菘tkBo|eE5"|Z^ʏ&_4q"Uҷ猽S.!XIpsp{T% VBK~(mނO `C?$72DÃimj F]߅`5'0\l~ RZF89%PG|pp#/J$ÍJ\Wb!X; A" q2ltL2<=q휱?`"q +DVrّ7,)4(Ōfk,-:z9p] (7 n'9" #\lhY3X;D З,$c`*N^&/1 59@14(dÞ2Z-*Ynv Kh-{UQ,nν"I')8_(4ˇ:& /-~1ѩǪTLm:l e:q__0"+}+"O|%~&5@*T5? ]4Oj:HlBX!9% /OҼ"˼] j|ݟ%O "sb ; aht^nGOb*ƛ,_&ou]L/%lHM@ު.Ua'άA [9xTၦ@#C\cP:cmz;U\T35|V>ܩ llxLi-Oh)33c=;87F䀐52fv+Ս,F7L(4\&eYƎJ&ꇩ"2+B'.6_vgw6i^mzfdO vqjQGa>x͑5o]M}vwPt-sLRɘ}L) -pl]C~M5(ѶxxELH#YEؿYb~ ZfT\_$kr75*2q*ә|幬@g`>ݟ&b?NT)/97^,(qfO@z- cFtcgp&$)gLS*~i!86 E՟| /Ze{6G~CwgKMC@,mE'*K'7xA)3Aߛ$M)DB_%Is BʳZWFGOT3υ'R?NVm߮EGzV%Ni˱2r/bC*ɶS7wk,)isyڝޑbiDhA: _%s0 bStF,X54I\ ix Pz>zɩp{SUQ2}K/ȷbuK[Qѷ砢/ T*릀ӧ؈L%O; QbFG9wbg㢧aKˈ$< ?Tx//0ĨFKGnq}(2leP@FE6JBaZ0Z- Lbږ H!SUq7V#D&iJY%|^+J2.c `#^D)m]YipBOb>zLcD#=7,adQ[3t8QDmKRD([0dzMɾߺ6|R#4YB{7$`{IR.x5rZe oVbt r94 ;Q-I3~m)6Ycv.JEJaHUFuciHE[,h( ʇZ I!(omFeYM Jo04$5y% O#LFOƂ/H Ar gXZK(b?Ieac@y)!׏#"="| ˹™7`tbqxR81 w@!1pOn"y%K~j N4J5V*>^`$GUs2&4 SWH F>SOϮeeeB Dȝ ]ќo$,?EXZF6@㊠N%I({]i0ƕE̥K=_P"NOUK?ױ~ꑋ$;5I;gee<0@ !DzeokrȐ̟(L #3e5v; a [%Nn mMLo* Q}xBw-Ԥjt5&-i>UBQbt[dI %.W/l-(l{ׯЌPfB..,6t]v=%WmI"`Έ_4%!A-וwUv1}[HǍ*,yHjHAt9B歁uLv`H*/™c)]{V:10(226>6{Wș.ɛ׻FrjI(4ST8|E<E^1R8o_*>rb#fR쨪^WH(c͇i,Ne;_XuEj%*Cdti\y.>H%3',KɉT0qE}NH/n*+RPV$Fs m5c|u%NKX0ЮH"пz~=XQR{[C7OG謵KunϺeTj` 涶Y4*b,8CFkt;htƌF9| F^TsdLj,h|Xd{t]Mt(ŶerẎo4-d``15QmUcΈ;ҚjF0x$Xѽ TJ4*'*9!a@ nAm~A ULO VhQ,n[TJNJA`k=`d?)N(T:qըRYi> UQ:>(/HO:ͺ$¨iz*7d| e Lohnu34 ltU*"FFjJmcW's[͖~H8<4p ;#򉐑u4U1aJ#[V3j>5w'^Y, B8F2 ʻEYq l ΛDyh^b9%pEQtΓP \"o k3zT{3.$FXK="9b8nhK K IZs{Q9 UgߛuxrBtwIKy(*M<F/bOF@GD$xPiQ=0WPG?WL4R YH)s_W ][fJn%{4K縦h4KhV/ƀ]2Y}߹5m_I*|Wr )=KVylE;SVk&څ%ΒRŧVP$Ȁ΂Vļ4`XAzn@[6烍Kкӛrzgjikȩt\ a_e!Pp%R#`Pz|k;pl閿R꺺?[emVR/li--g#sϙd#v-cmH1wHl6Gv*-RiPn8/;CDb=ZenS?&N:C|D(M0*4V ý)'.-8ULS!rRLSLGQc!ed"²v.8䇻}JU5 W364X+b蒄D8cfQ^1m }j47>ݦ$ʸ(R)U4j e qa sՇC(԰J˚dzfMN|jSEAcDJHQ3J4Ϧ-X*퓉 >w&5JʎvJ&t혞)sƛSJEjfߩ`N(+ !kKVDg+(W2nhMdۢRk(4h=5uB2TKH5r,C1Nf" qQt4BtXE>DztP=%&l[Gc9&zǤI&H".II3D > "jPaz\A+#K#b "ר]j)gBb  \i.Ƨ <'ͣ/R_V&2IV)ذ8~~I"$VHF;@q@){su'[|7]]"Q q ѐcPp@jڋ`̌4`cj|m]RxM3gō5m #6tZLB_61$I$byd"타ѼJgrǾ 2<А.diXkzy]dFm&C(⌟IiTË] ک8Ng,FC":BPYQ`tIP3"51YAq%bC|Z AZ!ށmV| qaS6vOmqttWjP8XS 5溣/ajV,^:I?]Xh%ؓeԎRc) odUmE9Ԧfv0L"@8W吕ҧɵ#VDs3]zs4R[b[Cf"D7we]\&4 {MrE|#)%vYM+2*\Sb~lDEb6 %W'!pFTo'hʱլ!Mri3wκ#dN!8ì~oxV@1_!m-@7 _-7Gf&&HVd(쥦Jw@"J 18JhMrʜy"a͗j>s}Z.q)ʈNbo-A]y3S"5xHWlUaZ%V ̾WVT}/'4E7&I"NOiV"8f^WЧS/xhmNc6O"%z<̽9.) &[E_6]t rAF'ToJ~#8Āt_m|](*ؿ'!WrŗV Jftru1dny5Ju;b}Yu.fwec`iH>"\)xԘO uw8EM0 r=VE¿ Gh#,M pf2ﻃNHUNF!dOspORnwȱaɽ&"!0c‚ ; n4@dڱc %sEgBŅ/oS=6`) :+alB#Q!Fӫ(qK"l|jzM|< I7NH lGޛtDF@g MSc7/r%*~]b,hC+ڗ]ي$D>>ɰuD&x`?xshjEQ3ri,'% DAoǖЪ@/T[;V-2;% S(?[,o]r P#v.J>91jM9\hׇOiKN/O %ŬmIZ2K>e%vV%E0C0S2']C<f]gODũf2em,4,J-51.s#-Ԕ{HzSGn\ %iL=@n%B6UκEdf=ca{ mJX9Ih:B,bA=WJoF5aO書S/U@k4„4G3l뀘N"+싰YyV ;ƪzQD]e 0GjN.I͢V2Nv_@b3 V˅'dxٳ{UæV&XĬIr\̘P^LcMa{l S9Adms ^ m 4(q/4orKP{#+.*1#VЖIP$ ADRkvhn'V ^~l*=& M0=/E"PD2v8gtFq;Î!Bc|gP[na"t3 .iJea$/¢\'=*p"i!f t'&KKzf‘E *D m J\ V Ds5Ь ziYKv; KP cT'jO.PX܅?)X SR%3t,%z ĭRH9[UءK꧊䲱gx[2ly>6b`S;EѡV_{2eN$9l$(OG`BM-lntx'evEDPlƠOXwqM kb^A!36TECM7҄c)|#xM@|`m/|&H 8lwݔK5Eb zl``\%U!$$YY< 8XW?Fu0Mb_8e/g@MHK(L#'gm5et \NM4i9@{Q)]",D MA`K}*¶ $yj Aˡ~h%M7~ VN1M>R$,F9q,_uP3?Uh/9K, tBiTeM`D}S p": 0uG p%NkzfSبOVvD0O)DKYk8nbp$8A<g!Ei@EiېBXJǠBwZc.HbQGNB`=Eblt-[QC,-)4Iou(8p^9Q|-="% ^"pP-F0#y<) 5-P\'wC0 CBa#ϓy|d!vIyL8Anz l?dLJy">e"&-1D:[P< `*(J+OѽRygjŜ7ڹbnQIWyȹgr?x[-<4jIJ(dj7&.kk6KJ˻T)F]4h+!D쳅\R y]z5yM* m+ ٱT%`po˘ܩ-@c~M u՞̶mxEwR%9侎0mh;c"Z_jў}#'=1Yɖk*T35LC_!a2CgRCmi 3' U’ŋKv8JXS bOZuRA@Δ(ODgROg$(Tn&၊cVdQU5tL_YZ9^*eRKןa#gרkx bjm5%NgNHybS7 LoUZ)ÅIc۱,w WPC&UiZ#B> jQ"ىxka0}GiNrGy_-VLU )ң]}H{:eU*$"3/+Py :ķ!9-%4V)g^,tYZƛt,L|u$(P3a1Y UL)yhD}PK.|5tfk?*pŭ{t]ڑZ.sEČS ZHrWm{ K#( <; }_Z6'TZ] q73/imEjDș~䈼ňWw#ܭOՉЯc0u =;yZ$M*!b{(>(u\EcUL;(sNff 襁@df3a~aWk7dlj(jf19ݍ~1JvC&;%h`nc+͈}QRNW.iŗ%z)]4C`˿D ̖v5~UJ{Gm˟.[q)9V˛!7^(WbSHXCL hI.EҠ'B>;FhKG.e0 6\ _V)7[zx†lԒGiKJjALG(RJG j&?zIs!Rhה"E ~M$y7JwW-:~+vwR=@#"&id%Pe:>6E-LÓ`Zo7U}DȂ(\Ԃt@)2+8KBdP͂H# "L;8խ/4ѣL&uv+@w!{X1>zd YSu }7GqR 12L`J @ID BhQQ?( y"Np J8rA;|| LI7tɆ,RԜ?.X lPزgan}ʔ z_O5)4$w_e-u\ `6r o}e g.7$+uwo& qAؾ+49eʏ(s6E%k#YE 8ee]Mn?"O'ۊz%Po{YT# ]|S( 8\'!' d dEUHMŲmxqBFUHhhGN+iu?|Kg;rZ RA)iE-fC̘NUHְoXBMeup걄(+ly l 2e>+eH*{]Eč=oLKFbeiC[qD k4V3pW|Փ]<>|0͈lu(wExX!/hcQ \cVi9쓚<))6rIt䯌%_oV}$A§ob>xk<6)r0 Ԅ"`Em"nMjrΪlDOJ$bB,I40 h#hj-J:NC.6h2i ;t+shk/!D/0%9Sjw/aNsj(胩d#;VL-3 M2o׋1Rb_c6KLKoa5v6/r2s"sd- KQTbA z %+%kFENZ K.") ?OK[e'zJ%S퉒ۙx2bmpүyC7[:Sآ0#-ց/V} 0Ev^`5iǏa t&aHaP,ev#lGt"І!.(K&5eg TG H\oa%BGLM 44boF@VW߈i7+^# !CsFCM)amrl!猼/Kkڀ,U |[.40&DB|=jO&MrK>'0P62lQh}+^* uZR 3r]TNA5 9܈wKEDiU)y؆ۋl *t ^)L/PVOWzb*yREIjQ(RjFʼnΝ d$i*s:`ţ0L%`@C"z 1EhsRfXOJ9*(cѧɦF/ ?z@0VF6"f e#2i[Gta!+DJ,NZe*D.<7tfM5 Zk ]Խh.$zrfӹyJ1@EBC 9hjbI`d[anR5hb69⭾tu/UN[IA dfՂ=/HH׾,+NMۼ5*Q F"_'(v}v ^&47QR)4"AnԬ!pFU˓r/vIHs7f5e׷6TNtjBb6|,HDqQȴ%;?p3]:o?k$ h*)#Y: kU6H7Ar.1u jeiw!l S! jzdDL]=6O[ \`%IĄ?5U_>ԛ:G;2#M`)^Me!Es(pHX+Iʧcɕ=$Ld x#~j(B^!}W| Re_a25-'@_\zK}{1>#`DH:¥j>&x7MUVa.u ѵHZ.A_[my^; }X]o&MJ~ #0&qAyۤPG=͒˥.g Y1dE^aE,Gx:5Or/MG%)XH=ZTimNL.txRk/"LP2jo㷆eŒoDyӜnIOM)Ә|4K7Rf#Tޘ /qDc)OUDI"9t%[HSg!P{Y]ZSIYßB !9V¯!WwU7PQ=-G{ʖQOi+nY:! e{v[ QdyEQI&;ړ{;N_aرe6eoY3b $džAXgTzŒ ط?^ (< p{BML & 4,~xH/AdiHAHb Т5[Ng5Eyh\b BzR&!d[ R40GJZ$yDaSذTcRfY[4.Z!IB o(%d ~ISvj&ZyGS:g-is cG 9E 'tO^2Pd+s_0(fB1<%#~$L;mZRs D"@YTAp409 XY q 4U(C-J5<+oA D,QU*rFwnLàU!d2R_i+Oʜ FT&#AWgW'1\tl G=Ltdݹ"A +iMdIW $eR8c"a)qsbq;³LN+|zf=Is6(s s;OHhD5v#Ztegi>sF^l/8F)?Z,""냱_RCO^^ҿsZ #=u̴F @"l͠&(U* Js4R-)1f I;F%PPQǥ9s Yyn/NE&MA+ѡpjqpWQ'Pp40Dz"(sɘoP?_ZJg^gE3OW؂ bZA=TaIZ"1lyRY„Ms=m;^`B\KרWJSR^)J c]AS`1~S:[dKz2w3b^&2 ͮ8TqzVbȻ-8pQ 8!B)c;s埴睊nbVu-KSWvjUNcr(qB2̮ #B1W0#PRG;P1QjP:2!:ZC:JUl+78K)Q+Z- 17;nDǨ!Xq9QH(rg14]4dqDTLDDU)^d*y99u})wf;sqG2N_JzʬB8B~aXE:TTcLO!0aJgAj181 c(av4vA6R hD(0Aj2 d`0DA!4 0CXbB$DbH DH0cl96wPeQl10 C4 0shVܹQOM T N0VJit[) s%;jeaaZ!4E$ k0b΄+uU-3 66' 0CjA@bD#CF00U;1U be*̅(ࢗkW$7Qe Z~zU>@(8 d8T  '>rRrW;0ʗSy0Dѱ떏-|釃6ODM HQ?˞]j')B ߉u>菊8fGH27Tsö7_l*2O tթ8f"2kOW&X[%F2bzP]i`l`Z65fzU9F9LJ;J(PO%^4,H #.pC5`gvAؗiF2ּmNȬ6%^dJw"D-IeQGE=1=1-LpОp iAӤtc08ZVQak{ m䳵 0!JeN( ކ#zNByk sP x{y+՟Kx08xΣT2 %RD$mC ٜ Fx )cuhs yJvr6mh˷tYœ~GvEh+*to3ؓ `bқT'"'r.J=:@EꐨEϷI6I8X.Xm7O&HB_ˤ.zjYw(=˿\IN~Z` iaN*]_*&I $ۥw)YXvi(_SAMU6[cJ3$v{^rE7޷)r](Qy0]:i>^Ūk|T2 /h :]u6: 4A ɥK*I#A;y Ty83z8'>)cV)nm#&W|bHRcMFgz J9(Ur_56(<֭)x\0:cpSAwߓ i]].Y zp#[z6f(;j8~Ska+~B`Dd"QCA ^蛔By[ FYPI]Pii-}WtSGAXd[U&6mjw"j ay1W1:+C'Ka&ڪ%cFr-b-\wCj2%z.4'sv'ȼQ6!K{dKO($FF#PA{Tu4h )klnKr ~ewBRHf-g. }É ,j' [ph0'V* ӯ$"%֏ jhu#cb #cA3cQ M, Mb;b C6-J=A`Q}t b|qDM1d. !qJ: A+Qb_O1#̹$h3)XՁ:u_31!Uo7rA0 !Y![ ,з"n"-;ΙaCTZjAIm#°iA9"ZܦNm7u (% *&iedKBDIn};AXTS?=’xQΨ )MañQ7ϑUesN!uě;VTqz -:R]xKs%B3HC,y*=M%R~tNBrB:?J¸R`;J+nWW6a Gb\ 8)V2a Z߳|TN &4&>Ъ笻RkM&pP^BC "x\2qj)s`G{ iV#,\ DNzXxlVgT:Tmn6ĽCqH&ex)r;ςbY1wpƕ37r~Dm|'K͸$,JSF˩$]b2EEnȒ :9 IK9o>؅9yUƒc:Βт]anƞc(yP=5.IXł7/9{5Zevr~9&m(.@AB12,"ȓ͸^.fa_6`Vd8irF\HQp>FÔmB4^0&]) Ɨ=ybz X̀@AkkG B4tn&m\mS-EG"#Lͷ6(;< 0ZG=;V0MiS]gHfY3=au@TT?Lo"1 .,c^BTKȾIF=ʺaĹC! j@!2 2&޼賾sf|^{v˴3PECˍ z)gİ_{E [tT[\$:LiS KuU-DY%7O l3\(x/C$&$ch &*SJ5* ^Kiҏ&*~.*Ad骮kre-xf#9{Y  4 Ed3`5b'|b?R"&l>R>JI T.0Wz#R v@~( gEK9=+y#Al]{[D FFIBK޾lpB k4볁:-r `*p"H_#Fc-b2Zv"HS TFc]jL?*rJw +S7e.3֍^o淚CQSJrJL|wTy a|fhs)l.V9՜,Ťf#R2ZdJZve .7`7HЫ ΛȐԭŵXzR3ǼZ0b[mF߫02W-Ԋ1TJr/Uf$O)=yYEbA nI"㕰F|V,J{j]K}*M2ȷ~}kimVmjUfz ղ caENEsG^(AxUe40j7X6@*܂6 hhV2TG>vdfj!|J*qDBl,(!m,UPeOHl~]S;-%bQS9*Z\W뉶|䡚s=ce÷s~P7{p$" J1WJKHQW*޴K{i /ɔ|AbCj}-b{ Kpְ<_Ca" S4v>@arRhSaV3~悚3)Kmt:BD:7þI$!q8`LM1 ^͊Jjgl7X+`QO2`)1-G?kD&N| UMKtIbPļqQB8Б0"I7q,9)f|/E4[&2aC$ЁY`hۈ)ń5T&à?5K&?|8Ǻ6яQVZ{6L)L4=HcI '%0y%ˉRq&?/Vnnu 25}km1o7o9^ 67ԁbH+s-*9@dCbjyB5R=^vW!#P[jdKE[#4U|L8uP; nWΎkyȄ+ OW ø.OE,˚yraŌBm(w Ȧ9Ա}4ch@jp|p]AP8D%eO7h$]^> gKniykAL&{{_o(*CeTyoyajN/m'e>Č1VTwQ/x%B/HY1v:r( eꦫ4ć1d K&˖B!0xV'!e7pSs!e+VapAkcJ/:wueqBѵ [ XJXz IEd". |&e) e U&b34_*XވJg9Hz ]LE _1mo&v}tZ>6_I=(dM!gWź7ࣸq-ڼ-6b~=l5eYTnoifۓa/ɚP|  Sl㷘*ވJ*ͣ:q"ت},cVg.s؉71U(*SE%A\TA5m~HRs"3+S:HBކ*lt,L)\N͂X'm Nωܼ# DTb5pRpD_.wUh9"4Ơ`묰h3 @Sz4ku?"mV=oK4̗b߰PLaX7uDs 8w+k{ߖ(W?O+dt ^"M G] #4V9ݬ[I iE4Mɱ! Օr#N_'VC tH3ej],!Q%P44bLlV͊se3RpPr]Z !?DCvM(fzKςfɊ1T]EdWҞ.Hbh&l: >$/pUq+n܂J_QO(qe"0WBKwnc,+Py'ȏB\g1OO{9yu<qd }9Ak%yִLϴBDg@3ЉU]t:%|՗)'W].mC2/jy}P! n-Esoϰ\& 8ә\҇ ^(i2KΠ :omb)wf@$_Höee7nr40qNÓ??dcGO^=61JR $SKT%25sO딓'thHM;.+c?װ< _&E̲$ԕ9QНF2Ny=Ꜳͮcٛ>5"whIB[;/ΌCbx/,@ܦb2IenI?,$VbQQY=vm[.cCkd9>ē0i_z[ZGf ƨ*# N(axeT%'A)A#5J %#h|u KC؞^5*u]圴Z(3'~ےÅHʖ8TxR'%BəMZ1R"1kn5%AV+\e/\fӎnEjigFh]4+g [:Ӈ95]u9RT-]S R4>;Ԑ{iC"μu?DY(2niFWk`ڲ9yNHDO .Wё"GM/ҥ")חtɋA[̶*fQ O^Q԰~5KoPDy$ڕOຉBT{9+I*<ØL5$dMփ 'L8Z"I0=0L ѯ":Bjkp6ӄ͹qOV Hvkײ.RgD˰vZnMa|IQ?n+Yu:D] NIޙx冨 GUS~74ʭXp8N2iÁUT:} GzLOR9C3_ܳyI [h^HPb#$T>ǥpnTnD[)=5dH1` Y dч TSEs2"=ۤloF廖m) Lads?SI#Lj)\<-* 2;;ϵFiVMͽeF4$cY^ Gy'-%11KR+ί:vc6HȁX(Nk=}?HN,?97dJ1)zzu1-p90{.hB^j=IJBL^8Lh$T.y`Qށv0:DŽ)$@БM{'Aی<cτc{A٘'O YƷ$[W8 &?H1{j9ڝ%-GJ`z"AH]M()Pzۧm-vG]@4+(8R0^tsli3 NK21[XrB!QȼP T_`0#"~\ikPExlW^ufl>J_Ø?dݦG+{XwBht_DAy>MFAvc J <i&E4Y3} fip&wF@*B3NY~j)2^+uaWٸ0]ϊJr2GWy"̉&yVgAg^.qNzQyսq[IU5hL)0hI+WFwrLzΣTEˑrbᦩ1re4D16܎ujڈ5.Z O}覄F74@%N-"0) 6>)N`d󯽦vŊ mM5z^F$ [>[QKeV*|H5q7"Q-R( g }(d@."[ [U8N;WW ad@Fy 61& du">! j"wi^ ? _m=DS2#f [kQBNMBHLd+[ X*=?=+fS H7 }=+ې9u푀(d 6dF>T;5N?ME^"= U8| r`pӀ}G 'ͫn98)0ȱ j+E3ƕ1TU8KGG!]YzOKѐm֐WfȆ?.ԁR\5VI Dx&  f}[[BJr6Z,Y0E# ":|}ajx}٫_*0@ ҙ"^_7Jt kRGJ[ڨ JSIսKvleݢMMފSJ}ň}3hCP_3h;#)-\M -e>/:s1+^-X\m:QG|Sr'u) R&D.7@/bca*68h>a d 7`.J?[z2@Un.y,*sBa z` A5m+|M16ru֯(|9/AAͿ BQ r ^8VGNE՚JI @EA`a[ሯ~#:# 䓘DAYjMųf=a>w;/aT4&3nEh|g5XkPV(X|2?EDB̙ ؏e1_ |@͉ZN#T)Zp}"PUs;,zKJƓ%Iخ33 q(-^jVP pzV=Oj=_UƢF_W˘ӽZ[[M$a2c SoC}4]Q V[nQQZb@ jڼZs+;FO5Cr^^ !%'@֧v3`2QjxeBfkn_MxHm1) 53ܭC)HbpOv*+8_K^]ͯsʱVѸɴ+ggIVM΁jO+֭X ?,]!;1K}k!ܛQRyd@U̞wZJ\Gu1QH}E KQNy{c0aFxa ʤ dk.E?*:&cg3T.|#:ID:nҒ TA~OW< 3q+c l]=z \\![XU8iPE)I;R#$j2UӬe6.,3џL[E`Eo׾`d~A7Iy-9٪B8G^Td@{};DBiI+Z[JHD`UXX=;}2@ ?⩤D G2U͆TUy*%)VzI?Zgݒe솏>OH<ֶ̳JI9 Eb)0nNqc*M0a1~VO F\Q<,,JbAx+qID%WdVC/#b/(h2ݴQ!TS̝ԋQU[5GtgD-ro/% Wk" r ea)=XrzBI$Ck.tsn|a~K|R74 q1Am(UvޚqڀBfH #P:<C%\}@,5Io/y^ȝO -'|;.`҃]"[`xy1;A&b,(lPK?,BoXӛ`E:Hc0o$2]fZ JF&zw$35~^7tX Ѐ%c uEq|l\/-51򷪢"n@˞"F_ԈT-4Ϙ[ráy79 ,Ӹ1ڮ햲($ZW܇b2 -ˊ-Oi(!( c\2s# ErNs Z"h JnL7&脈E/@v ; 0pC ;Χ0T]r9$⎈u ǖ]28gN]_R eFX_"5ƒNH݉)]| U#@eXe~(#;+6v: >-O/V5{ aְ_@WeIGf-ٲ eT"IGJVTfBY6㥒%R|h4r/53B {_`5iՀ3t {#:$ igOk+) ̈bS}ܕcchR)qy`K\ Zhx Oer0X~ V;!f #V߈xӇd,yfx&IrxjTViinj֍(?.NcDHb$ѲSPM Zdg9/AC Muȕkq m[!3N>bs5į cuj2ERYN2D+IBvZ; &j%̉+ؾBE,᝾:PJ ]r'т6s3EYeďYGVq˩GD]a0\ڴzdz^-@"f~B1 P{1 a?~(2[>: ݂6f"d=J<ф^|9ثceL#H-&!Bš}o J=W҇@U\vJy"+09 A?Bv)0 m z5Z 6WA@ڃ?Zn083W8h:kj"ʣ="f ӗ&ifSְlt[%BBBȒ T k,'=?Aґ bs D <Hᆍ„9h )8$b%rOGoS\\`l O]?> wtQX.%SZ9#Ң[r!c5 =#>bў㽬0X'$bm0h+B*b2hT&cK3ش\OT(iƭ9GOw):O+d ($-D<:JU9 K+y|#Eo!/$B O> < ǝN&> ï R2^Vʈ;g?> Q{"9litI'9s0ژb/SXj&,;U.^!#]W53n!mbGS wo 9MSgmr1 \#gl<իr`;BjEBW}>d۝+ɤR/hDHlĘo=}͂R^BB2:!^ݶD/M4brwhU nrx~ODqrS=GoyE! ^IHb?r_}mk#«BCiE$dnmZg^뽸X`(JM Pը@Sl׫a}hL h[ UuM"2SZO1 hL[(X1nt¼iaY62M;>V>jķ.Ԛ@V.mi16Y_oPY YOWy$i-Z !ˌt; 7Ŗr bS|.djLFf~A]eɘaT,__ 8@1ĿAAy!gJ0$i:D"j$ͳfs2u+!4U ٬Aw'}I~s{7Ԣ)С~'Y,Zi/Ј×QۦMUpC3]Z j~qdC涎4Y)R=N\iw;KN*A,bHY(f 1 {e 8.N^ gC,k,5$LpW!!ʤ϶eqoRY!7}T!V1RpLoG+SQ\KpJIT2$-\tZ&Lwe-)z=YI,'t|NeLw'r›gBbcG))Y}iH *h,z$BV ~7-_AM2.(ܫ"({~$v&v|b4ik*7H}+3$@~(,FPx[ ȢW_R6?ӂb3|f.h_(F 39;֝QMD %zsYS<{쓮i&1t6bH5$BBPF1D; P FLbgrX:{DD3weOW E(lݠ.m::S(gV3,f`_&0Bd7*!,֦>;]Vu&]Zbd1RIz{fl+ l|htRSE|bOD]qvb폱n`K*IVCy }+{زǻ{w*Ym(_k~t=xHye -z1K牟!o2kEWyw@=2\*xgGV3k5]ց//]?)5D(@tj' pc壝1` !^@XfeAr;=BLԻx2y6}a]eiI[pԥE|}]28ek\8&2YW܊@Wiy'V a\dݣmlb JwU~;tAQ Ĕa_M94Wvci ֿ),pn2 8%DzQtb:`*U%JGK-sXT%"VQl h +?Iv2JF8Np uYAUbhPґ6T&:È*4GSS%}S3$#+=7Usr>N}c,LʠV)6C'n{_f†MT(H'UPZBLQILm$K(Kj4Yw)⏵k}M@\gb,GkpW)'tG([є> ;QzMA춶!`. 4b-29u+rR0=ӾϕI}${J+Ec$o@CnO.m AXF,D9 P1Íbe_8՘@mJ$d͘}M Ɵ(Po"o5jD|]Sf3P ˷w$5T7/Ix?Y~ީ, ܷkh քyNgW`C&!"M]H+tT3URLZȄ!-9Y[LZ w|'Mk4H>d]&-;A %bu(H #%GB7#CZ^C[{ׂ' ^mDAE6DMScbN@L2 ЬrPR'FHZ8`nW_Y`%e6s۬m4GUvy|"E`S'vfftmm\A)}&n_ ҁ|Jfl`D_V4fa*מbKWuT"ىinW{r]zFͺ&iYHkni${ B<~W8- D $Fo6ljlj ҃eBkm+Sƙ-ml$Ni%YB?,^OK Ggm_鰆ԃ/*rR&WyKQ1aOm^O{eLȝ;\w0jX)ޱ,LlAk7iD`T('Y ߸C7<,'cB91ܔtc3-/6 =y$g\%+9xǨؐqg-Dc7T A&ePwŲÞ=1e HYKOВZcDp]2OY2FizI>xBQZ9‹d[|J!LbM"w\A5(ڶ`Gp !qv%R7(B:L׻$k֒v^ٿΎBR/ {T٤-AP$ID;Uxc!ҡ_N#DcF=kKboyauXBŸ Ft,1, Wh.d{b'7/ Ml/a:<)^HYÒLt!=~y_F4ĊKaRv?f1oygVl<_{.2'@/OwxPK^&hR|Ad !] WNbc[0)87oĐ ymڍ)%@ш e^ ]pCo@V$HBy '">4=1Fq3(.f̣YM.+D FDzScU]2ʅ,cjv x8=-x pI'7(=٭McUe/m뒣 nU(]@ƵR4R9t% ydg"26ɢ (YpA|pzIDNơ',瞙%铱 H1Po هci&P[':;b&w(lށ\/ fyfR ؗb \Hѐ6 yJ/-} kOH{Ik**+ #(jidШ^]B%FSQA+$ᐏ.&@iK)6+Ɨ"q=`2m^K(NaQ䍎0j YB.GZ{trdMcRܯֆrSlW/:[~}c+|?~ѳ qEh(\cJ %Y2.yذ Xij`#ɥ+(KљXuR=Z|!$όkHEIW)+?v):!$T a ¢{0zZpl{+`1Yڀ\ ɚdh|kkg+uI0"+ HT\=FFp'ԖXHI7%/HYUϓFa U/ttaSm./:Z+4H}mɑqYAUDV@q RevB&@J& \*7EHQ!#6+ N"q0-2niC%~_?l˦睻 'ww~w EɳW#&96C맊5"H Uɜ,"i7͂ "BL}8wgΨrIpl(Bp.(]us{:<5qCMWI/mdBîQIKCWZ@|S dr1)]E| UI[#v5Eډ[f> Cs*+e-E6v ck_USTQ13uyṅ 1L`-ˇ) v⊤:3yzHʍbǿC 5N:\|F b}Tej$]nMG0 Gw#-CWBLKr-[Em9uTA9){։pr]}{긤^~ՔeL7󣐫K uh-U_>s :` V̗2H*_lmY;B)uL4\" %qB6H1'ȼHzDj' 2yp55Y3I~O MCV:u.Ė2K쏚8}L +}9_k̹5$ Z$6RpkC[}0c)5Jju马cՂ_#&>e5+b4: KrU>SCoX? jіo!䬺!;>! Z&yt|c,f6G]%0B ͠}H̿RHEY"J򢕞X>t9qW.XWȎs}u}Hz͛i@?.>-FL`MF"wXQmɭdnO$8T0eG럪!+E"` 3AWqrk!Z/DU$#cYlt)uXa1Б߀6P@JH4đs\9K&n [055$*h$)XA?"PwTuk&G^['܎kC 4 -ݱTR V ª0N/jÕiU)M'Kk&B}9:ЉՌK;RYiIPKu-̴Q@V RbD#FIvKkUn1}U`YFfx퀴d#}NmVYqq AwWUWENԷ'6.mY 0c- :K]N5u UtT<(lZЌ\c8~I[s.1^SwӻD`hhwm ƲJBHBT%D{lB51iwGy]5Z^$fd,ZD(ŽZ3ͯ܅,H+$M_;3} ᗹ{(ľ0Çuf5qh&:v<ԑ c0;+eDK\k&ZEX%[#\TР@B>c#RIi˽d6IRrRѤOtTj޵l^u=(}tI)[PBȎ0H N酚Jzn/ lkp4);> ^^Z֤"c׫t-*408Dm;Ө HxH4LV2Χnq2Hok9kʁ[`shWU gpP"ChwL+ywFJsϐNwO1"ū4d8k;05msP6%􂊹eH2iefi‚.XWU,PWn`S Z~hݥڏZ`vsU@YMaU-[#'RZq|tXK/$Z]#V}ϼ}b(ߔfF ˕,ǴҨ&n*w:lQͦwx.s?/CckBWdDX8ΐwwxag( }9?ah<#di?C6AuxȜuKz;X-1cr7#ZS BԒMVw %0cn}𼭫`% Vri&ޚbh䢣4jJݒEBq~3SM$z>CԦ`*8`Nae$31sx7H!n,NC9[He0:H nQViTjű.&DJɫU91i0[UE/[;d&ԓ]"\RE,YSL5ˢaw\L XHmW^ ӟj-ˬ|rM.ͦF8K E7coЊ)*!(@1yfT&r8T[Q5e: A/Oj++-Ïh,D5,*jBjQs I͉IFvR!n>w?I'ٙ XxU-+>蓒ɺҤs;GQsp%^!W/g~Yq %,=&*Y'{AH% 8}b5}ى!{ڋFӟmaڝ싿`}8dGm> z[ɘLL<@K!0 #lH+>09$ YzCٰIae\D; Ȇ/E\"^0~OE1Zd6KL-h I_ΉX9ň':eto@0jTYDQ4A\]ȾC%{^+6,@ xFO&~=BJ3x1iiRRՑ,5|ʺ{@%eG\ڡ^6o7-Wr_2œ C.eqr % GI` 6*E*""-atA|U{@KET'* q[Sdқs?%Ni%yAR45r}p*RB]A@]wNiHgN˪Hʺ y ҟDZq{: Iۋb:A C'2 to5j tq+8\($E"Κay =1M2S~K5QHUrlBT&잹$4NʙT?N]KʖW/(~Z//pm}!T_ųʈ"Ò˳U*GADKTW#jcMJ&NLQ@N?1y@(n1e .0[gGkzPL0L{@RR~(BĤgXsmhB"A5 0k˫: e)Z7`UńUv~6e!xa0tNh$*zdS=5RЃ )PqUA"Xx !R*O,L^wq2v)_nxpo]u*.qɼ <_el1qwn-G87Xb&S ,Rp{񟸚$ Jhf>$N en!}۪)ٖEH3mhcB+6.7LۄlIFu9-KvgAgǰ7d#,~~;z~+MND3PgRhTl(dp;n$>"r{ct$` p%<$hx3y&ÇCIE'yzC}|8eč1IgƘ ,HDwSRvJ*=eSx-PHhS]ZBϕ  Ό#f8!*2C40Q#%焭8a9@7BƁLo˱a $-{M{gWF%Pqfh6" 3E$ϜL`o:ͼOzX7f)]<ȹb{ 5gs.C&@n}XRb."|;/ #lϬ4xƿs<ijUR~T`gQǭi2*P3tB47K LݝĹR"ik0o1WdN@c sV8-͟,8"k="b DԣM(?;0/YcPho% qst]GC+S3IqyTvoJ D'Yi`: X0¯"LT99ܔVP lx{ g ָrs >[@B7 Y?.58-F Nu{dp܇O%# Pw+o4Bd/X.M0^L$w\@`ibdGT:X$62g sj Q*~.hLB^(ӳX-z2N;o:`1eBkoNYԅoxD*(%&d/ Oݱ7)Er;R`G۴@^& KjҞ WR+,*-I=|5!ժ$h !u(4palWSlb*XF;8C+'YmԇibyJ`I$HMk! 5Gz[$/a/ړ#.xLf  6 ;f׍}26 :97`Z 3O@sQ9#HLㆎH8ZN;?Cl͵f6AW J{{ QEŭv4Pz(n' r5 l?=o ԑ!NsYTZBuaBZHY|!]T SDj+PRxŖ9&G$QwQX: \qBu4\n;De)PFZ 0:clš5^$$ZwxB$\oIU͌7 FcZ%jFo,Ҙ+9s.UqhPỢY!%b}jC"%T!E 9Ƙ 4yRd$>*\bpM_J-,ҝGe?VAx)yD.E q2 GGze]t3'U)V93#8cB$9t(jZo)^ٮSF>C+Y.=#&oⅨkgbJD}@C<DWL3ՎnA)u/U?<q ht,5Bv#ub " 9g;NM#Lt R#v:q?ҵ:/v|K,H:'Qu#@;@Iv<MEYi5N+ƭ뱓mE(7$24Wfk:vaԂO KpXj698*EbJ UNW&"J=JṲ@X.\ YX]ŽuS޿8" QF>gJ6Ubi@ʵXDΧSb_~@!Z'lQ75^f$dHQZm.;*rL$m#y,~5y hGY.jXPjfXoʶ/@v;YX">|BsISI* }GN{UՁ`BA R}3DaEb ;pP]I?6jWl;}4WuSeLxZ!h[mU P ޫ#IJ#j;rKH Bpí=K/ߝ8գ*0f9aU]z6 =)aQ@5ؑ.눡 P>e5iXk&^h6C' C8vn˄Я|#P‰@18QA ̎0k #/,.w 2c5?z@HI'm-~-rlwx6g 5#V r'աa6ɲL ?#[:wN&Z;iErTXqVJ qL* P:u!^[ݷӉG nCxc  6u;I 7Be4*? U gG&ICju0 FKVDȅuC3M'nAla7s@1i,"Dh^ͫ _^X?E֜g`yw9)5QC-. J }Xf;^cVby ~RDsb]F,a^V.X"nG:)1*֮s?ZO 0z`F m#`bf!2]U\ΘY]uΛ?,$ۈ 6PHoUz'/siSBKEM,ɩIfA^Yuy-~[5eb\tZx+&w8a9A7$! jL8 TUZp*f8M5F)4X˴i=:pV&>IWhzf_Z{;<:DhZnD>a!2rM.h#PG{&-QUtQiV2Whƭ  S!aa#A=G«о7Pʊ~?3Kƙ;6m瀐.CpcfŶ) A)lR];SxKz5 -hrQTd64&ɺ\82m ȏK%fsLibeIڢc&* cP#'\Y#Aoԙ1tB5t<6 p׊d1y++o|Mv%1>o*WOmPUT1?P"㫆la&DdE /Kfm\C{]'wxO׳AJۇsҤ8xNU I(('|xQ1clx:>["0Ͱvd<+ƿ ̽<Ӡ ~! 5хBƢ%9ˍ "w㺂WF.mHU[H 3͕ɼu<¶i@}e X ]kNjl"c S4+ + QfL?ϧ۽AU<:>ܑH %kB.׆ryx꺖%^WLąv#P+[?@bɝd-TNȕS+jAmO ^f?ڙj h^x4&w2慢+/ѱ}{L\7DcQE4µ>e>-MrE+L#'rQ)!cAYqWeZ"dAXJKHi0*neL jxQC`"7r<}L*# 3\ZВɾ,V8G~c0[Opr| IM?/i+f_5Yẋv ]h2̩4Zb5pz=N䐃:迄2+Vt-9 ?dPާ*09Đ#5+¿NX&FƛsCB_s2U\u<t?2GZPA !t+dΘ`VclH+> Il ϱXHfp':Qv}ri!5){p2炘v.ƼFUb2;6˔R1m$3D};ZBo^fyȎէޭminau?d'Q0d8kZ[[SXOqU ϐM_zG1wpHwh¥s,u JgQC3٧<]H̶=;)^F01; eavwӄ#]*!=,K% 1s:j3aqܷ$&rU_;[~n)^deNl1GJh1 T iWH"棺3Ĝ*hܗ~9! dW\_y섴/1"gm.pbA0ۅS_ٰ>L~Q*n)BHz-&V8ϷyK,;ȹ Խ=8>X׈_Rf[3 RNN., :jn&NY3Scc.gK"nmxVϤ )m̉@>Jy3l_i!L VJK764$ou%)qZ/yMB]{Gw^԰C8h q|[Sc4lGXv;&F$f꿨h*oW|"'iISᔯD G!}nl"M!>J$]a(tbMc`>cOY[&#\]Tu|*%ܸM5.Uz!9~-ksK8ncƸL I^-w@Tv1u"7̃eKpV4L5zY̠NeD J?1p]+/`WSC: ۧ_e P'1aԼbc_ǜ-MNΚd!gK\8p6j1H}Ps[}!Sd4raT䒮:\#dLr۞ )̄%\lקKݺvH}D X&|vG Vj+~NTa(q\){+CFTzmíB[P08F1Q =YFZ<M8H e\ ꇆ^Y<$ˊ&bĆC;eHQe'8,*WgeX 'hIN d:J& s4rVQ3 үaIဣXq⋖n&OuI7P5t%JdqR X z;LWAہQ@y.U$p%)|-7ousa9pJJAdN$+;aqST\E3 8FvfknV :`T_PVh_% rA-,MD.B,^#|w'Uvs%CqtBFh# n9z0*#hp{Q Y`@3%lϖXg,N}qTI(+T8JsLe46@+L݂3!5?A+F`!U$5^~vPU8R%!pFT/Xx@sN-8N*n?Mn4̳5 ӔѷSͼ".GmT(1d yxAKV A=M `:ڡ ϸ7GT-xC̼51Ȥ|.nRGI`g{_aY,Q5?E-_u. ⧬մKPxEKYV;VH{4m6SC"J5-e/1@4T*Fn_UFb+Mw2)[I ̚#AYbh6v%Q'l7|bTRێP> Pi\>:{BL+2t@E AHLW9ot!tY1Q^Ƭ(7 @r-O6sEDR20DN<6o(Ђ7Tҩsv\̽'/5ۥUѫCil|^_ԇѬ"C":p?\f b~$AoP!Y|YtS-wDvۀ.r uPB-ՙrq Q}!gx0He.e$MC+)`)ʘO-gi$jU+!pȈ{aHVO{Q6n*gQ5JX^xj^*5Hgɀau$IQ?e7ź,uGbDʲ6oF pHzCοOاAbijPuޭf''@$$J loc,;!-b-OoE ޿beKLL*6zH謇9wG8e_y]}*&'"uSr<%rK'qߒ񶇵ʯ.WNG_Auhwbou {c0[v7*duU+ "KuK^Hs.qw7`gsK@$4fƎt ,'2ʔ]qR\8W?-hTH.&8bBaA$_bè-rV6,V(nI}+׹2, V"XŮg_;xxƵRJ]/f90aUi?ED҇T}8(ؿ,lTJ:\kCyUܪ+ X3>j=k-.3 $Q'Œ.^9(/Kv}$O*'|%;S޿t)'7#LSi&Em%JB_7""8vujY9N9;Cv_ _5& tR)GgV=ܿ4cܴƊXW(Wy rނ4sx2krʄF.s#< @,+ Q9,9*3ֲ[SLM,ݯ:(<]^gh޸Ԇ,^"x#3(RqHc*G95/yZrbv EBoOoohXBM9<'hyK+f_0\蜰|5] !ˆ)Ivi!% }*{6_aMr$,eܖl¸4s̟t ks)%bb`bf%M $]ggC(Ӣw^5 S2+_3L6*a7GIvTofv/c.0vٺUUfP"M < dJRs2-k2oe nn.(!yv/>$Kەj-PIQ{}24|tRkfG&B:w11b7n*zeGdV<+?\oV˓sYTEs"@kθ%vQ+g:"be%?:t}]L)ܜڵ ޖ(05w?cwwZ8K"9frM- ;q|)g:p8VdA4_ IX}봘ɮ,.᛭t8 j\%UFMH>=9=ZQAdM3-ß誢͐ghTׅB ,8R8=VY{#G>V*ee$KY3^Lj2e|S&u @K4q](Q$Ζ|YFC ߻jf,tQ.IChh肱-L/4b!2O+誽wIU鄺he[Zn72oKp0{aYX\1mJs6͠5Equ?~O&沙 Z/O&8|"k9B#uĠQtAr Od(yXgx5dLO8t @ {$ؗn%E. Xg^Jaf$wFNl=(ی畒[S%30T9ۑz?";&'"چ*WVCuFq5#U]ZږqrR6 eWoW|y\jnk(T|҈;Uk&\Х,@g(;uTV:=sxEIS4t^ŏ2S%?@dO*Sq]cљd^&x@Oa 'ctP!%Aʶg@2{sʑ)NvurGEZŃo 84a5>UEU bѷa*MK\S ωv;"֍)=U)"Efc/'%e hAt&t|>:gV"LWKy q[ ^F}5xKږ Bi@VoPJō(cmZU3@I@PSUc&; qG~OKl&eryiq^dlz.+O[WRy!7bgIQ{/%2IlPKϮH$n#'=tha6q2ІPPHZ^&h RznͣJ5^53CR~[T8]L1PhӋ;UJ*{%ơ)dޖ{l,Fݑq+Z\8T+Z.L,s6ύ0 t`JbTn܇Qy\Eby]'ՒQ^Z̒7#%'i4 |=70MRr 6$D1:&yyH ݭ.&1Ny8Qߢ󆯭j lش7Kȩس8_ѽ"TR| o$ U3) ΅+,eoh}{#BXxW兤iƣ z'@*7S|镈Tg쑞J}+ڢ0ۉWYqAN_UJ"V-ה`Sne-dpRꅷ1iLQ7ZffoEMcJ_&ASk[g.; 8MA%7dCtCWskcIӖOޝ͹Z]e>18K26DV5c*,IeŇIic$,V=cB$U?J3X-,3 @&f0jC$߃Si(hvA(`/UKCLuG k5GǷ ~v%Q!tZ'5E`IpTTxo ɂ6g@ML/賥YM :u] o B7P\p0-&͐a C9UD.+S{55j*,D3!% _CXE"6(#9^LRsoFN H bv3fSʽ*EcaĆFq;Fa>;MeB_ٔQYkX̻{9o&a`igR8ݵOCyJbE|rD%*[Qؕ%3iL1ҝ *? U;7Z7+E n* aecfS (tXj'9`IKjwF} hĦFȻ2ccD Z6z$I1/DԴF`vF /#L~$D!6U;T{;cYU{Cnz~7 ,H̞Ha[CN|ae[+FZӐOB5Kͅ2M'IuBH&+2Y1I%2 Td.)>[4ІxF@ujpW`@# wY׼3,, sG(YxHn'n^Jr9ɨϙ "ȁ$xO?}#L!'_S؁nX=o-RUEjCy'qI朧 X4;Fkj#QXn^a;dxTF*S0>{>Q^ߘю}z'XJ܇/*1CEmaI鋆߮͵Zo]v¯ɴeDseZ(fQkGx!*wnt IO?4yR_Hm[NFČZ4U_ӫW y%+?J"`Jra ޯ`3w"Uն#TCD-9PIЀ3gV̝I쉙+Dy2DC\ LSDAH{`Sb!ۙʣP<㵢YZٲtdHS9EkP'5z .Jw޲o;R&Gkw('{b#jqBAbr->V7uN!vbUpq_*̊EbVOtиҒeSVjSdMԷOc'@(f+t(*B7D.I?Rj }*Tg@[tLɷ.0TɴDC>FQ &`3(FlI*q %n]UyFV2 `Ҽ70 ՉJ $yīHݬУk_zbedy({s%!H PDcFs+ I{h](/Bҳdi,YBwFh5@`hxh0C=еRHP00+ %\"M6}< I <;@дTh4YAg%vŃMb菢8h}rH)$ 0(C1'6"O(ix"uL"l>EZ2852g ?`@PE7˺e'ck7J~UG%ogGRίү: )Ɣ1 5q R[XmN+:aEĝ/NsսLR)`qoT=:) 0۬ļ{\cM,R xOނmghnZkĒHȁvpG#\Z[#DT~J<=JJĩ…CΘ;EhE܈޶c>^ *{GՁpKy=AʥX~U-yMG,YJT+VSnCz0108hCS c [:t1#mdZJW-DhG8eP,aw\@riSH'2'0h[='Fh5 N\2«\XWsaKdS,EĊ*Oa) LvFm.|f_Y 5rƟ#\y2 `0PH'# %pzCyR Q>B9Z'V#)|$K_E\҈gʎ 6F2En8Py>}p50/Z)}m09Hpl%kG] }ؾslaӕ)@0r7W1(L l 7vRy^v-rшţm"Ixb@Ӓ%h"jC]z<Xޟ3wD#w<~:TdԇxY~]*tVEJ,d\RFY|+7v XbaV IZ:m6##3w>$qcq\^N4@{}E;_ǯ }E[8D,Z6{~tBɧ[oOͽߛ"M6\ Gx|@DB tVKth7^_dwQ+ΤW [^3.UXD v@!Z! &K̾>жj<#hLiK̪|([I4h\j8E$Xw bxe:؜.GJ`7H7euN6ֿǰIwcV @JҌqėj+ka$ddS&&`9 pH$E7 ;Эr%[*2*mmEji#dB|HE9ѲBrܘ)=#Es0^M%ه:EK["Q(xҸ(BVH{@R< 1yծo- @i25tDt3uQ4Le@"(00a^#uɒ1~'KQx *4ȥ#6D^:Oj'Yr޺ohmȄiKgNJI,w" -U8V +AICw97_]\A.fjѪ` "@_BYW?־օA(\cK0[4K !+,|m)r^`zZcbA=d+kP$.:/d[^юkczPJa|zN'I5̉x-e(tF"0~[pȜb0Stl y%gץzda~tP+6235i9ufaJ*KKq3 ('g&NL}97N%OsB$⽯4EF-F K;?|MH*6tJd[gƒU}֝ĜYJYy$sჱ)bbNx p{6怙4>*_:]`pexb\PK6kR t}٠Ḙ~uLN,[uN@bI3|[M5:ßNmWչUu:1Qz-3*5.=ʍ`/zCJg5/tfqFN+tBȳzrzw,NSd\3~!വ+֊H8S0ݛX1ĹŬ(:eUgԥ?K">Zn!E`NG QRQw s-ub~ 2%K EtYisi}={ת3fiӴ@U%b1=HqIgRӺ(ZeI)vq (X}wGR,* LCxbiOߴ.~ K+TĖrsU:͔X؅#h%oZȁ*1g&.dBR}p28:ZR4"a,T5Qzh"5$iG75u *Kx |L^-Pjټoc')>raBDMdESΓ˭+B+.%݁Gm*F0B_KQE8p^ 9I>PMu, QܜT 'XA|2(!F&p 깯 \ٷ`&%utĂwbD`-pI)x׎ )}˝"s`c02twp˫v!M!beZ(AMm2+4 lluN߯x`уlxXƹ58 ( г4,LViԪJ&q!5Yow"tl 8qC}-Kyb hX\96|‡=GɕA& C$nګSNl q:g%Lf .p O4%<&=Ս$z )ы;H|1` 8SIɘ BL_?jB>U1VqHuk$V(,Ի:M7I>s'?aU%WswaJPzeGȇ˖{]aTJc]G [9![N14&x0 jǫB+s,FbS'!d*Ӈ9]tԒG"֒crO%'[ÎHM&FhZ'6h MKFU -d y6+AL+]zM̚AÊ*(u3g7W>ѥg,:Ek3H.-w&xGԭ䋭е]"e! ҀC $7; F`x`kF`UH$N9d3zsٞ'QJIB%M5/dD$CEcj:A:\jZTH򵦄LDɋƖY% ^<ܞ4ŕ,h /,pPUkl !TӤV(B+̟Ӂl&jƩR4 $%gpK/N(0HFvMO$ZRE(z4ċSPw͖9]IH7VrYJs%|a Sg $SMec4t %%Gd;k={H(Q,S _9Vm; NAD+Mʦr 7.c=!IB9Zch'hšĖP^3[,H1!09 U /VWkB}DB5z[,:]xS& Am7DY.Gڜ{4fbߤ$f~˟STZDwC >=pVl*п 0bqZ'qTZn񉞌u96(;s*r8<]2ڻ/`B6cs Vޥ(qZgjv1$)%?YZ5ԤTHƘDd!058O\2E+>_׊s T2:B q1NcYzK6!ԗ01 V-MیA0q"A4q x;fx KJ B |` b`2qO@c&QHN|{-'\!:fr8## ." U|`ğ70BD_9JVD),{f/9O}%4"Z!gݰЃ493+ 4SARDijqQԚF?C`E$1x@]L0TP?Vv)1ٵ@$ of1EG1>.|÷’|; =*FN%CF)/cTta?fDC^0@ H aI1R5wZn2Kp#N\%5 b БBV.b0IpC L6fHvT$eB5Q{0oLdtDtRf590I Aes QM HC"F1Nl2b2>FFG%QbYRF!̓Pa\_Ʉaa&9Nϕ"m , !#P)TɄ e`͢ ɮ 2u,iW99H3tIc%:HDUADf0Obb$G!ͫDB'µՈ(1é>Tq7vx)4ERH#kDձ*muLxXH D{Ji_za{(5iA"!%O]Q"T FI-M>~rg+'RLrrTK ^)./ѥb繒'HCд1h"Y2& [2F N+6@VY%b m*(Q mm(z\WiۢT#cQӑ\!!R'1{G2]N3`եՊ?D^t;&͇:Ўx~)dӟΑ]lZ2e11:GjH?a)Q\W.?;DFK/^Z{|.!3/m ¡aȒ~ľqs-׵.Z˲:L{lWPdxhZq1&,@ojI Dnn>u@6 & 9ɲY4Li7)vWi(0 97HnQ1H]\f)^=P,7[ESStcOAtR%^i";o98lZhQmwrGG's<h*":T1[ *bΓYQ{(NFu_U2 CIpUyy\5D~".?QVUXieQ_;#P@V4؟OP?0|3+/"Pk_}cpOJ !SCz9QeҰ ۈmۥgAXPZ1$F7X_c ]x\qV:Da: Y*??+^܋цG%\j7cHbR#h[ o-rqZ#~0oBl7ka9_H++߰#2yy la-D_ڵY@I Yyң &pg# 5"5%{('^ZXSīT@T:bF7 aw,S6TΩF֟Vr=ԟbu$AW:XPfP?ɖ(|_dY6Bc%`w;-vKQiz K˰H/MODdt˜W2iŭ(b >" faGb Lj--8[u &Hh_V.AZ@$c4RP(Л]DZ2Hi)xo=i?Q2 :Qm^CIRzkvy: %Xwkf >5 N%óҮ~e Jvet_,RX8BZĄH@oႠ-'DL)b,A+z@If'# ڋXWwn&O7Yw( }*I&Z"q4FHGlqxppxZvhBk9Bx=b3 ,MrUIIJ֠9h9rT( $W C7q2=\cUO &sAl)md 41WrVi+n ȶ2d֢bL^,K!*P4L,Qn$ - 8pD[lpRHR̃G"@´8aVԵt &J`?LM)1:qYb/R@1+%MACHfMYoJw1@Qѱ}lJ&)zTe|CDT1Q ";Jr?d(ejS|DZAV'RIuD_XmˌUR|fiC A`C X '[ + ҈V"Uc-rF" F)̍hEG^w(*i{eSPlM FFNZsaj/S[/uC(Lx(Xb\M挊qsT򒘌) d#o(!afcRFaDC)bLRt%*72L ΅ ̧.cƜs7,-R{B7]'C3$W #"t" *0#OC $)U@k'Юe&#㔣Tbgw$44ZCA19]2"6")8L "'J H#|"C5$GDHb#aQp T^YR׈B4$@k11yj؄2Tsڰ,9Z xGafJ2'ksVA C18e4"LU3͵tFL Dc bUˎdȯ ĤFpc¯HNERJE02 Q!Emen6i{ZDF2<$K.It$HjNՕqC]+CnR" Kvjf3)j1 ̌SB0'gّF!4QZ6"DVN"ڥD y1yCLw9+*X%jLHșu 1DqeV`e#{f bvkC=4Jd-&ӢȈO d!F(&F%lʂDXr*V"v*Pf'}t§"IddZ)1MkA#hi4mOy=,|DILif :19/xh65F!WxЙ*x"AG0AB)=*Ƈp31i&TM.e1^̚FMO=^#.h |wJ%Se"KvMoBm$H+9 jIx'f5'"BoVT!<@2?3vRoWwYN{&L-8L1J˲ka|-YC1xyicm!;K+jVfvrJpFGxtxE>|:tL'u.ۀȠY#B".6AfP&0ȅJ%e,a*Ճ$ckG r Aĝ&!`+I9BZ= MH}4V #0[lyc V ֳNz?0kȳOn^ Z@,OeqC%z}:Ni oҪ*_!0Nd9B#WҪR(T W~Q]HVЦF"WMTL>BdoXp+z&èJػ_-ʔ.@fyU [l}/ CI˔+;N/Ȍ|b]zTټ?vSv X,;y'd4w4LdOωՖPGLS 9Pĸ_|mL,xS0L*5_s S4VNݻ{q{HPɇSn+Ig=dΒ.X\n݉$"/WȠrAݯD2D%>jn;|n$Hia{!-5:Ӛa?XLz汦_(q$sJ,MC\zS~JYMSʢzw>T@^A^D rV""ZhJ, ~E<*x&X:TR 1F`&߫$cZ]r abcꧼL 8!Onz]Ų68E!-B>س`ɘ EPHI gf8ԅ$*iʚ:Bmc'wJ(8Jhit v+F+ I@U )60ʰr52A UIqDguVeUq@Қ*g-塚7JXɺZ58*Amh9"(LˎxXXAPH&\0e 68Uq&2\!Q$D A=|5w`iS޲_m Wɨ[˂W[. CZT NK|#1TŐCST>@T/t]@0= @ho  Qܑgsxf Rky_۶%S@Xkǡ ߔ-g5LlD*Cqz`ns3`3|V+0KgѶ.ĄՌtPN2TEiN*Qq>]b53xь(l0ƍ8J^Qo:&{D)H7z`!5av/Ff+9ڂrtBj}0Y}~gqP8{*Z]td'=9 qTS_+F0m.$l 4ޛNHFHV Z㒹3XpjrFY0BEԵ0 9?eVE#xiGHEMPq#(3/tW+Y˻齄IV);9+3GҩN״2.Rs\AF9 r]i3B_>$Dl]Rp _U ]$ьZ|܄54Jwڬ[9br8歟'GBlTzI4\۲WcCV:ZTI!y@qsu<|' zdt 81lQ&vY WܤleRFH.ѥtaJ}Z/6O4=ŞI!f*UsXH{U|ayu|(sXV*'l%= c ;d"pv*%T}˻ɰq`rr 1q sdSoK:/GL. K'Zሤ4vDGE%PIwJ4GvgS&9pd86ۗ(zm.Xa89!;~p: Z$*:p'^uqʑEݛ״s3y;`J;$JWSi6LYPi9lܙE#׳ܲ:Z>ƽLɪ鹾H%thlɯ7G*&׽&xobv$6N`- lDEUcIDx7 øIm3<~@:BcaA (4HVy yb %gv4$pLުҶ#!ICkmA(7C2o&gwpmbT<:x5*ة83|w(ϔA55e=ME̕GΆH,xFXh4.nSM#9RFFgS~x*n'Zfs Q?R¥.2 m^%`Y@ @TkH59s{/٫c8W?w9Vaᑘ+ש<R741ܹm %qI&W?qħ}oV>55ޓ>*Aݙ)Z4zkhUQ2DDum]] HCwJ#tnB\h4nqG\ )SBb>Vډ\duy( ܾݓqq8+!'z3 VłeB|y7 jDxmE+n9Rˏm!T(Q\H\Avmslw9YjIg4JK3RWm҆u}ƒG %k27r,k*c*[~/G"uJPGZe/$ߝ0ohٲ̻{5Dh-rAʓmCf-~tnlkɇ='1ũ饦j(mLSQ-7I).$&:Iය*XXņk1 -L/8\aB""l?%E" (0*eNZuZki%xM7UU ʦr0WYps`YU};GRjɨ\n~V ҊFLSfu4wbtsOā d/,5I>a#q8rT  yz&jUTOUjj`hu+CZd@:ϝk2l)Og#~k-&~8;7? d?"~"]AhCB}(H٨=eWm*ؠ<+5K'"*R_gW!@HzRRr`+i -S$mzZ_w{%䮌G:kNO ٷYhؔxD@ozcOw^# R$Ms/ִM,0bf3s!”鬨3o(Zv\I#flI;ĀFkӡj^<'\J|U/ij_DBY j4iW;3 U!<˲ar)ZJ#q s;y,D\FQXiHuwҧ|% vEڔ.(- چ[hǕ9Y?8UWU2GN?QQaT׬l= <51ZmiS~}`JjIR? M;sÖS i˖/)Mm!M vKu+.⧘].'Jt.6. 9% i"fӫEbQ~V"ċ~O"z?l5հ$ o p d&'mŨfJת9N\8.7&U9 {Soq沒КY܋Lc}?I tE/NJ7 >,ABԽUT|KXNl(-N+mzj + o ttn:4Uh,+ +gI)lO-F#}&kP6w\b\Jw&Ej'VC7qYV3rAg 2|cZMͲ˿jn:6ofJwUKyH໐Gh^R(F)Vj9C5_6-]I^CcEU(mVddW/kdTdwJWIb,:Ц *ܮB NMO@!."seP|/[Nۨ2VyYe|Q*BqT89pH777šCpHtAE#^D ̺_ޛG;i+cWT|&]ce^88YH_C|?؜l x_+{]@(m 6b Ȱ2sUȷxyƳ[%|$wOjOw\C@=հaW߰/!ZE˱יw'+`k)ŭWzNL9+BbW'7IG][liz }Gq%uFjq>>A{nc]ZJV73,(73 S!ILOM%=wHK;sE0[F<@-^nv{64Jb.jvSB@ٮA#`­ɤd LD8s: Y. pVApB(B0tTYq \Lbt< {}7khL$-6Q)d!N'!է֬R@~4\ܓ pi{+Bh#SX4pWOHՄ~4g 2tt [Կ&4VBD]C 7 ˢK6,{H!I.-$jC?f=x{Z[IIǿx WN~G@Eq+z= erTPRkÏBD5*G$.S./үm#"R2U|:A1 !H=Pޞ5c5D꣕} ϡЎXȔG6^_9z #l%W+s3vHu0!JhgFqn6qm1 NFSb#Y<n#nXnзq'U,fg&"SGTxT-2ڲ/4-Ges*l-"r;Ml0Cßׅ [ҎW 'qVeBJ$q':S15>>wVԓCIX%"TaD# -ǤI<NB-ԑ+5{:ȩuAz(,+K9U&]ZmbGQ#f^: *1R-9E(=膃\"o" b׉ZORh<Þ5Yj|BLXb/" bH&?ub,QI (UNwrU]3_3mD@lp )|1Ӽ]D*Xkq>pk8@ULm8PKUWgR*8w-Cт5NFQ#z|*g4P0ie7F폐D4Z/=;C3@XLA!fyw;(vy/#.̊W=[VRg 29=zd#yhj8UdW'qq--p_}>*P58}9L{18&P5D+cy8U|&lzCQr-[Q؂-b;!:2$$0d዇u,$Q\ 3@@ sb hYa@@XЩ W$&-Ю^#7K ȿt\t`EiGMxNkfeI_)AR̜ ܃+쪳 I8Pi.xʫRM㩤#'W* !r~bq$G#Tj8 jvm6Kɖlʝ9Nt*O!Rs_ @X ÑVcY9H :ܓwG''h7G8É/j0eAlo}/TֆK+-TqnǍ Pq6IsRԲY,Oy32U^TK=?'c` oIu%'oOpXWqV_&B4)K%P A戅?2_ɕ`q`/„ $vnq_q2զ% ujpUL|*yCbه)XJ{8a4!2F%L$3c W,kr(8 "7WzHC)RiŞZ+nVuNf%l&tk&-dҡJ!pI ԨV9TS?h$vjt uk6\H&+GhXm گFQ aDڜ@Jr8**2^uKY_Y=I䀘i߆)y_*Ɔ#V*KpOmcDP.*6B$fn}ֺDT;o č*A|5gF!zd)QQnx.ǾQ"*.հ\*wH 6Jɲ 8G60d݋td pOδ6opL~r8ED2[It\ERX%Bq/SDɬqm;4" B):Ogݕ KG%ρ:)CžC䱬e-zxk*[?`Q֦U౳ԣV$f&FbV4MP|eXXj*hQր91ڔ4hRXéH{$%VTa06Y9íK܊L=*d%Mrk  t2u g_f9 F$l6^rF$+?טN sY6#rVF Q/}pNu;Ŀ& l[bDj2J\tqͫ ÖmHTm0&=WK7,hՔlI) D[8Ѹ{htCikk܊y`m\db)`nvb\+R/3c #7^gV;Ҕ:W0f|,Y{e!XuB( GA-iX/-bᦾp2@>|g"FYCBG&`]j'וur8jPYO^z~vq|_X H"'4T/>.I\U4S(;/ApQ`6n Ȏ<ŏh&,E.s܅!$Dp "ɘ PT*Aw/pP Hc?mArQ1T $y)Ay (o 7B ~C=sq Tpүȏd23"FW<%B^ F{Y^U kUA& <ӧUJ-dA&\J4أsQ~mOr>6/Y%MFbŏծx趱RFaF~д: [1*Q7<}\臿Xg5rSt\v G6];тbnJPעWdg{¾LI*e n15%lYڔnGٿB suTUvirKr:].1?OMqoSlAu$|dat{nXi=f+vK~bN|~7"^,e1Y[b[P = UYrF=]ZfOX&i!^-SR?ki-,F) =+rXS+?j 0B$d>ͦR> Hˆ#ujXBG~gν\GYMP_>`xu{EWG6H1˾)8㘊d_eeT>'$w~;US_|ro`idܳ j=v&,gq5V X.&Mv*\QrIGՒڒ?"Ƿ;34y>:L_[эUk5P*M}˱OFH- ;j6-%SW5~y0ׂJs|1(bJ`)ˡhy*8hyEk_J(@DzV"-/1{bLv5-A1YHV 2Mkݖsa5͎ P?wMa&|'_RLS=yv>%L]=J&e[wBZoU& 6_E#;h4'^컄 笃 'ϟ761VN4O?#ԍd3k]"){0)h߈,P"V9mLt/R)FQ {!2zBӓKxKN]aሽ``P0-M3Kb)n+ɇp*mG]|,qkKnM3:0.--]JQ#5O3u'J%Ord]i:m%v vnmWt  AQ(DzhP# 䅓UVR.>xt1˨$%B ԭ ϧFtTߠ=[5;HnERv\..Ixn?%Z\^oF/@#WOc$b'l4yRN.#BePÏ`.w10מ(l"|"!xG_>Kܹ̔H40_\ H|‘`+u3Ɂ1\3#zX m0qߒġPM(ոR`pB?":L/=S83?z.fA ≴]`қLd. Z$+E D@RiY0袅$ᙉUyY [j͆`zHY;#d1xRP\{ pGn$ ( jL4r9MKLJ](uK1^9N)Po8#DsH*A47'?I 84_+4BU vGPsċQ;d#lP4+ȽB,y:ϯuۣe{Q71usY&g.c,n"#)Wz.}VFx0CR_X$9p( {-q5|H0 ԁnčZ2_t]>yB! AOcm}*M_*-sYٽ`PP^0kqY$IdIZ`WAK|R#-_K)Y?piN6 #%zCEj0Ǟ;)/l_`ʁ \0 oIa'H-23(]1ՠ2~Nڟ,(@x\6C!10B5YTmCK/ rˎ:o$P[tM$ISo?>R#:}3b@TNٰAUF)rR\%,2_:# e٥okwJßbbF }{e -2"O kˬ ~fح'Rj RkyʒhfQژ7B 8;" + B |"0Ad5;12p&zfvaQ.XSo:3!q2Ms ,bm7`k?Ch\S+T^}4Џr55Ÿɜ Vkūqp&>ytsSNr2FS6$]V]J<)n䂉9kB5.fׯ UɬhhQbLf=A:<(nN)MүI*J'Ň VQ>~wDt77 :6[wkO[?FT.u@jPz[ ∘yܴ8BopD$0)xe^d`b̷oH]wg53֏]NF|kT+@-$jjbFG~j'=SAϲj䜨(hzsby1UTNՈ*Et'c^ïHË'3!Y̋abg>(ҽük̉HդD_8:/S'!N,oٶ:MKsk%@5.4}x; FؙDxGTaT-5+_Knb(;7o[ KVBAV/_B9zV֢qj?~{DϓcwQ/YYw{8oZ(F{]9S5a$cʃ!O91?o ㏸UuiX؉K*ZDzU K{*M/wŹijZ06BoNę:NMO (1h0,J|&!>bꁞ_xRH•HlG廌dT[Z4}z#vؿ+ ,55G[.>mS";21Nyw.W6S[ə݆>S.ԛ<KЙ2tnivlz3E&KÏ6B(7H$78h *R]W :!PPŴf3Oh#<eWJs :hdK%h}f}YM )#͉pA+{jddMmuW I,Oビ-Rm@'hꩤjU7ks4k;%tvlkl.;s{{| ߶,:u_݀'E%e 0D U {$.\e5$%>A3FZXTȌE+A1w Pi-p #S\L s #K2t"':kAkeբfbGxuʽшu%5Ĉ7oB$_wBLc&5<El՗Ҳ$h4FNN3K-c[}rx۳ַRMawۛ ]Z$p/?ejq1ҭ)LlI}*#O$3@R6vdݡCҴQdZqdiS>p47JF,͉k1zg3M󬏻7m.%l[:mi`|N w'ɝ_d.+@Kh1]NumgGj_hglO{Ye_}r}vHU;$pG.yΩWb $V*P^`>:AJ}es-H^=_?ALJ\I煩 bx")jAa*rFfMg T+']k &ȫo#2SVp0+Vbh[K嚱-hco?0ZR.Ż_ԻRn%U8sz^#D(U弞Mۉ :(_6ƗJxjs9_]R2A?3p ^2x9&!EމՓ?DD3)$E(AzR5i' qREQ#rvdVh,qeJ+\K M5 7LEZ_NB$ܢڅQ oL[{|D$<}"> +rgpq[=Yg3#l)',g'$UB#6 Lv*zUdP{J{'&B/ҡ Fe\c[TIm0 &23KE?͘KR qtT&N#y yGA3 ] KNE۴?-= ~m ӻP;:C1wxٹ{wf*PӊG Lܨ)%yc$Hj_O4]DGu+*MZBYiiFÕvȪj!FZnI`,q}%F6aٱ\> ݌{i'eKY$MR]lctA*Wh bK*/QD?7A%k52 XTGGLCfW8?κɛړwO>1gnM?Ff~!%3٨ÈnV_LJ |-ӍHM!|uA6 ;[)}vlhOl++>[_v/RS޺f-P}%TJ .8I͛2WTTI,ےdR:>/S$žTOBN T&3+7R,Ta|2j1ED%ʄBU|(Ls;z22QE NVn|R㡔9_Hkop/c] N/;D+u`>"G*H8YVEíАTG!%L'|g~ jin9 '>\)5LԨa ZXIH:hnAb_?Ip_6NrGa wB9QRVLfA!32m!jH&+*Rr xMAd[Rb!j$ ٻrSMٙiٽ}}d+y R#O\ ~SOn8CJ7 8DJ>> ;oHṿzCH.1]\1F 55"cr9}0jOPZjcS9 Dڢ#b+clO:!hR8ܾG/qv<c AN/;K_㝵|yT9Ǧe&S`ݶ9VЩC\;9PeGAXx7o#^TXBr1/khcY݈2{Z5;I$Eqg 4DM^t|XM UuAKdU~R^__} Ewu:2YZd7{ BʌWy$QJV3٬vBR!AE﵂H Eyۻ VA@'! LNnSlw1X揝!A'5>5=|iG] |*qC<7,$ʑy^z<,#djSA4EY),!%*5{fЄ1$@XKIxI%ryS+%P"SvvaȬ9B1v`Nsuh!1k܇J߅aāsSQ!i[2ChsF1)1nЈ{ i\66!<ѝ Ur\V`HbI P%ZB6AzeƂ8th\si5aiyS5]DmOAkq 9!J,K.i&i9XA H nb=Bș'O?=Ւw&bjAXVMRCn4 z@mYIJTv*W kÕ(Y2[vЉE"%Ymi*ixg4:fp_aT"@Zr.C\r߫$l۳(}j+ zGҲTՉԋB"_I7W>k/.JhK09!?d8|ח,e(]W$fc0] `@њ7% !_nyS<0sy% BMdZ jK!_a7;Q s(Td $zSGo1F[LMT<^s""X>Tݒ#l詋s6uyV#}+,6-@֭4qBX Y)ڻgtuˡ/#6mMϣ{)VNP#P߈2y T*dIPR"h?5@Ⱥ-{+r.FG[&qtf~A b4>8#6$4n%CԙOg.0I; _:sk%@usZ [J85蹭q>˛5_KժԻkߊ"t]rvՌvkeHiar8A`|> Jz8`H0{k ʒ@+պD>dЫ"bk2@Tʴ@!Gf"TTeVwgʑCݥ'b#Ӯ\@P%にT #۔$ ,7*yz^Q7M q,7z{W}=?/.7tOԻW)&݇Δl=+Dヱo2t16޿㨗D=h(ɢ肄gy y6 u=krDY:WuFsӔWV6lT< cޒY|"\XIh O/%P~fPx>@?֘WDPl>;:wYb1~UEVeHGtu.ۯdBt-)0ywl~W|#IHJ}yZB^y38,`E>Z-{@$$J˚AQ >#"+8l=^!2QZwc[ ,+~e 1hUhiDnf0\hqG&;o^'zpz^r%a͊I˥!7k.xmfGnݰ֦pJNݵ]ϐ5{L1C.[[jAX(CC{kv*4$|mz2}cjs!6=0CkĤg$NFkjY*Eн. *"Kiy>^M)cCa!E?Xޕ4@g,i?~>rѧk DȳxP^}=KRMPCǧ4QSuI0dQ2]]WIѶ@$l2'V1$>tL@zҬ$\ A]Gt4팖"=a<:5QNnL3V5!5yWQF?*^S )h DsB%ƙ!5Ik,AN:`KNRz=GT 8LXl y4$;:8b0A_.Âפ|F0V⡠[VQ7ɃRp$f.9@mI*!S󂄵G{T d@rIsl[։*fuߞ,BqxXf8+'jJ+ȬWw+ԙ&Te?kg5BaK&lj1aM\}EV.TVF3F\#W+ qy^F_"YtUÛAJ 0븕]14n NVehN?#OPrtmѵFKt.ϣ٬Ps#P.Y=wD1M\wJ+7]&mK" ǘN?L#uؘ+x#M%<>CNP\B$ZۋH˂UgYɫ#iG UjoYV~(+ѯFݽ Tak1)Mi2T71TYO;xYBL nVzmRx~ogug.wƓWo25'Rtai+9~Oę.pyg(V/ҩWa^)Nf uj/gJ;m՘uen+yȐyG+~ @kڢNˈ$aNxVR rL #,[s:~A˯o1}z,|LNqD7̉DA?ud/#Td"5R_I) *עߔYrr-5v\RrNU2+eܾEٮz$lQ:"h*["Z)hk`JUkZ 'ibLVZҪ7'Y=B1~ %n@˸U0'e&nhM(tzIԭ*%Pt o%.OOJ_gsNT||pU(-1qS5q)'>OK &,} ?CXk\{՗i] (hSഅH GԪrq ن̀zq]XoTtvϦP5@OxiK3KK]$Pil^Sj3RRW-|~A0z OQy9\B!yV"3TS Ee.:F$_rx ۇ̀/KC;U"pBU薡Zh++(kع4 +gD# /z#"dKRL6*ՠJ9؍wGц]-1P1{-S!ɊwUZ7S* '=:a2{gLADQE$ Gc֯ ɦfWqϼhp$ޭpt?s% j,6zɾ=B(6C/\\,4+paPSd?.B)xF|'<$QBF gNL6|b2>y9Brp0lvK\f 1uQ3I\7aSg!mOikTR 4O\mWeƈ1J+Js\> Ft6Ȟq%4F*n{GXރOlh4iqBhZ(W=boCN~"!ԲƳ UGacMjɉ5]\& z[=[B]"jFTѲK0+w=k#)S6 $zZ(73$ >2@*K w-JҗZW|xOzFQ`].XYߎQu_6oZ믫iz;|m'ay*0*ވl$H2>+9r>JL~ >!r0E2V"0Q_R n~[h"ʡ!//{vNTWx<%>!&%ɁrmSr@-<s "0K_<][yNϣIK7+6]W5qmqcLjDA6O+ hC£ ϶ou6m%6zJ8; ff,] -°%q9`nYH(\?p_' M_ #g}a9j{K- 23v <6TfG6O԰eviF pǺ{9uL-N".S@q!ɐVA2X.L\ݡΨŤJD G/XA}$rD"+ꗒ 9zf#i-c]A+o+z~ dIA&;=NLpǺWg*e'Hi@O40ļis.<395ewL\D|%o,ԵRXV-u;'F?@?/H?-#jD$ߜRyݐ$Djf֒mhB0Imzd`k&+|&X+Q[O&}c6o=Ѕ§`$7#uMJR>}@[Cfj =[e1v9",LőVOM调FqA )d.T˵VLz+ V]g2UQGQM].= q1G8ueRfNES R`[ϛ<~øU U_Jn(¸Ji^\^tZEx`!KJ˿Q|HNLM,0k"6ʇ|uWWM}Q-mn`}:iUF*N3L0UT8Q5s)]\ԥ}^}hTVRFSjjhkZ2H%Q9b*Ȟ|{)Vć~ZiԴ (?󲫆;Lj)$NCz5% /y1FTQupnt?8 uqʻdR%UU? ۛttD )4ς'n\ҋp{zW )F揔]Q(qv~t9 z9xo9VlkӅss^" )П :i"轔gWF4f8zyAb P4[̕ ~1΄ fʹKtʭ[םIp%bA")'V / 6c{l(AJ82e [v >?R} }Mh%0j(.7oOO;uTH$Z w4N]w5qZBIb綠iN.L .\rGۏ=~ŮTB f>Вu^Fo7R$|A=ԖW4 ]'Cò-gJ4hڲBW l e889cʅzpK=;U%t GwL^PuQo/sSU=Iw(O5toIJ$YzVWNzUEQ{\S}TbEj{ U1+fd W9&(ơ%ľS*D&4x]M#?ٙI3~%vWҮ CŔy 2捬C p5x<`ld&wq-p@`-"&ړ Q~~V;>j*W &Y0&νwlK+2>Ӕ-*֣ѥn9V Vkg)Vw!0-to3bB.ߣsZ.pcRzvs^ZRx>ZEհ9Z;)NyAEәQOS\;$E Zq7.='8 `pdvB"+oz@ٚ+ג7e 1t[ =Oaa*Obb ;lxTL`u Kh C2{siz!QY+#|RS^vvӑCk;wkcer W"XEF&x, AC'80EN25M{0_CHXS %Ay):0>jo>CME.33y<[Sp;2IȠQE>=xc5Z[ AnYS0Kx>O N @6>V(kFL sʕK8KND!d迆x 7=ށe|xXTmxIJ͢rAF>Kz4 OeS[Ȋ^B`/1 -]e;cQ{!G&,rg,b) _Pu~zJӜ<q!歐+fyI&j\4Jq HHdY*^LJspn~l/ I)ls9I6j{d*D)&''(嗓_:;pjQwN^l4l0]rJ(vVw5١[q&h8GPB&C1Cp5m~O-k[GLy 7[|evgr&9E)UZ\vf㿯%Th=:|4bZMI[i)f%?jF*s+j>f+Gt/OjUIΦr ]^amF.c '|Vri(BY\0#e[g -L:n:byGB6 jj^ЩمzgZ4Ykff[_"zgg+"m4ybiG{ ᗱY=-I# I)K2iMJ%_%TU:ٮ?@E PLI2 LIL-f5G2( T>nx)1B)ޘT i+g A ָū *[?֖%[jGBܣizOTi\F`. &Ce#OoKܛ5=)#t)te(3V5,+Tdydt/Q2+XON^eXa dC2KG"L2e˪Bq%gIo0w#ư̝!\ /YWdhRՅWj$wFXuqI#=]m `d#{C f~,J7a?e&zM"wT$ON6jԆdXt񟛄 ʇIϼBȞ}K$b`>?$Q|2FǢ򇅴`׌8pr>gV=0e}UJJrNY.ᆤx[DY/H=fH0/.4:',<­CքOh!"/řrb@7Cq1]8Eh#i5uP77Q1{>8dz w qDhrk4UML30D.̝5.]afK@>GZOX]DB+b|zDWkFI/{|sdaV:AZ.8d &J o5PD^~ɺ*̜2 -- ="bnkV\吕n`֌XPBbH &G E" Aye&ۈvc:H͊ʲpnAf: d.oYQnV~JIs hvb0L( s ѓ e.&&`Ji#ևB G MK[e~ QDMqӠ%kpb;(yoE> :rZh$KTzF <(b"! *s8;(8"_V]iǾG1LqhFH~䊀:h-(8C^@H0x*F#A@vl2 ^k ZJ6I MÄ/!E$6H1`H*I,ZF6@Q;&h\hZ{znH\Ys -l821,Ik\Yq73V93vuC( dw9RkPp5xx30يLX &awOZpZPti6+h(g >Kl)+,tŽjT%cmWyf^Wo 0`˲ %l1l_aD\ S"g5Pkf'1*/Eavüu.ѧoRxph 5`$$xoA((G9} Z~ d) 1qה@tb^&7 WPXY|#:ǡ/p#`Ϗ^GKyG- kЩ&OȏHPȲ͍3Y@N a)?Sb1}'b?+&$3OkD-oEd3+푾 ^)>*-1K.۹7onk(/SNM`c} W MrT8V^ymN1 A$*~͜p.Ӈ's=&jMO N8qD%b!~(93}b_haQ}=GG3" VoB砚r!]Qnx(~(-~Q61!HF?+i(Z|rAm8^]+wN;$In]vU89kx V_#?OK(-)$d)O7'g3,t2yq,'9SU&~RHBaԊ8TԪ>X__kmXaѱ{D%ƿ"W}tI(E[x,_{\l6DcYDn֥" XK܏FGd_zG#r~ UEYȉ-;t % [& 5dȔϞ%^vDc?p|1j mɘ^LC?$_m{WE&Oa* ],L@2,nwvځ-;SqBJ'L~+(9O bT%;yroŃ*+ N$dhn O-Rѓw[^iɕJ fT!ooM;UB,!r! Wri]8eq5_o8P) DJ<8Pu&K&Y1\Ei?BQ9Eب0hw~Z2d줻yɎDt`|-u~c,J:Z QOeR%|ᚙwi^tGXīΧ^n˵:W +8F%2&FO$ [q6 :;xxq>GYnו| Ԛ`]һϐ2RtO#Ԝ7VChcwطʣJˆ0Ѻ\ p6"P޵eJ:rj7ZiLy^ߔ0 tv+qD^oA [bv|'*&UEX8-H wiF?B?0y1hZB'CSFeL/o1d}< *eVY) }ejMx)$Qlmn QcXQiD,hkSC"QcIH%v˖Ia݋t#n3T?56iΚCwDUh*>)4:Thd*VwNVgz? 8 #G<#}l!RO#l+欚*6"`EMK#Y/ԗ܈YD MB."=pul`nV&{3/$o_eVra>t eUV48꾥ǘ*֩WM(ud}JezW3)PJU OO8PHh3`&X.:|$\o4JU^V[S.&8w&6I g–BVi'\8ZrU{jT/juj%$FABSd,qV1d0vnHl/dE"-F/_ /Cҋz^}o2̀zUHYhNp?R @iy#% =nJ&ZUA?q B{Y@@D)QbD*L3.lw (⡱[ya9`OX;[SYG y *9b=T#9uL)j=a&ЯtFh'x<ӄ[X [i5-Q;͢}'fתZ`3<+B% -+iiY)94ښY.\Ty`؉֚]g062utB $(T#SiO،h^9hH>3ud2}&A~ZO#8ja>vZZbKkR}49Y}ǼXE*a%ՙ|F+HCGOӟf 5p0%hͥ-GKn MO|@-HO!ߐ:NMKd8)1H2 ݨ< ]jnL_H2W`AVGHJ!t UEF#m2lBe 1[ rb?X˩+ D!*xO6V;B]zFY .\P *b7+p@Zha<0(,f&$'P:jޖf=x cNLyzH_jO+G?d q:X ɖm‘$>NO&Z8Z3n1 /)2 Rwzi^" hwQL8{;Z֣uHfֳlcyBk" ©SP>Yesl໨׶M~_q9NyRtFSgjw~aKVA=*KnT_ZՏ -TAhn7U$ @aͶ^C+&BPbʺ,+}q =a?REo睦Y x긂ۼz v\[ h}QޜvP7BjNFR|/\ 7IlhZ̋VJ$w:CVHaY=1|z! O2~h9Od>&g,#Z@z<"/_QQW(T x(yP$*2]iM 4dJ(9^W<|K\i~iAwu\ c)rW) NfZ ܎r&;Pm VݒohnX!cR`κlNP_:%-&`3D*`#ՙr@)L 9yn28|U8wRkHLhs9mo|蘡.dDx1 5YWNaCWl^ j},)Y #Z:ؘiDt܅!ASn$ ; 2e˳!.x(P0dV!_Ii"$ULG54ٚT*$8QkdK*#i:9~gX* d\S[GsN= gB][X="izN8ŹO0@^sOdB̦PAS)os ݽR5,HS <.y1:a&7qV >+>}w'I$tՁ,_} x:|*oi+S9tQq:.6d‘Z׹)L䵌-:܅Pp0#cmz*I^YcIYw卪\FtKYbMz iլiFLZGg,j{Kcv hܑ=X|mt*egfĮ061a< Mms8g}zL?_e{p&+܇%SiGߺ~@}z3mve|v+T: ݞ].h<+3xx<>w$P6t7.e\ :yM!O 4čӓ[>jIXfmʿ lű#Q"KmeBwsogexb]ǩvOyZ y['0L&Uqօ' n +)M56z*G;00@Ϥ-SBK "Y:Y-u>Ƞo+sӏ)*u-*FA :^^*+ԍ$Xk\/O$l2. sD3ÔG$K-0@D>F,RH#~L Ccip`.Ҽ-H"L'nL3twjߢ^=N$v+Ş2%P U }؁R]{+bz--BRd HCy,c J$J-m'sؤ@ NhDjZvA6j30fx=Ej|<&0}$NnhT .H$'3ʷw0L ՘Iw}h]gg krbh@g !e$\ O-` ;cd  r-h.loj9((/ɐ6J.xu@dNa%Nz> ]L@]>qzx @+-мx6:J#SWH 6MD r0L:RFݧP+'3*PmWUk8 (sgy$Mޜ((؃$8跛pYiԝ喪Paz}lT_ŕPE0Q-KøܘCfêe ҕ01e o -ҁfq/f/ϢK,7DRy0zOg$;\%]WP,]I!_lrnU3G&yx"TZ]-kU]5=> ' =d\l:zsbf. 5\MyS t]4~ "`:Gu A*FG ō6RM)XW+0,&rZ;}N? qc{F7?66k'Ck—'pq!-|Tj&!T6i˚sd CzǏUJVg$z&{0$49"'SfJJgG~H>dXKoxmry}$EU(i bݚ-84&b홹R01d (iғ{%&Ӌe0d}ZDNزD,Z"';)µO!T ;v W_(1 <$EjOʷGm)}ckC[/G1$m-͎H8]QFҫ]1iŖa0hb"@ҰNdܠTSQ$MgyL!Ӡ׭)wdB A/RQ徉%G<}duSMMRm7,UB> RZDKtAۢT R\/R"QiQIs^TzSޓϦx83jfH`vmL2=U"'u>oa\8,f덶GCmQ*gQDD!t*槙_>ꎥq'U%Jw[k!һ+j!gV dɳET,*X)z[(.CPP}T=ƦF dMض;iDE5 #WϖVYel w~T[b*Vwv|S;R ?A(IRMt5z5(yF/9d9/T1  ϼeRRd(LyцThM,3w"2= "ˇsd>lݨpXG}3ZGk[-}\$=`cZsj~,e_#z5"lg1cȓ荮jD'Pz8V0xl;qz_Q6(ؑD{]ᦈ\ `r.&TnOmu:PŢE%9^ ϔ+-/ӮnI=^eЧ$~!z}ȨT QbE9?/-F͈#UhY!ےb5RTҵ4¡InA&[rJ֖H+bnj1f LYt R]g")p5NUQ|)gWɨA|h Rw"ginLA`dJ&1f`qj.'3օg3UD ̾v.-xiF>/DB.щloMBq(Ů4aO4aX[;! Jw +/BtLDNQOāOUQv#?%: Ɨud蜳I#Riitih2ISWOqeMJ֨9HXcV7:_:=d͌> SZΫ? q4 uRT|f~=J@O yu9 {v5̡@)7g$(/ 5_cw1JRW[.װEI}_h#2;ׅth%/-ңIJ sOuYe)}*/Ec`gLO9jiEЈT,jy MN"?5\6"ev4y+{o/wdHb ǐF.H̊; qJ Z5R> #_aG6uR SP(V*9*FRoUn3=5]*=h5%V3RaԔѭ)lLL_X#)jT]xd'8|=>ͳ Lٺ 'D[؂ vOt|cxR t<7(3$(Anl#{~ZbʗzsK$Jԇ+x 4CmjԚ4,(J*SVMSsE^,a0ѯqB!IXPt2, |* 9[?^9fNQ8vsݹ ekQWUѓfիZ2]XڞMUm*ο.V\1" -%F>)n>0Њ#2&$]-.9;2XS$]ʬ i!X]d]eɍvuO6ûyr|)ute7āVޤ:L3!,S4X3*%qސa >&%w>}͐jRmu9zTq[CWZr"m=\a^Rafӫage8nƐSDh4lSn($Q3/B~*Hc;杅 WDOn909o~6Q0P \EP8eBڐBE1a_%Csb셦{P 4ɨM(0`(3)| P,~/jљ Џ`v.9vjA[!lS!9Eg4 h@ #<7HYG?\ F]؍ 9Qf)IR)75k\@EgcD)`T̓MP¸TgZ),O\3s /}þ?P}w/ IY4^AD&Ckh ka9pvPeq^P@,<%xd?k G’ 䜺5j!2# iʊΡx^O=XXFuAJӍ0iVAT`RZ vý+\4 ^$UygԔC2}.b=n0J= Gmu(@{qDXDwOgMXąfQ܊e4$hJ0 |!]˫ڸrE$9HΦKՎ" |@]N9xl?qh~ |a4{{t2I]G}sDR)q Hq+%y9q|Ɲ >˙ I:1#/JE§^ o Scǘ"X7 F A&g$/^Й^9~!%c-@Y΢`y0N ;RV[p oBd eQۘE8[PE c} wTeR18B9̥@C :" fL:`'՞Ra8]p? 0rQoӴ)A&tj0 ^2ԡR$ʪ6K"Kp S P~ TDa"U :М5XjTc(OHfb +5O\oS_@PJ^寺Q1m= ^Qb XA*AVV)0ۯ=sl#>w> xԘ46vqxMqaDuXژV_뭥ͽ8f>d]%Oϰk_̊ʌc*^' C0e١KΔ"*cƠ[짒4CXgK 2BX9.rx$3H &R*ZS&3,KCu/Ip^ӡ>Yb55G&' ġdp:QtRtK#ci#iW+qÀQZR!Xg4݈#5O0cdJ[*kaY5962 5cEP0xqb,x[mMy#lV%3܈䵳d$ 6):̋6"a2/ ٝrZ][(JH⡻_[SB` 1,pGm%s6R{Ƞm=ad=FbA^Lgxȹ X:NL\lP9R<7; ᭆD $s5  H8᠅fciQ4&M3s ˘$Y'"y#rh nr a/'Z|LhhȂ0"^,EW%OjDO ZZ!{I6mUf F(E`qJ965>wf!u7NWT~-2"a=Vgxv.tIr܈\l8!tU$ZYSPoA/i`Ʀ9F6{H2C"dp*! r "9VKr%7Z9.6},4ް(|n\\Mt'lm`<=oU'o~/tʧd(`}U+J%݇1sM "W,!7+ޤ/>"Zu$8HD,j ji_"R##UIKxcvp}X`'\AJ[o_J"1amm#Z#YUb: zBb zjqQlJ TJ,.m\3L5 ߨEyL"#؉׶Y[R 暍xPun&R i[PW^{GujH*, VKJ#fSJ31 ;ti ߾NyCwDc]l5:/Oz#*(LIC)|]ACT8QP@2В'xSnn$O&0HiDN<(EV/2N A#21bξN<Ƃ>tb̘Q xSBf2}QM{Me#"% H7 p JpgY2H҄PZFƆL6gZc:|$6a3Ss#,.ГyӼ"pč")ݬ2yM0@Ma_/mL $(5v1z"4/ފX("#|$+L_cR6&/? vKI@ũt"A2(La0SOg *LHyrr;%ʨ$ꑣ{e^ED6Qq)Q㺀Mkן޹ŨKP )qD%s1'I'|D{G=ʮ'”ZKadd0is,6;dM6_r1K})6&>=2ZAmB#ѠxhSen}E,J}OKCU9r#%E$o$rKUN]ڂ+XܻMSI"xR?l/:wtRW>7%bLGXoU0aM&4-}UQg n4HFiŶxбoZtmZ5f)T|1M2O=kQbGt8]I6yNaYG -Z 3? a&N⒨=Y(rm&Qnu%NG(=lD" 2PG\wBF#m3 k) YĒ+LeiKR)QL"hY$)B)Y$ FWdRC@@Jt ĬQLB %kF@8!bjnb.Q Fc+4; Ols%IkKA >0CA08 1a2B)sp~l"W1lQqEFV*0@bObB NW!"I/+"OIc^c1|8(| J{) FS>V퀄d A)ȩ"vhbY]e(j0BJ)!F&L(A;lڎ fC10b*< !v3c>tOJ La#'A!S1:0#0B$BE6&&H!BDMC H a7Q%LRsQ.EY1AzH%w0Ny`Bg0G$ò1#,ֺؽHv|I2:SVT:X3MgeN#+PdWm,Ԅ2+c?A4)b2>FFG%3S?$<zԆ;b }v+>2QS.3Å#tGJ)'T#37 c獶DA_Uӱ>We.8n @bIbW ,IMBEin9hi3 srLo aج ֛^nl@ִ[84%$5ҭQVb)޴s?ŞCgeLIPz\G^i-.32rY4B]J7֝{8IJYPU0]`/Į:vsڰo" mgI^^\D}^`tIܨ֒)'d*cKjiQ@}H`}FƮKJ~ HL+OkB5={T-([qOƬ*,‰H;6/T#@z؞|hkHu_ˊU;z]ٰovFmznU%WQQ%±5buͦ9U{MZFLP-0b>|-6'\ >_dW耄V}Y!D&Kr2=$ vPFTc"`n@I'n۵Bgwk$lǖDkZ8wC!*;YlVa)7!S0o)2X;HRँQPcLU>'q-biW3 B6Z ۸Fi&#@M+<^dN"R#݇v"_l˲@OZtKE(ivd qN ɑ%=e c̪B@O0Y;޵9Atdh).-ANĵN0G"@FpH20fe >FC&K[D|/MY^4_U,N;؋Z)T+HkP+I?L_r>̚kHEQs(OQ*PxJ`蒖  "PH"+T$HALɰ:'ht%,'={ٜ , E" ̓GE)]#C÷Ӑ\H`T[VII_ %mL \,^@!\NHv 3R1C߲a>0ɦ#.~&_qc0{s"l2ȁ[^|"`2ȇe'{SQ m~@jf5O0IJcnੲ ),z}CO|sO-^-S #?g"Kz'R%n\ero—h3aNØ}Ɏʃ-Sy2uv6%;f#DaVg\M%yJ"$J߱[='R* GEv_dl!rEjc5bsT^P"Qʰĸ;%1!S\b5m1.ғcR H1x"c7)Ŋ$JTo\0d0A!.01 N\#ӎf兲|PhF봤Hw8bd!dBeU*`F7!HR@k'ЮRH[B:9J5N&w{CCA46'2@L6; D Rq M@DOFEqj1b X Dl*AShIE`|1/?[zFTʓb.{V¥.>ma 0̕!#dN3lAU\c&1'LC IaLv#G{Z*3.:BQ"'Y !9$QL0'>0ceTHD0[AY[^֫3Q?H.&EБ!:;VUBC wm_քA2;"RinLe,F3!dYhaNϳ#HBh3ՄɘP8Z_ HKʅcce1cCQ )JOJGeuMĢS:#XC*F7RLq) A #B k b&dba!*)" *gxW˯\~-y!wGHpR֑ܪ˟*:afhBd;Fj¤ʢ*BÌT(NܹHz Da)jXHkY**uuxd#06!Z1EϠ3Q %4aRAN)D`1ld2J3!xB8W *Y9btm:AP4&`PH , A p8  @p8  T!X bd&@ o8pmGU-.VFUS9w3ze XKHn ~Z]\W|Y&&b.t9MrjEv~:!֔,8"MJq`(!ICLLY OorGkZSPFH/|pߩU2=Vd&-TC 8ia^W4!wp+sH*ɡ,)@o^*Dl$qelIScn$nɁU뤋6杇)DvM4,ш:+pF3(% bÛAV˔9ΩB#9`hW 2IP8(aY Pu2Pg #f\-sTϮ$cd#rō3j eGEg@/3KdHHjQ⭇n7kn1W,Y |<ڂB_M4T%;߁j:"J>tEHzp}p@=+ W\LcAAIfP nbݣ?Fӽ jԾ+b쿙PQ#3F;s!DO"&:6y4Mm(} td.ϐ,ؙ!%mbnQiKH|h)j9}80*~X!QGBr1Rm(;g}JV iFyDL.QW28 Jt+_E܆rO6/&hIpiG@+m[%BU…ahha T\C+ ycq{Oru:0\Oۊ/hZP՟WRS=%$1xPnZpyqT1cWÇ&VąұzpXUSwhV(%Ay9VEۨg>BR1rxi4 ГxtR]"ǹ,R@Q:O#ی+~p|z0uO^+= b?lO,*@o,H+'۪6=uSFQdAKa%x^]?VLD*Cv)8aI%Z)'`jW \!wg>U0UˢW33w|kBwKRIv"v/I-C2iiINЊ(h`e#4Z( \+XEVBnRZ yxf %@òL8Ӷܡ mj$&^b!Aէ{ %&2aOVT:Z7TsfKA&ohF.-x`$!,Մ5sbe=ȇYÕ>MOR2#TRxJsslLCvig~oN@SFhZK,Cf[2=lM}󈗙@tTAj)T@&dϒ O!05 E / A X]d*B. vM(L--6.Ou e ެ! 1/sF.an:g0odhL$X#VN&W,E{QjؐHƢ- <0[ᴂDӼxi(#**]z7XTfgNWЍ.$rg6'YDϥx@UETr5܏Tߺۃ΢$,/J|97\ /slj{n=+lތ'fAjN+Ԅ@q% kQ e[-_ay&HjpY B omJ!O*˲*<I+2zYP`i(D/tJ1 g6=Z}q* v铐-O; &J^U\QX},2m7H?f@b*{P'( ח#<(P.W|Jfa NH<̏i%r3\ m 0ETLz8/,:>:+ F\x%(\΅xl?']4I`V4 Z{L13ipAs { fXB١(x@l{|v |T]O3ܤJ5)~iS;~h? ?SBrJlCaKEߊo$AT?k0jK!t9KU\Z{j\KHO(2_;$O ޘ-}O{$.[1XۧF Jd. u޲}&N MDkJ@ɄjfOjb[%Ԓeh7ivUeZb8R@v »>XUu:K.A"D w`n߾:% ng;?~ }H&+Tg͋!Rs;S6%|71É!'^_ƠyZxL"H7& Y, 1ÃA#z1߀M>uZn`HB$`MxR`ZSAp=:w-3K0e.~,5??Rrwvl$ M%Z)ks|Q*mm*?'R|hA)w&E^D{9$v\z(@p'v:P`1K]i`Ѫ J /B{㰸,Xr9Yk#i: QTmX_vهJuz|$Dzr5MOe뺳@Q+L'vrn;yP1cN\e2^J'ag¤}&.9 D"% 81͌V:dEFlGeoo |Q{j!n.=e'wTZ9"ab}FP9`\{?,za(`*(ECtx)81 W`al# '>ʈo[j9IZ1<,Jo-s/9c<ϞPɆfzA(:^إm44lY"ѓie#`\qb\KޅCY\<>TdRyWO<}S Bx (HB*D\3gq7-R2ɫ=zjեe[݇'Paّ4e{}[D5o<þl<#w(#`x6`_JIrEMFYv#nZVy h@"B7PFrsU9W=joUGH(=F9׃ M%g{qգk.Sh\1WOrXm(tD+Xψ߿TFE%29RJ X&ޜ2A.!j)f,K\m1PE&|8Q6) ޛk0SLARMUt$?82e_ HKʅcr+%TbCȣB c3.&n^2hM ęLF7 @  fbB2iF"Fl#d.cdcRCl1<.bz]%yD1j @K|\89kJ(_> 5&ԌJµ0P̸<#'X[ɧ*Jg0V9!m@F!edoc.fK8 b37Bb@*2D  `jUA%%KzzWVh|Fׂ4kNfL DzB>k vI.=S=ޓx%kgicBCf㊉Q=Dȸ ߺ+YR AU',B(6XWq/s|tIHd ;`lWڌi3u%5Ug*1G q1Nqįq_漻ՎQŹ yRI4*x@VGl]h=x\h\e2g?(eW2$#39 t23Edai"8嘥P_KFe3T_Rf #r~U3㪷_cCv8@Ci' 87 U0;Kڛqᐚ8j%!}CuDz; l,9{#Hta 9Μin|35VvC? Ɛg%܁0qSyM-s ˈ-nhJi&T82?ZڄA,Y 3L c{%gPB,eNҙSLC҂?/w;4$h%* bWtj˰D*j> $1-yd=f3V$Vj\B⚠HR㛟x8 H8)a!&PH7\P8}aJM"5HJ?iV3GbS0ÔC5MД1BR:w b,edQ)OO"sZ>ϔPbrv.ÂF"`@q^Pqrh_B7i)Bo,)|v^k s.]01+_|҂v%Xg/@CŨ1P0y;05F!|o59!k #4U&ĉJ10ײ\UMP5)F I3 A}]eקP F92PtO7ճ jj%gԹՆOcYC1y b0b H:9P2Ǵd[Ȼ>4r%lLl-%̨c/$b[: +MT3tWWhX,m.hW Er~@+).x4M㗈 ʽ8) a!P4]҂-%Q " e8`j< tiCQ/002.^^u5$6Xߨ3KT z[4h׷9Pxxe,k Ex>a~v< E}\yu*F-J3P(LҸa(q4.iiO BT@J_f!BJ ?:wkd2ĝ贙IIJ_tN2g7 P!{ឮt8~D.⫒LFUʀDCo$uqi!OփQ65kb&d&U ZV9JS_rDV6K?fM zw~FqI]x]5G}!Zx9K3iMcRjP2#VDT,LhuH[]uwR;dSCX7l\ReR4n 4215I;3c)2֯AG˃"nDkRk9%4(UQ~e$j 2WZDT]K|76ܨQB`W% lJvOdoTTc:ھp%UV I~X^ݜ塱fT:ʀQJ4BHFf{9F{& =l{;!hEjH*P4ڛyӼm~7j%1Xfe1{}IX4WsX)1'#:F%+0/d#vt A$lL&~J[RN,0jqf@UOˉ2ϖkj2jMdҒc Ϧc3)\Q{xkձba쪻&=VZJ]XA(i8 =]685:)6SGClL0ۛ` HKxJAjE4thrSRj) i) ϰ`o 21] gMͭ0ob39UUD^C+!7$Z%#M_+n.eZ pq69l|RobN$iX~֔AF4 pFXQTsV,OE$:AdP=|+n;ӇTԢ{͔[Zeb6 WԭЕZڍh;Ss`WL9s6<5"U@SmE(!SC :Vz9+,-qF: ,ztE;*!u_jDhdzEncZtX}jC6ZzZ<=+"rcas# n)BT/&UtLE Ds\h`O(!ߣ-mOuMKlMI2li+[O߶<6sG!?rK"G^zp7*"P4;FG\ӛJ O%O+dž;5nXϩK}ILsտF x7gАK[lOHB3Zh{^6~[V>ihX)HPc40˪O׈J/ ȨܞRեGڤPtԋ'9q9MKZ|ۦō.gGvXqT^6E井b|X<:Z-ր7kǭʌqr9X ;qv)F*I? \wbXha1l z9uHCsw(j²S:$ 8vN%08 =N1+^reg1(PĒY(dk"['Lz+-;> !˧ǿM (LɘPϿ@#1;^6El:A[ZW;[j"2HޓX☪Zi h2ULhUZ9hu#tإnl1&cS y\_115k6KO%dZרƑHY9"bH\$!v}*Y&\ v\E64oצ~&Bwz+x[3qR`~HX.?M(ɜ/S2/[HbT#gʬ~wA_ @nc94sa+u}& +,g]Dz?g嫼;Ix RYWul~n&-MbBmmzԽ=e:;f= tWeبLe=GU x):l3ۅ&QϺe,Ǝ_ nLKaAay81p T\rrX M9^P, kɀC|s K" Y?Yjkݭ4y֚'kX$‰3OэGeJ[f1ټjp-)" d }.Ps¡ d@v:0ȏU0+umy!g%T_.@/vJ?twTyM.*I(IրKNv\qQW5cEǪ]w>C 7`J}?chx;+LYHi۩-"k#;>bC S1BӺlaht#`^Mac9Ȩ͔v#K rKb24 &t>1,{! ؼp҅`I0\H8FlR!&YQgxG˝*{rA|1l)hU8<ίxU#7yq#& +(dDX@#L(ٲaK"GB""@9f8ä NΌ0d*Y1BWM#H#.S(ö)_'>.̶xZIgR,TԴRs$g $$!Žo7+d6Xәv׿c0º+af_iVNP5[ \ JKrm84?򏿟%dkʦMc-RWIhHRfz0X2Y&HWmzf`Ö [I?(@r--߲'QJO欑4pˏDU/Eowl;:|cN,7aCS˅Q;3oNDu$ _ƛ mZ { yAхUL#Q|ZOPIyhiq\Dn,=M6RSv\,YUdK'U/Qw''~;Pz1bȚF.c9e̪<^sDgpoDOhiK7ϰ{&h6ʚ5-ǝg1ok)ƃxge!JheI:L{O-_Xiz*D>ٍ"JR]j6hsr_֭҅#VM=ЙJ/ev #dԊPߡ%n!v ZAc2b\odCP.>YݴG2. ϝ2!åbYTr!J/f#oIZ"\/VBؒfH}0(_Y ӗj3e8x&ivib}ONI܍ x`;N!V#/p\QypikH <Ξi)Zc֥'Wf-BvY,/p2hlGѶoL%텚X-ZR۠C;e4)ȱ>7V+RA? ǘ-}<cma5/| Ϯ~W&膨~%dY 2&!ە(!P/=h@ M|GܭizFCCH-/"A1l͘x LfMߑ!x|9l^ JcATP9{! q8SE=6zٰOR#t@W!pMjO:Ts3E9EG2 Br쐎ؔR!^ OIІhѦvmUY;ȥR9q OIDUjf^$g?k*d͚;Dhy:T~:_Z{q pDcRQU 2[1@́$ݼQ 7E5[b @IMAboVuPWеg:QZOXԉ^}D;8#6D|A|4Aɏ(2?-iZ<(!W%.]/QjA5[-f˙,:Q?< Y\;GZE5N4Pu13ݕPM`om.NtI!xsf$<%q>)J,"B + $`9`ӨBN2B }r{ȔIs}Λ/Y>j,^h7%19Ub /~[dgu{d4-|+nGebiLj\5+7Wv3^ś)~fiD #WJNUySO!0aP"Y78U~;$yF` *5JLix{)HT h\0s(gXN *`Ii2z0Z`uQFI yp "Y6&&'ZZ"v\3Bh FG{ y4ivdI!C ֬3Էb/ԛcj y4oIW)nRư;(Ue+!TrZЄnÂ'1NߘTa*m{2,#!}JyoZ,Bh%Q\ސK\ ;j[tV1vJ^LfHfۅJQc9 X{Ã1o&b aFn=XRDBg`w&Aqޕ駚`h AIcUCGODjQfVK`L@CBWa^A0$澺.v Wݣ.>#~z/Hvʦs4Uʵ(7 *]SR9zhp'cKB3{Y,)"R$eb*g(`M/My}c0!xDi)ZHDoڥ,̌}Q{곍廹#]l䌮a<2TfT?_.rFNU U'2J&'D|,Y8yXYy<?_h eDQSNJHB[*5kB.NH!Fշl琵+j7sp/-"Zc9E?>3yh+ٞ[B.q8lKY#hӒO .#4S7"ALЫf3ZnW hV'K xfߩomJI?<P~W(cѳ-Re Y~4q?=-iuhC6%j9A KZԦp7AA]+o/,ϸ2$?nX̟ Z"xeAZEr'.>:Kz%˙cOea:mz"b+9wxBϡceبpϕr8F|N*Az$ Ŷѧw%> 5 ³Q Y܌Inڜb{ OMdPM|Iݢ+rxR)'d%'C;v*QV 6=n0#-ˊx㯓UZvC2Gd2I#$:GL ?Hcaܷ3fD ENq#Ϛ3~R+Զd 3 M汮Il|G %~1'u+XTA3JuAc5w DUcG ?3 A8wⰁDnR/.2uXG*7r<@UY\rIGB} pOȥ JRG|G{_ӴMNxZ! D6_r`Aj@\)X0s!7|mDnEU!-ԣe No'6u?%|D Evc7ZE!g:'j:B0W6̽^ݞr\7e?B~nhXk :`9}6{0c;⸐r%wI+#1.8g5/EٽjF# #qjNyb}}VזPnOXL).^4$:}dnܥC㧽t (7+D%tMHJ)+u_+n`-LIG:٠g ?W?`Bڭ0&$Sx1q#yi"owc&HeBtKH65\"zAY )˜Jo)rldk뿻0DaH!yRo:|i[h/+2S&= ib 2ADū P'z zr@%i#jFm_+W|h [lDh a|!Yx4jmV ᷒Մ{iMqvI/L$&2TK'V-w=X~꿛Y:=%]ZXVhr0nԴq>w@(&.6arTqb}cy_ƪ`>Zg؉s ұay/ms"L$,l %\|-DKP3UtC7Ԭ[ڢ>-`CW C?j \ÜH$Waۚh\EFox( ! ЏRu䜬&='tY" P"!䂼[}:hgsL!V T_Q{wGvԗrq]_ѿQ28v͕K)zGagÔV-:V0opq qL‡Hx?Bnsf#n9#zb P/EǶ}QzE7̸dJ^i, 4=LCB(FQ,=7˧1 xKFi3Xp1??}\r[#RF3o[_YN/ sK$[qa(9$I0=<䦠br<7UFTfcx8;9kJ?bk979ov0m@bhQVL=XV.NݜϞWsAuP/ C?ȱdEZ?D3:RR‘kg)5S\A' і,zYl8t5q󁮢b]*lӋݞs+#*?nO tv_I2nmgR?*hoɌ&P* `_UtV5$ȧfU5;}A8dyL,׿V*v*o@?zsVid /H2q yumSI( 9Rrv歉Ϯ^q_c Y ur+,*}LȨIEA(W%\fBZ.YFKxE3usvseFgFӌw\HB{ +SI5z)5JEmHm/U :#<Đ Q9SnK+Q?Uɓ[F֔W$bCjVztZ<5/_ K6X]&_IkTxyE*Q"/['#)eؠ?8@ %SЂ)5)l l⊽Uhi";ĵސ1ї-qZ?MB?=L7g$og0CrcݡES`!>p=o=!"Z]=S/Q"6OuE[!I[K` [3`1q#l[el EwBAmHfNIkB"eq!E'w,@+u„bأP8gJߌ}aMLU!yx8MPE gu$VVP:ZBl@ `oՍc'3  Hm++xi~˪nIׇ*𛝳^{.o)Y`:ӗ=y TqOqFTQRr:|eyͽ"Yo`:$#Ex-b咨8F`D7ٴu$2tQt %]2  }#Jܡ  YYGFdIyPv}z=BMx[(NzvZTƹ!5:X瘎PFLr0PS%:0Hr bx*!(ˤaH*C |ݳ<\xb9`WHIDjϋg:igӄd $3s8!"*K0y(be(a#Mж ._Bpt% oN0f_5Pʎz$"!" KU +U>fz{Liy9vǤ.sK0H tIA mmZ6C*kR[缱ovϰ-))J2#8;ͽ7T3ꥡJ JɥP ҒQfA9`M%\.1f\\"wE ܯ GjuR?ow)yVd:,&P &Z#]1|]í^/P9u$&mD(c$:aM*<*BI'vMgeV-,&_´T" L0ȵ^Pf85|) ;T"wvST^ %yBHn4O樂I\Jffls ^|zG>xI9T&EDW-ӈ0A>T<'G1-n=* Zu؆]Y"3uk>]q@TсH.H߲}B5#@BZb1:CK4ypQ'2n"@ʰZXr5HJ=B&OnG2*n?SO jBJ"yFge((B+gkZL21W7мt8֜-'4wv2P%% _bQ\ҋ d91OiO}v-5ݫ<wkN48r.NSd )j\҄P%"*q.0+F[]!cp[UeQ*.Go"^S*r |/pHd!.6ˣeݽ3ѯ $^\: ip w>Ebzrp@6E[ǗϽ/ NHUyXJ*'cjD٪}%/+ʼHg:h!"PQuXVqBr9ʦٶ)''Z="; ,TI޿pPs m|cS;)af /z8fWeTE8U$|uK,^Ƒ{bЛV(6Z):>J9*9TQ tQ\FK\K&ɘ TW@D g vEY H{JpbQ \#VS?]JQ6\̅އgv.%(@_2i LJfBZSu|d2Ʀ6Q u 8o$7ϖOTBBnpֳhlx"hȩ FA@׉vgj|Q:ng5t}6-7*QjsME ~ 6!>Md2$w >vZSSI`?󠖄_+t&Nx0J4LڎSړk?H&t{W!< " +8EgXg{5t[~XM]gIp*Lk諈bwx!S t/ipHrIZ5RHn+ٟ1}\4Ou3&E\4sg^TU1dI,*X]DBeAm5jJȠjǻFOΒq9eaŋy&;Bkl^9!2a6Z{W#9=Trv, /xRS-q|@h۠{?@fTʞ=W 3N8=bP%VQgÿF(\dP~%-50ƟtstXF7Sf/`zV(}26H9W!PuN`!ǩ鏾GC?TI)ChUIvȜZ*F%}ԭxvxD;znQf"zg]ֱБ J`PR\xzҺiV3ceVG--h^YU260-\NPOՐS1(hWJe6ǖӮZI4i-H"UK.c%BmJC'=KxZI7vRZ!҆JP(&ab7CRXOlױh,$xhhVGtAL \a AtK`ndudj5\Xz-uKˑO/I6>䒿t[KpvR04ߙs6 4L`~`ƨ[{EBf҄P[id~$nw2@DsXڍ JY$)DŹ+в^MeI9,+Z$x{^c9Y^7>aU҅*sM.eF"hIKZ`QAb<̔.'ز1:_Fݵ- 5ٟQw!DwjpѸ15#GǫN%D%kc6,v5o3Na:FK$E=-/p@pZY@QcLns)XtജԔjeVAVyE8 Zҗ[VDc;y f4pHiY$-M̸fۅo>9Y\<%*fëWFR(Rݷ~R*PꨨXr8p@.BBɤ,%Ȩ8#]ʜA(]81饼c7mރS]E)ن,f*@WۣTDH3F({M `9m_ uS=$bV׽mGVĀGDm}w \(i<@NFڋPqE Pb8O"1g%0ldQ: *CJ=>)40]?W eI#t]R &?}۵9"<]BMɪ Ȝ3Da-c77aZ2S'%Xs(( "drp &μj<\w3A ]a!=ۉ4Wz 4*f>^cEl'i@9(\Te\*Cw$eٕ^Nli meCpP!'""3l!%0Q5nKcfeB 2Std5Y塾پ@B;א c !eX{Ypqq)HB\ȾN㢨fl ۃ‹Hז4=ɕPˈ#5j!w)ou㠍jG `mK[<#]6IW  x/yW1hҴjDNL]Vl1#'4,٠u]|O؃$`!@HЛ)(,[ڡvbg2Fi{]2;sVӺh@*|/laU:7ɟ-=3H}lM }&<7~X9&Er4WnQwMdYjTm2*Z(3usT5@/0Ŵ)&9G?_qqIj2Y/uưP}I+muwQG|4רʧ(*ݱUP<3 f:d.UU]o5{ma8BPb:5$SJm5+$[P4 E0ԲD*r 6iN$ ̤yf3 Z9Fx N:yy3<_$ݙ+x~Ik{mmh&p,uzt"_$rCmJ65$-nu͟iηWta2v bB92$'3x0ќ oc 'ޔ܃)ӭ!vKT KHCĆs JnIg)^^ &HBx;H)BkG8 gfŀBLSńgPſLbZʦ2"+(+̖dٴҔ䞡w\dN Au:tͤK4YE\MtlMtw47:8dubi(sMGVr:I$WWLyԉD\$|AsV]h$A]қUOR  ePZ^$W%WLOȎş/PH&1a⋘K'Qi]cP=ICCk6;|z̸ALQHc"ַu)Cu<nMcvnkqd?v2H{;-!(/$e&KI9EQ?Q#RnWMJ ꑿp [0 JlW.:u& z% Y)TzI-9| ^*`rOuTiU0L4Z@R#؀cڱV?cjsx!!} \d=R!Q\Q+dՃv&(صSrK xE@󣆥ShƘz-G=0$x? c̺7ADBv",%Ȭ$kVS;}#޽GהՀjjYFCZ/T5߯!#t# Qi]2ܺB`0UZֆ,;[[/lI߬C#PT ߷ӚFNVЄ6TOգob1z.z߬bZ.Ϊi=~ߟpCٱe+JcW<2%H Y&pP8AAdҠ % HV{c,=sC DVGu?ֆ2P-!2nP&] fӓ=,p ;_N; eأu~,wN+9 p띉[^, 6tC&dbmhf(+ Pc"pf+Xηn#/HRߨAÕgH̵xW1d<*my͕վֲs37 Q)"BCQ4XP,Fz_WQԁb 6~??60?~wZЈڞq+`: smHfPba]x)_q&U_[l-nVqxIMF^L3p|pjZ%:k/5okv/RYDܴHDAɡ +F˼T=j<TdEIj,e_iPJCmÉ;3a]uD v@iV,Ne1VwĚ3WJ-@q8 }1_@0ֵEZ!_]XCU_P&E2J~PQev%.u̺կQ4 =bQSl~]yY mh;Bt17$pnDK~O\3ت?r1Y|f.u$ޚڟ3ܜP:*:3 <ީ~~.ߟ=Xg2|>Qh}`6bÌ'fZIu{^j7 zռVlh#]=D@H{ԕf]V Wrg(xGlH\[s1BQ t= U`͚sܹL+J 6RB! +ji'$zԤE<M[/: W)$FH[sdʶ\ DhoQKƑ[҉~Y1?WYiO̤7Лe$6@c\e`߶ՙOtZ&M!(05j[I^ksSi4jd J 8JRL[,㐳qQz/_;k.bU1V} gf䉹!_w sAe)Lr#5,{JbUȴ. .1Eݷ$I=7Ro$<@ g@"fmۂ*[m5LAL@)VDtvϸ@E?}p=zU /abGNk i/@^t9re=f.YfU!{JN>wcK3y GM47| pk9@X1,fOx]{˷8de.852ER8_%8IeiͿ@Qx {r+}TD(bƋ߹ȭJuQcNrVnX!2jaBe:p՟Hn~EjWz#)*FuHɢX)5$-tE5G$ERI*]*:c2k9>mB\oԅz!* U[&Yo|qV' sJX&u3DSӈC3 +=IKҤ4znC(0Ϯϵ>PUѪ(yZL\Zg'3M;[1U-o[6АI9>ޒ$ A+d.(uX˼?Q I)7oV =u\jL /z ^}GgrHˌY%RVwց3U$vmNfY8e:UC))_DsjxguBɤ,Bh~%Ai4'W!1+N^+o2TSPu"NF<>x&rڟR,:b@rKcĜvRhh8鈂2܏@>"+L[J;JII("OQpT[4=ip)+ k [v RNLձ:(jJ'JjqjjKO `:q /Z6 b:[uU˷ѢR;wEpmxU~oN3Q~8Z2C#k0D*DJ OuYdZG[O kdTJ/3Q*"NU1LD@AE=]"G.D% #"S$*|IK-As*%Q;xWv>ivM|lfOVZTj @ ^:ǿ}S.IΈ!me}LJeQ :%%p)7HB|OE3GCR&b->s1!% ^YJ63e8kV\fS o`O,4y|2BNU, U%h.c>^V&y ,;pFY6"YKT$2d z&Y6;U7V{P$k3M+h?i7p42뷙,mufQ;X,gEv{flbO!iΡ<.L9LP>YL1\V<µ!~(ҠtrN{qA7~TI3(L>Q%#$,*eW1Pȴ PҰn[ITH#cM/fFWY[G`w}q&OT!%-!(Ә3;'DOSRY!dz-1ӌQSmJ7E k& JDAry32m54{?AA_4Au-[3Vx">~FR|z+J~,VN.zlN)#[үIu"%(~h1ĮTWOV%Q muǻF-[q=L ȗ=@d㈼|E첼ep5p-nv\)}E6 O]`گ|:9P ( h5wfw.4~, [b=^ ¸i2*5Ñ&Zס mMR mV*^plf\gjV*s&)+P^ʚ(/r=eXo. nNd 0Z8GN.YKKYy%oAP2}mBz B6;eWgXްgт沧wXjC8 A#)3 3Ƶa=&!1,=Hbp7cMUM2P:pWMr-O*b,jHU]}Wx\_SV56`5㴗7e 9A+퐶<l}w@!13FԷp~aX"@ɑTz`v,֦?TMJ}ErIS睥SZ6 q-j$RfHo2_ӚijGzǕUB2q:H;b5H0egȋ?>{M""@M81LV.&mRVRQ:NRi k&X33Oyr8GaQL_OҵUMގcmH BgF U93[kQSu:'7ÛAWLC'ȜT z(M4DNz[iL)cRU$N-=W ydw9M, 8b0}|홗OG;e2F=}]ДܺT4[blytW6IfՅ=Ȓp(lHL u@'T$b(L_ LjjLO!єìbR_`\bis(:xhe;b@b ;Aq0߁$f C ),Wd*8]QX~!@_.eR{~I+R#؊O>t+ݵF4:LH1.bQ'$Rϯ7'@Aɘ Ljm|'7r$Z:Og'ĪN8Z$W ʶ eo8ed>4xySqA(HkE#𻞤aS^xr=DHλ lzshI#9l|Eac[8'-|N9!>LZV,Ha4Q?jJ&'an#b)]YJj>^7;Ɋ+cg+(Ll4j`CWK /zbX",=' 6Hd3/XfFc+(fE܍Ƨ,R1A%j5` 98RƤXIT&G?azdrѤ *lN7ϗE׀>1LS1S2׮a xYۮ=$FvJC9{F6iA8OGU!p|BI|sͅMܘ!vphP8l @a&y Is)XS7BXG%Z ը6)Px+Hoc ټJMO98bZUf( ̗ 7^%k0ړP.7n(#*@#)(M$u,2T9f~,=٤_*-٘ ka˅FbH"mE&o"v$R;?3z0\Ad5:Up=eK }cdicUYZ"J|qY4κjK.At}}pYN5-Ȼ_ oa1 %KK{d R׿hI~݉eO&(WS~ {Vb Dq?Y ]|Ogiy;͊<8#.Np{lr G*a\;z?m` KAf-LU'ϩ?}t1:& ԅz~)um@`N쬥6 f>?q$eޑM9졸f\q0H!8FFٝ5ӲUlCE:AN'm4/5"jI"G0].VMTq9X`v!(C)8(HGG$z+/Yg(|Y?T|0mdӹc zr[IW 4KKɽ~1.n3l/Ñ(=a&#%oHTId*!)Rk$ϑ 9G+san8T/JBЦjBLVf&>[4!5 d<]?R+1XG>,OXXHG7gYTi̎4uwb9\纤2or˲rksa3ī=Ow$ dH18EE>5}N+<04du*,jaGd,M8+ee=90Ռ(;?>aUb69 &I"_-/3vqPjE늡4b4GEaP7ҫׄ4yܜ0*HR~c6p'H-5;X؅V+z&IhvUpKfC[Y+x'`cEqgodn/Gڨv}e2 N(gr6ZvFݓk$PX1?HLjmf|Se5,i>DZf4)ƦyDtѿ{ǨDl/"O+[AHhHBFV̂Wd ']$"2lyAo_Z8$'fE lRkJer66"O K˅ DD`TCT4}@Y"$HJo3.Sr'@7]ГztH~,m +s&v5yoRZ0E<1 &7i MJZ !Gi6nnlvXӨîel,fi[^%XGgEj+DD^%҂>j{z5*V=V#Q z+Zِ335#=A:y҄8-51˗eog"#L)=t0FՅW#!p a@ սlK-#'#"IIL^!D= Ivq_fdtkO0Au "e*f20 ֠ # wy72aN  (SnO46 4'՛~RDc+])$ʹmMk̽sQ$|%h)&#\5ͳ3z`!HD# ُ)-- i1,h=ayQ oh2"2t<" kX8!zݘ|&2\@t8EL)HgGb8!wL#Z댄Jn?K[Z .BoK"Q̄[C}x;40aO@ \|֜>xr̛)x!/ЌAü=5O"ْJ&')L;'t#V51_ O SN9|/HU Zؚ`;ڋO9gTҘrd;D'ˬk(x *63+?3 I\ YzY2s{$1>"<;wRV=GZ~|*P%ݸ@ @:Ѕ8 @/yسҔS¢Gq*KwB8zyRژI}e s_/ #f643z)d 1W2҃#m. @RR[FԿ#9H!O) o@׍ c Qm]Sf}l8GB`Pg3a%NCsh_e,l=G\ Y&v'"`ja(41*7@RAZ -JJ-TY4<}0"6C3#U2to#a'TYv ;M2 >NʴGדގ҄U%G_%^9fKMy[S4|'&U$aks>PWCѻ李w7*3b4g#Qyʾ4^ց adS8A=PgQm3I%ϥW"ƉDېT_TH4Z c:?jHE;V)EKY7VU@wӥ[VQ܉-vY|lk9,`7L'\%4|Έ=v4K u,b9RCD۵ض$vͤm߃J]tLtUJ3Ts#tS :u*lpKD}6j՘oȈF&b[ oXDd-#iquyT:&[u\Dw_) =&PQl3B+5!YK+DB33L>7S| HK6akᤎ* d)Vw@Jyl أ G[RZzaSWf^W#HpJ^簾8X8)NXx QaJ5a̯VeIbx:m.!y1 `2BPd[$mqr>\ע "5P$TQ #|酫E7/P۽hݦ.>mM[P`W2&|Kg31(19['ű$)a0&~a4,2S]: ;ma6&Q/IaB3'97} "{JD.[+LM+S"'Di#">EoRcN@j;_k^%qkJq!#&/yɮ؍/ :IlNxږ4DQiF )e|ƭy@ʦf; {)厴*jkdr oy WnlӝB_f80MӾO& œ2+];dӯ~[$c݌}ݹĺsE%Q ΂=F!V]mcsDD9nk@_"X'&oLO1DP MjAj)41 I xN\>Cl4HIY޽!8bn{lAXhk%L,P"O:ε!5{ hzdƙ`D 0)5)'7!MEQr]2-!56gVY[6}{O|N"<81p:D݌:P kjR ̨YC3.-X'N- FFDjG|11%[ndUUܒd}5$5ږĘ[@2P;7teʠqE+IY%[fSUi %mQQ&)x# 1ؘ,ԲG쳨ҦxUCF(N,И~qf0fiÊL`8tz;Cؔ8a]jw.5S}D>9+L@@PMr][+1ZȻ6?qvQBS&θOmc|fjf"oNd]#Bn #iB`tsM ލ@K)^.Ȅrɝr&nvN"=aTI2 _E̾ j*T TlbC}LƦeg|ضEZpʷ1K((-t':/M[#| .AO)",y7[Hi#HORF#(R_=gэ]O (~/(-97`F:c{MHLt=AN[Q$tK`d0awA?b5qGHBS@κUݭPYS4F%22)9\;V@bUޅ 23mٹ1ˡRkmPvL$q6xeD${nY[Kq"wdZ};-xd&nIOzLF՗Ia׬cLz?qW99^TLѩ#um wb*~別Zqc2>BsV*U`iri*&7gwB l M&:qJEF|ITh)ﭚn֩e4J1k'8Ѓya" [n(BBbAzgu5HS!ǜfH)8c_M扷e٢ Q,0PÐE/J-ջ4LobőyS$.6X']vU^G"Q۳ l5IpnM&%Gއ._Ȝ.:TVY;'[zB^?v{RlYYHƀ3[T"7ty[ ["]2"8˓褚aE[m_РcR/FyA&IlRVB>^i~j>O\"čDIk;>CyuG_hn SU[HV~GjLܸX8~NhJKz†{"ReVZƿl 2kf1;T-vrtVܴĢxB2ĊC\1<59jU}!j(U!%ݩ1wJ2J1c.-`I=~A_ "cG^+meMI> >No`d8Gj3s|wi{o.$ֲ:JEQop@ KBvڏWQ I3"HWQht>PӦ ajo$ge)fP.j5Jsgb#Ґum}BhA{l׼~'9-R+l*rLx5Qy6MimG+r33!L+#zD{@N,נz "y$"G8UI>.(BoxBR#dV&feg8%)GCye1WMCG()ڥ#2-%[MPf[CSj24n*oY^؏}ЗQlّFԓY1xϭkw̼#1o iejmU9Jx A}%<+Dp*jamK;$%rբ^^e #?.I&<\؄Nڐc_UNtM,[j`Tj9 0d3SBX`t mU*Yx3oUg7dH Aw,zQ,8OSI3]XTFy4朔fS;̢Faxt ٤fW;GqENTtJQӗi>2bPx|p0u-``5N'tð&A pWoP'XQޯ`f 5+6,XcT~I>@E߂&$a-um NL]=:8G)KقɈaKPk^񆧵ReiړxCST$5=uE;gB*-e#S"O㫵(QX#m#R\V#)9 D)G\\9rOJ)DKp+5*|lvPJ*pTbEv-$ݽ1IV4vv C=)B=$ =K寐\jpn)};=S 9iai֠T%rPg zR֫A;Wrf ZRw|̧-&uFlHCMMJFUI)DWHgi7ɹawK Q̍v'If|"#*Ȭ#Fl%%塠S[-(Ȍ8[d H#ܕ%yLb{F~qxЮPҗ`4[3IXfg'pɘL@kA^fm#1 t'F;ǪqH#r;&z#ƽc<)<^~^e8&~Em[UnԗՉ'}qzcԉ|quk"+&*%-ޞWEsl0-\n61zӤM U4J8W&X1[GK5sG֓8ZBj.F޿LZtFxB4Ξ#ZKiao%ftzjcZOTtOzW}MNRŪS H#:c߱ OZ}UoWBc<޽DZϞ unȾ<Il7lE*hºEH?U4y;l+b.rHGU'bBS1%n{#ZRWȘ}e(mhe9S}:\7u3vvFHrF=ҝ!7f+ T1nh̦n5m&)̝~?HΣrmW%^+*-+?_ԓm|V1 bKOf]\SqM\=j&"*įd }(ӯm(Bt&:k!3^&[gA>7jWTU*.GrJ8]OL#~e?BF5;EJ. bT[qϪq| toڵG퀑iBV99-FD yYCOVZot`"t he,ck`YRLk(qqjIR}&Z\-[V/]"V=Av jݣOmVFlW}"G&]NoMy]Oj:J_ 16+0cqt s@CY CvͲީ+b5(|L R`?b id &mtZ2lTPثtT[R%9b+ן޲S)|^R\@*{2NtA ۑ|T6k|ķ%F(|:\7/$xUbkThNo+e_\LE"Mk1XaO[Dą܄!$R, *S?bQq8vB妤>һv)WU.wR|nwnD&h YN>Veyta̵:shfi7%."0Q+Φ+YZâB6 >pPOhKE?S?XRH6X-&t{f]I^z3MDm%uGmY_[k˜;4f ,ĄA}Iɢrne7ha4~MY-@#@֤юl2-eFXHMJIrD>xc7~x k[\ɃyT"ZE1! .huQF?sbZ_&Xb6sMUu2t晞̙ׄGwyrB`T5fy%Ң!.F-Əۚ&1 Z!'P|*de؛ BTDʸfWH&0h] %C \-ՁsFDY.D%nw59쨩cL0vj+>Of^^'$`8 >(s-p46*+R״R2"r \(Ctjd,e@qMff H-|KA]-x/ h>e.1 `$&T5iF4`Q*d$Qᛎ?!;T NKSYmzXB*x z= q\Ů#w6tÄ)V0$#:p'LL4Mv 18x%$A? uiΦ? {{EVz5 'pQ bzG#CIm:qhuCe.^7FwpO;'PˡBB!D$h02G`ȉ@5d 3j廣~(vh!Ĕkzp( 0ae EP`$11d nk6FbϿf ؙT><@wHC-sE4t" }L/[fͩ2)]8lD`?6扣-c4dm\ G OGBr盺7fyu3a#.3WINu9rc}2=喛i 7xR*rGXmڦHSUuu5W SE(PI/- @h$PAxG Y#O-~BЪL')"9}t쉚aAFܖ1HU u;tSs݂2 5x$󄢋qar t4XẠ,Xb؃D}$z7Pٜͽoq1$eZՕȲGqS7rs-6ґJ)"]9Ub[ҧ[vD^FT6_)ى7[=7{.''Cp@#H8((*hESa0 3&ʜB, **<=*<jgAL]CydzF45/9ײ(Cz "[['$%npHھpEI䱣ŮZ.q[pWdÁ Z\tL `aZ`\u`QJao[%npWZJڠ&X@L4"\`hmn'9Ikg%r&|НR(D(IK"E~Q>xht\Vbeᖷ2B Bk'O)l892/'*D+B`wO_ yN{xDtۚo;>fϬq h6F!]{\c^")C#w*$|Q3TL~k@.(= e"ÓҎ4>pdjzC;p#zUSYE=M4I,"*P9/a*n>hfl]tˬ| Xiiz^Z.z)*v9P<ĬNdEs]%fTS3Uu01QKta'"jW#EcSa:H[Rd5s.*9_y|VpRe+3t'Fwl&hDMy Y:Cgح *RG..k7MOΫ(Tp;ZRQ%$P5?ٮKU[JD|XjEHUq܊aTf_(+S=(́zXiݛ|}CxGsc{5dV׉.IXꊵ λSaH>R(VI>A.ڮ0YvT.vo1˻IΌ A_n#kB\_Ȋc]h!*`N* D1˗)qlbP*F(O AtiHCo݁DtXE+Bӽf4)$L2Cli?IU:20A(lF'IjU}qہv%6JdErD Neh+?R;1y"SEV u0tҝ/,U 5hp TE8LY. / FN&)G[;[h R9ۼpP#6w8 qKzRnm$0"N6VL!R0"(zeyYAN0yL/ -gmQD<^"DD1JE)Ugk6JlfױVlaL)P*%*N \$/!`hD+lt0]A!^oq\4lb4ꬔerj!{#?LdGyL|Ӯq7߅W^cqG15Dۢ"d9eJwK:#V, &m]*+ʠq? xe/*u K|=48Gs\1fyp?jYSʝȩ̬Gist >DFmqgeZ 7m36= RZ)>YB^6qv-ըȶ0)+;VP:L}K:i\".F&Ѩ nr,RQ" ,SiB%ޝӻI>uO1t ffa\"X- DXq%-4(7z0ʮ4- pA ª2M{[E3,X&14FU/$?J/V]I4C T&,@^ራBZ QBm1fn H,8eCB54ԯ<c`cM|U]!w7Ly\333(YCWn Q8Bk! ;v%|qC 4VuMn>Q$4iFFpH[_BH.?/xNsfmi4vEh>h6sDK/8+dY[%3-E'>׊u~iHEpwK~‰\6!ԶTOس&QEÓT"<>;]GiMf'$>+ߵ:*˺f6ńҮi!\SsN~htQr=-t̸5Bt1. 76|~Ba'ʒn2 }-Ww".BU㠉0 ~9+ح:ù .0|N (ACכn@gweD7S>E[?,)Z\GE.qaRug˂WM?j/Z5ZR5+Wj$1r5.g&6 `p~> 5t^& XD& OSsY^ pkAA*b.ZDX صOb&OcHȂdqzDS3RoΆ[F$Ņee;xF)DlkJ]xRd|N.DD*B*6ۦJR2xQ|qWQX3kBUi  Bt#9!MjIVɚYEs5A{IM}HQEPjO;P X]qX0^LeHp}\ZPD1VXMQw:F/ZO>t\!d<$RnƵ8&`LK*OO;( _HLV{v\V̩$:QR_?Ɲ)4DɒY]k &?Hu衦_{8+g JR m'K\J ͻ!I%A K<]BPAHIǂ·C|ڦEwHJhY9F9  Y qY͙,g(q%S4*WX*AgNASB]v{4Cz-jÝ̇xTEG'Qn", WAh(aR,qm q ݄J6;?B0]Fbb@JWueS٩oF +uBAÂEQ]<hI $=lYʹvQ&֓.biä2|&T@I8G=(& 劖i`8 g\!&1VlS'-r([9S7]cO)qGvNQ!hښ_1xXdv07IٛHu;^ױI+^婍Z?YI7""Mh̪Dٜ@rnjj}tq1VS;HVAbhG !U)h I^L\p!֗00Wn047G`tBX03Zej@ۖq`$ip QA!8u $<^81XOࠫ5)$"/Mr q-ᎋJnS-s4|uY8d B %pT (Bl(10R#0=L9yaL`jM/  H:q8`Ly(%}(C+@FCa #p(赜 1PZ;^ࠆE 3 P#$؁ 58' ((`!J>qGG/C /1@!=~nrp$lR >*XTvgX(" ;IrEDAG(``pP l3)38\!I!M J9 GA< JjXBS3-!pcSacH 8-8+fƋgb h<5R%VlĦJ픡QW3M1Wzn PqUC8?# eKG2( B֜b]D2A iTj`. JY?J̟.7*z &0B+`p R ˆ%★+o"Wc2KMxICR) )~" qdʪb !,{sOMjWb1D8-Cuwޚ30fRr,$a#T`$$"+53.f* Ъ>I !Nsb? D8>DHڊ A "!@|ivyz B"V*KbJڄIPDZBtt!GI!h2$ȍFs# L+%uE<ʂ9Qnяd¡|ѫpJjf2EјƮ$FT&/cTZ,oLlV R^!9͍v_ CE#*6So&F!3F#Wij! hA1v"#HBZDb3+*0R*tdc"g1,0Gݜ2M6h"" kbg lLajDHDt@eF& z'$7I6F*kc%=t)3L2c&\TrٴEFEFD'C#K Yvn#Ħ JjQjrsV*}tALJh$Mfw/[XAvCB&y!Dh&`HiH7MLdk[idV.bL}IK#$o;\(%%έZvx"z[&15pFLȩ  V`5L Ppާ>gbo#!G1Cn9@(dW ÁYP BBtbm G G8"F ( _FxGtg$VP#!aJ|G|P9QS[.b>ulW$Z q!0(qel?(4hA "s 2+GaHu"ĈS=l!"ьmAX Z4a;aLϡkuJBm‚ݐ!^(sgT%PS9ʪb%81/l%F/EPE CwcX9Ր;gy܍OkEhA !L.$Q3f1'!BC'z[ -KYPܬ0E1DT2@+1yWEL"Y-7SQ{Hi")T7a9 eGg `E@_3bD_ն3WCΪϚ bsb)Y Sȇ ea bIIB&!BL"1" DڼFB5C4 lLcr5GȚW#"A DD)l ~ jo:(%m2BZ؊GTa `#C!U2AMRm_S1:/I."]1+LUO$ElOFTR&ј0ɌlTr&I)ĄfVRAJLdFѨf#FTy[\v]a&Nݠ*&،BtqoVFbIZ&$XѲ3O&@YJN"_QժD!25;,1bYcm_HF2##DtI4i'b;]ZT\ST:t_&n)ND&2JjMjT'D7Q##l#0ubsoRbcnv6f%Si$2|IlNdeNIe$y&¶coDX8lL#Mj(d;hydrogen-1.0.0-rc1/src/tests/data/functional/smf0.test.ref.mid000066400000000000000000000002661366722712400241250ustar00rootroot00000000000000MThdMTrk(C) Unknown 2020 Untitled SongQ X$e1e0$e1e0.e0.e0(e*e0(e*e0.e0.e0$e*e0$e*e0.e$e0.e$e0(e*e0(e*e0.e0.e/hydrogen-1.0.0-rc1/src/tests/data/functional/smf0.velocityautomation.ref.mid000066400000000000000000000005161366722712400271030ustar00rootroot00000000000000MThdMTrk8(C) Unknown 2020 Untitled SongQ X&*0&*0& * 0& * 0&*0&*0&.*.0&.*.0&>*>0&>*>0&N*N0&N*N0&_*_0&_*_0&o*o0&o*o0&*0&*0&*0&*0&s*s0&s*s0&e*e0&e*e0&W*W0&W*W0&I*I0&I*I0&;*;0&;*;0&-*-0&-*-/hydrogen-1.0.0-rc1/src/tests/data/functional/smf1.velocityautomation.ref.mid000066400000000000000000000005321366722712400271020ustar00rootroot00000000000000MThdMTrk8(C) Unknown 2020 Untitled SongQ X/MTrk&*0&*0& * 0& * 0&*0&*0&.*.0&.*.0&>*>0&>*>0&N*N0&N*N0&_*_0&_*_0&o*o0&o*o0&*0&*0&*0&*0&s*s0&s*s0&e*e0&e*e0&W*W0&W*W0&I*I0&I*I0&;*;0&;*;0&-*-0&-*-/hydrogen-1.0.0-rc1/src/tests/data/functional/smf1multi.test.ref.mid000066400000000000000000000011361366722712400251760ustar00rootroot00000000000000MThdMTrk8(C) Unknown 2020 Untitled SongQ X/MTrk%Kick$e0$eP$e0$e0$e0$e/MTrk Stick/MTrk Snare/MTrk Hand Clap/MTrk' Snare Rimshot@(e0(eP(e0(e/MTrk Floor Tom/MTrk- Hat Closed@*e0*e*e0*e*e0*e/MTrk Tom 2/MTrk Hat Pedal/MTrk Tom 1/MTrk3Hat Open`.e0.e.e0.e.e0.e.e0.e/MTrkCowbell/MTrk Ride/MTrkCrash1e01e/MTrkRide 2/MTrkSplash/MTrk Hat Semi-Open/MTrk Bell/hydrogen-1.0.0-rc1/src/tests/data/functional/smf1single.test.ref.mid000066400000000000000000000003021366722712400253170ustar00rootroot00000000000000MThdMTrk8(C) Unknown 2020 Untitled SongQ X/MTrkl$e1e0$e1e0.e0.e0(e*e0(e*e0.e0.e0$e*e0$e*e0.e$e0.e$e0(e*e0(e*e0.e0.e/hydrogen-1.0.0-rc1/src/tests/data/functional/test.h2song000066400000000000000000001673001366722712400231400ustar00rootroot00000000000000 1.0.0-'23aa077f' 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true false 0 pattern 0 0 0 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 Pattern 1 not_categorized 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.8 0.5 0.5 0 1 C0 -1 10 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 10 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 10 false 120 0 0.8 0.5 0.5 0 1 C0 -1 0 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 10 false Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/src/tests/data/functional/test.ref.flac000066400000000000000000007520521366722712400234240ustar00rootroot00000000000000fLaC"1+ BX~;GåK( reference libFLAC 1.3.2 20170101 ɘtVW SlS"H+vNb[k"7E)x*^ڛ~>͢Y_`@.:ټ:խ c hk9'{ %1@[N9?,;zy-/n~.X, 畠E$0ZB0K԰%;ThiaTrRsWy&{g [9)2EsfdiA.&rlg4! A#% dXF!DLgB̴su',H%p"/교E.ŬV ݏz%+-e&(^ȱJ^μ)XDTIW5"EeZu4y0wHFM;l[ G$J R+i7+mf_/oGtrU䒈i-|iيdr>%!T;FꋋwØ\MB̓<`:$,$iWO\ Ƅ*8!- /_0i[^iPYn PD4nB1^&`:F5T,G<L8[qbed!b\6BBj6jb(g Fɟ屿F]CL*S7J8 ^:GAVSa({u~rZo>s&hl${R(ƙ)?є+Ӊ㊦6mpLg7kz |6+ꈰFÒ BM!gUA151ݹxضAV*} {MBmPEmC-i;[IՖ J큾7_KQ@uNDӶek!An=HGilQ(21b\bD >&雩VI(Д^Ǐ>}H5qsE],L=" 13Sy1zd2Th jkwB)r~bAs+tl C-3Ɨm0^KᯤN'dpH|B`/&7VX),A :Q7d6_ĵNyd7m^lғ}s*c:uٴWZXN:Co غ(yKdN z7G#PwYiC=W{52Jd#HK.o*2dy)4|6H Нm}2M9Ϫy8y H? c]MNtj"ϥF@d`V2Jt+TjJl*h{(ΈwO7 ?)Eviń2xA%"I TۉFX˰7rHtt:Ŗи>vr"n0mh*%Dp*9\QA)~N%+1%;”y~ )rWx#ʹKg3(q&hAri'UmELc4I{7(s` JQXE;[^\:btϻI чC FT ΨhJo\Q$Q"@[DOEQ@z9;X%r|7{y S& Pru\_Iq/ 5)|2PSPhu. Ce|) R;ry]$(5"TfR"&!YPyP\*] `G"wCxtC>c(09LJj.5]w @xH Q x4x&b BOؖGVh M ̢0wm2*+uȺ pu:cxu8@`Xˆ-UPM8y*Hhhl# t.!8Qogui[YwJ@G8 7EQ)aIH,9G$phN@ l"!ɤwHDFq8Ԏ93 ױ-b ,.\ ׌b x? XG"8spNGJz`+MB 񇛓Uzo)A Hj^HP k=.7¦@ AMh~ OLKQPf2Hsn4J+pUІ8EcJYhjK 43DBE9wib~'31'msIe :GwB[m4>(L'rNA'[Q ܂x< [RV6GՄWK p>R" ͮ<^UȐ} &$d-D#BQͤ "HP,l: $SLKQP̮$XQѳ1볌5JBH孤gZ7oUu, c<0y6,E16tMR'e ,@q|&%JqEZvP(TzFrÇH[p4ZLd9$(LgWSCXwHa&ݗ@30!\"9WGR2e 4m R!tnM9oJ(F+-4t}z T2*mqAC ѼΩiAGY]27/ ֽN@Ām )Z `$⎺vvE+M.ƆrƎC4ՅGЌ*Y8zP9LFY56f`ny +iXib,u$e^hϯsJ$> 4^ WZ_ǫ[m)Ie k -څϥ0 7 X_BKQЖ'~*}^x jÑeU)L`t3Ԏ"9vJJUKVX6\d>yXE_8RXu#aܩ#hv)Ww׿^e%$JDV%ymi %#D[zw\úe#˨iBJ\x)ՅrIq e:<Is#D[L| f'ԯ=O#CBLm@w|U"k[@Y%R5R) kxn%*&$# $/9f9qn`zбvNBi28\7.VfClɷ+M;ewV$/~VVmT:ql雷HHm]T=EMCxQ%2<*UyZEMw1m\>k90ds'Fvu@PO˸ )I7vӐn\ntU_ʐ <kLܧ4b]#(|ZڜۆYkGr ͩ@U,"7Sj_ĚƏEw}ygw׸Ù6r2C8Z?2?jl MZ*YCA,To╰/PP@N0-Pb &IƧ-mi(:2M o 64>n/ x&pw՗]>ʉswR܉~b$wyLuMm |B-2 k] EgoKe?'U%yq|\lR%m򠪱ޙ^H5~-Pw§F:7sL.ABӆԩvؘˤj ~U2+1pB@ш{ީU$9Wp"@!ڴ9AH|v~.P\Y@() s&znNx:!5L8d۰nFA#r(=I],lWIGnsmˑmfq,8k>Ff|T؍DDeW8A8&?&7RwZ?Į 3W:cXәj!1|*vP?qلzWPgŸg Ɲ̋ag6]~eo?/xm^Ykx!Z Y3m˺ّW;JO'79yA!cXy c>zb7 Y10" mF xf~Vebt |e9zVdy#݌8NkarD\ -Zd&bd.CRyqʩ'K;^>Я}4"Fۅ՚+'OB$BMF*k T[ SQʁ{gF]'bFjrGrL[A#P&+G]$3ncnrrm:@ jp؅<%Y7)U8|kH/r i0FUtd[JK;$4ilϗ߯4XOXB|:!њ&ج9!&\Ƙ}T)̰2\tuPH.ݲֵ]Y)BK_5FQtrnl8k+!AXLf0_37fBtǂ!p۱>ѳj-l:{$7䱪o%R-"57Wo v-4|7cN2dŌffAh l%#i&T@"!GVH|)p8Fz}ASjJ)"GϻtӁ %8JN)] ߗv'J_{b g+vta]T(ЎYFfc@\ܤJ9c"in'\ɶ芋&`hM"ptx3ȿbQRRU0VpƄ"xsЙHRR.N;b%4HgmZVw2_J?6dw2⯽햕1(j#ZSSx%PMd\P@&_K1G *t'O&,@Di&u]#@Ni54R_HV`\ARMb$3 v![ZRDړ ,R܁Bڏ%ɮs}r% F]Kh~lzm!Vebn )3gBgA)^";U|m+%|D [pOCjyYzJJfE\*;&iHDM3' v\TOGi[pQ+ ̱Mŀ%(ly*K,3U/9^gNƕmrz.VuD>5(9A9M_4!G<?31"d@o-nz+HRd]L^<2% Z%T7l eCHhd^[GS_ V= Yq&{{YWDz\J 6Yj%t=NqX+ O-b5lwO'Oe (r8]<bZj.U2>OF6 u-[2ë́"ȕlZ*^BcP+,KhG.P!Н'io\qbzǦ},dIXykP$ot%L&3>Ձ\T($Q_SChkZS3@ 4ƙ5qU^Bd:Ԭ͈) mob/# \mɯvi ׃!d)XV#KgfU7t+"l*WgcrW_Qyy:LV)sꪔN+S?L!e/LX@FĮqP5ʋZĉUM}cZحɄ7*ԟ4/mՁ;] /fD]l YP˰_o.yBIA0177_$լX~LxFlR}*I "?m"V6,.Tvߒ-[&SUTT,XJnP )!/jV`[B)9z!KI`Z45Vx6 c LjśyKȂvBFA,畛l,L;xkh0aQ B(Tjotnj+XB975_feVmWj ?$Fƛ{xH4c2FmFLPsW!qk7{q֪GJUP!ܘ_hLP51z~ xXLm. `H1- crιDs/Yjsc%`) dq(mE˰-՝Af&R~ qL, -sTa#u*ѳb)H$6.ͨXRᨥpSyw"_nJ]\+6c>Q. ɘsTހ%@,@  2WJ:'gz7rŊB0+|hȾT<_mN0Vq^oשBB\׊b9,d=02Sнh\R̝چu6zq!{ XE>c 2Rcq?YEA')s2$07z0^?b#*"V/np2VqCrJ#N"hl5: |;!log^/RB8D*cNJkrWAIF@rh! hV7: *Ŕ y@ iV21 $P %J>dpM^ѿB ,OKvF8aC5XR85R!m&W,H9Qat# X E󃅽5aJKhDW+#w8h7UH6GTVyj5)I[>WI&+H\q-*:E` mL/./[NNAet @cmTJXrK{!K:b llΝF9nQ* |&gн!-fHYa pBT{gH`)FdqO VD mob ::{U Q`sLeO&tNJO% Efٝ,6!:J4z (hZԯHޑȄcC(=['2%e@& ŏ3J1%L hW"PA'lb'jD ƂuM)l: f 3ŋ[m#hn!.iKeS- $!a*T[x/bHE/CY|r[jNȣU!SI K7l S4L3yWVBʎ9 f ~#܏Ṙl6N dnB}?-K1@o -BK-HbH6I'YqyɄ +n +tA]A-" )L Rd~;Cv @fCVb IJ+}~s~%%l5-\gPMU'z{0U-)j ]MII.0EgDGA[A&aF! TgT$Gh[ ކR?+POb̕.՚QRQÐC( f3Lr*&MFǔV jC.0^oXoO#T6_C,=32 (# qN xpꢪS1 H;rA,]Y-NC--?f]GFyy,2oSR+kB<+Y.;njF8\Y $VTԀT n>dHDpt G>CryE IQܔQIqF*"> B bBP.,GR&tE(W(\ dVoz;wPz!63DLNcy(G"$Q"beb\{WMx܊ټaFf #[Q䀕G-X\qA'o᫼aZaxk2z)IPBEV2-́.0d++,K8p(y2xc)pUei;kiug{ jӔ|zczrb OXNJ_bbOk9$qH!)~0 $ n`[%7!Dd8& D8QD?yd"B(W5MKmMT-B)"ALI!= Le{ xj7$"r܈'tH) AHf{JM60o9MM[}[W'3Y2x[RN`qĨE*fKnǯGʈt<Ͻ,d36S|CxMS4-/kYGLM0BB8Гڀklw>9}U!5؇32bPz[<|BU9\8wh $wxqԨ $1$ůl'+-fPw *X(a9B'2qc-&R՟R;3PVo3ffeCOQMN* 7ƴH 6)Ih?5Z=^ Y5{}x8 /V(n:&VT y[(MKj’w"!v_I6#Ic8Bn ޣ`IYwZ&|U,e)3գXbuMXbcprHāVN}#b zurvc\%Sܼ a_;Oݼ}] |HD<V8LKdI 51hnb)c٫Y6Ֆ``G)V=Eͼ'ݍTKLK8l]5tȖ ] qR+._5e@@MI9Đd1&xI&7/܆lQ@K&L[SGml5 Z=mrZzb8W5Alq.Mڄ'<it>ymTqD@E1-<)OlSoH^H(#6yGt7PETCD.F[^Z1@o~2x329Ql(P1(f)Y^8 n`³M/is)jfkImMziz"J1(L'ӧ"7CQ/p7xo 4=^=8ٗ{SLo(B<DH|O)P؄2Nq.">]S㹢}$גR\}}$ }֍+-%Y*%r(0jN1co?昐kcÇh _.o?K~ͧx,J)rrH,d9y4](dWML&8Mط=Xhlx_m'o>͂<CLc4#Ez r!p$J2mD`SNb˥mPqepˉH˺f-vf(V3b0\4Li:݄*dBGy~ +8 GPK[6ϼe&~v#Ri"};r!s)llzQ'\iûR8(#NDY\ǞSw+17TF^ԐGB}ӓN%̫?pΣI4b`Wgԓo/l GΒZ1lS EP/ χQg[cO)>a6k?}{=!j;J%D=*@_جd7$g7}PGٵThBF;i@ä&4Q8*QY*'o>ԉߴk;brq:7 O:䦾TwbD{- 7K.DN$~\+6pjk[PpYLr֌.e-SЂ\bBx5$<`5ByӄNh7r & Hd +(Xv,Vo\)!I*H Z?~4cHfH#҄,P‡eZF>6a%s8Vz~dpp )fq,@%JHO]y1ȜaΖ'k%`:cj3h~ZTlV7Y/NW>I- JDy1eHk9柒A +C1KڐI!`w|>Kf FHlp],<RW$a'4oMMӱ\IZ<9!YNw,JyQUr1dwj':A]{muDgOE [ᔖ)[)"~no Q8/D6[F1es c-`L1* }ئڅql!܅|UUp(]?f_gG؟LTN2'}N+ sn*S#pJ65%C maN}Wĩ41^:&r,-J a{ (!oI}#psY16ہ:Y5fvmףܴ[ I&r$Q-Fh3*$?H1r]Fd\"=MwAaY,yA9Zs NO_eS O`mCbk(]؎>5<ɻ)1E ז~]%>e=4"q}jXRo2}9G%ԅ)ŒO6x/g"x"3(ʑDwdk3@ ضj@cٖZzd<$0H6|q퐨Jr؁%;{55jּ9%hF}uw-7!HG]fZ$sT4µU&\DI+tgƭj)%Ы *  uzz,j8@ is !J8JfW3fo4LQ,WsE1{s65R$b TEzyU-g ZL5 F(+~߿ Ղp6 TE&ȍ荵42kg:v 9"He JNb}1R%,l RŦZ+h?bES"8<%Ibˁa$a%v u+&=P%jqe(8kdnF Bo넫Fk]a'qXtzoߺ[ٸӵU"?s-J<<_V IE#4mE#2 }J.qG7l/KֺdwdtjK5T}11 w{@"H.\c4|͟Jk}J}aʢAT{]JvA5Lk Ԃ礿MY޸NAZjmg躨%5# !P{1q6~Sޞ9 ϧe~7ڤת9j/d>93z5 bwX*87˥eZPu:cB I䙓Hb(U>lk nۅyuHNb%g A WnW#*w`RjXa g874=Zk,"vҴ-#; 0z$Wvmө~Eh躵W,TAvҭ{"‹_Rw+)F/2}u^$,64!\gGUk'N[[yJ;4P5o3NIny]wVKa y˹Պ.K(Zʃs4vE1$>o"B WY)iy>ce'tPh@KDV]:O'کn!sm,$)5s!IUބJvD@H,AQQvTTC1+QkVV8Ewe .+Hs}UQE'ɘzT̀ hV?綕'I%LՓ04HәεdI_XFJ2LYéT5QwԎCx,KD A7J+"k/0.`GW*l.ř҅€!#B9T8SFiڅ2 䜄`$=3qvS$v$;Y"EuЁT4skN,MBf%]+ 0B}*sػmhKrAh<9B񕑑R*q!Icg(@w؁MlZ0*RXk fb=Hw d`~$$RWPnN IpyC 9J&PI="2OKImo/W=6 /RXGWߊP!0bS/ǫr1@ Ix64T8a 32zЖ(CC-̾4%յkF<]QW"A2<:5#V ,z;GUR7xzA"G 7KscL$}(b*ՙѬG-ٔ95pKWȨ_t1gwd<-д]"1BS5aO,bMzv=]lo{9]"5"ڱMoPZ lƝ*$%D¦Eh\A,NJ XACh]Q!0|DŽщh3s(ɇ5a.C x^1$j@e'MOifFJxA%;@@eTb )msҨ5 Eq]})U2gJ #|B*5Zѐ.z9RJ{a61z'"!ʨGEd+MJea'IS=݄4فHCWt**{:CT<IY ޥo{H+-!>~&hbI4ZNovEn6L#G@+\#%#Re/OV :W: b8_k*DZR)xawr`fGD~3`J$Xhyz" <*?25\&AM/Ҏ@+kGnD?Pnڡ1n&e&Y^?֖qONYa<ha 8CoY[FyX)-mqrtԘALv@ .U/tqe&.|.dJp)i~NEYNQT2A2`-ENHeB8i~=]䨭Fj Y{{g[r\ M R\)U"#>zCKǘEף6YtR?P"$GX Ahz4&, gLFz (XV(:WXE-'g3kC&ACy%1i y~ʊpCJYczGA3@0&R~#x] jK*ЭJ1JwwO]x.!bE4!WTbEMi"5dw6jCx)a0-2?lQg[/ؓ@d U~ĸCP0!8$x8O*Yh LuTeD:1}se=jS"ӛЮ7AJ9b}j#U*7XNAZTߺy+>/:@:9U0a8%0A9NqRtp7AVXƞ <{p\Fֽ0꼲-LϏRg_ߌ~҃V,sSKҔjvN>6,J1p b Fa K6&y DFPl:!|Mmڼ>-r'M\JJ[KehZY+51܈Flߡ6Sx:#]jk'-T ٖ BqBA/_6{Wף3QK ʘh${*y" jo'U#  G$1 &>Yb.Vi@=!{y]TR4NܧU9nQt$rog QOwuIwQPyQ1c*v [_ [bicm!kg!\#B q VTֹJB`4g8U|߂HM\ݙaZ!#2UkN_NL ‡OBxWRt̟HZ*%'UhKZJe'gS"<^nib,ϒ*-쌋7\+yoY;GA3A01e|n ^@K K%;uGxB'Vw&2m0>"O>&1s!6549j*{d"|cڲ7`'ֈpI+wwčɿvqv1҄F@^ x9T *>5dUfcBB/"b7f[\'INP@ad4!)ՐoJsfa"Ϟ-jͺ9+L]4`XJG{#]dUXc|d8ev0 ٣3m1ΪG(֙,c/U| iU62q6)s6]WgݒG5#C.e{᾵l5 ]l|4:b=F"u\\\UQ]dt%ga9HA*l !LiYS;p !2 O<#۝B l7AWH߻) L\ U YAR1q[5 /z;i Ĺy !f>Cᮡ2PR=)N=M΋5"7IRp5Wa [Zk,su;/ jGWo>'UG`B\}Oфcr޺D]^@m)g6Y9p5C2O9݃&+du^vyl(jb]HO>>.nQ4rۉèjm%nq`X# F(13Tpz \QrRzʣ-tBYđ>Y]ǺNt͎x)^~} ?نH-?3ΩsT v/$ E!'JghHR0N,=:Mq7 *Gx̂.zH ԊuFxU<<`;>ru|<|/*Q #lcT,G9+bA7K{ӛS)3$ Rɇ>U(ʗ#_rM팔h,AR=pQԁu|W󘋗|A5&AFm*26Z0ЏYDҘCMRp0P"p0ĿxgOC Ԫd^! ;2bUOL6BCT,uZ2pޛ 'ZE5ϏU^YP9BK;@ <]J&2z•~C~ҒIܴQ5mO(`c֌R67|/y*SJҕk931ņHelڎV)V peO~Y&S&~4C*Fa 'L$4fM"XSi pB1a/H.Ž- KBn[nz W %hG8Yue%TJ8mr%<ƤpJǑ oR]&Pv>]Y4;!VZCrj[bK(T:@.hgfzi9ה”~f(Ժ.*5B(L oZo;\'hE9Z!NBn/9/֍g키Fp֑|y5Tpc'}\XDحcĽdZFSnO;Rػ 8n% 侑 e@ޠZ.4O-!q5]Um"xsb,==_ZJΟmey%VȖ^pw )3->,?/pDaB,.꽡\V3(s UH"T\$ظ6+HWfVHk^Uhվ }M`qR˺3ݧ8[^_BB/̄}LNŠswX5_3zёowUq&?Pa|ğ۬}~X֗-u^~&P˰KdK2Xtqq+W5vQ'$x6ݔv/ p%n+{_aO=d&2psJ,%s4TK@j5H- Q UU?1_0^ FBw;ءeʵĤiz"Ҝ4]ٰ%k'5kKp!e@>RKyg3t7&%J-&\ ; ~Qx..j4vp2{YC{ Ƞ8S%:vu,I dT }aw}QV^)BA+1[N T&ě*VR#kӜC=!^`DR.SN! @XQ~&ZJVT;̤”9(Bm+|1L1"lNwZ (?Df3* 3krwx: Qݐk5(!["{n kҐaԓRSSs 7{{x4M5HQ)I w= DXKfGc]b l( `YbؠpGsdMwu|dx||ҽiB:FvHg }D^XUς) ;IKW9uzg<3BW[劭`ُϨ$]P;IGu3c섺1Y9#:ZJ!vRa"Sobv.MT1~<&a%$͵&9Catp$wi10^h|b(V2Ʀ%cPGBv=dL9STg$W1 g*+{Z{ͬ2#o Kk=\gR;kA6RS@yӮX_jvo=VJȍyfIeTTza/S< -43 #@UP;N=:l`);c\#a %mA:pZ;a5J+,+=1]fHb+L?!CXK'KHmQy.!H$J])nx S-ݞ+fNdnJJ U*J{,a"r!#C"˸RZ_:(eHHfIxI = PS\rT'kbܯmCn Y!qEJ.I3Ht?J)GV[F!H"sbX[aXwDJt%S8$ƒ\qZi᯲"NLJCEQmD $Ww3AɂCy3ݺ`Y%P@?H1Dvg1wOax(8,ρD!L .zkZ.4 m'eN螞A A? Bt~Xm}kld`8t4xZxM:r?/ ܂_<aKbpڮJ2ƙtpzJe^V? l@J$$RdfY|dErfp:k 1RwXvSDYn.岱W\": epw$]KGiu+ DzH`+d;cf'sFt qEbII1q'N pY Q_roM9`[3HM!Oc{,ӈ.!MCc9GH wdfbrY { Ey(@;[ASɄOss(ԪWfw[&D$kADZ [@l|59(ǞYAIvyÄɼxW48#" yk8ʂq@:Xb 563Bz}7%Ҳf˄3^hjd&D ¦PVDKupS kSn $kCŤ-(!P Zw!mԗ/5Ds\Sl A6ڲtHqMBə hsWNH"_|DH_$г4x . 0izedCa% (ap`&nkP )C ̼ 0(zffQC,Y[,3(\nCԗ3~0=vB: G0%qJ.2qUE" 4964eVFd ܝ2v;nqF* $&ɕL1W^k,!^CY^t XTQtJk%6vqd?3)CSJ:_K8 D!whj9v.z)قD%5L`yq'"/JhUH5_K%G~q# -;qz׆Cy j+XXƉv>T}Gpa'UFfWaĴ5sgkϯ @[?.aq[VmɸKB$/c{lԈֿH'Ϳ=n(A (^xtԈEvlzyOycI/'gqŔB)/ƻHW-KUrGwaCvvU/;$۶pLoJɀLװbΛf@a{qGR wˣ Am1vU<3e[%η>ZtF58 Qtbh;^iۀ7:t4:mt,auO&&IM.NӖJX5 jG#ZqԂaqe tUp(註+FGpYq 8WW I .S$S{w|a?H -'N=yPȨNC$.7X RUYrѯscHnژ`"b hIa*9$v -4i<qIVj\؀$jNm!<•tn(*F!l{$l.UK56Zq΍f CB2N6DP/˃"L}R7J/b13~B'SO]cSyǞB|+iZNKV_-qxnZ-&v2` OɊ C+hB#m0[&S1u  Kd<aE򇓃8H)46^9T| K73xM:WJ Ou_| ͩKߵIGiGGJ֖Ds(~dCNU|r$= 5ሟAKj>(@=6C|ZEX S#4|@Fht[N w RRÜ66-Yv&*0kUN%|؉#m3׻Yq92.B>Dk2Co^uPi-$ wȋIq%u9a8DGbDUE㐯.'hTCUy~m7䂧b\K>7fnɘ}P~6πGXiO(wEd:c L0%7,-9: hNdnǕ^w"`|!ёҕ-?p0"?"xq UG}yMxYPU/*K @-gN[x_Cuϓ)Aiud<+7 \ǒj2a*CʡcboR;c*Ƅ ֍ _hWFn[񊅅Cb/  ti;"Lm~$<_ JWC-2Aq:֢Uᆏ!#8xIuכ'8^##,u1U9bW5mp5N DDXzAٺ "yղfU}\g1ҳ%1@߹.{`.D¦;1EhYٸ\*c_*0 puҨބ_K#`0i6ؿ㢎BDFIxRh.+A"C"Ԓ!)|MDD+)Ft0GHVeь 5a'_b¢TvB]`m4)+|8Bw1T햷wn9h,.;kI/]՞ͱh2|rM] djnmC:n2=-K`$SR>K.ڨDI f 0˵$ տjkۆxS[GVB X1/x 셒$|zS8NXhƜQ,6l&Fi-ܚT}1"IP`e7 E&kMB+ԝq4f:悶CV=q6>r0[5 $sX>'$ODۏIM`#㺩 HtX.xJBSb\MW)wpt3ExKf4}*w+" + vB1X5~._1fWH4Os\t՚9E]Z`qnhu|t6un$gZli-m5x'U$A߀Ԑ(z'p)HW٫}DX,&ޡmZ}1b&C&@eNOD걚`?+ZYtEli ?OKGIuW2d_rq8)/6\Q_*%(o/L0W`5f"1P-)1mJ[TI-Z,|N]ﷶ0j ⶮC Lx@g (4t%2ߎφ0:#, * b]ykqꈹ' J{9M5{M]94q *fșŭ64fR|,THB^%&|ˣ4s$kZR۸>-Јras Woy՝pkhhVPbĔy =b>u%*G67X{4īyˆ^0|S2qJmo8&Ca-2H\PZ؉4*vz=eyHwn*[~n8jěS(wIMtLh?$}бA9$A9Mh%tWiKt-1g JDL!G,=\ rfE6ͽB:\TsG~25& 7H466X8oHnGAjD&QQ@4ؓ6M#mP @I mɖE!tIO9!81ڜCۣ|7I6 1nUgR1bmJ~Qaop`H\Qa@F,!b ^cW1w9nm'.kjqO$#wt%4NjZm:7S/Z9LTSu;ve4h2W5,͉~;5ҷ칝nTy@_19w ` wW[@vv|*Ѻ2Wbܿ27$YDnR Tz&pP.kS[ǎTa\b)u1itzU]9%*cٶɠ<I0MNȔ.(D j| ˡ@Zpb!b0${ 3\~s!JuBT+f#yTg0( \qSS7!:&0ªiN vayLVq6"MEjf.y^ێP7AƎјeV&sxoI9_].CJMֵOt)@ggE(oաWV$5[mmpZw4bj< s$eЩK* l*A (']bJuƇ25tI Yu% ʐ3 l.Z2@ǻlڶ3T_SJRc+N8əY""rwdǑ TTk!a7C:#qFZb;&1QNjS%+AU.MتON9!&,۴BzRpG3ƄAK4r;o߶jCq[nX錱{Lv=kv0!)2Bha#n9\V1]8:hWuLͱ/7 ԎK?nű`H!LLsxChK)p!>پm4B~v$&^#͸F3DBM76Uh\EPۊ+2g8IYVI[\$̋6`-.(l=֑ s/`2G#O̺Mba/nM/{x3\z!J`lK} G)Gg` M h A`[wGh$Moku-A<765(~&- nV*ZR+WCdcː[*1=֩. TqҽD9ID{ꐹ ADW#}Y+tixx6 fw20&W,u)F$~9q^XsS<0!"ew{ tQvvdW0 Х޲}',,(ݿroxӒtz2 2ay-kH2ϳF d9F*n"lޫ%H e ${d#:l/+/s3"6)N1lȺ:YvbUl`_UkUw)2S!ؗ1µ _K{Ѹ.-qt&cpt[)e&{5pď( 3$ !FıF-6ƀH9<-Tb(s"mAzL[^->ED4#K& B(<WbV$}8~^̞F$2KaQ-,n1 U(Gq/4cp@bt(/ ,!nQICRݨLRJ` R vD!e70 ((8::r9QewpM^S (1zOW5$r>ڙemp/b~Ld AY$ay\%!#㙳"-\@Gb@` t zfH$UL1-J^&:"AXMeȨEoq*2g6 {61|5O.]2#8dkwI0uJtTzDP2>DUe.REI ۋ3sH!Pp=njx@#%vB}*-l #oc[D:IߴɳTTjN˒~WVFT< m: 4臅 +hw3 0AP5*gKF;2wz!j\U=0iHp)K]\N4֋M׈Qfm:'m4tƎ@m?y)*~K4>o[zGt1 "\#=#B@T %+(1@ wϘd)92*o F $1 ̩wu'Kv q"ݑ3CV ,M-\6}Ⱦ4s`pL=~p1$RyFP"p!;[WE(3'T|8:Z-w͈U8KH%[3WaF*] -:HBMYlZ- ܢ ^QZ#4"FKqVW6ƿk6+(:OA'0 DK`hִ'9V(8/V~^X^lP2هu3qf7AD)ʿ!)?'uarF:؍NO\H`'qٳM}J3(KwB$EwA=0QfLK`Objt=c~T֚.$.+ prF131ݳYOk[MYLNq;#"65l2N_$.zU8)b ߞȪEq/qX^Rp/XZ1ۤfh\*s@ F k}^X*u!S#46#;<  jN[PJ369_uPX) aѸH! |-(SaG#P1i^Br" Bayђ $o (9nmNGr&ZJx[GȈH̷ ✾"?+=/ߘpyXFͼJcVET)kca(t4jU<$fjĽqqEsagWfBu6w+Jr\\p4@dF$*UTpvIhtDO=k(E_ K/3`.RI{6ck ŝ)pU&dWD4t0|2Xi1/Z4Z/H.\WEn~v88 I",۵-blѝ,9qM;9aXM+?ьw.q[<7]x9c*Ua9#x Hz'ܸ\iQ* dd8 =6:YfPli,VIeHXg{W04$rVƁK*?# iV爕w߄lw&38gcPqѱJ<[S L>3jAE,;5xYw( Pd% =#3J_Ж-zqJ AmmYWcRPFa5$ʭdG|Aa+%7P̘hDYC]s0I5=GAU7[TE""lb1- ?w~3 _- 6mJXh}Z+ݯ7"Ey)r+C~c^UQH%||G~vݓEb>a$۶նBv:؃CRKB[8OaS4M,؝Sh^e/bS,FEoW]>Y$1x_K_5ߊj ?2N1y%]Lω#PL3aue6ޑEn*m )+Ҋ*l٭hY $(d]QS L#Gi(* %*0 [mKH_+jp#-IڵoK z-5bvĽ+jvx$iɖ-*ǦCgzaSxhڢbL9h$:g+X.5HA| t x\:_s2\?#~+ژ %N4[M!QFۧKE=e,pjP.;xb\q_\5:dWu)L e f,ːSy )mg9 -1'6mÁr5w햶&R).hBI6~eD>q帿 a$>(aBȴаC]=/oMU-|%E8LՇJFDW8u&D`V˿RJ-q 7LC-Y\2e2gJ=qen+*9'ɝ=GF r ufZn6r/=FjP=fOTXpLzH*F;b)A0,{QE1W̨%)AK} B7^ψd'A`(h[TU ].lL6MB(UR "'*]VUjWYucdB 9Sxİȏ,5rK.V JHi?|DzK /T˯5DJ"97(:]5ydM@hQ*o6[?XFB3#jxͅIתĶ;vD L9e!30܏[!=!*-#laD: Dc\BKm@9j YV,vA]T(2ڱ3%a喒Z\SܱP;=L{~!aЪZY뱏]Il+"?MQDV'RJRd<-TK`O'# kV2N"HF Zw'MX+==䈣 jzgtjF#w d:W|[XC˦id{ H툐!aeyG(hA4yLLTSVYZ)WRׇn89N^E>w룾jAcX\-ljؔϹQc"#oh 6-mTExGDx]gi y4?sb hC4oLmՏ8׆k{&+2)9EkZ/j65񑛍}ݳvc+Kdz1l ]ID}zqK9݋!+Hr)Zk_w f͇wq3{}_V$~n*fvz䦝[G].c7sd|m;ŕ0s!6,9TX@I<SL>N4ESx頄,ۨ?Ҙ. ydn8vvwSs@dp>Pئ5+Ό_oImˉ47lʪiN1僥hlxmI4PVXM   "js s!\*%sEڴa)Eʂ&O*n#+j ORͅ ;(5E ]Y6L$̥u{0o@k0SU0'Ч1PbV/(,*2A/C8=4XF~W'td6R-im&C[{8B>LౕGJgh#ɖR p&j\ SpF8f:5 z:Q?.0]l%]C )5RF\A͗aL$B$Xl 6^%IȂ E5RkΉ ?C+ DrGG~] V`C2IB ބD`xJV_u$b"^KM>wԌJ y4dӥ\)@XQ#YݲΜق`V~ '2FAddX`!R*A2߃AH;&WwzI ў3l dj2wQ/;(Lf(ńKSo⚹"\ryBj'gQv ."Z)m{mmc hK8 A*m!;!"KN0db+SιE@-qp}Ҟ.'z8;8g1-vD71޴e ]AH&. { |{{9!WS_ xDjk!P28me%-v#T` >;ϖlԥx KJڞhApd98Bb Ufy⮣FuE̠[99ZN<Ļ: ;waRCsDuŪL5#5 %(Ȗhi.ݖQ2BLUYea @ëR1)ރkd>Aڜ>by-O&>&pK֣Tx 8JP2wFNK8 SٔaV&|ƠLEDUL)BM}$*]$Q1pHBe@]‹oH*5~lӭ2ܗ%y̦"/]-m^LV2? [GT IWЀ_) ~.ݱԷ K ~hDYsPvg|L%#r پe!B{ӫJ?y-K- 5M2(JO3 [i=sf*,>)٬3s>p|TU>4+ZJ!'NeZFJl>,.6IJgsKe}w4H.][1aդ{t@I%DiIo3>)9ؓdZKt #CRƣ8'&럙h8 jƭS/!-AP]WJpL#{`I颿I4}QO&'H$bv[R_lkH=NSԄ3uSy}p+ʮzDďX $'`4шS\\vES:Tq'R{ 22w[{Oɺ$d-hLXޤiX`H (fb&C .w㊔v[t~\<ֽ-g|yj3ZZiB*0!ї[N,~|3هGK&kmۥ@7U孌>huqEAmI$A2v-@YQycH*?H*.ofvs|L\?x"T7 뫹5aRndP\]U!cWɘhTXr8d V؀>ɶ[$ґq01q^@e'1v?+ԣVؿ.pYu[D~a=a8O&w 2VOg א@b,("wŸ%u_tm5RaM>SrL=z]VQ \ը,KÑYXh8]Rq8EƤbV-G]}L^"B` _a.+l]瘝$˼-'ߏMީUjs3#a_uPIMnb- D0uyU_$P+'^"YiKțTȠôZ%F!./3x o;-ސkZICvEV8XX#bL$Ma|V?!M%0d4~w]E[,}$w{Io` CWr _9KH!o:kTF3)E`f4(%-UtDZxT~6YUȨh?gv^ZN'%ĩ7:gP1,T0NWKpAܴ 5a#kbLX|/'ŻVI"@XKƛ^?vQw#$%rcPTQGk:`\--iPD)f;ؖOpPmn.eLG{rd!prKYjx0C5Kh`XXE%!NC 7fFYW Q֊wgDiI&Ò% y()GV%:x]nejgr3.g$9C 6|r PO]Cmn@&Sqze-m̡㤂RӋwd%&|)X:0t [w:_p -W^KT7dEVbFB閂̶JfT0{OlWzEB >WXK2p1UӔ]1q;@Ny'+c o+Cꇆ&?YQIk$%NWSf 2Z#xu.$:5sB?K?HI,dymDTŴ"#Rl i @x#Yk)!%8K2vRqBoA(1s Pl`9 tݻ(K˽XWKO(tB:]ׇdf)!.n0M뢷&&{ȑT-p) V(ك 8EcA!qd*uW.5jFR#R1ZۍQ|D,C@ƁGkxZAT\N^V u5'](8U_CIő< ?"NYz# a%d N٥?eik#ޱE@l ~K0Px_uRAVaX_OlKmWe(@ՈlKOY|0nL2)b@ lxRwf^U\h9羯J^[,f­t7؝]* N.",QJٵ$tCM>|O<] ρ@q- x o@~LJ&dP3pZcMƙf֜Wr%|2>(JbFrP{j5\n `v-1ٴCA(  JB;z hjI_]G.1.bO*i#,щIL4G"_qJ?\ȋCV/;4A2ꕝf/JJ$ LdedftS[vO_-3"؉@7LezE i ˄QDoI2h38s+g $ 9H 6  8%~6Nf:CO_fj[k@ Ds`QgEBuܺ凖m?1߄%˥EO1t-R~ g)ϥK³zy}3Z˪BEU? BpHE.8sgrnZg %<);m "#EH*}kd PT]MU?$8U|)Ⰹؒ ,m; ~^ɀ!SC\ވn_6QV<6Xa] T=i64 j'Ea.ҠRC2B$襎PE>?#VAQQ .[Ȝؐl@gAF9J/zHLCFr!_༧1_/%,3W22:+D(/Q'Dp1#!P5ZU HJB99xeD>̓"Ss\ P^"Ҟ ϜazXt滸P7%+xNӁ o SA#~ځJdKeckˏdz7ؔ)̊65uڲh:e"]?F% NgF0Wo:暊=@[Ed+K%/>RkXAܱdص +^qxI3C)@f!|)䌗!+$\˪}e8Z]3~GPEI Q 'xЯ2>',ww6݈7JI@iisD'n{YRTo߅pGEG붷K0w y{ >c$(X5e+ZCU?z32S VzsiɌE\EC},QliCIT o#/+6(dPV-z`_̠!eDiZ\#ˊ,faL4l$4};n(n|}'FZ>jC$xtD`f0̞ NDXavP$|%-k(tF:ܪ1Jq rU<: DhxB/Pf`dXd4#jI̥}DJ$c&P!(Sҵ gT׶:WRW n[Tu旄K|"#E}eܗe%HCc̰SrWeʦ(añbtLʸ@9-X,C$A6E4_nWl1/(Ԧ/@> mtܺRQTeas9D;!ַȪ_E^)(r.0/R(;ӊ=?v!0!9Aِ6@ck>¿ H8u.aPΩ%7G7ލ /-k _"27>l[JGm\BIf.ab+D4("'%֯`Xy q|9d.OAb(L3NpCHH.l_BHWhMY+^#u,/W0l@$'eD,T [ 6HBB#M( ]kȬ)K-7,䌭my#QHSAIt =l {CA.V/@XП"S[=q0'DQ5M&q:'gY+Tl4CkLQc`ﯙ"\e-=e_:D@@D[Lv5+> `w>2e'$p-H5  4)e&ݿo]Q琓c fJmLfJ\i)J&RI~b~&: C F*< Y)l! Z'&۱A(wlC}6jZLL<]rBbB}q1Pn-h˧a~+[>d\jԹ⢤uρ5æD8#L] 'L+^Ck 'Qn`ɢH9@'KB dRB(M*(!"GO2R=zp'%m-[\ת{˦7@H>-Db&vxnA$A;짴m]*(O$ ꊉD3B]6Q!_;<1 c"+@\kkJffԶ#KAL CхQGﷅdKMPʚ.֍gǐ;EYANm BHxM#+63 (xb+*!%xx`ܗO*qLSp BS;!Ʉ&%2dLҎ~OE8R@dX3hU[l朚5@fFsMI5 Ԕ@Ύ=33Rȴ/wUmKÜg;=QMeH̜W! 4\N,(+ JRB̫*aݪMh!XjК>ܵE*^Q]NLSʄߴA@#bW/! "Q- D&- tW7="Z~'ƃDū䄔*H~=ܣMte}e߮S=j w}W˥!Say'7m ,J_[(M牠 zT& RLɹMYlk,ƩS`wtk,``Y8_ nЅX%m6" Ϡӗc.(bF F2)woJb.`oQk/Jw 3v4ze=nMFxb\!ɋ?O_ Eq&! 4RذДSM` n)R>píU2NOSj0+\BWAsT.l $RV!K`pL SKhPzHE]T{ =)-#ݓC1.[_F-n#h)XyASԌVYC._\_\v>NCPZ,^F$@2]W-ȲG2l2G*;ҡVHذ{zost 생=p$spÙ'M>[j4 JgQ/7d_IE?Vյj0(5(3R@G#maK*DVdA3e~q^jHpMytoK=65|Gtxw2VwX׮6翍HSbN~T?ř̯W@ IjS {*Q'U7`G24R){NXe8) :*-)MQD 5@)WʧSO8Օ&5Yp6R6UKjDzTI#T`!v[ cIkhuZ,!8%/=!_<돥"&@yw)vE!U5TRqBVo?:z3һvܮyLEw5> #B|ȟ)"g#E0]-nyT = .xi;aAWGZ[@}I.f !=]vttj\/? "P'Rh!'!AJ㡶{/AL [)J3N/" QjZc?:&42MP2));Y U/ |W Rr/Ui̡5$_s:3)*x֞=+,]%Zz1-G<@Zn]@ %JiY͍@ы/p( I ^{)ErG"DݤT|)xLUtrQY/XM;>=2U[ZQX>"$agֵȒgsD˯PڒtcKE6VѪW1!5vH%$"!B쭟E3Dmpj"&M'^Q} :}qM6 = @ZO1MپR DcR9nh7K]i.}5[s.ʟ7u?[k*`rʏMʡ**#^FD)d̼fP:۸^Wea0F*6aĖ\!YB6o'  i%/`UIGAz[_^zE=Liy#Zgoܥ }QPYyYD بXL!5Dv7C 7=BTi:J'c&27ÐFW}8gbsdaʼn_V*pW+92 DPI%!=T`mz;5o0aDj}QkI}_ l# P#$JcFǞHѳXĎzۗKÃ(C2SmcԺ[ 4}g_!^kIӡp]li1)$'=ҹt[olHųH9PѲL_jT"&\@cVy8!{G U/>.p 7PEQ= FeT'0QYlXW/HDi Zgz],h{ōu#*L ȲYZAP=%_`q~59+}[bph׊tu߀.'Eg [bTF% cKW̿,<&l$t%S5тU~~^_$Z@KrD\5$r~%7mX;ح94X+2=C6[VIt( cj&LtNpT8q^E5V $:]\pSWR;krz# :|y;=($B1)tQ 0m@1Մ K&=!A)h QZAS `Wư(J䌣Yi:31Sc$+ ̠W-fUa!R7إLҧU< {~উnѡ3fv3tC`Z&t*okoƄ`)vͩBB,rj[LxUYssg›(t̅Kr+LzZk(H\YȱV7 ,!<1>{ssJ)ɬ/*mQQ0DɪR43PINEJ~v`Q,>IC5gл;?X0, #Q]%t0 HMF'EmzeV +okNr`Dɕ9M0#%r~ >%Ik]viJa3.VE<o7k!FxөYf} -8Z; dr.79u4TSL}oRF\@f":4‚yq*qS];9P{q 5ѭ}eCߞ !}l9AK7GAX*ܴ & 58Pe T7$SwAByWmm;߼֪[ pX܊)\8T..aG> na@!0(Zvl.!#fP/:fm hD`pxFEV+ph O+&&gB° a!+E&/p1| bŗa|o(֒%y'0Ұ-g x'1P2M-pIx,@Xh3F\ߥhI}ZHcm k$WD]SEX4UMeiBM ~1CDK|~jS@ʽ> & ETF %s؄DZ`OˢNB &nEjpUD"mN 4lG%\5KB~ M X5k73_.ϟf"-9ېBύwRy"o/3nR4DJkaB2+U,A{e~љlOdN;l [b'i(>Ō^ ]M=e8U3{gf0 ni`5O@%n֤Q&pʼZEWut?Z.#ygEDP o}G9S jg+ otһQ|`]EJ mq3YVḆcU6Cq|^BnR'ii_i_I2ږ#dR3/%-?t4(G웟P[Ȟv:p1ш?JwinC; -W0 [^+ 9+KTq+L;I5V\L~[-R h=$ԋ 9IIЫ20KNҴb^˚qI9^OuW?D*Sa@"+ jzb)TR0a"5zTҝ ٫xYr)'uزG8JFȀ?X[UÝ%èPqDU_קqlҗɠ6 ćsKNL{yaFQښzUoP ERٖ騳*]O_^si~ZZa`k8jO+UzHh7uFMr % >JYɸQQA lFdzvzhїizaĨ*xd c<='Q4kg*#3 t+Fj3+\? ɘoLg??l?oP])4p$YfK-݈=ˣ%~tA~>PvISm5-L17tCt̝IOp85i[d',7b 4\H'2Ut(W ƼkKe! 6N :Ԕ$O z ~@֤p]e^>_~DDE➂,8csjOv̱<&6VfDˀae_)/&GevdL@zyCơI 5X`4{4k4tNн2!D̎BdG^7@.tVfJX&+ϴ noNU_$^\4*jjLDN2Ķk!>MV8#'jeɔ 4|3QQ9+i&5{ErѺ7 )2,".;yz9P}P07XG j##Z!/)G&p.uZ3p91zd$ $t."*qԺdz@m|8`r$*&e4ڌa/oK],{+Ot|?!TCw1*lV{Gu0SHmhVcb˞*a,"ZwɼjLaW7S£FϵKpqt?6nwY#FY?RMBMYE &qw}UW DmBd y6H&<#Z5*WNVqV{<6FzX?­b`m*IwC%M F^pؒJ<5ʃur-*ބp=$GCW{icmZ!͛HL{qԀ`f'|Z"!\ލ@"yb7%xK4>;[#؞nJ EK^|ڶ 35RN#?}b ?0<2DWDTX $ VLLJ" /|ĸ&0:eMQlz1r0y=8|P$<;a{q(DȠ;=lЖ`qa p5-eAG/D׀_3z}`BIKGNZsE|>k/F*!a4wgm$Y鐌,tQ3L0Kݻ'ֲIE)4>32 S4I%!n;#síg4_6orVݪօNUEfJk4 8}]t, #:&Ղ}Jx2`Q\OPȪk33-x#SY/¼_zU:XDs[$)PS{=/3]MHl mK0E =B ?eN0sH,\F?&lߗxK$@!^B(~Hc-Y;W ,b[QxV}Jb=S-˜+ۧ h˕ٞj!6_䖉2{U]#]{S6wWvޏbHUvSˏ3}ކMmXfV,Sljcw7"9(ML/Q<{,BQ$j^XLQݧR&T:r*$qȉ'~@.qaH41gw"jfxK+hQQ dzH=m f* 嗉YFu3%ʁ#N@g|Y>測m !zUj%uӝYd{B;/dYμon]:ӋIȃa׉ jmW k1<tG r(滛1ܗNx)( 񽕒k]Tܼ 8zH-fٙ6l\J8YܗN2zGմׄ<3U͵O #,6+$j oyI@:?$~cwRU^;Fޥ(?%'`w7:@gG [S`qFG-eG|hC $mU CH'[Hf'튱)1!&F >.'5neo%Z" KmUg)#мIFVfW":W7, MSZ2̫0W˜7ػG! 8rjA䛅^AxY%s{T1 )+)N+EV%LYBӔ<ἵfRb9ą^|d ZDͦlNJʱqI]r ڄ3k~c4/0AlLu2nc2e|e)bNB卿BM`qbc;!yEnnٖjboѶ@ ?e.#]H֩Bj~V7Uq*DҐhA vx {(%x*ުtwWs /˱)'>t4RA "|0^!~CGo9`GucnLrNrm$Y2~q*ES )st>X))6|xѻ^WZ #1*8n@DL i}AtBP7%TooѶ!.*U3HQQ,*+[[+7V#i,/k/"N RE+ns6ơ;7V[n,n) ,rYKCF|yG,D>C8%j4n|@<7m'I$obIM"*TMv}gk[HQzMDdj>}8-C!U$4]~ßCU$qL`S&jGn_G|4$I7;f6)WOY1Wns)eB,BpgNA%Zv1'o&Ye ۛ[+q̂kV4K0RvR%B'88ۈdՒaNx8hJ1 /fXbLQ™?::Ӓ(@ëV9ْ|NLNg%*aOmstzOO6 ,NLJN_퉟}u#K'>4#ԸI+L3QJN o~DlfaXG#H MNH!@Ú*خ3ZJ=L50G ;gmR93uͳmi ZPh)12_sʗ|oܖB[~pܯՉWS<.u:S:z):z.!= ~%&H9 $Pj,Њ۟pR^W8|e* ic[uqq' sdL_M\Sѓu54j,$]Qkn"2d "R)ZlC2jo- cmI5 "DS Q J"h&s ${r\V]:0 cvEdiyqOGSAɾdJX]YmyG1/ȴy1Ď~o%̒E92~i.>nõZY~p };tJcՃУucKVle"jÎzOoM *` &G,kFfė Pк[ea!3b"9†w&T[!#*+"vE𥵹W w0(AQ,O|J(g+XvkRox;NXMa15h`E^$H}jI<:PuOT+͝|MFwCѵ-!(?]̦WKgZ^cUYc}06uF\Tǥ$i{n[ݜ!=8Z4# ](rb‹It"`^ sraz+ɋX_^KԤLv1G`-ͻaFJm.둋zVOVtHP>3d^#H^{A)J 5V&L)B5Q\ A TMJ3bH`M7DMgPw#k!\!gpГy6yu[;2 =v!'2ֳڱ9?mmvYu}R8a-aPexg$jke!!MID BmԊK2*싲=op)!eͺbݣtpD [./VkqC~6u3do&V㿟r[7ph4cߗ:V.4$ZFq.{F8b\VR4APC9c0D6HN2*IC49FS7(NW؉ EY^_2 LGe 59lexCk(AB9>-Z@gS!k 81pԙ/,.ÚzjCE.ZRy/Eԫ}FJ=OͲD\Q0~ 1DE%@`l~\JD]k |3EhuOW]"{6v"1gjMV~ px1 $q{v$$nzR\qd6Si|D+<" duIO" i.s0 # /ЎIA;菢t;Ŋjx,}WdM哖7~kCCd_q!1@@.8$KgL& @ t~:#>.R?d SW NEIB)'۪qOJR⺐蚅Hz2#^T>Zخmb=&u(ܰ#v_dk{pZuk|A &;6%+_gdFqd|UW V3.z?-1uʈz{ 3ENŠ"\7YNr0KDE)4l{@XNGf/B C֡iϞxM 6IVڊSq322b j7r[ O(;$C$|4 Ogy\n GgS )NX8Yf >ͽ54YELJfV12F/7{1*X 7u$IF[>?1V|F9&-69'BIʘE/2|n%v0e 7Oc&ݼ,<3#D(}jb.#(3cg.I(gk.MhJ"}i"Dژ{hsY#"byD#]t Vĕah&rdfX_N[6[<`Bx)-[Y*Kov$sMByѯSJAfwJGOo8#vV,hN+^zy @dJ\ܿ=oq?j@L&8D45JIςDJU;Zj@]uqrղ^^_oϱ+p'%Y:ž_6 $zXȦx}E4D:YAq%;H"בiD&2IqVTQͶ)3z`+5Dѯ $y3 4Yl?m R{J?$#7,'X`f}'?=$NwǂJ(黎c~ - XpՇ/%I{'Q%Ee ĮML!W2Yz9Bksi e>Vf"6B;"~CjmdVMi#oWUc?,͖}PI^"UYdT8uQȦ'ac](}݆ZvHxIuƤ#3Chڜ^DLU[dBX]èk8.?޸=28x3~M/19ai6, $A6Q/l /꼷Ak+kbj] ?CҤߦX9ǦEbܵ "lfziIsPI%RND"՝47ڲ.#'Uim;쯴ӗʴ<$\f)jX#t/9$0 r~`LjHZ/2ۓh4~ErX:|q.JX`X'" -;:] $$)y(AVҊkB'ڕXTF^l r %'K2$ H3_#{ :D"6-NK,_ƨ=*Z;Q A4J&.8-0MvZJ{E U( (^:PXNZDܒ܎ ,(fV`)*-{raOPH9,`@>"2$xM3>h!u! +>d礹s v$'OUCT&GR o+P;"v}EfnQ1+C;Qt!!anAf7JҦҲ:eAUr y)U(#G[]?B3cq2#f`5,d4sp+%ŗ,ƍ Yۋ9gJlaS'S41fsvTe#~}4 7h, ʊsqGA1`:.})@- T)ë VO.99 )UɛiA\r-SdVynj6|iAHXD bR@"GG4UD-ӕ*1\HhbA(C-Ȃ(QSЬl?1P~8u֗޲k !&ɘfP7U "zv&׸vPWI$*QKv܄CX\Y2sn3K? l>9 vkIB(^=m\槔urB ~"|c&Y+R8Z>{ǭh9s2;Pؽ @h$I<Sm/Qzmȉp6BԞ\Sܞ܏E!ĂXsL%fwm,{8L%hWrC .{u#g TZxIȊn &ق,ߜ؝\F]mQB3YZQTERH1G:;|j Y=?EqY.R콑D)eXӘchA2u@t#P(M‹VWXڹB1i(El#(t8$PdFCDn^+.@ӧٯGr 0ؙ-G&G+upS)I<*pu@-呧SrIAE7 >#_MǫRM81pɾܙȄePYCf_I֏R!K̎/tã+Nah6 vb}!89!3} 06Q{@աޮ8[{:^Gk]N؟xX%dc"EbV eQ/Ӓ"MB6-myiW:.#2/N7#kOP״q5_ 2.!yî޳(%1m HFE)2ڟ88#Eغn+ ³牸RA'X+3E)HY7Rz&@|9 vǡ*ܪh`CCm4to8N & h1p#?-6/hDahQ\ vC_0=ft{!ybEm̶beɴ(%KAі:ebLՙ]KjH؂޸ 1S^agJLazR:-8~UV%a*b=)Jbr.~raC 5Q%n_JoAKثw E>6[ a1EK˪ӑfܔR J;M<>"SRuKsp,nW+c-dCq\XD#4w'<LU%·Z-m=q,D7Fl`Ǐ'nBk(㛡SHOxN4,ٯ0R Nt],Ϫ({F7RvóLiŸȓw]YmD{Y1#q!5՛OQŅHRJim-xcoHq*#t1XZm~_̰YOoH(Ӂi4 зX›5biCC=$N@оLaXc/{Llr:KߑsHύ]c$O9cM4|2ѢoC.Lg㥔`9b-[|vD[#-.d\ jMZ$$rUz;U.[ p~1V6H<%WLq bzmͧ84 US d̈́70¨ ffŌb`n}GʖX̌{Q,1C ?4#]9⋥ V]̔F\wo~!*"$(.ǽ͈%ɂf$4CңYRN`Ih1`0;ҁp΁~'ɖGV`|a=tVߞH޾ k %C&$T HOM93k%*6'k"MT!zGeJMZL|'#v eM4N>gK[` vƾ%39CT;sQA7q+jcHE%FӌcE@C&T1[e~rphQهTmR"gݐnS%YS Lʺ_U͑`N %aF6|[7i[Z;'RLMʑB0hEu$gif硹&O81[@:l+!;?te$z2ǜ`hnby;C:;ʵZd~XH;UuAx$5*{_:#]š)cK[c_Sa9ʂ ե0D~"%) 7%P'wCSD Uv0FA=""B;"A?yb&6HtbώLǡsMRSBa{,FD&j-N*΄(IB#PQ@nl Sfj0%Q[!+Z6vMF3b+-lî"LH+>ih{sފTp$M),%ǂSM'9d.җ*TA#6-i)es-#f2ژ톗,f!{ZH3'+pR#4p)*hPŞ)9^k)c&( +h`P Z[B?N\y`ǵ؛ Mߥ4.lJNđ7K{51`:9MHAX}|_*$f&,3k:~c/ķŦJ?{DAc=U-R6W% f/"B(-Ur"h؞cŘ RN`+W?6%"z9DᑴZ2#5jOVJbe- v)yftj|{ g\6)#y É]fCơl6C묉j% b2\eb&OQ vtZp."z7-CD9=wtkթtʶvyK1xYuX!+l5.#]k& m:6 \p2Ͱ2;X,P=n,NaN7~1 A+$\640BKIzu}obHKQIu.qOLacڬEeRE:xAD7*H] 9('Njhu&bM6w7fƌ5ąH AYYM2G8z/c ʻʌ"ٱ%luf3hX( WК&^J{mwAI >)C+< XJR.%|U_SWCJ>Z@'Oq+6~Qi-\!-\xE^ӺmE^rxG2 ɮ} .fHȏY)guxa'-kEגBpG2Z#?tI.eL6O\ݬMHrKF|m5CS,ZtFUwr}`ZmęjZUz C%t5ҡAI,- z3~#%F5`;¨c-sBze=z5wzW-f r|7nàXH4М$¤lep?3B>I0] `>´ݮ"|6J= g&9/.ط !,c4B'q}NqI 8Ԧ`mIL ^4&٨Qf$Wy ԓt7~"УLܶų$b";> Zuu =9an.ci X`U|Kz6cz|bҐAF "+cG-PPeL!cQ6(ÜuB@ PQ!ɠ޾ArZcpyDbִvd%BN%ݒ_iqZ\$ALaB8^uL4S QYKt'@{&n~^ V^E2*H*t4D.]q[$$:FjY +cn$'.%K:e$"|*H؏+yD7ChJj$3 *qV}Feu=.Z"2 nC>G@ÔleR iaX."wO]q9X҆)DTظ7dLPށiՃMZk sk `ITNJe2XS#`3[@;E -&FŻLwKxw &_\9`S50DfwGU&ν~{IH7zZ :K-5٧hQC?ۮ-d@Bt.v̺7x(WQWg9B_ R na5В:WƢF䦓 D8Y01J}0oR!kѺn ]k\N"W}5J||9`roJ[<4)x EM~z[014xE8u7}YSԐ|@#1%#%ꤽpíU0ڸ]=9 V8BWm1r:Hn]²jMhīp||p;;)S_Swa0R;cx%o%0}M9YZqg~rJ[Hk eWM" e l}G$)~K7 4_˂mI -]C֤m/!z \g@f+ݾ~s'"> ELE$B!ՊQQ':Z^o+X=yl8^-Tr Or}g|(^uFn~E#ZPa{M 1Ɋm5DLB rԕrf]͎B( =3~'ZTYe`WqD(RF69:F$P:b1 tZcUҪD2|Sр0vq)WMhbbp,7~Xবl eI.guzcr;:[0Hd7q+6Ra A'j~}*Wq(%k@K\j£.YX w+Gh26̹>bi`DVA9 Kd@şٹҗGАlf^8$A_tՇvϰBy2y]4?̘2?TgFa E+>x.(dz-V`NPG+8l)pSEv5J=v nr+ t6#3`cX ! /!Pnr'H5$S=k1)|,Т`%l9!?O%gTi6_$B|Ÿkr:@@'q,$ ߿ IBT?7{t\&'M=YFΌKǮaXk6^T8a >#loM 1k8@J $WHnG!?S,#dCBB)ex)= 1ZkU3UEbH+\%xtBԾP&uk~˕/ks\!2ƨ;`qjJNFd|B|$D]D+.ic cg$s؁g4S+[O0+IyI hX6_ݾVMCW +Zs*ar:;|ˀ#j},(VSs{򸙼ޜ@'Q/CmK,-(N0B Cf:+GG6R2pr'[Ů|(NKeϿt#$PDy -&{F @ܫgi% M=Kuk=z w- B܆_gz^AS6S)9۩=D"W*%,]фWM!AHt G`zU̎;@ȣ2չ6uOw%?!\i&G.uft~6qC,'d:fh̽{0B0~ֳ93N˯|t kHl**͖[4j6L>Q*P\܎vdPQ:lca O7C!2C_#{ɘX8|KfuכI +nb0"b)3Qiz' ``¬CxaC7Lς‹?nE7c}kL""%dݡ2v a.|7uxfK2I*q! Scl.X*jJ:4J9ݓ,AZח7[;/LEYOHWtQ76vz{,NW!dҿ>>Os[蕾f{}\hDOB#] -#G#v$ X3")htJ6mckJ3O}w R}rͰ<#RjdTʘq:'z;'DRKc:-LC`rdұDp]8SA}}RgN> e?ΓN,[m:%N1q)Ewo˭g"EhRU"X.3 _74CB<@z6!0򔢄 v['Wi}U '#9s-/OpD`#Ҩ_Jwf|쾢{m.Y5auM,TbL%>q"P31s)?O꧕A v 20ii[rں}o^;N8Wd}%gD&+Ma7S/X@riY ~|ݼ'qIv;#K YȮ< -:^;$1 n(A \wY!P{8981WTfc=zpkB<iڜਗ;줩j-"@LA9Pno 7K4Oy3_CH3wJ4KNTVFp no ho{(+B<)MAq1M?)CMYv̶ⴜ\s xR8Yz@xIj;J*]f? . WzK˕Ob8+Da+C\2#8)ea]閭B$ޑZxnaL°#KXr/f e9XDe%r(5S}¦6z׆8(E,RS?єmIO)i+EYvtڂ0Jù"ҏY秝c ը"vD"Q xmqZE3ys.BܬջBY_'^rMO-M:=ŧ.CdPE:!oD.jr] 4r҆-agхqRa#+,cϾMZ^T]TvI[Tld.jX :<}hZ-u:5FR-WX4kb# jAbut?jMzhNzzXCE$ȑ'fVuQ6)PPA(7/=G| i:8R9Cy),lO;n-XCV!+R0*S'޶N{&XDrLj[;#礌R V0,9_FF kIE"/$UEұ㓀M-cW=x"` ׇ&S-&>3)2 ͓3z#VʮFRn>Lb:7^vZ ɰ ThHe.]i].;Z] 5㫯"GյrH& Y?21wIA?Aړ˜q 6${eLu6@_77>dd^ZqLq "ϫKRv굙v%=D7ۆEnI<ǡͣ aɯy"0}'PӇsH7}gBrLf,@ɘaT?/)D9?ÖVÓyӑQ!z`cR+TakLʈ 7>r/QJquu!GV7'q?zmicf6 F`42Q Ǚ?1E oH ?$8)ɧ∈5uB@~zXp]V%ovVU'=V*?aRT%(9ɹG&E+ak9RUxPz1]6jAѼDKRxu S"oi&)mHrOc .) JG51A(xKXXe')V~_`dhD=ͯUNTZdXW,ej˭ \*&EҜ8=?2#& $<2eذ JU7(H{h۫PbPudʞ n3=O€u_~FHBQ=s9n;<ں!M*e@z E N =cJ9QDKa^pC৐"#L0QHaKT;4؍6@di/zƷ(K+ӖUޓ/3$qso1EǏ.}MV1E)eTŧLWH(BpDv NTj ,f)F|mH9Z)<&a#R zm+&l׫$YMg6ڜ)f`;Z[ pq 뷅'(z>Μ)Y[KbRFHF{w/T ߚڋ;1m_~̅P.n}ykNAzmMB #d2дInF6rF 9V_|XߖE}~'ƾr a}rIJZOҴT({}+ċѳϕ.US+gK~R? o`hAfGDSY6BŖGr] v)-r?hx98KUD4 i[,BJWф7cFblDD $wm*]KTL:g(hSMtz=EYr:I.5ePxQTZs>sA'em.uVEmV%S1Ҳ-4[p)\:EZWڎ&0EI2Mn'\]}. htK܃SVtjoG wtZ jL"U!,'Pcpo|+.DծΙ .*|O҃)ܠzD T3c4nNXibT߷KY]:;`.V"t%PNzur“ÌO,ͿԪ?4X=!Zo_l)Hj:2ԉ>x)p@dcMhJ0ڷmqG3.ͮcQNh giT^L2Nu&IpYc\v.x(U8f;ILV\JҫW\ݒn?C`e/%Dc)|I;YƂ +z']̲&DvA?4 `b' ȨP5>r][Y%Y ʚUڣIمWOpo9sSɏ&#yGIyC"mC6'Mhg䝸i|s{q*x($B{"}F>x(]EvY8ffMš*V6) `ԪPoLliuꃨ6ʡ~Ȗ(G(%e\e v#a޾3UYn鯌~,oFq2>?a5'n񴪡/JsSVň/#A6,U߻/:dHUeQ+[žLoX'S2Nn\J i!'4PGxκ!mt×"kTDOUؤN}k)v)= kD"ȏ Dt\-PMo"N,|7jI% mZbU QhR'k%8Ͳm\Ww@}hyQ%Ab3]kX,ULwzdom65BY+Pk.Eb'nxUGm=*yh[$9lQ~xӵD E&'rݤR"1 nZG-XE "Fu˻IسW"AmV;D@ %)%ՔD%թȉ3QFJ⴦S-ihReMf_M$ ސi)Ig`fF,I> ': O!¡,&窉%j?  vTv+o|ޣh EvvGDfD_qDYA)ŠN4!KWսt#-];j^P|Gxu˵Q8kER!b*\fx1䝪q{3:AJdI};#pV(i,IQ,w R;K2\N=vRt)e)^m:aUrR`FeC/c1v `~fp#< iLm!2&\ g0i_ߺj]թ7qR$2 Ds"醈,Iql!eN~[+'KXP y#,n2@?#' 㦣2(QDrB`p3Xi^]U&pM{DHʨDJ4ާHBߢ*a=hУ%2ot|)5(jq&6|R#ޘez"觚WSLHg h2> Swj`-b\7Z+I> RL~XH~r2paIT˦XAW\=)Τ;E0'.èrgRAeV%/֓$!ikRhF(.tW,<b$5_n'Ozz{hI@PXerVz#m"Ix0U, # F@Rf1`lTbPe$%TѳTW$Zj8QUol (U}s'xroU[zy]ak[ӒY"PVN~zaM A/K D91yU;ȣ. c#bA0.qA $(/1: 56SK_hr37!fK//Sf#%k^̃%Z#k'? 5?荜bvC'$$_œnCTvtexO IIbJ1j^YvD Qq@X JQDBRܫzǓ(\,z|$Cg?شa_)%4U?] L|@[瘮gVΝ$b>x7EI=Mo J+ԭ#rx{N'IF3!&s M-k3'x+cRxcIm-5:SI#z&d2{t\˅ V5 hѢ̶u3D^ oG}"<[Ķ DRפ1U4)$uL(u6C]b7Ql4x ^gZEO۟oo/Կ/kR[Z c0tȱpA3 ȑ6"~SxU 4R'nb qd6%}ұ]=chw2 ';?=TnSW`.AF 0T*qpIC>jlEFL3J]Bf_^K ZST},Vb<'X n<9*t_1ƩռS[Pv{R/ ? (%U!cR` =Xۖf>3d}z`LRlwsyE^t[gMZ~^oTN['R5i"la" =TaE"SYS,!?l>vc7)Fي=G@iFab]i`ĕ`} / ׽OD|洏*?fؼHb}Mè,/&".4ة]Lik! āC-e>U!|\9 cZ=w]mRb ȘMnUL*aaC?8+?QP%oe)\m,\~R"UU"ו XDpuTV2 ̤M&:=Ǣg%VxbW(E ( JfEz.p>bs`o(-f h9 VNpj YKiY*!mOT!w@{A߸AT,`a+õxI^g9amSHiX vFȐ.Df/sʪ;IZz#+ܐ: LKEDUN g^:=սI- zPE1 Jk ;A=}3YG)!dfGT)pQ7,[1E o"5 9Ґ7[x꿱5HR뫿Ga4yFUÙͩ.R7]I!fiZXT>+B):~o%XϼsI#獕0V{C:X+np4U~|Wķ{gCxh}P:.3Qs 6&N n܅NꥥT*"̚¶\%=0+tܣ^5+ݤ.6|& Ԣ'Rl`˗JME5eDc^HczNy'[0ҁ'}/S5&3ЃB., $δ9 HUg.tK |4dw{$LC$y$␚:L(N"0$>ȕi &!6$vEEC!#I}?H΄3D`l^hd!mAgGfP \ P|1/zo ">^=SL-kV*zܺiqFXw_._[>ūY@zsXb,>yW."P cE6͋ k%As+ 4{co&EQ|Òn*|7f 82/p +RV̘hcS/~GRE$t":=ӱ_ Nfg2b0܉k05l.y6",5XA#CuDJ&?+ cX$Wt'i6).R4d2L(!6w1YYԒqhÜ ƁqqFX׻ |i.jJ7aF#Hz?W)Qcm?nZM}v&WV"ܭęޭMZ&rPӦ NPڠ*p8 Wuelv FۺrQJa"L6?eɃoLKGq O"~T*:FT:Eֽ.} 7 Zd8W,a43זd8 &4ՁjH쟒[קfZE.D:~Z?vLvS= #DBkV;Rf`E:#7nG.0W&gSvj^TWm~1qe2{ Si;ء#h,%sD@Tz(B)n(['nlT ۨΛ}joIrLO0ϭ?$C!)5$ve $dmګH/-߻.J/ fr2IFQ=lcXYu~lӵX +̻a_!:|Ub}IQ5֮nv3bF=(leˍ:&m)GYR"Aյ*jvueWbvyuiNL9% W%O}.?x$7w7cL/LH,^2X간;* 8o8ƹ ]RI('9WŐH#vXbhPTz{uq%5d'\@޶Ztbڶw$(b6Locڞ2|d=K"Y.:|ehO~?nJҌc0E:ucegd쎵$? K6 ޹je  \(Bk_TjGDJ$%3|+^VFK?G\8!j&_2 Z_/0&Y' 8~ȤVβR3L/GHYPusӫȪDӔ;̊{XK3rEݏ/_%nxRebz!Eׄw5wי#ɟNG҆(zco\q\ѼC#,/(Ytz “M oWf^3z{QμcN9Fa88⹐RI)faămfJFQO6?T}q s5HK! $KmWQȏb(I ផxtB*( YYbӦ(kPK)3@\4S *WӮ,.pY[oAHn,lʷuLp]NRi:%BTʆ_I=Az#LqTlE7%͏iOh  i3vڣ-IUCd&lcAGsUV0/< 9lvIj a2BTqt& 5AkI`Aj扨.O,+qX)2]lU$ -(ݴ)zDF3 F5pN]N\Dv:L1/8bqBPpDkk_Ƃ5JV*t].uq#lCc C:qmnƝ3iظ6(H}n1߱b ן,cLTJ#TD ɋQsج]bODl)$}Gvқ Xk+ W %‹6ľmbjdQtXDKvj\u: k+Qimݛ$3gPP'hwoS:J( ׯ R*ȁumi|dWQ[=l UFWJJ& \SƅkRU!ns )7Wҍ xX?Bgc ,|$CVǤz* 3v(%&=<2J@FsOPpJQv> tMY M nV0`E@]n._#cK@ FjQgX}℗x4U'cC.IeWB#rur(DЁ_$5ew=෰@zzhu9@?x^ު($ݸt4tcwps|?IY(N à 63d3oD"!. DkUn3XX"-q߆ j6(sӼ̲r !K6H/ŋJiZs"{I /Pm^\dA5Į6 _R;Bܠ\Cg8Q<e'dwh }/8ի'|fWQ":}+ &P2d:zR5(Y^+3UG\BMۀ}BXZɛTƦ/:x˨pȚƚ_|1S~ grVRx&G~Pd Vq*\.Fb$y /PEB\h:ڻ_FYwEQ !- J͊ޑ03[MJ,#^SX@!E`6DG#DjXB0k"ypZ|5{)7-׻ 8(DV ~w!=̢#?dE9҇89.vdV߼kQ/y"$`4d(Dw91_-JД!,S@ #GR ?*6 Rh 1G TB0tkikqp Z%UA] jEȠDpp3&N7Iֆ\3^lBl e0d, 2eCl.0B4&hn{@Z玨 b.ZGl9<.\J#F崄WS%dk dC!6q%p0\ќNO#$a`J!Xa:ɻ8ʣX\y[IT'(pMev2D|š1 Ԧpm͒RNȸjR=* "GO!lFm&ʪ!>HLwڕOdݢ5]e mgXQ(T\@G^}.Ǩn%w/\s &&;-t 3_Yt#b b%kr]ieNzp!D9w=RDF1KOI*J=}j2x|֧~ ,XB"E)*^m @Y9(OI|%!qE&_P$߄P:Ŷ iYkc^7@`ďBX+t@_Fbq.&z~(̌RrTg;HЊvTc_ogȄSl O)f@j4jT !ԧo6FJ .8~&mN3eQNW E15kGoztT-vE"}ۖmrПɸmy$X`#\Ӛm#Q}v* :8`| ?% Ծ@SMLvYV_h^CL%n ],AgWסtpћ +ƪbVgHf~7⻍N!I/k%7`avY! :"<4 , xF=eG4IHWPsIh?((qy:XELvoќ+J*PY@FI7)HDoc wRc7kcTcBnYDcS /]{to/⨺HꞖƻ.,@AV|aG]'آl ww{ f <6ZPk2PM.~NxVP4D$bPQ?&A dlSSLK5}l`tEω?Kd`}x !eO N/8WI.k<[Xs:g'fnxjc9T3tm$?R;IKk)X){?F{qy< fd''=M&`.qQӯ^ =(@P=UDS;BY'"y[ h6o4Q M$"1߻?#b#@u!NḠĂ̫A|~2;`1\2/=%.в*|s#D%P 6\׃ژ#E 6yeԿڵ!؁(>q-Hv=eIܯI}yЉFӕc՚pM:<_"w'/,)q~,g"ΜH[/ӵ$9鰏]RBT2oQ]d]˸aAiO`WbH0M3GLu) fr1[<(TCY]3F" N3Xqv  RVwtuR/b*,∊|A‚)7!uPV !(A+u/iȤqIaMG %QODpFM")A 7jܒiB5WI$IӺFťܗ2.k\.#saz`mU im].l{dY3 @Q:?yaG-BU䢢\es7>XKڏvEa%aUE4Z5B$*Ɨ6[p36Π-ȏ K-A)oѫI^IGhlfQ+ +FOW9Q.ry'fQ\OBDNhZFDB =p$%sbגoj=۵ݭ}`c\+C_jGNyP +e' H/_ 1fMG7.R+1,Vm-; 6 *SUr8cQƻ!:N˫03Z67x(4fNi{ݼ'7S?km#N1Q&T ҡTL@v/c몣ǠijgI= > \YȄNO0C\+;3!fbϦo4R0/BYYGrb+t+SMx o z>kʠL fsAXI"{s]}gQɿf5 }2Lic5QWx ^E}JZmjbvR4Kd) p&z/%1ܳhGɰ 7U@=K.]vq'wQ8Ӆi7-6wƴ$!BXLWL[pe8jG'[" 8B &("1j%z oNzв.F.;lM M'W@ܣƚ1,z*,ʼn֔*H&=3(Rq.-ޢSS,vϻ7ۓ"2PP[%cVyw!Za Uy3ēHy4ko݇ ݸ[" jn묗i. ]*d*‡]fH%kek%:#%iQ`Kbj슆ҩ{[LuVXqRh*evs93 հcx}Jw9gIf |ԩ"J++czN6J?a kOI5%)%F< d=M| +I2:ߡ$,IǛT._] I%l϶:֓C?2[?Fq aRn: xYKpDµFa IfIN*"+:ۚWe:'uReyzq-+ Lw)#5L8 II]ީUO{x|MJ;>]Gb ˿³;;6RDיRU13}k" GFMbuMt ,Ӭ>Z4~5>G;䠎+elg,'id7K] KgȿUJaSG|er;}Csmg6xGğ szD0 =~.0W~#{ltse($)'WZ;a95 IQWf^K4SR̳?a{>AHjJF߫62됓U}c|e"4B')fÔuKPc^x jazU^ARprfsܥ*bLO"]T$!끅 Nڳ 6%ҷ9!y Q|'=(F5# 3lx6‰cωo]V⬱ m!@j/@ru땢j~PfD\XҢ(0Q[ {sJ+ LrjFHx`ui0%hӉ̝*C]OT W^' @g/[ {0Qӽ'hBJ!l .񚰢`+-f-(+F{s Dzu@q.[4|]FٷX7igpq(f @BN_ضRf /e؍"1ÂX]!CfR]e~:`<%F)B둧'`'rkF^5̜f"ҳn#? bt 5Zw*nboNFiwQm(K,B^QԤ+NK>(j`t@<4v(^+ [l5%Crr,y<֎-Ξ1BsqehB`]0P={>`TbIJdѥDw$ x$mMȃ;A:I.MӧkC S0g*Gϴ4|_uǐƹaB~ 8+951ԍjKpN|f zo EGjU p$E}\nj5ZTL(BxLjD |\Z6j:-:ī` a5SHHtMm2"!B% %.Ks1>A*:i8QW )}w!~,҆ei埊)bŐ4h jPչ,o;+?03r~cA[ ҭA8@Dj!Cd x#:(=P*Wfkf}W 8iuw.cʯöخ43tf O.iv`Zu3쬅.)RLϟQJ)xX`w8GBt"ILz:͖]@&'XTgŠDTA-%+kiٔsdO$fǖC$6nR'THɤeR/· ([9竩cq o0JSEQl;('D7J?T} kTi+\->&<}A^Y$qZ,pQYehL*A]1.\,Xϴr'RBkKԼRs6ZBs/ wis/}`7t~B{&Y7@V2tڲ.0 ql  ,a .XiaU xy1oX> %Oz}'Jbum KB Yv)/WFjkxK. o,َh^NUڴxel4~y-n=M e#Cd(l{)/zɦZ,BYph6ۤeo-"e\QlX.tX"\k"2ݗ;I!ֺAO/mNc慯faGXK!Ww{Tͷq61̑65@EB烹!7\_wf"nG A yZC&tX(!nm !NIn/HP)7Qn\?ʾV4r(KJ QhML6@ ҃1*ٞUPAFq~,F܄̞-&];lBb*/HT4I$Gѷ\=?ڿh U睠nO٨ˆo9Ğy();.X;rzr8ʼn[(ae\XVbT/[o)\9SSV\^~g6[=]Z (H*U?S N aiBK>g3C9E!uy1/ͽR|dCTZsIB`;;@ƃ /*BG&SlBd( gPy9购`b f rA+zKAJIju^J&S(,6?ⲷ6PЄ4X;OYU 4|HY "5j?*ZKqlk,r&v3Y.wcҪH+H@@ҽYP:Ŏ `l`ܓ3O%[4hVi(b(]-UН S1;lB9bkkK(e`2.DGE0DD2/e!+]G^Ev%'鄍ޤ'#1/ d('eŸ=7zR\ 81ؼmSANQdf)#Rɑ"g< >_;fK`6Eb$9ZGk8ޒ#W5HZL\\% ְE Yv-pM )9qٝO8LFjP]u+JƳ ȓFM̳Cetô2JWQrP&EVIT̢T̺d>mE l_R4%Cudi#ۉ-tg0^C(u'PCA$Om!­9T) הܲR~l3HvUG*d*RRxYKUWЩTͲަ/x$}`*Gjw_f[zם_洢k Lԟ 2 ›`XZ2^FJzw w-y1(Ȩ'ٯ, 8G_,h/ȒL&P-DWKo<2 (fLIH|0::azk~|FxFu0:YM 0%*WCI{!Nxbk8wy*em:uG-N_) 2ɴ:r!;w8YeBlWjtEFJDMbԪ͍tBjfQxIP{y &GǮ{ 3q)+C]2k:W SRiK)xBj/qE"Jg $ xl8CG_]SI`HHnSj`Cȅ7s- 7TGau/OoƘlXa1I黑; U&ÓT%Ѝ)GlRomd%٣;PYd'{}0]w;S!ѷPϧuNBEtA'_T1~5D'KujP|+E'.) u KI)B;\e2܃oOF7t^'iM\IO#* :XcDZhxA]) ~vF!ď4'Hkm0Wqoz\L9~eNwS1\|EU>x*=5r nny `A|~yz]b3fe+ʒxIߦ-쎩}^{WQ&j"#X`0M ,^TXkv0_ dBeF_팣X+,5/&#oe)za+"?Ǻ3+KC-C6qԜM^5MyI,ݒ(]\r?L%x$g|(k]'{Fv{XZB[NR.'bD[8rڱzH#%OCca#( IJwh9b]g.f1:y/auYə^t2! U?UB7k @d(Mř']䂉$Юc3RvX,x ʈg} 1&FCROϢ WUs ˆ8Mfeb XL]z{5e?<`p䡥BU[Jrv5}uCjZNܷYWfZ-ۆv3o` tO+/B*ofAƃ KgK t!)1^sRnQi&t4f##WY1|;,rgtD|]bv;x6k@!M j`‹' g2%3O@r -.b_CwXU=^G; Krsʌ6!֣j[]+,M$0+(ByK~Fz'R {6<!-/S"H(NyO(Ǿ([*dXl]ZW|sF݌_xCaL0hhX6kEckD0qH;ꕸ+&i٭%M(Ѻ2\#Sn OPpD'[clt;9 Yl+&Ə4YaS y,Vc]blWf^[>To'FX ɖE1bl ^Ͼ{M7bBn"/oZAkQaDĉB,h~WR,KyxԔ^e܎t+d$)gfCܳo29II/&s/0uf;GӪsr؟* Bא^AǷ>,JrƧ2a I ( Cj^xu wsjb |ԨMdVr 7%ʹ_̱[ T7d*@IЈN,Zd9/:Tj[H^GgްRL\w)lB=M'볧M:k(ڣDyI&\?(+ ;Ă= A}Qg#DqbٝI/'!v S;g;r; Ry!]e2vZ3G0_ Wԟil+zɘ KP7P)o`5 &Z8Ư$D4)K Q'Pv>¬@HT mۄ31@$9T\4Gq$\B]_J975ZLO[B2* d/P0YvA7G:ܶi}'Aخ RH-*Biiu.݄.YU94E~obU2kx h,N;[eF$9$H# ^(UBD+BJ.Tl;":XܜND:ۅ|TjeR56+ax 3}D+ (W$#`@+10Q tF$ XʞU_9#」Ii qH[y.. #¯$J빳Uob-CIpPU}Q-Wg&)knv2]L+P/5ׯO)1 lM ?KJ\9Fa |*w0 P"~JT)SIAla ?(ms01Wim!XvP 0MS)Yj5 h;;ּ3Hd|K[XY9H80(i|zdm%(Jv=U+lB~a;BF)ϑ[dc96hlaOLM {1Ebc$XD-RHiX4%~h.$d]u) o 5m(&PӑnF(8{(>)8eДKԞ4,G#&%/L8~p! 5ؠ!#Oc+4+WkjB!#!QfDj!!ՠ: A!>6,si ZE6,!P^3>I -ok2&Gڰ2/b%4h3kԳ\ʋK,T*Hbnv\y?|Kc;PZ)V v{Gex8rO$r)Nkz 0{S{E.uIl%s]~IHaE{RȗYF#Egc,1XDBhP'h:YFAGx0նrKz*}b!qomgԔ % PN͓,ʉ*jgVxV_^`Д+&P7!3׏?G3궛] Y1$iN.(r$CXE$DĜhzOOO蚺^4;,$]NyVPn\đ2`ΔytJDtJ(jLW;AM _=G !$IjRSWLuD $s UD 5a98eՏԩƚҲ"`Sв93}^E;> ;Ǧ5WĈJ,,SQRϻԻKpWz-<@t|Q:q!>_>IUImC(p4Y;)~ps=.s*܂.פk|Ȣ@IdU`Mj,Jcii._|єҒI@m_9ݖ LrJ 1U\_Ft))I2ӓF4>@9}+`±r{.헩{:91 ̅W\q%_mB/.˒ 6*Ӥtٷ[-S?4}um{JN: .}bcrg fA n)GC"e: a!7A [!H'D@DLƮԷS:zLDa} 'EZPj#m6nFŸYE)ĘuDq~//GK@_l{p QHbL$9e-nP⢺o~OlԷzTr_D0¹rx_uzՌ d8* zZpp9;j˄%nԯq088ԋA !ǰyv[ji0ݫf/nJdFHs]K B|tz@4ނkHO:8PЄY3A1)4G2KYBbRҀVP`n T$Ik`hG9ܗG ry mAMkjFŗ 0s9Y` |@;G>eb[ g5%sQ?C]gRVLMm+oJ0*X Yyhjm4TELIh=7l2شjfbUoe;rDt$@lp$"TXu J<Xr3$O\FYw))tBa̔]SGE4G-- ʖ*Mbpj {QwC' f$++xJM#@3Ӓg.K*^$FE64Bp`pU A< U8>ūO!>>c4A>pybC!<^.gU 3HA`)0JtS!>5I bfY+l-Z-@YP )Q%1͆hjSQG`%?A,a*}ǙE#X9 5.m S5"X)#mn~SS5wKU*("fOkMDZq䅚iZ5/ ԩ  D +?3O?55X%iFTm59"#Sn N:27 ҩO, %B`.+އ;Asz3q&n\VESIjXq] &M WQ9TI,|r:lVy:Xؙy't#l(ˉd]tq\1(1xqH";s7n,7>Oi4Jd= T'kEn oJ<)#Dz PJgALetBijIA-*c9T :?.w!XnBE-E>"릢?Mע_&J)3)k͎YXrj V~|FB jrX7%ԁ4h5!G6>\;zKY .WS''#aBH4-Vvj\^|Pw_ZDWC.v(IA)ִI?MYC + ;4c 6ggԴA_|&p aI)S\H906s$]^'$SKee틝1`ɷw;{*O6D*W@y 9$E@c/(!U}jxccN;sp],Њ螋֡CX%J&m}q/ciY0Rsr>"B18IdEq=BX0ؒ$WŞU) 3um䰄^`r)^ZA nGJ VGXނ1FL~ҟVFq Os0Q.Mr*(u+#sWFG|x~番P)*U6ABb2>yoGWI*ӿU]'B4ɠvխ;PMB]S %'"1+ ,4,9d*J=9*/kӎ Z8eF iΪdoSzډb~lg֡`29,UzφO3OJ^]"ZƪXB[(뫌vt A3+_d>#gWh>T~Kb7^ 6dg;f%nRFT + |.tMʓ46;R֠|X. [ȩ."%}̜ 8dJZwCO`_T|TfffޕdyG枿Ce{Y6|bf9 zp"~΅5rDaa7Kb݌DQNj5b1, ]g[$9]/ x p ǔP"ҋ'rbYi! Q4ʈzl%-HQpXACP徣 pO<峏-2`^$5[2nEmdjo;?$Z7c54ZtUcƟ"pqJLg.&ʸ:Jr91f/-<<7IFuT8Iߓɭե IU*S_WW MMhd2 Z!=/h52sv|R-*4fAf|U.<5Sp\"袗HZv׵yMi@\/4@ ĂI8z\~'ǃM,c~+?Yb2|/Ey9B R:8p3Kyni|"tKT.V N *rA Ȝ^Z Błuο8ôIiAQdomC}qM{kRUm:E8(ty֎`DQs88J%{u,zWK VB}i|j#Hu{*PĕFS`$EaE t`1I[ Sq.)y`"n{mB4+(#:|-6F8$J&aw+]{d)G;q! gC4+EE-BNBS4!ѷ䩯 w>$F EZEb[)`r0A-HL)(6&:ŞhixQǢ ՎG8lw2L)[`)x3ucVЖvJ:cMM!t6.>)mތ9K&$>1ZٵكD댾'S0-b04dSn/od >\",p@ B1x7ځuT FP7Мcr?%B}ȃR˽8Hp K̿DY4p客W+Ԡ/lN1Lp 4泑1p1l洄 | ƁK" okB0N&fJ6@E5 {aR٥JIM20 {/:GR[q432xD*Orxj0m%bUH4edV RZ J{+& !@;Z!XҰT!4${BTh CqAݑ b[܊DF}eg+q9:b fv L~UT8OQ\ HYêi|ͲPhאčH+gu@ D1̋Y̠Xt%r/eN5B3b8\;cy@dx +BČ mHKB{G7 _*P cը Dv2.yyd]m-&zK QDlk$ޭ} @r C7D?77 k#=!`YtkԪL*0Grrnf:.HZc3T-ЋZ :4bAXffg 8x'Szq?I9i*q6[(4ۣ2qo c`ir=e-Zӝ`H$[vP̪h$A|L's7™χR{2AD!;(D#/j7(Q|J[&WE!Lr?*w%KeLi cn]#{#"eQKSt{jj!bQn*Xu/56%X>&ez\U 4jBo6On_Kyv+u T:k$Pbn0rFg$mW&ZztW@Kպȝ0Ĕp,qj8!1/B:ݱ l;k]~(ɷì"k^Ȉ` )uЧ)Y98LEؕ,\vHq3A //woU0Aj4p(T`"_Gs*O .5&? x9@D$^ig j1ZuRx%.,ZDHϱQ*[Y|3ǴuKG&j6à ~r\_.?Nge$nZ lOp3MG$,zQVŢ$vooK7>]uiS7;E+ȚKa,= 9 bV;JNn/Ykq8jBfl8<~4 U6N'Rpi[eMv7Q.Rlc5w4:$6v@'3`NyЛl| )0غCÕ$PwFcO=b5-$y$EgĪV& b. phf)5Ώ՛HYq&疲2I-1D-*phbR>@E]gXF#hX<oDiQ Oq5`-,Fd]dKfJNRc թ,]'ԶpȠ~pwϟ!۫!vs7}!)t^2(d( y5-CPW~FV9Hr6 E=KcWAtڌgrވȈ"*G,9=oZňƾxYyX`qQ0^EJpe}k"u'5p8]7hP5]ŵ*b%!$KBT55t"ܼ̯ճfC sdE'&4΁QK/;: ̚m $5ɌN9<옓:ֺpYi݅8&uD^"5_PRbRA DL +D@(uVAPl,TSQ%)@`'%B[YvH_ÇT"שp\vt>]fUUU.oط YTϖ_)Ө>&}uJ(>X$/RDXvUK찘Ck0O$;8I #bdaXQz uH֢&=rYm՗B]ELC 3frjVCK39R0j_G&^m/&jɩlmp/&s|-+IxmX+ƪ$^-Ku*`lg]Jc23FThJg ;[OjަC'+J. ;u_r~|4wN0;=V4̊THd d Bn%gh4(؅bJGIܤ>S̝Զv]RzsD:]z 6DD`Q1wֶi'?s ϨC>Q`#:uMoe  M(r(:IOd D\A͸Da6uZ tqJ8hk88yá ?5cV5V8)XEJR%Xp1}ɘ BT 'S &W6>#SYO9SZz2 {dXV۱d";h-e }8^ ^qʟbٯZJ 317T$Ȉ'szx`+ֻ,%d{x $$y< ((ZWC8lNV4wPq]K1}z@"6]e:K,ٳ9 U a Vpf2.@K%Oo- Fu7hQG4_: I@hLKho4-JQŌB"" ,Rv3c&!# PPDiu#9{M:'SjzU ^QeEQ"h *B`ΓBF0>$FHA5J誌< 4 KP J/#V$ҧ'Iyrs.:5䦷;Au0n.$޺8mC RkDDsZىc۳襄D|f CW6bN[U$ L[%J5^ύ )DIIZ{{Xe$?AW[0Q1=f#'_Xؒ H?$RR-yBjB> >R&l4 nZծUl&Q::. {kMzpvH9M"= vuP/9<^qh@Ao0nw!'g]DDWL,%2i7{NBڀuҘ,2)-F.! \ wgB&gU0rl((fkr'n9k3iY(R4K$ݒ5XYT4d#9܈8g :^unH Zhԃi)Ô&`gzPD9@q+*Z}2Wh|4Zj^K"R~%3W'kXwRxn/z ,.K?M6q4復UMr&ˬ딷~L)藴@BV.Yg*塕8KRx s0ņIvlY%}"$'DŽedXc_1(˜f$}^+ -Kƪ$Dt"O(YݮEaOܿ[Ms,KR߹PhmUQGلR=Ro "s#=O,G. I:"*[[XRO~!_ 32EhiS\ e3XVqU!0)&7[DYiKmfҀ3+C6J{ `t| t\)kƟo Q) 2{Yilً0%ViʦAq|XN4L:X'$2Sa7t&3kzk)QH9$^ya9ULgeۃ U$aįB'Ms tfDmDdO1M#D$?)4'漮,=`D>*U`zՍuږS3 ؖ0 &["%D3 ~9ZYRK5w~A6IXd9PX=\5RJļd_$JU*p YwJdayPUtVPc;4cjoDn]\jpS7t&f! NMH!; y .JyG'i'觛Ԁ˖ > f+4lג%5Ru|gw]@٨)-M*Y+ĬYj.lK HiYV Bv\s,WEo!*so+]Ŕ91U~fՒ9;x 1$iIt'VH뙿Q}vR՜4}Vq_2YbfTJ YSwbIUةoaBn8o _qz]oT &MwMQJ﹒#12M}ҕl~Jo.Dq%_UC:/*6,b7|?huQM2Vq#熤pr~x`P$&$ɷ1hH#iH|֝Y9=$WjBXT)i𞺦3f&yٞP%'can=P4EZs 6]n2?/ZZ>ݜG>|X#&KhA6yhg%ZN+b4Վ"<ⴠA Թ q^)2IN  Yu6V:&JͼWw?>6le`jK$`og&+0PDPݻTI$oCkN ILAb٬:HE(Ot\ۚib2*P΢ qҴ<_(.]UԸ6Lטp!D,f1eU1T4h]ljjX9$?pr! UXCi[;T  #6 l^E_0eT-'cZˬ JW$QJ&ėjQp1KR̥*z,jU:!^ɂ\:YUzy<;(UƁ9J[>|IϐeؘdP3EA/5Ti:!5LPRsp|lݙ0Ŝ/@ XƇ Y㫶j`dd.vW ZEs6ʛ_Xɒ) Ku(_zmCMKޒMlH1J@E/[oBqBb,VKyJ^8/U;'sInT+X؍s{.c81 js Rkٛm: QD'_ z,#JoDęF[e1x=KDϑ匊2Dw*UXreXm0ߥ*S`-M:^+љ&a7)[Ft\|oIpE.Mp^DNr; Ľ8&R.!Q,b4c"T( lqʅ >*AG2^wDK狾x$U$HV"-Wz1q eMi v<I9!p~\Q> HaKx.PJb\ :e01Ug6tIJtZ/29"+y-L? ,J˥ai;c0UNVG͛uˈQU!y;%)mJ,fM+M=J5^bPWSz§ϡhw-_oEGW22$hIab%euJjGRŘ jϦQ\|4FB[IneR[g8 |c$W ƭB]JFu(FAfB$ttiq -a)NL ?5Ιį"U8-@#ĵ, \ZC 3YN&H_4k}5hlW?dfRy1V@*NNM "^Vrzh%g'[[zi,dus^]/_(',MeX q6Sqc3M2`߄H2|0V`݆|=ce4֛k,1r EKŰك &u"8cxNIZ*w5)L-)є(*"N" g "Sc) [n Lv*/J]XL +1.̠l#(t'O`Wqhs=9._ଽ U_'jԧ؋u/_-eB+H%%wg]F,AU)G%pA~hrswصWU"<sH}l?2@B1Ɇ)ci+m5`46CvU-ؙfxr%'vTesp5*/TʤQL4MGpˠTOJu NXz&u6C@y(b/gxjHV8+rЪmXkțr)MKi +'3 :ˢ%e8=ni1ר$0:oLm'C j6\Ec좋bVеLVֈL%/3yHaB*BpZh&!( lzjz/FnIW{Ӄ/} ]i_ 2SngXbBݢe)^ކn`(Sߋ &}?؄tGnttڱǽ̒+/sm3g0 6qNtF'hD*g\Ƚ$!yT8spQ?S}Nh5Po 6+n/pfwZ|pS0;á&+_oWCNѠ QP5wxm9`a k·FTh b}-di9 u?,gA iEY}JɦQjʪ/SlY<3`)vg&5r"g *P! ଩ BKcp3^%-| *hvj]&Fd55 z6֖v+t*;;zfq,(6=Dd4ῸM=MNV` 72Q'$ƃVZOha@J3nّB ,T`?\]iW9_tZqPtqERX~lI*Bn?;)9\HR}ŚdkZBtB'mfKKY+b8ӏ;2tIj07 +p)J+W2Y/3ՁAiS7qRm )a3m+E3MB/uv"T x>Ӓc$$&n9_ l/V HJa0=e8Ldk}')$Ȣg҄0ɞnD:q&7N>~ɺ?Ub-/>^?Z\0c3bTR[G>gHS'O5|/_WJ){ܳ!An&n?T2U3ȺTY t%5L dd3I''OKܙ%:xq5mh\\Ѽ#b / 1,1,ʾ<- m/ƒ2R(dѾM+t!(_>l:K=)؅=dJ'F×UXdwF~We3MW>81óju39qe:{70L 3_uu{H4RVOV#szrkG-ӄL2#?oG+$γtgMFRDV$WtVXjaȟ(Hy&3<ͳY[nT 9&`" 'MU֫uM*aB`!=S_QްZ e5g_r@:O;yKWE1Gl]-ܒec S|udc kdcy0: @Jc9 XW&$jN~)ڒSC)#d*(-H(MfbFC@Z< UI|YZy\J,͘2WCӯSVNXNp),i^ DWr qv&¸h@;o?Ɇ*bDx26Ʈٓz|mj ÜvzRNҭ+Q2o4Sp֝ :dCJ#)$C$TavTM9l"1Tril#Bf%8'Cڰ@a¬%Jyy1K+g JD^Aoq<5d$-SӋ:E+jϏ!H证Ͼ y,GmXWWT>&Azc, #T:Y1]T_?w1q -WPJ1J}/GT,"vrFbQLB55zr8!J*7$fR C_l on׺]}d暓l/S&Oۣ'V`MN$tChcz0*Mr tZyM!M?Q-1׾ФC)6zL1ab dJqìbe3:K/%% G2{4iԓOCg{=fwoG10֔ٛ/D{̤PNdr+fSd՟*Jk&W}7 ݋Q!<-, I,tDmKRy_ee#Ƣ)؛i/%0R^ecsG"掍%x.4*I_zQYo"*>$Mы%= Ƒ$z&4:qe 4vTfo1 n|cvsC(>3go - 9$haiup.OZu3@ZN/5hĨ"ihMs5KSESMsSTIpI[z!(s6ڢ$h!mFڗS=FqEDc qKE4?D3𹕨LAʴ [I#&9Fbw$+?{%'\ TtvYK* yNS\ƅu"yia l:dQKǧm/NEWVTcB>M7Iwa~}g &A~玈>eI]1 o+ BN2/[袂=닶3 {*RaIAq¾̈́R6Y}Ӯu;n6r1 tW<@zC;_A,~ڽuͶvZQU΄/yQ8+F+?3߃?B6`G/iԝN#:ZQ@vǑbiEYH{|M$". :R6:}K/zqC׺`UMN5ˁwͲTq,P ǬlX+&,A89v/De.$+ڠCI"/X/@TBTqXx+qJYSe,6zag\ѷ[gYb%Ld+ʹ'FklFh4La;`D1lkucEhʄ 6 ,Ňh Mcx? /9Άb8оSd:BiF~# 35 frD.0LphXGB\#KWEie![>̎ra?5-HdBʓHdKBqXѴ) Ab:oo]lgN#TI#@(*Iy`,Ӫ_%Ld lbܻ@qD*$ql.ZHb7}QJj&IU8>[ Zc!V[:웕>/,R# @R>QdֹFnbnFT sv=LBxŞxyut)cq2nl" [8^%v7ׂ4*U\y_-(2XF>[R.D{ Pu<ɺ}Pd^HgqYpU[Q>]YW?,4abIq0Ð=yW,Ur+YE9-|RAB'WQr3 ˬO&S3V-D-F*KqHZu IOsV= =Dߋ/K/cV^vdXVϳ,m~MdE6x8n#4z-d&d(AF|:7c0s1Oђ=GR D6G/C4jb(F"AtU][r+ȷ4"4CTr72hB3`i 5شMm8lL*JG6_"(( &Cy)BVzC HB^ ;=|pⷸ1.Cp|G`ԸJq C:ayl)l4ԏK{ 8 Vuʌ mGX|@g~ڀL7 Z?KC*C5$?Md0T bE};Eou;s&2zO(۰#?bƣيED_*Bu-iV2q"'_:B(l0lIY Te2T5ϺiHQgżHkFyF۫ټD}'`Ƣ W2J3X^FdKw|W[gArBZg{nj L컐{zO\y2]Z648J6ci"uZpU*@a?Skhw@V<.KMFS(X#O;˜wX4{a7+g5 b(JefId' S຿y"6mw]Hb'gܿB?kG:ANq5VEF/MzY0Gsk*1!l ^TR@\<;V #ʘaT%ƭ*+7KS&!@%!Bme)4a!!wX 8?eBS(E54FU%=&?BlK8#ZXhl.TLYO[뿊@lG@8*#IJ*؞Fb-XgNb!mI/cԔ%}J=U.+DR3N E[똿ԗ_2K7HBN T UBq ˣ'3ۣZv^ZS4 2a=%7CadRgI &u\Nԫt inuu.^ [%9*"yx~Xe]^+Ynu 5*J q<37t-)#C]}wCWvh0 À >Ԡؚ>]ŭU hsC{-K- L.B{1<~SsOWyn5'-MtXK8ա7#,Ծ8sMzO ْ] qz> 0} WeZG"t0Q|a_^۪Kkө /"z S\9ڢ'XSM![S '4DQ MƄuLV5YfXZS,;4XfݝQ?DK)g߃rBSTU#˰sIOD$a]!.@M8)DK lAGmb'[WFYV -Y v:}YW"gI_:TX4gr8VW^OHIf.Ppk& Aݢ>sr5 UTk#T'GvB{3.^Y\cuLi`xHUH Z;$jPORRR]GdL̷hI4^z/$ #{^32*j1Fw : ˡԇʐK|BxXd=RQd,=<}BͯqU 1F9UޕHگVa˿6 -A5Z]S:Ēl'3?utM]; *9VHil!Xx9&4]r{ElOkl9oFk,ϬRY j#dG! g1Dob@B0@_C'wl<($u> fYlE7٦M;$.c}%rSdf/{0CzCf:q,2W¥vb V.f5,'i `ڮAj'wtt*uE!#BdQ aKk]b#Tj ;Y?f?\e5"&{]{ VJ=,`M= eg$QÀL^`иLyr6!@%$&Ds嶴^fxz,D2~Ȳ G䡉&;h _Kg2&l[ö"=C)^,O x$造LǑ\GS=;p{ njQFP o\,s8&m GIJ| hi-.C3$k" D{@?CA)[ڳZ(ve8xj")f`8I]0,"^$*uMܼ9҅\V{gNWb48Cyeb69DXOͫniC{E"eh&r#5HM{1vPEt{ W \%drL67"SF[1kFRL@ &5wHИON{MkWeh¬P9r%Ui楍P>@rmYunaɳiL)Qf*-#r.bߢ8!ZPhZ/e MyKn3ÕRƫE?UQ0DW2t2Lmwk}95*[B_E3\w%'&?g]8#q6DH,ro~ΧT FOm1~Ya<$ʬ]#C+iHE|E],u )_$5ڤV?qvEcj2:fͿ1RܪoFTF=GHYAHX?.qq^daGZ2Y`_ztK Zg[JJNuuP]0Je^n}1ŴqE:BNp8_᲍*yb$bvsC7RLj 㘾.UgNN2qCz=GZ2d&U90$$ CgO#ҺLVW-=˼^ͥcdM{Y^F?ŠP"6zKk#du=0171sYq:a6goӑdQG<{Pk >#y?wßeյG8mN|R8ƾ'(4UY/L'&m7P>:F]M `F֦tgS#nyB5vLHѵt%(K>aΧ-mBlrTԳOݗԃCQُͣl!_ =`wC?{h?y[uZL~I˱GAJ E`6I,ݿ@+d\3㦋 ldm@w*PD` s 5jx4 8Е.SfF?AKg nM$YZv@1ب@tR'F' &7\$E /TĢzR :ы`zxRX,5do(|*OCI# r8F`z[; `/7Aa1K|#i rNxax.$@mCّӇ^s9$nZd4{77Ium里Z8e!-h1#`Iq+uP\yj!q IK{ ܽr{m&Etf|3^nIu>WDϺaFኵMO,YylKhz.CiQ_\Dbp^7?.d@]eSQZ 0E}Qp[EDd݃sP'ʌOR̈́9KpǍ'CdF']e5 .31Pƥ>/G !L ݎT5LNU<46mo@-?Yx:s$=!˖at[(/zN@4}^$|x(աTBD(8^R<U$vф~ysا 2<#$9P6|nk 5m~ԟV%=i8#zqIH-jѩ&XKhql5N" XzR@q+b\pi[Í`h.Xs3T’i'rc Y}tER}3DwŧiS̈́BhҶu"jMT.LsO|,2c@B_8M jȻ[YMbFpoX<7U@- 79vYsF#/D?OIOhi2͌fRҭX0<Q#~0iB, u ʜⴔ1aNVyu DϮW1PnDadA朚qsaGi7 'VzaX0g>ܬ%|(+W ^rEIC .GsxXtGۈ~Zn"D_;5PqqSViŴztvT@V?:$?Aź]D":/OҷzògO4 1Y:E lৄ[Gm޸T%6e " \ň~7q I,EOS8:#'*/I!WoԌ$[#jze)_pd(a LySҽ"}4JtOdJl!~+0h&#%*Ƹf=`J:Uγ2h|]^3 F *h}oj7!\kך:u)K>2i|hO KITmMwungq*Qw{%fqOuUa*yM9|3|'|J^( M_/7B0Չ\xEUNMy7Xj |K|>+̿+,Y)i ,~f2=D@|FU Y0̽ۡj3mYxFzMiLٝ ی5#j}7Qbȁh[B#'UO79mP Q#FqE' U7D.ժ Rtb萬(*{VD,Uj|<H--aݽwM h[+ʫ4NW;/&LI@wEdA|yoya~w em*y("ISu˅v7!#.W3=6㌶^E3s 7t$r,ʖW1WG\FS]RKwv#AP}xC': B0EƄM ?S~ꋴhVFHݢPOKLyo& *ˑp(NHI1[(F`ܜk mwg9z_f^BBKjT[ ,3'X}#i|5$O+!AjB?⦼'n¼_q:(k\ :<<$ SivЮŴasBY!d2U!XMb\; S}R)6 BX *U aR׆"q݃ybVf<2zU,C. b-qvEsjH\إޜjhU6dB*@Ҁ[4H$ ]EXɲa;1K#,V~-! А%SZ(7AZ҉ xҫAL>n<^V~"sV}?]%G5瞫^A ?2Htg/ 9+YC0!e? /ƫ # .ڃ8bvR.`s'(/*Ayy)Awsi$$&SL2NwxL*U s'^ilJ<#&o겥)籮.zMEV/$& d]Sf bBq \j.׬GSGCi"Y߻ (*L5HPaY^iZ#$kqݏX'B'&_*T8nfy>w7s*8|t[Ah<& H᱗ IT3G#"YV[Y2CK.F-XUrЃ gi`+ !A]Bp4rJFGP:ReskX܅37/9ޯˉ^<͎})8aRk9U.vCqI@a uPJdMU&TTι4G1N$P`"`*7Qwa9=N.mĩ1%T8ɍ@K8ԦwhİG1dZrHb;Z6ۀݮ+gg~&K}~2*75/ |js]mnR;FIA\=bvdQ}?|//פ#p~/N5EϽCXT5j3;S]&fJlJ%6*5DKsU<ͮ% ҞZf% @d(-r:BLҬYJM`6:\d$m Z|rXHg 7&ŴT%L *sFS\*-bJqr}S[#Tt0WX#b`ply|g3@L-#Ők)X֖-kGaSPMqNVRD:dK!=WzU `!ǁVC')C4])R@rml'X Tܴfx6Z҄k#d A Ȕ8t*, %xBgR.A3vHE}5e|~2.@|G(7>hKO'QRp8t<)V:RiJjzȎ^Fo5l7rQι60nhZ1`ym"Vd"o'%@mȰ9n2YPrF.E&rYetω4K #9Ǡ  pJ7j7į(TĹ`$x/?L#,%W@yUR7m f8Ӥlu4Z%YKǪ۪vނ%4e6X?tr=_L!B즳QBoA\~u?Lɺԫ,DHmTktf~C=-Cj$U+V HN n\„bK Ӆ^uGdstQayָŧ}X+I"!/){~؟}*:8oVÞfnɵlys'Ia):C2&9Cɘ PTk?0K݀p΂Go<I-rHY)`xrԥ4E0uEz3I7|&zzH`ٵl-tY<&f{U !#$D8 a@K?!d6}Ve0*\=3_~]4]: -:\JºI3`&L4b(*JʟԀB1|WXQ =܋FQ!< =6kqH-$<) d1`]LG(OB-9 F 79t"64"/Gh>GcKNu&N1*ژ2@o3|n ҁߐ<1mQ^Z l+;S[CN#ⓖs2ClL\H{is @ɜǤ?;J 07=̐cib"d8 ;)Q?l̡,k4`dPݒWqƟ5(QquhW80c J|K *̒?zK"F ,(Ĩ$:H4;AZZw|N/,3Fp) 0n:{رMgaJ7*!a*\Ը*]1,D)=Hz-މ [q/ ˆB.\McR=;u@-VЙ(ȪP2K~+^=-U-R3Hکtea5_WhPlYHfp'&ce239%PEEcRkPs$W:um\Dɪc-`_e+_[&Gnb=y$!9VTML S\ط0>[bvxv0۔bf_vxTY?A& ﻌȯf?N@'/泠yU[R|I .h:*Esօo,MWץCiFcՕg1"9^֝B] QbQOx;%pGxݯ8 mc6 en!yŹ,kM׆Ҭ}QN+H%kI1o;6I6ǯ/hL\۹^zȁ_*({)N;]jQ*+0 ?) 򩔽s~o)A+n4;fzdsTN! PIᤊqz.ͻm Ĝۿ?D5Ƒs: ZӆtN7-^PD"6Bf DrL+Qv[\4eK4rI4oOZ@T4llBuј1 1ѱy㯑Œ5 peflЅ痪5]f^OŘV.+K؟[%%Hd1XSuwCΎ9j,j,*)f>^ctNJ*$HҫΛɓ2ՄSHmd 3LF%I.͖R;#o)Mu=սduh?BV06g7L7fY_.p51r.z)4l.}];2Ϳ,օXLOihTy|L1q=Y( NE"NfV,MWT`eNCq"Rc")~BNŹk噋#\njMa+zy[ʞU/ B=}[%cqk^mf&ԫv5m32v)Z47+fn!^)FIb}Vf~ :'\rn ^ 6#`SaHdNEJ?8,D7؅1A:DPJQHZg,`Ju8p4٪|b%r_tuA5X0aA]Iεe x+:i#GH;j)/YkyЈ1O=RrQ'Ic!& 2(yZ9_$>F;i5< mV4(G9F#+ 3i5K)5Ҏ s*gcm]Tzw|!RA &IJ_5|T/1.*nO+xnF h+d[dZ7Nb/w2KerWQKƝB)$qAKRCeW*;s-Z J[ic[}v`HŴG!&Bo9 f9ոx|OhLuT%r.myo_ůoH2v*$;7Vҟ Jf0Ǧ#Rީ#] m7!f%2#o9UbHu,C]g@ru FDzBxª'Q/_*֠yuM^zLnb)4A%1'_FL4q$g>VOk{(~}!,Wj԰~[J"nN.׮n>ʞ^nʞ+R g1rw(0{$zIPܦ ɥX_u0&v9([,)~9y+w^H6dh5.)E;;P<l&*KQo"ToSb434ywX1K E3[wQkF*F0`jR{Vq/ ܾPA8=X/q| -λ@I1kyn7C"4jh#G"%X(A &z/Z8DDAAxq!ռ" Į-\k<| ƹD!f'(piƶ KW5LC r%$,4oHX~lp4v!X"mAh4&XO ¨ۧu"%Ppig+Ac5LphWa?v2HLx'~62I |vHdb`rhs9%-yt MFӻ ac%J{+t=λ]6|yWe16`K+O:(NI9A175(H;mϵNĈ!# uNbi)\SXAknj3Ĩ 0DmiĶ',Ra%W<Ғ4 O1qɂX<#(]G}Lb2ț,o1 xN/U4\@y2s.?kXz$gu슠Jz.S$?iu;C#0qݏ}bC5틤2mVc/(U1  vU .IDF%lBHaתtǶe `gZApz4R0?c} ڀ e"FV0RTKg3h5R2i;hl\#_{^yHL2o[GK̛J(̥= 0k9 >\b/%M[AG7]:FrM*,8ӡN2kB N.P5C} ؁.H,@BQdҶ?6)D M#(%dx\2 \t ބ B=W|aٚ 7,ŕiJ xBNFw-UcMъSv"&$dʹJq'F-E6 eq:d&j?7׬1$p,'sRG)^zT>XK^7Dm~6^s]0VXay23.G-7}*CY0uc/Ίnxr=r4ͮ|=#}t`isLe0"&RXF H@nidyA*ThVC{D&u+.Yt$ -V0\e1ûy1Ύ2!%LB?õm_OcFV@ <[(BrSj9_w˄إ'`1";OWNb թݓlN}(L鉣 9:o>KU]-V!5U(d[c_!$~%NtVQfUwݮg(.Oqj)[>RDEFJ\%SZ}9οPX^<'Í0ze:sY-Ud\\k'eN 鹤hҕnPwqV&cJw*(g\1UXU.{m[\T f _bC,şFr"Eժٱ0ŶCSEoRa̠52UN sw"Y4!~[P+|%ixiMH_t#Iݞff/:y?(eJ]EX@p[z!n53q]q%WJ/I$I^DIИ`vcˢ6V Ym5R#9M;Sҕwv +/IiF*•S*;9N ߣt`]HU4#.GrxYU &QB[$meEHfWТs~cSTat蔈(~ ~PfƸ#m&5n;A)l/܁.4y(E,A\ubicz|G\44"iU=M\y蠩@fuV,9 dLnU4Fs'r@UߔWQPTZAL+ϝr%Cc}Yt2pMQNEYv '=9eFSOJ~?YO`ܼIw|eǢG\Ա alh_TU'թjHʗ2*~M,)͸Yfm^*4 bUtƂs9j9FW~t{uNN-0wɈWi-Q7L8z[^@JIWgW%ivv})j'M^\ȕ"D4Z}ˋ<tSU0*:4bɕ')-EO,KF[C^*=+A,dcL4e$qrqXqm~iZHZeF)Vax3{R.̛t$#j;h *ŀ7噆s;]^Фۧ8Z .IAJ5HGndywas84# CX_/,bР$d;{fELCMjkp]h!')[ ^mV#ZmL,~bY 0y6$tg$x֪+VZhܚ}I8DQJDHqhj'\>*DӟOڶ.\&у*:IGcKeDՄτ:tq &*tX-.$(v*8ϏC'Bk" 7IPJ:N#wZAWkԡgO:ҍE~mQԏ(e>Yz|*q?7`Z7%J}m҃LrOUAyRjnH 4Rl>N!ݷM'v1y_x/Q< RtEL*fei%rW_fc} 3EHj{:BV3`Pv2NQ>xFUZ8|T.>D5/2 F6|:vH75mh,9SakTν;0Jĵͪ"EڐS `yq3б !Exr~pK˼}M6w@@l?~U|'͏Lbgys #bxKj:WϏHZ> 0?oC5P:3ܵ|>+]__/[xQp|ɘ WT?@ On^)ִ06qva .^IۈCiNO I<ô v0 wdrݘ;q\ɽy잢O֮H@8Ƞ\9<BnJL^ן͈#˙\p*`di%X,fF)X(6p$+ڰa,>q(2f3үx- fS`!, t }|WJP:=G* 5Y!n"Z`!6o`#,U*4ѓzVVjtRҬ_1/Pd9ߏBe-ak"s+KFY J^P/*MZ[zM5N ;)5-fleM͘`ӹy?~H۟w2/V\*W|DS8*FtX%H%dm6(O&cDP iチ"ЂX %N_x 3| DnR3d'IqkR^4M5D$ӗvOB0|&ar6XƳ+"VH)M` .Gh"1(^x& 9=ʐ[%>46ĩψT#)jغJ/_J>ƾQ(ORPNtQO&J8]HX'ıG䐠zKzJA:YrP)`4XHl#wXFַ5s@І;XPAB?䈟$h%*O`4ZWHG#p툝 0Fh VN<1g/$*#UƩ{rC(G@״ s$Hf[I4*LlZisǾɋ-Il2yS{Y{.uj\m_9phf*^&Cϲ0 7]qnynsU܅)]A;˄TNVz/wܜjrkk!أ|+KQoH7\9I+QeuܚE9sˮ$Is@ voS;)Q*کʻВYAyJ5c0?7}S4rgȸ8}H6}|SoiwGzLY^T~@Q&I?hB"l}/.B#- yy~@N.إC NjoR?FYH,f5_&(ʺ)mU_$=ɪuI i@L_\? !r~|B厨mIQ0Фoט$\<={Br4uFAōq|%c[=px"Mr$IDF=hw}vG<1X&;sx>BmY/ܒQd3cZhXUrIϫ'1&o ?d[P*@,WE"MSګ9J!&#q,2 |v]{v:k^g7ÖsUD޵؎ۦct܌95} ۢI2{tjy:yI)Vl I:h|^(EM-oY9GP'q`?n*WHpΞ}&k:3w婩8;GK%B< VMޜq5e FxMBlTO3^j ̕GH-O>]4Zc9IX7CQ!/(Ё>7늈ʨFUBKtBHXM2*R:G4DSavZt~4 mE.U"Ix7@-[?V1Ɋt^?X[0.oDt]aQj5E#NJ{1=8VxW A KC5G< cns_㩉E;1zB9$aDߚz \ZV>IC t;4V).(dzYµ vn.Rwd8Aa` FqÁi8>Uũ6CFs1ʙwBD&C k 9Zl{Bق.{PEtxFdbҫ'b;"P,hL `a˄ęDּDϰ\y*qT#308#+pdXg!\ ɔBW$gZGm,̟QHܦ&[^'av,X|枓ܢ%S "~M9=܅OTj 59SI8)UOU)7,m`CX´ YO#/LXһ?޵!"^+4|1dICh_@P.`#Bxte:D`d7#{ZjJ/u4]%xem[T!x!J(%cݾqWT{򌆰`]鐛*؎~I jL/ŎIr9P(%l[yo͗BUGYxF4 5yYf ˅ ۂ,R}:IH!+w*8D5gulj +1_e3$VF"iXfv<cUR%vv<#-s7̎Z:CЗ 5ֿ4 ʭ"!V#ot}>a%~lkIn[,+j*D]U_ߪïOo Z⢉`~ eT=R#B&ꓭ1j:/UZݺ\HBvm췿Cu)URgMtƌW}7f(o?/tD(껆LYw&`'f(5^L#ge%B ͞wXVb&u&^AԒCFJN1p.R3*8 /(@> 0=KsH"+c+SѸD njr^f!(Hˆ`z@"j h6 n1n,Ҹ)e^h4r /{ٖ ֊_~PR;QXUG*LXtC/o1"RRTw OZA#(ZO%\~NK DN\7Ĵk޼&/ܤϓ=[C:,mGkPAH-HOf s1$m!%E$Cx)w6$̝^$D AK$ R3~;SL.>!D!08VBCbiЍI Qe QVAN Azk1~. 7 x s̊#l^A< 3\LJMգ ı";#P l`/ =Rt J\pPz]Q@&uQCx9 k| 6Z4P`W]/ +f9OOl :J'qz.AS0'iAK!(Z, ꆣBMKfp0,H҄n9>Oa\,kIn/c)T]m=9$1CKx%,+Y~Uz)O) QpϛB!;o+4re?,hJL-${j*WZdz? ;ȼ$1Qd^"%m`rK3RLjN>V/דcJ7>hýmڀ6C]Dx\J&2i%&mE% S0͒> Q|sWu>շ P <HliG' [sY=q+i^ w|5#%7TWAkSCN~4^ϿH@iEbQq2CY@l(ܐB=Xq.o"0 $zL~,b]a"\ BS1Y;@X^_[-Fnt*fK? YHYSzdjqT^-s9UR}WPt(Ep L E>J~6B<Đ Lau˦Nxo>kP2O|q%JÀW5HFT:" 0eBj`5Я jwq_^_nڳ36x#ࡆ =WB`-$')KiއtA .s6E) XUBE. /%Ԕ$hbciQ0+oI'p^,O@'hr rE2EKyr%ۘ5QFU7,?4f#͟rf5@p7t䭗JnڒRI9/ oloԢEC߳nFTuI?2wU C#@#wi-8Vh|\nW>>EKi%7çc`sΪCҟ2dz@4fZEݵFw6_5ފƨX$QRj'ٷmP§6aE;(#EQݚlIa5κWLڶӊI 3u+JPc{iqڂ~ Ie~mHh4e$Eb|*V Tf\=e6QNM^6*+)QNo#(e˃B=}Ũrfk<71M.lqꡱ| "N.A (8ToCY೧D@"A D('z q2W49jǺ ,S3iIW\/1Q*g upE 8 AM+N6(@j@#Z6IIr+N"GV@//Ijnt/GOҹjV%\@g3v'QKX ȓD?u HLUc>cZY؂8άqKT%ٰEar-ʩyZ4˜tgmt: g9dUЗi.F| T G)1 LJkҰMt藒Jnje6Dz̪3-m@/b<ƮTXonNxB⢉?YD\yzZp^EvB>p9Ӻģ'~tx2!N1ظ4tɱ(: CL,}"˪a?qؒ#ڶMoE,X @"N RT(R㤈)T):h`ov^dĝ1z c>S C-Fyu=l~vV5B:jblK8cl]an &gA'=:烎=p,cz]7DvϿMW?oQב[ƈg7*md,J^0U6  Uџ(GT~K@W-N /H[ekdD\o(ӢGOߒ޿zCV2L11(k)arP97dd$snh(-w *+ӥtw ja;)*ב8D!ݎ 33U,njĂ'*; 1ɡvM?P\6GqT4F/k k^NNmlB6eC]>@7y[HdyIqړw|f@ tye1 KšPJ}Clf<:`)CL6 RpG%up!{7ZFQ\cd&@T3'r س$erհ["a<F侈xmY# lN/zPBnCE9W|ǓA`Tx-M^?G47-9Ck̇?wN^m c؅>B%qla5zu~ݜS(|FLx#=/Y9a1Jh /F0p+ejU-n2P}m#T__Xi=Mf}+*I+E1/KiSr~ѢSsx[s._;eZ(uf!-~>co>|nba)ĭ:BKgNN&. Ɋ&Z*2իA"^wo(>v33jd%ZbžK'rAMȂS 9Yc;gDS~%S~#^LF,5h\mU~} "н(c}+ELDmHO:mv~DpB]` rOY/"@(J]%by3T0/6x de<)/+BCv(zK cf9eaR_xJVvG^zC +1Tp#BZ˖!Q{܈~\TG'X0iykycr/QQci^_!C}gpL;11 W0"֩[ 5?/UÜI5& N:ºrnn*t>m-o%bKQ6w^ɘ^PSAnOJ6'_JCgӁw;.2Ò6-NE2P\LOmK3 _kK(XO!'.Uh&[aS.  ִYy,&p0Aԥ)Vvf!W9\Lr3NeQXi7X?jI )u:4&\m48K^/' V`tW*^jbSK8\:)7|v*p :J)| /|z5uE!ݩX Cd4=+p rhT%#˒~S32L?$I&T]>g|(hj|Soؾhh}t/OH7$ 0hNJcTZDk." f `IsHћVqsƞ~|5l5zJ$gy*o P@cM/?P/x >vy-S?HZww׿F(#IܟKݭ X)OO%[gBܫCh|ЁC<,~pdJᣴ?%Ըs'*+1jp^L!Ewt6o{~%[򙝰aTM'@dD9O>.XܖsPE oAvXuP<)%ۉ(YFC*SU)0vOh35̍ ^MJ|LBJ$-_/ApT \B,y.ztMI_+iJ&W(7hhS jdۆKD"(_\y~fŵD(A !j~?~ckwlΦ1+2e;+Jv(=h M7VI[qD/j͇|)VǬ@V*4k6IOPUy#Zq -) pr$%x:~ggU Aw@DJ5VWp^$ḭ^rOͻ#O|BfWݙ37bc+lWLQrU]{A]Dw?ap pmud>ja &e(?ŭԄ@LJoEǿ*Vf]R4:(WQ֥Q hj;v !'B@44TDTiDe&C[s)xXᵿ?u 49roZ^bZV'Tvj=}]c(-;yly&JMkIog,-C-mh@Ua/-A?Aյ%MO/߈$#L)Bo\S T(S@f#@Ig \OmJW1Ef: mCo=7 JA-nhy*%ƣXII |KA_C#\vԋ[9m[ ĪlDsP^}, SMnz\aI I,$9qZi?uY DJԻncZpjeYA% s: UTDhzI3:MVƦ Gȉ|oܼ6?3^ܩDH爋P8CmOH0!8FL fҬ %LOjr=e= E- åQS` zL峑@@e}~.'Vu.T.~J\5_5m_7LxDɈǭxRmzcF]HሰXa3Cd)á; ISB! k>9,w!M_[T@G扜+ل 4F\K5x}x6oRo䖉_N'Qkf"zjy[RFSM :UVr2'TK[)\1FpS!_D&tMwPSB4dGa 0@epM6L Qg=XJ}L&?еEqa!j?EX`ҥ!`&g8pĆy£7-q3X){G4A"( *>8΁jmNZP2>/>*SRffJ) _x$iKV_,OBxDQb_Q;i{5Q~b7J;ŕd%ZS (e2}&w|U恉Q9ZykVi6-ӛ׷ca:Z5t(F0 |~Z", 13XfTv"% y4Y]xPc1͓Rg ZF}޹" `y|3dL8̶һhp:)-nJsppA>vywd(Q,_֜˃*a(]vx.RbjMtNC-*ٷCKf됳&lLGK<%1#S)l͠OXA >TrI%Y׼ٹt$.c$̬w}D4* mώr4lWu~ozO$L_b Yh=viT+Md{VJ@Z bHxS9snS,JuLF|ƈ6{c}gR>0=-`ELQq(Y0em0^/Մ A6k$|uԢ~}^?7G{T]f'ʧO L/"sKcNy_HsW<")W(/P&4i 5;p'?>)5)%uyNOf[҆ձ~ < .Nn0pɭtI.K=*`(eAb /< K*L֥|.`Y>}xΒڍ;ɇ, g}#ݚI)fIJbWakHIi{`s4HY_dC \ P[f]'OmJq b3sҷqZ: )m*;,l28-ٽmGjɩW0g%jҴz`pe% .i$/i}mxVID L*kQCbXoAwă] ?4tnvY[}\6A.@hQ/s%YMZ5x蠕W`r) 4uepSr+[;DkuLY[l#մ)TnS(: O.R( 8#Qv*0sR<\1$j:3J:jCV~xky)&6>$B]'vչs``r'ƼO$%fXoH5 -дXMm4 v~}R/`y#Nl)VƶaRNB?):Wox@s1[2X"b舍Iz\‹U bw?=NOϊ_/׌%UTy$=|=0c)sW,<^ܼ/-ٲ;Ȋwituc$ftNڤ>T_.Y hjzqnV~n&Fߛ!= z'f?ʁ&%O% *J'QKk'_gQZ{4DcX`RM^X(coOK:B=W 6Ly7<+9x+0I13C1Qn|׼rB&pgK0 *~fz~{sPNSyl41+#TkTa#i5Y."Xs2pS_q`6"G|-UM@:Ւ3bi |ݥWf|IA*\"QE;݅DE&?!k04R}F;uط*,#ߥ{YM_7ʘڙ1W ([mٳ~\~3/δⰛ3 l O.-Jo4I,$,r&sޞvqvU4:Tm֖ҎݨlsQ|M2%:T }R~zyRT4sD~Z+mj̧hRʰny7'=]:[rf&vo1LP@WP.-J0U, ^.8Ŕn eaBqdY,7TdFT,[FX2߰q^'t43HND+8qW- ,A!7[J5"JM 614!\*H,*1'kIcYll!rpS E˖X,nʈ'&EMbG*>T{ jD96Id\ꙸюl>Cs5TK搱XC8ԕ S}bk˳mf1r(AmƁdO37x)A@PggJ]b 'DDl0ew2$k}"'Mf_?iY Ob7 [j} ڔ:- jh&)?5XX&SW/彔 >tEc4+EC{xxiD/kW~>7IrM6PAVlD%iG,a2[}fVHP#nVIGo*+sR- 09O}r&v'b&)bᖞ.Kxh8Bg0z` ՙuh`RP_x[ěM"`aE+I@,fLf 0Ob#p6?MeQZDbscI 1O_dlK72 #!W*]iCt*X)s.W 6  aCkGX oStuaJ[^K(>8WLأPy(bȥlAF/6B/(+"JTgG {t\SpB`ANhbn7|2ӜWלc o]ng':B[#V o&#HnAV:Z·zOTYR& 9<.;^uvM&+>/Z 5 ,B))!?B9hG̖7DpE$Q1jh΅,wd/fo Bs,MR4=Ւ/Q2ma+'FC)X"Rg[$=#}4hDDY%%ɪYA 8'0%,bK% i"1shj6Ta3<~ G5 XL!%HG}$ HZi۹ X,|(ҲeS`DtÑ;@)EI͙jѥգShh!a.(d\nQj.}+S]*3cyZ.kMaYo oBGqCB_&J]H:j^E.hd13qDVoi{+)~'$)1A"aM!.72Ⱦ5bI.Uhn{6؟µ2U#p)J&!O}*꛰=㤩{b&8ֲUE`f-Zm/{62 fqpمyyIK*>)3pD"TzqL) (hW PBQ'[/6O:YNbWfUT M.¨NԸ˕mjT:;I4P-7{ٌܙG"X־jN_ŷFvN?i)2k+-@$VT{EY|jGuˌӰe37M-(7+`2}_'Y=ZJ䃤$BR @"H鲨Bĉ(qA ɗ ac LN)*6qN8LQ a,:Jۼ4 Jg/ N&K]%o&$Ì[5`b9JDPfx0RF!=2&V+E5ĪF%)Xq}&vmW= 9AM5fl.E4 P`>8(*4P NHl)$Q2+ uڵ/W)}"di tх>:ٷ0Ti"P%K"2? 1~{Xa <גrR ccB]~| [0 ܸGu=`,2mED FAGS%N6qOoY杓00DJX?X2|8* ZjejAg~)nP"*S( Z$ץ_2N5!a1Nი̅cnNE=;{4L9pPQ)ΑOEAM@Q`@Ir`|ED9NƲ]HS:XWx\E8xc@J5cLoH+mFGLfR "u'j/6}RZSeeS0mn5K\ \ܵ['>v: wd#2m C ۵Fw ʒbҞqw{"Ҥw!놮UyoO4jԸgA4!׊A]uPhRJXm QW@@,_0ڍQ1=;[d S!V8fScWux+R `뭹jבadxK;FTR-ηRkUד]?>CA6/u 'u ~cue!C3ZJCCL 88>G뵔bD ;Α~3JmRO8&A/9yzi틸ZSt+8l7[X?LHAA]VhAn(sS(/'*~Df>"@(I bbm~Ĉ˲^'Io~P}^(]&od j,F``GŇ_AA J)QlH}c& 4.jmW2o!11fQSJ;;NVnxn0Sp葃?Deh|`dZENrIfpqX;(g ?G9="Q_Z7DI`} M_1|kA^H̓!&҃^;< $ek#>e8RsSR*B$< 6b5=8|3J{9ESzR׼~Ǽ[䁈un.( _hlHTB?o &~l&m`BNvK~ɐgT;S/J{@S?Ql oZEB+6$Y̩Աƽ_\~Xx LqXL9=DDT "J%q(z|ydML707'*/$'aw)*3}`V#M3А}rdf9%hp`w+ɘYTP_L\6tё[ЖqU8!4FC̎تK326-ˤ*>ӓ*/>@$nw'k)mʵîV 'S&` SPPR<*d@oI@sa%BO,8G.m$X ӐL* -y.勻" vD.7}^DZ .lJ50NADEp[yOćlI+Z'?ZldܥaUm5R7I(m_B(DBIflgčuR|8ZMth/ X,hkыT8\dM %wAQXeW"B;qzّ6)0;oO2JW=i¯BԦͭܕNcV]UA6s臊HZWȥv8LsR[G,l|p_LLw.S_J&R`e%k+-L蔚 Vh gOH+΁ M(p .1j"5Y?"f̴7+K4(IyNx4!f44Ցr,b)uIr#M,~ۘ{#@dgEN'l0Ӕv+~4%]9 @l结~O9$Q/G$ISD6hr}淄Yr%-e(Ucښ?ETk%a1˼~] "X5x6e:sc9 b wfIQg1X  ք.Uʸ3(JaAlUS 0㖣*^t]cD<Y-eTYׁvO!+q"]SoƟ(j2 L)ԀMATd-VJSD$-Yڑ+@)_Zd4%ak}s6Ӯh3k2bjp$ljsOaOw\qOQ]&UӬA7X`pX&k6Z.J1ٙXH*ZqKj, rlbEl.9~ v,!ZRĆKYR3%kˌ]/ BMɌElk11Z` eI)#;_FP!ɸ t6B:WQG *\h\tQw!_>FV)%\( 6T)w1S%K)5s#OPz^)/5("bȷhH3yN*׍պW> NX!άz/s&}L*G.--bdpLTcN/j^e1cAtTz@"IDZ=j^up,a4EqOR=gD94"4>72x=ߖVԨL쭅,DcX=V-q\vuT?6Kc(u+l,ُ2#dddw߈˾VCҗBF45OB--iS ]1]E6M3p>d)TEV0 s;"L(õ’ԇ @$ L2kgfHR $+T RxBbˈhO$sZ˒@ה8)e.~B}(IL"\n? F$ߩyQ"c:. @y7QkR6ɗa֭G]Z +.5*i2%ĵb;SggnIݓ,jnZJ8e iv\) v ſ"~yuZVt[0=a\i\,?%Z(DȨ5 NxyJVYV=d#A7=) oidX{+]5?).:º[?+7|S=<͛2g9 bw&? N.},^[}Gbb2lBqV5AS%3=fVt2G)Bʚ7b?fKIWzb{ic˂H̒A*.ֳ̐bN 9 Q - N.h؇]0 l"E?dE,ŐڜmKTh@ǯ"g[6A GoQɅgTz8}Kx -fʏQ/)!oп="E1_n2fSacqŵ 2;<~nX`@j_zWAZ6"4F$[M 85A6^qXZ5!r0)Y٠TSU[ M;8z;F|Ɨta9VHe]ڳR4U-]& 钂|Ů5n~/M ;%J$c&[""$nT\W;]=}IXB!*4 O}>"ѧMPC"vPM]JUkeQ%lek`1ԝjQ3%('ؾ->XMYw}?ͤ5W.]8e L#* HrP T P }S@ԯEzZQaTHcȒ]9ZxH+EoW2ï ?*s(D}[p?E ~TbJVWyh9n_a@)^sM l^4qXQ.dIӟX̗3AR)iD<z o!(u wF=jh\;&4%sRUfkFp#49ᑵ HΎ:}~K)Qg,}Ԇڗ)f& 8 R$K͒K7T"xZ5k.$nf)RT;,g/vQԪ5 E&K7VX< IZe9GJBDHDXj 8/$&)!#woeA5V,14H`zT)W=jcBTC%C ,Vٴ^9}+&b&xlrm[sr),"/ \\0$`2ks2*ܥrrL>B6KAVR5?У*T_1^v:3v|3e",Jd|J-zn-kmƅUd(%mx+ V MUvlʼZ 3)L:|%2g[UM -l+YVfSۧLaᵇ i@Y7d~v;?dJ#jg?h=4fÂ,ёi-] &n"~!;QlP|=ꐆz1Z鉀Qdal<ӳ]Z>]iVygЪB*Um^ĒTjEfcd &LX3Br:J,7Vȣ>RWJZ+#tuYEF'Msހ7٤rE,+6e H0At홾*c&5W&)(,x+EF7\]]cǒQHf!M_ R lߎُ|)yyS"c:M.?ۭNLL]4w?5a~&+:.{ta2Sd*릓5Ny3`ZWn"b+,A k+]nr"\Fp_gBtыv#͇̙?ևmh *зq}8iObmcKVHp cdc }-&1ϗkh!'R0SR Ss@olJe/_' u&{+e8&U(*!ߩـ"2__ߨֶ?"0\1Qh21v \ Iy[L+͈{0-Sxx(&N@ȘPYUzfXDӥ}3vYh!B9c)ar\_5E"*# ϩ,4{-UԽ䏇¢!rDĦ7lIZAܽ:Ll`Fbh`fWEϭ\3MQ5l!j-~)((8-xR#tO^VT ubPؙaӉ8c`Kիh RFbUd 9@搣xFFt 8?JGPɬ|NȁXquB ñO?]ZwE|0BJj^9H/yUCer"Mo%*lY ,dL݌^˩󽒳LUϋ\[ѿ){ֳqv]9[B4Eवxd Jpf?tR8*-MEaD:iMtjn$oZ\xsQr% ii:<|^rp,\KYj|B$iV cN9'10b" L b$Z*޿k+|$s(M j{.J|P] (Qģ![ʰP*D)y -O)$dKW#炻mgdb s9F- u%U~ ?Nx=JQUq]sZb}Fc!fIݳkKZj`0=pu#6~eCg ϛ䉴aiM_,FT-q^m=J` O`Z٫kͬ:*vmMJvUdB2D{7Ȟ!\WL@!tתB0 txTl:r\N%l`ڄK,0,*t|J], "c  qYԚJ ]>q!6}tJ^T!m[ 6 $૘L\LY1 N$&W@pb/YX:4_bB6a.ezP$@19#ÅKv B;,7K$!MzS+k`FVMv@o4k9u$d/'E8#P6UG?h\k@tXVq`Sׁ`LA%v։_"q8 _u_5Š\v{PXbݝUhaO[aK8thiQ!)&kjS:ǎFė;hIa9r#T{PtP,ľȉ_WJBh"?-re~%Fd5V5Iع_"rfD4U(kY6k&9kT9LӈG碪0EMFo"+jyƘbnC֪Y:.[,=(q-dzQ/])3)TڵR$X0.e)tΰCQ)AHm=;4&X\ 놴.+Bt =:)Ѕ!Du)?]e\ _PFd}_j`샬BЙΘ ȱkrWļf}(K0X"Xћ2&H_XG]PHӚ=#n-:GĮ/۹k$ 1EGcT$uzJ}ivMV:/k[%Jj\I@!6CB<,ژa"gAfʄ9%7<% jHb-gŤ!gYt70.x%;~fx3 B iaсVFW.?I*8t/׭r` W(_chڳYpWI%9?܎⫫v@'1`{ Mo VX¢OArN$[18z@˒qs72QNl-rqiG$Z좩{uV6Stm>.%+AbO+fdVH *3܍gQ4B3-pT]ҋ [nr!{вv3<7b&"P6U%hDM#z[[h~\!JGFvfE6v/b],\݋7#ǝ[_iZ3Rh&L.Ny+GYEDD*lC4T\#Ve{,Bt0vl+7~%𣗾[>6ݳ2I5W5hD̸T/m 2Sfme!wN'ET&=t^ MPV>ڣĶ"JP+䷺~ )PP+$Ӑ$e25T#\-xXK@9Zi}hW)#jcw+Ukw}mq߮׶?! R߼$&<׫œ;[ t(=Oa3VPZ2Rq譖3S0w?rluSŒCFSLD>yV7' JIfT/sy*;G/+jd@O8Re*ZU:͑ΒTL7Y ?仲MXEX,.܂y-tޓeνUY{T0bԁ=5$sr{(:))sG_.zX]~Ix똃o1c)%˺kB8my'dw/}R1^:< Σ yԛhFIM4{ ekn]9#d/#z5'zuRW|s#|* :sX)Er~J-pFG? k ;Jx`ؖyl#~d daݫSOD |׎br-JG&$\A'vW_I0/L FK 1 sOQ2# Do7Zgg,Y/L?z{eG"  x4\npQLEXVv!"s[ 4Et,=tLc*QK >Zc?ATn|+bV8j}ј@VԏhTٔQ~Y떷/*|HcIrf4OǨ^/Jӣ{ܦ.JՐ򋥗u\Asez]JF *&NhTAU T0Z4^E v6 nIU_$X9\]@\Dz`#i̻RhCܻ#2h`MYsmQjInUY@|O~Dtaմa)=PO`EEE X?J9-VB2`9 `BXd/nC<8=  GA7}۽]#?i01O>T03ï˨-7{EZcVbdS:ƣ?BR* b,Q3S'S? J薪 sM7n*&*2F0Gܾdy$" 0ә7C5TjeqHWkبi!e-Ȅ}ҳ%_U9gJ>5/]gi(U M5{A WӚm&Ta 8fn)Ȫpk `G̨ˉWj<{Prtп #o}edrTmD^ފVB{Р#N>75=yD~* tdD7%a\!myKt,=/zqEc Duct-c&P\M<]bik=AX0+f-ԖǂgNZж,4F0D A&ը"j]ly6kh4hxM%қWڞ$=TZe*zo{R?}"qsAg84%3@Hp7V>b4 X1|-a<(BhG_кJ⡽K],)Xz0ɘL߀~ "/lNjL&=&%"&0-(AkZ<=C XЉD[BsChDELp L2I.|r,d^je& b+iT j<3w ރ19/E\^ ե(,jl+FVI̐ݲ#H "Njѣ<*VFΉ[Ł7ko;m0Bj/xE?0< ܁O^:8MMzq.\~-^ot#?cLpXB;X> 05>⡸{ x$~,4oiD W3oF9Us"^F1v~kw|w>_y1  2yi^ΆaΙ}-·(WFnϰ̃q ]_Iwk5ςJ%hbqQ|7gjڧԢ.+3Wo.wnG}ٲlr cxy-詔:ER bH}LX:NjSD/ Q;D 0}ȩmЁ`PbCbU8wl+ >^ e:~ϻ:_Z* ;!y5;"emjD Vڎ#Yu+Cꔺ&uKFNCm7eydnn|LQ̬SqJٽ=Z9"Q%13A#1:+E=F[D5)MXP,% p8pMS H>qH᪚6=޶a*a"Imy# I5H*~1 lXNY8[UmRd$c}`L-1sU,ѱIJlօbX*nO]q/SVKfA<{EBB [~;郮7m;xѤKPaxy)\=9PE*<}'Y9؆gE=8"\F-xak=G(!iʖ 2}{/iDlkx1 4=!N G=PN wA,'uY7?l<:+[ޘhX[>Uj1UG^!7B %KCD qַG8m!Y3r|ۣ;cQ= h"dP ?e;x1 ~uܴfRܝ;(xei~3ci=(VBre $H=9#؈ QL.-M+~ *emZ9хhŨ!VYX^Np2uX9&RÁN%82EܹIt Y?3{JX=f/+_l F˦ŴpzZ0 RK+z=#+JDr֓/Bi՟7X??ak_Ӭxd[3sT0oDcBqn-;# YFtD޽!kir 9Qgh!+&I]$"T>m:Bo˰8%Szo+a%m-. \t&Ŗ}(hjPw!B\i$NO9_ZRNexBBwŃ ujwZ+Nw򳆺hQKUU=ҵ>t!nNq}qnk!jʤ$s7SXSj9/ѷVcIҵkUլfȽld1<}z5kQUv!7Z&& ;CWT)Ξ=:b%lV|ȯI8jWgRʹ^ E-qWanX.Ĭ^!}M\Wܒ2!(P:.c2X#2l[h{U`q.1΅}%Oe6VnOG6&̯봈GRybt~:ϤHN"b]n^#J$K $oo&#)Y<F⻥dY*-aeN'PV6 s%x6ɥJrenH,34hˮ' *$Ϡ0 $@xScc$f3*({Mqй1Jhqg{MT/7vEb uxsE T'Af&,a`uBMݓ؈L^UI\.z-g(Z ޖRz},JL]WqKŶ]ռD7S٤HK)R$Dkt1%6e <|cU[`lZ>\!uZW |9Z&GJ(+nPj1+ F7FN<3`]j40͘D疙~(m>@N9<(4a*e6) ~,1F _MgDΨSYv J@槨7#_k4q/s+[l..@h#$$qLJ)w P3YVR* +lv24tJ+M*}uM.HĤ|kGNzp'2éjR*"<]|]p7RKv\;pT nѢpRy3ײttN#!H2b/E %KVn;@k*allZYd[hi.':o+:ȲH#[#DM&mԱIlN H#}ݼ#%ϲ R$&MouM;íi9jwhMѧspUuNVlօ˯ ~> ~X+hڑUΣXs?ROq'/)w;Fl~Pٻ;IؔiF@$,|Eɽw:A+O1MylļyG[WՙS'G]a@#i>w-r>H1RrͨhozF1G>yhRIPFVPHZIspЬC2]:9)]:G/emt*/W6v( ?l`ʹ8.}ڨ 籿]RйaY s!sR $t&CR߇*ڞ5Ů]̄4ά^yZs?d+||~4QC#\M\頀6[a}2N|P"@H#:قums!od㣋,l6r2q:DYZ*c۪V0L3IQ4Ss}.I'^q\tưo,ƀLCw(\> qRKL+-,U($i C4x PNnЩ#_Q_O{UkW,t!Nv!fh{,d->N5)"v#>Ɠts' ,AzCGcpH6k-2tH|e]nxP&g LnCߝH .82R*O"Y ᭦DV..TiY%h렀},hO>_kI1KpћZsIY,.hrk@R{a`H{oDڊ-KÉ$N):ynm x O}j}=Ɇ6\Q㜭][ E#'yU383^U9& _twB\M}Wv!/YLR 8ὔ*'oN6 'jπˉ▯ه@.=Se g#l,2GuZ5dWRImP,f4N$-Db8qf2ms7OwI5Y PtR O%:ܤ;B-A^|hI( e͆Ц0LAXõ6= %OǕZW*%uREeLՆ_5a1֙w&8%](u`<\EE@e͈ >Siˍ^~pBbLicX*oJ :OP Nu\l{j8F0p0H R5 (W#^fw/%seu9~ Wy^$ ݓ$6.ק7&u%lfATD'S2bAOJC"RV>4f)`YI8 l|JҏTwbn/:) /~Д9̌,0Ďp܅2bj__+mw){wF(`|@ưCfʏX=מϗ\Vo?`C^i;^g{}oWzqoQ$l䓕_H ?1_jW R![˟k3b!V2=OaY!7Nh'QuD@YvTRM Hˆ+:YS[w j'*fke0. } *j1̦K:YNҨǭ9~ן~xqI,e&-xUS0]s+a|/Jа bQ[E L~QLi'P2X+3ϲXb0Ba!$Vc$H(Ϲ3- ;c\%VcFmHZW]EgDƞ0<]Kiտ m^BS,&; m8-zV:)!Ҟ^>joښs$C0}ZZWb].f)ħڄ['_Uuwܫӑ`KĊ?I YX .uJ(}+Pr Á-S!B .^ J™)jTnO|tXHL xքU7G@s5uolÒ:!<';סJS)b\Nps]QdVM$1d2C.1@7p/o;WH Ֆ|ް ԇX6EgM? iwhVw"jʞW\5Da`f;Yjq ! b*fTE`0K!lS2˞zM^HVޓTCǪ_UĤdZ\na.\Cd\~\N=y-Ph<ыXҫZkjK0_ V[φF}@E\G&| D< i.M(|Qq@.lYDa jHBz2?TE<sjw/MEד7[6mJ9nֆ@`5YJJGV_+ ('*2l=b5$Jrpn%\`\%`poej'vm!.Udc]~Ry?S? s˹IKܲ#inǝyr`hgHh&aїw̿&ډjtSE)(ѳ3EN15=3쓓4QJ>ZTߒZBk8,FX#ˬ>ݜ)/B4ܛT] 6q 6V'(50ZUKd_w}ʦ2,h!S#σd6-t3a,qhTT^[eO(PRM#arqTawJyCߵGo*$0u66u|,~a>#kAyҶZҸJa_aӭo/@SCm#`C)tq{mޒG$|0GͰsy>G.ZYkQ'qRW}"L\.6)WK goNH 6k9&[.}r?D#sSNPIO53xf"m dk+0]Z)7QUr9O$FMحW5GA rg?${̷ܡ*`C+ap|̨KKz~ֵsVDW;U,yZTq\2E`."Jd9~WDm &` C{\ᕷLCjm n%1Zuv+cMͧE)n %5$ɇw:^2\Y uAzσH+3R?߸uG"oHinj&S9N'R1̗/s23n\;(w$Dzg0J2LQV^٥VUU_,3T5[o] K9#H^f4~Mm, T:0ϏL^O>㏧f@[k+oOyc&ِKpzҕ3oW( 90.URWl:tnN4D橘V\ߴfD!y~vV9SB*AKKӒ4aa9GG.8̈Jv'OĆ+I0;p"%/4t/[t1F2(F6ؔVC՝- 3n;Pf' FzwqPXoHC' 3TM}'EdS9;2#$1 t: 1-W@g?/wu7U%{U(#pVK25f"mi=o˽ g 6Y|qWVR+dL@XM"ujK5T㋢"My!0PMt`)@"?E8ȰXx!(dm*)JoJUqFY!!%b[,C|Dz2;B.bB<-toAY;Bk׎97%dG#BU@)#<xXiV8 ]鹴uխfJSzU\jELbV"9~R? ${%mŐ%7)+ t>6Tekiy׏-|*̵jYiJf6- VaOG}vb6t= W!b(ӭSEjTEW|ZS@ҀtSH9W!#)'ދKC\Zԑ9]`FDWU夷{z`azڂLX@wR_V~)֞{,.B$pXxrIQ5cR~ /h1]^F>5΋ׯJ!Oaɸ类C~]7]1L>^[dZ0[6UqyXr\=z0; N˘uStw,|4tLey:UWVQȞ8ĪbUNRw*'lI52`oq]:aݽ==T*! ]$mJa!M&C'md%=yD[yfdE5j&#%%"mt""HHڢt-CBPϕ򭿯OW6?ׯ< .NUj1$E-"Y&{SrM'kh"(Rr$616^s:kJBRe嘉2yI>Ӹ(51,7Ny{7ף +dYh!\[C5ai.!tr$QS|zPdq]J): $:zWmݱgE: Lh;`A#hNkv;GNj#)/)y~qUUѕNOʍoj nTk2z[AV9:?ܖjq/qk-AyHJ8X*qrOA1us)\gGeT!8?Q<(6$jXʶG5k}J캭xPv8/PЮDwV30$f\qV m`CxPYV9M{ }\6DLr'!/{S3{z~p+#͠N‘}~I7oDA3B}-R(4/OgTS#R`Q64'+cq< ZhIqJ/Vm 0ouʄSC0Uy nl1wptO0OzmR0X\Ue*.#zO #a:y҆*1B#~(ȴ֐@Py9qu@09a fsUab&.8$yʣl~?Kq# LKhS[ߗ~q!-fr~ L˾V;cQs2_I(L !P vI 9"Z$YۻO5ڂ>8/gnRڐt{(8r3;, =ٙ,`&E 0N@I(,J߉SD/f.AL)N(#%.-#"tЫ%QoSJRNq%cIХYN:jp nb\BR]a0e]8}z2=V+,e nQէh*a;v1V65-iQg#zq񑯄Ldl&0]rQ#*u'j,HmXZF6QQy׈X+ګ5MՋ=zI'VJ@4\L>;"O_oSxDiJfQ?oQcGsP͗;ʯi࿤gK| ~Y[ɝ]8%YKv\j%ds\cOdUϽZO;jZKedΥliH!'w##j] 5:H>b#!)jfd&*\k:6 BȦL&ᱵ E陲Ki(%~LGeXA)kBDG3 !`Y`[ƶ hiF+" 9 .Kzys*FNe$KPM"i¡0I!gVRUTONѮA((Tub6۞ֽGRhszX1vrR1$Q(q^Mfny+-\H5ˢSTrUhnɪ|G͹O6҆jyۼB(7U'66~Bh"-{io_Yf&r=Ř >]CD S4X3a#%'WU-UoĖ}ET5LIV[q6WVdeWsc8TKAӛnAy^W[*Gz^!Q!r8$vb򞇷 y1LFS$ 7GJX^S'^4bBUlorim$”0jP&YShYz:+t+-Wވ6hҸܹˁ%[NrM6d$Ppg;JoM<B#cA8߆#3-`} Tp琬CAs3l(]:$hA %\& I[fV+t~Y1d}=WJ^T]4(ctٶza""9Ą'X{PKKKfCRBƒVWnuh5+)2z!6@!36]u}E#'[ՈUx)Hgb`أ,+-)Ⴔ<3./Ћa1#6Љ&MmMR )hV9Vr)&IVSQVO5r 9".zdȉƹr8hXKô֓-3!' JS@r*.X#l L!F< H&>}*Ej{ ƷIPu&-ku m^eyl سu_NqAY`Ai7~1u Z'aQ͛' *§vCYR[*H-HJqz@D6zfZ0:#pe E;Kl^ xh_Zkiȫ3!!ދG7XΤ@ˉClbbo?{"1(%&A$ps'GnJbu!w%Axr5: K #~+P%55VrG;TYl+.N6xRݵnaIqZLem))eLbO98o܄dGUR9}.̵-҆RBuJH& -$w{DR2ϓ5^kln12CE嫢V/M]eDڥV mΧ@ zRqCb4"ԭ,$PC `H۵BXz\?Qbp.;`n$#U ^'saȊ<ỉcx>+`]DJRhRs:꽬Y EѡT%TCnjtu 8M hm2ZSlRdlpkhYpْͪz_T2?uU՞VP''zQI՟-nwԲ1!`e9CjǕ3PkĘ(*EfÌGB?^=;Kdz,d#ci OK^iRS)0]/G;ِ 3JG[ tdku- -7MBc2AS:槔Ff]lt́krվ>(PH̩#gbK$*T홎nvzG6+[0RefD1#|~]m$?G>zbbgmЯU[0eb`/֗&3"\FDS)At̴S s<1Z?_-ѽ^}>a*{#.N k:фGF,(EuQ"邦'IXJw [aBF @PFұP뢠qIJ%5.ZhEdE4éumY7ɹE @ȒmH6k}-{ ɉ I `S*H6+P7"s}9D= &EILA€F`k%.W\!L.̳r){0bB>w\)0n`ā)1C 5H#ϖVd%ȩDʷY=c }$l?KHed ~Imr $ȁ#q (RJ]-/vo |ZR^~fO Kԃ K'ÙwҿEr; IN @?ܐyF*>:_&z
PС+||ks#dUB3B,"o$ ek{: t;+L;2L@l3hQNJf)YZ[͝7ڥUUuf6׭4-R}ܓ ,o0B{?LPtS!?˻\ _6mbU0*b$7qexŰ*>PZO7C-jHĶfP페4΢MRIol NـxsA:Ř>*=r&ZKRG'"JwVuyZ\9i+liTaM.Iͷ\␢i[͒3{,{f3I+m)Z4trBC*#fgԦ3 ƣepݘP5ػγN}cP6IZARTxq/,ȡY@Ty vu2쳹jah ڿMSvf+̙"ТrU=) a j@HG])~d\.9oҔN78O*W~$f55:.^\r&%%"OVdm8b_zo4uԔ*sAegRdSWJO W };B3 H`J2-YɞRGTb>k i!pE$oMd @L9yA3^5$(rKI_pv!aY-WhpxåӲͼ20CPu ;yP~ZVNܺ %0G66cF؏'CkTIش ֐shMf >6i]=nsJb`DJEj3 ncRw8D z`YXx;Q|#yolsΠ5]bУ4x tG~rBXndZf\Yd'OLE.i`f!^H(cqW.9јc$kI" C'Qge 8`)|x0>T'ԩ,>FR-[*Rcwa_DQZ!ZYf\ HP#sn>KeW7CdAHFy'װ @<$bTd 셂rƅA0 0n>^*u)-Ɍ嘀/>DF-:i)#AI\ CJ 0L*'׏.g7Lsnw"aCLPZ*, Ő0d3B儥13E+u5@Lܜ1q? rK1•ty#0'E z%-27.vGžxnD [94 Rnȶ506a:"ǡxH'ٍ -؛v-hbeP)(P%=ͦG˦*P3ᲄrKultcuA78w&@RMQaHf`&Eׂ;sjFܝۉ V\n,ZC#q&}4? 29q>ƩxBX^NRZDkjbTȎWNIdP+uKMSjgXih$'J2Р,sy,c~~zĐq" eByUmǸ+,y4DLNx[%Ҫ&!g+.hÛ٧^N.hF MbLf;fx># *WUeTl&?, VjI9ts)Vd(6Gfc>["1N[eojX&(-٫bB9$X=yF_)r<ͫo, tWTgrk6iYڨXs5F>iQ=bvMw/d".`~jGM1KC_o }0[&:p6֒DJEJ:V6|D:D9! BQ^iĘmE8'Mv[<($ p ٙP/a׎*.ק+1Zq$ɭX̡n)۲q>íy͕pi9o]VPLˏ(ejk,9+ڞ:ґUa[yy)!b#i4B)-‡[YIǫt_*;eAQ"#xa*\efŌD" VH !q̛Ino`#"U_\`Ft*0DhiOӲ o| e"t=1m+K/ts6PM]BU㦈zͿYЯ\7Z=Ѥ(|Y2:l4a=TU^؊; kXwU9RS=Hl+EQMSUO)$ٟ2kZ*B&^ysL8AZi0K7KF5Ȥ@ A#%V bHH-9@/$qbƾj"fۦZg>kYC)Pj@DϷEдȳA4܂k7s RQ5usꃆ䇈А)|&{IVLN9p!LXIkā`0HMtHvO9ٯi `pl̈Y%'%%(A<$^R:b4J2䂠E<'ʠ!NdFEE"ssM~w*_*L3I_5R^ z`Zfc?y1-n C ^X>hKǽb4B_O4N"<.h߈*o,?"bBZ P4t@z=&)>qwrD#"fV8UL',K&&h((t I}tQ|W&ą>J#y؈aRJV[bfN Q7l\&l}4^Qi,a?zkZWuO4ԝ7vY81RΆB42{ П͝sH}Bʞ"n^*VRl_./. ƻNv ؊^ঁN!ڴL 9iIN$OElT XꈈBLjaCIP 2J'6PwMD>Z #BwmZV10o 7S)q?QDR`Jf W y}X&JK&K|w8)%Dvƥ"f HuޓUHSErbg70m@&Ҕ$%E3 c'eb5{Ӻ!z":;cp%Q8iH =.uu[*^"+랸{x ߾zx (Y" +‡i m,Q{K  \zb 6a{mrBh+u)hha0nQXi~G3q}qQJ1FQҗID입Gi{zLV"@UqbkF.3lMUYI޼b FD tG5)PJ&/e2G/3`W[KiKI׸:,Kc^dth턞O.%i-,/n*)TdU^U=,L֌^J#yVjbe"NQ';ܮ"0/n2uGR+3JBv_e_IIeYgPQlhsVZ"Mik~ EOT9,r|+n۾~hOVV8rP+SV.䶓 Hֿa1L{ Yлp")-2v)R9X#Af3G+\ݿ'Z(voT١K0qTʓʬ{#b[g6h4\gA!;VGQϖ]ңV3Gmr²CEֲoSHlx0?a8=3}#UīJ _R#ХtȪ/ŗL]3&cL.n^t2x[k`gQuiCq]7OZ+qPЛVPZs&,GHBVtXւZ8ihoԹ5\~%2"I1f7$[?˧ٗVD&f!%NC{_dUcɶ۞1<Y1ޭW\[pj SU٦sfi{M>*N=Z v'HxοV A$uh"r(w=Ҝy2yhA#ý.(Ni LU1N!ŗk6,e!Cy3O0_뺠;i Q&\ΧM'Jsٲg6ő>(0NZ8%4wO}w  { A&E[-AN:X*sT])m|Y9r,% >Ζ@ۈmZ* x:H;xE6 [2D*hDPc4, COb)J4D]9z5W ANI`) P 5$bglMrLg q8\8Nwt,SXAdSb(=  wed[TLǏѓ;נ)I/>3&y0_ vQʤ K5M癛(0f=N2lC e1͡߾b,(k Lڢ̰$yD Ӗcq/He dƎ6%;e acu'ZL2@4aPof *@:Ý۷Cm+ cpcMP4ncƮLnhi-. %kr9NJIFB0M[&^tr\?i_)* 8w(3[+ dm!_s]_>L]a#ք̜}lj%(C#]c3#e =0z}_DQP`t9^~Hڬ{{&ؼ҅$ⓨGfͻdÉmYAL"n!FFLɫ3L?s(N\~& sŹzFgjBAN$x_? TyΛ&"5F+&&YxK䢻 )\Ƕ|#xay'"Fe{Y!YtڲAI9wH ċiOKIR7ޘ" U[!هw¸pR_Dž.e<˳UCG3&]ZG "*\ˮyD?mSݧtW118|xUЄf2_0 7YۭS{.PpB2PzDɢwduLeNjPXndXc:kBGpAK"To&H&Tv[b' V/q*{?T*-QJC:N)vv7>̅rgtlEš% BA!֧;aO("VN@-Ě-Ob#4qFØ LE&DYˌI$,v6b<Hk$xe:ΡY$c䙕] rAjDEccx}Ԍao.vjb/٧'7ԯjJQA ە-9LGmMlM|w GnUZ d. ޕM2eݡCpeO5Q.׃er@s*>kW֍eO#NÂ擊}c]"S2/ߘ/ ރcM&i"/р$L`&j\i}*73ځͫnXU L(5IhƥaE 'g G;?lBuֆ H[FL6{I12 sÈY]5!&\uZ$r)(Yhtt2aM˦d22_G<,W~xEW'KB( 3Wi< L,oPDnďi5W吜DLf;xBsHOr,9deVБ/+m/0 *`([AW `cZf"McE_87I{f;n"1|MdyWpkjٙ"hEצGL 4M8$1sԨ4†6r;KC@="JKEU/5G ݿY$^SORq?PRݕ4"}isتN;#G@iPKELl3]{O /[sOInU҅&DBR9$V!P6R=-c-~aBQJB U6UF W[ZtSYj;4fV`r0a ~T5M\K&_ 93BKIЊA!ٛ:]miBAAL܅`OiJ|xF/#P,n?xX̶0n+-D^4+Jgy0k$ AȭZN+mGR0ʈi:;9|9 AWEmЇf[Syij'4RU'QL>I=0q?( Jd<>#Ձ{vڥ6kh垥G~9!nVUp_|`G4`~fFUJJhZb,,"#k =䘴@B%q J^e;ϔqGz8XOglJGCH ZzmUlcB%V,ukӜU(O"FiA5&LH1!C(Dk{CJd,$l9S> /`[DM5Lg %2,e?Z/I0`R pg $w̿!M82z\~ęB3H;m_Ts&q|{AqPHb˒DVWYzAI2DMtInN(^mR7/>ezp W-=, az\av١b:E%M28yɅd< 8dE+~,8 yXnGSPIJQ/Ԋu$%>8TXڲhd!se5e}d3B)̌pTK(TP%+vD 'nzJV(hڇ ([R͜OCPHJ RҴ]rhPPNeX7Y4 "!hKau_8w=J&_`MIcWr@6e4(K{^1fRa`^J V|[cQPo!r{ݔW~zj0- Fee?'2!ts#e+_#ԉԛbwqV%]bK!Y 17SVcJF(<46 1Zd»^á!#)YwۍMV/!P]=Bn?97GF }NPJrFPm_/\yCSm}O96]9sLԚB 0C GXGcw>x=)S>%wnmykrժ"o)c *kclvNTJ*іp!EՅ hC S;]Ƶ&Jr1+}(Hyh$SRg #EDH2dWN#LRGr@Ư@1AKBYw6ze2@Nʛ_0Xlm⼖jG( ?# /tK(=xCaJ7=6ENO MIFԟ'Vyͧ,$M6J~k^V$t'RgK0MsUё+FF!HaiD/R8M 173v|J؝fX*ܥ'՛U@nT|g7Hua/yU lE>kuL\5G0ǔ0!BrҒ洏~gFH༌_Db4D-AgEp :$i*ͷ%Dt#IN)]*,A4Lj|JX)T ٘u% qq$9PLvԽ3 'e'ƒC8?aMWAJQByS'ƵNˏg|y̽e1g d`S8 ݣDGHqKF)e[ID'? Ng̬뤹 |$<ɜ& I"%ʲ(]\0p$ZI\zB ͫiQHP絤e5;ooabӘ˕SS)>s9YT& FklFvc "PDSr.HJZW?ekp$5lQcƹhҭ.~׿(d`٦мJ;Rb,[%e>|g&z=ќT"E&[L;w8, s. ?giԷHR)R ǨoaIMVg&ȕ;-r9na6H&Qm‚:3 +̮1tWUty[F|ͼt ?{]Nq2DTZ(\,_UX| nlzIUmuOmuqMKqJ졈U$ix8{1OZkܗk>gG0ϫ|tv 4e?]˛4&9[?MWHo# &M ж*4%YU4Zaj{H k\n+T+]lC'IJ/%ikgrFQ:" X&Yd9c{W! ~޴K0J z?1t箯+9zi^BzT cZ* r"XVJ*0AuC]psHjxjޘ;oFG*Eiĉ@Μ%,}oW!ԴbE7OͬTw"B[fX=KewͲIè6xKMt-2("m {s _Ɋ fQ޷f9:+CSv^{NkEH-1ͬT)1QIRgʚ[WC8qLcn>+4d- !8^;"V)0kr4¹ 4.ղJ+ViE,ƃtwpnztgY3NVeJiR8SH_=D+# B7Ʊ,o[.N 0?ݫB0is ŒLM"9 f,wA`F!R{Ӂ s0Dbɬt wh7X=s@D $TA؆)p$© N>Ѐ&~MU9g~Hu)QWfқ/$~8PBM y&WQp$LٿXj4{Y&9M ';AP%DybA;=>'.pC<'OxFiL( o1W>>\5zB0X8IB28a=`_&PUMe<Ϧ ŐBuq? j[WWJ3.`0d=e")N&ќh!'Ɇ圐7/7w&@_8!]4d+3P-75`_;%$[D #[X &FC8#8sӒ+/2CЂ9(FuH](2Uf\7HnM\b{d Ulq$bi(xW#мm%Z6,!lj h,}'Y>|kقP=Ho'ƌ@ˤZC!5P:{`PĹw3ܿ BMg!b/2rWqLF2ػ15⊳8@0S!⽿ZH3m cίz9s;\%[n'a%z4E$ncXկUIߨVR=1tRrYVD YL`Є[NbOO?B~,L#ȭ(MylmSޡiۡR'dHq-'DVa&VfEy5Ļ$:kbzײF32`h@DdFZF!%:\}`@I}pj@Tm/|LSo3c4F%d=)l+H:$݉l;d6y+ -lp!Dz|FI?\w ?6=sJP,Su?Q .r8**p`?WY`5Z (0N6JxSQ#0c$٪t1~2}"bX+rSLPks@.O&D)4~>2vs @ĤyFȬ7-dA%ԓ u,q'r:NbQi8U LPF{ːeFf^Ϊ9cXnGklIۤyCΞr4 ~q|֦)H˛U+)tk|f`cZ}25:- 0xRDHq'Q4j#r1*в"u!"B,pQSO|ԤR@c0\$r vv2{NdŝGy91Aa >@:]6Cc<GZW?~UT)pK!*>(ϢEtxX$LkgA%rD̠̔Rȋ1pT*0M&㬎|c ׀L}[^ξd.bL$p+uMγ<UB&mr)!Izăf~!E륁dM!lHv{} …N+cx [bW;A2­"*am`c!g8āo''*u5Ő>;TyqE5L{CO,P @ɶ7&;RΗ"^XjOCD40{)s!zGE) Cch%|v VjV'Tյ/m%HM . L:\/lDYkd BTK~!ܲťsv4gy,"CFNɘ P~]t%NS $lW*kl<[Z+?<(SvCE؅j` KB Hgܼb߂K8FV Bj#M]Zz15jP; ^^&NKR]x/ ;oNGHGZs`Ҡ%40q'>ͲP,G9Rjk@=J_BE=CUŖ*%!Hks*NɈXm68 gLASG>Q3U B ĔJFPx!&,OUL`N։Mb Ї⟐XDe*FIWR:Ku40iђpJm/܋&[uiӊiPֹhIΗzOmF#d\~?ֲy ?֑whu>O/@.-[DzMlރݗ7&rYQj0C¿i)"(7bL-ȢR[KzEF己~"R a"fP%z'3^! PF]+'Yk6:E*=A SˁrUmdk$h$ILTYCe_|r3{nvbҡ]`ȸ"sJ ,Ό*#ÏcAB!}&:wJ&xtQ0" ^#[ ҊI&4 zA TIJa+ͮ%f>.n Lkty*1az'QYK HRoļ@ -jʢ\Sg IYT9UCB6T'aTk)D+xK8b3 gOhCH~H/Fse3] ]B_x C{D"Todepi/ߥvqeK[hi?Y24 e(9T ؅1 0VH*_b3؅@MQG5"GaT5;eSNB2i,̉7&,6(!&LVfL2>$l(Jg9s${)n|HkVe2ΐ 9FfipzO%󢨴Rx*&t+&z5 8}~59"@,֙/XUIo />9K˭ #}*.uWe&,\XS7aRX^M/2~ڥH} `9+2 eUfLO,ch|m&,b_^#QkǍ {nPAmdZK:_YEɣs0< a)G/]g>F&1Vg5u,GjM 1Q(VFh;]m=wϬTgT3SEZN-n/egC-W%ݕP4υt^Z[y>>_&7My*<.WRwN:ڎR/lyr?B:˞$]i>ER,1.ަi?>I 7 [-ۭ('.+DVպUHPw׌9nbk|S6V n<u;:N15Pp~5 45rU&dMTM]-;5fE~eUӱ45Zh;o3+EL үs/n7v{P.'}ƺg&E{j^[~fj~!Z &dsc:qK9R[{O,,c)"ZCy˺ueŎbBQcLqv@Q4+ϓ [%Γ&هWƊ?1K!&^0(TG;).ym`gQ"sGEK+30#Z"K2=Tl[c&-DIbs`O T$졁n딯QMPq]J~Oj#,eӋ@ m81tWj9m^*["H{nɎ"{g >ea6|ȦK~_iJsRBohEQb^>Zn0]ζLaߡN#V&PLVuVF"H|M] ɓ إQh(Մ 'J~A yZ#j]?,Nl:m(zH>#4~Hu1J ܉31޿hr@ԭ'My9"P' [e5F ˑ^QXU%aIK9!=]`#1KU0O'elSk{6M`2զZ s1.nE*&f4N=Xz'xU JdhYSCb;Q!TH(jКr DI&?:W]{&d=bqq_ǽRR x7үY >H@(KP/! EhvX),u  'eq`D:5I7 bLX'y ^䜥E7k]2P>8Q9Fօ>]1 Lo¬"xPYU7eq{o<1mDgPjrdH9#}\-y. JD-eg .2mA֎rM Ã}aZ Ȱ?rmuI> ${yLI&^k(SRA 9QG 6f*F;5A9ApKJ42{/ܲ4mwظ)! Ix@*EH+!2"QXo8~bݮBoZ u;yq>ůS"]&#ܜ[ ooǠk xΆa%o`{q QO2\ޙi| v%)b?( .~.`)Fposk*2+cPiB10FJtH; ɼ#nRlB&蔌0` cR]ƗTzST%.A)If8>2@Xg,5w<=4b]ۥpžQ^6tᚌl'L|fAmB1,ZԗR2nY`{e&u1䜰 ܚ/+G%|[@i ' t&M! ߗ m gM)߼~ڵQ8Bg u @8纻l[\ ԙ1$K7;9{nVaDʸ GDksOJޅ(uOb\S^؞Lg匙N,L}{C_uRY3n鐵 Y?VꄾEoK%0S73TXjLԚ!#l!?lH$[00u_ ޝ99흉 }" :~Ҍ-Ck< x3VD$O¤'J w#,OqOFZ: 0v# ./\t@[8UޙH&6H#}̸1f/ji9t0ԌkN?alL^*ȳHP ^` ݽ75y3f{`zfG @jN޸_R ,VcМh!zWg؅l;'@l&lZ)QIjǘxCcЄ碲ȡ`]qx[_rM@0+TiwUݨ}1ϐ1be HrT[amJ&5?P㫔B Qwyb Nz>ʥEeC[pe,&a I'1 S0܉'DU"#V ] Ik4xP!aA%~\WL(./be9ZSaeGvR>;y[@Zd%OܺU@&;e2V6&=$@N0XU5yF\MѦ{ u7и%Hke@09( 4"PP'>*ejH|"~Lz#j.KCbdQn|MhHJ)B19\|p(H`lNo󟢧F=w>`Ʉ7sByNw|xOJ6ߦL`:;jmQ_M&*(&f ͱptǞD&+ȭ^ċt=r AVKA>GqODFO7qD3JREzLn \ ^.sԸ8UuZUPJY4EJiiMVUG6KtR1$u󞈟m:<hQr(o1g՝}jEΜ;& lZ! {#}w1+ :,o99[ _61xQN0ZAMGHk%Ta!Z;|'e]6 ܼDO5S.,q4_ٗ:.`M`$ ~N-BD ޖJ[gE>}|}di_m%K>)_bu !BVU!w!A15[`AHPPݡC\-vÇyȬ p/ɮ y̜,iXlAxƪK$%IVhd2LpmKՇy!{ Jc=WZ45lIR<|cYM$!&kS{w)<&vEl [{H꽠@ 7+Ҙ 7SUf*P_GԭkWVF͸ ]_&n!>&F3 H EHJMтRVH,I&9`iJ0vP˾[,^b4&L+r%h}yzZ7o!>pQ9¬(.Wmn9lFNWsjiv#UeG4BQf+2iXTIxEq(@B b )gO?g>`Bb+` A*.?uLaDSf+^dEDUWtmr?+Dޮq$@[?qpvF%ɧX~>'( ciH)XFY:2Oҟ# 2"u=`7tLcTYsƩh0;\<@OlFO]TT 0wHo7gן0+J*i-Hk|D# 7LR0:HyI<<۞Т,+JMr0?{VԂT '>@4O?gΧ#?7C=ni%R4Vp;m ^S|w9Hg3:di# pUBљrrRc/DZR]cMu!zhg,cB},Nўݒ4DDYR CD׉Q`ϔXldonRdnl>4_Om*Q0Fgq62Nc˪I%m ̏0؋wu)lB^KNXv)#4tcXȷJWKɼ6|uG 9'"+%+Ooi8LЮtL\&Ia3n$dR?JjKc"v;$lӂI=A4Ά^WE8qZ-k/\O+ւHD?jx'WJ栁]5omѮA`Az *y]ƵNjF41]2J{&Z܉S5+ѲUYgCZtu6~B3aҍ"f=oeIц[:wHC:yF?r-I+otDeTDD*?OѓH.yu rvj_v>zRn.:%? eg(YcJj.HW5H\j 0 _{l 359VrV*6mU*)Pun2LI*[AEjPal+RuGwj xmfM˸X M٠t0׬ML͗j d'v Vq#J`n7eg>DH>|s&[ѯZTezrsɿ:CZ+iCܡGDGSz(hE|Ю-ڂU=C/<<7>.Ǔzy׀XJe³lܶFf1e5M\]㩊RƙZCgyVi[j9t \S0ARpK[Zf%JMMʈ&Vxckx4]_Hv!m.Px4@M<.7 z2&#mby+dOJӚR i<ﲽQ.ĶEOk?;"L_ZF8&΁ǐ%}m@'FL,調.1׆/<)7'oaC9b}YhDO @AYs1)HC^(\ L_}PH,TB'A,!aNOf&m0q4ӦL鹔^8z.AuǸ{S2bȄwk=t+,1EAh{ ЅB!X#= (T0LJm43mʹwc^0bxJ'P4 T &TÃD߷ˣˢc6'U-GyFR<3P|k"N_G_\T[RP?U^œG"9Tc΄uR ;0wH^ `HA9DUQāT)VE"KBd,;瓓Z5"cQy?4qaLY2.uގI^6J/2̟VlKH> y#":uP lJ9:Ԋ)].{Ђ SUD2; Q"y Vfl4/bַҗ(j[2yJ[M /i+?qk5&E]'=H@λ3 IkI1b6Q15%KyDYcFСD]0sɫ}Qa6?2A0 ׸DWY!<]9 $IMS㜮E| %iz/P߾SB/TfV1:拼5C`abSW'(I\*` eK-a)-!{fW{f|[XH)aiVX3Bf=#nEkx"L"iier*3&}-㮳NAӛvrA@PAPOF()J +-'F$G/2JA@yl'[ߗf(ҋ]Ӌ[f(QD`E"W*U\SRd?*۷!h+Yr̷f 2ޚpz,  %F-]%L* J;n&5~)VǦψgNrqnWJ/9 (/xݞdle9tY/{XBE7@5_ӉU: \/AG7Y,IA!<??vMްODQC@rtFɻnx|Wđ7釪!wjl(y3|{(Ĥ}8YUPT]wIui@a%$Aى Da *+*F 4 3:+Sd(ah /Cx-{clrǍ,L1J!kYYckZOl:% .Ι]U"-vf"&`Ќ*ф =8͝NDZyņ*#]gqƐ˫ ĘuR 2 A m=A\`^Z ҟhJrybBE|އȶ bc-6T1\JIH5g][--\,}Ӌp-< 0 Xi]Mf=VUф(n/^HEJjoĭ<- ]&z7 Fs;$wgNe HˌnɘTnx@(G|sxGp6߶t`$m8I| {LO^lx4r> R3o|& XeVס\Fx%a7qFȉP^>Pa wy 1Ъ8B=E ׏'/JDTqF.UW@?'(1B~ cBuLQ41 8ыv5Lf YnQUbV ? [Fb̷"RSW G"Sp'+dfoz)PktDu'NFS TT8!r"O~IODpcfj1_GڢUq'&j.EJx'c cfw ^.aXW!_5 |[$ cWk_FKI4>vy W馃yAꥵ̭/tIĜޔ]U;wJ*#?V!qYI^O@VlpA '#x2 W/ ,>$b& Md䱓OGx0p B ir8KG8lc+8v\}qRFg3lX@k菶Z}|[O ΢b^ A(T#Uَ,gμ|4$AMjR5)+~pϧ;l \#;W2NE'SJXMUvI*ꍦ,ۿ>nʄSJdo!"TV"WT)-Rm/j9èjʘJg%qDm?1S|( 2L l j(Ow#řM,CXbFB=aB"]i*Ev/IEtg.͜.4^Yۉԅ-a\~&IWE)NҘQx=}-&KO{`k]IΧ@ąFl@L"e jJE߅Vh؃ūY g-q&.$)E]'a}$+̀ ںA_r^@V {lzMT2gznuZ|_X@حF6 _cbGz;0|EY$ JIQAxMj焎3i/(kh_i%`h ynzZlb6iIrq= ^xMfFgr7"?k**7BGytݵް&k̬dVFAo"쵐#6HX3+ʹN(m^nu 4)s3&nU21^w0J:8L&y% z  d4[*U czp W%BSᗲg"Z/[7Z~:[CLAhNZ H2腬C呚`3e`szꂥóZhL3J=7!e0y%_MGJġ-RE[&ѤrMIߔ.a"/W+^"'#njPWH5c~8#Ryj6t\>Ci&v"'zu ܮS%-0jcRUn -7$kn)Ɓrt!Hzh=]"*]MKLm,^Or|=Jٿ`{0#eaɥJ4LEH[Q|3BUj %#L`iC,_G::U !B=f 76 @|MRˑиF59]Zt Ȝ79!S]wO̳=$ndUEܰq4Xh,+-\q%l*ά YƄ\daؠ9Wx8ӄJDh/\r ڙAVS R%>u>,H\A cUo y9'&dP);)v$J9'#mtI[R[#GE=ၮmZ ;FeIm8OYE$Ae]4Ur`,C.Y9`]zdoT]Y 5]Ř34Pc45# uAr&6]_V>frM{[&Rwi߁evZ'/sr^2VlkfjPFj t#DJJeS~*bjL*|VSlTpF9 ^q4a˷6 LZ=y'z`ρqlN63ڣ T}U>Hj2Ap]G]:cd(,݆a]F}Y 3 *ۗ5_z"cgL!]pvYPp@Ί|T(C% "a=O|8aLmf{omÄv[cZ)&gdDezT/3UP~$>52W55BT # !iKmnǿ O=%lSJ;PԄ܅+4.f>r2ce$R{idVZ6W:.Uǥ`DBg V$+u[yJ$o45FIq r4Tp-%'$T]oP2 l#I "9,L'|g;|a3TJ/r8ۋ(Q,%plIdVAB$,X|۩ p”OE >1Jy,7͆ dEkyu2>[!;{MiO DAW#ȷF BfUz?a[JFړ˪wD(P];, d>53Mptf5d#t]Pw)gAxJV~Ȟ[]R7,;5aHL4B(Tnt&*-9h-!m…>p E:%pd则0w4Z'mRZV8ؒL,҉J0Fx 72$ k43B1*"u`0mP#pդ"ULE/tŌqLާ\ *'l9}ȠO9eu`ӟ\وL&¨ ^L-D^*AKg5ufہ V$#M/N٢AJΥHMx`w;S@Ǘ}E.`P yZ1"n.JQ{10E 3AnQ;0.E=E>DWYli dM1Pt\Z8NbADڔl'Q'hp ̕ns:!n5/)"jwՍ1"<)=sAKOVyDay j(D2pe45fV2d)}עEʼn# aU)2yf*EE -Cy *E$ɤR/G?סPBP})k48zr F4¢b01ʚg!%jiV昛Sg]ݜ+wp˕b=2!"_脰Y!A5ʻ{q}s2awHxD+F ƐNd :@LHS,qBֱЍktsQmTT?rq\^nJ{2>ijHLL̔5# z$Bc'*M%]BA:T AI} ,GqE `h} ލV1ǣUAOOu~׮h HN5/H$$ m.BK-1s!=Wnʄ}*՛&}6? dEfNS|졼'A`"UʞKQ7`6ES&DVR{ӂ "6p6:Ed;@hd%Hvp5oSQXt`H|sh~B,:'J/aᗖSkҪ?WT_ov[/۫aӕQ]YTvfIuFyڢe ۣSċb+y EVq>Vv|uЉ1 - >%|j3t?{P"bA\;Ibc'*>V>V)Cp+]ImRDF44%Ȏ:T#n+–</r1OD2ix|$ʜR3{a sқ-k9_OTg*kR3=[D&i܁HV̖:> /J`|η,. VoXx;QJKfOOtNM:,]@u6ޠdFĠl&f3S^7τ;0,:ծ&.K:@_I# KA.WY!vWD C4Yuz.G$;W-4gNԖ]'Rf4 c˖eA?]GX`h3du`lOT I4KnpyuU \9(//Oh PT;$&] 4,gcTj#a^WU` |A0E&}:rQ*ʊLNT;:+ P N"T0bϡ,z&q}2Nx6]+fN(Bբ(R C߱h.# I  $x6OP @Ό/G!m`RζNZdPJLeP#D$yq 86 4yoiY$)7~Q4(U5$4`d4?Ԓf.bbZrdZHޞs)N+\Ojo|<<$"Lq)Ӆڷƿht Zwxc5:eNQ>`lc0on%Tp1Sy 7|A?9I{կP;mFFqXFUߡ>+A64kq oZq.U~Ƕȃ]Wh,7rd߂or uVw*pR:@ALR %F#倂feQF4Ky53IS"Swآ XVZT=.n'Ȣ=}r݌45o+XYҴ kWL@p~Qd(npLalc5mCbn;/mj[Qy~ӯ[26k,ۮY~y f`FZ70 ډǣf&CB_U% hm7d[{1|y CgC5E' P"Am|X$A< q 'ʮ'Q=4Yh.-A J\(͵1ZJZ(I677-GĸO~_b;kF HB Fkq.ZA.%Ҩԡr2"^Ky{1EZX"tb񚹯3)K{5 zfm_5cV:-, u?,U@[ y)ͼI>΅vhگBfܛ7XY^\*V&c)^q<a=`㤃35duapD[zYi,Q K0zg%jU.0Fg#,ϵv`&zʝw]*:9uFvUxYHFbE95qpI GKLy,ySO bP"T ^ .8JS2_t-܌$},bKq,nz܉QIz9#Y&#X!9MGx"o"lecCF MWɓY/ ZӉ\*HZFߋ 5l vMt4a07RMaꞆjkWt͈B^}(`dIW4~ &q C 4C.v{FS$̐FCX" ߮JGQ.!(A-~N3V"#heedo8&:f `IeZQ5 W1Fɋ\^(J؉!֩W,2KJf Q*SiW%ȘKc463ⓍvB i& yG j$pPy#H-2Gt @r%N[W>$Nҿ`2'd+[)7RYTzblz vLpw4+jiT'F%6F)(L;'CBr!~^Uq92uCȃ\bkC4nѽN}[Q%*b>ЩH}AO#)| Y>wG/7Y'=yS-b>u-8dz"UދSlؓReWtJz=LlfTb*V< t;I1dȝ'_TS} F~m)3.HF}O-QIθZIv3O%=)Y$STS)9YEWI2[$?JPZy eCQ{l?GLu<Hy0 \#,|{0`Z#Ȋ9j>/'kC TP* rW8]Dl *sy^M#Ƀײ|>=>>U@B_XuqŐ"V{;YFRj,&Dd3U~fc= _|d{, daD=?K0I-"yQxbQ"#ۡ: 1h.GSur/+P@% g@-G@{R;iV~ҏ.7'd81Rr42WmG'Ix|Lk iN Pv'Վ":c4_u竌"*9 !kmɯ}l*h-kI5 UZ+A|3BpuJYі3 =$?'ڤ;8x慗$/ o^ r$M~w\07|}8Í*д8Xa.fkV)N& KRR2l\*əC*B!¾ڄcq+M*sUUS"t\$pp!Hk` -kr&a2w @$HJ_$Hf*`7nq|.I]A7E(YHk)TZf2~3,MQ2|2AaViiۖV: ͨ| oWl=1XL %|bhv2NdU- emA f s;ճmI{D֫zNf^o!8t4-Ro1!3'&ֶJHqePt?UxBṚթ)*Ri 7Ln&aELbGgQh3 be;V_jj962*sA~Ε0Nau2"RO=uH`:1MGO `D;N<3;rzE+f}i?4|ujj=䔙K:cd pQi|̈́geٿy|^i]i@:*FbR;Uv3)Tv<@emG]%;xpR ~ɜ\@n4$k 2˽$[#|m*n}F9}k Rq_$pTe s.0t (d~Fu%DG+4_[Y'Qi\cF7u 4t_C)=xL1D h9h:( g7[z@.Q^TV3we8&%@RpI\sct  $X#śK0sX*Q}8 `CIJ'O'lkG9R(rE4 iɰVcHձe@4 xF,HE !# #EPS3׍x ի .W/D 2/+F Ę=6KU"O,IXYnՕDբ.B&+(Żjצb$>K.ЕIy=HUB8PQ_d+Nc]xHfFA}ҪE R :J^T{:-Ў+s_(4fQal y9R~t|~N$6k pBОm͙!|#\Npfm?jbW/QbmuN@C@<`D>䓧$ z.GB<@r"v;XM'ܠKBև=Rw_X"ҩDE#/A!@,OU4uzd[De$!ljdTGMWD7.ؓA,DlBx7a*8OǾ"MS$USwdK|3AvGNNnQ4HROQq$֮Nd/Wd HeZܺ*ZFƐ2KT)ےyEu U@#)qCл2Us0dxoL7Jj5Kf'+2kh0Bhl+j"F Qnf]XcyfHغW>Z{QuCY.5. &J#3 ˥@O*0[G9;am&]*HP3Gw97:uh2{Ou%[`*me!Bv2+N^P "QRWclYDwple_NJ ކf!W2!L8G^ɑ)PO*,AYrqÈm2#$ϼ.v 9 }J5m$rkJ! uY>fs=mժS{AWՙ-+mQZ 9yaJJʿ ~ֱx0݌£U燤HN&H]c͂`;PZk7Y×Zd P RcE=ɪMt8Ńp:[~H8Ԩ#Nw5{c}@+ =]U[ a7~{ĮBA-/|jib3gGTRr97|c0V^0~ADwr O}"沸rdG-YAѫmp{v浪|ӷWrʊ]tʚ I2ͽ J86/cQ,1`Azc:MFhA3ˍLm6# %#,d^^~9ggc_ʑb\@wu }G%\g1r4l)h+0Y($[|8-.k&aͶpgMX&b9t[qJQe/}_#>=8܊{?G,gٯ1;eIKމsz2z|(8 Dxgw?d|$M"4~9s\?u5;k2sitU|7g!nAxeM$lt>5X `NHO8 >KP\*Wwݗ±U[vi#?aN"+%?XkfhoӢ/c!Rxo$EC؄q&Uj8e*0XI3.5;w r2;}ˆ!!!/$l!D UnwKϞY#wƍɊPJ^Flc)T!1-(og$2{mh}4Eʵ&,,e1xp{v؛ ̪n8MQsV4b}9Uw/ H[GМ[HNd׿LW#&2p Ea@p7g?X2JC$*c5ws*~+LD`רk?s'SD Mp#ЏbJ,`Έ ѡT.aQD6)%νnۏB?gu84Sf % =*t^~EPDx}{yyEM ")]^ַRr]%@VqȿvB'_/r/O> dq7[ KX[=%R %T] xKvYf+qyQ;f,^x@rnaYWT(ȪكneB 0 USwM2E\|o@h $dV%r!H0/_Zh gHk92yGވs7  J7#ZhHj#y!?¬Y{KA_HiЋy;jZE_*48#%-CKiS`4*teeCfÄT}]H^m:(.G~U-;t(zz:oGcx! .#(LZW! ΄-HV KVNxj1D0gybq1+"#~f~X1Cb{Lᕧx%$9eG%?+KElKRvy2̼CɏDm0X kX Rr7tmdm?oO؅.V.$9 {ۅ#?*gerY*x|<\՗ 2 UC|J"YBLX륤!;$~,Eҵ70t@M9ZEJ@IQBK}5jX? ^mKhP4V%ixѮ PY<mV G, H| }ls,U1v']Gۚ}6E>q^DSoA!}%oŞ"];FBY]^,ɮtBgZ+4D f(_1vޥtFOJ=pb,d,QZ\lC>zF nIRDi &-.>6՟9ʣe v;'%-mW_/vcك`Ld6wX &z_07*H85&ȝ[^ӜAwF.tP .EdcR췬X J7'VNEY,+^]x)M%̔Е1 ʌL.x֕"X62QDG~ŴWdtv`P5%HoW|̾DzzjӍypHV5logxΡ}l&2E~<\UgY'񢩦F 9Af&g1Ϸh[9D1A]]/EPS@;EzrrR?EEk$ٜvKɸ*7kR6uEhKTɄ$[}T%j+f/WDѶՁ!:BnCzˀq YIL5cg dvvφ^NP,ɢQ; a8$!Ol!bx> u",W]FÕ.#Mi#9^ĕ.(5b5 ".fkhae[TE LKh +|My a-R]6sz[eN]uu:~9hrʽ%5#-i1'JtJ=4]iZ؅RP|PWڻRUs3);7>3Y!۹oT'Y#i"JX$6V ~2fR|?oݑP9Aг:e]WV`4ay@V؄"  BCO>D-K\!UEpr^~qP𤓩n&`_#fߑlT FLh0ʅ{} O1{)] i"q 420!nbs@̷M[}#hZq &½qhau+f#锦li/nK+xM|JIS}\[eJܑX?~(B:+y'pn]U(7ncqz[y A$AD+DB>BU??o:;676o8s<=B3COOWUUS$GGs;I=:<9B?CMLuU,TXzVjQPG3H"J5J:ONII9;149;JJUVT Z6X,YqW4WU%TSNN[IIF0GE:FeE FHHRQ a]^dqa%TS9;',/14CgDUS[Y%TSDDE8::@ 8:@7L9C[DNMJvJ:/<,0B0$3)CCVT\`ZRVQ=>s+.s+.g;X=++Ak-,>2<4f3-$$z &&N%$";eU xKPL jv aV *,'/($HIupy|W7d  wi"=)g$o8aqH:8Iٟ2Fqj7IҺűȮ˟\I\I:'Dnssn Ӿ_ܡbqީʀˋ*ֲLťVغ(T\hC&.ƇSʥqũÔ%^ǐf\hiAkқ˰d߻׼NmGјɟ\`sUUļƸ+N.K=iˢɹ]Ч͛ Gtg[?}[ջ8 i]S˺NT--iÝmD[Hʼn,ˌz7ئ ͶŮGm)]ɿ5Ƥżi )kˬ`ĹA~ޱɘQȶQȶ%gڇ+I׍ղ҃b\оM*ː7ڹֻR3gi~ԑԛ 7@.sՈюїij$ʚή2=N0p[fʕɠG./D%neoWkqi-r`?ѿbQDŽʕІ TGFqOSg=[|ثأ٪oX 6A;@nO:>R۪!GAV߸4ޡ-r& T׫أn;[L܀ܪ r,ݲ!mXֹ]Yc^iJbE*eр҉M$q[ݩ#xܦ߮ކs"ٮЁњήVג5ڽ3%׉ iwr?ϓҮ]3ŵ B6|@Xс*67ҸШT' Ի]ԶKq>μضףܣXi˱KqK,׻/Øj֛%(֜͡z̡,uѧؑο'ʖz̡K̬ť8-[M+̧̫"8_-ρB6c~γɫ"치ǶqֱsՃ҈;i֯qT! QѵGkȉ'D(Su]ч>ևA>ېbμ҉Ӽl.]<Ͻ̃L9@Oݱՠ_fڹaK٣YU?,;Ң..M%ݔ. kpL)BކZ^;qOc@D O1 2x ^rܙ>7C+ &J7>A->d,{$ն׭d6D]. M!!\)ǟ˪ P:G22=65vܔt x]o?tIyvJCJC[>D{H.}4Wu Vt kQ|Bd}A-`έ/Jt% ێ|AT, lE5Ag| $N#"r(߄-PM@6 6 {&v  avY|{E5 z9~SH3 2" zƷp eC n5b F  c~)Bs;(s%ys׸TLf /?BI^gp~\w!^4rQh   g phkX(j8?q #r z spE\l %5f  DZCB  k#Sg x  D<Frr:mv [ 6KJ \CI c"qdT <#dTK q _+'0j, %"PI|AI|)K%" < E!{'.$A 9UcRgA_~5N5 ,  [2' J 2 )~'$(%(MGMW j " !NUjb ^%"$'%'%Z$"?*MoP ?1.;25&3 "^"3$Z1h0;2EA54- s(s(G\CHEA (("#2z1=I;=I;.W-YZG)x)EZBDA!-, !#$..v0/P -+$+y651_0-,I4(3P97i3d2 0/33&/.. w!. w!87"@=++Z!Y32B?=0:Z8n((~ 0E07a6 2y1\//*,N,"# ~$/.HE/JF\97%& !%##$a$t%t&H'*+c>W0. S_B0./<9k6`4E('t\ t < 9A+ *:86;4R,1+( ()(@($#&%&!!F""v&%]"! ! /O3.\3&#%/-q30 *( P&a%+)(M'27 m TztZ  ?"R!k e `W F giO`b' %#U )LsR .&#B/W j ;,?fthTZ,<  ] a E  oq#Q E 77 L9y139< f  B:@d([`E C U$RfZ {&?lP% , g | jY Z | ( P}hg c  l t L }DrM:/buN'l+r_B?[~ ho`9\,$ D S L(1!\ |# !68'6'ODE +.uJ^ ) S XaZ `x<4 RBr HAH? J` f >@ f^R c[z]HT H + [ICkeV* By hAB\ IW10^sYh slr^rM2l3=}J7j@YJa', T W 8Ch mxzS #Z\(I 5Rz$4C4 yL!5 ~fW wkeJ\2@~9t : & 'pa u -u*>|A:}18=;# l # h ;frh!} y ~c 1FP]HLB{W6x@{^9GM&&q@]-O w9^dn3nۅ qT$&߬SG0&Dg"qF Yk߭#-C7#z OKh$z~G|*8#hiHH 3ӭB#KUlO_EP/d34-rLk߭ &YVSLn"O~8 {F5}qS+|b"I/ ek yy yy 3Qf_a5Sh?\ZW~o"IjSH 8|s  t~~ Y. )y /w <Z0Zy y (U Y0Z =*3wYR o njdjdi9.8r/')im eށns=* rʖ$*!4niWjd][z?AI)_-MD[1* e>%C \k *gbRx@\ܫy_\0*Qeb?b%ww6kZ Nmh-ZnI ]E l!gM0:~ %Cθv V _} p}7-MhhA ݶT @  ; f+0B!W f ~  3oE s&K)O  3 c~B@(#Ev 6  l g$fD u C t St!%2`  9t A}\ it3P`8x[ U [.p/2 [O m4 . sO_ . $#q(8`$Y A$)i . _J i_ z8YB "/%st"=OI}jCVZ4%C4CmCBr -C -   CRYu?3:6 "w @ u{x#h  T_ @ p <mr-  l ;GZ e  etV$v  * ~@eG8G [{H [e / e 7d'\IE o  [ 3_F x V$ xbn)  2|kHt|m  ZM $ /NY thO @` b L*m(RwWZPft_- hL R \m/ ^+err{~r (p-w  zp   Vg@'  q^s  h  r V;d1Iga'$xE"N)'" "OgzsozF  +@M381X$1"0  `g?z-`6  b[g wuS6!Xr  u?.UeMi&5$ +nD \ta: f)v <op%f?yb a3[`. _ ty%* 1yQ1UXu 9 "Y^js  B }~v^FP2U )|x3 m  T( I ! (ATy[  (1o LN"TTT[z,bh{@\\iT-j/d?5{ U ,Tv# < ,R  )  UvvP " }5dgQB  Xp Pz 4 .  exb# $iIiRg2 s\ d_  B SB7=  &| dA^ <u  kg0  hcfjOsxv- LTANq" ;   PkTw{#1t@j?5qz{ hd,XG$ , Q &?W_ _ Zy h<tRGsy:0 R f%5yk gDB} B ]Gn~0OseP<Cr(u X d(k4< <A2(r 5;ubA;v" ET 6 VoObu3=  N;'v6x@ m,% nvpq ]  6x.OC t vV"f;m @ 0  O@fp'YX% e (:  ^ (al(Y cTc (P#k = r FM . T +T~ 7}IQxS) $ P N.NB x f~ r  a  Gl FF|UFcxDVPJ Tw 5< f Tq|   G 8Bc(f&CVL '/\ 4b 4 ]dXN;LX,  Mb K | Y ]aK|N:wpFr?I?Nuv . b& _ MM | A1<b& ?W 1 ?? &Z02:<T  pM i S u  _ C%$}- bb OFBH,J x C 7(* m([A^ e<W)4  TYum\ ? mF_ni i '3N @ t cs_er8R1   yB>W~2*"y*  tRof4Oz f0 R &L% u rp/ OtRV& SYY&ZR :IcJ)@)JC8[XX&,R g ? `6qWQs;UO,X3T @ cc% ! L{Qt/$ mUW}  %t&4 H  :"A . $ UsZrK Pk [ U |Dx41Z`3 `,% jWr%% fp+FZ:!kBgu 0fM(,~sGf]1)VcGgjF \ YHa';vO4]r,NW[dck h.3<  A ` $`KA:ld||a/l`<LG%G4s9[p v/O ~ :JFWA ! 5r{H0!QI, U]S[{]Op _6FT@ JWFbpR_ ~<(K Mwd5nHI7 ?mK$,Gxw6~?8^xksaZL3 _sx +PN,Bp  @|p@:gJmKKn3s aS KyK(38__w xX3ga_Xg*_sh|yKIK75 )azV3<MW,-|aA K Ez GrawA EC*OgGm%\/||a+4^#<G[<]P5fZPn9 1O:Z)FV7H41aJ?dNmKiVN)0dMJ_6H^7/PJ_h rO5VPJ_ZH^mK5$rYV,9W-rYwwV7:(ZnmK[)i)i)ggFxrMaGG8> hMtZ*J7B fq^6qV,.6'JV qz>uQI:^TP3aw`rg~M:!y Kt">8)K$) 8 i 3 2c; }.4 a)== hs7H ~@~ xM 58yr 'p+?p+~(rz z h>J&V  \3:p\DW5}K 8k-S5qr g ]!\4ICps aK!\P~(FH{n6!&j0j0]! ! x7  o 7xnp+~ <QG&Ll6LjV##i]68up_dL XhP o) n ` . |7C.mkq5JEPMUW_2znovuBh=4H4qYv g # C^ wrnX1 T v J .6Q1E|4 L!*IY+6o qqw4Ew { w q6|gvOR oc*"y J  _XI:I 6 R, NrgyLO.i?$t + ^ ,.@+[w(o !gz z"IBpc uZ ?fIpj z OD zxzn C- 8pa&uH] :fmB?%r?0Z+- A:MNP5  N - 5Ac5i  < !fe$5b@zvny+< : Eu&Mwo0YT1UukS ! o~Mz \ w D\+l  S   N&{f  - 5\Ll   /y~OR- Qj6H9  >:olO 3u ;{ N |D"}a :+ i  Jn!lE9/L7U 5.6i EJ<9   T&K~cFN~~m|([C ]T Qz%"C E h E h 1 - ar ! KrAT<y+!LG + | h XVgH@ F ! RT | y4ATL5 Y {y   O\d*u T "q# A,p`  TG A m[| TK@ U H`|4U|~( )%  . Z uD:[3f N| 7/f /:P KOU^v^(.nS|^rqjjQ%` M HQl t  o  t Y,@raEtEt&' ` [p U`Et L Q t \:,K6%  dd"Y:4Ok?  V dkds=y4 . )}sBP  FKjb A i I UZ | . Z bD 3Ih<M|x:iw=  L7%cApo A 7 V+j wv- < s+A,qbh" c - (R9|1/j/~ Y E h  Y j/dE h u T 9giTvFE~vF :*2\~gv- >'T|5] -AZzA . .6m+ i . \Y Unr&i(8 . DP+QY4 .   e ,qg 9 x 4 ty  % eIY 9 t g a XBd k+c-O9, 4  y&- .2c_b@ 8mb@xic2X+  * p P q 5 <?f!!a z M2MX?WBaH a n H Zi5u& mUM_j T & |5  [9!4] 9 4 N d[Lr#ytR\6 S| 6i>kHV<C>/~/% aa.oO/: M yV  z t a % '^ntOi % + RI~7Y 9 ntM@V F & 5 m&[` ?yjWv||*39F T{ M !Sy|tRh-M4e a D- ?aun!f +  ! 9!4(.()@Gs  Bc#K` +\!@z{, >E65 g v6 !~gY%q ,a @5 ?ZT-7aShly K5_;#3g@|F E2S J7jrw(m  U z #ntj &5e2j!%! bA2UobVmG#d 6> m>Z;8KOU_s$zNs|f*sP]B  wF3_h.~P 7oCdwP%n`p=ddz 1\x=_=UwdK)8# =  qvzx_=xlsx S s^ ~P.Z  f3P 2Wxs.A %EK|we_  ::$Ux K q bA/fm+ ]evU_\ \ &.Z+)/k_2o<55 { |35 R| [ zQqOGL $7AUAL7"ciT3 uSQQ6kPr@qEK$$?dWxd;K x ) j/B=r )IH|^ s# UJVcckDfVSUDD@s$_ _ 8vz  3 ?}2=&$."X4dpldi+T/%MIVD3 %I_V~~iLG  idhM?v_4zSi@ x0PsSfn/) Z S_a4E2"Rg4dXf<)M{ivZnSAn  L7qIwi lKAr\ } II.U U P82 K p` # - -y k + c( #f'w7c"F]u$T-s < hI#F zKKPthA2RKPY!iO'J7 I,R JTh Tv @-4_2uLJ _ 0QR+7|2p#+"fV  PN.UG9 I`KZI rbAaFxrewNDj;XSz T I/+|` !.O$qemPR% K"nT\lrwv Os&qWXj!o<xI  U E|r=!wyq K2`m?\\T m k7]aQE#y  j  K `zlE.y>J',^ q KXY(&x@9M  O?u{vY29SEg22yPr 6 z1X '''s |B1 \Hi=_1KG?"NHN |Y"H\2  ^q_|>>'ik* ;S'bv=\ 6@Sv_1 Oup|g#6 J EhSE=q " G;]O.eA  Ub,2{[@ { ; %Z&& , fwg"n~K8 -O{z ,y~O!&xY1K\>gNSYh1)OfBa'YF' Qnd^1YLR*M ,M ,tUU:&[m_ P h oO ^ c 19g-SJ`so ' *Bqh , A7= (i*[ ^ , D$ :!]Io, }?z\`fD <)>S q 'FgDZF+uN$xO I.MSf!b8LN!a~Du8lXO$N:]$_YHWZ  &d + N A`n\e$  u  MzA:aupB "p+FF48<L/a M %ayth! : a A>-r(!(88Z{$!!yUUMR[@#p% :#cccQN?>r2  ?y [`RQbs<kV z t   `/a : M +%JH_[m M u`EtEq=9 V0 : OoE[  -x*~%Nk *d lAaw8 ea=! 5Lk Ubt>/@ t  4` M ,qt)Ze3:rZ",,L g $  % {ZF,y t =,q  ,={FE L  l|9L * L +%T~aMiN9.o  ~N.k  6iwe @`?y?S M Z q]>%wD n % px~>eeH/H[v~D,4]J-L_St&j [ ` O=e3_<*+XU_ coM5X3_BL+yt ; u [  ! &t9 ;   e4= / OL t,8ia+<c iaSC,<  R_B&s a M u m uYFH!"p8nT4e$_ +  eN~p{f7 ?  D Ll  iNq~  !'E?MDkV 5  ar:: ! @+|jssl'gN~ `FD:x$ezMykZ:BB;Jp s"Q  S 9eWX2 ,&u#biObx~dmV Db?)E>SN+f,U {}$UR,M  +l]N CNkkrvb3_Gtz/\OGN__$O?VW^IGeOuSbQ B< 6K Q{:052 >GezkeUC XND d MS~J , IfzFjwJ:2:[kR/&N~Gb5B85&c ]c ]GLc ]Lj0zI ? #x 8  |zkx"DZ &r2$1kRYz%Z\qk "  pG1i'[i8& p=w I  >S%RUb?#a? !vk X LGvu q ]b[SN_Dl.%LG?;0;}H6c!.STg, v {"G!;!8'e6Jc YeyPY\E;EO#6}R4 { EgS\RGwKGA  P 2TQJQ ;H d8:Tgby*::(YX0zI jx(q}GEyEuN`We[ oE0 <4;%Nz00[g[g1B'  DNCOuUk.g'M S T_9ev'lbkQ9rlpwiFg?"g Wcv?''11li`1.d<]|/\Lb$ >S2>k- XARbSbS9}}4Is J ) ;I\~ 1:x)iD[S,,R,n};;G?r :3S @ ii*nv_g14[bb6 "z>jbU"* J '1AEQ1+LS! Pv@S[  , x{W8g LY;s q;G'e[!; vceyPp|gh - xE-,O+ 1.*ER1V   GD,Eg;sOz/ ' EnVo%h>wr(J(~J_ 4~cEK6y*mhL! m!t- BvVBL P$+7"cjl jOneO{|`AaA f8O%@ vG8gN J `!{ , )\-g.ZTz7"id^# (UVf a @(xjw ^  " I$T 1  lM{7] ;'e'eOpGE K |8,4,EI 6\n&nMLdDD\JOSxYe]' J gw=C z jpa +U5_[Eg 2 ,-yBa05lQ    0D3  :n E  #XG\ p oc5dd4 \UVu_o"_ ;u 9?S`GLal k3$:(b[i? _xn90vc: cS;B0N!O==fm/\uX5 UGQ D3^  y>d3A 3Kc=Ro { gb_@b *ENMS!60 ,i  %X;$}^%X -~~x$?f3x1Dv8 ,>n': ,6Nsb(8 (D | x1  q ]lN H 8HQD"]-;Dl6Llv&*vq;0\v-2vdD e2s9B1=[e>=['"iq6cVivPPRU ^ _i y " uN\[\6ce>6jB\2sm'[;B;}@ ,N 1MMgKH'[Ywrb_Xb;3BvB#XYtA!C>+V:x) j!yYb0n,z {bqx}zNX , AKA^K)8.EB4Wqz 44.GsVbO>EaVz ;A 0ZJOA [i\%9t|g,;8@ 1 j%fJ s}sZTN e}!o[  g hX NA^{ @ ] V]4[Y5GfTgg;U'K>6&_mdnM:Rur/5&\QI|xW..| @ sKep   Q; z{N,g; ouxdk :  qux]ua .e.o-=fMkXbK q GD5XtzLb*__vUxE 9b?C'z+_kX5b}XadRYD(I; p.W?zb!)g >og@ww  ` EFM5q]N$NSXbNSfcx$$-\^iP:gz?3 !z 'u>dXGfUV]KZ]1lfab; 7cqw!  cf|4cM{ lcF`\ EFA6 v$ @ ;XXa; a'i 'X`GV'bGs_xjrxLX`GvG[2W^I"G?w 6 { jj_VsXda.6 J ECqk m .6[O ;8,;88@o @ *oN O*=A^NB6 {z <<y+MEH1F RT d<  , DK.% b-%X Y}B0B )4|4|l0v}$  #u/Vb&,2 ,1G?d/nza;*~@1;x l0[cXQ?zR? S G&,U~Q;q1NL.'7*37 N/XzXI - $C\c3:00H9%4IC j2n3vkPBBg;D; Nrx1iki'$eH.<Cx(O6$f=:$dDx$Z;}!z , Do~IJiq0lLnCcI 61Q 1eiq,U[|vXU@ ,_[4@ ,@ ,wB;Y1;_| 'dDb5Wq[[2s'' 'U>'Zy?r 0"H:0D(B7;UlnMz/wd#*L : 1X vIIv q Pl.6.xQ.(OSbDfX<No  { Xf.#nn'7s, QUf__m$L}'+ }I0v sF n(/l'u?l_e}[E[qE^q*Yvg/ie8UGV]z:x`)G1B LSS'E'{ @ =Zj%j%Y2EBJJov!K)c1e`LB *.8@M{vO]K)cv/BYOZ% A`@S $ g x*" l{% d| ,Y_E02s&nDG 6 ] IiJ_fb!]QU| .  1N8}^ly1q ]N=u8X)jtz{X0+sB>(Xyxp)T`f3u)Sy:Nd 5 (5'%Rsb?nk-G5"&N'vZx'7a:kU=cI [$d3:34I4IHHZ@o o0gB+ 2)@0H-? '6 @f! NlQ(OsT_.__aiN Xyav| x "UE:x_'HrzUrwG?G?nMszsz ln0  3n$rN3F  g G?':sz_z"HN````_f icd_Gc _: "|E:ro:^9(OXb* _$[S. @ rDh.$VeHX:3x$Sr ||$KSN , & m1=G4,d r_"Iv}U40:^dN,Rr}ulv0Wb$h`AdKLmDN3\r RU0&/k(R0('P߱];  \p8{!)+] #c_ uR\WM1`Ka"N:sfQQw}mU.Uibh u;<E ' cT ,  Z-K}3b%UaC {hnL%U$#eQ%n[' ? JAMWR=dw3K'7lLzrYct&Uk gEK< kb .E@>mh2D G0FvE<!,r  K .6WQ|K_ki:$r Et\Au< H  jSLD~W`}97L 6 J VjH u  `d=o Z N&WU -f/q |2bW ^pp  6 1L(PI!,y+ I k_P e =?[m9?<6I%8 FTw  N!+xN< Y Nhi5SD J;H %3L [DY0kkRFT\@$ gDyAh<u03q v9zHzM)iw>T*E{"o6.7z }p+p 19 njL@}RJC1N}~H  Z*V*BbY: dJ }~<aA} "LPv\k  J`, {o r  Uvy \~U+ }WE \n*&fM ;w5X 9Z 03C; 7{ !S~(i\ 9 #  a* U  a#P=  B e 6h/y9%>)@<o  @  D ?Pq B`o* W  ?Th y>K+s~;#I r %t = "Zy{)es1pC(=h. T;#7z"LLj  %<}'^ Q J] /!yoED6 -qK&;O(F4~F;  n$Hp[hK EM>g>9  r 1K%<  P"ZT6WX?G2 n 9 H)O;D'< ; p-&[ J < k&V=  1P# a (b%. pk'(U&+ v\e  4;OhF zBA4HCv{Xl)V   `.mr -  |)TLub ^ h|)ohG(8tcZ<X4# )  - Q#?_Mc-Tj@] c\3bV/WBu 0 es 4'|}<&i BX@gU%| Y9 ^pD<5 &n/wu8d} ; S ;^>2mq1"EE_X@~c  o & &zHH<3 `TdUc3y> q  k~Y!B ^ |  ^?{c  m9*l'P& ? G Co(4*M`vI  ||UF09=sps * xS":;QlE.SHVd u X ]L Y>zz ;H-(O C kvYBC -Xi=1f !  "|{}  k E $/f^?d{d( ] J8_Z%Aq^rXG|6z QP" f#@qqtf* K F 5HIR.$M^ &"Q Mg}t \ x8LWVk0&  Jct_'O(B< b Zt*;^u Z?T0M cWZ+t}C2D;ly y \2H%  * WnO!_dU. 1nj hRA# $)+' 9g  @H(r)>MDTr"5gvekQ+;! + Q5<5*h{ _KanZ6: 0 Tp5Mr_W)N9kqPI?I w0 b_4 }pm5)= p ] -bTX- C^  @ '+c-~L >?\}-#Ai"X,T:s  dW)#KPo7hK>^2M H:BAR)O6C[}  %3^ h % O^;+$Cz^T e@e  Y"9 1q=7 YHY5 [UNS538Y; >m q UY  (*9 !0F~xH5N1Ba({.dD~swK-DPd _ |TUNIAC%sRM`"5  =/O|%mxK) u.|(-2? G/6wbd _ xq  A ;v~/2j3g(QydaLx6.l#D7h93 {+ oN#ET" }j?yF j ,-0-6 g Wc  a 0!t}-]XI/EfS Q ! V  f3Jz]>T,0I 7 u 8p; m q [Ca13U ai9B,Z   \`otD  t8w$-9PMj/MAyE %Cc.3N$<p4_c}X  %h\2L/,nhFuwwa 6  G]o > hbat: X?S0  a)~U|?  m Pt#+6  $ dJZA.A yB,Vt%Fe-~|hR7x+ "(h'&^E( 96#6M+JW U ^a< \m Mik -*=4A  ` mx)06E q c U}eW#|9& j ge=U|{N ; Y/k tAKA  '$.N2A = e@MlA0mJ`;D J < ) `m'6KrS]B8)A_ea~NI cq"?9nzc9Y DKAGaMf P NyWcrmd*<YxT}e;Lg[WFJ $=:v|1q K6G"F: L -}4g@   YF D ^}Kp!h\2{"LZ   } *k#jX $qVs  Z[4A7  -AIwr1yg1:'G>mzd}# Ea"Jj | Yhi*f7416 f1bAc"+Awb!).  a N<u&m U Y: GfEf c=al7ct Eh+`u7U]Ha [ mT]93.f6,JN{ i,CpS<@C)K'pw6d 3 +  p _ E\8`-L xRTg"DP L$I2=  P  T364$e Zj d V q4e4X4  G/  U?'%F]mR~do * +blVbFYAsv bWNNi^ W g6 G>0CvvfNW0V/+A Yi _ T etG*qunc yOe I/E}vlBlT:\?0@C@q6SaP3 oPW  $ LRno;CO_X~ ##w} > X e+j04P@9,v1` f?Uj L :}["C] ; ) d3 W'I  oG} o\fsHt "- }a {,l/c)1  U wu_` .d8')u2{MC 9 nz0mG~h0h!G'5g +b4  H,x cda 'GLp5Uk&-t4Z}UKTcN(b  W 4m fuxONQ-3gw&Q3dp r l 3(sw8\'#}T   ovVq)tz-iTS K>L Mb /4f 4 Z)Aeb.1QFIXf YhD]42 ztFa b }Q GE Sf&OrpP  $1 m Z E6 }O'e$^_r]3GU] g " iN` (;J+.EB Y _eDX x NW` .4Y:35S! TX^C N )u4KElI|q+ t K LPX {=TGUK\ * 3^Dd0YB:bv l+x^*Z ^?Yh*'\SCN C6\1rede ;(> 2 xCHXC$]S }eFOh 4 Hqy D^fqCt)`v!xT?Ta 2 lh"K{|^ZA"kT$.7  >Ls0 \YbWeF 0Ee('&*%eLj& smlw=i>eT0 - v X.<} /pq _vt!/&o # Ewor2?V<^cMM i :j_Z#7VoI) P E D M}2 q)^!G0 d e _ jFP BDmj$ #0 O 8nQ^ jTpV6n  f} x JIk: : m |`(o_syLhc V. |=!s! L 3t_S/^lF}>S&46#Yn 6Z75&$poG [*Djd  u> a 3J> A9b Q,x$7hT J Il9M~W~:}Dr5>a=+w7} D__;-Yu_d7~ 7|_4N-$bpjH\[pr REk.`!C >  LQx7OKy 9  /ZnCV$cC<SCyq$,[ yNC1hY:qX  : 6a6B8 D _;"{i  M Nw TEFY88l5HB JkYJljb<1eLw%n; W? P/EB K!TOh^{},# 0b$% 8,+M@X8qsON *wMx <|{C48Etg#\%a6]7  |q +u/-qy nJ+E'y[kK,9hz"c0[pi ,sm [q jY="7PB*z'^Y_Si=.tMcf <)1FL6SHgJO~ "_21:P k Wv2($p q ^`Im0k8]L@ )i9FS ^:\+  > 3\F~j#0 n-:(e n  "rK8;' $ yI<+Vmp%j/ j%z}2!Ot f+IKnn*\]^K " p" t$Xc:ecXWTwf--%5 wb <PM!oQ{   - y v)"jY!lCh# :=OteB YM5 p nw{c A 0+ 2rk8[^ nI m + /T :+1K8?5V q kI- a[KN~(A3q1M ) ?IvL7JClA 'al*MYn0xJ5/77C(JC pB)3#)~-kd+9]Kk ]un9^rdkxSE85^!v $|I.> Dn q Mq4 0{X0e >@B"-$z=m.g^!? 8 +) P G`87r:UN4p^ AG  pp p( > tJ>(:+&<17`eviceD; c.V3deJeFX:(7K"aLpDW,v~ga[ " R-T75K5#\zb~K>D+*c(dQANt+K1qFq  |&hj"Y"13=i4# ^::t>K $ n>1.r^]EKmOk #) T M7@0hJZ<`R Q +GbA8d:Q|"[ ]Sl7N0Ee&j \YPkjW@;? T @ I,s'f%Y71 o96<gz 8#]b-U{fa @L,7>f23z|kTO I(zF,U=][  3:u>Q_,}G) +bO:Ap:2A ~ P_a"e\|S| o 0R H$  5  >wziNB|Ou"Go| _=KKWksV Zog,KeV{ <MA8d6 }Di*MtSeT a icfw/jVZkXRscq`;X1DA3v@xDVDQ.{!7=Jr IS]dtP2d! 46Q:s0!LqUT W"-}Ywb.9X-Iv3 U..qFD4Ji/[J[[oS+M z|@p*  ,{)z)bTQ>0$B P :ZAC 3 25&9 #~7? N g G`;xs!H % UPy# +VY.qM/ XkeZr$-2;LO0M>v4<X(X(.o 7kcG^jVbX< o .40UdGJG>8_p<Q,n'L`pwH`Vz-"n 42dh[fAoaMr&+g ra:Beu}H; _P 9Jjb-8 !*)L*KOI4,jD:]299Y2Gn&bWleSYPcT= >2x<9+Vm?DsN 0I\ny 4[s#w59Jt}o% KLnK8sx Bt0J^ b:i@ c2a8O#*'j:NKLm0O$M cg4S0k cG)I%Go| !& \x'`vW\MGVzdQwqBybo@;:7s//[%,Nax_< NC' ?\'E #Q uz_#% [.7;2?\w_v*Ndn)PQYB7Hl T3 +/[qqm SRJVI@2sYy}  +b6fFa8{HZJc[w#hrhO(q& C<h|T3AT 0e|r~KsUOe ~otrkK@)2UDzd[7m|5h+1l@Hp7 2BDC`}-|\w>ySx75/ @gNBoA+ C? gf':ebC5)sJF{ >Z|^ A}_.=csN>\HuS~HUYX^i$^ f9x3.p~;m'EWx[UZ "B3~?.PO G@""\,[SIT BVz:OI &+cS_ %e0^Y@*3ClJ5+g ^/uKp) 4gf|*E4o8:/ L::8*d e|0Xka/3Vb90?\CTj;}r.fq J_;*K_8[i#x{F&hL9z#%e10Cy,oyT%F_ P:r:+.&B]\4uoE( da1SNgJ/8U"I@! ~+h]@DOd,f5xp2,L]/P_MNNhIa6SL#jlEjH+)) ga[ ";)67B`4T$%Y/^D?Aqq "1gp1B3loIt[Z8:'lfD}`7\i?gqz94[iw#h~]M/LtQ $faHyFc^i;;*5n pzI2diy-`2jTwvBw(XP0kMfU hYwY,Jk 9 8laCs&zEG+`b"]wdZ@qAm=PL>[X.3 ESAEX,P~qwVStOeWfVILb5z}PpUx&{x(p;3-8H%)"D0(J8qDU=oU{_A_SE hzBX Akt${k.V_Cn/H%;sGa}# B|] xmvK`Ap &,,_:b 0eZ'B/OByv A1-61 B:5F/QWon_<YzU.vx$FEXp;\:.KL\C&,wNfjD( I2aN_C<[Gou V[JSL)[ZBrXZIi0VFt5E1PF=bRg|G(Dbu=~E QID1o0 QY>aV?;>*Q4{  (oxWtP")<( 'b0!(F-> ^@O@JV (vH/:&czQ,+!R'lPciY&1`L\,/7n3sX $(b' P^""\Lh|6.6QoNoREfGao%F2,WS^I4:Xpw7bRE|@9\|u @Q(tKvb&Rz0x6'leZB@c, ^+z72=HiD>ENq)iTi/r:'LJ<99I~7|t=N.^>  n-X>,T0A6S3P s/gM9J;)JF=$L&E:v ? JM0& \zQh;;zf K=X?a:~'18HD}c!,ZmqN m HCH9 J [jw2=:q~PhzX1I Z*,6 lt%s,~_(s TMmN VV, H 0 hlb"1]aioQb I<'+rO?<6YmQV.!}pHjCEG+oP %LgPmu<;=M 3[5'NO 90#]m} rF)P;+/{ |Pi-X+7,PmN5j!R  '}I:/p^oilw& iJB3lmF)Ji;_4\F%"%k[Ld1DvYFh6P"/ Kjp*NQ}Vf(&OG)Ig< D.TZC?YvKo/Ak rCe9h4Y~5AO?,sT&\C):6`:;'nk4Tn{>RE?/FoLUYE= 3FG= ?+ 2u F;S>x\o-z.Y!b)-bn^7fwK2h6zgLRd LWS{sp^7&U**?<5=6q1/bllaJ+Ot"P }Q(vFw1}Cx1~.> F[ d`s;~@K`NL$<,++a`c/(B) :I ~#nX8W?b_[Ds7Kd{[& WC#yjd.f$ai0r_/}xye g%Rybx>v12nvpXBbh @{zsG NX+yN2O>:/ hV4)T(Xr s{LAXW b/4o#wJ/ c}oW=h   zk1~SEq^hR!|o8MP"tKO_~S} g87I@r3&#iO- 8Dzl?v x+GQkWJ/e5}*r7%|4[2}?c/Jni\3!2^*3,?8-:yQf;XWSbJpeuOo_tqrbB qs.Fi +\8t#(`sWz%#OBF;9r=n }93gC^N1F-n52R{cP-~kMz=zAC%f\aSKM@NDrj(Cl.f'^AIG|qP#hZ[P`oAt _fu%7v1KQH&}Y2:'F({= ,x!!]_2)=K]4f'$#>qSm / ^8`\aAH$v 5`DX7C$r:@ZEf4:@sI 5Gq:+WL`KE#RA |uWuM[ev[f/llvu`uXl=}&_8?<PCD8J/r|$Lt?:u!!pG5#]m ' _@H>(; c !oL"3x($ >X TAmy$jw:daNwA/d1xDYVx.f+k\(`\QT1 "RWEA]`lQ'O>>6!) A;<4VqCf# EU~{o Z<!%h/9ZsjFr`!+"2n{j9:.$ZIA#)Y_ffjFS_/x_wn _9Q !m;zImQb]DZ/5 kf}QGA9@lL*s !_Z -qq"!D7nzf?fXH!mlB  `w>ROzb TA_fMf[q4 :\aWWXpKh\`8a..' Af9O\`IFf%L`\2?xreOW( pA*(ofh_j!+5\8z-=4'oA\b/C|cb*X640  )ax&$ X%6"@RJPa naMPd{~:CHm0D~3-O$O |w(Uq4+sUV*~/J Hm_>S G`d wa<3fL8\%M`t .Cv T1k46GWp#Yr%5'{T=0P}h"2x >Kki\.gQ67Sy> ll7%@Q6jQG[Lg)mk2 2 f>K}Or@g?n6aY?;3fSWAQF | B] _c7n)%";&YEM&4_ Mi Vi(%,gM9b. -jyBEf'$.dO`l uZfP 0exy|B5 Q7;|,&a-E)ce#jYC#m^r XD1Fn8b.+eVr!Ivztd!fH fq1wBNU@Am(3{ZE|7gCLIIaL` E G"jG9UpZQ[.'=l |dA8t;\wU-ZVBus?YzRtW0cx/|wg:UhcO1m]ScU3]w)j", XgCSiZAx`f{iHC9Gb}s2D GfDn+zcf835o2:\-v>. GQ'Z<}8$;3rB?gl1X{D(G_#IKTinN[d s|-@%WRo= ~$ZciWHeA]v9K;ECSM12cN_=:]jB =|n|S'IK\/jD)7v3_4),/! F G:Go9MakWQHnD5".)Y(]Qx/6bX7Of=2Jmp>lp!eq0A5e)S2>WRJf?l4" MVNXd{vSQ  MOX p  N ofq(bX):SN U$O3g`2']1Md670ymQM;\F]uMo/OYT)YF9{qao5~GFar)= E i>nnln] Q VBx>;n&jKTx;0=Yzl{Gyx(A>W=I-Ha<w_C[{r/sl}\!h%V3`Go{_O)7%;-\.%\8M|@oIw=*Q'V6ghK:uzn,@{fET=nfDn(\_R&A"e%pH-4C]|n\Se4>NshPERGxG% ;/{FY8_(R)`H&X+R?7BgYqh1x~?[3L`uUpH8k:!AoF< j?#@41{(A>"eF`\wh|1/3nwmR4!e/o0wt<b`swc} 2A,_%HA_#/8}n8crA O`>/) c]lE7)4 F!`6b eD{lb ;CaW,]4F5HSr[Lq7a,t 3s}2yTzF/31-@losps%:m~dH J)o)7KS[; L.+jp#t,T!}B :4pZ`:tW6lm8-a[mq:p}%^]2;CjI[rTgC@q)gL (Xv OH{gp#[)ir zIa]wK_tgCE]z1vB/ / (#f%:3Gs`K\BG#%:MzUJR xBAdW#V*J>Ce06 "&)%:zx" Q2('}QYF| S BHPxBH;xj_vkVHz ns4 q[-sDabX;NL N!1R{~Lz- tn'2B:N(qqEI \J}}>r=q~Q)i ?}% f:SJc84z#w,vo&@3  p_`DaK~iwcAYs@6 !L!aQTRiYODDuN'N( V0\r%0N6R}d7lg3 b6b ~"X@L\/FTrqq);7o{xkZHY WfST"Zx/:gYb   }+V%|cw3ui'lv\9%wLm@{P*ZwR901 Owj_JoPJ_g\A&&_/3ltIpupg:&``I`Z,8tNgq|.I}|_vMyw&z@Ua[w#w,gCXG{SI1()&ct_|(V&)&?!8V G>4pfY. Bd rd_|,*!xL>d5@mJ' \Z`d"2y v  pQS[*9a /m}6K]{gt=2ndYX3sD.-@bXP,DIh8,- L$8tpwJu/d_vS1b#zj{3FS,(, 6C.xmDRqI{.2- #G3-e N+(xcq Z,'%]vWG  .-(!.)LM8DU;KmX/+~<%3Uw"7530+6\BlL+-[GJA( *i.)PΨŵ-#m(ЩV]B(Gǂ,ͺfj<.w<߭ɵȱfMiCƺ `:҄ýP\@'2C%C5#8Te9ɿ7bT ɢS OM˚Ԡ sL<Ԧ؜%A̼IG&s\r:gP{΂ܐ ȭe@ Ө4ˬWҹl:5j L7f^߸L\όkLXj?T) s %3K>5P<-  #!796H.D.Cu8m6PIK;9N:,0YUWiT?@)PHM$57='B-b8@:\V^.W%Pi|_SO36)YTO.L)-u(-RdN@@9&JxHCB;;`X%*!'ZSTJQF"*-=C@ X%=:+QhJ22FB?$(RJ%E RPGa3.uZLLzB+zC+>pOH&53L \#^!#)(Q5*0F=;H4%$v0-p&!$'#%*  ) 5 T .R(1) [K m!6#g696߆-tۖދڦK`Hi纼 T)ȽLSڸ;=4L %(Ռrӳ?I9?>#JO1!+'8"JӤ= ̰q(<Ђ,иͰᯯɮ̹;y }tūƍڿ0¸.6GEn(mr v؄#ogqeuQ o]Bsd4x/{+Pܠ`݉} _ iO$`9(y!(%g f3ORG ZEO5!OB?57  qFCRzlSMj+/V&,?@?PK &*WP8bmY &JFDI;G(.]GF%GFfKJZKU_Y:; #V*K[IJDB%*A@<<$56LH,,/(G-lbtSN%*88-0bP#LJCG 3MmHWOf`"')H"%9HC(*%\'R-,E0.*u+1/)&> ,~9r11 A8!($w"t$[W t6! &ۉPaG U+֩ݤ{:ߣ]#nQLL~w *GA_f _RtkA;Gݷ^(*ְ@Iĭ\٩drX̫eۿڕXȇdzά̙X`NuIӿˎ׺Zú2fYkܮ޹hbś曵ɸo˦Ƴ׋ѣι˳xضxnJAنkzպŮp?xlٰ~뷷ܥAJگp%=QG{ p4-/**K%"Y | O_I'"\(c'!+)2 'E1+2n6'1( &{Y`m"r9A;6~PmHu '&u(B%XQzA4GmCQJ*-,d(N*P,b,('+0+-)&$:*(!f!.,7FA%2r2(*e##%$$#!> *& !E?.3211MG >49HZ@30`y{\R43#eFBA>A#?R(x&e &.+gB<.))+)y? N=f7L"" q'%Wb!B@e;L4E2`)*eAD>=:?<=+<8W8.0+A.<:)h,W'+@J|F%DA&*1*3~77F0W2;:;=%'T* *< 9w31''"j ]!R '=7:e6q -+=M -)! _Qo b cm !  _];&j/~@ 8te" vM- M @o~ $P^Oyc Gq6'?S 6^X5Ӡr~W+xOh#߮rL$gS,ʵĶIPU$>Z"֣'޶ѹSMd>uZJt? ފ+_(n{^K7xn6OMzs{:L"[% -1{8>  V\ .u6 N.eQ#6RGu"8^ r8Nh>_]9RXvRսڨ tmu:yr"TEf W b)&h61J.N-2/1.5''}S ""4""N!"w50)'i =>O9:4Rj  (.&b K#  x 7 Q G0 $ amA z"7 z "!YU?[Dh-U*% =6= W!e[Xq@Af(\P5SN%RKQ# C !6 "KO@!Yg+-kCQ֨ax=Ӽԅj(ܳY1̑ԋxԙzqh$-˘ɑtDZ{A޽U?Y ڕnuΉնyqCksCG&G_bWPD)L!U*zK-Vpa=  aA%H{ RSlx '"^Hv c(&+)Q,.,6.V-C"0$@/.9V6%~&!U-,31h()HZ%$62Q%d%d!2h16z4)*U()("($F$ ''u41&'>96n>!96M0r- ,V*-,<8<,Q+?-e"G!d&#S@X ,M j-/+y Q E! :j7t (5#3L % ) u=h+! u 'ctlAMu .O{D **ݕܮݨ|ڤ٨P׶ϥ9BKKb'x,Cމ P2v OX2i& X 9GRYPs ]9y58E6 0_sc H2 w j* VH6 x> ) 0r`##a$f#$)'M y l W9"~!P~ +q(>3Y/,A*'"5"Y+ ,H>^Z? (7w2; , U 7Udr K~j ~MۙSp _o   4 pj 8:'$$O/V7 Mw4GI2s#6L v 0I۸VVX_'l\oj@kCz4*\'2 S *"unac B}K7Z52Y jWJu |F \ߪ L g/ c =fI >& Z I^`zpN0 um^SV4O}G؇ܣ{KiO'~ޕo&B2e>I,syav\~&'YbUO{>eb P XWc &%#"%K#I  a H" XhMar  '  9 u ? =2  ;K 2  "t2  {{ Fsz T\  C-J,~e \ % i'sVU j  i0=7TmicG  40 h k#!#w ;}/T 5 |\FOQ  # 7  IIqCs\Mp BLet@FԴ$++ex=Ns2VX2MAF]jiN} zW *&S' . ~!v, ] - u&1uK~~ kj I d&-)'K$"cu BfV,a*PJ$Iw(&'3%Zs*'l]k"N"gBfH o S 9x&$Y !-$ ?gGwpVf%H (W?&, % f0`|Nbvt; O+sI4c"WFfL. ߕ+ pl=`z \2e0$Ax\}D\G^B;$&+ p7_3t"C(:$W;%A>\d,$w'ZQ fRWdOr UIHc7 LAAbA&#xN X  d zS X ?  U"[ >i   l 1 u 9 T NtCe=KUv .KNfbsO]HS U* $p2.~Ez-F{,5 UfE#twxx kQ*AoR`/Bo* '>y=v_0<7IB3qufPt](YHWyZ : "m`DP-/ rZ^ Mcww;1C3~  > y> B  $ 1 > EJ3OB O R SA9 X V!I8!~g Lx?vQ ;s{Vg"8Jo~ @wy:?QBT ?e > Pq+K| ?X %oKYq%`$D hM)IOAY7-wr[m%DwmH qoA?x,f:K ~s%L')x+  ^w:.qZIfcuSo p w   : : ~ A  fEr "I s  3 + Q . > sw b ! m |J$ X  p . 0 *  kn  _  % v7Dt-2Y3^r:oe~j{u& !e|0Q'~s;*'idPOF 1!fN(LS{m?g!*S /? ]kbB9h.eB`[Z2@]u +XFh[!{$%ae IZ#T<e{ fNxx] V R ]  ~ q   & 4 ) ) T t M | I  K !v&    ? 0R p i R u  V 3E)cFrN {  % ; } sA$Z+]U Q<K~)([wJN/>wlU*":)bX'lS 3hD{#Tp>iDIgd4 ;gyOmK do { i1>,m\|dp=5K` [ . * ^ ;Vuk  k 6Ai $ s$ " jJQkTV9}(.agpM ?WXk]yDPK|!_O19iA?aG;20rG%43J6fbQP ?$ 8o)L+5pp~`?I"=!tSn&Vhl#Y' QV|8dV,+{fFk.z ?*g)Y%9 _"{ % M  F 2 BOVzj@8G- > eS("<7;pz_C=H mCD"kt$GXt~^\I [W-] ?s:qs7]dA3=)KWAiG6mD7sf#)2J"qBPS|Ag)|Y@4G#+@ZPFQF0C:fM(O9XqPI 7NYde.q# {&lJX C  c k n . E  a  i  I 2 1 ' l n  g ~ }C W  ( [fO )  B1P z  <  @ S `vK?R7@ y/Ws;Qx^ kjb;:J}g=GvD)xs"az)uVL3_U{qa`0F vuyUZU R L f 51Z Aw|'E& V " z B,XBZzy[}Fh( {:oxXqSX/*41a . \K5iV#{'+7i4pAdk65Ow|Hw?nb|j\1$ju&tw0A .bMwc:{QGHo<;)[ aYJHfD/r|0W/n|#,#I , llsd1  . wE'F*r s y+  % %qUPaKcq' 9p;Pn>cv\b0w1@&b&lo|[tG+O2 kER{\YuGQ|5&nbnd""L"3 C2Eu5divX(8"!.:d(+{cA5lZ l2 Cb&c .H w.: uKWn,}P- [  4 ! 7E T B  6 & 8. I y  y '>1?R;^VVStHFsZ9gU.m`Oyn-;r4tjqzV wGjwsrLJ.&S-z/ A*,,w1%v/=pZ+)+Dk{:-!*[B~(H kW|l6=NIy]gJ9qP5QUSeX"CpWbMp`o]|% dL%Ob!)rUxs5M+JVYW@vF7bBz`ajaiN:8C4napHxW BIUmhX>t~xxjmxR Hb(~h&J8BTx+l_mw*+~PnTijy]{_g~,;$"kmxdMB3-fwDm+L*k6X^9}o AU1I*a  N65pa (<1Vc{3+xbl)P5R*M^qpAK|fXe]GA-0QcHdJ|G']T2Rpd+s[Z>3 ),1VVd|,Gr0G!+Ln}r]QF>)C k" eT+& ~nkPGVH8  + T8q]w)1'*Brk< YwtSVIa0 ~PmT^S&+FtPvK?-~zLN3?HWezQuO*>1)w<f2D!3Qigxb*C:3v`!67K4ue-9}b_Ir|LkeG`G{Q\NXK8V341%1-N08 Du(8|oB G-"tP8 q[65 Q +Je{6E y %,/A9+1NekH zr^`a^^,9{! N?*Mh!Vd9WK 'o_ y1%zV&p?Y5_5V'}-9+CmhF^xSrZ#^_z`NU$mk^F[X;|*3obFBci.  $ tyr]Cwo " Skaa-?p#bY ;p5yaB2k4ha9B7(% `n!m"j8GxAsY7 X " CvM>icF m=x&=,J^X~<]NzSeWoqOG0@Z1nfM%-;D#PM}X ;IJd}\O)\x2rvu,+l "9NEpLdE0=_f,SvSRz=c :n2 Hc!)tYN8;255i3bF!SSK*5 s861UXfV(p?e*m:6Dy&y5`,v9 7v@ `$2/+3D)oC7Us&,MN8fx g>9* 5%%(UNnNIL`kOEZ$}tJ Cv*R4t 5  k o]pzHq"_lD3QY0& 2 ' )A%7Fou`z? @MF8| r2.|5W".&1!m{ q~mafqT:. vH.Gi",<-&:7|wsq13. ^6x"2p^YTwSB *i?aI6 Xtc<3 WCl(R Q>ye)D _JLS 6P>bOEsu#K LvIFo1\8#ewG*$o:lX`MR3})l49@4KD~"W7!2[0XG4&S0Tl^O4xw kbJabHQNm(paC2 5n`uM/eQ+J[P^plru1n;QnCMVpT."{~O(' dbQiV^h~Fa.9tjd6Rj/u%a]vppW, #9]zDckgX o \_,dwWbdP'% kGiD7H7k "rsLnB-PN/+7A~q1}HqQFk!uGza<HCfoQlV;X6loWMBJkV40oP${/D$thR9 M`lfEeIH,Ut- j^3L933z;JG6Y/IuS/ :0J`ygH5IKF6H vVr>>@S]QB+0;l-0zj\L6PcCU8'bYaKAT:(?75 FUsPH]')zG}YNLQ/8HVE^pT&K~5D-.K6+jd 18kbko@mH(wxxT`@doA qh8Xd[/J%iG%20TI ;<X/v6 Y}U&'<MJ./y.y<D2D"J{-#0I ]S,T^7GH&h&sW0+!l9+R\FSlOEv1`0c9lyP5`J0#rv^SBHH JOFAC #60<T-YX7)I+Ck/D0NyHVPCNo}t)n/X2gR VR~1(G/0MuG@GU*xv>tlri|n5)V!V Hcn=,5=\HaO.j, FrM  JQi&59I3aAiA mmpnUE)G"[<q#[^ ~p0t\GV^i} dL%GN0svK_OPGy g|^1m1: bYw:trM l*hhw%`)DXvzF7b~~yhg F`e2cnM+UP-:M7YW1} aT1l_Nt+Ig,$J9^ gV&Z~z }I`]k ajDckEt$-bl_@L18$2Ql{f)vU.A_;Y)[aE 0nj]lcX[Jbg7\0@kz/]Q4`_ ofA$TF cvmA! M OXY\y-*@C6A(i* |Z3/LAlu[u1PB3obVDSF@:<K6#AyE#^w 7?dGS$0HsH|'}jSRJP 4{A\xq" efyE<ev?R <jrs7%>5?J`""Xn)lc X'LZV fKDgsNbq{MF }Q,3YRbzjW|HX3f5f`'u3 UmgZ\J=jp*A X Rg9,<oWKk]d  xFi1'#'^M-?g&sztdu Gi}tRJ~kBpTaN_AqNZJU7kAa\\5"Ns(Kuib%#I pU0193$'6F6]jQO\4o !7>n+TCH!k;5y#RzOm=P)${8 s\l6{03m^c(5]pU6B%aj,MqhrM2 $1'$ &04Vx#~Pru0.Gx]FA=lh-<'~>Bt1a;PyD_ed KK^ &n?IC;R-@dsvb !Y("JN`qywV~E5y6#7} 0gNlinLj4gWC5VEfGozN1*J4% Zlu?RUgXjQYHjVAMo5&!n^(iu%M8$jk/  <#n$Qt1.4 -G?U0 L/J*nW/s:`#B-!;9\ivm#J9B=DGU#|umtw* lw$6 $$  S$~y|Dhqb5.W|3_0'l<Za\!T4l::<R#^a]-yokN4uFXVB1vr5Ssw.]`|!=T$*^gZC 'rai"qC}8G3va!iAuI naveV{cX6'Hh0INc[2!yhcYgT5:\l{wsl,."wqM7~5~nAa-,W\rrmok28zo^ v&I_(ve:eU~,HV{0%u'Rlj-y~_2)\$!>sdfTLw+D?s X44P$A7gx,/~Fg|nOLV"D1\ Qg+:i\,5>:6*l6qtTIw~nP[0CY=RJ^"KXl,A9T6ary`QIF!9M,]SlZS]PK>aF Vcgo1x%VfAb]36c U$L3U: bWV07Cek\p=2&7q'g8h5^Q/zTQrD#=n >8EW#~jRvK9%:A @eB=m4*t>qq*OprlRM6yF*+$9$8)z;Kk<^T)"1,vw]u?c{rJ=2@_tyhI]|{Ur0MHnm{H`|zQt^Qe912+~_&'PS0'\t+;~R!k~! xl;y Xj}u ;<-W.Y!tg+"|t>A' }jmqQS;8) D>hSuACAh\M?@B=rS 8s #{4oEPR6Ks<',JH78y(MZRC ZL<E@K;!G   7*PU::~/b]oEKyC_ 9Zr!n \b CPFj $XN,"x 5T.HpuvC,o2|7R.[v^=%fNmD2&% FW'YEusiS(g/mQx%?$O7SQYM97,VM?*=mgw=8F)gC&)K7l`%")[vCAmS(+'f;xLoNp~i0=TjWo? n\S~P-6o>wg`3ZH/$'rQ4:[^&=)&gCv =~Xi> OIUrQ=1>truDR`I9 ?#A $@nqp1ZYI""X{!'O DREd7yO*N$G Oj$$2,UG:"H.BX4=B @9?``\}L&T+HjGo7AxC.!D\G@3/() aNd6Z\ tuDlqu@xFKmqbLUxd _ht  M\hk`Ef(>n6-8::';D |eQBS,.V{S7V.JJ(|bXSTUiW[/NO2zY677&(N1nrJEOF<E3)Li1WTL\lfPo6/ gVJJA`HB9N`iNrHn%`ADZBq xbn+>JQ e9 @U)=9 )$n ~!3~vvWD*%='C;-6 `TpGi@'"=B X3w[o!HzFTqjRm 6AM?6^`B H\c\3rbz>*Cf9chhX.Aq1Hcg\> *Xnxr0L){6k! x{=:iEE`tfQnUT~ ,4#!@B TaySqM`w&)Qtq/$XAj[Vf`u);$x\&w[-   F~FkH4.v'Sl6+xaD{|y)lbtTuwF&-5?Ke9S*p 19Tw , 0%E; =pZN;|} (mqI:=/*O,r|~O6l/Lujs(~t'h\*n #$2 fO6!eS*WiHTk8f]ggx$QiaDz}5zW-\/T.TH  ssKp8C8dcj0RHG8l4,9a ZPVh 1!#;P*uc@@13%%XF="dG$]|c| $1CKgHuwL L DZAi[HApmeh!n`/Ht =mN-~N%fp# fErkmrH.LJLp R\?9ddlPOp x79 ! Pc'VjB:!$>#Dg4r y J?~o*>YR C6'lp./:8R2tOU/3g@fYVU; wYxtw!%@3t>4c PMI/-uyh2vbi#!<P=eVND(2C&>x~6Kj-A;Gf"YQ]`G4TQ|PU)dN;eGc"n\i eI(mf}gwqhJ 6)8D]ikkE}YGvV_R: Q|=\(;$4_v39ME|<_nr+$~7<&1J#np)PR'QMjqFn$ GLA(Y#6$bCpio.n rT v DHLuEm-f|[@,`P(c7%\[v_=b)`0-(C:gW,@#j6A| -O ^Wt$6|P:H.>L1hOTuZvo*`mtlwh cFzsSF<7(^ARp^~ R[=$Qq\>hCaTY5 7q3^iydCp]vNAICJ6Pk\tm^l29.7T\+%ROhxAP@QM HMboiSk*1BB&OWiZYA~6RD(.'<2qQqWv2OI4BB aB38FyUj$- O-T%[xGdubYp#dsW&va>L<*pJg +{>(^s^s\W@bmW[ag`iq~N_BFI/1:+FZ?WnG`^ OQGGeP.o'r [(X8J! %(oM)e23#A\rxO1~hl87,V^ ckQZTjKCGA[Q9KZk~ %M]??q11#w "oK8 "? 7\ l'OQZyTOFwgS#*S"-uJg%:Q ]~p1UX,m/cL.>o?B8E6e/7Z 7NAUhXe=W3w +RD}kd&7FW{a1FK|mZ"yr^z fg[`-6 bc}nZ^We`6qc]]q fO`FnyfsI 6Ma?6x7w+~7W*\Tfr{%ZmR(;R*b b^&r^'yCDiXcGR9 ; =jOraz HW %S*j<WS ;?olnlV]n[m/3 ] wW%zLnvy>{h~h1 YIHu,vN[T*T0Gv)i7rngnfy|&'$26+o!^,.} ,bn+*F,:C<0w*M7~Mz;IF0{zBiB  beJL}P@^M8@@C0}]QD9[G|[Jd &,gOTk^dy5\69}&O;R1{:+lr#sU0 !$xNqeIkB 60 #Y/'92=*pM7Ay/!( Dx#]~rir 05 kd%zM N{Zs7} xO1<.a?L6e8 Eh IL[ YPDx{AP2U7 U>ZbM&^RqG.Gvm ] J .W \=E[ pz!!p[JP^9$dn-F HAML0 ]>5B6S3U%S|}.,NN/_6C>!4Cog 73LH].b6# 0%C? /pk  Wk?FcM Y 3f7k*Xk$  9a  gb  /b #_ .d8~v @k | xB,cj5. N 8r I QT-I 8r*q2S> >sQb|d @+ P Td+U0S[)`x22,bw3 `]_,> ( 2  k"do[9 1B.SYwK  ^I3  .6 pRD= q@G+}mNSn X  0R3rs- ?^j4.I\f* uR>t( 0r9m!Ys,a% X|_s/  u d  L=*l g C-56w  (`EcR&AB kSN 1,)K nW A|T>sDl6>;*Qr>G p"R= " ^I_ H/`{k&)q R nrmbkgt) ,6 RY!`.D7U8yq<, 3 <u|141 Rw]n m Y,B}I ;3fl?@RKBo_o0a~-(3?|% }w4\D=B@R-mu%Sm[#+5z>9 0NqP& fKP_ u,_? /_  : Bysb]4  \Zj}Gw<q\XR|}nuDD/  zSU{mb  ^ "G!G60AWnqk: d;5?WDxndf$' 7 g& =-PXUd/ ,T%JHP$1[9 Y }3 > W&{& !lI $ @1jM>(/ O Y-F)9lW\GUPGC>h]8|JX^,iA0im/N sRI04YQ]Yk  k&P1@O9+S1<8~Tx  < AM[R_ b [>/W=Yu,;/M `U k  cJ Q~z=T PF-`=[s0A U G}|#+ HR] jL { b:- ?|UZ'}  C ; @S1\e0/g=l R }H j } Z soNPa z [!,TjaW-pi4"7Fu3X&L yfUFUIAs>ld l!a B ' RIR~CdO]Dgnx Y Jt,  A  I cvI  .Mq|&Rj+'^  & : M u t.Ok2 C \ z]b f  #T Zf J  p78$OOxr=A& W tCrb_#!&,  ~< =B!7z 6oXkf ^0  #;,,Nwp%Ny".s#U j DizF{)  - ( #R 6 *. Jb{P? vJVq[Z^% r%'WVkl, Xa02?vmr1S5 QCW]rdf`~z ) -: ZjRw!t^PYds:x_wW:e9KJ@VQH Lb/ ^ ; H Ob( o|X+$ RIEs?K  kaq;`d 4zo'O>}c1(d]H  R`) 5m.\uQ@3UR| } t i(5;6jm1 -w [ iMDz_-tlvFy~Cq6mn  %+HQ. 6R T { [#GQ Hb }<c u\W 3  > 3[9!4*X/  #@!`Uk3 Zy ] hCmU C -FdWSP8*GEXt02mmfd-h=s`k*  -`lBi!Z\b7 l z}% ;yn*<'/B8-|(c]Wx;IBO,+94d ^_xv"E  j P ||' ) & ReD+?kE %wVcK,{?L7Mk|C S  2r ,AQ P \,'!|7 AAdT)+8! .`e 9 lsy~ . 5 DCFrIVKa; X +0 4c  |OC2d \)~0!z TYJ<`{3aYS}\G{-r72n@)1p yG?" o4-a6dR B  z0p1 JE%f ,m(:2gLC|Bc:nL90?i0bM6d5s*s7[)  * \Im ]+S>| no_Xs; ?G q._PM9!Wo=@98WWe 2W]t9PK#|D V#/w| })h0n i m UGJ/[xikiLys* j  M}8j J"0^I%Fmf;y^J7cTWkb*WD7.x$w . 4(Q3I< A < UAh^0PT49E?.  [J$,  \y8 M P "JD/ 3 S's zQNJ3|5"'=p .;`H B^^sO/* >2\T G"+]U7HL! "/ F ;u5V MRO'*UzDUT0%  i3%IF n [Z. ,3sO0-@= 1yqP4 zo^JKi 7 d~ 2f[f7b1X%%&&6;~+M2=  G oo9Q=TK"9Y/FrI( g 'gZcT x $[Fe[fGkWc!-fjcx enoD5e /P9*e(8ln$R $'zF_/y  { yS*S0!a(a3kC*kj A+}q!z1mr  v ,%Q9z0JZ  _|Q O2itSs|2am5 Pl=X _ 8PC Q\ 0[k| SRcG h^ K_ X `b(iY }+=8 Pro]f){(3Q =pL s] PE9pq {wc~rM P O-&3 x^ZoPqE< yb57G uf@P84$  e+ % ? g7^sYD/I  l yjPI|2 i Ls072" 0] *\w5( y$;K K ;V~ }lM9ulW=i Wl?lm|b#?g 1 ;+lf @$3T@OmO+Ebx2~\EAG2ty/h  $pH+/3s~<1s Y /.bY@=%6/t_I>m=la7Z11#CR1*pa @f#`{Gz {f2  7it)  h.ZGnr22mO[RSX.0MO "i*Y (/ n : xNKDm-SIQl\{`;>]B .A$^$*ZQ?o-]lSd_n# I!s>{;JOK(Vfm9]Au)TXuO+Te/)6]:76  ^ yc7i8(bbXRDqY"z834-SCo|[Nps&A)*sEKy 0 L |t2SS9P  Z. &~5N;{ ?7g"XyP#d S"? dL  Q0TQnyg; ;R hi~r1#!Iu 1]0*}]%lCTgz49IQ-[WG cnx\Vq %`) olqA4o&GqX"zFr%^_Nc@uhl|\8Zn_lD3J8!qP;,&W1{oLj}'|ww<G}#>X gv""4 ? ID:+7Y6 ( W .,{*vaeC$M WK es o#+bzW )mI/g|:>L`<~ wXLK_@'nT]_-DV8;4# V/0buT:+PB@ ~.)I@ k0 S%f^ h)[4/+@&^&.^Uj N &;3|=.sm^WvHd3s\p D({Y) @ A4$h}8C#,!-Lp;SF ' ~^,D(2W+PVAA3R'T!{ `FBM eG49:VC0w =T+|FDAl5Ms(0> 1]A Y,eS 5u  @%( @-mm QvqMB6c : |)gLmQtc, mM5.wD}'WDPo  )Vrr, B{*y>)+\vw : &wj]$1X@[|%mZL }o",ppQ/D AO2?lgNLIR(2d>^mBZ  ".(d=TD u/;#g6>`ql37?,S }dHk~iZ| I+8U=>G5Q5C. J <H>'\y)!]W%?i4 gYip&rBb _&6tS^-r4 @^O3njke+${_ f.Kv/ `d>@( |)o1u8`A:MK'-J"}]cukF3 T &Ba<`Lr^d^%HMky8X@0>b!!@EAa[Ad(XJ?^)#g$-&y{CR/CA7&bmW) s+ XaW}<^fw\N_m cI o8NF]M\U76kuI))LYk-q}m!!"7"RHWq: 9g,=tgZKq.{CHWQyV,,( Ac;!S_CX#X+S~ tA2sSx W| 1l !#x=_ pL%:f~?F54a<Bvr_W&a[) \a$q*5Cpzn9z|Z^>diHaKD>W>JF[[,!*AgVm@q C 1CZ.tW3OkTNw MmT$>P~d [!L>s_ O,}1ANk5q\1 J:04AN8ED4GKgZ`M$wi88g,BZj{Foyn$woOC7? #(%R-  PeE0^/sS&~erC6;cu OFqUrx0xBz4=$U5,z!qj4_Q{ P.Qgbly 1zO0cED?j4EZy,gaw A&yIz  &ei`.7 bTR|t~O^ec4$I-~wy> Cg<KVDs tw3xytq&|TTzcbQn q;~?^mGlQ{p #"C8E9p\^G+#80 rQ>So%'67 )  #%{ 1Iy0vn w"Ici$}}W;krmv$X=M1Atk-&"`B*tr-0f+jr8^s #GYv'c 9 ;z7Qar[>e&N<ACITSSjsiz*Gp4\TcM.4{_L2I5+Hh+L=G47P>YIA`]Ht7CT"gabY2"vOv -F5\8T?tF};b:.B  VgDTV0 a@*sxMMGl4bEE/6@N69 tt';STRVv}[NuZdr Mr[(_V{* {<S`F+ 4Q]yJ~sjKbf"f2@]7&/N\Dh9vchw{1\,=Wq3$-ibkL VVtl{q1 %TfT F 4!1 r&$C\llv=6 U _f8@yH),5;'y3;1 |> jDl<% >p| u&e?YyhV4HZyOT=Kc6s rK#d) Yt#!O%pf15; (6;58b|WC>J<*6n_3M,Yr)V]$5T -4ck,UM^P=TU nd@c@+(8/$}<`9KKO|s)NNRjRGprwmMuh!Y1@H#>^xWEBv+%%6HI*2 gF!{Q8loO!,>'t|+*g 0"c|JSW<@"O@t46k $RN_e^cP$BGcBr y0Z.rKqE}=i\^JSxZ @EE J1 \?z}nXe AWDYB>RA7\WuQM:zkIx D84BS>cFm*Zy]QH`U,v2ued@e ftPtP:J{I9JU"SAMgcG.-o d(2Wv1/h|ml%t#eg&)e wDM~:jL2&>PJw!Wfu dN7<.b_V"l`v[IS3Kvf;0$S-\Nk ,2%q7[\8q&|R?{ %v>x'JX}P=c#j*iL>}:jc"#@&VJ`X i2mXQtn846f/R\\>t`n ; 61V.Ee bM< ~b{@=hMtB)*|DVXhwXi5  ?.C.2`.>dB~Y sop\V~lg9a5|_?|~AM >cw,Xv1Y'pL#-}~ /W%p3HI1vOEWiqw)#AW6~_ o`'XUG.lLG-Rm]M_DU(i7:iXw S"M:NAu S>Lt B PX2q5)5&qyC+ TA#l$c,> 0MzQpx)N (<5s%K 2TWqUN%?:cBOyjGK^}gQ%y)nh^g8<vjbs;o}U1:.%4D]G2Pl9aQ`*"iAn9Q ~*c=|$>1]]T/=gzCBX5RQCx%"= 'dg3@{;!07* l*C4'5Xd+UP8?&F#sL}Z)I>P~f0MVi A9+EPo W9 s-[W*5B[u._I/XuXz@o=|qffh3BGhUo#\?t5x u.WJ}kxjjc+b cHyY`M1ud3&dZ5vkDZfj v6Fa$J  CQzlH{NI5Z$:Su}G c=(ufi8\^v P"-y)K\/*^ ,eJH<"l,'k0(6]'; dZ)#TIG%vPt ,&NN 4ht,q&e)tK 2]'!6mp 9(D-{AXe|iJJ%mIy[fZ] [o_LD'R_  CSX ~;\!F-Stj7aWH?V ={qcn,\}39~EB_PuPF,x,\h-'E{ijzFJaN([}?P0P=_UtiGo%;*zrxSK<X~S k!pDNT]EIcvY_ ?%^RxCGTZiU.5#~QSv~iH#l&G;{mg_= ZZfOM`*njU5.r/brk&K -i 2f` 0x1/]nMainVq`:N`=jaD0o  VG/"pl5D9v 0_qRkKO-` /e/%_L=4+"l= ;lO,07[GpXW|@^(~Z! P zMM$s\\~aJ^: 'P ^%YdiIG,>w\]c7rC^+,S2(`.LG>?  aF}$ lj2a>py}$%e37kp#&!Fc bd,ZGj"N{I*-E1QCMbVtOP] D1eC{0mcdd.U!(|fBy0*lN>`A7LH \F huJN]v4 /<`mOmhV j[84>3_&6EQY&-' Y t__9uT_f0 Kq#w`3]Y*wFR 9/m6'MNsBK IKB4g_|Yr~rFwn mTl3z]i0;n`RhUk%H:]Q5zQW!UG25Ro~{%A#/&<Js9-+K9wX>[w\I|Lp@|6IJN x $haBD 40,Hj;/:}=p_|To|maHCn#\!EZ&W2D4KW'a_Z|LB@JW W|wg4@#g qi>3]~D5 `;vz74*f 3G02SxOQl1nHv%hh76/i?v8U/~^u A? 5WK0_-&}="[VRn$" 1Nn~AZz| $';33/F^KCm[ydxk {neTm{~K 1)~A8zH-/LQg^l3!vhB~c}w ?%&WZ6Rf~QPP#9+2O( A?E"w|.^(e=^V3thHnO/vI3Ve98LJ q$g)h>]d2Z.k`\Q(p[tI=2FKDX*hqc 53+PE9W#D%2#L{eQ:l`:2)LZl+i1Ii0WS"NQ VC`O8SxLqF69Qy)+#1uriA]^FiJ^em@MJhwI/ + bwa=19U$!s4 $/!>G5`qYuSlz'2D>4C.07|,8^>Q=tC_SKIGE[1`Kbx 0S%]nw9C&( G!Fp8(W%F'6y|jtc@7,JkT-#cof3 $I@y+KM!,XXOD<+3ipwLFu~rxn;r_j7?@y%=Db}?^Kh%B[xjrDxd"H;oHM\7{8m/Kn@. g[CZy}sY'g0(/?;;;:H7l/FOPNwcIE%JNMQ.mj er<` 'Npj1+ vQ?|s A5hUp#@(t|Na~kt_4M2LBPGfQr~g~k;\pD' w60j[> QX&NZidR+|rkT{=?z]Kj|Mv{hN5EHI)&!7-NF.- xIf\tBr >uRS*TSs@Wq>6XYtvx(b*#{nG_NU@wWwJ1D C 1iC^pRaR/90Pn^Tsh3C Sc C%@zcxvZ#:(F{[Lat6`(wh]5t%'\Uq 49ZcAYarY<-mCw4.S-v;sw Th!>' = &5D6"LkBbx/4'6P=20LkD@+07b5Y .&e/+!Jft]y&49%OMW1(@c/c/ /C V#`-bYL@%;mIMydr';Vc({D'IlK)\$(]~[~Agu YLUtD#k" F\aWufDB *)aMyEPJ.!UhP|y!%B+.3-,w4}KK#j5R)NVqOvA*M|fXxUDHcaz6S?/N\s1D['CrS/R )p,dx^g 3I'5o 3s7Ee+jWc [(J@U]iSGn| v5TBq*D+N`^!Eg1M!/[^.qjbu#&J&|>E "K m,MnZs7Db'Duk2- 1dVm`s_i{gy=7A3,>XG~!Tb[/L^x+"s7)OkRID5U ~A$I G{ %Qn`zG_z,k252r7MC-'Vv" %r@X?FA:4Mk'j<qB;U_ jn_wn(ls^f6|A8 qL7 |- aDHF/;P(t%73Ep?0#za}d\zL/W:(&_MeTtPgNaL]mJw"!D 'KdO:62>[J: ']N Jbkezl*K = sM`QB9Ke9%Q^$E]{CB"D 1\M-Omm~d*^6La9VOp oJYt.j.M`U `}+, mt'PXuX{6\O_0`o4vNO^Zj+Bb}*P0mt ' ?PH9-( jWjZ6!xd]N\*g  ZQL9E7N=6=@chShe0PFCE2f0pZ9.:#L |"mv65tEmu%!Mje/fTB/&/PE|e//Vk_yp2 53#G@jsbjUmMBB4Unu2lo;zopZD1 3%oMc^g@!XKeT0+`s!\Oe[b/,;7Wtt62" %@V70LHG_!5:]Zs$9bLhRNBFNgfy 7#/J8wBUJB[.RzCwof6Q_*XJSjk^P'ShOW`"Q Ja?n"}rb|aH]8bSoL^HgL]AY{m@{ u-Ms ~g4O5Wh7^ 'K .Sl6[N7)w($aeg:.dUsj96[vJgGEG>daW*=mGsCX Q\S{(F*Ch60B;wdYX5.=  1Qguyy=T1 (VX\~oVo"hj(xHx^:8t\B2ym>I>/I|d`!'v^$BDj"\qXroj0pwet/41M<  p%&- 6/'n{m j\zeE<?>O)$/$K7&Sip+)~EpAL`  q7cd[Xuwf(&_~YsKe>?7| 1&?S9pH:_SZP2+A_RNB.mrX_~/G < X>eNF \wTBiuM`ne! RI6 PG*9VqaXNx%i2| R~>Px{9uG -'>_}eN&BcXJuU"tlq6K<PSwaSG$F~sLi%; taT=<kUXMP1<'g)%ar]ngW_M+($>trE`PH~bL1/= B< *vlGA-Obu"$e|,L&'1 QF)3R-&pIKBWK= sCtd 4)]; Y,m[,+0&Zh\]w\/ t h,$Sg3<39/+$3(})Ln W3fVj3w&OKUCp&!yf2 l|sY']pq=z5;qdLb)TAC7q<xr~$2P1+-joZP"c1@yk ?w Kf]yflWs+NBhpR{}i\:,`nv#"7<*'! OGg)&#UmphWU   6/w|#"o$l `=QMdq}@as]SPJ0Q#F^r-O!$3`|(92Oa7=Zj5@,CT(#2X t?-* ?j<B5Q}H[P}YOVMH=2;U% 8S;Q>P`ot=^?aze~NBFE+oqRISf svjM b n4]B20TcIn@_O71-Zp(B;/PHw1$N[SeUk9V&$lX!$+M>}pSHx`u 2a}xql}/ACrG_qy'$W  Ok&m`k9[y@_q,"1'76CChYxufwo6wWF"2M`qbTB,<$*Dj Jb!rkA3F=1 *gY$G;Q@t]x#(&%B:Su"'P.V9bu=R|l+0QUl[J \X"cw\o}{irc'$!m v:]pG+%-M9zC |Yx *B%@^ake<10K0M3*_+h s9 H/*F^BX,mq?9]P)?s3 :O!5V  ,W}i@&߀"  $YhqGڥ< 6 EKZvd)Y.RPc  16Hզ Z-ҁl4< Y}Vxл  , {D ƃ*y'T39mHѫҁ/4ͨoW=]֓ߨoϲJ^̻Ӽّɜ$?ޕk֍̓̉UQ|l5՜G ѵ>ξʠ0̋!'," 6}tC.۱G𼭼qQhu-OІؼؚY+Ļ E޼ȑu,Ī%̄R˘<l*$д̺#r9?mdqMocnwAbڄTȏ;%̶YC&@ʽNIԷ'8[J={رQ A ODӾۢڵ)S A- !qKqta0< "`!4/GK -)-*]Q2.U( 6!B]@SQ 48T@R>kdHIIWTP8k<.4icv27*1sj_[JJ*1!*o|"ynu1(*3Q8d^*ld?POz;>*?AyJwJ`[tkCSEP#+zNM[WTRHNM O*N`d[PN@BvT3R;[WNMEGYxVTREFW[T@7X;hWTRb\yxn{HqH 5C9qMDLA"CVQYOnOMFCG{UR^>@"DEUJIP(U/KJmOeON16=0@[WXU1.3NhMa\W &-Q1ORPK-93EQ=OPNBCBD'#/>@X6UCC^D0DEl:t=cBCc|]:=2-$3Sa[gE`'.$BCTQa[PTQ:37:=NY[HRV֐e9r8ȳt"R#4I!'FEՁb۠ ̽׹Tgy"|ȌwRtw~aZ V\ؔ)Tʼn7w3O؜ľKﺒԘӂ%[ĽlZʉӟB Ǽtúkݛ٨ ӈҜ UĽ3ԌzR,jҡLbب~]2:EQnաCᮮwÌ UyġvVB=AϺ{1(@2ѐ>aڶΫYd "#߿l6\עyͱŇT)ᱽG\5#}ї/ϵ^؝d<ܽÏ##܂۬˨hޙ@o1gAɐVHWl?C@4ҬHvFF%Lz5bZ}@bL}ݚP܇oل3j*6a<@a;L7GBЍctӁC8{}ނ#ޖBAf=!ӴdFJD)Uج֠Kod,.؛Hrsc~j0+' {/Z?U^^tJߋܫ9l"a,&O)wf -b8w>yم $D-n~6_\ ר1zJh^N!o ʤӱֲ wei߽v8ZZzGmV.(Y?߳9bqla]_v 3 -.fEՎw Q? K;//5"mjפ`URb\woCI,CH Oyٜ T z!.u|T<62:<{^  T J[m5pCFWX/U: , C\T P$eF^:o 5d  P].p+d#B V6B[ nY: $E* ukEVH_$e& (9Idl&? U )& o\Lg* %$x\!.Ne4  &Y D6Rgu#y1"W E $ O m 6 I N _ Nd  l &?f7,{#YP2   ($o j:`&*$(#%k!Z ,'yz yX,DE4T#! a >?+'# Pg(%Yv%F#2-X4n !  t/G1a-2\.}  tQC3.+"|!0a,O#"(&' E0c-&%\vl,4094LP,*2/n/,##E%w%'& F$$ ;63M1/?:@Q; ?"k&&63n+*o0.C2/"g$X%&******<*O*.-,U, ,D.-;80/!#D%'v(.-10t#%)*;7;n8,i,l+ "{63,_,L!#I,,0W/$%-,0E/v&%'mFQ@34,2!!,)4*!6+4.N. #6%()3m2&':(U):8--k"$()Z++g++*@+*5u3P42G'(F,^,()2i1+K,1S085f,,$9c6*Q+%X';8;8U"9B7;8'](*-+4/.1064+X,( *5321_"7#$&'%' "%&C+<+52E-,+ +20'T(&N!#++2H163\'' 6 384#$&,'$|%3$%/'.u.-((%&S&&J-5,)(#$-,,-2,+&&>9K 30+;6/."#a'&-4,0&c&('*)W511a.)(!"1A/:@6&!n''0.,*793*(Ku@T$.+=7W^X&,%Q&&$'$p###,))w   5%#%3$C4/Sr+'/E r#!$"]&?$)!OK"X buL%S3r $ 3 +' :^"G ' \+ &2  ( J#<Z.t {Ych 2seM- -)!ik}X] p m jj6U rW4 y "ug A"  1 U E*n|7 m= 1w` K nF r2   JH:rr d#V#0 6|^Ddg; d)^$ ,9x P%UX jPH Gu] liJf pl<!h DV(`<&rG\+-sS`  @5jqZ "T N$ *h ~nA vP  G;D\V r ^ \ewK$]qw\\vF _zY5_h +B ;P i Hb   *A71,sNV'jK.= 4<@  Wh3 }zFO4Ee>bw U cu`)  +P'   DA7bc3Xe jzD&}+U79T X. 6>Dmj  a5\ J s<{IJ-1 11e15xY9p5_;f$N=Z p=!/t3Z2B!zf'x}{A Rz;'q)*UmFb9/VEz%kp4.'P6~ ow| O-"{ FfQ5SJg|t. 4GyG.I^i30>pnyYV))*WjR8z)Q3bf_%v]|,o&^ %,] Xj|Q >)}\4Kii= =FdEX|<TqLUxDwMa1 L3:; WTZ$*TMU2a,Z)0`_ ?7vmUKcN kK2TZfJ6{BGj'-;HQ33BGC'h]4Vm[w}/{Xdr+{oh0 4>Zu3[zwDed@|9V=Th1]+.c7YY8mn$xR5-^$%|9qO51IB~r\|t84T G~kQ,LgpE4g\MB_jC\;?1&(,6A/e`BqeNyOq^k0fuXQ- uOt ;zu [$SWA+7.tvLy!s`/m5Yvt&a~l[7BtBy2 "-Gm W`@usBt=,'~j nHYY_xXPK~ ^!EI^aGr+$keL6>! bi#A^P9CTTld JvY e2` V]]PEz"7. $E}X!3k F /`=*S! 92=,{ xhbwt2 =x]=G"~t.-" ( SS&W4I&2 H  g,Wm*T*~X {2U HLWP!?mofDaLs03g_)B<(k%]2Faa#A%$DU7yE &T%J33 mgS* W:e}l|\2>Em$mbwl5T7y<qd&mUO>zc#-n2fS?n%kI1EuTOCU}DGI vB0I~pQBjYAa<^k'i#/u0r K0uJQ- '(Ri$\%;8K'aG+O. sKI] vX) >4R7Qf4< I wjW rM<1Lhz r`HI-!3ke_ B>u!%Pi2`k3>0'.(E-R:n!#Wr V$#r/vJ*|+'!N3m(*T$ #8 | u c[! :7ZIfc@ GS7> G@;"TDQI/k0V tpZ(#_(X|vr :YM'[9 V1(s<2   u-R~M%rjJ( "W l T(?]J"`j ! :z{= ?|A DMA9eA(w)|Bc u(C=W  K `3I. \ 8mQpdjBr$  (Lv #Wt8RD1K7m&}^p4{wy'w~ 3M 4r7P&k}"/)4T7YV lvP2TE^3c3.zX{JBgWV3N8 8{RDG.vGx9ah`R@gaHKOSU|% j_jRm r K _uh 5 :] %8xQj  # 7 xRYY K &   N dDu yk b R6 &  Sc. 1 l v_  i X ,Z + _ p c /I [ ]  y * { Y ( x N - F A<d V : $( 9m@ 3 \" ] q ; 5FC g  =-kb 4 H  yc;q?  o ] _ aYT `  _B  (fEq - *(P< } w `  ZB d  r !q1MZ:B  $i' u&O Z  Q 0 % k Vy ( P  5|   V ? HZcwh)w L v  A [o 3 9r'[9x5t1swsIr}f w ~.  /^Ajm j ; |(n|K0OE 9e  "  _* }M:x I K , $A - # ) R CE  S  l?    X X  z   I  y } i+ &I j 1q H   } D G e a 2 d ^ / 1 R O  I V : g  /   p Fv o p Y gQb 9 [ l Y X  a  g A % bd&` J ^ -,L l Y q, Ixwo ? E#_ ;+TuH K vJ z{  \ v]{HH5 MFgN$M%WcWB - NoC_f`XTe7p.9Ys 0J(^ Q2mJ.8uU3;<s p sqs{w"J|2%8CnU 7tKU:IRi,sc*6M$dhN&Wn8F*_j;L f\sRqd$]P?WB(I+FE1 ..7g&gXNG 1 I]1an% {Eq{u 9H=$G5~#3[OjD.SsKIrO_5dTq5 10?jGKEQ],W*jnWVOOBBUYStX<+|oK9(}Lid 9+R\#xg'q:XPHwKg'd3^S.6EN ,l Nq5{Y//sQjyF:03@ aH9m2qmi<C#zWL5Hns^wLY[8h3$TTN!\DqkcWn/V ]4'_0z{1 sdI~A} !^ e9=\>YtMo#7b;*$@>otiFZU,(2aQE@5JU+t},CZHO_57F~_f~Y ):pag<$5\;'5+ToyRk<7f D XSu]R U Ubh\ZC4DC:oLnT z"pX|:7f# [9iYDc>DpL${ F ft*a<~XIbPF(e Nw} !F]RlvW?Qk @e*c6~" 0N9;f*\ t 5+;%a/?M0FD2R* |l (i0'`LUCM6 69qnz`@*&UY#sYx`12xAdmm4 7nqux[fa"Ww^ +/A?= T\eR'Rp(A(]w"r"r0;"n(U[607P$\UBo l&DMgUO2XW{V j1Q1'--8$:` Pg!ZKs^J?tUR%<pP,H{8Y0RU ! MvS- 02GF|T #`DjEPmG9[uLr,sI>v.-u?M\;tri%Ro} et5K;M=R8nX1 yWOJ}@[Te!d2WImpeP_P9V vO`~6ay,LiClA8?.0Q&U}&:ZGlx:BP Wn_ D0`IfQz;  !X C]:kP*/ tAwsuJd)_g YU<T3V _[Csgf5.e1<fF?l\(f*vf\/&oPHT`) ~gYn/ dCjW)|^l. ` R^Q~zLiW LM! 2 >r[0nH51/=E7``K:lCv@pr1_~v K<qtPiB)q2y? |v,5Aym5JtC|nJAA J s<^h"/U2shJ^B6 YNy6>4auTryv#3  uh`?mDZVNy ^Xy0~S[}K`7 ]M4X\LHAm&Q|^U G:BWL ]Pj-O)emb;q,01Mv3xlkk_kfgl8;N|F5&  , 5R$-AIe4v`UdU1| !??BOwm{vy'BE w5LPf" 6 |#=-P3M9 O[*BMr;CAZNa6B~I_4o{Uh<^0@ pKC<-a?b>my0\;CgiQ&RHud #]OkpnWe,rW0%,p  # F=  tV5Y= [z&UgY%xh (BlfT$ P8@iax{J@GHf/0)@by9>61}_H7N8v3F."kz6D^E3<Nnd{uU@l_q^n hzr"A4|3z-;'MliU^T,`7>))  [E '?A 030YWJG,K4JO9P )sa@QjtaGG=toJ(qYsav*qf15D?[ RM32=#!M3SVg"TD#=kk]q{f\dsx]++OtTM{kxa)9TJ/vxLS\0, niB0)*wBR;p@X9g=_yaOB {b\ FabZ7;p=<q%#Y~: E_#Q9O#QY}zuE/' p_\d\Xsq6ZsnE#x 2Y[1Y<)& &g+m*<Xof]pT[SMy`k(!\Tk 0'cS*pOT0?1@AK,DGT|Q +{vq^UaWFK&)35@CPQ%T"nF=Zt @Vp~q/S5|C;D<T|Ga N.#.!O=H7P.  xhYR 7BxCK ~17zADMT` W\j(R?Sf'o\d%p-{c{~CVV>*>N98+D]'Iv.!v%$jRy(D{ m^MuUp !d}Tm:\Ss}D6Q?K<"7*xS?E`B~#Zf~EZ,s!~WP`1Fn2?,ih\N "[apnPoc[O~|DS)cVAF_C$M6]o GO}.Dze[p4E];OU49 p=.+Emvfn6picBcG#dyTqFZd{lZ MO#R\^-);FC\9m:0F9U84+"%obYOD=~h%@D(]rOh i0PL:m(># TwhsV]JTCIkb]U]_1+gEDS7akXaQCTUaJ6: AE>9<<@CSS?A]bvXI+Jc[M8iS[FtY:0p^cIPl.#9'< 7, Xj$D;OL;7(}#zYX[9%%V\.]@^(5wy;R&@t.HFV2T8HYyMg_uX=D;~iQk| \oZK(#C@bxQoZQMHi$"nr3[<}.&3vyw7C7E~+&E %4#eTxm[Y>\=k6 ~mvufB>SJdQuh,F23\{;Bp~2++)7+NCNF9/(uOlD@!Q|_7R?9@B0,^jGBhWWpG^]s GWL7G9Vi5$o[r\ |d &"P>z;P AMG;8PEP; '<)BX/C6LZJ+):/;=$7< 4[/NGb KTbmCM w5CFS|0CUkt_pA2t8* _r~s}=,iY,I]K: M67?8VP  |<ZgQENK^9T1}nc|IbW2|YR2GI)6e}/,)24][ ;8VU6C8974XTq7=zU374Xs_~RY$1OXnyAK|":(8qn jP1@W}7@zWD/T_*}qtDM.% |.ku$*> 6E4Mz]l62ve  %  np|`fQ+)!!50b]Xl4+ gbtKA'zx.+%$(LOGE%O1%GPsm**7qn!)x08~f"Z]#2ksxzmm=C8GjlMQFK''04?os%NQxWYS6; |xgo RO %"YV=!gE$2,l\YRZTv%h>aTv.&$y!A4LAjF_XKqe?NgO#cRkTUd1IlI=-$3%t[x`fQ.0$YFI^*:I7em1@( 7(o~R`v{ 0FQAPx_YdY]wwj .s+A;MPblx"+|4;vWmoAK-<A.6H9iGv#lt*4EQP[d%|=Z>0'1:> 5LO)0 76\Q[Uke{85ne2/_z/<`}64k]1+5/]U" G>VMy )"{ wu  luKVZg7K?3s=)D45 7@sw}uRAk nyfp)5% .+9oq   E.[h9ErsK-#IXLYO[zo9bENz2$LV Xd &tx\g 3$}`!lk*;F/# uw|t|9'nX Sa22#(t`_pRffv0Kh|(;I[teUD 1G{GA|g "  cr<+L=3J/F,DyK:r[q}L_1%kR;ua^P6H }]kKaB5xDY n>/\h,3I,C^nR: !U`rz+,D0;E)9 'GL'uT}BI?!48rmKMqnLPz9< ;8pfTNLIrUH\RSK_vWwoaA?7:QJ 8N *+&+&gYcW 3L$E@{KC&#TaQ`8+{iz~' #oz&m]{que\k}VhYgePs\q~?0`I9H ;)G4]hakx agagZa([D6D`kK4;++j.? 2&XI@5v|7DepzbM> `H4%zYgcqBV@P.-2$|v (P]*} #FZk^F\n by^t&F7Q92#!=] As==jdxr~tk11.2TRQNKD*$RO`X1, vluo6:jdcahf"%)gbSSon@D &?CdaMO=DCGli~c_NPtr16he-b[A#5/`fwzQ@<+CO*9GTL`. ';3)A~. !5,O_3"co_jcoTB/&1A$fnu}/@Sa6(o%WhZe~mr`ijo]eLWKT@JO4jb~rxCNGPKS,)spmlzvokxnmnmnhb[KJ36&`\|ua]78OL sn$,><*-lfjiCC6:]]KO so `@nL#$gayrKI(*FH%/0LL)-89FC1177OIofSpd}JI 77bZKG@<.+cwLAZMpbUL@:MF~}rf:5C^!E;k[C5 qucuy'7]kn]}7,ixM]1'.%C8NB-.%n_fYx7MSe%/KZn/)|jwb?1 %<!  /&1=P6/Thfy gw88-jTd #4K zkDX?h|=rr6E?""--h`{Vo_s79KF77138;HG=:qkKJ+/]]/8JN[^$R8tVff\aQ8 %6|{PYW_:&x{x{}ak]gP^s} J82#6(J8!3tz#}lX|FS1@FS!I9D4G6\F;J1CbpP]_J)r{erYFo\\jz4) lxF\4it:,"DR(fsFV\FsR> IQ 8' (TYfMF2~tvfh)@H /e59" 29@F|{ortrUX0:UVzxwyx|z{7? mD*BI~(>'nk,af=D 3<qqgi'HOafkm]a _i uwlr:D U<+U[ |}!Py U[FKtu.>`eHQ/:qssxS[jm?'?'#,=F+6>",SY pPU:2929 u{}~AHrs(af>G}~gior%W9|_5@ ! &0PV)2hi#* ijijWZ?E*3 llCJ 6>" .5%0pnCE ;AeE}[]]#*#-gADpnNW|yWxhioo 19rq! u! uwotr)D2LYKVtxRAK;.'m{9No|CX  sQd*#.'.%I?wi_TI?l^;S;S#!~<8PJ:V2P`zmv3.ylp:4QLTNPJ-+H?E= |i{"6,3()`pYjAT3HfT}LZ/A\h~mP_5JGX  dON<"6DRx__HitTb1$y~EQWblt=*gOkl!#0!1<JsudgJT/:ahgk=F ooqv!)!){{[^xyUZ.82<:C3?!HM_`wtTVCE{wXXCEfbKL%,,2DFfbto}YY$)OQ?!Q3(.57@B#fbqm{ *, U8@^C |TQ %NN"pj./FE \[jH+|x 39NNRS|x M/_\,OZxjguqRS7=EI3926VW-37;EG05^^~WXiK.! |v&+~yebPP47skInPMywn01y 32i`{w85qw/0$%%(tki`UPznh^ MG[TQL 98nemc?9+*Kcqg&P+{oq9R!"/./. !1/MJ~d`-*;7.-22KIGD45^Z*+,,BATR*-02rlNLGF QPrp}{AI xy[^MT{& )2ooH1=& %2Y_rvAK#W?fM<Hn -y|?I&4T[,uY=(V]IQAJ)3H4!^h&&4#5LW b7D AL#U<N8KT(S]pv#0#0I5z_W]?GLSQWTY5?.9FM^a:B4<aexy6@6@RXdj4?&3vxlp]a|{il<FzxR87!*5g`eQT{yxwCH EIjg+/HK]z(, pm 4501ohsl*)sne i^x9{64@/ Ia^szp Tj *!aV{`S(!G< % 6. /'H?>70*A62) sfWlXo:,H.Qhvj" PJ?<73aWEA   KFoA\u,,]W;;#'13;;a[yr=< mf{s=>"ZYmh*Pc*1hI&JP=czxPVPS]a@F@HFO{ dK7$&4&SU>`I+hoyv~qw9F+9x8' `k5%+?PBQ )6D%>Jx}T=w\R> u{DP $3ho}y~y~}szhpbj^f*-: VZ/oP*qsHQ6 >G FPsv;Eop,{}&SU#*[\ww~}gi$. &.3$he6ce[\_\|dc$)GHuq!'DFrp@B=>%* olRQ!&RQgcgcytzzLMegenk!' $) _\_\ DF=@ %xTr+NSq5X@F pn   _Kp8=4;FIIM[\yv;A-2$Gk{WZ xuBG 3:il:@ st(PS27 Z[gg:@( SWac[`[`[`FN bdsrPS[^sTXpnmjwtbbSS8;FGfdmja_36CDUT@BUT9:%*$}v{Lhb~SQ ZW~Xty}t,, IGme(,22XR{zMJMGpfmeQLC@541/[T\U+*GB!" A[g},,!"]uaz=:*) z?;1/$%FA]YGD'' %.vO~KF `[/002snzt}vKHh!&idxsge{toAE fda_59 )59vt5PS 0: R:,uu=&)fh~`X>=FGNNT*7 fj,)QW mpS;TY mpwxTY3 sxLU7$*- FR~w}ipipfj*CNI3 bh:$MU5?MU?I_d.{\'mo  ' dj&3 DJ!  %RT )SW SWkl=DWZ[^(pqSU#*?CIK".3#+IK}x~bb~zMP &5;[\bb$?CQR" &CH{y SSGiKm9@_`}{wUY9@CHie%,llsr WZ )IMFIzxBGW\%.&0opef-7'PMp=B"vv~}|LQBG}|BI PSopIOIO|yac^bvvzx]_Z[klehZ]zx]@}z$ -2pnef(38yv^`BGsr bbpnPQAD^^<?8;ABPO/S4 Qq=a}( A$JN&,CH~z{wfgxwRS@FxwSV!'{#v`gpFaN>W. c:,HV'r%OMp>Ê8-R&1)MPX!   oT9' ; x:{- 2 QK"'t3]7T)*q$Jp!&0~:]  > h BFyR F8\QaV=A;_N+R|(6Ho{ d I 01 S ] H Sa,k6YnKn[vB3u V^IOIpauK TO{~oJ;MXB<B+sEO^ w! hbh$RNcnQa9 eIpz`_cK G(@ `0i< ; % EcQa9 h`V%6 j d[#K ,[OJ  H_)  >Pj[&l I lE1wS bJt2 5 oz Q"z;"N'AAp <;LKZ'j& ~MP4 >|.8~ u[ > G.T{" $\ q!]UT cA8/R@-T`r_f<  6u" > ~ jqf '[Ywic^<u~d ' @ OJ !]fsYIh61Y(RmD ITq1gc)K%TAc ql  Jaeil${nRk*}-2<,C?>h.?m m wZx, Q'g~"sva L S q lRK`zz T  U"wC%[$\ NvVmIhfj.$T8 84 H u= wJF~$F+Gpv U Y>R L}d \S6 Cp }\=pJ>pn { qPc' a=.  V B8 {I1E| C ) L v %^|qp$+RCv$/1U*,CID  )? Qq*4 z zs/iG1 G#b}$t|i"<~)6eN  x2 I U +08 & Og Z#8.dDm & j z adV '  5.}gpC  2n*@ * t}cHu `;  $Bu 5r35I]p*7  GC&/Se\OL"w*"F* qfc|1L$z/ ;Pc~o{6Q|" W ` ?2s(jfK 3j >M=3 ] P\p]~rq   2~Rn{I}& 4 Bp` 65Ji_'1nu~C4cRvM<F{e`Ffyg5Q>dc:e  c E~GNhiT8`)jOsF5,h!(f[r i6}m~Vw(MYWwZ 3   olC**_iV tHmO \B+<J\b@ -C @ < 1Q-pBED> dE Ypu ?# HAt1A Zl1j vtp vv @3yd{b v \ \WYv-) 9  }R 9 !?\kwBZ  `"*f2u)X&{,`ct2y B ut&dM , k S`a~9 R#,Vdm\T!X _Drp  yBKDZLXw"K3YY{R eVTD%;ewhw=1w"BT)3 Y h l a 08D c2Tw:rREe@9#t~nVP72V)KP` ALjB3KLivA&`l, 5Pis]0D9.;= y p[U z 1 X8**e)25Ae I. kB*;0 2I Z3 G sX+ ! :#,/ i;]4$" G & + -7UoAi ^ & ;bv g`@nw[q;  .D21>[(  ic%3z2:eN ) HI1k{; AFmJS:x*&\R E@>  uo|UzlCFl3GD @S /|lj<ie~ -^# !Qp|V b 2hK& s6@@< }39Oj'g f } *!R>ziH{'|'-zQ(  o 33 C z=7AK.)] r>+ @d*Y+(Br`VCvUw`m M \<0% TB}RQz Rz&: >* ^\4Nke RHB?QcIbzjyhG d H W[mm)7)xw0 q q10r_$Q=Gz G}]0 ^ Z)o0i2 Xi9]rP _Br TX8PI %S(c8v 'p p/Z>\7KoUN bh  kx)4w.,%]5Yn+ } ^.- Jp!$F+Ls) v W `RVjlDP ES]._ " R-  f Ji  W 2GC8UT/vp S  CzI4)0 W I8 0 cf M _ }.DB oJs \bbN`Z(l!3k4T 8\yD.f^ [nsmeBAn!PKW,)ZKH+=\yJ2hcMrY   Y{?ov } 62W f> abe@ Y _-,A6Fu\GR9"m:> Vn9!KX(' a4 A  {> 3:0#P6W > PqEx`x7yw1 p;f QqAz^.P&, bt+&Wz 0= ~'=Zo =  i\ -e [ c$6aiDg8b J/5 C tQnVw{,Dp+jey j(>uf;H"ubKJ`J/A xu!; t (z-GX? sQ!nPm[U@df W 6KW 76Up G^U  sy|'~> * t\/H|  dq&zx(5 " 5p}R"Q _ zhk0PtN,'mlWOr :^,y=;#  \ uoMv 0X#a} aJ|gs4`NvC = Vjp {X v L{Jm_wsbyG `w W*NAJRxA^:'T }9b1, t aQohEe$I8k9`VUtaGHus{E97u " ;8SuDl@/X }6.X5 |,n^ P|db{o@\zG !p|3Q.(tko c%#E~IKm r|=j \ j%yVh-ki%K7> M4 q_Z*s`.,weSk  -"c uc*$[Za[DrYp)t ,UJI?`{bh v G/=D$k/)td@/[S|[$>N c L-\ chZW& jz hN)D;N> ~AX&g ^+) M&FOJgwe=  kODb)Q>q]zRY"n|`haZ gt-l0gBD;B-y08 & sj6^)2b GI1zd' Y : O7.l I)I Rj\X"I(7D7 =X$$(?"Z4 YR8vr ~G z "FYW$(n q \YgdD`[nu]5qrV.CKf]R {:v`F+/k@6B@  mcA0TQ$z (xYc|"0  5 MH"z[=xA_`| wD y D Fd0
e%U{#Vz?9m!ti;/ 9  tiMx 6 s;9~@M62q|"Yqk  Y>?( <r o B@L :.  + $w=}SF6L  p&6qZ }n-Lln \PEeiXx O Z&Kt! G Oi?pb z =DDZ WZveXRf%/~/jl4 K(uiO *DE5O<jtPEzBAz !;Kk2w #dJ=v$h8!Q7cUIj(L:{, VA_pROjg'9Pj7k 5[|]oyq,y_3}8  d9jW! aMHk~ 3*Rm?7 wW^X4(x 525; Z+>6'ShZk6 6Z- R4kY P+;t^nU0!V|"q t]sab/ >72 keLy(H:N0J 0-l4s*;|>^Czqfw(uIbqAe'G:Hc;VUlZdh wR-b}gvg,].*aq%z&xi/4 |c[R_3Oo90(w W*Rn[dK n [Z")/|uZ0P.PSWV M[7m Y!_ p'$)J9EL0"d <qf JfV-?0GFZ8juWC@}-`,S7a2n+wH6,(!XH8 /Pu3 is2.24>=+?_z{I6. /}$Eh!A9+o(BcLJf| ]L|x@"G[B;(\ 1 VtlZ= }}y u@!6]@M]zyn0+Qz)P<`OfJ<aJfhpO9 aat#I8uR\6NQlQR8l x_b#Gbz@ bPRN:,uP h'NSMG$9?aaKcClUsS;Amn2O7~i #Te(YgL(i _*6o( 3 n6ynbPU+GIdMa.M~gu`{^%;U@ldP^*a0YAk~4,1O) Nl1ZKSokp6|>e+;1!F50F4e @?/{ Ck^4+%S_ %^G4lR Y;E2W6^\4Ep_`(=undyC-Ic_h%'KsjV+u,Qa(:Ro&$W0cJ-=0D%(&v)B?]F@R7u"IfxK [ktwGb%0[ ('T  os<BxW {"hc|?|O6;NcEr^,n67o2X"i43RD=;8&6, NYd z *AmEn66M? kWhZ,K>w:gN%%$FDr9:Gdm(+4 QnBrDihQhMao"|\Qn$!m-w$e-_d;?`(}9Z~Je$k!4Mztw0s XpTMuL:ViWI>6.0B0Td4^E$&#G= 0 Rf} JOm#n0mm$"H {JsFuW4n%} N`&N\qM_UF D, 1tAyf"(Q|9urUTmq@ ChV]*$A*}?6A5Kq\%( 0@#_-/9  I='Jr`rq8-J+KS[JbPW)h,m|]/ .Or @[:"4'sOV#m@+gCP$z}<4d$7]#9<4 s}mi`S< i`)xH`SAlRM@\wQq9:+s1'Tj0<V/ Z{ 8p_JDU! Yn9 =v|N C#t.ElvRhe7 R8 \* i)wNLMTFv~I#SA& 4fN+I7iADI>vDPShM`EO)%D `-bm>ZvH)t+;(n4k:&G"nUn_W65YlRo*K62aM;tcm 'otgehp"*k(a_ jq%o"q(9e+&)v Yr-h(L $CVqlvd yfY$1;}QCFY$s9y3{ge&NDK7eXHj2Y<}\AMlE[d<Uz?WN- t=~,15;HaacS'|9-EUb#~45 ]zu\Ql$~}8}8ps= \xA-RYK?`\ U[`5Y`> "UsR83*IaH"[)!Eh|n>`5c h4f>X@Zi!oQ1<[Go8$ziX%g,T<u8W$'ps7T\46LX")BFy@ 87z ;QzqGBViZ Tn} 4Ctk%bz?^=R-=o2V[tN6l%Ko*Ejd{i`B#k1zy;VC:-j) fZy)MG^'a~Qu&_|$%Kt_x>#!oO9 `e]Z:3'p7|B0(LfSK;h|%%&(HdQ#L[xoP rPnq'N:"Gt/_DQDU([F=" g}VoB* UdEfV?Lfx1>Jh72{+tev |5  sBn2Gmy<2[\&}E\#\?]5)Dm:q8+DhE3 Li^Ni?D RC6H0xKzqPPC2}1|p 3x.*Sy\dWu)@XpBsb >3#V#pJq]VGpU<<5*)tim[[qQs;n>S.+:q^c{_k2y*!;uzPKaO/GrqQ ; Lzc,6mWE3/P./Qc#W!J`e|q.Mcy(-':4~gEZQvm7d$3c+A5"M({yn6TIMbH&-I|XO:+#XI3Y0>&SL W#')oW/N(t!,D06*%cWrt-1i;I HId [9U@lZOY) 3u_\F=Z O<%HL?1M380A]pm^xWjwNda0u8+$qK; \(;G"G%_<.$(YGRG;L?VMYM-F%H 3WE~BE"Jn2*%N[LQD%+)MrdQ _MrH8e`%)JH7|{T, Aj2el$"T71`H?z6V6.=4`y#fQJh_"fU}+HwBs9,b~M~mH9h3@}m7-vT;aPTr&Gk}#j*i[/A;RGBKhBfK!!uH;vc!?dY)P9 &hh's k\*A.RCo)7~J" N$6D'Ez?$"OEee-o/84kNC]zH'I+@s H98vR<`$p^%ZI#n"*vT{ Rt BQ-#Go^Meess NezmXN"Hi5K&\wE'LR\5OqMI% snH.['wdP50B.9VAVj2Quxe$)0&= a/{!FTHIO?-#l5|Z6GH!zfSCJdsblV1SzkawD!c(LX0fMd_tgb}s^-'7Zti-!WxH;XkTybW FQD &$p^hT:(`*S~*AeR7 1Se+p dQ4+VWt0n^%9UY$n_kaF \]_;W ,&=s7DWk0Q=I=PFlYiTnG>])Jk7~Ki26B|z $E}.{h Ys0YM,yE= a{ 5w.M\8ie?^-XG[rDm?tt*!(AV(bd\;-g*xADK?jEee4Q9#h? ~1*TI@E^Pe-.'SvTb'.a I;)J N 1z5S_OQ4hH{o}_zbJ\KNGKG4x$EU"NPnB?[(& !Jd.NlIOse3!oON$2<2l x:YWvM]Q;L=~gD}.ZKbVq8+(u/"m,&j]}nbYMn4 r0TA 3j)zB1|N3PO7/ )P(MEEz$un4 xWH~@ ("66.c]Z#IZx]a6Ud&8-{cdO}C@8j[0(9fw<UL=aSkR4SG'kYste+!A]Xp6T92 bWrH/*I!mhXVt?'C^<2-0Qqc+B0S$N@N 0+|.}>neRy bw)PRCdOpW=Z0(H?:ZJfz=4Pc.-Oxg5Yd{Q=\p]G<^xg*##BG2S Y"IQFR= A8-um|kh^P`O|XHr(u`wqw:<[vD YVI\Mwmyj]Pg}$XLBavsa'%ws^$G: n@=\.*XH`&J:.rwfV$Ex-s W5u:Y{ tGjYFjy 1p3#r56 -o]l3k@_{iurH}< 2F<wYK}aC8e-wH3} Ys[!cNl~9a U!=4q_BQl `VaQm{i N3{j+!9.Tpy$YK|;1DbE;  j7~U!,9.)o [%ChZj4 NzRC4r+xtI=4 uF2Rpn2;(s^w uPGj]B7g{ ol5Jn2QDxF:u?iX6VKCz@:j[Ro h0f,u<490(E;#GA?_u<n;5ez=&z={SKf3S b;[t7E/Ba|D4$ENT*KeW{{602,>5.XH Avfd{8u8]Q=6Tp-Gfc}hj90{wOEI?[!Ba>9 } CVaR{iq+su6%$:]E;r8(QD%H,3Y'p@fU hV <_'n0(80\M}6oJ-0,?@ ("0T~\(Xpc{NH?oiZt_oB9.NoYsvdo}+Jx%l3sjW\% 64K@ 4 ("z 6'!SoeRr2,eXB7q82m[Td84x!j]UIFb.#GB%Kl5aVe";&C`2T=6+UqNj  .M-O _}A_,L9V|c}whX-7/7Wb5U{?C&%yf? J u6L5Lw 2$qcteIk3P_v"n/r`,GBb3S Ef4Fd|r%"]:[; SfUJaV'l !zL(*!B60E yZQ(>[qao.y_O~@PaytcWts8\O.'/(eVJG1Qq;-G>)"pNh?^m3; F:?_'*Im[?3m\]QeV^xYs I6 Ff 00& Vqa?m_gbt |C8n(faR'(obq*rJ;5"av@4IIg{K@2**+LEc0+2*?O=Z\wKCxc1)kJ.N_vC)M`|e+uQlmsbw|>4YGE7pK>HW64}=`$i2,wB NBeF6.6 s.!RiZF{n! 3%yfqj$BakFfl8}'RG,(]yRYKl.t^N *v_O<<[sq_<4)%Ro4UO Q=G>SA}h% 6XTp  )%4)ro^Kl3% |Ql^vs)%$~ieRH;mp r6 9s.'k/hV$($Om/(aRmp]:2 FCv+iX:UI,&Trgy;w9PCtXn66.;-rqts)" eVOm$EybYK?^80 /o<[y8\w.Q4+He}}n?`w8+|>&5 C % ^P!8k xNDD8"DMh9Xtbx UKZO Yqc}D:l<p^.'hd~cSwuQli-OASmbz= =  0'UIeV-:3J@n_lZZK?3SJ}ZMLCF8LAH?-'d{90?6ta}{SQB[r&E|!Fssb5W:Z^Kp0%?[HF:DLA;c&:o` cn@87Y(o{i1Of8Yj[ ?sA` Gf,y'LG<A5:VSG<iX.Awd!/*n!p]dTp]}cU\Md{lZj[NTpGd9;qgUn4+qab}YG~mVoQB?3Jh&B9Q$fz83ZOCJf 0sl @^TFF<oz?G>0T?r VG8-"'!lZUF>_gbi-v!F680 PU UIsk- T1I[l5:Z ZhV.Twp{UJ;1L?Gdq)"BxZM .*ZxAEc}Pn?6ay1Q,LyTHm\o0+-Or58}VI @/P5+>3^N"MT^vgS) -O te-w6-O}h'IkPAPA`({i'!&pQDm8X_vnmYUP{QlG>dw YMfX@ 2:[}!De+w<q \(uz-$UIXrnt-K?Y\(wMfpuw6 p 1@8YMsb}M@F:4+B7>34-Y$EeI>zfuqxe^Ne|)"u:.0(QF]u8S -$2'{g &thWLC2T($NB!}D.' '~g<0 umH;Vqg5+} @p\E9k$" bP[v ]QnZI~)"{i% r`H;iq_ 19jY4LvomTHYu\w 7W.#ez!Do!rN<9>_?(J1Q>] B~m}j 8Uf!DfQl)Voc{-)UK5.~XH(L PIa|:0Q ; RG hVs q_yd F<bpaTHy9WvKh 5Sm = w<PAuz?[L= 9c}wg}ywdSE[t.')%w5.+$% Yu@mMjk/w7wey$m-OTFPC($\O(Lmr#Tr`QfU9X"E9n"<-$Da`QySGdQxp5UfbRY"f}zaRYw@:TF`*!FfU Kk9w,":}f4+%HXrXHpt%"WtXHjZv2*o'`y5U]wYu`yFdMjG:>["aSWK[N!UD#v`:hVw ZYہGnXF:1,R qc3-&[))q& L ! '%m7!#MK /*/ +m+VnE-E?4%' ,'>"T⧣azc<ă &b L_U3"փkȿsGnpVΘ˟9  kɿ[N\ԧ HlײgM6s_ƥ{zMq?H&e{ f-֛Ge *t 5>אw8ScSǓ$ВχHE?il} *D$ɇ ^aiӠ(iޯӱԶ*Դf 9FP 03ХNI|Z[ uR=<4F#:#B 4 FV!#:H7,,N64O\J 9#:,a1RY_UVdS@ASrP7:r&,68MZT]fV!c&t" gkSaQzMpp.^2>UPP!M$,0-+M0"T4P{B{BI!(KMIB}Ak99$^V<$[)"(]4VdL"Hl"1).,f?=R1#V?<'VNz66VDmA]${(SNGS jRGIa4/t(!κRB9E} ыпNq1ǜHkJ̹YowN/yнre(΂BC::˦͔ˑ/SѡU׮ӵ YGÚܷv*հa"̆8ޤ۠ :Ykt!ogSJ%z~7J8{( / d } (e"9e&w{&*A'R| LNF5YNXu!B?46a!J@Gg~oRMM%*h!'?>QMi(,ZoSd[* &,DBGE(a.GEGGFJJZUb\:980,0 z33NHA;Hm@P1R.]S6=6z$IFBB?i><666!'Y13QKNIx&*9 987yL.s.7T4'(75%|& [+n&#m|`NN f=T9?@ w, O9Gv)?6V::G] dP .\ gFa$I%O{ rZ {oA=P ̳Of2 YN~n}zy}٘+%BDIų8ÈȳSNۚ˕ֺK=߬ٯ܍Hܧڙ߻gxy fi˰VeّV+\њѲb6 ŵԝ|ː ja>PAGtՋͬP9ËOZ)Sܽג6iپxԵ܉Z6 jtvrK HJ yg/#5-| #a!  m2$-##";c p=0.+@ *(; 7((.c, t=/7~$&$  =8E4?2+},C@?<6}k;O9C@6@6A?6HhD1*,&>*'><>=;88A.70*T-;:*-(?,UJFeDA(U,3s46`7/E1<./$X'!0033`B=,t n :$!e%hyM4.!  y%&$4=/3-|N_R 4W N)*66 CbADB^,-./0@TNYT2+6$468P0LED.113$HeEWDAl-.--0w/$')+? =Bz@/1-W0>q=C@75~$%E*+65E?
N&#n{> l,k!&K+r o } m" "#n 9 GI ,&tzQ"J~ k kv4 kg{ r^IN?}#u<>AN,XN# T XM~(r RgC=fmH3|#![ "VӶӞ$۠ HθPԼTٺ՟ɀJ̍a=z̼ʏͿ`4׻sݓȅXгǎ33Rg1Uj9_+)'&0/@ <.,9 E$"!'$ ; ..*d > ]G v St'm"Fe % }mVvJ+ 5]f^*& kciɜIeߺg1e.]@Jn:(+1MW ] s^nGh|  iRpE;>%R8*= Tq<y T@ t" ~3Lg Y tD  ? S H")'q <@"!-C^-/*  ~&+)#7ju,*X&}%^ v\& #lMwA<wps;],2 1  z - h 4 3Wj/b 3/J 2   dB {)&KV4[}Qg  3s=fsYb(M# # 9 _|,!]9b/xs5kF~C !@ڽ>Kv"7N ] QnO  HK ) C B X;a7 X \w[DaY1%6F    m4K K Z-uhWJ   S   "\$f"$! (   b qQ" ec}@5 C ec8 }, .8_&0 lb2Pb~<D  ӠmoHM`?? Vz+mEhe=ټ۝S:y2[] {FR#w(Z W7FxiCi:+df kTc:W"L%PQN<RuQn#; JP;[-^   i :6@ Ii%4QN  &%#"@OSW fh)'i+B&&%$"!Rl(G%O `0qE  BM'7%7 A<`  ( pXW VPB{P&'^ O{{p>"b<+8'Y#H/ Y\*65\G-/ dE+.1EީboM}+zsc:ty|%(.NDS/?r Frn~x4S9 c .  2  ' 7XcM  h  ;'(7 , xuS % m6Bdg:Xr  Jt >9x[ 7*TY F%l U A w U e)*  |  F @DdlM %mO ajg R q  0  Xcv | k=GfzY9]$L8\>S "f>Q)Ve6d`~JKzYHk$h>5\t /Nia`)h ], -]X)?~`.4    8   GdjD3K<f'A k & g x D)B%m '?kX  G]zsc- qh#v'bKOKyEkW<l~[&L^ x2LJzXh7?s ;b"0NmsR",86G)'}=*9G6 %A[-[F5(P=8e\6 `p Rw l BTl,b c{{ K &IY` R qlw5 O * mC5VT$  q Z \ L  d    I & jh9e;na 5]1]4#_(iPxh;PsP,l 3e~9AX9NEct~,oo2(=TD4( l6[r!Kz7c1u}vmWmE9Qv_tqk.3yLb>#)4`$ a;O8s7I(; ,"s&k V6K|Z $ > k vQ2GDV  V s c; s ID]:l{Y WU"TjP nC K[ (kzS g -|m)lUwbBy^*+ efLEzvbFO! /HW4`F`<3K kK%/cTnih1liKpk+;&Gi(B@h.%3=rNQ:G*O& J !qg:)@aGPI4  ]a& ! 6 . Y > ,   <e "% | 8  * Z ! eK@  >O6N]d@I so N  DF L~p& L:0e)6 D $ix5q @  5(qwe?o|@szl.g"%Mw V`WG6 `3OF5;` y?5z:% E,e(VAdu8 4 74 cM ' r L) \ 32 ' M = { U> #& y YP @6q EA VD~O_ J1.l5gZ7NkRPB7q1X-3KFl3ML'{+E{ fRfh1S+!1k=> TC*Lg2A39iGr~d1j|}^b/w5c:%k(x&BgV;W(O(kc)6t[Q7  r2k!" ) -<a r a @ <  ' 6 q  T B Z  { { 4! x  L s*D K itc,9  ,IPkJ5q.[K7d8OaM"G a+F=irO a[ ,Gk gl8%wS;Y?8_:)6|Czq@k+I9q3>G|ctZX6uo`DdZh ?C0#}Q:RCCEb1fmi[\ * zm * D O E     K ((|  K !N# ` O X z T ^ > y C  ' a j  =z t %AqJAYV -  U'!  "+fNE/rfDDc6A6Et(CtYJh4lYqyJ0/Ee<>|=?Riikz~p_6%E c (aA2$;, y )11G t lb  j f--8_~   2  N o  0ZBh 6 |Rbar[$F'c&[ RoeWR]HdV8xJa#TlMf}}{Af%Cn4df*Hn$z^),S<|/;tj i/yc? !$U*55v`Zi5bXU2^dw7Ma*vJMiQb] SZ3C(' ~#l1! 71\ IY3!d" 0 G F( b  ZF!P\0HN8II}{7$4>{"9 mD@RmW*:F Qwc] q5)fHX1K4#6C 0qBVC)#p D-d <1_G?Hdr(BU4-{_{wS4iv[YFZ`N,,xa\BlNq EJ"*O(2):D ~:(v }rW6^SgBD&HKTpn3R QZW&{ZM[bpczlXY)IU^s)9kZ gU)g1~` ` -V" G q C  n~6e?  tHhPXpX  e  \4* M@!LkRtA85XhPL)yuwTQ LRzBz [ ]j]! +/ .4x^l$!.Ze~b7 #v|{N6 fa@,$U79 $/.kk6Y)) M @5]HcE#A#0nI  B#B -  ,- Lkd { s0x 2 * 7  3(hi{d`GPu<fM)M&^kc'#XM]cecYJ>G6+Y24VF!xHSj1')HZJd #yupZUN";Y`!'Eo 0.IAVqYCzQP(:)!@h&ZI%:hav5Qxrt $3=2D;1pJyy *%HJs\5C+ Lx`L\5.YJ6i! M%i_;WwZdvoKT|aXto!+-G9/e:|r/_ hX)NsFebh5k.72p-64iFsqRxPSk_bKq%Gk\1#[~/?+\F_ZITs]L^~x$'aS2LVD.i;&#4QX_AVA:-4;;+UNmGl)S2n;cm z8/|X~K2)yiC&n`kX[ZC74 & .(HN*$"26e0# ! 2{c]{XsCh bfrd6W ldpi3NpE" 9(a \R6xK'_S.c@G&bdJ_ :8T:>zK**\{0U-kD3rU23&2JEpwDEk/o`wzxr1c6NBI5zoNd'|x"2z+LENM^S5*(lZFd<XY0UryGVYdgG7fww+OFEFvq)5 C#xfn&cF rwjH KD<2AN7II< @4ez^S5-.sE{&G"e R{}|zr+7j^o =^MLhdi3CH24Fq0to|j{ZNN^qtU(*L zfixex/eaqcnqjA $zN=|id\HDg]bNE VW\=X`cW+xr~wB~l>~UD=+ >8d`#v`h 8@=jts7yX{Zr{nqTC)UX+8zs4TNvT8n$$N1jL<K`W- UAqT}  4R^T8:SmHMzx"s>Nkzibg>QV}mvg|) #!0)4*#OO7K R1HD %g(HkH83 %T-}^{j/cV8/!thzJ_LL|j}')j\xlMoMS0"%T,]*@8b8+&b0r1CE 9|p+BG"~x+X)%#.fTZ_"ch]j0B)H& NTMmbS-GK 5Hxp}/J"aqoXQ^wt=!%* -M~ln{Ec *%ZD' &H/gtSNb&ed  .eo\vNS:Q AH0r[,8&G) :@kTd~}jz6`\uUkw!^i@MD<|hj'0*uP`NdLyW;+o(w)$kj^Ne>Et L xX.5Youjw~ReOX{ "B),&QF! dIwM`.RI97Hm]NkLh}zok(*&&e})!l{(*:Je\lA9%sa  ej5<9-o0z3T|}|lJ?Ydhz(! 'dg&f>bE4J\ZpZ@OLGNRVsqr,B{8> 25|qh^cn% fe A6V]XN311/BBMVbHz^VTJx cC,e\#"iMsi**/La}; D]CT9?OxthbglNL.VjUKp|]wo #XFr`C@WUr[CzxU{+L.L>fwiZI7**~x&1&}tzl rxkje+h[qFHl JX"{t{ouJCgKFZ:\ ^ZTPVLRfHKfk^HVOO}-"pY9:I]R[onram 9< Km^*n~"!Gi+:".xLX^Q)&>)%*.C<<-9TMj`J5z=$qe_QP?GM3{ly8!=D^.?B!3;qx/sefXG6tQQgpZ!qjejzmy" 5.z+0g7 #  QHcwLM"L_;[s}:?QUz rC? EXFCI06R6;syOrszgdX0?E5;OF  cN >#QIx^SA |fQNRE2% 18QNwb>YSYK& {6>'/R=kf&"em  4*}w[]wzHGcJOO8Fm X\60xz}>= * wts Zl[Yo]WdL|al-SY "LJah[uPa5 :BFKOl+8,jtdb_U(HsLG0 QLw^l7.qdOTNyluzSWkk:OD1!~>APEDNyi>79?jX 1.wMEsm*TTx\Y-/%F@n}^PN@?<@6`WVPbY%'(6YX_dts!E<fL LK{& VV&"|&2P[ir |~!nzHB=?**%rs>A8CaeQ` fP ?]tsIC17Z]7326VdDa8? '1'0+qko*+yr>:+,1- +KHJ@5=#)3M<|qP\ NR mm  io ubmWdE}oQbvvDRclw|_?R-6BNzt\fTi[hmn<N4v*#NWup%=+IMRZ #3:7f[jw*-MXz`R__io^U o_tj }+*UK)OC~kWJzyc65=A+&7;YH*{5(zJ_"B3viA13M fX.m4FC[Rj%em>T^Rsq(7-vq~ ;DbVuVQvdNN&li:AscSQ)111*0;<?HZNl p]NN758=op@+}np|~$\Y0.74G@|a*, ! YH*#}s:?^j!& (CU_Snq*/ql_ZcTOSYca^'{udj=BESmybgxy1COTLGxRIid')VNHN>;lpUdbmyxkiku77~dfJ>PE3> dh_`mv11ak:H88\R)KBd^\Z5=mu-/D>`\]gHB/1aayu7>w|6G6?9=yt32TH6.A6eW|z';kxZe/3/3   LOvk}kC481|vfZooCC48?Fmz,MIKV<H y;KzG3oJT<LJ16=4MRdbm.]layB:l}T]ho ~,8mrNM4BRZZSpjA= YPD5,2AK7_TXH ~l/3DJUELLrw($NQvukc"G@4%XNxnuW^ dmYco}NPCA nf w{  ,=Zm  RLgpqwftOY MT)!7-_U4=msjkHZ1=[c[c >C[e4B-OI#QT:8 +:? %USf* qq55ag/-CDU^$&ut1^c/,:G~~::  u|52~aYrx$,  MDYa "]`nn]`%*"*Ud ',VR:6C9 FDhtMO3;$*-<+j~d{ P[  VQ1,tnk{}\a+/tuRZ\g 94 zypn('f](OYho&)4*[UXNd`vp ad\Z =8?700#"#]U9;>Mdf@:GH;9EF\]Z]^j+3 w3. Y^[kxz^f 'BEMS+\cfl26Q\EP(4]uozX]XbnwfipyTQ y\Xaae_ TO<4"aa.) $ XO()##yz:; ppkhTK ypyiyl-SH=/QKVfdc HM(PU""3+ ~~UVQX[bPW3<|"kl//-4`iKQkdfa^e;@sypyzy 4@ -,(&&!lcMK4-idQ\;H RW,3rztaX\S MA(!Z[HEiaVSzy;<g_ ac&#MR>FQ`/>kcr!QZ@@.0!twY[PWem{udnk|oy quaapr ,/jl&'PS340205hoOV_ibk19YXML/;VU{tg1,nrUL'#hfr}om hhyac';0) GG^Voiq)`Y\UFF:=zuEGOJ)%'PPdfkq:8YXHO16df_gNV*5mkLJKB _fZYz}9E)3JL  ::44".*Z]Y^,+TXjn !@;dpisPS_a22RZ+0gjWT_b"#y|zz~@XW|  ztIJ&# &$GE@=)!^O$vvijLOHKST/1-4XXcd+' :935();;CBmkTa(+OQ6;C?[Tdc|w1(OQ/8]d*- FKzyshUW,/#,)'FC73ttjk\\tsFB03IKUURU'0,}d^0*0,33zz`Y=<RPnm>@ DB|f]#!GI75  *+DCXZ6: aaEKy|=D{|@Gkpxdgzy4235 $(|~&'ck96t~>I@G%'STC? OUxzFIvsrmpwaf73 A=iu0*]V.2,.wx8>ac('^Zsq WN:4-!YN95gg('=<UW<A}vaaDGIKID31*,ysggw{  ZY_\+)jn:@CH9<7901ML89.2zywx#$ FIipU\/-Ze>>trko%*99VY5;1993RWx+0\^"Y`>CPQz{RU^WigD=*!LJKO// $&BE]V51=<RTlmrn;43052  ha'$ ( %']_*0xw'%|z2/hbjk4;w|45 % %#~%';8! pw# 54 htss{zCBHI"MOns^b=D5?@ND?*+WW"#dhVW,-#!W[DJ~zNO[XA6+%OOQTQP'%(+-2RP?:78uw]]sq}q]ehmKL35,+U\vu\Y$"89>A38+08AVbahrv||[_}}os hm <F+=?\^^cbixz@?KH00%'=D KI*&//|BB>>rspp>>ki`cKPot@ID<=1ulus10oj2-FD=9][[X4.==ffutfa^SW[>>xoxhb86#\W[X>AdhrxmrJLTRb^QO@>'' omwu@;dZZRttMO||ns@= '+,) biz~z~ipHN/8:>JL_eGHkp\ZQQPR/1(.HEbf83WT [Xyt'(w}YX0.JB53 v}8:[\99?@ 74E@F=i_pj~w{w{9;4:mr\b\bchajmuQO%'/8 !}gl~]\~LOrv82QM U^[ayyuwRUcdki~|~~,- [V_]stV]26]]~|b`}x//;<ro65 FFMNvw{z >3/' (! :7VS 5;-2NRedtndg<>ik5;t{EG53w@DedY\#'AC05]_?@XVPP~w'-3dc51# MH78yw| nqZZ]]cdaa||cd/-tv UQRMzy,0:8mrbe ehQXnm,+,+ # tk}xQQ_YGE*( 31,+ qt^c#71 6194 KK=<.)%! nmQU HOijFD(%-(%!2/JG[XroHB,&IH`c[`TZRUHE5378ywst`[to##|\`ELvwXXBAwxZ]v{@FEK~ms2:.2[\pna`,(0.  VS69ff [VFB54\^AASTZZ"pp86pjVS "58HK[]PU19'QU[\!CA!<;99 =<42% idyuOH.)82ju qp13MO{ou_^nnwxekfhruTU=@v} EH^a HDHGZZ  MNQP>>uwWX//xwihSTDGHEQTekdgihvv\^fkaaGH23:7OMFJ16,/,.,. $&44+%## /1=< $&HE*&,+ EE!:24*jj'+}{cdjjpqRR?@rqljcd.->?ssgg\Z4.*(+%MHaa37OSstZZ=@:?;>EE:?V[]e=?_]~B-nk1Ta3yg8]'+A_ 1 ]6_T{IjY_1%uP-|&1)Dw'K!- +R8 @y) ^lJS s.>b'zkb:96!o_#9TIO ;  )T -\8 `8ONZ Mu <A np" ' 1LR; A q>dF Ki%l| FqB@Ql@wX<.U!)Gl I [~$bz`)kVKfK Ud:u ZRY9 9#)R 9+d-B$A  s3? ~ s(p 7 ,'*29 f @u C{: {u'.x   T2G{UZY !^ a z O  3{5h5 ? 4'ymbr" q: 3 ;sqLZUVQ19Z@_ qzo%f Sg6 Seb "BaJm%/H^?  P!;m8 odE7'CM:cdJiPs,)@$-2?MA G _ 9E7 3 /A `\_x%kgOw$MwAi3& @ zJ8 `t>|50w(-$t<KYQQd*x"\(5K.h~f(UaWZ&% dB089p49B](?e d>h04! p''lSTsiV!}\!h l[V-1[=>;'2/x 6w) u3W 4 U^<5m=JRgw =K 5 p1,]1 ~X q |7  @a ? $ Tj8`oaW mv?_ ( %]e  L  d A>:JYkDzMW,cL}oGd  }}c ;@P3eD&@ jF^(hWNvILwIkN6tq,Vpm8k~f$Vh=^ \*Rp %R7( j ;2~Vzw v `MZgZ{9Z c hqo`4E%}]^-a{n;Fwa!U#LYD  3: o <}^y 1Ay}7* QItZd h [R u!9 a1@I1cxM2ed _z+sj [ \Q{R` 60? C  YLr [ _ g6$V {@ $$!>]VR&fF  b x.X:j ) C  0=2q<+  *g_   [kyb8 eqRf[*e=yoFPlj R 6; vx/]xf2dtk k .-T*.L~Dh` ` KV =b  op *UhMcL}w0i vLs .'Ctn% #|q0/TTw,,@%l.O9Q:np t \1 L"ujRs % h ~ ^@m#Am [ :!t3 $v70Pn0& p+HUI[$ ". K+S@X3.TF|^aXBdo! w&WcP\,H}JGud/x$+PZoT$I!g \yMF34RzYA4xh  zPG0H 5 ) 8 H #et5=. C| d3>5nU|ywr"?e_4!q'1+!#=5 QY0`e)#J H Q|~ZHA&Ko|x,)SL[?J O rk" UN1TKf__CI # c#uo J !)LP@17C4%Y *O (g1YZS>5fvZ&3 @Z] =}o:ON \ v @q2 } BU~fN Ex  <k)Oq ^ -^^ yk2_cLr,xMyl=u6dmx jrE }V"wGG>$pC-rX4g"VP<*t*&  GJ"9 6d=1 j(iVI  P:xt?IC(8v4 dd^6gS!gd W4Hv y\r9 Nohd~.) e Oa,J k$kFIU # 8 $ x eZsP{XA^Vq s   [H4  \uT|Ggf"s  D<Lc q lMQu_*C"?7 I Z9K*H" a . T##Qn6}VP0 0<&UXXL& +g .J2}iN HG93}W/ `x3 3 x w\X  R'${ny %(mL+#'ri~w$IO<6\t>jVkpMM9 6T6P#9SQtmrUCAfXvp57  %:"brb h*Fc!?V :h9~ q- +BqLL , 9['T' K  p8z`w3` M0Au^  mF_*\ n Vg[~VS=}_2r +JOJM T p EHw9N P C 4 6$F`{?6tm[no fvM:1E   -4{'@_kS ph.P(c88E %tmlF3<d< 9q8"fysb k%X1 __6WnF j    e*T tSXdu)sjOkPEb ] 5C(+7j1 6 !(z Zo,yFxx{3}iDk=L^ =D'WB  YQ],y;{l\ f b0SLb $~S&& B+,\vC ?]6D X]s?"$SK @ . Vi+q_S0  6gAHh/ ;%F+]6e \ ?q@ , CCx BS#9D2e tifu&%6N/9` /  c g gb?}QG9TJv Ig`9uy lrB/h>;2 o +>R( VMg+zTg;{]k  } )67C `&J(p$HlB2, q&4B[1 tAu0t o uvG{'rGse 0np c <1GU FX70{  ;N^OD1  &3R?l JtNN vk|i8NY&u lc $y/51cJnN@N9 Nzp6q llF5U-aii(=.LY @Hmi ; I( 7cB)yJKytWau'(n+}  W~/S&4$ :t|w`n7C { N-WW [ a p ^`5',120oc n^2erp\x9YZx AC@;ZAFb9]2`z 8<gSJ zb e U9 .aC=Zla)minY i* j [7O+x<ZxSHs(/}G GV@ 1V]n2@]} Y ?)\ w#`M*| 9&z6` 0 71]+)Q U 0 {:jSP{6MO ;~!b. XtVTHCp  uW$ /Y*S7*X"X 7#dIf CP vq3Zc$3 P O{;w a" ~I'mG,hpGS+V GM}q?_n} Noa*g P@ i  = ;lf}s<  m  ,Hz z6~}Q p df| tp  K{9Y2#W`l+x#OP0U$_2!Huk> =Z5|T B^l}u[k( ?QV/zfz 5SQAm''C7Yoxm}P]Q Vuv>.fLH WMuN;J$ #zO4xEYpyI*)*eA^  X AB2dIm oD 7ngu$?Xe g g;%'j?z  p%' 2]Po " bs:#4P!DI82,U8V9l0?V  ? J\ I 'CObTe,rY@}    & {dj4[2>9!IsTY|>2=+ k  \WNOnP|De 'E>\$YI'qyT\rR_'^X=!VDwH:=oEv-'i{4 US@Zk;%Sn p "?T{j# O $X$IdEWwJ"03,uN:< D 0 kA$NNfV} ;\"xS(w5.jT0 Bl ^el|/S?[ Z CX 5H n^^ PR ~ @w7Qv tp|wl d3 6:R 1[75]&  !S 1 n/V<:q3m3 6G `#[@f=Swb(5 |>two69MS'@B : ' u"wjtIZR,v~J"qg<>qb c R]u\T D:Q)4P4|SWR4X=c + bKh` 4;^|q  {:FU4 v L{L$FFq_SzEBY ^ 0ZcG9n _u?mCN0XvFahnC m > (e--}5@V?(_ b ?aRHqu ("$BxDR\EO,"yPg\w <}{L NrQRd#z`,zN 449ZQ Mb.y$cGazA J;Ovmv!7 2=k" s =5Sx{nx`.3c srkiI7O= f@*>??\X t;aj5t=zAVF|?0#r@\ b9SR  Wc&q1"6Tra* /tLk[:>[]0 +JrmHt{$OW(vz]&OiP+\%\;"!FA=^FC-JiV<rg i 1'#$Uta[ ^ &@ i)jT:_~ "Tx^zjeTe:_lwQ\ EXZ?V#`i r# 8gQA|Lf' Xsl H%ey9y>OKRl"2{ "7scQogB6$ (o!m%.A_\D[fv~H]2"~Y"WF62^0 mLR^eQVlE;9DjK\A-' {ISEfYqR!&'N)T; wL M~=4+zAT ( 'jL)o W"M!%M z} 0FP%6;H.&)DFSm|]^Y''N(H=@Mus7,b)~&W 03pW Y9]@4-Gd=]tFeTkI<% C?DWbs26e--j z 9"q6)7-Ss&&WvUiCcmLm8z(qGDf$O?8!;4uU:v,F''m +g\U}  ^gQHnVS G@e-(iFrHPH1gma,`d]r}ht:}lP2M *HqV6U_|M :y{ )en `69DhW=~@b@'$+7 'C;y8IAsiKP (*Kv.)3vib! hM29-= g"x 2 =%N~Bz/k m_clL5{mu5yjp[ ^l"b *}rakDF>p9;3*7{%%Z~N*X.(L 'Xb$\|Lf Bm&IKcK `|D5 S8T,LPF~~j;'$Q4ql" pJH%|q4q"I3"OEFbw ?   Tw` [n(qN;@7 2 oe.{]p 6.Q gpVi|:, WA?: ~oXp'mW>~'dx Pe yEO}DCdv::VVFWE-r#O.Gc2=F m)G=mZtRT3vhX "gk"Qn# *pV(]a KD `Ht3aY{MnrWExnk;Y3y|r xm-VOp6y | 9 "~3&Enctt]IUkD6=( b 9ul|hB2C{R LRjxAT1Ep4k)M.1[s5J:.LmMU~BPEEu8p Z6u$}#]*0 UGh|*;aZ  9&{0lY3 onYua'f{<R "dO({Ka L>Li6 7MlX|Ff'@d=7^)olZ&X_BjNsgFHl 3E C}g,U:O[ Ec7fSFi}f$Bp:`ZD8K y 0 1XL%\G2 L h'GXG14.Y`fq|[_x46px_-kR$Jwo ! !4FP;uhHt\V ("a!8l)9 nS]bqs 6>X&VI/NluOWd;FEq3'+(_ U>Rd-h: x! ?BX |.VC U IRqSad3]p-V.E SLmI6Sla5AE9,yk,{UE zvdoMCADIw}mIKs]S$x b^%Nh=&{v%$ %O$eYFhP> 1& .(`?T? t ZHY;<d-[~<3 obu88r\^ Kp$Y<h<C>b-8hW atJSFWRktCPGQpPNE|lLS;p9(FZ|x9#TuJxt)LA?r=KD!!}4-h[KE7=I@_k*JZ~ sV39{qoSDv lY8$C4RIASI4U^& h+vgWX+Ke\Uv8|[Pjc'm)[ JF&=W}F}Obg.gc Pla; RF#U4+OwV\^s/M|D. kqh?/:'Jl cSAF`s]V h l]; SlF[ $T.(EoPcP !TD /zrXR*@IUruj<h*vIi%V{ E&VP wYn-8h7>BaN+4eM)_{Ts|x}?W1joSe5#oZ!Bp^hw:8]"l=~C-#5uau2Qlm!%G1pE{Noyq: bzn "#UO*q(lMDS f%Ng#i@IiUJQK +O(#.!JOHA!1`X mD+*8D3 Ky_S/p9)caW7g4"O@rRFD[7HO7 9UO1kZA8o+M|v,}2^Jbq)k(V`#J@b9tko_M:-#l`wf7^A<i2D/L& ,R:PMa }q^&InWtwu8nf?!o 9bKRhAy@^>b-XA_[#oHQc}:l%[7&mFbC[xfORFV( {>_9Z X8r!r?V? b| t<<{AVCR~"md5& l"h"#O7 [].3'b33"{s>> U{wMuWV'xIc\|p{/+UKxx4Z|Oz` HI%e b \LF=5)U-/)1n |?ceTtq&h}_EIeN4+1S??k?OQnR-; T $dR41$3Th1@|Zy:V=qY@8q.*?v,_2L a55k'w-1qnkQ`Rx!@S@Bp`[v5sFk\3+u]}?\4 >D5[*'j5WL- Rk| 'GhLS7 DZupX C"gby(Fn { Vzk-lNp Y&Elp @ C6&M@#l=O:z\yMBNQ8>Vs7 2@ u<q(5?7xZ2>,4<xZFOgIeXA+$So+TNz(~)*RIn1N32\#s gah7thDo=Mauhy{%% O\O"J5z.x/T>;%Di+$D=$?n-*kXM@i>T3fv 3l1@Jt iSEEgN/Ma_+[7UlXvIel6:W  xwi3G=7 Ysga.Z7U YXdF3!zVNF;PWL|5=m\*:aq(}(:5EBQ- ;}8y y,[UZfLG|@1SC8?.) ztwfeL4]63WO,Y KH,RL7'S*x $xo<=%(sL[#WSgB%>O(?o/J x>zn>3'U:y5$ h Ry@oetsv_RX~B^)M#e7ZQg0S%7 r5_UZ[@(dLe-\rVCB<8[3V}-ZC MOwG|yk$XH#1H1S:}w lu [# UtCg+y*Gc1I)UFx J`0x60Yy 3!}pJ3bGJ*N..tmTE4e:Ze+MG;JCSg'xva4}F}(,?g] nR%yB!tP (2khU!41HsVvfK(D cD9|f`w{Z!)U,n_`$ZDe)Oy"H]gZ&YGR %Ny8V#Gn4.Ps[/$0nw4 I0'f]DBw\DU>`w@1 Y@n 6LaZ];0!D%aVUCNss<? 6IRraY)>?HX,G+x1HC1Nm$e-Ho@b|%K%4+]Sg$xXG<#@Do,j|kmZ!MdK;PqQ@fVIg.^q4+L{+}hw4)xiUIAl k}hy 1NBlW (L)/_BI~<"tn<* qV2K6S~RA(q?\t_ = g0Z-(q]yh{\P  MM21?pbGL=z&FMl<e5q@$OD!mJm[!Fkmwi^K!DlQ-[% oVoK?G'o*ZvxF\pew3s5;2(Gv.L nVl_D9$fO65i.L7U*a+IO01T*1Pu<Q)Yq4?9Y+"';/G2Ks5k;]bb1| ?\ [v= $60Xaz8V7 [x7.{t+KERzF>r bX.UL2\^X+9oM3VPr7 vFk+*[vSL?P;fAR2&AZ'e+NWC9fO_\";E0,y )i3tL(l +S#f~BeDV?z|mO<4~+N3Vpbd>>6-'rm kP:s@- _RqsM|s_> C6os_&UIwffs-^PrdW$-&x31p^^N !n^)re'xL?9~EE=$,y5-xQlZO5W9 9#rxBaZ+$eu?GU.u"hct4~,nR1,z;'d"w]p7 5wbXt[M3"H''o(?&n]|gykRJnZQc\s@ ku:iNUu8[vj$@mo`Bz-H?\1S5KM[1zii^P=7iqC6'#8*\p&SqmN4)NsPq`~4)Py4 CtC-{u[! 0vA72m4GavjSx7u60pR<Xjn@ ?7Q3KLza$jD:,:F@'zBT72N/1s;} yh}qxl82Hle_MtBx;/vd<221 |5j~~qQls`Ic1QcDdvx4_UTB?L]OUIKh$%9 H&2&7S;/F lreTJ~<J=)[mo"^ aL:YsXW"az52#pVI]M= dE^l[S.+pb_RUi c[Km]+)RLj5f \[9F?vgYuaXw=qJGc"cQ :s[!zc +!M@Wn2) w':yPj=llZ2(q$gs5~k$_  1qjS2dRso#C6 oXZs`wP>dRzGcC2z-L? ;/A$B;0 4}h Oi\opaUC%LyhwhUvvms44dq bXGtDd}E"+$ ]O:?\_:7{ybhQF\+EpWt>,|'Gzr3b#>gNjSs`*##f 1S&"i^`V:9Xbz'`U> qc X `,?W$-&-R/E9EKjm[>4}~ds7U D9N)'$*M=k 4Hm$-4XNa.!5Y kp .W7(WCGa47(aC++G2K .6w4F`F`SfIfXqB4@1 $Ba2TP7t[x%ul%vv&NPJm#/Ut W$%KG!!aU0,\ 0xR-r^oRG[v<H4Iep0?3}3}} AyB4H8rkvdh)-'.)q|%G>n]b|az(s#Ngx$3vY6SvPaL1$F:f%(~9]rRe)P<%]ru ;o`P hYB-Tr ^ ub7`A<WM21cZLwm7 wdsl Pq+*0 Oia|^&2(9G*vSD"+$A!;ub!DfyA-y{<Ga4 H+$7kX XqO 27jQl1^s=2cO 1(XG>m~h+"4A1X7UPI ,YsJhJGcytc}8xBU&i\-' e-}$;1.4X72%mtf2o}bZb[`)=4% t_RhY= Jh;]^)gY|B wdxSy7s_Lp0l/so}h+""P<o:iS>s5j:-8 )2( `w4)+RoOi?Kh~dPb|n]&"3}h]M;0o=2Xq`w?B&"|?3V#I)J=UG-kf ;TO`&wv 4YNaUzeA_j|o`/)Kj!F?zrL?{<q EIgcQ 5*9" pWSD4+>+G"?ClO+"Pf`w">YX~4+sprgifv+uaH|tNByi_QA_rel14/)>d_u ~B>4D9RB #,P3V;n6?7Cbjza'%!F W$.) 17UdRfW(H{(J >6_Ru,R'%mm-&}s C+TF70 }h'h\xk{(J>E^cQ XC{c1Q%Yl}zxF>ocv 2&pW: 9+WCb(s_o`> U[txD9 'w)*+"XNIC5-4WK72[#Xv Mo#\M1z$= p`"H<261Q^):[z PEdD^)D606.fWEfvG@!,$n]D9xwAIes_m8*?\V@ ZH7+Gqp."=eyvQlH8 gT*ONp4)NBICTt8>6i\Bam'%pb)*Gm83}Df? y'#Ba~mmtm2!DNBNDMB!;-#fVp`t fVwfG@g0= fV $v" $G>*"V@JhD9?_Iew r\0#!rZTifIe[H-I[JF Ui8(Y5-@^|f%K0 {]Osxi?+"{aW5PW$S4+wd C<2fWC:n]60`w |d& !$~k|~kPj$seTzkxuaF>A_@\2L YP>kX=4z=2<2-IG-&vfy{edT9Zx{<TD{r\|?Ga1}hB}b|IfTD'*"CLFG .)np`@9wt'#,R c/v/E6RJ$ONE'j`mr;?73}R"$ C(q)zc*/L RAq1&@1>Y\p4xy^$B <2;+]@^zSD'G qIeYsrIAUIL?3VXBa}hwfWKIf&E_RfVs_- KR(^P3V% {oc&"wf-1S(&hY_q=4RqeA<MBVIk[x-9r$+9X-&% ;~%X/N`#PH8hA1D9 h~Ng,G .1&hOg^sg|UIzk)MIe*O\zF>TF Ba"H% WLwfwfWK|Xq=2^P-'> ?sL?}hn]n]ubr>6|t5-MBn]% _RnMB% vd+$r7 [a.)*Orh?7Gr7U<2$$MBfV;% 1Q?m9-XC1&r\bO2(=WD[)xey ,y`\MlZK=jE9*"zA_F`q 5-wdE9tr&"BaZumN~[SWwm 7U[J*"BaBaA3YsP1z2"HfW1QA_Sq0AqPGo`0Qr~t Bakl>bRL'%'#odT )% *"ps50Ol{<1&l ! 1-IZHL?<24+!z}h=4tEH /N% 72j{GD60B p'x?7 NqSo0YPYN?75- }hn]hY{o`% )2(Kj?azIe+$kcg|kX k;] ]M* *O5-E; 27Q*O]O o\xo`60/Nq< C ;/`w1$bO+$Uky)JPjTDB wv~fV8Sq0QkX]M-{Bx)+t9'#v~h[=4WKb|% Ba W$5-wd 1i4+ovD9NBsBa4+cQdTh~iD9vdT<2NBI8J: $A3o#E6.L=#_uE 1E9v+$A3#+$F<[J2(vd=2Xq>6?7>4F` "#/NUIMB1Sz4+=4G@?\0QdT[J@^AJKh?7k`w *O3Vyij  x?\xgG>?j =`7^TF;/!Dc}xyp<2Cc-'7UoE;]Oi'GOijm&EMeA_#@ZH`ws" *"fWhydrogen-1.0.0-rc1/src/tests/data/functional/velocityautomation.h2song000066400000000000000000001714461366722712400261260ustar00rootroot00000000000000 1.0.0-'b8390da' 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true false 0 song 0 0 0 0 Main 1 0 Kick GMRockKit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 36 -1 0 127 0 1 Kick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Kick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.376812 1 0 Kick-Med.wav false forward 0 0 0 0 0 1 4 1 0.369565 0.731884 1 0 Kick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.731884 0.865942 1 0 Kick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.855072 1 1 0 1 Stick GMRockKit 0.99569 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 37 -1 0 127 0 1 SideStick-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.181159 1 0 SideStick-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.398551 1 0 SideStick-Med.wav false forward 0 0 0 0 0 1 4 1 0.402174 0.597826 1 0 SideStick-Hard.wav false forward 0 0 0 0 0 1 4 1 0.597826 0.782609 1 0 SideStick-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.768116 1 1 0 2 Snare GMRockKit 1.02155 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 38 -1 0 127 0 1 Snare-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 Snare-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.380435 1 0 Snare-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.572464 1 0 Snare-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.782609 1 0 Snare-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 3 Hand Clap GMRockKit 1.02155 false 0.7 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 39 -1 0 127 0 1 HandClap.wav false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rimshot GMRockKit 1 false 1 0.7 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 SnareRimshot-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.192029 1 0 SnareRimshot-Soft.wav false forward 0 0 0 0 0 1 4 1 0.188406 0.387681 1 0 SnareRimshot-Med.wav false forward 0 0 0 0 0 1 4 1 0.380435 0.597826 1 0 SnareRimshot-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.731884 1 0 SnareRimshot-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.728261 1 1 0 5 Floor Tom GMRockKit 1.04741 false 0.44 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 41 -1 0 127 0 1 TomFloor-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 TomFloor-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.391304 1 0 TomFloor-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.608696 1 0 TomFloor-Hard.wav false forward 0 0 0 0 0 1 4 1 0.608696 0.786232 1 0 TomFloor-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 6 Hat Closed GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 42 -1 0 127 0 1 HatClosed-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.173913 1 0 HatClosed-Soft.wav false forward 0 0 0 0 0 1 4 1 0.173913 0.376812 1 0 HatClosed-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 HatClosed-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 HatClosed-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 7 Tom 2 GMRockKit 1 false 0.76 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 43 -1 0 127 0 1 Tom2-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.177536 1 0 Tom2-Soft.wav false forward 0 0 0 0 0 1 4 1 0.177536 0.376812 1 0 Tom2-Med.wav false forward 0 0 0 0 0 1 4 1 0.373188 0.572464 1 0 Tom2-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.786232 1 0 Tom2-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 8 Hat Pedal GMRockKit 0.685345 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 44 -1 0 127 0 1 HatPedal-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.206522 1 0 HatPedal-Soft.wav false forward 0 0 0 0 0 1 4 1 0.210145 0.391304 1 0 HatPedal-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.59058 1 0 HatPedal-Hard.wav false forward 0 0 0 0 0 1 4 1 0.594203 0.793478 1 0 HatPedal-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 9 Tom 1 GMRockKit 1 false 1 0.8 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 45 -1 0 127 0 1 Tom1-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 Tom1-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.398551 1 0 Tom1-Med.wav false forward 0 0 0 0 0 1 4 1 0.394928 0.601449 1 0 Tom1-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.789855 1 0 Tom1-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.786232 1 1 0 10 Hat Open GMRockKit 0.698276 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 46 -1 0 127 0 1 HatOpen-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.202899 1 0 HatOpen-Soft.wav false forward 0 0 0 0 0 1 4 1 0.202899 0.394928 1 0 HatOpen-Med.wav false forward 0 0 0 0 0 1 4 1 0.398551 0.601449 1 0 HatOpen-Hard.wav false forward 0 0 0 0 0 1 4 1 0.605072 0.793478 1 0 HatOpen-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.797101 1 1 0 11 Cowbell GMRockKit 0.568965 false 1 0.32 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 56 -1 0 127 0 1 Cowbell-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.199275 1 0 Cowbell-Soft.wav false forward 0 0 0 0 0 1 4 1 0.184783 0.384058 1 0 Cowbell-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.57971 1 0 Cowbell-Hard.wav false forward 0 0 0 0 0 1 4 1 0.576087 0.778986 1 0 Cowbell-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 12 Ride GMRockKit 0.633621 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 51 -1 0 127 0 1 Ride-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Ride-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.373188 1 0 Ride-Med.wav false forward 0 0 0 0 0 1 4 1 0.376812 0.576087 1 0 Ride-Hard.wav false forward 0 0 0 0 0 1 4 1 0.572464 0.775362 1 0 Ride-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.782609 1 1 0 13 Crash GMRockKit 0.517241 false 1 0.74 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 Crash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Crash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.199275 0.380435 1 0 Crash-Med.wav false forward 0 0 0 0 0 1 4 1 0.384058 0.586957 1 0 Crash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.59058 0.782609 1 0 Crash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.789855 1 1 0 14 Ride 2 GMRockKit 1 false 0.5 1 0.6 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 24Ride-5.wav false forward 0 0 0 0 0 1 4 1 0.8 1 1 0 24Ride-4.wav false forward 0 0 0 0 0 1 4 1 0.6 0.8 1 0 24Ride-3.wav false forward 0 0 0 0 0 1 4 1 0.4 0.6 1 0 24Ride-2.wav false forward 0 0 0 0 0 1 4 1 0.2 0.4 1 0 24Ride-1.wav false forward 0 0 0 0 0 1 4 1 0 0.2 1 0 15 Splash GMRockKit 0.543103 false 0.98 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 57 -1 0 127 0 1 Splash-Softest.wav false forward 0 0 0 0 0 1 4 1 0 0.195652 1 0 Splash-Soft.wav false forward 0 0 0 0 0 1 4 1 0.195652 0.362319 1 0 Splash-Med.wav false forward 0 0 0 0 0 1 4 1 0.362319 0.565217 1 0 Splash-Hard.wav false forward 0 0 0 0 0 1 4 1 0.568841 0.753623 1 0 Splash-Hardest.wav false forward 0 0 0 0 0 1 4 1 0.75 1 1 0 16 Hat Semi-Open GMRockKit 0.69 false 1 0.48 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 82 -1 0 127 0 1 17 Bell GMRockKit 0.534828 false 0.56 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 81 -1 0 127 0 1 Pattern 1 not_categorized 192 0 0 0.8 0.5 0.5 0 1 C0 -1 2 false 0 0 0.8 0.5 0.5 0 1 C0 -1 6 false 24 0 0.8 0.5 0.5 0 1 C0 -1 2 false 24 0 0.8 0.5 0.5 0 1 C0 -1 6 false 48 0 0.8 0.5 0.5 0 1 C0 -1 2 false 48 0 0.8 0.5 0.5 0 1 C0 -1 6 false 72 0 0.8 0.5 0.5 0 1 C0 -1 2 false 72 0 0.8 0.5 0.5 0 1 C0 -1 6 false 96 0 0.8 0.5 0.5 0 1 C0 -1 2 false 96 0 0.8 0.5 0.5 0 1 C0 -1 6 false 120 0 0.8 0.5 0.5 0 1 C0 -1 2 false 120 0 0.8 0.5 0.5 0 1 C0 -1 6 false 144 0 0.8 0.5 0.5 0 1 C0 -1 2 false 144 0 0.8 0.5 0.5 0 1 C0 -1 6 false 168 0 0.8 0.5 0.5 0 1 C0 -1 2 false 168 0 0.8 0.5 0.5 0 1 C0 -1 6 false Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/src/tests/data/functional/velocityautomation.ref.flac000066400000000000000000013141131366722712400263750ustar00rootroot00000000000000fLaC"0 B [~,c9( reference libFLAC 1.3.2 20170101 ɘtLl~ @GJ>G(Q   - }EJ*:-4N4m.˲묲 *&,,U%}V=ѩj늩iȔN'NL_Z8^FХ_e UZaW}T+)=Pj8 ޑNA|VeQ3:JLQوa`ؘYPfV] VJ Gi˝|Z['JRsE5<ʇ ed u3w%gŸg)F"R.n9Tb01ϛ ShP"='?&B+3$%vu/RfYJ&䒢v{2W,qARW-&b 9jBTlkSYRSBuԞ1z䗣:0jnS+fm*N26CsT/J?Vۡ/.r 1ck)#.:D%z0PU\;俶b`@˻}Ƿ.Lj* <1]dm!ulezޟ$s2B'-ʎ %?(\},3ښH K9lHKzCj )ۂ puˏ폨&WLrA849Uv*.No| lA$R7 #Mbaz$~'w̛ȏ}()P:4^AHId֎0eFg zP&xQ9QH)BTr*I&b\AnLatϵ{J~@[Q _h~$4c U5v'mmAo̜TS}@ҪSȿi\\1O)s7Va"Q7衫BSR0B2PDRK 1U2g>ؔki2>!4E,cB2tHi C"!TDaGA it-sNJKsxRB @+w 0AD`W3)R`hM^!>>@@DJ= zz[H^;1x :Q-E6܆m2CvfM3i3 F"JW,Af3 *{^){uO-kqfcW"AAW#Q(|E-Yi֖UXu]$QTQ%II+%.,Ĕ::j?ܘZK2؄zHJ=MrUT]&*tIk"5ҍ|0y`(*o)MVhJ_cFJi:/ 3E 2=T 9qISm_:̩j #?P axF /EmFdˍ[:*, a,YMY,cQ-FlHqӶI)/%TI_gn48L5%Z)7t dBHON}]J]B.ϠַS~rSR#C@w>&ZEȧ,/CFC|Jvəʒ6eR2ʂr!mBwlk[mٽH;D97cSZB2Q}&*4qG[]HC-iry*%E, &[~1| a0 )D:)uKhyu! r-18- znLfj]<& 30 M]4,x`&(H5HFB?v8`! PtcX5$0] ܋HA_"=d^9C^f`Qp -cQH8y[%U# O8[w'\x3,ZލB|*r%bTODo!mRhį)dWo]2(+Ri?82D wPOftH"Pi}/1(uJl]+u]H B2֥vCyK$QB$pjC#C+ 6GFٹAL:=cSӿ*N^,\C,rC@^#QM$꜄R Trt}U|>V%|TD8iEV)09gn6%y"v,ݥRJt>I }kPa LJW/m7"V!ĴEͥM"F&tGP*Je~wb.GU^kCxVR x940DĞ(mR#$w<]d`L>Z},#F8h'e ~[p;rG6YJoUb=16+$Hl–eY -ѥUY?Uw(.2զTb -$t~}=w*qelTO.~{+3ƱNv1 O EcNG ‰t'\FڅcMgyo(,BB]O]GOIo3aE_+N#+]g ]dq PUznHjhγ=4w^4i4rwJl.\[ь ,Ю˧TEU "*;l UXبMmu_A9L¾P0AKfsҷsqq0FЧ[K*R!VJ_VR_w"-/Os_-mwlI["\v>vùJ9׮9 WrW eE09K]+-HBg[:7vb4n0E58] ; ǯ5;vE(T+W1^MI}'M:4tnӇ*HJB*$Y䙆=&0̛'I 4C*:„Msĝ CEaR͙Eee5Y M(Mr+ɇd&2_42vgef>5d$Ωs|VM.Y2u֒sJJCr7e2 nʹRzRCA'9.^kHSI/{ >sͶ晒t>;hyi26Rs '3^ZrJ\әRlk&N' s7=~fKI7ar_5ywe'R?̦TҒu$,s5&Dɖ2!H3iK=$)X[yOwJnOi*9^uuܷK@vݐȫroߓo!r2jV3L/26l.h$G*$Y+%vf;RFGY)_Q!ftd3?|d,0ģ2h[\De h,b'2F}.cEF9(N֦ h71 We"HD)xjm B2SDߧ%Dtً6fNKQod]?CjjH1IPץ DA0oZDE ^hA*DY ؂дAA;d"-NF]"2sġQae""qf#!h""n$EiDMADDME@J ÁhdJʑg"[mBX6" Є^"t r&V[YpD(*B*\DɠA4"+(+SD"La& lA6E䒮Q1 8I\cue,'B"$\ZUqEp$$DJS$[eJZ[b]]ԑV2<z^"&Ģ"$J P"\ +!W$Dؑ9܄!%ғ% d*<-)HJn) I$=E#dIGyJy >BIDAR\DYE r$ءR.J"jtQ*<$E6Fq*\QHB$QB -" 򊴴BkDY&Ȫ9^INBD1"RESI%H"ZtB$YI+RB%IHSeO$\(/"3"E ]RWO/O"/SEԢ"Zϧ)JD!j$K"JRe|"KDE9JDE"A%QNM,RIIJtTBҸ$ԈQHQTISD#^W*He-2rDO+$\UD RH*r](B_ KDIxI kWJ%BeJ%PJDTDY "ȔI-_H!i*{BLb_Dj+dHIrQ*~It|'BQZBj%*"%)*UTekVKXY=dUZ*J-eRVUETQe)Q蒉.I$.ZRK,2MZEY%9$JTE)k$LVVl %@JI0)J^&2I92d|)0)$&BaI$fІ4^8HrB_%2I$ tHd' 0RBRCaHZS.O3)C:H&J8JhI!%00yLІ&yq`̝ $Ő{(fd NIIIga a)! HI)+$2qYJS&o;-:ZM.]זy/e~ew>ST,i9SߴJR:[N]?/N٧Y42 yORm4z>Y{O'۔JD%TR)4eigZ}˲mNiJisipf=)<7y{;isx7it873L:p3rnO]%JMv;0)-;Ly,zo:_oӳۧK.~oyO~\s|{ ?'fyJozizd3\?//'җͽO:s/C/M)<=Veee-ޔyJS=ɼ=ds.~=;).̴^N<2?i?r )=5?=ٞoåRӛrK)aOJ{t/;"""jbj""j*b" D#wf%SOOo}H4H-e;"ŀ$.Jm`G$ E)~"Ut>rכ&EKװ^ɊU,2lD ?Լ U}L &Qp!blx50>:$@0T5A<b S2g襡v㓣`FHX|>ݐ-$Qq7,&BY h닻Ctb2wζh[@|Wq !=җ5%>4d,Xi_\`#+4KB`)\Gp; L(m|V6I Y,سkt:DhabxQ|Qc fnsY(U `>KQdHM q -KБ:@ӯȓSP-QyEttGNueo 7Ƕ {#woW<&3kWHϦRI.Fx1Ua41 ͦTi\NA/A~?|.kN'YAKL#21ui.=πQIQ[ZX齉QS#l,01MG|j(& b,u+Lv?nTJ]cX;O0uIAIl󼈷5NPt ba(ˆi0gUpQ0CEI /`7o܉B8Vod?#Q°sBpvIZm/bvf'bu?|nt4e|֟YS yrsKIܝgpOdܦdܥ:̨k|&ϒ⾳%ɟ6eťϟu9Jyyfy o&L=ʶݔ\kZ6Ɲʛ]_963z‘0eF." A&F@3l'A %>fV@xla:iͥ 5g9if^!.I߆S-ڎXd*-[Vq¨oNEd bd Sc#-'F)6Y~( !᧋b?j\ K/YE: ~UG.ƳsFKK;-bL,i"Ildj!F/c.-WYs3uPԽ,]6c߻v"r+8gbU](Ijj/wX%̼)< N‘mž[F'"ukjٯCPkbh2L-4MYrUIՑc)ceWkkhdKGE87kS^Dj3sX2;ׇglW 6FCW5ck+<%F9]P<T [6lS|"QËqT c2kA~+qքЄOo&1=fCj[@; :Bxq:~y >UC.PQ>0CHPg33MI:g@)M`5AJc+(Xq iAlQP!l؋NPrG .$H˨w/Xΐv} ~D|HIy.fH=^/0ŮtU S}cZ1+ .E إdA~O%˼*/U٩]iPmTU)nį19I;Gߙ*v8-$\lVkss~?ea-GRC/Qlab:bKB'՘}P9R֟μ=&miP? q+O ^J I Yy* +Z2**"C?edzę+yCRrSDmp8싾Yvoy$|K0*DZW5$Tj ~br}*5ȭBjb  9:GFBt`nWPqR/8T93 $q^T)F R)OLto Br J8)#iuT@dzҩHFY"a#|-IVχr1~ȷ>4EZz62Vx 1s0y)!]vhDASg59W )` a",$5[pXȵ]Pf2㊨WrLƟFD5rĔ 4A7ذE_>fR^\ϐKTItM]]0Rirc Oo/k" LB3I2`,g=t-y58[-< öbúxJZ35%U}CdV(%G]C(CdOИؓ$^ֻ&MהD!9at IRP\$u̳INkB}͂f/]'7Rxbh׃0ysAaC i-ĬPP6- AXVɂMA‘+0#I aIp\Qpc]X')Epp†ܘ,?DDlxI(/I` 6D}S1cB 5䴩!]7dA0oA0^s$Bs03LC$)SBZ[g`1 om5 DyIUfv?Dy&)Qhy$ا5r^81#>L s]6Q SNtG&S=ndFJ iުHд6;i-U;Jh'g g"S!ƧwQ~Ns-0r%f:+̰i;t)?nIh "_,hQ0=͓VeUM#]L!h3F@MT,C$AO_;A)^xT1Q$ܤŊAB)>FjYP"r䭩GiHP} (s&zZLCԺ|qϩh1͍3Qkd彜/szE5Bo!i~q(ꑇNy(Lqu,ehɫ+!LŲjH`mx&#!1t MAEnI z\JUKT5:0c1^b[H!#SEu\+JL;Ŕ j[u^[o]EP>%z;JTg贉ʹu\?ᱣ ȧy.kޞ/;C?֔Bt%[$NLQnfZm)2KVoBy9= $ܪ/ ڄ3ӷk)}v'֫֗hQThDioзjwp,VmCE x'ښHþ Ihp%˭*@"ƋOҫ^D Zo61~ϦvITMxD7$W&jcvm*Ff7؅DK,gK Bcu(K_ Lx*-[l]<3I]EcqtљI)0K?I>'( " QoZĤ*?{ B-W>:b)`_H $Î1b>qfA W%-[&G*$^c]w+zۅ)d_QE'DڲZ}c_-n/ &A SXGzbU>ALķ]؅PF8;d^-8}y/&!*^E*$kXܓɳ-tZKl-ʎE[M+S,I%vU CaNgλpV:'c=]eS]$D1zo\(kK?ĬP+wwPwDFb;2_!r֒SB TC^ Q^c+q E.!^Q]D0AG ? !i ;J6B2RysQOm0J1" sh-ERJ! -*!HB:S'$X@C"E!w8 _l,0bKDP2b6 F 8q͹$3#$h l$(]8=(pq]8b' bwqcdajuα pDt+ C9x60!c6ffAiRe6CMX[pJ ɘhGrT/#Q˛*&!"E&#urK~YYwӋQMwRfȉ>rL"R{245DɜZBA^tFxR6'[B3&FI֯5**F%o.LK|/ԮFo7^\fa#%?FJvlC[ܼL#^i~kUT#בor-XM"Hd̋"5_ /|?DS@o,*$J HlY3@,z)-HI>$c"I rOq @a 6[c{B!# 3:._D``!F3]JȖD$!(H!d!sS6H$(KJL"%*(L1ѷ9IDAC;Q ""fS!'(ZDo+Љw03sB^!{w[AH"&6KM"&h+6$9f?'BJd, I_7$tTHI)5Ag m!miO|BrI]w!nUDi!/doYJ+cTARͱR_",zEJq)W&"^.8n"K:$II"i$E#f-6h"A&s"Vg"z{ ($JO˒(DR$w/JIHnT+vۚ.EHB\!*3[KEsU,'%e NJ7$ԥ'sOIWjMĦ"V"o$,D$"Z;ܟ΂_tm.D)?hID+tFR^YTq".A9l!+څ^ZK[n9^DΩ~I)$k"K$\2M;&SiYP B`# $둧a2p#&ULT!29$(ZP$, 5 "E!& 9 ++%fIB 䔳*!4Q r'fg5RNJ CYb!{4dBgXD (X4O$PBĐJXHA)8!2J/#t) 9 Be7 SA~IN"EJmD(\L B"JB1$ H2G%! FR"ddAA4A;CB( @(K2!h$#)t'hD,OF4䑋SA 6P^zЂBA$"RDP+LDP Db((FHK)b%JYR6Dq4 zDEGJ(%"*bA q#" `")~DL#2#L1q* A bc O VH,% K# [_E](P", y(,2"H!"IQ-.gҋ!1A(FYDH^V DB/!A2E&$UiD"$0KZUYb$#(%R1UTMpE!x"dT*PLˆR),QYd$ "lJ1-kpR2R Ab8)!k% PDŐ BaPXi((-E$DX8ɊMkˋLTRSP!F'XL֓*#PY"U Dw%1C"tUJZ-iT24K*z!YRI $+HH$$RU""- DD"qA-E\'aY$j|{hqI JH*LUGP"X'hSTZLMI ( D"AI!Qh&VdhڵD$-(P"$%q"2K"-*,JA0vN^JŪLR5hC%E.B#HID UQY2B,T$Tʑ"BhY"dhhӾ/BE+jɘo oa,GjI$$"(T^JKB B/22mBIi5ZU'$K+,RN>ZԥAa`e)2!'(s"&I(%02ZEUpDoVI+z!Җrat>Eń5rVS/zHM5|08ud/hf䇄ƙXĤm%XuďWÉ;$-e*e̴/ 6-xN.e!$,Zd8DI Ce-:)C4DVGj̒I$y0iKHI`Y[$Jdc:ǚ}"$jJi<pgybDJVgbDºG|JL$iJo2Fs6&vghT۔snC?ɮ0C C1E A$G PCt^p`"$C\C]4ߝYZmkjRM\\ȔzcRQ)ZA(H3X{"9;}L5 PTSTOq^.Z}/eqgEm4Z_ѳ":5HB/mn?DeF/BJȐ[i ,;oe&^k tc޲9~TKEۥpJʣhp:(hE4]$8"}.*~YNdV !OUhSؤoJ_7=Qg\97Ynh2`bm4GB]O]64#q 1߷?U䧅goiom/,2d Xi@F_SgjFVzrRrr;O6<1F})«DU@d!ƆF e0]M $ilmIhnHY';ښ15Yt jf$*N2&+%Ж]pP$HkQCĻi҅Bխ*+Ru&d1\S#!+%&_0cF^krBpIpREtR)Fꍶz R˖H\lP+#Kq4{?'+MЫ109YNҤ hȇ[+a0tInvcff$JL'p]?7fxlU DvC.kʊ|މnU'$R 3/{I}PCm)Ȋv FjjOTۉ6Q[ v hFc*:U9N0P+B\ҏrӢL WE` llʤ[$'FæU;T2:1=} 10H`g,x%CC )J߇+a_~$őo\RA"-at 9VniQ:cD91 _FS}(g{ 1k&~wS78rű 2w`! eBZtW+f 簹нܒbvًfA~w&CepG!"3q v3n“A5Ƥ2xF=AN !"K l Ed q}<ɚF`DKzK-VSg\7enܶȕ IQ0^R䨖(]WQ:{$=,ڄ)C ٕX\}EQ]jlH Q^TsR ,UO0;yNϴilZ^^4E4ȔtREXv]ϼ2n[nr*Ap`7\Z~G\mHu3.ڋMnx p5!ER_ EPc32(`ZD?jDhQݬ!P^f/j3 xJN>1zyE 5V(@ !y/BPyKHs𳔤E)̨`F-;yq IԈ{pB@ ~i⇣ H2H&*Z(+ę@Q򜂣n yFod΅w@W۰\g"-4Tn*Fvw4+p`RnO #;!蘐/8妎)QuU&s_21,D/ XVdJs ҇q&(W5aIYuצ -qTJH▇倪j':ECym,4 ./ĞJ{4#A2C : > bh0HX$I0H|)j%5d1N("1N v%D_Ă2%D&++GnH¼SbJcKh,$Zәx^:{:C޶+$!*%S]őwHgQZE~.UNf̬2+RAd_V[a'.CB[ T{:-qm 0څ*#r 'Jk~xW\ DET*kF3ǒMwQߗ|D."*Xb'Ő$>Zma1ꅍ +^jN6ڋ`$t)  bczgGΑY,?t sE=\82Zd"T miѴ.Ol8MtLٛӗ.)aDQ nAHH18 0cv 󮦊GҴ |8 yPA t^KDU!ρ-REh*Э8倣'j%BaaF L)/JLS!?P / FiE*66h;I]".DHYlֆkbT!PU& Jy0HF`t I38M QN*Bm!BNFMi$$*f?MJ$TD$I-K(\{%o7"H$HB$A)wϜf?oR*Sl)j5*I7sGi$P$_*yٹV}RiLRFKlIEREmyY4$% 6 enRj$]HQTeOS<ͽESR҉N}=JGHQeZԗ-ErNEɧz$8B#5&Q ISLyW9QP"$$](?IvDHLR4=RJrJ]wkKIvb^xjXtM6TNלSBmr'P:u}z}(&'k|rY$<‘iձ[,=@x*V$P왹ӒZ.( &Ev`%<"XEAO4NӆMk˲mZsƖȰUlSĂU߮gꊰEd/)RCl/搃cSMz[RYaS UHt~ע ح>MkO;~"ʏ)>֦ {ݦ9S`zӅn)Lb' /8 Eᴏd)]mrL:IOC-a;R򖫶YDi ?>Ž2{Qmptͥs$EƣQ+!v4GޏEhu;ћ  B:L;4lyu DNT FT,Q# j`ǩD7'-IB0CX&/JYDLR2ONdh?ﲋO?g٤?r0HT  Ifc"5dh# qmCD{VL-nV`+u y #]/ i; *R&C"OOºm682, Mt喤cs14 9ĊӴ8= w;fc^K+a hE^cM0hA˅BY!g%RJEa0 W|n}usj -T!!f5A3E(vXB` x"A'`WF jV!^p vx/{fRA]Z,;cØma$|؂md+ܻpm(+qqp/!W6R⓷ɒ @ƶ  $0pO=,3?=# OjB5sebfRf'7np J[P%Y0/b!Nj&yB攥,_Kb"ZU^°/w@ fHtT}_\/(bH[A#t&G9enCzDTCt8RPH/61:X #4HOdVzM!J d\IpS¡b|Fx9Q.':f9T}y{rH{ ےU%Ra]aV$gJ+tٌM~FBɃ(nPmd1! Kh4Hww;Vɶ4,Sĭ2'-3O˙o% 4qo9OܜIBCwȧVl*IXgRG "QrC,u9zp^L“y!&sHC&Gд]h~/YI(.EV$"//N"d Liڼ O1(USa 1r:eZ{gO;a<+Օ 6y{(;gOU3A^ *W}0QeLHD'Dw%DXoDS Kc O̢x?J4d) ѣR>^ ꥤʫ,"Lp5=,imwNl+(dXڳ1BNB\rfQMXYPͳQv p\IYؼK4ccۄ+ 2I3ҧ"rKAk˱%q:ME EM#x6amoKQו&Ej2`KgFX3*0Vs|(jwHZ F% iZb;qiE.7NFai\)y ~7IBŨ*ؒ"Z+5T"hCDQ^aR p TwC^ 4l'[U 47 w8k<ťU 0AJi{E"֝݀ hG!q"IZt .[> SrfKX&V#zΥo483b_֫CvaHZE'd-r{ь9`[!]uVsbK3ANBJ. (Im1/#Zh Yxb-k(GG87ƌȋ&(.e# K9c8H q1@/ <w'D(e}q'/tr ~/lGe h,EmDqauZ QZof s[PvR p7?$XjdhStE+RTzH(MENWlbl,iY,'Ua2*~B8B\*f*6eZ%UY%iI'!MFHQ}sB4ԙYEtYD35?JY6;Y* l%m{yPjL aN/*Һς##"@-E%bfYh0/BI>eX/1ɘfN@ @Lv+_ k_:kNLb܅I}<2d5-X&Uhr-EK4ѕvvmйQPVQn+y2ȔBu< > *=.d$~ 0~8}ZQu6IkX_JfxBXF$p#6m6*z&]$n3MVT#J̛3~0E]b9$5 c/%lO6\jˬ o;p 5II)W0dۻɔw/%b{Cf!׺:'KJ-ʀ=ǵ2*|lN=W,"I XXR/L=e59tkeNjuA,Sˢͯ9BN!Φ|)#+sSqsY}jE526n*aVXKn_OE.lm\+ p%!J4Q!l9Wk)uC]gl3.98~4]? 㩐wXK%Uejva(Kj1+w"D62/%,B~.k2#Zш#Z;*A M|m8 9(%IC\'"r9EEbJI -eXV-FQ SVQ1I3*KNB۾H%Ϗh3wZDvELe3 SPq'TeaGQ6tBmq~mh(P7)U aY<%,\ fTOxSg`hCnfLuQ bZ"YzEO13: -ߧl(&>,k@L< ӴE:eĴ4r%Y7U;ZZZ#;؎WGf-Kern,f~jq_:0b*Գe2GΈUR׹3&L[9mOoIfXD9ipb+ DX"nhu_ϒŒ\wբ"EKA{QIu+^=QoQZdN6Z4Fbd7~E"ĊmHo/LDUPXX8'21HB*ڄ1'{O E옞!v__ԡ"f[;yiK!, '~Hy՚wNDk zjM*OAK"(d!8jȊGڥO{@8vBJtP#UO7F 5OuqB{,oֲsR.zI:+/-mw1=NtF39DY$":9S[k\犔\UFק(r}{ei5V8a P޵2RLWv'H7 P*-b;0 -7㦉( ɉ5>4A(P |鯏j c Ye4>qʝ`::"[ZxͰ$ Sr¬*"dPx.4H\VٟCDs&Thېط( 3ԞӤYcF ĪNEZ"AbFArYF$2(+#ʕ-0R=i ^J6VNhc03'讆WF&(^S,!KfLCaD*{+ba$~CuT~۸m#0D5tlf0ع܌B.#&Bb}7R؄([\wuwN)cVbbfJϳ]g)}6":P`P}ܷ\xGPP&*b(m V5<$cHYVA3*`BU@-aj#~3~tF!RuJ"lTKcĆ6yDYLc#S:ȷR@,tL|Rs(Y]',ۣ3@pipT9àDt(qhTVmϔׄC]]KR"|FHb ktKeHWYxMͨOic܆Ewf@' E-_7M.gyJMFił)CH/UL )5fEevGx}6L`Ƽ\إ05Vgk(?#-T%<]_tn?^&k 6T+?Ud]ɛaTj5) J] PRrb>-Dhei,R%6a#mSy^! Zg{sCf?ߕwiC*=D E,!GHS1Em5![,S'ҫ!V"]W7@A 54eMJEDX"*b@ضe}앪NJ*$]uʭ9 DIH1QqQ_Gh B Kp]AsE;?F,C(\V1 *F,D`ۊ4:8rX}'>H}WQ&S=6<O/~.=E%:,dj˶*?DS$E*Cj!FD uaN&k"7JN Չ6Ԣ&.vRՉ*DD ȉPZL 9 Æk(h5>XY:Hzt[4puN;}~#ejЅ'.Yf""f*b4O?6KvYZ6Tc_,k i[Pjf>j*q[؝]<%9CGmc*B4M, _I5"/޿Քg-FUx͒kkR Cẅ& ;YXFVngH"8Img'b/,ز  Sey^[N;p@xQ':Om[ݷϟzo%y+SJq\F~ u60d✬e@GnN=*VJ,<,CiᢊVuK)'N!lKA1ݣ$tFNBy:~ae%0a6I9 2a >[nh)MҞaq$+#0A8XSZB 8m6 Z6(0rC Ղ\!W6Ō$H[P%:<]FI;k>9KMjQN!pCaiPbN_&{W/L#bVcJ,(NQ.剆5C) ɘaL P@j^M7,p"+vA qIvJa2{dc%mM!K1$ bjC5SNH*q=#*Z1wfXbzKO0bD"DM2>&Mkв._"b!W3c&Z:UXR*ʜD71?[lA#xK%RLԍ 6lNmɞoPό3NTԙf%&dNvyRlZu$۫!1 ]h؛F"5\괛#j۶BVʫC.|]:v$ɚ2:jtLj7V)yΙ,曶z .4NO&2/[! :푌E_H y m/Od$*&gɚax+ehDiYzaj۴XGY-"t#HHm5k2,ecN4DүHbF7Km QhɒkW] 'M HiQwҥBEt;eٗd DBjE4E^&%!#/"M1"!#,!6(* B%8"r$[dD) 4SכGQ (! t"# B132Ѕ"i@+pXMM E_F&S>ƹ@!eb"pB$%K G"%&] š*" QL&$$ MKdQ E2"Y 1:_5$peDAI 0 Q$P"Y,Œ-h.o""A)ihΤ" YDT!P&?0I"Ϣ6Zit#d63*E$KlQjimw2$g1 99}t|m-CH%hLR*B,ꩱV+%M%лt=6OH"նغ쌕Cz9dE[kZLDnA7'Wӓd&7C d!BgNjEl"&DD %DKćE"!U!d`(xD\PMB&blfFиpHDHK:@MDB[i-.XAbb Eh䘃f&8CA X IRAEQRF SKI, @*AD"XQXYE%qQ$&LA0' <ؼ% 0΁a45HRa 0ET aT(FyV3B`o 1XIJ,#*xhR  "!R  G WLG4 Ш$D !4 ab`!D%)BDjH"B0 ѣ0[EYD$KP(D(A"!dgMVG!X DsDrȵK$EHqDqQ$0ؒy[(DB q L:D!=`,ɘLL0lOS̱+6)DD"Lڳ|)DVBEVoi-""V6kU!DI ~C(J3q{R4A"!B!"^*D.ԫt$D!I)$Mgm 8b 0ā (p F (!A X0bD81 @HI_X;( N D ^8=.~DZ ɚB 2g>BB؇A,uQxùjl oP*ꅄ'g!|6gpyN}1d{rkMӲ3![ ?UҚ3\8.CX-z r?w/Kcj* h" [(|rA!zTIZT)1)'h1Ť%EBf.f(v6"G m&;u/J7I^œ bRJ9Nm2UFO4XB)"dp.p_Z>c"UHRX, 3y\h*{hV;1i2뛈%Vh*,*T>9+baGJg,bpQW҄Xd~.lL+{aYsys]r5-X~'&;U}{̐UK(Dbt>Zx7 [TFt]X{\-<7&S˩vUvAnSzM׽˘3XeERƑ 5\d;*'T6*"dJǔ\/ˬ>y\G/Y2Tc@I6^%OID2Ig` R:NR{[ O IYtV "MP7J3"Ne (k ~ܫ{_ꥄcbGIv7Y+^*&)Зd}cţ,EmqenafmE`l총y.^OF_R7,m I>#K@ r}z3*h.I.|G_ޑ :noV8ə`]kXn+(x:4Bq4Hs2rjjLBݭŏ&; BGh!rrEc-ۍ̆q9'O-[ؒԸhA 5 !wOP1*(4jta,v@]I7Or$+(zI1Z+Vħ*t%D*=YcW,,aGrY!E,/^E˯ɦ0R P9T%W Bzy!jyg?+(TWD QmA-%6ɭx8>^B2yZɢ(؛|޸G5<S `΅8IĔE,ބ#In%1-6JA[|K2 &,EUb JP3tg4cq "$&Fce|4$(mHf!G[{AG/}/ M8ň(k,Ѯ}ѺJ~sUf,&|88aJ$݄]y9-J5$ y<~vJ'0-o-O]+wb/., CQ4v#AuEPZkBO+^IV'`=ZZ4f\u7,3fB!]ɁRZ# ,Tua`eTP,mQP"$Œ舱,!F?|TEQ<ؼ&p0QہASenE[ >n2-/F} vp |BĄS&T5bFw),FLj8hLN:NsO2du2Sߛ,½ffS&Oш&u*0? F*jT.Qeu/WT]ߞhOOW7Q'Zyg 1ǀv}J)284AXU#IތTI2R:`AA70,v4 BBf=؋ P4J-+i`3b_EeOGμ+[C6oE9SayyYgo ZL{IQ5,iYfiJbugO2V{ @(?ā *{RKXZ2;S:gVTMg^V5ήg+2򚞲[}쀤OE:ݰ O#GĥyHܯA0äkؘr 7\_#OK݀r^;ubhLы(i\N˨>#dPnzg"w /tK rW2%{3J9$*<3XI|=/}>yx #wtTVTd8琜JL1S<`rW%7ZJ}UPorΈ![YQ֬}Sm2}D7@mQWM^sY%З1N޹ 229>/[ i|(=|N8ubG:^=3--p֮ ]&!yן,ȍc=;IX1ZإP滎z,8crڐU\h)_+Rհ(}srw\XE(5L_ivTe%sCksd.LgԡyZYQcGf7IM sCQWwE50{DbWL W> "ZI+GN05hBD;}59#ejO*qw@A@Jn/-Odw@IqCBK2La)$BxQT %H&H:]!*w.fRfs7e-wO ;_U}[HNŐU!SKE_ZCl_!; ,m+ ߵ nRD"㽸~u3ܷAOm{2 d)":B]}/ѕfLLP/ܭ(A*m\eZet8+ (QJEk]5V P^obe|!M5PWf:5Rp/ 'U-QSWk͵qT]l5 gAoYl<)3v90g8)Xe/S`p0f֡CU:gWiKpY/iMVJL&V&;noϪHbjx-&IGie  L" Jq0q4Y*KNx1^d,g 8p8 ]_|&2(`Rg붓-5_ZT\\7J@@ggRI}Y:`9!DZ I o7Eq@t _¾GK.(@3"2`B؈fFFYKuʿ!)Qb:\!MJBi'&H +SWr5A4]/!y (ydiv̏VX8lq'sഐ kcO$q VCd-=ݑ6dҐd4az"$mdE)]dy!1ٶ T3h,DC3!!ȽlHJ&k>VDoY͛1HlmJup(   pHP @ 8@( @0( "AQx$i$@dٰ\9]w{qd8*>O,F= Hv$sx 秆k wnSJ׶3!"eiPEA %`B 'ֵh}3&7_JNz# (%`ۇt\J`/-ۃاz{Y;/=S|?DD>)qij'Xs_rD=[JSHP\UW59{q⸾2_*,%Sj-g`EHm&?kWdY;2v 4a)&=Q"Dˍ)]x{kvl) - cFfӱ-6Boa $sͯAb3dd QMrJ*4ٛ~g8:nU t;n`# F7 3SFz&!Ox.TQ_ \TE32|jtJn^^&^M8k~!簞XLa 5q!b1hVp[Eٺ~Fnho]JUMs8]s{׳p36lx2/\bxħdFC5 jkiJ^3^Za5XCČ9BL13]@b VM*whdji|ZoN^mțAOK:\Ee D`tmy{%[e\ 9ZX z懚)!9uJe޷V6 |'$_SL`|&C6rA$VRօՒoOtY^.+UFg!v~Ad0&^$MY\P!QYQ[pDȢ鞉dRDN_~..VN?(KBʋBCѶ#iK]7#K|6o}X[[,Iy)P*lh˛>!lHD*k&Dxb vL*ƭ.(&A쉓=Б3^Uc"؄?XW#8E>$z_1MGwíD6R[Uj/,Cz-s&yzGD'\>Y a>u%_W•id'(9 ;D3]z6Q_&}-2=x?K kb6_('e ԗR)#B%jc@뎫+; K&fÈR P J_mꆦ˒j eΖ0Of HK7`q[WZ?Xš -ymScK{8Z~qj A IP5^7q eRE7"$fM<Ni|sB#ȜxnƼt\)l{"9r\JQtsC9XJ][7xdh,ȕlF¬IM59"L_]e#*1+7z(R,X- 2dgp!^ KLI蓘^4İ~TFGh-z _B^[xTͨ!v}x& "[QH"&UwTãŽ^%髓^"\.\׍ ɒ+"i'cz_A& RhŬ&?m:oFJh&^٩5sY1d 1/Be*vLm Y_LmeegeaE bxm%QY|NNM_K}<|S~{& `25F͢mCߞ^ gZ  e"aKAK lE SI7߹K_5p,,4J9U[z*B9F5CoxpWD9I|+Q'F S䁂M WȳcዋMs3|:BKː=IWTv#ʙf`m<4JxQ3SK-ZtDu_%x1y oHgu, F0 ]ʸ\f:&O{\3Ӗ w;A81AU%363qR~Su!\5b^ԃ> &YUaҰ=Od[BR/]lVi)mĊI -(S|S)Nȥ%vA{ߧJp\5FyFtMYD8jJx?Exs15 53^㧙5~7<:6_5 "`^Fv+)DK{# d,)yU)OK0)&Ol-I/'"((Q~jI2P~i@|8u/P†z2o*tjUfD 'Py!`a&IS}P Q3kWI-, uAJ`:a=lMFU]<ϰxu.yvp 5^ǸA=bdQ@&kk3=o-͒0&m9! :Ӷ)TIC.UaLT>ȶlۄԍKEq}ŚB b%-zM6i! '_-XFNۤ(f:3]04IvE-4{Ca%ra%:}˔$TYmi Fm{QׯidE[W4!_N6Gɧ wȅ.JVY"VB$t6݄Jc>]#ISqܩə#;#Q$q*0l _aͳDq 0߀"N~UJ$E)h~?IY+#Pޒd8bu)uEu8I&J\ (* @E?%3~Fa4):4iVTx *T$7z7 UnQجxQuK \sBP%i\S@<^WK)dLZ.!D?a' *t:-@V'.̺bд%'71%w8#T1F_܉#lޣlQtnJmR${ U O1%Έ"@#!&L!7LHqT,!D jTnF!0UR5S!ZS(H622ۉ^;q a2dr(Ĭo o2AdnGWJL u)F@FE+v?K"vNE \F3#$nMG7ML1rY0A$A^mztQbfI![^d4-t$L^ AA Gia0͡ bv0BlF74MV_e_TDFdFCb6u -f-"ªyQ#ô QVQę#"! vT[XQ&RDw:K'박9FVx!VayqKM(J !"lAk) V" eƫsgZb_#x0W%~Y%Eԡ/~FV"$ŕd3yP*#'M@{+P*r"#v״B<t07 drK-VTYR#7+QQ^TXG׿:ʿYH{.#'Z xG|%Y{-H?+)pKQFU ğez}xŬ4G0m:%-3֏!oC|PdO ">29ͻ )iq"-IJ& DEBL+i - ML`E1ux-UV uvÀM$Tw'};!`i Fl mEY<%%&USdчB*nvU^Ǝ|F$8Iבz $Lbb=U+W|/gv4>ԉFhRy8#ȑql#̥KgMA"f[$C[!`[ qk,z?ԟlΨ;>,=*Q#fDhF Vp-HH&8P/V#V !:ˑakT*bC-@!R(SYNɂ'[7aj;L|hăA{+ n&ڕ=ID1,1[Fp+\VB"^MZ?VN@Tʒ/hLA>ކ4*^؀ZM[`^WU,gS[VHyY$'"FlׄKz9:f&T S>NNa-ѐ[f¨IA'չ+VDZؒbTFD7%q{Y'#c N.eY=Rm9kJv]DSUt'fGʭZx$f128+YU,>Fp`PTCwNGMmH:X ɘT:R 8\-nU%NUcT$Z,u+R1]L&Jw?twš5F;dD\fXo֦A8i`.K;xYimS8ol*]P9B h?(4xGDZ0C@$$/" c,zN!+(KeqgPp"hGp(c0ĂcB >{Ԫ.Hɑ/B?[(f`1N A;ˡLT\0 X<.~ftpAap,hS.豗8l!TFU`o 9wa Fp-2.;9i B 84$M\_) JŊ4J*} $ J ^hwTὧB6 lHMk ѱnD#] vۛtJ؇DZA4&63VJ`9VhJdHKP5mhlŐ^k!ً.E y[Q"HR07lYA-7ê臲BDSMAN!lyOJaB6G6J4IEDȩQ=NЄjſ$s;8N V MW륓)Tޯ_ <ݑ)ifmvzKHL*5,U. ^>g#PWW&ai[:HQ{|AE#+A)KY/)Ĝ-U~ͫHRIZV{՟$i%{TF6y5RyhM`$g". FX BS4(3 :ob|f1ĺWs Fhj[I8VBj#M8[(< I Y8 c Aq%9KFY($q:}]\)NXQ>XY`PKhTˆ`b%ڒ<-$T"iOC/&˒ZCnJ`z&)dVX!Uͪ+6Aηm٬ ^ {;~6bOլ:r+`{zBb; <(fQ 噧jIEũCy]&w?~VЅY6)ڿI}SMH ѩ쬤%H!o%Q2ҕJ4wTd!A~Q^"^~q^N;gd`VN*֊_;}VH>X)OvmmVw!ߗaEُnIH7;ޛnnkU9Ë 'Kxz$2&Y^h'aF1 >ŦP^O/R9<%CKnPѨ&tcs[Dr!b\#zz7N1zVOHE8"%xZ٨[=3́as e/lqDk =5{^y~Lxw"LC1AT1C ԦJq`*^ 2ܽ6dRIDH5ubJԒuf69s؆Éy)#Q 9YN,FMH+*|t2 ˚*}|F\ڽ׮Y\Τ#"6<"IS! #q1@FCpJV5r'>%+B X A nXc1[9j库s5vI78׆3EbC}̪NtgJLAAA92?%!"Q:U߹[(BW9Ϩd)u陙^GZjBJ&u7a1$  cڶrQ9NnM\de7ndt-_ܸЯM;qRШ!G˄Dw%AIb(5]!FFc_UԐR9*+>y$;Y hJ9!MQ#09!%6G^+uoj晰@!$ѣ>c˱3:@FEBs U"L^UXAZT'N&lBkĵ.Xr3Vے2  W@)L"M!Q!*9`bvs"0BqZ1R# h]LVXz£m: #L0"]y6dc7B%lMYM+v#8Z]䘷5dIHiZPeL܇1>?]ǽWFlZDН$%c̈THuT4nD f')U)HU]I͐9EI".ȨLMXJL6%)Tʏ|Mi5"v\(š!вlcJ+9ȡm", dlغ4K"G򛦍NnABQ"BR !J-')PAk%`B$)0DVC5ZtH{GnʓJm8„|[X)ET BaRK#; B@oH/**f!XAK3 <Ĩ=UhE_T@ nW)cDT YY47tSXRsi\zZS1 \:(&/$vG3r h_ٜ#eᤛ$InT{~ Lɭ$|#7Dh}4"HԀJ4?umљ-CQrpw@DM9L P9T'iܶir} sO8,PI{_{~%i>vx xXVp8[l5hOj!V]Z*Zo2ZJ":2Doo%ToԕPRa{~VH:jRE8G/Ɇִ:aaV4] iL/ oי{5}q߈:&L})aHȷ>x<,ބo'C3i ,oKҟXQ *E[^8*^YK_p#5Jדi$0,%j TJg4)nLBjRη5}@S}3|qtZVelQ9.?fe_Eш+Q[o@keL*o:>L#CG_>/,_YT!8JHVN ƿ0w>N?NA+~VYb\,ܽ[P Jፙ1C,hRc '2}fd"ǘL&z4=ڳ*NI !p~hg*jD7ƺ Q)k*Z]c ɘ ELQ@w3l(`?)k1!3\-)DC2^9ЎX%J'{038E Au5ZٺeU ?^ )-ץDסk36DgI&z i*Wr0Jᄈuę DCP^q=1IzO5p+1 {#?PCq]~ UmDo)=XkPg{"e %yQ,T^ߒ赌21x*N"0űmRYG+e|\qo G {sjJQM= =$ t IZ1]h׼\,ff0$7"%L#RD\HFH Șo<VWl\!،T5AK;n0wٝlx'(]cQj kĽ d!]E˺A\>,!=vA3IzͨMơ>S 7$O0nO bQ,F}IoȪj2qemJ;b>^vqD+Q#lR0ʪX$Up,tUghz"V QA~{_bQrn0v >%@KI`By3䴣E^:|;d^쾼PZXw=s+Qz Dԩc>}4k*ЉcЅ'גBq#hJ?RPjp3ZJT,nmhMYf-vƴzY)tErD\c(qq񶠭tLk>S98͉I=O˅)*PNƣ;TT n[yב.1uS T;Y6 8Vۗ;,&J-*ohݰ-\,:fxBjR֧@?[Ճ_ÄB8¹ wÄ KH>vwwlᤤC2Ͳ."' XY :ڑD[̨'ܒMeƄ~r:"0UOHPk]( ,7,Pwb`U-|Xb>ap͸+2@ӠMCbٝ~_SŔʉmeYV eԇXO{pkK>$F^lEJLf[ݑMzC*s7 L\:$ҮldD}ZcM4"-_/:Cի,Q%FՐ ʬ٤kNMUԫG G6e k[1r*)neLEkId .E3ia 9$g. {7GoN`(ŇNv0&H^G#iDC<.<\H18-P`[₤kB\R2Z\x /,9:YT\,5s2WJ$?Dg!OZ tƽg󰱒DK2ι$fiI*^kӨɷ|UPTye 11/}QNQYuuKFZwF9Wӭ3 0Մ.АT=r ! rNFIM}|Kc0obLD.4k *wrDߺhn{{:fپj$O ".Ұ28$ wKV[Q?cHKa%ztmeX $ xK(ɔዋ^L@~_!|žD d(ij^vFyP{*OPIf0(5δQ;d!?37K/4ϩUIJ}Yƪ xZr7cRxM=h(8.owD k^:,IMvvz]2*rBZz3ZuMqS2욳P!4KLL8]ӾMލ3,_-QDŽO!5]IQEe{,Ә> C~WY8GF~3 6[ nkKCDTU_dЖN?VRLSb濖 2FH9c֍*Fڿ+ws uJW.53SYz_jٟA>N)%Bѥ ]@!b*ACp.IJ TS gq NpE b!";52؞ ºW0 v%Ȝ7 kekid $]^(o@:@&2Pj`dyh![Ї丟h"'C<[8!7,gTHa\MJ7ݜF{fWf!8D9-Hq S5]Q۫ 5 mIjy-Єmy$BdF7 /wم;h?bS<]*C(!uQ+IG:/ABp =6'5ü4ҋw7䔷? PH!pW._E%^]Xf&SZQ\ҏ`Ȋ;ǒ,|qfGk1+2u$֤P*q;69bܬ2 j嫰!$PA2.f! )˾?<1|y$=@u^Z=#*͹ s{FKJ6z|)n+%OmA̟m+7Gƙv*dc8Bdpً>2%05>^P*Ҏo$905J)UOa`5a#4\4 fej(쫜"n2== Bnq"U&>/VH(ի>,Mfs!cO%kh%&p 8a )vR*B-*M]!IDf/ZJq7TNxeQ0 㷧>2٤fڇƙE׮82y㙐|DhWIƔ%SwYN>)ՉEݕ:݂F*iН8 72պEtI?xeN*ZVz)k!&S;yQ.}v8VUa䎸݈M6H# ntwK߷xZ.hR|L5b&+N^D(@dj#nBuwtX=/qjd̈1f2~W7sVY`yK|BO^Zl%m p;#hfnө!ݩ$]CJY:RaG{< RNtנgڴ)^U΍!rG׊zjbdU +&迢"|H')Ao0M?b>fJO JWW&Z=398QTcۊ `OT\(*RVfYO2nUo|.3)O Umub$$1]sA 76q$N;ĈEK4>2#z$w%S:YC9j@9ԢNDS2ݾG&*;q,Q&&K(YeemC\̩rupʩvq$, CcPi^oT:jDdQ#]m̯E|Dt)@r%YC(Fy)*..l %bW J+3qso4ʴ#K|ɍ_$"g 4/ֆ'[Z)w%zMINn&`!O[OYrhUPnR *j64mn1!N6Bx!B^#xvb̉=b6tƁ4RBxP|- +oC̣ԊUBA4$c[8=uˀg"BJr!͹&yOI SR;"  )TڡPGڰG4V,"ӱaniFK  +BcdnA[.MChhm6UGHTi9 4+VMn+ˆ'(:\靅F-2jup2AVGIHP䯺aQ䎬TN>{ֺ$_(PwT74}M$wJ6!O``.&WHu %áRmpn]2"j|7H| A=9g7&@8 wTBY91Ò[Wµa[Cdnorrڻ̓kW$e{ر\pkPèCQ:Ǜ*)սa~_C0P7l~K6]A)fꢪ00ϙF+$M+}w)M#倳?$`rs -{Ć|Z̝j#؜>TJ¼ ]( )B&5T{U' PRYl @ L.=<9ScY9U1֖Ϩppb݉&G l͛O-!l 9'F"A"#.Ν"Q%SFG8Ra^֗%d_*]9e`3lu!mpU p5z]Lv)7А 3o5z9C9cK((љJoq\@ 'k 7.5R5$6 M Hh{aEs^R4ɽ#g`ψM啣$[FF0ÑTI+77PMU@!DyUs?L[p_R,g B [dvZ\cNDDI!{qDA^_PHu vě4,\/Ǔp 4ȧɒoaO{ʖ9o$ӍE1xuhM"ȅ`м=1=9w// pC@ | >ψXKQ]-1O ݡyO1[A, @Q:1>b}|a$y$pNE k ʤӒST/S(!~l.bE 29_+}el}n2ȮصѳTS_Y-T?&%euJ X#a 0[D1,WU,~Q1LЅǶ 䓯RY9&kOM|W9A.n!>"ʷHI|{Иᆃt\4|(cOK['/[nr K&oyh7$ )%d(#+CV !`(q#pKz,""g|QѢyR5OGckrFkr׊q(+ C\"M).m>|YHG{*- JͲIIx߇[7'nʕIPhj--EM&ǝ%(v* PVub溝J#KL9h~ V-pJ+M,JEmBJQ)x4 :+|eKAf"P?^_,;"Jd`(pcRs \7-O"J:(Jvm]iX%-i~KwDhY&S)Uلe }C\',bM{X#~SčƄ9Vx𒘦4tcܸ 5H((A+uش uwL6mʒSz]HPN#} 5F~]hz/x$HcS,N*(b7m/@P&OV _N\[:RH/3*)lFo{.j5P!čMC.>‘@lYO`",J`UI|Q HPEm2D+PVo,SqBS$4M|n`q*' \[n~0 lgV|&넨QB*I)<绋zHwn)HvYčZၰ*,/pe/KmC+$BTP7XHme:.06#59`ϲ.U"D['-J@JMct'0N'7QielV T#WwDƳ{˨9)$vYJZɮړx'_&a7EUPsE~J\ ~ VSą:AJSJop d5e#!V @B" 'VBՋZ@iٲ`td ~r ?<|CPJqN^DT0 !OHJ|ĺdB`KCf)G(EF-G`Ȁ !ɘ PL@ kmm!!5|bΈeD$ID%+:-دW}\cs] "l!ۃ.nDR13L|SX $_$l(-H*yxrWH&XF(r wy$)bnoeZjx&Q;2IߩS Nn^(9j^N%cDN-uٌ"ʡu =lx "8t .`Z- 7jUԇ}* PXYX@[rB O_R?J}s34f}UiPa1WNCPX$'>~|KL| e@Kš _RE&*Σ %g$‰kZ.laA4]/3%͹*c-v3fFZmUU֢`5 EvBGB9$E#^DrAcSMuyHOy9%*mlqEY!nd{\E7m-h~]WABFjp) WAZ[]¶+;E_w]΂@9C 7{*M?U%0Co8+hsep;T8=m+@r# M\@.XqJ[\|@Yl t4 `i30M펠 Jߪ'`a`n3UΉ?mhqZ!)^-k[dyRmA0tE0ܧq^h]0ܶN&ıwsN,+s`3m#V5DVw5$5{K $p Хsk0Գ)|;CNd%|u΢ J ^#?}f7i;&FOQH▀'^eoCNqVZa`mb-GMU@RL"?O&?QMm!AWT= ^@ ik;¸-"hdbISp`ֈ pc#6EM4Щd#.X _st=W)f$݀,燒PF_jNA+zZHW&! Qp˕yϞE$#Ւ8!tH&]G9Mh_W\Fzm.. f}( '|Ro&jEddܑ˖Gށ% ER=]B Oj& Ǐ"{yQrX>3(8fIaW ݵq! Oxh?$Ae.6$5iVVVKJ>$;\s+Ӝ֒dЊШ0gm! (3AjHͦs*XlU!Pv9wjWa&.GJ*q[ЦD! T(2mtup\dUY+Lyi?/[$b]>H߳:h0ܿ@\=9SД6rS(5'm;DS8TE :v Bb.3Lܴ恸<=d9ʑW+$ Y1z56)_omǂp-y"4kl% Z.OF ~,-LG,roT绲.|J^@:nIeMLgkW8ZAIB)_"= ipB`Avv-Z A*=&j&f#_ R}+zuX޻b󰣔Ε(aiQCLmW䋅V||)\ m:8dxh' zA xTQ5 T7:"'S(d;A\[b_{c*U!Vא%qEODV3fzcci JLF]cOց>2&E|Qz 'b{uq˫a Z K$0~jvAM vhbr\N؈%p!Vk~UUO'"(tAu{uJ#[ k$"6&)ZPE&QڽRڢ> r&utw;!"Arͺ_ٯ!6h̫@}/CKj5Q] 6>TӼqW+C6.t6Re \}ƂRnM#f1頀lU`ës beI%2"5 b4>($H" 5cM3&\.}P0&!0)fop'uq? ]eȾV3`-@b:.ehfW@rcKz,jF=0p~(+Rk$VTRQqqۅr͓;ҏ_EdDȅ"֚ULGћוG JV #9Ԋ}xy)fE$)O1{JT$J" p|,A %qhRa^y9J>F[("n-P0+EVd*b~NV!nMyZ~/u޲gڞ^P\(Є0%(YPy8L.u>7u&/pcHLw-)/!kYUYY6&,C'o4SUai=y]]UeQ3U[EK+8VpRBZ9O^HYa 7-gV:iz%j6!RN#OG$hz8ל(: {׬K~<39GRYbSܔwL_NId7_$C[l+Fa.P@h X3HF:t=8G eXA %,Ug,*q\fYĔ.[6vmaAt^ b,v#o D!xB4{%ّ%C`@By4m8~ +aWZKS3W4b-;6ԍPU>CWm.t&bkahewR #a`jI`kؿSDN̞`[=ҟ X-_<$eF +LSؔӱR:bE0&ڋ/#E][-Ue(\ (',*D4lFmn4jbӨXp3plҔZ7PP1 Q޳ FX{(G_ !iQhT7ۖ{~LE5ٹrQaXXl.GG)5u)؂^gZ.9WWs0'Ў8ϖn%KY@U?a4 Z cp9)зEcbٖxٲH.aXO g3>,^ )>FVf(e=O,y` .~+9tیB ѿ,= Lbpְoa1i#0'l9 %%ƄƧeU.\VT>#b(e zB*pg~1+y,uT Ke~ 7d";j{epncim *~)I:3Xq`D}|qqLN3 xVHjXIFIЗT C2DwAaeDLՇeƔ(fE<@w!=zVe3=>\@tm(9ҵDԤ(@&1RJIMPK|6oe%ʹ: aXb̓7&E J7߼DR:JWe¢7:rc:`-8y5zvrL–PJ<)H *ۗΩ1!):T 4, 7cdy*M Z4;),Iqp^2JwNSA=D1ܒc}9荌[QC0gv?k2gx i{Ѐh%V]RaFFZdD:8U"EU*11h`Kh¬޹R~xIrF-QElj9.|[˚n{#-+^x z6s0'\O`LEqNxP-F*qSqˆÅ!.U~R }$[ѩʶ$uV{iZõ]95V\u$5 ttfMjD%{\ljše~TL?b7"U!~% ?&lӭ|AxT5Y'p n{P'T-oZZuަQT3Igj_e<g=I*$;Le٘ȺئJgjlD QTmPNLQdA,4 ,ԅV-ϟN[nrYpw =ȑ+ewUH|Y[7^ƶj$jWt0ì&h:YA DAN 8/8`@"[g;PӔ6@X3Yp$o؃bjρ C sM+qPv>"Hrł1&vt~p~ 8Z > 9v\ TL$T-x.!L@8^*Y?JchBxsKzE ĉ b0TC"F+aSF9#%:.(CxyQYLnBD.QβUSsQ|Ҏ0 QU7Yfb* m(x kE|cWXET{m)*|rM90˜Ù+$пKg͞EN}S9bs`ZMG;THn+y f⅓ E\zS?+]a%'f:–%x<8b4]n9A_C,hs!rVRK5r°yi`3ECZnJ9blPoOxwEz{#ӔOCU|a*.)DMbG%.8VEn U=Gb?'Å u(~؄%w/J-zلBHc!F*$\m7e>q4'"?w&w2.I|Crx!PAUm"Ӯ4pEymo;MU'+lI1mڜ1<5 |o?) q]6o2g4R!~LVRS>ÜgX G9|T!)qCE0!#15e $Pa ۬)%={kS<ϔ:!]ŤdC1{ #f Qb@©'(բOb AE2&Uzu 4tj"$Bc7(}eO͙-7B|5'NPٹVkȟlzTt;*KųS=ž)hK1 %n&;|!EFht[~Ԛ$(qz.aVn !7Q^~C{ӴΫ@V%>e*PKIJ=kТG<;y?!XKR ׅyF.;~[ﴙaTT! k9j60vHBHf';Y,$F  WiaE$! P?L͚)ԓ:h2e~x(<(Q6cafBv.*/5$ Q>}ؕ'cᎣ*(T)pK*Xֆ.Zf2.sM ?qvE+*uYg0*>,I듐B0LGB^6F+Ԁw{}?]O̬ka bhz&ﮖL{&Ek`5o& m>LDARi)@Qr4iB H(j[u < %%24Z!hl!LukamYYTݙ)(5YJ>WwaRqz[LG{"H\-YEUN1>J |(z\#TlڥhDA[eVq :ABOfyOv@ ̍ƞ0Hy].Je;>3XM()ɆΨ,3] B,/a dj9Se 2BQ`j]jqfg`Dт{]MV,H!sa;X./,S jit 58t^8RrGqݚ`D0d2 ˣO,/tfpS%%+THTK^,0>w(&YDB ۲P.O87 FTJy`Fѳ9S[!l HLZ͛S|Q\1rGMe{ڸ4W$AueD£GIIp.EN0)1/Ϻf f.|ؔm *p)n)nj!V[x|dϞ!9 ϴ<7G?/r "׽6Cfu.Pt(u:ª,aڛN).FK%ʂ =yZJ՗>Aro K&J+-vs=8LUh\jZy8^WߏVj ؃}1A`gw= `T"U/9GZGoBZ2 [s]qqBtp Y0_H0˸S+my*Dd Յ!j"PQl1TGLOz S0ejIpU|߹bB8``$ J,;vPy'(q5#$u6N[lEER2qdgIR)J HƺBj$[e<]z!X4JNjj \ Ө2}jiUU$+S'ٽobGDmM@<#7ؘ7O-mg̫\EٻTt-jFUT&)K!H~,C؏%W@V neW@inp+uLA+% f1]hbU!2'SZGzKťǒS$eir)M$KLDc;# IJ2%j%:~VHnZe44\aJ4iI#[j BQrD YbGFp CrU`ᤩ8ɳ &ul`$kfݚnuqro+fx5:"g D=omD 44'-[ 0Ab,;xVbP&ӺuokExОH$pPaZ}4J|+YeI[0fglX f8b^& 9S]t{OEud%evstFM$V V8QR1۱w2BƯG/JZ+l(8cPc 8ijmrh}x,ifl=PP0s(qeTڭK[tD#S2=f (1N t'Je6 KDu+DrqZ[Ҵש5xN `El^6|._ .>5#t$#4]-/8z;%s@R97?BQMxĭ$K`jw.ߧ\`[3'bݤ&iYN~ƝTkMW6!Qlv[OIx4x[jL=HٕL+)9\O6Yl8@9{e60 7ecn,/c]q5ŏ\3)owCnEPkЂ"owH}4#XGxoۖ/Y[ awD&{&ha D)E^rQMDS^J{$H8!p(OSԢ?K1i UH2kr@tɶaN@Q[-{ɖ(usb!# X$N܆k"diWLk4 @A8iM|Nc)ʟ,%gPM0APfqCIX~:yܧjAx1Fn!toCL@[Ch+(!O MR1R}.o'> FU)NF,F<9j? n9S,4tZ Uړ B V"!‰1z2p^ 㻗0CK={zBܰsNOBu2ֈzҒ\OZDHzQJ.Avw W%ON!湍J%{jQf܌<0]،jv{o~sKhpM`UDV^]^rJ#+Qof4 G&R~EKRgyMSG"6JKJRV$uY7Y(rW3[U!VddCJJlT ,4jU:}+H֛ hܩ2 YC|C[y)GڢY-SkȤ^S٤H>o7: :6/W*VⅧ') WSM$>|T-5bVHQLB/r!rx*FE/B<-H3 0 O/d!"<t+wF;$7_M ٔ[sdeTJ# }R ¤ekE ihڧQbpXT2)x!¢-Z:MIxHZB~Φ<@p0_3m_FQ2ٓ.WCsQ * RDI`Qт^.}$aJZ|Q⪰o/b{ -[\G1u?[ށZ2DCBZC,"Te"ֺ3-$ #e$mJvh5))!H&fx &ICB2fF-SPH˂E+&iKdmġx卯t@[e' %Z osEj)8U"aW:Jd';$"HB%u1 L!tsb(̔𳳢{y8bS[sWӁbtQg^=*{8dY_d'󦆊f< 8XҖɥw? > zh%gY}"P"/*6?}1e.=;0C_LDBbD.ۊ5=PN% mNb`r̕^d?Xv ^z BK?@P ͢tuDRH]jR7|30@C\Tb({b6fa'=WQ!hkXMKiTRJu\& 6i~ϢbzaZ3WpE=CO}w@/tY1 U]0a%RUi8q>% Å" UJKwI1#1$(#?DnyD M"jGU~ e>9`萂Auv8IBe`x |61G *\&ٷt eam1_''da1Q2 *%lC8M_EsiZ`*Pԭ:j)".RIlfL|;kY0R/>>BI7zOGke%?y|T~",٦"- >p%#a?|xxH\LhFH͂#f5vz¾1^c~;p?>X]|rȅakfs/ݼ]j ZbnoFSe=PK|\3#n%Z\'o+R !L82 dH|qJx&Vd}#64-iHnH5?r{ )Dru[?鑙7'ĀFyu0~ʬ*ufEzN?9[SxS> ;3 !8eӡƐU~/0%WxcT\xbөʽc?AUQ0TZ; h둕QQ3!uk8g~6DF3Pp7؅A܄Sj~8vLU;`UZw¤SQ3:_un#m^l̺kKs /:M?PWtID`H(I%!+98Cu^gGHTü S|+Rt DLT0ҹD`cxjf8}2=B$&}ɳq,;Tg8E`a #es0SYs'RUR/̪!B ޺ ϼ BOT1VWʡF>9]9MQbZ 'ɴN6e-!!h/Gس}Fݟ Ub(Yx9i\GuYjֽJj5O3b9=g)U6šϼ\r~] W79:-t}Sf'K>Hd/lQTr`&[;ٵ\V_Pƃ5 ݷ3Gq ~O(g6#]&t$7>9GG8fV V,QBL33 "y^mJԟdd!'>nѕUIZxTF$ȧӑъQe!k1*|.m5ӤCv'TljaFkc.E-.h:Hy8LUªqXTM2a⨐$c}^z72Itmpԭl[sF7:Ji``{H3[+W9\e&w,,DKێ3 9H3_c:fL{k-cѝ,~ZHmRKm3:)~L+=™WrVEѸj#r/n/YocWQRy>R?sdw fZ;N7{`. 2pD$s1iLC//Ƥ;Dwƣ8*o&W>E'ޓkfƳڃJ$O!]pf^KUޢJhx}t$Sd'Y n/B Ez6r2W]aF]!bOX6 ~tF۾b/Q2Q=cWb8״2ӸqEex]g3'( *>-bQp?^UF&GAIGS1`ыo#.|,TJmK[=МV ϪK (sK ز{gHN\U65=MAoI^XYLG̽sdTCzn[OfvG_j.F&WoMœXdЦS_lK" \4EЯ^2b? ‰M"F=x*\Ԡ@Ш9 DhԈ4c̽US`UA="S~Ƌ,Džzp7ƒlQ& Gk˄-ʘ}:(j9a>4$N  URT>ˣKm ب@Q9qQnCEH(_ o$k+XN]&߉H!7kG##'&Gn4<KuA|xZRPd#3pƁBUp`j[ +>d=U| (IJA1W'H2{=%a`N~U|*E]oO^fP}P&߅@i? ;{~) !M~EÏ (&HeVRO3l*cbTMۜ>.? '˝ ($v@g缺oϏ=M{ZX 2$^Mت#Q3ӱ+s)QíLUI.t8DMrcᓑك:cN+(ji?rG ܪh-lSˇwܴjl 6`-,;z?Sy]>uoLx䊱(_ ,x`;K ^,>^Я%rpOq%ٔqɕ~R! -/GijLx`<"V0 l|Th;Yu5-: ()6Oy*i`_UQ\6oо,(SR4T)r̀F\ Jt=`+MFxO eJË%w&%4[V{^%0&: X ~ 5jOyt RJD}ԅy;`ÃwrATXQe{HsδgSPH{oD!a3@˟E_VXoap:ijLXDm <=W{ P5U!Few?IjeXI›pĥ2'xomݤz1p<ܪp[Tv F~NG&t97<v1"XSTeD&Nhҗ0I-(O# #7i@טt.DEL2Z] }y'.&f+)N#duw2P8 j=F\!h)LwnE ߌmiZ` W7HT^Q?BUc٬`⌴6zkI ~g,e40Z4ޚ0&4"!rSbYFj,Vp"AMfy1XԋHj#0z&B+I%LN~{`5ǮU׀SȠzFpE*GRIVР!θD=+:pCi=Qn}\Qxp:5{a>G2銘KbMqݓaaI$п}QYNЂB(ɩGG6ېl#*(:ݎTg`&]$zfY,'( _}Jg|Q @@~8RdMy付 3/Ib7,h>h'Hڣ忄Pm$"x?%ZĽG_`Ye|3:a'E DʷcYT m, C^V : ^>dži+~[B9 sCPm$0-@BE,mca;$d NoЁ6y0;G$숛5&/+iI TzyepFYveB]~Ku*Y|f?J@~* CL(#TW.%&;̫w(b6h<}?wPiB>?}H>e|$3NƩxȒGIf|9BMҎM/R|+മr%*w `cU{n/$Niʱ/=))X:G,Auʳ芷*aՍ,Z[Ed0F2PKMSAH24$!# Jl\E)]GOȏ#sb o!MW19x7&'70ne/e œHa$V@EY*,zk"}it\޵J{ra'ִ lOpl(bFe)*HziE4@|ɥ!MD2nEd!?νG>8_Z͢Sme!uu}`Pn\d ul}Z2uڎ2+}޽1v(.i`&[zLY n(_0uzJj%UPe(V,=dqi,nr^0m{'5)f 7$ץDR*%]^a!Hr6Y`؜J]+OML }q#$emA 9nw<I4/Y;n^Mur?LimSJ9oi גyضf Rhäm1J6N9<> ߎBMI2>qR'L< hQoȦ)axN5{FHFмV:.| lQw{Jgx|7`U{;B1[rQa5KLuRi y&ST{AuaTsCS}j)<@ŕ=,&X|3BPkb eۮjHnrCNBSt9fc|EY2n5Rn~*gw֘c]a.wkXOdZ^0$aMme6΄5H~Z |K"[F>AțB r#,ćBZ?ʟ~ Dٶe8rv$v ׏RpBo:-fr'ZtHwf1:}ܺR|g帾EZsNZä\eZ"9YӍL% }.Ʀ'/)=R: ʫ9ۯΉ]M-;V"rr{,]b?3$gRMmgeB"K7P5醈lw렧g+L"^}%ù*yRdȟDϏ6BW|AFyy&W[kt,4UZ;OƦ=L|U.]$,F,ph!T52cڄcG36r~|p*RJnykV]RbRTFɩi|jt{V+CLژ*Z=;va8+ЦP c8r,㭙~l9s7fz+hT^Y%AZKQIBi ȊDÕpQ;!(ȼ:k%wl>Vս'.5l GoK F(<]' Qt*~23iSeB`bLfzzhdRWR[&˩ݴz W9g~̱ȓu"tXRނqY𡷘UHisCۗJժ,M:(H]8',1+ts5TX{+-Ul5y,|u{J@l f |C`3i &.._bsi-L^$;/+23S݅D 0e<>"9-{3{@Ba$2aoNO{TFJޅጢoc ɘYJ?O7=})|i3wc R|mu*PֱBVĚ#:B&d? Y AiSwśByIA %~\鎐٘ɰ~$a&0ိ#5.L,)8r 6P:-"NYqAzh\ U9ˌhH6YO}$Z0)-(%[rJgXXW-?״ F?7n3ϐ#b)TmVbTH `0/ KHPb3L#THIu3NqrBCEQsvW?$.\U†{2oO^Cfg||pɑEzaQk=uT"u!SӠ☂Lad"kN|5Ϙ 3Bkl]h(4D6d@c+_Լ z$WMk4d|3bNM_zbOuJ2Nɹʹ~_g+Q$)!&<2S AZ=@mQd%1kGBii䚢I5" =F,g"kOB"If ¦:jm>}LU&b!|jX,qqGS;+duk)LAk'4Q0Dm|眈U8z*KE5cYc4/:.sěmO&kb٦75=MqT"L8K%ONȬ'1+DծLDIC*+qk- Y' qO6Hٗ)>GE95jghKmNSWGgJoq"RI`3BRRGՓrF4`{DA4R8,!CO҂RZ"( a(0[Ѹ'nq.1ĈveU婏&y-^,Ŗ`i!{~ۤH|,~:Շp8E+,Rr!,ADǬ JryhõPrm3>z%-4^h|a"TW~+(rˆYHbk tnj A {J?Z2ge%8@G M&yo_HU Ɠ+Y+$RDwP@"8F,V/m3&gZbeҹV!oBd^|&S@ Vbd\^He9%eraq ʸ_Sۊ$E DMNȁi&bIB%lj>s!k6W\ؔ1B " A9ңz4U2QS~6ؙBWLW4҈166r^́-vO"Za3K* =I~UbE{mއ|(  aFmb0E-QT򈙂4"QLJ${l;=%!_1(}$^k,s;2 m\9GkB\z!'BTrJ$\o(z]5e70{HEW4NrU U±e3$XLSBG*|Mʽt|[f7+SN_WW.sۮ_|1&qŧS矕(* =OĜ 9orC究 IlVy1 tTg%KS#c2z5̰$2r]W"Dꁟ$>6-8RO:lPZOI1bcHJX,gHޠܧPUB޼mUtZ=SGsVX Ȼ>,S4@-8Б4NHVЋQg20Qqu;?d*aj苆mBy5DMB h 'D>JGM`NL'dj2/ 4̅u<`vyqKDx<(7D22RaDAYlAzd+fȠC͍]RP2Pq1 "yHmRh? P_Ӛze8NFMwOҘ'540 %%ʗQ9/P8![5bqWQ{BOu I1&ᱦ}=UFxZH /hOiԠu&nR*Gb׬֪gHdB:VtO8%mI&kՓT)p RD_B%dl׊SQŽ<Ԁn}e htUEp6R3zA:ɲ2=L$wQ4Lj76ش!dV[Pa$ 0&"cxTB*9^S/"L].ԛ&\R%I "&4YVL>[A4,,?I' k#+ڰ)+҂Ddu{i1 b%DDBPjQ9-$ ӌxs9rHu?ۯ ؗvLt (9Q),e#\;vs۴dM5DqN3/*lY[nCÓ$*{+d)an/L{^?eLuuB^)GbFCƭ8nwW vTZP C_.gʹҽ K~7[CYZV;҆TtV*ECi{ÅT[bYJ@GueM5ZhfSE+LS9)=xH>UM{Ǫgʚ-U_HC tm73[66$26D˙~8qs82 WE1{mbMC*hd_]E#'D#..1,UG#1)D訥jID$l{kY)]_.ct}ǛtFQq OA3`RZ0Zl~4©OWo2E~| 0@0iBW+\+#wFkdUTlFN%m09 kV,##,:݂oZL2BOm6~nh(M,y Ax]$>uA " K<$\,U:RRz" B'KDT,hP*K\A?J ;Tؙ[^SGX+K!grI`e[mwPfIB70n+&!LԛJHn7sʊN(: b܍ƫA5Mʍ5$b1 WApSmŠ]\Ⱥb a?"EŞZUQl#H luCAVA#.Gea cVUhFc7ART]/LooGY;-'˅K$,N+2gI A-.!*}UV8C1dibe-=#&rr_h?0.ӡ$, Q.yCx!A >d $g`J>˺LC_VZiwHKYaHh+XW$ B}TuAZ} !X?rhLv0*S]ofIv]td=eQy'A7k3UJn FZ$Q4|۩E)0+G]t?MDN~qAHȣ m%>P$ La1Nd%3b}}ʦ.>L g^+鄕U)[}^MmzqK`e&*di(Sc1+RڄNP HE. %aIK0-*Y,\qdXM.E|= W:?|"1.z\o YYK ``Kq{$Aݪ}Trb*VN %SYR$SkWd["S0ua5a6HR!W! 1_L' UIF $dh:ggSs(g\ DC6TaJppL"󽸍$oqz%o\ɘL`0kkR]BIfm[D n衇K銹L ¨X&("˵[9+My1v,kϟ_ у myƸQv{ R7[e4(O1Įz{j,YĦ2C]a~鶪4֬lMNY9ʎ#:R$ѿ ) 8ŷۤY+kbȒ)a,R0#=}(E̗# EsPM#+ Ilos b-FZeE KS!TBj'5 eK&,߃ҵj+9Joa`+IyG]pF馊-vxșg5E,1⢤oDbP,ÉJ]ˣ_W5$Vq@cŏ=p>^{M9([k@`tb9A8 #I:¢hT%A0b#h `8,CofQ)O.$8E'yPUk@ؑ3n1mJ2w;Vk!)~idNM讥jّL,#k'*k^֘/b=ft_ʒt3xOz8_WJHK:@\[W<ĂBfuRZP=hJ &4/SD퐘Z(Uv:L g4L\\@FGȅTp<~ zi|:y$J8J ^1 њFmFaVb^D_?2'k= 1J"ּ6 ⭭W!܌-AA(jaH3 d3LN|rw5S͚sG($6sn!~IMT5<0b<`:LYHvD\Q!ls7U+7v{?hpʉp1Uѝ&P?It_t(3)D%ȡO^$R5ó),)CѰO,I|c 1Րɶ`h bNT f R= iH~V -daʌcu+:=X=пYn6j7Hac!îEٻwy+ܓ'Bm h\fՌ+J^J{>-Q:>|Uv$^ Il_BtoCc~u/_iW{Y#za`7 XֽTSDdwA'; PX`2)2 $B9MmO@."?˓ /`LIa3/PKmbzPG hh]ז)2]Zh>xOYCQӝcb38PI^CTDJMEI,@EtGc[|iU9l]1ZeTksd^&%rm^yc-cNe,qQ2kEXLӴq57G]\GBM-nK}-li( K"AZ@a ?2hfWwD5>L̮j$N&gkU2>֑r AyB%4#, ^DQ vw6Fx,S t瑏`'4 ㍲&"/db(Rk_Z=e!JU\:bxJ2px.5֭NI#mSd]+bzSeIWQy_h6 TH$i;_G霧,H #.3T|-$M>xķ9׶J+<=gJv 0mN Ɠy)XLKq'n5Ya{i/kVcM I*4%p3yKO EQ a ?6xf/pT3ۅۑX;$ ښ#5\A%`!^@$J ,TWֆ 6Gj%LLF1V"Z؍R{Q5A$e0YVTsŭh&Z,?H#?\mS^3Q tF^JKIۏ'DDXUz.Ej$.ve0mTD目 gz~BX:ȷbZŢ.hzC*Q]KZ3F-etx0 z](:w*Â̵+#,6XU)7XOc!~6Wx7ϙ d8e !\>CӅ-RKAOgJ>+gJw3揕VB--fDx8fNV đ@0VrqWeIYt6%]cx DHJ0 xGo麘Ѡ3 1L9J`l1_W"!%Zm@LI](sQY#UO"F^ߎB1?_P Q SRX`(X`r / ,FMA:O:.>Q֓&t@]gނF,EEI*mFxEvC(=pF$ i49BJg0qa9Zan}> 0E8jH2dgQu )!3J 3MT[xHi!%D+;㪇S Q/X A㗹\ʴxL-ES׿0  X(" ( $7[I*:>D˩qRbEwQOA$4eAQ9i/L"8W jM=`\5BtCEy"( 3,D %Y{!-Dʆ,E3~Z1( "(b 4pA?R;ԋN Y?"u!c y<`!*h*.*j6"F {Ab!0L:1Jlf#CcX}FM˥lN18Nh`_> `tf&X5y@"i:K:u3eQSۙ!~&lr(1PLކ)C tsZOnX2IXdO8 #P7}LkTӀ(h+,pM D蹔c8`/C7HT=T?H"տMQDUI7iZ\Ŏ0PjMM:2+RmhK VjhI֦p_ iTr ېz$̠KYEeZFݲ[0:U4i~kw:{!Jez4-$j̫ިE5onNk_ҽqD8KTJ![geycf L|rװ 5d`VZޛ\Ew*4eH*6%A͂?x'jR%`ID+՝ʘ$vقB.yejLٛfv+sŚ -_oVp O(֛(y7܇Eybt5[4ܜ$s*nCH$.\Yx'QژuYCŔO~NRKW14-S]som_ʲ[ɞO|(*JAsy&w?YPoLH,M7QN: ~~o}F쩝uJ~jWjBt_aaUrސHJwrI̔w "%k׹)n-t!KjĄ'xpR%)[PQ\fOìtKkj&#OuZcf3|X/K^2Xq*mƁ+r]oOm #C\ڞ5zNyjMw.\u ev+UIDzz5^H5O F. oQ113qDO 3T$QH_".KzaRm,YJF$|-"ȂQkqKE- 7 4,|F[=/G9 C젤+O{q'p$Xh:?OxQ@2EUPIL9#T[-0S1gd>[4'(.1|)TA uO7~l_Beֱ\Wh{ȱIR:#"trc _ M>heBY.:v>Q]i5.Gk7{rKB;kCOTVը#$/4<]1o19k>OU1~nJi #Tn!c#E==v{=I@tċX8~׹ d zɋ5 HeSb#fH!aA J(J"IR "OMڙ$uXHvaq^$-*3>T[`g?k*$V]OfmM`0.qeX%Z{KM`e,sފІ.ZL͟F{ o+}`I&Y*Qm 9·V9vk/ģlI!Cs:qT 01-SY< ʈ^| mj'Pؕrv/b+w,ss ^M~HlbnD;ҹGz(^.R2dLyJ +H<|\x8tgPE7xx{V m쫟s(2eQIUzKj@ʐ$S z{Ld%&\IB&DIt:? ļ>Zl4un/[0ʸ)֮)zszlw, Lt;,NyhGsg8FWv+2In3FϨ}DP(O%=K-{%R<"v/ L!1}$u4An<.US1-˳XT=V-yB*pA>LIl1a(Q6 l6!.L6'3dM⒜m&l| Yȡ% 3BS:IUTԡw[D1E(cCXUĩ.ޑ>ƛ^ *:/:'U >/ޢ@eTVBEa-FLfE4:!0Ǣe Xt5G)l fPq%K"ki [%~+F^$F4H{Z65i$l4"_U <G;}}CY<=7| .A) TKcda֩(O: &F1%٢7Ks e"ui;tA FP?qPSBQu,(s X1}4=Bm$s2DniLfa_{ssA-Voq x̕(> ggy~_!jPR;h0.7Vv{"}Vl7e0#B tuA{JuJ)ӬV-{|ƾ0nڈPytRއtflUxyf>bkhRa's a 5c{Frn@&MVNe hf~a}Y^%tbto.j!҉L5k,:QDIځŞMw ; ? P6sv8W;Q=ʑ<y !_P@ܸ/%@7JzXT\ AȒiD%![4}a]5uKc4t&Rb݊Bb>7B%愽ᒹibi?]&Ls%L{=,AU%@5ج%6"%7[bLu@`ԝ,]@D% D5PhmI :FgJ֎#G;ppML''擹jEހ[_.I\\T4Î&dU "} :DqH|UOEuu+=%K' g7t֢ɬ|o9[H2vڧFW'i׸菺$ M(j C xʧҹY+4|mJ"9^ءĪ~aa" ~qא0 ,W%xH#.>I=1%Z㒅·Mb,<hCL+g? oڐ;(c?) RKoQ"OF$Ub5Vav(ɘN*B $+ߒNǠ 4-@ԟh2'?NDkL)kC{'*r$zDsD-T9I1NUVDãbAeBfؕΨeu"hAAgq6]b`UĠyep?-[VID]kB-drۥSB`GWԕbeE PB[ Q; A\jsvmwc, [`Io׬J+A'$&+>Q0+J40 u>]w'S4hzR cKjHհ-C9Lq}=`|*V6͍ƿ2(zDst\9NhyjΜL^vu؅[fĭY] (qQz蛩=o~F,!•{[g.Fz"gJ,@-oT+|Bx`_hXn#ۓ}'zW(5;Z ǰ׹HQ:6,s_H9Pͼ($L֓ ojΕ%}E2D+%ړ+#a(jYTдNzcG:#^m&@,p:^MNIkzG~*`ZZw Sg[1qU k=eXnkP~LCR=zC<`AMX?S[}7Rs5c\cA$$s/#l( PFIk#L`~ ]zRG@0 I;Su+ ĵQmI`{)S?eԃO^dvUOA2פDO0Sٷ!.xaӺvX !R*|3Ӑ5*WɃ68#pd1 4چ;I9K׳x%!zȐ5eywǍ;+݀MWĮq%gXgQ*< i3?3HВp.K%b2[N@ OHA!s_c<@+%MߝtD T(P.>!&7go5smROHmȎݕlm&NHbU9s(=]2e=>.<"S_+EfEref3LZav oMaߛ oPO,@1ȤJ&h&ӧ$jSWaU^Tg9Yx3qK^آXd;%&Ed3uIsNM3Ћ$$ !þ,.q4m/IlL5OB꘷8Cy 5~N[v%X|)А? ܢK'[o4X .]Ā" 24#gx&JP51H: (IDz9pq𤋮nF%ЯgϰZD #%{Q AJW D]6US-re?#zo%khΌ?AMVՎ)@)8КECo@{#^)"L3餃q$*T3_vHSCb@~_o `+]kSTQV-=9RkGN+rPTd5YC (P9a؍0lE˲74V6"OD8W.zpNo, 1YRϑ电*VLy DO+qƊuqm1ӛOj YM7berjคÙ9t m^euIA+_#?GZa0BKM@_Q$'9-U I>ӛE(UzfM>|duQZ{N5r05n/~[wfU0Ӫ#+s/#G ws˘Ib 8e%JDӰv*j ɈL\&˹؜[9AP?ڞ7K4]<9?Ns%:5lU5jFP̗]=Ѫ,ǾMKJ jfՌ˛Pϼ!+zͼ%(l{Dv'ʉrټ)tPBЃ8=}_!ľ RY+"5Z~Q] PIN%㶔mb`@g6;= .˞!<B#sZ t4B@pelNeD]|@^巢aݥf], h-W8U XpMq\2OF$V} gyԒK!ТwI?29(7ʢ \ ˾/WԄ:[~?K/4V:ZMmB}xڠ%iYqu@p#Nvgavf{+ v/a,{)p 3`5 !BӛjO /^련W D#Om|@T'L!ΟdE jڵhGv(DOfouJ\e5 ZEG6VH$m8S덦HI1s|@JM J \"QzZp5)J"q7ܸ]RIN.&/eʋK`ǒ1+J87 H 8O±EM~|"ԙ@21\F'V,\էhI=>9U!tB16Rc{Jpf;+/᠛,|ш):˾ (kqjBT4(T)OaA_(Ā[n*`eN]rn2Y~vvQ{a5R: {b36iVczѪ⓬t8)0F UoDaG%dIWeӵQrT KH8d%@aς4 1B^lD Hio BdŖZYvi6h0`:']5r_7kpHKS&NRZ0%PWT4J&"}x1l;wuV7`"3,8 *0pvDrЂG^ᥲ(vߡ&.?UnT<Ъ;`Icd'?!oF)L"HЊ SrYX L}ї͝_3!D(`3u9Kq.}jq"dh sy<n6rg. |'?*z; m4 %GP$*ƻ/4]8cHBX&չ%N}Y~u)n<7瑂)%0|LN1d}+ ]hw=1$TuA)O *>ƗfGm|QJ4Y/_#.v:w6Oi 8.rދUo̿NZ kIt䄣zŬ.(BX$ F_)qlΤYF˱j)Wle|I-L2oj#83"ЂWr ,dĊ:F vhs|GK8=T)cП(|uN+ueUC!6_oJw~uDJa`;RZ")ՠ4{$HoH,WN6f5OK~zhȂ?ށ ֏'lh) S3̊#_r~7ƩwIƻ0ЮX,Vkǽ&CޡU} kja$&-Z XI!- oȴ$yhdMOiK 'mVD&+VZm F$LZLٴAVoO%g?Q$RR))Ͽ_ESF^%7dÓ$bfzP\EDη&'ͫL nI%JCI 0ڄYFC|d?'N/ q*z7CgҡKWn0R}É {=FWU\4VWbZ Fr/!F"`#Gkշ/ЬP_i9dpxz&{z@x ˑ֏L Ni[y%2z)LՆoVLK]tL[Ry_$QX!gi.>;ZcuT3m樲z$K&Zs`Y<>AKr]//7ks3tIɌD=VHF`4X IS&HD9k =COO$TBZ#hH]۞tJP()`^2X1ZYfiOPBjf 9x7 =z.XA9?%z(!EkiE<$Tm{K`0B5G9,l߱le' d% {9D۽Zל9z (Gq{p g݂z_W%`h@ZJYP1eh (zG7֝v;ɶ8unk.Ycsf|!z]Ri qmU YuS'WLj(t0thd M 4Rq+:=peP{pRnpr1#iʣ+e ; @FC,Ica ӜiD:*qh aiV]# iR'/Zb7 +\̕7'*f(vZbǺʿGVvw{Ws\/.bjHlܔ%TeKbOVx"|.wgxj% :1d*0wz N:RtX/6K2 (FGDb;s{s!w)vȲWYvKGPȄ&I[xM0 /-K#>Or`SkgJ;gB e>#viKw|%w0x8زso]+lUĒEeYm+ ulRDV_krm*&44J 5h^C1ۻ3DTaNRa‘f.KtEYMWfuԈ2ࢵMS-Ru|X _ 9o5pO0w hdY:N КNmdQQZ໖_+0Yj1tT"ia[ӿCIGf;0WfTpo t\s$]l!8Ko+¬ƿ~eJC4+1B9Jh:_ߎ)vq]+C=H(j B{r^,Pή i.i{Z)>31Uf"SN~ֵED4O1Oz,OyQ!uJ6tVT;K0N x$'Qgי]V؈=R6NxH!yٱ!owg"fϏ5ɦK&zQlpGJ})er<߾߄OMD>#EYpQOO">ީ1Hڜ4h XN-A+QYaSOM(bgD@Z尺zbmwm)-@q6eG$Q䯋Ш+U-y k@4Y})XV^Bp 5K[GuWO;D$c݄7/n |%2m m,[v.>G!y"9ʕT7}s4H3i3YR4lO" 9ҀLLU^e.'KH~O֑O1>A|BWMdٰ0/+UOXM;8LX0BlD3!;R6h&m 2hw~B˧WtCXE\W &e'v{$: >&)J5Ob z;qDDv{-QJU&FA19d27$ `Ui*nFe,[N,f`Zv4)(h hH|q5A ϳ3AKyyflF2A:+brt"E|Sq," 36R^7Iww|B \a+v5D g g]] rWV1gwҞBHU:FmI)p˱3Pή漚Ǖж$Yv|qa@T\oIOl %p_۲'lm>t {K 4I!mUCIR7Z¤O*0+FV&Yܷ՘ȅJiMa*'n53%:-|Yى2rH&i8|v:r.R^t=YX̭?Y vŇ~rRJ#5^lL[L,Mf2arj(i5c2pMm,ɼO/TmiDPẕ\ x'z Xt*!q7.s,!BslmfeAxZUN@ ZR$`8*;j7#AmЯޟ˰XjUrG0:3!W S}@*uhj?,޵-w @B#XyaJ04ArEỬ6@@V^aCGSe򨙗\%-Z3= ā SP6u*D"\V&u3ٛ'}Ջ^FVo[4&cL { lBea[Q08Die 3GLMX/%=B@>o%b䙅bm$M`o{zdEsm6W`h"hHjBJnBխ4E ܳÌ=*D, F+م6A'aL2Cƨ՜&^Ҧ.vbMzk+֔ IZM?WJeE[$۹VUm".n'5(rDoxu^**$8|]bRK^(ST1?pA{mIaj 71V"o P@Y7*աRoRk>H䘟8A#YbGA_Qd*́#2Z10ĠT `b'X!#s48 Mp%cKM/IDX(!dvһ Q j @s?hc9wM' &HT)M_S_G>']EJ aĥ )a)ߚko֩ Zb۬JX-~P #HZ1k$YtU?M/M}YF=`@p1Y0Xj&ad)BƩDlPqe0u 6F)J[{B Q!`Kq0䠑Jc0@ N",@ ")ÃF]Ir4pbH=l%}]X0)[QmZQV>QfpP׉۱G^W $R:ŜbF\ABrtzs?=#Zq aJ֠|sQjaMV%0 ,ĭ/yH q:m38gd#n TM(- |n]"Y҇1ù8V@Ӄu#Nu{02`ڱwok/mұkG|JyYsPDP+<8mo_SAD@vϒ(,q$5 R !!c^[Rd{X ԩ!Ea<ő6/);zh Fgi|ZHGi(]J`e%gR1aRXϴ犲Zf9tIjWf*AzOWV)/c;#.%k=sԮRZj^+U3u CDjvυ%$"QK26 C_[H`cZv@j҅(X)z5= C:)H]-թli=yV"\AFvqj+!)Ӭllwyq{1fʚb\Ee.|,D#,Hi.).H`Y7EBDqEWҙfE/70d5|tc2:vٓkQ)@Q~=k;;{NJ0JZ!B5ЙVNpvN'YLOTB4ܷBDɎ#ݰG+C9r4 rN\ vl힕'POL??Iiڎ,x̙iZsʬMUJ}چ)$fbB> 蓩K"iC ryhT@øZu{a&yoqץ߾ҕ soE(Rl9zHoUWOcAW t!Ď'\0O"JW4C"5IM-nbS\]dVƥzcӥ8Zob ;x'Sȉf#KnH50D3)F,B@&j߼#OV &MΏc}5t6bSq?f@:8<[ùm[|Kw/kv՚#=1Fgumm$ȗŊ"Q:Wx7#P[%DrSti-+#.U~[#+AG-Q{H(piDkK´OY <8k̞ǜdȮB5椏*9<h73@toS+֋1UجRlؾ#(M!d5U^0+b.;#b]o*,BG pgٖ+.b؏˹QL02#"J`QYu] 5ɟHǤMYy] $D7w8Lw?J kz8(Y3A ?JDK:h`:_0v%(NDSsYZXdvu/Ә'c>QR7 W[`YuuQ**5rD3܃!Vq3})3}FE㨢SD:yx,,AX-OSuyںQΩբөP~$: ))g؞^2{xpfXDAq=:n9+(2P8@wت+=U/en@R 0zSNpn;Ehi\`Ej&RZmnr!IJdbXL܌ _PaF MK`0*UEz Cn!\\@TЅ!LЁGWR{I]]4Wr!: I;gFٵ-OCOʭsYxcC0Lx~Iz>}s?>- C{8@Wԏ~C K42}@duc)F8Wk5^p,tσ[LC[ͺ+[LgĀլgVKQ+r&x.n;oa9q,h 2ҨJ~ J]5:¿n4Ȏz$ܙɫhOxNHz.cڋSoM&Tk#)*+dͻTҾ*Q_ &1J(nzGDH8<0}w{d0ł;#%0lFk@9"hWϷTNȯvtx hVmQSdkէ |i}mT_rbZɤĎaT}MlNc-)LV-&`.Oqke$$tH>]PE%Tkw[+Z%()HA5d!Ts$DOW<^k|QY-e>_qzC H1qY<B%ozEZ-ʢc_rY1H 5#&9xW ꬂ̟-ge۪W+q!1h:F*a Y"wAoJz$9wDK0 $L@q}xllHiϖP.Q2O%LZ, ,iBlʂEn Ey'> 3r>DEKjB8sQc Й8 q5!!Zۿ83蹂jAeYQne]2aAtTCKH^Eʨ ^CʻmD'U/aim(摒y MuUWO}\!6o?Kg EM?(Id$ej]tL3&:Q\pꂠB"g2[xQ]v ":dj/*d|:@DZ"LD\*$0%qfa DHttb=7D5Ew`  Y", x/#O"<Q7Ƴ`d 7Ė!&TM6q& n |WSσeO"3-7"g'Ie'H_qjCݻQ؟fԫX6a!u"# MLSTXMG[kAU 86LfCB̹2 q~'c (@II="h:ubEQ~x8#ު P-WT{J,!Qq)v~LVuK/~ĻpZ0j ԛ231dI4q/dR(FW6Y}YJzMZC_ 3Z^J=MQ6^RDߩ2I`iCѐLnE#+zԑ)=(."huUV %G|<:M #ܶ(EU(tS#%b}m0&_:oZVpYȓhHEϯ0ĒmJ8լ4G;%A*)Q@(MC4m/Q $EZ"SVd"$,$ȡ6D0}IV?Fmy, G*W3e(˖MO]MPbq{?JOCDCLarZ!!*%_kQgDS{Gb|0qªM&"' ayfH_I&`:a.nKbQIS5g½*f3RBs- rlUױ8J]eSQ4R86 b$yOfwZ|M[RUM^T0&̚չ"(Z[uJv/hi BT 捆mBdݨ #ݠ> H]f$݋Jf-|3b(E䦺(8* jbW <حc]|\n3f lXmfe:Gf$tGS8#ZR}5Ʃ%M,O&I ~k ey?{/@SN^^'X}{q5TЬUJ!e'Lȿњ+Y-[cZA{M Jy[5 \N114|vi@Y8y^I ~Do2g%EUf孞XVT N(s1`!aeP{`(h`l\ւ6A}pfOTV VDl`I609t\B2(Pvo M~iA7/BzٿhM2`K4 aS 96TL $qdDPFOўxp;哈):S)?&f 0^GzSxGq f7l"IoVHʦ}OSɣ$EȲۓ۞$LLTJXa25.שTb覴H^EI?+c)f.o!JJ89~O*N }OH VCawc/~%?#Yf}Jm2},+bd疫g'*,Lr_/Vi&DLWҋ_ՓOTKFW`z!mI] {MC T?3 pl'*d&FL7 eJ'EUW3{&Cӄ3 |vC'd^jɘ N߁h_8# j @x3ޮ8{_~Fw"ϔBLA^$޼F|DԬ-ի Xo5P~K:&Āi|lV7f_Һ<PnE_&w'$q(R ̖\;Yvp( ̪Ldx:=ԝ#xyIPFݹG)M{;<"!q7Wdg~o&zٶ27UPz6?Ou6'Dܓ2abzD1_i6f);hiqG'6HՇ 2%;Sy^\t3&5l@ 1ѐ h[XTQ[.;(GV%&/XdKjΕCs";Е)-B-l^u}J0Ȥ6\^n)uFK1j>0bSh7ݼ78Гbh:MI`Io|dI :LftSxaWNͳ> MȀѕʠ.J}| 1ؠ>ohjky6,^XH4@9ژn:!oZHpK^&Jwdy6wxDo);!4Ih@f̿rCα4mec@&9:rRg4rdO+^p?(4 h\U5&JRLCwǼcz0/Ti)iI5a]?\gj}v0r4͂gpW_1hNJ'RkubX뇐p&Bs[8\(J c.LH-vJԻ76Mr߿⤶]ߙ*']9Cʣ? H%nQXɚK"y?TYzgnW)bI_'fC{⒟ٽ7,8lS*C|YuzF)ث,T.}.]UYQdT9;JL849Ӿ9sIT.,q'(vxS8PlVcW4G QJ!3X*R {L Y4r*dQ╲a(>\]\f+YݤbF뱔=N0s[22B6)oIYyĹA ÓdY{┾Wÿ#1=d=G\(za٨z<AXQ<҆=q L67~HL7*\&郤kCSU~Z$'o-H7!^B9_VN.IiFHDx K=`hB&4 ځ}<,VRSP5FnM b `T21| xlC(+P놤wQN`P>4!/y1 ]td nxFF6̄ލ[a5=kd"ʑђypGIGa<@&G-1Eo#%ٰW$Xz.>2D3X#X ?}Be悦\[1E>JA~+Z92*#iBٮ c(g0rIz֨ֆ6U4L"fD D: ^o HnNxD2g,Yj̈"(a{ dDf$kxcId jsµ)x:P( z`ݑ[&+yWHϠH߫h)C&*5@D p!ÆK_O}y SD0lFo@">ad)H%T҅[P|"oIc( 8aytcާKaIER{^K x1ʪg8TKEb`SH1k}( >Z>9+r`kOM4{A'|9=WdƷ&kYĻ#%bx 86ϨC@IL?)CyM,Ö"\?i\Ysj=2Yk4֝ݗ9@;;?d *e}vi7\J45b~Aq1)7-X&2VujkӗXG׸&so |Fq\~ݡ$U}m? 0DF{&v6T=e,mDem(j!R ':3""MG| hTu*4BXS˙4>&h(؆ 3k9B&G&{aܵ0H$ OC9{e7mOPˋAR -ZJOo"1uOCA: F _NS?᎐FBEe7,U?I"#(GE+\~O|N$^VYL; *<& 讒V"v5a;wV_9Y-7 1آ{.Xj|VS2pDV$6n\P16fT{BEW8;L 'qwE ׭`cVѪٵieˁӹP}ΤwNki?yG4lt' ,U^b\IYfu%40L"'ZBJojB2:Pz}ѹqLJ{4 {6! wHb(,/k.uqӈ1%eM;#Y[e+vû\GU/j[:e|&Q7 ż%wOi{% q,v^nmu~2?ߒ?T>ԧhvu %|`=L:^M\įR 6rYcp))ZIS w㦀 BSň|$qim 8n, dJ?cԅK&Ɉ)_j3Xsa&VETY}B |)ԇ D#@SƏ(d.۰j6etwb˩*YV6V\Ogmkni-L1T60Qe8z: ޱLZy@lm>SHL+v EȌ'cf8g= ƑH5i)=fF1>ʊ["P'UҠ9ޏb@:ĎWS徚Qz.j#B ע XATryË!}l(À :]V79@tW9\f:0̲L5 0CV|)I&"25Qj[O8'2 pQrLL81\/77u\{4/X"l^Y ?|݌!YF]C[#ȑD(Mn*S:)XRE"顕(|~Ju7c?!B20~5G;P@Q=ŢO6w&WYw^A{1BZMY_!QQ/ #X=1A&\,EaCB-B6rǖB6MP P",F4Bp,yHڶh kll9nrγ/#߶҈!+,$Ӆ9gzYA1NBMP4}֨X7)܎T":eDn5fԓ1 JdVt֩6TbO:s$AT/#Jf-R~eIy2}o0YNJ {RhU5?z&lNz QK%c̻4QDⴅE$(a/ܟ[I *{XnzԱe[I|8&PΚ'*^V;mPEPl/:R U?aaTZ" bl>^/e~ iyzxv 'E=Zs*\T C<05?=)h2Eѱ7E L Wj?{&䎌Xfw7[`x}C]r=Kh\G~#.X[p=W1XafoP4~ɽ< ~u{Pq]xz,wШ]wgX/NKY$vca& Ң"+O2͑uοds8Ŋ9}R=1SPk̭,-Yݗ<&H:P?nA fTmIfUlv;f\@+𑃺?sTK܇^VM +LiթbOb`k-=)K&ÁU{+BOzd%x"Q0el\ Xٻ5R)R\R ʤ*uQ^?;'%Lh-ͺZd ZݚYa #qJDп%Shɂ#UM f:O*G 7{xB|^հ9o`JF5 PS/x"mEzf=k@+[D$ 8  vz"V>A1 H4B;{-AѤS0/2`Y \<_hٵ'<`|V0c\Zɘ8_؊s3]3U!9ILE#,\zn:pI@A|)MATg-rʷ8}PNG*L Vc6~EXY3gE45cAgaIj(,!Q\8¢\-6Ҽq][* y *?Oiq{^u~ l,xmZCdJȏ 8bN7ʁbLuAei|RD!&9A&#!,t];y>7O.l4E^%p`Gաd5Y3U f%ln.8/avM5""qyC'ڴÎ%uGr߅~ahÍc.s /YR =L4ܴ39bMȶOZg%rQS BAg6@j+J`e\cVfᆽOkzE.$q:s%(gxnSY䫂䮻;C0w'B";B%U,L8x~*%"GcV/ĊTF*]>:$ ؏RAg\"?F"{ek7Ef~>. ֪Te:$ݑ1"x̆,Iv B:y>ö䝄rXeԭ{F\,.Tm G p=S:U1rkjJP XOGL *_[fXd^ҴgJQK&Й- P n(HQbs:8n:J(D|DMvNoL#y~;}D";b S# z(ީ~lXB'r)?;}$̥^)Zj݋Ӫ-g`<:s= 5lOˆprG|"8\޻JB=+]gg)brZU~'%M4ӤozVERu9g4όxt!P'i}u~r;0R!$ Vwҟ?9 )v%vWwҙ}("bԚΑT%4!s(=ZGٍeNSś# bϳJ;)΢Oy.Q)b8]D HRo -tX3#irh^ ^kwl>alʞͿI_]g?W cԦ F<!gYK^ )ˊb{hQĉT;+#aˍB`"u~tG*1ħl9l!iq, BX &CRۭ1) zmXKKTc IHCLL)iD`7y,jV!>k[V~aA3 ԉ.`ԛbUp2 d`82ۙ PZ:EX\X_74(7,KQM-sLQb50+%ZTE`|IN #v1*ǶPd&{cTbqm7µR6{~!lebߙXEDڲ"*=u wNO, G~ DB6KޭU .QWAr[/= ͷ>m;UA1<\,WRc4WFItH:a5G:- {o)FB~djV l`dctH* ]@nhZdA~.Bǻޓ%-壳Z賓 RT2~=eaF̡C .$"$5Q>v39J_Yⵃ*wߍK e*:]י)C澤l5{CxAGMN(7[H_́IUokFSOkۚe5? _hrk-k DCe\ݹU*hb `x90rs">B( GFAu"7Asɴr5`;ucLЮœȵ"wl1fűd *vMOʄU :;Q4"OwpYXسV,!j.%~S} 6C =-`⟵L6MI<|E5C_-›/pQ^bq*|dm.<`0!ءAVvC {jK_CD^DS1@%тF:Gr!R%Ó6]ެ63@n}@O!q0Α] Gʯ, 9 XjaT6* ?<#l:M>QyMe6!Mc )r%K2{DE7dJT>a2nE4m4V?ZT?(S>zΰ#T^>4o;`bAJ-x8Ǧ["_,d) CZQq  =hss yhZXTM~%DTt+<(x 'HŀYW> eo3)tc#$Ƴxb-JR[3h+f̄`?$G fL!"QqoY V6dCOA'XP&SlH([P$ ݣvC!޾2B$-E{vGg"k:M_If#Oy;dħ"0g?ԓأ2[w r6%Nx)/קZ9Yա!W6(cǘnDǸ"(1N!7W/cs3rP"u5onJ2\ie?e1RsD[h+&I1,^6fz[B`/͗!g\-e6pb'B3At9/Tk-K?lN_rz-x:i`O&Hm$nr*SzfSPnQ#'Ӡ5L?uo* B/TZヺ|;ξE蘞e4ƔlN:=@۫'(_>2Jk6{Ҕ xaA1JaH嶚gJ`xXM!lt9Ǭq~xuTFbvJc3Cga;G\!m`Ԧ+b'd3YS3:tY"8"Q2!sG#D..*C-o$/*^{02M(l33Zj$8n3c()Pƙ s: ZgWEóuy8%{'x%_aЕF+šH(LM#!Ùu'ir\6OcD$e0@;\OԒT*a0)~BjCq1m PXD7"XŮNT՜iAuC& ȲmR'HNtVCbzj?B[zE,F6BK t}@Đ-(Z%v w:yav*1$ֶx$n@qְ55$4X|O%D1{H{K!4K}#BJ-8$ȝO ]Y>#廜0rĦwaz.T鞄”U0GZ &֍baLsuJOpukf˄;e^@ڋ-H5i iU'etX1vYrwЉKRUi9\ J LUx0xVb|.MOXVY hFW&FS&N=EtK#_t@Pb3l2E|u#U(y!̑)WŽx.s| TFffbP*уM;{l{JG/J s%zIa2mY׻%8NDwNP[K~6yToDq@dOZ0. eF"Hl0!?a0yDt)mߣW- ڠ}kvD)b Y,'f,jpB}[M,9Բ ӃF̨*'{Ylm/9āk@#F6A8-mq,' % VE +]Yezd*BjX_gX UW 9K_YРteM.HFRcZڕY9k]@?N+{drkTXE9,lpH4v*^T UEq. 'Mz"!?  4 L6bulRgwZỻ C?ZUjy3aLn VʅžVE[\ڳ-dN8$+I&CFCO@M7^IrjDM5zJ3}7Ե}@!cQ<@|LJIzǷfĦ#jǨhP&VS'7}6kGiV4!hX^{;/Noj(l"yùIJSWl V ,qyզgR3AFHlԉͺ'pMl)Բv3{d^'=Ē.8\ϋB{H='d!@b9f+>"Ώ?d98@ՎZK+ĽE=^d?]u9ed6,rL-w=Ȩ ^I}G4ٚгk̄Fss:\/P\?,HЁ zj! %]*Dm xW)n_4*)&J-YldJ,*#vQC[3I̜\RRPƖڏžȏVVvHLҬ_+ Rcz5B'x-6AjAAph|^{bJܛ +cAnAKyD|: F 3xD X.";|E0b7q-CQRmid@Jufǡ*WXS$RGWQw_) ~&YaXHcpd8~Ď"҈ .}~IJR4|Z4žw&FR \}yB8C&qxNT&$%apOvpTHF4R'> 37Z+sؔaQ hf7" Sxf4$Y۔Z5dٻX1!V /Hޡ ܬX 7'lв̗4*`J MzAdPGI!#!^BW)#bLQ1OC2tVƥ G0 ƈ,aBA)#e=JtYs]#;tdTh ZA(t@24dm~@LxTU~,J552̇Bc w03>4]fP? TMjH!\L,jqUvPXQCvL`ӫ|ٖg?`4Ցh"D!!(yobQZwmrʇЇRw־C{^XrE%4}JV `*аÙje?\~]): e5uaJؐ e&Xbàˇ̟I j4؈&fjnoΫԤUfJ*Q k =t,s\"ˋDNYFRw>FZߵުM pY2Ѻyd>bG"##P8yny->1#e݃#FJsYlW*+JzCtd:$KLag W7bħF筗\N%'Z¶qu}[:vWFZ{J8mDŽ /F5J(Z?$\7;T邇KHfP]6QE3&/[YդH[ĭC %\y0W.C"%jM VΤ\iP?s' 3>ճ7^JlK܈;( =Dna[GL 8=Q:B󵠻JR% Rn'a^^3Eq:oC!R hMIi5UG0t?Ƶ!~!8y}TXSʈg,\4Slx XTƾuIZQIm6!_+l#}B T WI+;iX |G,:(6y$ܘ I7yf@U+Me=)!rF{kfcf*z"(.{( '2[J, )2$̪)6L3 /9LwH$'Cim]qQѺSÊ3;/Fh(HA^a;!K)rھDa&$ceT1yHOf ,yI;:NJ/ABS{93Kj;ȷ~Ί8c.ˎʰKc6C|ƇJ&Y[dBwKKGk]֡2u!q1Ue*b s' /9ͪ,mH*$ ڥ_tmWޑ(XcV0WX͉pð?#/s| pIf^ JAL,03SpJY PvH=ꑳNoQ9f#|ThDWեIcJ q|·e4*3 )C +% e[nL N`$N>T3lolQQu&]H`wӱaGg>FA\Wܓ\aңZ;{(~M00ImeU{l,6URbuxc ^vR\OM#,2*0LMRC& j^? e8ݺNhw^*67Is"*umҫhÓ ]ֈ^MEԯlK ";Jm;a/S 4Jgs뀴dn=Z#qxؕ@s cN r?vy}s6[Ծm/HdI䓅eH+pA= ,-%P @L c &,2Rr&6R!8\Ot3GI{o 5Fȶ.Yf79>bHD\kjKa <wO*Y %[th`y&ʆ1-1C CB6*jvpO_ r;I"3ZNpeU9 b 1P3lPfq'{O: a|t1YKxB5"YGmD-'ȔP' sp_HDwiut\ICuڵět c^ZEU69qQw $BY?0iQ90Vm hY_26v#HS'36V.v:A^VP%w$:H'6ek7wJrO!M:Vcpz'~M<0"K$`(9rM4eGsr&swMD1[Ў8;}+`[SЄ|P\]!U>^٘3)<΅ODDW]v!#%V(pOmzvSd(OF4!eDy|H^ ٔyLS-Vʛn#wdJ aGN IuV|Bћ n!yeU}d V%t[  M(3uΚ WtYܹP;P 43 X#\7|Q=,4Djѿ).LXK&z" &X^w/TF $} \jC9Ö>G4;C΋]] BHGRz-Lc/.* eI-̦`O $z]])L5's}};rr:z"nv?? 7$ko0^˅T-ӇѾzSԂ1|MlBzkDrf!$gwLM7Sar24كUK֤Y@kr$(&1Yy*B;7a,PעA65KI-Jd -NbA!" bQ9=D) H$G\aR5zD"ꊡ7CoH)~n]O؄obGThAW7%z~03y>l[ m`Ƃa<8*XX. %-(@RU$tH6lq}U1[lI)I4B Eyx%kπ WiIYxY'6e~csP3:N`d9 pZbHYS8W>JplPU&a̽*QQ"(]rH8p,źQVs1ڒΠFN2ϢB,ȫ=b _HQ 3Kv-!}:$_BւK5%"#ójU ѩrAJD~&:r31竁[ǩlTy]ĖܜWUUes]hWɵmc)n땳6?N Uۊڹrc[m}G';YI֪#kuvt]Oܩ2 B65ao HkYb⃓uMVsq)푠4_R mǡyШm_ bC^tXܲNE9f$@;yo)&M55Z|bM&$swc] (yL@"m{jm$Vqcd |*A1@>5Ӹ.pB+iٵI/dIz8D[K5UZtzzT-ye-=F-]6ɣR4ڨ(/y&<R!'-׆hc_${JqDg̪t5׼k)5S's AcM>ѲDG)=#:+?mݕ]:u=X%ޒ5krjQ $) >ܑ2 3Xel*2ʟ=DRڐoX 3uh±Uɘ7;T5Hve -w$sŢ2x  َ^[7, 2m]x4xYw j^: A_^JToZ~v8`oJ"/xAiζ̭ጹXj43,}.j *>lSDžNrKHը MlPw㥪7>|Ԭ4%or|%%2ey^F5M[8 nFb?/焟_zxW6MU2C jBKf>XUZ"Z"E=EW|q'۷RS(:saE_VnS,dNhe:n4v\"<&3*袁6 E1H.& fCOԧdu6.^:喙$ ;X/߳#˩uf!?0}|*"=ːnwt3EvKU[V8p|8E#cOSj7霹fqE/!st v\^(ݒؚ| #Nݻ>W mU$;XFRHn.SD H{>fW,]WШqAD\f,KJ4XbX7wf}fpi8hR2]mk8R?kKϾɧXזI}{S\TAstUK @$bb.9 uwΠQTŢr!)h `&HlT蜬|d.'|`0q">VTl.&z*[:Qҗ8$` *Kiwmzܩi j;Q +"DR`UࣃzI}m(K0VAeYT}՚>6l31tDND fDsI4J/ٌM\Oh?.^I/cG6.u"Yة_)T&fЏpFgfW&5bm_Gaf D t.@!2X|214R)[@G@bQn}ޑVIaIi"Ug-&wPX p1#_# BtųhU$VN3glqbfm !GQyL-]c&&ݪRhS pbb:OhRTØd,{TBT!jTr< H~q2@I( p@-Sgkmyf3KvE&)4`9M"ɩ1}cP4ՇܸHU)Ѽ|ڳ 3G{qs=;˅/7ɯrJނׂkvd2^od/yzzQl^܇k쏰GUb >NYu7@Kh_wT= QC5kk8fOP $"Kd/ '0TK=\(h Fy+}\X)OQ1 DƆ7*"2;8kpTMzZ{$Z<~Y[JnCIIƙ^Iw; Sp]zѷ9 h\IW$NR02D^܌e1:OP+TΪ7G8dĕ {7{YLG<fBD7s"QdDpsEgq0l&Imy5 !fO[' <ڑ~+EE6}0p[vʰ7D*KZh&e0Dڿ J )p/a<ъ}a1#+l|Yq>(-eN>|Ũ$AW#fF<`.8DǤ 嗍&+w 0&UR4{C%c-ꢘuD_N:!tin;i$iCrr Jpr`XOƓ5Bt۶J˔MJJa' h=Rhw͊3&P* C-r2p̦⛭p`CC|"U v4Wy *Mt]v\MHy,ojޕ&e9̂^*7a:RXxHA#ާ\Kb~}ڨ3} k>tuJo4/o&E&ٮaBGKqBHbvJL2Od(Q۹0 (nhP3t5Aoe 7^vKߎ~$R7E/*! /)-o:RȏV*ϳZ{&CxKzs,͆zb vQbf5H'!ȧj,- [cXym!͹Bkɭvuj>-uܑ*U+/|R&٤m2"#&,8ni2NQ1hI$0^*)$Gd] g߷cb:5k2(s [*= t{ 0$PGݒTD`t(BאdZ8hj&% @S\Y)Z"HVצc4`@t~2y-mYṝPԸI:ϖuz[N##\ F ,$qKb0D `s T߂vs:j6 ny! I^z6TRP3D: asp2(FT h)v1j׮hj,)EIƚu2mqD3;D(-NXO< J" 8,o*Ō&g* ė:N̖'-|xC-)©f7o?&aWH1H$J{Eg7eu]}wJX\~#tKeΦB2[p+SꚷpWLFB;;?2$#Ȇ)QI#&r]ÀO(wX %Ԙp<&T˭ίK&[V{3C= Q*FCfXԠGKGHl*[-m Y0Jȶy>fTQr;*頬gb0tpOSDZ=6W*r*N:VukFP^N3?zn*95NkMkO)k qXcX,MS=YưKX%MJ4g~uXfL;5mAq2g `fJG:g7 +B^1g?f$vKPrJ}3H17Ġ\̾aSeUyr_?xXM*n9b]c֙h!6B$!HVܕ;[lJftѫd`{!$˫㽲$K&e70ΈؗrfnAD&$q5z-)AT=׬#Z jBFW,kzQ䎬-aBN.]"AIĒ_FԨCG{5%sGFnޅb4S'LƉSýxӿF+؍a ~3rÃQje*SԘ;YZ= ,޻"Nue Vܮ`sar~AArگBC'sYh;B<}JS@]D.@BNuxk;L?g" t辷`[q^vXޗg)/-0tڳD:\y\:aՙ _:R)FH*.b5OR?lAr?x/ӯ?~5ni.UY8;1"G\UNpϼxcR4Kv2*Tr#@M ߮~TXӄ%2 ,YfD88]9VNW"YL)פ$I."JIL&E3PCY}׃|@Io6I&ذ,XI d. ΎW 6. kJ?V܍.R"sPpP.K0FđNT8 FΓpG Fڈ> #QE} %sR2]#{Eܩ1aTD$  2N]8 ['5xv!n3uxeJ2yB`rzR.Io0 .lDEb:=%XD3{ȌODdc|a) KMa0;MXrWSF3ē|Q)L1܃~?"((&4S(^!Np,ԝ :"y1ƺ!H=AZSZ M h6{hP~WuWJWҬmqJN^j̚FFSJ|Wpb9A0QLg,c(q|? 7śttA5ܛD 69|Lb͂VA&e' LVSFJbElXhA(d6x"䤉QS%X'-P@fB(1);u%./8˿=jQ2dmdv1ȁzpsS $a 6d-|o41DG#%ш#f^N֔m2UaEUOy!K7LCz(G܂_|t9;k!x9񻀧KȎ/#Q~ܗޅ @DvaGK)-~4cKj^q'8Y aET0= +{R kx+}93fR {Waxf5D=dO1rLιt_pZMCjlJYOqp|ka<[\#Aq<ᐥ\L B=Ų] C@#DHICxY"I՝.Dh DlIcGLLH^; %g|&}( Z!bwRjo*H*wmac2M Y5ЯiO{焐Q>:N,")Adr) ZaN8,IZk1$%\y-%G=4U*o%=X!q7jvXm@q6S;ZDޅNPq컑frQ M4.bML 2D^Lt0ϐZPZ^$b&l)o2M W*C)g[,?y!;2lm鋍Aj}ADMLL}S#$mnSgҤJ|1okM!RWE{q2űu}?nٙM}֕Yna׼|+\ѩ+J|R L,?m`ke`U2DU cPԠŜ>Jew)Z,b(Os ̌#].+Zv~n8KBeImy?Duw9bwڃ9ŞӪo`ǒYZ(xo-Iٻ4d c%o7盬{H )Q\@XFDfqKiU> W$GisXcؘ,)!c!VnE7xW zIإeh3~:Vav0Q[W&:6QJ;?htۓ(q δE vp'xs0Hh9Pb%O(PCQX&d<uh{'}Җ<#&S&eZqpmw%NG]BM 23PUpL$ꦊzsPsc23T,$ˤօzHpsq/0~dVwsϪ}x0G}ƪVlld{y˃uf(TՔ Æuo3grxiۉnXs(Ȏ'edk0כճ8,m.R@C/K>P06 x [cC1" Y*`- K"M.e }dƽSO [ Y)K)3iV}䁊E]m;~Yh@OkvGyn]Qe%&t}v+d4}wT(`xrX WBgI8" $+.1 .bGTI qURyY>,"#g0 sfiF_h*B12$]oT)/lb a)}o6.py ]G#=osS =+@FaF#J(E-~ytBL{tpad5o"<0moABPAm3Cܺ+,GI:pE}^;Ŗ$Q0FX߄9ݫ+1u-}"l,8C`q} QYQ5 常da#&%ugXb- 3D?ox`Ń^:nY\骄FY#$,5Uv*ivүk'$(iRddOXuC58W~y%_Go(+Niy 7 Ps.kl$;2H:"p77v> HƆ' OưuM tCQmQ@JS[.uCID8G$B67 DCUBI_dR($OI]Ib8%@ B#JLd" ;_] ?HV$%zΨ GsFkd٩8ʴh*z3U+iei~(7}Lqb+Udwvk -܄DNS.կ1ح|MnjJ R ^i E2;uvavDT*^"uSxm++Ɗ|&-dI8҈NfɘN6fA~l> X B)0NutZN6jRZgcHk)ydH.iv;$%v"m~s߼;&P{yIlVоE )`Vn?ϲVp=a}1z&/mwD5ݛ(ߡ}Z+1b1^~mdW F`^vkXFwzembʡ {W\sNyՐMoBv(2B&PltWS@~C?(믵C֏5ZFw&+*Vş[6+78PN7\a=. LfvBcxlɋo rpUܶ9Cܜn-^+M߸T53-?tA>"YeH.\4qP.|/Vnb C$p)ۙb&q#ĔL3Jv5fb&1ڊ-Pg7D4-ᥰ@dm-P(K.G_(} Xw"-p[Őlul4U eR }He9QlRm|89})Vd(-D76CFK=QCuWRڒˁp&'!-5ht`M{$Cc;_ I*.ds5/l̋TZfyds<Զj*>5mGCJҵk$UocXM 8ovMFo=|q1MuX&>_zwJ}Ql9m|YV AxjĜDѳX Ov 9Իt6\M<*JgC3SSe+n>@NFjs4v]zyX߁'v~ǧՂZ&CSv2Gͅ3p 3R ;znkg=, 88Jj$̓i2p^?&(v,*A \LI bk6|lyu0k0; w+UlMh 9Zn%FM2S)Nk˘+h[>ا 9}aC0u3r=@dr,ww e'LJEEb?@Ӛ\㧔-k(b<PzEjnܳ`=VKTi\2}/_NЉP\92R܃> +/3꿕xm5䨶̢h0#KNZC-S7 XE%9ډϫ+ 5X)dW6h)yU|oVWî&sQ-ɏl9o)kD>9'$?*tGLDݯ,ŗf3}kTm)Geͦ$;"'##\ b .@a\n h)zbH!b T+ae+E. cԦ7712Ћ5rQY!$bb!wGJ!5 [z PK"L##4@qɐdxxG(Ei\\11,\#1qCquL'FBrr(su]HiҌdh3 htd?w% A6dS66;|L]O]PΗ KEEQeMxW!.oًȴ2=4JJ=&Fdf.>^9>s…}^72ܵz.=\A?+~fIM`ɑTǒkaƦY3CeJ^<ivU!9 :P=/+EN_=mY-Z7f|̖P' _]k"H7꩐%Aνtx\×>$ V!*F=r|`(^I`שBp疯FܗLPYYWt~{UvèqI٧)Ǭfo/Xs242G{ViU4,9hE,O L`.jݮB_9|E[֏R)ZȫSѤJudq X/Ee^C31%4S2-*RTWN(Z[ξ9f`L2tFH8*[y~FBH͘% >[F:Y-qAcr9ʬY90NbT+ r<%<ƒ(IY @Z'sQg'Fĸl(yfki꠷ @ۍX00]RU T_f{$RAkݭer=Q%ryMkSϷ`* ~[g f~iHFiJʄ%}ϖ13Ns?8g,ۤb'X⠘-'h|gf " q(2<w,sbϩM<|D#ބeąSPB*vC$q[A ,Ui5K2΀{򻨊'9~Q .Sԙf:t (7v: D{Ք KirT_.=h"c&6j]7lz-wKvdVpze>z:"*G[{6ŵ 9>cu󚴍:ŨSQBBz^ez)+tW%slQf以fEqy=FxհFXuFR>w+""Oeb}K/&zT _3 SAo1ĩjֹ2 f/גDWׂl#sOHEUհfXMc>(*,OW|VNqrǻp#I>=~Au9]D$by&5dE2PUByMsuʢ;JHP_~:dzbiP_3ChN# g?߷Dfr' Llܸ; F0gQZ}æO't(TYvI xpZ6i{x떿!' ٸ 0=TzHA*((Q3RM6?t ;^aI֩cU=;hլҤd;4d^i8i\֞:@< Lxݘ]0i!]*X-I G G04/ϡ,ҭRH ƐRLS扳b]pfL:Nbტ]Fh"H J}OxR`M\- 8ke^%U Hb_i:v{dL\0G2 鲁d])9{9תI7qLpXR>RVRP;+HnZktCl z0m>rQ4,){Z#33Iw>T%aAX/cjR ZxSܤmJ}!6I_<6Np(J$ u5h:(kJsMi)Lt י PMaˤTd٤BXVɾ|WKI覎^(J~◢jKnD!}LUk?pXT$;G0&*ܘ͆>snfgISB#@/*UvBh%j3=@#\XzImRyDT# ~ ꛏƘQT"}5Z<2c11 zyVjHJ=6R.UY4 fEkA4gZPaʷ F2mvyv0ڨmTS?((gV+;]4yA uUᶶa  Gpѕr5`dOTX'sNJh@S'E^F[4*NVCZ?`ht#3utBx+OV߾;q˲&;u%&$C.(ᯡ[*n@%9: yӒY[8GZv+T[-q]HĎp I+倛.ʩ2bR> xo6(yYq@5Tڑ a =Hڴ6uH-Xح'P>a>8lD{q}H)SDZҕvsO" ])[yT?]97( b -mYJ"*CB0E, '(&$HQ_w:*ňEK;<} P/_k^ՑM&O ]Xof\\ "X!W*,3_ xF2wӉ-BnL\!,[b#`(W`lBYQ^X "ua*eqaJZƢAU)S4=SaDGB+ڝR)'n"I/iz^ⅉ64rL!Ybt: %#ʅIa €DU/ؼ{& nR(X8ܮC)2W D@2աr2;q]\#*d)oYo!sO+^MC^1yqbZaIX?'$ۅb-餂m=RLmIeHt5yn*Jp@EJp iU%fklr@DAe`7ͣ \Aѯk0^ID:HVj߳U>Vugdd3[oؼAM?x&rl,YtZ*)Dv`ՠݥ±Lh1#^dpO=BeըbDnpKW)N\1QB 8zxՓwzN5vCpF8k.[κS$@+.H/32H]p,GJ9)4V-gXH h'e0bsib`vj(qY)Y99A+*v 1mϩ4@a7>hz2S7{/b4]r675D"_ُ2jg!Eɗ;1IgPUmj;.Xzۯ$hΗE UܚVA, [jc`x yK㲟 §hRyh$Z'W`$-W;vpSi+heն irЖ;_Ev(A QB3CХqܫ8 QTny,RFXS {!}=BoOo8"v"MĻ8CȀ;:Cnf^VLP }HKN 4-!ӹT7? sFTg2~QBpKU]:I4\ * 'T@灙VPB$TU6WtBO(XtCFx!(!f%*Ƌ7T nKۂlLh}O7#ֱ$\r,.?,V͇}.LD@No9k`4=05Bt}ifOۄؔd2dR- bг֚@zgϔaČaUnHףqCOO>SA29 ]#G0+𳣯m8imƫNƐ8{DYwb_PI6GLtM*੫]oC"0?(m"sRj+IfGGB|V-'f$YemCuHqr縛`b1˗MB.u*xTC {hk(%Mv42w  `M2?:MXU,YhaVz[+j^!r+KĖsmߘ,r~<BȺ4C3})Qy3Ty2+9]nVE2ў&R!|z޴J&ly>eIjma#,/m ΈS`I#ʕkCL*ef²˂J/6pUr>;@܏IF.ޥM4ƌ2{?B9#ywza2gBm9,K=BAD$MiJ:ɘP1=5@p jڕ3RߏHǭBX7!uo-VS$T9|GP4$~bt7Kp]]ԑZZf xbJLK$1/-T >Y4zHK`9uVnS*]E(EIJekUiHd|B'Q;`C->-D 5'7V68b ZQa Fƨ쵴$~KҐDiXVNZw[̆>S8ݾ̀Bu'+o%Qr\P&`F^,L`,bIP14xݩUm) j1Q^MM֌lb2O%_4sT[ɋuzD0;βX}##;aR4)Ek̯Ocj'>M)hUHoi#אjڙ/ͳd5j3R;R+2N!oq~դcLk?u +%Rks'Cd+pg304(/6F Q;KRXk))OdU%EҡVwn;WD$a&] lM2)A »ؖ`6N`$@3#df170PV@ZN:#!AT[: X a)35LT@wKFCN&1Xd !-3z0GƇR=!A}(7~b Aa EԜH!.+!WHCqQR{lot`į"ԊW"M¸l)j @AH zJ^ld|BUa epPswA"J{,4p&VE9*HʃGЍ,blec "#@12ȗ`|ޑVtm"&(k1!#Q-1-퍍!00O^ s~Ldyx (.27SҔ_bc1?ёЄ>xE#k}D4i-$+QB N9 TF$S;as&)NLʋ~򶈗0_aa} <`GW <5T\d$P߉lkOB%7W;tc"u ,$qc% EE ؏~FJy雏{ctUe1^@zX ܍s1 fXmSEA]oFL .Y ~bӶ%-9\Tb jiwoGm6H^4 Ѱci@7d gf(V%>pL<1QZWcz JL'oi] ** FQ-0Ysa3S<=ZRxw yЀ ;%Oy&fJCLT. =SaVF?_SZ FLBBԎ Әc@6;LkU8j"B`nSf^Cg%Pȟ5 T. x2f(Jh$h(A3c̹&ٷLD)alʼ5!| ) :Yg t?(+9f=ObOn'~;PXn`XcE"\CqJ(^#+IoKEQ*Vb` "&'VtbbH0DhJTd <:u#Pp"Ev VR;,bՄy~{na!Mq2ėҩa9lb JA9RU9j.Yj UoW"&)9t\$ $-AeS!Cf䔴!TQ+Li˗:P݈N'g$dʼnzbaKOuN*vĦ Tw5IbΔVɊYS*^D%wgbFZTM."֝qL"X {\윙$fŏXHZ}\bt0⥊?\ >''#PT2o˴D.fWUB|q%@00).[& bsw"35{\̵l(1MlR75$f '3KbnF-=I[9Wx{g28M^0"U4xD*[ʝԁMā:Fϝ[ (MIm-=+J7RfI.9JPVߒ%V;ta 1βoE\&tᵨ, ̞h]X%;(F4l1:Cv+V+SV9W"TVGw+g@f.6['srH/Xz4k;eY yn$[3^YlW)Nt<)7QCimwcXKRw=)qq!AF͢,"DZozČf}Iu:^bN+k뼓SFlM'-Gi Rb~!|>p%^^W)C-Q?!kK*q%{"is^d)c͡Z:" #Pc)aqjĺoЂ,T\-#^G5M-񤜥6!#bj,qaw0dLya .nչQ&[^ۖ]2HA6tċ_l_ (/S–R$!r Y6ԃɃu5oIALb6X\#V&8}&윌z$r}:^BA`BH<09pև Ulp^B̦.G~ŃFQ`$As6&Ɲ Ш-r, !:H`dME./ Q^U1 a1B !G:*͏\1dPWo,Ww DWg c#, | Ń"h}4"]-`ĭNƯז5hQiB{:Ƌ'LоH(L5"nɩxKي65?Yn8_*д1Nzmxul塱A@.RiU-]Y쌡bdת/=f< pb=Y*PJO-dղ(R?)ѵ#5.BocvY8LS'BFhljx0{ N_BKo Nh*\K0Y*V`n y˂DlO#690<ɝOU[?KVC\` 20sQ7!qɔ 9:&dmg\Blx>yw|ӽ'$AvT9WG-*%7.-R;V4U(ЏLSI>i|mTnT(/:7B^?ߚQĔgjsCbLNqhŠXKʧ NЉ%R_3 TV@=HL _ ]c$uSO$X[Fm[Yѽx,x-3oiwF']ײx+SW0˜zŤ~[UeJo<2Y1߂-a̒f z+( T.^etUT{ 7ޅ)~‰Z_KSe KnR wi4fB!cؽS{j ЎHSs'qlrPŮRG#C==\qjdId.jñڟl߈y7ۅiK e#y4iD/,W{{26rtM1~ɾ EO'"vB&lJc ꑌD7{}>M;zC# \nzZo%s/+؛w?46?u =?>ZUHhWM,Urc z-H"=fk>Y *$d|?Ut5Dej4!)$~崤Iۛ'ҿ+dzx~IU$Bt+/w"[# T55.+DkW7y+#1mF:?j(jDnMEib^Χ9躉=,1ZLLoɵǓq(GSfѓ<,>VtN|52܌ 5}yFNzDL 8 =%a8[BzL hB ƳD]EDֱ,*4kՀͅtĦe#~_C՜A ‚kZӸRZM䈀iZWfQcd1@Jfa0MUrO%M_11 MWLA(H?Zw)2LqJs0IYw#1aDlye+a:'baK _T}Ks„%sTemȞ*A8CEz+iObRQ["6 zg,*i1=x'%}$&x\DR(  ;։fR9OàrAYp[Y8udU|bRӤq4qtX^|X ɢnr.f-P3%j5 41CE8Q:?/%S_B9SFIݰ,ٶO⁶;|$~o"x7P@@/j-&aum?IGhkHNDD{B iMޥޟS!#&O",TP0x4je]5\Ԯ~aHQ]$ʼEAt"Ao2SedW% in DB@R-R KfO$cJگ]K a]΂g)|́Jؚۜm+h4 ^ь_x߃$ w`lC:!ܘ &"YJ4)F "cB>E$1/ 2OfL/iď4.:\X-g9vtЉDR$*#2d_7ZX'6Uf%6Q!ڪ~?#XRFE[E n/+)>KMm.FN^3S꽶*!H,.п`I4'[QVNdmx`FZ2ħ#hV#wE}2\bٕZ V[dk!}^̎1VѢ2Bko:.+ibkӲRKN=ӽ١/9:"&hiL^1’.xOFr."^!zŘѝELQVG)meGTz(f\0nM *fO B^^>D:ެl;ZJ~ήH?46Ǜro NQ+7 A'ǹNimyx`rǥ&*SFSq*5$2 $*d 'y=|QU: z.؅JקJ%,;. I=S&& nKc('"T!OJ R kfn ͘#p& d6 bG-!) Չ`nxm 翬&U.p/U¥rtJfDbVJ`&V kѾ-@SdeD%\, u{0bB$ â(MZdb!.L^ JIkfJFb PfĠ%,0+eBbyG9%GӚ2#}-LI!!I.P.B }w#qY2KPCLk,1aS$ɘ("x *(wbpMﳷgSYߴ, 7RSNt@ehr (ę!KNidH$*-~޾A.lAVɳMN٦x"Ed]q|+9gYMjs1y\|BR.&ݍl:eosM2IGgxCmN^b͸˺ OP^A(!6G l& 83 lPz8p.B$N\]T[DRC$$ XsPԶ~ot’/B6} a$| GoN F@CQWП;_V.g2ATIB34S-wءwa}L {  a>.$Cu޺ֻW+8WSnx>M|m~pkbxό H_#BhA?'=YjIy]jT\=un@6F62C(H(^`D-KY _qQ17 g^!Xr_r`Bb1G,U-y]\6UG4VGDpl <uEP𘑧P="D툔O]SXXAscW:Xݎ0v{O۠mEOS2ܼ[WgKy'N˴$poPEB(m*f:e:V¦zmڐTtQ{4ƛۆ]^u#HU!g9(4/˝Np8E -ۂRa1…19T-< )'Ŭ۳T fԾ 7Cf*CdfGoe$5Jq E)2I()P[c;Y4!}K^54G+lHwJV,t௡&"VD[5;:^u=hB_7I$=L+!j(l8UG/gWVRT4 ZNq1a#I7FGnJlm5#*" [2Un_;u쑳\hRGu?Uxu&s5ó3",Ǜd+FH8(^^i(ڬ u)fX]/P;Hɬb\F+)'ߩL%m qQs@V0 w Jt+rd9X(F;lQgLOo7T%הּ„ˆA4G W aڇ~Plc(bDҗqƑ[lh* Z8L;c .q7.:6[Ol='ɼK,^!?Ɠ F֬<4l3kvگ^-78!IFNhP,΂ᖥmx༼Gr_L&@9` Xv"ӹ(k#AUGtc =+dCTlutYŋ8͠$QmR| ekO !҃RDr:r1mh6!)*~OKPћ^![x)!jndg`ݳg+ȴAiYъB`4la9`m;~Х|R[iQm ~kmy,{/v,l5VT]Zy,Zu\Dz'@JN@2O9Z&.-/O]|\$'tK2G1gQ{4'@%]Nx#cGfp|74Dx00o$&1M3Ǜ(LTةd \ iWӿЅ&($g\vOcGy@ QM"\ͺCA'r%]QIP恠Bjd3='J_.Y.'vΉ*[NVK6EXTxKFu$MYTn-Sdtzso{-^#Z?dײy]y9ll&l1\-%E+QLJQ5PR'^tCjc77 5`B^LGӴMN)ƍ{f+R\VD/+Be =r=9fԍTn5bVQ3Y!ݿiQl˂})MP=aCdIԓCדk2E˚K N1$aNWoYVEh9'g%zJǴDrb-; |DkX~5Q $we!ڔ3vj^Jud ~F 8t>#dR9Dt9G}ʳY G*utR%Jgo' Miu#AIxfh˯5JJuk2Ha R$RꖃiMpL-dBi5mi.4n~" nEK (5>][.[{?o×`8ĀwG ֊!%[oS@Hz2ȉԱ"(ܣFm[EdYM2//i̶vB:M6p o}J>HCXZL2ѣIs}̯"1+jMrK#?V7K D Hn8VRGL6#Ze82qS]P<#-8NV[21M M J߀bpB2.ڧ [BOdJWO<Ȥ2 RRBsdN^כI<{/IAc:\DPW5ފ5gP<孾]YPe kyX" Jx@CKSTgx<'Yxe[W_*#;2uԆY #gI$>갑`Ĉq?@ZݥBrKPxokhj*٢aF pma!ȅe"V*׵|ʿ5%2EudG]CKy y̫tt3(PBF)* 2`tZr MP!ReF uHM3JǂfG8%>Ѓ12Bh+y's'}Nr;f~,kuŵu>ߚV4`_q3Uob-o, h4"_A+lf\!qV,K+>V=ou9 ԵUNO7J&Nьpg2J+`%"9D[6ʓpsLY]N]1gb}!!D%mJB( Qh.ӎ9cdN]ˊfRz( SrGMVjogGv6"I>L!-v}wj($dT|jh,;iU/D(5ߨ)4+`\ZZՐ =l򹁻zf1f"!&,Oǭ^آ}{K$W1e֍l2.Ni`dfVȈ[M*ko=14+ꗈ $*$~O7%f#r<$`#rnls 64$* Oj Ća+w2ef-C1`\\#F*PdJI*pJ巚D`͹J 7^A Ԑ&8g kjŢ78HCQ|'lT^ߟ~z A06T J bL@M`Z)RGeSăPH $],mt0MU5\{MH?/o%ww]&9ʭ* H ߮U8DʹxJms"[AuMOtʏ) DAYQБҶm†Y: \n9i%۵Fe-TR7Rdk^s+N 0x 2i.FzCqȟM P'N|&ɘq³1=ͻcƤ`"L]VQDM8jyVJE u $!PV xb_QEx $60 #E-A3P; n}IY{}KXO&:75 Bdzne]LXolkZd;пF#KX^J[FΤk65 6c#eVj1Ebgi:еѢ1၊'UI')1/8xI#REBBPEc*Krf HP*Ӂn[{=wvhJABfŝNFiجRKZmcRoR5؛A5 _.z_4 (-!W~5_Hw$StQ߉cLIRJDÿILK:|6}fq.sC ml&Gc1=ש^䆉UrNK6fVN)mJ<[9Ou#[n#.:㶴}"7yTǤ_|2vrj;O$\Y'<Y3?7M/gNе-GGEFMVҔ#5 \J a}$:Iv9?eLA620_7bJje~17|r6䎬~F,aTXZl׉u 6WVT/6:+[f[ʊV $E %SaLܭ1w!8lQ XA^flGnDȃ'U}vL;S`JbMڤEzcJG+7pxgbSq֬Jj,A]/kHʩӲ(MRK[ٜIJ>W;,[5nʗ7:ׅo gM)-4`e !VMw'u-74ps8]fz]6=$}9HG^C\?] C0m\m/r̙NW*?}R1~!+JJoZ&$`q)VՉz-]*!ef8#Fk,B)y1+_,}njIGGoHb]]$-|BꈸfN-1TFOË2+ﰅrES>d{""eMP E-nIT-~I<8z^c b7r7r]FJ3I81QA![X r*olֹ6 ?{YvwM {1ltp tLss2wqiμC?&lI !nuYZa4"\v<4zi!bƪAvb NBvA|<2aqq\P3 % +3wRL&}/QUB~i"zVi(ہ5v@kTO/Sy=]c/V-3[:@7^#))7BvD-~ZlR.]Ϫ% VK0꼯kp;q/Wv@"H+ia"<":CrAwԪcTHWRwM(g*G>PoD{L[&e$2?6N1m_>ۭP?2]WLckaX*}ûY#;2Zan^#[hTmp ɞtުL Q$!"#EҵIdgျbwrP*Ӿ7]+ w'\ߘ@er&o}^*TӋjXa @rǾ(#tqa(nogݱDF²"~XO(i%S2KBlY´#t p )Ѣ|CSK1l۸ Z7R>1 MW/s[N]pҕiEFNt\b{DT>󒒓ݧ;+&YKKx`M^1TB z}ƚN–0 vUFQ7ѾӞo\տxm^V;09ڭ2wO? V NlZ5(Uń, $q5_ɊWKGv:Z ޜn`YkaͭҚ:0"Ư|ZYf&XF.!vKYb솋k+y H7֙\RHϼ6߱6}]i]TB?!"bQzSwh:cM(=%I\EPLo90PzA[I5VzP$S':}PD|zvU-t & y8=!|ņ?dו9 4ŀ[xQlLdA̰~Xh'"H@{1fg.VlKa5ON8TZoL+AEiD&| bAj̏8RetR9G$s/YOxkfBC8B`HX8Sx, :ў+˭,GmFphZ75[9%+Suo҃Y@8ZxF]J <݈¶TLopB&)Ot=d{&Y,Jlק(%))0qBճBavkV3Pio%Қʔޘjߍt!oulYM2@)It1s/jgm?(|t{#◀;*X/Pa`'%8Y$PgHaAEأ 60RUDXՕk0qm72"8]e1]IBfi>iIn="yS 9ߧاpU;^UG$-h7ǤYxO# 'jpoU5vb!`d@#CA M'\5'hkqhg K\P(ASE݇|h R*({)7*J]HA®˅5~-Lv#j=yZJM[q~zl Lk.  0Ǔt}g\”ωƔ9bO`9J]zʡ}}7)BNV{[Om7eQI*`SڨqLM@CO$IHfJ0f(],orݛ 1^ eB|E$=sbo65 ca{xMk/ȯWFj, ^/kYbPL+ $,x 639+ u[fƭ e_.7abjJ&w&J?`:fEʌ_O5aR pv,O\o;8YK)[,%+5+Y2e2sn^.cZM8,ܥ;= u$uJ*t|IrVjЏϽ]~Nl,.и<*uwF:e3ƒdW| ۥ* 1=DŬI .IfX)F -zsy[0MД#1r-$P;A6PiAHяWab@jNn@O$qShbELd723'uynuswN%8FX \8mQ# CAH(_ E{Z!ʗ4 |7ᄖXx$՟ VEi&$CoLEzE'Gm$T #ڔ |qIaوϡ[TO@ 8Ħ/^ "## Ь)"[l]b-[]{)oR8 | p&%$`= 9bfHI(SQAMIS*Am{քt@ Do3mU Dх(~a(XFy:Dx)(>a'ZQaFFߴ\h|V cznT%baI^H%*,Dx&e[3*zz:6XgfkH8rk' 9h`,"!w^E 2wT'kr ̛VS bX]@Um9t0 &- $BkY#0"M|r?eE@FI)#̪dA!7M,H6S<5Q_z(k/0b<} X 78@d3Jޢ< k4)vMf`Z_sbB ?G:C|`7bV/lyVFЛn+n 6Kug4\F~Ƃ ~ZOt_q{P8!tV%:~De X BڎNQN髣61)Iߣ4т:bDe 508Y1Ms6Uw9`w;|Rof%>B&M9Ie|<cOZyn"I:$$4z"R߱I굇,k^)ryb_]Xˬ&<=ݢuLKmWp|5@p#23LRL)–ܹ$MV9/!C/q*>Vvɲj'~L+,XJ|˴.&+dNԊ4!jir0AA}+!&p? t9)D1c%OOՎ (9GʆS-* @u7_Ui}`:IxzN(N/^ *HATiIƸO%\CG!'M)-V"\^@'~PI(|·J@2DVäК ŪT OG\ʫ&NU1DXP%W [xD ]noP`2%/S.RX$]xA%ij XvL] ?T"0fՅ:ڠ:MX?㉨e"bG +B5~l2!!)̅$kBw 25f/wgZ)EJ=|e{홥40GD> "WhSJX;4H20My9"`ݧwy~ ={M,х0ߓqrpaԿB-b#-Ďݗ^rh79k(Q9 v)pEoW.al1&왰]d$%<(>q<<|\E_jIqR,'?&5ϖ0*,#O"NqxgOȧKӿ{|"ǰu4ɓݻ!9RzX09y]4?}z) a`GnCJ>RtWhB v!GG)cH!fmk(D){PrP؍͎Zޥ-Tq%bvcUrWZ8̅UxjV)V, zFRCuZc#K b50]$Ml`Ѐy' 54>Q+z.Ya'L"/.4U.1DӖ@.2PA+/ZFn~r.H$,ҔP{ܐhaD-K@Lۈ&gAAR9%Ԍ#I;96_PE,S) !1&ćEqr-nÄ0ZM72IljF;zjwjb8}T{X+FsoPW\$Ԉ%D7yW s0[H/^6~JQ1Rk9|\ $$T)~ԻtඛYLOoXٻIwH&ilK XI, Dl|K\0d}20LM O5Fch9 48.p!H$ I˿M$2*"~[ܬ8̧!aaSw o+ie[ HcxQcBG! ^ JEP,p< OGɆ1V"!#ܻvQJoWMKD$)(P/(kW\}ʨ+`5G9F.ЎU bm5EXRd[zs^kat-(.YȈVתp$5 K$TUp&cPӷ4QiH@PN!%*w 𡧞 2 ~,Or'7g-V$R-fb<-],+* aI qaJpt G[5&2G\%LypBǘk~KɄ5tZB᐀mJ,,j A9ҷ$pi@GOٍ$'j@/ p o{ Y^@clBf )iHŧ*5ɖ_bO88Y( 0~oTcwLpA3at-<'*#s9*"mtD< Y2XŘExڈĻ<8 ڕ3"模v}I--1wEYX*N^FYfLo:ʬN&ӗ*ϧ"*DTXͲ`oN$[q/,0`O&aM<<`AK.B Xףb\T19|B">ֻL*2YfuD7:*3Fa2^liX]fؿz{ Zd%1&qDl:Dzg&OI($Ylb+ԕ3D:۵UxH:fDV$_0tqǩ|x=d"&0zg A-jwY+~U $yOerb:ŃYe[B?MbfJ?| L/vhq~ c=#R,Hɠ*Ao0Ks%PҍsCOo~f^T ,7'Z]21Րxa=d) 1G4[$pUR)aMtDwߑE){9R01rrjdtV6^ tgl[~°$ĽJݮP/r<QLzЀ6 S! ي%4.`1n ۬sՓv?7mCtkYW4>=fsoI&dSlR>RwPgl"/0S{zys,N{i%Ui"V1TƌVk:AJbz-ޮU^E -9j\g2oCTf[>>mCf $$0u$k[gH5kIp$:x{+dX2η"AFҚ. dG;:S`2*F7Qz[&d{5$7Ћ-ɈAڭZw0 Q1ZDږ9MsB'QZCc3ܯ nX^l$w݋YfHz>bCe7 _}Ч]EJ_Lqz~ 2bKťl",U "Z]7Zzb{K\-3Azq˛n1ɯxSMP8܊8ĊmV-#+'+%zNMr98wǍ rPu҈aw.59ZV/O!cxW(k #Bz  SL)wii_nI3ޫ_\]жPzfy.Qz1qHVM|j- /w M劻*yIb(WE!7 o]N+r\SdGykBoi8ZD qy)$5C!4eÄ57Si7t!"of= K05^[dm# SX!t$Z>.tY,FXJ ;*wZX\y.ǼVY֤ou} |)"'+"UG- M -(cܙ-.\p50o)) B̑> *I{_V}tqCFM"q%LI.݅̏!da&VOȮUU{:JI= ]" '!/p@h D#xghO}pH4Y{`PK[9s~ea/&rHP$yFgD:V$6IRJΝS^[I= NSX+ж`Jf">"e 5j+t|Ku-°j(rO[1Զ+}QDci%=yqgPM0ĈV"[m|\wq=>ff嬳&"۽y#gEC\9ZX@#L s/đ c BD|e>$%uA($HCB1lhd2cV3=)"RL^fl#Qnj&N%2IYQT}Sw8HY:ԶA{:Q*E~ C4 MNK0!nW(a&hض [b? MqE ?x'3($<"3[QrNRgD.Z"7U΃ 1C!4s'o(IQܘ%ף:e?/ Zi-g)`[wu Z:"gΊ荤_Qyn$D&Z'%grHW$OxTmlFBzZCl$4=Ml nF[8$Nl'¾ТQ"ԆP o˃532]fQ>A(^7Z`vaIHYFfN(XQ q 0h JV!^vw Z4v+>Lڬi 1-r˲&~ o(Y:c/xS"/+0_a[obP;*c70𝽉3ҚR ?MQj֑ufarM]c9X;Fc( D5[-3$(#be_&ȚDy1UVdjI A/ 82爞a э>$_sx ~x3Jj@d~ {G,4JeP;!r"%Ee\-3?-6İ >i[ \=}q b6.0.ffN;4c bD)?î(4h=xL _kF {dYY݈c,$Hw$ "9 5< NG2 yAohya/B3! Pv15;|xoq7wNOs ]AW?$X(J_Y&8xhhmUEkQ YW_mVMwTqN1N)`2O}1@30Զ Dka~ƐiQ"Esa7 !_|{&ӏt_!_pk4L i.ĆRc O,F򚅳.Ѣ["%ea e5鼩oYWP(:6j,]ˇѩOmJ]us;rbMȱFP)cx^6:G0QR`KU$)|/!l+B$7 YVIY~?5}IRTFI6 ljd@Cf%+)D4wu?s,wT0Rqfk k#&$5P];@eΊ%vE,-Ը&K&{LQZ$G5523H5rIQrfUn馘O8(Z覆 -Ib[dX) ͪ 7+7zV Ӟ_,aH6MKv hT8-],:UğlIa veNiaT */X2"Z W u@7ų-Eg(f6xr1f攑2}&l7MD:]^lA%-jw"MLcqUW@OO WZ*u3t%sfYMIYQYN1!1838̷Xek H4q;-ĸ[ fHWtN4n:-tC7>E\[`q⮌ƺVd `ST / `1bo#(N "jRU[]T*=)1=VȆˇ4D?=Qd^gI=II׳T$]yyO)cu5k?6o5-#ހAL}nKlt|B /!W%YM.U@قG)K'ItD@%t W^Er8%S܅aj)KhD)WCDZ]AY.%Ε M{u+uJJ4zVHu *6>Nd|cjiD va@N sDw -|&ײ|wmjE>ʎs$8H{AB8t 1q\0娏&DSu͊( ­9i[e| qClQJel{4C@zafˋSIk1)w4afbCL61kHwԈ$,ȔX}|uJLOzh)b _BQ.B2aF R,Ǿ=l75QfISb5αSc ^+'ZORj|<$.ZNǐWxpeLOJ{ lPsKx"M1h[)Xou(Tn#YE/t9=o+-Df"wːӖlgwcc6LVg@y "\۹xTßw)1gJ5% 0c\$$ʛTg~YOOe{#_'ˁ=ׄDbWElv0ɟu.س[̚I"Ǻ§3Vc}9(D08$&v,Pw-ro$'ULǝM8#h[4)N,!M໡W{-؈bd;B`y #V/)1NיNe;O۳7`h/8Adȅf[gز16~ڴdpfI,wu+jY[s6Y glJ03V4Cc 261WYC"tu ]/IC ޱɘ2J6ZWֈ̩9) cE\G|q*TTڙ?PIOyZa ޙxx*%V?;Vl)6OMY=Ԁ֨UF\ju@+;|Vo@뚄 hg/> -npRl];kM`2L6&2 Ddr+̤J KT 8sgS{8@VQ Bɲ~X$YoU/ }|҅nIYy)A1cj3Қ^tD'Uop?r\-|HD.`$XWQ^B\TS&QRQph'I]F-lH¨lYS \2B1$3g!r`v'j8P92z1KyǤE< v;]҈"H|,TCa6@è&*jj9TV D=*;#&ukF&\II8s%( 6![mT&$BJ0X> Rs-E/?0.QPac0LRږq?5ǂϛÛP+w( O (#g`ZjZQWŀV,-Dp=QC!C.:5x2޳!&-|NjH m!DKę^+Ոu1@dZ; 'ΐЦjICp"ݼR8<'M;3+{]ԍ#]Mi}ϲ(OAw2@*9M2U/1ZVWJLNJK(F9)exUbuUhXءb%l͇؄FEc%w[dHiQhQ:ʂ=\G.S Czۥߗ.#kIHDu a'4y IXP%T1م].RNȯJm|g7xf${y9SmAJA~o7Ѝ헇MhQIQiv&K",Jh%ҽF3J #ߥVˋLuNJQI]h=(Dg|//I+r! E*KfJNIm Ϫ/gsS-qgviW6>8Қbc[VXtEԾhÁ.x,, !oCX RLW&F{nXӿ@τ2Q;6z"$ ",EhU&LuCJ;_%Vs'_?E3,̲!l-chEIe|]HsM$k]|H BzP%>]h5dؕngmQU9^pXQTğy4ʷy9(5*#Xe~{ B:BP&“,7wuV6%S͉vbJ֤Cޓ-y}uռؼS}O7SMǴ ucyß@M,AXc!A]1\G%3#Fx4+*D$ZIj.@? ΒTG ~숈_I&?{*ږ Y )Ąب`Pai) &xAg@u? D@PYDx`weL)apP $[;pXQɈ: ֿhܱ}# MS a=w>$"b$7:~*m"@$]1Ru^moQe&Uja*HlJ)L#b9rɡ7Tى<&2?TxXCWƚKl+\e|qRٲ#9*R A{U0sVBJځ삄tauCbʐPȏeis#`-.iR@@| J/~Ę.e*Q: ǩH,*IPS :uXxNn 2cm"~>5*ۋIbȀ(8eHiOIBs73G0:LرNh”;AGn E,\U:A}~'[*NH-@țkt&)fY&rQ4 &fnA>)P^)Y!A!7,˹<;elE$PGsW"֊M7GR)ΟMu XpvfOx9)w޺B2 6NUW! ֢Ig\BayLnK=A[A&5WNq1Ui&"[M$i3_8"l ] ?m%p?A ""Tu6#U0tV͐R 2)aA$ILr315#qıwC#TD|`k.[E(ȡ#za`7EwI9̃ kK8/~56J0=:]  ׵OO~,z\΅V6)?}^K.+7>v;ˤ}$Gm]BG!H094>B9\v"*LKm%~tT1$Up`_@*Ἇ$'$U0"Ei4reNy<* v9_6$R*ʋ8e2"猝Z7`PQpRȧiB` 5Ҋ^ )CYArqDJCih0<#DeYQOGoF7taBV__$.g;* W~U9R] %d82Ԡ+#wp^uJY;Oe$--粬@`eٔC&&"iɳi dڔBw ʂ3 lo|#2YpM+jČQƦr1$MQ RC9}Ȓ8{esxb.9T&E޿q4ՄK]iߋskD92)<F $%BP`="ɘ"@dVT󠈞0]M"aYAfnLH AfLgcTMU.kDf#OEq_94\sw܁P_+)(wr8R BwXwn—5o;s]"g8LJ ! Ј܄_h@Tj|m1,"%N g`aEa{aO'e&y_֌OoHdV&S(LL^T0@C~ԡܸV-!Ӫ9""*v }YGFKr4p28CXwl˂jcnP$>b-घƠ0[B]=V$T8l53Y?ٟ8Acm",D9'b%]JN>=zx1o4axVc|(6tLY5]ͫ s2H@"0xb{q!=azn~EEV1pMaNPj.'ul*/e<@kA.mkP0Il%*1&Sc'~"P*%Q"2G")UPW6B}'}yOH 7˂IcBte2EvzdQDSSvo/ oP=@)z(!]'rGڏ;3ThH{+RA%J5 )HVFGMW Z2GBhAN3@I"U10qLBA~f8vše@Wz2^JGJBWmSoƒ28" sgJ? dAHsdJ*IAj'wp564@c{"y:m(NE39cʰ4Vђؖ %*lJ B=7w4 lbo<L ٵ;va3kAE$*.S:cdh!t^{zVM}7<47;"I1TDŲb 7gM\[O)<d:>*1D=ge^,<)+бr%%7б-A9IILA12hx*5x=%SЍxR#b;=$m5:x=am8! % ޮZӔ DX`Or=}4Ąǭr٨?2 &P 4B:9_]Z)46q"{HFA=$5sBO0|vR*#7G]UH4wflJ ]b  ٓw)u-|٫_胿Y!;!26s}*QaevQF!{m(pߵܴ9La5wJ IUy"F^Mw0v`P4"ŀ^x~IBhR- .9LQ|V_IJWBBW|zLtxqJOߵx@ )KXJo"7J$sթ?8?K 2;2U ~fHƻvk&E: `'ȓs6E{aiSwLj26RoCb`KW+oO!%]5>m- {I1@, A Y[1bZ.7QhN~G 6Ѩ4071$1at>YSk{aT)KK\7D)E%)p=L$CEk\e0n-)r68gjdCU2@Vx1V'$5Eev-D(A">Cť䫃)bYELE>%g1,Dd#dE=4ѨE0rx@$= يf$*oݪHSzQ$Âc~[2wwEAi7*Qtp }PL0?%Cs T-@QMAe=I[GpwJ0/G|S&HtCyMѕ1}^IRg0@vƪg1.! bdFtAaj@*Po:cp@dx|` 3رk-"PRUÒ 48*M;ҥ D~eBTeAvIs4tn lͱ6W<3p9 |O#v+!.&R-VآpV{"䰞yglh+5b`t/p3WIǽқH,Uߙ+ja>N^2y(>NS>i *ӷř '#c9Oi5{N_V|hJkVȂA7T)›'vɺ Vf:^ԯuB<4Ν:9Jmזy:yj"/m7+{򰵰K B .8Y('`'2j_ Jy sF:\i\0cq)En8|C1ݼ" ڪW-O WZUUW!N`XGRN+ nT8sŁ'p&N#HcUEFVj;`J R'06;&8j\xvG>`oּ*v"w~j5@78?aUf.(lGص!K_Szq85^tPaP pp|->oe^//ZiJ1 #PsR2P<}Q,)-}}]A:aQ`ȒЛW ؃ 2EB??y1H@Uh^Y!k4k61Dٰ /׻^ucWNS!T[SeЗ IѤ4bC#$8])do9ЬJ".j8iR[Stin5LlW]31WP@2-E*"^\j'(]1?i_; ZδYZ]taq;t)f;o%e5H B%(k><,X{r?j$$3Cs (Uo)L!)přqvZaB?u*ĩ:1@,kbOsc8 F9nwoBN;Pʲ)vomNG﮺TS*߽i %l\BiЯKK:13F!LcDʂ3pTϒ,hfYF#ҴR޳:i 7"308pV JA_ Rd;RT[*P֜ YJHmT e)MR-T~ yo$5bWd.4ؚhOJJCGJ doLbR=c#nWvm9}2#[F%Ѻd4.RP_U jI5Uф*[k6zuDꉣ\yR*Rl7YdDLr#L:X|]xa)hȄ ( eqT24'Q/"KZhMi"V#( Dچfٛ{#f)lL v O0/]'TgjTXъR-O!kںjj(Vn{>ZI!\u}{sJ|a\EBN.BMW dcA=ȧf]1K[ CQV^'rVJeEڗc>h]8jH=TľP'<2 s\^2{=+3u?q}]YܨXv (4VS-u@mmWx}{)ȱy^y1Yo\D<F`ztq~(z\6LyJ)(v{4? H}oP$JE琤m%=桦N?8YrzaX/$u5ػߚL̠'ĢR4ȽyPC1H#}( @llr$UN&"\ fzҗ];QƸLRM-"'R>\To3rp?.V?iλ<:K_I SgDc'&i"r#ʐp-nُy\m!d>s׊}Ur׫ZE$d1ߟ΋_ǮB!J|ZHIG^x|y}ʞ%nc*dzTf)~h 6EA(IzB*b; D9piZ:yϿs,rX$[?_u"{voR9jy:VM䌠=,ivW/ :pdF$iZo2,V=?' ATy#N%Q|LNs̡i;чa&8\JDE e+[6kaK (B,3aSa!s~ P:FFlKՃ4ma|#Ąm_RTc\^4і4q erpMT)qG1)il\ H#"!h\bN` CMkzyY#E\U"7ψ$);?=q&)#kB!Wh0?m?k @iIY Z!:$YQsd,bOBOv2,Ń ğ>~ԺdAKŤ=KsYSj2==E1KvOm fwBxw_s:) 0; {]IOV0%+̘hnJ7ZU$淹f.XDg!BS2M$4Fnڣ$qoBԭA../#=؟ӝmGWKj|-i$bquBBƚzVviu^\΅pA, ׬hFl`䉬eac_gm;>U42::ip3 RYWWyH -M&;VXLOjtR1Ve4'ߏ#{W Zd^~dAOB$!Km\aJˎ}WZ!*tܦHPER1c-X"rZWY# -b4msg 39H}Y-;7.P:z- sVKd/ 8DkʧkC"\*ꔂ?QAxXj+'w骓/ek))An jYZ, i+{!,ӷȝ4%z>;W#***IT^+7$غ8 ы@ =l&l G[|FjCe.Ls!T%RrksW'{z;߬C~IIl|" T̆/CjZ GS&!-Y}+Q#]S8U93‚4")zEp&Uc| _L8̦MrX[tBqG\*ua>"%MQO=6RXl4߾2Y߬QWFH dJ׾> 8"fFO/9Wj b@8:?}&pUh҃'Źt,qCҐ^)3yzԁ%3LR s)*|ygyZM%lú@p`yAk=b~=TJ( H^~S> h@w&S3GeׅОP",{k&ؓ 7'9Ib/\,zlV(aj"_'k/2& 5ybj} t8wcX&9X"arOIPWwqք?bo[[{J;NPwv__- fsro\ȃB(6Fݳ76aoI_2>IxQwt {ӕ1hY\ 0~CChL%rՐ?"q%%7/EѸHrv6Л,ӟQ\,tO.(8 1P4.zvV[23 ##(db%B&u:I"iڋ)PFWCAPNAZ+2B9uj{AuØh-[>ULg՞x9!Oj-gxk:v-%oeĽA$qoy?<B!A5^UZ{`^ A$J 3`S(x*nu^+H ٬jY̨BW) }EiLLdi8 Cؖ3ɠ83$zG1##نݓYc>O {طW> U(ѷ=d!<ϪHj8EvU9\8{B߆X۫m҈qQ+Zvz1WZS$``+fJzGD[1U"&G:d}d\^ ,?{EȊ}1˜ϙ.v{0@G̺떱fU/tUͣ-sv+5ޣ <߭ȬwI)EM6.e<Xm/bVO-BvݢmbI! F#SrGG+:6ZH&g|T 1jw%R1enx w̖]a9feA|9^Egh PXaU"!ѤbD9KN_sv48H9Ą̈7Ƽ KF*[٩v .- 4o,$?X4$8)ی⡈EĠRkoh4d#U=vLwB%Xrקì.MRGCF.T!!(J"FBZ,^/Wlm<,YN}Yζ;(~YEWii ,r v/rA c}FK}l񆈰rO!I\XCkyΪPE\^N0)!K;^1OZwYj 0\Mvjm^Cvd ){g$jڬ {uɗ_8:9CRjZ*IgC;Pkb#VsQ.Iu\ε(mnVP܋)TZzQYJ{0HaOomJ+*-R6hI slD$(IBYF;sY%F/nMu+fW^QBZGy 1^|'q./ͣg}@D z ڞhTj?#*saIC-Gl8HYZd sSf"18 S#2g}*Yњw@Xh =^1 y-84b Va:<Z. slvxݩVN.L\B2O*,+abg.;- r +FSd]sv(hȚmu? Z#*'S)곯i=ҏ.pi Ws]|lO?F'7D :[)LE ~lș J4(EKJt&n1%{n=Q`/j?ƉjJ1 2$ڀw&_7Ob IR0iK\%Ż4S38ᅟ9SGFD6X矂,W'DjHA?\d."jU=]ڌ[&=_yTª StyOXj?"XM<~d9˞zo K fuN"=+N xA!07qJj 65_+Afiۅ'+ EjZ q2_(XLal W>wN!LkqVJ&EJ1B&sg?G D }#1&EyCF>R9+ P6S|YrbVh\iI*{%@I/H*3(3b|=;UbI+`00ѽ@s2A{/[ּ.x(_/;)w$!7ilFP-ķq^h]Ɂuk6Sos::Z SC.C(fl:.t#XYݘ5.L!_^ 1ې EwJ] |cTh1$xsdCⴉIlvά gBT ZkۊL%{J$%*<|>@z9!jW[ _Rݙ$A/WH~eB#!N݆&Y*_x4I ZMxpuie jșl^Pi ]{iF5$b g ֝5!{"y:P+bVуxhVZtؤE,?:99_8!ǖ5RMr֒UտEنcWW:9BijpohM^ޯj^60ըIBV"-((-d2m(,!ap.L/Ԣ։4kb-¼P N1߭I=N(ub {ޯq]ӝg8]F+=йITGL#𮂷D|~olSYJsUk5^yyU'pAg؅FM%iJh $%½mUoqw$o+x)eZxB@S"uTG4E!YT`.b;+_jlؾ(UL;Q~Q, >`lEWAiG\ Q&$tbpdK9)$SgM9mjdKt^=,3cwC5C\ K #'8<"AtUFH_I)5g"|ĩ̸Pa=j1&>-0xw#=ӿ_|H,KM/GtMZFO  Lt>y],N[QS$ k@~ Ӿc1v+}[]bNKDt,6ZP,9!@<՟.}!{ RFY\R<s9^5_aEQ\]=bWDtI۶6|Gbq8 耥{!Ɖ5U<%7#o+W}fMk~^R%[ K.}W9z1iȏsl̨8I{Az]5ˊ?G%NK#vc g_Ϯ1IX" ihXMcKSujъcԽ&kƠ/wfRrV}86м,)T2\RVO22 :ܺ~QiHZ9orS[tW*|Nğm9e5⣑|6(vc6XF݌'FstLiE}~E;Пx+^='Ufe8 ԏRWvSe5P* 6lr(V-WJ/ K.BXlWWxG8X(Gɫ+o5KUֈq3;00*HlHh/ȱ"Ad̓pXz4$޲7~襐͈u2/fy4fXƃ1J&[U.>oXEJ-u Eˈk]ĥz8{~<LBlޤ%-d-ID!L$l2bİ# ﳓ$(ܤz+SWLRخ'h*Ҵ*Pq Ni 5fFJݹf;A2>1Mt\Lv@1?šI`܍9J"r!)Gꂙngekϡ w[؝bn%QڵpQi !Mt<#;xj/.G&WܸO_@S,8DfusG+++ ʟu@ѴPfj\TޢwwN'70)FyȲ6 bZwd͚_vX@u5:Y~[nG0$D 14ܢow3UHz8C@`d"2SpϚ.ѓD~=&F[Q,F *VhȢO@Vgr-x+[Pc?GsÞKo1 B\Ppi6+S:Ô("vOŐqA#ƥa)Nkx^f2hO݄8oaw-'"1_ a1 ձ3B zk=Oi :27\3&X`lIJ /+*&wT蚁*tYq$3H]'{KW&52 aOKʩHؼVN&b+@ Ts4,*FK-Y0ck.;F3%s41.te)A(_ǒLqo#4m13fQUu˯RU=v+PhTthfr釱's9&mVE3:| T.JR]px'ų^Q~%6ȾY!= "yOJmanӎ⑋ٷ ,kFEt?%;qoHmLL+3<0u{vh-VHMl ibLwz_dhZ4dْюqEtD0Yfw&Nd?BeyUNZLJ# b^aqdFexs^ , )rVļE&^xNO6`<JA,cY^RΉ|lSAȕ`-bFA׏b]rBCC&!ܝ!tÇ?t .F*"Zgk!'K(/NԜ=,_Ҵi\B`󤝒LUr+նTo<âЭG Rˆ9@EU0&V(Y$km`UE?J8KO } l |o[HdpC&pfFOgŻ0fOuāx 'z&KQLmZ* + Ut&7 1Ix:UwR"_8 8DY-ZbUWjĽBE81a;c0N$E6Ԥ>ϊL py s嘖B]*XHOPSb!+(w\!^h @(HI%\pQͬ}0S$ZzU;DuQ;tI~ЩWl|d@W0\b='5@dAmo4i5wD&пgQ5/d9ʽ@IPC3B +K莁v|Q3fON&UY'vkaIIM) CMv:Ooxpهߊa.&r׾ c0TU#ߒ*Ki.?"0:Ī(+ʣ&}Ok|J%LMia?Qcxz)DlXyD*mgCr͟/߳+m(jۼs-ӝYGoH4Rw:W~ l% y0XлjGzmJMUhlcnaX q"Mmʽ66Auku 1fnFwsG_Эغ_"ӯś@po֌տ+W)a0!JVpکŋo!j*f'_8E;tYNUn2H-)3U7=(D(xJ;EWl Qnh[z0BJYi}Ue]dVio^`<9"ڿ/}?Jha-KugruW0xx/t?RI&b ѻFS#.ӸtݒiS]'cp,JK)⭩]&D$zmiWvg6 [XWæ/yL{ܛ t$Q!"9ܩֱBX$T)饄;*ݺ*]4w1*qw %= ~6p bHN y]"+,NaaA(DԮdij.3ub! Zhh O/< CXqN|YDufAݹ1 oهl2S,r/pGFEfN2@!^.0?[Ƭ( ~Vƍ .%u]X(NExf"i,clVr,2FWrUT]P}g"* jEq7-J@YQ#7܆'s QFMamByPq\>Qҙ!ӿ-HJ-D5)x횛,r>b"w}L'1PY#I83lJ+"DryB5)-dҬ[^.55/-5j NqdO]kg3_蜝H@x>bYQR&=8VqZY>uōZL9K]_v6KIġk>{3QBvKȷ9b/Z3PQug9Ld =EPU񼪤AMLF|(a2F$5)p"w  ԄCuvN4,h{H*C$8#Aa@8:t.k_ʕȾjsvAp$yL 4KH9g;ubfN8RbL{ng5C EnCʸ$0]e̫@k ;_"Pm5.c{:@HTX蔎GzaNqAzkYͥK ]Yl{v! W.ĦenWbCfFzk`huW%4݊E Z1g}%R>3h AЊ6b`9A71@ܦQ>CPr] Ba!f!-t4 (e0FLxٷUU7a"贚 Y4τ¹#)" 8p,S `!Bpq#sQ/$R!Ul8/Xu&{& iM]c_CU6vo,e m9s)ɞ#ngĵ <\ ҳ8H"ٷm/H=2AChg+Մ*WBMiP zꉿA`B HϜ&RSٝԣ(շ6K@0|46UY?VH Bs^"YT9FFR YDܯ^;pi #Dge .Jl 莵;@AD_(,%{|UU0"s]mR2DXe_/r_mM%AHmT|Jd7=v.Mܓy߲x JK C݃5 bnj+8A(8[N2hz 6A DPmDziP)`%nUӖzvb鋇fZȪXA.+G9-ݚq$U++*;VȦ:]3ȵź{ME H#{z )Qn)ޔg2|'!Q9xD`P4A|d+$̈N6MZra(yKMF1dF)kٔO>A7OR.+H}iaURS"vNߏ]%8e"Fnu{7r%4VנCrLLd]'Cja=͕J9`ZTLַhJTx,τ[횾|O!UqbGM1d\sGKTjKH(g),~mJă/m].P@hCx X-B4Of(Y2 m#Kn :A/x~{@ƋdH0A޻$PHMubR%YȠE;D}kUdk!+O-MnbH*ȶIp˦ FImrER_+?E_8z"#A@t'ŮQ|gRz$ǑG Ha$% a >Op0^J ǤMZe,v@Nl5lsɇ3fGŢg;I0y2!!0穤dꗤ"ҤDc$ba&fvUr*Sڻpa-1? 8>R=ǸD"'? Ӆ<"R*4(=QJrWdVňd )јK5䥹%Euk-A옛@ vȀ׭,Q¨j ^ Sh1 !e8O- MW_绁 sE[iz,{]H ܗ໴̾^ Gn yޑJLvLDbmG^LƤ1kĝ]1{ 1 AILSX$N|ɸpWb7EsK 󂔒fTAf*bi=<g)lU 4v"ձ}[5Z\f*%^OQظKԐV]Ê3"(/f-P՚夤a(d{ *j&>8."͝{=)\8RX6%X.5Il{G[AGm C=Vfj4`6k+cHM-i_[4ɶ4dan{OSPX+7ƔXb!S?v[ҪFtQϦbʹzGy3D-EsZZ#kJlQm*olF(r1(X zTՙ#!/EOw<JC?`{˴b~iVk|23F-p`QgU<1F\QyK@ңI}%L Y KAUG&׬͚VLi{|MIe$h8RY rme&ȸ-r bj,5s?h1P/źr}Qڽh:&k+߁J V 8C/D1|R\ OB/0yґY@"(PB%V6EPyF&ȕ@%.4 nc; GJZ+6sw5CK^P Nw˅3'>4ЂV>nD3 j6|PёM#G:NXE)p,gVV쯒Oxdw j 8YGIaGa*t:UyKthNJrRz7fah"TǕBu0(<c{̡7' D?{VI576yW( G N{X,ޤ{'/HPQT" rY?98L7l`*&.(Qo#BO72qvqT8j 3RN .nBG'4F'TrL]$c=8_uJ'nsǠNJ2 MV&0եtDZ%Z[oo׆̄H9'tGrL` tĉZor&c.\iVF+wF#3z2n< bjJK0&eIJR:( ڶةª %gN3)_(ѹ}-Jkmȉ3]lKUZ%g\Dj ieuIW f|~tQku~:_2B XQ"uflY xؕԑӅs:kQ-Q!xnQQzz.([=X22V{ﯟF7+M $]b SHv̾NNs>*1n]\8$#S]S zIFݶș$E :r &HXW0v'X DIa[Bn}?(w$NfBRxڱ^sKjv%b`n&ThY"bxGЉ s۾+1cK aBIeh̓/ӯ #(֕O 'gi"B~C}O$qÜSNqs<0#;׃6V"jwGC'矊0 if[/IE<o݈8EyXp XЂ$(L3zܨh_5P:wu}ٷ{"{Ed+t-c2}`p(%vQqg}>0jgehtǃ&\_ , uwBQҧcl| Yr 1f>]>`K&@,<]MPBOxfGpT,>9SJpp͡*nn YMA PRYOe iDd.Kхa{."]Y,?h7NrռbnQ5̉"*MTrN" ̲.wh>LPH<<@ix?$4k%A6䒋<?rS|!6xxk|A$YG[vGCU"{O ;cklQ|, =?vz %,+Hd VZB5Cd-k6[C }%̀þ^ҥOyD3MN17+%&:'D=g]:ؤ- j;B!d̳٫+ccaUڡa24e3ELj^Ym*jteZ{YH(Dk V4؈;ȜGU 2Z\K;'?>dGQVL5ˉ;InApM-;i#i/"F9aE)Dqˤk\#ye[u~6/୒@N\:]SS)|LȖc'XSO7" 1O4|q8+eԱXtb>j ]Wˎg)@F OxM($;^,}Tr ljq=Qq *w)kk/Lj۲qӑ\E+HX$ X2JcΘ3 fYyQ 1&n)ck:oJM1dzZ~F[ S%3q9'pfK $ QITb}, KKRT7] 9.䧦ʂS!Γ&Go|Cn#}JO5#boq~tEawʞ]E,+ gӋwWo$U.ROk,Z I  ,G⛾z"씋.=ꮫ І,>-DQU[mKDaCCZ?1yDA ci +l6 8o-!sFW]e[t9^HG$).'4g[@$J:$Q^Dxh^W z~QJ5V!^S6] DMoh*O.I9\u2]?h3RNv߱ʩ΍)cRbC[@\..X\o;j YfXM+)LNyixY$C}@fNn:|H1GQ?ưbՍ E%/R e]zyi4񔉥̖ PI`\+˯3-ž#҈LUtpPF]',I[YBt"F*WZG6ֆIy$Z8яKw7]ay@t$Rg`ݲR9`eeěMI(% HRPRdV{1XM44 Y]n,]sA9 6y;BaD6v-):A:j1hea9薯 {CBe[Ӧf/96' l U *-1v G?Qpo(Z{"M 0C(1 {! (qÛbnɞm3T"-n{U6W|LǁXMdFMdtק vM&rlݯ2y`B2\g; 98*MdkCItaCyd SZ1b@ԩ 1[ @6)yT&'Cs7gS O\|Fr%=B U等$K?׺Wݪ_v-\\"dzӷTS2̬Bv)pHb8Oyv>i)=ZY29hfۉ2nAHӴ_QmVut=PJm~G.oka;W2 |4E ;!IVV@D(BпOFxZs^!B- c dTI#/m0\hE م㫙֬x>pO_&*kEL%Fe.{+5-; OLì2}6lȼ%1f)% >:(b+X@!-BVR% ~,K!`f2d|@.^CGA^g8mb&)WFtu-vBvUv<5Z7T9\&ZG^2G#թ%0"'>IY I_~nCI@L _%~Ȥ왫6J ]TS;ڊv*hrU +Xpْx \xQWe8JDьIKx(SӗAm*ȩ:6UFDJP+=+&TR*2]Z,gn9K^U)cVıYR 48Ic II i㱹FVv7Q:A-}00>VpmSTh °'!  :U\Ww:8`؀*2:̘A,|X ǯKW 2ReO8\V5nl{/&`|[S-OBK-ZјcRmQΏ T-ꭉ#x lW"0H"עS Fԏ$_] 1BFC 97xe LnUX?-UYGMF֑>bn qF̓/[zͿln T 0D(ԿX#YzYȅn-! XbU^ދ%d+ԣ/q,-jP2k,3X|9]R)게|h5kŸ4%%1FD˧XgBl *TCϫc ;k LTj9æ^_(iԙ>\A1AJ&@ Pm:_9?%$|nc^AtMX %l$SK(Җ(<D>m|ZyJ ,jM-I{Uh3UZLM& )^Lfyxߗ2,3$0%>ؤA ?AKiHA؂x{9׋oiuKm8ޡDOk`ʜ ԁDTme|a|sB0K2MAa\@{7 rl ؖtdvSk3NWF0hloT!T E_U ;۱)>ZL4fVbt U2c&m*FIӸ&* .HvF+ SO찪kvC#b_ww>ge&dܛ~t`NZx0ݸN&_0tZ ʺ>(c(^68sY: ݢa_ƽgXQzKQTɘ5|2$oB amZ\q,3| `1H7TX0rOXʼKW`^cSy'gPp@T(8o'GZP9.e^hR-Vb7Ob-rQu SMBEԽ?1@ҷ޶8~(ESMZ+<=NLR L0l`Eiˣ]EZ[H%&B/!#81v9fk=?ȧQBd"]_D4vxC[:*eQ~_pe(2E&icmBk2/pc83.?6x]γuQKpTm<#LR)Ar(!_ZUT:K, )ThAi)]*?r$KLUD2$4%ENg`Q&xK5 +Q3\~{n4.ߗ p&Hqh+eA;}nM"嶢 )!n+WedIϊ kE.E 4QsIp]VdXKK˄"iIP@\{C.*Q͠~DW@7yr&mHPQ"4H7e!~9"̯',2rTQ$9}l9'D1k7GniB f2Z"qk8Ix㻺*I@sθ!R#LɖL X e< |]` MiNEaFش&\5}#T7o L 7ǚlQj_@Rm1eq wf /Rlb F{82ˡbK!ŜJBюf {dy^a_%RJpky?b_""e2EzǔB]&޴Z ߈~/Ȱ9i&eFmA=¯J" gz ge^7d%LO Ikp'uezH$-ZV'49%Sw-l\A2NS|B~ Ѿ73G2zkUΛ-irՑCM$P9#zґu)u=Ik [dE]|i.Na7mv2%V̙T{-N'rFQA.uMPg\e@$ ߌDI]o%-]E ٣Jo-B!W"DgX$|0ɘ.Ni~K̏{q#3nl Q߆rJw4fT\w+)ҚrƆaBޗ _@.2ޑAUѫOx=tWBb`XnwC؄ۈO* LUgK Pdj63m*$YVߡ- pk/{ZN~ECGDU SȊ;\ 7}6Ga]U R's{x9t>y dB:et*6xu?7V=6_E-A L2FdSOQLx10h4NN퀇t1 aBⷂrŌ$F*kab (=^]QF@^Qgc6ಉ0v3y/S5ίd@^MW; Z!aRI)wN0V#ׁa?{=2^ (U{a$x/%)k]YJ@,g?TII\Yq&IlÀx<5 k!cѐ?H>b*}䯃hA+:8`cVZɺX[ 9Mb~!>׈˨GػW[@f[lTU: pV^mz \7Vo1i%q3~y *}V?XbeJ8n;pU}a (2vv~lEw$aҦ.a` ,b{&_Nf*@]ȲeOp$G)V#'w$?YhNvF$O |jwykx?c"дdʠI/?._*D-y#sp4}b4SZUɂZ4HԞ+TMޟTa@cq.Qj]AiY挢$\YGq>6ƕщ o88b`Oe? $ZWqx J/*Ƹi-^[QP$ub"1IHR=Ub;a#NNs` ( 82֗/DjsϠ"61! s W}6ޢ'13–QY9Ti j}Ufle;;n'5Đ]j箝~5VAyd{R([܀(1~s[B]Fm"?|$m( j KsSQywCMiNr߰PƨSlTbʊhYZ?@UPZ7%Ő~;~IAH6Rp-(N9R8ӊ j ©ܐhVܬ[Ǣ0svn)2p&2W؞Hq6l"1wLBz.֢(N"R0VD+mv,omxHLUаɳ'|ΫӸ֢ʩc0S:ץLzWc#mF^k ЪU$?|=)%[3cK:8hĦ+reJ#tfS2}_MmbogwR/bhޛ%i) |Vk-4x}6 ^ jl94ӇXnL`al&'y{HIzث,z/qA}7j)͈U\yZzA^SzG+313_ !j>I=#eFLG(䇓~z=|Z!$ `֛I'Vb&q# u0,y@ mݱQ|>Ͽ04rN+p*~\qn*3ȸsȳNIڙ]!Z";1*0cJZf8K\ ĆݖAŤŋL֝%^@994k"FF4v"s*{(\Jfq殔;'0I}J -YR%8;x*9žl!K-N=9D mz:DI0M*z-"pP5ldF[I蠄COY!N רip#fª @`ݬZX†&MnIGuHmu@kC:V֌m#.zrJ2uYiυxes'-v2dm$ZlE\DdA&DlV܀C.owY2%a f]H_>{@G^`(};̓Gd^°C*Cnދf[/$:7SSkTS8BeIe1r&"(prb|мF(|^g&~>m"I;u)f?El抚c 5w1SL$Dv?9W{b ``, :Z=y YBbqS;t ]ݯ+Ϊk}n8zZoġLd^vbRQn{ Z`F&Nfb@ʗFXįJAaBɚ<^>W>yu/&&c)Ғ"+qx,b{_N؉e m̹pib4 r)>0e"#)"=wT8J2Ue/jN_Z%U~_&Y^"gK&-G>֊JX`x쬷) MiJ)~H*+g+if$EdC-׋q*QC%3./Ț[tY\`v@sA>ڙgA0/gi!K'(2VۙXy܏gU1(E .FĂy<5SDLdS]7P$nl-<>McquB`Zm|1Mej/&wuz*Jf&Q1OkW˄JPC꺭2x+˔y%zHwSD=+GjK%=lHNys0oZ'3_Ai N[ *ۡ(/TZs~U?ո998.w`șFf՟-{,L;8F~inS(Z"KH$PbWJQRc3QtB2>O?lW)joOh7FIsXqTDe{w*~fs2YRt5j%Avs JڧrK@f)K.N'M)EnwS~8-aVRdO\D* (KDd@)Bk[KڽؖHEck}9f1#͓A$U\GTVYCg$uz~$e D7>Z\seT Q%^?E/r_ xY¥+#Do1r4zyQ-&[ XHuS_B+X)+\tN̥ͤ0$@?)UPflz sKb|(*5If:c: O>̝-Gg~9:Z"d/CHJѲ\s^Z-DlT#)Vn86y>I8qG]7OPp=As0S\[9ZVU)蘗[I]_ ۵ 9dVIP.WRt)ON{"0E5^@O[~V8:]ݯbx)Bvqv1l(")3D $Q QaЪA"f4˞l~ uB6͓N3ߝE^!7Lca;a۽" K򈌊@%0dD ށHR*5PX9m B/ 9Sbh]AKJTDjǑv`po.走$N^,iJ_f( \!2l+ڢa*CK_pVhis7 I߭A7-~ʸeŚH=jq 0ƐF9( B_S/K4nËؙq zMƥ5wlcV_iE 4^N2NiR~mY q^S/Cb՚<^ɗGYtk(غ66siރz"#J&We D0z[& ¸tXDhsc 3Y( <))^hzDwG' 2@N?:J1VXӁnH5I:Qheňceh@}qjaѿy9&K 2byD[$9:q4w,l[ɈiMME; H<+K&i.cAPI$%o[ üjCD!~ƪ~8.q+I{#(8})3eXc )l߄W+vʼnSq}*|p!tn^0l^C3ߡd(qӲlS%¨jIs%B@Owbv-y!UlŔPBEtF]Hz c!4p]X?C(q $i͗ ji9-XVvyޚ%h]Bg1 "i S+m?f>>GO;r_)}vqWx9qUf$A0ZΤIyL*;.l]*e,å0$ lm7̈́M OokESC<+bݯsK^G+R /|')~UTt,hXҢ)6]LC_|m/nRE$"䆖D%'G(" BBRdqT7taʥ?lN3"I [G !+/H0|`㰐;.~NVǥIJiĽ2ݙ,s[~* ҙ|H<əPsiwezv \-ל @j`fX"tWܮyI,k~ߝ$b֗47դ 8F4?y,IG Ztӡ;ZVX-z@eH-9_d{y'|@m%,p6C 7k.O28Cvqx9&ח>nQ!?%~IqLM:Jw-6?ad SCRlZuϖsOs7jTioyY" D?s8]*H$8Hm9l@٩[i..-1%i黛%Wq%R.I%8F\CL<\.kGvCMp ˬw.j}s}CD#N ]Lox>44 }i بe|(Y7hin#\c9_ QR*PdYe5I{k*gl핮iy;Ύ}^<1yK3*#>m!H˽Bb>,"WLeѲPŝZI|^CڶD5}6k|Ž_LNNoE7TJrB (Bt"Ht7ɈbSo'BNP-D2F}v$@_L`Dsl@gFK9DrS>Z4%(KI!x@UO7ܩ~DD()|LؚDA\D97=+Ze(Вgz%ܠSMg+܏B{trΊ QOC: ޢ8ĥE2塪+ݝd%sz+쌁,T|$kNmvt߮(d:r<-UN+_D|H~>pgaz@[Wl)`"0x;cmM4u#:wh UDžCOqrYZ)>!d!XBM9\]Am5p[Sg/ Z|ͮ"̌`(g~njq3;20tgJnbHK{o"7Iޘ%t˥.b/=3 =]e23mE_y{pV@$5lPsiXcU@.7L4QRԩBHja@ Es}2wI}ůsHZ `0o aDvBT1,c:pmy!#Ibw([v.I5;[7JӿZdFR9̧(Zf0M)T3< .I⃚qgDxp<䬪V%ۉ L(ev4*%XӼ@OMfU" }F;fo L՚'/@!9kWS뻟SSN@@%*\7u 1T(11O05"0ƃ? +PtXDADFhߌN] u=*@CMd^*D Ck I8,K#u@噗w+ʶ ;zŶ??ff0WqL&uZ𼤋͋No9a)=fǷUy?blc(Ԓȗ69X-AhZ)=U$YX7eCдEQ{-WBΊ~&GR=bPIk} =;5)GMHiq"@Ҳ寄Sa"\"\צvD\@}K\`1_YkG")epP E^ҙSy{+e#Uh[Z?'`%{'~ ꀝ^H܋ҏ4-|vݨBſ2ܹ)(\e`#4qd6%QJP-hȲ@B( n:@t_vRJM#3=5̸9TŸ4UNP 0mnT+TMF`YV׍Q*XJ٩A56b\HLlUr/Ldn, VVغ ,g 9E,!toD -B}V?Io̾猭HDnAQ|Gdx2VweP.d6AMW!QN:=(F}5?$LΪ>y`Dt+z4HC(a0.KW4+bGUsFI>8M}dqFF=#m-=.ZG [VWZwM%ͣQB"8JE6{.\\?h–(ȹ1:E\adOr0LY,'LWY[ߏ9?e)LmYY p^x"k nL0"y+I7u&7=3SEa>A3ؽlkŤ"͓5A4M;@Hi XqqQ( :9T02X91-z7Ϟp ,!"If_)+,ę&Gzy)t~ҬG3hpqZtLO?; _SYy_ƒhb?8آLs~WlՖ$em*$L3`kRDN.&M$e Z-2B>.eTLp$+io ԍflmشni-/'e~( OfBTss>JrY-ZxG1xϣo{ jQlIdjF_BsG !Dd?@ 8#fZnz'9钩؄}(20W(2'~XhM/OSq V;rb8bTW[!YH.QN"WmUk%}q+Yb$I2-6-􊛏2(Mm^j:.kzzmBhˢy5Y݁;r3G.“EUwWPvq8,D mq3X9 {aI1\W iUi!!"2! HѕAuU-8k Ko`K*G8 pxZ7✣|c.ZWpUM#$L Qm^ˮ4Ep2,' eb Bc&N9S^|2㜜I1@gBo $X<婰FEq2utƙ\#K`sdžv5;Q}R7(]9"cDN#U@7!ӯ3+H;#hR룧<Kk+Y_|$heal@ѢxQR`$!ǚ/fĵ)E8F~E/KGEH; !c'%rvOQVyG>;t8xFlQӆWf6ř15JK6`U!]tp#$2 uF^{I`Y\.[#_" chKj&Q)8 )d07cDbBmMU&olc}F:/q6i!] KP 3ym-dsGOj7GLGGFY7 UOTmx9]1JH>n3m1‘O !L⩋ &z<T谙q@3\LYyl8}($`AKHiOU/)ď{.Pvz <es~/~^Y Y:SbO'1U]v}*pJl=p:/ڶ{-e P+Q{l-L=I֨ĕIFɘ)PU*@ `dړ}EÖkEBP7$3dgdQ%GA.ПCa`0Ѥ&l[p ܆ qt 0&?pG;.?[v g5 GJ5T,]٪umֈ.\6Bv.>;­"\F,!* EsJbqk8Kk=}w>C֒F׻dW!Csױf4c'"O):HMz*UnwocI֢!i8TQ7!-ۅEYH]nuN /v]F ]G/T^;S E+PгsF,Ȅfܤ |sŐb1h31GT/+hI 셠PV 2S =p&t"*"ш",DCpkdQ ' i9BM$TI &cZX K'u@= %Ԧ) 0D`h3[QE\'@[Bѩ9 FtWN(!!{Kh3%FٯHBHmU[QA}HMgV as_-,±e>.(vxP&CTRF9QXѣq@)4q E0֔f9q\' /$,HñNRG/[Y)ŶW7cVO)i|V9sx[gȢлkC{F6-j/%D%--xej>(ۖ5Il^H`.^+=bنPD =c0q1ld]CEh:?1ȟJDdd❅ʌHgdεN1=t0wO0,1YMOV{{R0 bkIlP|S zIA9YAZ[t`CPUF \4%%Dފ¹y$qÈŤL0}ߛ|rN-*GF-$]dĀKDB/gFPq:׆ibTVYBsŮx d tDV*[SVM9.Wp;aes:(I0%JA{6ha&?M L΢lS>%vI?ˇ2uQ \3_khLId qdjZ@;*:OZCo.\(r,P1-zz@.#*+;.8"Y S VLoɢT{Vh֚u„ m,oRHs4v恳-I{Dƛz$G.RouaΙ+8ٔ `w@XUK8)UILo.5 C׈&U@Z H AHB&#/[>x{aZ7ԞJ`r;^kti\6MoI)1SmuK gvU#QVlGMq4?xHaeQeA/fgcS BAR TA3jkImX2!9}d$3L֋r1||:eِZ6@ŘJ#BFƄrYTy+؂D%N){ 7 ّM Xe0FjW?I/BDg&a˖:UL7) Մ(fekݭńV$m7 iY $(Y1n?3_ yxuZY%e|]hJ+-CizZ.:Ȼ;O f&y]]N>wLFf":wOWL ٦kbU"x $*۪Z"T{S8=RR{>ʞ '<-ݨ:jJ_KXҷ;#xm*QE(tP:M5BG|ג"R&T5DRsOsy'zKD2q=GM[1R$MX%3ޛMK[M2iJUђj||қ *ƏTƱBV엒 J Fg-W_:_P:CE|;Uɯ#6uUb9M ۢ2&)"jvʕ/&Sc_dzbGso$Y0ނ!cL$S/(*V4!VǛTr_x%d(7Ėߔ+XhcۭRQUUzxKĕ9MȇJ%wVŐS%V&!)#W{4kSѼ4|" e5n^l;C󫗭T&]<'eu*I#Y6؀^2` (zA!HԆ"2? P\.H`yr.*.TU&G (qf L|&H=W|̪ xG@BHXv$Ԋ (]C LDJ!nKo(yk6\uz:3W'+&Udq x5- ) B19CЯQ D@a9I|]_׍xt+Fj e_8- Җc`-[qDTS#~#4`ŀm Smc%7:e}盃l\7GEƫp.on9ԙI^™:ʚg$}qz>6RIHc`è3 ^dYgHB B-?t1$fwrVzg+9˫ ìMnά"a2IСMQi,Yq|W`T-ZZ\Eh/dRH,{+R1_=Z<,R;Յjo$ؒ0|8*b m']V7 _MXQZ!7lJց,yFR?iN=)V^=AfI$ĕ2N&ZoٍwdHtv0J]ɼ+Bʱ \>>/5}YݬRBCL,SM@V'|Գ>tksX^Zdchh&U [7=J~Xl4SQZa%1)NrU}5D]#k:CEUPmPWgN~ݬ9ڏh;~TR1*67id1挪LWg#B5 b.зu"Vė$f -ԡ_*喒zn~Ρh}&MSwgi2ꅐLJD#iįP[f3'nyESAuη}F d7qq34 JƱF?;0 €Nu0IRWّP-DZ %`f=I8Xz<'ZH9 &.%{/bK%)q;xPi p{%% ᐆ5 >g."x(C&X;Ock`⿋np"8aO^Q蠶 W%>EєYЈD"c'.>O. !AFSߕ y2rN+Pچ]Se9gɦr+(#7/FI~PwdnNRPHgrGO/pAr7?O!E@B9ZG!kgBs9Pn\.C LDiB3#:%]ĒS_]GHdD2Оq!?LX8gw% |?n"&!څЋҮE78yL[0"4b-%nD෮Y=q!V.λc$˅|gE|4OKlvDy^ic#~fϜSbF\\D -zF3]cUj~,nuV.؍Db5 %y۞gB?Z82"zVE#_$>6NO<G\"EY=M|7`: ĪJF,8_QcRmA1s *qk21)f-➻#$4x9MMS-Bɏ .ѣqVUD-̿P$D3$> ښĄi>2?w H}ToL\~ K3CzXz(dX4umaCK^T/lq{U* z8oٱCKp0Tkes@]4l,{RC"FFh2)- t\㈛fdGSĘu&Yh 3XKIdNFDt|͙ eӶA݌!.vdI5ؙZLhF\$F?? +ȕ)[ɶ #iF_2Řܰ27o:,ifB1ذLJ3HeRvYh$m? ~5^4Y%]Q{˞5D<5s"J*{`kf<)n!bƄi&ek (r n#C${C(dv9r&tIZ` J:x̤cWjYJ}}U|V|ic\ژQ=hc##>x+S)4_,ӛYlRb/a`VHvtpIJ cGBY^'G$:IؠIEKūӤ%ArHO遧vĤi9QJg3{ƌ A9''C?EQxSbY>Pi8 T|E xTIVsuaP5A4ӚAiuS:-')N$-)Z# Y?9g蓯"K,Q;1;oJӺxHIb7(%s,s ,1p`-)5oi{ L8CH/ʍD{3TESrR>Lǖb8ADAb\iDnĢjWI}n6Mn|K4ki;ɘ N/p颷4' 2H(}P.HZ5-m8xFߍip)@Ej96KkqkX$uBT S>S2UaT`\in'b;W4]qߦ-)-Gb1zBXL1f {* KB[CM3[8Mtb^")А2ޖ a+C"ġ5=j_ݡtQz^d$M1՞;?+/̛V+S5ګsDJX6L\,u+:tбG N|S-[SWVZ4Y#Ddu=@f9B;4AGGKDe.b*KcD)6:re5scj.wH|Q0`5sHvdmR)G" }(8t*t@fR)M(;'j`\`dFB~)uLADY(j%#\Pb{M[\ 4YTVm)U3{C%Y'6M;p_ %ڭ~B>*qEđ5!%A#ťeѡS{NтG )DŽi}54g(f 0k΁Ɠd-rؗ啿|dLW(,m Vk٩i)7q\@TBߔHk?CmāHY {zPfMe **Լba25har-Vr1u-?%\ԭ]R(X`3C)IYzl5#5*F*]&ĝL3 ðL/±|Ñ4! f? "AHu,*6[1.Xrp_}#R'Ez45y-yYHdBeC3k9mdaDNf 2럈h!DbĆ2JW?aLg%fU^/!+ yyv &G4(K5¢V(:ĸc8 ZgIђ0([-'F7 :Kq`&JMg}ez# !)gx[$rլ|@@,B s%L]EHg(쑪,Zhu@Ȣ5Ϸ0 &/*$ Jb#| ݮ7e]HBB~ޥGeLZP~u2#g\{sA[AFvHU3KGS"u`PrN<%[ JQPkPdqs:D Y3Hws9MecJ χO D fFꐦ"G v"@76c@#Qi#Dm"2ekdX {9C0AK0&NkI ح[K68rT-sBw8UT O ړCOE҄eܣxѱ TCyE08'6sr?bB7{BLHX+aEo3&"Q"(/Ow;A{`ce&2i5^* Eι -|| ۄХ]qݍiBGDR P$Y֐W-)>wYD ;yA) 1/ilnA-UGe }Q$GaoN"īLREi"uU~)`eg[e-6 F~f](Q4}˟o䳃FCUb?CY=1S^X !#EB2pgcyzTK2^8ꡄR܈LL,G- +?DBцakW=;vw5Umeg8Ja왧@_Lh2eq3Dy`Ձ(ǡR>{^R0?TXX5=he\߉X }[F¡I!Liథ24م3ɠߜ#ې "*dAfed&Nڶa4!=g#7įNZ=˴.{4`acdśvhd3V B׉&"S`c+3n|R7 &d4[[F/n#o+2ڪ.B2OQj(IZiͽ]a6FY2Mm`Q-ܷܒE_tlptpˊsl ܬWb/& q+JN =*[8ֶѩZ*qP5!q5W1(U=s_dW) MXN@RKW:򧌶ftC~4 KQѤ/1jpJ{Wďk:XWiz fl[-`Ofڋ~FeL&/?'hb>ߣPZW}Q+f"@0K2SM.E:&N^ myQMF@cwf4lT3|e#/ fzL"ps֩U0tmۇzW3k(<⛹%ѾDXa V˿ݲOƹ޶70 x_ #1Ho!!1U @,/i rl(it^]Y,ݬeGiyJ ZIM< R[*EaeA^ *"$!8 Ui5Z hsE]5Z"/ȯJc8)yEaж?=-}:֣qk/Ӝ9|z[a G^& \e)QzwygtiۼrD&=@r*Jڷ,4i\kD$cr"M>,.3\ITڻ;Os͔~ݠa) !vxsbid @3hs ǢiyOBeFA]-DJ~mwi.@=Mr=s1O PnJX#| upQJG1w^E ^zf5@N'벡Hж0E asg&ND"+!h,'pɅEoPڸjq5Խ "Ǒn,p 뙏m6( un` p^V*\a1Ff˰L?\9YذwvRz $:EbuSJ ap*„ ~Y"` CyG"BSBvύf2,Cq-Ml:N 1:4eHb'?kh34knhXz tY/mm3R˺#ښ]h - %o% (%%8ccx61֐F%ݔ2‰2S゗̭e*K2b0e^ZƩ*L(U#UWiYI îH>o-˿V=dl : b( 3#gLJ5w>=%t~Cxqx&)Qh2hϣDѷMJVTʧ\\%OǢ$ӉobRN\"Ԯ[Iac,&N?%¢ o+/vp;Z0@JE寢nlH c D2$GelD XD==ϲdFIw]A-Eo+nJ䷱*Dyi+NXr|F7 )V@n ZZ£(MabsNYPRZ; Z 7@k.W%]L"-aɰ<RS*L~Q}ed0H\&%T M]DƸӿ??-ir%͗%{a6Ƈ <@Sq}keK7fB  tLxm.8S؆z D<8`H% T'%H!kI.d34UMJH@Y7t>>eipx_4ƪOo[UHSD:~eI;heʅqy+Ó)W1dD'9-mGSI0,phSB: Iu=R+3'+J*7 W[) d Iİt(js@@M4F%!rw'bS6}Cxaq!H]/2Q޿I 1S{-uk"syFDcpR!Rzoѵ7 ν5 FH &"`O2i9 Bw(!!wX=v4TLN%-x. /g3LK\dreO,XB#XY }]<J1)sj 8APz?sBEJczEs(Q͉H(]n˵$EtJ= Tj V09S#{$8nY T3!ԋxURxf|''uuZ  JY(`MS&,yg$p @R1mnZulb3S؈ eⓐZ%^EUڨvҿ%Wjl1 H>13g=;"4>IcAVE}7uLP?X62!! pUp$op\c#p$Br m * P#"$WGV CԄCK(m>4l_~<,W (8h]OfaE\jݑ9j/~m4t(rƙkK_Z (QT[Eb"k&C) Y7O 2!Gv f'#V9O"]M HrlZuo1{@xg%_XG%Vx9Dslan*fӹ~#cQ)ιśZʔ6Ā1وQG3 L5#N7 w y:q+!!(V dEX#_mތX@$wz+OO"jxZdGqD i$40ô%_tZ$G裕zHZ;x%VI]'?pdg`Qؤ~r;f뿤V7HV? uQAr]MfZ%WTbv)q*FIՖJV\Z_[S} >g1=nWYNh ~HSt%XŽx" ;2ˠ%дDB( f!MĚ zQ$#7WͻϲԚO N '>4 PK&!_ʉH'9#m/asO?y ?(?g|R\w24W0 Hz/ 7jT;f29_c7J)5mtB1Vo`O?B‘=)P5 ,Y6D"(C %ONH"—'vH g5B+0 eAe.4Tg!R8EpSEf{Ƭ"_?uWT)MCԞN Zs (z9, @Oj#A/KvJG2.;xqg#j08(>BkbF k@U(k%Xquq9S6/P"q HqE͘XC$F).nerŭhD oZ ._B TA[Dh$j3¬a8!3p@&T/ Ns4J~.Jᑃ]1;%E]_ LcP&=] r}3} l?2-Ox_i/ؿA.Lyqv<#ƫa̙|uNBeh!)6AXv2#3+1խBJm?s@KOIHOge1;c/YV-]¡+MY|T* b< ۬m5_U8e"QQԝX_R<ʉ+ڐ['@BE~0-=m׸iRkP*‘#hdZ1*6AB'z3 fׇW̚]4tq`D[0yjq$Z|Gٳ,$3X!&ԍGaCUOAe0Ef KPE(r ,XQIZkKMZ\XNzLMn ԽE] H-`wvH^#"irޔ[kq*1Lω X7Œ9q>7VBBc Є~;@܊rBǧ*ʼn bmK2"5c aSI:JhXC-س37Q !r-ql;;GX!ђ#1B">q{ؚ*pC0c Դ-r܁j1\U?+%'D2%o!(J*a% UQCLu:T[s\@EmΟPIhrvQ}1uSʾzv(:JF߸|̌g=4$Kfȅ)ްDi;WN,G>h tRg %–_u([ד? %m2jĐQoX+I$RTJ ^RV 89G%E QSܰ6Aa̙MyhF  y0hdȷ0tHBpgnUmx A?w)MvnbRt0ۦga@lfکp#ܢx(ToT ցe0cu@v-_^/} #Q@5333{0]܄adE)$Yo6 $©ۯGoaWla]RԟAaxbDz*\Yj1{+xhjY0d/ӯF'~}W\`xrpRMf{aԨ#+U ^F6M`C2sFy8!NeAGdS[Gt8TD16%V $~/ Gt%OR"%;ٮrB .ڀ7V.Dl(vPWp5 7jpR奿+ؖeύi&&Bԅ{}\NUY0J teyRo^dX%w&7{RX/TK[ WQo P CICh] czB2rE?ɀp] .~r!Qq =s&w4YG&XxT[kC+Taswqb4t1TT@)Ŭ8ްިi2MEU8r8fUR3 h PVUGm}Lց"eҤ3n Ä8R)("u5'dڪE=$# ;Pt r9ko36u W(7QՂUjٲ":'J{h,0&CaX]6ک]7 ny\C4{lܐY,ȁuZ,.=Imۻk"r4/gwbQ 袅b)!<=0I!~E'՚BѠxzU\MTjԢVA"E4w?g$ZA4YH}@\[[,pMف "}T!bubXpS'i! |* L@zM7 w,B1pÖٔ% 8C4@2*/aTܓHɘ!N+?WXõ0_$.M|, 8bj:,eNypeSRp>`6S܂( QXd@C+B( k"U?U(Lv.p zD`Vj#rU\* %CυF (p%*+~y ޳j. 0kUXQs-=tި$X/{TJFb 4!sк&Wҭґ3Sl`tI˄GjVX& RQƈ#`}&9e~p !~cXV\JEh׋Ž[=ӼJJH"U_!Wei  .7H~z]D*$@Z*>(퓿@hXbpJBJ|\5` x•zGCIFlOtSmˈ_PGdSkZ2G fJv'ƻ}5f!qLVH(PvKtgPAMळ;jbʠa_mkz˷nLtMuC?_fSթKqcѠ:&VQ@Ģ"hg Нg: FwkOUH7`u`` ͇ $0kW4xh_Nէ13?8^TkN~e^l$)b(lC$; ًJr5h=u=6TiL79|)XGEDG(W'aXhc* u괨dHJv٦k$uiC<ޏ#B`| !`or4vXvogc6@4M(Y8Z{я!{i( $f_DKOI'k*ՙ(i#kz -xǚTu8' Y)1iz~MK%'QL(%-ȃ`PL $ՌW]ѺO=æp2zajEh^$fJ$fTLi^ ^Lwp>JaB#q"P?պRԵ4ʴ߻*# ]j6CiiZIRo 4PyWp[œN+l"| ߻i;Ee&_9jFl矢ޛwL+> \Ƿ7R 5 :l6~%RACVb<RsW+ZkPβiB3H$5/ɷ JQZ⮯o1GCBL'ġAo^gh~^S3 ^]-[o=xw5q"lR|^ڭw5Jk$:rٺ"ѢSmqi #ULHDVڍnyp,x&]K΁k;|ֆG (f;=j&NPJr@BhAq587?&G i@/X?lH4iSD443< %C%k;La"^JoƌE,ܢ[]M>]ʺw\hqSl1!V=>ؐ=u}gʯXY>. GΉ>?ȡ6}Yf7(s[))\C +J毢D *UNx$HxZJx{Qi*|B"~ :;a<{OW ӑ8wG??L\s͆P "fjJE-ʨZ|h0B{$JL0 DgՄ>-RfI+ ͋S/Ó? 9Vˉv`-F ACr>+LAٚ۳cmgP(](&# '@|@Ss[V4PM; hQ>h.8A0. "02T =3Aʾptnȓ7!kͮT( @@W/a/ٶ6DpO˝\rHP{WKepsrGLY=t6AcbU"'/߯ y<[$BfVǸ70ܽmڴC񔩶y4 FP%:^zJD߄9(q&9 C}ŅC*>FĂTM$‰1,dxrݗ P4 Rn n`+!ʾry =bB< HcCo ۦ>MH%k/׼1}+Rw%)H#v.~3".+ d' FmIפU71E52" /ON>G}2Θ έ?DE=Ξ@k Kb 3f:(UDmӐ(4u<3?ӈ@9[,"f->.T9[)뗨2kJXMOȅ*)ҦZ5whI7?5|k2Y]D!}Pf"֛5.zT\^cz:js)́~AD*yaY}kr$Ց[KMO6G6S'}n,X*\]2&[S*UY`Ec&"PP:3GxgP5d3H eu꾝N"E)f:pmK7rSe5{[]}*J盏C3O]*A?"Ɂ-c gD);*EaA(DHpH_R}U?d*:s)%QYpP@5'R-I'T1%Á3XWKxyHcIȕ}[_.!Pߙh|Q[-p`^x %_&tz74 yI/'N[EYbg yhFY}(䶜@6rCpC͖C^cfնbN\= l$B %[N&"6ZW: }*GқEv}5 [06CBS+z,SV.=3/$4*f!'5!%^> KA0M$xZ !:AS;ud*Xq!8r4Kᓣe#losD8K7$B\|D+8nZ'L=dpr⑍!akR9 !/;g2TI[&}R@`Ul<)BǒlO(a4<!9"W:_3Ƿ }$9imq/yMKw(Vq,6dizS\Wf!ftC%i߰7 !jf.Mc/6FBxu!g>n' ׻l_#SEn B"/ "/"iXEzZӗ-H ŠRpWΞ)* ;W4n~ F zt|;1jG4" 0w .ñ)#;ꙥ12Ms(_ؖ\=giAJǏC!!;brPMGK`0XO)U͎F/Թ3c.lU)X1jV#tG`oP>)Mj1tP@:G̗ra*w2ZIX5R#avN 6wPHFcGym(.hݾsBd&L9Zދv%!exbvQD03dL_&l?O nzraBH TGŬIo7K =`@SQPULۜ+T[ʡLܠMnnQBmX=bX;ٰ4' 3( !֦#^rxw9Fq#фչ_2Yd8bZM ʥT&L#>W*Ex^5KELִ}QTCOͧN9րbSY ,vPl'ڷpO3%Td4@F5?ұTDẊ%d@0XD'(Yܽ!hЀ;ڏ8UW1 :%B/lWMꉳ|7^ޗ鼰Q/=Ho%8%RR)H{,E҄/.{>Q8uĎ1 fb dbU'5s+Ln*+Ԋʙr-S'B} ,ĂxF޹+QɧFv`.wa1Y&kN[(8`>vz =.1fO6%Qo', ,[.\kZsH!ou $$y69_^]5qgo+Fj F.n86eBa&ARSوGhΫF'aXjw0j7EU vӰEA^PF < `! µݲ@.afAtCO1PA*C!<0JMʹ=w !{-k&ĵapOܗ1ғўV,#GsjADw)WW;_ ,^=թ:z]Nv[M{a;vcx=M&'OqQR<8y^K³HN2(OKjʭ;]cZC]rr\::k* ٍzS!Dc~OThg!)9\UB>Gf1d5Lc" BQtIyd28_e2ȶWv(z00=g8C!ZP]*/Ds ޲zc acak"14ktm+M, 1&Ơ$G&cxb?TX ~6Ȩ1Pĵ 93MJwe<_Sq'or(`3ggYbO9Õqe]5bYFєR 4'ˢbbx#@d 톌!nmcGWy{qV4H@$)_72~S/pxJr5}_!,'6s*2Nqq ^sIO;PCKQYLd-gE'cTDH+I""> 1U7 06h|1A$V-91 08:,,}ɥK*q[ Dj9gԟH, L" $. 3y/0Ic*ߛyle`XA4Ǝ'wrpN.* =!.E3zng#tO~tTIC`~oWJ4MS@ب#8cK_[X%0AQR:H_,~˹%k*zr*80;Dβس$3"BC¢vw%Ot{NխEL1W LLN,<\Va5gLuؙHP^ W'(ߞJt/1 "2QF:*i;m~:Y1\w="iFۋ;ф#ZʕT'\QUU~l;Ē&QAJ}O規"H\h/ah˻Xi$V4"PI&AG⑺ .jjKr;[ 1VXjhy0mq-S_RC4CҮV̚*id ,%^9D:1ULfTdpd (ڊL"a1<ĦD2|)bkUZC! \OGP4`![kY4#h KJɐWlċi%acU*>9F9*$4g =˧A@uN!' Y7F}PXRb%m(;L틠$ 44KNrV;YH}J $v‘Ĝ Q!"%A"PK0ibbedH$ !OsW9 !!SHv5ѕ<˵ydpE zj_kjjaGxy% 34QŠC,Q_qUM,j Y|H!``C)Hn"jJBģ0{gHbN'o%R)3s7`,k  '0JcW2KIKdW!gl8kޗbdm+OD<"ZkTYJڕ葒]D-Bx9Kywc aP1aJ`8܇gP$e$k]LzײnY mI#`BQ/ jDm l4kRΜ!fR:9n]J5IcX\GzTZWV*r3xhB'g *ØODR" KgͥN%0Y!spˁ=s^Y:e a83Qb}kѕOgʇ)PA+VG2Ȳ !i_NL\z.E'F*4+7tஇÉЮ \*tܘjdQ-<:&Tɻ6R Ew궥݅ l%vd|G7.%L1z\^la j(u桘]q jb Q#Ê:Nc&RSX?ژ4RgBo]kji;m _LAFAf +"||B2U0ɛWTW+BB2z:.C)_5V gĥ;iD+`//8Lspd_oOS0GՃGƌ4&U[k6-g`̇Eʃ5|Hʆjm Ca*(|uXͮ="i dC $&gPFoT.gYUGƿ70{q̸nv`0>’( Q,V?gϒ+WAhو \"JjS]Xؗ%7'x}>őNRk`$ўyYLf(V"p@vΐH*m ;7Iٷ$4[!GX$Cjctܬd픉?U2r/YB;#ԝ vV0Vt5M T~D1I W8. ML"  M2iS /_%\Vcl+XPf{~wРi(m/Τ ԩR&rD^.#]t1\S%5 K1 hd{ |>#q;^mX##{f} 6kffAЕ.ϕ՜!&ZQtpb/'3py"<1,g[j'kaz^3F< 5.2⚛IԮ8ӛ\.jUvkHxF>#vJk-);M$nAQ-xjO2%Nc[U8W9m_E^{Kx1aE do;ShGWl̓zG,;#$PAR+$Ԕ-nHY ЗST[&yp=YL]ˤݕ^S B߽ 5dUMɎMnr!bq>= pI!H\N4#ycH#;0"'BZj,KN чLSO@wG:Ledf8\&5ꠝ~-ڊ)"dQ )Y͗ō)7uII=$O~O\ ,5mҍ_ v]W5Ns .| L8"=%*7kĸ]#CTI3QҞ!=@x[I"~k ?IeeTV_s1fO HCS}CE DtA2$5$OC$tDm#*sEa s+]iM g4^Z./LdBp'-ztK3YD[arY2U(U6mخB `d &[iO| Q"lHiĒBTSc7R bLoE?ޠ~2 $H`ih;(ː2e[]"[sj馠G8 F淗~ !];QQ({hIwCz  !5>sQ&oA8mOV[Cm=lZ^,5qs} #KE%HaQ^.e~jd' @‹|긖Y@]J`DTN!SQ,a2%EFbTάKGSrX0$U֣"+B!2Qb(hE(Z#Tp-t2Ҫ]I߹+6/n1G; G NfG ϣ:jOQ(N+0,/Kg4ZC!5LuDU઻~d-ޯڞ$paFɣRQ z'l>qIm͘A:6nJE`KSt!& iiG A(۶X[ĩFƆaFM$/COI=k~+12I㭭Q%d4R ]$Q&K "<ޙ!D9 ~JMcD xaivKقEoyc(rB^T,bb()jg^ [P0P( 7aMDi< L3\ȿcXl$uy7ͯWD] tYp2 NW(,< IlO7kp/ϘE)jP$:Čg.I߂>'M$ )"ޣ18Ew+Wsb)>.Uf)X@j<8ӊ2$I uClr>B#>lz0ԜhlՓ0-l^A3eaٶg -wۡ11ޡqFe0 V|\vn;S)miOKL dgD9$e}ĒGlz>bΒ.S+83w0۟ůi)vMgei.E,%{sѿu%a+2)kFi; &Bw%jl]χVnx ^{8%7%(^(X{J^®V|B\"g ށ!WTFuH$a {8@;-xX Pz %.'cV1Qf^e:;PLƧu&JBM"=JΟmC)xKCfh'TM4H-`hшk!r;03UV ݳ6Zs.ҏ]Hvge FER]9 1,HVƧRQFL1{T7eOx{l'Hh24s%T%6cLU,l LJ_N>ZەsJq1]Ji@>EXh3,趞 T:v!{r^KђJCɇ"N'FFhY%VDIGiFU"p3!)z8C&Qخ~o,]jQ@[ l7ƶDWJ ,yT Hb\]Ρ>rզxșщ2.zj0@!r! [GzFSVQ)R$k%ZFF8Buse6-z`#S&%#k!w*sg&ꯜ}6j6b~A]L5d?+?~V"@7ib2<(bC&ߐDcF0+G:iɧ-*0@E8 #V MQ'ȯLS)gj- hn 4K_w T>nE>o뜈C{ q `ZK;Z˹sk׀:Ĥ \g\|Ie*WcTkv8T$dBW[FyW5%Y-3?K273U{;bLmcfq2kaOF5mu\nFG•!!hG^$c]8YJKeCQ|_b&Oo>Hd|d9y=}6io>OY٣$lQ։9rEw|.) tK:пeQf$2a/TU?>>i i95nK6B$SR _ `8#]ӻ*sF FvH )vEZYDDe\((pZ4ʴz&l4WSZJ~ P<\{!hS[2o+ce&e𘝝zwŌ3u ʭ8"a V{dm^l If;ּ$QV{ HHccb ˤ,ֳuM{i ʦe8{_d b'DN-uYTaH2.pY"+Iǟ/_,Y(q<&<~dS(NNwᑔf=V@6YLeY-vS~iLLb 1Hpf Ms֟ӴjX$YXyyH!2Y8aV׷b Яk+T, wW:x2jLhDk溭1bseTqVDï& n4~ęE3Xy^ǘ0ECUdAy5nշURD?qhSח 2$ؚRٴޘG~ߍ ;9XbK_h3vPE<$3_Ak'dUkB%AԪs+zoܶEq־36z2jVAeycz.Gn5`Ze 1]AˍC]030|  ubE͸)I"Z Xˎ'R, 1g 0v)eDD P"-d)4[T-DYZgyY#MMfUO{˴qe%=ٌ޾HUCIֳxed~Ҏ 2+^0%>NjL L򜘲0zT~Y08QT0/1<"?GKdHil_]30m<{-'mEƭ5@5P#A$ ^Y2Cq R-c5W&%XC83] 5Sl;o}3B1ڽtm@U6T#ԂIAvо@{)/W{rJ9 >h\ƒۺ蔞 4_n"CGf+rEq%7PI^& fb=(Y}Wk.9HkϚP*tFK:c7#&%\ 664Sqtt$Z)%:APOR35y]rL_lbZI|",[8zdԬsS)8NI(f-7M٦3=aa MMgսF'1G!_!SpW^o J[FH2$aMg '8320(gE)ۍ2)ϴq6ũ,L=)ژ{s%-2K5p:\2HEi$DE|cd.UZ -řBFH$2B\.]9 ayDùoxUhl0]= < 2^L<]r'Bg7=lRzUj&@L TE5#pA_=\i (ٸYcBVX\ DM#ajo=.w ڂ9FS2.# ,H+iޞ#`l8 MEZQ.PIG֐_^nk:͝1ہ,ڬUcA?.Qzy4`%Ʋx`W(t2)).1ޙ{n"ο@%%ҲVu>&c) GJe k=ug#'S} Q")hbN]L q*QwnܑCF2'SOD-di%FC%^N<.5RNaVjҎ*Gd /YPъ9E0:wk 16h?6rFɨ?tz\wytuGM6B:(f䠁\Jcj S5ƽH c0Ef ^޹Eƞ4=95Y@I*ug,xO+PyT첄4E(UtS/mo0"bS=v,J!W|Q5!8]~1`Iou-ȏ[q=}V7au^4MT.8+VLy5bRܸmeXM/.֋OJK*;|;vtc Q>0_7jPMW 4Zcԥ|Ť-Cd ̀}H^{W.̩Dz*#>Y՜]OsM7 6Ld@!U L|= yIۅ: 3l'Pwؖ%eIE.5`8>=\ GD#Rl4dӭ3RrecfȜߒk5륝OukH*Z̰J|&QE'伙+-He; w>}[i]œ11JzGRԮ] kIp[ ƒgyA:9GI!결! 13IMjRnP`L˖hү!La pj52T<~;RM<% tČ٥+,f !U(:̑ ҝǧ,"&32xɈBb[:("rq>e~ctXǼCP%w=I\qeO`uYLԛ^d(N!B̖ &i)ąʒ\KH0@URe}tqf2.%'T f[ EJ[3Y_wD2:a `f+ba,+,aX"RFv e2Ȥ!O%sreaK3dy~jPt-KrY$K0^L==M{C4rdhfuv }IBTA1ܪu; K%%q?9#E9LO!5%*n(}T$=L&J+Kgéu&NTkC[9CL0U9Ϳm2_~sLi` L#[yF"=QB13R\>=+ ez *[&A)\y( 3l \V9òTyspÐ28姬9JQ:Oڪ<3Ǹ9t 3܈ 3hiEEW֖˖&U]V.!F>׵NR풮f nQ;;"ͼys4)FJ˵ք*J8MpRbL; Y7m{ukRv:[޾X. YEiv!\&R]Λ]=xå3d%kNQ5A]~٩μ&6e,M?+L MQdxqx0QY)꼈NFq&.S)1kمOSiYW;. t4%yTD3*Ȍ,;=%#|nn:.t_E('n!%ҐB1!.CH9E yTAZ۶”כo~CO{ob~WtvM[|t0G Sf6?j/;9 {!ɼlO\d,m_+uZF!O去p[aegʇ?mI3sZmLG^XP'M{g`F=Z5!b2]6 #/1#Kg8F*% j6/+p48!~DD}̮٬FZr6vp2Xt 5]Jj9-v^ \~m^^G/JT@Af"{7+~.Giqpa5$0D@GZdL#VG:GUvݨY ~|Sؿa&X$c8ѫl7tBm RHb`i1gFCKD/DaT?ݿ›>rzA(+ rySHlZNĄ.ٝ":w~V hee2^/wWN1+GWLHTPRO!M%N0Au5a"nZPZ)8aR7MvD2yz#!nF] J4@JrWi,_.PLԎU%fbELZin&׮zhF #k^[4 [jº*+M*ɳع[p9G-94'Wz^vVK[~ι#χ/2h e{5BCg䃞{l/˼ֶ̌k\ -1O:seE+{rC7DM/>׀p'Q%oo4+/-]65'>ԔR>f"B!T4:6* PMU!.r/+nz|-m{TlPMZ.5ċ(IA#9IVH;Q)q+?8K`odMd2Q|!MymȌn{m\ T|DD CHW^Iӿ.'r|\E hyw>&2F!s@^NYXh([+._Zt|`@Uv* 4dgy9܃h߉l2RW`@<HP_dlQE$E{M-fp3G1q+!iAL k[)_(#Et"f3o^"d:kV.,hN3PrrPM35 Ft4a﬜ 0ϱө]܀WS)Z 讇pt6P]/m皽OP*_Y[UlojHN-\mO-ֹ6@#xY0z1N\ Tw[KTw[{޲S8ddҍ5d|/%Wn$S~ozggQ5Ճ3VIn.bK 6r.5ܪrL%5{ ]Fnʴ۶%-v^efDllz5+5%L#)̮9ל^]^o-u7[\]2@ͻ4Wo̚Q70j>(( EiH- }-w;vDH%a/,j1Ro&q'l-ts83>lк/ǦIz>xIrLznN̘G߲q򆆵 ulܢx{z=D-6>\AOl^uũLfNIfl<G#eWIzI/WxmL&_K @׳ 9 mvl[1'@3=mS[y\M^NOL𞍀"֪X3oaX\iF- E'$15\'_*к&bvAVrM>',99$fo7SeZ9:kVjp@W'A[W&ڜm6Tl)IVnK(z.vX]iZ vJ_NJy 6LO'^/A8GmIU5&L Fzɰ?] {O0ptP̸{R1%DЛ AA 7! hZzwm?\(ke;4-*!TJ 5/qu_~E(hT xe}1:fe>O]̦Z 9@شM5i w3g*f3$a<6hc4|c"5dmK#(z(Oܺy< '] FpqI*OBmX gYLyBȕ*XqR&yeY*9XpS>uN"_BQR  bl;]flK7o6b"yύ\b;-"V䰯my!H>JVWhUCv{> 4 LA%Xa@T4%UfḤ'4a ` )yq~w5?_ 6jZ\GTt[nПov7z+=KVOu ](Pe-$޳ч{>y{ Ai"hm0 /VgY^ pt6ZmLH|K]- UI+_72k)-P,+ɘ$J4 pԯ.; WvP&O-ogRLNEU~OfE:Gry_h0t{"\!qsB1Ŷ4l*в )gLɂX v<(Vc? cT5+SI+HNΐ-&UXIs vZqZ&TFB2hF+pWyQ3߼"Ѧ>g""Phg#HG˥fJ)`-tK|mWZ3)m,}B7E%d;'ȽxKJ,ewഠZ8䊑ITo)Me.kfIҍ%E|V?d*gA/VyYDAIO%ȜPw3pfQ Ceh\O~:=JXJ%(%"CE+B.&/@+4^َ-|pʬ׵as:=P@[ؼ[8UM)Btr 7DX0KJMn25\r%ڴfᑛNBO^]TH7]Mrnq)MCS88{+$X/瓛J,P*XH0/ek MAkveApRIP.LvM5Y7D_+MfQ9nXj$HǚR5[4]B`}N~j2[n7J#Te6a@kM!h^[IXU"gf B3{6Jb9 Sci?XfFJ y]!S)qʳ#JkEko~sgɖ%TQs=j3ʼnE\0Jwh.6B{!4_ָ𩰇Jz+T .KI󐁮@Pۺ7SȪzl$K=1Bu RT;}m<3`mPJ59m()c&\0Ul%.=95=MP6I,䲬QL= yE[F6To\#0jfJX ntȬz,G4?&Q5it5;RIb*ާ/A@}6+#H%5RoAT@!">zo4 ɱQWlGEtGr  NMYP%%(#m[; Kͪb&BCxLߛo_\n{^Wք#EDpu%zwnxdb|*$NO.( \W׏o*k{h22SOu3VPP?˾j8f|0"#DE]#ɫdYcFHtvΔ g Fn%NKA{gt"mIO6Z Z\:z;MN&SblbCz 68ΗO hB*BqSKDufxa5TpeX,(XkȰK8YkT%7%2jۡ^v_~ _Qʖ$4\uPjs^q֘¨$*,N%փ3kF7o% @87dBQJX|+p PprpT  !9tňEsCBȲ`B @d$( p ňnB Q(@Уaѹ"CaZ`OGYj 8P/^`a$xMy]y"Vwɩ,AM6f#5AtЕL)\nI#H,6$j.bU0'69"8V*h@Iv m!TVUyLLd^?Ë jGD>!A1ޣ#1@[LJ3#Bj0xP#%(\D"'s+;3NZFIE;:ƅx?: !'?Ѐ!=dƭdH!, Dor@\3vْ's#*z4BrQ5>m U/mB&ʨX{҉5?ț-o-wW1`*VR|8L ϊ(ʢ*ɩ.T&0Rrkj.bD<"`y-HrMbn9w@J7Zid?P.%&:OJ8;".#_#AKTh[ zhbnvcj{g|%VÌ_>{ԙr Hd.#Dɚ|qNe:&D+f$D| :jQm"S}K6sJϒ#)sl!"Z֧ <Tvm|nԊf75XLv P%`UZw]W93;z6 Q@G}"C9dܬif߲S.O!:ec"-VpcE5nP%0.LTYabaGf`@٤:2$E , : "MN#f@NА 9 : 3OMW>Ǔ ŧ>L3SB5C91b@x-D' 6KtI 5 b{((:5Lbcڃ)$/[TEwaݰ}dO`ô\J 1i0-K[lwa ,acS+ **܉JfBAcX-~/G6/-NUXq0q0к.餞B%I,$-u͒ `sh^ TqL%ҶYW ^&8mDyҿ7>K¯0SMOXSqeqaD;iƛ1vyR|*P[s{Prh=ܴ_1 q#"XRsǏA'oDQڼԄ҈u-Sb I)\s,yN9i!:C pMCˏv_HU8IkBJD0UE]Lvw-1$U랸&ae¹P.\f^MD@rCNR#h:Gx LNR$Bk*M!; ^SqtٮNY:"NjD%!ON1 O_^vL[ܸEUM>*iw"N-I[9 ]#CS-ӄAae\b!ϼqvC.eÓg&/Vx"FhN4eO C'=ǵeq dW&B}!D9InR&o˽ ^x G)Yotv{GݸvxJAL\gi:>B]0ɌS|!b HP(<kc R[%Vo|iBί.QΒ oC1[SL(Kҥ"cbքB%tI=_fjFwn:\_Sʅ\ajۈCѦ:UѻœOTg)3~ф|,]q):"IҜ%;m~S==e4֒ei iw[.sWЊ! 8V%^kЗʹX  2k_|EL{iY41D2Y o\Ԕl0KFUˬ$U6l. Ko٘/;^Vu{e %iw;!MfZpK}مJ! N ĢifBD5*Q=AUy iۭ8x`>7BN+B/4 .tF]^NXKwEh; '6Ba8J(țp[4 \ZR @΂+eK|˽ЬpC h_rGE+zsuef+c ي53Xgw]Lnڏh8]ۤ 0X͍(oO&5F\ Ks"q!V'V؉vU2BQNfzזM8H"k\HG,i^>DE2QJ1(l-F@^C]`uʹ$98uk(o>q. ,BrrT/\ }u"w.J O,4i|_o0\#b]d]LC2ǿסH"0#YBmI^`Fp3ݿH:Y*^ hr=?bIm^J3o3HF&(ܪ=G&[ꁒOY".K c&9^lK Q [PcSlQT;.[Njk6HD #S~d iՔ|N`)#AKS;-mhY;Nl[^Q1S]#hJrs>ZBӕ;'w^J[^P&"D{7V Ϋ4Y7/؜8ؐb`qKtm@I!!'q<M_+t2i#V-'$vAŬ_m$uv5fv<쇤t$~Ѡg_o 6 Ql1Pm6 'NBŞCď!5%>?[EАZI_$ˑlT"}v:܄>_VۭI64n~ Xvf~rg0wd̐IGxԖJ'eb+v{rB!_ڭI;&nw/iI *6o)3 \!t8Z3W,' E0`ϑDuT L%u|G4'D5Ibdz4mRL+0, I[3a;df k G71Th0'fkE#H;fgb\-k{I0"KCVӣ-ozYM|NN< Y@HPͨFFJ!3"ըSi5H ̥!P|D+&Z%c$ry4]/Qy XTZ8CNKcauNؔ3X]gKŬWM)*eHeYYD".jQQH';XI>_-2X$QpgTjޙ(nM%=F2)"?CV*;WyBͺXiQh"hC'22q!9.g9ba~&847 2&'닇/,`ρvjʇQ L9;Ү%FDV"cYyrォ2`+(ns:$-M$b"SIT!l[&d/HS)Ԋid_K0`S)WQ_)p0aH8J*Cӌ@YҊ]8H+'$33(I~SW85!WD#29`LrlBVkgK .$:j[3ӧvg "r C$|&#@C#Bs"8!>)!*( A3!,2R *LĜ- &(2 XS g@\rjXmZ1Ss9ƗOTv(T'٩q^&4!F ŗ)(ǴY=,æI R&lF+qdY uV|y#JI$V"pJ#l2" @V8*F  Ax<ĐUX.#udlŢ|T6{J $‹ HE|2"ȱē"dymC@S}p?Hl,*7kɎrԭ(㗪)?P2˕G!He^pІV @ `3 "L԰{ײ(<>JWkDS3jsXGϋ8Q0ŦayJ/%͞""\ک (X1U  l}eCJTrqKB/jASR+**Sfq 0f[*,tbY_ڄ,ԯxNT=}{3З&oǰxU1q1?Zw0UJ1`b/ܼ:[rU 5X+3xۿ6yaxÜ9 ?Q͆#VFBh($؄DZ3[]xN]֘q*OWȆ*<~C3IWB]l9pMf>[Eŧh$e!KN%T&PȹI͎.u(xE#›F㸖x2i~o،dNxK}j1Ha_,9JҘ.3V&Q,B<<\Vtwh],pLb2}u;# y/Yw mE Th֤Liہ˒) Ԍt3 GB3<" w=@ߒ%$ı!CfK(j!PwyMHf¼_(չZ1*8Wnd& X" &xҙ,-֪kjak7R]dHkJ zG2Tu;n ,LӭRX^C}[W2 '^Sħ wLQb#eu:/.SF!,N*[ i(DW36,\@2().Tj; M:ێ+WW*B liͿ. zEcHiz"g>yqZciͶi|(E&Z)zY7AaJ r?[ltE Md}7ōMוCJhMIr`D]j#WCƃӫ'6ў\? X ;Lq$5PpyiL%x>ߙGZKG :ݝz+j@-)OvX+JsLŵ7jz@|XN'yymI]odD7$6*+l^C)2hW+<{ٗ Jmlu{+"[ḣ::Z XXj,S9+(`#D0A$>k+yoS2-R4F FVfְRC΢$ *bf lM:DqhE&&pA.BYJ,ݦ]WYȻv2 phd(FPG!ފ&I % P+IᇉpXKCFTÍ{ }O%5J?⒢yNEje}t_Lّ0?q #%KWksJ(ĝ-ej%lb.TlOĴ>*/@@%J8YWcCE"i^ޙg PxL翣M8/(s&4^zHRf)UTc(+""\趌Eʅ`IJN٫'+gD2iI˒*D&a/C%GC'f8I,[uy4(W@q϶ !7#2@l& Ȉ y)mLR~($u/9(-.I9A}IΈHЎZѥ|YX"9,ЪC+Dґ@PbLj('L 6R(i:&Uə1?(qrQmQFW&fX&#F 2QEyvL1pp0CRj$rPBL_jˋQ8P6F%q(- KL>Ya;NS,X/߾X0Jh&Ȍgt~[doQ=GmPV}Ez/*oNGշawMEʾ_fl^i=C:XEŭi;E\\C V'Iq^iy5NeS*F<ר4&Q "5wa QVx5#1f蒖{SA)APcmP1FS6a{$䚺x^X^QV"s*I# }@>&=q+Z+L:0=Yݦiњ;$7'[ /r0b wsW:'w 0 \2;@z=BH33A*3f'H%'2)>3}<>T eδGNҤ>4/P;u8d\jV_eeVCM$|l.ٖ'^-:+Fr#NaG]2M'h$K/ZDq'X(&˗ >g$TP.fL&ΒcSus׺~Уɞ64.B=k hm1cw4z_`TeR \N<8PDþjY@9a | 3dL)`8`Ӕ: >0xLpKXT*L8y}IuLuIjs%R典I%VېֿOeTnqeqa4%6\e uUA.T Bfi.?V̊mb"؂c9/=D0W#2F!zES|ϲa gd55J_L:yhXIvMEd+*c .=+e -ۨ}w#WYj%v ?It4Y[K.G vb5ːrkb 4,S_G{6&l@Q)3jn.3x{eRWRijpͲ UAdrk'Z(@1΁]tB#~ @s@J%b^Aѣ32`rrKc !׉d.4fMjipND %mXg?.΍5-8 Cͩ&j NKK1AjyCɄc2-(eeR% c02KZ'F^&JVK$bQt7)&UAhT]~-|m ګ[FVݝ $u$4mw1.?2)U&ë&lՋi< 8ID˩WMIgb˅ز8&$[R C:nD4T,{z>P]31fKD};;gh4XlוuﹼM0oS9x:pb9_WhHLA%w3cdܙ/%{kX3y'=jE%qy0!;{G}$بM9NUM*k)"K*+d銅u* !hyOU%)| hl"U $9\k : HEG)e 4­w{hփd48TҮ-##mDF:510U5ORE0~"(H?2<$8// $jL u[_5Aq] U͞tώq"qa^%!TB=s&@+^Wd>|~ueB"CU殃#>IspVk=)d_yufM]B}W PGIتt/}19'5 rk2fdȈ:N&!)>P!,I>>8NB1!} Ln{Z%9fl$̤A)Vd#@&S^/r\&bLk{86l/e;Q; 5-MǨйH7j/0[8+5r$*;BZ<.Bd0xwXE<ӻUf?۬%J)Vm?fs¤f!IΧ V>-9^b@$8')¡&aL=!da0vbT{ٙZ\mJd=a\ _䐋aYȍn!y݆THT}I#ZBϔ[lbOԱ*)XvKo7(V˺WYTSFK.)j1U@ĵTf &[N"2TC#w6%KidnUtpS[ȎچRHռ);!!ӆ#_[d4Zv"~߽ .x.~f29ޙ͑ߴT;qޚF`l JZf2ZO=%-sx(Õ aFotj$.؋8bb r!D,X ߿tuBfkLEbrQ0(*TNƸ "NFGmJm>G(x `0aT.ρbI"s*z{`:Ҥk Ŝ[(yaÚ4^է$,5{ĖҰdWJ\#"|.J|4鸊74OUJJ2 cuX6 EHgU0]BӺ WCP9ƪu6 @5/nS T9c:LבX́&%)# @ўQpm,rT™ab2Qn'ӷTqCh2}kJ0O}^)T)xgUPGؒeˆtP.J%tkVRg `: Db>rAhTł&28 QeV/' r#֤ E./k d"#Q&t%!عjF ^+RoE2,O8|xsuN1>nHÕJ-n ^dqB}p'~tΊ*4i/h/"6E&|h}ؓ^X{N# f@:D&,IK1F3Mzjkq C~ ֜uq "Ó PĠx[VOKG{ͣz#K+j ަ>N;ҞЯNWNo|p(FQW)vs2.޻1t,jģcIMU3u%V= ,=$EЀćLPW^N|cPQZ&KkcO)4b H╓$ l$ .B%aPW C*5-4Rq]5 >8ѹn\{Uj\+kkҚ`ڻ%L%&w?EnrUY]_ 5(,#w ФShCْk(U cK_tbT|k4NKxΪ;>ꋪqZ譜0?_9?>U?^*ER鰶 KT/ר~~[3 pj "g_I!B .RAb0F1\s?}x> ;ܴPx&ÈT8Tf>ώ,FK*!eq1ҴFTu'DW H 8H6hJCziب״lW4L5Qӽ1!⎌B0b>a GRT|DqxPeL; 0r-AHM9ǑiII BnkTz'ԌH@f4I'Z1 EUvNvIKZ1 QD7:#O⩋|G$D]I@KpIt!ӆf#>1ퟳ'hNEEQWY~1$-an:cT&6?hn[$(92_P *HƊW-!OCNa1j UĂYZ"D>JNDE9r,]!5ӂj*s!#(&SK,ֆxqT!(ᗂ?Fo;`6ѩYFֿ̖hIEd7-1LԧxM'ӥC3?CAJXFűVzOHUK5n7L"<+CLDRR:C]uSJuiXAXTZ[f^Ʉ(eFEh @ -\$-U)@H8%|?zKZ_lmh /tqXi}z^t% B `v)P];{oFEG(+7w(缣(<C&~ < E e1+TkԹE"R8EQH;uSbp]W& VJmrìUaBqJ~ +3}^ Ck)w pc5>i#$2LbD&L߰!t^K-gZSo A1qw|3 MfR-U^_ԒPl$ hmNq;b&m;w(CB&@LcnFZK<O!67~T`-"Պܠi8853:Re'j+BB/|GyRx1&^[69]`2$;xJ#z[QJ $0,vvߌ`Nt`BiʘM2|wQ?!@C^̸c|ƺgE ˀӎ1ۊ[9u7IK&FА^u'Ԩ`ieT!e׆Źo M ن\hOX8XQk>cEе☙ lL(`ѹCˮQ*YbV\|l*#Q-QHR)*UΪܲLUl?iݳBCЛzt k :˜鈻\?n5&:/qx#a$cHH")m°h7`֎ {DOq@}g1p-}|N|ᗵډE!Q _TK+7%jA)u[f؂Af8cZiй1G!|͌ucޢSghIWm\ىú'TTĸwZR^iMVO#aOҋiO3:,+dz^GkTA?׆1(J_=Vzd8E}c\GRMflm9 7j ch'+4z м=Zɲˎo1FzvKq xUԊrXsx*D6 )7]QqǓN጖R-FBѠ푶ڂ]SpV_KLr#هm>Id:Xns_K#{Ku*q]suDE/Mڌ?Jj rᩌq7iLJ->/oYÑҫ!E;|=ջB iJԲ>~?=c ,TI6DK 8k8o8'S:]Bh&th܍&JpbA-',zit}\'{NS.>=QNlFSLP^\a`sD6`1x@pYp A9"b|e%2Om0PGɬWb1)FK57#L.זzgV;NԦBҬAHFYyٍ8{s%+"AE,C3lb#Q8%-m0989:p Q1oq\BP$0f|V81 |O;C=I~M:w[Jɦ&WD_CtbV(~ hT`mzj\ aL[d?krPㄸA7)HJ_Cj]!j)쑻g)AEm %L *GRCkфk>jj|#G.% z)>5ew.1Y3د:QW*5aW)0B5>c+,5G<*8\ȒFAHΔЀ+Bp#BAV?XP'Cj _ 0K MS]4刏FWߍX5: 7lXL;4in5M`36*:F K%GGwFCԌDUsL34f,ٶuC83iL=aK~P)y=,D$#.b?!C^5C,m4\e3/[2 @' miW4Y4: ?*ipJ@j PP)Fb23`֠+ҳp@jJ+҃'Tfxt*❢RvиrʹEcUƸmj ^}Wu9!`)0&SV XUx!:C{Uy qHZ*}">mnL]KT]a^0S(a5ߙz"T&@ZHҘҭ.dv۴|8eH("&͛^ɫ"D$EC h-$L-,mt%m!$ۧI# hxqƿGW IIC:ъ)L^y9H.N$~g-.ϓyhҭ38G葤5'U_VjmÔbe%$$u'zEB;_^Y'j!&q L!RK$ $퍒l,Y_n&+ͬG^Y"_ ;ܳJXheyXRTGZ"TF"e72V5(2}Y!(Cg◝aL*D2DTQ&6e)\7#H!w+G??ъTpOP%ShƊ_߷&2Vm`\Y-jǓ+,>F'䨙IVm jy 3k|n(]#oy[hf cԮ#JCj'BhM EA2 /ux/ bZwj祧;f]=$#!Q}d))a SΪazM†d * cԨ ge ×g8ũR P2`-K,#!'3[L3œhG"74jv{{90zrQ^b_yO6aOm`-5 d© "srzbYa< ߆cQ%`RRSVE y6Kr]zˤ9{i="q=4G>,zBi6)P}MJ%F>E ҋ'fKLD̂W'^'k%S.e٥ҙS,Bv T0flgv3S\aMWAt& &W>~ėWX*u[ZLnq*4wBaHnwZR05h"q?gYyO.t*ԄS|Z.QA/]x iKT֮)핲c/C# Cժ.tF5{%BOE]b8#(NĄnGF"dWkrQ@r.FKFŖcLD"A ,;GPթ%DQx6Ŀ[#[ 3D'JStUqfe'") 2/HqFWtNګjiy dRVs&iS{Ꙭ|׽ 񟺶W=Tn:.:.rp^ #GI/xqEk-b+\W(':R-{t 8dR?Ib'V(˺$)C,#8M^V+Xn#QV+/- V¨]#\HڑNr`) xg &nD-☭`uIp_D9etLB:b㩟23\< `8 *,E*HCBzN#jrp0n'{]H%K:^!TCRh,JPD<?<#hU}zwesq>P!P X’:ɛmB&NHR, p]%\6dS#u z,XA^쏈x³>k{,OGč@ZTx>͡9OoĻ^n92~DJ* #OHtq!#%Fi$n`Ħ;t6{qxC|))y.TpѶLMضLp08qO XFӒ5Xi~#EֹGJ;V"d̳WAr2NVIi:z e;K҈۟4yӑb?cn]+pLW!~=JoKW/"MK (bQH* =_ 0D.}dEc\x䆼W; #a⅚+,mȥjK=YJ?Q)y|#+C"?j.ފ1)bgH ŇkKN ]/Wgî͆`.}'#HL5J%"qL%i9\J$xu_\OUaT?峜Uº. km{k"= }h) 69L!-7Zx뤦Ϣs*b'A>8(o73ṿ Ӛ.O-v *(傊,Uie,ds~Rf-h*L1dۏ/ܧO70AED:)kD|6#]G7&TtD$ݨH0QD4ճo'ɛa|>jj'sEZ-K>(*:3™)C!fR[կJ-c)ez%<:< P޼Ꮔ㠘( N%D%jM&+c ,U f-L>̀Ƌʤ s#,34ʛO2NV ,>Frl%NJk7\H-@I(\7p},T"BǍ$G a?DX&fsHbq#>!<lc*(C[.d"уIC#h"#=h@DcJmT:4(1$hfE=Ky9 >H_y[^]dX7~]Tbmw/0.;%1M3j"(ZTO)|)AJud0F"0G Izz>M&j-7\-;tZE-cES1""ѺֶEG!$MiZ&Hy8( C X~$'o-Byu?رmn$-S MW0 s6:UTdr*ҌfR=$5䚨T|a KuI1w3r -XNaXaZP$Y)Xm06o(=;~0vB&VA. yvN X0#V.R6K+MNzHD,40F^ێ.S^F9&!0#+QLWJe8?tA3ϕU$\LI͊8QxJ vP0‰kchX(FI& i88ZxY8Q܊38f 5@`(B#eAfm(`ϛ|m'I|ܔe YsC&00AR*F 3_Un'= Fi6E0WpaY'׎JB1È@mL"%as†*' _ Q~ k[vœhzvotW``Q\sXl,$Hx\ѩ9l+Wݻ?ה$"kXUH"72VqHRI }KAbO,%(eF:$z+wTuCCl+kivʌ]_M$T4'gàκxD+TdbȄq'TH HD7vEm| >QߩgMd,W|F #*߿>g,Ozamf.6,EFROZ>#/쌣 trҾ`-$Z +^n~FO|n"q9I XSB(6tNu6P7VxXcAPvev h%gž!G­urcCq؝pEé:n8J0>'. 5rr?+n=XtTܰ;\2v;Fm*64E؊PW_Z@us ¶HlQ~߮> n~\7ln k߻9/5>ި'K bo3Ĭ[h,?%'.I,e8~2fEҧ^FRc;Mҟ:)+FUDZ.J/I fcpB$~.%ysHĦRc^>GSymI Et#E Z)%Y9&`SVB_LIFD<2RmlcjG0*0_J9|bVC(rxeNae 3*$}uĝKH[ݜ_wC;k:^4f_Bt!Fi51)3~ ,~8TU0 @+WuevMβl .GF/Y0sF^~?;b&ކz$يҼHW@0C\UnfpNzYV)ѸkhhVJ%0"7_10,\9@nX">/fXIPlJɈektDl Ima<}R~DbSPC5;(jF1'xV5WOR@8uj3J-;Wx+*dB8ʲ4QrHbekq?2+"p̓T^ۊ$_ ʝO,Q|q?OR#Rt5":c ,R"ɿpPؔ𥳐j^Jp!0J1{rMدurCPd"nQ6v]H(bb!&lc%]/RW()U+G2"͔h!^=Hhry]4dLT҄s@orVFAAuT@& [kɦnu>?p>M!U TD'wY}IhjV4fLR[>\J˭n2HGpQ)ȒTXd^mE Mm(\1ʺIFSM(daUw=c-e!- AGh"JoHf wtW}XO ҮRX)+7>ev*CrVI"$*d\MbΧwIGKQoS4qpRbAKADmu8kbEkbb>t|P8"c8:JN`+rAxL6/23&x'<dģH- *=e bX ߊeh Cz%'TXYT䆈fw02YɊ7I.nH/8ñW$S ٜ qrF5SOyfV}\=P=rQDOplrʖ1 *6YlL_\_*(lɦS⩓&ݺu&ZQ{Q C,4AM #gOL_icA 5I#7%rqi~ne(̫ .!%Q'i-.xu8b6h ^ӕ{A =V# @LXje:0&vHbU8@Bܮ_֖ߓţ"LK/J1Y7L}qesqQ),M0mȯhϑ9!fd(b(661 P,ƛIGݺokʗ (0`R;E_ myPKB:(WˡZR%6Y:Q\W8pHm9hhA4P%ْ^!jWNzl$V5C!Wa˼iѐu_fly([rYnI1GٷkJ_UPhٻM,S]0Z*] 2%r1$|8]9Jd(fꏎ4,qf [)5Grt&UT[}&U]29$=~69_ O*HY% KUMy`DBT $/ӜJqZ&$nWUe (t&%_;r04SxOF=6 m(KI;dE g%g q -; a+a7mjt;cb']9MuC jj '/%7$~}mWH1E^;&PRr g=J9JyO2Za'\pCGOi LB0 4(N:9%U$qɘ(qi=0fX~`؁ZT,XUsS=;m)]h0(R麙|J9 !v4HR(Шf/($ ي@8"K_g xP8UA'=B I7~A"t[O{WB WJWaHͺS.3;KMIE+!N9"_:Q;0fd#jTXV,1Ƕٞ0AD&ef&AG9ҕb 8TlaEڧm \JRJNYqʩʔD:x[[|aGIӱn|ay1\#9R PgIr0擪Ӑm%vV:ηb츳5.@ Q%.M!\y;~N( tJ4(Ti&&ߞsB2qE<  c׊`m3{V2vDB*b܆J˛H3MeS̕kuلBmQTڿ½^/M5ah{  R9JUjt4)~ZK.t5#5ljwKj?͓"͠c"1{U{U#mND@z;G6݋+흉 DgD=e j6q?Z~DȖaU!&1&Wiڑ ¼?gI8)kthk in[E@S@.3<9Ėc)"-ڑrQuʝ@W8'EfЦ6.膀3R*np-QcHz;1O{jZR A^&`W*~#i$t] .K+@ooFQ hs)0ոM# T5,q틁v!mVA%N}t·625 ɚ<~Z>) FEnbD*Ơ҇O3i9Q'|?!kVM64kb=1\EnR/Q}m@ͱMO!aA΄KRlk<:⑖T5fEx WPmSQS hI$FA_,+}OXF;ֈL1CSJNKEApOb NISiK5G~bgFWJosz4ը P.LDZ. = b|,6/(ȓS[sf|`h1+IBQ4@Y)z!L DHaٮb$ٷzyW햍:Dj4?TBfP]?i:i'2qbL]k@[Q.y6v#2M;VyUUg_mG~Ǚ6kfF\3]Űw[̅*`^Jt˭j} .%[?r 7Xٌ5xEH܄2V-sC77RhQ6-ϑփuM:WN,ɖ,% R(]1Ur҃;2]$/?WNs?ї9'!|;< BLWZéZj5Hcs8Ls(G|Q%m"}N(28"Kz̴q'R<4W&nr9;?AH'chB!_spe͑ +6})6҈ N ')G }" ^2y~آ#-翙ᆙ &X[&A1GI{T ="A%z}-S ]}J*9),99Kb1U 5i[NI'쳷zL/%Eo#B⫽q-9BF#@ qh7kaN$rUr9?"z_\kU;\RIlQd Q(q*[PdN-g~íB\:Dܵ&-|ٳԯl}2,s/E8A:۰͙IX8܍okaӧ2:ფf4̙p@ϝ!=gH3&DSb>hbBNFK,'ܷƓ1CUf/$I*Aɂ܃'+ :y,rļ r~њjb"m0TVĮ`hw=[*=f+Nu6K%^$D/)r*I$<:=]OxU)F(Hk屄ON#JeMViy0\TϾmΒ OT-؅\,]YM4o&Bf6-JIӾiƘgZm,ɐo1PwY6i4X+#` + SnQ:"v?V`^gga1u`&G891b+H[f-~uCo])m4ttycF^٢s«YwUuY*>O3"G+:&/:'/(ANRI5ZX?4^}@jWP9#4gP,coQ*,K L pϧqhSE$͇T ;&`,r)DyhK"%D4y'qZt'po̒7=Hs]*όš2WY.8\腂ئE/h~ԄaW\LykxT 6 !d@&Dg` I(x+i8!-ɬAQ"'Yo-"EAhK>6ye2;ExHZwpE ۵g\elNp[4PJqCcYݦ&$t tO `Sb@ ԋnPQ%&9R)cNҲ>Q`a}#x/=0KꥡS S8;:bv_sIqeLJdj۠ཬm~D,pՒX+ic"fU㤰i9s0ODJϚH:!L5-ɼ'4C$.,g2/yH\ [d:u3V:#YI"JGoŝ$W<ܲusx"9ƴ_szV&)b~Yk /IWxoK$Uu&"J#k[](F7P%Y/z\ex.n5ȹ/p~HD0 M 坎Aܮ.硩u;>+^jiZ)XH:{¼eOw3h1[ݓ/+X kN QZ:fQkdj#Aa٧+'d  JS\*wD RֆyNodG[$[aL'88-_3CJ9dJ1%L`ͻPzCltAps(bK@Þ/H]%DdbVBAS1NBK(jq,츼aB;|?ҨWn]2E j( 4- #=hXJeDM4yЉJwykiZ^F@\ Ж-)?/z{Qn.+}(Hk<)RPY6OFyeC UjRIQGkdH-#Z>PX|!G!FyP,AO 5ch0(k+><+(sP)ⷹ!T}"l[3UD!`^\qcEd&F >[|(HX؃ ' A /9 Gl!xuo$ҒURKJ0T i+k` SZyo6  hD[I#Kn(,xjaA(g:i!;%qk<#rk)9KqJ r9LֆJ=bOɃM$GߓJ 0X8SD3AwQi-) S .P) t}9U3w9KC[f+ws* "[,Dk P HZ+DԹB( B,`W5 F9Ko mȂ^*@`1pZآ1Q^!ҚP<%`,YyiJV-r4$XXB-!-8q6puJ! B${ez9_8#8[T9h H)' qhl7Amyq9u<?/znLf7/x]S*30ь}1Oր#eA.R  LάA%y&eT|pL + !m0y•T)YԎ$]#YtCUp#C+Qv.\M4Jl3t+#LIZ`=D(XśkFG1j9@V6ux%A;`UEbE!ȸ͂hGiExOE͈싓"uY&`P\q(FAhDk|H>C̯%ݺ;v6_)Vn@]^EOgKsY>O\V̗Ces =^˘Yrp%Cf&H -hi&n Ek0ȐX0fY(9?^&^yNY(>$Y;9fmKjS=8A.J[} puE{YA !"Rf=׌FG̑vD:f06+Ujq(SȊmkldnqPR)Z4;ݯk@j-!ba }R9dX-ˏV@$iD"]Ekr95[ nHxvu>U3 - m{pn8MLq$Dy _jE,f%)H c.w Go#KYDqۺEU=dH.LYŒূuźݷE f+DG+i.n'4РMUla = 2ftމDtdh!(4$mDN$Iմz׼t\ox%+*Ir }N/aF:MwsA.x*ϯ+l"Ӫ*&ۖͩ\R 멽 lt.TLb,@cDlBTcw!;56Mn,4ڹ>/+Vo+(vpi [ULM"~RGrlôbFe5 ]=UOYb:vt,P$Ƣ?^9Cus qYYR ux+bʝ]{RH-)Vt]{ڗQ5c}o[+w&t OԲ$nG;(yqC1EV"@iNchyD7O!V[K9!9JuWV!c#8}LDkyXD8Q6n*Bf"8`|ERkQ iQe`s:\HKwݓrR+˜ae zGx4$vI.#dW/Y{pcXhkT){"OSKoG"Ffw^Ё "^~z~\+ϱ'uSylJwFS=+k9b~SlCҖm}w^QVx꓀)h<-'j"#IFC$?6!SfVJ{||iDRWoQxH|R5XEgy_sԡ o^ltE4dٺV*M#lFB_V'o}TǓR^SyGN?$)#Qɧ2*kmuzhADa@Yqem2i@qFDVb㥁^ƤR6Ban6+Z,a%$F#<&6ZaH7ƚGײַ!d8gP"} D ;BqWu9tkG"&p%cN`gϐS\"S܁@8vۆ&Hi/>նT>[Apy6оt7O-uo-{_"bVxKVϿb7'ӆ\nycVmVm")%;/g-IcrMzzeo|[ Pɘ)N `+NvF Dڋ_5?%RcP)DccO)hg%gn n\U!1c"} +sE"dƬc 0z'X@jP$E㥶B5`]u6[ANvj0 ~(/ARP' sݡA_# {5suѪ-\NV DZ3OJq^{SV3T\qt&Zi(FYPӎWv)Xd.GpB3%0l g2 v3v^!u:cSOcwI D(R?J*I>@)+ΔbG@XO̘Z;U0ob.JWiQ57'\ub}2gLm6s? ̊cܳb$UV2mj?WnEY1xd< x/Ugfoվ3ZgE)e%؄-8)>$UMSakZpnjVM#rP+BRaLA-XDC;i =vF v#s)1=2,)+)M2{-Bi;9.. 'mpl&wQрbB\-hj|7h̓^ ~fa$b;9M7PvG^?}YTᇳsdh$ KfVjRs'to)P/XV +:2s%D*$ 4IǍlJ{a20{ $ :$ءvt]RPW )3&[$퓦h,Bndq2.,OTYXTINnٞ~'6m-sokkNȏW(-aԝtE6uvǘ#%ghkVufS{Y3p@ȅ]rqW'x3nNhlWa U1K+CVph:)+ؓ|M2Ża4Z"sUa]#0adp/xia@l =7I7a#yfjH ƍ+R ~hJ:cO2-ʍu0H7 KLY~0 ^h&PږPfxDB2%@6բMHiM-QQL :muL,XTq/_eoIuIac\Ev-w%M:y2Ml'DL$y1=4v]A.bfhDVM|,&EFY "DЅ8,D`h8t$M'}J%EW&Q=C u Bט]DЗ\e0XS"&d U"iظ=n󪬚t+._0̑Qxu&J$%1Bi{Si|2["v۞indz[e$$Om- vOk)^گ]4_.}7~i̤2[PqJ)! ,bE&79ъ]"J+7^) F*34Q[EBɡCִP#O/&|IZq$qupAhL([_HoTP"+d06ucrO@n% 00_z',Q58F 9,$DtS1I;UE:izHgmkK1S&}MⲈo@a> @EG^t DV~Jc)T] [`Q6_domV!ڴA#A\ σȔP9/Y#ōۡ3ۉd"VihqGNVOwE0EbPђX&!MWy 1 Hk 5QQC#^[Nn/aՈn#\|MQ8C9MAf\KgҼ$t)pHDC4078bEVIA}.\iaHcyCT;rBiL1|BؤI r|8tf40 PMuqj32i8NioJE*i~,1MRwX__GI15faqmU;46?5L2ncB#6ی:FqQ2y57ةuS+9xZPЛDne4AX͵q@lllsQF6UC~kyiO34yt*(RF|J&Ԥ)([7I^Q>TzNG8 2T)pDB)Wo*ndnbrg=J3z٘/޸$7)Kr墰E WssJh;ҭw(q"j ji (.ZL"Ixv$ Tlܬ5ڶbfe 1/[w͵2"yNZjO]{jVyW-H8=3!m{-zD#ord^]*Qo_4A* fd&g.u {eI, ԙLsBXeĊr^pe7{1|rf^sQFk~HM`ٺ?5`U1m%zW"ʭ'' ͍!U댈lf]#W~dܺ`=Z]|,钥Ɠ KHvER2 btU`eTW~s2G`زQj"P\ )&56悦)%CzRy9l OYsByWs&ɔha֌%cV fJ&&k$oM.)%ķ].YfJyI{W_\< vv6M}5w,ZY45o&a(l'a*uk[O~GHEf߇`ٻX#JK8u߹۸Bd~9O j$$l=-q|Y}'-4Ҷ1d2,|Q"&L N}N*] =yn!65-=o9#إE6)qaEWɫ{:ؘFNǰthGJN%0wɗש:l;;0bk!H&閌^Qnoީ#$Q~Mșg8SEOP𚕇w/N58+h"O0k۲o{}mfx$63_ $SO"#,}-}jyf 襼ޖh(ۤPX*RKzj&rn ̛em@kr TNj7Ʋ"Et u"9ځ)٥TB5*fgf}1Og:J+M5RiY"JWGUTF%-/9B*SեZtezk(;p|)N>֢f>O9c`Cz0s Huu_*ffTt:n;9xX8HUr 6PXDsv01;!z:L&3J˜"Axu M@Aq\?ə5t.1< N|fM xH삡)a;h{)wdYVxe^RФRHT@sdWm!`RmD%DZb= &(NT!Ѫ[\!m2Su&aM\o@Wɱ"_sgn7,0t`*'8kkI%Ӽ9tLsf-AE(҇ɐxZꓦ =LP_Ƶ"tS^&.Ͼ%['O@]6S@bpHbtk^tj%[1ijR2 rc,x3e21PhI۵$Y2]#3;(y֚blmZn+^*Qbri87Ci5znUtfb\3"YA :=qc#5|E%+K6S@劼V_Kйf lptY k$No=O "' Jo -X&-skdR(ZDE+?Н4-S(V1Oz*0B|RΘd%_U J^FrLԢ*B]']M+רmA1T4U/rdOd7yRA Sh{=G18.har J2CUR6NH=vn&* !ˋAu2XJ肇,Q! EI#~-ENdZ,nA!Χ䈝:0z nC! xv H]7 >E!_>E\ϛC(YUXpMuZ]<.ɀQ|a.aWkDΓV@#daf`>@((mdhjNΉT,D&*4[& jz0yi6IiSH'K]X2舼А!ǬJ+%9lgR[kq11 ŅUYb)#@ԢUdB鉌i}{(ck,:g e.!&Ν rjh!ܾji L !I`F.ܙ{4}aO3::%U!qI c8R.ʾ@HQo!&oC42[nHӆH^tΊ( lPlN(g.Ā0 U81:(&0AƊѤTy lv M,pQ}-!n!7,ƈ:f>u0?+?fdt]U{kt$̗YQ2GaF.^ #s&- e"x*A^U;FQ 8r1zju(!]+ޒ&f*+#%K19e/3"ZUOUd,$WbkzKm|Nx!1J-[\@*ѥVI=[pGk}Mz,Ze9ه';O-C} GiV47a$H̷Ɠ^&Ifzlk=mn9‚H*]vA ݗk"4RL@YYr&G0Q-zW[]u}ڦ~6ӠU A_ $pL>߶YYKͰL3~C`}.i}sR'I GsA0(%3!jMoglP/8H9*Q yXFP7)Nu>3VU7/K8 {T $CVCXI$q9e2J6"C , IWjO"⦒hC̷ɘ*J @@Լic0 !9TG/Beq\0# C))#ۉ!9vc=$qƦ!K2fЕ̷ܱ)ZhFjfdqr%z  9X&lsa՘#W"0"(h~W1Jŧ0#R(\!6FTNly,z#4$&X0Nm'wRiWc!LG A7k'L Ȉ#)0M5(rA3P0JWxoBQcE264ckœf^ R4g(7 (Eqrnž-~54E%~(#!պR-8C7虰mxGRM&^H{i')2pB j ͫY3G 7F#Z9;3.#5ѐy VGm7Huh&%1Ba5u~b!] C Pd}&>kܢ%TDɉ2OCWO)lrV;"\Prs0"!N(4)ea\0g|f"*ӵ#v-D؝eQNAa4HnsvNbmaUY'f)#UʥYMI &+$>nyrUMCC<"TOSt˓RC=kJm6Sd1Ƶ1x_: ^)$؊%!5+φG2,V-*Lh2.dhJ#i{r]z5t ]ڶkV3K#ʩ?ؾPiDcDo!7MOҶj4&r0E&HH&WD6{ukEHΩ1Wٽ*>*~4EJ5ծ92f*TmUqFDIs.v7!FD7BRl\ț$+%B{BZKi cId'\Ҥ 5aKb,H65VKͣK;K>"$D %QĄBP)CAlBQؐX1B" XB FL0 i&D FE -yhx*]d 7 "5Rb, dֈL LB"' AS"E6 +2K r2K!HI,$čoD4pfGI1b[(#d,"B"xs g-DL,H, hhM'`1<2#FBOػ ! 0 @\%Ԃ9MLf$"0 &8)Ah26lgv9Qu92(HLz~B,(B$/&G$EK%$!dvOEa#,# /%BcR\L2DVQ!gRJV/YkG ܝ)pD^ʙ&,BHI颔eTP"D)Ma%"d6&H`0pSq#|&94K!k`1F q/AÁƔq $%XGZ (lFע׮@SҍiAH)JE4>'3I,CcY¿5.av?%DX)v`H U(,ՓtØ$6K`sOW3TT]״%ʥaPOd(ݓ"1& 5I&4[LSVnbTo[k1XqBAD5'9-Sjv4QH8AB Q.T$j.OG/LG/St› ^4s\C'pR/*'X=,뀍._La؂jv{J=$(|1i+v"do8}-7|8KJ-Dޡr4%Df[{ԁJFS-W0Jv a6OUu5vL]g M]sӔKbm\ɇ"Q()i;` S֪ٜ#\_Jy؂7Mr;]nE2(UFSɥRhOZWb+ S][^c깿{ZQOK2nլS"J2F.B9j0rIg'n]6`c>[+dq3cKCXytZ1S63Q\bNڄ.b5T KjɮaR7#rq,[éQɝ^7-TjyA0,U$Zn0.Bd#l|0q*w@S %"!”Ff Jb`ԁk!AS2ȅ7Few\ TkaȄ])E:\דȆRPQ "%SR d L\21(0.*J 6cĕbA.!q $pf*NCE4b07C$Sazf+TT`X @Z"f.SD" 0' c  D\J|)1s5G!H# C(ѝ@1̙|:@`;!" JP ܄ET$+ܨBpW"kx@\V@ϸ_~Rc=::u(M~TC 2~`h+x^t ᫈12q(NC b)191H[6̊Ba90%5Дy!HcJza):f{ch3&Jg=ʤl2,0H9 C E9PC(,f%j,!qPP@"2DEeE2)B(,8Aon`!xLxX.8 0 Y8EKY.Naq'By@\YkL/VPGԑ!^$ Frb 92fP]o7@dF;U1Hi)0*Jjbߥj2Ԩ5yHc(4 +A"Z:F:5yiGli%&P>V)FE}tBԧ c"r-FaQaUP&#)d۠MFEGj!M*"Qm (*!; IdBV0wBCQ['A0N0c-A%dA83Tª)bjSbF0n &cgtV4L8oDp-F4'5!)+Y+*9fȉ0j՚: wCtPGJ%jlD'm+tKnZ%-Ǵ2S133UtPaS)ZCFfTV bxNGhVDherx&2ДRhy+$4BK[*=E GMkit 1 unknown 192 0 0 0.8 1 1 0 C0 -1 0 false 0 0 0.8 1 1 0 C0 -1 1 false 24 0 0.8 1 1 0 C0 -1 3 false 24 0 0.98 1 1 0 C0 -1 2 false 36 0 0.8 1 1 0 C0 -1 3 false 36 0 0.42 1 1 0 C0 -1 0 false 48 0 0.54 1 1 0 C0 -1 0 false 72 0 0.8 1 1 0 C0 -1 1 false 72 0 0.8 1 1 0 C0 -1 1 false 72 0 0.68 1 1 0 C0 -1 2 true 84 0 0.8 1 1 0 C0 -1 0 true 96 0 0.8 1 1 0 C0 -1 0 false 96 0 0.8 1 1 0 C0 -1 2 false 108 0 0.5 1 1 0 C0 -1 3 false 120 0 0.8 1 1 0 C0 -1 3 false 132 0 0.8 1 1 0 C0 -1 2 false 132 0 0.54 1 1 0 C0 -1 1 false 144 0 0.8 1 1 0 C0 -1 1 false 156 0 0.8 1 1 0 C0 -1 0 false 168 0 0.8 1 1 0 C0 -1 3 false 168 0 0.58 1 1 0 C0 -1 69 false 180 0 0.8 1 1 0 C0 -1 666 false hydrogen-1.0.0-rc1/src/tests/data/song/000077500000000000000000000000001366722712400176345ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/tests/data/song/test_song_0.9.6.h2song000066400000000000000000000612741366722712400235270ustar00rootroot00000000000000 0.9.6-beta1 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true pattern 0 0 0 0 Kick 1 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/kick_Dry_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 1 Stick 0.69 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/stick_Woody.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 2 Snare Jazz 1 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/sn_Jazz_c.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 3 Hand Clap 0.88 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/clap_Dry_c.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rock 1 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/sn_Wet_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 5 Tom Low 0.96 false 0.44 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/tom_Rock_lo.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 6 Closed HH 0.89 false 1 0.78 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/hhc_Dry_a.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 7 Tom Mid 1 false 0.8 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/tom_Rock_mid.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 8 Pedal HH 0.89 false 1 0.78 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/hhp_Dry_a.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 9 Tom Hi 1 false 1 0.42 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/tom_Rock_hi.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 10 Open HH 0.8 false 1 0.84 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/hhc_Rock_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 11 Cowbell 0.8 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/misc_Cowbell.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 12 Ride Jazz 0.8 false 1 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/cym_Jazz.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 13 Crash 0.69 false 1 0.88 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/cra_Rock_a.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 14 Ride Rock 0.8 false 0.58 1 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/cym_Rock_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 15 Crash Jazz 0.77 false 1 0.78 1 false 1 0 0 0 0 0 0 0 1 1000 0 -1 false -1 60 /Applications/Hydrogen.app/Contents/MacOS/../Resources/data/drumkits/GMkit/cra_Jazz.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 Pattern 1 not_categorized 192 0 0 0.8 0.5 0.5 0 C0 -1 0 false 0 0 0.8 0.5 0.5 0 C0 -1 6 false 24 0 0.8 0.5 0.5 0 C0 -1 6 false 48 0 0.8 0.5 0.5 0 C0 -1 2 false 48 0 0.8 0.5 0.5 0 C0 -1 6 false 72 0 0.8 0.5 0.5 0 C0 -1 6 false 96 0 0.8 0.5 0.5 0 C0 -1 0 false 96 0 0.8 0.5 0.5 0 C0 -1 6 false 120 0 0.8 0.5 0.5 0 C0 -1 0 false 120 0 0.8 0.5 0.5 0 C0 -1 6 false 144 0 0.8 0.5 0.5 0 C0 -1 2 false 144 0 0.8 0.5 0.5 0 C0 -1 6 false 168 0 0.8 0.5 0.5 0 C0 -1 6 false Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/src/tests/data/song/test_song_0.9.7.h2song000066400000000000000000000306601366722712400235230ustar00rootroot00000000000000 1.0.0-'42f3fa4' 120 0.73 0.5 Untitled Song Unknown Empty song. Unknown license true true pattern 0 0 0 0 Main 1 0 Kick GMkit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 35 -1 0 127 0 1 kick_Dry_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 4 Snare Rock GMkit 1 false 1 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 40 -1 0 127 0 1 sn_Wet_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 13 Crash GMkit 0.69 false 1 0.88 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 49 -1 0 127 0 1 cra_Rock_a.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 14 Ride Rock GMkit 0.8 false 0.58 1 1 true false 1 0 0 0 0 0 0 0 1 1000 0 -1 false VELOCITY -1 59 -1 0 127 0 1 cym_Rock_b.flac false forward 0 0 0 0 0 1 4 1 0 1 1 0 Pattern 1 not_categorized 192 0 0 0.8 0.5 0.5 0 1 C0 -1 0 false 0 0 0.8 0.5 0.5 0 1 C0 -1 13 false 24 0 0.8 0.5 0.5 0 1 C0 -1 14 false 48 0 0.8 0.5 0.5 0 1 C0 -1 4 false 48 0 0.8 0.5 0.5 0 1 C0 -1 14 false 72 0 0.8 0.5 0.5 0 1 C0 -1 0 false 72 0 0.8 0.5 0.5 0 1 C0 -1 14 false 96 0 0.8 0.5 0.5 0 1 C0 -1 0 false 96 0 0.8 0.5 0.5 0 1 C0 -1 14 false 120 0 0.8 0.5 0.5 0 1 C0 -1 14 false 144 0 0.8 0.5 0.5 0 1 C0 -1 4 false 144 0 0.8 0.5 0.5 0 1 C0 -1 14 false 168 0 0.8 0.5 0.5 0 1 C0 -1 14 false Pattern 2 not_categorized 192 Pattern 3 not_categorized 192 Pattern 4 not_categorized 192 Pattern 5 not_categorized 192 Pattern 6 not_categorized 192 Pattern 7 not_categorized 192 Pattern 8 not_categorized 192 Pattern 9 not_categorized 192 Pattern 10 not_categorized 192 Pattern 1 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 no plugin - false 0.0 hydrogen-1.0.0-rc1/src/tests/functional_tests.cpp000066400000000000000000000147711366722712400220570ustar00rootroot00000000000000/* * Hydrogen * Copyright(c) 2002-2018 by the Hydrogen Team * * http://www.hydrogen-music.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 #include #include "test_helper.h" #include "assertions/file.h" #include "assertions/audiofile.h" #include #include using namespace H2Core; /** * \brief Export Hydrogon song to audio file * \param songFile Path to Hydrogen file * \param fileName Output file name **/ void exportSong( const QString &songFile, const QString &fileName ) { auto t0 = std::chrono::high_resolution_clock::now(); Hydrogen *pHydrogen = Hydrogen::get_instance(); EventQueue *pQueue = EventQueue::get_instance(); Song *pSong = Song::load( songFile ); CPPUNIT_ASSERT( pSong != nullptr ); if( !pSong ) { return; } pHydrogen->setSong( pSong ); InstrumentList *pInstrumentList = pSong->get_instrument_list(); for (auto i = 0; i < pInstrumentList->size(); i++) { pInstrumentList->get(i)->set_currently_exported( true ); } pHydrogen->startExportSession( 44100, 16 ); pHydrogen->startExportSong( fileName ); bool done = false; while ( ! done ) { Event event = pQueue->pop_event(); if (event.type == EVENT_PROGRESS && event.value == 100) { done = true; } else { usleep(100 * 1000); } } pHydrogen->stopExportSession(); auto t1 = std::chrono::high_resolution_clock::now(); double t = std::chrono::duration( t1 - t0 ).count(); ___INFOLOG( QString("Audio export took %1 seconds").arg(t) ); } /** * \brief Export Hydrogon song to MIDI file * \param songFile Path to Hydrogen file * \param fileName Output file name **/ void exportMIDI( const QString &songFile, const QString &fileName, SMFWriter& writer ) { auto t0 = std::chrono::high_resolution_clock::now(); std::unique_ptr pSong { Song::load( songFile ) }; CPPUNIT_ASSERT( pSong != nullptr ); writer.save( fileName, pSong.get() ); auto t1 = std::chrono::high_resolution_clock::now(); double t = std::chrono::duration( t1 - t0 ).count(); ___INFOLOG( QString("MIDI track export took %1 seconds").arg(t) ); } class FunctionalTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( FunctionalTest ); CPPUNIT_TEST( testExportAudio ); CPPUNIT_TEST( testExportMIDISMF0 ); CPPUNIT_TEST( testExportMIDISMF1Single ); CPPUNIT_TEST( testExportMIDISMF1Multi ); // CPPUNIT_TEST( testExportMuteGroupsAudio ); // SKIP CPPUNIT_TEST( testExportVelocityAutomationAudio ); CPPUNIT_TEST( testExportVelocityAutomationMIDISMF0 ); CPPUNIT_TEST( testExportVelocityAutomationMIDISMF1 ); CPPUNIT_TEST_SUITE_END(); public: void testExportAudio() { auto songFile = H2TEST_FILE("functional/test.h2song"); auto outFile = Filesystem::tmp_file_path("test.wav"); auto refFile = H2TEST_FILE("functional/test.ref.flac"); exportSong( songFile, outFile ); H2TEST_ASSERT_AUDIO_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } void testExportMIDISMF1Single() { auto songFile = H2TEST_FILE("functional/test.h2song"); auto outFile = Filesystem::tmp_file_path("smf1single.test.mid"); auto refFile = H2TEST_FILE("functional/smf1single.test.ref.mid"); SMF1WriterSingle writer; exportMIDI( songFile, outFile, writer ); H2TEST_ASSERT_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } void testExportMIDISMF1Multi() { auto songFile = H2TEST_FILE("functional/test.h2song"); auto outFile = Filesystem::tmp_file_path("smf1multi.test.mid"); auto refFile = H2TEST_FILE("functional/smf1multi.test.ref.mid"); SMF1WriterMulti writer; exportMIDI( songFile, outFile, writer ); H2TEST_ASSERT_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } void testExportMIDISMF0() { auto songFile = H2TEST_FILE("functional/test.h2song"); auto outFile = Filesystem::tmp_file_path("smf0.test.mid"); auto refFile = H2TEST_FILE("functional/smf0.test.ref.mid"); SMF0Writer writer; exportMIDI( songFile, outFile, writer ); H2TEST_ASSERT_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } /* SKIP void testExportMuteGroupsAudio() { auto songFile = H2TEST_FILE("functional/mutegroups.h2song"); auto outFile = Filesystem::tmp_file_path("mutegroups.wav"); auto refFile = H2TEST_FILE("functional/mutegroups.ref.flac"); exportSong( songFile, outFile ); H2TEST_ASSERT_AUDIO_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } */ void testExportVelocityAutomationAudio() { auto songFile = H2TEST_FILE("functional/velocityautomation.h2song"); auto outFile = Filesystem::tmp_file_path("velocityautomation.wav"); auto refFile = H2TEST_FILE("functional/velocityautomation.ref.flac"); exportSong( songFile, outFile ); H2TEST_ASSERT_AUDIO_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } void testExportVelocityAutomationMIDISMF1() { auto songFile = H2TEST_FILE("functional/velocityautomation.h2song"); auto outFile = Filesystem::tmp_file_path("smf1.velocityautomation.mid"); auto refFile = H2TEST_FILE("functional/smf1.velocityautomation.ref.mid"); SMF1WriterSingle writer; exportMIDI( songFile, outFile, writer ); H2TEST_ASSERT_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } void testExportVelocityAutomationMIDISMF0() { auto songFile = H2TEST_FILE("functional/velocityautomation.h2song"); auto outFile = Filesystem::tmp_file_path("smf0.velocityautomation.mid"); auto refFile = H2TEST_FILE("functional/smf0.velocityautomation.ref.mid"); SMF0Writer writer; exportMIDI( songFile, outFile, writer ); H2TEST_ASSERT_FILES_EQUAL( refFile, outFile ); Filesystem::rm( outFile ); } }; CPPUNIT_TEST_SUITE_REGISTRATION( FunctionalTest ); hydrogen-1.0.0-rc1/src/tests/instrument_list_test.cpp000066400000000000000000000046031366722712400227660ustar00rootroot00000000000000#include #include #include #include using namespace H2Core; class InstrumentListTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( InstrumentListTest ); CPPUNIT_TEST( test_one_instrument ); CPPUNIT_TEST( test1 ); CPPUNIT_TEST( test2 ); CPPUNIT_TEST( test3 ); CPPUNIT_TEST( test4 ); CPPUNIT_TEST_SUITE_END(); public: void test_one_instrument() { InstrumentList list; Instrument *kick = new Instrument(EMPTY_INSTR_ID, "Kick"); kick->set_midi_out_note(42); list.add(kick); CPPUNIT_ASSERT( !list.has_all_midi_notes_same() ); } void test1() { InstrumentList list; Instrument *kick = new Instrument(EMPTY_INSTR_ID, "Kick"); kick->set_midi_out_note(10); list.add(kick); Instrument *snare = new Instrument(EMPTY_INSTR_ID, "Snare"); snare->set_midi_out_note(10); list.add(snare); Instrument *hh = new Instrument(EMPTY_INSTR_ID, "HiHat"); hh->set_midi_out_note(10); list.add(hh); CPPUNIT_ASSERT_EQUAL( 3, list.size() ); CPPUNIT_ASSERT( list.has_all_midi_notes_same() ); } void test2() { InstrumentList list; Instrument *kick = new Instrument(EMPTY_INSTR_ID, "Kick"); kick->set_midi_out_note(36); list.add(kick); Instrument *clap = new Instrument(EMPTY_INSTR_ID, "Clap"); clap->set_midi_out_note(37); list.add(clap); Instrument *ride = new Instrument(EMPTY_INSTR_ID, "Ride"); ride->set_midi_out_note(38); list.add(ride); Instrument *dummy = new Instrument(EMPTY_INSTR_ID, "Dummy Instrument"); dummy->set_midi_out_note(36); // duplicate list.add(dummy); CPPUNIT_ASSERT_EQUAL( 4, list.size() ); CPPUNIT_ASSERT( !list.has_all_midi_notes_same() ); } void test3() { InstrumentList list; list.add( new Instrument() ); list.add( new Instrument() ); list.add( new Instrument() ); list.set_default_midi_out_notes(); CPPUNIT_ASSERT_EQUAL( 36, list.get(0)->get_midi_out_note() ); CPPUNIT_ASSERT_EQUAL( 37, list.get(1)->get_midi_out_note() ); CPPUNIT_ASSERT_EQUAL( 38, list.get(2)->get_midi_out_note() ); } //test is_valid_index void test4() { InstrumentList list; list.add( new Instrument() ); CPPUNIT_ASSERT( list.is_valid_index(0) ); CPPUNIT_ASSERT( !list.is_valid_index(1) ); CPPUNIT_ASSERT( !list.is_valid_index(-42) ); } }; CPPUNIT_TEST_SUITE_REGISTRATION( InstrumentListTest ); hydrogen-1.0.0-rc1/src/tests/main.cpp000066400000000000000000000035351366722712400174130ustar00rootroot00000000000000#include #include #include #include #include #include #include "test_helper.h" void setupEnvironment(unsigned log_level) { /* Logger */ H2Core::Logger* logger = H2Core::Logger::bootstrap( log_level ); /* Test helper */ TestHelper::create_instance(); TestHelper* test_helper = TestHelper::get_instance(); /* Object */ H2Core::Object::bootstrap( logger, logger->should_log( H2Core::Logger::Debug ) ); /* Filesystem */ H2Core::Filesystem::bootstrap( logger, test_helper->data_dir() ); H2Core::Filesystem::info(); /* Use fake audio driver */ H2Core::Preferences::create_instance(); H2Core::Preferences* preferences = H2Core::Preferences::get_instance(); preferences->m_sAudioDriver = "Fake"; H2Core::Hydrogen::create_instance(); } int main( int argc, char **argv) { QCoreApplication app(argc, argv); QCommandLineParser parser; QCommandLineOption verboseOption( QStringList() << "V" << "verbose", "Level, if present, may be None, Error, Warning, Info, Debug or 0xHHHH","Level"); parser.addHelpOption(); parser.addOption( verboseOption ); parser.process(app); QString sVerbosityString = parser.value( verboseOption ); unsigned logLevelOpt = H2Core::Logger::None; if( parser.isSet(verboseOption) ){ if( !sVerbosityString.isEmpty() ) { logLevelOpt = H2Core::Logger::parse_log_level( sVerbosityString.toLocal8Bit() ); } else { logLevelOpt = H2Core::Logger::Error|H2Core::Logger::Warning; } } setupEnvironment(logLevelOpt); CppUnit::TextUi::TestRunner runner; CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest( registry.makeTest() ); bool wasSuccessful = runner.run( "", false ); return wasSuccessful ? 0 : 1; } hydrogen-1.0.0-rc1/src/tests/midi_note_test.cpp000066400000000000000000000073521366722712400214760ustar00rootroot00000000000000#include #include #include #include #include #include #include #include using namespace H2Core; #define ASSERT_INSTRUMENT_MIDI_NOTE(name, note, instr) checkInstrumentMidiNote(name, note, instr, CPPUNIT_SOURCELINE()) void checkInstrumentMidiNote(std::string name, int note, Instrument *instr, CppUnit::SourceLine sl) { auto instrName = instr->get_name().toStdString(); auto instrIdx = instr->get_id(); auto instrNote = instr->get_midi_out_note(); if (instrName != name) { std::string msg = "Bad instrument at index " + std::to_string(instrIdx); ::CppUnit::Asserter::failNotEqual(name, instrName, sl, CppUnit::AdditionalMessage(), msg); } if (instrNote != note) { std::string msg = "Bad MIDI out note for instrument " + instrName; ::CppUnit::Asserter::failNotEqual(std::to_string(note), std::to_string(instrNote), sl, CppUnit::AdditionalMessage(), msg); } } /* Find test file * * This function tries to find test files in several directories, * so they can be found whether tests have been run from project * root or build directory. * * Exception of class std::runtime_error is thrown when file * can't be found. */ static QString get_test_file(const QString &name) { std::vector paths = { "./src", "../src" }; for (auto const &path : paths) { QString fileName = path + "/tests/data/" + name; QFileInfo fi(fileName); if ( fi.exists() ) { return fileName; } } throw std::runtime_error(std::string("Can't find test file ") + name.toStdString()); } class MidiNoteTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( MidiNoteTest ); CPPUNIT_TEST( testLoadLegacySong ); CPPUNIT_TEST( testLoadNewSong ); CPPUNIT_TEST_SUITE_END(); public: void setUp() override { Hydrogen::create_instance(); } void testLoadLegacySong() { return; // skip this test /* Read song created in previous version of Hydrogen. * In that song, all instruments have MIDI note set to 60. * Exporting that song to MIDI results in unusable track * where all instruments play the same note. * That confuses users, so after loading song, assign * instruments sequential numbers starting from 36, * preserving legacy behavior. */ SongReader reader; auto song = reader.readSong( get_test_file("song/test_song_0.9.6.h2song") ); CPPUNIT_ASSERT( song != nullptr ); auto instruments = song->get_instrument_list(); CPPUNIT_ASSERT( instruments != nullptr ); CPPUNIT_ASSERT_EQUAL( 16, instruments->size() ); ASSERT_INSTRUMENT_MIDI_NOTE( "Kick", 36, instruments->get(0) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Stick", 37, instruments->get(1) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Snare Jazz", 38, instruments->get(2) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Hand Clap", 39, instruments->get(3) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Closed HH", 42, instruments->get(6) ); } void testLoadNewSong() { /* Read song with instruments that have assigned distinct * MIDI notes. Check that loading that song does not * change that mapping */ SongReader reader; auto song = reader.readSong( get_test_file("song/test_song_0.9.7.h2song") ); CPPUNIT_ASSERT( song != nullptr ); auto instruments = song->get_instrument_list(); CPPUNIT_ASSERT( instruments != nullptr ); CPPUNIT_ASSERT_EQUAL( 4, instruments->size() ); ASSERT_INSTRUMENT_MIDI_NOTE( "Kick", 35, instruments->get(0) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Snare Rock", 40, instruments->get(1) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Crash", 49, instruments->get(2) ); ASSERT_INSTRUMENT_MIDI_NOTE( "Ride Rock", 59, instruments->get(3) ); } }; CPPUNIT_TEST_SUITE_REGISTRATION( MidiNoteTest ); hydrogen-1.0.0-rc1/src/tests/note_test.cpp000066400000000000000000000033601366722712400204670ustar00rootroot00000000000000#include #include #include #include #include #include using namespace H2Core; class NoteTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( NoteTest ); CPPUNIT_TEST( testProbability ); CPPUNIT_TEST( testSerializeProbability ); CPPUNIT_TEST_SUITE_END(); void testProbability() { Note n(nullptr, 0, 1.0f, 0.5f, 0.5f, 1, 1.0f); n.set_probability(0.75f); CPPUNIT_ASSERT_EQUAL(0.75f, n.get_probability()); Note other(&n, nullptr); CPPUNIT_ASSERT_EQUAL(0.75f, other.get_probability()); } void testSerializeProbability() { QDomDocument doc; QDomElement root = doc.createElement("note"); XMLNode node(root); InstrumentList *instruments = new InstrumentList(); Instrument *snare = new Instrument( 1, "Snare", nullptr ); instruments->add( snare ); Note *in = new Note(snare, 0, 1.0f, 0.5f, 0.5f, 1, 1.0f); in->set_probability(0.67f); in->save_to(&node); Note *out = Note::load_from(&node, instruments); CPPUNIT_ASSERT(in->get_instrument() == out->get_instrument()); CPPUNIT_ASSERT_EQUAL(in->get_position(), out->get_position()); CPPUNIT_ASSERT_EQUAL(in->get_velocity(), out->get_velocity()); CPPUNIT_ASSERT_EQUAL(in->get_pan_l(), out->get_pan_l()); CPPUNIT_ASSERT_EQUAL(in->get_pan_r(), out->get_pan_r()); CPPUNIT_ASSERT_EQUAL(in->get_length(), out->get_length()); CPPUNIT_ASSERT_EQUAL(in->get_pitch(), out->get_pitch()); CPPUNIT_ASSERT_EQUAL(in->get_probability(), out->get_probability()); /* FIXME: this causes double free delete in; delete out; delete instruments; delete snare; */ } }; CPPUNIT_TEST_SUITE_REGISTRATION( NoteTest ); hydrogen-1.0.0-rc1/src/tests/osc_server_test.cpp000066400000000000000000000056361366722712400217040ustar00rootroot00000000000000#include "hydrogen/config.h" #ifdef H2CORE_HAVE_OSC #include "osc_server_test.h" #include #include #include using namespace H2Core; // Wait 10, 30, 70, 150, 310, or 630ms for Hydrogen to process the // received messages. #define WAIT(X) { \ int timeBase = 10; \ for ( int ii = 0; ii < 6; ii++ ) { \ QTest::qSleep( timeBase ); \ if ( X ) { \ break; \ } \ timeBase *= 2; \ } \ } void OscServerTest::setUp(){ m_pHydrogen = Hydrogen::get_instance(); // Create, set up, and start a dummy OSC server. m_pServerThread = new lo::ServerThread( 7362 ); CPPUNIT_ASSERT( m_pServerThread->is_valid() ); m_pServerThread->add_method( nullptr, nullptr, OscServer::generic_handler, nullptr); m_pServerThread->add_method("/Hydrogen/NEW_SONG", "s", OscServer::NEW_SONG_Handler); m_pServerThread->add_method("/Hydrogen/OPEN_SONG", "s", OscServer::OPEN_SONG_Handler); m_pServerThread->add_method("/Hydrogen/SAVE_SONG", "", OscServer::SAVE_SONG_Handler); m_pServerThread->add_method("/Hydrogen/SAVE_SONG_AS", "s", OscServer::SAVE_SONG_AS_Handler); m_pServerThread->add_method("/Hydrogen/QUIT", "", OscServer::QUIT_Handler); m_pServerThread->start(); // Proper a temporary file names. m_sValidPath = QString( "%1/hydrogen_osc_server_test.h2song" ) .arg( QDir::tempPath() ); m_sValidPath2 = QString( "%1/hydrogen_osc_server_test2.h2song" ) .arg( QDir::tempPath() ); } void OscServerTest::tearDown(){ delete m_pServerThread; // Delete all temporary files if ( QFile::exists( m_sValidPath ) ) { QFile::remove( m_sValidPath ); } if ( QFile::exists( m_sValidPath2 ) ) { QFile::remove( m_sValidPath2 ); } } void OscServerTest::testSessionManagement(){ // Create an object with which we will send messages to the custom // OSC server. lo::Address hydrogenOSC("localhost", "7362" ); // Create the new song. hydrogenOSC.send("/Hydrogen/NEW_SONG", "s", m_sValidPath.toLocal8Bit().data()); // Store it to disk so we can retrieve it later on. hydrogenOSC.send("/Hydrogen/SAVE_SONG"); WAIT(m_sValidPath == m_pHydrogen->getSong()->get_filename()); CPPUNIT_ASSERT( m_sValidPath == m_pHydrogen->getSong()->get_filename() ); // Store a copy in another file. hydrogenOSC.send("/Hydrogen/SAVE_SONG_AS", "s", m_sValidPath2.toLocal8Bit().data()); WAIT(m_sValidPath2 == m_pHydrogen->getSong()->get_filename()); CPPUNIT_ASSERT( m_sValidPath2 == m_pHydrogen->getSong()->get_filename() ); // Load the first song. This will only be successful if the // SAVE_SONG did work. hydrogenOSC.send("/Hydrogen/OPEN_SONG", "s", m_sValidPath.toLocal8Bit().data()); WAIT(m_sValidPath == m_pHydrogen->getSong()->get_filename()); CPPUNIT_ASSERT( m_sValidPath == m_pHydrogen->getSong()->get_filename() ); } #endif hydrogen-1.0.0-rc1/src/tests/osc_server_test.h000066400000000000000000000030331366722712400213360ustar00rootroot00000000000000#include "hydrogen/config.h" #ifdef H2CORE_HAVE_OSC #include #include #include #include class OscServerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( OscServerTest ); CPPUNIT_TEST( testSessionManagement ); CPPUNIT_TEST_SUITE_END(); private: H2Core::Hydrogen* m_pHydrogen; lo::ServerThread* m_pServerThread; QString m_sValidPath; QString m_sValidPath2; public: /** * Constructs a liblo server thread in #m_pServerThread, registers * all methods of OscServer relevant for the session management, * and starts the server. * * I'm not quite sure why using the (even a fresh) instance of the * OscServer itself does result in a segmentation fault as soon as * the send() method of a lo::Address is called. * * It will also determine the paths to the files used during * testing. */ void setUp(); // Calls the destructor of #m_pServerThread and removes all // temporarily created files. void tearDown(); /** * Uses liblo to send OSC messages to the dummy OSC server * assigned to #m_pServerThread in setUp(). * * It will test OscServer::generic_handler(), * OscServer::NEW_SONG_Handler(), OscServer::OPEN_SONG_Handler(), * OscServer::SAVE_SONG_Handler(), and * OscServer::SAVE_SONG_AS_Handler(). * * Each test will be considered successful if the file name of the * current song does match the expected result. */ void testSessionManagement(); }; CPPUNIT_TEST_SUITE_REGISTRATION( OscServerTest ); #endif hydrogen-1.0.0-rc1/src/tests/pattern_test.cpp000066400000000000000000000011101366722712400211660ustar00rootroot00000000000000#include "pattern_test.h" #include #include CPPUNIT_TEST_SUITE_REGISTRATION( PatternTest ); using namespace H2Core; void PatternTest::setUp() { AudioEngine::create_instance(); } void PatternTest::testPurgeInstrument() { Instrument *i = new Instrument(); Note *n = new Note( i, 1, 1.0, 1.0, 1.0, 1, 1.0 ); Pattern *pat = new Pattern(); pat->insert_note( n ); CPPUNIT_ASSERT( pat->find_note( 1, -1, i) != nullptr ); pat->purge_instrument( i ); CPPUNIT_ASSERT( pat->find_note( 1, -1, i) == nullptr ); delete pat; } hydrogen-1.0.0-rc1/src/tests/pattern_test.h000066400000000000000000000004671366722712400206510ustar00rootroot00000000000000#ifndef PATTERN_TEST_H #define PATTERN_TEST_H #include class PatternTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(PatternTest); CPPUNIT_TEST(testPurgeInstrument); CPPUNIT_TEST_SUITE_END(); public: virtual void setUp(); void testPurgeInstrument(); }; #endif hydrogen-1.0.0-rc1/src/tests/rubberband_test.cpp000066400000000000000000000112031366722712400216230ustar00rootroot00000000000000 #include "hydrogen/basics/sample.h" #include #ifdef H2CORE_HAVE_RUBBERBAND #include #define RUBBER_SAMPLE_PATH "/usr/local/share/hydrogen/data/drumkits/GMkit/cym_Jazz.flac" void rubberband_test( const QString& sample_path ) { // set rubber band options int debug = 1; float pitch = 1.5946; float time_ratio = 1.83199; RubberBand::RubberBandStretcher::Options options = 131088; //RubberBand::RubberBandStretcher::DefaultOptions; // load a sample H2Core::Sample* sample = H2Core::Sample::load( sample_path ); if( sample==nullptr ) { ___ERRORLOG( QString( "unable to load %1" ).arg( sample_path ) ); return; } ___DEBUGLOG( QString( "input sample\n\tfilename\t: %1\n\tframes\t\t: %2\n\tsample rate\t: %3" ) .arg( sample->get_filename().toLocal8Bit().data() ) .arg( sample->get_frames() ) .arg( sample->get_sample_rate() ) ); sample->write( "/tmp/before.wav" ); // setup rubberband RubberBand::RubberBandStretcher* rubber = new RubberBand::RubberBandStretcher( sample->get_sample_rate(), 2, options, time_ratio, pitch ); rubber->setDebugLevel( debug ); rubber->setExpectedInputDuration( sample->get_frames() ); ___DEBUGLOG( QString( "rubberband options\n\tdebug\t\t: %1\n\toptions\t\t: %2\n\ttime ratio\t: %3\n\tpitch\t\t: %4" ).arg( debug ).arg( options ).arg( time_ratio ).arg( pitch ) ); ___DEBUGLOG( QString( "minimum sample required: %1" ).arg( rubber->getSamplesRequired() ) ); // study float* ibuf[2]; int studied = 0; ___DEBUGLOG( "Study ..." ); /* while( studied < sample->get_frames() ) { ibuf[0] = &sample->get_data_l()[studied]; ibuf[1] = &sample->get_data_r()[studied]; bool final = (studied + block_size >= sample->get_frames()); int ibs = (final ? (sample->get_frames()-studied) : block_size ); //___DEBUGLOG( QString(" ibs : %1").arg( ibs ) ); rubber->study( ibuf, ibs, final ); studied += ibs; if( final ) break; } */ studied = sample->get_frames(); ibuf[0] = sample->get_data_l(); ibuf[1] = sample->get_data_r(); rubber->study( ibuf, studied, true ); ___DEBUGLOG( QString("done.\n %1 frames studied.").arg( studied ) ); // buffers float* obuf[2]; int out_buffer_size = (int)(sample->get_frames()*time_ratio)+1000; float* out_data_l= new float[ out_buffer_size ]; float* out_data_r = new float[ out_buffer_size ]; int processed = 0; int retrieved = 0; int available = 0; int buffer_free = out_buffer_size; ___DEBUGLOG( "Process ..." ); /* while( processed < sample->get_frames() ) { ibuf[0] = &sample->get_data_l()[processed]; ibuf[1] = &sample->get_data_r()[processed]; bool final = (processed + block_size >= sample->get_frames()); int ibs = (final ? (sample->get_frames()-processed) : block_size ); //___DEBUGLOG( QString(" ibs : %1").arg( ibs ) ); rubber->process( ibuf, ibs, final ); processed += ibs; if( final ) break; // retrieve data while( (available=rubber->available())>0 && buffer_free>0 ) { obuf[0] = &out_data_l[retrieved]; obuf[1] = &out_data_r[retrieved]; //___DEBUGLOG( QString( " available frames %1" ).arg( available ) ); int n = rubber->retrieve( obuf, available); retrieved += n; buffer_free -= n; //___DEBUGLOG( QString( " received frames %1" ).arg( n ) ); } } */ processed = sample->get_frames(); ibuf[0] = sample->get_data_l(); ibuf[1] = sample->get_data_r(); rubber->process( ibuf, processed, true ); // retrieve last frames while( (available=rubber->available())>0 && buffer_free>0 ) { obuf[0] = &out_data_l[retrieved]; obuf[1] = &out_data_r[retrieved]; //___DEBUGLOG( QString( " available frames %1" ).arg( available ) ); int n = rubber->retrieve( obuf, available); retrieved += n; buffer_free -= n; //___DEBUGLOG( QString( " received frames %1" ).arg( n ) ); } ___DEBUGLOG( QString( "done.\n %1 frames processed\n %2 frames retrieved [ %3 expected ]" ).arg( processed ).arg( retrieved ).arg( sample->get_frames()*time_ratio ) ); // final data buffers float* data_l = new float[ retrieved ]; float* data_r = new float[ retrieved ]; for( int i=0; iget_sample_rate(), data_l, data_r ); sample2->write( "/tmp/after.wav" ); // clean delete rubber; delete sample; delete sample2; delete[] out_data_l; delete[] out_data_r; } #else void rubberband_test( const QString& sample_path ) { ___ERRORLOG("RUBBERBAND LIBRARY NOT AVAILABLE"); } #endif hydrogen-1.0.0-rc1/src/tests/sample_test.cpp000066400000000000000000000012761366722712400210070ustar00rootroot00000000000000#include "pattern_test.h" #include "test_helper.h" #include class SampleTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE( SampleTest ); CPPUNIT_TEST( testLoadInvalidSample ); CPPUNIT_TEST_SUITE_END(); void testLoadInvalidSample() { H2Core::Sample* pSample = nullptr; //TC1: Sample does not exist QString SamplePath("PathDoesNotExist"); pSample = H2Core::Sample::load( SamplePath ); CPPUNIT_ASSERT(pSample == nullptr); //TC2: Sample does exist, but is not a valid sample pSample = H2Core::Sample::load( H2TEST_FILE("drumkits/baseKit/drumkit.xml") ); CPPUNIT_ASSERT(pSample == nullptr); } }; CPPUNIT_TEST_SUITE_REGISTRATION( SampleTest ); hydrogen-1.0.0-rc1/src/tests/test_helper.cpp000066400000000000000000000053451366722712400210060ustar00rootroot00000000000000#include "test_helper.h" #include "hydrogen/object.h" #include #include #include #include static const QString APP_DATA_DIR = "/data/"; static const QString TEST_DATA_DIR = "/src/tests/data/"; TestHelper* TestHelper::__instance = nullptr; void TestHelper::create_instance() { if ( __instance == nullptr ) { __instance = new TestHelper; } } /** * \brief Execute command and return captured output * \param args Command to run and its parameters * \return Captured standard output */ QString qx(QStringList args) { QProcess proc; proc.start(args.first(), args.mid(1)); proc.waitForFinished(); if ( proc.exitCode() != 0 ) { throw std::runtime_error("Not a git repository"); } auto path = proc.readAllStandardOutput(); return QString(path).trimmed(); } /** * \brief Check whether directory is Hydrogen source root dir * \param dir Path to directory * \return Whether dir points to Hydrogen source dir **/ bool check_root_dir(const QString &dir) { QFile f( dir + TEST_DATA_DIR + "/drumkits/baseKit/drumkit.xml" ); return f.exists(); } /** * \brief Try to find Hydrogen source dir * \throws std::runtime_error when source dir cannot be find * * This function tries to find Hydrogen source dir in order to * find data files required by tests. First, environment * variable H2_HOME is examined. If it's not set or doesn't point * to valid directory, this function tries to run "git rev-parse --show-toplevel" * to get root directory of git repository. If that fails, * current directory is examined. If it doesn't point to * source dir, std::runtime_error is thrown. **/ QString find_root_dir() { /* Get root dir from H2_HOME env variable */ auto env_root_dir = QProcessEnvironment::systemEnvironment().value("H2_HOME", ""); if (env_root_dir != "") { if (check_root_dir( env_root_dir ) ) { return env_root_dir; } else { ___ERRORLOG( QString( "Directory %1 not usable" ).arg( env_root_dir ) ); } } /* Try git root directory */ try { auto git_root_dir = qx({"git", "rev-parse", "--show-toplevel"}); if (check_root_dir( git_root_dir ) ) { return git_root_dir; } else { ___ERRORLOG( QString( "Directory %1 not usable" ).arg( git_root_dir ) ); } } catch (std::runtime_error &e) { ___WARNINGLOG( "Can't find git root directory" ); } /* As last resort, use current dir */ if (check_root_dir( "." ) ) { return "."; } throw std::runtime_error( "Can't find suitable data directory. Consider setting H2_HOME environment variable" ); } TestHelper::TestHelper() { auto root_dir = find_root_dir(); ___INFOLOG( QString( "Using test data directory: %1" ).arg( root_dir ) ); m_sDataDir = root_dir + APP_DATA_DIR; m_sTestDataDir = root_dir + TEST_DATA_DIR; } hydrogen-1.0.0-rc1/src/tests/test_helper.h000066400000000000000000000010231366722712400204400ustar00rootroot00000000000000#ifndef TEST_HELPER_H #define TEST_HELPER_H #include #include class TestHelper { static TestHelper * __instance; QString m_sDataDir; QString m_sTestDataDir; public: TestHelper(); QString data_dir() const { return m_sDataDir; } QString test_file(const QString &file) { return m_sTestDataDir + "/" + file; } static void create_instance(); static TestHelper* get_instance() { assert(__instance); return __instance; } }; #define H2TEST_FILE(name) TestHelper::get_instance()->test_file(name) #endif hydrogen-1.0.0-rc1/src/tests/xml_test.cpp000066400000000000000000000123011366722712400203150ustar00rootroot00000000000000#include "xml_test.h" #include #include #include #include #include #include #include #include #include #include "test_helper.h" CPPUNIT_TEST_SUITE_REGISTRATION( XmlTest ); static bool check_samples_data( H2Core::Drumkit* dk, bool loaded ) { int count = 0; H2Core::InstrumentComponent::setMaxLayers( 16 ); H2Core::InstrumentList* instruments = dk->get_instruments(); for( int i=0; isize(); i++ ) { count++; H2Core::Instrument* pInstr = ( *instruments )[i]; for (std::vector::iterator it = pInstr->get_components()->begin() ; it != pInstr->get_components()->end(); ++it) { H2Core::InstrumentComponent* pComponent = *it; for ( int nLayer = 0; nLayer < H2Core::InstrumentComponent::getMaxLayers(); nLayer++ ) { H2Core::InstrumentLayer* pLayer = pComponent->get_layer( nLayer ); if( pLayer ) { H2Core::Sample* pSample = pLayer->get_sample(); if( loaded ) { if( pSample->get_data_l()==nullptr || pSample->get_data_l()==nullptr ) return false; } else { if( pSample->get_data_l()!=nullptr || pSample->get_data_l()!=nullptr ) return false; } } } } } return ( count==4 ); } void XmlTest::testDrumkit() { QString dk_path = H2Core::Filesystem::tmp_dir()+"/dk0"; H2Core::Drumkit* dk0 = nullptr; H2Core::Drumkit* dk1 = nullptr; H2Core::Drumkit* dk2 = nullptr; // load without samples dk0 = H2Core::Drumkit::load( H2TEST_FILE( "/drumkits/baseKit") ); CPPUNIT_ASSERT( dk0!=nullptr ); CPPUNIT_ASSERT( dk0->samples_loaded()==false ); CPPUNIT_ASSERT( check_samples_data( dk0, false ) ); CPPUNIT_ASSERT_EQUAL( 4, dk0->get_instruments()->size() ); //dk0->dump(); // manually load samples dk0->load_samples(); CPPUNIT_ASSERT( dk0->samples_loaded()==true ); CPPUNIT_ASSERT( check_samples_data( dk0, true ) ); //dk0->dump(); // load with samples dk0 = H2Core::Drumkit::load( H2TEST_FILE( "/drumkits/baseKit" ), true ); CPPUNIT_ASSERT( dk0!=nullptr ); CPPUNIT_ASSERT( dk0->samples_loaded()==true ); CPPUNIT_ASSERT( check_samples_data( dk0, true ) ); //dk0->dump(); // unload samples dk0->unload_samples(); CPPUNIT_ASSERT( dk0->samples_loaded()==false ); CPPUNIT_ASSERT( check_samples_data( dk0, false ) ); //dk0->dump(); /* // save drumkit elsewhere dk0->set_name( "dk0" ); CPPUNIT_ASSERT( dk0->save( dk_path, false ) ); CPPUNIT_ASSERT( H2Core::Filesystem::file_readable( dk_path+"/drumkit.xml" ) ); CPPUNIT_ASSERT( H2Core::Filesystem::file_readable( dk_path+"/crash.wav" ) ); CPPUNIT_ASSERT( H2Core::Filesystem::file_readable( dk_path+"/hh.wav" ) ); CPPUNIT_ASSERT( H2Core::Filesystem::file_readable( dk_path+"/kick.wav" ) ); CPPUNIT_ASSERT( H2Core::Filesystem::file_readable( dk_path+"/snare.wav" ) ); // load file dk1 = H2Core::Drumkit::load_file( dk_path+"/drumkit.xml" ); CPPUNIT_ASSERT( dk1!=nullptr ); //dk1->dump(); // copy constructor dk2 = new H2Core::Drumkit( dk1 ); dk2->set_name( "COPY" ); CPPUNIT_ASSERT( dk2!=nullptr ); // save file CPPUNIT_ASSERT( dk2->save_file( dk_path+"/drumkit.xml", true ) ); */ delete dk0; //delete dk1; //delete dk2; } //Load drumkit which includes instrument with invalid ADSR values. // Expected behavior: The drumkit will be loaded successfully. // In addition, the drumkit file will be saved with // correct ADSR values. void XmlTest::testDrumkit_UpgradeInvalidADSRValues() { H2Core::Drumkit* pDrumkit = nullptr; //1. Check, if the drumkit has been loaded pDrumkit = H2Core::Drumkit::load( H2TEST_FILE( "/drumkits/invAdsrKit") ); CPPUNIT_ASSERT( pDrumkit != nullptr ); //2. Make sure that the instruments of the drumkit have been loaded correctly (see GH issue #839) H2Core::InstrumentList* pInstruments = pDrumkit->get_instruments(); CPPUNIT_ASSERT( pInstruments != nullptr ); H2Core::Instrument* pFirstInstrument = pInstruments->get(0); CPPUNIT_ASSERT( pFirstInstrument != nullptr ); H2Core::InstrumentLayer* pLayer = pFirstInstrument->get_components()->front()->get_layer(0); CPPUNIT_ASSERT( pLayer != nullptr ); H2Core::Sample* pSample = pLayer->get_sample(); CPPUNIT_ASSERT( pSample != nullptr ); CPPUNIT_ASSERT( pSample->get_filename() == QString("snare.wav")); //3. Make sure that the original (invalid) file has been saved as a backup CPPUNIT_ASSERT( H2Core::Filesystem::file_exists( H2TEST_FILE( "/drumkits/invAdsrKit/drumkit.xml.bak") ) ); if( pDrumkit ) { delete pDrumkit; } } void XmlTest::testPattern() { QString pat_path = H2Core::Filesystem::tmp_dir()+"/pat"; H2Core::Pattern* pat0 = nullptr; H2Core::Drumkit* dk0 = nullptr; H2Core::InstrumentList* instruments = nullptr; dk0 = H2Core::Drumkit::load( H2TEST_FILE( "/drumkits/baseKit" ) ); CPPUNIT_ASSERT( dk0!=nullptr ); instruments = dk0->get_instruments(); CPPUNIT_ASSERT( instruments->size()==4 ); pat0 = H2Core::Pattern::load_file( H2TEST_FILE( "/pattern/pat.h2pattern" ), instruments ); CPPUNIT_ASSERT( pat0 ); pat0->save_file( "dk_name", "author", "license", pat_path ); delete pat0; delete dk0; } hydrogen-1.0.0-rc1/src/tests/xml_test.h000066400000000000000000000006311366722712400177650ustar00rootroot00000000000000#ifndef XML_TEST_H #define XML_TEST_H #include class XmlTest : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(XmlTest); CPPUNIT_TEST(testDrumkit); CPPUNIT_TEST(testDrumkit_UpgradeInvalidADSRValues); CPPUNIT_TEST(testPattern); CPPUNIT_TEST_SUITE_END(); public: void testDrumkit(); void testDrumkit_UpgradeInvalidADSRValues(); void testPattern(); }; #endif hydrogen-1.0.0-rc1/src/www/000077500000000000000000000000001366722712400154375ustar00rootroot00000000000000hydrogen-1.0.0-rc1/src/www/hydrogen.php000066400000000000000000000126571366722712400200020ustar00rootroot00000000000000\n"; print "\n"; /* Start of song listing */ $dir = "./"; if ($dh = opendir( $dir )) { while (( $file = readdir($dh) ) !== false) { $extension = array_pop( explode(".", $file) ); if( $extension == "h2song" ) { print "\t\n"; $content = file( $dir.$file ); $xml = join( " ",$content ); print "\t\t" . getTag( $xml , "" ) . "\n"; print "\t\t" . $url.$file ."\n"; print "\t\t" . getTag( $xml , "" ) . "\n"; print "\t\t" . getTag( $xml , "" ) . "\n"; print "\t\n"; } } closedir( $dh ); } /* End of song listing */ /* Start of pattern listing */ $dir = "./"; if ($dh = opendir( $dir )) { while ( ( $file = readdir( $dh ) ) !== false ) { $extension = array_pop(explode( ".", $file )); if( $extension == "h2pattern" ) { $content = file( $dir.$file ); $xml = join( " " , $content ); print "\t\n"; print "\t\t" . getTag( $xml , "" ) . "\n"; print "\t\t" . $url.$file ."\n"; print "\t\n"; } } closedir( $dh ); } /* End of pattern listing */ /* Start of drumkit listing */ $dir = "./"; $hasImages = false; if ($imageDirHandle = opendir( $drumkitImageDir ) ) { $hasImages = true; $imageFiles[] = array(); while ( ( $f = readdir($imageDirHandle ) ) !== false ) { $imageFiles[] = $file; } closedir($dh); } if ($dh = opendir( $dir ) ) { while ( ( $file = readdir( $dh ) ) !== false) { $extension = array_pop( explode( ".", $file ) ); if( $extension == "h2drumkit" ) { $content = file( $dir.$file ); $xml = join( " " , $content ); print "\t\n"; //name: filename without extension $name = basename( $file,".h2drumkit" ); If( ISSET( $drumkit_list[ $name ]) ){ $author = $drumkit_list[ $name ][ "author" ]; $info = $drumkit_list[ $name ][ "info" ]; } print "\t\t $name \n"; print "\t\t" . $url.$file ."\n"; print "\t\t$author\n"; print "\t\t$info\n"; // Get image // Possible method: Have image filename same as basename of drumkit file. // ie: for DeathMetal.h2drumkit, image file would be DeathMetal.jpeg // and allow for .png as well (non-case sensitive extension) // The drumkit filenames need to be unique, and this would force the // images to be unique names but be consistent. // use regex like: /.*\.(?:jpeg|jpg|png)/i // // Go through all files in image directory named $basename.* and // see if there's a regex match, if so use that image file if ( $hasImages ) { // search $imageFiles array for basename that matches with extension that matches regex $images = preg_grep( "/.*\.(?:jpeg|jpg|png)/i", $imageFiles ); if ( count( $images ) ) { // if there's more than one match we'll just use the first print "\t\t" . $drumkitImageUrl . "/" . $images[0] . ""; } } print "\t\n"; } } closedir( $dh ); } /* End of pattern listing */ print "\n"; ?> hydrogen-1.0.0-rc1/src/www/metaInfo.inc000066400000000000000000000004241366722712400176740ustar00rootroot00000000000000 hydrogen-1.0.0-rc1/tools/000077500000000000000000000000001366722712400151645ustar00rootroot00000000000000hydrogen-1.0.0-rc1/tools/clean000077500000000000000000000007371366722712400162030ustar00rootroot00000000000000#! /bin/bash RESET="\033[0m" RED="\033[0;31m" BROWN="\033[0;33m" PURPLE="\033[0;35m" echo "remove vim backup files" find . -name "*~" -o -name "*.orig" | xargs rm 2>/dev/null echo -e "clean trailing spaces : \n" for f in $(ack --flush -l ' $' src) do echo -e "$BROWN$f$RESET" ack ' $' $f echo -ne "\n$PURPLE* $BROWN$1 ${RED}let sed fix it? $RESET[yN] " read RET if [ "$RET" = "Y" -o "$RET" = "y" ]; then sed -i 's/ *$//' $f && echo " done" fi echo done hydrogen-1.0.0-rc1/tools/ctags000077500000000000000000000001461366722712400162140ustar00rootroot00000000000000#! /bin/bash OUTF=.tags [ -f $OUTF ] && rm $OUTF ctags --tag-relative=yes -h ".h.cpp" -R -o $OUTF src hydrogen-1.0.0-rc1/tools/format000077500000000000000000000012001366722712400163730ustar00rootroot00000000000000#! /bin/bash if [ $# -eq 0 ]; then echo "usage : $0 [git] [FILE] [DIR]" echo echo " git : will format all modified files" echo " DIR : will recursively format .h and .cpp files within the given directory" echo " FILE : will format the given file" exit 1 fi ASTYLEOPTS="--indent=tab=4 --style=linux --suffix=none --indent-classes" for path in $@ do if [ "$path" == "git" ] then git status --porcelain src/ | awk 'match($1, "M"){print $2}' | while read file do astyle $ASTYLEOPTS $file done else [ -f "$path" ] && astyle $ASTYLEOPTS $path [ -d "$path" ] && astyle $ASTYLEOPTS -R "$path/*.h,*.cpp" fi done hydrogen-1.0.0-rc1/windows/000077500000000000000000000000001366722712400155165ustar00rootroot00000000000000hydrogen-1.0.0-rc1/windows/README.md000066400000000000000000000102411366722712400167730ustar00rootroot00000000000000# Building for Windows ## Cross-compiling on a Unix System ### The easy way: #### Interactive method run the script mxe_installer.sh located in the windows folder then, run the script cross_compile.sh with the -i switch located in the windows folder. $./cross_compile.sh -i #### Manual package Simply run the script with the -b switch and pass in the architecture you want to build, either i686 or x86_64 If you want the "fat" package, which bundles with the jack installer, and the ladspa plugins, then pass in the -f as well. $./cross_compile.sh -b x86_64 ### The manual way: ### Installing all necessary packages #### On *nix systems (OS X Included) Visit the page: http://mxe.cc/#requirements and install the pre-requesite packages. ### Cloning Hydrogen from the github repository If you have not already done it. $ git clone -b master https://github.com/hydrogen-music/hydrogen.git ### Setting the Hydrogen environment variable Change to your Hydrogen directory. $mv hydrogen source $ cd source $ export HYDROGEN=$PWD $ cd .. ### Cloning MXE from the github repository Clone the master branch, since it should be more up-to-date than the stable branch. $ git clone -b master https://github.com/mxe/mxe.git ### Configuring MXE $ cd mxe $ export MXE=$PWD Edit *Makefile* and set the value of *MXE_TARGETS* as follows (). For 32-bit Windows target: MXE_TARGETS := i686-w64-mingw32.shared For 64-bit Windows target: MXE_TARGETS := x86_64-w64-mingw32.shared For both 32 and 64 bit Windows target: MXE_TARGETS := i686-w64-mingw32.shared x86_64-w64-mingw32.shared ### Configuring and cross-compiling packages Most *make* operations below take a considerable amount of time. The lengthy ones have been timed, in order to give you a rough estimate. If you're compiling both 32 and 64 bit versions then you will need to roughly double all the times listed below. Adjust your completion expectations according to the values presented and your system capabilities. All operations in this section should be executed in the MXE root directory, where the *Makefile* resides. Packages along with their dependencies are downloaded and cross-compiled automatically as needed. #### Cross-compiling gcc $ make gcc real 13m10.244s user 30m51.456s sys 4m17.841s #### Cross-compiling winpthreads $ make winpthreads #### Configuring gcc and cross-compile again There is a cyclical dependency problem here that requires gcc to be built once normally, and then once with winpthreads. This is because winpthreads requires gcc to build, but we need gcc built with winpthreads support (which it doesn't have the first time you make it). Edit *src/gcc.mk* and set the value of *$(PKG)_DEPS* as follows. $(PKG)_DEPS := binutils gcc-gmp gcc-isl gcc-mpc gcc-mpfr winpthreads Also set the value of *--enable-threads* as follows. --enable-threads=posix Then cross-compile gcc again. $ make gcc real 8m32.152s user 24m34.296s sys 2m47.471s #### Cross-compiling other packages $ make qt libarchive libsndfile portaudio portmidi fftw rubberband jack real 70m17.737s user 199m0.451s sys 15m14.591s Due to a bug in jack, you will need to edit the portaudio.mk file and set jack as a dependency, then rebuild portaudio $ sed -i 's/:= gcc/:= gcc jack/g' $MXE/src/portaudio.mk $ make portaudio ### Cross-compiling Hydrogen You will want to change the CMAKE_TOOLCHAIN_FILE to reflect which version of hydrogen you want (i686 = 32bit, x86_64 = 64bit). $ cd $HYDROGEN For 32 bit compilations use $ cmake -DCMAKE_TOOLCHAIN_FILE=$MXE/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake For 64 bit compilations use $ cmake -DWIN64:BOOL=ON ../ -DCMAKE_TOOLCHAIN_FILE=$MXE/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake -DCMAKE_{C,CXX}_FLAGS=-m64 $ cpack -G NSIS real 4m32.063s user 4m14.671s sys 0m17.105s cpack will create your installer for you, which you can then copy to a windows machine, and install. ### Troubleshooting Troubleshooting. ### Bugs? Bugs. hydrogen-1.0.0-rc1/windows/cross_compile.sh000077500000000000000000000214141366722712400207200ustar00rootroot00000000000000#!/bin/bash # Hydrogen Cross Compile Script FATBUILD=false show_interactive_menu(){ #clear the screen clear while : do # If error exists, display it if [ "$ERR_MSG" != "" ]; then echo "Error: $ERR_MSG" echo "" fi # Write out the menu options... echo "Welcome to the Hydrogen Cross Compiler. We will now compile Hydrogen for Windows." echo "Select an option:" echo " 1: Clone required repositories" echo " 2: Build Hydrogen 32Bit" echo " 3: Build Hydrogen 64Bit" echo " 4: Clean Cmake and CPack Cache Files" echo " q: Exit" # Clear the error message ERR_MSG="" # Read the user input read SEL case $SEL in 1) #download the proper git repositories echo "This will clone the repositories for Hydrogen" read -e -p "Enter the path where Hydrogen should be built: " -i "$HOME/build/hydrogen/" CLONEPATH if [ ! -e "${CLONEPATH%/*}" ]; then echo "Now downloading Hydrogen." mkdir -p "${CLONEPATH%/*}" cd "${CLONEPATH%/*}" BUILD_DIR=$PWD git clone https://github.com/hydrogen-music/hydrogen.git else if [ -f ${CLONEPATH%/*}/build.sh ]; then mv ${CLONEPATH%/*} ${CLONEPATH%/*}/../hydrogen.tmp mkdir -p ${CLONEPATH%/*} mv ${CLONEPATH%/*}/../hydrogen.tmp ${CLONEPATH%/*}/source echo "Hydrogen already downloaded to ${CLONEPATH%/*}." fi fi if [ ! -e ${CLONEPATH%/*}/source/jack2 ]; then cd ${CLONEPATH%/*}/source echo "Now downloading jack." git clone git://github.com/jackaudio/jack2.git cd .. fi ;; 2) #32 Bit Compiling build_32bit ;; 3) #64 Bit Compiling build_64bit ;; 4) #Clean CMake Files cd $HYDROGEN_BUILD rm -r CMakeCache.txt CMakeFiles cmake_install.cmake CPackConfig.cmake _CPack_Packages CPackSourceConfig.cmake install_manifest.txt ladspa_listplugins Makefile src try uninstall.cmake rm ../mxe ../gcc ;; q) echo "Thank you for using the Hydrogen Cross Compiler. Goodbye." exit ;; *) ERR_MSG="Please enter a valid option" esac # clear the screen again for re-display #clear done } build_32bit(){ build_hydrogen i686 } build_64bit(){ build_hydrogen x86_64 -DCMAKE_{C,CXX}_FLAGS=-m64 -DWIN64:BOOL=ON } mxe_files(){ # This will search for the required files to package and put their names into a file to be read by cmake. # This is necessary due to version differences with the libraries and compilers that mxe uses across build systems. #set the dir to search if [ "$1" == "64" ]; then mxedir="/opt/mxe/usr/x86_64-w64-mingw32.shared/bin" gccdir="/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared" else mxedir="/opt/mxe/usr/i686-w64-mingw32.shared/bin" gccdir="/opt/mxe/usr/lib/gcc/i686-w64-mingw32.shared" fi if [ -d windows ]; then hydrogendir=`pwd`"/windows" else hydrogendir=`pwd` fi extralibs="$hydrogendir/extralibs" mkdir $extralibs #Make arrays for the filenames to loop through. declare -a libs=("liblzo2-2" "libgnurx" "libsndfile" "libFLAC" "libogg" "libvorbis" "libvorbisenc" "zlib1" "libwinpthread" "libarchive" "libbz2" "liblzma" "libnettle" "libxml2" "libpng16" "libportmidi" "libportaudio" "libiconv" "libiconv" "liblo" "jack") declare -a gcclibs=("libgcc" "libstdc++") #special stuff for qt5 handling declare -a qtlibs=("Qt5Core" "Qt5Xml." "Qt5XmlPatterns" "Qt5Network." "Qt5Gui" "Qt5Widgets") libs+=("libpcre-1" "libharfbuzz-0" "libfreetype-6" "libglib-2" "libintl-8" "libpcre2-16" "libcrypto" "libssl") qtdir="$mxedir/../qt5/bin" platforms="$extralibs/platforms" mkdir -p $platforms cp "$qtdir/../plugins/platforms/qwindows.dll" "$platforms/" #loop through the libs, and put them into a text file. cd $mxedir for mylibs in "${libs[@]}" do cp `ls -v $mylibs*dll| tail -n 1` $extralibs done #loop through the qt files and put them into a text file cd $qtdir for myqtlibs in "${qtlibs[@]}" do cp `ls -v $myqtlibs*dll| tail -n 1` $extralibs spa=" " done #find the latest gcc dir from mxe cd $gccdir echo `ls -v | tail -n 1` > $hydrogendir/../gccversion.txt #loop through the gcclibs cd $mxedir for mygcclibs in "${gcclibs[@]}" do cp `ls -v $mygcclibs*dll| tail -n 1` $extralibs done } setqt5(){ if [ "$1" == "64" ]; then qt5dir="/opt/mxe/usr/x86_64-w64-mingw32.shared/qt5/lib/cmake" else qt5dir="/opt/mxe/usr/i686-w64-mingw32.shared/qt5/lib/cmake" fi qtprefix="-DCMAKE_PREFIX_PATH=$qt5dir" } cleanbuild(){ if [ -d windows ]; then cd windows fi if [ -f CMakeCache.txt ]; then rm -rf _CPack_Packages CMakeFiles try src extralibs rm -f CMakeCache.txt CPackConfig.cmake cmake_install.cmake CPackSourceConfig.cmake install_manifest.txt ladspa_listplugins Makefile uninstall.cmake fi } build_hydrogen(){ # Passes either i686 or x86_64 for 32 or 64 bit respectively. if [ -z "$HYDROGEN" ] || [ ! -d $HYDROGEN ]; then echo "Now starting the building of Hydrogen for Windows. This will take quite a while and requires no interaction after the initial questions." if [ -z ${CLONEPATH%/*} ]; then read -e -p "Enter the path to the Hydrogen download (with a trailing /): " -i "$HOME/build/hydrogen/" CLONEPATH fi HYDROGEN="${CLONEPATH}" if [ ! -d $HYDROGEN ]; then echo "Hydrogen source not found in $HYDROGEN." exit fi fi echo "Checking for MXE." if [ -d /opt/mxe ]; then if [ -f /opt/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake ] || [ -f /opt/mxe/usr/x86_64-w64-mingw32.shared/share/cmake/mxe-conf.cmake ]; then MXE_INSTALLED=1 MXE=/opt/mxe fi else echo "mxe was not found, please run the mxe_installer.sh script first." exit fi #Build hydrogen itself now. echo "Now building Hydrogen." HYDROGEN_BUILD=$HYDROGEN"windows" if [ ! -e "$HYDROGEN_BUILD" ]; then mkdir $HYDROGEN"windows" fi echo "We will now build Hydrogen at $HYDROGEN_BUILD" cd "$HYDROGEN_BUILD" if [ -e ../CMakeCache.txt ]; then echo "Previous build detected. We will now remove the caches so the project will build properly." rm -rf _CPack_Packages CMakeFiles try rm -f CMakeCache.txt CPackConfig.cmake cmake_install.cmake CPackSourceConfig.cmake install_manifest.txt ladspa_listplugins Makefile uninstall.cmake fi PATH=/opt/mxe/usr/bin:$PATH; if [ "$1" == "x86_64" ]; then MXE_CMAKE_BIN=/opt/mxe/usr/bin/x86_64-w64-mingw32.shared-cmake else MXE_CMAKE_BIN=/opt/mxe/usr/bin/i686-w64-mingw32.shared-cmake fi $MXE_CMAKE_BIN $4 ../ $2 $3 -DWANT_FAT_BUILD:BOOL=$FATBUILD -DWANT_DEBUG:BOOL=OFF export HYDROGEN export HYDROGEN_BUILD export MXE #Bundle jack_installer if wanted.. if [ $FATBUILD = true ]; then if [ ! -e jack_installer ]; then mkdir jack_installer fi cd jack_installer if [ $1 == "x86_64" ]; then if [ ! -e "Jack_v1.9.10_64_setup.exe" ]; then wget https://dl.dropboxusercontent.com/u/28869550/Jack_v1.9.10_64_setup.exe fi else if [ ! -e "Jack_v1.9.10_32_setup.exe" ]; then wget https://dl.dropboxusercontent.com/u/28869550/Jack_v1.9.10_32_setup.exe fi fi cd .. if [ ! -e plugins ]; then mkdir plugins cd plugins if [ ! -e ladspaplugs ]; then mkdir ladspaplugs fi cd ladspaplugs if [ ! -e "LADSPA_plugins-win-0.4.15.exe" ]; then wget http://sourceforge.net/projects/audacity/files/audacity/2.0.5/LADSPA_plugins-win-0.4.15.exe fi cd .. fi fi cd $HYDROGEN_BUILD if [ -e $HYDROGEN/mxe ]; then if [ ! -h $HYDROGEN/mxe ]; then rm -rf $HYDROGEN/mxe fi fi if [ -e $HYDROGEN/extralibs ]; then rm -rf $HYDROGEN/extralibs fi if [ ! -e $HYDROGEN/mxe ]; then ln -s $MXE/usr/$1-w64-mingw32.shared $HYDROGEN/mxe fi if [ ! -e $HYDROGEN/gcc ]; then ln -s $MXE/usr/lib/gcc $HYDROGEN/gcc fi cpack -G NSIS } usage(){ echo -e "\nManual mode:\t\tcross_compile.sh [-f] [-d SOURCE_DIR] [-c] -b i686|x86_64" echo -e "Interactive mode:\tcross_compile.sh -i" echo -e "Usage: \n\t-i:\tUse interactive mode \n\t-b:\tBuild hydrogen. Valid values: i686 or x86_64 \n\t-f:\tFat build (includes Jack and Ladspa installers). Only useful in combination with -b \n\t-c:\tClean the CMake files from the windows directory. Used if building fails, or compiling a different version.\n\t-r:\tBuild release packages. This will build both the 32 bit and 64 bit installers for releases." } fatbuild=false while getopts "d:fob:icr" o; do case "${o}" in d) HYDROGEN=${OPTARG} if [ ! -d $HYDROGEN ]; then echo "Hydrogen source not found in $HYDROGEN." exit fi ;; f) FATBUILD=true ;; b) arch=${OPTARG} if [ "$arch" != "x86_64" ]; then cleanbuild mxe_files 32 setqt5 build_32bit else cleanbuild mxe_files 64 setqt5 build_64bit fi ;; i) show_interactive_menu ;; c) cleanbuild ;; r) cleanbuild mxe_files 32 setqt5 build_32bit cleanbuild mxe_files 64 setqt5 build_64bit ;; *) usage ;; esac done if [ $OPTIND -eq 1 ]; then usage; fi shift $((OPTIND-1)) hydrogen-1.0.0-rc1/windows/hydrogen.exe.manifest000066400000000000000000000005701366722712400216470ustar00rootroot00000000000000 hydrogen-1.0.0-rc1/windows/icon.rc000066400000000000000000000001341366722712400167720ustar00rootroot00000000000000#include "winuser.h" 1 RT_MANIFEST "hydrogen.exe.manifest" 3 ICON "../data/img/h2-icon.ico" hydrogen-1.0.0-rc1/windows/mxe_installer.sh000077500000000000000000000133761366722712400207350ustar00rootroot00000000000000#!/bin/bash #This script will try to install mxe for you. MXE_INSTALLED=0 if [ -d /opt/mxe ]; then if [ -f /opt/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake ] || [ -f /opt/mxe/usr/x86_64-w64-mingw32.shared/share/cmake/mxe-conf.cmake ]; then MXE_INSTALLED=1 fi fi install_mxe(){ if [ $MXE_INSTALLED == 1 ]; then echo "mxe detected at /opt/mxe" exit fi mkdir -p $HOME/build cd $HOME/build git clone https://github.com/mxe/mxe.git sudo cp -pr mxe /opt/mxe cd /opt/mxe MXE=/opt/mxe PATH=/opt/mxe/usr/bin:$PATH; #Modify the MXE Makefiles to allow for the cross compilation. sed -i 's/i686-w64-mingw32.static/i686-w64-mingw32.shared x86_64-w64-mingw32.shared/g' $MXE/Makefile #Make gcc and winpthreads. gcc will need to be rebuilt once winpthreads is built. #Note: This needs to happen because winpthreads needs gcc to be built, but we need gcc built with winpthreads support to build hydrogen. # this creates a cyclical dependency problem that there seems to be no way around. make gcc $1 make winpthreads $1 sed -i 's/binutils gcc-gmp gcc-isl gcc-mpc gcc-mpfr mingw-w64/binutils gcc-gmp gcc-isl gcc-mpc gcc-mpfr winpthreads/g' $MXE/src/gcc.mk sed -i 's/--enable-threads=win32/--enable-threads=posix/g' $MXE/src/gcc.mk make gcc $1 #Build the dependencies for hydrogen make libarchive libsndfile portaudio portmidi fftw rubberband jack liblo qt5 -j4 JOBS=4 $1 sed -i 's/:= gcc/:= gcc jack/g' $MXE/src/portaudio.mk make portaudio } while : do # If error exists, display it if [ "$ERR_MSG" != "" ]; then echo "Error: $ERR_MSG" echo "" fi # Write out the menu options... echo "Welcome to the MXE Installer. This will help install MXE on your system." echo "Note: this script was made using the requirement information found at http://mxe.cc/#requirements" echo "You can visit the above site for manual instructions on what packages are required. For instructions on how to build MXE you can visit this link: http://mxe.cc/#tutorial" echo "Select an option:" echo " 1: Debian and derrivatives" echo " 2: Fedora" echo " 3: FreeBSD (NOTE: No longer fully supported by MXE. See above requirements link.)" echo " 4: Frugalware" echo " 5: Gentoo" echo " 6: Mac OS X" echo " 7: openSUSE" echo " q: Exit" # Clear the error message ERR_MSG="" # Read the user input read SEL case $SEL in 1) #Debian and derivatives echo "Now installing required packages" sudo apt-get install autoconf automake autopoint bash bison bzip2 cmake flex gettext git gcc g++ gperf intltool libffi-dev libtool libtool-bin libltdl-dev libssl-dev libxml-parser-perl lzip make openssl patch perl pkg-config python ruby scons sed unzip wget xz-utils nsis if (uname -a | grep x86_64); then sudo apt-get install g++-multilib libc6-dev-i386 fi install_mxe ;; 2) #Fedora echo "Now installing required packages" yum install autoconf automake bash bison bzip2 cmake flex gcc-c++ gettext git gperf intltool make sed libffi-devel libtool openssl-devel patch perl pkgconfig python ruby scons unzip wget xz install_mxe EXCLUDE_PKGS='ocaml%' ;; 3) #FreeBSD echo "FreeBSD is no longer fully supported. This may install the package; however, it may not work as expected. please visit http://mxe.cc/#requirements for more information." echo "Now installing required packages" pkg_add -r automake autoconf bash bison cmake coreutils flex gettext git glib20 gmake gperf gsed intltool libffi libtool openssl patch perl p5-XML-Parser pkgconf python ruby scons unzip wget install_mxe EXCLUDE_PKGS='ocaml%' ;; 4) #Frugalware echo "Now installing required packages" pacman-g2 -S autoconf automake bash bzip2 bison cmake flex gcc gettext git gperf intltool make sed libffi libtool openssl patch perl perl-xml-parser pkgconfig python ruby scons unzip wget xz xz-lzma install_mxe EXCLUDE_PKGS='ocaml%' ;; 5) #Gentoo echo "Now installing required packages" emerge sys-devel/autoconf sys-devel/automake app-shells/bash sys-devel/bison app-arch/bzip2 dev-util/cmake sys-devel/flex sys-devel/gcc sys-devel/gettext dev-vcs/git dev-util/gperf dev-util/intltool sys-devel/make sys-apps/sed dev-libs/libffi sys-devel/libtool dev-libs/openssl sys-devel/patch dev-lang/perl dev-perl/XML-Parser dev-util/pkgconfig dev-lang/python dev-lang/ruby dev-util/scons app-arch/unzip net-misc/wget app-arch/xz-utils install_mxe ;; 6) #Mac OS X echo "You may be prompted to install a java runtime - this is not required." echo "Mac OS X versions ≤ 10.7 are no longer supported." while : do echo "1) If you have macports installed select this." echo "2) If you do NOT have macports installed, this will install Rudix and then install MXE." read MAC case $MAC in 1)#Macports IS installed sudo port install glib2 intltool p5-xml-parser gpatch scons wget xz make build-requirements install_mxe ;; 2)#Macports is NOT installed. Install Rudix curl -s https://raw.githubusercontent.com/rudix-mac/rpm/2014.6/rudix.py | sudo python - install rudix sudo rudix install glib pkg-config scons wget xz make build-requirements install_mxe ;; esac done ;; 7) #openSUSE echo "Now installing required packages" zypper install -R autoconf automake bash bison bzip2 cmake flex gcc-c++ gettext-tools git gperf intltool libffi-devel libtool make openssl libopenssl-devel patch perl perl-XML-Parser pkg-config python ruby scons sed unzip wget xz if (uname -a | grep x86_64); then zypper install -R gcc-32bit glibc-devel-32bit libgcc46-32bit libgomp46-32bit libstdc++46-devel-32bit fi install_mxe ;; q) echo "Thank you for using the MXE installer. Goodbye." exit ;; *) ERR_MSG="Please enter a valid option" esac # clear the screen again for re-display #clear done